survey-extraction/etl/models/conditionReport.py
2025-06-30 15:46:46 +00:00

386 lines
15 KiB
Python

# SQLModel mapping for ConditionReportModel using BaseModel
from sqlmodel import SQLModel, Field, Relationship, Column, JSON
from typing import Optional, List
import uuid
from datetime import datetime
from etl.models.topLevel import BaseModel, Documents
class AssessorDetails(BaseModel, table=True):
assessor_name_and_id: str
elmhurst_id: str
class InspectionAndProject(BaseModel, table=True):
inspection_date: str
class TheProperty(BaseModel, table=True):
house_type: str
on_which_floor_is_the_flat_located: str
is_there_a_corridor: bool
is_it_heated: bool
it_there_a_balcony: bool
classification_type: str
orientation_front_elevation: str
orientation_in_degrees_front_elevation: str
exposure_zone: str
main_wall_construction: str
class ElevationInfo(BaseModel, table=True):
elevation_type: str
cavity_wall_depth: str
is_insulation_present: bool
insulation_type: str
main_elevation: Optional["MainElevation"] = Relationship(back_populates="elevation_info")
elevation_id: Optional[uuid.UUID] = Field(foreign_key="elevation.id")
elevation_table: Optional["Elevation"] = Relationship(back_populates="info")
class MainElevation(BaseModel, table=True):
elevation_info_id: uuid.UUID = Field(foreign_key="elevationinfo.id")
#SQLAlcemy things
elevation_info: ElevationInfo = Relationship(back_populates="main_elevation")
class Elevation(BaseModel, table=True):
protected_conservatory_or_aonb: bool
material_type: str
visible_signs_of_existing_wall_insulation: str
ground_level_bridge_the_dpc: bool
info: List["ElevationInfo"] = Relationship(back_populates="elevation_table")
class GeneralInformation(BaseModel, table=True):
assessor_detail_id: uuid.UUID = Field(foreign_key="assessordetails.id")
inspection_and_project_id: uuid.UUID = Field(foreign_key="inspectionandproject.id")
the_property_id: uuid.UUID = Field(foreign_key="theproperty.id")
main_elevation_id: uuid.UUID = Field(foreign_key="mainelevation.id")
elevations_id: uuid.UUID = Field(foreign_key="elevation.id")
assessor_details: AssessorDetails = Relationship()
inspection_and_project: InspectionAndProject = Relationship()
the_property: TheProperty = Relationship()
main_elevation: MainElevation = Relationship()
elevations: Elevation = Relationship()
class PropertyAccess(BaseModel, table=True):
are_there_any_road_restriction_in_the_locality: bool
is_on_street_parking_available: bool
are_there_any_overhead_wires_or_cables: bool
is_the_access_gated: bool
is_there_restricted_space_for_contractors_to_access_the_wall_area: bool
is_there_restricted_space_for_contractors_to_access_the_roof_area: bool
more_than_1_5_meters_in_width_to_fence_or__along_the_full_gable_elevation: bool
is_access_to_the_rear_provided_by_use_of_a_ginnel: bool
is_access_to_the_rear_provided_by_use_of_a_secured_alleyway: bool
class ExternalElevation(BaseModel, table=True):
structural_defects_of_elevation: str
does_any_structural_defect_need_resolving_before_retrofit: bool
any_signs_of_water_penetration_caused_by_failed_rainwater_goods_or_pipework: bool
are_there_any_visible_signs_of_movement: bool
are_there_any_visible_signs_of_cracking_to_the_existing_external_finish: bool
class ExternalElevationFront(BaseModel, table=True):
external_elevation_id: uuid.UUID = Field(foreign_key="externalelevation.id")
external_elevation: ExternalElevation = Relationship()
class ExternalElevationRear(BaseModel, table=True):
do_all_answers_for_the_front_elevation_apply_to_this_wall: bool
external_elevation_id: Optional[uuid.UUID] = Field(foreign_key="externalelevation.id")
external_elevation: Optional[ExternalElevation] = Relationship()
class ExternalElevationGableOne(BaseModel, table=True):
do_all_answers_for_the_front_elevation_apply_to_this_wall: bool
external_elevation_id: Optional[uuid.UUID] = Field(foreign_key="externalelevation.id")
external_elevation: Optional[ExternalElevation] = Relationship()
class ExternalElevationGableTwo(BaseModel, table=True):
is_there_a_fourth_external_elevation: bool
external_elevation_id: Optional[uuid.UUID] = Field(foreign_key="externalelevation.id")
class ConservatoryOrOutbuilding(BaseModel, table=True):
is_there_a_conservatory: bool
is_there_a_cellar_present: bool
is_there_an_outbuilding: bool
class AccessAndElevations(BaseModel, table=True):
property_access_id: uuid.UUID = Field(foreign_key="propertyaccess.id")
external_elevation_front_id: uuid.UUID = Field(foreign_key="externalelevationfront.id")
external_elevation_back_id: uuid.UUID = Field(foreign_key="externalelevationrear.id")
external_elevation_gable_one_id: uuid.UUID = Field(foreign_key="externalelevationgableone.id")
external_elevation_gable_two_id: uuid.UUID = Field(foreign_key="externalelevationgabletwo.id")
conservatory_or_out_building_id: uuid.UUID = Field(foreign_key="conservatoryoroutbuilding.id")
property_access: PropertyAccess = Relationship()
external_elevation_front: ExternalElevationFront = Relationship()
external_elevation_back: ExternalElevationRear = Relationship()
external_elevation_gable_one: ExternalElevationGableOne = Relationship()
external_elevation_gable_two: ExternalElevationGableTwo = Relationship()
conservatory_or_out_building: ConservatoryOrOutbuilding = Relationship()
class VentilationInfo(BaseModel, table=True):
is_there_a_ventilation_system_present_in_the_room: bool
any_damp_mould_or_excessive_condensation_within_the_room: bool
are_there_sufficient_undercuts_on_the_closed_door: str
is_there_any_open_flue_heating_appliances_within_the_room: bool
class WindowsInfo(BaseModel, table=True):
does_the_room_have_any_windows: bool
condition_of_the_windows: Optional[str] = None
do_the_windows_have_trickle_vents: Optional[bool] = None
are_the_windows_openable: Optional[bool] = None
input_trickle_vent_product_code_or_measurement: Optional[str] = None
class RoomInfo(BaseModel, table=True):
overall_condition_of_the_room: str
does_the_room_have_any_defects: str
are_there_any_sloped_ceiling_areas: Optional[bool] = None
windows_info_id: uuid.UUID = Field(foreign_key="windowsinfo.id")
ventilation_info_id: uuid.UUID = Field(foreign_key="ventilationinfo.id")
windows_info: WindowsInfo = Relationship()
ventilation_info: VentilationInfo = Relationship()
class Hallway(BaseModel, table=True):
is_there_a_hallway: bool
room_info_id: Optional[uuid.UUID] = Field(foreign_key="roominfo.id")
room_info: Optional[RoomInfo] = Relationship()
class LivingRoom(BaseModel, table=True):
room_info_id: Optional[uuid.UUID] = Field(foreign_key="roominfo.id")
room_info: Optional[RoomInfo] = Relationship()
class DiningRoom(BaseModel, table=True):
is_there_a_dining_room: bool
room_info_id: Optional[uuid.UUID] = Field(foreign_key="roominfo.id")
room_info: Optional[RoomInfo] = Relationship()
class Kitchen(BaseModel, table=True):
room_info_id: Optional[uuid.UUID] = Field(foreign_key="roominfo.id")
room_info: Optional[RoomInfo] = Relationship()
is_there_a_cooker_hood_present_in_the_room: bool
class Utility(BaseModel, table=True):
is_there_a_utility_room: bool
room_info_id: Optional[uuid.UUID] = Field(foreign_key="roominfo.id")
room_info: Optional[RoomInfo] = Relationship()
class WC(BaseModel, table=True):
is_there_a_seperated_wc: bool
room_info_id: Optional[uuid.UUID] = Field(foreign_key="roominfo.id")
room_info: Optional[RoomInfo] = Relationship()
class Landing(BaseModel, table=True):
is_there_a_landing: bool
room_info_id: Optional[uuid.UUID] = Field(foreign_key="roominfo.id")
room_info: Optional[RoomInfo] = Relationship()
class LoftSpace(BaseModel, table=True):
is_the_main_loft_space_accessible: str
is_there_more_than_one_loft_space: bool
class RoomInRoof(BaseModel, table=True):
is_there_a_room_in_roof: bool
room_info_id: Optional[uuid.UUID] = Field(foreign_key="roominfo.id")
room_info: Optional[RoomInfo] = Relationship()
class Bedroom(BaseModel, table=True):
double_or_single_bedroom: str
room_info_id: Optional[uuid.UUID] = Field(foreign_key="roominfo.id")
room_info: Optional[RoomInfo] = Relationship()
rooms_id: uuid.UUID = Field(foreign_key="rooms.id")
rooms: Optional["Rooms"] = Relationship(back_populates="bedrooms")
class Bathroom(BaseModel, table=True):
is_this_an_ensuite_bathroom: bool
room_info_id: Optional[uuid.UUID] = Field(foreign_key="roominfo.id")
room_info: Optional[RoomInfo] = Relationship()
rooms_id: uuid.UUID = Field(foreign_key="rooms.id")
rooms: Optional["Rooms"] = Relationship(back_populates="bathrooms")
class Rooms(BaseModel, table=True):
hallway_id: uuid.UUID = Field(foreign_key="hallway.id")
hallway: Hallway = Relationship()
living_room_id: uuid.UUID = Field(foreign_key="livingroom.id")
living_room: LivingRoom = Relationship()
dining_room_id: uuid.UUID = Field(foreign_key="diningroom.id")
dining_room: DiningRoom = Relationship()
kitchen_id: uuid.UUID = Field(foreign_key="kitchen.id")
kitchen: Kitchen = Relationship()
utility_id: uuid.UUID = Field(foreign_key="utility.id")
utility: Utility = Relationship()
wash_chamber_id: uuid.UUID = Field(foreign_key="wc.id")
wash_chamber: WC = Relationship()
landing_id: uuid.UUID = Field(foreign_key="landing.id")
landing: Landing = Relationship()
loft_space_id: uuid.UUID = Field(foreign_key="loftspace.id")
loft_space: LoftSpace = Relationship()
room_in_roof_id: uuid.UUID = Field(foreign_key="roominroof.id")
room_in_roof: RoomInRoof = Relationship()
bedrooms: List[Bedroom] = Relationship(back_populates="rooms")
bathrooms: List[Bathroom] = Relationship(back_populates="rooms")
class GeneralConditionHeatingSystem(BaseModel, table=True):
is_the_heating_system_in_working_order: bool
does_the_occupant_have_a_smart_meter: bool
are_there_any_smart_monitoring_devices: bool
are_the_gas_and_electricity_meters_accessible: bool
dual_or_single_electric_meter: str
class MainHeatingOne(BaseModel, table=True):
as_defined_by: str
fuel: str
type: str
class MainHeatingTwo(BaseModel, table=True):
is_there_a_main_heating_two: bool
class SecondaryHeating(BaseModel, table=True):
is_there_a_secondary_heating: bool
fuel: str
electric_heating_type: str
gas_heating_type: str
class HeatingByRoom(BaseModel, table=True):
rooms_heated_by_main_system_one: List[str] = Field(sa_column=Column(JSON))
rooms_heated_by_main_system_two: List[str] = Field(sa_column=Column(JSON))
rooms_heated_by_secondary_heating: List[str] = Field(sa_column=Column(JSON))
are_there_any_partially_heated_rooms: bool
partially_heated_rooms: Optional[List[str]] = Field(sa_column=Column(JSON))
are_there_any_unheated_rooms: bool
unheated_rooms: List[str] = Field(sa_column=Column(JSON))
class Renewables(BaseModel, table=True):
is_there_any_renewable_energy_system_in_place: bool
suitable_roof_orientation_for_solar_pv_water: str
is_there_a_water_tank: bool
type: str
size: str
tank_location: str
is_the_tank_insulated: bool
type_of_insulation: str
thickness_of_insulation_in_mm: int
class HeatingSystem(BaseModel, table=True):
general_condition_id: uuid.UUID = Field(foreign_key="generalconditionheatingsystem.id")
general_condition: GeneralConditionHeatingSystem = Relationship()
main_heating_one_id: uuid.UUID = Field(foreign_key="mainheatingone.id")
main_heating_one: MainHeatingOne = Relationship()
main_heating_two_id: uuid.UUID = Field(foreign_key="mainheatingtwo.id")
main_heating_two: MainHeatingTwo = Relationship()
secondary_heating_id: uuid.UUID = Field(foreign_key="secondaryheating.id")
secondary_heating: SecondaryHeating = Relationship()
heating_by_room_id: uuid.UUID = Field(foreign_key="heatingbyroom.id")
heating_by_room: HeatingByRoom = Relationship()
renewables_id: uuid.UUID = Field(foreign_key="renewables.id")
renewables: Renewables = Relationship()
class Occupant(BaseModel, table=True):
name: str
have_evidence_of_12_months_of_fuel_bill_data: bool
total_number_of_occupants: int
no_of_adult_occupants: int
no_of_child_occupants: int
no_of_occupant_of_a_pensionable_age: int
are_there_any_vulnerable_people: bool
is_there_anyone_with_a_disability: bool
status_of_occupant: str
landlord_wrote_that_the_tenent_agrees_assessment_been_supplied: bool
class EnergyUse(BaseModel, table=True):
property_tenure: str
who_is_the_electricity_payer: str
class HeatingFromConditionReport(BaseModel, table=True):
room_stat_in_temperature_in_celsius: Optional[str] = None
room_stat_location: Optional[str] = None
is_the_heating_pattern_known: Optional[str] = None
class ShowerAndBath(BaseModel, table=True):
shower_type: str
do_you_know_the_no_of_showers_per_day_per_week: bool
please_input_no_of_showers_and_specify_a_day_or_a_week: str
do_you_know_the_number_of_baths_per_day_or_per_week: str
class FridgeAndFreezers(BaseModel, table=True):
no_of_stand_alone_seperate_fridges: int
no_of_stand_alone_seperate_freezers: int
no_of_stand_alone_or_integrated_fridge_freezers: int
class Cooker(BaseModel,table=True):
range_fuel: str
normal_large_range: str
cooker_type: str
class TumbleDryer(BaseModel, table=True):
percentage_of_annual_use: int
space_for_outdoor_drying: bool
class OccupantAssessment(BaseModel, table=True):
occupant_id: uuid.UUID = Field(foreign_key="occupant.id")
occupant: Occupant = Relationship()
energy_use_id: uuid.UUID = Field(foreign_key="energyuse.id")
energy_use: EnergyUse = Relationship()
heating_id: uuid.UUID = Field(foreign_key="heatingfromconditionreport.id")
heating: HeatingFromConditionReport = Relationship()
shower_and_bath_id: uuid.UUID = Field(foreign_key="showerandbath.id")
shower_and_bath: ShowerAndBath = Relationship()
# appliances: Optional[Appliances]
# appliances_id
fridge_and_freezers_id: uuid.UUID = Field(foreign_key="fridgeandfreezers.id")
fridge_and_freezers: FridgeAndFreezers = Relationship()
cooker_id: uuid.UUID = Field(foreign_key="cooker.id")
cooker: Cooker = Relationship()
tumble_dryer_id: uuid.UUID = Field(foreign_key="tumbledryer.id")
tumble_dryer: TumbleDryer = Relationship()
class ConditionReportModel(BaseModel, table=True):
project_site_name: str
property_reference_code: str
property_address: str
postcode: str
general_information_id: uuid.UUID = Field(foreign_key="generalinformation.id")
general_information: GeneralInformation = Relationship()
access_and_elevations_id: uuid.UUID = Field(foreign_key="accessandelevations.id")
access_and_elevations: AccessAndElevations = Relationship()
rooms_id: uuid.UUID = Field(foreign_key="rooms.id")
rooms: Rooms = Relationship()
heating_system_id: uuid.UUID = Field(foreign_key="heatingsystem.id")
heating_system: HeatingSystem = Relationship()
occupancy_assessment_id: uuid.UUID = Field(foreign_key="occupantassessment.id")
occupancy_assessment: OccupantAssessment = Relationship()