mirror of
https://github.com/Hestia-Homes/Model.git
synced 2026-06-30 13:10:47 +00:00
Adding validation to PlanTriggerRequest
This commit is contained in:
parent
d34a4d4d96
commit
91eb9c68f1
2 changed files with 95 additions and 46 deletions
|
|
@ -1,12 +1,51 @@
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel, conlist, validator
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
|
|
||||||
class PlanTriggerRequest(BaseModel):
|
class PlanTriggerRequest(BaseModel):
|
||||||
budget: float | None = None
|
budget: Optional[float] = None
|
||||||
goal: str
|
goal: str
|
||||||
housing_type: str
|
housing_type: str
|
||||||
goal_value: str
|
goal_value: str
|
||||||
portfolio_id: int
|
portfolio_id: int
|
||||||
trigger_file_path: str
|
trigger_file_path: str
|
||||||
# optional exclusions list
|
exclusions: Optional[conlist(str, min_items=1)] = None
|
||||||
exclusions: list[str] | None = None
|
|
||||||
|
# Pre-defined list of possibilities for exclusions
|
||||||
|
_allowed_exclusions = {
|
||||||
|
"wall_insulation",
|
||||||
|
"ventilation",
|
||||||
|
"roof_insulation",
|
||||||
|
"floor_insulation",
|
||||||
|
"windows",
|
||||||
|
"fireplace",
|
||||||
|
"heating",
|
||||||
|
"hot_water",
|
||||||
|
"lighting",
|
||||||
|
"solar_pv"
|
||||||
|
}
|
||||||
|
|
||||||
|
_allowed_goals = {"Increase EPC"}
|
||||||
|
|
||||||
|
_allowed_housing_types = {"Social", "Private"}
|
||||||
|
|
||||||
|
# Validator to ensure exclusions are within the pre-defined possibilities
|
||||||
|
@validator('exclusions', each_item=True)
|
||||||
|
def check_exclusions(self, v):
|
||||||
|
if v not in self._allowed_exclusions:
|
||||||
|
raise ValueError(f"{v} is not an allowed exclusion")
|
||||||
|
return v
|
||||||
|
|
||||||
|
# Validator to ensure that the goal is within the pre-defined possibilities
|
||||||
|
@validator('goal')
|
||||||
|
def check_goal(self, v):
|
||||||
|
if v not in self._allowed_goals:
|
||||||
|
raise ValueError(f"{v} is not a valid goal")
|
||||||
|
return v
|
||||||
|
|
||||||
|
# Validator to ensure that the housing type is within the pre-defined possibilities
|
||||||
|
@validator('housing_type')
|
||||||
|
def check_housing_type(self, v):
|
||||||
|
if v not in self.allowed_housing_types:
|
||||||
|
raise ValueError(f"{v} is not a valid housing type")
|
||||||
|
return v
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,8 @@ class Recommendations:
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
property_instance: Property,
|
property_instance: Property,
|
||||||
materials: List
|
materials: List,
|
||||||
|
exclusions: List[str] = None,
|
||||||
):
|
):
|
||||||
"""
|
"""
|
||||||
:param property_instance: Instance of the Property class, for the home associated to property_id
|
:param property_instance: Instance of the Property class, for the home associated to property_id
|
||||||
|
|
@ -31,6 +32,7 @@ class Recommendations:
|
||||||
|
|
||||||
self.property_instance = property_instance
|
self.property_instance = property_instance
|
||||||
self.materials = materials
|
self.materials = materials
|
||||||
|
self.exclusions = exclusions if exclusions else []
|
||||||
|
|
||||||
self.floor_recommender = FloorRecommendations(property_instance=property_instance, materials=materials)
|
self.floor_recommender = FloorRecommendations(property_instance=property_instance, materials=materials)
|
||||||
self.wall_recomender = WallRecommendations(property_instance=property_instance, materials=materials)
|
self.wall_recomender = WallRecommendations(property_instance=property_instance, materials=materials)
|
||||||
|
|
@ -58,67 +60,75 @@ class Recommendations:
|
||||||
property_recommendations = []
|
property_recommendations = []
|
||||||
phase = 0
|
phase = 0
|
||||||
|
|
||||||
print("WALL RECOMMENDATIONS HAVE BEEN COMMENTED OUT TEMPORARILY - ADD ME BACK IN")
|
# Building Fabric
|
||||||
if portfolio_id != 66:
|
if "wall_insulation" not in self.exclusions:
|
||||||
# Building Fabric
|
|
||||||
self.wall_recomender.recommend(phase=phase)
|
self.wall_recomender.recommend(phase=phase)
|
||||||
if self.wall_recomender.recommendations:
|
if self.wall_recomender.recommendations:
|
||||||
property_recommendations.append(self.wall_recomender.recommendations)
|
property_recommendations.append(self.wall_recomender.recommendations)
|
||||||
phase += 1
|
phase += 1
|
||||||
|
|
||||||
# Ventilation recommendations
|
# Ventilation recommendations
|
||||||
# We only produce a ventilation recommendation if the property is recommended to have wall or roof
|
# We only produce a ventilation recommendation if the property is recommended to have wall or roof
|
||||||
# insulation
|
# insulation
|
||||||
# We will not attribute a SAP impact to the ventilation recommendation, since we've seen that this has no
|
# We will not attribute a SAP impact to the ventilation recommendation, since we've seen that this has no
|
||||||
# real impact on the SAP score. Therefore, we don't need to include phasing for ventilation. If we have any
|
# real impact on the SAP score. Therefore, we don't need to include phasing for ventilation. If we have any
|
||||||
# wall or roof recommendations, we will ensure that ventilation is included in the simulation
|
# wall or roof recommendations, we will ensure that ventilation is included in the simulation
|
||||||
|
if "ventilation" not in self.exclusions:
|
||||||
if self.wall_recomender.recommendations or self.roof_recommender.recommendations:
|
if self.wall_recomender.recommendations or self.roof_recommender.recommendations:
|
||||||
self.ventilation_recomender.recommend()
|
self.ventilation_recomender.recommend()
|
||||||
if self.ventilation_recomender.recommendation:
|
if self.ventilation_recomender.recommendation:
|
||||||
property_recommendations.append(self.ventilation_recomender.recommendation)
|
property_recommendations.append(self.ventilation_recomender.recommendation)
|
||||||
|
|
||||||
self.roof_recommender.recommend(phase=phase)
|
if "roof_insulation" not in self.exclusions:
|
||||||
if self.roof_recommender.recommendations:
|
self.roof_recommender.recommend(phase=phase)
|
||||||
property_recommendations.append(self.roof_recommender.recommendations)
|
if self.roof_recommender.recommendations:
|
||||||
phase += 1
|
property_recommendations.append(self.roof_recommender.recommendations)
|
||||||
|
phase += 1
|
||||||
|
|
||||||
self.floor_recommender.recommend(phase=phase)
|
if "floor_insulation" not in self.exclusions:
|
||||||
if self.floor_recommender.recommendations:
|
self.floor_recommender.recommend(phase=phase)
|
||||||
property_recommendations.append(self.floor_recommender.recommendations)
|
if self.floor_recommender.recommendations:
|
||||||
phase += 1
|
property_recommendations.append(self.floor_recommender.recommendations)
|
||||||
|
phase += 1
|
||||||
|
|
||||||
self.windows_recommender.recommend(phase=phase)
|
if "windows" not in self.exclusions:
|
||||||
if self.windows_recommender.recommendation:
|
self.windows_recommender.recommend(phase=phase)
|
||||||
property_recommendations.append(self.windows_recommender.recommendation)
|
if self.windows_recommender.recommendation:
|
||||||
phase += 1
|
property_recommendations.append(self.windows_recommender.recommendation)
|
||||||
|
phase += 1
|
||||||
|
|
||||||
self.fireplace_recommender.recommend(phase=phase)
|
if "fireplace" not in self.exclusions:
|
||||||
if self.fireplace_recommender.recommendation:
|
self.fireplace_recommender.recommend(phase=phase)
|
||||||
property_recommendations.append(self.fireplace_recommender.recommendation)
|
if self.fireplace_recommender.recommendation:
|
||||||
phase += 1
|
property_recommendations.append(self.fireplace_recommender.recommendation)
|
||||||
|
phase += 1
|
||||||
|
|
||||||
# Heating and Electical systems
|
# Heating and Electical systems
|
||||||
self.heating_recommender.recommend(phase=phase)
|
if "heating" not in self.exclusions:
|
||||||
if self.heating_recommender.recommendations:
|
self.heating_recommender.recommend(phase=phase)
|
||||||
property_recommendations.append(self.heating_recommender.recommendations)
|
if self.heating_recommender.recommendations:
|
||||||
phase += 1
|
property_recommendations.append(self.heating_recommender.recommendations)
|
||||||
|
phase += 1
|
||||||
|
|
||||||
# Hot water
|
# Hot water
|
||||||
self.hotwater_recommender.recommend(phase=phase)
|
if "hot_water" not in self.exclusions:
|
||||||
if self.hotwater_recommender.recommendations:
|
self.hotwater_recommender.recommend(phase=phase)
|
||||||
property_recommendations.append(self.hotwater_recommender.recommendations)
|
if self.hotwater_recommender.recommendations:
|
||||||
phase += 1
|
property_recommendations.append(self.hotwater_recommender.recommendations)
|
||||||
|
phase += 1
|
||||||
|
|
||||||
self.lighting_recommender.recommend(phase=phase)
|
if "lighting" not in self.exclusions:
|
||||||
if self.lighting_recommender.recommendation:
|
self.lighting_recommender.recommend(phase=phase)
|
||||||
property_recommendations.append(self.lighting_recommender.recommendation)
|
if self.lighting_recommender.recommendation:
|
||||||
phase += 1
|
property_recommendations.append(self.lighting_recommender.recommendation)
|
||||||
|
phase += 1
|
||||||
|
|
||||||
# Renewables
|
# Renewables
|
||||||
self.solar_recommender.recommend(phase=phase)
|
if "solar_pv" not in self.exclusions:
|
||||||
if self.solar_recommender.recommendation:
|
self.solar_recommender.recommend(phase=phase)
|
||||||
property_recommendations.append(self.solar_recommender.recommendation)
|
if self.solar_recommender.recommendation:
|
||||||
phase += 1
|
property_recommendations.append(self.solar_recommender.recommendation)
|
||||||
|
phase += 1
|
||||||
|
|
||||||
# We insert temporary ids into the recommendations which is important for the optimiser later
|
# We insert temporary ids into the recommendations which is important for the optimiser later
|
||||||
property_recommendations = self.insert_temp_recommendation_id(property_recommendations)
|
property_recommendations = self.insert_temp_recommendation_id(property_recommendations)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue