Add endpoints to gallery

This commit is contained in:
littlewolf 2019-11-07 15:35:06 +03:00
parent 03fc4a6c56
commit 086b26e6d9
3 changed files with 88 additions and 6 deletions

View File

@ -4,7 +4,7 @@ from django.utils.translation import ugettext_lazy as _
from rest_framework import serializers from rest_framework import serializers
from location import models from location import models
from utils.serializers import TranslatedField from utils.serializers import TranslatedField
from apps.gallery.models import Image from gallery.models import Image
class CountrySerializer(serializers.ModelSerializer): 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): class AddressBaseSerializer(serializers.ModelSerializer):
"""Serializer for address obj in related objects.""" """Serializer for address obj in related objects."""

View File

@ -14,7 +14,7 @@ urlpatterns = [
path('cities/<int:pk>/gallery/', views.CityGalleryListView.as_view(), path('cities/<int:pk>/gallery/', views.CityGalleryListView.as_view(),
name='gallery-list'), name='gallery-list'),
path('cities/<int:pk>/gallery/<int:image_id>/', views.NewsBackOfficeGalleryCreateDestroyView.as_view(), path('cities/<int:pk>/gallery/<int:image_id>/', views.CityGalleryCreateDestroyView.as_view(),
name='gallery-create-destroy'), name='gallery-create-destroy'),
path('countries/', views.CountryListView.as_view(), name='country-list'), path('countries/', views.CountryListView.as_view(), name='country-list'),

View File

@ -1,7 +1,10 @@
"""Location app views.""" """Location app views."""
from rest_framework import generics from django.conf import settings
from rest_framework import permissions from django.db.transaction import on_commit
from django.shortcuts import get_object_or_404 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 from location import models, serializers
@ -109,8 +112,7 @@ class CityGalleryListView(generics.ListAPIView):
serializer_class = serializers.CityImageSerializer serializer_class = serializers.CityImageSerializer
permission_classes = (permissions.IsAuthenticated,) permission_classes = (permissions.IsAuthenticated,)
queryset = models.City.objects.with_base_related() \ queryset = models.City.objects
.order_by('-is_highlighted', '-created')
def get_object(self): def get_object(self):
"""Override get_object method.""" """Override get_object method."""
@ -127,6 +129,48 @@ class CityGalleryListView(generics.ListAPIView):
return self.get_object().gallery.all() 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 # Address
class AddressCreateView(AddressViewMixin, generics.CreateAPIView): class AddressCreateView(AddressViewMixin, generics.CreateAPIView):
"""Create view for model Address""" """Create view for model Address"""