Merge branch 'feature/tune-comment-method' into 'develop'

tune get comments method

See merge request gm/gm-backend!243
This commit is contained in:
Олег Хаятов 2020-01-28 12:38:52 +00:00
commit d2926e487f
4 changed files with 46 additions and 12 deletions

View File

@ -48,6 +48,9 @@ class CommentQuerySet(ContentTypeQuerySetMixin):
qs = self.filter(id__in=tuple(waiting_ids)) qs = self.filter(id__in=tuple(waiting_ids))
return qs return qs
def with_base_related(self):
return self.prefetch_related("content_object").select_related("user", "content_type")
class Comment(ProjectBaseMixin): class Comment(ProjectBaseMixin):
"""Comment model.""" """Comment model."""

View File

@ -1,9 +1,7 @@
"""Common serializers for app comment.""" """Common serializers for app comment."""
from rest_framework import serializers from rest_framework import serializers
import establishment.serializers.common as establishment_serializers
from comment.models import Comment from comment.models import Comment
from establishment.models import EstablishmentType
class CommentBaseSerializer(serializers.ModelSerializer): class CommentBaseSerializer(serializers.ModelSerializer):
@ -22,6 +20,8 @@ class CommentBaseSerializer(serializers.ModelSerializer):
user_email = serializers.CharField(read_only=True, source='user.email') user_email = serializers.CharField(read_only=True, source='user.email')
slug = serializers.CharField(read_only=True, source='content_object.slug')
class Meta: class Meta:
"""Serializer for model Comment""" """Serializer for model Comment"""
model = Comment model = Comment
@ -39,18 +39,29 @@ class CommentBaseSerializer(serializers.ModelSerializer):
'status_display', 'status_display',
'last_ip', 'last_ip',
'content_type', 'content_type',
'content_name' 'content_name',
'slug',
] ]
extra_kwargs = { extra_kwargs = {
# 'status': {'read_only': True}, # 'status': {'read_only': True},
} }
def get_content_type(self, instance: Comment): def get_content_type(self, instance: Comment):
if instance.content_object.establishment_type == EstablishmentType.PRODUCER: import establishment.serializers.common as establishment_serializers
return establishment_serializers.EstablishmentSubTypeBaseSerializer( from establishment.models import EstablishmentType, Establishment
instance.content_object.establishment_subtypes, many=True from product.models import Product
).data from product.serializers import ProductTypeBaseSerializer
return establishment_serializers.EstablishmentTypeBaseSerializer( if isinstance(instance.content_object, Establishment):
instance.content_object.establishment_type if instance.content_object.establishment_type == EstablishmentType.PRODUCER:
).data return establishment_serializers.EstablishmentSubTypeBaseSerializer(
instance.content_object.establishment_subtypes, many=True
).data
return establishment_serializers.EstablishmentTypeBaseSerializer(
instance.content_object.establishment_type
).data
if isinstance(instance.content_object, Product):
return ProductTypeBaseSerializer(
instance.content_object.product_type
).data

View File

@ -7,5 +7,7 @@ app_name = 'comment'
urlpatterns = [ urlpatterns = [
path('', views.CommentLstView.as_view(), name='comment-list-create'), path('', views.CommentLstView.as_view(), name='comment-list-create'),
path('<str:type>/', views.CommentLstView.as_view(), name='comment-list-by-type-create'),
path('<str:type>/<int:object>', views.CommentLstView.as_view(), name='comment-list-by-type-object-create'),
path('<int:id>/', views.CommentRUDView.as_view(), name='comment-crud'), path('<int:id>/', views.CommentRUDView.as_view(), name='comment-crud'),
] ]

View File

@ -7,9 +7,27 @@ from utils.permissions import IsCommentModerator
class CommentLstView(generics.ListCreateAPIView): class CommentLstView(generics.ListCreateAPIView):
"""Comment list create view.""" """Comment list create view."""
serializer_class = CommentBaseSerializer def get_queryset(self):
queryset = models.Comment.objects.all() from product.models import Product
from establishment.models import Establishment
allowed = {
"product": Product.__name__.lower(),
"establishment": Establishment.__name__.lower()
}
qs = models.Comment.objects.with_base_related()
if "object" in self.kwargs:
qs = qs.by_object_id(self.kwargs["object"])
if "type" in self.kwargs and self.kwargs["type"] in allowed:
model = allowed[self.kwargs["type"]]
qs = qs.by_content_type(self.kwargs["type"], model)
return qs.order_by('-created')
serializer_class = CommentBaseSerializer
# permission_classes = [permissions.IsAuthenticatedOrReadOnly| IsCommentModerator|IsCountryAdmin] # permission_classes = [permissions.IsAuthenticatedOrReadOnly| IsCommentModerator|IsCountryAdmin]