Files
Amirhossein Khalili b4903f7cb1
Some checks failed
Backend CI/CD / test (push) Has been cancelled
Backend CI/CD / deploy (push) Has been cancelled
F(backend): add public media derivatives pipeline
2026-05-20 14:26:51 +03:30

76 lines
2.5 KiB
Python

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})"