map magicplan base models to data classes 🟩

This commit is contained in:
Daniel Roth 2026-05-05 15:46:13 +00:00
parent d3ca6bc7ff
commit 55d7b91171
6 changed files with 92 additions and 1 deletions

View file

@ -170,6 +170,7 @@ class Room(BaseModel):
walls_surface: Optional[float] = None
walls_surface_without_openings: Optional[float] = None
windows_surface: Optional[float] = None
dimensions: Optional[str] = None
room_type: Optional[str] = None
furniture_count: Optional[int] = None
image: Optional[str] = None

View file

View file

@ -0,0 +1,52 @@
from datatypes.magicplan.api.response import MagicPlan
from datatypes.magicplan.domain.models import Plan, Floor, Room, Window, Door
def map_plan(mp: MagicPlan) -> Plan:
return Plan(
uid=mp.plan.id,
name=mp.plan.name,
floors=[_map_floor(f) for f in mp.plan_detail.plan.floors],
)
def _map_floor(f) -> Floor:
return Floor(
level=f.level,
name=f.name,
rooms=[_map_room(r) for r in f.rooms],
)
def _map_room(r) -> Room:
width, length = _parse_dimensions(r.dimensions)
return Room(
name=r.name,
width=width,
length=length,
area=r.area,
windows=[_map_window(wi) for wi in r.wall_items if wi.symbol.id.startswith("window")],
doors=[_map_door(wi) for wi in r.wall_items if wi.symbol.id.startswith("door")],
)
def _parse_dimensions(dimensions: str | None) -> tuple[float, float]:
if not dimensions:
return 0.0, 0.0
parts = dimensions.split(" x ")
width = float(parts[0].split(" m")[0])
length = float(parts[1].split(" m")[0])
return width, length
def _map_window(wi) -> Window:
return Window(
width=wi.size.x,
height=wi.size.z,
area=wi.size.x * wi.size.z,
opening_type=wi.symbol.id.removeprefix("window"),
)
def _map_door(wi) -> Door:
return Door(width=wi.size.x)

View file

@ -0,0 +1,38 @@
from dataclasses import dataclass, field
@dataclass
class Window:
width: float
height: float
area: float
opening_type: str
@dataclass
class Door:
width: float
@dataclass
class Room:
name: str
width: float
length: float
area: float
windows: list[Window] = field(default_factory=list)
doors: list[Door] = field(default_factory=list)
@dataclass
class Floor:
level: int | None
name: str | None
rooms: list[Room] = field(default_factory=list)
@dataclass
class Plan:
uid: str
name: str | None
floors: list[Floor] = field(default_factory=list)

View file

@ -3,6 +3,6 @@ pythonpath = .
log_cli = true
log_cli_level = INFO
addopts = --cov-report term-missing --cov=etl/epc --cov=recommendations --cov=backend --cov=etl/epc_clean --cov=etl/spatial
testpaths = recommendations/tests backend/tests etl/epc/tests etl/epc_clean/tests etl/spatial/tests backend/condition/tests backend/address2UPRN/tests backend/onboarders/tests backend/categorisation/tests backend/export/tests etl/hubspot/tests backend/hubspot_trigger_orchestrator/tests datatypes/epc/schema/tests datatypes/epc/surveys/tests datatypes/epc/domain/tests backend/ecmk_fetcher/tests/ backend/pashub_fetcher/tests backend/documents_parser/tests backend/magic_plan/tests datatypes/magicplan/api/tests
testpaths = recommendations/tests backend/tests etl/epc/tests etl/epc_clean/tests etl/spatial/tests backend/condition/tests backend/address2UPRN/tests backend/onboarders/tests backend/categorisation/tests backend/export/tests etl/hubspot/tests backend/hubspot_trigger_orchestrator/tests datatypes/epc/schema/tests datatypes/epc/surveys/tests datatypes/epc/domain/tests backend/ecmk_fetcher/tests/ backend/pashub_fetcher/tests backend/documents_parser/tests backend/magic_plan/tests datatypes/magicplan/api/tests datatypes/magicplan/domain/tests
markers =
integration: mark a test as an integration test