Fix: Auto-cleanup temp files after photo processing

- Added temp file deletion in Celery task after successful processing
- Added temp file cleanup in sync fallback method
- Added temp file removal in delete() if processing never completed
- Prevents accumulation of orphaned files in media/<entity>/temp/ folders
This commit is contained in:
2025-11-15 22:28:41 +03:00
parent 53fbb6d3c1
commit 9363527e50
9 changed files with 275 additions and 18 deletions

View File

@@ -193,6 +193,11 @@ class BaseProductEntity(models.Model):
"""Физическое удаление из БД (необратимо! только для старых товаров)"""
super().delete()
@property
def is_active(self):
"""Возвращает True если товар активен"""
return self.status == 'active'
def save(self, *args, **kwargs):
"""
Автогенерация slug из name если не задан.

View File

@@ -124,10 +124,14 @@ class BasePhoto(models.Model):
Используется только если Celery недоступен.
"""
from ..utils.image_processor import ImageProcessor
from django.core.files.storage import default_storage
entity = self.get_entity()
entity_type = self.get_entity_type()
# Сохраняем путь к временному файлу до перезаписи поля image
temp_path = getattr(temp_image, 'name', None)
processed_paths = ImageProcessor.process_image(
temp_image,
entity_type,
@@ -141,10 +145,18 @@ class BasePhoto(models.Model):
super().save(update_fields=['image', 'quality_level', 'quality_warning'])
# Удаляем временный файл из temp после успешной обработки
try:
if temp_path and default_storage.exists(temp_path):
default_storage.delete(temp_path)
except Exception:
pass
def delete(self, *args, **kwargs):
"""Удаляет все версии изображения при удалении фото"""
import logging
from ..utils.image_processor import ImageProcessor
from django.core.files.storage import default_storage
logger = logging.getLogger(__name__)
@@ -159,6 +171,15 @@ class BasePhoto(models.Model):
entity_id=entity.id,
photo_id=self.id
)
# Если фото так и осталось во временном пути (обработка не завершилась) — удаляем temp файл
try:
if '/temp/' in self.image.name and default_storage.exists(self.image.name):
default_storage.delete(self.image.name)
logger.info(f"[{self.__class__.__name__}.delete] Deleted temp file: {self.image.name}")
except Exception as del_exc:
logger.warning(f"[{self.__class__.__name__}.delete] Could not delete temp file {self.image.name}: {del_exc}")
logger.info(f"[{self.__class__.__name__}.delete] ✓ Все версии изображения удалены")
except Exception as e:
logger.error(