from datetime import datetime from typing import Optional from pydantic import BaseModel, ConfigDict # ── Plugins ──────────────────────────────────────────────────────────────────── class PluginRead(BaseModel): model_config = ConfigDict(from_attributes=True) name: str display_name: str description: Optional[str] enabled: bool registered_at: datetime compatible_categories: list[str] = [] class PluginUpdate(BaseModel): enabled: bool # ── Users ────────────────────────────────────────────────────────────────────── class UserRead(BaseModel): model_config = ConfigDict(from_attributes=True) id: int username: str email: Optional[str] full_name: Optional[str] role: str is_active: bool created_at: datetime class UserCreate(BaseModel): username: str password: str email: Optional[str] = None full_name: Optional[str] = None role: str = "operator" # "admin" | "operator" class UserUpdate(BaseModel): email: Optional[str] = None full_name: Optional[str] = None role: Optional[str] = None is_active: Optional[bool] = None password: Optional[str] = None # if set, hashes and updates # ── Google Sheets sync ───────────────────────────────────────────────────────── class SheetsSyncRequest(BaseModel): spreadsheet_id: str sheet_name: Optional[str] = None # defaults to first sheet