76 lines
2.5 KiB
Python
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""
|