mirror of
https://github.com/Hestia-Homes/Model.git
synced 2026-06-08 11:17:27 +00:00
Add the Ara modelling aggregate root (ADR-0002): domain/property/ with PropertyIdentity, SiteNotes, Property, Properties. Property.source_path implements the two disjoint source paths + Recency Tie-Break (ADR-0001; survey wins on an equal date); effective_epc resolves to the surveyed data (Site Notes path) or the public EPC (epc_with_overlay path — Landlord Overrides overlay is a later slice). Pure dataclasses, no infrastructure imports. PropertyRepository port + PropertyPostgresRepository hydrate the aggregate whole from a defensive view of the FE-owned 'property' table (identity columns) plus the EPC slice via EpcRepository.get_for_property. Reads only from repos (ADR-0003). 8 domain + 1 hydration test; pyright strict clean. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
23 lines
786 B
Python
23 lines
786 B
Python
from __future__ import annotations
|
|
|
|
from typing import ClassVar, Optional
|
|
|
|
from sqlmodel import Field, SQLModel
|
|
|
|
|
|
class PropertyRow(SQLModel, table=True):
|
|
"""Defensive view of the FE-owned ``property`` table.
|
|
|
|
The schema and migrations for ``property`` are owned by the front-end
|
|
Next.js repo; this declares only the identity columns the modelling backend
|
|
reads/writes, so FE-owned migrations to other columns don't ripple into us.
|
|
"""
|
|
|
|
__tablename__: ClassVar[str] = "property" # pyright: ignore[reportIncompatibleVariableOverride]
|
|
|
|
id: Optional[int] = Field(default=None, primary_key=True)
|
|
portfolio_id: int
|
|
postcode: str
|
|
address: str
|
|
uprn: Optional[int] = Field(default=None)
|
|
landlord_property_id: Optional[str] = Field(default=None)
|