diff --git a/apps/establishment/models.py b/apps/establishment/models.py index 7ab4bcfe..efe665ef 100644 --- a/apps/establishment/models.py +++ b/apps/establishment/models.py @@ -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.""" diff --git a/apps/establishment/serializers.py b/apps/establishment/serializers.py index bc83da09..5b333493 100644 --- a/apps/establishment/serializers.py +++ b/apps/establishment/serializers.py @@ -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() diff --git a/apps/establishment/views.py b/apps/establishment/views.py index 077f8502..f2a8571b 100644 --- a/apps/establishment/views.py +++ b/apps/establishment/views.py @@ -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 diff --git a/apps/favorites/models.py b/apps/favorites/models.py index d2cc1db4..6393701f 100644 --- a/apps/favorites/models.py +++ b/apps/favorites/models.py @@ -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"""