Updated news model with agenda and banner

This commit is contained in:
Semyon Yekhmenin 2019-10-21 14:45:34 +00:00 committed by e.stoyushko
parent e67516c324
commit afc2127646
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 import timezone
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from rest_framework.reverse import reverse 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 from rating.models import Rating
@ -38,7 +38,7 @@ class NewsQuerySet(models.QuerySet):
def with_extended_related(self): def with_extended_related(self):
"""Return qs with related objects.""" """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): def by_type(self, news_type):
"""Filter News by type""" """Filter News by type"""
@ -61,15 +61,39 @@ class NewsQuerySet(models.QuerySet):
# todo: filter by best score # todo: filter by best score
# todo: filter by country? # todo: filter by country?
def should_read(self, news): 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('?') with_base_related().by_type(news.news_type).distinct().order_by('?')
def same_theme(self, news): def same_theme(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).\ with_base_related().by_type(news.news_type). \
by_tags(news.tags.all()).distinct().order_by('-start') 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): class News(BaseAttributes, TranslatedFieldsMixin):
"""News model.""" """News model."""
@ -139,6 +163,14 @@ class News(BaseAttributes, TranslatedFieldsMixin):
verbose_name=_('Tags')) verbose_name=_('Tags'))
ratings = generic.GenericRelation(Rating) 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() objects = NewsQuerySet.as_manager()
class Meta: class Meta:

View File

@ -2,12 +2,46 @@
from rest_framework import serializers from rest_framework import serializers
from account.serializers.common import UserBaseSerializer from account.serializers.common import UserBaseSerializer
from location import models as location_models from location import models as location_models
from location.serializers import CountrySimpleSerializer from location.serializers import CountrySimpleSerializer, AddressBaseSerializer
from news import models from news import models
from tag.serializers import TagBaseSerializer from tag.serializers import TagBaseSerializer
from utils.serializers import TranslatedField, ProjectModelSerializer 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): class NewsTypeSerializer(serializers.ModelSerializer):
"""News type serializer.""" """News type serializer."""
@ -76,6 +110,8 @@ class NewsDetailWebSerializer(NewsDetailSerializer):
same_theme = NewsBaseSerializer(many=True, read_only=True) same_theme = NewsBaseSerializer(many=True, read_only=True)
should_read = NewsBaseSerializer(many=True, read_only=True) should_read = NewsBaseSerializer(many=True, read_only=True)
agenda = AgendaSerializer()
banner = NewsBannerSerializer()
class Meta(NewsDetailSerializer.Meta): class Meta(NewsDetailSerializer.Meta):
"""Meta class.""" """Meta class."""
@ -83,6 +119,8 @@ class NewsDetailWebSerializer(NewsDetailSerializer):
fields = NewsDetailSerializer.Meta.fields + ( fields = NewsDetailSerializer.Meta.fields + (
'same_theme', 'same_theme',
'should_read', 'should_read',
'agenda',
'banner'
) )
@ -116,10 +154,9 @@ class NewsBackOfficeDetailSerializer(NewsBackOfficeBaseSerializer,
fields = NewsBackOfficeBaseSerializer.Meta.fields + \ fields = NewsBackOfficeBaseSerializer.Meta.fields + \
NewsDetailSerializer.Meta.fields + ( NewsDetailSerializer.Meta.fields + (
'description', 'description',
'news_type_id', 'news_type_id',
'country_id', 'country_id',
'template', 'template',
'template_display', 'template_display',
) )