diff --git a/README.md b/README.md index 623ccb3..4ec237b 100644 --- a/README.md +++ b/README.md @@ -221,11 +221,27 @@ gefahrlos neu ladbar: | Lage | Angebot | |------|---------| -| Zentrale frei | **Zentrale besetzen** | -| jemand anderes sitzt darauf | **Zentrale uebernehmen**, mit Hinweis was mit dieser Person passiert | +| Zentrale frei | **Zentrale besetzen**, ohne Rueckfrage | +| jemand anderes sitzt darauf | **Zentrale uebernehmen** mit Rueckfrage, siehe unten | | man sitzt selbst darauf | **Zurueck auf mein Tuerschild** | | es ist der eigene Stammplatz | kein Knopf, nur der Hinweis dass nichts zu tun ist | +### Rueckfrage beim Verdraengen + +Sitzt bereits jemand anderes auf der Zentrale, kommt vor der Uebernahme eine +Rueckfrage. Sie nennt die betroffene Person und was mit ihr passiert: + +- sie gehoert auf die Zentrale und kommt automatisch zurueck, sobald wieder + freigegeben wird +- sie hat ein eigenes Tuerschild und wird dorthin zurueckgesetzt +- sie hat kein eigenes Tuerschild und wird als Stamm-Besetzer vermerkt + +Eine Rueckgabe wird dagegen **nicht** erzwungen, und das ist Absicht: wer abends +ohne Freigabe nach Hause geht, wuerde die Zentrale sonst sperren. Am naechsten +Morgen koennte niemand den Empfang besetzen, weil der Vorgaenger nicht da ist um +freizugeben, und es muesste jedes Mal ein Administrator eingreifen. Die Rueckfrage +verhindert das versehentliche Verdraengen, ohne diese Sperre zu erzeugen. + Jede Aktion leitet auf diese Seite zurueck (POST/Redirect/GET). Man landet also nie auf einer Formular-Antwort, die beim Neuladen die Aktion wiederholen wuerde, und sieht nach jedem Klick den neuen Zustand samt Bestaetigung. diff --git a/app.py b/app.py index 54790fa..e189d2b 100644 --- a/app.py +++ b/app.py @@ -608,7 +608,7 @@ def _zentrale_state(conn, target, user): st = { "occupant": None, "is_here": False, "home": None, "home_blocker": None, "is_owner": False, "owner_waiting": None, - "occupant_is_owner": False, + "occupant_is_owner": False, "occupant_has_home": False, } if not target: return st @@ -626,10 +626,12 @@ def _zentrale_state(conn, target, user): # Sitzt der aktuelle Besetzer auf seinem Stammplatz? Dann kommt er nach einer # Uebernahme von allein zurueck - das gehoert auf den Knopf geschrieben. if st["occupant"]: - st["occupant_is_owner"] = conn.execute(""" - SELECT 1 FROM home_assignments - WHERE user_azure_id = ? AND wled_device_id = ? AND segment = ? - """, (st["occupant"]["azure_id"], target["id"], target["segment"])).fetchone() is not None + occ_home = conn.execute(""" + SELECT wled_device_id, segment FROM home_assignments WHERE user_azure_id = ? + """, (st["occupant"]["azure_id"],)).fetchone() + st["occupant_has_home"] = occ_home is not None + st["occupant_is_owner"] = bool(occ_home) and \ + (occ_home["wled_device_id"], occ_home["segment"]) == (target["id"], target["segment"]) if not user: return st @@ -702,8 +704,13 @@ async def zentrale_page_for_extension(request: Request, extension: str): @app.post("/api/zentrale/uebernehmen") -async def zentrale_takeover(extension: str = Form(...)): - """Mitarbeiter setzt sich selbst auf das Busylight der Zentrale.""" +async def zentrale_takeover(extension: str = Form(...), confirm: str = Form("")): + """Mitarbeiter setzt sich selbst auf das Busylight der Zentrale. + + Sitzt bereits jemand anderes darauf, braucht es eine ausdrueckliche + Bestaetigung. Eine Rueckgabe zu erzwingen waere die Alternative, wuerde die + Zentrale aber sperren, sobald jemand ohne Freigabe nach Hause geht. + """ conn = database.get_db() try: target = _selfservice_target(conn) @@ -714,6 +721,14 @@ async def zentrale_takeover(extension: str = Form(...)): if not user: return _zentrale_redirect(extension, "err_unbekannt") + if confirm != "ja": + besetzt = conn.execute(""" + SELECT 1 FROM assignments + WHERE wled_device_id = ? AND segment = ? AND user_azure_id != ? + """, (target["id"], target["segment"], user["azure_id"])).fetchone() + if besetzt: + return _zentrale_redirect(extension, "bestaetigen") + already = conn.execute(""" SELECT 1 FROM assignments WHERE user_azure_id = ? AND wled_device_id = ? AND segment = ? diff --git a/templates/zentrale.html b/templates/zentrale.html index 46b10d2..1d9865b 100644 --- a/templates/zentrale.html +++ b/templates/zentrale.html @@ -147,6 +147,39 @@ {% endif %} + {% elif done == 'bestaetigen' and occupant %} + {# Zweiter Schritt: verdraengen ist nie ein Versehen #} +
+ Wirklich uebernehmen? +
+ {{ occupant.display_name }} ist derzeit auf der Zentrale + eingetragen. Bitte nur uebernehmen, wenn diese Person den Empfang + tatsaechlich verlassen hat. +
+ {% if occupant_is_owner %} + {{ occupant.display_name }} gehoert auf die Zentrale und kommt automatisch + zurueck, sobald du sie wieder freigibst. + {% elif occupant_has_home %} + {{ occupant.display_name }} wird dabei auf das eigene Tuerschild + zurueckgesetzt. + {% else %} + {{ occupant.display_name }} hat kein eigenes Tuerschild und gehoert damit + auf die Zentrale. Die Person wird als Stamm-Besetzer vermerkt und kommt + automatisch zurueck, sobald du wieder freigibst. + {% endif %} +
+
+
+ + + +
+ + Abbrechen + + {% else %}
@@ -156,10 +189,16 @@ {% if occupant and occupant_is_owner %} - {{ occupant.display_name }} gehoert auf die Zentrale und kommt automatisch - zurueck, sobald du sie wieder freigibst. + {{ occupant.display_name }} sitzt darauf und gehoert dorthin. Nach einer + Uebernahme kommt sie oder er automatisch zurueck, sobald du freigibst. + Du wirst noch um Bestaetigung gebeten. + {% elif occupant and occupant_has_home %} + {{ occupant.display_name }} sitzt darauf und wird dabei auf das eigene + Tuerschild zurueckgesetzt. Du wirst noch um Bestaetigung gebeten. {% elif occupant %} - {{ occupant.display_name }} wird dabei auf das eigene Tuerschild zurueckgesetzt. + {{ occupant.display_name }} sitzt darauf und gehoert auf die Zentrale, + kommt also automatisch zurueck, sobald du freigibst. + Du wirst noch um Bestaetigung gebeten. {% else %} Die Zentrale ist frei. {% endif %}