Files
skrift-programme/Docker/signature-service/models.py
Lucas Orth 0341c4eaea Initiale Ablage der umsortierten Skrift-Programme
Struktur: Docker/ (skrift-backend, signature-service), Webseite/
(skrift-configurator, skrift-job-manager), Produktion/ (skrift-produktion,
AutoRecover). Aufgeräumt: signature-to-svg entfernt, Backend-PayPal-Service
entfernt (PayPal läuft client-seitig im Configurator), Dev-/Test-Artefakte
und Deployment-Dokus bereinigt, .dockerignore repariert. CLAUDE.md mit
Architektur ergänzt. Secrets (.env, config.json) via .gitignore ausgeschlossen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 12:21:08 +02:00

30 lines
1.4 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""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