From a1d5feb8dcac6ecd9a14c0e4c1bdaa1d562984c7 Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 14 Nov 2019 18:23:42 +0300 Subject: [PATCH] poroduct in_fav --- apps/account/models.py | 8 ++++++++ apps/product/models.py | 24 +++++++++++++++++++----- apps/product/serializers/common.py | 2 ++ apps/product/views/back.py | 5 +++++ 4 files changed, 34 insertions(+), 5 deletions(-) diff --git a/apps/account/models.py b/apps/account/models.py index fb962cd3..78c3c284 100644 --- a/apps/account/models.py +++ b/apps/account/models.py @@ -278,6 +278,14 @@ class User(AbstractUser): model='news', ).values_list('object_id', flat=True) + @property + def favorite_product_ids(self): + """Return news IDs that in favorites for current user.""" + return self.favorites.by_content_type( + app_label='product', + model='product', + ).values_list('object_id', flat=True) + class UserRole(ProjectBaseMixin): """UserRole model.""" diff --git a/apps/product/models.py b/apps/product/models.py index b6529c19..0c19b01e 100644 --- a/apps/product/models.py +++ b/apps/product/models.py @@ -3,6 +3,7 @@ from django.contrib.contenttypes import fields as generic from django.contrib.gis.db import models as gis_models from django.core.exceptions import ValidationError from django.db import models +from django.db.models import Case, When from django.utils.translation import gettext_lazy as _ from django.core.validators import MaxValueValidator, MinValueValidator @@ -76,13 +77,13 @@ class ProductQuerySet(models.QuerySet): def with_base_related(self): return self.select_related('product_type', 'establishment') \ - .prefetch_related('product_type__subtypes') + .prefetch_related('product_type__subtypes') def with_es_related(self): """Returns qs with related for ES indexing.""" - return self.with_base_related()\ - .prefetch_related('tags', 'standards','classifications', 'classifications__standard', - 'classifications__classification_type','classifications__tags')\ + return self.with_base_related() \ + .prefetch_related('tags', 'standards', 'classifications', 'classifications__standard', + 'classifications__classification_type', 'classifications__tags') \ .select_related('wine_region', 'wine_sub_region') def common(self): @@ -110,6 +111,19 @@ class ProductQuerySet(models.QuerySet): """Filter products by published state.""" return self.filter(state=self.model.PUBLISHED) + def annotate_in_favorites(self, user): + """Annotate flag in_favorites""" + favorite_product_ids = [] + if user.is_authenticated: + favorite_product_ids = user.favorite_product_ids + return self.annotate( + in_favorites=Case( + When(id__in=favorite_product_ids, then=True), + default=False, + output_field=models.BooleanField(default=False) + ) + ) + class Product(TranslatedFieldsMixin, BaseAttributes): """Product models.""" @@ -154,7 +168,7 @@ class Product(TranslatedFieldsMixin, BaseAttributes): related_name='products', verbose_name=_('establishment')) public_mark = models.PositiveIntegerField(blank=True, null=True, default=None, - verbose_name=_('public mark'),) + verbose_name=_('public mark'), ) wine_region = models.ForeignKey('location.WineRegion', on_delete=models.PROTECT, related_name='wines', blank=True, null=True, default=None, diff --git a/apps/product/serializers/common.py b/apps/product/serializers/common.py index 9145499d..c3eaf250 100644 --- a/apps/product/serializers/common.py +++ b/apps/product/serializers/common.py @@ -95,6 +95,7 @@ class ProductBaseSerializer(serializers.ModelSerializer): preview_image_url = serializers.URLField(source='preview_main_image_url', allow_null=True, read_only=True) + in_favorites = serializers.BooleanField(allow_null=True) class Meta: """Meta class.""" @@ -112,6 +113,7 @@ class ProductBaseSerializer(serializers.ModelSerializer): 'preview_image_url', 'wine_region', 'wine_colors', + 'in_favorites', ] diff --git a/apps/product/views/back.py b/apps/product/views/back.py index cb94d3aa..70ac9c57 100644 --- a/apps/product/views/back.py +++ b/apps/product/views/back.py @@ -13,6 +13,11 @@ class ProductBackOfficeMixinView(ProductBaseView): permission_classes = (permissions.IsAuthenticated,) + def get_queryset(self): + """Override get_queryset method.""" + qs = models.Product.objects.annotate_in_favorites(self.request.user) + return qs + class ProductTypeBackOfficeMixinView: """Product type back-office mixin view."""