Merge branch 'feature/agenda-fields' into 'develop'

Added fields separation

See merge request gm/gm-backend!254
This commit is contained in:
Олег Хаятов 2020-01-31 13:23:22 +00:00
commit 6d9983ad3f
3 changed files with 89 additions and 29 deletions

View File

@ -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'),
),
]

View File

@ -9,7 +9,7 @@ from django.contrib.contenttypes.models import ContentType
from django.contrib.postgres.fields import HStoreField from django.contrib.postgres.fields import HStoreField
from django.contrib.postgres.search import TrigramSimilarity from django.contrib.postgres.search import TrigramSimilarity
from django.db import models 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.db.models.functions import Cast
from django.urls.exceptions import NoReverseMatch from django.urls.exceptions import NoReverseMatch
from django.utils import timezone from django.utils import timezone
@ -17,23 +17,28 @@ from django.utils.translation import gettext_lazy as _
from rest_framework.reverse import reverse from rest_framework.reverse import reverse
from main.models import Carousel from main.models import Carousel
from rating.models import Rating, ViewCount from rating.models import Rating
from utils.models import (BaseAttributes, TJSONField, TranslatedFieldsMixin, HasTagsMixin, from utils.models import (
ProjectBaseMixin, GalleryMixin, IntermediateGalleryModelMixin, BaseAttributes, FavoritesMixin, GalleryMixin, HasTagsMixin, IntermediateGalleryModelMixin, ProjectBaseMixin,
FavoritesMixin, TypeDefaultImageMixin) TJSONField, TranslatedFieldsMixin, TypeDefaultImageMixin,
)
from utils.querysets import TranslationQuerysetMixin from utils.querysets import TranslationQuerysetMixin
class Agenda(ProjectBaseMixin, TranslatedFieldsMixin): class Agenda(ProjectBaseMixin, TranslatedFieldsMixin):
"""News agenda model""" """News agenda model"""
start_datetime = models.DateTimeField(default=timezone.now, editable=True, start_date = models.DateField(default=timezone.now, editable=True,
verbose_name=_('Start datetime')) verbose_name=_('Start date'))
end_datetime = models.DateTimeField(default=timezone.now, editable=True, start_time = models.TimeField(default=timezone.now, editable=True,
verbose_name=_('End datetime')) 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) address = models.TextField(verbose_name=_('event address'), default=None, blank=True)
event_name = TJSONField(blank=True, null=True, default=None, event_name = TJSONField(blank=True, null=True, default=None,
verbose_name=_('event name'), verbose_name=_('event name'),
help_text='{"en-GB":"some text"}') help_text='{"en-GB":"some text"}')
content = TJSONField(blank=True, null=True, default=None, content = TJSONField(blank=True, null=True, default=None,
verbose_name=_('content'), verbose_name=_('content'),
help_text='{"en-GB":"some text"}') help_text='{"en-GB":"some text"}')
@ -52,6 +57,7 @@ class NewsBanner(ProjectBaseMixin, TranslatedFieldsMixin):
class NewsTypeQuerySet(models.QuerySet): class NewsTypeQuerySet(models.QuerySet):
"""QuerySet for model NewsType""" """QuerySet for model NewsType"""
def with_base_related(self): def with_base_related(self):
return self.select_related('default_image') 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)). \ return self.exclude(models.Q(publication_date__isnull=True) | models.Q(publication_time__isnull=True)). \
filter(models.Q(models.Q(end__gte=now) | filter(models.Q(models.Q(end__gte=now) |
models.Q(end__isnull=True)), models.Q(end__isnull=True)),
state__in=self.model.PUBLISHED_STATES)\ state__in=self.model.PUBLISHED_STATES) \
.annotate(visible_now=Case( .annotate(visible_now=Case(
When(publication_date__gt=date_now, then=False), When(publication_date__gt=date_now, then=False),
When(Q(publication_date=date_now) & Q(publication_time__gt=time_now), then=False), When(Q(publication_date=date_now) & Q(publication_time__gt=time_now), then=False),
default=True, default=True,
output_field=models.BooleanField() output_field=models.BooleanField()
))\ )) \
.exclude(visible_now=False) .exclude(visible_now=False)
# todo: filter by best score # todo: filter by best score
@ -186,12 +192,19 @@ class NewsQuerySet(TranslationQuerysetMixin):
_query = None _query = None
for key, boost in search_keys.items(): for key, boost in search_keys.items():
if _query is None: if _query is None:
_query = elasticsearch_dsl.Q('match', **{key: {'query': search_value, 'fuzziness': 'auto:2,5', _query = elasticsearch_dsl.Q('match', **{
'boost': boost}}) key: {
'query': search_value, 'fuzziness': 'auto:2,5',
'boost': boost
}
})
else: else:
_query |= elasticsearch_dsl.Q('match', **{key: {'query': search_value, 'fuzziness': 'auto:2,5', _query |= elasticsearch_dsl.Q('match', **{
'boost': boost, key: {
}}) 'query': search_value, 'fuzziness': 'auto:2,5',
'boost': boost,
}
})
_query |= elasticsearch_dsl.Q('wildcard', **{key: {'value': f'*{search_value}*', 'boost': boost + 30}}) _query |= elasticsearch_dsl.Q('wildcard', **{key: {'value': f'*{search_value}*', 'boost': boost + 30}})
search = NewsDocument.search().query('bool', should=_query)[0:10000].execute() search = NewsDocument.search().query('bool', should=_query)[0:10000].execute()
ids = [result.meta.id for result in search] ids = [result.meta.id for result in search]
@ -386,7 +399,8 @@ class News(GalleryMixin, BaseAttributes, TranslatedFieldsMixin, HasTagsMixin,
@property @property
def has_any_desc_active(self): def has_any_desc_active(self):
"""Detects whether news item has any active description""" """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 @property
def is_publish(self): def is_publish(self):

View File

@ -20,10 +20,12 @@ from utils.serializers import (
class AgendaSerializer(ProjectModelSerializer): class AgendaSerializer(ProjectModelSerializer):
start_datetime = serializers.DateTimeField() start_date = serializers.DateField()
end_datetime = serializers.DateTimeField() start_time = serializers.TimeField(required=False)
event_name_translated = TranslatedField() end_date = serializers.DateField(required=False)
content_translated = TranslatedField() end_time = serializers.TimeField(required=False)
event_name_translated = TranslatedField(required=False)
content_translated = TranslatedField(required=False)
class Meta: class Meta:
"""Meta class.""" """Meta class."""
@ -31,8 +33,10 @@ class AgendaSerializer(ProjectModelSerializer):
model = models.Agenda model = models.Agenda
fields = ( fields = (
'id', 'id',
'start_datetime', 'start_date',
'end_datetime', 'start_time',
'end_date',
'end_time',
'address', 'address',
'content_translated', 'content_translated',
'event_name_translated', 'event_name_translated',