refactored comments
This commit is contained in:
parent
411207868f
commit
742d700d3c
|
|
@ -2,20 +2,12 @@
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
from comment import models
|
from comment import models
|
||||||
from establishment.models import Establishment
|
|
||||||
|
|
||||||
|
|
||||||
class CommentBaseMixin(serializers.Serializer):
|
class CommentSerializer(serializers.ModelSerializer):
|
||||||
"""Comment base serializer mixin"""
|
"""Comment serializer"""
|
||||||
# RESPONSE
|
|
||||||
nickname = serializers.CharField(read_only=True,
|
nickname = serializers.CharField(read_only=True,
|
||||||
source='user.username')
|
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)
|
is_mine = serializers.BooleanField(read_only=True)
|
||||||
profile_pic = serializers.SerializerMethodField()
|
profile_pic = serializers.SerializerMethodField()
|
||||||
|
|
||||||
|
|
@ -36,30 +28,3 @@ class CommentSerializer(CommentBaseMixin, serializers.ModelSerializer):
|
||||||
def get_profile_pic(self, obj):
|
def get_profile_pic(self, obj):
|
||||||
"""Get profile picture URL"""
|
"""Get profile picture URL"""
|
||||||
return obj.user.get_full_image_url(request=self.context.get('request'))
|
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."""
|
"""Comment urlpaths."""
|
||||||
from django.urls import path
|
|
||||||
|
|
||||||
from comment.views import common as views
|
|
||||||
|
|
||||||
app_name = 'comment'
|
app_name = 'comment'
|
||||||
|
|
||||||
urlpatterns = [
|
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'),
|
|
||||||
]
|
|
||||||
|
|
|
||||||
|
|
@ -1,34 +1 @@
|
||||||
"""Views for app comment."""
|
"""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."""
|
"""Establishment serializers."""
|
||||||
from rest_framework import 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 establishment import models
|
||||||
from location.serializers import AddressSerializer
|
from location.serializers import AddressSerializer
|
||||||
from main.serializers import MetaDataContentSerializer, AwardSerializer, CurrencySerializer
|
from main.serializers import MetaDataContentSerializer, AwardSerializer, CurrencySerializer
|
||||||
|
|
@ -202,11 +203,61 @@ class EstablishmentDetailSerializer(EstablishmentListSerializer):
|
||||||
def get_comments(self, obj):
|
def get_comments(self, obj):
|
||||||
"""Serializer method for comment field"""
|
"""Serializer method for comment field"""
|
||||||
request = self.context.get('request')
|
request = self.context.get('request')
|
||||||
return CommentSerializer(obj.comments.annotate_is_mine_status(user=request.user),
|
return comment_serializers.CommentSerializer(obj.comments.annotate_is_mine_status(user=request.user),
|
||||||
context={'request': self.context.get('request')},
|
context={'request': self.context.get('request')},
|
||||||
many=True).data
|
many=True).data
|
||||||
|
|
||||||
def get_review(self, obj):
|
def get_review(self, obj):
|
||||||
"""Serializer method for getting last published review"""
|
"""Serializer method for getting last published review"""
|
||||||
return ReviewSerializer(obj.reviews.by_status(status=review_models.Review.READY)
|
return ReviewSerializer(obj.reviews.by_status(status=review_models.Review.READY)
|
||||||
.order_by('-published_at').first()).data
|
.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."""
|
"""Establishment url patterns."""
|
||||||
from django.urls import include, path
|
from django.urls import path
|
||||||
from establishment import views
|
|
||||||
|
|
||||||
|
from establishment import views
|
||||||
|
|
||||||
app_name = 'establishment'
|
app_name = 'establishment'
|
||||||
|
|
||||||
|
|
@ -9,4 +9,8 @@ app_name = 'establishment'
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('', views.EstablishmentListView.as_view(), name='list'),
|
path('', views.EstablishmentListView.as_view(), name='list'),
|
||||||
path('<int:pk>/', views.EstablishmentRetrieveView.as_view(), name='detail'),
|
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."""
|
"""Establishment app views."""
|
||||||
|
|
||||||
|
from django.shortcuts import get_object_or_404
|
||||||
from rest_framework import generics, permissions
|
from rest_framework import generics, permissions
|
||||||
|
|
||||||
|
from comment import models as comment_models
|
||||||
from establishment import filters
|
from establishment import filters
|
||||||
from establishment import models, serializers
|
from establishment import models, serializers
|
||||||
from utils.views import JWTGenericViewMixin
|
from utils.views import JWTGenericViewMixin
|
||||||
|
|
@ -39,3 +42,38 @@ class EstablishmentTypeListView(JWTGenericViewMixin, generics.ListAPIView):
|
||||||
serializer_class = serializers.EstablishmentTypeSerializer
|
serializer_class = serializers.EstablishmentTypeSerializer
|
||||||
queryset = models.EstablishmentType.objects.all()
|
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