diff --git a/myproject/inventory/signals.py b/myproject/inventory/signals.py index 678bdaf..a92d1a0 100644 --- a/myproject/inventory/signals.py +++ b/myproject/inventory/signals.py @@ -456,13 +456,18 @@ def rollback_sale_on_status_change(sender, instance, created, **kwargs): if showcase_count > 0: for reservation in showcase_kit_reservations: reservation.status = 'reserved' + # Очищаем блокировки корзины при отмене заказа + reservation.order_item = None + reservation.cart_lock_expires_at = None + reservation.locked_by_user = None + reservation.cart_session_id = None # Не трогаем showcase и product_kit - они остаются привязанными # converted_at оставляем (для истории) - reservation.save(update_fields=['status']) + reservation.save(update_fields=['status', 'order_item', 'cart_lock_expires_at', 'locked_by_user', 'cart_session_id']) logger.info( f"✓ Обновлено {showcase_count} резервов витринных комплектов: " - f"converted_to_sale → reserved (возвращены на витрину)" + f"converted_to_sale → reserved (возвращены на витрину, блокировки сняты)" ) else: logger.warning( @@ -588,8 +593,16 @@ def release_reservations_on_cancellation(sender, instance, created, **kwargs): ) if showcase_count > 0: + # Для витринных комплектов очищаем блокировки корзины + for reservation in showcase_kit_reservations: + reservation.order_item = None + reservation.cart_lock_expires_at = None + reservation.locked_by_user = None + reservation.cart_session_id = None + reservation.save(update_fields=['order_item', 'cart_lock_expires_at', 'locked_by_user', 'cart_session_id']) + logger.info( - f"ℹ️ Найдено {showcase_count} резервов витринных комплектов - остаются в reserved (на витрине)" + f"ℹ️ Найдено {showcase_count} резервов витринных комплектов - остаются в reserved (на витрине, блокировки сняты)" ) if normal_count == 0 and showcase_count == 0: @@ -728,10 +741,13 @@ def release_stock_on_order_delete(sender, instance, **kwargs): res.released_at = timezone.now() res.save() - # Витринные комплекты остаются зарезервированными, но отвязываем их от заказа + # Витринные комплекты остаются зарезервированными, но отвязываем их от заказа и снимаем блокировки for res in showcase_reservations: res.order_item = None - res.save(update_fields=['order_item']) + res.cart_lock_expires_at = None + res.locked_by_user = None + res.cart_session_id = None + res.save(update_fields=['order_item', 'cart_lock_expires_at', 'locked_by_user', 'cart_session_id']) transaction.on_commit(release_reservations)