Coverage for src / idx_api / models / tour_request.py: 96%
23 statements
« prev ^ index » next coverage.py v7.13.1, created at 2025-12-28 11:09 -0700
« prev ^ index » next coverage.py v7.13.1, created at 2025-12-28 11:09 -0700
1"""Tour request model."""
3from datetime import datetime
4from typing import TYPE_CHECKING, Optional
6from sqlalchemy import DateTime, ForeignKey, String, Text
7from sqlalchemy.orm import Mapped, mapped_column, relationship
9from idx_api.models.base import Base, TimestampMixin
11if TYPE_CHECKING:
12 from idx_api.models.agent import Agent
13 from idx_api.models.brokerage import Brokerage
16class TourRequest(Base, TimestampMixin):
17 """Property tour request from potential buyers."""
19 __tablename__ = "tour_requests"
21 id: Mapped[int] = mapped_column(primary_key=True)
23 # Property reference (MLS listing ID)
24 property_id: Mapped[str] = mapped_column(String(50), nullable=False, index=True)
26 # Contact information
27 first_name: Mapped[str] = mapped_column(String(100), nullable=False)
28 last_name: Mapped[str] = mapped_column(String(100), nullable=False)
29 email: Mapped[str] = mapped_column(String(255), nullable=False)
30 phone: Mapped[Optional[str]] = mapped_column(String(20))
32 # Tour details
33 message: Mapped[Optional[str]] = mapped_column(Text)
34 preferred_date: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True))
36 # Assignment
37 assigned_brokerage_id: Mapped[Optional[int]] = mapped_column(ForeignKey("brokerages.id"), index=True)
38 assigned_agent_id: Mapped[Optional[int]] = mapped_column(ForeignKey("agents.id"), index=True)
40 # Status tracking
41 status: Mapped[str] = mapped_column(
42 String(20), nullable=False, default="pending", index=True
43 ) # pending, contacted, scheduled, completed, cancelled
45 # Relationships
46 assigned_brokerage: Mapped[Optional["Brokerage"]] = relationship(
47 back_populates="tour_requests", foreign_keys=[assigned_brokerage_id]
48 )
49 assigned_agent: Mapped[Optional["Agent"]] = relationship(
50 back_populates="tour_requests", foreign_keys=[assigned_agent_id]
51 )
53 @property
54 def full_name(self) -> str:
55 """Get requester's full name."""
56 return f"{self.first_name} {self.last_name}"
58 def __repr__(self) -> str:
59 return f"<TourRequest(id={self.id}, property_id='{self.property_id}', status='{self.status}')>"