from django.conf import settings from django.db.transaction import on_commit from rest_framework import generics, status from rest_framework.permissions import AllowAny from rest_framework.response import Response from utils.methods import get_permission_classes from utils.permissions import IsContentPageManager, IsCountryAdmin, IsEstablishmentManager, \ IsProducerFoodInspector, IsEstablishmentAdministrator from . import tasks, models, serializers class ImageBaseView(generics.GenericAPIView): """Base Image view.""" model = models.Image queryset = models.Image.objects.all() serializer_class = serializers.ImageSerializer permission_classes = get_permission_classes( IsContentPageManager ) class ImageListCreateView(ImageBaseView, generics.ListCreateAPIView): """ ## List/Create view ### *GET* #### Description Get paginated list of images, with ordering by field `modified` (descending) #### Response E.g.: ``` { "count": 40595, "next": 2, "previous": null, "results": [ { "id": 47336, ... } ] } ``` ### *POST* #### Description Upload an image on a server. ##### Request Required: * file (`file`) - download file Available: * orientation (`enum`) - default: `null` ``` 0 (Horizontal) 1 (Vertical) ``` * title (`str`) - title of image file (default - `''`) * is_public (`bool`) - flag that responds for availability for displaying (default - `True`) * preview (`file`) - download preview file (default - `null`) * link (`str`) - mp4 or youtube video link (default - `null`) * order (`int`) - order number (default - `0`) ##### Response E.g.: ``` { "id": 47336, ... } ``` """ class MediaForEstablishmentView(ImageBaseView, generics.ListCreateAPIView): """View for creating and retrieving certain establishment media.""" pagination_class = None # permission_classes = (IsCountryAdmin, IsEstablishmentAdministrator, IsEstablishmentManager, IsProducerFoodInspector) permission_classes = (AllowAny, ) serializer_class = serializers.EstablishmentGallerySerializer def get_queryset(self): return super().get_queryset().filter(establishment__pk=self.kwargs['establishment_id'])\ .order_by('-establishment_gallery__is_main', '-order').prefetch_related('created_by', 'establishment_gallery') class MediaUpdateView(ImageBaseView, generics.UpdateAPIView, generics.DestroyAPIView): """View for updating media data""" serializer_class = serializers.EstablishmentGallerySerializer # permission_classes = (IsCountryAdmin, IsEstablishmentAdministrator, IsEstablishmentManager, IsProducerFoodInspector) permission_classes = (AllowAny, ) def delete(self, request, *args, **kwargs): """Override destroy view""" instance = self.get_object() if settings.USE_CELERY: on_commit(lambda: tasks.delete_image.delay(image_id=instance.id)) else: on_commit(lambda: tasks.delete_image(image_id=instance.id)) return Response(status=status.HTTP_204_NO_CONTENT) class ImageRetrieveDestroyView(ImageBaseView, generics.RetrieveDestroyAPIView): """ ## Retrieve/Destroy view. ### *GET* #### Description Retrieve serialized instance of Image model by image identifier. #### Response E.g.: ``` { "id": 1, ... } ``` ### *DELETE* #### Description Delete an image (DB record and storage object) by image identifier. ##### Response ``` No content ``` """ def delete(self, request, *args, **kwargs): """Override destroy view""" instance = self.get_object() if settings.USE_CELERY: on_commit(lambda: tasks.delete_image.delay(image_id=instance.id)) else: on_commit(lambda: tasks.delete_image(image_id=instance.id)) return Response(status=status.HTTP_204_NO_CONTENT) class CropImageCreateView(ImageBaseView, generics.CreateAPIView): """ ## Create view ### *POST* #### Description Create crop of an existing image by an identifier of image and parameters in request data. ##### Request Required * width (`int`) - width of cropped image * height (`int`) - height of cropped image * crop (`str`) - crop coordinates (e.g.: `100px 200px`) Non-required * quality (`int`) - image quality, by default - `settings.THUMBNAIL_QUALITY` (85%) * certain_aspect (`str`) - certain aspect, by default - ``` (x2 - x1) x (y2 - y1) ``` > where x, y is coordinates parsed from `crop` parameter ##### Response E.g.: ``` { "id": 1, ... } ``` """ serializer_class = serializers.CropImageSerializer