added flag in_favorites in establishment
This commit is contained in:
parent
2f5240adfa
commit
273f74f911
|
|
@ -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."""
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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"""
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user