18 Commits

Author SHA1 Message Date
ab5a24fa68 feat(ui): refonte UI — logo aivanonym + palette magenta/pêche + onglets + v5.5
Intégration du logo "aivanonym" (gradient magenta → rose → pêche → noir)
fourni par le propriétaire. Refonte visuelle complète :

• APP_VERSION bump v5.4 → v5.5

• Assets (tous générés depuis assets/icons/logo.png) :
  - assets/icons/app.ico multi-résolution 16→256 (icône EXE Windows)
  - assets/icons/icon_{16,32,48,64,128,256,512}.png (fallback + taskbar)
  - assets/logo_header.png (260×61, intégré dans l'en-tête de la GUI)
  - assets/logo_splash.png (335×80, intégré dans le splash)
  - assets/splash.png redessiné avec logo + bandeau gradient primary→accent

• Palette dérivée du logo (remplace l'ancien bleu) :
  - CLR_PRIMARY       #E91E63  magenta logo (CTA, liens)
  - CLR_PRIMARY_DARK  #C2185B  hover / pressed
  - CLR_PRIMARY_LIGHT #FCE4EC  fond doux (tags, cartes)
  - CLR_ACCENT        #FFB74D  pêche logo (secondaire)
  - CLR_ACCENT_LIGHT  #FFF3E0
  - CLR_TEXT/SECONDARY proches du noir/gris du logo

• Pseudonymisation_Gui_V5.py :
  - Helper _asset(name) : résout sous sys._MEIPASS/assets en mode frozen
  - _apply_window_icon() : iconbitmap (.ico sur Windows) + iconphoto (PNG)
  - _load_image_safe() : charge PIL avec ref persistante (évite GC tkinter)
  - Header fixe hors onglets : logo image + baseline "100% local"
  - Ligne accent magenta sous le header (inspiration logo)
  - Onglets custom uniformes (remplace ttk.Notebook dont les tabs avaient
    des tailles variables selon l'état) : tous les boutons identiques,
    seule une bordure basse magenta signale l'onglet actif. _switch_tab()
    gère l'affichage du contenu et la mise à jour des styles.
  - Onglet 1 "Anonymisation" : workflow principal (choix, lancer, résultats)
  - Onglet 2 "Paramètres" : 3 listes (whitelist/blacklist/stopwords) +
    export/import + save. Plus de section repliable — respiration visuelle.
  - Boutons export/import repensés avec les couleurs de la palette

• anonymisation_onefile.spec :
  - datas : ajout du dossier assets/ entier
  - EXE(icon=assets/icons/app.ico) : le .exe a maintenant le logo dans
    l'Explorateur Windows, la barre des tâches, le gestionnaire des tâches

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 22:04:41 +02:00
6586b89b8f feat(gui): afficher version + build date + commit dans titre et status bar
Demande utilisateur : pouvoir identifier la build au premier coup d'oeil
sans confondre ancien/nouveau exe lors des tests.

Implémentation :
- build_info.py (gitignored, fallback "dev" pour mode développement)
  régénéré automatiquement par scripts/rebuild_anon.ps1 avec :
  BUILD_DATE = "2026-04-15 18:15"
  BUILD_COMMIT = "234137e"
  BUILD_BRANCH = "main"
- Pseudonymisation_Gui_V5.py : fonction _version_long() qui construit
  "v5.4 · 2026-04-15 18:15 · #234137e" depuis build_info (avec fallback
  silencieux si module absent en dev). Affichée dans :
    - Titre fenêtre : "Pseudonymisation de vos documents — v5.4 · ..."
    - Status bar en bas à droite
- anonymisation_onefile.spec : build_info.py ajouté aux datas bundlées.
- scripts/rebuild_anon.ps1 : STEP 4a génère build_info.py avant le
  PyInstaller avec git rev-parse short + branch + date courante.
- .gitignore : build_info.py exclu (volatile, regénéré).

En mode dev (pas frozen) : affichage "v5.4" seul (fallback).
En mode frozen : affichage complet avec date/commit.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 18:40:58 +02:00
4b5925306e feat(gui): exposer additional_stopwords dans le panneau Paramètres avancés
Troisième liste paramétrable dans la GUI v5.4, après whitelist_phrases et
blacklist.force_mask_terms : "Mots à ne jamais identifier comme noms".
Cible les sigles, acronymes métier locaux, ou termes ALL-CAPS récurrents
qui ressemblent à des noms propres mais n'en sont pas.

Différence avec la whitelist :
- whitelist_phrases : terme spécifique à protéger même s'il a été masqué
  par regex/NER (filtre final sur l'audit + sous-mots de hits multi-mots)
- additional_stopwords : empêche le terme d'être candidat-nom dès l'amont
  (intégré à _MEDICAL_STOP_WORDS_SET, filtre toutes les étapes)

Wired dans _load_params, _save_params, _export_params, _import_params.
La nouvelle clé additional_stopwords est incluse dans le JSON d'échange
inter-établissements.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 10:28:11 +02:00
b2ee6ad835 feat: config externe à côté de l'exe — mise à jour sans recompiler
Au premier lancement, la config embarquée est copiée dans config/
à côté de l'exe. Les lancements suivants utilisent cette copie externe.

Workflow de mise à jour :
1. L'établissement exporte ses paramètres (JSON)
2. On fusionne avec merge_params.py
3. On leur envoie le nouveau dictionnaires.yml par email
4. Ils le déposent dans config/ à côté de l'exe
5. Aucune recompilation nécessaire

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 18:09:02 +02:00
898ad9d82d feat: export/import paramètres par email + script merge côté serveur
GUI :
- Bouton "Exporter pour envoi" → fichier JSON sur le Bureau avec
  whitelist + blacklist + version + date, prêt à envoyer par email
- Bouton "Importer" → charge un JSON et fusionne (sans doublons)

Serveur :
- scripts/merge_params.py : fusionne les JSON reçus des établissements
  dans la config maîtresse dictionnaires.yml
  Usage : python scripts/merge_params.py export1.json export2.json

Workflow :
1. L'établissement ajuste les paramètres dans la GUI
2. Clique "Exporter" → fichier JSON
3. Envoie par email
4. On fusionne avec merge_params.py
5. On reconstruit l'exe avec la config enrichie

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 17:58:47 +02:00
106f1fcd2e fix: sync texte↔raster + GUI listes whitelist/blacklist améliorées
Bug critique corrigé : les noms forcés (contexte Dr/Mme) comme "MASSE"
étaient masqués dans le texte mais pas dans le PDF raster car filtrés
par les stop-words médicaux. Nouveau kind "NOM_FORCE" qui bypass le
filtre stop-words dans les fonctions de redaction vector et raster.

GUI : remplacement des zones texte brut par des listes interactives
avec champ de saisie + bouton Ajouter + bouton Supprimer, fond coloré
(vert pour whitelist, rose pour blacklist).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 17:34:51 +02:00
f9fbae1f27 feat: whitelist phrases + panneau paramètres avancés dans la GUI
- Nouvelle section whitelist_phrases dans dictionnaires.yml : phrases
  qui ne doivent jamais être anonymisées (FP récurrents)
- Fonction _apply_whitelist : restaure les phrases whitelistées après
  anonymisation, même si des mots ont été remplacés par des placeholders
- GUI : section "Paramètres avancés" repliable avec :
  - Zone texte whitelist (phrases à exclure)
  - Zone texte blacklist (mots à toujours masquer)
  - Bouton sauvegarder → persiste dans le YAML
- Phrases initiales : "classification internationale", "prise en charge",
  "bas de contention", "date de naissance", "code postal", etc.

Score évaluation maintenu à 100.0/100 (A+)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 15:03:08 +02:00
dcccd60c39 chore: GUI v5.4 — version bump + étape 1 formats listés
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 22:42:51 +01:00
63a4a013a2 feat: GUI multi-formats + fichier unique + textes mis à jour
- Titre : "Pseudonymisation de vos documents"
- Sous-titre, étape 1, paramètres, bouton : textes adaptés
- Choix fichier unique : clic → menu "Dossier / Fichier"
  avec filedialog filtré par formats supportés
- 14 formats supportés : PDF, DOCX, ODT, RTF, TXT, HTML,
  JPEG, PNG, TIFF, BMP

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 09:39:06 +01:00
437877e1c8 feat: support multi-formats — DOCX, images, ODT, RTF, TXT, HTML
Nouveau module format_converter.py : conversion automatique vers PDF
avant anonymisation. Formats supportés :
- PDF (passthrough)
- DOCX (python-docx → texte → PDF)
- ODT (odfpy → texte → PDF)
- RTF (striprtf → texte → PDF)
- TXT (texte brut → PDF via PyMuPDF)
- HTML (BeautifulSoup → texte → PDF)
- JPEG/PNG/TIFF/BMP (image embarquée → OCR docTR en aval)

Nouvelle fonction process_document() : wrapper qui gère la conversion
puis appelle process_pdf(). GUI mise à jour pour chercher tous les
formats supportés (plus seulement *.pdf).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 09:25:26 +01:00
bf30f622d9 feat(gui): Ajout bouton Arrêter pour stopper le traitement en cours 2026-03-02 22:04:00 +01:00
5163cb1657 fix(gui): Retirer paramètre use_vlm non supporté par process_pdf 2026-03-02 21:53:54 +01:00
3b1f6cdfbe gui: Ajout indicateurs qualité (fuites, performances) 2026-03-02 21:34:18 +01:00
86274b3b2a Sécurité VLM : format JSON forcé, modèle local uniquement, fix logging critique
- vlm_manager: ajout format:json dans payload Ollama (élimine hallucinations JSON)
- vlm_manager: retour modèle local qwen2.5vl:7b (sécurité données médicales)
- anonymizer_core: ajout import logging (fix NameError silencieux qui tuait le VLM)
- anonymizer_core: masquage direct pages manuscrites (suppression rotation inutile)
- GUI: intégration checkbox VLM + auto-load EDS-Pseudo prioritaire

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 02:38:30 +01:00
5ed2312d93 Amélioration majeure de l'anonymisation regex : trackare, noms composés, faux positifs
- Parseur trackare spécifique (détection par contenu, extraction structurée des PII)
- Support format "Dr X. NOM" et "Mme X. NOM" (initiales + noms composés avec tiret)
- Détection noms personnel médical (Aide, Cadre Infirmier, etc.)
- Masquage RPPS, établissements (EHPAD/SSR/USLD standalone), lieux de naissance
- Stop words médicaux enrichis (~270 entrées : DCI, spécialités, termes contextuels)
- Détection compagnon (noms adjacents à des noms connus dans le texte brut)
- Protection noms composés (JEAN-PIERRE traité comme un tout, pas JEAN + PIERRE)
- Nettoyage codes postaux orphelins, téléphones fragmentés/partiels
- Désactivation masquage dates génériques, AGE avec contexte obligatoire
- GUI : extraction OGC depuis le nom du répertoire parent, incrustation sur les pages

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 00:25:18 +01:00
9e06bbfa1d Fix _app_dir() pour Nuitka + crash log visible sans console
- _app_dir() utilise toujours Path(__file__).parent au lieu de
  dir() qui ne détecte pas __compiled__ dans une fonction
- Ajout crash.log + messagebox en cas d'erreur fatale
  (même avec --windows-console-mode=disable)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 22:11:44 +01:00
2e7e31a1f9 Embarquer modèle NER + chargement auto au démarrage
- GUI V5 : charge DistilCamemBERT-NER automatiquement en arrière-plan
- _app_dir() : chemin compatible Nuitka onefile
- Build Nuitka : inclut models/ + config/ dans le .exe
- GitHub Actions : étape download model avant compilation

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 15:31:17 +01:00
8339069c83 Initial commit — Pseudonymisation de PDF v5
- GUI v5 : vue unique épurée (tkinter), 2 étapes visuelles
- Core ONNX : anonymisation regex + NER optionnel
- Extraction globale des noms depuis champs structurés
  (Patient, Rédigé par, MME/Madame, DR)
- Génération simultanée PDF Image + PDF Anonymisé (structure préservée)
- Build Windows via Nuitka (script batch + GitHub Actions CI)
- install.sh pour setup/run Linux

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 15:03:37 +01:00