refactor: Добавить в_stock в API и улучшить загрузку данных в форме вариантов

Изменения в API:
- Добавить поле in_stock в возвращаемые данные товаров
- Добавить поддержку запроса товара по ID (параметр ?id=) для получения актуальных данных
- Исправить дублирование информации одного товара на остальные в таблице вариантов

Изменения в форме:
- Добавить автоматическую загрузку данных товара при загрузке страницы для существующих строк
- Правильно отображать артикул, цену и наличие для каждого товара в группе

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-10-30 00:03:40 +03:00
parent e821d881a9
commit dbb94e9d2a
2 changed files with 94 additions and 40 deletions

View File

@@ -15,6 +15,7 @@ def search_products_and_variants(request):
Параметры GET:
- q: строка поиска (term в Select2)
- id: ID товара для получения его данных
- type: 'product' или 'variant' (опционально)
- page: номер страницы для пагинации (по умолчанию 1)
@@ -25,7 +26,8 @@ def search_products_and_variants(request):
"id": 1,
"text": "Роза красная Freedom 50см (PROD-000001)",
"sku": "PROD-000001",
"price": "150.00"
"price": "150.00",
"in_stock": true
}
],
"pagination": {
@@ -33,6 +35,25 @@ def search_products_and_variants(request):
}
}
"""
# Если передан ID товара - получаем его данные напрямую
product_id = request.GET.get('id', '').strip()
if product_id:
try:
product = Product.objects.get(id=int(product_id), is_active=True)
return JsonResponse({
'results': [{
'id': product.id,
'text': f"{product.name} ({product.sku})" if product.sku else product.name,
'sku': product.sku,
'price': str(product.sale_price) if product.sale_price else None,
'in_stock': product.in_stock,
'type': 'product'
}],
'pagination': {'more': False}
})
except (Product.DoesNotExist, ValueError):
return JsonResponse({'results': [], 'pagination': {'more': False}})
query = request.GET.get('q', '').strip()
search_type = request.GET.get('type', 'all')
page = int(request.GET.get('page', 1))
@@ -53,7 +74,7 @@ def search_products_and_variants(request):
# Показываем последние добавленные активные товары
products = Product.objects.filter(is_active=True)\
.order_by('-created_at')[:page_size]\
.values('id', 'name', 'sku', 'sale_price')
.values('id', 'name', 'sku', 'sale_price', 'in_stock')
for product in products:
text = product['name']
@@ -64,7 +85,8 @@ def search_products_and_variants(request):
'id': product['id'],
'text': text,
'sku': product['sku'],
'price': str(product['sale_price']) if product['sale_price'] else None
'price': str(product['sale_price']) if product['sale_price'] else None,
'in_stock': product['in_stock']
})
response_data = {
@@ -125,7 +147,7 @@ def search_products_and_variants(request):
start = (page - 1) * page_size
end = start + page_size
products = products_query[start:end].values('id', 'name', 'sku', 'sale_price')
products = products_query[start:end].values('id', 'name', 'sku', 'sale_price', 'in_stock')
for product in products:
text = product['name']
@@ -137,6 +159,7 @@ def search_products_and_variants(request):
'text': text,
'sku': product['sku'],
'price': str(product['sale_price']) if product['sale_price'] else None,
'in_stock': product['in_stock'],
'type': 'product'
})