Files
maziggy 6855d65d12 Let other applications send messages through the notification channels
POST /notifications/app-message delivers an app's message to every channel
with the new "Messages from connected apps" switch on (off by default),
through quiet hours, the digest and the log. API keys need the new "Send
notifications" permission, and their owner notifications:update; plain text,
http(s) links, 20 messages a minute per key. The electricity-price door and
this one now share one scoped-key check. /queue?batch=<id> opens and
highlights one batch order.
2026-09-27 12:45:50 +02:00

79 lines
2.8 KiB
Python

from datetime import datetime
from pydantic import BaseModel
class APIKeyCreate(BaseModel):
"""Schema for creating a new API key."""
name: str
can_queue: bool = True
can_control_printer: bool = False
can_read_status: bool = True
can_manage_library: bool = True # Upload / rename / delete own library files + MakerWorld import
can_manage_inventory: bool = True # Inventory writes — SpoolBuddy NFC/scale/system, manual stock edits via API
can_manage_maintenance: bool = (
True # Log/reset maintenance items, edit intervals, manage type catalog (#1832 follow-up)
)
can_manage_archives: bool = True # Create/update/delete print archives — not purge (#1888)
can_manage_projects: bool = True # Create/update/delete projects + membership (add archives) (#1893)
can_access_cloud: bool = False # Read /cloud/* on the creator's behalf — default off (#1182)
can_update_energy_cost: bool = False # POST /settings/electricity-price only (#1356)
can_send_notifications: bool = False # POST /notifications/app-message only
printer_ids: list[int] | None = None # null = all printers
expires_at: datetime | None = None
class APIKeyUpdate(BaseModel):
"""Schema for updating an API key."""
name: str | None = None
can_queue: bool | None = None
can_control_printer: bool | None = None
can_read_status: bool | None = None
can_manage_library: bool | None = None
can_manage_inventory: bool | None = None
can_manage_maintenance: bool | None = None
can_manage_archives: bool | None = None
can_manage_projects: bool | None = None
can_access_cloud: bool | None = None
can_update_energy_cost: bool | None = None
can_send_notifications: bool | None = None
printer_ids: list[int] | None = None
enabled: bool | None = None
expires_at: datetime | None = None
class APIKeyResponse(BaseModel):
"""Schema for API key response (without full key)."""
id: int
name: str
key_prefix: str # First 8 chars for identification
user_id: int | None # Owner — NULL on legacy keys created before per-user ownership (#1182)
can_queue: bool
can_control_printer: bool
can_read_status: bool
can_manage_library: bool
can_manage_inventory: bool
can_manage_maintenance: bool
can_manage_archives: bool
can_manage_projects: bool
can_access_cloud: bool
can_update_energy_cost: bool
can_send_notifications: bool
printer_ids: list[int] | None
enabled: bool
last_used: datetime | None
created_at: datetime
expires_at: datetime | None
class Config:
from_attributes = True
class APIKeyCreateResponse(APIKeyResponse):
"""Response when creating a key - includes full key (shown only once)."""
key: str # Full API key, only shown on creation