first commit
This commit is contained in:
commit
dc1245f164
22 changed files with 1666 additions and 0 deletions
97
monitor/models.py
Normal file
97
monitor/models.py
Normal file
|
|
@ -0,0 +1,97 @@
|
|||
"""Data models for the browser monitoring application."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from dataclasses import dataclass, field
|
||||
from datetime import datetime
|
||||
from typing import Any, Optional
|
||||
|
||||
|
||||
@dataclass
|
||||
class PageSnapshot:
|
||||
"""Structured representation of a captured page state."""
|
||||
|
||||
website_id: str
|
||||
website_name: str
|
||||
requested_url: str
|
||||
final_url: str
|
||||
timestamp: datetime
|
||||
title: str
|
||||
visible_text: str
|
||||
html: str
|
||||
screenshot_path: Optional[str]
|
||||
load_duration: float
|
||||
success: bool
|
||||
error: Optional[str] = None
|
||||
|
||||
|
||||
@dataclass
|
||||
class ProcessingResult:
|
||||
"""Result from OpenAI processing (or stub)."""
|
||||
|
||||
success: bool
|
||||
value: Optional[Any] = None
|
||||
condition_met: bool = False
|
||||
message: str = ""
|
||||
email_subject: str = ""
|
||||
email_body: str = ""
|
||||
reason: str = ""
|
||||
|
||||
|
||||
@dataclass
|
||||
class WebsiteConfig:
|
||||
"""Configuration for a single monitored website."""
|
||||
|
||||
id: str
|
||||
name: str
|
||||
url: str
|
||||
enabled: bool = True
|
||||
extra: dict[str, Any] = field(default_factory=dict)
|
||||
|
||||
|
||||
@dataclass
|
||||
class BrowserConfig:
|
||||
"""Browser automation settings."""
|
||||
|
||||
type: str = "chrome"
|
||||
executable_path: Optional[str] = None
|
||||
headless: bool = False
|
||||
profile_directory: str = "./profiles/default"
|
||||
|
||||
|
||||
@dataclass
|
||||
class MonitorConfig:
|
||||
"""Monitoring loop settings."""
|
||||
|
||||
round_robin_delay_seconds: float = 5.0
|
||||
page_load_timeout_seconds: float = 30.0
|
||||
render_wait_seconds: float = 3.0
|
||||
snapshot_directory: str = "./snapshots"
|
||||
snapshot_retention_count: int = 50
|
||||
browser_restart_max_retries: int = 3
|
||||
browser_restart_backoff_seconds: float = 5.0
|
||||
|
||||
|
||||
@dataclass
|
||||
class NotificationChannelConfig:
|
||||
"""Per-channel notification settings."""
|
||||
|
||||
enabled: bool = False
|
||||
|
||||
|
||||
@dataclass
|
||||
class NotificationsConfig:
|
||||
"""Notification settings."""
|
||||
|
||||
sms: NotificationChannelConfig = field(default_factory=NotificationChannelConfig)
|
||||
email: NotificationChannelConfig = field(default_factory=NotificationChannelConfig)
|
||||
|
||||
|
||||
@dataclass
|
||||
class AppConfig:
|
||||
"""Root application configuration."""
|
||||
|
||||
browser: BrowserConfig = field(default_factory=BrowserConfig)
|
||||
monitor: MonitorConfig = field(default_factory=MonitorConfig)
|
||||
websites: list[WebsiteConfig] = field(default_factory=list)
|
||||
notifications: NotificationsConfig = field(default_factory=NotificationsConfig)
|
||||
Loading…
Add table
Add a link
Reference in a new issue