WebCal: Tierarzt-Termine, Medikamenten-Enddaten, Hunde-Geburtstage ergänzt
This commit is contained in:
parent
a10a6a3f06
commit
e9bfe618ad
1 changed files with 93 additions and 2 deletions
|
|
@ -152,7 +152,7 @@ async def ical_feed(token: str):
|
||||||
|
|
||||||
vevents = []
|
vevents = []
|
||||||
|
|
||||||
# ── 1. Health-Erinnerungen ─────────────────────────────────
|
# ── 1. Health-Erinnerungen (Nächster Termin) ──────────────
|
||||||
if dog_ids:
|
if dog_ids:
|
||||||
ph = ','.join('?' * len(dog_ids))
|
ph = ','.join('?' * len(dog_ids))
|
||||||
health_rows = conn.execute(
|
health_rows = conn.execute(
|
||||||
|
|
@ -181,7 +181,6 @@ async def ical_feed(token: str):
|
||||||
if e["intervall_tage"]:
|
if e["intervall_tage"]:
|
||||||
rrule = f"FREQ=DAILY;INTERVAL={e['intervall_tage']}"
|
rrule = f"FREQ=DAILY;INTERVAL={e['intervall_tage']}"
|
||||||
|
|
||||||
# next-day als DTEND (All-Day-Event)
|
|
||||||
dtend_date = (date.fromisoformat(e["naechstes"]) + timedelta(days=1)).isoformat()
|
dtend_date = (date.fromisoformat(e["naechstes"]) + timedelta(days=1)).isoformat()
|
||||||
vevents.append(_vevent(
|
vevents.append(_vevent(
|
||||||
uid = _uid('health', e["id"]),
|
uid = _uid('health', e["id"]),
|
||||||
|
|
@ -192,6 +191,98 @@ async def ical_feed(token: str):
|
||||||
rrule = rrule,
|
rrule = rrule,
|
||||||
))
|
))
|
||||||
|
|
||||||
|
# ── 1b. Tierarzt-Termine ───────────────────────────────────
|
||||||
|
if dog_ids:
|
||||||
|
ph = ','.join('?' * len(dog_ids))
|
||||||
|
tierarzt_rows = conn.execute(
|
||||||
|
f"""SELECT h.id, h.bezeichnung, h.datum, h.notiz,
|
||||||
|
h.tierarzt_name, h.dog_id
|
||||||
|
FROM health h
|
||||||
|
WHERE h.dog_id IN ({ph})
|
||||||
|
AND h.typ = 'tierarzt'
|
||||||
|
AND h.datum >= date('now')
|
||||||
|
ORDER BY h.datum""",
|
||||||
|
dog_ids
|
||||||
|
).fetchall()
|
||||||
|
|
||||||
|
for e in tierarzt_rows:
|
||||||
|
dog_name = dog_map.get(e["dog_id"], "Hund")
|
||||||
|
desc_parts = []
|
||||||
|
if e["tierarzt_name"]:
|
||||||
|
desc_parts.append(f"Praxis: {e['tierarzt_name']}")
|
||||||
|
if e["notiz"]:
|
||||||
|
desc_parts.append(e["notiz"])
|
||||||
|
dtend_date = (date.fromisoformat(e["datum"]) + timedelta(days=1)).isoformat()
|
||||||
|
vevents.append(_vevent(
|
||||||
|
uid = _uid('tierarzt', e["id"]),
|
||||||
|
dtstart = f";VALUE=DATE:{_date_str(e['datum'])}",
|
||||||
|
dtend = f";VALUE=DATE:{_date_str(dtend_date)}",
|
||||||
|
summary = f"Tierarzt: {e['bezeichnung']} ({dog_name})",
|
||||||
|
description = '\n'.join(desc_parts),
|
||||||
|
))
|
||||||
|
|
||||||
|
# ── 1c. Medikamente mit Enddatum ──────────────────────────
|
||||||
|
if dog_ids:
|
||||||
|
ph = ','.join('?' * len(dog_ids))
|
||||||
|
medi_rows = conn.execute(
|
||||||
|
f"""SELECT h.id, h.bezeichnung, h.bis_datum, h.notiz,
|
||||||
|
h.dosierung, h.dog_id
|
||||||
|
FROM health h
|
||||||
|
WHERE h.dog_id IN ({ph})
|
||||||
|
AND h.typ = 'medikament'
|
||||||
|
AND h.bis_datum IS NOT NULL
|
||||||
|
AND h.bis_datum >= date('now')
|
||||||
|
ORDER BY h.bis_datum""",
|
||||||
|
dog_ids
|
||||||
|
).fetchall()
|
||||||
|
|
||||||
|
for e in medi_rows:
|
||||||
|
dog_name = dog_map.get(e["dog_id"], "Hund")
|
||||||
|
desc_parts = []
|
||||||
|
if e["dosierung"]:
|
||||||
|
desc_parts.append(f"Dosierung: {e['dosierung']}")
|
||||||
|
if e["notiz"]:
|
||||||
|
desc_parts.append(e["notiz"])
|
||||||
|
dtend_date = (date.fromisoformat(e["bis_datum"]) + timedelta(days=1)).isoformat()
|
||||||
|
vevents.append(_vevent(
|
||||||
|
uid = _uid('medi-end', e["id"]),
|
||||||
|
dtstart = f";VALUE=DATE:{_date_str(e['bis_datum'])}",
|
||||||
|
dtend = f";VALUE=DATE:{_date_str(dtend_date)}",
|
||||||
|
summary = f"Medikament Ende: {e['bezeichnung']} ({dog_name})",
|
||||||
|
description = '\n'.join(desc_parts),
|
||||||
|
))
|
||||||
|
|
||||||
|
# ── 1d. Hunde-Geburtstage (jährlich wiederkehrend) ────────
|
||||||
|
if dog_ids:
|
||||||
|
ph = ','.join('?' * len(dog_ids))
|
||||||
|
bday_rows = conn.execute(
|
||||||
|
f"""SELECT id, name, geburtstag
|
||||||
|
FROM dogs
|
||||||
|
WHERE id IN ({ph})
|
||||||
|
AND geburtstag IS NOT NULL""",
|
||||||
|
dog_ids
|
||||||
|
).fetchall()
|
||||||
|
|
||||||
|
for d in bday_rows:
|
||||||
|
try:
|
||||||
|
bday = date.fromisoformat(d["geburtstag"])
|
||||||
|
except ValueError:
|
||||||
|
continue
|
||||||
|
# Nächsten Geburtstag im laufenden oder nächsten Jahr
|
||||||
|
today = date.today()
|
||||||
|
next_bday = bday.replace(year=today.year)
|
||||||
|
if next_bday < today:
|
||||||
|
next_bday = bday.replace(year=today.year + 1)
|
||||||
|
dtend_date = (next_bday + timedelta(days=1)).isoformat()
|
||||||
|
age = next_bday.year - bday.year
|
||||||
|
vevents.append(_vevent(
|
||||||
|
uid = _uid('bday', d["id"]),
|
||||||
|
dtstart = f";VALUE=DATE:{_date_str(next_bday.isoformat())}",
|
||||||
|
dtend = f";VALUE=DATE:{_date_str(dtend_date)}",
|
||||||
|
summary = f"Geburtstag: {d['name']} ({age}. {'Geburtstag' if age == 1 else 'Geburtstag'})",
|
||||||
|
rrule = f"FREQ=YEARLY",
|
||||||
|
))
|
||||||
|
|
||||||
# ── 2. Events (zukünftige) ─────────────────────────────────
|
# ── 2. Events (zukünftige) ─────────────────────────────────
|
||||||
event_rows = conn.execute(
|
event_rows = conn.execute(
|
||||||
"""SELECT id, titel, datum, uhrzeit, ort_name, beschreibung
|
"""SELECT id, titel, datum, uhrzeit, ort_name, beschreibung
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue