api/routers/database/schools.py
2025-07-11 13:52:19 +00:00

100 lines
4.5 KiB
Python

from fastapi import APIRouter, Depends, File, UploadFile
from backend.app.run.dependencies import admin_dependency
from pydantic import BaseModel
router = APIRouter()
class NodeBase(BaseModel):
Name: str
class LocalAuthority(NodeBase):
pass
class SchoolNode(NodeBase):
Type: str
Status: str
class ParliamentaryConstituency(NodeBase):
pass
class AdministrativeWard(NodeBase):
pass
class RelationshipBase(BaseModel):
start_node: NodeBase
end_node: NodeBase
relationship_type: str
class HasParliamentaryConstituency(RelationshipBase):
pass
class HasAdministrativeWard(RelationshipBase):
pass
class HasSchool(RelationshipBase):
pass
@router.post("/batch-create-schools")
async def add_school_to_global(file: UploadFile = File(...)):
if file is None:
return {"status": "Error", "message": "No file received"}
try:
import pandas as pd
from io import BytesIO
from app.modules.driver_tools import create_node_http, create_relationship_http
data = pd.read_csv(BytesIO(await file.read()), usecols=["LA (name)", "ParliamentaryConstituency (name)", "AdministrativeWard (name)", "EstablishmentName", "TypeOfEstablishment (name)", "EstablishmentStatus (name)"])
unique_las = data["LA (name)"].unique()
for la_name in unique_las:
la_node = {"Name": la_name}
la_id = create_node_http("LocalAuthority", la_node, db="GlobalSchools")
constituencies = data[data["LA (name)"] == la_name]["ParliamentaryConstituency (name)"].unique()
for constituency in constituencies:
constituency_node = {"Name": constituency}
constituency_id = create_node_http("ParliamentaryConstituency", constituency_node, db="GlobalSchools")
create_relationship_http({"start_node": {"id": la_id}, "end_node": {"id": constituency_id}, "relationship_type": "HAS_PARLIAMENTARY_CONSTITUENCY"}, db="GlobalSchools")
wards = data[(data["LA (name)"] == la_name) & (data["ParliamentaryConstituency (name)"] == constituency)]["AdministrativeWard (name)"].unique()
for ward in wards:
ward_node = {"Name": ward}
ward_id = create_node_http("AdministrativeWard", ward_node, db="GlobalSchools")
create_relationship_http({"start_node": {"id": constituency_id}, "end_node": {"id": ward_id}, "relationship_type": "HAS_ADMINISTRATIVE_WARD"}, db="GlobalSchools")
schools = data[(data["LA (name)"] == la_name) & (data["ParliamentaryConstituency (name)"] == constituency) & (data["AdministrativeWard (name)"] == ward)]
for index, school in schools.iterrows():
school_node = {
"Name": school["EstablishmentName"],
"Type": school["TypeOfEstablishment (name)"],
"Status": school["EstablishmentStatus (name)"]
}
school_id = create_node_http("School", school_node, db="GlobalSchools")
create_relationship_http({"start_node": {"id": ward_id}, "end_node": {"id": school_id}, "relationship_type": "HAS_SCHOOL"}, db="GlobalSchools")
return {"status": "Success", "message": "Graph structure updated successfully"}
except Exception as e:
print("Failed to process file:", e)
return {"status": "Error", "message": "Failed to process file"}
@router.post("/create-school")
async def add_school_to_global(file: UploadFile = File(...)):
if file is None:
return {"status": "Error", "message": "No file received"}
try:
import pandas as pd
from io import BytesIO
data = pd.read_excel(BytesIO(await file.read()), usecols=[0], nrows=5).squeeze()
print("Data read from file:", data)
if len(data) < 5:
return {"status": "Error", "message": "Insufficient data in file"}
school_data = {
"name": data[0],
"address": data[1],
"ofsted_number": data[2],
"website": data[3],
"geo_location": data[4]
}
from app.modules.driver_tools import create_node_http
response = create_node_http("globalschools", "School", school_data)
return {"status": "School added to global school db via HTTP", "school_data": school_data, "response": response}
except Exception as e:
print("Failed to process file:", e)
return {"status": "Error", "message": "Failed to process file"}