Coverage for src / idx_api / models / broker.py: 100%
19 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"""Broker contact model - represents contact person at a brokerage."""
3from datetime import datetime
4from typing import TYPE_CHECKING, Optional
6from sqlalchemy import Boolean, DateTime, ForeignKey, Integer, String
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.user import User
16class Broker(Base, TimestampMixin):
17 """Broker contact person - individual who works at a brokerage."""
19 __tablename__ = "brokers"
21 id: Mapped[int] = mapped_column(primary_key=True)
22 brokerage_id: Mapped[int] = mapped_column(
23 Integer, ForeignKey("brokerages.id", ondelete="CASCADE"), nullable=False, index=True
24 )
26 # Contact information
27 name: Mapped[str] = mapped_column(String(200), nullable=False)
28 email: Mapped[str] = mapped_column(String(255), nullable=False)
29 phone: Mapped[Optional[str]] = mapped_column(String(20))
30 phone_display: Mapped[Optional[str]] = mapped_column(String(20))
32 # License information (individual broker license)
33 license_type: Mapped[Optional[str]] = mapped_column(String(100))
34 license_number: Mapped[Optional[str]] = mapped_column(String(100))
36 # Primary contact flag (one per brokerage)
37 is_primary: Mapped[bool] = mapped_column(Boolean, default=True, server_default='1', nullable=False)
39 # Soft delete
40 disabled_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True))
42 # Relationships
43 brokerage: Mapped["Brokerage"] = relationship(back_populates="brokers")
44 users: Mapped[list["User"]] = relationship(back_populates="broker_contact")
46 def __repr__(self) -> str:
47 return f"<Broker(id={self.id}, name='{self.name}', brokerage_id={self.brokerage_id}, is_primary={self.is_primary})>"