refactored comments
This commit is contained in:
parent
411207868f
commit
742d700d3c
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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 = []
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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',
|
||||
]
|
||||
|
|
|
|||
|
|
@ -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'),
|
||||
]
|
||||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user