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.')) 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..11053339 --- /dev/null +++ b/apps/establishment/management/commands/add_establishment_mark.py @@ -0,0 +1,41 @@ +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') + + 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 + + self.stdout.write(self.style.WARNING(f'Updated {count} objects.')) 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', ] diff --git a/apps/main/models.py b/apps/main/models.py index 6af4e4d8..1474acb0 100644 --- a/apps/main/models.py +++ b/apps/main/models.py @@ -172,8 +172,9 @@ 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])) + return self.sitefeature_set. \ + filter(Q(published=True) & + Q(feature__source__in=[PlatformMixin.WEB, PlatformMixin.ALL])) @property def site_url(self): 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/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/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/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: 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') 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/celerybeat-schedule b/celerybeat-schedule deleted file mode 100644 index 42475a62..00000000 Binary files a/celerybeat-schedule and /dev/null differ 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'