From b42b409bb219695d59254ff2e239c93d95792c9c Mon Sep 17 00:00:00 2001 From: kcar Date: Wed, 27 May 2026 10:54:23 +0100 Subject: [PATCH] fix(nav): AcademicWeek children + days support in graph tree API - AcademicWeek now returns has_children=true in both /calendar/academic endpoint and _get_children_for_node for AcademicTerm case - Added AcademicWeek case to _get_children_for_node: queries ACADEMIC_WEEK_HAS_ACADEMIC_DAY relationships to return AcademicDay children - Academic calendar can now expand weeks to show individual days Co-Authored-By: Claude Sonnet 4.6 --- routers/database/tools/graph_tree_router.py | 32 +++++++++++++++++++-- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/routers/database/tools/graph_tree_router.py b/routers/database/tools/graph_tree_router.py index 4b54b75..c932cdc 100644 --- a/routers/database/tools/graph_tree_router.py +++ b/routers/database/tools/graph_tree_router.py @@ -489,7 +489,33 @@ def _get_children_for_node( logger.warning(f"AcademicYear children failed: {e}") return [] - # AcademicTerm → weeks + # AcademicWeek → days + if node_type == "AcademicWeek" and neo4j_db_name: + try: + with driver_tools.get_session(database=neo4j_db_name) as session: + result = session.run( + "MATCH (w:AcademicWeek {uuid_string: })" + "-[:ACADEMIC_WEEK_HAS_ACADEMIC_DAY]->(d:AcademicDay) " + "RETURN d ORDER BY d.date", + id=neo4j_node_id, + ) + days = [ + { + "neo4j_node_id": r["d"]["uuid_string"], + "label": r["d"].get("date", ""), + "node_type": "AcademicDay", + "neo4j_db_name": neo4j_db_name, + "is_section": False, + "has_children": False, + } + for r in result + ] + return days + except Exception as e: + logger.warning(f"AcademicWeek children failed: {e}") + return [] + + # AcademicTerm → weeks if node_type == "AcademicTerm" and neo4j_db_name: try: with driver_tools.get_session(database=neo4j_db_name) as session: @@ -506,7 +532,7 @@ def _get_children_for_node( "node_type": "AcademicWeek", "neo4j_db_name": neo4j_db_name, "is_section": False, - "has_children": False, + "has_children": True, } for r in result ] @@ -622,7 +648,7 @@ async def get_academic_calendar(credentials: dict = Depends(SupabaseBearer())) - "node_type": "AcademicWeek", "neo4j_db_name": institute_db, "is_section": False, - "has_children": False, + "has_children": True, } for w in s2.run( "MATCH (t:AcademicTerm {uuid_string: $tid})-[:ACADEMIC_TERM_HAS_ACADEMIC_WEEK]->(w:AcademicWeek) " "RETURN w ORDER BY toInteger(w.academic_week_number)",