88 lines
2.6 KiB
Python
88 lines
2.6 KiB
Python
"""
|
|
Schemi Pydantic per Label (tag) e operazioni correlate.
|
|
Esteso con supporto tassonomia gerarchica (Feature N2).
|
|
"""
|
|
|
|
import uuid
|
|
from typing import Optional
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
# ─── CRUD Label ───────────────────────────────────────────────────────────────
|
|
|
|
class LabelCreate(BaseModel):
|
|
name: str = Field(..., min_length=1, max_length=100)
|
|
color: Optional[str] = Field(None, pattern=r'^#[0-9A-Fa-f]{6}$')
|
|
# Tassonomia: se valorizzato, questo nodo diventa figlio del parent indicato
|
|
parent_id: Optional[uuid.UUID] = None
|
|
description: Optional[str] = None
|
|
|
|
|
|
class LabelUpdate(BaseModel):
|
|
name: Optional[str] = Field(None, min_length=1, max_length=100)
|
|
color: Optional[str] = Field(None, pattern=r'^#[0-9A-Fa-f]{6}$')
|
|
parent_id: Optional[uuid.UUID] = None
|
|
description: Optional[str] = None
|
|
|
|
|
|
class LabelResponse(BaseModel):
|
|
id: uuid.UUID
|
|
tenant_id: uuid.UUID
|
|
name: str
|
|
color: Optional[str] = None
|
|
parent_id: Optional[uuid.UUID] = None
|
|
description: Optional[str] = None
|
|
|
|
model_config = {"from_attributes": True}
|
|
|
|
|
|
class LabelTreeResponse(BaseModel):
|
|
"""
|
|
Label con figli annidati per la vista ad albero della tassonomia.
|
|
|
|
Struttura restituita da GET /labels/tree:
|
|
[ Ambito1 { children: [ Processo1 { children: [ Classificazione1, ... ] } ] } ]
|
|
"""
|
|
id: uuid.UUID
|
|
tenant_id: uuid.UUID
|
|
name: str
|
|
color: Optional[str] = None
|
|
parent_id: Optional[uuid.UUID] = None
|
|
description: Optional[str] = None
|
|
children: list["LabelTreeResponse"] = []
|
|
|
|
model_config = {"from_attributes": True}
|
|
|
|
|
|
# Necessario per il tipo ricorsivo
|
|
LabelTreeResponse.model_rebuild()
|
|
|
|
|
|
# ─── Richieste per assegnazione tag a messaggi ────────────────────────────────
|
|
|
|
class MessageLabelSetRequest(BaseModel):
|
|
"""Sostituisce tutti i tag di un messaggio con quelli indicati."""
|
|
label_ids: list[uuid.UUID]
|
|
|
|
|
|
class MessageLabelAddRequest(BaseModel):
|
|
"""Aggiunge tag a un messaggio senza rimuovere quelli esistenti."""
|
|
label_ids: list[uuid.UUID]
|
|
|
|
|
|
class MessageLabelRemoveRequest(BaseModel):
|
|
"""Rimuove specifici tag da un messaggio."""
|
|
label_ids: list[uuid.UUID]
|
|
|
|
|
|
class MessageBulkLabelRequest(BaseModel):
|
|
"""Aggiunge o rimuove tag da più messaggi in blocco."""
|
|
message_ids: list[uuid.UUID]
|
|
label_ids: list[uuid.UUID]
|
|
action: str = Field(..., pattern=r'^(add|remove)$')
|
|
|
|
|
|
class MessageBulkLabelResponse(BaseModel):
|
|
updated: int
|