Fetch full event detail: batch listing omits text_fr/attachments for events

Found by testing: unlike news items, the agenda @results batch listing
always returns text_fr and items (attachments) as null for events - only
description_fr (short teaser) was ever available from it. The site itself
works around this by firing a second request per event
(@results?UID=<uid>&fullobjects=1) when you open one; we now do the same,
with a per-UID cache since a recurring event shares one UID across all its
occurrences.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
para
2026-09-26 00:05:52 +02:00
co-authored by Claude Sonnet 5
parent d917e76819
commit dac36592eb
2 changed files with 51 additions and 2 deletions
+25 -1
View File
@@ -157,6 +157,29 @@ def build_news_items() -> list[str]:
return entries
_event_detail_cache: dict[str, dict | None] = {}
def fetch_event_detail(uid: str) -> dict | None:
"""
Contrairement aux actualites, l'API renvoie text_fr/items (texte complet
et pieces jointes) a null dans la liste paginee des evenements - il faut
une requete par UID pour les recuperer (c'est ce que fait le site
lui-meme quand on ouvre un evenement). Un evenement recurrent partage un
seul UID sur toutes ses occurrences, d'ou le cache pour eviter de
refaire la requete pour chaque occurrence.
"""
if uid in _event_detail_cache:
return _event_detail_cache[uid]
try:
data = fetch_json(f"{EVENTS_API}?UID={uid}&fullobjects=1")
detail = (data.get("items") or [None])[0]
except Exception:
detail = None
_event_detail_cache[uid] = detail
return detail
def format_event_meta(item: dict) -> str:
parts = []
start = parse_dt(item.get("start"))
@@ -183,7 +206,8 @@ def build_event_items() -> list[str]:
guid = item.get("UID") or event_id
link = f"{SITE}/agenda/{slugify(title)}?u={guid}"
meta = format_event_meta(item)
description = (f"<p>{html.escape(meta)}</p>" if meta else "") + full_body_html(item, title)
detail = fetch_event_detail(guid) or item
description = (f"<p>{html.escape(meta)}</p>" if meta else "") + full_body_html(detail, title)
pub_dt = parse_dt(item.get("created") or item.get("start"))
# Un evenement recurrent partage le meme UID sur toutes ses
# occurrences : on suffixe le guid avec la date de debut pour