From 1f887b3367f73ef28c4c6bc14b47dd9d7e160967 Mon Sep 17 00:00:00 2001 From: dormantman Date: Fri, 31 Jan 2020 15:33:25 +0300 Subject: [PATCH] Added fields separation --- .../migrations/0055_auto_20200131_1232.py | 42 +++++++++++++ apps/news/models.py | 60 ++++++++++++------- apps/news/serializers.py | 16 +++-- 3 files changed, 89 insertions(+), 29 deletions(-) create mode 100644 apps/news/migrations/0055_auto_20200131_1232.py diff --git a/apps/news/migrations/0055_auto_20200131_1232.py b/apps/news/migrations/0055_auto_20200131_1232.py new file mode 100644 index 00000000..278de8bd --- /dev/null +++ b/apps/news/migrations/0055_auto_20200131_1232.py @@ -0,0 +1,42 @@ +# Generated by Django 2.2.7 on 2020-01-31 12:32 + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('news', '0054_auto_20200130_1641'), + ] + + operations = [ + migrations.RemoveField( + model_name='agenda', + name='end_datetime', + ), + migrations.RemoveField( + model_name='agenda', + name='start_datetime', + ), + migrations.AddField( + model_name='agenda', + name='end_date', + field=models.DateField(default=django.utils.timezone.now, verbose_name='End date'), + ), + migrations.AddField( + model_name='agenda', + name='end_time', + field=models.TimeField(default=django.utils.timezone.now, verbose_name='End time'), + ), + migrations.AddField( + model_name='agenda', + name='start_date', + field=models.DateField(default=django.utils.timezone.now, verbose_name='Start date'), + ), + migrations.AddField( + model_name='agenda', + name='start_time', + field=models.TimeField(default=django.utils.timezone.now, verbose_name='Start time'), + ), + ] diff --git a/apps/news/models.py b/apps/news/models.py index 8788a358..34328a05 100644 --- a/apps/news/models.py +++ b/apps/news/models.py @@ -9,7 +9,7 @@ from django.contrib.contenttypes.models import ContentType from django.contrib.postgres.fields import HStoreField from django.contrib.postgres.search import TrigramSimilarity from django.db import models -from django.db.models import Case, When, Q, F +from django.db.models import Case, F, Q, When from django.db.models.functions import Cast from django.urls.exceptions import NoReverseMatch from django.utils import timezone @@ -17,23 +17,28 @@ from django.utils.translation import gettext_lazy as _ from rest_framework.reverse import reverse from main.models import Carousel -from rating.models import Rating, ViewCount -from utils.models import (BaseAttributes, TJSONField, TranslatedFieldsMixin, HasTagsMixin, - ProjectBaseMixin, GalleryMixin, IntermediateGalleryModelMixin, - FavoritesMixin, TypeDefaultImageMixin) +from rating.models import Rating +from utils.models import ( + BaseAttributes, FavoritesMixin, GalleryMixin, HasTagsMixin, IntermediateGalleryModelMixin, ProjectBaseMixin, + TJSONField, TranslatedFieldsMixin, TypeDefaultImageMixin, +) from utils.querysets import TranslationQuerysetMixin class Agenda(ProjectBaseMixin, TranslatedFieldsMixin): """News agenda model""" - start_datetime = models.DateTimeField(default=timezone.now, editable=True, - verbose_name=_('Start datetime')) - end_datetime = models.DateTimeField(default=timezone.now, editable=True, - verbose_name=_('End datetime')) + start_date = models.DateField(default=timezone.now, editable=True, + verbose_name=_('Start date')) + start_time = models.TimeField(default=timezone.now, editable=True, + verbose_name=_('Start time')) + end_date = models.DateField(default=timezone.now, editable=True, + verbose_name=_('End date')) + end_time = models.TimeField(default=timezone.now, editable=True, + verbose_name=_('End time')) address = models.TextField(verbose_name=_('event address'), default=None, blank=True) event_name = TJSONField(blank=True, null=True, default=None, - verbose_name=_('event name'), - help_text='{"en-GB":"some text"}') + verbose_name=_('event name'), + help_text='{"en-GB":"some text"}') content = TJSONField(blank=True, null=True, default=None, verbose_name=_('content'), help_text='{"en-GB":"some text"}') @@ -52,6 +57,7 @@ class NewsBanner(ProjectBaseMixin, TranslatedFieldsMixin): class NewsTypeQuerySet(models.QuerySet): """QuerySet for model NewsType""" + def with_base_related(self): return self.select_related('default_image') @@ -130,13 +136,13 @@ class NewsQuerySet(TranslationQuerysetMixin): return self.exclude(models.Q(publication_date__isnull=True) | models.Q(publication_time__isnull=True)). \ filter(models.Q(models.Q(end__gte=now) | models.Q(end__isnull=True)), - state__in=self.model.PUBLISHED_STATES)\ + state__in=self.model.PUBLISHED_STATES) \ .annotate(visible_now=Case( - When(publication_date__gt=date_now, then=False), - When(Q(publication_date=date_now) & Q(publication_time__gt=time_now), then=False), - default=True, - output_field=models.BooleanField() - ))\ + When(publication_date__gt=date_now, then=False), + When(Q(publication_date=date_now) & Q(publication_time__gt=time_now), then=False), + default=True, + output_field=models.BooleanField() + )) \ .exclude(visible_now=False) # todo: filter by best score @@ -186,12 +192,19 @@ class NewsQuerySet(TranslationQuerysetMixin): _query = None for key, boost in search_keys.items(): if _query is None: - _query = elasticsearch_dsl.Q('match', **{key: {'query': search_value, 'fuzziness': 'auto:2,5', - 'boost': boost}}) + _query = elasticsearch_dsl.Q('match', **{ + key: { + 'query': search_value, 'fuzziness': 'auto:2,5', + 'boost': boost + } + }) else: - _query |= elasticsearch_dsl.Q('match', **{key: {'query': search_value, 'fuzziness': 'auto:2,5', - 'boost': boost, - }}) + _query |= elasticsearch_dsl.Q('match', **{ + key: { + 'query': search_value, 'fuzziness': 'auto:2,5', + 'boost': boost, + } + }) _query |= elasticsearch_dsl.Q('wildcard', **{key: {'value': f'*{search_value}*', 'boost': boost + 30}}) search = NewsDocument.search().query('bool', should=_query)[0:10000].execute() ids = [result.meta.id for result in search] @@ -386,7 +399,8 @@ class News(GalleryMixin, BaseAttributes, TranslatedFieldsMixin, HasTagsMixin, @property def has_any_desc_active(self): """Detects whether news item has any active description""" - return any(list(map(lambda v: v.lower() == 'true' if isinstance(v, str) else v, self.locale_to_description_is_active.values()))) + return any(list(map(lambda v: v.lower() == 'true' if isinstance(v, str) else v, + self.locale_to_description_is_active.values()))) @property def is_publish(self): diff --git a/apps/news/serializers.py b/apps/news/serializers.py index 2116b1c0..db771aad 100644 --- a/apps/news/serializers.py +++ b/apps/news/serializers.py @@ -20,10 +20,12 @@ from utils.serializers import ( class AgendaSerializer(ProjectModelSerializer): - start_datetime = serializers.DateTimeField() - end_datetime = serializers.DateTimeField() - event_name_translated = TranslatedField() - content_translated = TranslatedField() + start_date = serializers.DateField() + start_time = serializers.TimeField(required=False) + end_date = serializers.DateField(required=False) + end_time = serializers.TimeField(required=False) + event_name_translated = TranslatedField(required=False) + content_translated = TranslatedField(required=False) class Meta: """Meta class.""" @@ -31,8 +33,10 @@ class AgendaSerializer(ProjectModelSerializer): model = models.Agenda fields = ( 'id', - 'start_datetime', - 'end_datetime', + 'start_date', + 'start_time', + 'end_date', + 'end_time', 'address', 'content_translated', 'event_name_translated',