from __future__ import annotations from typing import Self from fansifter_common.adapters.db.models import Query from sqlalchemy.orm import Mapped, mapped_column from resonance_engine.adapters.db import Model from resonance_engine.dsp.enums import DSPClientName, DSPClientStatus, DSPId class DSPClientQuery(Query["DSPClient"]): def active(self) -> Self: return self.where(DSPClient.status == DSPClientStatus.active) class DSPClient(Model, kw_only=True): __tablename__ = "dsp_client" id: Mapped[int] = mapped_column(primary_key=True, init=False) dsp_id: Mapped[DSPId] name: Mapped[DSPClientName] = mapped_column(unique=True) display_name: Mapped[str] status: Mapped[DSPClientStatus] = mapped_column(default=DSPClientStatus.active) nominal_rps: Mapped[int | None] = mapped_column(default=None) query = DSPClientQuery.as_descriptor() @property def is_active(self) -> bool: return self.status == DSPClientStatus.active @property def is_paused(self) -> bool: return self.status == DSPClientStatus.paused