Move calendar blueprint to app level for correct URL routing

The calendar blueprint was nested under calendars (admin), making URLs
/{slug}/admin/{calendar_slug}/ instead of /{slug}/{calendar_slug}/.

Register calendar blueprint directly on the app and update all endpoint
references from calendars.calendar.* to calendar.* (37 in Python,
~50 in templates).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-28 16:50:13 +00:00
parent a8edc26a1d
commit 5957bd8941
40 changed files with 106 additions and 105 deletions

View File

@@ -6,11 +6,11 @@
{# Outer left: -1 year #}
<a
class="{{styles.pill}} text-xl"
href="{{ url_for('calendars.calendar.get',
href="{{ url_for('calendar.get',
calendar_slug=calendar.slug,
year=prev_year,
month=month) }}"
hx-get="{{ url_for('calendars.calendar.get',
hx-get="{{ url_for('calendar.get',
calendar_slug=calendar.slug,
year=prev_year,
month=month) }}"
@@ -25,11 +25,11 @@
{# Inner left: -1 month #}
<a
class="{{styles.pill}} text-xl"
href="{{ url_for('calendars.calendar.get',
href="{{ url_for('calendar.get',
calendar_slug=calendar.slug,
year=prev_month_year,
month=prev_month) }}"
hx-get="{{ url_for('calendars.calendar.get',
hx-get="{{ url_for('calendar.get',
calendar_slug=calendar.slug,
year=prev_month_year,
month=prev_month) }}"
@@ -48,11 +48,11 @@
{# Inner right: +1 month #}
<a
class="{{styles.pill}} text-xl"
href="{{ url_for('calendars.calendar.get',
href="{{ url_for('calendar.get',
calendar_slug=calendar.slug,
year=next_month_year,
month=next_month) }}"
hx-get="{{ url_for('calendars.calendar.get',
hx-get="{{ url_for('calendar.get',
calendar_slug=calendar.slug,
year=next_month_year,
month=next_month) }}"
@@ -67,11 +67,11 @@
{# Outer right: +1 year #}
<a
class="{{styles.pill}} text-xl"
href="{{ url_for('calendars.calendar.get',
href="{{ url_for('calendar.get',
calendar_slug=calendar.slug,
year=next_year,
month=month) }}"
hx-get="{{ url_for('calendars.calendar.get',
hx-get="{{ url_for('calendar.get',
calendar_slug=calendar.slug,
year=next_year,
month=month) }}"
@@ -110,12 +110,12 @@
{# Clickable day number: goes to day detail view #}
<a
class="{{styles.pill}}"
href="{{ url_for('calendars.calendar.day.show_day',
href="{{ url_for('calendar.day.show_day',
calendar_slug=calendar.slug,
year=day.date.year,
month=day.date.month,
day=day.date.day) }}"
hx-get="{{ url_for('calendars.calendar.day.show_day',
hx-get="{{ url_for('calendar.day.show_day',
calendar_slug=calendar.slug,
year=day.date.year,
month=day.date.month,

View File

@@ -1,7 +1,7 @@
<!-- Desktop nav -->
{% import 'macros/links.html' as links %}
{% call links.link(
url_for('calendars.calendar.slots.get', calendar_slug=calendar.slug),
url_for('calendar.slots.get', calendar_slug=calendar.slug),
hx_select_search,
select_colours,
True,
@@ -14,5 +14,5 @@
{% endcall %}
{% if g.rights.admin %}
{% from 'macros/admin_nav.html' import admin_nav_item %}
{{ admin_nav_item(url_for('calendars.calendar.admin.admin', calendar_slug=calendar.slug)) }}
{{ admin_nav_item(url_for('calendar.admin.admin', calendar_slug=calendar.slug)) }}
{% endif %}

View File

@@ -13,7 +13,7 @@
type="button"
class="mt-2 text-xs underline"
hx-get="{{ url_for(
'calendars.calendar.admin.calendar_description_edit',
'calendar.admin.calendar_description_edit',
calendar_slug=calendar.slug,
) }}"
hx-target="#calendar-description"

View File

@@ -1,7 +1,7 @@
<div id="calendar-description">
<form
hx-post="{{ url_for(
'calendars.calendar.admin.calendar_description_save',
'calendar.admin.calendar_description_save',
calendar_slug=calendar.slug,
) }}"
hx-target="#calendar-description"
@@ -28,7 +28,7 @@
type="button"
class="px-3 py-1 rounded border"
hx-get="{{ url_for(
'calendars.calendar.admin.calendar_description_view',
'calendar.admin.calendar_description_view',
calendar_slug=calendar.slug,
) }}"
hx-target="#calendar-description"

View File

@@ -1,7 +1,7 @@
{% import 'macros/links.html' as links %}
{% macro header_row(oob=False) %}
{% call links.menu_row(id='calendar-row', oob=oob) %}
{% call links.link(url_for('calendars.calendar.get', calendar_slug=calendar.slug), hx_select_search) %}
{% call links.link(url_for('calendar.get', calendar_slug=calendar.slug), hx_select_search) %}
<div class="flex flex-col md:flex-row md:gap-2 items-center min-w-0">
<div class="flex flex-row items-center gap-2">
<i class="fa fa-calendar"></i>

View File

@@ -3,7 +3,7 @@
<div class="mt-6 border rounded-lg p-4">
<div class="flex items-center justify-between gap-3">
{% set calendar_href = url_for('calendars.calendar.get', calendar_slug=cal.slug)|host %}
{% set calendar_href = url_for('calendar.get', calendar_slug=cal.slug)|host %}
<a
class="flex items-baseline gap-3"
href="{{ calendar_href }}"
@@ -27,7 +27,7 @@
data-confirm-confirm-text="Yes, delete it"
data-confirm-cancel-text="Cancel"
data-confirm-event="confirmed"
hx-delete="{{ url_for('calendars.calendar.delete', calendar_slug=cal.slug) }}"
hx-delete="{{ url_for('calendar.delete', calendar_slug=cal.slug) }}"
hx-trigger="confirmed"
hx-target="#calendars-list"
hx-select="#calendars-list"

View File

@@ -3,7 +3,7 @@
<form
class="mt-4 grid grid-cols-1 md:grid-cols-4 gap-2"
hx-post="{{ url_for(
'calendars.calendar.day.calendar_entries.add_entry',
'calendar.day.calendar_entries.add_entry',
calendar_slug=calendar.slug,
day=day,
month=month,
@@ -123,7 +123,7 @@
<button
type="button"
class="{{styles.cancel_button}}"
hx-get="{{ url_for('calendars.calendar.day.calendar_entries.add_button',
hx-get="{{ url_for('calendar.day.calendar_entries.add_button',
calendar_slug=calendar.slug,
day=day,
month=month,

View File

@@ -3,7 +3,7 @@
type="button"
class="{{styles.pre_action_button}}"
hx-get="{{ url_for(
'calendars.calendar.day.calendar_entries.add_form',
'calendar.day.calendar_entries.add_form',
calendar_slug=calendar.slug,
day=day,
month=month,

View File

@@ -6,7 +6,7 @@
{% from 'macros/scrolling_menu.html' import scrolling_menu with context %}
{% call(entry) scrolling_menu('day-entries-container', confirmed_entries) %}
<a
href="{{ url_for('calendars.calendar.day.calendar_entries.calendar_entry.get',
href="{{ url_for('calendar.day.calendar_entries.calendar_entry.get',
calendar_slug=calendar.slug,
year=day_date.year,
month=day_date.month,
@@ -29,7 +29,7 @@
{% from 'macros/admin_nav.html' import admin_nav_item %}
{{admin_nav_item(
url_for(
'calendars.calendar.day.admin.admin',
'calendar.day.admin.admin',
calendar_slug=calendar.slug,
year=day_date.year,
month=day_date.month,

View File

@@ -4,7 +4,7 @@
<div class="font-medium">
{% call links.link(
url_for(
'calendars.calendar.day.calendar_entries.calendar_entry.get',
'calendar.day.calendar_entries.calendar_entry.get',
calendar_slug=calendar.slug,
day=day,
month=month,
@@ -23,7 +23,7 @@
<div class="text-xs font-medium">
{% call links.link(
url_for(
'calendars.calendar.slots.slot.get',
'calendar.slots.slot.get',
calendar_slug=calendar.slug,
slot_id=entry.slot.id
),

View File

@@ -9,7 +9,7 @@
{% from 'macros/scrolling_menu.html' import scrolling_menu with context %}
{% call(entry) scrolling_menu('day-entries-container', confirmed_entries) %}
<a
href="{{ url_for('calendars.calendar.day.calendar_entries.calendar_entry.get',
href="{{ url_for('calendar.day.calendar_entries.calendar_entry.get',
calendar_slug=calendar.slug,
year=day_date.year,
month=day_date.month,

View File

@@ -3,7 +3,7 @@
{% call links.menu_row(id='day-admin-row', oob=oob) %}
{% call links.link(
url_for(
'calendars.calendar.day.admin.admin',
'calendar.day.admin.admin',
calendar_slug=calendar.slug,
year=day_date.year,
month=day_date.month,

View File

@@ -3,7 +3,7 @@
{% call links.menu_row(id='day-row', oob=oob) %}
{% call links.link(
url_for(
'calendars.calendar.day.show_day',
'calendar.day.show_day',
calendar_slug=calendar.slug,
year=day_date.year,
month=day_date.month,

View File

@@ -7,7 +7,7 @@
<form
class="space-y-3 mt-4"
hx-put="{{ url_for(
'calendars.calendar.day.calendar_entries.calendar_entry.put',
'calendar.day.calendar_entries.calendar_entry.put',
calendar_slug=calendar.slug,
day=day, month=month, year=year,
entry_id=entry.id
@@ -162,7 +162,7 @@
type="button"
class="{{ styles.cancel_button }}"
hx-get="{{ url_for(
'calendars.calendar.day.calendar_entries.calendar_entry.get',
'calendar.day.calendar_entries.calendar_entry.get',
calendar_slug=calendar.slug,
day=day, month=month, year=year,
entry_id=entry.id

View File

@@ -111,7 +111,7 @@
type="button"
class="{{styles.pre_action_button}}"
hx-get="{{ url_for(
'calendars.calendar.day.calendar_entries.calendar_entry.get_edit',
'calendar.day.calendar_entries.calendar_entry.get_edit',
entry_id=entry.id,
calendar_slug=calendar.slug,
day=day,

View File

@@ -28,7 +28,7 @@
{% from 'macros/admin_nav.html' import admin_nav_item %}
{{admin_nav_item(
url_for(
'calendars.calendar.day.calendar_entries.calendar_entry.admin.admin',
'calendar.day.calendar_entries.calendar_entry.admin.admin',
calendar_slug=calendar.slug,
day=day,
month=month,

View File

@@ -2,7 +2,7 @@
{% if entry.state == 'provisional' %}
<form
hx-post="{{ url_for(
'calendars.calendar.day.calendar_entries.calendar_entry.confirm_entry',
'calendar.day.calendar_entries.calendar_entry.confirm_entry',
calendar_slug=calendar.slug,
day=day,
month=month,
@@ -31,7 +31,7 @@
</form>
<form
hx-post="{{ url_for(
'calendars.calendar.day.calendar_entries.calendar_entry.decline_entry',
'calendar.day.calendar_entries.calendar_entry.decline_entry',
calendar_slug=calendar.slug,
day=day,
month=month,
@@ -62,7 +62,7 @@
{% if entry.state == 'confirmed' %}
<form
hx-post="{{ url_for(
'calendars.calendar.day.calendar_entries.calendar_entry.provisional_entry',
'calendar.day.calendar_entries.calendar_entry.provisional_entry',
calendar_slug=calendar.slug,
day=day,
month=month,

View File

@@ -1,7 +1,7 @@
{% for search_post in search_posts %}
<form
hx-post="{{ url_for(
'calendars.calendar.day.calendar_entries.calendar_entry.add_post',
'calendar.day.calendar_entries.calendar_entry.add_post',
calendar_slug=calendar.slug,
day=day,
month=month,
@@ -41,7 +41,7 @@
<div
id="post-search-sentinel-{{ page }}"
hx-get="{{ url_for(
'calendars.calendar.day.calendar_entries.calendar_entry.search_posts',
'calendar.day.calendar_entries.calendar_entry.search_posts',
calendar_slug=calendar.slug,
day=day,
month=month,

View File

@@ -23,7 +23,7 @@
data-confirm-cancel-text="Cancel"
data-confirm-event="confirmed"
hx-delete="{{ url_for(
'calendars.calendar.day.calendar_entries.calendar_entry.remove_post',
'calendar.day.calendar_entries.calendar_entry.remove_post',
calendar_slug=calendar.slug,
day=day,
month=month,
@@ -55,7 +55,7 @@
placeholder="Search posts..."
class="w-full px-3 py-2 border rounded text-sm"
hx-get="{{ url_for(
'calendars.calendar.day.calendar_entries.calendar_entry.search_posts',
'calendar.day.calendar_entries.calendar_entry.search_posts',
calendar_slug=calendar.slug,
day=day,
month=month,

View File

@@ -44,7 +44,7 @@
id="ticket-form-{{entry.id}}"
class="{% if entry.ticket_price is not none %}hidden{% endif %} space-y-3 mt-2 p-3 border rounded bg-stone-50"
hx-post="{{ url_for(
'calendars.calendar.day.calendar_entries.calendar_entry.update_tickets',
'calendar.day.calendar_entries.calendar_entry.update_tickets',
entry_id=entry.id,
calendar_slug=calendar.slug,
day=day,

View File

@@ -1,7 +1,7 @@
{% import 'macros/links.html' as links %}
{% call links.link(
url_for(
'calendars.calendar.day.calendar_entries.calendar_entry.ticket_types.get',
'calendar.day.calendar_entries.calendar_entry.ticket_types.get',
calendar_slug=calendar.slug,
entry_id=entry.id,
year=year,

View File

@@ -3,7 +3,7 @@
{% call links.menu_row(id='entry-admin-row', oob=oob) %}
{% call links.link(
url_for(
'calendars.calendar.day.calendar_entries.calendar_entry.admin.admin',
'calendar.day.calendar_entries.calendar_entry.admin.admin',
calendar_slug=calendar.slug,
day=day,
month=month,

View File

@@ -3,7 +3,7 @@
{% call links.menu_row(id='entry-row', oob=oob) %}
{% call links.link(
url_for(
'calendars.calendar.day.calendar_entries.calendar_entry.get',
'calendar.day.calendar_entries.calendar_entry.get',
calendar_slug=calendar.slug,
day=day,
month=month,

View File

@@ -1,7 +1,7 @@
{% import 'macros/links.html' as links %}
{% if calendars %}
{% for calendar in calendars %}
{% call links.link(url_for('calendars.calendar.get', calendar_slug=calendar.slug), hx_select_search, select_colours, True, aclass=styles.nav_button_less_pad) %}
{% call links.link(url_for('calendar.get', calendar_slug=calendar.slug), hx_select_search, select_colours, True, aclass=styles.nav_button_less_pad) %}
<i class="fa fa-calendar" aria-hidden="true"></i>
<div>{{ calendar.name }}</div>
{% endcall %}

View File

@@ -3,7 +3,7 @@
<div id="slot-errors" class="mt-2 text-sm text-red-600"></div>
<form
class="space-y-3 mt-4"
hx-put="{{ url_for('calendars.calendar.slots.slot.put',
hx-put="{{ url_for('calendar.slots.slot.put',
calendar_slug=calendar.slug,
slot_id=slot.id) }}"
hx-target="#slot-{{ slot.id }}"
@@ -153,7 +153,7 @@
<button
type="button"
class="{{styles.cancel_button}}"
hx-get="{{ url_for('calendars.calendar.slots.slot.get_view',
hx-get="{{ url_for('calendar.slots.slot.get_view',
calendar_slug=calendar.slug,
slot_id=slot.id) }}"
hx-target="#slot-{{ slot.id }}"

View File

@@ -54,7 +54,7 @@
type="button"
class="{{styles.pre_action_button}}"
hx-get="{{ url_for(
'calendars.calendar.slots.slot.get_edit',
'calendar.slots.slot.get_edit',
slot_id=slot.id,
calendar_slug=calendar.slug,
) }}"

View File

@@ -1,5 +1,5 @@
<form
hx-post="{{ url_for('calendars.calendar.slots.post',
hx-post="{{ url_for('calendar.slots.post',
calendar_slug=calendar.slug) }}"
hx-target="#slots-table"
hx-select="#slots-table"
@@ -98,7 +98,7 @@
<button
type="button"
class="{{styles.cancel_button}}"
hx-get="{{ url_for('calendars.calendar.slots.add_button',
hx-get="{{ url_for('calendar.slots.add_button',
calendar_slug=calendar.slug) }}"
hx-target="#slot-add-container"
hx-swap="innerHTML"

View File

@@ -2,7 +2,7 @@
<button
type="button"
class="{{styles.pre_action_button}}"
hx-get="{{ url_for('calendars.calendar.slots.add_form',
hx-get="{{ url_for('calendar.slots.add_form',
calendar_slug=calendar.slug) }}"
hx-target="#slot-add-container"
hx-swap="innerHTML"

View File

@@ -45,7 +45,7 @@
data-confirm-confirm-text="Yes, delete it"
data-confirm-cancel-text="Cancel"
data-confirm-event="confirmed"
hx-delete="{{ url_for('calendars.calendar.slots.slot.slot_delete',
hx-delete="{{ url_for('calendar.slots.slot.slot_delete',
calendar_slug=calendar.slug,
slot_id=s.id) }}"
hx-target="#slots-table"

View File

@@ -3,7 +3,7 @@
<div id="ticket-errors" class="mt-2 text-sm text-red-600"></div>
<form
class="space-y-3 mt-4"
hx-put="{{ url_for('calendars.calendar.day.calendar_entries.calendar_entry.ticket_types.ticket_type.put',
hx-put="{{ url_for('calendar.day.calendar_entries.calendar_entry.ticket_types.ticket_type.put',
calendar_slug=calendar.slug,
year=year,
month=month,
@@ -70,7 +70,7 @@
<button
type="button"
class="{{styles.cancel_button}}"
hx-get="{{ url_for('calendars.calendar.day.calendar_entries.calendar_entry.ticket_types.ticket_type.get_view',
hx-get="{{ url_for('calendar.day.calendar_entries.calendar_entry.ticket_types.ticket_type.get_view',
calendar_slug=calendar.slug,
entry_id=entry.id,
year=year,

View File

@@ -33,7 +33,7 @@
type="button"
class="{{styles.pre_action_button}}"
hx-get="{{ url_for(
'calendars.calendar.day.calendar_entries.calendar_entry.ticket_types.ticket_type.get_edit',
'calendar.day.calendar_entries.calendar_entry.ticket_types.ticket_type.get_edit',
ticket_type_id=ticket_type.id,
calendar_slug=calendar.slug,
year=year,

View File

@@ -3,7 +3,7 @@
{% call links.menu_row(id='ticket_type-row', oob=oob) %}
{% call links.link(
url_for(
'calendars.calendar.day.calendar_entries.calendar_entry.ticket_types.ticket_type.get',
'calendar.day.calendar_entries.calendar_entry.ticket_types.ticket_type.get',
calendar_slug=calendar.slug,
year=year,
month=month,

View File

@@ -1,5 +1,5 @@
<form
hx-post="{{ url_for('calendars.calendar.day.calendar_entries.calendar_entry.ticket_types.post',
hx-post="{{ url_for('calendar.day.calendar_entries.calendar_entry.ticket_types.post',
calendar_slug=calendar.slug,
entry_id=entry.id,
year=year,
@@ -55,7 +55,7 @@
<button
type="button"
class="{{styles.cancel_button}}"
hx-get="{{ url_for('calendars.calendar.day.calendar_entries.calendar_entry.ticket_types.add_button',
hx-get="{{ url_for('calendar.day.calendar_entries.calendar_entry.ticket_types.add_button',
calendar_slug=calendar.slug,
entry_id=entry.id,
year=year,

View File

@@ -1,6 +1,6 @@
<button
class="{{styles.action_button}}"
hx-get="{{ url_for('calendars.calendar.day.calendar_entries.calendar_entry.ticket_types.add_form',
hx-get="{{ url_for('calendar.day.calendar_entries.calendar_entry.ticket_types.add_form',
calendar_slug=calendar.slug,
entry_id=entry.id,
year=year,

View File

@@ -4,7 +4,7 @@
<div class="font-medium">
{% call links.link(
url_for(
'calendars.calendar.day.calendar_entries.calendar_entry.ticket_types.ticket_type.get',
'calendar.day.calendar_entries.calendar_entry.ticket_types.ticket_type.get',
calendar_slug=calendar.slug,
year=year,
month=month,
@@ -35,7 +35,7 @@
data-confirm-confirm-text="Yes, delete it"
data-confirm-cancel-text="Cancel"
data-confirm-event="confirmed"
hx-delete="{{ url_for('calendars.calendar.day.calendar_entries.calendar_entry.ticket_types.ticket_type.delete',
hx-delete="{{ url_for('calendar.day.calendar_entries.calendar_entry.ticket_types.ticket_type.delete',
calendar_slug=calendar.slug,
year=year,
month=month,

View File

@@ -2,7 +2,7 @@
{% macro header_row(oob=False) %}
{% call links.menu_row(id='ticket_types-row', oob=oob) %}
{% call links.link(url_for(
'calendars.calendar.day.calendar_entries.calendar_entry.ticket_types.get',
'calendar.day.calendar_entries.calendar_entry.ticket_types.get',
calendar_slug=calendar.slug,
entry_id=entry.id,
year=year,