Backend: gemeinsame Helfer in common.py

- Eine ValidationError-Klasse statt zwei (links.py, projects.py), ein
  Fehler-Handler in main.py
- clean_text() ersetzt vier fast gleiche Text-Prüfungen (Kanban, Haushalt,
  Reisen, Artikel); Fehlermeldungen nennen jetzt überall die Höchstlänge
- Zeitstempel (now_iso, iso_ago, iso_after) und Kontenliste (user_list)
  an einer Stelle; ungenutzte Importe entfernt
- Tests für die Helfer und für einheitliche 400-Fehler aus allen Bereichen

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
guyg1474andClaude Opus 5.5 committed 2026-10-15 18:10:43 +02:00
1 parent d28e6b2e4b
commit 4aba48ce51
14 files changed
+117 -86

No files matched your search

+4 -11
View File
@@ -9,7 +9,8 @@ from fastapi.responses import FileResponse
from .auth import current_user
from .config import DATA_DIR
from .db import now_iso, transaction
from .common import ValidationError, clean_text, now_iso
from .db import transaction
from .kanban import boards_for_article
router = APIRouter()
@@ -25,10 +26,6 @@ MAX_UPLOAD = 15 * 1024 * 1024
MIME = {"jpg": "image/jpeg", "png": "image/png", "gif": "image/gif", "webp": "image/webp"}
class ValidationError(ValueError):
pass
# ---------- Artikel-HTML bereinigen ----------
ALLOWED_TAGS = {"p", "br", "h2", "h3", "strong", "b", "em", "i", "u", "s", "ul", "ol", "li", "blockquote", "hr", "a", "img"}
@@ -59,12 +56,8 @@ def sanitize(content: str) -> str:
# ---------- Validierung ----------
def _text(value, field: str, max_len: int, required: bool = False) -> str:
v = value.strip() if isinstance(value, str) else ""
if required and not v:
raise ValidationError(f"{field} fehlt.")
if len(v) > max_len:
raise ValidationError(f"{field} ist zu lang (max. {max_len} Zeichen).")
return v
# Zeilenumbrüche in Kurzbeschreibung und Artikeltext bleiben erhalten
return clean_text(value, field, max_len, required=required, collapse=False)
def _image(value) -> str | None: