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'), + ), + ] diff --git a/apps/news/models.py b/apps/news/models.py index b22c84da..983cc9c2 100644 --- a/apps/news/models.py +++ b/apps/news/models.py @@ -18,7 +18,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 @@ -51,13 +51,26 @@ class NewsBanner(ProjectBaseMixin, TranslatedFieldsMixin): blank=True, null=True, default=None) -class NewsType(models.Model): +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.""" 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') + + objects = NewsTypeQuerySet.as_manager() + 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): diff --git a/apps/news/views.py b/apps/news/views.py index d63fc554..5429b4a7 100644 --- a/apps/news/views.py +++ b/apps/news/views.py @@ -89,9 +89,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.""" 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() +