Скрыты временные комплекты из каталога и поиска

Views:
- ProductKitListView: фильтр is_temporary=False
- CombinedProductListView: фильтр is_temporary=False для комплектов
- API search: фильтр is_temporary=False в поиске и популярных

Admin:
- Добавлен фильтр по is_temporary
- Добавлено отображение статуса временного комплекта в списке
- Добавлена ссылка на заказ для временных комплектов
- Добавлен раздел "Временный комплект" в fieldsets

Теперь временные комплекты не показываются в общем каталоге,
но доступны в админке и по прямой ссылке (для заказов).

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-08 15:00:25 +03:00
parent 7b78ad2a6e
commit ea4bb5a43b
4 changed files with 32 additions and 11 deletions

View File

@@ -83,6 +83,8 @@ def search_products_and_variants(request):
'pagination': {'more': False}
})
elif item_type == 'kit':
# Для комплектов: временные комплекты можно получать по ID (для заказов)
# но не показываем их в общем поиске
kit = ProductKit.objects.get(id=numeric_id, is_active=True)
return JsonResponse({
'results': [{
@@ -91,7 +93,8 @@ def search_products_and_variants(request):
'sku': kit.sku,
'price': str(kit.price) if kit.price else None,
'actual_price': str(kit.actual_price) if kit.actual_price else '0',
'type': 'kit'
'type': 'kit',
'is_temporary': kit.is_temporary
}],
'pagination': {'more': False}
})
@@ -142,8 +145,8 @@ def search_products_and_variants(request):
})
if search_type in ['all', 'kit']:
# Показываем последние добавленные активные комплекты
kits = ProductKit.objects.filter(is_active=True)\
# Показываем последние добавленные активные комплекты (только постоянные)
kits = ProductKit.objects.filter(is_active=True, is_temporary=False)\
.order_by('-created_at')[:page_size]\
.values('id', 'name', 'sku', 'price', 'sale_price')
@@ -270,7 +273,7 @@ def search_products_and_variants(request):
# Поиск комплектов
if search_type in ['all', 'kit']:
# Используем аналогичную логику для комплектов
# Используем аналогичную логику для комплектов (только постоянные)
if 'sqlite' in settings.DATABASES['default']['ENGINE']:
from django.db.models.functions import Lower
query_lower = query_normalized.lower()
@@ -283,7 +286,8 @@ def search_products_and_variants(request):
models.Q(name_lower__contains=query_lower) |
models.Q(sku_lower__contains=query_lower) |
models.Q(description_lower__contains=query_lower),
is_active=True
is_active=True,
is_temporary=False
).annotate(
relevance=Case(
When(name_lower=query_lower, then=3),
@@ -297,7 +301,8 @@ def search_products_and_variants(request):
models.Q(name__icontains=query_normalized) |
models.Q(sku__icontains=query_normalized) |
models.Q(description__icontains=query_normalized),
is_active=True
is_active=True,
is_temporary=False
).annotate(
relevance=Case(
When(name__iexact=query_normalized, then=3),