From 95cc1821c71ec853bd82364dcf10e3db56cebed0 Mon Sep 17 00:00:00 2001 From: Jun-te Kim Date: Thu, 26 Jun 2025 15:36:05 +0000 Subject: [PATCH] bathrooms --- etl/models/conditionReport.py | 48 ++++++- etl/surveyedData/surveryedData.py | 183 +++++++++++++++++++++++++- etl/transform/conditionReportTypes.py | 22 ++-- migration_db.sh | 2 +- 4 files changed, 241 insertions(+), 14 deletions(-) diff --git a/etl/models/conditionReport.py b/etl/models/conditionReport.py index cf38a25..23ceda6 100644 --- a/etl/models/conditionReport.py +++ b/etl/models/conditionReport.py @@ -149,4 +149,50 @@ class Hallway(BaseModel, table=True): room_info_id: Optional[uuid.UUID] = Field(foreign_key="roominfo.id") room_info: Optional[RoomInfo] = Relationship() - \ No newline at end of file +class LivingRoom(BaseModel, table=True): + room_info_id: Optional[uuid.UUID] = Field(foreign_key="roominfo.id") + room_info: Optional[RoomInfo] = Relationship() + +class DiningRoom(BaseModel, table=True): + is_there_a_dining_room: bool + room_info_id: Optional[uuid.UUID] = Field(foreign_key="roominfo.id") + room_info: Optional[RoomInfo] = Relationship() + +class Kitchen(BaseModel, table=True): + room_info_id: Optional[uuid.UUID] = Field(foreign_key="roominfo.id") + room_info: Optional[RoomInfo] = Relationship() + is_there_a_cooker_hood_present_in_the_room: bool + +class Utility(BaseModel, table=True): + is_there_a_utility_room: bool + room_info_id: Optional[uuid.UUID] = Field(foreign_key="roominfo.id") + room_info: Optional[RoomInfo] = Relationship() + +class WC(BaseModel, table=True): + is_there_a_seperated_wc: bool + room_info_id: Optional[uuid.UUID] = Field(foreign_key="roominfo.id") + room_info: Optional[RoomInfo] = Relationship() + +class Landing(BaseModel, table=True): + is_there_a_landing: bool + room_info_id: Optional[uuid.UUID] = Field(foreign_key="roominfo.id") + room_info: Optional[RoomInfo] = Relationship() + +class LoftSpace(BaseModel, table=True): + is_the_main_loft_space_accessible: str + is_there_more_than_one_loft_space: bool + +class RoomInRoof(BaseModel, table=True): + is_there_a_room_in_roof: bool + room_info_id: Optional[uuid.UUID] = Field(foreign_key="roominfo.id") + room_info: Optional[RoomInfo] = Relationship() + +class Bedroom(BaseModel, table=True): + double_or_single_bedroom: str + room_info_id: Optional[uuid.UUID] = Field(foreign_key="roominfo.id") + room_info: Optional[RoomInfo] = Relationship() + +class Bathroom(BaseModel, table=True): + is_this_an_ensuite_bathroom: bool + room_info_id: Optional[uuid.UUID] = Field(foreign_key="roominfo.id") + room_info: Optional[RoomInfo] = Relationship() \ No newline at end of file diff --git a/etl/surveyedData/surveryedData.py b/etl/surveyedData/surveryedData.py index 73a797c..19a46b4 100644 --- a/etl/surveyedData/surveryedData.py +++ b/etl/surveyedData/surveryedData.py @@ -30,7 +30,17 @@ from etl.models.conditionReport import ( Hallway, VentilationInfo, WindowsInfo, - RoomInfo + RoomInfo, + LivingRoom, + DiningRoom, + Kitchen, + Utility, + WC, + Landing, + LoftSpace, + RoomInRoof, + Bedroom, + Bathroom ) from etl.models.topLevel import( @@ -115,6 +125,177 @@ class surveyedDataProcessor(): def load_rooms_from_condition_report(self, db_session): self.load_hallway_from_condition_report(db_session) + self.load_living_room_from_condition_report(db_session) + self.load_dining_room_from_condition_report(db_session) + self.load_kitchen_from_condition_report(db_session) + self.load_utility_room_from_condition_report(db_session) + self.load_wash_chamber_from_condition_report(db_session) + self.load_landing_from_condition_report(db_session) + self.load_loft_space_from_condition_report(db_session) + self.load_room_in_roof_from_condition_report(db_session) + self.load_bedrooms_from_condition_report(db_session) + self.load_bathrooms_from_condition_report(db_session) + + def load_bathrooms_from_condition_report(self, db_session): + bathroom_ids = [] + for i, bathrooms in enumerate(self.condition_report.master_obj.rooms.bathrooms): + room_info = self.load_room_info_from_condition_report( + db_session, + self.condition_report.master_obj.rooms.bathrooms[i] + ) + bathroom = self.upsert_record( + db_session=db_session, + model_class=Bathroom, + data_dict=bathrooms.model_dump(), + additional_fields={ + "room_info_id": room_info.id, + } + ) + bathroom_ids.append(bathroom.id) + return bathroom_ids + + def load_bedrooms_from_condition_report(self, db_session): + bedroom_ids = [] + for i, bedrooms in enumerate(self.condition_report.master_obj.rooms.bedrooms): + room_info = self.load_room_info_from_condition_report( + db_session, + bedrooms + ) + bedroom = self.upsert_record( + db_session=db_session, + model_class=Bedroom, + data_dict=bedrooms.model_dump(), + additional_fields={ + "room_info_id": room_info.id, + } + ) + bedroom_ids.append(bedroom.id) + return bedroom_ids + + def load_room_in_roof_from_condition_report(self, db_session): + room_info = None + if self.condition_report.master_obj.rooms.room_in_roof.is_there_a_room_in_roof: + room_info = self.load_room_info_from_condition_report( + db_session, + self.condition_report.master_obj.rooms.room_in_roof, + ) + return self.get_attribute_and_load( + self.condition_report.master_obj.rooms, + "room_in_roof", + RoomInRoof, + db_session, + additional_fields={ + "room_info_id": room_info.id if room_info else None, + } + ) + + def load_landing_from_condition_report(self, db_session): + room_info = None + if self.condition_report.master_obj.rooms.landing.is_there_a_landing: + room_info = self.load_room_info_from_condition_report( + db_session, + self.condition_report.master_obj.rooms.landing, + ) + return self.get_attribute_and_load( + self.condition_report.master_obj.rooms, + "landing", + Landing, + db_session, + additional_fields={ + "room_info_id": room_info.id if room_info else None, + } + ) + + def load_loft_space_from_condition_report(self, db_session): + return self.get_attribute_and_load( + self.condition_report.master_obj.rooms, + "loft_space", + LoftSpace, + db_session, + ) + + def load_wash_chamber_from_condition_report(self, db_session): + room_info = None + if self.condition_report.master_obj.rooms.wash_chamber.is_there_a_seperated_wc: + room_info = self.load_room_info_from_condition_report( + db_session, + self.condition_report.master_obj.rooms.wash_chamber, + ) + return self.get_attribute_and_load( + self.condition_report.master_obj.rooms, + "wash_chamber", + WC, + db_session, + additional_fields={ + "room_info_id": room_info.id if room_info else None, + } + ) + + def load_utility_room_from_condition_report(self, db_session): + room_info = None + if self.condition_report.master_obj.rooms.utility.is_there_a_utility_room: + room_info = self.load_room_info_from_condition_report( + db_session, + self.condition_report.master_obj.rooms.utility + ) + return self.get_attribute_and_load( + self.condition_report.master_obj.rooms, + "utility", + Utility, + db_session, + additional_fields={ + "room_info_id": room_info.id if room_info else None, + } + ) + + def load_kitchen_from_condition_report(self, db_session): + room_info = self.load_room_info_from_condition_report( + db_session, + self.condition_report.master_obj.rooms.kitchen, + ) + + return self.get_attribute_and_load( + self.condition_report.master_obj.rooms, + "kitchen", + pydanticModel=Kitchen, + db_session=db_session, + additional_fields={ + "room_info_id": room_info.id if room_info else None, + } + ) + + def load_dining_room_from_condition_report(self, db_session): + room_info = None + if self.condition_report.master_obj.rooms.dining_room.is_there_a_dining_room: + room_info = self.load_room_info_from_condition_report( + db_session, + self.condition_report.master_obj.rooms.dining_room + ) + return self.get_attribute_and_load( + self.condition_report.master_obj.rooms, + "dining_room", + pydanticModel=DiningRoom, + db_session=db_session, + additional_fields={ + "room_info_id": room_info.id if room_info else None, + } + ) + + def load_living_room_from_condition_report(self, db_session): + room_info = self.load_room_info_from_condition_report( + db_session, + self.condition_report.master_obj.rooms.living_room, + ) + + return self.get_attribute_and_load( + self.condition_report.master_obj.rooms, + "living_room", + pydanticModel=LivingRoom, + db_session=db_session, + additional_fields={ + "room_info_id": room_info.id if room_info else None, + } + ) def load_hallway_from_condition_report(self, db_session): room_info = None diff --git a/etl/transform/conditionReportTypes.py b/etl/transform/conditionReportTypes.py index 0b33da8..e064694 100644 --- a/etl/transform/conditionReportTypes.py +++ b/etl/transform/conditionReportTypes.py @@ -153,17 +153,17 @@ class RoomInRoof(BaseModel): room_info: Optional[RoomInfo] class Rooms(BaseModel): - hallway: Hallway - living_room: LivingRoom - dining_room: DiningRoom - kitchen: Kitchen - utility: Utility - wash_chamber: WC - landing: Landing - bedrooms: List[Bedroom] - bathrooms: List[Bathroom] - loft_space: LoftSpace - room_in_roof: RoomInRoof + hallway: Hallway #loaded + living_room: LivingRoom # loaded + dining_room: DiningRoom # loaded + kitchen: Kitchen # loaded + utility: Utility # loaded + wash_chamber: WC # loaded + landing: Landing # loadded + loft_space: LoftSpace #loaded + room_in_roof: RoomInRoof # loaded + bedrooms: List[Bedroom] # loaded + bathrooms: List[Bathroom] # loaded class GeneralConditionHeatingSystem(BaseModel): is_the_heating_system_in_working_order: bool diff --git a/migration_db.sh b/migration_db.sh index d0e2adf..7a2b5dd 100644 --- a/migration_db.sh +++ b/migration_db.sh @@ -1,4 +1,4 @@ -#poetry run alembic revision --autogenerate -m "add column in ventilation info" +#poetry run alembic revision --autogenerate -m "add utility" poetry run alembic upgrade head