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:
commit
42e822e5c1
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.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:
|
||||
|
|
|
|||
|
|
@ -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',
|
||||
)
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user