from dataclasses import dataclass from datetime import datetime import enum from typing import Any, Dict, List from sqlmodel import JSON, Column, Enum, SQLModel, Field @dataclass class PriceHistoryItem: first_seen: datetime last_seen: datetime price: float class ListingSite(enum.StrEnum): RIGHTMOVE = "rightmove" # ZOOPLA = "zoopla" # ... add more class Listing(SQLModel, table=False): id: int = Field(primary_key=True) price: float = Field(nullable=False) number_of_bedrooms: int = Field(nullable=False) square_meters: float | None = Field(default=None, nullable=True) agency: str | None = Field(default=None, nullable=True) council_tax_band: str | None = Field(default=None, nullable=True) longtitude: float = Field(nullable=False) latitude: float = Field(nullable=False) price_history: List[Dict[str, Any]] = Field(default_factory=list, sa_type=JSON) listing_site: ListingSite = Field(nullable=False) last_seen: datetime = Field(default_factory=datetime.now, nullable=False) photo_thumbnail: str | None = Field(default=None, nullable=True) class FurnishType(enum.StrEnum): FURNISHED = "furnished" UNFURNISHED = "unfurnished" PART_FURNISHED = "partFurnished" class RentListing(Listing, table=True): available_from: datetime | None = Field(default=None, nullable=True) furnish_type: FurnishType | None = Field(nullable=False) class BuyListing(Listing, table=True): service_charge: float | None = Field(default=None, nullable=True) council_tax_band: str | None = Field( default=None, nullable=True ) # e.g., A, B, C, D, E, F, G lease_left: int | None = Field( default=None, nullable=True ) # in years, e.g., 90, 80, etc.