Удалена функция parse_variant_suffix и логика автоматического добавления суффикса варианта к артикулу товара. SKU теперь всегда имеет формат PROD-XXXXXX без дополнительных суффиксов. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
62 lines
2.6 KiB
Python
62 lines
2.6 KiB
Python
"""
|
||
Сервисы для бизнес-логики Product модели.
|
||
Извлекает сложную логику из save() метода.
|
||
"""
|
||
|
||
|
||
class ProductSaveService:
|
||
"""
|
||
Сервис для обработки сохранения Product.
|
||
Генерирует SKU и поисковые ключевые слова.
|
||
"""
|
||
|
||
@staticmethod
|
||
def prepare_product_for_save(product):
|
||
"""
|
||
Подготавливает продукт к сохранению:
|
||
- Генерирует SKU если не задан
|
||
- Создает базовые поисковые ключевые слова
|
||
|
||
Args:
|
||
product (Product): Экземпляр продукта
|
||
|
||
Returns:
|
||
Product: Обновленный экземпляр продукта
|
||
"""
|
||
from ..utils.sku_generator import generate_product_sku
|
||
|
||
# Генерация артикула для новых товаров
|
||
if not product.sku:
|
||
product.sku = generate_product_sku(product)
|
||
|
||
# Автоматическая генерация ключевых слов для поиска
|
||
keywords_parts = [
|
||
product.name or '',
|
||
product.sku or '',
|
||
product.description or '',
|
||
]
|
||
|
||
if not product.search_keywords:
|
||
product.search_keywords = ' '.join(filter(None, keywords_parts))
|
||
|
||
return product
|
||
|
||
@staticmethod
|
||
def update_search_keywords_with_categories(product):
|
||
"""
|
||
Обновляет поисковые ключевые слова с названиями категорий.
|
||
Должен вызываться после сохранения, т.к. ManyToMany требует существующего объекта.
|
||
|
||
Args:
|
||
product (Product): Сохраненный экземпляр продукта
|
||
"""
|
||
# Добавляем названия категорий в search_keywords после сохранения
|
||
# (ManyToMany требует, чтобы объект уже существовал в БД)
|
||
if product.pk and product.categories.exists():
|
||
category_names = ' '.join([cat.name for cat in product.categories.all()])
|
||
if category_names and category_names not in product.search_keywords:
|
||
product.search_keywords = f"{product.search_keywords} {category_names}".strip()
|
||
# Используем update чтобы избежать рекурсии
|
||
from ..models.products import Product
|
||
Product.objects.filter(pk=product.pk).update(search_keywords=product.search_keywords)
|