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:
@@ -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'
|
||||
})
|
||||
|
||||
|
||||
Reference in New Issue
Block a user