From b9e6df54821788ede38f5575d9afe935b6d42956 Mon Sep 17 00:00:00 2001 From: "a.gorbunov" Date: Wed, 22 Jan 2020 10:55:26 +0000 Subject: [PATCH 1/4] added default image for news types --- apps/news/models.py | 9 +++++++-- apps/news/serializers.py | 4 +++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/apps/news/models.py b/apps/news/models.py index fffed321..e3205c01 100644 --- a/apps/news/models.py +++ b/apps/news/models.py @@ -16,7 +16,7 @@ from main.models import Carousel from rating.models import Rating, ViewCount from utils.models import (BaseAttributes, TJSONField, TranslatedFieldsMixin, HasTagsMixin, ProjectBaseMixin, GalleryMixin, IntermediateGalleryModelMixin, - FavoritesMixin) + FavoritesMixin, TypeDefaultImageMixin) from utils.querysets import TranslationQuerysetMixin from datetime import datetime @@ -49,13 +49,18 @@ class NewsBanner(ProjectBaseMixin, TranslatedFieldsMixin): blank=True, null=True, default=None) -class NewsType(models.Model): +class NewsType(ProjectBaseMixin, TypeDefaultImageMixin): """NewsType model.""" name = models.CharField(_('name'), max_length=250) tag_categories = models.ManyToManyField('tag.TagCategory', related_name='news_types') + default_image = models.ForeignKey('gallery.Image', on_delete=models.SET_NULL, + related_name='news_types', + blank=True, null=True, default=None, + verbose_name='default image') + class Meta: """Meta class.""" diff --git a/apps/news/serializers.py b/apps/news/serializers.py index 672334dd..564cd2c9 100644 --- a/apps/news/serializers.py +++ b/apps/news/serializers.py @@ -62,12 +62,14 @@ class NewsBannerSerializer(ProjectModelSerializer): class NewsTypeSerializer(serializers.ModelSerializer): """News type serializer.""" + default_image_url = serializers.ImageField(source='default_image.image', + allow_null=True) class Meta: """Meta class.""" model = models.NewsType - fields = ('id', 'name') + fields = ('id', 'name', 'default_image_url') class NewsBaseSerializer(ProjectModelSerializer): From 1981b44a1055b19c2951ca430c00e77740922021 Mon Sep 17 00:00:00 2001 From: "a.gorbunov" Date: Wed, 22 Jan 2020 11:23:28 +0000 Subject: [PATCH 2/4] added get_instances_from_related method for product document --- apps/search_indexes/documents/product.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/apps/search_indexes/documents/product.py b/apps/search_indexes/documents/product.py index 74034732..fda06492 100644 --- a/apps/search_indexes/documents/product.py +++ b/apps/search_indexes/documents/product.py @@ -177,3 +177,12 @@ class ProductDocument(Document): def get_queryset(self): return super().get_queryset().published().with_base_related() + + def get_instances_from_related(self, related_instance): + """If related_models is set, define how to retrieve the Product instance(s) from the related model. + The related_models option should be used with caution because it can lead in the index + to the updating of a lot of items. + """ + if isinstance(related_instance, models.ProductType) and hasattr(related_instance, 'product_set'): + return related_instance.product_set().all() + From f19486386223bc477313cccde0ac0d7f5f1fd3b2 Mon Sep 17 00:00:00 2001 From: "a.gorbunov" Date: Wed, 22 Jan 2020 11:26:31 +0000 Subject: [PATCH 3/4] [migration] default_image_url field for news types --- .../migrations/0052_auto_20200121_0940.py | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 apps/news/migrations/0052_auto_20200121_0940.py diff --git a/apps/news/migrations/0052_auto_20200121_0940.py b/apps/news/migrations/0052_auto_20200121_0940.py new file mode 100644 index 00000000..478aa792 --- /dev/null +++ b/apps/news/migrations/0052_auto_20200121_0940.py @@ -0,0 +1,31 @@ +# Generated by Django 2.2.7 on 2020-01-21 09:40 + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('gallery', '0008_merge_20191212_0752'), + ('news', '0051_merge_20191223_1405'), + ] + + operations = [ + migrations.AddField( + model_name='newstype', + name='created', + field=models.DateTimeField(default=django.utils.timezone.now, editable=False, verbose_name='Date created'), + ), + migrations.AddField( + model_name='newstype', + name='default_image', + field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='news_types', to='gallery.Image', verbose_name='default image'), + ), + migrations.AddField( + model_name='newstype', + name='modified', + field=models.DateTimeField(auto_now=True, verbose_name='Date updated'), + ), + ] From 1921efd2c5d3f03ce31d2405a13748851aa34f24 Mon Sep 17 00:00:00 2001 From: "a.gorbunov" Date: Wed, 22 Jan 2020 12:34:38 +0000 Subject: [PATCH 4/4] get news type default image query will be optimized --- apps/news/models.py | 8 ++++++++ apps/news/views.py | 5 ++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/apps/news/models.py b/apps/news/models.py index e3205c01..85b6b183 100644 --- a/apps/news/models.py +++ b/apps/news/models.py @@ -49,6 +49,12 @@ class NewsBanner(ProjectBaseMixin, TranslatedFieldsMixin): blank=True, null=True, default=None) +class NewsTypeQuerySet(models.QuerySet): + """QuerySet for model NewsType""" + def with_base_related(self): + return self.select_related('default_image') + + class NewsType(ProjectBaseMixin, TypeDefaultImageMixin): """NewsType model.""" @@ -61,6 +67,8 @@ class NewsType(ProjectBaseMixin, TypeDefaultImageMixin): blank=True, null=True, default=None, verbose_name='default image') + objects = NewsTypeQuerySet.as_manager() + class Meta: """Meta class.""" diff --git a/apps/news/views.py b/apps/news/views.py index 178c359f..bd88068d 100644 --- a/apps/news/views.py +++ b/apps/news/views.py @@ -87,9 +87,12 @@ class NewsTypeListView(generics.ListAPIView): pagination_class = None permission_classes = (permissions.AllowAny,) - queryset = models.NewsType.objects.all() serializer_class = serializers.NewsTypeSerializer + def get_queryset(self): + """Override get_queryset method.""" + return models.NewsType.objects.with_base_related() + class NewsBackOfficeMixinView: """News back office mixin view."""