Fix: numbers-Filter nach distinkter Brief-Nummer statt Dateiposition
Bei mehrseitigen Briefen war die Auswahl positionsbasiert ueber Dateien: 24 zwei- seitige Briefe = 48 Dateien, aber numbers=1-24 (Empfaengerzahl) behielt nur die ersten 24 Dateien (Briefe 1-12). Jetzt gruppiert der Filter nach distinkter Brief- Nummer (alle Seiten eines Briefs bleiben zusammen), robust gegen 0-/1-basierte Namen. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
29
agent.py
29
agent.py
@@ -184,6 +184,23 @@ def seiten_reihenfolge(files):
|
|||||||
return sorted(files, key=key)
|
return sorted(files, key=key)
|
||||||
|
|
||||||
|
|
||||||
|
def brief_nummer(name):
|
||||||
|
"""Brief-Nummer aus dem Dateinamen: letter_001_p2.svg → 1, envelope_003.svg → 3.
|
||||||
|
|
||||||
|
None, wenn nicht parsebar. Die Seite (_pN) wird ignoriert – alle Seiten eines
|
||||||
|
Briefs teilen sich dieselbe Nummer.
|
||||||
|
"""
|
||||||
|
rest = str(name or "").lower()
|
||||||
|
for pre in ("letter_", "envelope_", "kuvert_"):
|
||||||
|
if rest.startswith(pre):
|
||||||
|
rest = rest[len(pre):]
|
||||||
|
break
|
||||||
|
rest = rest.split(".")[0]
|
||||||
|
if "_p" in rest:
|
||||||
|
rest = rest.split("_p")[0]
|
||||||
|
return int(rest) if rest.isdigit() else None
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
cfg = lade_config()
|
cfg = lade_config()
|
||||||
dx = Directus(cfg["directus_url"], cfg["directus_token"])
|
dx = Directus(cfg["directus_url"], cfg["directus_token"])
|
||||||
@@ -357,11 +374,17 @@ def _job_dateien(dx, job, KIND):
|
|||||||
key=lambda f: f.get("name", ""),
|
key=lambda f: f.get("name", ""),
|
||||||
)
|
)
|
||||||
# Nur bestimmte Briefnummern drucken, falls im Job angegeben.
|
# Nur bestimmte Briefnummern drucken, falls im Job angegeben.
|
||||||
# Positionsbasiert (1 = erstes Dokument), NICHT über die Zahl im
|
# Positionsbasiert über DISTINKTE Brief-Nummern (nicht über die Dateiposition!),
|
||||||
# Dateinamen: Alt-Aufträge sind 0-basiert (letter_000.svg), neue
|
# damit mehrseitige Briefe komplett bleiben: 24 zweiseitige Briefe = 48 Dateien,
|
||||||
# 1-basiert (letter_001.svg). Die Position stimmt in beiden Fällen.
|
# numbers="1-24" wählt alle 24 Briefe → alle 48 Seiten. Robust gegen 0-/1-basierte
|
||||||
|
# Namen. Fallback auf die alte Dateiposition, falls keine Nummer parsebar ist.
|
||||||
nummern = parse_nummern(job.get("numbers"))
|
nummern = parse_nummern(job.get("numbers"))
|
||||||
if nummern is not None:
|
if nummern is not None:
|
||||||
|
distinkt = sorted({n for n in (brief_nummer(f.get("name")) for f in passende) if n is not None})
|
||||||
|
if distinkt:
|
||||||
|
erlaubt = {distinkt[i - 1] for i in nummern if 1 <= i <= len(distinkt)}
|
||||||
|
passende = [f for f in passende if brief_nummer(f.get("name")) in erlaubt]
|
||||||
|
else:
|
||||||
passende = [f for i, f in enumerate(passende, start=1) if i in nummern]
|
passende = [f for i, f in enumerate(passende, start=1) if i in nummern]
|
||||||
if not passende:
|
if not passende:
|
||||||
raise RuntimeError(f"Keine Dateien vom Typ '{gewuenscht}' für {order_nr} gefunden.")
|
raise RuntimeError(f"Keine Dateien vom Typ '{gewuenscht}' für {order_nr} gefunden.")
|
||||||
|
|||||||
Reference in New Issue
Block a user