Redefine conditions data structures. Mapping tests broken

This commit is contained in:
Daniel Roth 2026-01-27 13:29:06 +00:00
parent 9509306e3d
commit 6a2bb26bae
12 changed files with 623 additions and 603 deletions

View file

@ -1,26 +1,17 @@
from dataclasses import dataclass
from datetime import date
from typing import Optional
from xml.dom.minidom import Element
from datetime import date
from backend.condition.domain.aspect_type import AspectType
from backend.condition.domain.element import Element
@dataclass
class AssetCondition:
uprn: int
element: Element
class AspectCondition:
aspect_type: AspectType
element_instance: Optional[int] = None
aspect_instance: Optional[int] = None
aspect_instance: int
value: Optional[str] = None
quantity: Optional[int] = None
install_date: Optional[date] = None
renewal_year: Optional[int] = None
source_system: Optional[str] = None
comments: Optional[str] = None

View file

@ -1,261 +1,12 @@
from enum import Enum
from dataclasses import dataclass
from typing import List
from backend.condition.domain.aspect_condition import AspectCondition
from backend.condition.domain.element_type import ElementType
class Element(str, Enum):
# ======================
# PROPERTY / GENERAL
# ======================
PROPERTY = "property"
PROPERTY_CONSTRUCTION_TYPE = "property_construction_type"
PROPERTY_CLASSIFICATION = "property_classification"
PROPERTY_AGE_BAND = "property_age_band"
STOREY_COUNT = "storey_count"
FLOOR_LEVEL = "floor_level"
FLOOR_LEVEL_FRONT_DOOR = "floor_level_front_door"
ACCESSIBLE_HOUSING_REGISTER = "accessible_housing_register"
ASBESTOS = "asbestos"
QUALITY_STANDARD = "quality_standard"
CCU = "ccu"
PASSENGER_LIFT = "passenger_lift"
STAIRLIFT = "stairlift"
DISABLED_HOIST_TRACKING = "disabled_hoist_tracking"
DISABLED_FACILITIES = "disabled_facilities"
STEPS_TO_FRONT_DOOR = "steps_to_front_door"
# ======================
# EXTERNAL ROOF
# ======================
ROOF = "roof"
PITCHED_ROOF_COVERING = "pitched_roof_covering"
FLAT_ROOF_COVERING = "flat_roof_covering"
RAINWATER_GOODS = "rainwater_goods"
LOFT_INSULATION = "loft_insulation"
PORCH_CANOPY = "porch_canopy"
CHIMNEY = "chimney"
FASCIA = "fascia"
SOFFIT = "soffit"
FASCIA_SOFFIT_BARGEBOARDS = "fascia_soffit_bargeboards"
GUTTERS = "gutters"
STORE_ROOF = "store_roof"
GARAGE_ROOF = "garage_roof"
GARAGE_AND_STORE_ROOF = "garage_and_store_roof"
# ======================
# EXTERNAL WALLS
# ======================
EXTERNAL_WALL = "external_wall"
EXTERNAL_NOISE_INSULATION = "external_noise_insulation"
PRIMARY_WALL = "primary_wall"
SECONDARY_WALL = "secondary_wall"
DOWNPIPES = "downpipes"
EXTERNAL_DECORATION = "external_decoration"
CLADDING = "cladding"
SPANDREL_PANELS = "spandrel_panels"
GARAGE_WALLS = "garage_walls"
PARTY_WALL_FIRE_BREAK = "party_wall_fire_break"
EXTERNAL_BRICKWORK_POINTING = "external_brickwork_pointing"
INTERNAL_DOWNPIPES_EXTERNAL_AREA = "internal_downpipes_external_area"
# ======================
# EXTERNAL WINDOWS
# ======================
EXTERNAL_WINDOWS = "external_windows"
COMMUNAL_WINDOWS = "communal_windows"
SECONDARY_GLAZING = "secondary_glazing"
STORE_WINDOWS = "store_windows"
GARAGE_WINDOWS = "garage_windows"
GARAGE_AND_STORE_WINDOWS = "garage_and_store_windows"
# ======================
# EXTERNAL DOORS
# ======================
EXTERNAL_DOOR = "external_door"
FRONT_DOOR = "front_door"
REAR_DOOR = "rear_door"
STORE_DOOR = "store_door"
GARAGE_DOOR = "garage_door"
GARAGE_AND_STORE_DOOR = "garage_and_store_door"
COMMUNAL_ENTRANCE_DOOR = "communal_entrance_door"
MAIN_DOOR = "main_door"
BLOCK_ENTRANCE_DOOR = "block_entrance_door"
LINTEL = "lintel"
PATIO_FRENCH_DOOR = "patio_french_door"
DOOR_ENTRY_HANDSET = "door_entry_handset"
# ======================
# EXTERNAL AREAS
# ======================
PATHS_AND_HARDSTANDINGS = "paths_and_hardstandings"
PARKING_AREAS = "parking_areas"
BOUNDARY_WALLS = "boundary_walls"
FRONT_FENCING = "front_fencing"
REAR_FENCING = "rear_fencing"
SIDE_FENCING = "side_fencing"
REAR_GATE = "rear_gate"
FRONT_GATE = "front_gate"
GATES = "gates"
RETAINING_WALLS = "retaining_walls"
PRIVATE_BALCONY = "private_balcony"
BALCONY_BALUSTRADE = "balcony_balustrade"
OUTBUILDINGS = "outbuildings"
GARAGE_STRUCTURE = "garage_structure"
PAVING = "paving"
ROADS = "roads"
SOIL_AND_VENT = "soil_and_vent"
SOLAR_THERMALS = "solar_thermals"
DROP_KERB = "drop_kerb"
OUTBUILDING_OVERHAUL = "outbuilding_overhaul"
EXTERNAL_STRUCTURAL_DEFECTS = "external_structural_defects"
ACCESS_RAMP = "access_ramp"
# ======================
# INTERNAL KITCHEN
# ======================
KITCHEN = "kitchen"
KITCHEN_SPACE_LAYOUT = "kitchen_space_layout"
TENANT_INSTALLED_KITCHEN = "tenant_installed_kitchen"
KITCHEN_EXTRACTOR_FAN = "kitchen_extractor_fan"
# ======================
# INTERNAL BATHROOM
# ======================
BATHROOM = "bathroom"
SECONDARY_BATHROOM = "secondary_bathroom"
SECONDARY_TOILET = "secondary_toilet"
BATHROOM_EXTRACTOR_FAN = "bathroom_extractor_fan"
ADDITIONAL_WC_OR_WHB = "additional_wc_or_whb"
BATHROOM_REMAINING_LIFE_SOURCE = "bathroom_remaining_life_source"
KITCHEN_REMAINING_LIFE_SOURCE = "kitchen_remaining_life_source"
# ======================
# INTERNAL HEATING / WATER
# ======================
CENTRAL_HEATING = "central_heating"
HEATING_BOILER = "heating_boiler"
HEATING_DISTRIBUTION = "heating_distribution"
SECONDARY_HEATING = "secondary_heating"
HOT_WATER_SYSTEM = "hot_water_system"
COLD_WATER_STORAGE = "cold_water_storage"
HEATING_SYSTEM = "heating_system"
BOILER_FUEL = "boiler_fuel"
WATER_HEATING = "water_heating"
PROGRAMMABLE_HEATING = "programmable_heating"
COMMUNITY_HEATING = (
"community_heating" # Is this definitely different from COMMUNAL_HEATING?
)
GAS_AVAILABLE = "gas_available"
HEAT_RECOVERY_UNITS = "heat_recovery_units"
HEATING_IMPROVEMENTS = "heating_improvements"
# ======================
# INTERNAL ELECTRICS / FIRE
# ======================
ELECTRICAL_WIRING = "electrical_wiring"
CONSUMER_UNIT = "consumer_unit"
SMOKE_DETECTION = "smoke_detection"
HEAT_DETECTION = "heat_detection"
CARBON_MONOXIDE_DETECTION = "carbon_monoxide_detection"
FIRE_DOOR_RATING = "fire_door_rating"
FIRE_RISK_ASSESSMENT = "fire_risk_assessment"
INTERNAL_WIRING = (
"internal_wiring" # Is this definitely different from ELECTRICAL_WIRING?
)
ELECTRICS = "electrics"
# ======================
# COMMUNAL
# ======================
COMMUNAL_HEATING = "communal_heating"
COMMUNAL_BOILER = "communal_boiler"
COMMUNAL_ELECTRICS = "communal_electrics"
COMMUNAL_FIRE_ALARM = "communal_fire_alarm"
COMMUNAL_EMERGENCY_LIGHTING = "communal_emergency_lighting"
COMMUNAL_DOOR_ENTRY = "communal_door_entry"
COMMUNAL_CCTV = "communal_cctv"
COMMUNAL_BIN_STORE = "communal_bin_store"
COMMUNAL_BIN_STORE_DOORS = "communal_bin_store_doors"
COMMUNAL_BIN_STORE_WALLS = "communal_bin_store_walls"
COMMUNAL_BIN_STORE_ROOF = "communal_bin_store_roof"
COMMUNAL_REFUSE_CHUTE = "communal_refuse_chute"
COMMUNAL_FLOOR_COVERING = "communal_floor_covering"
COMMUNAL_KITCHEN = "communal_kitchen"
COMMUNAL_BATHROOM = "communal_bathroom"
COMMUNAL_TOILETS = "communal_toilets"
COMMUNAL_GATES = "communal_gates"
COMMUNAL_LIFT = "communal_lift"
COMMUNAL_PASSENGER_LIFT = "communal_passenger_lift"
COMMUNAL_BALCONY_WALKWAY = "communal_balcony_walkway"
COMMUNAL_ENTRANCE = "communal_entrance"
COMMUNAL_INTERNAL_DECORATIONS = "communal_internal_decorations"
COMMUNAL_INTERNAL_FLOOR = "communal_internal_floor"
COMMUNAL_WALKWAYS = "communal_walkways"
COMMUNAL_EXTERNAL_DOORS = "communal_external_doors"
COMMUNAL_STAIRS = "communal_stairs"
COMMUNAL_AERIAL = "communal_aerial"
COMMUNAL_AOV = "communal_aov"
COMMUNAL_INTERNAL_DOORS = "communal_internal_doors"
COMMUNAL_LATERAL_MAINS = "communal_lateral_mains"
COMMUNAL_LIGHTING = "communal_lighting"
COMMUNAL_LIGHTING_CONDUCTOR = "communal_lighting_conductor"
COMMUNAL_STORE_ROOF = "communal_store_roof"
COMMUNAL_STORE_WALLS = "communal_store_walls"
COMMUNAL_STORE_DOORS = "communal_store_doors"
COMMUNAL_WARDEN_CALL_SYSTEM = "communal_warden_call_system"
COMMUNAL_BMS = "communal_bms"
COMMUNAL_BOOSTER_PUMP = "communal_booster_pump"
COMMUNAL_DRY_RISER = "communal_dry_riser"
COMMUNAL_WET_RISER = "communal_wet_riser"
COMMUNAL_COLD_WATER_STORAGE = "communal_cold_water_storage"
COMMUNAL_SPRINKLER = "communal_sprinkler"
COMMUNAL_PLUG_SOCKETS = "communal_plug_sockets"
COMMUNAL_CIRCULATION_SPACE = "communal_circulation_space"
# ======================
# FITNESS FOR HUMAN HABITATION
# ======================
FFHH_DAMP = "ffhh_damp"
FFHH_HOT_AND_COLD_WATER = "ffhh_hold_and_cold_water"
FFHH_DRAINAGE_LAVATORIES = "ffhh_drainage_lavatories"
FFHH_NEGLECTED = "ffhh_neglected"
FFHH_NATURAL_LIGHT = "ffhh_natural_light"
FFHH_VENTILATION = "ffhh_ventilation"
FFHH_FOOD_PREP_AND_WASHUP = "ffhh_food_prep_and_washup"
FFHH_UNSAFE_LAYOUT = "ffhh_unsafe_layout"
FFHH_UNSTABLE_BUILDING = "ffhh_unstable_building"
# ==========================================================
# HHSRS ALL 29 HAZARDS
# ==========================================================
HHSRS_DAMP_AND_MOULD = "hhsrs_damp_and_mould"
HHSRS_EXCESS_COLD = "hhsrs_excess_cold"
HHSRS_EXCESS_HEAT = "hhsrs_excess_heat"
HHSRS_ASBESTOS_AND_MMF = "hhsrs_asbestos_and_mmf"
HHSRS_BIOCIDES = "hhsrs_biocides"
HHSRS_CARBON_MONOXIDE = "hhsrs_carbon_monoxide"
HHSRS_LEAD = "hhsrs_lead"
HHSRS_RADIATION = "hhsrs_radiation"
HHSRS_UNCOMBUSTED_FUEL_GAS = "hhsrs_uncombusted_fuel_gas"
HHSRS_VOLATILE_ORGANIC_COMPOUNDS = "hhsrs_volatile_organic_compounds"
HHSRS_CROWDING_AND_SPACE = "hhsrs_crowding_and_space"
HHSRS_ENTRY_BY_INTRUDERS = "hhsrs_entry_by_intruders"
HHSRS_LIGHTING = "hhsrs_lighting"
HHSRS_NOISE = "hhsrs_noise"
HHSRS_DOMESTIC_HYGIENE_PESTS_REFUSE = "hhsrs_domestic_hygiene_pests_refuse"
HHSRS_FOOD_SAFETY = "hhsrs_food_safety"
HHSRS_PERSONAL_HYGIENE_SANITATION = "hhsrs_personal_hygiene_sanitation"
HHSRS_WATER_SUPPLY = "hhsrs_water_supply"
HHSRS_FALLS_ASSOCIATED_WITH_BATHS = "hhsrs_falls_associated_with_baths"
HHSRS_FALLS_ON_LEVEL_SURFACES = "hhsrs_falls_on_level_surfaces"
HHSRS_FALLS_ON_STAIRS = "hhsrs_falls_on_stairs"
HHSRS_FALLS_BETWEEN_LEVELS = "hhsrs_falls_between_levels"
HHSRS_ELECTRICAL_HAZARDS = "hhsrs_electrical_hazards"
HHSRS_FIRE = "hhsrs_fire"
HHSRS_FLAMES_HOT_SURFACES = "hhsrs_flames_hot_surfaces"
HHSRS_COLLISION_AND_ENTRAPMENT = "hhsrs_collision_and_entrapment"
HHSRS_COLLISION_HAZARDS_LOW_HEADROOM = "hhsrs_collision_hazards_low_headroom"
HHSRS_EXPLOSIONS = "hhsrs_explosions"
HHSRS_ERGONOMICS = "hhsrs_ergonomics"
HHSRS_STRUCTURAL_COLLAPSE = "hhsrs_structural_collapse"
HHSRS_AMENITIES = "hhsrs_amenities"
@dataclass
class Element:
element: ElementType
element_instance: int
aspect_conditions: List[AspectCondition]

View file

@ -0,0 +1,261 @@
from enum import Enum
class ElementType(str, Enum):
# ======================
# PROPERTY / GENERAL
# ======================
PROPERTY = "property"
PROPERTY_CONSTRUCTION_TYPE = "property_construction_type"
PROPERTY_CLASSIFICATION = "property_classification"
PROPERTY_AGE_BAND = "property_age_band"
STOREY_COUNT = "storey_count"
FLOOR_LEVEL = "floor_level"
FLOOR_LEVEL_FRONT_DOOR = "floor_level_front_door"
ACCESSIBLE_HOUSING_REGISTER = "accessible_housing_register"
ASBESTOS = "asbestos"
QUALITY_STANDARD = "quality_standard"
CCU = "ccu"
PASSENGER_LIFT = "passenger_lift"
STAIRLIFT = "stairlift"
DISABLED_HOIST_TRACKING = "disabled_hoist_tracking"
DISABLED_FACILITIES = "disabled_facilities"
STEPS_TO_FRONT_DOOR = "steps_to_front_door"
# ======================
# EXTERNAL ROOF
# ======================
ROOF = "roof"
PITCHED_ROOF_COVERING = "pitched_roof_covering"
FLAT_ROOF_COVERING = "flat_roof_covering"
RAINWATER_GOODS = "rainwater_goods"
LOFT_INSULATION = "loft_insulation"
PORCH_CANOPY = "porch_canopy"
CHIMNEY = "chimney"
FASCIA = "fascia"
SOFFIT = "soffit"
FASCIA_SOFFIT_BARGEBOARDS = "fascia_soffit_bargeboards"
GUTTERS = "gutters"
STORE_ROOF = "store_roof"
GARAGE_ROOF = "garage_roof"
GARAGE_AND_STORE_ROOF = "garage_and_store_roof"
# ======================
# EXTERNAL WALLS
# ======================
EXTERNAL_WALL = "external_wall"
EXTERNAL_NOISE_INSULATION = "external_noise_insulation"
PRIMARY_WALL = "primary_wall"
SECONDARY_WALL = "secondary_wall"
DOWNPIPES = "downpipes"
EXTERNAL_DECORATION = "external_decoration"
CLADDING = "cladding"
SPANDREL_PANELS = "spandrel_panels"
GARAGE_WALLS = "garage_walls"
PARTY_WALL_FIRE_BREAK = "party_wall_fire_break"
EXTERNAL_BRICKWORK_POINTING = "external_brickwork_pointing"
INTERNAL_DOWNPIPES_EXTERNAL_AREA = "internal_downpipes_external_area"
# ======================
# EXTERNAL WINDOWS
# ======================
EXTERNAL_WINDOWS = "external_windows"
COMMUNAL_WINDOWS = "communal_windows"
SECONDARY_GLAZING = "secondary_glazing"
STORE_WINDOWS = "store_windows"
GARAGE_WINDOWS = "garage_windows"
GARAGE_AND_STORE_WINDOWS = "garage_and_store_windows"
# ======================
# EXTERNAL DOORS
# ======================
EXTERNAL_DOOR = "external_door"
FRONT_DOOR = "front_door"
REAR_DOOR = "rear_door"
STORE_DOOR = "store_door"
GARAGE_DOOR = "garage_door"
GARAGE_AND_STORE_DOOR = "garage_and_store_door"
COMMUNAL_ENTRANCE_DOOR = "communal_entrance_door"
MAIN_DOOR = "main_door"
BLOCK_ENTRANCE_DOOR = "block_entrance_door"
LINTEL = "lintel"
PATIO_FRENCH_DOOR = "patio_french_door"
DOOR_ENTRY_HANDSET = "door_entry_handset"
# ======================
# EXTERNAL AREAS
# ======================
PATHS_AND_HARDSTANDINGS = "paths_and_hardstandings"
PARKING_AREAS = "parking_areas"
BOUNDARY_WALLS = "boundary_walls"
FRONT_FENCING = "front_fencing"
REAR_FENCING = "rear_fencing"
SIDE_FENCING = "side_fencing"
REAR_GATE = "rear_gate"
FRONT_GATE = "front_gate"
GATES = "gates"
RETAINING_WALLS = "retaining_walls"
PRIVATE_BALCONY = "private_balcony"
BALCONY_BALUSTRADE = "balcony_balustrade"
OUTBUILDINGS = "outbuildings"
GARAGE_STRUCTURE = "garage_structure"
PAVING = "paving"
ROADS = "roads"
SOIL_AND_VENT = "soil_and_vent"
SOLAR_THERMALS = "solar_thermals"
DROP_KERB = "drop_kerb"
OUTBUILDING_OVERHAUL = "outbuilding_overhaul"
EXTERNAL_STRUCTURAL_DEFECTS = "external_structural_defects"
ACCESS_RAMP = "access_ramp"
# ======================
# INTERNAL KITCHEN
# ======================
KITCHEN = "kitchen"
KITCHEN_SPACE_LAYOUT = "kitchen_space_layout"
TENANT_INSTALLED_KITCHEN = "tenant_installed_kitchen"
KITCHEN_EXTRACTOR_FAN = "kitchen_extractor_fan"
# ======================
# INTERNAL BATHROOM
# ======================
BATHROOM = "bathroom"
SECONDARY_BATHROOM = "secondary_bathroom"
SECONDARY_TOILET = "secondary_toilet"
BATHROOM_EXTRACTOR_FAN = "bathroom_extractor_fan"
ADDITIONAL_WC_OR_WHB = "additional_wc_or_whb"
BATHROOM_REMAINING_LIFE_SOURCE = "bathroom_remaining_life_source"
KITCHEN_REMAINING_LIFE_SOURCE = "kitchen_remaining_life_source"
# ======================
# INTERNAL HEATING / WATER
# ======================
CENTRAL_HEATING = "central_heating"
HEATING_BOILER = "heating_boiler"
HEATING_DISTRIBUTION = "heating_distribution"
SECONDARY_HEATING = "secondary_heating"
HOT_WATER_SYSTEM = "hot_water_system"
COLD_WATER_STORAGE = "cold_water_storage"
HEATING_SYSTEM = "heating_system"
BOILER_FUEL = "boiler_fuel"
WATER_HEATING = "water_heating"
PROGRAMMABLE_HEATING = "programmable_heating"
COMMUNITY_HEATING = (
"community_heating" # Is this definitely different from COMMUNAL_HEATING?
)
GAS_AVAILABLE = "gas_available"
HEAT_RECOVERY_UNITS = "heat_recovery_units"
HEATING_IMPROVEMENTS = "heating_improvements"
# ======================
# INTERNAL ELECTRICS / FIRE
# ======================
ELECTRICAL_WIRING = "electrical_wiring"
CONSUMER_UNIT = "consumer_unit"
SMOKE_DETECTION = "smoke_detection"
HEAT_DETECTION = "heat_detection"
CARBON_MONOXIDE_DETECTION = "carbon_monoxide_detection"
FIRE_DOOR_RATING = "fire_door_rating"
FIRE_RISK_ASSESSMENT = "fire_risk_assessment"
INTERNAL_WIRING = (
"internal_wiring" # Is this definitely different from ELECTRICAL_WIRING?
)
ELECTRICS = "electrics"
# ======================
# COMMUNAL
# ======================
COMMUNAL_HEATING = "communal_heating"
COMMUNAL_BOILER = "communal_boiler"
COMMUNAL_ELECTRICS = "communal_electrics"
COMMUNAL_FIRE_ALARM = "communal_fire_alarm"
COMMUNAL_EMERGENCY_LIGHTING = "communal_emergency_lighting"
COMMUNAL_DOOR_ENTRY = "communal_door_entry"
COMMUNAL_CCTV = "communal_cctv"
COMMUNAL_BIN_STORE = "communal_bin_store"
COMMUNAL_BIN_STORE_DOORS = "communal_bin_store_doors"
COMMUNAL_BIN_STORE_WALLS = "communal_bin_store_walls"
COMMUNAL_BIN_STORE_ROOF = "communal_bin_store_roof"
COMMUNAL_REFUSE_CHUTE = "communal_refuse_chute"
COMMUNAL_FLOOR_COVERING = "communal_floor_covering"
COMMUNAL_KITCHEN = "communal_kitchen"
COMMUNAL_BATHROOM = "communal_bathroom"
COMMUNAL_TOILETS = "communal_toilets"
COMMUNAL_GATES = "communal_gates"
COMMUNAL_LIFT = "communal_lift"
COMMUNAL_PASSENGER_LIFT = "communal_passenger_lift"
COMMUNAL_BALCONY_WALKWAY = "communal_balcony_walkway"
COMMUNAL_ENTRANCE = "communal_entrance"
COMMUNAL_INTERNAL_DECORATIONS = "communal_internal_decorations"
COMMUNAL_INTERNAL_FLOOR = "communal_internal_floor"
COMMUNAL_WALKWAYS = "communal_walkways"
COMMUNAL_EXTERNAL_DOORS = "communal_external_doors"
COMMUNAL_STAIRS = "communal_stairs"
COMMUNAL_AERIAL = "communal_aerial"
COMMUNAL_AOV = "communal_aov"
COMMUNAL_INTERNAL_DOORS = "communal_internal_doors"
COMMUNAL_LATERAL_MAINS = "communal_lateral_mains"
COMMUNAL_LIGHTING = "communal_lighting"
COMMUNAL_LIGHTING_CONDUCTOR = "communal_lighting_conductor"
COMMUNAL_STORE_ROOF = "communal_store_roof"
COMMUNAL_STORE_WALLS = "communal_store_walls"
COMMUNAL_STORE_DOORS = "communal_store_doors"
COMMUNAL_WARDEN_CALL_SYSTEM = "communal_warden_call_system"
COMMUNAL_BMS = "communal_bms"
COMMUNAL_BOOSTER_PUMP = "communal_booster_pump"
COMMUNAL_DRY_RISER = "communal_dry_riser"
COMMUNAL_WET_RISER = "communal_wet_riser"
COMMUNAL_COLD_WATER_STORAGE = "communal_cold_water_storage"
COMMUNAL_SPRINKLER = "communal_sprinkler"
COMMUNAL_PLUG_SOCKETS = "communal_plug_sockets"
COMMUNAL_CIRCULATION_SPACE = "communal_circulation_space"
# ======================
# FITNESS FOR HUMAN HABITATION
# ======================
FFHH_DAMP = "ffhh_damp"
FFHH_HOT_AND_COLD_WATER = "ffhh_hold_and_cold_water"
FFHH_DRAINAGE_LAVATORIES = "ffhh_drainage_lavatories"
FFHH_NEGLECTED = "ffhh_neglected"
FFHH_NATURAL_LIGHT = "ffhh_natural_light"
FFHH_VENTILATION = "ffhh_ventilation"
FFHH_FOOD_PREP_AND_WASHUP = "ffhh_food_prep_and_washup"
FFHH_UNSAFE_LAYOUT = "ffhh_unsafe_layout"
FFHH_UNSTABLE_BUILDING = "ffhh_unstable_building"
# ==========================================================
# HHSRS ALL 29 HAZARDS
# ==========================================================
HHSRS_DAMP_AND_MOULD = "hhsrs_damp_and_mould"
HHSRS_EXCESS_COLD = "hhsrs_excess_cold"
HHSRS_EXCESS_HEAT = "hhsrs_excess_heat"
HHSRS_ASBESTOS_AND_MMF = "hhsrs_asbestos_and_mmf"
HHSRS_BIOCIDES = "hhsrs_biocides"
HHSRS_CARBON_MONOXIDE = "hhsrs_carbon_monoxide"
HHSRS_LEAD = "hhsrs_lead"
HHSRS_RADIATION = "hhsrs_radiation"
HHSRS_UNCOMBUSTED_FUEL_GAS = "hhsrs_uncombusted_fuel_gas"
HHSRS_VOLATILE_ORGANIC_COMPOUNDS = "hhsrs_volatile_organic_compounds"
HHSRS_CROWDING_AND_SPACE = "hhsrs_crowding_and_space"
HHSRS_ENTRY_BY_INTRUDERS = "hhsrs_entry_by_intruders"
HHSRS_LIGHTING = "hhsrs_lighting"
HHSRS_NOISE = "hhsrs_noise"
HHSRS_DOMESTIC_HYGIENE_PESTS_REFUSE = "hhsrs_domestic_hygiene_pests_refuse"
HHSRS_FOOD_SAFETY = "hhsrs_food_safety"
HHSRS_PERSONAL_HYGIENE_SANITATION = "hhsrs_personal_hygiene_sanitation"
HHSRS_WATER_SUPPLY = "hhsrs_water_supply"
HHSRS_FALLS_ASSOCIATED_WITH_BATHS = "hhsrs_falls_associated_with_baths"
HHSRS_FALLS_ON_LEVEL_SURFACES = "hhsrs_falls_on_level_surfaces"
HHSRS_FALLS_ON_STAIRS = "hhsrs_falls_on_stairs"
HHSRS_FALLS_BETWEEN_LEVELS = "hhsrs_falls_between_levels"
HHSRS_ELECTRICAL_HAZARDS = "hhsrs_electrical_hazards"
HHSRS_FIRE = "hhsrs_fire"
HHSRS_FLAMES_HOT_SURFACES = "hhsrs_flames_hot_surfaces"
HHSRS_COLLISION_AND_ENTRAPMENT = "hhsrs_collision_and_entrapment"
HHSRS_COLLISION_HAZARDS_LOW_HEADROOM = "hhsrs_collision_hazards_low_headroom"
HHSRS_EXPLOSIONS = "hhsrs_explosions"
HHSRS_ERGONOMICS = "hhsrs_ergonomics"
HHSRS_STRUCTURAL_COLLAPSE = "hhsrs_structural_collapse"
HHSRS_AMENITIES = "hhsrs_amenities"

View file

@ -1,4 +1,4 @@
from backend.condition.domain.element import Element
from backend.condition.domain.element_type import ElementType
from backend.condition.domain.aspect_type import AspectType
from backend.condition.domain.mapping.element_mapping import ElementMapping
@ -8,11 +8,11 @@ LBWF_ELEMENT_MAP: dict[str, ElementMapping] = {
# PROPERTY / GENERAL
# ==========================================================
"AHR_CAT": ElementMapping(
element=Element.ACCESSIBLE_HOUSING_REGISTER,
element=ElementType.ACCESSIBLE_HOUSING_REGISTER,
aspect_type=AspectType.CATEGORY,
),
"ASSETSAREA": ElementMapping(
element=Element.PROPERTY,
element=ElementType.PROPERTY,
aspect_type=AspectType.AREA,
),
# "DECNTHMINC": ElementMapping(
@ -20,301 +20,301 @@ LBWF_ELEMENT_MAP: dict[str, ElementMapping] = {
# aspect_type=AspectType.INCLUSION,
# ), # Ignore this one
"QUALITYSTD": ElementMapping(
element=Element.QUALITY_STANDARD,
element=ElementType.QUALITY_STANDARD,
aspect_type=AspectType.TYPE,
),
"EXTSTOREY": ElementMapping(
element=Element.PROPERTY,
element=ElementType.PROPERTY,
aspect_type=AspectType.CONFIGURATION,
),
"FLVL": ElementMapping(
element=Element.FLOOR_LEVEL_FRONT_DOOR,
element=ElementType.FLOOR_LEVEL_FRONT_DOOR,
aspect_type=AspectType.LOCATION,
),
"INTFLRLVL": ElementMapping(
element=Element.FLOOR_LEVEL,
element=ElementType.FLOOR_LEVEL,
aspect_type=AspectType.LOCATION,
),
"INTNSEINSL": ElementMapping(
element=Element.EXTERNAL_NOISE_INSULATION, # Maybe this shouldn't be "EXTERNAL_"
element=ElementType.EXTERNAL_NOISE_INSULATION, # Maybe this shouldn't be "EXTERNAL_"
aspect_type=AspectType.ADEQUACY,
),
"INTSTEPSFD": ElementMapping(
element=Element.STEPS_TO_FRONT_DOOR,
element=ElementType.STEPS_TO_FRONT_DOOR,
aspect_type=AspectType.QUANTITY,
),
# ==========================================================
# ASBESTOS (NON-HHSRS RECORD)
# ==========================================================
"ASBESTOS": ElementMapping(
element=Element.ASBESTOS,
element=ElementType.ASBESTOS,
aspect_type=AspectType.PRESENCE,
),
# ==========================================================
# INTERNAL BATHROOMS & KITCHENS
# ==========================================================
"INTBTHRLOC": ElementMapping(
element=Element.BATHROOM,
element=ElementType.BATHROOM,
aspect_type=AspectType.LOCATION,
),
"INTBTHADEQ": ElementMapping(
element=Element.BATHROOM,
element=ElementType.BATHROOM,
aspect_type=AspectType.ADEQUACY,
),
"INTKITADEQ": ElementMapping(
element=Element.KITCHEN,
element=ElementType.KITCHEN,
aspect_type=AspectType.ADEQUACY,
),
"INTCKRLOC": ElementMapping(
element=Element.KITCHEN,
element=ElementType.KITCHEN,
aspect_type=AspectType.LOCATION,
),
"INTADDWCW": ElementMapping(
element=Element.ADDITIONAL_WC_OR_WHB,
element=ElementType.ADDITIONAL_WC_OR_WHB,
aspect_type=AspectType.PRESENCE,
),
"INTBTHREML": ElementMapping(
element=Element.BATHROOM_REMAINING_LIFE_SOURCE,
element=ElementType.BATHROOM_REMAINING_LIFE_SOURCE,
aspect_type=AspectType.TYPE,
),
"INTKITREML": ElementMapping(
element=Element.KITCHEN_REMAINING_LIFE_SOURCE,
element=ElementType.KITCHEN_REMAINING_LIFE_SOURCE,
aspect_type=AspectType.TYPE,
),
"INTTNTINST": ElementMapping(
element=Element.TENANT_INSTALLED_KITCHEN,
element=ElementType.TENANT_INSTALLED_KITCHEN,
aspect_type=AspectType.TYPE, # Not certain about this aspect type - need more data
),
# ==========================================================
# INTERNAL FIRE
# ==========================================================
"FRARISKRTG": ElementMapping(
element=Element.FIRE_RISK_ASSESSMENT,
element=ElementType.FIRE_RISK_ASSESSMENT,
aspect_type=AspectType.RATING,
),
"FRATYPE": ElementMapping(
element=Element.FIRE_RISK_ASSESSMENT,
element=ElementType.FIRE_RISK_ASSESSMENT,
aspect_type=AspectType.TYPE,
),
"FRAEVACSTR": ElementMapping(
element=Element.FIRE_RISK_ASSESSMENT,
element=ElementType.FIRE_RISK_ASSESSMENT,
aspect_type=AspectType.STRATEGY,
),
"INTSMKDET": ElementMapping(
element=Element.SMOKE_DETECTION,
element=ElementType.SMOKE_DETECTION,
aspect_type=AspectType.PRESENCE,
),
"INTCHEXTNT": ElementMapping(
element=Element.HEATING_SYSTEM,
element=ElementType.HEATING_SYSTEM,
aspect_type=AspectType.EXTENT,
),
# ==========================================================
# HEATING & SERVICES
# ==========================================================
"INTCHEXTNT": ElementMapping(
element=Element.CENTRAL_HEATING,
element=ElementType.CENTRAL_HEATING,
aspect_type=AspectType.EXTENT,
),
"INTCHDIST": ElementMapping(
element=Element.HEATING_DISTRIBUTION,
element=ElementType.HEATING_DISTRIBUTION,
aspect_type=AspectType.TYPE,
),
"INTCHBLR": ElementMapping(
element=Element.HEATING_BOILER,
element=ElementType.HEATING_BOILER,
aspect_type=AspectType.TYPE,
),
"INTBOILERF": ElementMapping(
element=Element.BOILER_FUEL,
element=ElementType.BOILER_FUEL,
aspect_type=AspectType.TYPE,
),
"INTHTDISYS": ElementMapping(
element=Element.HEATING_SYSTEM,
element=ElementType.HEATING_SYSTEM,
aspect_type=AspectType.DISTRIBUTION,
),
"INTWTRHTNG": ElementMapping(
element=Element.WATER_HEATING,
element=ElementType.WATER_HEATING,
aspect_type=AspectType.TYPE,
),
"INTCOMHTG": ElementMapping(
element=Element.COMMUNITY_HEATING,
element=ElementType.COMMUNITY_HEATING,
aspect_type=AspectType.TYPE,
),
"INTELECTRC": ElementMapping(
element=Element.ELECTRICS,
element=ElementType.ELECTRICS,
aspect_type=AspectType.WORK_REQUIRED, # Not certain about this aspect type - need more data
),
"INTGASAVAI": ElementMapping(
element=Element.GAS_AVAILABLE,
element=ElementType.GAS_AVAILABLE,
aspect_type=AspectType.PRESENCE, # Maybe should be AspectType.TYPE ?
),
"INTHEATREC": ElementMapping(
element=Element.HEAT_RECOVERY_UNITS,
element=ElementType.HEAT_RECOVERY_UNITS,
aspect_type=AspectType.PRESENCE,
),
"INTHTIMP": ElementMapping(
element=Element.GAS_AVAILABLE,
element=ElementType.GAS_AVAILABLE,
aspect_type=AspectType.WORK_REQUIRED,
),
"INTPROGHTG": ElementMapping(
element=Element.PROGRAMMABLE_HEATING,
element=ElementType.PROGRAMMABLE_HEATING,
aspect_type=AspectType.TYPE, # Should maybe be PRESENCE, but set to TYPE for consistency with Peabody data
),
# ==========================================================
# EXTERNAL WALLS (INSTANCED)
# ==========================================================
"EXTWALLSTR": ElementMapping(
element=Element.EXTERNAL_WALL,
element=ElementType.EXTERNAL_WALL,
aspect_type=AspectType.STRUCTURE,
element_instance=1,
),
"EXTWALLFN1": ElementMapping(
element=Element.EXTERNAL_WALL,
element=ElementType.EXTERNAL_WALL,
aspect_type=AspectType.FINISH,
element_instance=1,
),
"EXTWALLFN2": ElementMapping(
element=Element.EXTERNAL_WALL,
element=ElementType.EXTERNAL_WALL,
aspect_type=AspectType.FINISH,
element_instance=2,
),
"EXTWALLINS": ElementMapping(
element=Element.EXTERNAL_WALL,
element=ElementType.EXTERNAL_WALL,
aspect_type=AspectType.INSULATION,
),
"EXTWALLSPL": ElementMapping(
element=Element.EXTERNAL_WALL,
element=ElementType.EXTERNAL_WALL,
aspect_type=AspectType.CONDITION,
),
"EXTDWNPTYP": ElementMapping(
element=Element.DOWNPIPES,
element=ElementType.DOWNPIPES,
aspect_type=AspectType.MATERIAL,
),
"EXTGUTRTYP": ElementMapping(
element=Element.GUTTERS,
element=ElementType.GUTTERS,
aspect_type=AspectType.MATERIAL,
),
# ==========================================================
# EXTERNAL ROOFS (INSTANCED)
# ==========================================================
"EXTRFSTR1": ElementMapping(
element=Element.ROOF,
element=ElementType.ROOF,
aspect_type=AspectType.STRUCTURE,
element_instance=1,
),
"EXTRFSTR2": ElementMapping(
element=Element.ROOF,
element=ElementType.ROOF,
aspect_type=AspectType.STRUCTURE,
element_instance=2,
),
"EXTRFSTR3": ElementMapping(
element=Element.ROOF,
element=ElementType.ROOF,
aspect_type=AspectType.STRUCTURE,
element_instance=3,
),
"EXTROOF1": ElementMapping(
element=Element.ROOF,
element=ElementType.ROOF,
aspect_type=AspectType.COVERING,
element_instance=1,
),
"EXTROOF2": ElementMapping(
element=Element.ROOF,
element=ElementType.ROOF,
aspect_type=AspectType.COVERING,
element_instance=2,
),
"EXTROOF3": ElementMapping(
element=Element.ROOF,
element=ElementType.ROOF,
aspect_type=AspectType.COVERING,
element_instance=3,
),
"EXTCHIMNEY": ElementMapping(
element=Element.CHIMNEY,
element=ElementType.CHIMNEY,
aspect_type=AspectType.WORK_REQUIRED,
),
"EXTFASOFBR": ElementMapping(
element=Element.FASCIA_SOFFIT_BARGEBOARDS,
element=ElementType.FASCIA_SOFFIT_BARGEBOARDS,
aspect_type=AspectType.MATERIAL,
),
"EXTGARROOF": ElementMapping(
element=Element.GARAGE_ROOF,
element=ElementType.GARAGE_ROOF,
aspect_type=AspectType.MATERIAL,
),
"EXTGARSTRF": ElementMapping(
element=Element.GARAGE_AND_STORE_ROOF,
element=ElementType.GARAGE_AND_STORE_ROOF,
aspect_type=AspectType.MATERIAL,
),
"EXTSTRROOF": ElementMapping(
element=Element.STORE_ROOF,
element=ElementType.STORE_ROOF,
aspect_type=AspectType.MATERIAL,
),
"INTLOFTINS": ElementMapping(
element=Element.LOFT_INSULATION,
element=ElementType.LOFT_INSULATION,
aspect_type=AspectType.TYPE,
),
# ==========================================================
# EXTERNAL DOORS & WINDOWS
# ==========================================================
"INTFRDOOR": ElementMapping(
element=Element.EXTERNAL_DOOR,
element=ElementType.EXTERNAL_DOOR,
aspect_type=AspectType.TYPE,
),
"INTFRDRFRR": ElementMapping(
element=Element.EXTERNAL_DOOR,
element=ElementType.EXTERNAL_DOOR,
aspect_type=AspectType.FIRE_RATING,
),
"EXTBKSDDR1": ElementMapping(
element=Element.EXTERNAL_DOOR,
element=ElementType.EXTERNAL_DOOR,
aspect_type=AspectType.TYPE,
element_instance=1,
),
"EXTBKSDDR2": ElementMapping(
element=Element.EXTERNAL_DOOR,
element=ElementType.EXTERNAL_DOOR,
aspect_type=AspectType.TYPE,
element_instance=2,
),
"INTWDWTYPE": ElementMapping(
element=Element.EXTERNAL_WINDOWS,
element=ElementType.EXTERNAL_WINDOWS,
aspect_type=AspectType.TYPE,
),
"EXTWNDWS1": ElementMapping(
element=Element.EXTERNAL_WINDOWS,
element=ElementType.EXTERNAL_WINDOWS,
aspect_type=AspectType.TYPE,
element_instance=1,
),
"EXTWNDWS2": ElementMapping(
element=Element.EXTERNAL_WINDOWS,
element=ElementType.EXTERNAL_WINDOWS,
aspect_type=AspectType.TYPE,
element_instance=2,
),
"EXTGARDOOR": ElementMapping(
element=Element.GARAGE_DOOR,
element=ElementType.GARAGE_DOOR,
aspect_type=AspectType.MATERIAL,
),
"EXTGARSTDR": ElementMapping(
element=Element.GARAGE_AND_STORE_DOOR,
element=ElementType.GARAGE_AND_STORE_DOOR,
aspect_type=AspectType.MATERIAL,
),
"EXTSTRDOOR": ElementMapping(
element=Element.STORE_DOOR,
element=ElementType.STORE_DOOR,
aspect_type=AspectType.MATERIAL,
),
"EXTGARWDWS": ElementMapping(
element=Element.GARAGE_WINDOWS,
element=ElementType.GARAGE_WINDOWS,
aspect_type=AspectType.MATERIAL,
),
"EXTSTRWDWS": ElementMapping(
element=Element.STORE_WINDOWS,
element=ElementType.STORE_WINDOWS,
aspect_type=AspectType.MATERIAL,
),
"EXTGARSTWD": ElementMapping(
element=Element.GARAGE_AND_STORE_WINDOWS,
element=ElementType.GARAGE_AND_STORE_WINDOWS,
aspect_type=AspectType.MATERIAL,
),
"EXTLINTELS": ElementMapping(
element=Element.LINTEL,
element=ElementType.LINTEL,
aspect_type=AspectType.PRESENCE,
),
"EXTPTFRDR1": ElementMapping(
element=Element.PATIO_FRENCH_DOOR,
element=ElementType.PATIO_FRENCH_DOOR,
aspect_type=AspectType.MATERIAL,
element_instance=1,
),
@ -322,217 +322,217 @@ LBWF_ELEMENT_MAP: dict[str, ElementMapping] = {
# EXTERNAL AREAS
# ==========================================================
"EXTBALCONY": ElementMapping(
element=Element.PRIVATE_BALCONY,
element=ElementType.PRIVATE_BALCONY,
aspect_type=AspectType.PRESENCE,
),
"EXTBPOINTG": ElementMapping(
element=Element.EXTERNAL_BRICKWORK_POINTING,
element=ElementType.EXTERNAL_BRICKWORK_POINTING,
aspect_type=AspectType.PRESENCE,
),
"EXTDRPKERB": ElementMapping(
element=Element.DROP_KERB,
element=ElementType.DROP_KERB,
aspect_type=AspectType.PRESENCE,
),
"EXTEXTDECS": ElementMapping(
element=Element.EXTERNAL_DECORATION,
element=ElementType.EXTERNAL_DECORATION,
aspect_type=AspectType.PRESENCE,
),
"EXTHARDSTD": ElementMapping(
element=Element.PATHS_AND_HARDSTANDINGS,
element=ElementType.PATHS_AND_HARDSTANDINGS,
aspect_type=AspectType.MATERIAL,
),
"EXTINTDWNP": ElementMapping(
element=Element.INTERNAL_DOWNPIPES_EXTERNAL_AREA,
element=ElementType.INTERNAL_DOWNPIPES_EXTERNAL_AREA,
aspect_type=AspectType.MATERIAL,
),
"EXTOUTBOH": ElementMapping(
element=Element.OUTBUILDING_OVERHAUL,
element=ElementType.OUTBUILDING_OVERHAUL,
aspect_type=AspectType.TYPE,
),
"EXTPARKING": ElementMapping(
element=Element.PARKING_AREAS,
element=ElementType.PARKING_AREAS,
aspect_type=AspectType.PRESENCE,
),
"EXTPCHCNPY": ElementMapping(
element=Element.PORCH_CANOPY,
element=ElementType.PORCH_CANOPY,
aspect_type=AspectType.TYPE,
),
"EXTSTRINSP": ElementMapping(
element=Element.EXTERNAL_STRUCTURAL_DEFECTS,
element=ElementType.EXTERNAL_STRUCTURAL_DEFECTS,
aspect_type=AspectType.TYPE, # Need more sample data to know whether this is the correct aspect type
),
"INTACCRAMP": ElementMapping(
element=Element.ACCESS_RAMP,
element=ElementType.ACCESS_RAMP,
aspect_type=AspectType.TYPE, # # Need more sample data to know whether this is the correct aspect type
),
# ======================
# FITNESS FOR HUMAN HABITATION
# ======================
"FFHHDAMP": ElementMapping(
element=Element.FFHH_DAMP,
element=ElementType.FFHH_DAMP,
aspect_type=AspectType.RISK,
),
"FFHHHCWAT": ElementMapping(
element=Element.FFHH_HOT_AND_COLD_WATER,
element=ElementType.FFHH_HOT_AND_COLD_WATER,
aspect_type=AspectType.RISK,
),
"FFHHDRNWC": ElementMapping(
element=Element.FFHH_DRAINAGE_LAVATORIES,
element=ElementType.FFHH_DRAINAGE_LAVATORIES,
aspect_type=AspectType.RISK,
),
"FFHHNEGLC": ElementMapping(
element=Element.FFHH_NEGLECTED,
element=ElementType.FFHH_NEGLECTED,
aspect_type=AspectType.RISK,
),
"FFHHNONAT": ElementMapping(
element=Element.FFHH_NATURAL_LIGHT,
element=ElementType.FFHH_NATURAL_LIGHT,
aspect_type=AspectType.RISK,
),
"FFHHNOVEN": ElementMapping(
element=Element.FFHH_VENTILATION,
element=ElementType.FFHH_VENTILATION,
aspect_type=AspectType.RISK,
),
"FFHHPRPCK": ElementMapping(
element=Element.FFHH_FOOD_PREP_AND_WASHUP,
element=ElementType.FFHH_FOOD_PREP_AND_WASHUP,
aspect_type=AspectType.RISK,
),
"FFHHUNLAY": ElementMapping(
element=Element.FFHH_UNSAFE_LAYOUT,
element=ElementType.FFHH_UNSAFE_LAYOUT,
aspect_type=AspectType.RISK,
),
"FFHHUNSTA": ElementMapping(
element=Element.FFHH_UNSTABLE_BUILDING,
element=ElementType.FFHH_UNSTABLE_BUILDING,
aspect_type=AspectType.RISK,
),
# ==========================================================
# HHSRS
# ==========================================================
"HHSRSDAMP": ElementMapping(
element=Element.HHSRS_DAMP_AND_MOULD,
element=ElementType.HHSRS_DAMP_AND_MOULD,
aspect_type=AspectType.RISK,
),
"HHSRSCOLD": ElementMapping(
element=Element.HHSRS_EXCESS_COLD,
element=ElementType.HHSRS_EXCESS_COLD,
aspect_type=AspectType.RISK,
),
"HHSRSHEAT": ElementMapping(
element=Element.HHSRS_EXCESS_HEAT,
element=ElementType.HHSRS_EXCESS_HEAT,
aspect_type=AspectType.RISK,
),
"HHSRSASB": ElementMapping(
element=Element.HHSRS_ASBESTOS_AND_MMF,
element=ElementType.HHSRS_ASBESTOS_AND_MMF,
aspect_type=AspectType.RISK,
),
"HHSRSBIOC": ElementMapping(
element=Element.HHSRS_BIOCIDES,
element=ElementType.HHSRS_BIOCIDES,
aspect_type=AspectType.RISK,
),
"HHSRSCO": ElementMapping(
element=Element.HHSRS_CARBON_MONOXIDE,
element=ElementType.HHSRS_CARBON_MONOXIDE,
aspect_type=AspectType.RISK,
),
"HHSRSNO2": ElementMapping(
element=Element.HHSRS_CARBON_MONOXIDE,
element=ElementType.HHSRS_CARBON_MONOXIDE,
aspect_type=AspectType.RISK,
), # Duplicate of HHSRSCO; I think they relate to the same HHSRS hazard
"HHSRSSO2": ElementMapping(
element=Element.HHSRS_CARBON_MONOXIDE,
element=ElementType.HHSRS_CARBON_MONOXIDE,
aspect_type=AspectType.RISK,
), # Duplicate of HHSRSCO; I think they relate to the same HHSRS hazard
"HHSRSLEAD": ElementMapping(
element=Element.HHSRS_LEAD,
element=ElementType.HHSRS_LEAD,
aspect_type=AspectType.RISK,
),
"HHSRSRADIA": ElementMapping(
element=Element.HHSRS_RADIATION,
element=ElementType.HHSRS_RADIATION,
aspect_type=AspectType.RISK,
),
"HHSRSFUEL": ElementMapping(
element=Element.HHSRS_UNCOMBUSTED_FUEL_GAS,
element=ElementType.HHSRS_UNCOMBUSTED_FUEL_GAS,
aspect_type=AspectType.RISK,
),
"HHSRSORGAN": ElementMapping(
element=Element.HHSRS_VOLATILE_ORGANIC_COMPOUNDS,
element=ElementType.HHSRS_VOLATILE_ORGANIC_COMPOUNDS,
aspect_type=AspectType.RISK,
),
"HHSRSCROWD": ElementMapping(
element=Element.HHSRS_CROWDING_AND_SPACE,
element=ElementType.HHSRS_CROWDING_AND_SPACE,
aspect_type=AspectType.RISK,
),
"HHSRSENTRY": ElementMapping(
element=Element.HHSRS_ENTRY_BY_INTRUDERS,
element=ElementType.HHSRS_ENTRY_BY_INTRUDERS,
aspect_type=AspectType.RISK,
),
"HHSRSLIGHT": ElementMapping(
element=Element.HHSRS_LIGHTING,
element=ElementType.HHSRS_LIGHTING,
aspect_type=AspectType.RISK,
),
"HHSRSNOISE": ElementMapping(
element=Element.HHSRS_NOISE,
element=ElementType.HHSRS_NOISE,
aspect_type=AspectType.RISK,
),
"HHSRSDOMES": ElementMapping(
element=Element.HHSRS_DOMESTIC_HYGIENE_PESTS_REFUSE,
element=ElementType.HHSRS_DOMESTIC_HYGIENE_PESTS_REFUSE,
aspect_type=AspectType.RISK,
),
"HHSRSFOOD": ElementMapping(
element=Element.HHSRS_FOOD_SAFETY,
element=ElementType.HHSRS_FOOD_SAFETY,
aspect_type=AspectType.RISK,
),
"HHSRSPERS": ElementMapping(
element=Element.HHSRS_PERSONAL_HYGIENE_SANITATION,
element=ElementType.HHSRS_PERSONAL_HYGIENE_SANITATION,
aspect_type=AspectType.RISK,
),
"HHSRSWATER": ElementMapping(
element=Element.HHSRS_WATER_SUPPLY,
element=ElementType.HHSRS_WATER_SUPPLY,
aspect_type=AspectType.RISK,
),
"HHSRSFBATH": ElementMapping(
element=Element.HHSRS_FALLS_ASSOCIATED_WITH_BATHS,
element=ElementType.HHSRS_FALLS_ASSOCIATED_WITH_BATHS,
aspect_type=AspectType.RISK,
),
"HHSRSFLEVE": ElementMapping(
element=Element.HHSRS_FALLS_ON_LEVEL_SURFACES,
element=ElementType.HHSRS_FALLS_ON_LEVEL_SURFACES,
aspect_type=AspectType.RISK,
),
"HHSRSFSTAI": ElementMapping(
element=Element.HHSRS_FALLS_ON_STAIRS,
element=ElementType.HHSRS_FALLS_ON_STAIRS,
aspect_type=AspectType.RISK,
),
"HHSRSFBETW": ElementMapping(
element=Element.HHSRS_FALLS_BETWEEN_LEVELS,
element=ElementType.HHSRS_FALLS_BETWEEN_LEVELS,
aspect_type=AspectType.RISK,
),
"HHSRSELEC": ElementMapping(
element=Element.HHSRS_ELECTRICAL_HAZARDS,
element=ElementType.HHSRS_ELECTRICAL_HAZARDS,
aspect_type=AspectType.RISK,
),
"HHSRSFIRE": ElementMapping(
element=Element.HHSRS_FIRE,
element=ElementType.HHSRS_FIRE,
aspect_type=AspectType.RISK,
),
"HHSRSFLAME": ElementMapping(
element=Element.HHSRS_FLAMES_HOT_SURFACES,
element=ElementType.HHSRS_FLAMES_HOT_SURFACES,
aspect_type=AspectType.RISK,
),
"HHSRSENTRP": ElementMapping(
element=Element.HHSRS_COLLISION_AND_ENTRAPMENT,
element=ElementType.HHSRS_COLLISION_AND_ENTRAPMENT,
aspect_type=AspectType.RISK,
),
"HHSRSEXPLO": ElementMapping(
element=Element.HHSRS_EXPLOSIONS,
element=ElementType.HHSRS_EXPLOSIONS,
aspect_type=AspectType.RISK,
),
"HHSRSSTRUC": ElementMapping(
element=Element.HHSRS_STRUCTURAL_COLLAPSE,
element=ElementType.HHSRS_STRUCTURAL_COLLAPSE,
aspect_type=AspectType.RISK,
),
"HHSRSCLOW": ElementMapping(
element=Element.HHSRS_COLLISION_AND_ENTRAPMENT,
element=ElementType.HHSRS_COLLISION_AND_ENTRAPMENT,
aspect_type=AspectType.RISK,
),
"HHSRSPOSI": ElementMapping(
element=Element.HHSRS_AMENITIES,
element=ElementType.HHSRS_AMENITIES,
aspect_type=AspectType.RISK,
),
}

View file

@ -1,6 +1,5 @@
from typing import Any, List, Optional
from backend.condition.domain.asset_condition import AssetCondition
from backend.condition.domain.element import Element
from backend.condition.domain.mapping.element_mapping import ElementMapping
from backend.condition.domain.mapping.lbwf.lbwf_element_map import LBWF_ELEMENT_MAP
@ -18,12 +17,12 @@ class LbwfMapper(Mapper):
def map_asset_conditions_for_property(
self, client_data: Any, survey_year: Optional[int] = None
) -> List[AssetCondition]:
) -> List[Element]:
assert isinstance(
client_data, LbwfHouse
) # TODO: think of a better way to do this
mapped_assets: List[AssetCondition] = []
mapped_assets: List[Element] = []
uprn: int = client_data.uprn
for raw_asset in client_data.assets:
@ -40,7 +39,7 @@ class LbwfMapper(Mapper):
continue
mapped_assets.append(
AssetCondition(
Element(
uprn=uprn,
element=element_mapping.element,
aspect_type=element_mapping.aspect_type,

View file

@ -1,7 +1,7 @@
from abc import ABC, abstractmethod
from typing import Any, List, Optional
from backend.condition.domain.asset_condition import AssetCondition
from backend.condition.domain.element import Element
class Mapper(ABC):
@ -9,6 +9,6 @@ class Mapper(ABC):
@abstractmethod
def map_asset_conditions_for_property(
self, client_data: Any, survey_year: Optional[int] = None
) -> List[AssetCondition]:
) -> List[Element]:
# TODO: client_data should be properly typed
pass

View file

@ -1,5 +1,5 @@
from backend.condition.domain.aspect_type import AspectType
from backend.condition.domain.element import Element
from backend.condition.domain.element_type import ElementType
from backend.condition.domain.mapping.element_mapping import ElementMapping
@ -7,654 +7,658 @@ PEABODY_ELEMENT_MAP = {
# ==========================================================
# PROPERTY / GENERAL
# ==========================================================
(100, 1): ElementMapping(element=Element.PROPERTY, aspect_type=AspectType.TYPE),
(100, 1): ElementMapping(element=ElementType.PROPERTY, aspect_type=AspectType.TYPE),
# (100, 3): ElementMapping(element=Element.PROPERTY, aspect_type=AspectType.AGE),
# (100, 14): ElementMapping(element="property", aspect_type="construction_type"),
(50, 2): ElementMapping(
element=Element.CARBON_MONOXIDE_DETECTION, aspect_type=AspectType.TYPE
element=ElementType.CARBON_MONOXIDE_DETECTION, aspect_type=AspectType.TYPE
),
(50, 3): ElementMapping(element=Element.CCU, aspect_type=AspectType.TYPE),
(50, 3): ElementMapping(element=ElementType.CCU, aspect_type=AspectType.TYPE),
(50, 7): ElementMapping(
element=Element.DISABLED_HOIST_TRACKING, aspect_type=AspectType.PRESENCE
element=ElementType.DISABLED_HOIST_TRACKING, aspect_type=AspectType.PRESENCE
),
(50, 11): ElementMapping(
element=Element.HEAT_DETECTION, aspect_type=AspectType.TYPE
element=ElementType.HEAT_DETECTION, aspect_type=AspectType.TYPE
),
(50, 21): ElementMapping(
element=Element.SMOKE_DETECTION, aspect_type=AspectType.TYPE
element=ElementType.SMOKE_DETECTION, aspect_type=AspectType.TYPE
),
(50, 22): ElementMapping(
element=Element.STAIRLIFT, aspect_type=AspectType.PRESENCE
element=ElementType.STAIRLIFT, aspect_type=AspectType.PRESENCE
),
(50, 26): ElementMapping(
element=Element.DISABLED_FACILITIES, aspect_type=AspectType.TYPE
element=ElementType.DISABLED_FACILITIES, aspect_type=AspectType.TYPE
),
(100, 3): ElementMapping(
element=ElementType.PROPERTY, aspect_type=AspectType.AGE_BAND
),
(100, 3): ElementMapping(element=Element.PROPERTY, aspect_type=AspectType.AGE_BAND),
(100, 14): ElementMapping(
element=Element.PROPERTY, aspect_type=AspectType.CONSTRUCTION_TYPE
element=ElementType.PROPERTY, aspect_type=AspectType.CONSTRUCTION_TYPE
),
(100, 16): ElementMapping(
element=Element.PROPERTY, aspect_type=AspectType.CLASSIFICATION
element=ElementType.PROPERTY, aspect_type=AspectType.CLASSIFICATION
),
(210, 2): ElementMapping(
element=Element.PASSENGER_LIFT, aspect_type=AspectType.TYPE
element=ElementType.PASSENGER_LIFT, aspect_type=AspectType.TYPE
),
# ==========================================================
# EXTERNAL WALLS
# ==========================================================
(50, 16): ElementMapping(
element=Element.PARTY_WALL_FIRE_BREAK, aspect_type=AspectType.PRESENCE
element=ElementType.PARTY_WALL_FIRE_BREAK, aspect_type=AspectType.PRESENCE
),
(53, 1): ElementMapping(
element=Element.BOUNDARY_WALLS, aspect_type=AspectType.PRESENCE
element=ElementType.BOUNDARY_WALLS, aspect_type=AspectType.PRESENCE
),
(53, 4): ElementMapping(
element=Element.EXTERNAL_DECORATION, aspect_type=AspectType.PRESENCE
element=ElementType.EXTERNAL_DECORATION, aspect_type=AspectType.PRESENCE
),
(53, 5): ElementMapping(
element=Element.EXTERNAL_NOISE_INSULATION, aspect_type=AspectType.ADEQUACY
element=ElementType.EXTERNAL_NOISE_INSULATION, aspect_type=AspectType.ADEQUACY
),
(53, 14): ElementMapping(
element=Element.GARAGE_WALLS, aspect_type=AspectType.MATERIAL
element=ElementType.GARAGE_WALLS, aspect_type=AspectType.MATERIAL
),
(53, 23): ElementMapping(
element=Element.EXTERNAL_WALL, aspect_type=AspectType.FINISH
element=ElementType.EXTERNAL_WALL, aspect_type=AspectType.FINISH
),
(53, 30): ElementMapping(
element=Element.SECONDARY_WALL, aspect_type=AspectType.FINISH
element=ElementType.SECONDARY_WALL, aspect_type=AspectType.FINISH
), # Should this be combined with primary wall, with different instance value?
(53, 36): ElementMapping(
element=Element.EXTERNAL_WALL, aspect_type=AspectType.INSULATION
element=ElementType.EXTERNAL_WALL, aspect_type=AspectType.INSULATION
),
(53, 40): ElementMapping(
element=Element.SPANDREL_PANELS, aspect_type=AspectType.MATERIAL
element=ElementType.SPANDREL_PANELS, aspect_type=AspectType.MATERIAL
),
(53, 41): ElementMapping(
element=ElementType.CLADDING, aspect_type=AspectType.MATERIAL
),
(53, 41): ElementMapping(element=Element.CLADDING, aspect_type=AspectType.MATERIAL),
(100, 15): ElementMapping(
element=Element.EXTERNAL_DECORATION, aspect_type=AspectType.CONDITION
element=ElementType.EXTERNAL_DECORATION, aspect_type=AspectType.CONDITION
),
(120, 1): ElementMapping(
element=Element.EXTERNAL_WALL, aspect_type=AspectType.STRUCTURE
element=ElementType.EXTERNAL_WALL, aspect_type=AspectType.STRUCTURE
),
(120, 2): ElementMapping(
element=Element.EXTERNAL_WALL, aspect_type=AspectType.FINISH
element=ElementType.EXTERNAL_WALL, aspect_type=AspectType.FINISH
),
(120, 3): ElementMapping(
element=Element.PRIMARY_WALL, aspect_type=AspectType.INSULATION
element=ElementType.PRIMARY_WALL, aspect_type=AspectType.INSULATION
), # This code element code is actually "WALL" not "external wall" - correct?
# ==========================================================
# EXTERNAL ROOFS
# ==========================================================
(50, 15): ElementMapping(
element=Element.LOFT_INSULATION,
element=ElementType.LOFT_INSULATION,
aspect_type=AspectType.TYPE,
),
(53, 2): ElementMapping(
element=Element.CHIMNEY,
element=ElementType.CHIMNEY,
aspect_type=AspectType.PRESENCE,
),
(53, 6): ElementMapping(
element=Element.FASCIA_SOFFIT_BARGEBOARDS,
element=ElementType.FASCIA_SOFFIT_BARGEBOARDS,
aspect_type=AspectType.MATERIAL,
),
(53, 7): ElementMapping(
element=Element.FLAT_ROOF_COVERING,
element=ElementType.FLAT_ROOF_COVERING,
aspect_type=AspectType.MATERIAL,
),
(53, 13): ElementMapping(
element=Element.GARAGE_ROOF,
element=ElementType.GARAGE_ROOF,
aspect_type=AspectType.MATERIAL,
),
(53, 15): ElementMapping(
element=Element.GUTTERS,
element=ElementType.GUTTERS,
aspect_type=AspectType.MATERIAL,
),
(53, 21): ElementMapping(
element=Element.PITCHED_ROOF_COVERING,
element=ElementType.PITCHED_ROOF_COVERING,
aspect_type=AspectType.MATERIAL,
),
(53, 22): ElementMapping(
element=Element.PORCH_CANOPY,
element=ElementType.PORCH_CANOPY,
aspect_type=AspectType.TYPE,
),
(53, 47): ElementMapping(
element=Element.ROOF,
element=ElementType.ROOF,
aspect_type=AspectType.STRUCTURE,
),
(110, 1): ElementMapping(
element=Element.ROOF,
element=ElementType.ROOF,
aspect_type=AspectType.MATERIAL,
element_instance=1,
),
(110, 2): ElementMapping(
element=Element.ROOF,
element=ElementType.ROOF,
aspect_type=AspectType.MATERIAL,
element_instance=1,
),
(110, 3): ElementMapping(
element=Element.CHIMNEY,
element=ElementType.CHIMNEY,
aspect_type=AspectType.WORK_REQUIRED,
),
(110, 4): ElementMapping(
element=Element.FASCIA,
element=ElementType.FASCIA,
aspect_type=AspectType.MATERIAL,
),
(110, 5): ElementMapping(
element=Element.SOFFIT,
element=ElementType.SOFFIT,
aspect_type=AspectType.MATERIAL,
),
(110, 6): ElementMapping(
element=Element.RAINWATER_GOODS,
element=ElementType.RAINWATER_GOODS,
aspect_type=AspectType.MATERIAL,
),
(110, 7): ElementMapping(
element=Element.LOFT_INSULATION,
element=ElementType.LOFT_INSULATION,
aspect_type=AspectType.WORK_REQUIRED, # possibly not the right aspect type
),
(110, 8): ElementMapping(
element=Element.PORCH_CANOPY,
element=ElementType.PORCH_CANOPY,
aspect_type=AspectType.MATERIAL,
),
# ==========================================================
# EXTERNAL DOORS & WINDOWS
# ==========================================================
(50, 8): ElementMapping(
element=Element.DOOR_ENTRY_HANDSET,
element=ElementType.DOOR_ENTRY_HANDSET,
aspect_type=AspectType.PRESENCE,
),
(53, 8): ElementMapping(
element=Element.FRONT_DOOR,
element=ElementType.FRONT_DOOR,
aspect_type=AspectType.MATERIAL,
),
(53, 12): ElementMapping(
element=Element.GARAGE_DOOR,
element=ElementType.GARAGE_DOOR,
aspect_type=AspectType.MATERIAL,
),
(53, 16): ElementMapping(
element=Element.LINTEL,
element=ElementType.LINTEL,
aspect_type=AspectType.PRESENCE,
),
(53, 19): ElementMapping(
element=Element.PATIO_FRENCH_DOOR,
element=ElementType.PATIO_FRENCH_DOOR,
aspect_type=AspectType.MATERIAL,
),
(53, 25): ElementMapping(
element=Element.REAR_DOOR,
element=ElementType.REAR_DOOR,
aspect_type=AspectType.MATERIAL,
),
(53, 29): ElementMapping(
element=Element.SECONDARY_GLAZING,
element=ElementType.SECONDARY_GLAZING,
aspect_type=AspectType.PRESENCE,
),
(53, 35): ElementMapping(
element=Element.STORE_DOOR,
element=ElementType.STORE_DOOR,
aspect_type=AspectType.MATERIAL,
),
(53, 38): ElementMapping(
element=Element.EXTERNAL_WINDOWS,
element=ElementType.EXTERNAL_WINDOWS,
aspect_type=AspectType.TYPE,
element_instance=1,
),
(53, 39): ElementMapping(
element=Element.EXTERNAL_WINDOWS,
element=ElementType.EXTERNAL_WINDOWS,
aspect_type=AspectType.TYPE,
element_instance=2,
),
(53, 43): ElementMapping(
element=Element.FRONT_DOOR,
element=ElementType.FRONT_DOOR,
aspect_type=AspectType.TYPE,
),
(130, 1): ElementMapping(
element=Element.EXTERNAL_WINDOWS,
element=ElementType.EXTERNAL_WINDOWS,
aspect_type=AspectType.MATERIAL,
),
(130, 2): ElementMapping(
element=Element.COMMUNAL_WINDOWS,
element=ElementType.COMMUNAL_WINDOWS,
aspect_type=AspectType.MATERIAL,
),
(140, 1): ElementMapping(
element=Element.MAIN_DOOR,
element=ElementType.MAIN_DOOR,
aspect_type=AspectType.MATERIAL,
),
(140, 2): ElementMapping(
element=Element.STORE_DOOR,
element=ElementType.STORE_DOOR,
aspect_type=AspectType.MATERIAL,
), # Duplicate of (53, 35)
(140, 3): ElementMapping(
element=Element.GARAGE_DOOR,
element=ElementType.GARAGE_DOOR,
aspect_type=AspectType.MATERIAL,
), # Duplicate of (53, 12)
(140, 4): ElementMapping(
element=Element.BLOCK_ENTRANCE_DOOR,
element=ElementType.BLOCK_ENTRANCE_DOOR,
aspect_type=AspectType.MATERIAL,
),
# ==========================================================
# EXTERNAL AREAS
# ==========================================================
(53, 3): ElementMapping(
element=Element.DOWNPIPES,
element=ElementType.DOWNPIPES,
aspect_type=AspectType.MATERIAL,
),
(53, 9): ElementMapping(
element=Element.FRONT_FENCING,
element=ElementType.FRONT_FENCING,
aspect_type=AspectType.MATERIAL,
),
(53, 10): ElementMapping(
element=Element.FRONT_GATE,
element=ElementType.FRONT_GATE,
aspect_type=AspectType.TYPE,
),
(53, 17): ElementMapping(
element=Element.PARKING_AREAS,
element=ElementType.PARKING_AREAS,
aspect_type=AspectType.MATERIAL,
),
(53, 18): ElementMapping(
element=Element.PATHS_AND_HARDSTANDINGS,
element=ElementType.PATHS_AND_HARDSTANDINGS,
aspect_type=AspectType.MATERIAL,
),
(53, 24): ElementMapping(
element=Element.PRIVATE_BALCONY,
element=ElementType.PRIVATE_BALCONY,
aspect_type=AspectType.PRESENCE,
),
(53, 26): ElementMapping(
element=Element.REAR_FENCING,
element=ElementType.REAR_FENCING,
aspect_type=AspectType.MATERIAL,
),
(53, 27): ElementMapping(
element=Element.REAR_GATE,
element=ElementType.REAR_GATE,
aspect_type=AspectType.TYPE,
),
(53, 28): ElementMapping(
element=Element.RETAINING_WALLS,
element=ElementType.RETAINING_WALLS,
aspect_type=AspectType.PRESENCE,
),
(53, 31): ElementMapping(
element=Element.SIDE_FENCING,
element=ElementType.SIDE_FENCING,
aspect_type=AspectType.MATERIAL,
),
(53, 32): ElementMapping(
element=Element.SOIL_AND_VENT,
element=ElementType.SOIL_AND_VENT,
aspect_type=AspectType.MATERIAL,
),
(53, 34): ElementMapping(
element=Element.SOLAR_THERMALS,
element=ElementType.SOLAR_THERMALS,
aspect_type=AspectType.PRESENCE,
),
(53, 44): ElementMapping(
element=Element.GARAGE_STRUCTURE,
element=ElementType.GARAGE_STRUCTURE,
aspect_type=AspectType.TYPE,
),
(53, 45): ElementMapping(
element=Element.BALCONY_BALUSTRADE,
element=ElementType.BALCONY_BALUSTRADE,
aspect_type=AspectType.MATERIAL,
),
(150, 1): ElementMapping(
element=Element.BLOCK_ENTRANCE_DOOR,
element=ElementType.BLOCK_ENTRANCE_DOOR,
aspect_type=AspectType.MATERIAL,
),
(150, 2): ElementMapping(
element=Element.PATHS_AND_HARDSTANDINGS,
element=ElementType.PATHS_AND_HARDSTANDINGS,
aspect_type=AspectType.MATERIAL,
), # Duplicate of (53, 18) - correct?
(150, 3): ElementMapping(
element=Element.ROADS,
element=ElementType.ROADS,
aspect_type=AspectType.MATERIAL,
),
(150, 4): ElementMapping(
element=Element.BOUNDARY_WALLS,
element=ElementType.BOUNDARY_WALLS,
aspect_type=AspectType.MATERIAL,
),
(150, 5): ElementMapping(
element=Element.OUTBUILDINGS,
element=ElementType.OUTBUILDINGS,
aspect_type=AspectType.TYPE,
),
(150, 6): ElementMapping(
element=Element.GARAGE_STRUCTURE,
element=ElementType.GARAGE_STRUCTURE,
aspect_type=AspectType.TYPE,
),
# ==========================================================
# INTERNAL BATHROOMS & KITCHENS
# ==========================================================
(50, 1): ElementMapping(
element=Element.SECONDARY_TOILET,
element=ElementType.SECONDARY_TOILET,
aspect_type=AspectType.PRESENCE,
),
(50, 9): ElementMapping(
element=Element.BATHROOM_EXTRACTOR_FAN,
element=ElementType.BATHROOM_EXTRACTOR_FAN,
aspect_type=AspectType.PRESENCE,
),
(50, 9): ElementMapping(
element=Element.KITCHEN,
element=ElementType.KITCHEN,
aspect_type=AspectType.TYPE,
),
(50, 10): ElementMapping(
element=Element.KITCHEN_EXTRACTOR_FAN,
element=ElementType.KITCHEN_EXTRACTOR_FAN,
aspect_type=AspectType.PRESENCE,
),
(50, 13): ElementMapping(
element=Element.KITCHEN_SPACE_LAYOUT,
element=ElementType.KITCHEN_SPACE_LAYOUT,
aspect_type=AspectType.ADEQUACY,
),
(50, 14): ElementMapping(
element=Element.KITCHEN,
element=ElementType.KITCHEN,
aspect_type=AspectType.TYPE,
),
(50, 17): ElementMapping(
element=Element.BATHROOM,
element=ElementType.BATHROOM,
aspect_type=AspectType.LOCATION,
),
(50, 18): ElementMapping(
element=Element.BATHROOM,
element=ElementType.BATHROOM,
aspect_type=AspectType.TYPE,
), # Actually "Primary bathroom type" - ok like this?
(50, 20): ElementMapping(
element=Element.BATHROOM,
element=ElementType.BATHROOM,
aspect_type=AspectType.TYPE,
element_instance=2,
), # Actually "Secondary bathroom type" - ok like this?
(160, 1): ElementMapping(
element=Element.KITCHEN,
element=ElementType.KITCHEN,
aspect_type=AspectType.CONDITION,
),
(160, 2): ElementMapping(
element=Element.KITCHEN_SPACE_LAYOUT,
element=ElementType.KITCHEN_SPACE_LAYOUT,
aspect_type=AspectType.ADEQUACY,
),
(190, 1): ElementMapping(
element=Element.BATHROOM,
element=ElementType.BATHROOM,
aspect_type=AspectType.CONDITION,
),
(190, 2): ElementMapping(
element=Element.SECONDARY_TOILET,
element=ElementType.SECONDARY_TOILET,
aspect_type=AspectType.TYPE,
),
# ==========================================================
# COMMUNAL
# ==========================================================
(51, 1): ElementMapping(
element=Element.COMMUNAL_AERIAL,
element=ElementType.COMMUNAL_AERIAL,
aspect_type=AspectType.PRESENCE,
),
(51, 2): ElementMapping(
element=Element.COMMUNAL_AOV,
element=ElementType.COMMUNAL_AOV,
aspect_type=AspectType.PRESENCE,
),
(51, 3): ElementMapping(
element=Element.COMMUNAL_BALCONY_WALKWAY,
element=ElementType.COMMUNAL_BALCONY_WALKWAY,
aspect_type=AspectType.PRESENCE,
),
(51, 4): ElementMapping(
element=Element.COMMUNAL_BATHROOM,
element=ElementType.COMMUNAL_BATHROOM,
aspect_type=AspectType.TYPE,
),
(51, 5): ElementMapping(
element=Element.COMMUNAL_BIN_STORE_DOORS,
element=ElementType.COMMUNAL_BIN_STORE_DOORS,
aspect_type=AspectType.PRESENCE,
),
(51, 6): ElementMapping(
element=Element.COMMUNAL_BIN_STORE_ROOF,
element=ElementType.COMMUNAL_BIN_STORE_ROOF,
aspect_type=AspectType.PRESENCE,
),
(51, 7): ElementMapping(
element=Element.COMMUNAL_BIN_STORE_WALLS,
element=ElementType.COMMUNAL_BIN_STORE_WALLS,
aspect_type=AspectType.MATERIAL,
),
(51, 8): ElementMapping(
element=Element.COMMUNAL_BMS,
element=ElementType.COMMUNAL_BMS,
aspect_type=AspectType.PRESENCE,
),
(51, 9): ElementMapping(
element=Element.COMMUNAL_BOILER,
element=ElementType.COMMUNAL_BOILER,
aspect_type=AspectType.TYPE,
),
(51, 10): ElementMapping(
element=Element.COMMUNAL_BOOSTER_PUMP,
element=ElementType.COMMUNAL_BOOSTER_PUMP,
aspect_type=AspectType.PRESENCE,
),
(51, 11): ElementMapping(
element=Element.COMMUNAL_CCTV,
element=ElementType.COMMUNAL_CCTV,
aspect_type=AspectType.PRESENCE,
),
(51, 12): ElementMapping(
element=Element.COMMUNAL_CIRCULATION_SPACE,
element=ElementType.COMMUNAL_CIRCULATION_SPACE,
aspect_type=AspectType.ADEQUACY,
),
(51, 13): ElementMapping(
element=Element.COMMUNAL_COLD_WATER_STORAGE,
element=ElementType.COMMUNAL_COLD_WATER_STORAGE,
aspect_type=AspectType.PRESENCE,
),
(51, 14): ElementMapping(
element=Element.COMMUNAL_DOOR_ENTRY,
element=ElementType.COMMUNAL_DOOR_ENTRY,
aspect_type=AspectType.SYSTEM,
),
(51, 15): ElementMapping(
element=Element.COMMUNAL_DRY_RISER,
element=ElementType.COMMUNAL_DRY_RISER,
aspect_type=AspectType.PRESENCE,
),
(51, 16): ElementMapping(
element=Element.COMMUNAL_EMERGENCY_LIGHTING,
element=ElementType.COMMUNAL_EMERGENCY_LIGHTING,
aspect_type=AspectType.PRESENCE,
),
(51, 17): ElementMapping(
element=Element.COMMUNAL_EXTERNAL_DOORS,
element=ElementType.COMMUNAL_EXTERNAL_DOORS,
aspect_type=AspectType.MATERIAL,
),
(51, 19): ElementMapping(
element=Element.COMMUNAL_FIRE_ALARM,
element=ElementType.COMMUNAL_FIRE_ALARM,
aspect_type=AspectType.TYPE,
),
(51, 20): ElementMapping(
element=Element.COMMUNAL_INTERNAL_DECORATIONS,
element=ElementType.COMMUNAL_INTERNAL_DECORATIONS,
aspect_type=AspectType.PRESENCE,
),
(51, 21): ElementMapping(
element=Element.COMMUNAL_INTERNAL_DOORS,
element=ElementType.COMMUNAL_INTERNAL_DOORS,
aspect_type=AspectType.MATERIAL,
),
(51, 22): ElementMapping(
element=Element.COMMUNAL_INTERNAL_FLOOR,
element=ElementType.COMMUNAL_INTERNAL_FLOOR,
aspect_type=AspectType.FINISH,
),
(51, 23): ElementMapping(
element=Element.COMMUNAL_KITCHEN,
element=ElementType.COMMUNAL_KITCHEN,
aspect_type=AspectType.TYPE,
),
(51, 24): ElementMapping(
element=Element.COMMUNAL_LATERAL_MAINS,
element=ElementType.COMMUNAL_LATERAL_MAINS,
aspect_type=AspectType.PRESENCE,
),
(51, 25): ElementMapping(
element=Element.COMMUNAL_LIGHTING,
element=ElementType.COMMUNAL_LIGHTING,
aspect_type=AspectType.PRESENCE,
),
(51, 26): ElementMapping(
element=Element.COMMUNAL_LIGHTING_CONDUCTOR,
element=ElementType.COMMUNAL_LIGHTING_CONDUCTOR,
aspect_type=AspectType.PRESENCE,
),
(51, 27): ElementMapping(
element=Element.COMMUNAL_PASSENGER_LIFT,
element=ElementType.COMMUNAL_PASSENGER_LIFT,
aspect_type=AspectType.TYPE,
),
(51, 28): ElementMapping(
element=Element.COMMUNAL_ENTRANCE,
element=ElementType.COMMUNAL_ENTRANCE,
aspect_type=AspectType.MATERIAL,
element_instance=1,
),
(51, 30): ElementMapping(
element=Element.COMMUNAL_ENTRANCE,
element=ElementType.COMMUNAL_ENTRANCE,
aspect_type=AspectType.FINISH,
element_instance=2,
),
(51, 31): ElementMapping(
element=Element.COMMUNAL_SPRINKLER,
element=ElementType.COMMUNAL_SPRINKLER,
aspect_type=AspectType.PRESENCE,
),
(51, 29): ElementMapping(
element=Element.COMMUNAL_REFUSE_CHUTE,
element=ElementType.COMMUNAL_REFUSE_CHUTE,
aspect_type=AspectType.PRESENCE,
),
(51, 32): ElementMapping(
element=Element.COMMUNAL_STAIRS,
element=ElementType.COMMUNAL_STAIRS,
aspect_type=AspectType.FINISH,
),
(51, 33): ElementMapping(
element=Element.COMMUNAL_STORE_DOORS,
element=ElementType.COMMUNAL_STORE_DOORS,
aspect_type=AspectType.MATERIAL,
),
(51, 34): ElementMapping(
element=Element.COMMUNAL_STORE_ROOF,
element=ElementType.COMMUNAL_STORE_ROOF,
aspect_type=AspectType.MATERIAL,
),
(51, 35): ElementMapping(
element=Element.COMMUNAL_STORE_WALLS,
element=ElementType.COMMUNAL_STORE_WALLS,
aspect_type=AspectType.MATERIAL,
),
(51, 36): ElementMapping(
element=Element.COMMUNAL_WALKWAYS,
element=ElementType.COMMUNAL_WALKWAYS,
aspect_type=AspectType.FINISH,
),
(51, 37): ElementMapping(
element=Element.COMMUNAL_WARDEN_CALL_SYSTEM,
element=ElementType.COMMUNAL_WARDEN_CALL_SYSTEM,
aspect_type=AspectType.PRESENCE,
),
(51, 38): ElementMapping(
element=Element.COMMUNAL_TOILETS,
element=ElementType.COMMUNAL_TOILETS,
aspect_type=AspectType.TYPE,
),
(51, 39): ElementMapping(
element=Element.COMMUNAL_WET_RISER,
element=ElementType.COMMUNAL_WET_RISER,
aspect_type=AspectType.PRESENCE,
),
(51, 40): ElementMapping(
element=Element.COMMUNAL_PLUG_SOCKETS,
element=ElementType.COMMUNAL_PLUG_SOCKETS,
aspect_type=AspectType.PRESENCE,
),
(200, 1): ElementMapping(
element=Element.COMMUNAL_BOILER,
element=ElementType.COMMUNAL_BOILER,
aspect_type=AspectType.TYPE,
), # Duplicate of (51, 9) - correct?
(200, 2): ElementMapping(
element=Element.COMMUNAL_HEATING,
element=ElementType.COMMUNAL_HEATING,
aspect_type=AspectType.TYPE,
),
(200, 3): ElementMapping(
element=Element.COMMUNAL_ELECTRICS,
element=ElementType.COMMUNAL_ELECTRICS,
aspect_type=AspectType.TYPE,
),
(200, 4): ElementMapping(
element=Element.COMMUNAL_FIRE_ALARM,
element=ElementType.COMMUNAL_FIRE_ALARM,
aspect_type=AspectType.TYPE,
),
(200, 5): ElementMapping(
element=Element.COMMUNAL_LIFT,
element=ElementType.COMMUNAL_LIFT,
aspect_type=AspectType.TYPE,
),
(200, 6): ElementMapping(
element=Element.COMMUNAL_FLOOR_COVERING,
element=ElementType.COMMUNAL_FLOOR_COVERING,
aspect_type=AspectType.MATERIAL,
),
(200, 7): ElementMapping(
element=Element.COMMUNAL_KITCHEN,
element=ElementType.COMMUNAL_KITCHEN,
aspect_type=AspectType.TYPE,
),
(200, 8): ElementMapping(
element=Element.COMMUNAL_BATHROOM,
element=ElementType.COMMUNAL_BATHROOM,
aspect_type=AspectType.TYPE,
), # Duplicate of (51, 4) - correct?
(200, 9): ElementMapping(
element=Element.COMMUNAL_TOILETS,
element=ElementType.COMMUNAL_TOILETS,
aspect_type=AspectType.TYPE,
), # Duplicate of (51, 38) - correct?
(200, 10): ElementMapping(
element=Element.COMMUNAL_GATES,
element=ElementType.COMMUNAL_GATES,
aspect_type=AspectType.TYPE,
),
# ==========================================================
# INTERNAL HEATING
# ==========================================================
(50, 4): ElementMapping(
element=Element.HEATING_BOILER,
element=ElementType.HEATING_BOILER,
aspect_type=AspectType.PRESENCE,
), # This is actually "Central heating boiler" - ok like this?
(50, 5): ElementMapping(
element=Element.CENTRAL_HEATING,
element=ElementType.CENTRAL_HEATING,
aspect_type=AspectType.EXTENT,
),
(50, 6): ElementMapping(
element=Element.COLD_WATER_STORAGE,
element=ElementType.COLD_WATER_STORAGE,
aspect_type=AspectType.PRESENCE,
),
(50, 12): ElementMapping(
element=Element.HEATING_DISTRIBUTION,
element=ElementType.HEATING_DISTRIBUTION,
aspect_type=AspectType.TYPE,
),
(50, 19): ElementMapping(
element=Element.PROGRAMMABLE_HEATING,
element=ElementType.PROGRAMMABLE_HEATING,
aspect_type=AspectType.TYPE,
),
(50, 25): ElementMapping(
element=Element.HEATING_BOILER,
element=ElementType.HEATING_BOILER,
aspect_type=AspectType.TYPE,
),
(170, 1): ElementMapping(
element=Element.HEATING_BOILER,
element=ElementType.HEATING_BOILER,
aspect_type=AspectType.TYPE,
), # Duplicate of (50,25) - correct?
(170, 2): ElementMapping(
element=Element.HEATING_DISTRIBUTION,
element=ElementType.HEATING_DISTRIBUTION,
aspect_type=AspectType.TYPE,
), # Duplicate of (50,12) - correct?
(170, 3): ElementMapping(
element=Element.SECONDARY_HEATING,
element=ElementType.SECONDARY_HEATING,
aspect_type=AspectType.TYPE,
),
(170, 4): ElementMapping(
element=Element.COLD_WATER_STORAGE,
element=ElementType.COLD_WATER_STORAGE,
aspect_type=AspectType.TYPE,
),
(170, 5): ElementMapping(
element=Element.HOT_WATER_SYSTEM,
element=ElementType.HOT_WATER_SYSTEM,
aspect_type=AspectType.TYPE,
),
# ==========================================================
# ELECTRICS
# ==========================================================
(50, 24): ElementMapping(
element=Element.INTERNAL_WIRING,
element=ElementType.INTERNAL_WIRING,
aspect_type=AspectType.MATERIAL,
),
(180, 1): ElementMapping(
element=Element.ELECTRICAL_WIRING,
element=ElementType.ELECTRICAL_WIRING,
aspect_type=AspectType.WORK_REQUIRED,
), # Not certain about the AspectType - only example in the sample data is "Full Rewire"
(180, 2): ElementMapping(
element=Element.CONSUMER_UNIT,
element=ElementType.CONSUMER_UNIT,
aspect_type=AspectType.TYPE,
),
(180, 3): ElementMapping(
element=Element.SMOKE_DETECTION,
element=ElementType.SMOKE_DETECTION,
aspect_type=AspectType.TYPE,
), # Duplicate of (50, 21) - correct?
(180, 4): ElementMapping(
element=Element.CARBON_MONOXIDE_DETECTION,
element=ElementType.CARBON_MONOXIDE_DETECTION,
aspect_type=AspectType.TYPE,
), # Duplicate of (50, 2) - correct?
# ==========================================================
# HHSRS
# ==========================================================
(54, 1): ElementMapping(
element=Element.HHSRS_DAMP_AND_MOULD,
element=ElementType.HHSRS_DAMP_AND_MOULD,
aspect_type=AspectType.RISK,
),
(54, 4): ElementMapping(
element=Element.HHSRS_ASBESTOS_AND_MMF,
element=ElementType.HHSRS_ASBESTOS_AND_MMF,
aspect_type=AspectType.RISK,
),
(54, 15): ElementMapping(
element=Element.HHSRS_DOMESTIC_HYGIENE_PESTS_REFUSE,
element=ElementType.HHSRS_DOMESTIC_HYGIENE_PESTS_REFUSE,
aspect_type=AspectType.RISK,
),
(54, 29): ElementMapping(
element=Element.HHSRS_STRUCTURAL_COLLAPSE,
element=ElementType.HHSRS_STRUCTURAL_COLLAPSE,
aspect_type=AspectType.RISK,
),
}

View file

@ -1,6 +1,6 @@
from typing import Any, List, Optional
from backend.condition.domain.asset_condition import AssetCondition
from backend.condition.domain.element import Element
from backend.condition.domain.mapping.element_mapping import ElementMapping
from backend.condition.domain.mapping.peabody.peabody_element_map import (
PEABODY_ELEMENT_MAP,
@ -15,12 +15,12 @@ logger = setup_logger()
class PeabodyMapper(Mapper):
def map_asset_conditions_for_property(
self, client_data: Any, survey_year: Optional[int] = None
) -> List[AssetCondition]:
) -> List[Element]:
assert isinstance(
client_data, PeabodyProperty
) # TODO: think of a better way to do this
mapped_assets: List[AssetCondition] = []
mapped_assets: List[Element] = []
uprn: int = client_data.uprn
for raw_asset in client_data.assets:
@ -36,7 +36,7 @@ class PeabodyMapper(Mapper):
continue
mapped_assets.append(
AssetCondition(
Element(
uprn=uprn,
element=element_mapping.element,
aspect_type=element_mapping.aspect_type,

View file

@ -0,0 +1,14 @@
from dataclasses import dataclass
from typing import List
from datetime import date
from backend.condition.domain.element import Element
@dataclass
class PropertyConditionSurvey:
uprn: int
elements: List[Element]
date: date
source: str # TODO: make enum

View file

@ -1,7 +1,7 @@
from typing import Any, BinaryIO, List
from datetime import datetime
from backend.condition.domain.asset_condition import AssetCondition
from backend.condition.domain.element import Element
from backend.condition.domain.mapping.mapper import Mapper
from backend.condition.parsing.parser import Parser
from utils.logger import setup_logger
@ -22,7 +22,7 @@ def process_file(file_stream: BinaryIO, source_key: str) -> None:
survey_year = datetime.now().year # TODO: get this from filepath or elsewhere
assets: List[AssetCondition] = []
assets: List[Element] = []
for p in raw_properties:
assets.extend(mapper.map_asset_conditions_for_property(p, survey_year))

View file

@ -4,13 +4,13 @@ import pytest
from datetime import date
from backend.condition.domain.aspect_type import AspectType
from backend.condition.domain.element import Element
from backend.condition.domain.element_type import ElementType
from backend.condition.domain.mapping.lbwf.lbwf_mapper import LbwfMapper
from backend.condition.parsing.records.lbwf.lbwf_house import LbwfHouse
from backend.condition.parsing.records.lbwf.lbwf_asset_condition import (
LbwfAssetCondition,
)
from backend.condition.domain.asset_condition import AssetCondition
from backend.condition.domain.element import Element
def test_lbwf_mapper_maps_house():
@ -219,10 +219,10 @@ def test_lbwf_mapper_maps_house():
survey_year = 2026
expected_assets: List[AssetCondition] = [
AssetCondition(
expected_assets: List[Element] = [
Element(
uprn=1,
element=Element.ACCESSIBLE_HOUSING_REGISTER,
element=ElementType.ACCESSIBLE_HOUSING_REGISTER,
aspect_type=AspectType.CATEGORY,
element_instance=None,
value="General Needs",
@ -231,9 +231,9 @@ def test_lbwf_mapper_maps_house():
install_date=None,
comments=None,
),
AssetCondition(
Element(
uprn=1,
element=Element.FLOOR_LEVEL_FRONT_DOOR,
element=ElementType.FLOOR_LEVEL_FRONT_DOOR,
aspect_type=AspectType.LOCATION,
element_instance=None,
value="Ground Floor",
@ -242,9 +242,9 @@ def test_lbwf_mapper_maps_house():
install_date=None,
comments=None,
),
AssetCondition(
Element(
uprn=1,
element=Element.ASBESTOS,
element=ElementType.ASBESTOS,
aspect_type=AspectType.PRESENCE,
element_instance=None,
value="Yes",
@ -253,9 +253,9 @@ def test_lbwf_mapper_maps_house():
install_date=None,
comments="Source of Data = ACT",
),
AssetCondition(
Element(
uprn=1,
element=Element.HHSRS_ASBESTOS_AND_MMF,
element=ElementType.HHSRS_ASBESTOS_AND_MMF,
aspect_type=AspectType.RISK,
element_instance=None,
value="Category 4 - Typical Risk",
@ -264,9 +264,9 @@ def test_lbwf_mapper_maps_house():
install_date=None,
comments="Source of Data = ACT",
),
AssetCondition(
Element(
uprn=1,
element=Element.BATHROOM,
element=ElementType.BATHROOM,
aspect_type=AspectType.LOCATION,
element_instance=None,
value="Bathroom on Entrance Level in Property",
@ -275,9 +275,9 @@ def test_lbwf_mapper_maps_house():
install_date=None,
comments="Source of Data = Codeman",
),
AssetCondition(
Element(
uprn=1,
element=Element.CENTRAL_HEATING,
element=ElementType.CENTRAL_HEATING,
aspect_type=AspectType.EXTENT,
element_instance=None,
value="No Central Heating in Property",
@ -286,9 +286,9 @@ def test_lbwf_mapper_maps_house():
install_date=None,
comments="Source of Data = Codeman",
),
AssetCondition(
Element(
uprn=1,
element=Element.HHSRS_FIRE,
element=ElementType.HHSRS_FIRE,
aspect_type=AspectType.RISK,
element_instance=None,
value="Category 4 - Typical Risk",
@ -297,9 +297,9 @@ def test_lbwf_mapper_maps_house():
install_date=None,
comments="Source of Data = Morgan Sindall",
),
AssetCondition(
Element(
uprn=1,
element=Element.EXTERNAL_WALL,
element=ElementType.EXTERNAL_WALL,
aspect_type=AspectType.FINISH,
element_instance=1,
value="Render or Pebbledash in External Area",
@ -308,9 +308,9 @@ def test_lbwf_mapper_maps_house():
install_date=date(2009, 4, 1),
comments="Source of Data = Codeman",
),
AssetCondition(
Element(
uprn=1,
element=Element.EXTERNAL_WALL,
element=ElementType.EXTERNAL_WALL,
aspect_type=AspectType.FINISH,
element_instance=2,
value="Smooth Render Wall Finish 2 in External Area",
@ -322,7 +322,7 @@ def test_lbwf_mapper_maps_house():
]
# act
actual_assets: List[AssetCondition] = mapper.map_asset_conditions_for_property(
actual_assets: List[Element] = mapper.map_asset_conditions_for_property(
lbwf_house, survey_year
)

View file

@ -2,13 +2,13 @@ from datetime import datetime
from typing import List
from backend.condition.domain.aspect_type import AspectType
from backend.condition.domain.element import Element
from backend.condition.domain.element_type import ElementType
from backend.condition.domain.mapping.peabody.peabody_mapper import PeabodyMapper
from backend.condition.parsing.records.peabody.peabody_asset_condition import (
PeabodyAssetCondition,
)
from backend.condition.parsing.records.peabody.peabody_property import PeabodyProperty
from backend.condition.domain.asset_condition import AssetCondition
from backend.condition.domain.element import Element
def test_peabody_mapper_maps_property():
@ -56,10 +56,10 @@ def test_peabody_mapper_maps_property():
)
mapper = PeabodyMapper()
expected_assets: List[AssetCondition] = [
AssetCondition(
expected_assets: List[Element] = [
Element(
uprn=1,
element=Element.EXTERNAL_WINDOWS,
element=ElementType.EXTERNAL_WINDOWS,
aspect_type=AspectType.MATERIAL,
value="UPVC Double Glazed",
quantity=8,
@ -69,9 +69,9 @@ def test_peabody_mapper_maps_property():
source_system=None,
comments=None,
),
AssetCondition(
Element(
uprn=1,
element=Element.EXTERNAL_DECORATION,
element=ElementType.EXTERNAL_DECORATION,
aspect_type=AspectType.CONDITION,
value="Normal",
quantity=1,
@ -155,10 +155,10 @@ def test_wall_primary_and_secondary_wall_finish_map_correctly():
)
mapper = PeabodyMapper()
expected_assets: List[AssetCondition] = [
AssetCondition(
expected_assets: List[Element] = [
Element(
uprn=1,
element=Element.EXTERNAL_WALLS,
element=ElementType.EXTERNAL_WALLS,
aspect_type=AspectType.FINISH,
value="Pointed",
element_instance=1,
@ -169,9 +169,9 @@ def test_wall_primary_and_secondary_wall_finish_map_correctly():
source_system=None,
comments=None,
),
AssetCondition(
Element(
uprn=1,
element=Element.EXTERNAL_WALLS,
element=ElementType.EXTERNAL_WALLS,
aspect_type=AspectType.FINISH,
value="Pointing",
element_instance=1,
@ -182,9 +182,9 @@ def test_wall_primary_and_secondary_wall_finish_map_correctly():
source_system=None,
comments=None,
),
AssetCondition(
Element(
uprn=1,
element=Element.EXTERNAL_WALLS,
element=ElementType.EXTERNAL_WALLS,
aspect_type=AspectType.FINISH,
value="Tile Hung",
element_instance=1,