# Correction du pré-remplissage du PCI Slot ## Problème identifié Lors de l'import de périphériques PCI, le slot (ex: `08:00.0`) n'était pas pré-rempli dans le formulaire. ### Diagnostic Le code tentait de pré-remplir un champ `device_id` qui n'existe pas dans le modèle: **Backend** (`peripherals.py` ligne 1507): ```python "device_id": device_info.get("slot"), # ❌ Ce champ n'existe pas ``` **Frontend** (`peripherals.js` lignes 1839-1842): ```javascript if (suggested.device_id) { const deviceIdField = document.getElementById('device_id'); // ❌ Ce champ n'existe pas if (deviceIdField) deviceIdField.value = suggested.device_id; } ``` ### Analyse du modèle Le modèle `Peripheral` possédait: - `device_id` (INTEGER) - Lien vers la table devices (assignation actuelle) - `linked_device_id` (INTEGER) - Lien vers data.db pour benchmarks - `usb_device_id` (TEXT) - Format `idVendor:idProduct` (ex: `1d6b:0003`) - `pci_device_id` (VARCHAR) - Format `vendor:device` (ex: `10de:2504`) **Mais pas de champ pour stocker le slot PCI** (`08:00.0`). ## Solution implémentée ### 1. Nouveau champ `pci_slot` Ajout d'un champ dédié pour stocker le slot PCI (Bus:Device.Function). #### Migration 014 **Fichier**: `migrations/014_add_pci_slot.sql` ```sql ALTER TABLE peripherals ADD COLUMN pci_slot VARCHAR(20); CREATE INDEX idx_peripherals_pci_slot ON peripherals(pci_slot); ``` **Application**: ```bash python3 backend/apply_migration_014.py ``` **Résultat**: ``` ✅ Migration 014 applied successfully ✅ Column 'pci_slot' added: (68, 'pci_slot', 'VARCHAR(20)', 0, None, 0) ``` ### 2. Modèle mis à jour **Fichier**: `backend/app/models/peripheral.py` (ligne 72) ```python usb_device_id = Column(String(20)) # idVendor:idProduct (e.g. 1d6b:0003) pci_device_id = Column(String(20)) # vendor:device for PCI (e.g. 10ec:8168) pci_slot = Column(String(20)) # PCI slot identifier (e.g. 08:00.0) ← NOUVEAU ``` ### 3. Schéma mis à jour **Fichier**: `backend/app/schemas/peripheral.py` (ligne 63) ```python usb_device_id: Optional[str] = Field(None, max_length=20) pci_device_id: Optional[str] = Field(None, max_length=20) pci_slot: Optional[str] = Field(None, max_length=20) # ← NOUVEAU ``` ### 4. Backend corrigé **Fichier**: `backend/app/api/endpoints/peripherals.py` (ligne 1507) ```python suggested = { "nom": nom, "type_principal": type_principal, "sous_type": sous_type, "marque": brand or device_info.get("vendor_name"), "modele": model or device_info.get("device_name"), "pci_slot": device_info.get("slot"), # ✅ Utilise pci_slot "pci_device_id": device_info.get("pci_device_id"), "cli_raw": device_section, "caracteristiques_specifiques": caracteristiques_specifiques } ``` ### 5. Frontend corrigé **Fichier**: `frontend/js/peripherals.js` (lignes 1838-1842) ```javascript // Fill PCI slot (like 08:00.0) if (suggested.pci_slot) { const pciSlotField = document.getElementById('pci_slot'); if (pciSlotField) pciSlotField.value = suggested.pci_slot; } ``` ### 6. Formulaire HTML mis à jour **Fichier**: `frontend/peripherals.html` (lignes 183-196) ```html
``` ## Résumé des identifiants PCI Chaque périphérique PCI possède maintenant **deux identifiants**: | Champ | Description | Exemple | Source | |-------|-------------|---------|--------| | **`pci_slot`** | Emplacement physique sur le bus PCI | `08:00.0` | `lspci -v` (colonne 1) | | **`pci_device_id`** | Identifiant vendor:device | `10de:2504` | `lspci -n` (colonnes 3-4) | ### Exemple Pour une **NVIDIA GeForce RTX 3060** sur le slot `08:00.0`: ``` 08:00.0 VGA compatible controller: NVIDIA Corporation GA106 [GeForce RTX 3060 Lite Hash Rate] (rev a1) ``` Avec `lspci -n`: ``` 08:00.0 0300: 10de:2504 (rev a1) ``` **Données importées**: - `pci_slot`: `08:00.0` - `pci_device_id`: `10de:2504` - `marque`: `NVIDIA` - `modele`: `GeForce RTX 3060 Lite Hash Rate` - `type_principal`: `PCI` - `sous_type`: `Carte graphique` ## Bénéfices ✅ **PCI Slot pré-rempli**: Le slot physique (08:00.0) est maintenant visible et stocké ✅ **PCI Device ID pré-rempli**: L'identifiant vendor:device (10de:2504) est stocké ✅ **Distinction USB/PCI**: Champs séparés pour USB et PCI ✅ **Indexation**: Index ajouté pour requêtes rapides par slot ✅ **Cohérence**: Même pattern que usb_device_id ## Fichiers modifiés 1. **migrations/014_add_pci_slot.sql** - Migration SQL 2. **backend/apply_migration_014.py** - Script d'application 3. **backend/app/models/peripheral.py** - Ajout du champ pci_slot 4. **backend/app/schemas/peripheral.py** - Ajout au schéma 5. **backend/app/api/endpoints/peripherals.py** - Utilisation de pci_slot 6. **frontend/js/peripherals.js** - Pré-remplissage du champ 7. **frontend/peripherals.html** - Ajout du champ au formulaire ## Test Pour tester le pré-remplissage: 1. Importer un périphérique PCI (ex: carte graphique) 2. Vérifier que le formulaire affiche: - **PCI Slot**: `08:00.0` ✅ - **PCI Device ID**: `10de:2504` ✅ - **Type principal**: `PCI` ✅ - **Sous-type**: `Carte graphique` ✅ ## Conclusion Le slot PCI est maintenant correctement stocké dans un champ dédié `pci_slot`, permettant: - Un pré-remplissage automatique lors de l'import - Une identification précise de l'emplacement physique du périphérique - Une distinction claire entre slot (08:00.0) et device ID (10de:2504)