79 lines
2.5 KiB
Python
79 lines
2.5 KiB
Python
"""
|
||
API представления для приложения products.
|
||
"""
|
||
from django.http import JsonResponse
|
||
from django.db import models
|
||
|
||
from ..models import Product, ProductVariantGroup
|
||
|
||
|
||
def search_products_and_variants(request):
|
||
"""
|
||
API endpoint для поиска товаров и групп вариантов.
|
||
Используется для автокомплита при добавлении компонентов в комплект.
|
||
|
||
Параметры GET:
|
||
- q: строка поиска
|
||
- type: 'product' или 'variant' (опционально, если не указано - поиск по обоим)
|
||
|
||
Возвращает JSON список:
|
||
[
|
||
{
|
||
"id": 1,
|
||
"name": "Роза красная Freedom 50см",
|
||
"sku": "PROD-000001",
|
||
"type": "product",
|
||
"price": "150.00"
|
||
},
|
||
{
|
||
"id": 1,
|
||
"name": "Роза красная Freedom",
|
||
"type": "variant",
|
||
"count": 3
|
||
}
|
||
]
|
||
"""
|
||
query = request.GET.get('q', '').strip()
|
||
search_type = request.GET.get('type', 'all')
|
||
|
||
if not query or len(query) < 2:
|
||
return JsonResponse({'results': []})
|
||
|
||
results = []
|
||
|
||
# Поиск товаров
|
||
if search_type in ['all', 'product']:
|
||
products = Product.objects.filter(
|
||
models.Q(name__icontains=query) |
|
||
models.Q(sku__icontains=query) |
|
||
models.Q(description__icontains=query),
|
||
is_active=True
|
||
).values('id', 'name', 'sku', 'sale_price')[:10]
|
||
|
||
for product in products:
|
||
results.append({
|
||
'id': product['id'],
|
||
'name': f"{product['name']} ({product['sku']})",
|
||
'sku': product['sku'],
|
||
'type': 'product',
|
||
'price': str(product['sale_price'])
|
||
})
|
||
|
||
# Поиск групп вариантов
|
||
if search_type in ['all', 'variant']:
|
||
variants = ProductVariantGroup.objects.filter(
|
||
models.Q(name__icontains=query) |
|
||
models.Q(description__icontains=query)
|
||
).prefetch_related('products')[:10]
|
||
|
||
for variant in variants:
|
||
count = variant.products.filter(is_active=True).count()
|
||
results.append({
|
||
'id': variant.id,
|
||
'name': f"{variant.name} ({count} вариантов)",
|
||
'type': 'variant',
|
||
'count': count
|
||
})
|
||
|
||
return JsonResponse({'results': results})
|