addon
This commit is contained in:
179
IMPORT_MD_UPDATE.md
Executable file
179
IMPORT_MD_UPDATE.md
Executable file
@@ -0,0 +1,179 @@
|
||||
# ✅ 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
|
||||
Reference in New Issue
Block a user