diff --git a/app.py b/app.py index 02ece64..7eb4bfb 100644 --- a/app.py +++ b/app.py @@ -382,16 +382,23 @@ def fetch_assigned_blueprints(device_id: str): def fetch_auftragskatalog_state(device_id: str): """ Voller Soll-Zustand (present/absent) aller katalogfähigen Merkmale für - das Backend des Device, unabhängig von der Workspace-Zuweisung - (siehe ADR-0010). Zustandslos aus der aktuellen Auswahl abgeleitet, - keine Historie nötig. + das Backend des Device (siehe ADR-0010). Zustandslos aus der aktuellen + Auswahl abgeleitet, keine Historie nötig. + + Default ohne explizite Auftragszuweisung ist die Workspace-Zugehörigkeit: + der Auftragskatalog besteht aus denselben Merkmalen, aus denen auch + Workspaces zusammengesetzt werden, und ein Workspace ist fachlich nichts + anderes als eine Vorauswahl aus dem Katalog. Eine vorhandene + device_merkmale-Zeile überschreibt diesen Default in beide Richtungen + (auch ein workspace-komponiertes Merkmal lässt sich damit geräteweise + abwählen). """ with get_database_connection() as conn: with conn.cursor() as cur: cur.execute( """ - SELECT bv.backend_id + SELECT bv.workspace_id, bv.backend_id FROM assignments a JOIN bereitstellungsvorlagen bv ON bv.id = a.bereitstellungsvorlage_id WHERE a.device_id = %s @@ -403,18 +410,21 @@ def fetch_auftragskatalog_state(device_id: str): if assignment_row is None: return [] - (backend_id,) = assignment_row + workspace_id, backend_id = assignment_row cur.execute( """ - SELECT m.key, bp.ansible_role, COALESCE(dm.aktiv, FALSE) + SELECT m.key, bp.ansible_role, + COALESCE(dm.aktiv, wm.merkmal_id IS NOT NULL) FROM merkmale m JOIN blueprints bp ON bp.merkmal_id = m.id AND bp.backend_id = %s LEFT JOIN device_merkmale dm ON dm.merkmal_id = m.id AND dm.device_id = %s + LEFT JOIN workspace_merkmale wm + ON wm.merkmal_id = m.id AND wm.workspace_id = %s WHERE m.im_auftragskatalog """, - (backend_id, device_id), + (backend_id, device_id, workspace_id), ) return [ {