poroduct in_fav

This commit is contained in:
alex 2019-11-14 18:23:42 +03:00
parent a06a7cef7f
commit a1d5feb8dc
4 changed files with 34 additions and 5 deletions

View File

@ -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."""

View File

@ -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
@ -80,9 +81,9 @@ class ProductQuerySet(models.QuerySet):
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,

View File

@ -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',
]

View File

@ -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."""