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'),
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):
"""Establishment model."""

View File

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

View File

@ -27,7 +27,8 @@ class EstablishmentListView(EstablishmentMixin, JWTGenericViewMixin, generics.Li
def get_queryset(self):
"""Overrided method '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):
@ -98,8 +99,8 @@ class EstablishmentFavoritesCreateDestroyView(generics.CreateAPIView, generics.D
obj = get_object_or_404(
self.request.user.favorites.by_user(user=self.request.user)
.by_content_type(app_label='establishment',
model='establishment',
object_id=self.kwargs['pk']))
model='establishment')
.by_object_id(object_id=self.kwargs['pk']))
# May raise a permission denied
self.check_object_permissions(self.request, obj)
return obj

View File

@ -10,11 +10,14 @@ from utils.models import ProjectBaseMixin
class FavoritesQuerySet(models.QuerySet):
"""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."""
return self.filter(content_type=get_contenttype(app_label=app_label,
model=model),
object_id=object_id)
model=model))
def by_user(self, user):
"""Filter by user"""