diff --git a/apps/comment/models.py b/apps/comment/models.py index 470c46d9..fe781d4d 100644 --- a/apps/comment/models.py +++ b/apps/comment/models.py @@ -5,9 +5,10 @@ from django.utils.translation import gettext_lazy as _ from account.models import User from utils.models import ProjectBaseMixin +from utils.querysets import ContentTypeQuerySetMixin -class CommentQuerySet(models.QuerySet): +class CommentQuerySet(ContentTypeQuerySetMixin): """QuerySets for Comment model.""" def by_user(self, user: User): diff --git a/apps/establishment/serializers.py b/apps/establishment/serializers.py index 5b333493..46d46439 100644 --- a/apps/establishment/serializers.py +++ b/apps/establishment/serializers.py @@ -170,7 +170,6 @@ class EstablishmentDetailSerializer(EstablishmentListSerializer): phones = ContactPhonesSerializer(read_only=True, many=True, ) emails = ContactEmailsSerializer(read_only=True, many=True, ) review = serializers.SerializerMethodField() - comments = serializers.SerializerMethodField() employees = EstablishmentEmployeeSerializer(source='actual_establishment_employees', many=True) menu = MenuSerializers(source='menu_set', many=True, read_only=True) @@ -199,20 +198,12 @@ class EstablishmentDetailSerializer(EstablishmentListSerializer): 'phones', 'emails', 'review', - 'comments', 'employees', 'menu', 'best_price_menu', 'best_price_carte', ) - def get_comments(self, obj): - """Serializer method for comment field""" - request = self.context.get('request') - return comment_serializers.CommentSerializer(obj.comments.annotate_is_mine_status(user=request.user), - context={'request': self.context.get('request')}, - many=True).data - def get_review(self, obj): """Serializer method for getting last published review""" return ReviewSerializer(obj.reviews.by_status(status=review_models.Review.READY) diff --git a/apps/establishment/urls/common.py b/apps/establishment/urls/common.py index a73a3f3e..0f2958eb 100644 --- a/apps/establishment/urls/common.py +++ b/apps/establishment/urls/common.py @@ -9,9 +9,11 @@ app_name = 'establishment' urlpatterns = [ path('', views.EstablishmentListView.as_view(), name='list'), path('/', views.EstablishmentRetrieveView.as_view(), name='detail'), - path('/comment/', views.EstablishmentCommentCreateView.as_view(), + path('/comments/', views.EstablishmentCommentListView.as_view(), name='list-comments'), + path('/comments/create/', views.EstablishmentCommentCreateView.as_view(), name='create-comment'), - path('/comment//', views.EstablishmentCommentRUDView.as_view(), + path('/comments//', views.EstablishmentCommentRUDView.as_view(), name='rud-comment'), - path('/favorites/', views.EstablishmentFavoritesCreateDestroyView.as_view()), + path('/favorites/', views.EstablishmentFavoritesCreateDestroyView.as_view(), + name='add-favorites'), ] \ No newline at end of file diff --git a/apps/establishment/views.py b/apps/establishment/views.py index f2a8571b..528d2377 100644 --- a/apps/establishment/views.py +++ b/apps/establishment/views.py @@ -50,6 +50,19 @@ class EstablishmentCommentCreateView(generics.CreateAPIView): queryset = comment_models.Comment.objects.all() +class EstablishmentCommentListView(generics.ListAPIView): + """View for return list of establishment comments.""" + permission_classes = (permissions.AllowAny,) + serializer_class = serializers.EstablishmentCommentCreateSerializer + + def get_queryset(self): + """Override get_queryset method""" + return comment_models.Comment.objects.by_content_type(app_label='establishment', + model='establishment')\ + .by_object_id(object_id=self.kwargs.get('pk'))\ + .order_by('-created') + + class EstablishmentCommentRUDView(generics.RetrieveUpdateDestroyAPIView): """View for retrieve/update/destroy establishment comment.""" serializer_class = serializers.EstablishmentCommentRUDSerializer diff --git a/apps/favorites/models.py b/apps/favorites/models.py index 6393701f..a30097a5 100644 --- a/apps/favorites/models.py +++ b/apps/favorites/models.py @@ -2,23 +2,13 @@ from django.contrib.contenttypes import fields as generic from django.contrib.contenttypes.models import ContentType from django.db import models from django.utils.translation import gettext_lazy as _ - -from utils.methods import get_contenttype +from utils.querysets import ContentTypeQuerySetMixin from utils.models import ProjectBaseMixin -class FavoritesQuerySet(models.QuerySet): +class FavoritesQuerySet(ContentTypeQuerySetMixin): """QuerySet for model Favorites""" - 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)) - def by_user(self, user): """Filter by user""" return self.filter(user=user) diff --git a/apps/utils/querysets.py b/apps/utils/querysets.py new file mode 100644 index 00000000..f25507f7 --- /dev/null +++ b/apps/utils/querysets.py @@ -0,0 +1,17 @@ +"""Utils QuerySet Mixins""" +from django.db import models + +from utils.methods import get_contenttype + + +class ContentTypeQuerySetMixin(models.QuerySet): + """QuerySet for ContentType""" + + 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: str = 'favorites', model: str = 'favorites'): + """Filter QuerySet by ContentType.""" + return self.filter(content_type=get_contenttype(app_label=app_label, + model=model))