100 lines
4.5 KiB
Python
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"}
|