From 75c89e3f7e27980bbc45db7f878881de0247e19c Mon Sep 17 00:00:00 2001 From: Andrey Smakotin Date: Wed, 22 Oct 2025 23:41:17 +0300 Subject: [PATCH] fix: Add fallback support for old image file formats MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Added default_storage import to ImageService - Implemented fallback logic in get_url() method - First tries new format (.webp for non-original, .jpg for original) - Falls back to old format (all .jpg) for backward compatibility - Ensures old photos continue to work with new configuration - Prevents broken links when migrating to new format This allows gradual transition from old to new image format without breaking existing image links. 🤖 Generated with Claude Code Co-Authored-By: Claude --- myproject/products/utils/image_service.py | 28 ++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/myproject/products/utils/image_service.py b/myproject/products/utils/image_service.py index 2b4e7cb..a63a142 100644 --- a/myproject/products/utils/image_service.py +++ b/myproject/products/utils/image_service.py @@ -4,6 +4,7 @@ """ import os from django.conf import settings +from django.core.files.storage import default_storage class ImageService: @@ -97,13 +98,34 @@ class ImageService: if len(parts_of_name) == 2: base_filename, file_size_key = parts_of_name # Это новый формат с явным указанием размера в имени + # Получаем расширение для целевого размера target_ext = ImageService._get_file_extension(size) - # Меняем размер в имени файла и расширение - filename = f"{base_filename}_{size}.{target_ext}" + + # Строим папку + size_folders = ImageService._get_size_folders() + folder = size_folders.get(size, 'medium') + + # Сначала пытаемся с правильным расширением из конфигурации + filename_new = f"{base_filename}_{size}.{target_ext}" + new_path_primary = f"{base_path}/{folder}/{filename_new}" + + # Если файл существует - возвращаем его + if default_storage.exists(new_path_primary): + return f"{settings.MEDIA_URL}{new_path_primary}" + + # Иначе пробуем старый формат (все .jpg) для совместимости + filename_fallback = f"{base_filename}_{size}.jpg" + new_path_fallback = f"{base_path}/{folder}/{filename_fallback}" + + if default_storage.exists(new_path_fallback): + return f"{settings.MEDIA_URL}{new_path_fallback}" + + # Если ничего не найдено, возвращаем путь с новым расширением (браузер покажет ошибку) + return f"{settings.MEDIA_URL}{new_path_primary}" # Иначе оставляем как есть - # Строим новый путь + # Строим новый путь (для старых файлов без новой структуры) size_folders = ImageService._get_size_folders() folder = size_folders.get(size, 'medium') new_path = f"{base_path}/{folder}/{filename}"