"""Pydantic-Modelle für die Job-Definition des Signatur-Plotter-Service.""" from typing import Literal from pydantic import BaseModel, Field, field_validator class SignatureJob(BaseModel): """Ein Eintrag der Job-Definition: ordnet genau einen Marker-Token einer SVG zu.""" token: str # unsichtbarer Token im PDF, z.B. "§§SIG1§§" svg_id: str # Dateiname der hochgeladenen SVG # Lage relativ zum Token. "genau" = direkt an der Marker-Position (Standard), # "ueber"/"unter" = mit Abstand darüber/darunter. position: Literal["genau", "ueber", "unter"] = "genau" breite_mm: float = Field(default=45.0, gt=0) # Zielbreite der Unterschrift abstand_mm: float = Field(default=8.0, ge=0) # Abstand (nur bei ueber/unter relevant) # Feinjustierung relativ zur berechneten Position (darf negativ sein): versatz_x_mm: float = 0.0 # + = nach rechts, − = nach links versatz_y_mm: float = 0.0 # + = nach unten, − = nach oben # Signaturen werden grundsätzlich als Single-Stroke gezeichnet (keine Füllung). linienstaerke_mm: float = Field(default=0.35, gt=0) # Linienstärke der Kontur @field_validator("token", "svg_id") @classmethod def _not_blank(cls, v: str) -> str: if not v or not v.strip(): raise ValueError("darf nicht leer sein") return v