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

1"""Broker contact model - represents contact person at a brokerage.""" 

2 

3from datetime import datetime 

4from typing import TYPE_CHECKING, Optional 

5 

6from sqlalchemy import Boolean, DateTime, ForeignKey, Integer, String 

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.user import User 

14 

15 

16class Broker(Base, TimestampMixin): 

17 """Broker contact person - individual who works at a brokerage.""" 

18 

19 __tablename__ = "brokers" 

20 

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 ) 

25 

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

31 

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

35 

36 # Primary contact flag (one per brokerage) 

37 is_primary: Mapped[bool] = mapped_column(Boolean, default=True, server_default='1', nullable=False) 

38 

39 # Soft delete 

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

41 

42 # Relationships 

43 brokerage: Mapped["Brokerage"] = relationship(back_populates="brokers") 

44 users: Mapped[list["User"]] = relationship(back_populates="broker_contact") 

45 

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