Files
kiddo/backend/models.py
stephan 63ee0b40b5 feat: login time window rules (EPIC_000014)
- Implemented RuleManager and JSON storage
- Added background enforcement scheduler
- Added Web UI for rule management at /ui/rules
- Bumped version to 0.3.0
2026-01-16 11:25:56 +01:00

124 lines
2.6 KiB
Python

from enum import Enum
from typing import List, Optional, Dict
from pydantic import BaseModel, Field
class DayOfWeek(str, Enum):
MONDAY = "mon"
TUESDAY = "tue"
WEDNESDAY = "wed"
THURSDAY = "thu"
FRIDAY = "fri"
SATURDAY = "sat"
SUNDAY = "sun"
class TimeWindow(BaseModel):
days: List[DayOfWeek]
start_time: str = Field(..., pattern=r"^\d{2}:\d{2}$", description="HH:MM format")
end_time: str = Field(..., pattern=r"^\d{2}:\d{2}$", description="HH:MM format")
class AccessRule(BaseModel):
user: str
enabled: bool = True
auto_reenable: bool = False
allowed_windows: List[TimeWindow] = []
class RuleSet(BaseModel):
rules: Dict[str, AccessRule] = {} # Keyed by username for O(1) lookup
class ActionRequest(BaseModel):
countdown: Optional[int] = Field(default=None, ge=0, description="Seconds for countdown")
sound: Optional[bool] = Field(default=None, description="Play sound alongside notification")
message: Optional[str] = Field(
default=None,
description="Optional message to show the user; falls back to default text.",
)
class ActionResponse(BaseModel):
user: str
action: str
dry_run: bool
steps: List[str]
logged_in: bool
class UserStatus(BaseModel):
user: str
logged_in: bool
account_locked: bool
class LoginRequest(BaseModel):
username: str
password: str
class LoginResponse(BaseModel):
token: str
expires_in: int
class UpdateStatus(BaseModel):
current_version: str
last_status: str
last_error: Optional[str] = None
last_timestamp: Optional[str] = None
enrolled: bool = False
class EnrollRequest(BaseModel):
enroll_token: Optional[str] = None
class EnrollResponse(BaseModel):
enrolled: bool
message: str
class UpdateCheckResponse(BaseModel):
available: bool
latest_version: str
artifact_url: str
sha256: str
message: Optional[str] = None
class UpdateActionResponse(BaseModel):
started: bool
message: str
class UpdateLogEntry(BaseModel):
timestamp: str
status: str
message: Optional[str] = None
version: Optional[str] = None
error: Optional[str] = None
device_id: Optional[str] = None
class UpdateServiceStatus(BaseModel):
url: str
reachable: bool
status_code: Optional[int] = None
error: Optional[str] = None
checked_url: str
environment: str
class SystemMetrics(BaseModel):
cpu_percent: float
ram_total_mb: float
ram_used_percent: float
gpu_vram_total_mb: Optional[float] = None
gpu_vram_used_percent: Optional[float] = None
gpu_present: bool = False
net_rx_mbps: float
net_tx_mbps: float