Add MCP tools for Veranstaltung participant management
- veranstaltungen_anzeigen: list events with participant counts - veranstaltung_teilnehmer_anzeigen: list participants by event - veranstaltung_teilnehmer_anlegen: add single participant - veranstaltung_teilnehmer_importieren: bulk import via JSON array Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -569,6 +569,100 @@ def termine_anzeigen(
|
||||
return format_result({"anzahl": len(results), "termine": results})
|
||||
|
||||
|
||||
# ──────────────────────────────────────────────────────────────────────────────
|
||||
# Veranstaltungen
|
||||
# ──────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
def veranstaltungen_anzeigen(
|
||||
status: str = "",
|
||||
limit: int = 20,
|
||||
) -> str:
|
||||
"""
|
||||
Zeigt Veranstaltungen der Stiftung an.
|
||||
|
||||
Args:
|
||||
status: geplant/einladungen_versendet/abgeschlossen/abgesagt (optional, leer = alle)
|
||||
limit: Maximale Anzahl (max. 50)
|
||||
"""
|
||||
from stiftung.models.veranstaltungen import Veranstaltung
|
||||
|
||||
role = _get_role()
|
||||
limit = min(limit, 50)
|
||||
|
||||
qs = Veranstaltung.objects.all()
|
||||
if status:
|
||||
qs = qs.filter(status=status)
|
||||
|
||||
qs = qs.order_by("-datum")[:limit]
|
||||
|
||||
results = []
|
||||
for v in qs:
|
||||
results.append({
|
||||
"id": str(v.id),
|
||||
"titel": v.titel,
|
||||
"datum": v.datum.isoformat(),
|
||||
"uhrzeit": v.uhrzeit.isoformat() if v.uhrzeit else None,
|
||||
"ort": v.ort,
|
||||
"status": v.status,
|
||||
"teilnehmer_gesamt": v.get_teilnehmer_count(),
|
||||
"zugesagt": v.get_zugesagte_count(),
|
||||
"abgesagt": v.get_abgesagte_count(),
|
||||
})
|
||||
|
||||
log_mcp_read(role, "veranstaltung", "Veranstaltungsübersicht", f"{len(results)} Veranstaltungen")
|
||||
return format_result({"anzahl": len(results), "veranstaltungen": results})
|
||||
|
||||
|
||||
def veranstaltung_teilnehmer_anzeigen(
|
||||
veranstaltung_id: str,
|
||||
rsvp_status: str = "",
|
||||
) -> str:
|
||||
"""
|
||||
Zeigt die Teilnehmer einer Veranstaltung an.
|
||||
|
||||
Args:
|
||||
veranstaltung_id: UUID der Veranstaltung (Pflichtfeld)
|
||||
rsvp_status: eingeladen/zugesagt/abgesagt/keine_rueckmeldung (optional, leer = alle)
|
||||
"""
|
||||
from stiftung.models.veranstaltungen import Veranstaltung
|
||||
|
||||
role = _get_role()
|
||||
|
||||
try:
|
||||
veranstaltung = Veranstaltung.objects.get(id=veranstaltung_id)
|
||||
except Veranstaltung.DoesNotExist:
|
||||
return format_result({"fehler": f"Veranstaltung {veranstaltung_id} nicht gefunden"})
|
||||
|
||||
qs = veranstaltung.teilnehmer.all()
|
||||
if rsvp_status:
|
||||
qs = qs.filter(rsvp_status=rsvp_status)
|
||||
|
||||
results = []
|
||||
for t in qs:
|
||||
results.append({
|
||||
"id": str(t.id),
|
||||
"anrede": t.anrede,
|
||||
"vorname": t.vorname,
|
||||
"nachname": t.nachname,
|
||||
"strasse": t.strasse,
|
||||
"plz": t.plz,
|
||||
"ort": t.ort,
|
||||
"email": t.email,
|
||||
"rsvp_status": t.rsvp_status,
|
||||
"destinataer_id": str(t.destinataer_id) if t.destinataer_id else None,
|
||||
})
|
||||
|
||||
log_mcp_read(
|
||||
role, "veranstaltung", str(veranstaltung.id),
|
||||
f"{len(results)} Teilnehmer von '{veranstaltung.titel}'",
|
||||
)
|
||||
return format_result({
|
||||
"veranstaltung": str(veranstaltung),
|
||||
"anzahl": len(results),
|
||||
"teilnehmer": results,
|
||||
})
|
||||
|
||||
|
||||
# ──────────────────────────────────────────────────────────────────────────────
|
||||
# Globale Suche & Dashboard
|
||||
# ──────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
Reference in New Issue
Block a user