From b39602955476c23187b27864f4e4f6038d4aa261 Mon Sep 17 00:00:00 2001 From: Andrey Smakotin Date: Thu, 11 Dec 2025 22:05:15 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=20=D0=B2=D0=BE=D1=81=D1=81=D1=82=D0=B0=D0=BD?= =?UTF-8?q?=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=80=D0=B8=D0=BD=D0=BD=D1=8B=D1=85=20=D0=BA=D0=BE=D0=BC=D0=BF?= =?UTF-8?q?=D0=BB=D0=B5=D0=BA=D1=82=D0=BE=D0=B2=20=D0=B8=D0=B7=20=D0=BA?= =?UTF-8?q?=D0=BE=D1=80=D0=B7=D0=B8=D0=BD=D1=8B=20=D0=BF=D1=80=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7?= =?UTF-8?q?=D0=BA=D0=B5=20=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Проблема: Витринные букеты исчезали из корзины после перезагрузки страницы, но оставались заблокированными на пользователя через ShowcaseItem. Решение: - Изменена валидация корзины при загрузке из Redis - Теперь проверяется наличие showcase_item_ids в данных корзины - Блокировки валидируются через ShowcaseItem (не Reservation) - Проверяется: status='in_cart', locked_by_user, cart_lock_expires_at > now() - Обновляется qty на актуальное количество действующих блокировок - Если ни один ShowcaseItem не заблокирован - не восстанавливается в корзину Теперь витринные букеты корректно восстанавливаются при перезагрузке и автоматически удаляются из корзины при истечении блокировки. --- myproject/pos/views.py | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/myproject/pos/views.py b/myproject/pos/views.py index 0c5ec48..3fe6649 100644 --- a/myproject/pos/views.py +++ b/myproject/pos/views.py @@ -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: - cart_data[cart_key] = item - # Если блокировка истекла - не добавляем в корзину (товар доступен другим) + 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