diff --git a/app.py b/app.py index 87ced7a..88ad82b 100644 --- a/app.py +++ b/app.py @@ -329,6 +329,11 @@ class CreateWebappRequest(BaseModel): sort_order: int = 0 kategorie_id: str | None = None kiosk_modus: bool = False + auf_desktop: bool = False + + +class WebappDesktopRequest(BaseModel): + auf_desktop: bool class UpdateWebappRequest(BaseModel): @@ -1172,21 +1177,21 @@ def fetch_workspace_webapps(device_id: str): cur.execute( """ - SELECT w.id, w.name, w.url, w.icon_filename, w.kiosk_modus, k.key, w.sort_order + SELECT w.id, w.name, w.url, w.icon_filename, w.kiosk_modus, k.key, w.auf_desktop, w.sort_order FROM workspace_webapps w LEFT JOIN kategorien k ON k.id = w.kategorie_id WHERE w.workspace_version_id = %s UNION ALL - SELECT gw.id, gw.name, gw.url, gw.icon_filename, gw.kiosk_modus, k.key, gw.sort_order + SELECT gw.id, gw.name, gw.url, gw.icon_filename, gw.kiosk_modus, k.key, gw.auf_desktop, gw.sort_order FROM gruppen_webapps gw JOIN device_gruppen dg ON dg.gruppe_id = gw.gruppe_id LEFT JOIN kategorien k ON k.id = gw.kategorie_id WHERE dg.device_id = %s - ORDER BY 7, 2 + ORDER BY 8, 2 """, (version_id, device_id), ) - zeilen = [row[:6] for row in cur.fetchall()] + zeilen = [row[:7] for row in cur.fetchall()] kiosk_browser = _resolve_kiosk_browser(version_id) if any(row[4] for row in zeilen) else None @@ -1207,8 +1212,11 @@ def fetch_workspace_webapps(device_id: str): # .desktop-Vorlage faellt in beiden Faellen auf den normalen # xdg-open-Start zurueck (siehe webapp-shortcuts-Rolle). "kiosk_browser": kiosk_browser if kiosk_modus else None, + # Starter zusätzlich auf dem Desktop; sonst nur im Menü + # (Migration 0070). + "auf_desktop": auf_desktop, } - for webapp_id, name, url, icon_filename, kiosk_modus, kategorie_key in zeilen + for webapp_id, name, url, icon_filename, kiosk_modus, kategorie_key, auf_desktop in zeilen ] @@ -4540,9 +4548,10 @@ def _version_kopieren(cur, quelle_version_id, ziel_version_id, ziel_workspace_id cur.execute( """ INSERT INTO workspace_webapps (id, workspace_id, workspace_version_id, name, url, icon_filename, - icon_content_type, sort_order, template_id, kategorie_id, kiosk_modus) + icon_content_type, sort_order, template_id, kategorie_id, kiosk_modus, + auf_desktop) SELECT gen_random_uuid(), %s, %s, name, url, icon_filename, icon_content_type, sort_order, - template_id, kategorie_id, kiosk_modus + template_id, kategorie_id, kiosk_modus, auf_desktop FROM workspace_webapps WHERE workspace_version_id = %s """, (ziel_workspace_id, ziel_version_id, quelle_version_id), @@ -5152,7 +5161,7 @@ def fetch_webapps_for_workspace(workspace_id: str): cur.execute( """ SELECT w.id, w.name, w.url, w.icon_filename, w.sort_order, - w.kategorie_id, k.name, w.kiosk_modus + w.kategorie_id, k.name, w.kiosk_modus, w.auf_desktop FROM workspace_webapps w LEFT JOIN kategorien k ON k.id = w.kategorie_id WHERE w.workspace_version_id = %s @@ -5170,14 +5179,16 @@ def fetch_webapps_for_workspace(workspace_id: str): "kategorie_id": str(kategorie_id) if kategorie_id else None, "kategorie_name": kategorie_name, "kiosk_modus": kiosk_modus, + "auf_desktop": auf_desktop, } - for webapp_id, name, url, icon_filename, sort_order, kategorie_id, kategorie_name, kiosk_modus in cur.fetchall() + for (webapp_id, name, url, icon_filename, sort_order, kategorie_id, kategorie_name, + kiosk_modus, auf_desktop) in cur.fetchall() ] def create_webapp( workspace_id: str, name: str, url: str, sort_order: int, - kategorie_id: str | None = None, kiosk_modus: bool = False, + kategorie_id: str | None = None, kiosk_modus: bool = False, auf_desktop: bool = False, ): webapp_id = uuid4() favicon = fetch_favicon(url) @@ -5190,12 +5201,12 @@ def create_webapp( """ INSERT INTO workspace_webapps (id, workspace_id, workspace_version_id, name, url, icon_filename, icon_content_type, - sort_order, kategorie_id, kiosk_modus) - VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s) + sort_order, kategorie_id, kiosk_modus, auf_desktop) + VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) """, ( webapp_id, workspace_id, arbeitsversion_id(cur, workspace_id), name, url, - icon_filename, icon_content_type, sort_order, kategorie_id, kiosk_modus, + icon_filename, icon_content_type, sort_order, kategorie_id, kiosk_modus, auf_desktop, ), ) @@ -8357,11 +8368,34 @@ def create_workspace_webapp(workspace_id: str, payload: CreateWebappRequest, aut "success": True, "webapp": create_webapp( workspace_id, payload.name, payload.url, payload.sort_order, - payload.kategorie_id, payload.kiosk_modus, + payload.kategorie_id, payload.kiosk_modus, payload.auf_desktop, ), } +@app.put("/api/v1/workspaces/{workspace_id}/webapps/{webapp_id}/desktop") +def set_workspace_webapp_desktop( + workspace_id: str, webapp_id: str, payload: WebappDesktopRequest, authorization: str | None = Header(default=None), +): + """Nur das Häkchen „auf dem Desktop“ umschalten - ohne Name, URL und + neuen Favicon-Abruf wie beim vollständigen PUT.""" + + if not require_service_token(authorization): + return {"success": False, "error": "unauthorized", "message": "Fehlendes oder ungültiges Service-Token."} + + if fehler := _nur_im_entwurf(workspace_id, webapp_id=webapp_id): + return fehler + + with get_database_connection() as conn: + with conn.cursor() as cur: + cur.execute( + "UPDATE workspace_webapps SET auf_desktop = %s, updated_at = now() WHERE id = %s", + (payload.auf_desktop, webapp_id), + ) + + return {"success": True, "auf_desktop": payload.auf_desktop} + + @app.put("/api/v1/workspaces/{workspace_id}/webapps/{webapp_id}") def update_workspace_webapp(workspace_id: str, webapp_id: str, payload: UpdateWebappRequest, authorization: str | None = Header(default=None)): if not require_service_token(authorization): diff --git a/migrations/0070_webapp_auf_desktop.sql b/migrations/0070_webapp_auf_desktop.sql new file mode 100644 index 0000000..3701359 --- /dev/null +++ b/migrations/0070_webapp_auf_desktop.sql @@ -0,0 +1,11 @@ +BEGIN; + +-- Webapps auf dem Desktop (22.10.2026, Roadmap Punkt 7): Webapps erscheinen +-- standardmäßig nur noch im Menü. Ein Starter auf dem Desktop kommt nur noch +-- mit diesem Häkchen dazu. Auch bestehende Webapps stehen auf FALSE: Der +-- Nutzer wollte die Desktop-Symbole ausdrücklich weg, die Rolle +-- webapp-shortcuts räumt sie beim nächsten Lauf ab. +ALTER TABLE workspace_webapps ADD COLUMN auf_desktop BOOLEAN NOT NULL DEFAULT FALSE; +ALTER TABLE gruppen_webapps ADD COLUMN auf_desktop BOOLEAN NOT NULL DEFAULT FALSE; + +COMMIT;