diff --git a/etl/pdfReader/sitenotes.py b/etl/pdfReader/sitenotes.py index 902e09d..a2b58c0 100644 --- a/etl/pdfReader/sitenotes.py +++ b/etl/pdfReader/sitenotes.py @@ -10,7 +10,8 @@ from etl.transform.preSiteNoteTypes import ( ) from etl.transform.conditionReportTypes import ( ConditionReport, AssessorDetails, InspectionAndProject, TheProperty, - MainElevation, Elevation, ElevationInfo + MainElevation, Elevation, ElevationInfo, PropertyAccess, ExternalElevation, ExternalElevationFront, + ExternalElevationGableOne, ExternalElevationGableTwo, ExternalElevationRear, ConservatoryOrOutbuilding ) from datetime import datetime from pprint import pprint @@ -24,6 +25,11 @@ class SiteNotesExtractor(): except IndexError: return None # Return None if the value does not occur twice + def get_x_value(self, lst, value, x=1): + index = self.get_x_occurance(lst, value, x) + return lst[index+1] + + def get_next_value(self, lst, value, avoid=[]): get_value = lambda key: None if lst[lst.index(value) + 1] in avoid else lst[lst.index(key) + 1] return get_value(value) @@ -158,11 +164,96 @@ class ConditionReport(SiteNotesExtractor): ) def get_section_2(self): - self.get_property_access() + _ = self.get_property_access() + _,_,_,_ = self.get_external_elevation() + self.get_conservatory_or_outbuilding() + def get_property_access(self): - pprint(self.raw_data) - pass + data = self.get_data_between("2.1 Property Access", "2.2 External Elevations") + property_access = PropertyAccess( + are_there_any_road_restriction_in_the_locality=True if self.get_next_value(data, "locality?").lower() == "yes" else False, + is_on_street_parking_available=True if self.get_next_value(data, "Is on-street parking available?").lower() == "yes" else False, + are_there_any_overhead_wires_or_cables=True if self.get_next_value(data, "Are there any overhead wires or cables?") == "yes" else False, + is_the_access_gated=True if self.get_next_value(data, "Is the access gated?").lower() == "yes" else False, + is_there_restricted_space_for_contractors_to_access_the_wall_area=True if self.get_next_value(data, "area?").lower() == "yes" else False, + is_there_restricted_space_for_contractors_to_access_the_roof_area=True if self.get_x_value(data, "area?", 1).lower() == "yes" else False, + is_there_more_than_1_point_5_meters_in_width_to_fence_or_neighbouring_boundary_along_the_full_gable_elevation=True if self.get_next_value(data, "boundary along the full gable elevation?").lower() == "yes" else False, + is_access_to_the_rear_provided_by_use_of_a_ginnel=True if self.get_next_value(data, "Is access to the rear provided by use of a ginnel?").lower() == "yes" else False, + is_access_to_the_rear_provided_by_use_of_a_secured_alleyway=True if self.get_next_value(data, "Is access to the rear provided by use of a secured alleyway?").lower() == "yes" else False, + ) + return property_access + + def get_external_elevation(self): + # Front + data = self.get_data_between("2.2.1. External Elevation - Front", '2.2.2. External Elevation - Gable 1') + front = ExternalElevation( + structural_defects_of_elevation=self.get_next_value(data, "Structural defects of elevation"), + does_any_structural_defect_need_resolving_before_retrofit=True if self.get_next_value(data,"Does any structural defect need resolving before retrofit?").lower() == "yes" else False, + are_there_any_signs_of_water_penetration_caused_by_failed_rainwater_goods_or_pipework=True if self.get_next_value(data, "rainwater goods or pipework?").lower() == "yes" else False, + are_there_any_visible_signs_of_movement=True if self.get_next_value(data, "Are there any visible signs of movement?").lower() == "yes" else False, + are_there_any_visible_signs_of_cracking_to_the_existing_external_finish=True if self.get_next_value(data, "external finish?").lower() == "yes" else False, + ) + # Gable 1 + data = self.get_data_between("2.2.2. External Elevation - Gable 1", "2.2.3. External Elevation - Rear") + state = True if self.get_next_value(data, "cracking)").lower() == "yes" else False + if state: + gable_one = ExternalElevationGableOne( + do_all_answers_for_the_front_elevation_apply_to_this_wall=state + ) + else: + gable_one_elevation = ExternalElevation( + structural_defects_of_elevation=self.get_next_value(data, "Structural defects of elevation"), + does_any_structural_defect_need_resolving_before_retrofit=True if self.get_next_value(data,"Does any structural defect need resolving before retrofit?").lower() == "yes" else False, + are_there_any_signs_of_water_penetration_caused_by_failed_rainwater_goods_or_pipework=True if self.get_next_value(data, "rainwater goods or pipework?").lower() == "yes" else False, + are_there_any_visible_signs_of_movement=True if self.get_next_value(data, "Are there any visible signs of movement?").lower() == "yes" else False, + are_there_any_visible_signs_of_cracking_to_the_existing_external_finish=True if self.get_next_value(data, "external finish?").lower() == "yes" else False, + ) + gable_one = ExternalElevationGableOne( + do_all_answers_for_the_front_elevation_apply_to_this_wall=state, + external_elevation=gable_one_elevation + ) + # Rear + data = self.get_data_between("2.2.3. External Elevation - Rear", "2.2.4. External Elevation - Gable 2") + state = True if self.get_next_value(data, "cracking)").lower() == "yes" else False + if state: + rear = ExternalElevationRear(do_all_answers_for_the_front_elevation_apply_to_this_wall=state) + else: + elevation = ExternalElevation( + structural_defects_of_elevation=self.get_next_value(data, "Structural defects of elevation"), + does_any_structural_defect_need_resolving_before_retrofit=True if self.get_next_value(data,"Does any structural defect need resolving before retrofit?").lower() == "yes" else False, + are_there_any_signs_of_water_penetration_caused_by_failed_rainwater_goods_or_pipework=True if self.get_next_value(data, "rainwater goods or pipework?").lower() == "yes" else False, + are_there_any_visible_signs_of_movement=True if self.get_next_value(data, "Are there any visible signs of movement?").lower() == "yes" else False, + are_there_any_visible_signs_of_cracking_to_the_existing_external_finish=True if self.get_next_value(data, "external finish?").lower() == "yes" else False, + ) + rear = ExternalElevationRear( + do_all_answers_for_the_front_elevation_apply_to_this_wall=state, + external_elevation=elevation + ) + + # Gable 2 + data = self.get_data_between("2.2.4. External Elevation - Gable 2", "2.3. Conservatory or Outbuilding") + pprint(self.raw_data) + state = True if self.get_next_value(data, "Is there a 4th external elevation?").lower() == "yes" else False + if state is False: + gable_two = ExternalElevationGableTwo(is_there_a_fourth_external_elevation=state) + else: + gable_two_elevation = ExternalElevation( + structural_defects_of_elevation=self.get_next_value(data, "Structural defects of elevation"), + does_any_structural_defect_need_resolving_before_retrofit=True if self.get_next_value(data,"Does any structural defect need resolving before retrofit?").lower() == "yes" else False, + are_there_any_signs_of_water_penetration_caused_by_failed_rainwater_goods_or_pipework=True if self.get_next_value(data, "rainwater goods or pipework?").lower() == "yes" else False, + are_there_any_visible_signs_of_movement=True if self.get_next_value(data, "Are there any visible signs of movement?").lower() == "yes" else False, + are_there_any_visible_signs_of_cracking_to_the_existing_external_finish=True if self.get_next_value(data, "external finish?").lower() == "yes" else False, + ) + gable_two = ExternalElevationGableTwo( + is_there_a_fourth_external_elevation=state, + external_elevation=gable_two_elevation + ) + + return front, gable_one, rear, gable_two + + def get_conservatory_or_outbuilding(self): + data = self.get_data_between("2.3. Conservatory or Outbuilding", "3. Rooms") class QuidosSiteNotesExtractor(SiteNotesExtractor): diff --git a/etl/transform/conditionReportTypes.py b/etl/transform/conditionReportTypes.py index ea70061..f530c67 100644 --- a/etl/transform/conditionReportTypes.py +++ b/etl/transform/conditionReportTypes.py @@ -66,15 +66,15 @@ class ExternalElevationFront(BaseModel): class ExternalElevationGableOne(BaseModel): do_all_answers_for_the_front_elevation_apply_to_this_wall: bool - external_elevation: Optional[ExternalElevation] + external_elevation: Optional[ExternalElevation] = None class ExternalElevationRear(BaseModel): do_all_answers_for_the_front_elevation_apply_to_this_wall: bool - external_elevation: Optional[ExternalElevation] + external_elevation: Optional[ExternalElevation] = None class ExternalElevationGableTwo(BaseModel): is_there_a_fourth_external_elevation: bool - external_elevation: Optional[ExternalElevation] + external_elevation: Optional[ExternalElevation] = None class ConservatoryOrOutbuilding(BaseModel): is_there_a_conservatory: bool