v4.1.0: DMS email documents, category-specific Nachweis linking, version system
Some checks failed
CI/CD Pipeline / test (push) Has been cancelled
CI/CD Pipeline / deploy (push) Has been cancelled
Code Quality / quality (push) Has been cancelled

- Save cover email body as DMS document with new 'email' context type
- Show email body separately from attachments in email detail view
- Add per-category DMS document assignment in quarterly confirmation
  (Studiennachweis, Einkommenssituation, Vermögenssituation)
- Add VERSION file and context processor for automatic version display
- Add MCP server, agent system, import/export, and new migrations
- Update compose files and production environment template

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
SysAdmin Agent
2026-03-15 18:48:52 +00:00
parent faeb7c1073
commit e0b377014c
49 changed files with 5913 additions and 55 deletions

View File

@@ -332,11 +332,58 @@ def poll_emails(self, search_all_recent_days=0):
if doc:
dms_dokumente.append(doc)
# Cover-Email als eigenes DMS-Dokument speichern
email_body_doc = None
if email_text.strip():
email_filename = f"Email_{eingangsdatum.strftime('%Y%m%d_%H%M')}_{betreff[:50]}.txt"
# Bereinige Dateinamen
email_filename = re.sub(r'[^\w\s\-._]', '', email_filename)
anhang_count = len(dms_dokumente)
anhang_hinweis = (
f"\n\n--- Anhänge: {anhang_count} ---\n"
+ "\n".join(f"{d.dateiname_original or d.titel}" for d in dms_dokumente)
if dms_dokumente else ""
)
email_body_content = (
f"Von: {absender_name} <{absender_email_addr}>\n"
f"Datum: {eingangsdatum.strftime('%d.%m.%Y %H:%M')}\n"
f"Betreff: {betreff}\n"
f"{'=' * 60}\n\n"
f"{email_text}"
f"{anhang_hinweis}"
)
email_body_doc = _save_to_dms(
content=email_body_content.encode("utf-8"),
filename=email_filename,
destinataer=destinataer,
betreff=betreff,
kontext="email",
)
if email_body_doc:
# Beschreibung mit Anhang-Verweis ergaenzen
if dms_dokumente:
email_body_doc.beschreibung = (
f"E-Mail-Nachricht mit {anhang_count} Anhang/Anhängen.\n"
f"Absender: {absender_name} <{absender_email_addr}>"
)
else:
email_body_doc.beschreibung = (
f"E-Mail-Nachricht (ohne Anhänge).\n"
f"Absender: {absender_name} <{absender_email_addr}>"
)
email_body_doc.save(update_fields=["beschreibung"])
# Alle DMS-Dokumente (Email-Body + Anhaenge) verknuepfen
alle_dms_dokumente = []
if email_body_doc:
alle_dms_dokumente.append(email_body_doc)
alle_dms_dokumente.extend(dms_dokumente)
if dms_dokumente:
eingang.status = "verarbeitet" if destinataer else status
eingang.save()
if dms_dokumente:
eingang.dokument_dateien.set(dms_dokumente)
if alle_dms_dokumente:
eingang.dokument_dateien.set(alle_dms_dokumente)
# Als gelesen markieren
mail.store(msg_id, "+FLAGS", "\\Seen")