addon
This commit is contained in:
0
backend/app/schemas/__init__.py
Normal file → Executable file
0
backend/app/schemas/__init__.py
Normal file → Executable file
16
backend/app/schemas/benchmark.py
Normal file → Executable file
16
backend/app/schemas/benchmark.py
Normal file → Executable file
@@ -13,15 +13,15 @@ class CPUResults(BaseModel):
|
||||
events_per_sec_single: Optional[float] = Field(None, ge=0) # Monocore
|
||||
events_per_sec_multi: Optional[float] = Field(None, ge=0) # Multicore
|
||||
duration_s: Optional[float] = Field(None, ge=0)
|
||||
score: Optional[float] = Field(None, ge=0, le=10000)
|
||||
score_single: Optional[float] = Field(None, ge=0, le=10000) # Monocore score
|
||||
score_multi: Optional[float] = Field(None, ge=0, le=10000) # Multicore score
|
||||
score: Optional[float] = Field(None, ge=0, le=100000)
|
||||
score_single: Optional[float] = Field(None, ge=0, le=50000) # Monocore score
|
||||
score_multi: Optional[float] = Field(None, ge=0, le=100000) # Multicore score
|
||||
|
||||
|
||||
class MemoryResults(BaseModel):
|
||||
"""Memory benchmark results"""
|
||||
throughput_mib_s: Optional[float] = Field(None, ge=0)
|
||||
score: Optional[float] = Field(None, ge=0, le=10000)
|
||||
score: Optional[float] = Field(None, ge=0, le=100000)
|
||||
|
||||
|
||||
class DiskResults(BaseModel):
|
||||
@@ -31,7 +31,7 @@ class DiskResults(BaseModel):
|
||||
iops_read: Optional[int] = Field(None, ge=0)
|
||||
iops_write: Optional[int] = Field(None, ge=0)
|
||||
latency_ms: Optional[float] = Field(None, ge=0)
|
||||
score: Optional[float] = Field(None, ge=0, le=10000)
|
||||
score: Optional[float] = Field(None, ge=0, le=50000)
|
||||
|
||||
|
||||
class NetworkResults(BaseModel):
|
||||
@@ -41,13 +41,13 @@ class NetworkResults(BaseModel):
|
||||
ping_ms: Optional[float] = Field(None, ge=0)
|
||||
jitter_ms: Optional[float] = Field(None, ge=0)
|
||||
packet_loss_percent: Optional[float] = Field(None, ge=0, le=100)
|
||||
score: Optional[float] = Field(None, ge=0, le=10000)
|
||||
score: Optional[float] = Field(None, ge=0, le=100000)
|
||||
|
||||
|
||||
class GPUResults(BaseModel):
|
||||
"""GPU benchmark results"""
|
||||
glmark2_score: Optional[int] = Field(None, ge=0)
|
||||
score: Optional[float] = Field(None, ge=0, le=10000)
|
||||
score: Optional[float] = Field(None, ge=0, le=50000)
|
||||
|
||||
|
||||
class BenchmarkResults(BaseModel):
|
||||
@@ -57,7 +57,7 @@ class BenchmarkResults(BaseModel):
|
||||
disk: Optional[DiskResults] = None
|
||||
network: Optional[NetworkResults] = None
|
||||
gpu: Optional[GPUResults] = None
|
||||
global_score: float = Field(..., ge=0, le=10000, description="Global score (0-10000)")
|
||||
global_score: float = Field(..., ge=0, le=100000, description="Global score (weighted average of component scores)")
|
||||
|
||||
|
||||
class BenchmarkPayload(BaseModel):
|
||||
|
||||
0
backend/app/schemas/device.py
Normal file → Executable file
0
backend/app/schemas/device.py
Normal file → Executable file
0
backend/app/schemas/document.py
Normal file → Executable file
0
backend/app/schemas/document.py
Normal file → Executable file
0
backend/app/schemas/hardware.py
Normal file → Executable file
0
backend/app/schemas/hardware.py
Normal file → Executable file
0
backend/app/schemas/link.py
Normal file → Executable file
0
backend/app/schemas/link.py
Normal file → Executable file
392
backend/app/schemas/peripheral.py
Executable file
392
backend/app/schemas/peripheral.py
Executable file
@@ -0,0 +1,392 @@
|
||||
"""
|
||||
Linux BenchTools - Peripheral Schemas
|
||||
"""
|
||||
|
||||
from pydantic import BaseModel, Field
|
||||
from typing import Optional, List, Dict, Any
|
||||
from datetime import date, datetime
|
||||
|
||||
|
||||
# ========================================
|
||||
# BASE SCHEMAS
|
||||
# ========================================
|
||||
|
||||
class PeripheralBase(BaseModel):
|
||||
"""Base schema for peripherals"""
|
||||
nom: str = Field(..., min_length=1, max_length=255)
|
||||
type_principal: str = Field(..., min_length=1, max_length=100)
|
||||
sous_type: Optional[str] = Field(None, max_length=100)
|
||||
marque: Optional[str] = Field(None, max_length=100)
|
||||
modele: Optional[str] = Field(None, max_length=255)
|
||||
fabricant: Optional[str] = Field(None, max_length=255)
|
||||
produit: Optional[str] = Field(None, max_length=255)
|
||||
numero_serie: Optional[str] = Field(None, max_length=255)
|
||||
ean_upc: Optional[str] = Field(None, max_length=50)
|
||||
|
||||
# Achat
|
||||
boutique: Optional[str] = Field(None, max_length=255)
|
||||
date_achat: Optional[date] = None
|
||||
prix: Optional[float] = Field(None, ge=0)
|
||||
devise: Optional[str] = Field("EUR", max_length=10)
|
||||
garantie_duree_mois: Optional[int] = Field(None, ge=0)
|
||||
garantie_expiration: Optional[date] = None
|
||||
|
||||
# Évaluation
|
||||
rating: Optional[float] = Field(0.0, ge=0, le=5)
|
||||
|
||||
# Stock
|
||||
quantite_totale: Optional[int] = Field(1, ge=0)
|
||||
quantite_disponible: Optional[int] = Field(1, ge=0)
|
||||
seuil_alerte: Optional[int] = Field(0, ge=0)
|
||||
|
||||
# Métadonnées
|
||||
etat: Optional[str] = Field("Neuf", max_length=50)
|
||||
localisation: Optional[str] = Field(None, max_length=255)
|
||||
proprietaire: Optional[str] = Field(None, max_length=100)
|
||||
tags: Optional[str] = None # JSON string
|
||||
# Documentation
|
||||
description: Optional[str] = None # Description courte
|
||||
synthese: Optional[str] = None # Synthèse complète markdown
|
||||
cli: Optional[str] = None # DEPRECATED: Sortie CLI (lsusb -v) filtrée
|
||||
cli_yaml: Optional[str] = None # Données structurées CLI au format YAML
|
||||
cli_raw: Optional[str] = None # Sortie CLI brute (Markdown)
|
||||
specifications: Optional[str] = None # Spécifications techniques (Markdown)
|
||||
notes: Optional[str] = None # Notes libres (Markdown)
|
||||
|
||||
# Linux
|
||||
device_path: Optional[str] = Field(None, max_length=255)
|
||||
sysfs_path: Optional[str] = Field(None, max_length=500)
|
||||
vendor_id: Optional[str] = Field(None, max_length=20)
|
||||
product_id: Optional[str] = Field(None, max_length=20)
|
||||
usb_device_id: Optional[str] = Field(None, max_length=20)
|
||||
iManufacturer: Optional[str] = None # USB manufacturer string
|
||||
iProduct: Optional[str] = None # USB product string
|
||||
class_id: Optional[str] = Field(None, max_length=20)
|
||||
driver_utilise: Optional[str] = Field(None, max_length=100)
|
||||
modules_kernel: Optional[str] = None # JSON string
|
||||
udev_rules: Optional[str] = None
|
||||
identifiant_systeme: Optional[str] = None
|
||||
|
||||
# Installation
|
||||
installation_auto: Optional[bool] = False
|
||||
driver_requis: Optional[str] = None
|
||||
firmware_requis: Optional[str] = None
|
||||
paquets_necessaires: Optional[str] = None # JSON string
|
||||
commandes_installation: Optional[str] = None
|
||||
problemes_connus: Optional[str] = None
|
||||
solutions: Optional[str] = None
|
||||
compatibilite_noyau: Optional[str] = Field(None, max_length=100)
|
||||
|
||||
# Connectivité
|
||||
interface_connexion: Optional[str] = Field(None, max_length=100)
|
||||
connecte_a: Optional[str] = Field(None, max_length=255)
|
||||
consommation_electrique_w: Optional[float] = Field(None, ge=0)
|
||||
|
||||
# Localisation physique
|
||||
location_id: Optional[int] = None
|
||||
location_details: Optional[str] = Field(None, max_length=500)
|
||||
location_auto: Optional[bool] = True
|
||||
|
||||
# Appareil complet
|
||||
is_complete_device: Optional[bool] = False
|
||||
device_type: Optional[str] = Field(None, max_length=50)
|
||||
linked_device_id: Optional[int] = None
|
||||
device_id: Optional[int] = None
|
||||
|
||||
# Données spécifiques
|
||||
caracteristiques_specifiques: Optional[Dict[str, Any]] = None
|
||||
|
||||
|
||||
class PeripheralCreate(PeripheralBase):
|
||||
"""Schema for creating a peripheral"""
|
||||
pass
|
||||
|
||||
|
||||
class PeripheralUpdate(BaseModel):
|
||||
"""Schema for updating a peripheral (all fields optional)"""
|
||||
nom: Optional[str] = Field(None, min_length=1, max_length=255)
|
||||
type_principal: Optional[str] = Field(None, min_length=1, max_length=100)
|
||||
sous_type: Optional[str] = Field(None, max_length=100)
|
||||
marque: Optional[str] = Field(None, max_length=100)
|
||||
modele: Optional[str] = Field(None, max_length=255)
|
||||
fabricant: Optional[str] = Field(None, max_length=255)
|
||||
produit: Optional[str] = Field(None, max_length=255)
|
||||
numero_serie: Optional[str] = Field(None, max_length=255)
|
||||
ean_upc: Optional[str] = Field(None, max_length=50)
|
||||
boutique: Optional[str] = Field(None, max_length=255)
|
||||
date_achat: Optional[date] = None
|
||||
prix: Optional[float] = Field(None, ge=0)
|
||||
devise: Optional[str] = Field(None, max_length=10)
|
||||
garantie_duree_mois: Optional[int] = Field(None, ge=0)
|
||||
garantie_expiration: Optional[date] = None
|
||||
rating: Optional[float] = Field(None, ge=0, le=5)
|
||||
quantite_totale: Optional[int] = Field(None, ge=0)
|
||||
quantite_disponible: Optional[int] = Field(None, ge=0)
|
||||
seuil_alerte: Optional[int] = Field(None, ge=0)
|
||||
etat: Optional[str] = Field(None, max_length=50)
|
||||
localisation: Optional[str] = Field(None, max_length=255)
|
||||
proprietaire: Optional[str] = Field(None, max_length=100)
|
||||
tags: Optional[str] = None
|
||||
notes: Optional[str] = None
|
||||
device_path: Optional[str] = Field(None, max_length=255)
|
||||
vendor_id: Optional[str] = Field(None, max_length=20)
|
||||
product_id: Optional[str] = Field(None, max_length=20)
|
||||
usb_device_id: Optional[str] = Field(None, max_length=20)
|
||||
iManufacturer: Optional[str] = None
|
||||
iProduct: Optional[str] = None
|
||||
connecte_a: Optional[str] = Field(None, max_length=255)
|
||||
location_id: Optional[int] = None
|
||||
location_details: Optional[str] = Field(None, max_length=500)
|
||||
is_complete_device: Optional[bool] = None
|
||||
device_type: Optional[str] = Field(None, max_length=50)
|
||||
linked_device_id: Optional[int] = None
|
||||
device_id: Optional[int] = None
|
||||
caracteristiques_specifiques: Optional[Dict[str, Any]] = None
|
||||
|
||||
|
||||
class PeripheralSummary(BaseModel):
|
||||
"""Summary schema for peripheral lists"""
|
||||
id: int
|
||||
nom: str
|
||||
type_principal: str
|
||||
sous_type: Optional[str]
|
||||
marque: Optional[str]
|
||||
modele: Optional[str]
|
||||
etat: str
|
||||
rating: float
|
||||
prix: Optional[float]
|
||||
en_pret: bool
|
||||
is_complete_device: bool
|
||||
quantite_disponible: int
|
||||
thumbnail_url: Optional[str] = None
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
|
||||
|
||||
class PeripheralDetail(PeripheralBase):
|
||||
"""Detailed schema with all information"""
|
||||
id: int
|
||||
date_creation: datetime
|
||||
date_modification: Optional[datetime]
|
||||
en_pret: bool
|
||||
pret_actuel_id: Optional[int]
|
||||
prete_a: Optional[str]
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
|
||||
|
||||
class PeripheralListResponse(BaseModel):
|
||||
"""Paginated list response"""
|
||||
items: List[PeripheralSummary]
|
||||
total: int
|
||||
page: int
|
||||
page_size: int
|
||||
total_pages: int
|
||||
|
||||
|
||||
# ========================================
|
||||
# PHOTO SCHEMAS
|
||||
# ========================================
|
||||
|
||||
class PeripheralPhotoBase(BaseModel):
|
||||
"""Base schema for peripheral photos"""
|
||||
description: Optional[str] = None
|
||||
is_primary: Optional[bool] = False
|
||||
|
||||
|
||||
class PeripheralPhotoCreate(PeripheralPhotoBase):
|
||||
"""Schema for creating a photo"""
|
||||
peripheral_id: int
|
||||
filename: str
|
||||
stored_path: str
|
||||
mime_type: Optional[str]
|
||||
size_bytes: Optional[int]
|
||||
|
||||
|
||||
class PeripheralPhotoSchema(PeripheralPhotoBase):
|
||||
"""Full photo schema"""
|
||||
id: int
|
||||
peripheral_id: int
|
||||
filename: str
|
||||
stored_path: str
|
||||
thumbnail_path: Optional[str]
|
||||
mime_type: Optional[str]
|
||||
size_bytes: Optional[int]
|
||||
uploaded_at: datetime
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
|
||||
|
||||
# ========================================
|
||||
# DOCUMENT SCHEMAS
|
||||
# ========================================
|
||||
|
||||
class PeripheralDocumentBase(BaseModel):
|
||||
"""Base schema for peripheral documents"""
|
||||
doc_type: str = Field(..., max_length=50) # manual, warranty, invoice, datasheet, other
|
||||
description: Optional[str] = None
|
||||
|
||||
|
||||
class PeripheralDocumentCreate(PeripheralDocumentBase):
|
||||
"""Schema for creating a document"""
|
||||
peripheral_id: int
|
||||
filename: str
|
||||
stored_path: str
|
||||
mime_type: Optional[str]
|
||||
size_bytes: Optional[int]
|
||||
|
||||
|
||||
class PeripheralDocumentSchema(PeripheralDocumentBase):
|
||||
"""Full document schema"""
|
||||
id: int
|
||||
peripheral_id: int
|
||||
filename: str
|
||||
stored_path: str
|
||||
mime_type: Optional[str]
|
||||
size_bytes: Optional[int]
|
||||
uploaded_at: datetime
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
|
||||
|
||||
# ========================================
|
||||
# LINK SCHEMAS
|
||||
# ========================================
|
||||
|
||||
class PeripheralLinkBase(BaseModel):
|
||||
"""Base schema for peripheral links"""
|
||||
link_type: str = Field(..., max_length=50) # manufacturer, support, drivers, documentation, custom
|
||||
label: str = Field(..., min_length=1, max_length=255)
|
||||
url: str
|
||||
|
||||
|
||||
class PeripheralLinkCreate(PeripheralLinkBase):
|
||||
"""Schema for creating a link"""
|
||||
peripheral_id: int
|
||||
|
||||
|
||||
class PeripheralLinkSchema(PeripheralLinkBase):
|
||||
"""Full link schema"""
|
||||
id: int
|
||||
peripheral_id: int
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
|
||||
|
||||
# ========================================
|
||||
# LOAN SCHEMAS
|
||||
# ========================================
|
||||
|
||||
class LoanBase(BaseModel):
|
||||
"""Base schema for loans"""
|
||||
emprunte_par: str = Field(..., min_length=1, max_length=255)
|
||||
email_emprunteur: Optional[str] = Field(None, max_length=255)
|
||||
telephone: Optional[str] = Field(None, max_length=50)
|
||||
date_pret: date
|
||||
date_retour_prevue: date
|
||||
caution_montant: Optional[float] = Field(None, ge=0)
|
||||
etat_depart: Optional[str] = Field(None, max_length=50)
|
||||
raison_pret: Optional[str] = None
|
||||
notes: Optional[str] = None
|
||||
|
||||
|
||||
class LoanCreate(LoanBase):
|
||||
"""Schema for creating a loan"""
|
||||
peripheral_id: int
|
||||
|
||||
|
||||
class LoanReturn(BaseModel):
|
||||
"""Schema for returning a loan"""
|
||||
date_retour_effectif: date
|
||||
etat_retour: Optional[str] = Field(None, max_length=50)
|
||||
problemes_retour: Optional[str] = None
|
||||
caution_rendue: bool = True
|
||||
notes: Optional[str] = None
|
||||
|
||||
|
||||
class LoanSchema(LoanBase):
|
||||
"""Full loan schema"""
|
||||
id: int
|
||||
peripheral_id: int
|
||||
date_retour_effectif: Optional[date]
|
||||
statut: str
|
||||
caution_rendue: bool
|
||||
etat_retour: Optional[str]
|
||||
problemes_retour: Optional[str]
|
||||
created_by: Optional[str]
|
||||
rappel_envoye: bool
|
||||
date_rappel: Optional[datetime]
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
|
||||
|
||||
# ========================================
|
||||
# LOCATION SCHEMAS
|
||||
# ========================================
|
||||
|
||||
class LocationBase(BaseModel):
|
||||
"""Base schema for locations"""
|
||||
nom: str = Field(..., min_length=1, max_length=255)
|
||||
type: str = Field(..., max_length=50) # root, piece, placard, tiroir, etagere, meuble, boite
|
||||
parent_id: Optional[int] = None
|
||||
description: Optional[str] = None
|
||||
ordre_affichage: Optional[int] = 0
|
||||
|
||||
|
||||
class LocationCreate(LocationBase):
|
||||
"""Schema for creating a location"""
|
||||
pass
|
||||
|
||||
|
||||
class LocationUpdate(BaseModel):
|
||||
"""Schema for updating a location"""
|
||||
nom: Optional[str] = Field(None, min_length=1, max_length=255)
|
||||
type: Optional[str] = Field(None, max_length=50)
|
||||
parent_id: Optional[int] = None
|
||||
description: Optional[str] = None
|
||||
ordre_affichage: Optional[int] = None
|
||||
|
||||
|
||||
class LocationSchema(LocationBase):
|
||||
"""Full location schema"""
|
||||
id: int
|
||||
image_path: Optional[str]
|
||||
qr_code_path: Optional[str]
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
|
||||
|
||||
class LocationTreeNode(LocationSchema):
|
||||
"""Location with children for tree view"""
|
||||
children: List['LocationTreeNode'] = []
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
|
||||
|
||||
# ========================================
|
||||
# HISTORY SCHEMAS
|
||||
# ========================================
|
||||
|
||||
class PeripheralHistorySchema(BaseModel):
|
||||
"""Peripheral location history schema"""
|
||||
id: int
|
||||
peripheral_id: int
|
||||
from_location_id: Optional[int]
|
||||
to_location_id: Optional[int]
|
||||
from_device_id: Optional[int]
|
||||
to_device_id: Optional[int]
|
||||
action: str
|
||||
timestamp: datetime
|
||||
notes: Optional[str]
|
||||
user: Optional[str]
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
Reference in New Issue
Block a user