From 61aa108666f583a8824b12e8ede8907a767d17fc Mon Sep 17 00:00:00 2001 From: Thomas Stallinger Date: Fri, 9 Oct 2026 11:42:12 +0200 Subject: [PATCH] Aktivierung: bei Medium mit Ziel-OE deren Workspace in der Template-Antwort Die Installer-Uebersicht (25_installation_confirm.sh) zeigte den Profil-Workspace, wirksam ist aber der der Ziel-OE (Schritt F). Neue Hilfsfunktion oe_kette_workspace(); gleiche Distro-Regel wie geraete_basis_herkunft(). Der Installer liest nur den Namen, keine Installer-Aenderung noetig. GUI-Runde 10/2026 Punkt 8. Co-Authored-By: Claude Opus 5.5 --- app.py | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/app.py b/app.py index 1988cee..6a184ba 100644 --- a/app.py +++ b/app.py @@ -1439,6 +1439,34 @@ def geraete_basis_herkunft(cur, device_id: str): {"art": "installation"}, ) +def oe_kette_workspace(cur, oe_id: str): + """Nächstgelegener Workspace in der OE-Kette (eigene OE, dann Eltern) als + (workspace_id, name, backend_id) oder None - dieselbe Reihenfolge wie + geraete_basis_herkunft().""" + + cur.execute("SELECT organization_id FROM organisationseinheiten WHERE id = %s", (oe_id,)) + row = cur.fetchone() + if row is None: + return None + cur.execute( + """ + SELECT oe.id, oe.parent_id, w.id, w.name, w.backend_id + FROM organisationseinheiten oe + LEFT JOIN workspaces w ON w.id = oe.workspace_id + WHERE oe.organization_id = %s + """, + (row[0],), + ) + oes = {r[0]: r[1:] for r in cur.fetchall()} + aktuell = UUID(str(oe_id)) + while aktuell is not None and aktuell in oes: + parent_id, workspace_id, name, backend_id = oes[aktuell] + if workspace_id is not None: + return str(workspace_id), name, str(backend_id) if backend_id else None + aktuell = parent_id + return None + + def fetch_auftragskatalog_state(device_id: str): """ Voller Soll-Zustand (present/absent) aller katalogfähigen Merkmale für @@ -5177,6 +5205,21 @@ def activate(payload: ActivationRequest, request: Request): for template in fetch_templates(organization_id) if template["id"] == enrollment_session["bereitstellungsvorlage_id"] ] + # GUI-Runde 09.10.2026 (Punkt 8): Bei einem Medium mit Ziel-OE gilt + # deren Workspace (Schritt F) - die Installer-Übersicht ("Workspace: + # ...", 25_installation_confirm.sh) zeigte bisher den des Profils. + # Gleiche Distro-Regel wie geraete_basis_herkunft(): passt die Distro + # nicht, bleibt es beim Workspace aus der Installation. + if enrollment_session.get("ziel_oe_id") and templates: + with get_database_connection() as conn: + with conn.cursor() as cur: + oe_ws = oe_kette_workspace(cur, enrollment_session["ziel_oe_id"]) + if oe_ws and (oe_ws[2] is None or oe_ws[2] == templates[0]["backend"]["id"]): + templates[0] = { + **templates[0], + "workspace": {"id": oe_ws[0], "name": oe_ws[1]}, + "workspace_herkunft": "ziel_oe", + } else: templates = fetch_templates(organization_id)