refactor(gui): intégrer les Règles dans Administration > Profils

Retour Dom : « les règles du profil doivent être dans le menu profil, pas à
part ! ». Même logique que le Masquage — les règles qui influencent
l'anonymisation appartiennent au profil ; un sous-onglet séparé crée la
même confusion.

- Retrait du sous-onglet « Administration > Règles » (_SUBTABS, builder,
  méthode _build_regles supprimée). Sous-onglets restants : Réglages /
  Profils / Partage.
- Section « Profils > Règles du profil » enrichie : wording clair (règles
  d'anonymisation portées par le profil), aperçu illustratif de la table
  des règles (réutilise _rule_row + _HELP_REGLES), édition fine annoncée
  « à venir ».
- Abandon du « Testeur de règle » (écran outil global) pour ne pas
  réintroduire un second réglage métier.

Cible UX : Réglages / Profils (Général・Masquage・Mots・Moteurs・Règles du
profil) / Partage. Test obsolète test_rules_subtab_has_no_unexplained_2
remplacé par test_no_separate_rules_subtab.

262 tests unit OK (0 régression), self-test OK, nav 3 sous-onglets + section
Règles dans Profils + thème OK. Préserve d8bc0cd + 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 12:00:10 +02:00
parent d8bc0cd8c8
commit 764cf00581
3 changed files with 47 additions and 44 deletions

View File

@@ -273,3 +273,25 @@ def test_masquage_moved_into_profils(ctk_root, tmp_path, monkeypatch):
tab._on_mask_template_saved(saved)
assert tab._pro_template_var.get().endswith("depuis_editeur.json")
tab.destroy()
def test_regles_moved_into_profils(ctk_root, tmp_path, monkeypatch):
"""Retour Dom : le sous-onglet Règles séparé est retiré ; les règles du
profil sont une section de Profils."""
from gui_v6.tabs import tab_config
keys = [k for k, _ in tab_config._SUBTABS]
assert "rul" not in keys # plus de sous-onglet Règles 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()
# la section des règles du profil est dans le panneau Profils
texts = " | ".join(_all_texts(tab._panels["pro"]))
assert "Règles d'anonymisation portées par ce profil" in texts
assert "Masquer le sigle CHUXX" in texts # table de règles relocalisée dans Profils
# le builder du sous-onglet séparé n'existe plus
assert "rul" not in tab._panels
tab.destroy()