Worker di visione per stazione: modello, API, migrazione 019, execute_task (#45)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NABedeMX43pyXZbDNUgA5B
This commit is contained in:
Adriano
2026-10-11 17:37:08 +00:00
parent 9306fbf653
commit 95d643d6d8
6 changed files with 82 additions and 6 deletions
+22 -1
View File
@@ -2,7 +2,19 @@
from src.backend.models.api.tipi import UtcDateTime
from typing import Optional
from pydantic import BaseModel, ConfigDict, Field
from pydantic import BaseModel, ConfigDict, Field, field_validator
def _normalize_worker_url(value: Optional[str]) -> Optional[str]:
"""Vuoto/spazi -> None (worker centrale); altrimenti http(s) senza '/' finale (#45)."""
if value is None:
return None
value = value.strip()
if not value:
return None
if not value.lower().startswith(("http://", "https://")):
raise ValueError("vision_worker_url must start with http:// or https://")
return value.rstrip("/")
class StationCreate(BaseModel):
@@ -11,6 +23,10 @@ class StationCreate(BaseModel):
location: Optional[str] = Field(default=None, max_length=255)
notes: Optional[str] = None
active: bool = True
# worker di visione della stazione (#45); vuoto = centrale
vision_worker_url: Optional[str] = Field(default=None, max_length=500)
_check_worker_url = field_validator("vision_worker_url")(_normalize_worker_url)
class StationUpdate(BaseModel):
@@ -18,6 +34,10 @@ class StationUpdate(BaseModel):
location: Optional[str] = Field(default=None, max_length=255)
notes: Optional[str] = None
active: Optional[bool] = None
# worker di visione della stazione (#45); "" -> None riporta al centrale
vision_worker_url: Optional[str] = Field(default=None, max_length=500)
_check_worker_url = field_validator("vision_worker_url")(_normalize_worker_url)
class StationResponse(BaseModel):
@@ -28,6 +48,7 @@ class StationResponse(BaseModel):
location: Optional[str]
notes: Optional[str]
active: bool
vision_worker_url: Optional[str] = None # #45
created_by: int
created_at: UtcDateTime