from django.db import models from django.conf import settings from core.models import BaseModel from core.media import ( delete_image_derivatives_by_name, get_image_previous_name, safe_process_public_image, ) class Gallery(BaseModel): title = models.CharField(max_length=200) description = models.TextField(blank=True) image = models.ImageField(upload_to='gallery/') uploaded_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='gallery_images') alt_text = models.CharField(max_length=200, blank=True) file_size = models.PositiveIntegerField(null=True, blank=True) width = models.PositiveIntegerField(null=True, blank=True) height = models.PositiveIntegerField(null=True, blank=True) is_public = models.BooleanField(default=True) class Meta: ordering = ['-created_at'] verbose_name_plural = "Gallery Images" def __str__(self): return self.title def save(self, *args, **kwargs): previous_image_name = get_image_previous_name(self, "image") current_image_name = self.image.name if self.image else None image_changed = previous_image_name != current_image_name super().save(*args, **kwargs) if image_changed and previous_image_name: delete_image_derivatives_by_name( self.image.storage if self.image else None, previous_image_name, "gallery", delete_original=True, ) if not self.image: if image_changed: Gallery.objects.filter(pk=self.pk).update(file_size=None, width=None, height=None) return if getattr(self, "_defer_image_processing", False): return if image_changed: result = safe_process_public_image(self.image, "gallery") if result: Gallery.objects.filter(pk=self.pk).update( file_size=result.file_size, width=result.width, height=result.height, ) self.file_size = result.file_size self.width = result.width self.height = result.height @property def file_size_mb(self): """Return file size in MB""" if self.file_size: return round(self.file_size / (1024 * 1024), 2) return 0 @property def markdown_url(self): """Return URL for use in markdown""" return f"![{self.alt_text or self.title}]({settings.BACKEND_ROOT}{self.image.url})"