[ADD] website_sale_disable_cart: extract cart restriction from website_sale_aplicoop

The "shop as a read-only catalog" behaviour lived inside website_sale_aplicoop,
so every site that wanted the eskaera flow also lost the standard cart. It now
ships as its own installable addon, with the redirect target configurable
instead of hardcoded to /eskaera.

- website_sale_disable_cart: hides the cart UI (12 header styles + the product
  card quick-add) and overrides the standard cart endpoints. Redirect URL is
  configurable in Website settings (default /shop); only site-internal paths are
  accepted, so a misconfigured value cannot turn the shop into an open redirect
  nor loop back into a disabled route.
- Fixes carried over from the original code: /shop/cart/quantity is the Odoo 18
  path (it was /shop/cart_quantity, which never matched), the boxed, sidebar and
  sales two/three/four headers were not covered (the cart link stayed visible on
  them), and the routes now override the standard methods instead of registering
  duplicate ones.
- website_sale_aplicoop 18.0.1.12.0: drops the view file and the four redirect
  routes; installing it no longer touches the standard shop.

Upgrade order matters: update website_sale_aplicoop first, then install
website_sale_disable_cart in a second Odoo run — both use the same XPaths and
obsolete records are only cleaned up at the end of a run.

Tests: 8/8 in website_sale_disable_cart, aplicoop unaffected (its 2 failures
predate this change). Verified live on a DB clone: /shop/cart returns 303 to the
configured URL and no cart markup remains on /shop.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
GitHub Copilot 2026-08-06 11:34:59 +02:00
parent 73660ee226
commit f2194c5367
28 changed files with 733 additions and 91 deletions

View file

@ -2457,50 +2457,3 @@ class AplicoopWebsiteSale(WebsiteSale):
"empty_cart": "Your cart is empty",
"added_to_cart": "added to cart",
}
# ================================================================
# CART REDIRECT METHODS - Redirect /shop/cart routes to /eskaera
# ================================================================
@http.route(["/shop/cart"], type="http", auth="public", website=True)
def cart_redirect(self, access_token=None, revive="", **post):
"""Redirect /shop/cart to /eskaera (no standard cart)."""
_logger.info("🛒 Redirecting /shop/cart → /eskaera")
return http.redirect_with_hash("/eskaera")
@http.route(
["/shop/cart/update"],
type="http",
auth="public",
website=True,
methods=["POST"],
)
def cart_update_redirect(self, **post):
"""Redirect /shop/cart/update to /eskaera (no standard cart)."""
_logger.info("🛒 Redirecting /shop/cart/update → /eskaera")
return http.redirect_with_hash("/eskaera")
@http.route(
["/shop/cart/update_json"],
type="http",
auth="public",
website=True,
methods=["POST"],
csrf=False,
)
def cart_update_json_redirect(self, **post):
"""Redirect /shop/cart/update_json to /eskaera (no standard cart)."""
_logger.info("🛒 Redirecting /shop/cart/update_json → /eskaera")
return http.redirect_with_hash("/eskaera")
@http.route(
["/shop/cart_quantity"],
type="http",
auth="public",
website=True,
methods=["GET"],
)
def cart_quantity_redirect(self):
"""Redirect /shop/cart_quantity to /eskaera (no standard cart)."""
_logger.info("🛒 Redirecting /shop/cart_quantity → /eskaera")
return http.redirect_with_hash("/eskaera")