feat(11-04): add GET /clients/{id} route and client_detail.html template

- Add client_detail route in pages.py with 404 on unknown client_id
- Build grouped dict {client.name: [printers]} for printer_list partial reuse
- Pass clients + driver_data for edit modal compatibility
- Create client_detail.html extending base.html, includes printer_list partial
This commit is contained in:
2026-04-15 14:49:12 +02:00
parent 7b948b68c3
commit f3644790be
2 changed files with 49 additions and 0 deletions
+38
View File
@@ -156,6 +156,44 @@ def clients_page(request: Request):
) )
@router.get("/clients/{client_id}", response_class=HTMLResponse)
def client_detail(request: Request, client_id: int):
from imptune.db.models import Client, Driver, Printer
client = Client.get_or_none(Client.id == client_id)
if client is None:
return HTMLResponse(
content="<h1>404 Not Found</h1><p>Client not found.</p>",
status_code=404,
)
query = (
Printer.select(Printer, Client)
.join(Client, JOIN.LEFT_OUTER)
.where(Printer.client == client_id)
.order_by(Printer.name)
)
grouped = {client.name: list(query)}
clients = list(Client.select().order_by(Client.name))
all_drivers = list(Driver.select().order_by(Driver.uploaded_at.desc()))
driver_data = [
{"driver": d, "names": json.loads(d.driver_desc) if d.driver_desc else []}
for d in all_drivers
]
return templates.TemplateResponse(
request=request,
name="client_detail.html",
context={
"client": client,
"grouped": grouped,
"clients": clients,
"driver_data": driver_data,
},
)
@router.get("/packages", response_class=HTMLResponse) @router.get("/packages", response_class=HTMLResponse)
def packages_page(request: Request): def packages_page(request: Request):
from imptune.db.models import Client, Driver, Printer from imptune.db.models import Client, Driver, Printer
+11
View File
@@ -0,0 +1,11 @@
{% extends "base.html" %}
{% block content %}
<h1>{{ client.name }}</h1>
<p><a href="/clients">&larr; All Clients</a></p>
<section>
<h2>Printers</h2>
{% include "partials/printer_list.html" %}
</section>
{% endblock %}