118 lines
3.8 KiB
Python
118 lines
3.8 KiB
Python
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('-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):
|
|
"""Destroy view for model Image"""
|
|
|
|
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 crop image."""
|
|
serializer_class = serializers.CropImageSerializer
|