1414from .helpers import _get_user_from_request , _set_user_context
1515from ..uwm .livability_s2 .scenario_service import (
1616 S2ProductInvalid ,
17+ S2RunInvalid ,
1718 S2RunNotFound ,
1819 S2ScenarioService ,
1920)
2324DEFAULT_PRODUCT_DIR = (
2425 ROOT / "data/uwm_public_proxy/chongqing_central/uwm_livability_s2_fulu"
2526)
26- _SERVICE_CACHE : tuple [Path , S2ScenarioService ] | None = None
27+ _SERVICE_CACHE : tuple [Path , Path | None , S2ScenarioService ] | None = None
2728
2829
2930def _product_dir () -> Path :
@@ -34,9 +35,11 @@ def _product_dir() -> Path:
3435def _service () -> S2ScenarioService :
3536 global _SERVICE_CACHE
3637 path = _product_dir ()
37- if _SERVICE_CACHE is None or _SERVICE_CACHE [0 ] != path :
38- _SERVICE_CACHE = (path , S2ScenarioService (path ))
39- return _SERVICE_CACHE [1 ]
38+ configured_store = os .environ .get ("UWM_LIVABILITY_S2_RUN_STORE" , "" ).strip ()
39+ store_path = Path (configured_store ).expanduser () if configured_store else None
40+ if _SERVICE_CACHE is None or _SERVICE_CACHE [:2 ] != (path , store_path ):
41+ _SERVICE_CACHE = (path , store_path , S2ScenarioService (path , store_path ))
42+ return _SERVICE_CACHE [2 ]
4043
4144
4245def _reset_service_cache () -> None :
@@ -96,6 +99,26 @@ async def uwm_livability_s2_parcels(request: Request):
9699 return _product_error (error )
97100
98101
102+ async def uwm_livability_s2_facilities (request : Request ):
103+ _ , unauthorized = _authorized (request )
104+ if unauthorized :
105+ return unauthorized
106+ try :
107+ return JSONResponse (await asyncio .to_thread (_service ().list_facilities ))
108+ except S2ProductInvalid as error :
109+ return _product_error (error )
110+
111+
112+ async def uwm_livability_s2_planning_projects (request : Request ):
113+ _ , unauthorized = _authorized (request )
114+ if unauthorized :
115+ return unauthorized
116+ try :
117+ return JSONResponse (await asyncio .to_thread (_service ().list_planning_projects ))
118+ except S2ProductInvalid as error :
119+ return _product_error (error )
120+
121+
99122async def uwm_livability_s2_parcel (request : Request ):
100123 _ , unauthorized = _authorized (request )
101124 if unauthorized :
@@ -128,6 +151,13 @@ async def uwm_livability_s2_validate_action(request: Request):
128151 rationale = str (payload .get ("rationale" ) or "" ),
129152 requested_at = str (payload .get ("requested_at" ) or "" ),
130153 actor_id = str (username ),
154+ action_type = str (payload .get ("action_type" ) or "change_land_use" ),
155+ facility_class = payload .get ("facility_class" ),
156+ facility_id = payload .get ("facility_id" ),
157+ service_radius_m = payload .get ("service_radius_m" ),
158+ radius_evidence_source = payload .get ("radius_evidence_source" ),
159+ critical_facility = bool (payload .get ("critical_facility" )),
160+ planning_project_id = payload .get ("planning_project_id" ),
131161 )
132162 status = 200 if result ["validation" ]["valid" ] else 400
133163 if "snapshot_digest_mismatch" in result ["validation" ]["errors" ]:
@@ -157,6 +187,13 @@ async def uwm_livability_s2_rollout(request: Request):
157187 requested_at = str (payload .get ("requested_at" ) or "" ),
158188 actor_id = str (username ),
159189 alternative_land_use_class = payload .get ("alternative_land_use_class" ),
190+ action_type = str (payload .get ("action_type" ) or "change_land_use" ),
191+ facility_class = payload .get ("facility_class" ),
192+ facility_id = payload .get ("facility_id" ),
193+ service_radius_m = payload .get ("service_radius_m" ),
194+ radius_evidence_source = payload .get ("radius_evidence_source" ),
195+ critical_facility = bool (payload .get ("critical_facility" )),
196+ planning_project_id = payload .get ("planning_project_id" ),
160197 )
161198 return JSONResponse (result )
162199 except S2ProductInvalid as error :
@@ -184,12 +221,16 @@ async def uwm_livability_s2_run(request: Request):
184221 return _product_error (error )
185222 except S2RunNotFound as error :
186223 return JSONResponse ({"error" : str (error ).strip ("'\" " )}, status_code = 404 )
224+ except S2RunInvalid as error :
225+ return JSONResponse ({"error" : str (error )}, status_code = 409 )
187226
188227
189228def get_uwm_livability_s2_routes () -> list :
190229 return [
191230 Route ("/api/uwm/livability/s2/catalog" , uwm_livability_s2_catalog , methods = ["GET" ]),
192231 Route ("/api/uwm/livability/s2/parcels" , uwm_livability_s2_parcels , methods = ["GET" ]),
232+ Route ("/api/uwm/livability/s2/facilities" , uwm_livability_s2_facilities , methods = ["GET" ]),
233+ Route ("/api/uwm/livability/s2/planning-projects" , uwm_livability_s2_planning_projects , methods = ["GET" ]),
193234 Route ("/api/uwm/livability/s2/parcels/{parcel_id}" , uwm_livability_s2_parcel , methods = ["GET" ]),
194235 Route ("/api/uwm/livability/s2/validate-action" , uwm_livability_s2_validate_action , methods = ["POST" ]),
195236 Route ("/api/uwm/livability/s2/rollout" , uwm_livability_s2_rollout , methods = ["POST" ]),
0 commit comments