From 37fb67cbb33b4179cff019236ff0aa70f710943c Mon Sep 17 00:00:00 2001 From: Kuroshini Date: Wed, 16 Oct 2019 14:11:07 +0300 Subject: [PATCH 01/10] Fix subqueries --- apps/main/models.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/main/models.py b/apps/main/models.py index 6af4e4d8..129ea238 100644 --- a/apps/main/models.py +++ b/apps/main/models.py @@ -173,7 +173,8 @@ class SiteSettings(ProjectBaseMixin): @property def published_sitefeatures(self): return self.sitefeature_set\ - .filter(Q(published=True) and Q(feature__source__in=[PlatformMixin.WEB, PlatformMixin.ALL])) + .filter(published=True)\ + .filter(feature__source__in=[PlatformMixin.WEB, PlatformMixin.ALL]) @property def site_url(self): From d4792cb342e4cf68c985021a104b89067b85379e Mon Sep 17 00:00:00 2001 From: Kuroshini Date: Wed, 16 Oct 2019 14:11:07 +0300 Subject: [PATCH 02/10] Geo subtypes --- apps/establishment/serializers/common.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/apps/establishment/serializers/common.py b/apps/establishment/serializers/common.py index 3f42c15b..176cd2a7 100644 --- a/apps/establishment/serializers/common.py +++ b/apps/establishment/serializers/common.py @@ -149,6 +149,18 @@ class EstablishmentSubTypeBaseSerializer(serializers.ModelSerializer): 'establishment_type': {'write_only': True} } +class EstablishmentSubTypeGeoSerializer(EstablishmentSubTypeBaseSerializer): + """Serializer for EstablishmentSuType model w/ index_name.""" + + class Meta(EstablishmentSubTypeBaseSerializer.Meta): + fields = EstablishmentSubTypeBaseSerializer.Meta.fields + [ + 'index_name' + ] + extra_kwargs = { + **EstablishmentSubTypeBaseSerializer.Meta.extra_kwargs, + 'index_name': {'read_only': True}, + } + class EstablishmentEmployeeSerializer(serializers.ModelSerializer): """Serializer for actual employees.""" @@ -200,12 +212,14 @@ class EstablishmentGeoSerializer(EstablishmentBaseSerializer): """Serializer for Geo view.""" type = EstablishmentTypeGeoSerializer(source='establishment_type', read_only=True) + subtypes = EstablishmentSubTypeGeoSerializer(many=True, source='establishment_subtypes') class Meta(EstablishmentBaseSerializer.Meta): """Meta class.""" fields = EstablishmentBaseSerializer.Meta.fields + [ - 'type' + 'type', + 'subtypes', ] From 7be3c2b93faf6ea2d658612c0bba674900676296 Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 31 Oct 2019 12:02:52 +0300 Subject: [PATCH 03/10] add_establishment_description command --- .../commands/add_establishment_description.py | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 apps/establishment/management/commands/add_establishment_description.py diff --git a/apps/establishment/management/commands/add_establishment_description.py b/apps/establishment/management/commands/add_establishment_description.py new file mode 100644 index 00000000..1748d81d --- /dev/null +++ b/apps/establishment/management/commands/add_establishment_description.py @@ -0,0 +1,31 @@ +from django.core.management.base import BaseCommand + +from establishment.models import Establishment +from transfer.models import Descriptions + + +class Command(BaseCommand): + help = 'Add description values from old db to new db' + + def handle(self, *args, **kwargs): + count = 0 + + queryset = Descriptions.objects.all() + for obj in queryset: + try: + establishment = Establishment.objects.get(old_id=obj.establishment.id) + except Establishment.DoesNotExist: + continue + except Establishment.MultipleObjectsReturned: + establishment = Establishment.objects.filter(old_id=obj.establishment.id).first() + else: + description = establishment.description + description.update({ + obj.locale: obj.text + }) + establishment.description = description + establishment.save() + count += 1 + break + + self.stdout.write(self.style.WARNING(f'Updated {count} objects.')) From 0d399cc44edae29cdeec6d53daf5b4e8cf0536a8 Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 31 Oct 2019 12:29:40 +0300 Subject: [PATCH 04/10] add_establishment_mark command --- .../commands/add_establishment_mark.py | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 apps/establishment/management/commands/add_establishment_mark.py diff --git a/apps/establishment/management/commands/add_establishment_mark.py b/apps/establishment/management/commands/add_establishment_mark.py new file mode 100644 index 00000000..1588268f --- /dev/null +++ b/apps/establishment/management/commands/add_establishment_mark.py @@ -0,0 +1,46 @@ +from pprint import pprint + +from django.core.management.base import BaseCommand +from django.db.models import Q + +from establishment.models import Establishment +from transfer.models import Reviews + + +class Command(BaseCommand): + help = 'Add description values from old db to new db' + + def handle(self, *args, **kwargs): + count = 0 + valid_data = {} + + queryset = Reviews.objects.exclude( + Q(establishment_id__isnull=True) | + Q(mark__isnull=True) + ).filter(aasm_state='published').values_list('establishment_id', 'mark', 'updated_at') + + print(queryset.count()) + + for es_id, new_mark, new_date in queryset: + try: + mark, date = valid_data[es_id] + except KeyError: + valid_data[es_id] = (new_mark, new_date) + else: + if new_date > date: + valid_data[es_id] = (new_mark, new_date) + + for key, value in valid_data.items(): + try: + establishment = Establishment.objects.get(old_id=key) + except Establishment.DoesNotExist: + continue + except Establishment.MultipleObjectsReturned: + establishment = Establishment.objects.filter(old_id=key).first() + else: + establishment.public_mark = int(value[0]) + establishment.save() + count += 1 + break + + self.stdout.write(self.style.WARNING(f'Updated {count} objects.')) From 2c9d579a54a71633bbca9b3037c69b5a787263fe Mon Sep 17 00:00:00 2001 From: "e.stoyushko" Date: Thu, 31 Oct 2019 11:42:57 +0000 Subject: [PATCH 05/10] Update models.py --- apps/main/models.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/main/models.py b/apps/main/models.py index 129ea238..1474acb0 100644 --- a/apps/main/models.py +++ b/apps/main/models.py @@ -172,9 +172,9 @@ class SiteSettings(ProjectBaseMixin): @property def published_sitefeatures(self): - return self.sitefeature_set\ - .filter(published=True)\ - .filter(feature__source__in=[PlatformMixin.WEB, PlatformMixin.ALL]) + return self.sitefeature_set. \ + filter(Q(published=True) & + Q(feature__source__in=[PlatformMixin.WEB, PlatformMixin.ALL])) @property def site_url(self): From 453a4f5caca6f14802698bea428c77e937eb5041 Mon Sep 17 00:00:00 2001 From: evgeniy-st Date: Thu, 31 Oct 2019 14:46:42 +0300 Subject: [PATCH 06/10] remove celerybeat-schedule from git --- celerybeat-schedule | Bin 16384 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 celerybeat-schedule diff --git a/celerybeat-schedule b/celerybeat-schedule deleted file mode 100644 index 42475a623430ec365e9741260cf2c026a509b8e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeI3Pixdb7{;^Bw%g6_x^1^o@lW;ER%lq;qDVam#nYllthgc=ve|(Ix9Pr_S+RwM zJrzB9_XCJW5j^YFgS~k4Bwjp-pFq%=WVUWgFRfTbo`mF`$xLQ8zj@{%A=&L`cPhr1 zVI-RjD&}>3uHsd-GmP(YGm})h8`0^RYMLnZ%XI#W&R@LHFF*tV5C8!X009sH0T2KI z5C8!X009vAYXr{eo)J?J-~bMa0CWHyKnIuy@B#P$d;mTGAAk?Q2jBz$nGa;sS#6Yc zoL)#1Cw0E0-{)`Z{9T=YT}%(u7Ss4ae*iGA&)=I@wNzg}xQS|JbCWRWdA{(##tYjna^)7@3(hEX&0W%IuS#X6h4bUOe3>tUhPmNf<|NLE1w zhl*V)DG&;XpfQKWxy`APQkZn;I6s2RJ|s*tF!xhXRw+orS~iBBmT7oUK_gN@xh)!X zC|}zdihUGh&F;V|1j#C>=uk;=Qn1QWID*C Date: Thu, 31 Oct 2019 16:11:46 +0300 Subject: [PATCH 07/10] using a fallback language for translation --- apps/search_indexes/filters.py | 4 ++-- apps/search_indexes/utils.py | 8 ++++++-- apps/utils/models.py | 25 +++++++++++++++++-------- project/settings/base.py | 2 ++ 4 files changed, 27 insertions(+), 12 deletions(-) diff --git a/apps/search_indexes/filters.py b/apps/search_indexes/filters.py index f9ae0ef1..93208a71 100644 --- a/apps/search_indexes/filters.py +++ b/apps/search_indexes/filters.py @@ -1,7 +1,7 @@ """Search indexes filters.""" from elasticsearch_dsl.query import Q from django_elasticsearch_dsl_drf.filter_backends import SearchFilterBackend -from utils.models import get_current_language +from utils.models import get_current_locale class CustomSearchFilterBackend(SearchFilterBackend): @@ -12,7 +12,7 @@ class CustomSearchFilterBackend(SearchFilterBackend): field_name = field if hasattr(view, 'search_fields') and hasattr(view, 'translated_search_fields'): if field in view.translated_search_fields: - field_name = f'{field}.{get_current_language()}' + field_name = f'{field}.{get_current_locale()}' return field_name def construct_search(self, request, view): diff --git a/apps/search_indexes/utils.py b/apps/search_indexes/utils.py index 0c1dd187..d6153da2 100644 --- a/apps/search_indexes/utils.py +++ b/apps/search_indexes/utils.py @@ -1,6 +1,6 @@ """Search indexes utils.""" from django_elasticsearch_dsl import fields -from utils.models import get_current_language +from utils.models import get_current_locale, get_default_locale # object field properties @@ -19,4 +19,8 @@ def get_translated_value(value): field_dict = value.to_dict() elif isinstance(value, dict): field_dict = value - return field_dict.get(get_current_language()) + value = field_dict.get(get_current_locale()) + # fallback + if value is None: + value = field_dict.get(get_default_locale()) + return value diff --git a/apps/utils/models.py b/apps/utils/models.py index 0c94d23f..55512e88 100644 --- a/apps/utils/models.py +++ b/apps/utils/models.py @@ -10,6 +10,7 @@ from django.contrib.postgres.fields.jsonb import KeyTextTransform from django.utils import timezone from django.utils.html import mark_safe from django.utils.translation import ugettext_lazy as _, get_language +from configuration.models import TranslationSettings from easy_thumbnails.fields import ThumbnailerImageField from sorl.thumbnail import get_thumbnail from sorl.thumbnail.fields import ImageField as SORLImageField @@ -59,13 +60,26 @@ def to_locale(language): return language + '-' + country +def get_current_locale(): + """Get current language.""" + return to_locale(get_language()) + + +def get_default_locale(): + return TranslationSettings.get_solo().default_language or \ + settings.FALLBACK_LOCALE + + def translate_field(self, field_name): def translate(self): field = getattr(self, field_name) if isinstance(field, dict): - return field.get(to_locale(get_language())) + value = field.get(to_locale(get_language())) + # fallback + if value is None: + value = field.get(get_default_locale()) + return value return None - return translate @@ -111,15 +125,10 @@ class TranslatedFieldsMixin: if self.STR_FIELD_NAME: field = getattr(self, getattr(self, 'STR_FIELD_NAME')) if isinstance(field, dict): - value = field.get(get_current_language()) + value = field.get(get_current_locale()) return value if value else super(TranslatedFieldsMixin, self).__str__() -def get_current_language(): - """Get current language.""" - return to_locale(get_language()) - - class OAuthProjectMixin: """OAuth2 mixin for project GM""" diff --git a/project/settings/base.py b/project/settings/base.py index d2cf7b49..731d73a5 100644 --- a/project/settings/base.py +++ b/project/settings/base.py @@ -488,3 +488,5 @@ MEDIA_LOCATION = 'media' PHONENUMBER_DB_FORMAT = 'NATIONAL' PHONENUMBER_DEFAULT_REGION = "FR" + +FALLBACK_LOCALE = 'en-GB' From 55e68ec336019c99bb8efe26afdf67c01837541a Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 31 Oct 2019 17:19:07 +0300 Subject: [PATCH 08/10] fix establishment mark --- .../management/commands/add_establishment_mark.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/apps/establishment/management/commands/add_establishment_mark.py b/apps/establishment/management/commands/add_establishment_mark.py index 1588268f..11053339 100644 --- a/apps/establishment/management/commands/add_establishment_mark.py +++ b/apps/establishment/management/commands/add_establishment_mark.py @@ -1,5 +1,3 @@ -from pprint import pprint - from django.core.management.base import BaseCommand from django.db.models import Q @@ -19,8 +17,6 @@ class Command(BaseCommand): Q(mark__isnull=True) ).filter(aasm_state='published').values_list('establishment_id', 'mark', 'updated_at') - print(queryset.count()) - for es_id, new_mark, new_date in queryset: try: mark, date = valid_data[es_id] @@ -41,6 +37,5 @@ class Command(BaseCommand): establishment.public_mark = int(value[0]) establishment.save() count += 1 - break self.stdout.write(self.style.WARNING(f'Updated {count} objects.')) From b87f21c630c2c03d9544ec6f981f9215bdcbd1f9 Mon Sep 17 00:00:00 2001 From: evgeniy-st Date: Thu, 31 Oct 2019 17:34:59 +0300 Subject: [PATCH 09/10] update transfer tz field --- apps/search_indexes/documents/establishment.py | 2 +- apps/search_indexes/views.py | 14 +++++++------- apps/transfer/serializers/establishment.py | 5 ++--- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/apps/search_indexes/documents/establishment.py b/apps/search_indexes/documents/establishment.py index e4e0c937..7eac2d6c 100644 --- a/apps/search_indexes/documents/establishment.py +++ b/apps/search_indexes/documents/establishment.py @@ -37,7 +37,7 @@ class EstablishmentDocument(Document): works_noon = fields.ListField(fields.IntegerField( attr='works_noon' )) - # works_now = fields.BooleanField(attr='works_now') + works_now = fields.BooleanField(attr='works_now') tags = fields.ObjectField( properties={ 'id': fields.IntegerField(attr='id'), diff --git a/apps/search_indexes/views.py b/apps/search_indexes/views.py index 1cbf9d05..a53e2615 100644 --- a/apps/search_indexes/views.py +++ b/apps/search_indexes/views.py @@ -139,7 +139,7 @@ class EstablishmentDocumentViewSet(BaseDocumentViewSet): 'lookups': [ constants.LOOKUP_QUERY_IN, ], - }, + }, 'works_noon': { 'field': 'works_noon', 'lookups': [ @@ -152,12 +152,12 @@ class EstablishmentDocumentViewSet(BaseDocumentViewSet): constants.LOOKUP_QUERY_IN, ], }, - # 'works_now': { - # 'field': 'works_now', - # 'lookups': [ - # constants.LOOKUP_FILTER_TERM, - # ] - # }, + 'works_now': { + 'field': 'works_now', + 'lookups': [ + constants.LOOKUP_FILTER_TERM, + ] + }, } geo_spatial_filter_fields = { diff --git a/apps/transfer/serializers/establishment.py b/apps/transfer/serializers/establishment.py index 7c8ce97c..6a2fcde5 100644 --- a/apps/transfer/serializers/establishment.py +++ b/apps/transfer/serializers/establishment.py @@ -6,8 +6,8 @@ from establishment.models import Establishment, ContactEmail, ContactPhone, Esta from location.models import Address from timetable.models import Timetable from utils.legacy_parser import parse_legacy_schedule_content +from utils.serializers import TimeZoneChoiceField from utils.slug_generator import generate_unique_slug -from pytz import timezone as ptz class EstablishmentSerializer(serializers.ModelSerializer): @@ -26,7 +26,7 @@ class EstablishmentSerializer(serializers.ModelSerializer): twitter = serializers.CharField(allow_null=True, allow_blank=True) booking = serializers.CharField(allow_null=True, allow_blank=True) state = serializers.CharField(allow_null=True) - tz = serializers.CharField() + tz = TimeZoneChoiceField() created = serializers.DateTimeField(format='%m-%d-%Y %H:%M:%S') class Meta: @@ -59,7 +59,6 @@ class EstablishmentSerializer(serializers.ModelSerializer): 'establishment_type_id': self.get_type(data), 'is_publish': data.get('state') == 'published', }) - data['tz'] = ptz(data['tz']) data.pop('location') data.pop('type') data.pop('state') From fe586755e3fab8c9cd402d04e3ee50d51f055926 Mon Sep 17 00:00:00 2001 From: Anatoly Date: Thu, 31 Oct 2019 17:54:56 +0300 Subject: [PATCH 10/10] small fix --- apps/tag/serializers.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/tag/serializers.py b/apps/tag/serializers.py index c09f42f1..c4811f7a 100644 --- a/apps/tag/serializers.py +++ b/apps/tag/serializers.py @@ -14,7 +14,7 @@ class TagBaseSerializer(serializers.ModelSerializer): # todo: refactor this # label_translated = TranslatedField() - label_translated = serializers.CharField(source='value') + label_translated = serializers.CharField(source='value', read_only=True, allow_null=True) class Meta: """Meta class.""" @@ -43,7 +43,7 @@ class TagCategoryBaseSerializer(serializers.ModelSerializer): # todo: refactor this # label_translated = TranslatedField() - label_translated = serializers.CharField(source='index_name') + label_translated = serializers.CharField(source='index_name', read_only=True, allow_null=True) tags = TagBaseSerializer(many=True, read_only=True) class Meta: