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)
|
||||
|
||||
|
||||
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():
|
||||
cfg = lade_config()
|
||||
dx = Directus(cfg["directus_url"], cfg["directus_token"])
|
||||
@@ -357,11 +374,17 @@ def _job_dateien(dx, job, KIND):
|
||||
key=lambda f: f.get("name", ""),
|
||||
)
|
||||
# Nur bestimmte Briefnummern drucken, falls im Job angegeben.
|
||||
# Positionsbasiert (1 = erstes Dokument), NICHT über die Zahl im
|
||||
# Dateinamen: Alt-Aufträge sind 0-basiert (letter_000.svg), neue
|
||||
# 1-basiert (letter_001.svg). Die Position stimmt in beiden Fällen.
|
||||
# Positionsbasiert über DISTINKTE Brief-Nummern (nicht über die Dateiposition!),
|
||||
# damit mehrseitige Briefe komplett bleiben: 24 zweiseitige Briefe = 48 Dateien,
|
||||
# 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"))
|
||||
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]
|
||||
if not passende:
|
||||
raise RuntimeError(f"Keine Dateien vom Typ '{gewuenscht}' für {order_nr} gefunden.")
|
||||
|
||||
Reference in New Issue
Block a user