added flag in_favorites in establishment

This commit is contained in:
Anatoly 2019-09-09 11:37:57 +03:00
parent 2f5240adfa
commit 273f74f911
4 changed files with 30 additions and 8 deletions

View File

@ -88,6 +88,20 @@ class EstablishmentQuerySet(models.QuerySet):
'position'), 'position'),
to_attr='actual_establishment_employees')) to_attr='actual_establishment_employees'))
def annotate_in_favorites(self, user):
"""Annotate flag in_favorites"""
favorite_establishments = []
if user.is_authenticated:
favorite_establishments = user.favorites.by_content_type(app_label='establishment',
model='establishment')\
.values_list('object_id', flat=True)
return self.annotate(in_favorites=models.Case(
models.When(
id__in=favorite_establishments,
then=True),
default=False,
output_field=models.BooleanField(default=False)))
class Establishment(ProjectBaseMixin, ImageMixin, TranslatedFieldsMixin): class Establishment(ProjectBaseMixin, ImageMixin, TranslatedFieldsMixin):
"""Establishment model.""" """Establishment model."""

View File

@ -134,6 +134,7 @@ class EstablishmentListSerializer(serializers.ModelSerializer):
address = AddressSerializer() address = AddressSerializer()
tags = MetaDataContentSerializer(many=True) tags = MetaDataContentSerializer(many=True)
preview_image = serializers.SerializerMethodField() preview_image = serializers.SerializerMethodField()
in_favorites = serializers.BooleanField()
class Meta: class Meta:
"""Meta class.""" """Meta class."""
@ -150,6 +151,7 @@ class EstablishmentListSerializer(serializers.ModelSerializer):
'preview_image', 'preview_image',
'address', 'address',
'tags', 'tags',
'in_favorites',
) )
def get_preview_image(self, obj): def get_preview_image(self, obj):
@ -177,6 +179,8 @@ class EstablishmentDetailSerializer(EstablishmentListSerializer):
best_price_menu = serializers.DecimalField(max_digits=14, decimal_places=2, read_only=True) best_price_menu = serializers.DecimalField(max_digits=14, decimal_places=2, read_only=True)
best_price_carte = serializers.DecimalField(max_digits=14, decimal_places=2, read_only=True) best_price_carte = serializers.DecimalField(max_digits=14, decimal_places=2, read_only=True)
in_favorites = serializers.SerializerMethodField()
class Meta: class Meta:
"""Meta class.""" """Meta class."""
@ -302,8 +306,8 @@ class EstablishmentFavoritesCreateSerializer(serializers.ModelSerializer):
# Check existence in favorites # Check existence in favorites
if self.get_user().favorites.by_content_type(app_label='establishment', if self.get_user().favorites.by_content_type(app_label='establishment',
model='establishment', model='establishment')\
object_id=establishment_id).exists(): .by_object_id(object_id=establishment_id).exists():
raise utils_exceptions.FavoritesError() raise utils_exceptions.FavoritesError()
attrs['establishment'] = establishment_qs.first() attrs['establishment'] = establishment_qs.first()

View File

@ -27,7 +27,8 @@ class EstablishmentListView(EstablishmentMixin, JWTGenericViewMixin, generics.Li
def get_queryset(self): def get_queryset(self):
"""Overrided method 'get_queryset'.""" """Overrided method 'get_queryset'."""
qs = super(EstablishmentListView, self).get_queryset() qs = super(EstablishmentListView, self).get_queryset()
return qs.by_country_code(code=self.request.country_code) return qs.by_country_code(code=self.request.country_code)\
.annotate_in_favorites(user=self.request.user)
class EstablishmentRetrieveView(EstablishmentMixin, JWTGenericViewMixin, generics.RetrieveAPIView): class EstablishmentRetrieveView(EstablishmentMixin, JWTGenericViewMixin, generics.RetrieveAPIView):
@ -98,8 +99,8 @@ class EstablishmentFavoritesCreateDestroyView(generics.CreateAPIView, generics.D
obj = get_object_or_404( obj = get_object_or_404(
self.request.user.favorites.by_user(user=self.request.user) self.request.user.favorites.by_user(user=self.request.user)
.by_content_type(app_label='establishment', .by_content_type(app_label='establishment',
model='establishment', model='establishment')
object_id=self.kwargs['pk'])) .by_object_id(object_id=self.kwargs['pk']))
# May raise a permission denied # May raise a permission denied
self.check_object_permissions(self.request, obj) self.check_object_permissions(self.request, obj)
return obj return obj

View File

@ -10,11 +10,14 @@ from utils.models import ProjectBaseMixin
class FavoritesQuerySet(models.QuerySet): class FavoritesQuerySet(models.QuerySet):
"""QuerySet for model Favorites""" """QuerySet for model Favorites"""
def by_content_type(self, app_label, model, object_id): def by_object_id(self, object_id: int):
"""Filter by object_id"""
return self.filter(object_id=object_id)
def by_content_type(self, app_label, model):
"""Filter QuerySet by ContentType.""" """Filter QuerySet by ContentType."""
return self.filter(content_type=get_contenttype(app_label=app_label, return self.filter(content_type=get_contenttype(app_label=app_label,
model=model), model=model))
object_id=object_id)
def by_user(self, user): def by_user(self, user):
"""Filter by user""" """Filter by user"""