diff --git a/main.py b/main.py index 5d69332..f793e88 100644 --- a/main.py +++ b/main.py @@ -166,10 +166,28 @@ def _absence_sort_key(ab: dict): return (0, 0) +def _resolve_excused(ab: dict) -> bool | None: + """ + Return True if excused, False if unexcused, None if unknown. + isExcused is a direct bool field on the absence object. + """ + # Top-level isExcused is the authoritative field + if "isExcused" in ab: + val = ab["isExcused"] + if isinstance(val, bool): + return val + # Fall back to excuseStatus text + status_text = (ab.get("excuseStatus") or "").lower() + if "nicht" in status_text: + return False + if status_text: + return True + return None + + def _is_unexcused(ab: dict) -> bool: - excused = ab.get("isExcused") or ab.get("excused") or ab.get("excuse") - print(f"Debug: Absence {ab.get('id', '?')} excuse status: {excused}") - return excused + result = _resolve_excused(ab) + return result is False or result is None # unknown treated as unexcused def filter_absences(absences: list[dict], unexcused_only: bool) -> list[dict]: @@ -192,11 +210,10 @@ def _parse_dt(date_int, time_int) -> str: def _excuse_label(ab: dict) -> str: - excused = ab.get("isExcused") or ab.get("excused") or ab.get("excuse") - if excused is True or excused == 1: + result = _resolve_excused(ab) + if result is True: return "✓ Excused" - # if excused is False or excused == 0: - else: + if result is False: return "✗ Unexcused" return "? Unknown"