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, BaseAttributes class ImageQuerySet(models.QuerySet): """QuerySet for model Image.""" class Image(BaseAttributes, SORLImageMixin, PlatformMixin): """Image model.""" HORIZONTAL = 0 VERTICAL = 1 MEDIA_TYPES = ( _('photo'), _('video'), _('youtube'), ) ORIENTATIONS = ( (HORIZONTAL, _('Horizontal')), (VERTICAL, _('Vertical')), ) image = SORLImageField(max_length=255, upload_to=image_path, verbose_name=_('image file'), default=None, null=True) orientation = models.PositiveSmallIntegerField(choices=ORIENTATIONS, blank=True, null=True, default=None, verbose_name=_('image orientation')) title = models.CharField(_('title'), max_length=255, default='') is_public = models.BooleanField(default=True, verbose_name=_('Is media source public')) preview = SORLImageField(max_length=255, upload_to=image_path, verbose_name=_('image preview'), null=True, default=None) link = models.URLField(blank=True, null=True, default=None, verbose_name=_('mp4 or youtube video link')) order = models.PositiveIntegerField(default=0, verbose_name=_('Sorting order')) 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}' @property def type(self) -> str: if self.image: return self.MEDIA_TYPES[0] if self.link is not None and self.link.endswith('.mp4'): return self.MEDIA_TYPES[1] return self.MEDIA_TYPES[2] @property def image_size_in_KB(self): try: return self.image.size / 1024 if self.image else None except FileNotFoundError: return None 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()