Exportbedingungen: Vergleichsart je Feldart statt nacktem Textfeld

Bisher tippte man den Wert immer von Hand ein - auch bei einem Haken, wo man
wissen musste, dass intern "true" steht, und bei einer Auswahl, wo ein
Vertipper stillschweigend nichts fand. Das ist der unangenehmste Fehlschlag:
Die CSV kommt einfach leer heraus, ohne Hinweis warum.

Jetzt bringt jede Bedingung die passende Eingabe mit:

  Ja/Nein    ein Haken
  Auswahl    "ist gleich" / "ist nicht gleich" plus das Dropdown der Optionen
  Zahl       "ist groesser =" / "ist =" / "ist kleiner =" plus Zahlenfeld
  Text       wie bisher freie Eingabe, leer = ohne Wert

Damit die Oberflaeche das kann, traegt /etiketten/spalten jetzt Art und
Auswahlwerte je Feld mit - vorher gab es nur Schluessel und Titel.

Der Filter bekommt dafuer ein op (=, !=, >=, <=), Vorgabe "=", damit
bestehende Vorlagen unveraendert weiterlaufen. Groesser/kleiner vergleicht
als Zahl und nimmt Komma wie Punkt; Zeilen ohne Wert treffen dabei NIE -
"leer" ist nicht kleiner als drei, es ist unvergleichbar. Eine unbekannte
Vergleichsart faellt auf "=" zurueck statt den Export zu zerreissen.

Die Sicherung traegt das op mit, wie schon das Feld selbst.

Sieben neue Tests, 547 gruen. Diesmal zusaetzlich in der laufenden Oberflaeche
durchgespielt: Alle vier Feldarten zeigen die richtige Eingabe, der Filter
wird gespeichert, und die CSV enthaelt bei "Laenge >= 5" genau die Artikel
mit 5 und 12 - nicht den mit 2 und nicht den ohne Wert.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-10-16 16:18:48 +02:00
co-authored by Claude Opus 5
parent dd57d3356a
commit 8de222072c
5 changed files with 250 additions and 31 deletions
+15 -3
View File
@@ -1124,17 +1124,29 @@ class SpalteOut(BaseModel):
schluessel: str
titel: str
# Nur bei eigenen Feldern gefuellt. Die Oberflaeche braucht beides, um beim
# Wertefilter die passende Eingabe anzubieten (Checkbox, Auswahl, Zahl).
typ: str = ""
optionen: list[str] = []
class FeldFilter(BaseModel):
"""Eine Bedingung auf einem eigenen Feld.
Mehrere Bedingungen muessen alle zutreffen. Verglichen wird genau, aber
ohne Ruecksicht auf Gross-/Kleinschreibung. Ein leerer ``wert`` trifft die
Zeilen OHNE Wert in diesem Feld.
Mehrere Bedingungen muessen alle zutreffen.
``op`` ist die Vergleichsart. Vorgabe ist ``=``, damit aeltere Vorlagen
ohne Angabe unveraendert weiterlaufen:
* ``=`` / ``!=`` – genau gleich bzw. ungleich, ohne Ruecksicht auf
Gross-/Kleinschreibung. Ein leerer ``wert`` trifft bei ``=`` die Zeilen
OHNE Wert in diesem Feld.
* ``>=`` / ``<=`` – nur bei Zahlenfeldern sinnvoll; Zeilen ohne Wert oder
mit unlesbarer Zahl treffen nie.
"""
feld_id: int
op: str = Field(default="=", pattern=r"^(=|!=|>=|<=)$")
wert: str = ""