from django.db import models from django.utils.translation import gettext_lazy as _ from sorl import thumbnail from sorl.thumbnail.fields import ImageField as SORLImageField from utils.methods import image_path from utils.models import ProjectBaseMixin, SORLImageMixin, PlatformMixin class ImageQuerySet(models.QuerySet): """QuerySet for model Image.""" class Image(ProjectBaseMixin, SORLImageMixin, PlatformMixin): """Image model.""" HORIZONTAL = 0 VERTICAL = 1 ORIENTATIONS = ( (HORIZONTAL, _('Horizontal')), (VERTICAL, _('Vertical')), ) image = SORLImageField(max_length=255, upload_to=image_path, verbose_name=_('image file')) orientation = models.PositiveSmallIntegerField(choices=ORIENTATIONS, blank=True, null=True, default=None, verbose_name=_('image orientation')) title = models.CharField(_('title'), max_length=255, default='') objects = ImageQuerySet.as_manager() class Meta: """Meta class.""" verbose_name = _('Image') verbose_name_plural = _('Images') ordering = ['-modified'] def __str__(self): """String representation""" return f'{self.id}' def delete_image(self, completely: bool = True): """ Deletes an instance and crops of instance from media storage. :param completely: if set to False then removed only crop neither original image. """ try: # Delete from remote storage thumbnail.delete(file_=self.image.file, delete_file=completely) except FileNotFoundError: pass finally: if completely: # Delete an instance of image super().delete()