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:
@@ -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 если не задан.
|
||||
|
||||
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user