feat: presentation defaults + scheduler active-only
Add Settings → Events (Presentations) defaults (interval, page-progress, auto-progress) persisted via /api/system-settings Seed defaults in init_defaults.py (10/true/true) Add Event.page_progress and Event.auto_progress (Alembic applied) CustomEventModal applies defaults on create and saves fields Scheduler publishes only currently active events per group, clears retained topics when none, normalizes times to UTC; include flags in payloads Docs: update README, copilot instructions, and DEV-CHANGELOG If you can split the commit, even better feat(dashboard): add presentation defaults UI feat(api): seed presentation defaults in init_defaults.py feat(model): add Event.page_progress and Event.auto_progress feat(scheduler): publish only active events; clear retained topics; UTC docs: update README and copilot-instructions chore: update DEV-CHANGELOG
This commit is contained in:
@@ -69,13 +69,32 @@ def main():
|
||||
logging.exception(f"Error while fetching events: {e}")
|
||||
events = []
|
||||
|
||||
# Gruppiere Events nach group_id
|
||||
groups = {}
|
||||
|
||||
# Filter: Only include events active at 'now'
|
||||
active_events = []
|
||||
for event in events:
|
||||
start = event.get("start")
|
||||
end = event.get("end")
|
||||
# Parse ISO strings to datetime
|
||||
try:
|
||||
start_dt = datetime.datetime.fromisoformat(start)
|
||||
end_dt = datetime.datetime.fromisoformat(end)
|
||||
# Make both tz-aware (UTC) if naive
|
||||
if start_dt.tzinfo is None:
|
||||
start_dt = start_dt.replace(tzinfo=datetime.timezone.utc)
|
||||
if end_dt.tzinfo is None:
|
||||
end_dt = end_dt.replace(tzinfo=datetime.timezone.utc)
|
||||
except Exception:
|
||||
continue
|
||||
if start_dt <= now < end_dt:
|
||||
active_events.append(event)
|
||||
|
||||
# Gruppiere nur aktive Events nach group_id
|
||||
groups = {}
|
||||
for event in active_events:
|
||||
gid = event.get("group_id")
|
||||
if gid not in groups:
|
||||
groups[gid] = []
|
||||
# Event ist bereits ein Dictionary im gewünschten Format
|
||||
groups[gid].append(event)
|
||||
|
||||
if not groups:
|
||||
@@ -106,18 +125,18 @@ def main():
|
||||
last_published_at[gid] = time.time()
|
||||
|
||||
# Entferne Gruppen, die nicht mehr existieren (leere retained Message senden)
|
||||
for gid in list(last_payloads.keys()):
|
||||
if gid not in groups:
|
||||
topic = f"infoscreen/events/{gid}"
|
||||
result = client.publish(topic, payload="[]", retain=True)
|
||||
if result.rc != mqtt.MQTT_ERR_SUCCESS:
|
||||
logging.error(
|
||||
f"Fehler beim Entfernen für Gruppe {gid}: {mqtt.error_string(result.rc)}")
|
||||
else:
|
||||
logging.info(
|
||||
f"Events für Gruppe {gid} entfernt (leere retained Message gesendet)")
|
||||
del last_payloads[gid]
|
||||
last_published_at.pop(gid, None)
|
||||
inactive_gids = set(last_payloads.keys()) - set(groups.keys())
|
||||
for gid in inactive_gids:
|
||||
topic = f"infoscreen/events/{gid}"
|
||||
result = client.publish(topic, payload="[]", retain=True)
|
||||
if result.rc != mqtt.MQTT_ERR_SUCCESS:
|
||||
logging.error(
|
||||
f"Fehler beim Entfernen für Gruppe {gid}: {mqtt.error_string(result.rc)}")
|
||||
else:
|
||||
logging.info(
|
||||
f"Events für Gruppe {gid} entfernt (leere retained Message gesendet)")
|
||||
del last_payloads[gid]
|
||||
last_published_at.pop(gid, None)
|
||||
|
||||
time.sleep(POLL_INTERVAL)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user