Исправление ошибки POS: разрешено добавление в корзину для PlatformAdmin (использование session_id вместо пользователя). Включены изменения по AI названиям букетов.

This commit is contained in:
2026-01-22 20:29:05 +03:00
parent 01873be15d
commit 22e300394b
13 changed files with 739 additions and 20 deletions

View File

@@ -2,12 +2,14 @@ from typing import Tuple, Optional, Dict, List
from .base import BaseAIProductService
import logging
from django.db import models
logger = logging.getLogger(__name__)
class BouquetNameGenerator(BaseAIProductService):
"""
Сервис для генерации названий букетов с помощью AI
Сервис для генерации и управления названиями букетов
"""
DEFAULT_SYSTEM_PROMPT = (
@@ -128,3 +130,79 @@ class BouquetNameGenerator(BaseAIProductService):
unique_names.append(name)
return unique_names
def generate_and_store(
self,
count: int = 500,
characteristics: Optional[str] = None,
occasion: Optional[str] = None,
language: str = "russian"
) -> Tuple[bool, str, Optional[Dict]]:
"""
Генерирует названия и сохраняет в базу данных
"""
from products.models import BouquetName
success, msg, data = self.generate(count, characteristics, occasion, language)
if success and data:
# Сохраняем названия в базу
stored_count = 0
for name in data['names']:
BouquetName.objects.get_or_create(
name=name,
language=language,
defaults={
'is_approved': False
}
)
stored_count += 1
return True, f"Сгенерировано и сохранено {stored_count} названий для букетов", data
return success, msg, data
def get_approved_names(
self,
color_tags: Optional[List[str]] = None,
occasion_tags: Optional[List[str]] = None,
style_tags: Optional[List[str]] = None,
language: str = "russian",
limit: int = 100
) -> List[str]:
"""
Получает одобренные названия с фильтрацией по тегам
"""
from products.models import BouquetName
queryset = BouquetName.objects.filter(
is_approved=True,
language=language
)
if color_tags:
queryset = queryset.filter(color_tags__name__in=color_tags)
if occasion_tags:
queryset = queryset.filter(occasion_tags__name__in=occasion_tags)
if style_tags:
queryset = queryset.filter(style_tags__name__in=style_tags)
# Сортируем по популярности
queryset = queryset.order_by('-usage_count')
return list(queryset.values_list('name', flat=True)[:limit])
def mark_as_used(self, name: str, language: str = "russian") -> None:
"""
Увеличивает счетчик использования названия
"""
from products.models import BouquetName
BouquetName.objects.filter(
name=name,
language=language
).update(
usage_count=models.F('usage_count') + 1
)