Install LOC guardrails (check-loc.sh, architecture.md, pre-commit hook) and split all 44 files exceeding 500 LOC into domain-focused modules: - consent-service (Go): models, handlers, services, database splits - backend-core (Python): security_api, rbac_api, pdf_service, auth splits - admin-core (TypeScript): 5 page.tsx + sidebar extractions - pitch-deck (TypeScript): 6 slides, 3 UI components, engine.ts splits - voice-service (Python): enhanced_task_orchestrator split Result: 0 violations, 36 exempted (pipeline, tests, pure-data files). Go build verified clean. No behavior changes — pure structural splits. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
86 lines
2.2 KiB
Python
86 lines
2.2 KiB
Python
"""
|
|
PDF Models - Dataclasses fuer PDF-Generierung.
|
|
|
|
Enthaelt alle Datenmodelle die von PDFService und den Convenience-Funktionen
|
|
in pdf_service.py verwendet werden.
|
|
"""
|
|
|
|
from dataclasses import dataclass
|
|
from typing import Any, Dict, List, Optional
|
|
|
|
|
|
@dataclass
|
|
class SchoolInfo:
|
|
"""Schulinformationen fuer Header."""
|
|
name: str
|
|
address: str
|
|
phone: str
|
|
email: str
|
|
logo_path: Optional[str] = None
|
|
website: Optional[str] = None
|
|
principal: Optional[str] = None
|
|
|
|
|
|
@dataclass
|
|
class LetterData:
|
|
"""Daten fuer Elternbrief-PDF."""
|
|
recipient_name: str
|
|
recipient_address: str
|
|
student_name: str
|
|
student_class: str
|
|
subject: str
|
|
content: str
|
|
date: str
|
|
teacher_name: str
|
|
teacher_title: Optional[str] = None
|
|
school_info: Optional[SchoolInfo] = None
|
|
letter_type: str = "general" # general, halbjahr, fehlzeiten, elternabend, lob
|
|
tone: str = "professional"
|
|
legal_references: Optional[List[Dict[str, str]]] = None
|
|
gfk_principles_applied: Optional[List[str]] = None
|
|
|
|
|
|
@dataclass
|
|
class CertificateData:
|
|
"""Daten fuer Zeugnis-PDF."""
|
|
student_name: str
|
|
student_birthdate: str
|
|
student_class: str
|
|
school_year: str
|
|
certificate_type: str # halbjahr, jahres, abschluss
|
|
subjects: List[Dict[str, Any]] # [{name, grade, note}]
|
|
attendance: Dict[str, int] # {days_absent, days_excused, days_unexcused}
|
|
remarks: Optional[str] = None
|
|
class_teacher: str = ""
|
|
principal: str = ""
|
|
school_info: Optional[SchoolInfo] = None
|
|
issue_date: str = ""
|
|
social_behavior: Optional[str] = None # A, B, C, D
|
|
work_behavior: Optional[str] = None # A, B, C, D
|
|
|
|
|
|
@dataclass
|
|
class StudentInfo:
|
|
"""Schuelerinformationen fuer Korrektur-PDFs."""
|
|
student_id: str
|
|
name: str
|
|
class_name: str
|
|
|
|
|
|
@dataclass
|
|
class CorrectionData:
|
|
"""Daten fuer Korrektur-Uebersicht PDF."""
|
|
student: StudentInfo
|
|
exam_title: str
|
|
subject: str
|
|
date: str
|
|
max_points: int
|
|
achieved_points: int
|
|
grade: str
|
|
percentage: float
|
|
corrections: List[Dict[str, Any]] # [{question, answer, points, feedback}]
|
|
teacher_notes: str = ""
|
|
ai_feedback: str = ""
|
|
grade_distribution: Optional[Dict[str, int]] = None # {note: anzahl}
|
|
class_average: Optional[float] = None
|