Исправлено восстановление витринных комплектов из корзины при перезагрузке страницы
Проблема: Витринные букеты исчезали из корзины после перезагрузки страницы, но оставались заблокированными на пользователя через 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:
@@ -212,6 +212,7 @@ def pos_terminal(request):
|
||||
if cached_cart_data:
|
||||
# Валидируем товары и комплекты в корзине
|
||||
from products.models import Product, ProductKit
|
||||
from inventory.models import ShowcaseItem
|
||||
|
||||
for cart_key, item in cached_cart_data.items():
|
||||
try:
|
||||
@@ -227,17 +228,28 @@ def pos_terminal(request):
|
||||
# Витринный комплект - проверяем существование И актуальность блокировки
|
||||
kit = ProductKit.objects.get(id=item['id'])
|
||||
|
||||
# Проверяем, что блокировка всё ещё активна для этого пользователя
|
||||
has_valid_lock = Reservation.objects.filter(
|
||||
product_kit=kit,
|
||||
locked_by_user=request.user,
|
||||
cart_lock_expires_at__gt=timezone.now(),
|
||||
status='reserved'
|
||||
).exists()
|
||||
# Получаем showcase_item_ids из корзины (если есть)
|
||||
showcase_item_ids = item.get('showcase_item_ids', [])
|
||||
|
||||
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
|
||||
# Если блокировка истекла - не добавляем в корзину (товар доступен другим)
|
||||
# Если ни один не заблокирован - не добавляем в корзину
|
||||
# Если showcase_item_ids отсутствует - не добавляем (устаревший формат)
|
||||
except (Product.DoesNotExist, ProductKit.DoesNotExist):
|
||||
# Товар или комплект удален - пропускаем
|
||||
continue
|
||||
|
||||
Reference in New Issue
Block a user