54 lines
1.7 KiB
Python
54 lines
1.7 KiB
Python
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.
|