Services: Admin-Lehrer, Backend-Lehrer, Studio v2, Website, Klausur-Service, School-Service, Voice-Service, Geo-Service, BreakPilot Drive, Agent-Core Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
110 lines
3.2 KiB
Python
110 lines
3.2 KiB
Python
"""
|
|
Klausur-Service Exam Routes
|
|
|
|
CRUD endpoints for Klausuren.
|
|
"""
|
|
|
|
import uuid
|
|
from datetime import datetime, timezone
|
|
|
|
from fastapi import APIRouter, HTTPException, Request
|
|
|
|
from models.exam import Klausur
|
|
from models.requests import KlausurCreate, KlausurUpdate
|
|
from services.auth_service import get_current_user
|
|
import storage
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.get("/api/v1/klausuren")
|
|
async def list_klausuren(request: Request):
|
|
"""List all Klausuren for current teacher."""
|
|
user = get_current_user(request)
|
|
user_klausuren = [
|
|
k.to_dict() for k in storage.klausuren_db.values()
|
|
if k.teacher_id == user["user_id"]
|
|
]
|
|
return user_klausuren
|
|
|
|
|
|
@router.post("/api/v1/klausuren")
|
|
async def create_klausur(data: KlausurCreate, request: Request):
|
|
"""Create a new Klausur."""
|
|
user = get_current_user(request)
|
|
|
|
klausur = Klausur(
|
|
id=str(uuid.uuid4()),
|
|
title=data.title,
|
|
subject=data.subject,
|
|
modus=data.modus,
|
|
class_id=data.class_id,
|
|
year=data.year,
|
|
semester=data.semester,
|
|
erwartungshorizont=None,
|
|
students=[],
|
|
created_at=datetime.now(timezone.utc),
|
|
teacher_id=user["user_id"]
|
|
)
|
|
|
|
storage.klausuren_db[klausur.id] = klausur
|
|
return klausur.to_dict()
|
|
|
|
|
|
@router.get("/api/v1/klausuren/{klausur_id}")
|
|
async def get_klausur(klausur_id: str, request: Request):
|
|
"""Get a specific Klausur."""
|
|
user = get_current_user(request)
|
|
|
|
if klausur_id not in storage.klausuren_db:
|
|
raise HTTPException(status_code=404, detail="Klausur not found")
|
|
|
|
klausur = storage.klausuren_db[klausur_id]
|
|
if klausur.teacher_id != user["user_id"] and user.get("role") != "admin":
|
|
raise HTTPException(status_code=403, detail="Access denied")
|
|
|
|
return klausur.to_dict()
|
|
|
|
|
|
@router.put("/api/v1/klausuren/{klausur_id}")
|
|
async def update_klausur(klausur_id: str, data: KlausurUpdate, request: Request):
|
|
"""Update a Klausur."""
|
|
user = get_current_user(request)
|
|
|
|
if klausur_id not in storage.klausuren_db:
|
|
raise HTTPException(status_code=404, detail="Klausur not found")
|
|
|
|
klausur = storage.klausuren_db[klausur_id]
|
|
if klausur.teacher_id != user["user_id"] and user.get("role") != "admin":
|
|
raise HTTPException(status_code=403, detail="Access denied")
|
|
|
|
if data.title:
|
|
klausur.title = data.title
|
|
if data.subject:
|
|
klausur.subject = data.subject
|
|
if data.erwartungshorizont:
|
|
klausur.erwartungshorizont = data.erwartungshorizont
|
|
|
|
return klausur.to_dict()
|
|
|
|
|
|
@router.delete("/api/v1/klausuren/{klausur_id}")
|
|
async def delete_klausur(klausur_id: str, request: Request):
|
|
"""Delete a Klausur and all associated student work."""
|
|
user = get_current_user(request)
|
|
|
|
if klausur_id not in storage.klausuren_db:
|
|
raise HTTPException(status_code=404, detail="Klausur not found")
|
|
|
|
klausur = storage.klausuren_db[klausur_id]
|
|
if klausur.teacher_id != user["user_id"] and user.get("role") != "admin":
|
|
raise HTTPException(status_code=403, detail="Access denied")
|
|
|
|
# Remove student records
|
|
for student in klausur.students:
|
|
if student.id in storage.students_db:
|
|
del storage.students_db[student.id]
|
|
|
|
del storage.klausuren_db[klausur_id]
|
|
return {"success": True}
|