[IMP] website_sale_aplicoop: readable slug in the group order URL

Group order pages were published under their database id (`/eskaera/1`), which
says nothing to the member opening the link. `group.order` gains a `slug` field
and the public pages move to `/eskaera/<slug>` (e.g. `/eskaera/escola-fructuos`).

The slug is generated from the order name on creation, is unique, and can be
edited under the name on the form; emptying it regenerates it from the current
name. Values that would make the order unreachable are rejected: a plain number
(the legacy numeric URLs win that match) and the static routes served under
`/eskaera/` (`labels`, `save-order`, `i18n`, ...).

`/eskaera/<id>` and `/eskaera/<id>/checkout` are kept as redirects to their slug
URL, so the links already shared with members keep working. The AJAX endpoints
(`load-page`, `save-order`, `confirm`, ...) stay numeric: they never show up in
the address bar. Consequently the frontend now reads the order id from the
`data-order-id` attribute only, as the URL no longer carries it.

The post-migration script fills the slug of the orders that already existed.

Renaming the `/eskaera` prefix itself (`/escolas` for a schools deployment)
needs no code: a *308 Redirect / Rewrite* rule per public route in Website >
Configuration > Redirects serves the pages on the new prefix, rewrites the
links in the templates and redirects the old URLs, per website. Documented in
`readme/CONFIGURE.rst`.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
GitHub Copilot 2026-08-11 16:49:54 +02:00
parent 2b1cabbb43
commit 23edee6154
14 changed files with 463 additions and 28 deletions

View file

@ -0,0 +1,30 @@
"""Backfill the URL slug of consumer group orders created before this version.
Public pages moved from /eskaera/<id> to /eskaera/<slug>. Orders that already
existed have no slug yet, so they would not be reachable until saved again.
Generate one from their name, keeping it unique.
"""
import logging
from odoo import SUPERUSER_ID
from odoo import api
_logger = logging.getLogger(__name__)
def migrate(cr, version):
if not version:
return
env = api.Environment(cr, SUPERUSER_ID, {})
orders = env["group.order"].search([("slug", "=", False)], order="id")
for order in orders:
order.slug = order._generate_unique_slug(order.name)
if orders:
_logger.info(
"Generated URL slugs for %d consumer group orders: %s",
len(orders),
", ".join(orders.mapped("slug")),
)