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.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):

View File

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