diff --git a/routers/admin_kunden.py b/routers/admin_kunden.py index f2688d6..82649ba 100644 --- a/routers/admin_kunden.py +++ b/routers/admin_kunden.py @@ -334,8 +334,12 @@ def struktur_oe_workspace( "PUT", f"/api/v1/organisationseinheiten/{oe_id}/workspace", json={"workspace_id": workspace_id or None, "version_id": version_id or None, "automatisch": not version_id}, ) + # Meldung bei der OE selbst, wie routers/struktur.py:oe_workspace(). meldung = {"hinweis": "Gespeichert."} if result.get("success") else {"fehler": result.get("message", "Nicht möglich.")} - return RedirectResponse(f"/admin/kunden/{organization_id}/struktur?" + urlencode(meldung), status_code=303) + meldung["oe"] = oe_id + return RedirectResponse( + f"/admin/kunden/{organization_id}/struktur?" + urlencode(meldung) + f"#oe-{oe_id}-workspace", status_code=303 + ) @router.post("/{organization_id}/hostname-konvention") diff --git a/routers/struktur.py b/routers/struktur.py index 12eda5f..d4a7a33 100644 --- a/routers/struktur.py +++ b/routers/struktur.py @@ -39,6 +39,15 @@ def struktur_ansicht(request: Request, user=Depends(get_current_user)): # Workspace-Zuweisung je OE nur mit freigeschaltetem Creator (GUI-Runde # 23.10.2026); sonst richtet tuxflotte sie ein. creator = workspace_creator.ist_freigeschaltet(user.organization_id) + if creator: + # Geräte je OE mit Distro, wie im Admin-Reiter - damit vor dem + # Zuweisen sichtbar ist, welcher Workspace passt. + devices_result = anode_request("GET", f"/api/v1/organizations/{user.organization_id}/devices") + devices = devices_result.get("devices", []) if devices_result.get("success") else [] + for oe in oes: + eigene = [d for d in devices if d.get("oe_id") == oe["id"]] + oe["anzahl_geraete"] = len(eigene) + oe["distros"] = sorted({d["distro"] for d in eigene if d.get("distro")}) return templates.TemplateResponse( request, "struktur.html", @@ -46,6 +55,7 @@ def struktur_ansicht(request: Request, user=Depends(get_current_user)): "user": user, "organisationseinheiten": oes, "workspaces": zuweisbare_workspaces(str(user.organization_id)) if creator else None, "fehler": request.query_params.get("fehler"), "hinweis": request.query_params.get("hinweis"), + "meldung_oe": request.query_params.get("oe"), }, ) @@ -74,8 +84,11 @@ def oe_workspace( "PUT", f"/api/v1/organisationseinheiten/{oe_id}/workspace", json={"workspace_id": workspace_id or None, "version_id": version_id or None, "automatisch": not version_id}, ) + # Meldung bei der OE selbst, Formular offen (Befund Liebherr 23.10.2026: + # die Distro-Ablehnung oben auf der Seite wurde übersehen). meldung = {"hinweis": "Gespeichert."} if result.get("success") else {"fehler": result.get("message", "Nicht möglich.")} - return RedirectResponse("/struktur?" + urlencode(meldung), status_code=303) + meldung["oe"] = oe_id + return RedirectResponse("/struktur?" + urlencode(meldung) + f"#oe-{oe_id}-workspace", status_code=303) @router.post("/struktur") diff --git a/templates/admin/kunden_detail.html b/templates/admin/kunden_detail.html index 70d2511..0216421 100644 --- a/templates/admin/kunden_detail.html +++ b/templates/admin/kunden_detail.html @@ -480,8 +480,11 @@ Workspace an der OE, vererbt nach unten. Die Distro-Konfliktregel prüft anode beim Speichern. #}
+ {% set meldung_oe = request.query_params.get("oe") %} + {% if not meldung_oe %} {% if request.query_params.get("fehler") %}

{{ request.query_params.get("fehler") }}

{% endif %} {% if request.query_params.get("hinweis") %}

{{ request.query_params.get("hinweis") }}

{% endif %} + {% endif %}

Ein Workspace an einer OE gilt für alle Geräte darin und in ihren Unter-OEs (außer eine Unter-OE hat einen eigenen). Geräte müssen zur Distro des Workspace passen – sonst wird das Speichern mit Begründung abgelehnt. Gruppen ergänzen nur.