mirror of
https://github.com/Hestia-Homes/Model.git
synced 2026-06-08 11:17:27 +00:00
292 lines
7.8 KiB
Python
292 lines
7.8 KiB
Python
from typing import Any, Optional, Union
|
|
|
|
from pydantic import BaseModel, ConfigDict, Field
|
|
|
|
_IGNORE = ConfigDict(extra="ignore")
|
|
_IGNORE_POPULATE = ConfigDict(extra="ignore", populate_by_name=True)
|
|
|
|
|
|
class Vec3(BaseModel):
|
|
model_config = _IGNORE
|
|
x: float
|
|
y: float
|
|
z: float
|
|
|
|
|
|
class Symbol(BaseModel):
|
|
model_config = _IGNORE
|
|
id: str
|
|
name: str
|
|
description: Optional[str] = None
|
|
valid: bool
|
|
|
|
|
|
class FieldValue(BaseModel):
|
|
model_config = _IGNORE
|
|
index: int
|
|
has_value: bool
|
|
is_array: bool
|
|
value: Union[str, list[str]]
|
|
|
|
|
|
class SurveyField(BaseModel):
|
|
model_config = _IGNORE
|
|
id: str
|
|
type: int
|
|
type_as_string: str
|
|
is_required: bool
|
|
label: str
|
|
description: Optional[str] = None
|
|
list_values: list[str] = []
|
|
value: FieldValue
|
|
|
|
|
|
class ImageMapEntry(BaseModel):
|
|
model_config = _IGNORE
|
|
symbol_id: str
|
|
uid: str
|
|
owner_uid: str
|
|
type: int
|
|
coordinates: list[int]
|
|
|
|
|
|
class FormattedDimensions(BaseModel):
|
|
model_config = _IGNORE
|
|
width: Optional[str] = None
|
|
depth: Optional[str] = None
|
|
height: Optional[str] = None
|
|
|
|
|
|
class FormattedMeasures(BaseModel):
|
|
model_config = _IGNORE
|
|
width: Optional[str] = None
|
|
depth: Optional[str] = None
|
|
height: Optional[str] = None
|
|
area: Optional[str] = None
|
|
area_without_walls: Optional[str] = None
|
|
area_with_interior_walls_only: Optional[str] = None
|
|
area_with_walls: Optional[str] = None
|
|
doors_surface: Optional[str] = None
|
|
walls_surface: Optional[str] = None
|
|
walls_surface_without_openings: Optional[str] = None
|
|
windows_surface: Optional[str] = None
|
|
perimeter: Optional[str] = None
|
|
ground_perimeter: Optional[str] = None
|
|
living_area: Optional[str] = None
|
|
below_grade_living_area: Optional[str] = None
|
|
above_grade_living_area: Optional[str] = None
|
|
exterior_perimeter: Optional[str] = None
|
|
volume: Optional[str] = None
|
|
|
|
|
|
class Address(BaseModel):
|
|
model_config = _IGNORE
|
|
street: Optional[str] = None
|
|
street_number: Optional[str] = None
|
|
postal_code: Optional[str] = None
|
|
city: Optional[str] = None
|
|
country: Optional[str] = None
|
|
longitude: Optional[float] = None
|
|
latitude: Optional[float] = None
|
|
|
|
|
|
class CreatedBy(BaseModel):
|
|
model_config = _IGNORE
|
|
id: str
|
|
email: str
|
|
firstname: Optional[str] = None
|
|
lastname: Optional[str] = None
|
|
|
|
|
|
class Location(BaseModel):
|
|
model_config = _IGNORE
|
|
valid: bool
|
|
longitude: float
|
|
latitude: float
|
|
altitude: float
|
|
|
|
|
|
class ItemBase(BaseModel):
|
|
model_config = _IGNORE
|
|
uid: str
|
|
symbol: Symbol
|
|
size: Vec3
|
|
position: Vec3
|
|
rotation: Vec3
|
|
formatted: Optional[FormattedDimensions] = None
|
|
images: list[Any] = []
|
|
notes: Optional[str] = None
|
|
displayable_fields: list[SurveyField] = []
|
|
custom_displayable_fields: list[SurveyField] = []
|
|
|
|
|
|
class WallItem(ItemBase):
|
|
pass
|
|
|
|
|
|
class Furniture(ItemBase):
|
|
pass
|
|
|
|
|
|
class SymbolInstance(ItemBase):
|
|
pass
|
|
|
|
|
|
class Wall(BaseModel):
|
|
model_config = _IGNORE
|
|
uid: str
|
|
symbol: Symbol
|
|
length: float
|
|
images: list[Any] = []
|
|
notes: Optional[str] = None
|
|
displayable_fields: list[SurveyField] = []
|
|
custom_displayable_fields: list[SurveyField] = []
|
|
|
|
|
|
class Room(BaseModel):
|
|
model_config = _IGNORE
|
|
name: str
|
|
uid: str
|
|
symbol: Optional[Symbol] = None
|
|
size: Vec3
|
|
position: Vec3
|
|
rotation: Vec3
|
|
area: float
|
|
perimeter: Optional[float] = None
|
|
ground_perimeter: Optional[float] = None
|
|
area_without_walls: Optional[float] = None
|
|
area_with_interior_walls_only: Optional[float] = None
|
|
area_with_walls: Optional[float] = None
|
|
wall_count: Optional[int] = None
|
|
wall_count_with_interior_walls: Optional[int] = None
|
|
corner_count_with_interior_walls: Optional[int] = None
|
|
door_count: Optional[int] = None
|
|
window_count: Optional[int] = None
|
|
height: Optional[float] = None
|
|
volume: Optional[float] = None
|
|
width: Optional[float] = None
|
|
doors_surface: Optional[float] = None
|
|
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
|
|
image_map: list[ImageMapEntry] = []
|
|
images: list[Any] = []
|
|
notes: Optional[str] = None
|
|
formatted: Optional[FormattedMeasures] = None
|
|
displayable_fields: list[SurveyField] = []
|
|
custom_displayable_fields: list[SurveyField] = []
|
|
wall_items: list[WallItem] = []
|
|
furnitures: list[Furniture] = []
|
|
walls: list[Wall] = []
|
|
|
|
|
|
class Floor(BaseModel):
|
|
model_config = _IGNORE
|
|
uid: str
|
|
symbol: Optional[Symbol] = None
|
|
size: Vec3
|
|
position: Vec3
|
|
rotation: Vec3
|
|
name: Optional[str] = None
|
|
area: Optional[float] = None
|
|
perimeter: Optional[float] = None
|
|
ground_perimeter: Optional[float] = None
|
|
area_without_walls: Optional[float] = None
|
|
area_with_interior_walls_only: Optional[float] = None
|
|
area_with_walls: Optional[float] = None
|
|
wall_count: Optional[int] = None
|
|
wall_count_with_interior_walls: Optional[int] = None
|
|
corner_count_with_interior_walls: Optional[int] = None
|
|
door_count: Optional[int] = None
|
|
window_count: Optional[int] = None
|
|
bathrooms_count: Optional[int] = None
|
|
bedrooms_count: Optional[int] = None
|
|
doors_surface: Optional[float] = None
|
|
floor_type: Optional[Union[int, str]] = None
|
|
furniture_count: Optional[int] = None
|
|
height: Optional[float] = None
|
|
level: Optional[int] = None
|
|
room_count: Optional[int] = None
|
|
volume: Optional[float] = None
|
|
walls_surface: Optional[float] = None
|
|
walls_surface_without_openings: Optional[float] = None
|
|
windows_surface: Optional[float] = None
|
|
image: Optional[str] = None
|
|
image_map: list[ImageMapEntry] = []
|
|
images: list[Any] = []
|
|
notes: Optional[str] = None
|
|
formatted: Optional[FormattedMeasures] = None
|
|
displayable_fields: list[SurveyField] = []
|
|
custom_displayable_fields: list[SurveyField] = []
|
|
rooms: list[Room] = []
|
|
furnitures: list[Furniture] = []
|
|
symbol_instances: list[SymbolInstance] = []
|
|
|
|
|
|
class PlanBody(BaseModel):
|
|
model_config = _IGNORE
|
|
uid: str
|
|
name: Optional[str] = None
|
|
symbol: Optional[Symbol] = None
|
|
size: Vec3
|
|
position: Vec3
|
|
rotation: Vec3
|
|
area: Optional[float] = None
|
|
location: Location
|
|
floors: list[Floor] = []
|
|
images: list[Any] = []
|
|
notes: Optional[str] = None
|
|
formatted: Optional[FormattedMeasures] = None
|
|
displayable_fields: list[SurveyField] = []
|
|
custom_displayable_fields: list[SurveyField] = []
|
|
customer: list[Any] = []
|
|
custom_attributes: list[Any] = []
|
|
|
|
|
|
class PlanDetail(BaseModel):
|
|
model_config = _IGNORE
|
|
extension_version: Optional[str] = None
|
|
wrapper_version: Optional[str] = None
|
|
document_version: Optional[str] = None
|
|
last_modification_date: Optional[Union[int, str]] = None
|
|
plan: PlanBody
|
|
|
|
|
|
class PlanSummary(BaseModel):
|
|
model_config = _IGNORE_POPULATE
|
|
id: str
|
|
project_id: Optional[str] = None
|
|
name: str
|
|
address: Optional[Address] = None
|
|
creation_date: Optional[str] = None
|
|
update_date: Optional[str] = None
|
|
thumbnail_url: Optional[str] = None
|
|
public_url: Optional[str] = None
|
|
cloud_url: Optional[str] = None
|
|
url_3d: Optional[str] = Field(default=None, alias="3d_url")
|
|
workgroup_id: Optional[str] = None
|
|
team_id: Optional[str] = None
|
|
created_by: Optional[CreatedBy] = None
|
|
|
|
|
|
class Paging(BaseModel):
|
|
model_config = _IGNORE
|
|
page: int
|
|
next_page: bool
|
|
count: int
|
|
|
|
|
|
class PlansListResponse(BaseModel):
|
|
model_config = _IGNORE
|
|
paging: Paging
|
|
plans: list[PlanSummary] = []
|
|
|
|
|
|
class MagicPlanPlan(BaseModel):
|
|
model_config = _IGNORE
|
|
plan: PlanSummary
|
|
plan_detail: PlanDetail
|