Исправлено восстановление витринных комплектов из корзины при перезагрузке страницы

Проблема: Витринные букеты исчезали из корзины после перезагрузки страницы,
но оставались заблокированными на пользователя через ShowcaseItem.

Решение:
- Изменена валидация корзины при загрузке из Redis
- Теперь проверяется наличие showcase_item_ids в данных корзины
- Блокировки валидируются через ShowcaseItem (не Reservation)
- Проверяется: status='in_cart', locked_by_user, cart_lock_expires_at > now()
- Обновляется qty на актуальное количество действующих блокировок
- Если ни один ShowcaseItem не заблокирован - не восстанавливается в корзину

Теперь витринные букеты корректно восстанавливаются при перезагрузке
и автоматически удаляются из корзины при истечении блокировки.
This commit is contained in:
2025-12-11 22:05:15 +03:00
parent 65ffed2f9b
commit b396029554

View File

@@ -212,6 +212,7 @@ def pos_terminal(request):
if cached_cart_data: if cached_cart_data:
# Валидируем товары и комплекты в корзине # Валидируем товары и комплекты в корзине
from products.models import Product, ProductKit from products.models import Product, ProductKit
from inventory.models import ShowcaseItem
for cart_key, item in cached_cart_data.items(): for cart_key, item in cached_cart_data.items():
try: try:
@@ -227,17 +228,28 @@ def pos_terminal(request):
# Витринный комплект - проверяем существование И актуальность блокировки # Витринный комплект - проверяем существование И актуальность блокировки
kit = ProductKit.objects.get(id=item['id']) kit = ProductKit.objects.get(id=item['id'])
# Проверяем, что блокировка всё ещё активна для этого пользователя # Получаем showcase_item_ids из корзины (если есть)
has_valid_lock = Reservation.objects.filter( showcase_item_ids = item.get('showcase_item_ids', [])
product_kit=kit,
locked_by_user=request.user,
cart_lock_expires_at__gt=timezone.now(),
status='reserved'
).exists()
if has_valid_lock: if showcase_item_ids:
# Проверяем, что все указанные ShowcaseItem заблокированы на текущего пользователя
locked_items = ShowcaseItem.objects.filter(
id__in=showcase_item_ids,
product_kit=kit,
status='in_cart',
locked_by_user=request.user,
cart_lock_expires_at__gt=timezone.now()
)
locked_count = locked_items.count()
if locked_count > 0:
# Обновляем количество на актуальное (на случай если часть блокировок истекла)
item['qty'] = locked_count
item['showcase_item_ids'] = list(locked_items.values_list('id', flat=True))
cart_data[cart_key] = item cart_data[cart_key] = item
# Если блокировка истекла - не добавляем в корзину (товар доступен другим) # Если ни один не заблокирован - не добавляем в корзину
# Если showcase_item_ids отсутствует - не добавляем (устаревший формат)
except (Product.DoesNotExist, ProductKit.DoesNotExist): except (Product.DoesNotExist, ProductKit.DoesNotExist):
# Товар или комплект удален - пропускаем # Товар или комплект удален - пропускаем
continue continue