Files
octopus/myproject/products/services/slug_service.py
Andrey Smakotin 6c8af5ab2c fix: Улучшения системы ценообразования комплектов
Исправлены 4 проблемы:
1. Расчёт цены первого товара - улучшена валидация в getProductPrice и calculateFinalPrice
2. Отображение actual_price в Select2 вместо обычной цены
3. Количество по умолчанию = 1 для новых форм компонентов
4. Auto-select текста при клике на поле количества для удобства редактирования

Изменённые файлы:
- products/forms.py: добавлен __init__ в KitItemForm для quantity.initial = 1
- products/templates/includes/select2-product-init.html: обновлена formatSelectResult
- products/templates/productkit_create.html: добавлен focus handler для auto-select
- products/templates/productkit_edit.html: добавлен focus handler для auto-select

🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-02 19:04:03 +03:00

73 lines
2.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
Сервис для генерации уникальных 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)