[FIX] website_sale_aplicoop: invalidate stale carts on closed group orders
This commit is contained in:
parent
89c008441e
commit
c345699bf4
4 changed files with 329 additions and 23 deletions
|
|
@ -1372,6 +1372,21 @@ class AplicoopWebsiteSale(WebsiteSale):
|
|||
raise ValueError(f"Invalid JSON: {str(e)}") from e
|
||||
return data
|
||||
|
||||
def _build_group_order_unavailable_response(self, group_order, status=403):
|
||||
"""Build a consistent JSON response when a group order is not open."""
|
||||
return request.make_response(
|
||||
json.dumps(
|
||||
{
|
||||
"error": request.env._("Order is not available"),
|
||||
"code": "group_order_not_open",
|
||||
"order_state": group_order.state if group_order else False,
|
||||
"action": "clear_cart",
|
||||
}
|
||||
),
|
||||
[("Content-Type", "application/json")],
|
||||
status=status,
|
||||
)
|
||||
|
||||
def _find_recent_draft_order(self, partner_id, order_id):
|
||||
"""Find most recent draft sale.order for partner and group_order in current week.
|
||||
|
||||
|
|
@ -2018,6 +2033,66 @@ class AplicoopWebsiteSale(WebsiteSale):
|
|||
"website_sale_aplicoop.eskaera_checkout", template_context
|
||||
)
|
||||
|
||||
@http.route(
|
||||
["/eskaera/check-status"],
|
||||
type="http",
|
||||
auth="user",
|
||||
website=True,
|
||||
methods=["POST"],
|
||||
csrf=False,
|
||||
)
|
||||
def check_group_order_status(self, **post):
|
||||
"""Return status information for a group.order.
|
||||
|
||||
Intended for frontend proactive cart invalidation when the order
|
||||
changed state between visits.
|
||||
"""
|
||||
try:
|
||||
data = self._decode_json_body()
|
||||
except ValueError as e:
|
||||
return request.make_response(
|
||||
json.dumps({"error": str(e)}),
|
||||
[("Content-Type", "application/json")],
|
||||
status=400,
|
||||
)
|
||||
|
||||
order_id = data.get("order_id")
|
||||
if not order_id:
|
||||
return request.make_response(
|
||||
json.dumps({"error": "order_id is required"}),
|
||||
[("Content-Type", "application/json")],
|
||||
status=400,
|
||||
)
|
||||
|
||||
try:
|
||||
order_id = int(order_id)
|
||||
except (TypeError, ValueError):
|
||||
return request.make_response(
|
||||
json.dumps({"error": f"Invalid order_id format: {order_id}"}),
|
||||
[("Content-Type", "application/json")],
|
||||
status=400,
|
||||
)
|
||||
|
||||
group_order = request.env["group.order"].sudo().browse(order_id)
|
||||
if not group_order.exists():
|
||||
return request.make_response(
|
||||
json.dumps({"error": f"Order {order_id} not found"}),
|
||||
[("Content-Type", "application/json")],
|
||||
status=404,
|
||||
)
|
||||
|
||||
response_data = {
|
||||
"success": True,
|
||||
"order_id": group_order.id,
|
||||
"state": group_order.state,
|
||||
"is_open": group_order.state == "open",
|
||||
"action": "clear_cart" if group_order.state != "open" else "none",
|
||||
}
|
||||
return request.make_response(
|
||||
json.dumps(response_data),
|
||||
[("Content-Type", "application/json")],
|
||||
)
|
||||
|
||||
@http.route(
|
||||
["/eskaera/save-cart"],
|
||||
type="http",
|
||||
|
|
@ -2068,6 +2143,9 @@ class AplicoopWebsiteSale(WebsiteSale):
|
|||
status=400,
|
||||
)
|
||||
|
||||
if group_order.state != "open":
|
||||
return self._build_group_order_unavailable_response(group_order)
|
||||
|
||||
current_user = request.env.user
|
||||
if not current_user.partner_id:
|
||||
return request.make_response(
|
||||
|
|
@ -2188,6 +2266,9 @@ class AplicoopWebsiteSale(WebsiteSale):
|
|||
status=400,
|
||||
)
|
||||
|
||||
if group_order.state != "open":
|
||||
return self._build_group_order_unavailable_response(group_order)
|
||||
|
||||
current_user = request.env.user
|
||||
if not current_user.partner_id:
|
||||
return request.make_response(
|
||||
|
|
@ -2343,6 +2424,9 @@ class AplicoopWebsiteSale(WebsiteSale):
|
|||
status=400,
|
||||
)
|
||||
|
||||
if group_order.state != "open":
|
||||
return self._build_group_order_unavailable_response(group_order)
|
||||
|
||||
current_user = request.env.user
|
||||
|
||||
# Validate that the user has a partner_id
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue