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 <noreply@anthropic.com>
This commit is contained in:
kcar 2026-05-27 10:54:23 +01:00
parent caeee6c9e4
commit b42b409bb2

View File

@ -489,7 +489,33 @@ def _get_children_for_node(
logger.warning(f"AcademicYear children failed: {e}") logger.warning(f"AcademicYear children failed: {e}")
return [] 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: if node_type == "AcademicTerm" and neo4j_db_name:
try: try:
with driver_tools.get_session(database=neo4j_db_name) as session: with driver_tools.get_session(database=neo4j_db_name) as session:
@ -506,7 +532,7 @@ def _get_children_for_node(
"node_type": "AcademicWeek", "node_type": "AcademicWeek",
"neo4j_db_name": neo4j_db_name, "neo4j_db_name": neo4j_db_name,
"is_section": False, "is_section": False,
"has_children": False, "has_children": True,
} }
for r in result for r in result
] ]
@ -622,7 +648,7 @@ async def get_academic_calendar(credentials: dict = Depends(SupabaseBearer())) -
"node_type": "AcademicWeek", "node_type": "AcademicWeek",
"neo4j_db_name": institute_db, "neo4j_db_name": institute_db,
"is_section": False, "is_section": False,
"has_children": False, "has_children": True,
} for w in s2.run( } for w in s2.run(
"MATCH (t:AcademicTerm {uuid_string: $tid})-[:ACADEMIC_TERM_HAS_ACADEMIC_WEEK]->(w:AcademicWeek) " "MATCH (t:AcademicTerm {uuid_string: $tid})-[:ACADEMIC_TERM_HAS_ACADEMIC_WEEK]->(w:AcademicWeek) "
"RETURN w ORDER BY toInteger(w.academic_week_number)", "RETURN w ORDER BY toInteger(w.academic_week_number)",