Обновили шапку и вывод всехтоваров. Добавили фильтры

This commit is contained in:
2025-10-22 15:49:59 +03:00
parent d78c43d9a9
commit 85801c6c4a
13 changed files with 1849 additions and 1219 deletions

View File

@@ -0,0 +1,78 @@
"""
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})