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>
This commit is contained in:
72
myproject/products/services/slug_service.py
Normal file
72
myproject/products/services/slug_service.py
Normal file
@@ -0,0 +1,72 @@
|
||||
"""
|
||||
Сервис для генерации уникальных 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)
|
||||
Reference in New Issue
Block a user