from django.core.exceptions import PermissionDenied
from django.views.generic import CreateView, UpdateView
from django.views.generic.list import BaseListView
from galleryfield.mixins import (BaseCreateMixin, BaseCropViewMixin,
BaseListViewMixin)
[docs]class ImageCreateView(BaseCreateMixin, CreateView):
"""
The Class-based view handling the saving of uploaded image.
.. attribute:: target_model
|view_target_model|
.. attribute:: crop_url_name
|view_crop_url_name|
.. attribute:: disable_server_side_crop
|view_disable_server_side_crop|
.. automethod:: create_instance_from_form
"""
def form_valid(self, form):
self.create_instance_from_form(form)
return super().form_valid(form)
[docs]class ImageListView(BaseListViewMixin, BaseListView):
"""
The Class-based view for fetching the existing images of the gallery instance.
.. attribute:: target_model
|view_target_model|
.. attribute:: crop_url_name
|view_crop_url_name|
.. attribute:: disable_server_side_crop
|view_disable_server_side_crop|
.. automethod:: get_queryset
"""
[docs] def get_queryset(self):
"""
User need to override this method to do some basic filter in terms of
who can see which images.
:return: A Queryset
"""
return super().get_queryset()
[docs]class ImageCropView(BaseCropViewMixin, UpdateView):
"""
The Class-based view handling server side cropping of an image model
instance. Note that a new image model instance will be created rather
than updating the cropped instance.
.. attribute:: target_model
|view_target_model|
.. attribute:: crop_url_name
|view_crop_url_name|
.. attribute:: disable_server_side_crop
|view_disable_server_side_crop|
.. automethod:: create_cropped_instance_from_form
"""
def form_valid(self, form):
"""Save the object from the form. This method should only be overridden
when the model contains dynamic fields which need to be updated. For
example, when there is a ``DateTimeField`` which records the updated
datetime of the image.
"""
self.create_cropped_instance_from_form(form)
return super().form_valid(form)
class BuiltInImageCreateView(ImageCreateView):
target_model = "galleryfield.BuiltInGalleryImage"
crop_url_name = "galleryfield-builtingalleryimage-crop" # Can be omitted
disable_server_side_crop = False
def create_instance_from_form(self, form):
self.object = form.save(commit=False)
self.object.creator = self.request.user
self.object.save()
class BuiltInImageListView(ImageListView):
target_model = "galleryfield.BuiltInGalleryImage"
crop_url_name = "galleryfield-builtingalleryimage-crop" # Can be omitted
disable_server_side_crop = False
def get_queryset(self):
queryset = super().get_queryset()
if not self.request.user.is_superuser:
queryset = queryset.filter(creator=self.request.user)
return queryset
class BuiltInImageCropView(ImageCropView):
target_model = "galleryfield.BuiltInGalleryImage"
crop_url_name = "galleryfield-builtingalleryimage-crop" # Can be commented
disable_server_side_crop = False
def get_object(self, queryset=None):
obj = super().get_object(queryset=None)
if not self.request.user.is_superuser and obj.creator != self.request.user:
raise PermissionDenied("May not crop other user's image")
return obj
def create_cropped_instance_from_form(self, form):
# we don't need to set self.object.creator here because
# it's copied from the original instance.
self.object = form.save()