Vai al contenuto

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.py
  • app/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 in mkdocs.yml e docs/operativo/index.md

File nuovi/non tracciati da includere nel consolidamento:

  • app/modules/iam/menu_quarantine.py
  • app/modules/multitenancy/theme_console.py
  • app/templates/safeops/tenant_theme_console.html
  • tests/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_filter e pagination_controls per 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.py per quarantena/cestino menu legacy: le CRUD tecniche Policy Menu, Policy Menu (Gruppi) e Policy 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 branding tenant_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-tenant viene 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_role e preview_user_id nel redirect.
  • Helper _login_next_url() e _canonical_console_url() per centralizzare redirect login/canonical slash.
  • Pulsante Torna a me nel 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.py per 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.py per 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.service riavviato e verificato active.
  • /moduli-accessi/ risponde 302 verso login.
  • /tabelle-template/ risponde 302 verso login.
  • /tema-tenant risponde 302 verso login.
  • /tema-tenant/ risponde 302 verso 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.py
  • app/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_categories
  • risk_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_categories da lookup per template, con fallback a ras_base e default.

Guardrail importante:

  • Non aggiungere tenant_key alla lookup senza migrazione DB esplicita.
  • Non implementare filtro tenant reale su legacy_dynamic_template_lookup nello stato attuale.

Prossimi passi consigliati

  1. Verificare UI su /moduli-accessi/:
  2. simulazione utente;
  3. pulsante Torna a me;
  4. redirect dopo attiva/disattiva modulo;
  5. redirect dopo policy mostra/nascondi.
  6. Consolidare le modifiche della console in un commit o checkpoint di rilascio, includendo anche i file nuovi/non tracciati elencati sopra.
  7. Coordinarsi con gli altri agent prima di includere nel commit i file V3/mobile, per evitare di mischiare blocchi funzionali diversi.
  8. 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.