gault-millau/apps/gallery/views.py
2020-02-10 10:49:31 +03:00

168 lines
4.9 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('-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