Vai al contenuto

Guida — Amministratore

L'Admin ha accesso completo alla piattaforma: crea altri Admin e Segreteria, configura l'autenticazione, gestisce le edizioni e supervisiona tutto il sistema.

L'Admin deve configurare l'autenticazione a due fattori (MFA) al primo accesso.


Home page e lista utenti

Home Admin

Da Gestione → Utenti l'Admin vede tutti gli utenti inclusi gli altri Admin.

Lista utenti Admin


Pannello Django Admin

Da Gestione → Pannello admin (/admin/) è possibile accedere all'interfaccia Django per operazioni di basso livello su qualsiasi modello del database. Usalo solo per operazioni di emergenza o debug che non sono esposte nell'UI normale.


Configurazione autenticazione a due fattori (MFA)

Al primo accesso la piattaforma richiede di configurare un'app authenticator TOTP (Google Authenticator, Aegis, Authy, ecc.).

  1. Scansiona il QR code mostrato con la tua app authenticator.
  2. Inserisci il codice a 6 cifre generato per confermare.
  3. Salva i codici di recupero in un posto sicuro: servono se perdi l'accesso all'app.

La pagina Sicurezza (MFA) nel menu utente (in alto a destra) permette di gestire i dispositivi TOTP e rigenerare i codici di recupero.

Impostazione MFA

Obbligo MFA per Segreteria e Incaricati EG

Per impostazione predefinita la MFA è obbligatoria anche per Segreteria e Incaricati EG. Un Admin può renderla facoltativa in Impostazioni → Sicurezza → MFA obbligatoria per Segreteria e Incaricati EG.

  • Attivato (default): Segreteria e Incaricati EG devono configurare la MFA al primo accesso.
  • Disattivato: Segreteria e Incaricati EG possono accedere senza MFA. Per gli Admin resta sempre obbligatoria.

Opzione MFA Segreteria/IABR

Passkey (accesso senza password)

Oltre al TOTP, è possibile aggiungere una passkey per accedere con Face ID, Touch ID, Windows Hello o una chiave hardware (YubiKey) — senza inserire email e password.

Come aggiungere una passkey:

  1. Accedi normalmente e vai nel menu utente (in alto a destra) → Sicurezza (MFA).
  2. Trovi la sezione Passkey → clicca Aggiungi passkey.
  3. Inserisci un nome per il dispositivo (es. "iPhone 16", "MacBook Pro").
  4. Lascia spuntata l'opzione "Usa come passkey" per poter accedere senza password.
  5. Clicca Registra passkey — il browser apre la procedura di registrazione biometrica: sblocca con impronta, viso o PIN e segui le istruzioni a schermo.

Come accedere con la passkey:

Nella pagina di login compare il pulsante "Accedi con passkey". Cliccandolo il browser propone le passkey registrate — sblocca il dispositivo e accedi direttamente, senza email né password né TOTP.

Gestione passkey:

Da Sicurezza (MFA) → clicca il numero di passkey configurate → apri la lista per: - Rinominare una passkey (icona matita) - Eliminare una passkey non più usata (icona cestino)

Nota: le passkey sono legate al browser/dispositivo su cui vengono create. Prima di cambiare dispositivo, aggiungi una nuova passkey dal vecchio e poi elimina quella obsoleta.


Configurazione autenticazione social (Google, Microsoft, Apple)

Per abilitare i pulsanti "Accedi con Google / Microsoft / Apple" nella pagina di login segui la guida completa: docs/guide/social_auth.md

In sintesi:

  1. Ottieni le credenziali OAuth dal provider (Google Cloud Console, portale Azure, Apple Developer Program) — vedi §4 della guida.
  2. Imposta le variabili d'ambiente nel file .env.prod:
    SOCIAL_GOOGLE_CLIENT_ID=xxxxx.apps.googleusercontent.com
    SOCIAL_GOOGLE_CLIENT_SECRET=GOCSPX-xxxxx
    # Opzionale:
    SOCIAL_MICROSOFT_CLIENT_ID=...
    SOCIAL_MICROSOFT_CLIENT_SECRET=...
    
  3. Aggiorna il record Sites con il dominio di produzione:
    uv run python manage.py shell -c "
    from django.contrib.sites.models import Site
    s = Site.objects.get(pk=1)
    s.domain = 'plancia.agescicampania.org'
    s.name = 'Plancia'
    s.save()
    "
    
  4. Riavvia l'applicazione. I pulsanti social appaiono automaticamente nel login solo se la variabile CLIENT_ID del provider è valorizzata.

Il social login non crea nuovi utenti da solo: l'email del provider deve corrispondere a un account già esistente in piattaforma (creato tramite invito da Segreteria/Admin).


Configurazione Google Drive OAuth

Plancia può caricare automaticamente PDF e file Excel su Google Drive al termine dell'archiviazione di un'edizione. Richiede un'applicazione OAuth separata da quella del social login.

Perché due applicazioni Google OAuth?

Scopo Variabili env Scope richiesti
Social login (accedi con Google) SOCIAL_GOOGLE_CLIENT_ID/SECRET email, profile, openid
Google Drive (upload file) GOOGLE_OAUTH_CLIENT_ID/SECRET drive (lettura/scrittura Drive)

Le due app possono usare lo stesso progetto Google Cloud ma devono avere credenziali OAuth separate perché i permessi (scope) sono diversi.

Passo 1 — Crea le credenziali OAuth per Drive

  1. Vai su console.cloud.google.com → seleziona il progetto già usato per il social login (o creane uno dedicato).
  2. API e serviziLibreria → cerca Google Drive APIAbilita.
  3. API e serviziCredenzialiCrea credenzialiID client OAuth 2.0:
  4. Tipo applicazione: Applicazione web
  5. Nome: Plancia Drive
  6. URI di reindirizzamento autorizzati:
    • Dev: http://localhost:8000/drive/oauth/callback/
    • Produzione: https://plancia.agescicampania.org/drive/oauth/callback/
  7. Copia ID client e Secret client.

Passo 2 — Imposta le variabili d'ambiente

Nel file .env.prod (o .env.dev per il test locale):

GOOGLE_OAUTH_CLIENT_ID=xxxxx.apps.googleusercontent.com
GOOGLE_OAUTH_CLIENT_SECRET=GOCSPX-xxxxx
GOOGLE_OAUTH_REDIRECT_URI=https://plancia.agescicampania.org/drive/oauth/callback/

In dev la redirect URI può essere http:// — la piattaforma imposta automaticamente OAUTHLIB_INSECURE_TRANSPORT=1 solo nel callback di sviluppo.

Passo 3 — Collega un account Drive a un'edizione

Il flusso OAuth Drive non è globale ma per edizione: ogni edizione può usare un account Google Drive diverso.

  1. Vai su Gestione → Elenco edizioni → clicca sull'edizione da configurare.
  2. Nel pannello Google Drive clicca Collega account Drive.
  3. Vieni reindirizzato a Google per autorizzare l'accesso a Drive con l'account Google che contiene le cartelle dell'edizione.
  4. Dopo il consenso torni alla pagina dell'edizione con l'email dell'account collegato.
  5. Usando il folder picker puoi selezionare (o creare) le cartelle:
  6. Cartella allegati: cartella principale dove vengono create le sottocartelle delle foto
  7. Cartella output: cartella principale dove vengono depositate le sottocartelle PDF/Excel
  8. Imposta il formato del nome delle sottocartelle per i diari (vedi sezione successiva).
  9. Clicca Salva e blocca configurazione.

Passo 3b — Formato delle sottocartelle per diario

Per ogni diario viene creata automaticamente una sottocartella univoca dentro la cartella allegati e una dentro la cartella output. Il nome della sottocartella è calcolato dal formato configurato nell'edizione.

Variabili disponibili:

Variabile Contenuto Obbligatoria
{id_univoco} ID numerico del diario (5 cifre, es. 00042) ✅ Sì
{edizione} Anno dell'edizione (es. 2026) No
{nome_gruppo} Nome del gruppo scout No
{nome_zona} Nome della zona No
{nome_reparto} Nome del reparto No
{nome_squadriglia} Nome della squadriglia No
{specialita} Specialità di squadriglia (se compilata) No

Formato di default:

{id_univoco}_{edizione}_{nome_gruppo}_{nome_reparto}_{nome_squadriglia}_{specialita}

Esempio di cartella generata: 00042_2026_Salerno1_Reparto1_Aquile_Campismo

I caratteri non validi (spazi, accenti, simboli) vengono sostituiti automaticamente con underscore al momento della creazione.

⚠️ Attenzione — configurazione irreversibile: una volta salvate le due cartelle principali e il formato, non è più possibile modificarli. Le sottocartelle vengono create automaticamente la prima volta che viene caricata una foto o generato un PDF per ciascun diario. Verifica attentamente i valori prima di salvare.

La pagina mostra un'anteprima live del nome che verrebbe generato e, sotto ciascun ID cartella, il nome reale su Drive come link cliccabile.

Passo 4 — Test dell'upload

Dopo aver collegato l'account, puoi verificare il funzionamento generando un PDF di prova da un diario completato e controllando che compaia nella cartella Drive configurata.

Note di sicurezza

  • Le credenziali OAuth Drive (access token + refresh token) sono memorizzate nella tabella storage_drive_drivecredenziali del database. Il database è cifrato a riposo in produzione.
  • Un refresh token scade se l'app Google non viene usata per 6 mesi o se l'utente revoca l'accesso dal proprio account Google. In quel caso basta ripetere il flusso di collegamento (passo 3).
  • Lo scope richiesto è https://www.googleapis.com/auth/drive (accesso completo al Drive dell'account autorizzato). Considera di usare un account Google dedicato (es. archivio@agescicampania.it) per limitare l'esposizione dei file personali.

Pagina Impostazioni

La pagina Impostazioni (/impostazioni/) è divisa in sezioni indipendenti, ognuna con il proprio pulsante Salva. Un errore in una sezione non blocca il salvataggio delle altre.

Impostazioni piattaforma

Sezione Contenuto
Identità Titolo e sottotitolo della piattaforma
Footer Testo HTML del footer (supporta {{ titolo }}, {{ versione }}, {{ commit }}); link laterali
Posta elettronica Modalità invio, backend SMTP / provider transazionale, Gmail OAuth2, test invio
Sicurezza MFA, protezione brute-force (axes)
Allegati Dimensione massima immagini in upload
Diagnostica Manutenzione, debug-toolbar; link rapidi a Flower e Mailpit
IP bloccati Lista IP bloccati da django-axes con sblocco singolo o massivo
Strumenti Link a Cache PDF (/impostazioni/cache-pdf/) e Log export (/impostazioni/log-export/)
Import tracciati Carica CSV Co.Ca. / Squadriglie / Ragazzi; storico import
Pagine legali Modifica Privacy Policy e Condizioni del Servizio; carica contenuto predefinito
Template email Visualizza e personalizza i template delle email automatiche

Sezione Posta elettronica

Impostazioni email

  • Nome mittente: testo visualizzato come mittente (es. "Plancia AGESCI Campania"). Combinato con il campo Mittente (from) produce il formato Nome <email@dominio.it>.
  • Modalità invio: Invio reale, Simulato, Simulato + invio reale, Mailpit. In modalità Simulato + invio reale le email vengono scritte sia su file che inviate davvero — utile per testare in produzione senza rischiare.
  • Test SMTP / Test provider transazionale: invia un'email di prova alla tua casella usando il rispettivo backend (ignora la modalità simulato).
  • Gmail OAuth2: se collegato, i campi SMTP manuali vengono nascosti e sostituiti dall'autenticazione OAuth2.

Sezione Sicurezza

Impostazioni sicurezza

  • Tentativi prima del blocco (default 5): dopo quanti tentativi falliti l'IP viene bloccato.
  • Minuti di blocco automatico (default 10): il blocco si scioglie automaticamente. 0 = blocco permanente fino allo sblocco manuale.
  • Scadenza tentativi (default attivo): i tentativi falliti scadono dopo il periodo di blocco e non vengono più conteggiati.
  • IP bloccati: lista degli IP attualmente bloccati con possibilità di sblocco singolo o massivo.

Sezione Allegati

Impostazioni allegati

  • Dimensione massima immagini: lato maggiore in pixel. Al caricamento, le immagini più grandi vengono ridimensionate e salvate come JPEG quality 85. Il valore si applica agli allegati, non alle immagini nel footer o nei template email.

Cache PDF e generazione massiva

Da Gestione → Cache PDF (o dal link in Impostazioni → Strumenti) è possibile:

Cache PDF

  • Lista PDF in cache: per ogni edizione vengono mostrati i PDF già generati e caricati su Drive, con dimensione e data di caricamento.
  • Invalidazione singola: elimina il PDF di una squadriglia dalla cache (il prossimo PDF sarà rigenerato).
  • Invalidazione per edizione o totale: svuota la cache di un'edizione o di tutte.
  • Generazione massiva: avvia un task Celery che genera i PDF di tutti i diari inviati dell'edizione selezionata, li carica su Drive e invia aggiornamenti via email ogni 10 diari. Durante la generazione i PDF singoli per quella edizione sono disabilitati.
  • Interrompi: ferma ordinatamente una generazione massiva in corso. Il task completa il diario corrente e poi si arresta; il log riporta "Interrotta" con il conteggio parziale.

Durante una generazione massiva attiva il selettore mostra "(generazione in corso…)" e l'opzione è disabilitata per evitare doppie esecuzioni. Il lock viene rilasciato automaticamente al termine o dopo 2 ore.

Log generazione PDF/Excel

Da Gestione → Log export (o dal link in Impostazioni → Strumenti) è disponibile lo storico completo dei task di generazione PDF e Excel:

Log export

  • Stato del task (completato / errore), tipo di export, data e richiedente.
  • Per i task in errore: traceback completo apribile in un modale.
  • I task di generazione massiva vengono registrati con il tipo PDF massivo — Edizione XXXX.
  • Gli errori generano automaticamente una notifica email al richiedente e agli Admin.

Strumenti di sviluppo nel menu Gestione

Il menu Gestione (in alto a destra, visibile a tutto lo staff) contiene la sezione Strumenti di sviluppo con accesso diretto a:

Menu Gestione con Strumenti

  • Flower (/celery/): dashboard Celery con task attivi, coda, worker e cronologia.
  • Mailpit (/mailadmin/): web UI per le email di debug in sviluppo/staging.

Flower deve essere avviato con il profilo opzionale:

COMPOSE_PROFILES=flower docker compose --env-file .env.prod up -d


Configurazione email: dual-backend e Gmail OAuth2 SMTP

Plancia supporta due backend email indipendenti: SMTP (anche Gmail via OAuth2) e provider transazionale (Brevo, Mailgun, ecc.). I due backend vengono usati automaticamente in base al tipo di invio, oppure puoi sceglierli manualmente prima di ogni invio bulk.

Guida completa: docs/guide/email_provider.md

Routing automatico

Tipo di invio Backend predefinito
Email di sistema (password reset, MFA, notifiche) SMTP
Inviti bulk Capi Reparto / Capi Squadriglia Provider transazionale

Modificabile in Impostazioni → Posta elettronica → campi Backend email standard e Backend invii massivi.

Gmail OAuth2 SMTP

Se usi Gmail come SMTP, configura l'autenticazione OAuth2 invece di username e password.

Setup rapido:

  1. Nelle credenziali OAuth del tuo progetto Google Cloud (stesse usate per il Drive), aggiungi il redirect URI: https://plancia.agescicampania.org/impostazioni/gmail-smtp/oauth/callback/

  2. In .env.prod aggiungi:

    GOOGLE_GMAIL_SMTP_REDIRECT_URI=https://plancia.agescicampania.org/impostazioni/gmail-smtp/oauth/callback/
    

  3. In Impostazioni → Posta elettronica → Backend SMTP → clicca Collega Gmail → autorizza l'account Google da cui vuoi inviare.

Il token di accesso viene rinnovato automaticamente. Puoi scollegare l'account in qualsiasi momento.

Vedi la guida completa per i dettagli su Gmail API, verifica dell'app e revoca.


Archiviazione di un'edizione

Al termine dell'edizione:

# Genera PDF di tutti i diari + Excel esiti e carica su Drive
uv run python manage.py archivia_edizione --edizione 1 --genera

# (Dopo verifica) elimina le foto, marca l'edizione archiviata
uv run python manage.py archivia_edizione --edizione 1 --purga --conferma

Il comando --purga elimina fisicamente le foto caricate (trattamento dati minori) mantenendo i link esterni come testo. I PDF e l'Excel rimangono su Drive.


Backup

Il backup notturno è configurato via cron (vedi deploy/crontab.example):

30 2 * * *  cd /srv/plancia && ./deploy/backup.sh >> /var/log/plancia_backup.log 2>&1

Il backup include dump PostgreSQL + archivio media/log con retention 30 giorni.


Cambio referenti dei diari

L'Admin ha accesso alle stesse funzionalità di cambio referenti descritte nella Guida Segreteria:

  • Cambia Capo Reparto sul singolo diario (dalla pagina di dettaglio)
  • Cambia Capo Reparto in bulk per un intero reparto (dalla lista diari)

In aggiunta, l'Admin può sempre accedere al pannello Django Admin per modifiche di emergenza su qualsiasi diario indipendentemente dallo stato.


Crea utente staff

Da Gestione → Persone → Crea utente staff Admin e Segreteria possono creare direttamente utenti con ruolo Admin, Segreteria o Incaricato EG senza passare per il codice socio AGESCI. Questa funzione è pensata per i gestori della piattaforma che non sono necessariamente soci registrati.

Crea utente staff

Il form richiede: nome, cognome, email e ruolo. Al salvataggio viene inviata automaticamente un'email di reset password all'indirizzo indicato, consentendo all'utente di impostare la propria password al primo accesso.

Solo gli Admin possono creare altri Admin. La Segreteria può creare Segreteria e Incaricati EG.


Pagine legali

Da Impostazioni → Pagine legali è possibile modificare i contenuti di Privacy Policy (/privacy/) e Condizioni del Servizio (/termini/).

Pagine legali

Per ogni pagina sono disponibili tre azioni: - Apri (icona esterna): visualizza la pagina pubblica in una nuova scheda. - Predefinito: carica il testo di base fornito dalla piattaforma (con confirm di sovrascrittura). Il testo predefinito è pensato come punto di partenza per la Privacy Policy GDPR e le Condizioni del Servizio dell'AGESCI Campania — personalizzalo prima di pubblicarlo. - Modifica: apre l'editor HTML per personalizzare il contenuto.


Gestione Inviti e primo accesso utenti

L'Admin ha accesso alla pagina Gestione Inviti (stessa della Segreteria). Vedi la sezione corrispondente nella Guida Segreteria per il dettaglio del flusso inviti Capi Reparto e Capi Squadriglia.


Impersonazione

L'Admin può impersonare qualsiasi utente compresa la Segreteria. Ogni impersonazione viene registrata nel log di audit. La Segreteria non può impersonare l'Admin.