This repository has been archived on 2026-02-15. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
BreakPilot Dev 19855efacc
Some checks failed
Tests / Go Tests (push) Has been cancelled
Tests / Python Tests (push) Has been cancelled
Tests / Integration Tests (push) Has been cancelled
Tests / Go Lint (push) Has been cancelled
Tests / Python Lint (push) Has been cancelled
Tests / Security Scan (push) Has been cancelled
Tests / All Checks Passed (push) Has been cancelled
Security Scanning / Secret Scanning (push) Has been cancelled
Security Scanning / Dependency Vulnerability Scan (push) Has been cancelled
Security Scanning / Go Security Scan (push) Has been cancelled
Security Scanning / Python Security Scan (push) Has been cancelled
Security Scanning / Node.js Security Scan (push) Has been cancelled
Security Scanning / Docker Image Security (push) Has been cancelled
Security Scanning / Security Summary (push) Has been cancelled
CI/CD Pipeline / Go Tests (push) Has been cancelled
CI/CD Pipeline / Python Tests (push) Has been cancelled
CI/CD Pipeline / Website Tests (push) Has been cancelled
CI/CD Pipeline / Linting (push) Has been cancelled
CI/CD Pipeline / Security Scan (push) Has been cancelled
CI/CD Pipeline / Docker Build & Push (push) Has been cancelled
CI/CD Pipeline / Integration Tests (push) Has been cancelled
CI/CD Pipeline / Deploy to Staging (push) Has been cancelled
CI/CD Pipeline / Deploy to Production (push) Has been cancelled
CI/CD Pipeline / CI Summary (push) Has been cancelled
ci/woodpecker/manual/build-ci-image Pipeline was successful
ci/woodpecker/manual/main Pipeline failed
feat: BreakPilot PWA - Full codebase (clean push without large binaries)
All services: admin-v2, studio-v2, website, ai-compliance-sdk,
consent-service, klausur-service, voice-service, and infrastructure.
Large PDFs and compiled binaries excluded via .gitignore.
2026-02-11 13:25:58 +01:00

185 lines
6.4 KiB
Python

"""
Classroom API - Settings Routes
Teacher settings endpoints (Feature f16).
"""
import logging
from fastapi import APIRouter, HTTPException, Depends
from classroom_engine import get_default_durations
from ..models import (
TeacherSettingsResponse,
UpdatePhaseDurationsRequest,
UpdatePreferencesRequest,
)
from ..services.persistence import (
init_db_if_needed,
DB_ENABLED,
SessionLocal,
)
logger = logging.getLogger(__name__)
router = APIRouter(tags=["Settings"])
def get_db():
"""Database session dependency."""
if DB_ENABLED and SessionLocal:
db = SessionLocal()
try:
yield db
finally:
db.close()
else:
yield None
@router.get("/settings/{teacher_id}", response_model=TeacherSettingsResponse)
async def get_teacher_settings(
teacher_id: str,
db=Depends(get_db)
):
"""
Holt die Einstellungen eines Lehrers.
Gibt die personalisierten Phasen-Dauern und UI-Praeferenzen zurueck.
Falls keine Einstellungen existieren, werden Defaults erstellt.
Args:
teacher_id: ID des Lehrers
Returns:
TeacherSettingsResponse mit allen Einstellungen
"""
if DB_ENABLED and db:
try:
from classroom_engine.repository import TeacherSettingsRepository
repo = TeacherSettingsRepository(db)
settings = repo.get_or_create(teacher_id)
return TeacherSettingsResponse(
teacher_id=settings.teacher_id,
default_phase_durations=settings.default_phase_durations or get_default_durations(),
audio_enabled=settings.audio_enabled if settings.audio_enabled is not None else True,
high_contrast=settings.high_contrast if settings.high_contrast is not None else False,
show_statistics=settings.show_statistics if settings.show_statistics is not None else True,
)
except Exception as e:
logger.error(f"Failed to get teacher settings: {e}")
raise HTTPException(status_code=500, detail=f"Fehler beim Laden der Einstellungen: {e}")
# Fallback: Defaults
return TeacherSettingsResponse(
teacher_id=teacher_id,
default_phase_durations=get_default_durations(),
audio_enabled=True,
high_contrast=False,
show_statistics=True,
)
@router.put("/settings/{teacher_id}/durations", response_model=TeacherSettingsResponse)
async def update_phase_durations(
teacher_id: str,
request: UpdatePhaseDurationsRequest,
db=Depends(get_db)
):
"""
Aktualisiert die Standard-Phasendauern eines Lehrers.
Ermoeglicht Lehrern, ihre bevorzugten Phasen-Dauern zu speichern.
Diese werden dann bei neuen Sessions als Default verwendet.
Args:
teacher_id: ID des Lehrers
request: Neue Phasen-Dauern in Minuten
Returns:
Aktualisierte TeacherSettingsResponse
"""
# Validierung: Nur gueltige Phasen erlauben
valid_phases = {"einstieg", "erarbeitung", "sicherung", "transfer", "reflexion"}
for phase in request.durations:
if phase not in valid_phases:
raise HTTPException(
status_code=400,
detail=f"Ungueltige Phase: {phase}. Erlaubt: {valid_phases}"
)
if request.durations[phase] < 1 or request.durations[phase] > 120:
raise HTTPException(
status_code=400,
detail=f"Phasen-Dauer muss zwischen 1 und 120 Minuten liegen"
)
if DB_ENABLED and db:
try:
from classroom_engine.repository import TeacherSettingsRepository
repo = TeacherSettingsRepository(db)
settings = repo.update_phase_durations(teacher_id, request.durations)
return TeacherSettingsResponse(
teacher_id=settings.teacher_id,
default_phase_durations=settings.default_phase_durations,
audio_enabled=settings.audio_enabled if settings.audio_enabled is not None else True,
high_contrast=settings.high_contrast if settings.high_contrast is not None else False,
show_statistics=settings.show_statistics if settings.show_statistics is not None else True,
)
except Exception as e:
logger.error(f"Failed to update phase durations: {e}")
raise HTTPException(status_code=500, detail=f"Fehler beim Speichern: {e}")
raise HTTPException(
status_code=503,
detail="Datenbank nicht verfuegbar - Einstellungen koennen nicht gespeichert werden"
)
@router.put("/settings/{teacher_id}/preferences", response_model=TeacherSettingsResponse)
async def update_preferences(
teacher_id: str,
request: UpdatePreferencesRequest,
db=Depends(get_db)
):
"""
Aktualisiert die UI-Praeferenzen eines Lehrers.
Ermoeglicht das Speichern von:
- audio_enabled: Audio-Hinweise aktiviert
- high_contrast: Hoher Kontrast fuer Beamer
- show_statistics: Statistiken nach Stundenende anzeigen
Args:
teacher_id: ID des Lehrers
request: Zu aktualisierende Praeferenzen
Returns:
Aktualisierte TeacherSettingsResponse
"""
if DB_ENABLED and db:
try:
from classroom_engine.repository import TeacherSettingsRepository
repo = TeacherSettingsRepository(db)
settings = repo.update_preferences(
teacher_id=teacher_id,
audio_enabled=request.audio_enabled,
high_contrast=request.high_contrast,
show_statistics=request.show_statistics
)
return TeacherSettingsResponse(
teacher_id=settings.teacher_id,
default_phase_durations=settings.default_phase_durations or get_default_durations(),
audio_enabled=settings.audio_enabled if settings.audio_enabled is not None else True,
high_contrast=settings.high_contrast if settings.high_contrast is not None else False,
show_statistics=settings.show_statistics if settings.show_statistics is not None else True,
)
except Exception as e:
logger.error(f"Failed to update preferences: {e}")
raise HTTPException(status_code=500, detail=f"Fehler beim Speichern: {e}")
raise HTTPException(
status_code=503,
detail="Datenbank nicht verfuegbar - Einstellungen koennen nicht gespeichert werden"
)