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

1"""Tour request model.""" 

2 

3from datetime import datetime 

4from typing import TYPE_CHECKING, Optional 

5 

6from sqlalchemy import DateTime, ForeignKey, String, Text 

7from sqlalchemy.orm import Mapped, mapped_column, relationship 

8 

9from idx_api.models.base import Base, TimestampMixin 

10 

11if TYPE_CHECKING: 

12 from idx_api.models.agent import Agent 

13 from idx_api.models.brokerage import Brokerage 

14 

15 

16class TourRequest(Base, TimestampMixin): 

17 """Property tour request from potential buyers.""" 

18 

19 __tablename__ = "tour_requests" 

20 

21 id: Mapped[int] = mapped_column(primary_key=True) 

22 

23 # Property reference (MLS listing ID) 

24 property_id: Mapped[str] = mapped_column(String(50), nullable=False, index=True) 

25 

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)) 

31 

32 # Tour details 

33 message: Mapped[Optional[str]] = mapped_column(Text) 

34 preferred_date: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True)) 

35 

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) 

39 

40 # Status tracking 

41 status: Mapped[str] = mapped_column( 

42 String(20), nullable=False, default="pending", index=True 

43 ) # pending, contacted, scheduled, completed, cancelled 

44 

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 ) 

52 

53 @property 

54 def full_name(self) -> str: 

55 """Get requester's full name.""" 

56 return f"{self.first_name} {self.last_name}" 

57 

58 def __repr__(self) -> str: 

59 return f"<TourRequest(id={self.id}, property_id='{self.property_id}', status='{self.status}')>"