feat: add secondary school support with KS4 data and metric tooltips
Some checks failed
Build and Push Docker Images / Build Frontend (Next.js) (push) Has been cancelled
Build and Push Docker Images / Build Pipeline (Meltano + dbt + Airflow) (push) Has been cancelled
Build and Push Docker Images / Trigger Portainer Update (push) Has been cancelled
Build and Push Docker Images / Build Backend (FastAPI) (push) Has been cancelled
Some checks failed
Build and Push Docker Images / Build Frontend (Next.js) (push) Has been cancelled
Build and Push Docker Images / Build Pipeline (Meltano + dbt + Airflow) (push) Has been cancelled
Build and Push Docker Images / Trigger Portainer Update (push) Has been cancelled
Build and Push Docker Images / Build Backend (FastAPI) (push) Has been cancelled
- Backend: replace INNER JOIN ks2 with UNION ALL (ks2 + ks4) so primary and secondary schools both appear in the main DataFrame - Backend: add /api/national-averages endpoint computing means from live data, replacing the hardcoded NATIONAL_AVG constant on the frontend - Backend: add phase filter param to /api/schools; return phases from /api/filters; fix hardcoded "phase": "Primary" in school detail endpoint - Backend: add KS4 metric definitions (Attainment 8, Progress 8, EBacc, English & Maths pass rates) to METRIC_DEFINITIONS and RANKING_COLUMNS - Frontend: SchoolDetailView is now phase-aware — secondary schools show a GCSE Results section (Att8, P8, E&M, EBacc) instead of SATs; phonics tab hidden for secondary; admissions says Year 7 instead of Year 3; history table shows KS4 columns; chart datasets switch for secondary - Frontend: new MetricTooltip component (CSS-only ⓘ icon) backed by METRIC_EXPLANATIONS — added to RWM, GPS, SEN, EAL, IDACI, progress scores and all KS4 metrics throughout SchoolDetailView and SchoolCard - Frontend: METRIC_EXPLANATIONS extended with KS4 terms (Attainment 8, Progress 8, EBacc) and previously missing terms (SEN, EHCP, EAL, IDACI) - Frontend: SchoolCard expands "RWM" to "Reading, Writing & Maths" and shows Attainment 8 / English & Maths Grade 4+ for secondary schools - Frontend: FilterBar adds Phase dropdown (Primary / Secondary / All-through) - Frontend: HomeView hero copy updated; compact list shows phase-aware metric - Global metadata updated to remove "primary only" framing Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -113,6 +113,7 @@ def haversine_distance(lat1: float, lon1: float, lat2: float, lon2: float) -> fl
|
||||
# =============================================================================
|
||||
|
||||
_MAIN_QUERY = text("""
|
||||
-- Branch 1: Primary schools (KS2 data; KS4 columns NULL)
|
||||
SELECT
|
||||
s.urn,
|
||||
s.school_name,
|
||||
@@ -137,11 +138,11 @@ _MAIN_QUERY = text("""
|
||||
l.postcode,
|
||||
l.latitude,
|
||||
l.longitude,
|
||||
-- KS2 performance
|
||||
k.year,
|
||||
k.source_urn,
|
||||
k.total_pupils,
|
||||
k.eligible_pupils,
|
||||
-- KS2 columns
|
||||
k.rwm_expected_pct,
|
||||
k.rwm_high_pct,
|
||||
k.reading_expected_pct,
|
||||
@@ -175,11 +176,116 @@ _MAIN_QUERY = text("""
|
||||
k.eal_pct,
|
||||
k.sen_support_pct,
|
||||
k.sen_ehcp_pct,
|
||||
k.stability_pct
|
||||
k.stability_pct,
|
||||
-- KS4 columns (NULL for primary)
|
||||
NULL::numeric AS attainment_8_score,
|
||||
NULL::numeric AS progress_8_score,
|
||||
NULL::numeric AS progress_8_lower_ci,
|
||||
NULL::numeric AS progress_8_upper_ci,
|
||||
NULL::numeric AS progress_8_english,
|
||||
NULL::numeric AS progress_8_maths,
|
||||
NULL::numeric AS progress_8_ebacc,
|
||||
NULL::numeric AS progress_8_open,
|
||||
NULL::numeric AS english_maths_strong_pass_pct,
|
||||
NULL::numeric AS english_maths_standard_pass_pct,
|
||||
NULL::numeric AS ebacc_entry_pct,
|
||||
NULL::numeric AS ebacc_strong_pass_pct,
|
||||
NULL::numeric AS ebacc_standard_pass_pct,
|
||||
NULL::numeric AS ebacc_avg_score,
|
||||
NULL::numeric AS gcse_grade_91_pct,
|
||||
NULL::numeric AS prior_attainment_avg
|
||||
FROM marts.dim_school s
|
||||
JOIN marts.dim_location l ON s.urn = l.urn
|
||||
JOIN marts.fact_ks2_performance k ON s.urn = k.urn
|
||||
ORDER BY s.school_name, k.year
|
||||
|
||||
UNION ALL
|
||||
|
||||
-- Branch 2: Secondary schools (KS4 data; KS2 columns NULL)
|
||||
SELECT
|
||||
s.urn,
|
||||
s.school_name,
|
||||
s.phase,
|
||||
s.school_type,
|
||||
s.academy_trust_name AS trust_name,
|
||||
s.academy_trust_uid AS trust_uid,
|
||||
s.religious_character AS religious_denomination,
|
||||
s.gender,
|
||||
s.age_range,
|
||||
s.capacity,
|
||||
s.headteacher_name,
|
||||
s.website,
|
||||
s.ofsted_grade,
|
||||
s.ofsted_date,
|
||||
s.ofsted_framework,
|
||||
l.local_authority_name AS local_authority,
|
||||
l.local_authority_code,
|
||||
l.address_line1 AS address1,
|
||||
l.address_line2 AS address2,
|
||||
l.town,
|
||||
l.postcode,
|
||||
l.latitude,
|
||||
l.longitude,
|
||||
k4.year,
|
||||
k4.source_urn,
|
||||
k4.total_pupils,
|
||||
k4.eligible_pupils,
|
||||
-- KS2 columns (NULL for secondary)
|
||||
NULL::numeric AS rwm_expected_pct,
|
||||
NULL::numeric AS rwm_high_pct,
|
||||
NULL::numeric AS reading_expected_pct,
|
||||
NULL::numeric AS reading_high_pct,
|
||||
NULL::numeric AS reading_avg_score,
|
||||
NULL::numeric AS reading_progress,
|
||||
NULL::numeric AS writing_expected_pct,
|
||||
NULL::numeric AS writing_high_pct,
|
||||
NULL::numeric AS writing_progress,
|
||||
NULL::numeric AS maths_expected_pct,
|
||||
NULL::numeric AS maths_high_pct,
|
||||
NULL::numeric AS maths_avg_score,
|
||||
NULL::numeric AS maths_progress,
|
||||
NULL::numeric AS gps_expected_pct,
|
||||
NULL::numeric AS gps_high_pct,
|
||||
NULL::numeric AS gps_avg_score,
|
||||
NULL::numeric AS science_expected_pct,
|
||||
NULL::numeric AS reading_absence_pct,
|
||||
NULL::numeric AS writing_absence_pct,
|
||||
NULL::numeric AS maths_absence_pct,
|
||||
NULL::numeric AS gps_absence_pct,
|
||||
NULL::numeric AS science_absence_pct,
|
||||
NULL::numeric AS rwm_expected_boys_pct,
|
||||
NULL::numeric AS rwm_high_boys_pct,
|
||||
NULL::numeric AS rwm_expected_girls_pct,
|
||||
NULL::numeric AS rwm_high_girls_pct,
|
||||
NULL::numeric AS rwm_expected_disadvantaged_pct,
|
||||
NULL::numeric AS rwm_expected_non_disadvantaged_pct,
|
||||
NULL::numeric AS disadvantaged_gap,
|
||||
NULL::numeric AS disadvantaged_pct,
|
||||
NULL::numeric AS eal_pct,
|
||||
k4.sen_support_pct,
|
||||
k4.sen_ehcp_pct,
|
||||
NULL::numeric AS stability_pct,
|
||||
-- KS4 columns
|
||||
k4.attainment_8_score,
|
||||
k4.progress_8_score,
|
||||
k4.progress_8_lower_ci,
|
||||
k4.progress_8_upper_ci,
|
||||
k4.progress_8_english,
|
||||
k4.progress_8_maths,
|
||||
k4.progress_8_ebacc,
|
||||
k4.progress_8_open,
|
||||
k4.english_maths_strong_pass_pct,
|
||||
k4.english_maths_standard_pass_pct,
|
||||
k4.ebacc_entry_pct,
|
||||
k4.ebacc_strong_pass_pct,
|
||||
k4.ebacc_standard_pass_pct,
|
||||
k4.ebacc_avg_score,
|
||||
k4.gcse_grade_91_pct,
|
||||
k4.prior_attainment_avg
|
||||
FROM marts.dim_school s
|
||||
JOIN marts.dim_location l ON s.urn = l.urn
|
||||
JOIN marts.fact_ks4_performance k4 ON s.urn = k4.urn
|
||||
|
||||
ORDER BY school_name, year
|
||||
""")
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user