Исправлено восстановление витринных комплектов из корзины при перезагрузке страницы
Проблема: Витринные букеты исчезали из корзины после перезагрузки страницы, но оставались заблокированными на пользователя через 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:
|
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
|
||||||
|
|||||||
Reference in New Issue
Block a user