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
« prev ^ index » next coverage.py v7.13.1, created at 2025-12-28 11:16 -0700
1"""Agent model."""
3from datetime import datetime
4from typing import TYPE_CHECKING, Optional
6from sqlalchemy import Boolean, 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.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
19class Agent(Base, TimestampMixin):
20 """Real estate agent."""
22 __tablename__ = "agents"
24 id: Mapped[int] = mapped_column(primary_key=True)
25 brokerage_id: Mapped[int] = mapped_column(ForeignKey("brokerages.id"), nullable=False, index=True)
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))
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
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
44 # Soft delete
45 disabled_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True))
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")
56 def __repr__(self) -> str:
57 return f"<Agent(id={self.id}, name='{self.name}')>"