wrongmove/crawler/models/listing.py

58 lines
1.9 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)
additional_info: Dict[str, Any] = Field(
default_factory=dict, sa_type=JSON, nullable=False
)
class FurnishType(enum.StrEnum):
FURNISHED = "furnished"
UNFURNISHED = "unfurnished"
PART_FURNISHED = "partFurnished"
UNKNOWN = "unknown"
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.