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
+10 -2
View File
@@ -502,7 +502,11 @@ def _vorlagen_exportieren(db: Session) -> list[dict]:
if fd is None:
continue
pfad = _category_path(db, db.get(Category, fd.category_id))
feldfilter.append({"feld": f"{pfad}::{fd.label}", "wert": bedingung["wert"]})
feldfilter.append({
"feld": f"{pfad}::{fd.label}",
"op": bedingung.get("op", "="),
"wert": bedingung["wert"],
})
zeilen.append({
"name": v.name,
@@ -573,7 +577,11 @@ def _vorlagen_importieren(db: Session, zeilen: list, errors: list[str]) -> int:
# Wie bei den Spalten: fehlt das Feld hier, faellt die Bedingung
# weg statt die ganze Vorlage scheitern zu lassen.
if fd is not None:
feldfilter.append({"feld_id": fd.id, "wert": bedingung.get("wert", "")})
feldfilter.append({
"feld_id": fd.id,
"op": bedingung.get("op", "="),
"wert": bedingung.get("wert", ""),
})
kategorie_ids = [
pfad_zu_id[p] for p in entry.get("kategorien", []) if p in pfad_zu_id