refactor(gui): intégrer le Masquage dans Administration > Profils

Retour Dom : le sous-onglet Masquage séparé créait de la confusion. Le
masquage fait partie de la manière d'anonymiser associée au profil.

- Retrait du sous-onglet « Administration > Masquage » (_SUBTABS, builder,
  méthode _build_masquage).
- Section « Profils > Masquage » enrichie : masque manuel requis, template
  de masque (lié au profil édité), bouton « Ouvrir l'éditeur de masque »
  (fenêtre dédiée) + dossier des templates, et apparence du masque
  (couleur, style des marqueurs + aperçu, marges H/V, coins arrondis).
- Le template enregistré depuis l'éditeur remplit désormais le champ
  Template du profil (preferred_manual_mask_template via _pro_template_var).
- Profils devient le centre des réglages métier (général/masquage/mots/
  moteurs/règles). Réglages inchangé (pas de pastilles, pas de grosse
  refonte). Nettoyage du code mort (_REPLACEMENT_CODES, _HELP_MASQUAGE).

261 tests unit OK (0 régression), self-test OK, nav 4 sous-onglets + éditeur
de masque depuis Profils + thème OK. Préserve 72841ed/GO Qwen. Aucun build/
push sans GO Dom.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-16 10:24:49 +02:00
parent 72841ed7b3
commit d8bc0cd8c8
2 changed files with 65 additions and 141 deletions

View File

@@ -251,3 +251,25 @@ def test_usage_tab_finish_calls_reporter(ctk_root):
assert called.wait(timeout=3.0) # reporter appelé en thread daemon
assert captured["summary"] is summary
tab.destroy()
def test_masquage_moved_into_profils(ctk_root, tmp_path, monkeypatch):
"""Le sous-onglet Masquage est retiré ; son contenu utile est dans Profils."""
from gui_v6.tabs import tab_config
keys = [k for k, _ in tab_config._SUBTABS]
assert "msk" not in keys # plus de sous-onglet Masquage séparé
monkeypatch.setattr(tab_config, "_app_base_dir", lambda: tmp_path)
tab = tab_config.ConfigTab(ctk_root)
tab._show_sub("pro")
tab.update_idletasks()
# apparence du masque relocalisée dans la section Profils > Masquage
assert getattr(tab, "_swatch_buttons", None)
# un template enregistré depuis l'éditeur remplit le champ Template du profil
saved = tmp_path / "config" / "mask_templates" / "depuis_editeur.json"
saved.parent.mkdir(parents=True, exist_ok=True)
tab._on_mask_template_saved(saved)
assert tab._pro_template_var.get().endswith("depuis_editeur.json")
tab.destroy()