from sqlmodel import Field, SQLModel, Relationship import uuid from typing import Optional, List from datetime import datetime from pydantic import EmailStr from sqlalchemy import Column from sqlalchemy.dialects.postgresql import UUID from etl.models.topLevel import BaseModel, Documents class PreSiteNote(BaseModel, table=True): summary_info_id: uuid.UUID = Field( foreign_key="presitenotessummaryinfo.id", nullable=False ) summary_info: Optional["PreSiteNotesSummaryInfo"] = Relationship(back_populates="pre_site_notes") # Assessor Info assessor_id: uuid.UUID = Field( foreign_key="assessorinfo.id", nullable=False ) assessor: Optional["AssessorInfo"] = Relationship(back_populates="pre_site_notes") pre_site_note_description_id: uuid.UUID = Field( foreign_key="propertydescription.id", nullable=True ) pre_site_note_description: Optional["PropertyDescription"] = Relationship(back_populates="pre_site_notes") class Dimension(BaseModel, table=True): floor_area_m2: float room_height_m: float loss_perimeter_m: float party_wall_length_m: float property_detail_id: Optional[uuid.UUID] = Field(default=None, foreign_key="propertydetail.id") property_detail: Optional["PropertyDetail"] = Relationship(back_populates="dimensions") class Walls(BaseModel, table=True): construction: str insulation: str insulation_thickness_mm: str wall_thickness_measured: bool wall_thickness_mm: Optional[int] u_value_known: bool u_value_w_m2_k: Optional[float] dry_lining: bool alternative_wall_present: bool class Roofs(BaseModel, table=True): construction: str insulation_type: str insulation_thickness: str u_value_known: bool class Floors(BaseModel, table=True): floor_type: str ground_floor_construction: str ground_floor_insulation_type: Optional[str] = "" floor_insulation_thickness_mm: Optional[float] = -1 u_value_known: bool class Windows(BaseModel, table=True): glazing_type: str area_m2: float roof_window: bool orientation: str u_value_w_m2_k: int g_value: int property_detail_id: Optional[uuid.UUID] = Field(default=None, foreign_key="propertydetail.id") property_detail: Optional["PropertyDetail"] = Relationship(back_populates="windows") class PropertyDetail(BaseModel, table=True): age_band: str wall_id: Optional[uuid.UUID] = Field(default=None, foreign_key="walls.id") roof_id: Optional[uuid.UUID] = Field(default=None, foreign_key="roofs.id") floor_id: Optional[uuid.UUID] = Field(default=None, foreign_key="floors.id") # Relationships dimensions: List[Dimension] = Relationship(back_populates="property_detail") windows: List[Windows] = Relationship(back_populates="property_detail") class Door(BaseModel, table=True): no_of_doors: int no_of_insulated_doors: int u_value_w_m2_k: Optional[str] property_description: Optional["PropertyDescription"] = Relationship(back_populates="door") class VentilationAndCooling(BaseModel, table=True): no_of_open_fireplaces: int ventilation_type: str space_cooling_system_present: bool property_description: Optional["PropertyDescription"] = Relationship(back_populates="ventilation_and_cooling") class Lighting(BaseModel, table=True): total_no_of_light_fittings: int total_no_of_lel_fittings: int property_description: Optional["PropertyDescription"] = Relationship(back_populates="lighting") class HeatingSystemControls(BaseModel, table=True): control_type: str flue_type: str fan_assisted_flue: bool heat_emitter_type: str electricity_meter_type: Optional[str] = "" mains_gas_available: Optional[bool] = False class HeatingFromPreSiteNotes(BaseModel, table=True): type: str heating_source: str efficiency_source: str heating_fuel: str brand_name: str model_name: str model_qualifer: str sap_2009_table: Optional[str] = "" percentage_of_heated_floor_area_served: Optional[str] = "" controls_id: Optional[uuid.UUID] = Field(default=None, foreign_key="heatingsystemcontrols.id") property_description: Optional["PropertyDescription"] = Relationship( back_populates="main_heating", sa_relationship_kwargs={"foreign_keys": "[PropertyDescription.main_heating_id]"} ) property_description2: Optional["PropertyDescription"] = Relationship( back_populates="main_heating2", sa_relationship_kwargs={"foreign_keys": "[PropertyDescription.main_heating2_id]"} ) class HeatingType(BaseModel, table=True): heating_type: str fuel_type: str property_description: Optional["PropertyDescription"] = Relationship(back_populates="secondary_heating_type") class WaterHeating(BaseModel, table=True): heating_type: str fuel_type: str property_description: Optional["PropertyDescription"] = Relationship(back_populates="water_heating") class HotWaterCylinder(BaseModel, table=True): volume: str insulation_type: str insulation_thickness: str thermostat: bool property_description: Optional["PropertyDescription"] = Relationship(back_populates="hot_water_cylinder") class SolarWaterHeating(BaseModel, table=True): solar_water_heating_details_known: bool property_description: Optional["PropertyDescription"] = Relationship(back_populates="solar_water_heating") class ShowerAndBaths(BaseModel, table=True): no_of_rooms_with_baths_and_or_shower: int no_of_rooms_with_mixer_shower_and_no_baths: int no_of_rooms_with_mixer_shower_and_baths: int property_description: Optional["PropertyDescription"] = Relationship(back_populates="shower_and_baths") class FlueGasHeatRecoverySystem(BaseModel, table=True): fghrs_present: bool property_description: Optional["PropertyDescription"] = Relationship(back_populates="flue_gas_heat_recovery_system") class PhotovoltaicPanel(BaseModel, table=True): pvs_are_connected_to_dwelling_electricity_meter: bool percentage_of_external_roof_area_with_pvs: str property_description: Optional["PropertyDescription"] = Relationship(back_populates="photovoltaic_panel") class WindTurbine(BaseModel, table=True): wind_turbine: bool property_description: Optional["PropertyDescription"] = Relationship(back_populates="wind_turbine") class OtherDetails(BaseModel, table=True): electricity_meter_type: str main_gas_avalible: bool property_description: Optional["PropertyDescription"] = Relationship(back_populates="other_details") class PropertyDescription(BaseModel, table=True): built_form: str detachment_or_position: str no_of_main_property: int no_of_extension_1: Optional[int] = 0 no_of_extension_2: Optional[int] = 0 no_of_extension_3: Optional[int] = 0 no_of_extension_4: Optional[int] = 0 no_of_habitable_rooms: int no_of_heated_rooms: int heated_basement: bool conservatory_type: str percentage_of_draught_proofed: int terrain_type: str conservatory: bool main_property_id: uuid.UUID = Field(foreign_key="propertydetail.id") ex1_property_id: Optional[uuid.UUID] = Field(default=None, foreign_key="propertydetail.id") ex2_property_id: Optional[uuid.UUID] = Field(default=None, foreign_key="propertydetail.id") ex3_property_id: Optional[uuid.UUID] = Field(default=None, foreign_key="propertydetail.id") ex4_property_id: Optional[uuid.UUID] = Field(default=None, foreign_key="propertydetail.id") door_id: Optional[uuid.UUID] = Field(default=None, foreign_key="door.id") ventilation_and_cooling_id: Optional[uuid.UUID] = Field(default=None, foreign_key="ventilationandcooling.id") lighting_id: Optional[uuid.UUID] = Field(default=None, foreign_key="lighting.id") water_heating_id: Optional[uuid.UUID] = Field(default=None, foreign_key="waterheating.id") hot_water_cylinder_id: Optional[uuid.UUID] = Field(default=None, foreign_key="hotwatercylinder.id") solar_water_heating_id: Optional[uuid.UUID] = Field(default=None, foreign_key="solarwaterheating.id") shower_and_baths_id: Optional[uuid.UUID] = Field(default=None, foreign_key="showerandbaths.id") flue_gas_heat_recovery_system_id: Optional[uuid.UUID] = Field(default=None, foreign_key="fluegasheatrecoverysystem.id") photovoltaic_panel_id: Optional[uuid.UUID] = Field(default=None, foreign_key="photovoltaicpanel.id") wind_turbine_id: Optional[uuid.UUID] = Field(default=None, foreign_key="windturbine.id") other_details_id: Optional[uuid.UUID] = Field(default=None, foreign_key="otherdetails.id") main_heating_id: Optional[uuid.UUID] = Field(default=None, foreign_key="heatingfrompresitenotes.id") main_heating2_id: Optional[uuid.UUID] = Field(default=None, foreign_key="heatingfrompresitenotes.id") secondary_heating_type_id: Optional[uuid.UUID] = Field(default=None, foreign_key="heatingtype.id") # Relationships main_property: Optional["PropertyDetail"] = Relationship(sa_relationship_kwargs={"foreign_keys": "[PropertyDescription.main_property_id]"}) ex1_property: Optional["PropertyDetail"] = Relationship(sa_relationship_kwargs={"foreign_keys": "[PropertyDescription.ex1_property_id]"}) ex2_property: Optional["PropertyDetail"] = Relationship(sa_relationship_kwargs={"foreign_keys": "[PropertyDescription.ex2_property_id]"}) ex3_property: Optional["PropertyDetail"] = Relationship(sa_relationship_kwargs={"foreign_keys": "[PropertyDescription.ex3_property_id]"}) ex4_property: Optional["PropertyDetail"] = Relationship(sa_relationship_kwargs={"foreign_keys": "[PropertyDescription.ex4_property_id]"}) # Related Models door: Optional["Door"] = Relationship(back_populates="property_description") ventilation_and_cooling: Optional["VentilationAndCooling"] = Relationship(back_populates="property_description") lighting: Optional["Lighting"] = Relationship(back_populates="property_description") water_heating: Optional["WaterHeating"] = Relationship(back_populates="property_description") hot_water_cylinder: Optional["HotWaterCylinder"] = Relationship(back_populates="property_description") solar_water_heating: Optional["SolarWaterHeating"] = Relationship(back_populates="property_description") shower_and_baths: Optional["ShowerAndBaths"] = Relationship(back_populates="property_description") flue_gas_heat_recovery_system: Optional["FlueGasHeatRecoverySystem"] = Relationship(back_populates="property_description") photovoltaic_panel: Optional["PhotovoltaicPanel"] = Relationship(back_populates="property_description") wind_turbine: Optional["WindTurbine"] = Relationship(back_populates="property_description") other_details: Optional["OtherDetails"] = Relationship(back_populates="property_description") main_heating: Optional["HeatingFromPreSiteNotes"] = Relationship(back_populates="property_description", sa_relationship_kwargs={"foreign_keys": "[PropertyDescription.main_heating_id]"}) main_heating2: Optional["HeatingFromPreSiteNotes"] = Relationship(back_populates="property_description", sa_relationship_kwargs={"foreign_keys": "[PropertyDescription.main_heating2_id]"}) secondary_heating_type: Optional["HeatingType"] = Relationship(back_populates="property_description") pre_site_notes: Optional["PreSiteNote"] = Relationship(back_populates="pre_site_note_description") class AssessorInfo(BaseModel, table=True): accreditation_number: str name: str phone_number: Optional[str] = None email_address: Optional[EmailStr] = None company_id: Optional[uuid.UUID] = Field(default=None, foreign_key="companyinfo.id") company: Optional["CompanyInfo"] = Relationship(back_populates="assessors") pre_site_notes: List["PreSiteNote"] = Relationship(back_populates="assessor") documents: List["Documents"] = Relationship(back_populates="author") class PreSiteNotesSummaryInfo(BaseModel, table=True): reference_number: str epc_language: str uprn: Optional[str] = "" postcode: str region: str address: str town: str county: Optional[str] = "" property_tenure: str transaction_type: str inspection_date: datetime current_sap: str potential_sap: str current_ei: str potential_ei: str current_annual_emissions: str current_annual_emission_including_0925_multiplayer: str current_annual_energy_costs: str pre_site_notes: List["PreSiteNote"] = Relationship(back_populates="summary_info") class CompanyInfo(BaseModel, table=True): address: str trading_name: str post_code: str fax_number: Optional[str] = None related_party_disclosure: Optional[str] = None assessors: List[AssessorInfo] = Relationship(back_populates="company") class Insulation(BaseModel, table=True): type: str PreSiteNote.update_forward_refs() AssessorInfo.update_forward_refs()