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

@@ -53,13 +53,15 @@ def test_main_tab_renamed_to_administration():
assert not any("Configuration" in lbl for lbl in labels)
def test_rules_subtab_has_no_unexplained_2():
"""Retour Dom #3 : « Règles 2 » incompréhensible → simple « Règles »."""
def test_no_separate_rules_subtab():
"""Retour Dom : les règles appartiennent au profil → plus de sous-onglet
« Règles » séparé (et donc plus de « Règles 2 » incompréhensible)."""
from gui_v6.tabs.tab_config import _SUBTABS
keys = [key for key, _ in _SUBTABS]
labels = [label for _, label in _SUBTABS]
assert any(lbl.strip() == "🛡️ Règles" for lbl in labels)
assert not any("Règles 2" in lbl or "Règles 2" in lbl for lbl in labels)
assert "rul" not in keys
assert not any("Règles" in lbl for lbl in labels)
def test_help_button_opens_help_window(app):

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()