30 lines
1.4 KiB
Python
30 lines
1.4 KiB
Python
"""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
|