🔧 Update: Enhance Guest Request Management with OTP and Name Verification

**Änderungen:**
-  Hinzugefügt: Neue Methode `find_by_otp_and_name` in `GuestRequest`, um Gastanfragen anhand von OTP-Code und Name zu finden.
-  API-Endpunkte in `admin_unified.py` für die Verwaltung von Gastanfragen mit OTP-Codes implementiert, einschließlich Generierung und Druck von Zugangsdaten.
-  Anpassungen in `guest.py`, um die Authentifizierung von Gastanfragen mit Name und OTP-Code zu unterstützen.

**Ergebnis:**
- Verbesserte Sicherheit und Benutzerfreundlichkeit bei der Verwaltung von Gastanfragen im Offline-System.
- Klarere API-Responses und verbesserte Fehlerbehandlung für Gastanfragen.

🤖 Generated with [Claude Code](https://claude.ai/code)
This commit is contained in:
2025-06-16 01:27:41 +02:00
parent b1ae9523a9
commit b5c758c971
4 changed files with 842 additions and 25 deletions

View File

@@ -1228,6 +1228,41 @@ class GuestRequest(Base):
except Exception as e:
logger.error(f"Fehler beim Suchen der Gastanfrage per OTP: {str(e)}")
return None
@classmethod
def find_by_otp_and_name(cls, otp_code: str, name: str) -> Optional['GuestRequest']:
"""
Findet eine Gastanfrage anhand des OTP-Codes UND Names (für Offline-System).
Zusätzliche Sicherheit durch Name-Verifikation.
"""
if not otp_code or len(otp_code) != 6 or not name:
return None
try:
with get_cached_session() as session:
# Alle genehmigten Gastanfragen mit OTP-Codes und passendem Namen finden
guest_requests = session.query(cls).filter(
cls.status == "approved",
cls.otp_code.isnot(None),
cls.otp_used_at.is_(None), # Noch nicht verwendet
cls.name.ilike(f"%{name.strip()}%") # Name-Matching (case-insensitive)
).all()
# Code gegen alle passenden Anfragen prüfen
for request in guest_requests:
if request.verify_otp(otp_code):
# Zusätzliche Name-Verifikation (exakte Übereinstimmung)
if request.name.strip().lower() == name.strip().lower():
logger.info(f"Gastanfrage {request.id} erfolgreich per Name+OTP authentifiziert")
return request
else:
logger.warning(f"OTP stimmt, aber Name passt nicht exakt: '{request.name}' vs '{name}'")
return None
except Exception as e:
logger.error(f"Fehler beim Suchen der Gastanfrage per Name+OTP: {str(e)}")
return None
class JobOrder(Base):