diff --git a/src/apps/rooms/models/domain/dabang.py b/src/apps/rooms/models/domain/dabang.py index 2dbad97..b1542ee 100644 --- a/src/apps/rooms/models/domain/dabang.py +++ b/src/apps/rooms/models/domain/dabang.py @@ -418,6 +418,14 @@ def to_room(self) -> RoomItem: raise NoneTypeError("방 가격 정보가 없습니다") if self.room.photos is None: raise NoneTypeError("방 사진이 없습니다") + if self.room.room_size is None: + raise NoneTypeError("방 면적이 없습니다") + if self.room.room_floor_str is None: + raise NoneTypeError("층이 없습니다") + if self.room.building_floor_str is None: + raise NoneTypeError("건물층수가 없습니다") + if self.room.maintenance_cost_str is None: + raise NoneTypeError("관리비가 없습니다") deposit, monthly_rent, _ = self.room.price_info.pop() image_key = self.room.photos.pop() @@ -431,4 +439,10 @@ def to_room(self) -> RoomItem: description=self.room.memo, image=image_url.format(image_key=image_key), building_type=BuildingType(self.room.room_type), + room_size=self.room.room_size, + floor=f"{self.room.room_floor_str}/{self.room.building_floor_str}", + has_elevator=(self.room.elevator_str == "있음"), + administrative_expenses=int( + self.room.maintenance_cost_str.replace("만 원", "") + ), ) diff --git a/src/apps/rooms/models/domain/landlords.py b/src/apps/rooms/models/domain/landlords.py index cba158c..9e717b9 100644 --- a/src/apps/rooms/models/domain/landlords.py +++ b/src/apps/rooms/models/domain/landlords.py @@ -31,6 +31,10 @@ class RoomItem(BaseModel): description: Optional[str] = Field(max_length=Description.max_length) image: Optional[str] = Field(max_length=Image.max_length) building_type: BuildingType = Field(...) + room_size: float = Field(..., description="방 크기(㎡)") + floor: str = Field(..., description="층/건물층수") + has_elevator: Optional[bool] = Field(default=None, description="엘리베이터 유무") + administrative_expenses: int = Field(..., description="관리비") class Config: orm_mode = True diff --git a/src/apps/rooms/models/domain/zigbang.py b/src/apps/rooms/models/domain/zigbang.py index 2522f69..fc68a77 100644 --- a/src/apps/rooms/models/domain/zigbang.py +++ b/src/apps/rooms/models/domain/zigbang.py @@ -2,6 +2,7 @@ from enum import Enum from typing import Any, List, Optional +from pydantic import Field from pydantic.dataclasses import dataclass from ..entity import BuildingType, SellingType @@ -24,8 +25,8 @@ class Area: @dataclass class Item: - size_m2: Optional[int] = None - building_floor: Optional[int] = None + size_m2: int = Field(...) + building_floor: int = Field(...) section_type: Optional[str] = None item_id: Optional[int] = None images_thumbnail: Optional[str] = None @@ -37,7 +38,7 @@ class Item: 전용면적: Optional[Area] = None 계약면적: Optional[Area] = None room_type_title: Optional[RoomTypeTitle] = None - floor: Optional[str] = None + floor: int = Field(...) floor_string: Optional[str] = None title: Optional[str] = None address: Optional[str] = None @@ -77,7 +78,7 @@ class ZigbangSellingType(str, Enum): ZigbangBuildingType.Villa: BuildingType.Villa, ZigbangSellingType.MonthlyRent: SellingType.MonthlyRent, ZigbangSellingType.Jeonse: SellingType.Jeonse, - ZigbangSellingType.Selling: SellingType.Selling + ZigbangSellingType.Selling: SellingType.Selling, } @@ -100,4 +101,10 @@ def to_room(self) -> RoomItem: description=item.description, image=image_url.format(uid=item.item_id, width=800, height=600), building_type=BuildingType(mapper[zigbang_building_type]), + room_size=item.size_m2, + floor=f"{item.floor}/{item.building_floor}", + has_elevator=None, + administrative_expenses=int(item.manage_cost) + if item.manage_cost + else 0, ) diff --git a/src/apps/rooms/models/entity/__init__.py b/src/apps/rooms/models/entity/__init__.py index dbbdbc0..397a021 100644 --- a/src/apps/rooms/models/entity/__init__.py +++ b/src/apps/rooms/models/entity/__init__.py @@ -132,6 +132,25 @@ class Room(Base): comment="방의 Image URL", ) + room_size = Column( + "room_size", mysql.DOUBLE(5, 2, unsigned=True), comment="방 크기 (㎡)" + ) + + floor = Column("floor", mysql.VARCHAR(5), comment="층/건물층수") + + has_elevator = Column( + "has_elevator", + mysql.TINYINT(1), + nullable=True, + comment="엘리베이터 유무", + ) + + administrative_expenses = Column( + "administrative_expenses", + mysql.TINYINT(2, unsigned=True), + comment="관리비", + ) + created = Column( "Created", mysql.DATETIME(), diff --git a/tests/function/apps/rooms/test_services.py b/tests/function/apps/rooms/test_services.py index 47076b6..0293fcb 100644 --- a/tests/function/apps/rooms/test_services.py +++ b/tests/function/apps/rooms/test_services.py @@ -1,14 +1,29 @@ from src.apps.rooms.models.domain.dabang import Dabang -from src.apps.rooms.services import get_dabang_room_detail +from src.apps.rooms.models.domain.zigbang import Zigbang +from src.apps.rooms.services import ( + get_dabang_room_detail, + get_zigbang_room_detail, +) from src.core.exceptions import CrawlingException def test_get_dabang() -> None: try: dabang: Dabang = get_dabang_room_detail( - room_id="5f0681178839af708334481e" + room_id="5f2ce8637601ce75301269cf" ) + room_item = dabang.to_room() except CrawlingException as err: assert err else: - print(dabang) + print(room_item) + + +def test_get_zigbang() -> None: + try: + zigbang: Zigbang = get_zigbang_room_detail(room_id=23126067) + room_item = zigbang.to_room() + except CrawlingException as err: + assert err + else: + print(room_item)