Skip to content
Alfio Emanuele edited this page Nov 22, 2015 · 4 revisions

Questa pagina raccoglie una serie di Mixin. I Mixin sono delle estensioni che possono essere applicate ai modelli per aggiungere delle funzionalità.

Applicare un Mixin

Per applicare il Mixin, aggiungere il nome della classe del Mixin tra parentesi. Questo estenderà la classe.

class Attivita(ModelloSemplice, ConCommenti)
  # ...

Dopo aver applicato un Mixin ad una classe, sarà necessario creare una migrazione ed applicarla, come per ogni altra modifica ai modelli.

python3 manage.py makemigrations
python3 manage.py migrate

ConGeolocalizzazione

Questo Mixin aggiunge una posizione opzionale geografica e fornisce dei metodi per facilitarne l'individuazione a partire da un indirizzo, sfruttando il servizio esposto dalle Google Maps API.

Vedi Locazione per maggiori informazioni.

  • Metodi
    • imposta_locazione(indirizzo), imposta la locazione a partire da una stringa contenente un indirizzo inserito da un utente (già presente o da ricercare su Google Maps). Vedi Locazione.
  • Proprieta
    • locazione, oggetto Locazione o None se non localizzato

ConCommenti

Questo Mixin rende il modello commentabile, ed aggiunge una proprietà che permette di accedere rapidamente ad un elenco di commenti.

Vedi Commenti per maggiori informazioni e per come inserire commenti.

  • Proprieta
    • commenti, il QuerySet di commenti (Commento) per l'oggetto

ConDelegati

Questo Mixin rende il modello associabile a delle deleghe.

Vedi Deleghe per maggiori informazioni e per come inserire e modificare le deleghe.

  • Proprieta
    • deleghe (QuerySet<Delega>), il QuerySet di deleghe, anche passate, per l'oggetto
    • deleghe_attuali (QuerySet<Delega>), il QuerySet di deleghe (Delega) temporalmente valide per l'oggetto
    • delegati (QuerySet<Persona>), il QuerySet di tutti i delegati (Persona), anche passati, per l'oggetto
    • delegati_attuali (QuerySet<Persona>), il QuerySet di tutti i delegati (Persona) temporalmente validi per l'oggetto

ConMarcaTemporale

Questo Mixin aggiunge le marche temporali automatiche per la creazione e l'ultima modifica.

  • Proprieta
    • creazione (DateTime), data e ora automatiche di creazione dell'oggetto
    • ultima_modifica (DateTime), data e ora automatiche di ultima modifica

ConAllegati

Questo Mixin aggiunge la possibilità di aggiungere allegati.

  • Proprieta
    • allegati (QuerySet<Allegato>), elenco degli allegati al file

ConAutorizzazioni

Questo Mixin aggiunge la possibilità di aggiungere autorizzazioni. Questo Mixin viene usato dagli oggetti che rappresentano delle richieste che devono essere approvate da una o piu' persone.

  • Proprieta
    • confermata (bool, sola lettura) controlla se le autorizzazioni sono state confermate o meno (NON USARE)

Chiedere autorizzazione

Per richiedere autorizzazione, usare il metodo:

ConAutorizzazioni.autorizzazione_richiedi(
  richiedente,
  destinatario=((RUOLO, OGGETTO), ...),
  motivo_obbligatorio=true,
)

Dove:

  • richiedente e' una Persona che effettua la richiesta, che viene autorizzato,
  • destinatario e' una tupla che contiene una o piu' tuple del tipo (RUOLO, OGGETTO, NOTIFICA), che rappresentano i destinatari che possono accettare questa richiesta:
    • RUOLO e' un tipo di delega, es: PRESIDENTE, REFERENTE,
    • OGGETTO e' l'oggetto di destinazione, es: il comitato di presidenza o l'attivita di referenza.
    • NOTIFICA (opzionale) qualora inviare la richiesta via e-mail o meno. Uno tra NOTIFICA_INVIA e NOTIFICA_NON_INVIARE. Se non specificato, assunto NOTIFICA_NON_INVIARE,
  • motivo_obbligatorio indica qualora sia necessario indicare una motivazione per negare questa autorizzazione.

Esempio:

Partecipazione.autorizzazione_richiedi(
  richiedente=me,
  destinatario=(PRESIDENTE, comitato, NOTIFICA_INVIA),
  motivo_obbligatorio=false,
)

Qualora due figure possano accettare la stessa richiesta, indistintamente, si possono elencare i destinatari in questo modo:

# Questa partecipazione deve essere autorizzata
# dal presidente OPPURE dal REFERENTE
Partecipazione.autorizzazione_richiedi(
  richiedente=me,
  destinatario=(
    (PRESIDENTE, comitato, NOTIFICA_NON_INVIARE),
    (REFERENTE, attivita, NOTIFICA_INVIA)
  )
  motivo_obbligatorio=false,
)

Qualora siano obbligatorie due autorizzazioni da figure diverse, e' possibile chiamare piu' volte autorizzazione_richiedi, in questo modo:

# Questa partecipazione deve essere autorizzata
# SIA DA (1) CHE DA (2)

# 1) dal presidente del mio comitato
Partecipazione.autorizzazione_richiedi(
  richiedente=me,
  destinatario=(
    (PRESIDENTE, comitato_mio, NOTIFICA_INVIA),
  )
  motivo_obbligatorio=false,
)

# 2) dal presidente dell'altro comitato
Partecipazione.autorizzazione_richiedi(
  richiedente=me,
  destinatario=(
    (PRESIDENTE, comitato_mio, NOTIFICA_INVIA),
  )
  motivo_obbligatorio=false,
)

Controllare esito autorizzazione

Usare ConAutorizzazioni.esito per controllare l'esito della richiesta.

L'esito puo' essere uno dei seguenti:

  • ConAutorizzazioni.ESITO_OK: Tutte le autorizzazioni concesse
  • ConAutorizzazioni.ESITO_OK: Nessuna autorizzazione richiesta (!)
  • ConAutorizzazioni.ESITO_RITIRATA: Richiesta ritirata
  • ConAutorizzazioni.ESITO_PENDING: Richieste in attesa
  • ConAutorizzazioni.ESITO_NO: Una o piu' autt. non concesse

Ritirare le richieste di aut.

Chiamare il metodo:

ConAutorizzazioni.autorizzazioni_ritira()

Callback autorizzazione

E' possibile sovrascrivere i seguenti metodi per eseguire azioni non appena l'esito della richiesta cambia.

Seguono le firme delle funzioni.

Tutte le autorizzazioni sono state approvate

  def autorizzazione_concessa(self, modulo=None):
    # Cosa fare in caso di autorizzazione concessa.
    # Se specificato, modulo contiene una istanza di modulo validato.

    # es. prosegui pratica e informa volontario che la richiesta e' andata a buon fine.
    pass

Autorizzazione negata

  def autorizzazione_negata(self, motivo=None):
    # Cosa fare in caso di autorizzazione negata.
    # motivo puo' contenere la motivazione della negazione.

    # es. informa il volontario che la sua richiesta non e' andata a buon fine.
    pass

Disabilitare notifiche e-mail

Il comportamento standard del sistema di autorizzazione e' di mandare i seguenti messaggi di notifica, al richiedente:

  • Quando viene concessa una richiesta,
  • Quando viene negata una richiesta. E' possibile modificare il comportamento delle notifiche, globalmente o individualmente, sovrascrivendo gli attributi:
  INVIA_NOTIFICHE = False  # Disattiva globalmente
  
  # ... oppure una sola tra ...
  INVIA_NOTIFICHE_CONCESSA = False
  INVIA_NOTIFICHE_NEGATA = False

Campi aggiuntivi per concessione

In alcuni casi, e' necessario richiedere la compilazione di alcuni campi aggiuntivi per permettere l'approvazione della richiesta. Ad esempio, per accettare una richiesta di estensione, e' necessario inserire numero e data di protocollo per la richiesta.

E' possibile definire un modulo, che estenda forms.Form, che si vuole fare riempire. Quindi, sovrascrivere il metodo ConAutorizzazioni.autorizzazione_concessa_modulo in modo tale che ritorni la classe (e NON una istanza) del modulo.

Ad esempio, creando il modulo ModuloConcediEstensione, si puo' quindi definire il seguente metodo:

  def autorizzazione_concessa_modulo(self):
    from base.forms import ModuloConcediEstensione
    return ModuloConcediEstensione

Nel caso la richiesta venga accetatta, sara' possibile ottenere i dati compilati dal modulo validato all'interno del corpo del metodo autorizzazione_concessa, attraverso il parametro modulo.

Filtrare per stato

Per trovare tutti gli oggetti sulla base dello stato dell'autorizzazione, si puo' usare il metodo:

@classmethod
ConAutorizzazioni.con_esito(
  esito=ConAutorizzazioni.ESITO_OK
)

es.:

print "Sono state approvate %d richieste di partecipazione" % \
  (Partecipazione.con_esito(Partecipazione.ESITO_OK).count(), )