GM-70: Добавить пагинацию комментариев в карточке ресторанов
This commit is contained in:
parent
273f74f911
commit
808178d56c
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -9,9 +9,11 @@ app_name = 'establishment'
|
|||
urlpatterns = [
|
||||
path('', views.EstablishmentListView.as_view(), name='list'),
|
||||
path('<int:pk>/', views.EstablishmentRetrieveView.as_view(), name='detail'),
|
||||
path('<int:pk>/comment/', views.EstablishmentCommentCreateView.as_view(),
|
||||
path('<int:pk>/comments/', views.EstablishmentCommentListView.as_view(), name='list-comments'),
|
||||
path('<int:pk>/comments/create/', views.EstablishmentCommentCreateView.as_view(),
|
||||
name='create-comment'),
|
||||
path('<int:pk>/comment/<int:comment_id>/', views.EstablishmentCommentRUDView.as_view(),
|
||||
path('<int:pk>/comments/<int:comment_id>/', views.EstablishmentCommentRUDView.as_view(),
|
||||
name='rud-comment'),
|
||||
path('<int:pk>/favorites/', views.EstablishmentFavoritesCreateDestroyView.as_view()),
|
||||
path('<int:pk>/favorites/', views.EstablishmentFavoritesCreateDestroyView.as_view(),
|
||||
name='add-favorites'),
|
||||
]
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
17
apps/utils/querysets.py
Normal file
17
apps/utils/querysets.py
Normal file
|
|
@ -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))
|
||||
Loading…
Reference in New Issue
Block a user