Updated news model with agenda and banner
This commit is contained in:
parent
e67516c324
commit
afc2127646
57
apps/news/migrations/0022_auto_20191021_1306.py
Normal file
57
apps/news/migrations/0022_auto_20191021_1306.py
Normal 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'),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user