From f21b4005aa15e5b51cbb03d3f758f8854aebdaf4 Mon Sep 17 00:00:00 2001 From: Kuroshini Date: Thu, 26 Sep 2019 16:39:30 +0300 Subject: [PATCH 1/7] address coordinates in get api queries --- apps/location/models.py | 4 ++++ apps/location/serializers/common.py | 20 ++++++++++---------- apps/search_indexes/serializers.py | 2 +- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/apps/location/models.py b/apps/location/models.py index 7084385f..b0aa298c 100644 --- a/apps/location/models.py +++ b/apps/location/models.py @@ -104,6 +104,10 @@ class Address(models.Model): def longitude(self): return self.coordinates.x + @property + def location(self): + return self.location_field_indexing + @property def location_field_indexing(self): return {'lat': self.latitude, diff --git a/apps/location/serializers/common.py b/apps/location/serializers/common.py index 555cf499..0b8ac7ed 100644 --- a/apps/location/serializers/common.py +++ b/apps/location/serializers/common.py @@ -90,8 +90,9 @@ class AddressSerializer(serializers.ModelSerializer): source='city', queryset=models.City.objects.all()) city = CitySerializer(read_only=True) - geo_lon = serializers.FloatField(allow_null=True) - geo_lat = serializers.FloatField(allow_null=True) + geo_lon = serializers.FloatField(allow_null=True, write_only=True) + geo_lat = serializers.FloatField(allow_null=True, write_only=True) + location = serializers.ReadOnlyField() class Meta: model = models.Address @@ -104,7 +105,8 @@ class AddressSerializer(serializers.ModelSerializer): 'number', 'postal_code', 'geo_lon', - 'geo_lat' + 'geo_lat', + 'location', ] def validate(self, attrs): @@ -119,12 +121,10 @@ class AddressSerializer(serializers.ModelSerializer): def to_representation(self, instance): """Override to_representation method""" - if instance.coordinates and isinstance(instance.coordinates, Point): - # Point(longitude, latitude) - setattr(instance, 'geo_lat', instance.coordinates.x) - setattr(instance, 'geo_lon', instance.coordinates.y) - else: - setattr(instance, 'geo_lat', float(0)) - setattr(instance, 'geo_lon', float(0)) + if not instance.coordinates or not isinstance(instance.coordinates, Point): + setattr(instance, 'location', { + 'lat': float(0), + 'lon': float(0), + }) return super().to_representation(instance) diff --git a/apps/search_indexes/serializers.py b/apps/search_indexes/serializers.py index 480f509d..a2ff8d53 100644 --- a/apps/search_indexes/serializers.py +++ b/apps/search_indexes/serializers.py @@ -53,7 +53,7 @@ class EstablishmentDocumentSerializer(DocumentSerializer): fields = ( 'id', 'name', - 'description', + # 'description', 'public_mark', 'toque_number', 'price_level', From 441c16281d6c51a1f879fdb538eab5df816f8181 Mon Sep 17 00:00:00 2001 From: Kuroshini Date: Thu, 26 Sep 2019 17:23:55 +0300 Subject: [PATCH 2/7] format api elastic results --- apps/search_indexes/serializers.py | 11 +++++++++++ apps/search_indexes/utils.py | 2 ++ apps/utils/tests.py | 5 +++-- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/apps/search_indexes/serializers.py b/apps/search_indexes/serializers.py index a2ff8d53..56af9f5b 100644 --- a/apps/search_indexes/serializers.py +++ b/apps/search_indexes/serializers.py @@ -70,3 +70,14 @@ class EstablishmentDocumentSerializer(DocumentSerializer): @staticmethod def get_description_translated(obj): return get_translated_value(obj.description) + + def to_representation(self, instance): + ret = super().to_representation(instance) + + dict_merge = lambda a, b: a.update(b) or a + ret['tags'] = map(lambda tag: dict_merge(tag, {'label_translated': get_translated_value(tag.pop('label'))}), ret['tags']) + ret['establishment_subtypes'] = map(lambda subtype: dict_merge(subtype, {'name_translated': get_translated_value(subtype.pop('name'))}), ret['establishment_subtypes']) + if ret.get('establishment_type'): + ret['establishment_type']['name_translated'] = get_translated_value(ret['establishment_type'].pop('name')) + ret['address']['city']['country']['name_translated'] = get_translated_value(ret['address']['city']['country'].pop('name')) + return ret \ No newline at end of file diff --git a/apps/search_indexes/utils.py b/apps/search_indexes/utils.py index 93be9e81..0c1dd187 100644 --- a/apps/search_indexes/utils.py +++ b/apps/search_indexes/utils.py @@ -17,4 +17,6 @@ def get_translated_value(value): return None elif not isinstance(value, dict): field_dict = value.to_dict() + elif isinstance(value, dict): + field_dict = value return field_dict.get(get_current_language()) diff --git a/apps/utils/tests.py b/apps/utils/tests.py index 0ca77b6b..5f8df6d8 100644 --- a/apps/utils/tests.py +++ b/apps/utils/tests.py @@ -55,14 +55,15 @@ class TranslateFieldTests(BaseTestCase): start=datetime.now(pytz.utc), end=datetime.now(pytz.utc), is_publish=True, - news_type=self.news_type + news_type=self.news_type, + slug='test', ) def test_model_field(self): self.assertIsNotNone(getattr(self.news_item, "title_translated", None)) def test_read_locale(self): - response = self.client.get(f"/api/web/news/{self.news_item.id}/", format='json') + response = self.client.get(f"/api/web/news/{self.news_item.slug}/", format='json') self.assertEqual(response.status_code, status.HTTP_200_OK) news_data = response.json() From 2fe0ce86d3a6a733fd27716eaaa047d9e365b9a5 Mon Sep 17 00:00:00 2001 From: Kuroshini Date: Thu, 26 Sep 2019 17:40:09 +0300 Subject: [PATCH 3/7] Refactor elastic serializer --- apps/search_indexes/serializers.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/apps/search_indexes/serializers.py b/apps/search_indexes/serializers.py index 56af9f5b..73652ef6 100644 --- a/apps/search_indexes/serializers.py +++ b/apps/search_indexes/serializers.py @@ -46,6 +46,7 @@ class EstablishmentDocumentSerializer(DocumentSerializer): description_translated = serializers.SerializerMethodField(allow_null=True) + preview_image = serializers.URLField(source='preview_image_url') class Meta: """Meta class.""" @@ -63,7 +64,7 @@ class EstablishmentDocumentSerializer(DocumentSerializer): 'collections', 'establishment_type', 'establishment_subtypes', - 'preview_image_url', + 'preview_image', 'slug', ) @@ -73,11 +74,19 @@ class EstablishmentDocumentSerializer(DocumentSerializer): def to_representation(self, instance): ret = super().to_representation(instance) - dict_merge = lambda a, b: a.update(b) or a - ret['tags'] = map(lambda tag: dict_merge(tag, {'label_translated': get_translated_value(tag.pop('label'))}), ret['tags']) - ret['establishment_subtypes'] = map(lambda subtype: dict_merge(subtype, {'name_translated': get_translated_value(subtype.pop('name'))}), ret['establishment_subtypes']) + + ret['tags'] = map(lambda tag: dict_merge(tag, {'label_translated': get_translated_value(tag.pop('label'))}), + ret['tags']) + ret['establishment_subtypes'] = map( + lambda subtype: dict_merge(subtype, {'name_translated': get_translated_value(subtype.pop('name'))}), + ret['establishment_subtypes']) if ret.get('establishment_type'): ret['establishment_type']['name_translated'] = get_translated_value(ret['establishment_type'].pop('name')) - ret['address']['city']['country']['name_translated'] = get_translated_value(ret['address']['city']['country'].pop('name')) + if ret.get('address'): + ret['address']['city']['country']['name_translated'] = get_translated_value( + ret['address']['city']['country'].pop('name')) + + ret['type'] = ret.pop('establishment_type') + ret['subtypes'] = ret.pop('establishment_subtypes') return ret \ No newline at end of file From e0d09486c2f8398e8464323a70c39fc153d1ccc6 Mon Sep 17 00:00:00 2001 From: Kuroshini Date: Thu, 26 Sep 2019 17:40:35 +0300 Subject: [PATCH 4/7] Revert "address coordinates in get api queries" This reverts commit f21b400 --- apps/location/models.py | 4 ---- apps/location/serializers/common.py | 20 ++++++++++---------- apps/search_indexes/serializers.py | 2 +- 3 files changed, 11 insertions(+), 15 deletions(-) diff --git a/apps/location/models.py b/apps/location/models.py index b0aa298c..7084385f 100644 --- a/apps/location/models.py +++ b/apps/location/models.py @@ -104,10 +104,6 @@ class Address(models.Model): def longitude(self): return self.coordinates.x - @property - def location(self): - return self.location_field_indexing - @property def location_field_indexing(self): return {'lat': self.latitude, diff --git a/apps/location/serializers/common.py b/apps/location/serializers/common.py index 0b8ac7ed..555cf499 100644 --- a/apps/location/serializers/common.py +++ b/apps/location/serializers/common.py @@ -90,9 +90,8 @@ class AddressSerializer(serializers.ModelSerializer): source='city', queryset=models.City.objects.all()) city = CitySerializer(read_only=True) - geo_lon = serializers.FloatField(allow_null=True, write_only=True) - geo_lat = serializers.FloatField(allow_null=True, write_only=True) - location = serializers.ReadOnlyField() + geo_lon = serializers.FloatField(allow_null=True) + geo_lat = serializers.FloatField(allow_null=True) class Meta: model = models.Address @@ -105,8 +104,7 @@ class AddressSerializer(serializers.ModelSerializer): 'number', 'postal_code', 'geo_lon', - 'geo_lat', - 'location', + 'geo_lat' ] def validate(self, attrs): @@ -121,10 +119,12 @@ class AddressSerializer(serializers.ModelSerializer): def to_representation(self, instance): """Override to_representation method""" - if not instance.coordinates or not isinstance(instance.coordinates, Point): - setattr(instance, 'location', { - 'lat': float(0), - 'lon': float(0), - }) + if instance.coordinates and isinstance(instance.coordinates, Point): + # Point(longitude, latitude) + setattr(instance, 'geo_lat', instance.coordinates.x) + setattr(instance, 'geo_lon', instance.coordinates.y) + else: + setattr(instance, 'geo_lat', float(0)) + setattr(instance, 'geo_lon', float(0)) return super().to_representation(instance) diff --git a/apps/search_indexes/serializers.py b/apps/search_indexes/serializers.py index 73652ef6..598b60bf 100644 --- a/apps/search_indexes/serializers.py +++ b/apps/search_indexes/serializers.py @@ -54,7 +54,7 @@ class EstablishmentDocumentSerializer(DocumentSerializer): fields = ( 'id', 'name', - # 'description', + 'description', 'public_mark', 'toque_number', 'price_level', From fec3a2f6bc40bee7524f2912387a168f4873a361 Mon Sep 17 00:00:00 2001 From: Kuroshini Date: Thu, 26 Sep 2019 17:46:07 +0300 Subject: [PATCH 5/7] Reformat establishment elastic location for api --- apps/search_indexes/serializers.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/apps/search_indexes/serializers.py b/apps/search_indexes/serializers.py index 598b60bf..925bd6c7 100644 --- a/apps/search_indexes/serializers.py +++ b/apps/search_indexes/serializers.py @@ -86,7 +86,12 @@ class EstablishmentDocumentSerializer(DocumentSerializer): if ret.get('address'): ret['address']['city']['country']['name_translated'] = get_translated_value( ret['address']['city']['country'].pop('name')) + location = ret['address'].pop('location') + if location: + ret['address']['geo_lon'] = location['lon'] + ret['address']['geo_lat'] = location['lat'] ret['type'] = ret.pop('establishment_type') ret['subtypes'] = ret.pop('establishment_subtypes') + return ret \ No newline at end of file From ae00c30fac38d7d1ffb35a4fa29e10eff8d68e66 Mon Sep 17 00:00:00 2001 From: Kuroshini Date: Thu, 26 Sep 2019 17:50:07 +0300 Subject: [PATCH 6/7] Fix test --- apps/utils/tests.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/utils/tests.py b/apps/utils/tests.py index 5f8df6d8..4adc2f1e 100644 --- a/apps/utils/tests.py +++ b/apps/utils/tests.py @@ -1,5 +1,5 @@ import pytz -from datetime import datetime +from datetime import datetime, timedelta from rest_framework.test import APITestCase from rest_framework import status @@ -52,8 +52,8 @@ class TranslateFieldTests(BaseTestCase): }, description={"en-GB": "Test description"}, playlist=1, - start=datetime.now(pytz.utc), - end=datetime.now(pytz.utc), + start=datetime.now(pytz.utc) + timedelta(hours=-13), + end=datetime.now(pytz.utc) + timedelta(hours=13), is_publish=True, news_type=self.news_type, slug='test', @@ -63,7 +63,7 @@ class TranslateFieldTests(BaseTestCase): self.assertIsNotNone(getattr(self.news_item, "title_translated", None)) def test_read_locale(self): - response = self.client.get(f"/api/web/news/{self.news_item.slug}/", format='json') + response = self.client.get(f"/api/web/news/slug/{self.news_item.slug}/", format='json') self.assertEqual(response.status_code, status.HTTP_200_OK) news_data = response.json() From 87999830d14915cb2c8c0e3ee0ced48d4cf10c98 Mon Sep 17 00:00:00 2001 From: Kuroshini Date: Thu, 26 Sep 2019 17:53:21 +0300 Subject: [PATCH 7/7] Remove description from search results --- apps/search_indexes/serializers.py | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/search_indexes/serializers.py b/apps/search_indexes/serializers.py index 925bd6c7..1d8e3ca3 100644 --- a/apps/search_indexes/serializers.py +++ b/apps/search_indexes/serializers.py @@ -54,7 +54,6 @@ class EstablishmentDocumentSerializer(DocumentSerializer): fields = ( 'id', 'name', - 'description', 'public_mark', 'toque_number', 'price_level',