Merge branch 'feature/news_model_update' into 'develop'

Updated news model with agenda and banner

See merge request gm/gm-backend!61
This commit is contained in:
e.stoyushko 2019-10-21 14:45:34 +00:00
commit 42e822e5c1
3 changed files with 138 additions and 12 deletions

View File

@ -0,0 +1,57 @@
# Generated by Django 2.2.4 on 2019-10-21 13:06
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
import utils.models
class Migration(migrations.Migration):
dependencies = [
('location', '0012_data_migrate'),
('news', '0021_auto_20191009_1408'),
]
operations = [
migrations.CreateModel(
name='NewsBanner',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created', models.DateTimeField(default=django.utils.timezone.now, editable=False, verbose_name='Date created')),
('modified', models.DateTimeField(auto_now=True, verbose_name='Date updated')),
('title', utils.models.TJSONField(blank=True, default=None, help_text='{"en-GB":"some text"}', null=True, verbose_name='title')),
('image_url', models.URLField(blank=True, default=None, null=True, verbose_name='Image URL path')),
('content_url', models.URLField(blank=True, default=None, null=True, verbose_name='Content URL path')),
],
options={
'abstract': False,
},
bases=(models.Model, utils.models.TranslatedFieldsMixin),
),
migrations.CreateModel(
name='Agenda',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created', models.DateTimeField(default=django.utils.timezone.now, editable=False, verbose_name='Date created')),
('modified', models.DateTimeField(auto_now=True, verbose_name='Date updated')),
('event_datetime', models.DateTimeField(default=django.utils.timezone.now, editable=False, verbose_name='Event datetime')),
('content', utils.models.TJSONField(blank=True, default=None, help_text='{"en-GB":"some text"}', null=True, verbose_name='content')),
('address', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, to='location.Address', verbose_name='address')),
],
options={
'abstract': False,
},
bases=(models.Model, utils.models.TranslatedFieldsMixin),
),
migrations.AddField(
model_name='news',
name='agenda',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='news.Agenda', verbose_name='agenda'),
),
migrations.AddField(
model_name='news',
name='banner',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='news.NewsBanner', verbose_name='banner'),
),
]

View File

@ -4,7 +4,7 @@ from django.contrib.contenttypes import fields as generic
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from rest_framework.reverse import reverse
from utils.models import BaseAttributes, TJSONField, TranslatedFieldsMixin
from utils.models import BaseAttributes, TJSONField, TranslatedFieldsMixin, ProjectBaseMixin
from rating.models import Rating
@ -38,7 +38,7 @@ class NewsQuerySet(models.QuerySet):
def with_extended_related(self):
"""Return qs with related objects."""
return self.select_related('created_by')
return self.select_related('created_by', 'agenda', 'banner')
def by_type(self, news_type):
"""Filter News by type"""
@ -61,15 +61,39 @@ class NewsQuerySet(models.QuerySet):
# todo: filter by best score
# todo: filter by country?
def should_read(self, news):
return self.model.objects.exclude(pk=news.pk).published().\
return self.model.objects.exclude(pk=news.pk).published(). \
with_base_related().by_type(news.news_type).distinct().order_by('?')
def same_theme(self, news):
return self.model.objects.exclude(pk=news.pk).published().\
with_base_related().by_type(news.news_type).\
return self.model.objects.exclude(pk=news.pk).published(). \
with_base_related().by_type(news.news_type). \
by_tags(news.tags.all()).distinct().order_by('-start')
class Agenda(ProjectBaseMixin, TranslatedFieldsMixin):
"""News agenda model"""
event_datetime = models.DateTimeField(default=timezone.now, editable=False,
verbose_name=_('Event datetime'))
address = models.ForeignKey('location.Address', blank=True, null=True,
default=None, verbose_name=_('address'),
on_delete=models.SET_NULL)
content = TJSONField(blank=True, null=True, default=None,
verbose_name=_('content'),
help_text='{"en-GB":"some text"}')
class NewsBanner(ProjectBaseMixin, TranslatedFieldsMixin):
"""News banner model"""
title = TJSONField(blank=True, null=True, default=None,
verbose_name=_('title'),
help_text='{"en-GB":"some text"}')
image_url = models.URLField(verbose_name=_('Image URL path'),
blank=True, null=True, default=None)
content_url = models.URLField(verbose_name=_('Content URL path'),
blank=True, null=True, default=None)
class News(BaseAttributes, TranslatedFieldsMixin):
"""News model."""
@ -139,6 +163,14 @@ class News(BaseAttributes, TranslatedFieldsMixin):
verbose_name=_('Tags'))
ratings = generic.GenericRelation(Rating)
agenda = models.ForeignKey('news.Agenda', blank=True, null=True,
on_delete=models.SET_NULL,
verbose_name=_('agenda'))
banner = models.ForeignKey('news.NewsBanner', blank=True, null=True,
on_delete=models.SET_NULL,
verbose_name=_('banner'))
objects = NewsQuerySet.as_manager()
class Meta:

View File

@ -2,12 +2,46 @@
from rest_framework import serializers
from account.serializers.common import UserBaseSerializer
from location import models as location_models
from location.serializers import CountrySimpleSerializer
from location.serializers import CountrySimpleSerializer, AddressBaseSerializer
from news import models
from tag.serializers import TagBaseSerializer
from utils.serializers import TranslatedField, ProjectModelSerializer
class AgendaSerializer(ProjectModelSerializer):
event_datetime = serializers.DateTimeField()
address = AddressBaseSerializer()
content_translated = TranslatedField()
class Meta:
"""Meta class."""
model = models.Agenda
fields = (
'id',
'event_datetime',
'address',
'content_translated'
)
class NewsBannerSerializer(ProjectModelSerializer):
title_translated = TranslatedField()
image_url = serializers.URLField()
content_url = serializers.URLField()
class Meta:
"""Meta class."""
model = models.NewsBanner
fields = (
'id',
'title_translated',
'image_url',
'content_url'
)
class NewsTypeSerializer(serializers.ModelSerializer):
"""News type serializer."""
@ -76,6 +110,8 @@ class NewsDetailWebSerializer(NewsDetailSerializer):
same_theme = NewsBaseSerializer(many=True, read_only=True)
should_read = NewsBaseSerializer(many=True, read_only=True)
agenda = AgendaSerializer()
banner = NewsBannerSerializer()
class Meta(NewsDetailSerializer.Meta):
"""Meta class."""
@ -83,6 +119,8 @@ class NewsDetailWebSerializer(NewsDetailSerializer):
fields = NewsDetailSerializer.Meta.fields + (
'same_theme',
'should_read',
'agenda',
'banner'
)
@ -116,10 +154,9 @@ class NewsBackOfficeDetailSerializer(NewsBackOfficeBaseSerializer,
fields = NewsBackOfficeBaseSerializer.Meta.fields + \
NewsDetailSerializer.Meta.fields + (
'description',
'news_type_id',
'country_id',
'template',
'template_display',
'description',
'news_type_id',
'country_id',
'template',
'template_display',
)