Checkpoint refactor moduli/accessi - 2026-08-02¶
Contesto operativo¶
- Progetto: SafeOps in
/home/safeops/safeops. - Ambiente in produzione: evitare restart salvo richiesta esplicita.
- Host funzionante per la console:
https://netopen.nxt-sense.eu/moduli-accessi/. https://safeops.nxt-sense.eu/module-access-console/non e' il riferimento corretto per questa console.
Stato implementato¶
Console Moduli e Accessi¶
File principali:
app/modules/iam/module_access_console.pyapp/templates/safeops/module_access_console.html- registrazione in
app/__init__.py - menu key in
app/modules/iam/menu_keys.py - documentazione operativa in
docs/operativo/console_moduli_accessi.md, indicizzata inmkdocs.ymledocs/operativo/index.md
File nuovi/non tracciati da includere nel consolidamento:
app/modules/iam/menu_quarantine.pyapp/modules/multitenancy/theme_console.pyapp/templates/safeops/tenant_theme_console.htmltests/test_tenant_theme_console.py
Funzioni disponibili:
- Route
/moduli-accessi/. - Accesso limitato a platform/super admin su host admin o
netopen.nxt-sense.eu. - Selezione tenant.
- Pannelli collassabili con
Apri tutti/Chiudi tutti. - Moduli tenant: attiva, read-only, disattiva.
- Servizi/canoni: sola lettura.
- Policy menu per ruolo, gruppo, utente.
- Toggle policy attiva/spenta.
- Anteprima menu effettivo per utente.
- Permessi FAB view per ruolo, sola lettura.
- Sezione voci da normalizzare.
Refactor gia' fatto:
- Helper
_clean_lower(),_clean_text()e_clean_positive_int(). - Helper
_empty_module_row()per ridurre duplicazione sulle righe modulo. - Helper
_catalog_module_row()e_apply_entitlement_row()per separare trasformazione righe modulo da query DB. - Helper
_service_row(),_service_is_active()e_service_price()per separare calcolo canoni da query DB. - Helper
_menu_preview_row()per separare risoluzione menu key e decisione policy dalla costruzione report. - Helper
_problematic_menu_all_entries()e_problematic_menu_stats()per distinguere totale reale e righe renderizzate in Voci da Normalizzare. - Paginazione client su Voci da Normalizzare: backend prudente fino a 500 righe renderizzate, UI a 25 righe per pagina con filtro integrato.
- Paginazione client su Menu Effettivo: backend prudente fino a 500 righe renderizzate, UI a 25 righe per pagina con filtro integrato.
- Paginazione client su Permessi View: UI a 25 righe per pagina con filtro integrato.
- Paginazione client sulle tabelle Policy Menu per ruolo, gruppo e utente: UI a 25 righe per pagina con filtro integrato.
- Paginazione client su Moduli Tenant e Servizi/Canoni: UI a 25 righe per pagina con filtro integrato.
- Macro template comuni
paginated_filterepagination_controlsper evitare duplicazione nei pannelli tabellari paginati. - Page size tabellare centralizzato nel template con
mac_table_page_size. - JavaScript inline della console riorganizzato in initializer nominati per form policy, tabelle paginate, filtri e pannelli collapsible.
- Upsert policy menu rifattorizzato con helper comuni per modello, campo soggetto e creazione riga su scope ruolo/gruppo/utente.
- Lettura righe Policy Menu accorpata in helper per scope, mantenendo wrapper separati per ruolo/gruppo/utente.
- Composizione context template semplificata: il context menu preview viene fuso direttamente nel context finale della console.
- Registro
menu_quarantine.pyper quarantena/cestino menu legacy: le CRUD tecnichePolicy Menu,Policy Menu (Gruppi)ePolicy Menu (Utenti)sono nascoste dal menu ma restano raggiungibili via URL. - Pannello Cestino Menu/View nella console per rendere visibili le voci legacy nascoste e la sostituzione operativa.
- Console Tema Tenant su
/tema-tenant/: modifica guidata dei campi brandingtenant_registry, preview, validazione locale colori/contrasto e verifica AI non vincolante. - Guard route-level su Tema Tenant: anonimo rediretto a login, utente non autorizzato
403, host console richiesto;/tema-tenantviene normalizzato su/tema-tenant/. - Dropzone logo su Tema Tenant: upload PNG/JPG/WebP fino a 2 MB in
/static/tenant-logos/, preview immediata lato client e stato Elaborazione... durante il salvataggio. - Guardrail logo: controllo locale su formato/peso/dimensioni/proporzioni e verifica AI vision per bloccare immagini non-logo, foto, screenshot, documenti o contenuti non adatti.
- Helper
_role_choice_values(),_group_choice_row(),_user_choice_row()e_menu_label_options_from_rows()per separare normalizzazione liste UI da query DB. - Helper
_empty_policy_summary(),_policy_count_from_row()e_active_policy_count()per separare il riepilogo policy da query/fallback. - Helper
_module_update_note()e_module_update_success_message()per separare note audit e messaggi POST modulo. - Helper
_policy_update_success_message()per mantenere coerenti i messaggi POST policy. - Validazione soggetti policy:
- ruolo deve esistere o essere
*; - gruppo deve esistere;
- utente deve esistere ed essere attivo.
- Guardrail toggle policy: si puo' agire solo su righe globali
*o del tenant selezionato. - Macro unica
policy_table()per le tre tabelle policy ruolo/gruppo/utente. - POST della console mantengono
permission_roleepreview_user_idnel redirect. - Helper
_login_next_url()e_canonical_console_url()per centralizzare redirect login/canonical slash. - Pulsante
Torna a menel blocco Menu Effettivo quando si sta simulando un altro utente. - Helper
_all_tables_exist()e_query_tenant_policy_rows()per ridurre duplicazione nelle query policy. _console_template_context()separato in contesto statico, scelte/select e dati tenant.- Helper form POST
_validated_module_action(),_validated_policy_decision(),_form_policy_scope()e_validated_policy_subject()per mantenere sottili le action della view. - Helper
_form_policy_id()e uso coerente di_clean_positive_int()su preview utente, policy toggle e query policy utente/gruppo. - Helper
_menu_policy_form_payload()e_toggle_policy_form_payload()per centralizzare i payload POST policy. - Normalizzazioni residue allineate agli helper
_clean_text()/_clean_lower()su tenant choices, note modulo, stato servizi, ruolo selezionato, resolver menu e label fallback. - Test unitari puri in
tests/test_module_access_console.pyper normalizzazione, ID positivi, righe modulo catalogo/entitlement, calcolo servizi/canoni, liste scelta UI ruolo/gruppo/utente/menu label, riepilogo policy, check tabelle, selezione tenant, scope policy, soggetti policy ruolo/gruppo/utente, helper modello/campo/riga policy per scope, query righe policy per scope, policy id da form, payload POST policy, note/messaggi POST modulo/policy, composizione context template, registro quarantena menu legacy, redirect login/canonical slash, voci menu problematiche con totale/limite/paginazione, Menu Effettivo con totale/limite/paginazione, Permessi View paginati, tabelle Policy Menu paginate, Moduli Tenant e Servizi/Canoni paginati, macro template filtro/paginazione, initializer JS console, contesto redirect post-action, redirect console, mapping/validazione action POST, boolean form, scope form, riga/report menu preview, flatten albero menu AppBuilder, selezione ruolo/utente simulato e lookup utente preview con fallback. - Test unitari in
tests/test_tenant_theme_console.pyper normalizzazione/validazione tema tenant, contrasto colori, guard accessi, redirect canonico, upload logo e markup della console tema/AI.
Ultime validazioni eseguite:
python -m py_compile app/modules/iam/module_access_console.py app/modules/documentale/views.py app/__init__.py app/modules/iam/menu_keys.py
python - <<'PY'
from pathlib import Path
from jinja2 import Environment
for path in [
Path('app/templates/safeops/module_access_console.html'),
Path('app/templates/appbuilder/custom/template_tables_admin.html'),
]:
Environment().parse(path.read_text())
print(f'OK {path}')
PY
git diff --check -- app/modules/iam/module_access_console.py app/templates/safeops/module_access_console.html app/modules/documentale/views.py app/templates/appbuilder/custom/template_tables_admin.html app/__init__.py app/modules/iam/menu_keys.py
pytest -q tests/test_module_access_console.py
Ultimo restart richiesto dall'utente:
safeops-web.serviceriavviato e verificatoactive./moduli-accessi/risponde302verso login./tabelle-template/risponde302verso login./tema-tenantrisponde302verso login./tema-tenant/risponde302verso login.
Nota: dopo il refactor helper query policy, la semplificazione del contesto console e il refactor helper POST e' stato fatto restart web su richiesta utente.
Tabelle Template¶
File principali:
app/modules/documentale/views.pyapp/templates/appbuilder/custom/template_tables_admin.html- registrazione no-menu in
app/__init__.py - menu key in
app/modules/iam/menu_keys.py
Route:
/tabelle-template/
Stato:
- View no-menu per gestire lookup template.
- Whitelist iniziale:
risk_categoriesrisk_levels- Tabella fisica:
legacy_dynamic_template_lookup. - Scope reale dati: per template, non per tenant.
- Chiave effettiva:
legacy_model_id + table_code + value. - Il tenant nella UI e' solo contesto accesso, non filtro dati.
- Aggiunto controllo duplicati prima della write.
- V3 legge
risk_categoriesda lookup per template, con fallback aras_basee default.
Guardrail importante:
- Non aggiungere
tenant_keyalla lookup senza migrazione DB esplicita. - Non implementare filtro tenant reale su
legacy_dynamic_template_lookupnello stato attuale.
Prossimi passi consigliati¶
- Verificare UI su
/moduli-accessi/: - simulazione utente;
- pulsante
Torna a me; - redirect dopo attiva/disattiva modulo;
- redirect dopo policy mostra/nascondi.
- Consolidare le modifiche della console in un commit o checkpoint di rilascio, includendo anche i file nuovi/non tracciati elencati sopra.
- Coordinarsi con gli altri agent prima di includere nel commit i file V3/mobile, per evitare di mischiare blocchi funzionali diversi.
- Valutare solo in un secondo momento la separazione di un servizio backend dalla view FAB; non e' necessario per il comportamento attuale della console.
Avvertenze workspace¶
- Workspace molto sporco per lavoro parallelo di piu' agent.
- Non revertire modifiche non proprie.
- Parte dei file principali della console e della documentazione risulta modificata; i file nuovi/non tracciati vanno aggiunti esplicitamente in fase di commit.