Coverage for src / idx_api / models / agent.py: 100%

26 statements  

« prev     ^ index     » next       coverage.py v7.13.1, created at 2025-12-28 11:16 -0700

1"""Agent model.""" 

2 

3from datetime import datetime 

4from typing import TYPE_CHECKING, Optional 

5 

6from sqlalchemy import Boolean, 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.brokerage import Brokerage 

13 from idx_api.models.client import Client 

14 from idx_api.models.lead import Lead 

15 from idx_api.models.tour_request import TourRequest 

16 from idx_api.models.user import User 

17 

18 

19class Agent(Base, TimestampMixin): 

20 """Real estate agent.""" 

21 

22 __tablename__ = "agents" 

23 

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

25 brokerage_id: Mapped[int] = mapped_column(ForeignKey("brokerages.id"), nullable=False, index=True) 

26 

27 # Personal information 

28 name: Mapped[str] = mapped_column(String(200), nullable=False) 

29 slug: Mapped[str] = mapped_column(String(250), nullable=False, unique=True, index=True) 

30 email: Mapped[str] = mapped_column(String(255), nullable=False) 

31 phone: Mapped[Optional[str]] = mapped_column(String(20)) 

32 

33 # Professional information 

34 mls_id: Mapped[Optional[str]] = mapped_column(String(50), index=True) 

35 bio: Mapped[Optional[str]] = mapped_column(Text) 

36 photo_url: Mapped[Optional[str]] = mapped_column(String(500)) 

37 profile_url: Mapped[Optional[str]] = mapped_column(String(500)) # External profile/website 

38 

39 # Agent settings (from HURE) 

40 is_lead_recipient: Mapped[bool] = mapped_column(Boolean, default=True, server_default='1') 

41 is_primary: Mapped[bool] = mapped_column(Boolean, default=False, server_default='0') 

42 status: Mapped[str] = mapped_column(String(20), default='active', server_default='active') # active | inactive 

43 

44 # Soft delete 

45 disabled_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True)) 

46 

47 # Relationships 

48 brokerage: Mapped["Brokerage"] = relationship(back_populates="agents") 

49 users: Mapped[list["User"]] = relationship(back_populates="agent") 

50 tour_requests: Mapped[list["TourRequest"]] = relationship( 

51 back_populates="assigned_agent", foreign_keys="TourRequest.assigned_agent_id" 

52 ) 

53 clients: Mapped[list["Client"]] = relationship(back_populates="assigned_agent") 

54 leads: Mapped[list["Lead"]] = relationship(back_populates="assigned_agent") 

55 

56 def __repr__(self) -> str: 

57 return f"<Agent(id={self.id}, name='{self.name}')>"