[FIX] website_sale_aplicoop: clear cart when group order cutoff has passed
Previously, when a user reopened a group order whose cutoff day had already passed, the /eskaera/check-status response correctly triggered the localStorage cart clear, but _autoLoadDraftOnInit immediately re-fetched the previous cycle's draft sale.order from /eskaera/load-draft (which only guarded on group_order.state, not cutoff_date) and the stale items reappeared in the cart, confusing users. Add a cutoff_date < today guard to load_draft_cart so the endpoint returns the existing clear_cart unavailable response, and short-circuit _autoLoadDraftOnInit on the frontend via a _skipDraftAutoLoad flag set in _checkGroupOrderStatus to avoid the now-pointless XHR round trip. Covered by a new regression test in tests/test_group_order_status_endpoint.py. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
parent
98ffcdaefb
commit
b01794c319
3 changed files with 43 additions and 1 deletions
|
|
@ -1558,7 +1558,11 @@ class AplicoopWebsiteSale(WebsiteSale):
|
||||||
status=400,
|
status=400,
|
||||||
)
|
)
|
||||||
|
|
||||||
if group_order.state != "open":
|
cutoff_passed = bool(
|
||||||
|
group_order.cutoff_date
|
||||||
|
and group_order.cutoff_date < fields.Date.today()
|
||||||
|
)
|
||||||
|
if group_order.state != "open" or cutoff_passed:
|
||||||
return self._build_group_order_unavailable_response(group_order)
|
return self._build_group_order_unavailable_response(group_order)
|
||||||
|
|
||||||
current_user = request.env.user
|
current_user = request.env.user
|
||||||
|
|
|
||||||
|
|
@ -117,6 +117,11 @@
|
||||||
console.log("Attempting to auto-load draft order...");
|
console.log("Attempting to auto-load draft order...");
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
|
if (this._skipDraftAutoLoad) {
|
||||||
|
console.log("Auto-load draft skipped (order closed or cutoff passed)");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Only auto-load if cart is empty
|
// Only auto-load if cart is empty
|
||||||
var cartItemsCount = Object.keys(this.cart).length;
|
var cartItemsCount = Object.keys(this.cart).length;
|
||||||
if (cartItemsCount > 0) {
|
if (cartItemsCount > 0) {
|
||||||
|
|
@ -506,6 +511,7 @@
|
||||||
shouldClear = true;
|
shouldClear = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
self._skipDraftAutoLoad = shouldClear;
|
||||||
if (shouldClear) {
|
if (shouldClear) {
|
||||||
console.log(
|
console.log(
|
||||||
"[groupOrderShop] check-status: clearing cart (reason:",
|
"[groupOrderShop] check-status: clearing cart (reason:",
|
||||||
|
|
|
||||||
|
|
@ -102,6 +102,38 @@ class TestGroupOrderStatusEndpoint(TransactionCase):
|
||||||
self.assertEqual(data["state"], "closed")
|
self.assertEqual(data["state"], "closed")
|
||||||
self.assertEqual(data["action"], "clear_cart")
|
self.assertEqual(data["action"], "clear_cart")
|
||||||
|
|
||||||
|
def test_load_draft_endpoint_rejects_when_cutoff_passed(self):
|
||||||
|
"""/eskaera/load-draft must refuse to load drafts when cutoff_date is in
|
||||||
|
the past, even if the group.order is still in 'open' state.
|
||||||
|
|
||||||
|
Regression: previously the endpoint only checked group_order.state, so
|
||||||
|
when cutoff had passed the previous cycle's draft was returned and
|
||||||
|
repopulated the cart on the next page load.
|
||||||
|
"""
|
||||||
|
# Force cutoff_date into the past. The @api.depends compute always
|
||||||
|
# rolls forward to the next occurrence, so we have to write directly
|
||||||
|
# to the stored field to simulate a stale cycle.
|
||||||
|
past = fields.Date.today() - timedelta(days=1)
|
||||||
|
self.group_order.sudo().write({"cutoff_date": past})
|
||||||
|
# Sanity: state remains open; only cutoff is stale.
|
||||||
|
self.assertEqual(self.group_order.state, "open")
|
||||||
|
self.assertLess(self.group_order.cutoff_date, fields.Date.today())
|
||||||
|
|
||||||
|
payload = {"order_id": self.group_order.id}
|
||||||
|
request_mock = self._build_request_mock(payload)
|
||||||
|
|
||||||
|
with patch(
|
||||||
|
"odoo.addons.website_sale_aplicoop.controllers.website_sale.request",
|
||||||
|
request_mock,
|
||||||
|
):
|
||||||
|
response = self.controller.load_draft_cart.__wrapped__(self.controller)
|
||||||
|
|
||||||
|
data = json.loads(response.data.decode("utf-8"))
|
||||||
|
self.assertEqual(response.status, 403)
|
||||||
|
self.assertEqual(data.get("code"), "group_order_not_open")
|
||||||
|
self.assertEqual(data.get("action"), "clear_cart")
|
||||||
|
self.assertNotIn("items", data)
|
||||||
|
|
||||||
def test_save_order_endpoint_rejects_closed_group_order(self):
|
def test_save_order_endpoint_rejects_closed_group_order(self):
|
||||||
"""/eskaera/save-order must reject closed group order with clear_cart action."""
|
"""/eskaera/save-order must reject closed group order with clear_cart action."""
|
||||||
self.group_order.action_close()
|
self.group_order.action_close()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue