- 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>
60 lines
1.7 KiB
Python
60 lines
1.7 KiB
Python
"""
|
|
Hilfsfunktionen für MCP-Tool-Implementierungen.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
from datetime import date, datetime, time
|
|
from decimal import Decimal
|
|
from uuid import UUID
|
|
|
|
|
|
def serialize_value(value):
|
|
"""Konvertiert Django-Feldwerte in JSON-serialisierbare Typen."""
|
|
if isinstance(value, UUID):
|
|
return str(value)
|
|
if isinstance(value, Decimal):
|
|
return float(value)
|
|
if isinstance(value, (date, datetime)):
|
|
return value.isoformat()
|
|
if isinstance(value, time):
|
|
return value.isoformat()
|
|
return value
|
|
|
|
|
|
def model_to_dict(instance, fields=None, exclude=None) -> dict:
|
|
"""
|
|
Konvertiert eine Django-Model-Instanz in ein serialisierbares Dict.
|
|
|
|
Args:
|
|
instance: Django Model Instanz
|
|
fields: Nur diese Felder einschließen (None = alle)
|
|
exclude: Diese Felder ausschließen
|
|
"""
|
|
exclude = exclude or []
|
|
result = {}
|
|
for field in instance._meta.fields:
|
|
name = field.name
|
|
if fields and name not in fields:
|
|
continue
|
|
if name in exclude:
|
|
continue
|
|
value = getattr(instance, name)
|
|
# ForeignKey: _id-Suffix-Wert (nicht ganzes Objekt)
|
|
result[name] = serialize_value(value)
|
|
|
|
# Auch ForeignKey-IDs explizit aufnehmen (z.B. konto_id)
|
|
for field in instance._meta.fields:
|
|
if hasattr(field, "attname") and field.attname != field.name:
|
|
attname = field.attname
|
|
if attname not in result:
|
|
result[attname] = serialize_value(getattr(instance, attname))
|
|
|
|
return result
|
|
|
|
|
|
def format_result(data) -> str:
|
|
"""Gibt Daten als formatiertes JSON zurück."""
|
|
return json.dumps(data, ensure_ascii=False, indent=2, default=str)
|