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))
return qs
def with_base_related(self):
return self.prefetch_related("content_object").select_related("user", "content_type")
class Comment(ProjectBaseMixin):
"""Comment model."""

View File

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

View File

@ -7,9 +7,27 @@ from utils.permissions import IsCommentModerator
class CommentLstView(generics.ListCreateAPIView):
"""Comment list create view."""
serializer_class = CommentBaseSerializer
queryset = models.Comment.objects.all()
def get_queryset(self):
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]