From 16da08ff0578ac207bdc98432b3545ddb2ac7f56 Mon Sep 17 00:00:00 2001 From: giles Date: Sat, 28 Feb 2026 13:58:05 +0000 Subject: [PATCH] Fix market and calendar URL routing Market: blog links now use market_url('/{slug}/') instead of events_url('/{slug}/markets/'), matching the market service's actual route structure ///. Calendar: flatten route from //calendars// to /// by changing the events app blueprint prefix and moving listing routes to explicit /calendars/ paths. Update all hardcoded calendar URL paths across blog and events services (Python + Jinja templates). Co-Authored-By: Claude Opus 4.6 --- blog/sexp/sexp_components.py | 21 +++++++++++-------- blog/templates/_types/post/_entry_items.html | 2 +- blog/templates/_types/post/admin/_nav.html | 6 +++--- .../_types/post/admin/_nav_entries_oob.html | 4 ++-- .../_types/post_data/header/_header.html | 2 +- events/app.py | 5 +++-- events/bp/calendars/routes.py | 4 ++-- events/bp/fragments/routes.py | 4 ++-- events/sexp/sexp_components.py | 8 +++---- events/templates/_types/all_events/_card.html | 2 +- .../_types/all_events/_card_tile.html | 2 +- .../templates/_types/page_summary/_card.html | 2 +- .../_types/page_summary/_card_tile.html | 2 +- events/templates/_types/post/admin/_nav.html | 6 +++--- .../_types/post/admin/_nav_entries_oob.html | 4 ++-- .../fragments/container_cards_entries.html | 2 +- 16 files changed, 40 insertions(+), 36 deletions(-) diff --git a/blog/sexp/sexp_components.py b/blog/sexp/sexp_components.py index 948bdc2..83ac832 100644 --- a/blog/sexp/sexp_components.py +++ b/blog/sexp/sexp_components.py @@ -165,15 +165,18 @@ def _post_admin_nav_html(ctx: dict) -> str: parts = [] - # External links to events service + # External links to events / market services events_url_fn = ctx.get("events_url") + market_url_fn = ctx.get("market_url") if callable(events_url_fn): - for path, label in [ - (f"/{slug}/calendars/", "calendars"), - (f"/{slug}/markets/", "markets"), - (f"/{slug}/payments/", "payments"), + for url_fn, path, label in [ + (events_url_fn, f"/{slug}/calendar/", "calendar"), + (market_url_fn, f"/{slug}/", "markets"), + (events_url_fn, f"/{slug}/payments/", "payments"), ]: - href = events_url_fn(path) + if not callable(url_fn): + continue + href = url_fn(path) parts.append(sexp( '(div :class "relative nav-group" (a :href h :class c l))', h=href, c=nav_btn, l=label, @@ -2573,7 +2576,7 @@ def render_nav_entries_oob(associated_entries, calendars, post: dict, ctx: dict if e_start: entry_path = ( - f"/{post_slug}/calendars/{cal_slug}/" + f"/{post_slug}/{cal_slug}/" f"{e_start.year}/{e_start.month}/{e_start.day}" f"/entries/{getattr(entry, 'id', '')}/" ) @@ -2581,7 +2584,7 @@ def render_nav_entries_oob(associated_entries, calendars, post: dict, ctx: dict if e_end: date_str += f" \u2013 {e_end.strftime('%H:%M')}" else: - entry_path = f"/{post_slug}/calendars/{cal_slug}/" + entry_path = f"/{post_slug}/{cal_slug}/" date_str = "" href = events_url_fn(entry_path) if events_url_fn else entry_path @@ -2599,7 +2602,7 @@ def render_nav_entries_oob(associated_entries, calendars, post: dict, ctx: dict for calendar in (calendars or []): cal_name = getattr(calendar, "name", "") cal_slug = getattr(calendar, "slug", "") - cal_path = f"/{post_slug}/calendars/{cal_slug}/" + cal_path = f"/{post_slug}/{cal_slug}/" href = events_url_fn(cal_path) if events_url_fn else cal_path item_parts.append(sexp( diff --git a/blog/templates/_types/post/_entry_items.html b/blog/templates/_types/post/_entry_items.html index d221e85..e671368 100644 --- a/blog/templates/_types/post/_entry_items.html +++ b/blog/templates/_types/post/_entry_items.html @@ -4,7 +4,7 @@ {% set has_more_entries = has_more if has_more is defined else (associated_entries.has_more if associated_entries is defined else False) %} {% for entry in entry_list %} - {% set _entry_path = '/' + post.slug + '/calendars/' + entry.calendar_slug + '/' + entry.start_at.year|string + '/' + entry.start_at.month|string + '/' + entry.start_at.day|string + '/entries/' + entry.id|string + '/' %} + {% set _entry_path = '/' + post.slug + '/' + entry.calendar_slug + '/' + entry.start_at.year|string + '/' + entry.start_at.month|string + '/' + entry.start_at.day|string + '/entries/' + entry.id|string + '/' %} - - calendars + + calendar diff --git a/blog/templates/_types/post/admin/_nav_entries_oob.html b/blog/templates/_types/post/admin/_nav_entries_oob.html index 7a8b8d1..60199fc 100644 --- a/blog/templates/_types/post/admin/_nav_entries_oob.html +++ b/blog/templates/_types/post/admin/_nav_entries_oob.html @@ -5,7 +5,7 @@ {% call nav_entries_oob(has_items) %} {% if associated_entries and associated_entries.entries %} {% for entry in associated_entries.entries %} - {% set _entry_path = '/' + post.slug + '/calendars/' + entry.calendar_slug + '/' + entry.start_at.year|string + '/' + entry.start_at.month|string + '/' + entry.start_at.day|string + '/entries/' + entry.id|string + '/' %} + {% set _entry_path = '/' + post.slug + '/' +entry.calendar_slug + '/' + entry.start_at.year|string + '/' + entry.start_at.month|string + '/' + entry.start_at.day|string + '/entries/' + entry.id|string + '/' %} @@ -22,7 +22,7 @@ {% endif %} {% if calendars %} {% for calendar in calendars %} - {% set local_href=events_url('/' + post.slug + '/calendars/' + calendar.slug + '/') %} + {% set local_href=events_url('/' + post.slug + '/' +calendar.slug + '/') %} diff --git a/blog/templates/_types/post_data/header/_header.html b/blog/templates/_types/post_data/header/_header.html index 27eaf6f..d3cfee0 100644 --- a/blog/templates/_types/post_data/header/_header.html +++ b/blog/templates/_types/post_data/header/_header.html @@ -1,7 +1,7 @@ {% import 'macros/links.html' as links %} {% macro header_row(oob=False) %} {% call links.menu_row(id='post_data-row', oob=oob) %} - +
data
diff --git a/events/app.py b/events/app.py index 52c1031..cb5c082 100644 --- a/events/app.py +++ b/events/app.py @@ -90,10 +90,11 @@ def create_app() -> "Quart": url_prefix="/", ) - # Calendars nested under post slug: //calendars/... + # Calendars nested under post slug: ///... + # Listing stays at //calendars/, individual at /// app.register_blueprint( register_calendars(), - url_prefix="//calendars", + url_prefix="/", ) # Markets nested under post slug: //markets/... diff --git a/events/bp/calendars/routes.py b/events/bp/calendars/routes.py index 2bdd9e1..d46e2b5 100644 --- a/events/bp/calendars/routes.py +++ b/events/bp/calendars/routes.py @@ -32,7 +32,7 @@ def register(): # ---------- Pages ---------- - @bp.get("/") + @bp.get("/calendars/") @cache_page(tag="calendars") async def home(**kwargs): from shared.sexp.page import get_template_context @@ -46,7 +46,7 @@ def register(): return await make_response(html) - @bp.post("/new/") + @bp.post("/calendars/new/") @require_admin @clear_cache(tag="calendars", tag_scope="all") async def create_calendar(**kwargs): diff --git a/events/bp/fragments/routes.py b/events/bp/fragments/routes.py index 8d46096..43be5a5 100644 --- a/events/bp/fragments/routes.py +++ b/events/bp/fragments/routes.py @@ -58,7 +58,7 @@ def register(): ) for entry in entries: entry_path = ( - f"/{post_slug}/calendars/{entry.calendar_slug}/" + f"/{post_slug}/{entry.calendar_slug}/" f"{entry.start_at.year}/{entry.start_at.month}/" f"{entry.start_at.day}/entries/{entry.id}/" ) @@ -87,7 +87,7 @@ def register(): g.s, container_type, container_id, ) for cal in calendars: - href = events_url(f"/{post_slug}/calendars/{cal.slug}/") + href = events_url(f"/{post_slug}/{cal.slug}/") html_parts.append(render_sexp( '(~calendar-link-nav :href href :name name :nav-class nav-class)', href=href, name=cal.name, **{"nav-class": nav_class}, diff --git a/events/sexp/sexp_components.py b/events/sexp/sexp_components.py index 5694058..f80af3e 100644 --- a/events/sexp/sexp_components.py +++ b/events/sexp/sexp_components.py @@ -1250,7 +1250,7 @@ def _entry_card_html(entry, page_info: dict, pending_tickets: dict, day_href = "" if page_slug and entry.start_at: - day_href = events_url_fn(f"/{page_slug}/calendars/{entry.calendar_slug}/day/{entry.start_at.strftime('%Y/%-m/%-d')}/") + day_href = events_url_fn(f"/{page_slug}/{entry.calendar_slug}/day/{entry.start_at.strftime('%Y/%-m/%-d')}/") entry_href = f"{day_href}entries/{entry.id}/" if day_href else "" # Title (linked or plain) @@ -1332,7 +1332,7 @@ def _entry_card_tile_html(entry, page_info: dict, pending_tickets: dict, day_href = "" if page_slug and entry.start_at: - day_href = events_url_fn(f"/{page_slug}/calendars/{entry.calendar_slug}/day/{entry.start_at.strftime('%Y/%-m/%-d')}/") + day_href = events_url_fn(f"/{page_slug}/{entry.calendar_slug}/day/{entry.start_at.strftime('%Y/%-m/%-d')}/") entry_href = f"{day_href}entries/{entry.id}/" if day_href else "" # Title @@ -2762,7 +2762,7 @@ def render_post_nav_entries_oob(associated_entries, calendars, post) -> str: if has_entries: for entry in associated_entries.entries: entry_path = ( - f"/{slug}/calendars/{entry.calendar_slug}/" + f"/{slug}/{entry.calendar_slug}/" f"{entry.start_at.year}/{entry.start_at.month}/{entry.start_at.day}/" f"entries/{entry.id}/" ) @@ -2781,7 +2781,7 @@ def render_post_nav_entries_oob(associated_entries, calendars, post) -> str: if calendars: for cal in calendars: cs = getattr(cal, "slug", "") - local_href = events_url(f"/{slug}/calendars/{cs}/") + local_href = events_url(f"/{slug}/{cs}/") items += sexp( '(a :href lh :class nb' ' (i :class "fa fa-calendar" :aria-hidden "true")' diff --git a/events/templates/_types/all_events/_card.html b/events/templates/_types/all_events/_card.html index 0005563..7f6846a 100644 --- a/events/templates/_types/all_events/_card.html +++ b/events/templates/_types/all_events/_card.html @@ -7,7 +7,7 @@ {# Left: event info #}
{% if page_slug %} - {% set day_href = events_url('/' ~ page_slug ~ '/calendars/' ~ entry.calendar_slug ~ '/day/' ~ entry.start_at.strftime('%Y/%-m/%-d') ~ '/') %} + {% set day_href = events_url('/' ~ page_slug ~ '/' ~ entry.calendar_slug ~ '/day/' ~ entry.start_at.strftime('%Y/%-m/%-d') ~ '/') %} {% else %} {% set day_href = '' %} {% endif %} diff --git a/events/templates/_types/all_events/_card_tile.html b/events/templates/_types/all_events/_card_tile.html index 3f8855f..84a628f 100644 --- a/events/templates/_types/all_events/_card_tile.html +++ b/events/templates/_types/all_events/_card_tile.html @@ -4,7 +4,7 @@ {% set page_title = pi.get('title') %}
{% if page_slug %} - {% set day_href = events_url('/' ~ page_slug ~ '/calendars/' ~ entry.calendar_slug ~ '/day/' ~ entry.start_at.strftime('%Y/%-m/%-d') ~ '/') %} + {% set day_href = events_url('/' ~ page_slug ~ '/' ~ entry.calendar_slug ~ '/day/' ~ entry.start_at.strftime('%Y/%-m/%-d') ~ '/') %} {% else %} {% set day_href = '' %} {% endif %} diff --git a/events/templates/_types/page_summary/_card.html b/events/templates/_types/page_summary/_card.html index 27f12cb..3223d76 100644 --- a/events/templates/_types/page_summary/_card.html +++ b/events/templates/_types/page_summary/_card.html @@ -6,7 +6,7 @@
{# Left: event info #}
- {% set day_href = events_url('/' ~ page_slug ~ '/calendars/' ~ entry.calendar_slug ~ '/day/' ~ entry.start_at.strftime('%Y/%-m/%-d') ~ '/') %} + {% set day_href = events_url('/' ~ page_slug ~ '/' ~ entry.calendar_slug ~ '/day/' ~ entry.start_at.strftime('%Y/%-m/%-d') ~ '/') %} {% set entry_href = day_href ~ 'entries/' ~ entry.id ~ '/' %}

{{ entry.name }}

diff --git a/events/templates/_types/page_summary/_card_tile.html b/events/templates/_types/page_summary/_card_tile.html index 7d13cca..5144386 100644 --- a/events/templates/_types/page_summary/_card_tile.html +++ b/events/templates/_types/page_summary/_card_tile.html @@ -3,7 +3,7 @@ {% set page_slug = pi.get('slug', post.slug) %} {% set page_title = pi.get('title') %}
- {% set day_href = events_url('/' ~ page_slug ~ '/calendars/' ~ entry.calendar_slug ~ '/day/' ~ entry.start_at.strftime('%Y/%-m/%-d') ~ '/') %} + {% set day_href = events_url('/' ~ page_slug ~ '/' ~ entry.calendar_slug ~ '/day/' ~ entry.start_at.strftime('%Y/%-m/%-d') ~ '/') %} {% set entry_href = day_href ~ 'entries/' ~ entry.id ~ '/' %}
diff --git a/events/templates/_types/post/admin/_nav.html b/events/templates/_types/post/admin/_nav.html index c0237d6..4be48c7 100644 --- a/events/templates/_types/post/admin/_nav.html +++ b/events/templates/_types/post/admin/_nav.html @@ -1,11 +1,11 @@ {% import 'macros/links.html' as links %} diff --git a/events/templates/_types/post/admin/_nav_entries_oob.html b/events/templates/_types/post/admin/_nav_entries_oob.html index 2523112..a661658 100644 --- a/events/templates/_types/post/admin/_nav_entries_oob.html +++ b/events/templates/_types/post/admin/_nav_entries_oob.html @@ -5,7 +5,7 @@ {% call nav_entries_oob(has_items) %} {% if associated_entries and associated_entries.entries %} {% for entry in associated_entries.entries %} - {% set _entry_path = '/' + post.slug + '/calendars/' + entry.calendar_slug + '/' + entry.start_at.year|string + '/' + entry.start_at.month|string + '/' + entry.start_at.day|string + '/entries/' + entry.id|string + '/' %} + {% set _entry_path = '/' + post.slug + '/' +entry.calendar_slug + '/' + entry.start_at.year|string + '/' + entry.start_at.month|string + '/' + entry.start_at.day|string + '/entries/' + entry.id|string + '/' %} @@ -22,7 +22,7 @@ {% endif %} {% if calendars %} {% for calendar in calendars %} - {% set local_href=events_url('/' + post.slug + '/calendars/' + calendar.slug + '/') %} + {% set local_href=events_url('/' + post.slug + '/' +calendar.slug + '/') %} diff --git a/events/templates/fragments/container_cards_entries.html b/events/templates/fragments/container_cards_entries.html index 53ce49f..0242f1c 100644 --- a/events/templates/fragments/container_cards_entries.html +++ b/events/templates/fragments/container_cards_entries.html @@ -11,7 +11,7 @@