From 93bd8a59c46205f9a412dcef50bc2a58a1cef381 Mon Sep 17 00:00:00 2001 From: Anatoly Date: Mon, 26 Aug 2019 11:50:54 +0300 Subject: [PATCH 1/7] added image field to Country model --- .../location/migrations/0006_country_image.py | 20 +++++++++++++++++++ apps/location/models.py | 7 ++++--- apps/location/serializers.py | 6 ++++-- 3 files changed, 28 insertions(+), 5 deletions(-) create mode 100644 apps/location/migrations/0006_country_image.py diff --git a/apps/location/migrations/0006_country_image.py b/apps/location/migrations/0006_country_image.py new file mode 100644 index 00000000..7a0bf14f --- /dev/null +++ b/apps/location/migrations/0006_country_image.py @@ -0,0 +1,20 @@ +# Generated by Django 2.2.4 on 2019-08-26 08:42 + +from django.db import migrations +import easy_thumbnails.fields +import utils.methods + + +class Migration(migrations.Migration): + + dependencies = [ + ('location', '0005_auto_20190822_1144'), + ] + + operations = [ + migrations.AddField( + model_name='country', + name='image', + field=easy_thumbnails.fields.ThumbnailerImageField(blank=True, default=None, null=True, upload_to=utils.methods.image_path, verbose_name='Image'), + ), + ] diff --git a/apps/location/models.py b/apps/location/models.py index 9eb2b5e3..5b4d262c 100644 --- a/apps/location/models.py +++ b/apps/location/models.py @@ -1,15 +1,16 @@ """Location app models.""" -from django.contrib.postgres.fields import JSONField from django.contrib.gis.db import models +from django.contrib.postgres.fields import JSONField from django.utils.translation import gettext_lazy as _ -from utils.models import ProjectBaseMixin, LocaleManagerMixin + +from utils.models import ProjectBaseMixin, LocaleManagerMixin, ImageMixin class CountryManager(LocaleManagerMixin): """Extended manager for Country model.""" -class Country(ProjectBaseMixin): +class Country(ImageMixin, ProjectBaseMixin): """Country model.""" name = JSONField(null=True, blank=True, default=None, diff --git a/apps/location/serializers.py b/apps/location/serializers.py index 0e4efa7e..bfce3c05 100644 --- a/apps/location/serializers.py +++ b/apps/location/serializers.py @@ -1,6 +1,7 @@ -from rest_framework import serializers -from location import models from django.contrib.gis.geos import Point +from rest_framework import serializers + +from location import models class CountrySerializer(serializers.ModelSerializer): @@ -13,6 +14,7 @@ class CountrySerializer(serializers.ModelSerializer): fields = [ 'id', 'code', + 'image', 'name_trans', ] From 6caea820da21cee46744d26bce9372cb4cea12fe Mon Sep 17 00:00:00 2001 From: Anatoly Date: Mon, 26 Aug 2019 12:40:26 +0300 Subject: [PATCH 2/7] added application advertisement --- apps/advertisement/__init__.py | 0 apps/advertisement/admin.py | 1 + apps/advertisement/apps.py | 7 +++++++ apps/advertisement/migrations/__init__.py | 0 apps/advertisement/models.py | 1 + apps/advertisement/serializers/__init__.py | 0 apps/advertisement/tests.py | 1 + apps/advertisement/urls/__init__.py | 0 apps/advertisement/views/__init__.py | 0 apps/advertisement/views/web.py | 1 + apps/collection/models.py | 1 - project/settings/base.py | 3 ++- 12 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 apps/advertisement/__init__.py create mode 100644 apps/advertisement/admin.py create mode 100644 apps/advertisement/apps.py create mode 100644 apps/advertisement/migrations/__init__.py create mode 100644 apps/advertisement/models.py create mode 100644 apps/advertisement/serializers/__init__.py create mode 100644 apps/advertisement/tests.py create mode 100644 apps/advertisement/urls/__init__.py create mode 100644 apps/advertisement/views/__init__.py create mode 100644 apps/advertisement/views/web.py diff --git a/apps/advertisement/__init__.py b/apps/advertisement/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/advertisement/admin.py b/apps/advertisement/admin.py new file mode 100644 index 00000000..846f6b40 --- /dev/null +++ b/apps/advertisement/admin.py @@ -0,0 +1 @@ +# Register your models here. diff --git a/apps/advertisement/apps.py b/apps/advertisement/apps.py new file mode 100644 index 00000000..d9f524ea --- /dev/null +++ b/apps/advertisement/apps.py @@ -0,0 +1,7 @@ +from django.apps import AppConfig +from django.utils.translation import gettext_lazy as _ + + +class AdvertisementConfig(AppConfig): + name = 'advertisement' + verbose_name = _('advertisement') diff --git a/apps/advertisement/migrations/__init__.py b/apps/advertisement/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/advertisement/models.py b/apps/advertisement/models.py new file mode 100644 index 00000000..6b202199 --- /dev/null +++ b/apps/advertisement/models.py @@ -0,0 +1 @@ +# Create your models here. diff --git a/apps/advertisement/serializers/__init__.py b/apps/advertisement/serializers/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/advertisement/tests.py b/apps/advertisement/tests.py new file mode 100644 index 00000000..a39b155a --- /dev/null +++ b/apps/advertisement/tests.py @@ -0,0 +1 @@ +# Create your tests here. diff --git a/apps/advertisement/urls/__init__.py b/apps/advertisement/urls/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/advertisement/views/__init__.py b/apps/advertisement/views/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/advertisement/views/web.py b/apps/advertisement/views/web.py new file mode 100644 index 00000000..60f00ef0 --- /dev/null +++ b/apps/advertisement/views/web.py @@ -0,0 +1 @@ +# Create your views here. diff --git a/apps/collection/models.py b/apps/collection/models.py index fed0b624..4d03a0ae 100644 --- a/apps/collection/models.py +++ b/apps/collection/models.py @@ -72,7 +72,6 @@ class Collection(ProjectBaseMixin, CollectionNameMixin, return f'{self.name}' - class CollectionItemQuerySet(models.QuerySet): """QuerySet for model CollectionItem.""" diff --git a/project/settings/base.py b/project/settings/base.py index 75a54cb9..4ab78963 100644 --- a/project/settings/base.py +++ b/project/settings/base.py @@ -59,7 +59,8 @@ PROJECT_APPS = [ 'news.apps.NewsConfig', 'translation.apps.TranslationConfig', 'collection.apps.CollectionConfig', - 'partner.apps.PartnerConfig' + 'partner.apps.PartnerConfig', + 'advertisement.apps.AdvertisementConfig', ] EXTERNAL_APPS = [ From 6ac20fc4b2db672987027a03ef365d0972f5ea1d Mon Sep 17 00:00:00 2001 From: Anatoly Date: Mon, 26 Aug 2019 13:06:33 +0300 Subject: [PATCH 3/7] uncommented endpoints for create/update/delete news app --- apps/collection/models.py | 1 - apps/news/serializers/common.py | 4 +++- apps/news/urls/web.py | 8 ++++---- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/apps/collection/models.py b/apps/collection/models.py index fed0b624..4d03a0ae 100644 --- a/apps/collection/models.py +++ b/apps/collection/models.py @@ -72,7 +72,6 @@ class Collection(ProjectBaseMixin, CollectionNameMixin, return f'{self.name}' - class CollectionItemQuerySet(models.QuerySet): """QuerySet for model CollectionItem.""" diff --git a/apps/news/serializers/common.py b/apps/news/serializers/common.py index a5ad71a5..e53490ca 100644 --- a/apps/news/serializers/common.py +++ b/apps/news/serializers/common.py @@ -50,6 +50,7 @@ class NewsCreateUpdateSerializer(NewsSerializer): title = serializers.JSONField() subtitle = serializers.JSONField() description = serializers.JSONField() + image = serializers.ImageField(required=True) news_type = serializers.PrimaryKeyRelatedField( queryset=models.NewsType.objects.all(), write_only=True) address = serializers.PrimaryKeyRelatedField( @@ -69,5 +70,6 @@ class NewsCreateUpdateSerializer(NewsSerializer): 'start', 'end', 'playlist', - 'address' + 'address', + 'image', ] \ No newline at end of file diff --git a/apps/news/urls/web.py b/apps/news/urls/web.py index b70e5b12..04203f1a 100644 --- a/apps/news/urls/web.py +++ b/apps/news/urls/web.py @@ -7,9 +7,9 @@ app_name = 'news' urlpatterns = [ path('', common.NewsList.as_view(), name='news_list'), - # path('create/', common.NewsCreate.as_view(), name='news_create'), - # path('/', common.NewsDetail.as_view(), name='news_detail'), - # path('/update/', common.NewsUpdate.as_view(), name='news_update'), - # path('/delete/', common.NewsDelete.as_view(), name='news_delete'), + path('create/', common.NewsCreate.as_view(), name='news_create'), + path('/', common.NewsDetail.as_view(), name='news_detail'), + path('/update/', common.NewsUpdate.as_view(), name='news_update'), + path('/delete/', common.NewsDelete.as_view(), name='news_delete'), path('type/', common.NewsTypeList.as_view(), name='news_type'), ] From da52f38b7fb6306754886e5d3936580589c43980 Mon Sep 17 00:00:00 2001 From: Anatoly Date: Mon, 26 Aug 2019 15:27:33 +0300 Subject: [PATCH 4/7] added migrations, added ListAPI view endpoint --- apps/advertisement/admin.py | 10 +++++- apps/advertisement/migrations/0001_initial.py | 34 +++++++++++++++++++ apps/advertisement/models.py | 33 +++++++++++++++++- apps/advertisement/serializers/web.py | 19 +++++++++++ apps/advertisement/urls/web.py | 10 ++++++ apps/advertisement/views/web.py | 15 +++++++- project/urls/web.py | 1 + 7 files changed, 119 insertions(+), 3 deletions(-) create mode 100644 apps/advertisement/migrations/0001_initial.py create mode 100644 apps/advertisement/serializers/web.py create mode 100644 apps/advertisement/urls/web.py diff --git a/apps/advertisement/admin.py b/apps/advertisement/admin.py index 846f6b40..74bc6cdc 100644 --- a/apps/advertisement/admin.py +++ b/apps/advertisement/admin.py @@ -1 +1,9 @@ -# Register your models here. +"""Admin models for app advertisement""" +from django.contrib import admin + +from advertisement import models + + +@admin.register(models.Advertisement) +class AdvertisementModelAdmin(admin.ModelAdmin): + """Admin model for model Advertisement""" diff --git a/apps/advertisement/migrations/0001_initial.py b/apps/advertisement/migrations/0001_initial.py new file mode 100644 index 00000000..f10e14d4 --- /dev/null +++ b/apps/advertisement/migrations/0001_initial.py @@ -0,0 +1,34 @@ +# Generated by Django 2.2.4 on 2019-08-26 12:24 + +from django.db import migrations, models +import django.utils.timezone +import easy_thumbnails.fields +import utils.methods + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Advertisement', + 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')), + ('image', easy_thumbnails.fields.ThumbnailerImageField(blank=True, default=None, null=True, upload_to=utils.methods.image_path, verbose_name='Image')), + ('url', models.URLField(verbose_name='Ad URL')), + ('width', models.PositiveIntegerField(verbose_name='Block width')), + ('height', models.PositiveIntegerField(verbose_name='Block height')), + ('block_level', models.PositiveSmallIntegerField(choices=[(1, 'Ad block level 1'), (2, 'Ad block level 2'), (3, 'Ad block level 3')], verbose_name='Block level')), + ], + options={ + 'verbose_name': 'Advertisement', + 'verbose_name_plural': 'Advertisement', + }, + ), + ] diff --git a/apps/advertisement/models.py b/apps/advertisement/models.py index 6b202199..75978009 100644 --- a/apps/advertisement/models.py +++ b/apps/advertisement/models.py @@ -1 +1,32 @@ -# Create your models here. +"""Advertisement app models.""" +from django.db import models +from django.utils.translation import gettext_lazy as _ + +from utils.models import ProjectBaseMixin, ImageMixin + + +class Advertisement(ImageMixin, ProjectBaseMixin): + """Advertisement model.""" + + LEVEL_1 = 1 + LEVEL_2 = 2 + LEVEL_3 = 3 + + BLOCK_LEVEL_CHOICES = ( + (LEVEL_1, _('Ad block level 1')), + (LEVEL_2, _('Ad block level 2')), + (LEVEL_3, _('Ad block level 3')) + ) + + url = models.URLField(verbose_name=_('Ad URL')) + width = models.PositiveIntegerField(verbose_name=_('Block width')) + height = models.PositiveIntegerField(verbose_name=_('Block height')) + block_level = models.PositiveSmallIntegerField(choices=BLOCK_LEVEL_CHOICES, + verbose_name=_('Block level')) + + class Meta: + verbose_name = _('Advertisement') + verbose_name_plural = _('Advertisement') + + def __str__(self): + return str(self.url) diff --git a/apps/advertisement/serializers/web.py b/apps/advertisement/serializers/web.py new file mode 100644 index 00000000..4000b1b6 --- /dev/null +++ b/apps/advertisement/serializers/web.py @@ -0,0 +1,19 @@ +"""Serializers for app advertisements""" +from rest_framework import serializers + +from advertisement import models + + +class AdvertisementSerializer(serializers.ModelSerializer): + """Serializer for model Advertisement.""" + + class Meta: + model = models.Advertisement + fields = ( + 'id', + 'url', + 'image', + 'width', + 'height', + 'block_level', + ) diff --git a/apps/advertisement/urls/web.py b/apps/advertisement/urls/web.py new file mode 100644 index 00000000..a2974e9a --- /dev/null +++ b/apps/advertisement/urls/web.py @@ -0,0 +1,10 @@ +"""Advertisement common urlpaths.""" +from django.urls import path + +from advertisement.views import web as views + +app_name = 'advertisement' + +urlpatterns = [ + path('list/', views.AdvertisementListView.as_view(), name='advertisements_list') +] diff --git a/apps/advertisement/views/web.py b/apps/advertisement/views/web.py index 60f00ef0..c8462683 100644 --- a/apps/advertisement/views/web.py +++ b/apps/advertisement/views/web.py @@ -1 +1,14 @@ -# Create your views here. +"""Views for app advertisement""" +from rest_framework import generics +from rest_framework import permissions + +from advertisement import models +from advertisement.serializers import web as serializers + + +class AdvertisementListView(generics.ListAPIView): + """List view for model Advertisement""" + model = models.Advertisement + permission_classes = (permissions.AllowAny, ) + queryset = models.Advertisement.objects.all() + serializer_class = serializers.AdvertisementSerializer diff --git a/project/urls/web.py b/project/urls/web.py index 3d3d77b0..956d0c11 100644 --- a/project/urls/web.py +++ b/project/urls/web.py @@ -22,4 +22,5 @@ urlpatterns = [ path('news/', include('news.urls.web')), path('collection/', include('collection.urls.web')), path('partner/', include('partner.urls.web')), + path('advertisement/', include('advertisement.urls.web')) ] From f0a84a9847a6b4794e51ae6acb6c43f91fc872fb Mon Sep 17 00:00:00 2001 From: Anatoly Date: Mon, 26 Aug 2019 15:55:18 +0300 Subject: [PATCH 5/7] remove pagination from - advertisement, collection, partner lists --- apps/advertisement/views/web.py | 1 + apps/collection/views/common.py | 1 + apps/news/serializers/common.py | 4 +++- apps/partner/views/common.py | 1 + 4 files changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/advertisement/views/web.py b/apps/advertisement/views/web.py index c8462683..a02cff3c 100644 --- a/apps/advertisement/views/web.py +++ b/apps/advertisement/views/web.py @@ -8,6 +8,7 @@ from advertisement.serializers import web as serializers class AdvertisementListView(generics.ListAPIView): """List view for model Advertisement""" + pagination_class = None model = models.Advertisement permission_classes = (permissions.AllowAny, ) queryset = models.Advertisement.objects.all() diff --git a/apps/collection/views/common.py b/apps/collection/views/common.py index e05fb424..02047b88 100644 --- a/apps/collection/views/common.py +++ b/apps/collection/views/common.py @@ -27,6 +27,7 @@ class GuideViewMixin(generics.GenericAPIView): # Views class CollectionListView(CollectionViewMixin, generics.ListAPIView): """List Collection view""" + pagination_class = None permission_classes = (permissions.AllowAny,) serializer_class = serializers.CollectionSerializer diff --git a/apps/news/serializers/common.py b/apps/news/serializers/common.py index e53490ca..32e4382d 100644 --- a/apps/news/serializers/common.py +++ b/apps/news/serializers/common.py @@ -72,4 +72,6 @@ class NewsCreateUpdateSerializer(NewsSerializer): 'playlist', 'address', 'image', - ] \ No newline at end of file + 'is_publish', + 'country' + ] diff --git a/apps/partner/views/common.py b/apps/partner/views/common.py index b495abb5..a5d0338c 100644 --- a/apps/partner/views/common.py +++ b/apps/partner/views/common.py @@ -14,5 +14,6 @@ class PartnerViewMixin(generics.GenericAPIView): # Views class PartnerListView(PartnerViewMixin, generics.ListAPIView): """List Partner view""" + pagination_class = None permission_classes = (permissions.AllowAny, ) serializer_class = serializers.PartnerSerializer From 5edcd0afe98169872e77d2293589d5cc9463f4d5 Mon Sep 17 00:00:00 2001 From: Anatoly Date: Mon, 26 Aug 2019 17:39:03 +0300 Subject: [PATCH 6/7] replace image field with svg_image field, added validator, and change serializer --- .../migrations/0007_auto_20190826_1342.py | 24 +++++++++++++++++++ apps/location/models.py | 4 ++-- apps/location/serializers.py | 2 +- apps/utils/methods.py | 10 ++++++++ apps/utils/models.py | 15 +++++++++++- apps/utils/validators.py | 22 +++++++++++++++++ project/urls/__init__.py | 1 + 7 files changed, 74 insertions(+), 4 deletions(-) create mode 100644 apps/location/migrations/0007_auto_20190826_1342.py create mode 100644 apps/utils/validators.py diff --git a/apps/location/migrations/0007_auto_20190826_1342.py b/apps/location/migrations/0007_auto_20190826_1342.py new file mode 100644 index 00000000..7a6c5fe6 --- /dev/null +++ b/apps/location/migrations/0007_auto_20190826_1342.py @@ -0,0 +1,24 @@ +# Generated by Django 2.2.4 on 2019-08-26 13:42 + +from django.db import migrations, models +import utils.methods +import utils.validators + + +class Migration(migrations.Migration): + + dependencies = [ + ('location', '0006_country_image'), + ] + + operations = [ + migrations.RemoveField( + model_name='country', + name='image', + ), + migrations.AddField( + model_name='country', + name='svg_image', + field=models.FileField(blank=True, default=None, null=True, upload_to=utils.methods.svg_image_path, validators=[utils.validators.svg_image_validator], verbose_name='SVG image'), + ), + ] diff --git a/apps/location/models.py b/apps/location/models.py index 5b4d262c..f69eeeb9 100644 --- a/apps/location/models.py +++ b/apps/location/models.py @@ -3,14 +3,14 @@ from django.contrib.gis.db import models from django.contrib.postgres.fields import JSONField from django.utils.translation import gettext_lazy as _ -from utils.models import ProjectBaseMixin, LocaleManagerMixin, ImageMixin +from utils.models import ProjectBaseMixin, LocaleManagerMixin, SVGImageMixin class CountryManager(LocaleManagerMixin): """Extended manager for Country model.""" -class Country(ImageMixin, ProjectBaseMixin): +class Country(SVGImageMixin, ProjectBaseMixin): """Country model.""" name = JSONField(null=True, blank=True, default=None, diff --git a/apps/location/serializers.py b/apps/location/serializers.py index bfce3c05..89c87245 100644 --- a/apps/location/serializers.py +++ b/apps/location/serializers.py @@ -14,7 +14,7 @@ class CountrySerializer(serializers.ModelSerializer): fields = [ 'id', 'code', - 'image', + 'svg_image', 'name_trans', ] diff --git a/apps/utils/methods.py b/apps/utils/methods.py index e0f9325a..a26c306c 100644 --- a/apps/utils/methods.py +++ b/apps/utils/methods.py @@ -1,6 +1,7 @@ """Utils app method.""" import random import re + from django.conf import settings from django.http.request import HttpRequest from django.utils.timezone import datetime @@ -40,3 +41,12 @@ def image_path(instance, filename): instance._meta.model_name, datetime.now().strftime(settings.REST_DATE_FORMAT), filename) + + +def svg_image_path(instance, filename): + """Determine SVG path method.""" + filename = '%s.svg' % generate_code() + return 'image/svg/%s/%s/%s' % ( + instance._meta.model_name, + datetime.now().strftime(settings.REST_DATE_FORMAT), + filename) diff --git a/apps/utils/models.py b/apps/utils/models.py index d3562d6e..9498982c 100644 --- a/apps/utils/models.py +++ b/apps/utils/models.py @@ -9,7 +9,8 @@ from django.utils.html import mark_safe from django.utils.translation import ugettext_lazy as _ from easy_thumbnails.fields import ThumbnailerImageField -from utils.methods import image_path +from utils.methods import image_path, svg_image_path +from utils.validators import svg_image_validator class ProjectBaseMixin(models.Model): @@ -86,6 +87,18 @@ class ImageMixin(models.Model): image_tag.allow_tags = True +class SVGImageMixin(models.Model): + """SVG image model.""" + + svg_image = models.FileField(upload_to=svg_image_path, + blank=True, null=True, default=None, + validators=[svg_image_validator, ], + verbose_name=_('SVG image')) + + class Meta: + abstract = True + + class PlatformMixin(models.Model): """Platforms""" diff --git a/apps/utils/validators.py b/apps/utils/validators.py new file mode 100644 index 00000000..2808db9b --- /dev/null +++ b/apps/utils/validators.py @@ -0,0 +1,22 @@ +"""DB field validators""" +import xml.etree.cElementTree as et + +from django.core.exceptions import ValidationError + + +def svg_image_validator(file: object) -> object: + """Validate SVG file""" + tag = None + try: + for event, el in et.iterparse(file, ('start',)): + tag = el.tag + break + assert tag == '{http://www.w3.org/2000/svg}svg' + except: + raise ValidationError( + message='Invalid SVG image file', + code='invalid_svg_image', + params={'value': file}, + ) + else: + return file diff --git a/project/urls/__init__.py b/project/urls/__init__.py index 3f1ee7a2..ef909dcf 100644 --- a/project/urls/__init__.py +++ b/project/urls/__init__.py @@ -74,4 +74,5 @@ urlpatterns = urlpatterns + \ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) if settings.DEBUG: + urlpatterns.extend(urlpatterns_doc) From f33fa21c0c6f2c6a4874bf70598a28cbed83b269 Mon Sep 17 00:00:00 2001 From: evgeniy-st Date: Mon, 26 Aug 2019 18:12:15 +0300 Subject: [PATCH 7/7] update site feautures --- apps/main/migrations/0007_sitefeature_main.py | 18 ++++++++ apps/main/models.py | 5 +++ apps/main/serializers.py | 42 ++++++++++++------- 3 files changed, 50 insertions(+), 15 deletions(-) create mode 100644 apps/main/migrations/0007_sitefeature_main.py diff --git a/apps/main/migrations/0007_sitefeature_main.py b/apps/main/migrations/0007_sitefeature_main.py new file mode 100644 index 00000000..a16b98cb --- /dev/null +++ b/apps/main/migrations/0007_sitefeature_main.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.4 on 2019-08-26 14:47 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('main', '0006_auto_20190822_1118'), + ] + + operations = [ + migrations.AddField( + model_name='sitefeature', + name='main', + field=models.BooleanField(default=False, verbose_name='Main'), + ), + ] diff --git a/apps/main/models.py b/apps/main/models.py index 563dbd88..5b41d75b 100644 --- a/apps/main/models.py +++ b/apps/main/models.py @@ -133,6 +133,10 @@ class SiteSettings(ProjectBaseMixin): return self.feature_set.filter(sitefeature__site_settings=self, sitefeature__published=True) + @property + def published_sitefeatures(self): + return self.sitefeature_set.filter(published=True) + @property def site_url(self): return methods.site_url(schema=settings.SCHEMA_URI, @@ -168,6 +172,7 @@ class SiteFeature(ProjectBaseMixin): site_settings = models.ForeignKey(SiteSettings, on_delete=models.CASCADE) feature = models.ForeignKey(Feature, on_delete=models.PROTECT) published = models.BooleanField(default=False, verbose_name=_('Published')) + main = models.BooleanField(default=False, verbose_name=_('Main')) objects = SiteFeatureQuerySet.as_manager() diff --git a/apps/main/serializers.py b/apps/main/serializers.py index 708bc33c..7b55f6ac 100644 --- a/apps/main/serializers.py +++ b/apps/main/serializers.py @@ -16,11 +16,23 @@ class FeatureSerializer(serializers.ModelSerializer): ) +class SiteFeatureSerializer(serializers.ModelSerializer): + + id = serializers.IntegerField(source='feature.id') + slug = serializers.CharField(source='feature.slug') + + class Meta: + """Meta class.""" + model = models.SiteFeature + fields = ('main', + 'id', + 'slug') + + class SiteSettingsSerializer(serializers.ModelSerializer): """Site settings serializer.""" - published_features = FeatureSerializer(many=True, allow_null=None) - + published_features = SiteFeatureSerializer(many=True, allow_null=True) #todo: remove this country_code = serializers.CharField(source='subdomain', read_only=True) @@ -42,16 +54,16 @@ class SiteSettingsSerializer(serializers.ModelSerializer): ) -class SiteFeatureSerializer(serializers.ModelSerializer): - """Site feature serializer.""" - - class Meta: - """Meta class.""" - - model = models.SiteFeature - fields = ( - 'id', - 'published', - 'site_settings', - 'feature', - ) +# class SiteFeatureSerializer(serializers.ModelSerializer): +# """Site feature serializer.""" +# +# class Meta: +# """Meta class.""" +# +# model = models.SiteFeature +# fields = ( +# 'id', +# 'published', +# 'site_settings', +# 'feature', +# )