Files
Benjamin Boenisch 5a31f52310 Initial commit: breakpilot-lehrer - Lehrer KI Platform
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>
2026-02-11 23:47:26 +01:00

153 lines
4.2 KiB
Python

"""
Klausur-Service Request Models
Pydantic models for API request/response validation.
"""
from typing import Optional, List, Dict, Any
from pydantic import BaseModel
from .enums import KlausurModus
# =============================================
# KLAUSUR REQUESTS
# =============================================
class KlausurCreate(BaseModel):
"""Request to create a new Klausur."""
title: str
subject: str
modus: KlausurModus = KlausurModus.VORABITUR
class_id: Optional[str] = None
year: int = 2025
semester: str = "Q1"
class KlausurUpdate(BaseModel):
"""Request to update a Klausur."""
title: Optional[str] = None
subject: Optional[str] = None
erwartungshorizont: Optional[Dict[str, Any]] = None
# =============================================
# STUDENT REQUESTS
# =============================================
class StudentUpload(BaseModel):
"""Request for student work upload metadata."""
student_name: str
student_id: Optional[str] = None
# =============================================
# GRADING REQUESTS
# =============================================
class CriterionScoreUpdate(BaseModel):
"""Request to update a criterion score."""
criterion: str
score: int
annotations: Optional[List[str]] = None
class GutachtenUpdate(BaseModel):
"""Request to update the Gutachten."""
einleitung: str
hauptteil: str
fazit: str
staerken: Optional[List[str]] = None
schwaechen: Optional[List[str]] = None
class GutachtenGenerateRequest(BaseModel):
"""Request to generate a KI-based Gutachten."""
include_strengths: bool = True
include_weaknesses: bool = True
tone: str = "formal" # formal, friendly, constructive
# BYOEH RAG Integration
use_eh: bool = False # Whether to use Erwartungshorizont for context
eh_passphrase: Optional[str] = None # Passphrase for EH decryption
# =============================================
# EXAMINER REQUESTS
# =============================================
class ExaminerAssignment(BaseModel):
"""Request to assign an examiner."""
examiner_id: str
examiner_role: str # first_examiner, second_examiner
notes: Optional[str] = None
class ExaminerResult(BaseModel):
"""Request to submit an examiner's result."""
grade_points: int
notes: Optional[str] = None
# =============================================
# BYOEH REQUESTS
# =============================================
class EHMetadata(BaseModel):
"""Metadata for an Erwartungshorizont."""
title: str
subject: str
niveau: str # 'eA' | 'gA'
year: int
aufgaben_nummer: Optional[str] = None
class EHUploadMetadata(BaseModel):
"""Metadata for EH upload including encryption info."""
metadata: EHMetadata
encryption_key_hash: str
salt: str
rights_confirmed: bool
original_filename: str
class EHRAGQuery(BaseModel):
"""Request for RAG query against Erwartungshorizonte."""
query_text: str
passphrase: str
subject: Optional[str] = None
limit: int = 5
class EHIndexRequest(BaseModel):
"""Request to index an Erwartungshorizont."""
passphrase: str
class EHShareRequest(BaseModel):
"""Request to share EH with another examiner."""
user_id: str # User to share with
role: str # second_examiner, third_examiner, supervisor
encrypted_passphrase: str # Passphrase encrypted for recipient
passphrase_hint: Optional[str] = None
klausur_id: Optional[str] = None # Optional: link to specific Klausur
class EHLinkKlausurRequest(BaseModel):
"""Request to link EH to a Klausur."""
klausur_id: str
class EHInviteRequest(BaseModel):
"""Request to invite another user to access an EH."""
invitee_email: str # Email of the recipient
invitee_id: Optional[str] = None # User ID if known
role: str # second_examiner, third_examiner, supervisor, department_head
klausur_id: Optional[str] = None # Optional: link to specific Klausur
message: Optional[str] = None # Optional message for the invitee
expires_in_days: int = 14 # Default 14 days expiration
class EHAcceptInviteRequest(BaseModel):
"""Request to accept an invitation and receive the encrypted passphrase."""
encrypted_passphrase: str # The passphrase encrypted for the invitee