Fix A() component

Replaced single `url` parameter with explicit `url_name` (URL pattern name resolved via `reverse()`) and `href` (literal path). Fixes:
- Silent fallback (typos like `"ad_puchase"` silently became broken links) → now raises `NoReverseMatch` at render time
- `type(url) is str` gate → removed (implicit dual-mode eliminated entirely)
- Callable parameter (`url: Callable`) dead code → removed
- Implicit dual-mode (`url="name"` vs `url=reverse("name")`) → `url_name` vs `href` are now mutually exclusive params
- Inconsistent type annotation mixing `Callable` with string default → cleaned up
- Added `ValueError` when both `url_name` and `href` are provided
- Updated all 10 call sites across 6 view files and internal callers (`LinkedPurchase()`, `NameWithIcon()`)
This commit is contained in:
2026-05-12 09:01:05 +02:00
parent 8c3e819a5f
commit 656a96f55c
9 changed files with 50 additions and 40 deletions
+1 -1
View File
@@ -36,7 +36,7 @@ def list_devices(request: HttpRequest) -> HttpResponse:
else None
),
"data": {
"header_action": A([], Button([], "Add device"), url="add_device"),
"header_action": A([], Button([], "Add device"), url_name="add_device"),
"columns": [
"Name",
"Type",
+3 -3
View File
@@ -89,7 +89,7 @@ def list_games(request: HttpRequest, search_string: str = "") -> HttpResponse:
)
]
),
A([], Button([], "Add game"), url="add_game"),
A([], Button([], "Add game"), url_name="add_game"),
],
attributes=[("class", "flex justify-between")],
),
@@ -274,7 +274,7 @@ def view_game(request: HttpRequest, game_id: int) -> HttpResponse:
"header_action": Div(
children=[
A(
url="add_session",
url_name="add_session",
children=Button(
icon=True,
size="xs",
@@ -282,7 +282,7 @@ def view_game(request: HttpRequest, game_id: int) -> HttpResponse:
),
),
A(
url=reverse(
href=reverse(
"list_sessions_start_session_from_session",
args=[last_session.pk],
),
+1 -1
View File
@@ -37,7 +37,7 @@ def list_platforms(request: HttpRequest) -> HttpResponse:
else None
),
"data": {
"header_action": A([], Button([], "Add platform"), url="add_platform"),
"header_action": A([], Button([], "Add platform"), url_name="add_platform"),
"columns": [
"Name",
"Icon",
+1 -1
View File
@@ -78,7 +78,7 @@ def create_playevent_tabledata(
for row in row_list
]
return {
"header_action": A([], Button([], "Add play event"), url="add_playevent"),
"header_action": A([], Button([], "Add play event"), url_name="add_playevent"),
"columns": list(filtered_column_list),
"rows": filtered_row_list,
}
+1 -1
View File
@@ -100,7 +100,7 @@ def list_purchases(request: HttpRequest) -> HttpResponse:
else None
),
"data": {
"header_action": A([], Button([], "Add purchase"), url="add_purchase"),
"header_action": A([], Button([], "Add purchase"), url_name="add_purchase"),
"columns": [
"Name",
"Type",
+2 -2
View File
@@ -81,7 +81,7 @@ def list_sessions(request: HttpRequest, search_string: str = "") -> HttpResponse
Div(
children=[
A(
url="add_session",
url_name="add_session",
children=Button(
icon=True,
size="xs",
@@ -89,7 +89,7 @@ def list_sessions(request: HttpRequest, search_string: str = "") -> HttpResponse
),
),
A(
url=reverse(
href=reverse(
"list_sessions_start_session_from_session",
args=[last_session.pk],
),