Coverage for app / models / monitor.py: 100%

20 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-05-05 17:54 +0000

1import uuid 

2from datetime import datetime, timezone 

3 

4from sqlalchemy import ForeignKey, Integer, String, Boolean, DateTime, func, Index 

5from sqlalchemy.orm import Mapped, mapped_column, relationship 

6 

7from app.db.base import Base 

8 

9 

10class Monitor(Base): 

11 __tablename__ = "monitors" 

12 

13 __table_args__ = ( 

14 Index("ix_monitors_user_id", "user_id"), 

15 Index("ix_monitors_active_next_check", "is_active", "next_check_at"), 

16 ) 

17 

18 id: Mapped[uuid.UUID] = mapped_column(primary_key=True, default=uuid.uuid4) 

19 user_id: Mapped[uuid.UUID] = mapped_column(ForeignKey("users.id"), nullable=False) 

20 

21 url: Mapped[str] = mapped_column(String(2048), nullable=False) 

22 interval_seconds: Mapped[int] = mapped_column(Integer, nullable=False, default=300) 

23 is_active: Mapped[bool] = mapped_column(Boolean, default=True) 

24 

25 alert_status: Mapped[str] = mapped_column(String(10), default="UP") 

26 last_alerted_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) 

27 next_check_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) 

28 

29 created_at: Mapped[datetime] = mapped_column( 

30 DateTime(timezone=True), 

31 server_default=func.now(), 

32 default=lambda: datetime.now(timezone.utc), 

33 ) 

34 updated_at: Mapped[datetime] = mapped_column( 

35 DateTime(timezone=True), 

36 server_default=func.now(), 

37 onupdate=lambda: datetime.now(timezone.utc), 

38 ) 

39 

40 user: Mapped["User"] = relationship("User", back_populates="monitors") 

41 ping_logs: Mapped[list["PingLog"]] = relationship( 

42 "PingLog", back_populates="monitor", cascade="all, delete-orphan" 

43 )