43 lines
1.4 KiB
Python
43 lines
1.4 KiB
Python
"""Alert model."""
|
|
|
|
from datetime import datetime
|
|
from typing import Any, Optional
|
|
|
|
from pydantic import BaseModel, ConfigDict
|
|
|
|
|
|
class Alert(BaseModel):
|
|
"""Pydantic model for alerts table."""
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
id: Optional[str] = None
|
|
watchlist_id: str
|
|
strategy_id: Optional[str] = None
|
|
ticker: Optional[str] = None
|
|
type: str # strategy_trigger, sec_filing, sentiment, rotation, price
|
|
trigger_type: Optional[str] = None
|
|
message: str
|
|
severity: str = "info" # info, warning, critical
|
|
status: str = "active" # active, resolved, dismissed
|
|
triggered_at: Optional[datetime] = None
|
|
resolved_at: Optional[datetime] = None
|
|
metadata: Optional[dict] = None
|
|
created_at: Optional[datetime] = None
|
|
|
|
def to_dict(self) -> dict:
|
|
return {
|
|
"id": self.id,
|
|
"watchlistId": self.watchlist_id,
|
|
"strategyId": self.strategy_id,
|
|
"ticker": self.ticker,
|
|
"type": self.type,
|
|
"triggerType": self.trigger_type,
|
|
"message": self.message,
|
|
"severity": self.severity,
|
|
"status": self.status,
|
|
"triggeredAt": self.triggered_at.isoformat() if self.triggered_at else None,
|
|
"resolvedAt": self.resolved_at.isoformat() if self.resolved_at else None,
|
|
"metadata": self.metadata,
|
|
}
|