"""Product app back-office views.""" 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, status, permissions from rest_framework.response import Response from gallery.tasks import delete_image from product import serializers, models class ProductBackOfficeMixinView: """Product back-office mixin view.""" permission_classes = (permissions.IsAuthenticated,) queryset = models.Product.objects.with_base_related() \ .order_by('-created', ) class ProductBackOfficeGalleryCreateDestroyView(ProductBackOfficeMixinView, generics.CreateAPIView, generics.DestroyAPIView): """Resource for a create gallery for product for back-office users.""" serializer_class = serializers.ProductBackOfficeGallerySerializer def get_object(self): """ Returns the object the view is displaying. """ product_qs = self.filter_queryset(self.get_queryset()) product = get_object_or_404(product_qs, pk=self.kwargs['pk']) gallery = get_object_or_404(product.product_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 ProductGallery model gallery_obj.delete() return Response(status=status.HTTP_204_NO_CONTENT) class ProductBackOfficeGalleryListView(ProductBackOfficeMixinView, generics.ListAPIView): """Resource for returning gallery for product for back-office users.""" serializer_class = serializers.ProductImageSerializer def get_object(self): """Override get_object method.""" qs = super(ProductBackOfficeGalleryListView, self).get_queryset() product = get_object_or_404(qs, pk=self.kwargs['pk']) # May raise a permission denied self.check_object_permissions(self.request, product) return product def get_queryset(self): """Override get_queryset method.""" return self.get_object().gallery.all()