refactored comments

This commit is contained in:
Anatoly 2019-09-06 11:06:02 +03:00
parent 411207868f
commit 742d700d3c
6 changed files with 102 additions and 84 deletions

View File

@ -2,20 +2,12 @@
from rest_framework import serializers
from comment import models
from establishment.models import Establishment
class CommentBaseMixin(serializers.Serializer):
"""Comment base serializer mixin"""
# RESPONSE
class CommentSerializer(serializers.ModelSerializer):
"""Comment serializer"""
nickname = serializers.CharField(read_only=True,
source='user.username')
profile_pic = serializers.ImageField(read_only=True,
source='user.image')
class CommentSerializer(CommentBaseMixin, serializers.ModelSerializer):
"""Comment serializer"""
is_mine = serializers.BooleanField(read_only=True)
profile_pic = serializers.SerializerMethodField()
@ -36,30 +28,3 @@ class CommentSerializer(CommentBaseMixin, serializers.ModelSerializer):
def get_profile_pic(self, obj):
"""Get profile picture URL"""
return obj.user.get_full_image_url(request=self.context.get('request'))
class EstablishmentCommentCreateSerializer(CommentSerializer):
"""Create comment serializer"""
mark = serializers.IntegerField()
establishment_id = serializers.PrimaryKeyRelatedField(queryset=Establishment.objects.all(),
source='content_object',
write_only=True)
class Meta:
"""Serializer for model Comment"""
model = models.Comment
fields = [
'created',
'text',
'mark',
'nickname',
'profile_pic',
'establishment_id',
]
def create(self, validated_data):
"""Override create method"""
validated_data.update({
'user': self.context.get('request').user
})
return super().create(validated_data)

View File

@ -1,12 +1,5 @@
"""Comment urlpaths."""
from django.urls import path
from comment.views import common as views
app_name = 'comment'
urlpatterns = [
path('', views.CommentListView.as_view(), name='comment-list'),
path('create/', views.CommentCreateView.as_view(), name='comment-create'),
path('<int:pk>/', views.CommentRUD.as_view(), name='comment-rud'),
]
urlpatterns = []

View File

@ -1,34 +1 @@
"""Views for app comment."""
from rest_framework import generics
from rest_framework.permissions import AllowAny
from comment.models import Comment
from comment.serializers import common as serializers
class CommentViewMixin:
"""Mixin for Comment views"""
queryset = Comment.objects.order_by('-created')
serializer_class = serializers.CommentSerializer
class CommentListView(CommentViewMixin, generics.ListAPIView):
"""View for retrieving list of comments."""
permission_classes = (AllowAny, )
def get_queryset(self):
"""Override get_queryset method."""
return self.queryset.annotate_is_mine_status(user=self.request.user)
class CommentCreateView(CommentViewMixin, generics.CreateAPIView):
"""View for create new comment."""
serializer_class = serializers.EstablishmentCommentCreateSerializer
class CommentRUD(CommentViewMixin, generics.RetrieveUpdateDestroyAPIView):
"""View for retrieve/update/destroy view."""
def get_queryset(self):
"""Override get_queryset method."""
return self.queryset.by_user(self.request.user)

View File

@ -1,7 +1,8 @@
"""Establishment serializers."""
from rest_framework import serializers
from comment.serializers.common import CommentSerializer
from comment import models as comment_models
from comment.serializers import common as comment_serializers
from establishment import models
from location.serializers import AddressSerializer
from main.serializers import MetaDataContentSerializer, AwardSerializer, CurrencySerializer
@ -202,11 +203,61 @@ class EstablishmentDetailSerializer(EstablishmentListSerializer):
def get_comments(self, obj):
"""Serializer method for comment field"""
request = self.context.get('request')
return CommentSerializer(obj.comments.annotate_is_mine_status(user=request.user),
context={'request': self.context.get('request')},
many=True).data
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)
.order_by('-published_at').first()).data
class EstablishmentCommentCreateSerializer(comment_serializers.CommentSerializer):
"""Create comment serializer"""
mark = serializers.IntegerField()
class Meta:
"""Serializer for model Comment"""
model = comment_models.Comment
fields = [
'id',
'created',
'text',
'mark',
'nickname',
'profile_pic',
]
def validate(self, attrs):
"""Override validate method"""
# Check establishment object
establishment_id = self.context.get('request').parser_context.get('kwargs').get('pk')
establishment_qs = models.Establishment.objects.filter(id=establishment_id)
if not establishment_qs.exists():
return serializers.ValidationError()
attrs['establishment'] = establishment_qs.first()
return attrs
def create(self, validated_data, *args, **kwargs):
"""Override create method"""
validated_data.update({
'user': self.context.get('request').user,
'content_object': validated_data.pop('establishment')
})
return super().create(validated_data)
class EstablishmentCommentRUDSerializer(comment_serializers.CommentSerializer):
"""Retrieve/Update/Destroy comment serializer."""
class Meta:
"""Meta class."""
model = comment_models.Comment
fields = [
'id',
'created',
'text',
'mark',
'nickname',
'profile_pic',
]

View File

@ -1,7 +1,7 @@
"""Establishment url patterns."""
from django.urls import include, path
from establishment import views
from django.urls import path
from establishment import views
app_name = 'establishment'
@ -9,4 +9,8 @@ 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(),
name='create-comment'),
path('<int:pk>/comment/<int:comment_id>/', views.EstablishmentCommentRUDView.as_view(),
name='rud-comment'),
]

View File

@ -1,6 +1,9 @@
"""Establishment app views."""
from django.shortcuts import get_object_or_404
from rest_framework import generics, permissions
from comment import models as comment_models
from establishment import filters
from establishment import models, serializers
from utils.views import JWTGenericViewMixin
@ -39,3 +42,38 @@ class EstablishmentTypeListView(JWTGenericViewMixin, generics.ListAPIView):
serializer_class = serializers.EstablishmentTypeSerializer
queryset = models.EstablishmentType.objects.all()
class EstablishmentCommentCreateView(generics.CreateAPIView):
"""View for create new comment."""
serializer_class = serializers.EstablishmentCommentCreateSerializer
queryset = comment_models.Comment.objects.order_by('-created')
class EstablishmentCommentRUDView(generics.RetrieveUpdateDestroyAPIView):
"""View for retrieve/update/destroy establishment comment."""
serializer_class = serializers.EstablishmentCommentRUDSerializer
queryset = models.Establishment.objects.all()
def get_object(self):
"""
Returns the object the view is displaying.
"""
queryset = self.filter_queryset(self.get_queryset())
lookup_url_kwargs = ('pk', 'comment_id')
assert lookup_url_kwargs not in self.kwargs.keys(), (
'Expected view %s to be called with a URL keyword argument '
'named "%s". Fix your URL conf, or set the `.lookup_field` '
'attribute on the view correctly.' %
(self.__class__.__name__, lookup_url_kwargs)
)
establishment_obj = get_object_or_404(queryset,
pk=self.kwargs['pk'])
comment_obj = get_object_or_404(establishment_obj.comments.by_user(self.request.user),
pk=self.kwargs['comment_id'])
# May raise a permission denied
self.check_object_permissions(self.request, comment_obj)
return comment_obj