From 555aa9a4e1c38f0a4f6676694e5f59777859dfab Mon Sep 17 00:00:00 2001 From: Anatoly Date: Fri, 13 Sep 2019 18:08:36 +0300 Subject: [PATCH] =?UTF-8?q?GM-25:=20=D0=9F=D0=BE=D0=BB=D1=83=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B3=D0=BB=D0=B0=D0=B2=D0=BD=D0=BE=D0=B9?= =?UTF-8?q?=20=D0=B7=D0=BE=D0=BD=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/main/admin.py | 3 ++ apps/main/migrations/0014_carousel.py | 27 ++++++++++++ apps/main/models.py | 60 ++++++++++++++++++++++++++- apps/main/serializers.py | 39 +++++++++++++++-- apps/main/urls.py | 1 + apps/main/views.py | 8 ++++ apps/utils/methods.py | 7 ++-- 7 files changed, 136 insertions(+), 9 deletions(-) create mode 100644 apps/main/migrations/0014_carousel.py diff --git a/apps/main/admin.py b/apps/main/admin.py index 2d512868..bdbfe46e 100644 --- a/apps/main/admin.py +++ b/apps/main/admin.py @@ -46,3 +46,6 @@ class CurrencContentAdmin(admin.ModelAdmin): """CurrencContent admin""" +@admin.register(models.Carousel) +class CarouselAdmin(admin.ModelAdmin): + """Carousel admin.""" diff --git a/apps/main/migrations/0014_carousel.py b/apps/main/migrations/0014_carousel.py new file mode 100644 index 00000000..2e90e692 --- /dev/null +++ b/apps/main/migrations/0014_carousel.py @@ -0,0 +1,27 @@ +# Generated by Django 2.2.4 on 2019-09-13 11:33 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('main', '0013_auto_20190901_1032'), + ] + + operations = [ + migrations.CreateModel( + name='Carousel', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('object_id', models.PositiveIntegerField()), + ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')), + ], + options={ + 'verbose_name': 'Carousel', + 'verbose_name_plural': 'Carousel', + }, + ), + ] diff --git a/apps/main/models.py b/apps/main/models.py index 3fdd5fed..82c155d7 100644 --- a/apps/main/models.py +++ b/apps/main/models.py @@ -7,7 +7,9 @@ from django.utils.translation import gettext_lazy as _ from django.contrib.contenttypes.models import ContentType from location.models import Country from main import methods -from utils.models import ProjectBaseMixin, TJSONField, TranslatedFieldsMixin +from utils.models import (ProjectBaseMixin, TJSONField, + TranslatedFieldsMixin, ImageMixin) +from utils.querysets import ContentTypeQuerySetMixin from configuration.models import TranslationSettings # @@ -253,6 +255,10 @@ class MetaData(TranslatedFieldsMixin, models.Model): return f'id:{self.id}-{label}' +class MetaDataContentQuerySet(ContentTypeQuerySetMixin): + """QuerySets for MetaDataContent model.""" + + class MetaDataContent(models.Model): """MetaDataContent model.""" content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) @@ -260,6 +266,8 @@ class MetaDataContent(models.Model): content_object = generic.GenericForeignKey('content_type', 'object_id') metadata = models.ForeignKey(MetaData, on_delete=models.CASCADE) + objects = MetaDataContentQuerySet.as_manager() + class Currency(models.Model): """Currency model.""" @@ -271,3 +279,53 @@ class Currency(models.Model): def __str__(self): return f'{self.name}' + + +class CarouselQuerySet(models.QuerySet): + """Carousel QuerySet.""" + + +class Carousel(models.Model): + """Carousel model.""" + content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) + object_id = models.PositiveIntegerField() + content_object = generic.GenericForeignKey('content_type', 'object_id') + + objects = CarouselQuerySet.as_manager() + + class Meta: + """Meta class.""" + verbose_name = _('Carousel') + verbose_name_plural = _('Carousel') + + @property + def name(self): + if hasattr(self.content_object, 'name'): + return self.content_object.name + if hasattr(self.content_object, 'title'): + return self.content_object.title_translated + + @property + def awards(self): + if hasattr(self.content_object, 'awards'): + return self.content_object.awards + + @property + def toque_number(self): + if hasattr(self.content_object, 'toque_number'): + return self.content_object.toque_number + + @property + def public_mark(self): + if hasattr(self.content_object, 'public_mark'): + return self.content_object.public_mark + + @property + def image(self): + if not hasattr(self.content_object.image, 'url'): + return self.content_object.image.image.url + return self.content_object.image.url + + @property + def model_name(self): + return self.content_object.__class__.__name__ diff --git a/apps/main/serializers.py b/apps/main/serializers.py index d5f3cc3f..7f94f105 100644 --- a/apps/main/serializers.py +++ b/apps/main/serializers.py @@ -1,5 +1,6 @@ """Main app serializers.""" from rest_framework import serializers + from location.serializers import CountrySerializer from main import models @@ -82,8 +83,8 @@ class SiteSerializer(serializers.ModelSerializer): # ) -class AwardSerializer(serializers.ModelSerializer): - """Award serializer.""" +class AwardBaseSerializer(serializers.ModelSerializer): + """Award base serializer.""" title_translated = serializers.CharField(read_only=True, allow_null=True) @@ -92,11 +93,18 @@ class AwardSerializer(serializers.ModelSerializer): fields = [ 'id', 'title_translated', - 'award_type', 'vintage_year', ] +class AwardSerializer(AwardBaseSerializer): + """Award serializer.""" + + class Meta: + model = models.Award + fields = AwardBaseSerializer.Meta.fields + ['award_type', ] + + class MetaDataContentSerializer(serializers.ModelSerializer): id = serializers.IntegerField(source='metadata.id', read_only=True,) label_translated = serializers.CharField( @@ -117,4 +125,27 @@ class CurrencySerializer(serializers.ModelSerializer): fields = [ 'id', 'name' - ] \ No newline at end of file + ] + + +class CarouselListSerializer(serializers.ModelSerializer): + """Serializer for retrieving list of carousel items.""" + model_name = serializers.CharField() + name = serializers.CharField() + toque_number = serializers.CharField() + public_mark = serializers.CharField() + image = serializers.URLField() + awards = AwardBaseSerializer(many=True) + + class Meta: + """Meta class.""" + model = models.Carousel + fields = [ + 'id', + 'model_name', + 'name', + 'awards', + 'toque_number', + 'public_mark', + 'image', + ] diff --git a/apps/main/urls.py b/apps/main/urls.py index b848352f..a74c0b49 100644 --- a/apps/main/urls.py +++ b/apps/main/urls.py @@ -10,4 +10,5 @@ urlpatterns = [ path('site-settings//', views.SiteSettingsView.as_view(), name='site-settings'), path('awards/', views.AwardView.as_view(), name='awards_list'), path('awards//', views.AwardRetrieveView.as_view(), name='awards_retrieve'), + path('carousel/', views.CarouselListView.as_view(), name='carousel-list'), ] \ No newline at end of file diff --git a/apps/main/views.py b/apps/main/views.py index a4696f16..d7d1fa2c 100644 --- a/apps/main/views.py +++ b/apps/main/views.py @@ -84,3 +84,11 @@ class AwardRetrieveView(generics.RetrieveAPIView): serializer_class = serializers.AwardSerializer queryset = models.Award.objects.all() permission_classes = (permissions.IsAuthenticatedOrReadOnly,) + + +class CarouselListView(generics.ListAPIView): + """Return list of carousel items.""" + queryset = models.Carousel.objects.all() + serializer_class = serializers.CarouselListSerializer + permission_classes = (permissions.AllowAny, ) + pagination_class = None diff --git a/apps/utils/methods.py b/apps/utils/methods.py index e62138ce..acad6502 100644 --- a/apps/utils/methods.py +++ b/apps/utils/methods.py @@ -83,7 +83,6 @@ def generate_string_code(size=64, def get_contenttype(app_label: str, model: str): """Get ContentType instance by app_label and model""" - if app_label and model: - qs = ContentType.objects.filter(app_label=app_label, model=model) - if qs.exists(): - return qs.first() + qs = ContentType.objects.filter(app_label=app_label, model=model) + if qs.exists(): + return qs.first()