diff --git a/backend/condition/domain/element.py b/backend/condition/domain/element.py index 1d109002..fed5ab3b 100644 --- a/backend/condition/domain/element.py +++ b/backend/condition/domain/element.py @@ -20,17 +20,30 @@ class Element(str, Enum): # 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" + GARAGE_ROOF = "garage_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" # ====================== # EXTERNAL – WINDOWS @@ -50,6 +63,8 @@ class Element(str, Enum): COMMUNAL_ENTRANCE_DOOR = "communal_entrance_door" MAIN_DOOR = "main_door" BLOCK_ENTRANCE_DOOR = "block_entrance_door" + LINTEL = "lintel" + PATIO_FRENCH_DOOR = "patio_french_door" # ====================== # EXTERNAL – AREAS @@ -57,7 +72,11 @@ class Element(str, Enum): PATHS_AND_HARDSTANDINGS = "paths_and_hardstandings" PARKING_AREAS = "parking_areas" BOUNDARY_WALLS = "boundary_walls" - FENCING = "fencing" + 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" @@ -66,6 +85,8 @@ class Element(str, Enum): GARAGE_STRUCTURE = "garage_structure" PAVING = "paving" ROADS = "roads" + SOIL_AND_VENT = "soil_and_vent" + SOLAR_THERMALS = "solar_thermals" # ====================== # INTERNAL – KITCHEN diff --git a/backend/condition/domain/mapping/peabody/peabody_element_map.py b/backend/condition/domain/mapping/peabody/peabody_element_map.py index 12c4bf66..81aa8b9e 100644 --- a/backend/condition/domain/mapping/peabody/peabody_element_map.py +++ b/backend/condition/domain/mapping/peabody/peabody_element_map.py @@ -8,14 +8,39 @@ PEABODY_ELEMENT_MAP = { # PROPERTY / GENERAL # ========================================================== (100, 1): ElementMapping(element=Element.PROPERTY, aspect_type=AspectType.TYPE), - (100, 15): ElementMapping( - element=Element.PROPERTY, aspect_type=AspectType.EXTERNAL_DECORATION - ), # (100, 3): ElementMapping(element=Element.PROPERTY, aspect_type=AspectType.AGE), # (100, 14): ElementMapping(element="property", aspect_type="construction_type"), # ========================================================== # EXTERNAL – WALLS # ========================================================== + (53, 1): ElementMapping( + element=Element.BOUNDARY_WALLS, aspect_type=AspectType.PRESENCE + ), + (53, 4): ElementMapping( + element=Element.EXTERNAL_DECORATION, aspect_type=AspectType.PRESENCE + ), + (53, 4): ElementMapping( + element=Element.EXTERNAL_NOISE_INSULATION, aspect_type=AspectType.ADEQUACY + ), + (53, 14): ElementMapping( + element=Element.GARAGE_WALLS, aspect_type=AspectType.MATERIAL + ), + (53, 23): ElementMapping( + element=Element.PRIMARY_WALL, aspect_type=AspectType.FINISH + ), + (53, 30): ElementMapping( + element=Element.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 + ), + (53, 40): ElementMapping( + element=Element.SPANDREL_PANELS, 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 + ), (120, 1): ElementMapping( element=Element.EXTERNAL_WALL, aspect_type=AspectType.STRUCTURE ), @@ -25,6 +50,22 @@ PEABODY_ELEMENT_MAP = { # ========================================================== # EXTERNAL – ROOFS # ========================================================== + (53, 2): ElementMapping(element=Element.CHIMNEY, aspect_type=AspectType.PRESENCE), + (53, 6): ElementMapping( + element=Element.FASCIA_SOFFIT_BARGEBOARDS, aspect_type=AspectType.MATERIAL + ), + (53, 7): ElementMapping( + element=Element.FLAT_ROOF_COVERING, aspect_type=AspectType.MATERIAL + ), + (53, 13): ElementMapping( + element=Element.GARAGE_ROOF, aspect_type=AspectType.MATERIAL + ), + (53, 15): ElementMapping(element=Element.GUTTERS, aspect_type=AspectType.MATERIAL), + (53, 18): ElementMapping( + element=Element.PITCHED_ROOF_COVERING, aspect_type=AspectType.MATERIAL + ), + (53, 22): ElementMapping(element=Element.PORCH_CANOPY, aspect_type=AspectType.TYPE), + (53, 47): ElementMapping(element=Element.ROOF, aspect_type=AspectType.STRUCTURE), (110, 1): ElementMapping( element=Element.ROOF, aspect_type=AspectType.MATERIAL, element_instance=1 ), @@ -49,6 +90,36 @@ PEABODY_ELEMENT_MAP = { # ========================================================== # EXTERNAL – DOORS & WINDOWS # ========================================================== + (53, 8): ElementMapping( + element=Element.FRONT_DOOR, aspect_type=AspectType.MATERIAL + ), + (53, 12): ElementMapping( + element=Element.GARAGE_DOOR, aspect_type=AspectType.MATERIAL + ), + (53, 16): ElementMapping(element=Element.LINTEL, aspect_type=AspectType.PRESENCE), + (53, 19): ElementMapping( + element=Element.PATIO_FRENCH_DOOR, aspect_type=AspectType.MATERIAL + ), + (53, 25): ElementMapping( + element=Element.REAR_DOOR, aspect_type=AspectType.MATERIAL + ), + (53, 29): ElementMapping( + element=Element.SECONDARY_GLAZING, aspect_type=AspectType.PRESENCE + ), + (53, 35): ElementMapping( + element=Element.STORE_DOOR, aspect_type=AspectType.MATERIAL + ), + (53, 38): ElementMapping( + element=Element.EXTERNAL_WINDOWS, + aspect_type=AspectType.TYPE, + element_instance=1, + ), + (53, 39): ElementMapping( + element=Element.EXTERNAL_WINDOWS, + aspect_type=AspectType.TYPE, + element_instance=2, + ), + (53, 43): ElementMapping(element=Element.FRONT_DOOR, aspect_type=AspectType.TYPE), (130, 1): ElementMapping( element=Element.EXTERNAL_WINDOWS, aspect_type=AspectType.MATERIAL ), @@ -60,22 +131,58 @@ PEABODY_ELEMENT_MAP = { ), (140, 2): ElementMapping( element=Element.STORE_DOOR, aspect_type=AspectType.MATERIAL - ), + ), # Duplicate of (53, 35) (140, 3): ElementMapping( element=Element.GARAGE_DOOR, aspect_type=AspectType.MATERIAL - ), + ), # Duplicate of (53, 12) (140, 4): ElementMapping( element=Element.BLOCK_ENTRANCE_DOOR, aspect_type=AspectType.MATERIAL ), # ========================================================== # EXTERNAL AREAS # ========================================================== + (53, 3): ElementMapping(element=Element.DOWNPIPES, aspect_type=AspectType.MATERIAL), + (53, 9): ElementMapping( + element=Element.FRONT_FENCING, aspect_type=AspectType.MATERIAL + ), + (53, 10): ElementMapping(element=Element.FRONT_GATE, aspect_type=AspectType.TYPE), + (53, 17): ElementMapping( + element=Element.PARKING_AREAS, aspect_type=AspectType.MATERIAL + ), + (53, 18): ElementMapping( + element=Element.PATHS_AND_HARDSTANDINGS, aspect_type=AspectType.MATERIAL + ), + (53, 24): ElementMapping( + element=Element.PRIVATE_BALCONY, aspect_type=AspectType.PRESENCE + ), + (53, 26): ElementMapping( + element=Element.REAR_FENCING, aspect_type=AspectType.MATERIAL + ), + (53, 27): ElementMapping(element=Element.REAR_GATE, aspect_type=AspectType.TYPE), + (53, 28): ElementMapping( + element=Element.RETAINING_WALLS, aspect_type=AspectType.PRESENCE + ), + (53, 31): ElementMapping( + element=Element.SIDE_FENCING, aspect_type=AspectType.MATERIAL + ), + (53, 32): ElementMapping( + element=Element.SOIL_AND_VENT, aspect_type=AspectType.MATERIAL + ), + (53, 34): ElementMapping( + element=Element.SOLAR_THERMALS, aspect_type=AspectType.PRESENCE + ), + (53, 44): ElementMapping( + element=Element.GARAGE_STRUCTURE, aspect_type=AspectType.TYPE + ), + (53, 45): ElementMapping( + element=Element.BALCONY_BALUSTRADE, aspect_type=AspectType.MATERIAL + ), (150, 1): ElementMapping( element=Element.BLOCK_ENTRANCE_DOOR, aspect_type=AspectType.MATERIAL ), (150, 2): ElementMapping( element=Element.PATHS_AND_HARDSTANDINGS, aspect_type=AspectType.MATERIAL - ), + ), # Duplicate of (53, 18) - correct? (150, 3): ElementMapping(element=Element.ROADS, aspect_type=AspectType.MATERIAL), (150, 4): ElementMapping( element=Element.BOUNDARY_WALLS, aspect_type=AspectType.MATERIAL @@ -131,7 +238,6 @@ PEABODY_ELEMENT_MAP = { # unhandled -# 'Element: External - Code: 53, Sub-Element: Window Type 01 - Code: 38', # 'Element: HEATING - Code: 170, Sub-Element: Boiler - Code: 1', # 'Element: HEATING - Code: 170, Sub-Element: Heating Distribution - Code: 2', # 'Element: ELECTRICS - Code: 180, Sub-Element: Wiring - Code: 1', @@ -159,18 +265,9 @@ PEABODY_ELEMENT_MAP = { # 'Element: COMMUNAL - Code: 200, Sub-Element: Communal Bathroom - Code: 8', # 'Element: COMMUNAL - Code: 200, Sub-Element: Communal Toilets - Code: 9', # 'Element: Internal - Code: 50, Sub-Element: Wiring - Code: 24', -# 'Element: External - Code: 53, Sub-Element: Front Door Material - Code: 8', -# 'Element: External - Code: 53, Sub-Element: Primary Wall Finish - Code: 23', # 'Element: PASSENGER LIFTS - Code: 210, Sub-Element: Lift - Code: 2', # 'Element: Internal - Code: 50, Sub-Element: Heating Distribution Type - Code: 12', -# 'Element: External - Code: 53, Sub-Element: Downpipes - Code: 3', -# 'Element: External - Code: 53, Sub-Element: Fascia/Soffits/Bargeboards - Code: 6', -# 'Element: External - Code: 53, Sub-Element: Gutters - Code: 15', -# 'Element: External - Code: 53, Sub-Element: Paths & Hardstandings - Code: 18', -# 'Element: External - Code: 53, Sub-Element: Pitched Roof Covering Material - Code: 21', # 'Element: Internal - Code: 50, Sub-Element: Secondary Bathroom Type - Code: 20', -# 'Element: External - Code: 53, Sub-Element: Chimney - Code: 2', -# 'Element: External - Code: 53, Sub-Element: External Decoration - Code: 4', # 'Element: COMMUNAL - Code: 200, Sub-Element: Communal Gates - Code: 10', # 'Element: GENERAL - Code: 100, Sub-Element: Property Age Band - Code: 3', # 'Element: GENERAL - Code: 100, Sub-Element: Construction Type - Code: 14', @@ -179,46 +276,28 @@ PEABODY_ELEMENT_MAP = { # 'Element: Communal - Code: 51, Sub-Element: Common Bin Store Doors - Code: 5', # 'Element: Communal - Code: 51, Sub-Element: Common Bin Store Walls - Code: 7', # 'Element: Communal - Code: 51, Sub-Element: Common Primary Entrance Material - Code: 28', -# 'Element: External - Code: 53, Sub-Element: Parking Areas - Code: 17', -# 'Element: External - Code: 53, Sub-Element: Front Fencing - Code: 9', -# 'Element: External - Code: 53, Sub-Element: Retaining Walls - Code: 28', # 'Element: Communal - Code: 51, Sub-Element: Common Internal Decorations - Code: 20', # 'Element: Communal - Code: 51, Sub-Element: Common Internal Floor Finish - Code: 22', # 'Element: Communal - Code: 51, Sub-Element: Common Walkways Finish - Code: 36', -# 'Element: External - Code: 53, Sub-Element: Boundary Walls - Code: 1', -# 'Element: External - Code: 53, Sub-Element: Flat Roof Covering Material - Code: 7', -# 'Element: External - Code: 53, Sub-Element: Porch/Canopy - Code: 22', -# 'Element: External - Code: 53, Sub-Element: Private Balcony - Code: 24', -# 'Element: External - Code: 53, Sub-Element: Rear Gate - Code: 27', # 'Element: Communal - Code: 51, Sub-Element: Common External Doors Other - Code: 17', # 'Element: Communal - Code: 51, Sub-Element: Common Stair Finish - Code: 32', -# 'Element: External - Code: 53, Sub-Element: Front Gate - Code: 10', -# 'Element: External - Code: 53, Sub-Element: Rear Fencing - Code: 26', -# 'Element: External - Code: 53, Sub-Element: Side Fencing - Code: 31', # 'Element: Communal - Code: 51, Sub-Element: Common Aerial - Code: 1', # 'Element: Communal - Code: 51, Sub-Element: Common AOV - Code: 2', # 'Element: Communal - Code: 51, Sub-Element: Common Door Entry System - Code: 14', # 'Element: Communal - Code: 51, Sub-Element: Common Fire Alarm - Code: 19', # 'Element: Communal - Code: 51, Sub-Element: Common Internal Doors - Code: 21', -# 'Element: External - Code: 53, Sub-Element: Store Door Material - Code: 35', -# 'Element: External - Code: 53, Sub-Element: Secondary Wall Finish - Code: 30', # 'Element: Communal - Code: 51, Sub-Element: Common Emergency Lighting - Code: 16', # 'Element: Communal - Code: 51, Sub-Element: Common Lateral Mains - Code: 24', # 'Element: Communal - Code: 51, Sub-Element: Common Lighting - Code: 25', # 'Element: Communal - Code: 51, Sub-Element: Common Store Roof - Code: 34', # 'Element: Communal - Code: 51, Sub-Element: Common Store Walls - Code: 35', -# 'Element: External - Code: 53, Sub-Element: Cladding Material - Code: 41', -# 'Element: External - Code: 53, Sub-Element: Spandrel Panels - Code: 40', # 'Element: Communal - Code: 51, Sub-Element: Common CCTV - Code: 11', # 'Element: Communal - Code: 51, Sub-Element: Common Kitchen - Code: 23', # 'Element: Communal - Code: 51, Sub-Element: Common Secondary Entrance Material - Code: 30', # 'Element: Communal - Code: 51, Sub-Element: Common Warden Call System - Code: 37', -# 'Element: External - Code: 53, Sub-Element: Lintels - Code: 16', # 'Element: Communal - Code: 51, Sub-Element: Common Boiler - Code: 9', -# 'Element: External - Code: 53, Sub-Element: Soil & Vent Material - Code: 32', # 'Element: Communal - Code: 51, Sub-Element: Common Passenger Lift - Code: 27', # 'Element: Communal - Code: 51, Sub-Element: Common Store Doors - Code: 33', -# 'Element: External - Code: 53, Sub-Element: Window Type 02 - Code: 39', # 'Element: Communal - Code: 51, Sub-Element: Common BMS - Code: 8', # 'Element: Communal - Code: 51, Sub-Element: Common Booster Pump - Code: 10', # 'Element: Communal - Code: 51, Sub-Element: Common Dry Riser - Code: 15', @@ -226,25 +305,14 @@ PEABODY_ELEMENT_MAP = { # 'Element: Communal - Code: 51, Sub-Element: Common Bin Store Roof - Code: 6', # 'Element: Communal - Code: 51, Sub-Element: Common Bathroom - Code: 4', # 'Element: Communal - Code: 51, Sub-Element: Common WC - Code: 38', -# 'Element: External - Code: 53, Sub-Element: Wall Insulation - Code: 36', -# 'Element: External - Code: 53, Sub-Element: Garage Door - Code: 12', # 'Element: Communal - Code: 51, Sub-Element: Common Cold Water Storage Tank - Code: 13', # 'Element: Communal - Code: 51, Sub-Element: Common Sprinker - Code: 31', -# 'Element: External - Code: 53, Sub-Element: Garage Walls - Code: 14', # 'Element: Communal - Code: 51, Sub-Element: Communal Plug Sockets - Code: 40', # 'Element: Communal - Code: 51, Sub-Element: Common Wet Riser - Code: 39', # 'Element: Communal - Code: 51, Sub-Element: Common Refuse Chute - Code: 29', -# 'Element: External - Code: 53, Sub-Element: Secondary Glazing - Code: 29', -# 'Element: External - Code: 53, Sub-Element: Solar Thermals - Code: 34', -# 'Element: External - Code: 53, Sub-Element: Garage Roof - Code: 13', -# 'Element: External - Code: 53, Sub-Element: Patio/French Door - Code: 19', -# 'Element: External - Code: 53, Sub-Element: Rear Door Material - Code: 25', # 'Element: Internal - Code: 50, Sub-Element: Party Wall Fire Break - Code: 16', # 'Element: Internal - Code: 50, Sub-Element: Boiler Type - Code: 25', -# 'Element: External - Code: 53, Sub-Element: Roof Structure - Code: 47', -# 'Element: External - Code: 53, Sub-Element: Front Door Type - Code: 43', # 'Element: Communal - Code: 51, Sub-Element: Common Cirulation Space - Code: 12', -# 'Element: External - Code: 53, Sub-Element: External Noise Insulation - Code: 5', # 'Element: Internal - Code: 50, Sub-Element: Door Entry Handset - Code: 8', # 'Element: Internal - Code: 50, Sub-Element: Cold Water Storage Tank - Code: 6', # 'Element: Internal - Code: 50, Sub-Element: Programmable Heating - Code: 19', @@ -254,6 +322,4 @@ PEABODY_ELEMENT_MAP = { # 'Element: Internal - Code: 50, Sub-Element: Stairlift - Code: 22', # 'Element: Internal - Code: 50, Sub-Element: Primary Bathroom Location - Code: 17', # 'Element: Internal - Code: 50, Sub-Element: Disabled Hoist Tracking - Code: 7', -# 'Element: External - Code: 53, Sub-Element: Garage Type - Code: 44', -# 'Element: External - Code: 53, Sub-Element: Private Balcony Balustrade Material - Code: 45', # 'Element: Internal - Code: 50, Sub-Element: Disabled Facilities - Code: 26' diff --git a/backend/condition/tests/mapping/test_peabody_mapper.py b/backend/condition/tests/mapping/test_peabody_mapper.py index 7fad77f7..a975a308 100644 --- a/backend/condition/tests/mapping/test_peabody_mapper.py +++ b/backend/condition/tests/mapping/test_peabody_mapper.py @@ -71,8 +71,8 @@ def test_peabody_mapper_maps_property(): ), AssetCondition( uprn=1, - element=Element.PROPERTY, - aspect_type=AspectType.EXTERNAL_DECORATION, + element=Element.EXTERNAL_DECORATION, + aspect_type=AspectType.CONDITION, value="Normal", quantity=1, install_date=None,