GM-70: Добавить пагинацию комментариев в карточке ресторанов

This commit is contained in:
Anatoly 2019-09-09 13:12:48 +03:00
parent 273f74f911
commit 808178d56c
6 changed files with 39 additions and 25 deletions

View File

@ -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):

View File

@ -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)

View File

@ -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'),
]

View File

@ -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

View File

@ -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
View 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))