fix: count pupils as the whole school, not the GCSE year group
fact_performance's total_pupils is the cohort a year's results were measured on. For a secondary that is Year 11 alone, and the list API sent it as the card's "pupils": Burntwood showed 245 in search and 1,462 on its page. The list and place payloads now carry the register's whole-school count, and nothing when the register has none. Map popups and the compare basket read the same field. The header and the wellbeing section fell back to the same results figure when the census had no record. They now fall back to the register count. The shell took yearlyData only for that fallback, so the prop is gone and the results array no longer ships to the client for the chrome. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
e65c93b68e
commit
5f9caad7f4
7 files changed
+144
-12
No files matched your search
+15
-2
@@ -621,6 +621,19 @@ def verify_admin_api_key(x_api_key: str = Header(None)) -> bool:
|
||||
return True
|
||||
|
||||
|
||||
def _with_whole_school_pupils(rows: pd.DataFrame, source: pd.DataFrame) -> pd.DataFrame:
|
||||
"""Set total_pupils to the size of the school.
|
||||
|
||||
fact_performance's total_pupils is the cohort a year's results were
|
||||
measured on. For a secondary that is the GCSE year group alone (Burntwood:
|
||||
245 against 1,462 on roll). Cards, map popups and place rows label it
|
||||
"pupils", so they take the register's whole-school count instead, and
|
||||
nothing when the register has none.
|
||||
"""
|
||||
whole = source["gias_total_pupils"] if "gias_total_pupils" in source.columns else None
|
||||
return rows.assign(total_pupils=whole)
|
||||
|
||||
|
||||
# Input validation helpers
|
||||
def _names_in_group(names: pd.Series, in_group) -> set:
|
||||
"""The distinct names in a column that a group predicate accepts.
|
||||
@@ -859,7 +872,7 @@ async def get_schools(
|
||||
if c in df_latest.columns
|
||||
]
|
||||
# fact_performance guarantees one row per (urn, year); df_latest has one row per urn.
|
||||
schools_df = df_latest[available_cols]
|
||||
schools_df = _with_whole_school_pupils(df_latest[available_cols], df_latest)
|
||||
|
||||
# Location-based search (uses pre-geocoded data from database)
|
||||
search_coords = None
|
||||
@@ -1545,7 +1558,7 @@ async def get_place(request: Request, kind: str, slug: str,
|
||||
# variants that exist rather than 404s.
|
||||
"phases": [ph for ph in ("primary", "secondary")
|
||||
if place.publishes_phase(ph)]},
|
||||
"schools": clean_for_json(rows[cols]),
|
||||
"schools": clean_for_json(_with_whole_school_pupils(rows[cols], rows)),
|
||||
"averages": averages,
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user