""" Сервис для получения URL изображений разных размеров. Используется в шаблонах и представлениях для удобного доступа к разным версиям. """ import os from django.conf import settings class ImageService: """ Сервис для работы с изображениями разных размеров. Динамически строит URL на основе пути к оригинальному файлу. """ # Папки для разных размеров SIZE_FOLDERS = { 'thumbnail': 'thumbnails', 'medium': 'medium', 'large': 'large', 'original': 'originals', } @staticmethod def get_url(original_image_path, size='medium'): """ Получает URL изображения нужного размера. Args: original_image_path: Путь к оригинальному файлу (из models.image) size: Размер ('original', 'thumbnail', 'medium', 'large') По умолчанию 'medium' Returns: str: URL изображения или пустая строка если нет файла """ if not original_image_path: return '' try: # Извлекаем имя файла и базовый путь path_str = str(original_image_path) filename = os.path.basename(path_str) # Определяем базовый путь (products, kits, categories) parts = path_str.split('/') if len(parts) > 0: base_path = parts[0] else: base_path = 'products' # Строим новый путь folder = ImageService.SIZE_FOLDERS.get(size, 'medium') new_path = f"{base_path}/{folder}/{filename}" # Возвращаем URL return f"{settings.MEDIA_URL}{new_path}" except Exception: return '' @staticmethod def get_thumbnail_url(original_image_path): """Получить URL миниатюры (150x150)""" return ImageService.get_url(original_image_path, 'thumbnail') @staticmethod def get_medium_url(original_image_path): """Получить URL среднего размера (400x400)""" return ImageService.get_url(original_image_path, 'medium') @staticmethod def get_large_url(original_image_path): """Получить URL большого размера (800x800)""" return ImageService.get_url(original_image_path, 'large') @staticmethod def get_original_url(original_image_path): """Получить URL оригинального изображения""" return ImageService.get_url(original_image_path, 'original') @staticmethod def get_all_urls(original_image_path): """ Получить все версии изображения. Returns: dict: {'original': url, 'thumbnail': url, 'medium': url, 'large': url} """ return { 'original': ImageService.get_original_url(original_image_path), 'thumbnail': ImageService.get_thumbnail_url(original_image_path), 'medium': ImageService.get_medium_url(original_image_path), 'large': ImageService.get_large_url(original_image_path), }