""" Сервис для генерации уникальных slug для моделей. Централизует логику транслитерации и обеспечения уникальности. """ from django.utils.text import slugify from unidecode import unidecode class SlugService: """ Статический сервис для генерации уникальных slug. Используется моделями Product, ProductKit, ProductCategory, ProductTag. """ @staticmethod def generate_unique_slug(name, model_class, instance_pk=None): """ Генерирует уникальный slug из названия с транслитерацией кириллицы. Args: name (str): Исходное название для генерации slug model_class (Model): Класс модели для проверки уникальности instance_pk (int, optional): ID текущего экземпляра (для исключения при обновлении) Returns: str: Уникальный slug Example: >>> SlugService.generate_unique_slug("Роза красная", Product, None) 'roza-krasnaya' >>> SlugService.generate_unique_slug("Роза красная", Product, None) # если уже существует 'roza-krasnaya-1' """ # Транслитерируем кириллицу в латиницу, затем применяем slugify transliterated_name = unidecode(name) base_slug = slugify(transliterated_name) # Обеспечиваем уникальность slug = base_slug counter = 1 while True: # Проверяем существование slug, исключая текущий экземпляр если это обновление query = model_class.objects.filter(slug=slug) if instance_pk: query = query.exclude(pk=instance_pk) if not query.exists(): break # Если slug занят, добавляем счетчик slug = f"{base_slug}-{counter}" counter += 1 return slug @staticmethod def transliterate(text): """ Транслитерирует текст (кириллицу в латиницу). Args: text (str): Текст для транслитерации Returns: str: Транслитерированный текст Example: >>> SlugService.transliterate("Привет мир") 'Privet mir' """ return unidecode(text)