From 086b26e6d914005ded391fff5c6976a6fd1e87fe Mon Sep 17 00:00:00 2001 From: littlewolf Date: Thu, 7 Nov 2019 15:35:06 +0300 Subject: [PATCH] Add endpoints to gallery --- apps/location/serializers/common.py | 40 +++++++++++++++++++++- apps/location/urls/common.py | 2 +- apps/location/views/common.py | 52 ++++++++++++++++++++++++++--- 3 files changed, 88 insertions(+), 6 deletions(-) diff --git a/apps/location/serializers/common.py b/apps/location/serializers/common.py index 9d48c769..4b0011d0 100644 --- a/apps/location/serializers/common.py +++ b/apps/location/serializers/common.py @@ -4,7 +4,7 @@ from django.utils.translation import ugettext_lazy as _ from rest_framework import serializers from location import models from utils.serializers import TranslatedField -from apps.gallery.models import Image +from gallery.models import Image class CountrySerializer(serializers.ModelSerializer): @@ -160,6 +160,44 @@ class CityImageSerializer(serializers.ModelSerializer): } +class CityGallerySerializer(serializers.ModelSerializer): + """Serializer class for model NewsGallery.""" + + class Meta: + """Meta class""" + + model = models.CityGallery + fields = [ + 'id', + 'is_main', + ] + + def get_request_kwargs(self): + """Get url kwargs from request.""" + return self.context.get('request').parser_context.get('kwargs') + + def validate(self, attrs): + """Override validate method.""" + news_pk = self.get_request_kwargs().get('pk') + image_id = self.get_request_kwargs().get('image_id') + + news_qs = models.City.objects.filter(pk=news_pk) + image_qs = Image.objects.filter(id=image_id) + + if not news_qs.exists(): + raise serializers.ValidationError({'detail': _('News not found')}) + if not image_qs.exists(): + raise serializers.ValidationError({'detail': _('Image not found')}) + + news = news_qs.first() + image = image_qs.first() + + attrs['news'] = news + attrs['image'] = image + + return attrs + + class AddressBaseSerializer(serializers.ModelSerializer): """Serializer for address obj in related objects.""" diff --git a/apps/location/urls/common.py b/apps/location/urls/common.py index 704ff600..e2840590 100644 --- a/apps/location/urls/common.py +++ b/apps/location/urls/common.py @@ -14,7 +14,7 @@ urlpatterns = [ path('cities//gallery/', views.CityGalleryListView.as_view(), name='gallery-list'), - path('cities//gallery//', views.NewsBackOfficeGalleryCreateDestroyView.as_view(), + path('cities//gallery//', views.CityGalleryCreateDestroyView.as_view(), name='gallery-create-destroy'), path('countries/', views.CountryListView.as_view(), name='country-list'), diff --git a/apps/location/views/common.py b/apps/location/views/common.py index 2d8d6b53..5b17d31d 100644 --- a/apps/location/views/common.py +++ b/apps/location/views/common.py @@ -1,7 +1,10 @@ """Location app views.""" -from rest_framework import generics -from rest_framework import permissions +from django.conf import settings +from django.db.transaction import on_commit from django.shortcuts import get_object_or_404 +from rest_framework import generics, permissions, status +from rest_framework.response import Response +from gallery.tasks import delete_image from location import models, serializers @@ -109,8 +112,7 @@ class CityGalleryListView(generics.ListAPIView): serializer_class = serializers.CityImageSerializer permission_classes = (permissions.IsAuthenticated,) - queryset = models.City.objects.with_base_related() \ - .order_by('-is_highlighted', '-created') + queryset = models.City.objects def get_object(self): """Override get_object method.""" @@ -127,6 +129,48 @@ class CityGalleryListView(generics.ListAPIView): return self.get_object().gallery.all() +class CityGalleryCreateDestroyView(generics.CreateAPIView, + generics.DestroyAPIView): + + permission_classes = (permissions.IsAuthenticated,) + queryset = models.City.objects + + """Resource for a create gallery for news for back-office users.""" + serializer_class = serializers.CityGallerySerializer + + def get_object(self): + """ + Returns the object the view is displaying. + """ + city_qs = self.filter_queryset(self.get_queryset()) + + city = get_object_or_404(city_qs, pk=self.kwargs['pk']) + gallery = get_object_or_404(city.news_gallery, image_id=self.kwargs['image_id']) + + # May raise a permission denied + self.check_object_permissions(self.request, gallery) + + return gallery + + def create(self, request, *args, **kwargs): + """Overridden create method""" + super().create(request, *args, **kwargs) + return Response(status=status.HTTP_201_CREATED) + + def destroy(self, request, *args, **kwargs): + """Override destroy method.""" + gallery_obj = self.get_object() + if settings.USE_CELERY: + on_commit(lambda: delete_image.delay(image_id=gallery_obj.image.id, + completely=False)) + else: + on_commit(lambda: delete_image(image_id=gallery_obj.image.id, + completely=False)) + # Delete an instances of NewsGallery model + gallery_obj.delete() + return Response(status=status.HTTP_204_NO_CONTENT) + + # Address class AddressCreateView(AddressViewMixin, generics.CreateAPIView): """Create view for model Address"""