Files
serv_benchmark/IMPORT_MD_UPDATE.md
Gilles Soulier c67befc549 addon
2026-01-05 16:08:01 +01:00

180 lines
5.8 KiB
Markdown
Executable File

# ✅ Import .md avec détection de doublons - COMPLÉTÉ
## Modifications apportées
La fonctionnalité d'import de fichiers .md a été améliorée avec une **vérification automatique des doublons**.
### Backend modifié
**[backend/app/api/endpoints/peripherals.py](backend/app/api/endpoints/peripherals.py)**
Ajout de la vérification de doublon dans l'endpoint `/api/peripherals/import/markdown` :
```python
# Check for existing peripheral with same vendor_id and product_id
existing_peripheral = None
vendor_id = suggested.get("caracteristiques_specifiques", {}).get("vendor_id")
product_id = suggested.get("caracteristiques_specifiques", {}).get("product_id")
if vendor_id and product_id:
# Search for peripheral with matching vendor_id and product_id
all_peripherals = db.query(Peripheral).all()
for periph in all_peripherals:
if periph.caracteristiques_specifiques:
p_vendor = periph.caracteristiques_specifiques.get("vendor_id")
p_product = periph.caracteristiques_specifiques.get("product_id")
if p_vendor == vendor_id and p_product == product_id:
existing_peripheral = periph
break
```
**Retour API :**
- Si **nouveau** : `already_exists: false` + `suggested_peripheral`
- Si **existe** : `already_exists: true` + `existing_peripheral`
### Frontend modifié
**[frontend/js/peripherals.js](frontend/js/peripherals.js)**
La fonction `importMarkdown()` gère maintenant deux cas :
#### Cas 1 : Périphérique nouveau
```javascript
if (result.already_exists) {
// Doublon détecté...
} else if (result.suggested_peripheral) {
// Nouveau périphérique
closeModal('modal-import-md');
showAddModal();
// Pré-remplir tous les champs du formulaire
if (suggested.nom) document.getElementById('nom').value = suggested.nom;
if (suggested.type_principal) { ... }
// etc.
showSuccess(`Fichier ${result.filename} importé avec succès. Vérifiez et complétez les informations.`);
}
```
#### Cas 2 : Périphérique existant (doublon)
```javascript
if (result.already_exists) {
closeModal('modal-import-md');
const existing = result.existing_peripheral;
const message = `Ce périphérique existe déjà dans la base de données:\n\n` +
`Nom: ${existing.nom}\n` +
`Marque: ${existing.marque || 'N/A'}\n` +
`Modèle: ${existing.modele || 'N/A'}\n` +
`Quantité: ${existing.quantite_totale}\n\n` +
`Voulez-vous voir ce périphérique?`;
if (confirm(message)) {
// Redirige vers la page de détail
window.location.href = `peripheral-detail.html?id=${existing.id}`;
} else {
showInfo(`Import annulé - le périphérique "${existing.nom}" existe déjà.`);
}
}
```
### Documentation mise à jour
**[FEATURE_IMPORT_MD.md](FEATURE_IMPORT_MD.md)**
Ajout de deux workflows détaillés :
- Workflow Cas 1 : Périphérique nouveau (18 étapes)
- Workflow Cas 2 : Périphérique existant avec doublon (13 étapes)
## Fonctionnement
### Détection des doublons
La vérification se fait sur **vendor_id + product_id** :
1. Le fichier .md est parsé
2. On extrait `vendor_id` et `product_id` (depuis le contenu ou le nom de fichier)
3. On recherche dans la base tous les périphériques existants
4. On compare les `vendor_id` et `product_id` de chaque périphérique
5. Si match trouvé → **Doublon détecté**
**Exemple :**
```markdown
Fichier : ID_0781_55ab.md
→ vendor_id = 0x0781
→ product_id = 0x55ab
Recherche dans la base :
→ Périphérique #42 : vendor_id=0x0781, product_id=0x55ab
→ MATCH ! → Doublon détecté
```
### Expérience utilisateur
**Si nouveau périphérique :**
1. Modal import se ferme
2. Modal ajout s'ouvre
3. Formulaire pré-rempli avec toutes les données du fichier .md
4. L'utilisateur complète (prix, localisation, photos)
5. Enregistre → Périphérique créé
**Si périphérique existe déjà :**
1. Modal import se ferme
2. Dialog de confirmation s'affiche :
```
Ce périphérique existe déjà dans la base de données:
Nom: SanDisk USB Flash Drive
Marque: SanDisk
Modèle: 3.2Gen1
Quantité: 2
Voulez-vous voir ce périphérique?
```
3. Si **OUI** → Redirige vers la page de détail du périphérique existant
4. Si **NON** → Message "Import annulé - le périphérique existe déjà"
## Test rapide
```bash
# 1. Redémarrer le backend
docker compose restart backend
# 2. Importer un nouveau fichier (ex: ID_0b05_17cb.md)
# Via interface : http://localhost:8087/peripherals.html
# Bouton "Importer .md" → Sélectionner fichier → Importer
# Résultat : Formulaire pré-rempli
# 3. Réimporter le MÊME fichier
# Résultat : Message "Ce périphérique existe déjà..." avec option de voir
# 4. Test API direct
curl -X POST http://localhost:8007/api/peripherals/import/markdown \
-F "file=@fichier_usb/ID_0b05_17cb.md" | jq
# Premier import : already_exists = false
# Second import : already_exists = true
```
## Avantages
**Évite les doublons** - Impossible d'importer deux fois le même périphérique (vendor_id + product_id)
**Navigation rapide** - Si doublon, option de voir directement le périphérique existant
**Informé** - L'utilisateur sait immédiatement si le périphérique existe déjà
**Transparence** - Affiche les infos du périphérique existant (nom, marque, modèle, quantité)
**Workflow fluide** - Modal se ferme automatiquement, pas de confusion
## Fichiers modifiés
| Fichier | Modifications |
|---------|---------------|
| [backend/app/api/endpoints/peripherals.py](backend/app/api/endpoints/peripherals.py) | +40 lignes - Vérification doublon |
| [frontend/js/peripherals.js](frontend/js/peripherals.js) | +35 lignes - Gestion cas doublon |
| [FEATURE_IMPORT_MD.md](FEATURE_IMPORT_MD.md) | +50 lignes - Documentation workflows |
**Total :** ~125 lignes ajoutées
---
**Développé avec Claude Code** - 2025-12-30