Exemple #1
0
def aspirante_corso_base_iscritti_cancella(request, me, pk, iscritto):
    corso = get_object_or_404(CorsoBase, pk=pk)
    if not me.permessi_almeno(corso, MODIFICA):
        return redirect(ERRORE_PERMESSI)

    if not corso.possibile_cancellare_iscritti:
        return errore_generico(request, me, titolo="Impossibile cancellare iscritti",
                               messaggio="Non si possono cancellare iscritti a questo "
                                         "stadio della vita del corso base.",
                               torna_titolo="Torna al corso base", torna_url=corso.url_iscritti)

    try:
        persona = Persona.objects.get(pk=iscritto)
    except Persona.DoesNotExist:
        return errore_generico(request, me, titolo="Impossibile cancellare iscritto",
                               messaggio="La persona cercata non è iscritta.",
                               torna_titolo="Torna al corso base", torna_url=corso.url_iscritti)
    if request.method == 'POST':
        for partecipazione in corso.partecipazioni_confermate_o_in_attesa().filter(persona=persona):
            partecipazione.disiscrivi(mittente=me)
        for partecipazione in corso.inviti_confermati_o_in_attesa().filter(persona=persona):
            partecipazione.disiscrivi(mittente=me)
        return messaggio_generico(request, me, titolo="Iscritto cancellato",
                                  messaggio="{} è stato cancellato dal corso {}.".format(persona, corso),
                                  torna_titolo="Torna al corso base", torna_url=corso.url_iscritti)
    contesto = {
        "corso": corso,
        "puo_modificare": True,
        "persona": persona,
    }
    return 'aspirante_corso_base_scheda_iscritti_cancella.html', contesto
Exemple #2
0
def pdf(request, me, app_label, model, pk):
    oggetto = apps.get_model(app_label, model)
    oggetto = oggetto.objects.get(pk=pk)
    if not isinstance(oggetto, ConPDF):
        return errore_generico(
            request,
            None,
            messaggio="Impossibile generare un PDF per il tipo specificato.")

    if 'token' in request.GET:
        if not oggetto.token_valida(request.GET['token']):
            return errore_generico(request,
                                   me,
                                   titolo="Token scaduta",
                                   messaggio="Il link usato è scaduto.")

    elif not me.permessi_almeno(oggetto, LETTURA):
        return redirect(ERRORE_PERMESSI)

    pdf = oggetto.genera_pdf()

    # Se sto scaricando un tesserino, forza lo scaricamento.
    if 'tesserini' in pdf.file.path:
        return pdf_forza_scaricamento(request, pdf)

    return redirect(pdf.download_url)
Exemple #3
0
def aspirante_corso_base_attiva(request, me, pk):
    corso = get_object_or_404(CorsoBase, pk=pk)
    if not me.permessi_almeno(corso, MODIFICA):
        return redirect(ERRORE_PERMESSI)
    if corso.stato != corso.PREPARAZIONE:
        return messaggio_generico(
            request,
            me,
            titolo="Il corso è già attivo",
            messaggio="Non puoi attivare un corso già attivo",
            torna_titolo="Torna al Corso",
            torna_url=corso.url)
    if not corso.attivabile():
        return errore_generico(
            request,
            me,
            titolo="Impossibile attivare questo corso",
            messaggio="Non sono soddisfatti tutti i criteri di attivazione. "
            "Torna alla pagina del corso e verifica che tutti i "
            "criteri siano stati soddisfatti prima di attivare un "
            "nuovo corso.",
            torna_titolo="Torna al Corso",
            torna_url=corso.url)

    if corso.data_inizio < poco_fa():
        return errore_generico(
            request,
            me,
            titolo="Impossibile attivare un corso già iniziato",
            messaggio=
            "Siamo spiacenti, ma non possiamo attivare il corso e inviare "
            "le e-mail a tutti gli aspiranti nella zona se il corso è "
            "già iniziato. Ti inviato a verificare i dati del corso.",
            torna_titolo="Torna al Corso",
            torna_url=corso.url)

    corpo = {"corso": corso, "persona": me}
    testo = get_template("email_aspirante_corso_inc_testo.html").render(corpo)

    if request.POST:
        corso.attiva(rispondi_a=me)
        return messaggio_generico(
            request,
            me,
            titolo="Corso attivato con successo",
            messaggio=
            "A breve tutti gli aspiranti nelle vicinanze verranno informati "
            "dell'attivazione di questo corso base.",
            torna_titolo="Torna al Corso",
            torna_url=corso.url)

    contesto = {
        "corso": corso,
        "puo_modificare": True,
        "testo": testo,
    }
    return 'aspirante_corso_base_scheda_attiva.html', contesto
Exemple #4
0
def autorizzazione_concedi(request, me, pk=None):
    """
    Mostra il modulo da compilare per il consenso, ed eventualmente registra l'accettazione.
    """
    richiesta = get_object_or_404(Autorizzazione, pk=pk)

    torna_url = request.session.get('autorizzazioni_torna_url',
                                    default="/autorizzazioni/")

    # Controlla che io possa firmare questa autorizzazione
    if not me.autorizzazioni_in_attesa().filter(pk=richiesta.pk).exists():
        return errore_generico(
            request,
            me,
            titolo="Richiesta non trovata",
            messaggio=
            "E' possibile che la richiesta sia stata già approvata o respinta da qualcun altro.",
            torna_titolo="Richieste in attesa",
            torna_url=torna_url,
        )
    if not PartecipazioneCorsoBase.controlla_richiesta_processabile(richiesta):
        return errore_generico(
            request,
            me,
            titolo="Richiesta non processabile",
            messaggio="Questa richiesta non può essere processata.",
            torna_titolo="Richieste in attesa",
            torna_url=torna_url,
        )

    modulo = None

    # Se la richiesta ha un modulo di consenso
    if richiesta.oggetto.autorizzazione_concedi_modulo():
        if request.POST:
            modulo = richiesta.oggetto.autorizzazione_concedi_modulo()(
                request.POST)

            if modulo.is_valid():
                # Accetta la richiesta con modulo
                richiesta.concedi(me, modulo=modulo)

        else:
            modulo = richiesta.oggetto.autorizzazione_concedi_modulo()()

    else:
        # Accetta la richiesta senza modulo
        richiesta.concedi(me)

    contesto = {
        "modulo": modulo,
        "richiesta": richiesta,
        "torna_url": torna_url,
    }

    return 'base_autorizzazioni_concedi.html', contesto
Exemple #5
0
def autorizzazione_nega(request, me, pk=None):
    """
    Mostra il modulo da compilare per la negazione, ed eventualmente registra la negazione.
    """
    richiesta = get_object_or_404(Autorizzazione, pk=pk)

    torna_url = request.session['autorizzazioni_torna_url']

    # Controlla che io possa firmare questa autorizzazione
    if not me.autorizzazioni_in_attesa().filter(pk=richiesta.pk).exists():
        return errore_generico(request, me,
            titolo="Richiesta non trovata",
            messaggio="E' possibile che la richiesta sia stata già approvata o respinta da qualcun altro.",
            torna_titolo="Richieste in attesa",
            torna_url=torna_url,
        )

    if not PartecipazioneCorsoBase.controlla_richiesta_processabile(richiesta):
        return errore_generico(request, me,
            titolo="Richiesta non processabile",
            messaggio="Questa richiesta non può essere processata.",
            torna_titolo="Richieste in attesa",
            torna_url=torna_url,
        )

    modulo = None

    # Se la richiesta richiede motivazione
    if richiesta.oggetto.autorizzazione_nega_modulo():
        if request.POST:
            modulo = richiesta.oggetto.autorizzazione_nega_modulo()(request.POST)
            if modulo.is_valid():
                # Accetta la richiesta con modulo
                richiesta.nega(me, modulo=modulo)

        else:
            modulo = richiesta.oggetto.autorizzazione_nega_modulo()()

    else:
        # Nega senza modulo
        richiesta.nega(me)

    contesto = {
        "modulo": modulo,
        "richiesta": richiesta,
        "torna_url": request.session['autorizzazioni_torna_url'],
    }

    return 'base_autorizzazioni_nega.html', contesto
Exemple #6
0
def attivita_scheda_cancella(request, me, pk):
    attivita = get_object_or_404(Attivita, pk=pk)
    if not me.permessi_almeno(attivita, COMPLETO):
        return redirect(ERRORE_PERMESSI)

    if not attivita.cancellabile:
        return errore_generico(
            request,
            me,
            titolo="Attività non cancellabile",
            messaggio="Questa attività non può essere cancellata.")

    titolo_messaggio = "Attività cancellata"
    testo_messaggio = "L'attività è stata cancellata con successo."
    if 'cancella-gruppo' in request.path.split('/'):
        try:
            gruppo = Gruppo.objects.get(attivita=attivita)
            gruppo.delete()
            titolo_messaggio = "Attività e gruppo cancellati"
            testo_messaggio = "L'attività e il gruppo associato sono stati cancellati con successo."
        except Gruppo.DoesNotExist:
            testo_messaggio = "L'attività è stata cancellata con successo (non esisteva un gruppo associato a quest'attività)."
    attivita.delete()
    return messaggio_generico(request,
                              me,
                              titolo=titolo_messaggio,
                              messaggio=testo_messaggio,
                              torna_titolo="Gestione attività",
                              torna_url="/attivita/gestisci/")
Exemple #7
0
def attivita_scheda_turni_ritirati(request, me, pk=None, turno_pk=None):

    turno = get_object_or_404(Turno, pk=turno_pk)
    stato = turno.persona(me)

    if stato != turno.TURNO_PRENOTATO_PUOI_RITIRARTI:
        return errore_generico(
            request,
            me,
            titolo="Non puoi ritirare la tua partecipazione",
            messaggio="Una volta che la tua partecipazione è stata confermata, "
            "non puoi più ritirarla da Gaia. Se non puoi presentarti, "
            "scrivi a un referente dell'attività, che potrà valutare "
            "la situazione e rimuoverti dai partecipanti.",
            torna_titolo="Torna al turno",
            torna_url=turno.url)

    partecipazione = Partecipazione.con_esito_pending(turno=turno,
                                                      persona=me).first()
    if not partecipazione:
        raise ValueError(
            "TURNO_PRENOTATO_PUOI_RITIRARTI assegnato, ma nessuna partecipazione"
            "trovata. ")

    partecipazione.autorizzazioni_ritira()
    return messaggio_generico(
        request,
        me,
        titolo="Richiesta ritirata.",
        messaggio="La tua richiesta di partecipazione a questo turno "
        "è stata ritirata con successo.",
        torna_titolo="Torna al turno",
        torna_url=turno.url)
Exemple #8
0
def aspirante_corso_base_ritirati(request, me=None, pk=None):

    corso = get_object_or_404(CorsoBase, pk=pk)
    puoi_partecipare = corso.persona(me)
    if not puoi_partecipare == corso.SEI_ISCRITTO_PUOI_RITIRARTI:
        return errore_generico(
            request,
            me,
            titolo="Non puoi ritirarti da questo corso",
            messaggio="Siamo spiacenti, ma non sembra che tu possa ritirarti "
            "da questo corso per qualche motivo. ",
            torna_titolo="Torna al corso",
            torna_url=corso.url)

    p = PartecipazioneCorsoBase.con_esito_pending(corso=corso,
                                                  persona=me).first()
    p.ritira()

    return messaggio_generico(
        request,
        me,
        titolo="Ti sei ritirato dal corso",
        messaggio="Siamo spiacenti che hai deciso di ritirarti da questo corso. "
        "La tua partecipazione è stata ritirata correttamente. "
        "Non esitare a iscriverti a questo o un altro corso, nel caso cambiassi idea.",
        torna_titolo="Torna alla pagina del corso",
        torna_url=corso.url)
Exemple #9
0
def aspirante_corso_base_iscriviti(request, me=None, pk=None):

    corso = get_object_or_404(CorsoBase, pk=pk)
    puoi_partecipare = corso.persona(me)
    if not puoi_partecipare in corso.PUOI_ISCRIVERTI:
        return errore_generico(
            request,
            me,
            titolo="Non puoi partecipare a questo corso",
            messaggio="Siamo spiacenti, ma non sembra che tu possa partecipare "
            "a questo corso per qualche motivo. ",
            torna_titolo="Torna al corso",
            torna_url=corso.url)

    p = PartecipazioneCorsoBase(persona=me, corso=corso)
    p.save()
    p.richiedi()
    return messaggio_generico(
        request,
        me,
        titolo="Sei iscritto al corso base",
        messaggio="Complimenti! Abbiamo inoltrato la tua richiesta al direttore "
        "del corso, che ti contatterà appena possibile.",
        torna_titolo="Torna al corso",
        torna_url=corso.url)
Exemple #10
0
def attivita_scheda_turni_rimuovi(request, me, pk=None, turno_pk=None, partecipante_pk=None):

    turno = get_object_or_404(Turno, pk=turno_pk)
    stato = turno.persona(me)

    if stato != turno.TURNO_PRENOTATO_PUOI_RITIRARTI:
        return errore_generico(request, me, titolo="Non puoi ritirare la tua partecipazione",
                               messaggio="Una volta che la tua partecipazione è stata confermata, "
                                         "non puoi più ritirarla da Gaia. Se non puoi presentarti, "
                                         "scrivi a un referente dell'attività, che potrà valutare "
                                         "la situazione e rimuoverti dai partecipanti.",
                               torna_titolo="Torna al turno",
                               torna_url=turno.url)

    partecipazione = Partecipazione.con_esito_pending(turno=turno, persona=me).first()
    if not partecipazione:
        raise ValueError("TURNO_PRENOTATO_PUOI_RITIRARTI assegnato, ma nessuna partecipazione"
                         "trovata. ")

    partecipazione.autorizzazioni_ritira()
    return messaggio_generico(request, me, titolo="Richiesta ritirata.",
                              messaggio="La tua richiesta di partecipazione a questo turno "
                                        "è stata ritirata con successo.",
                              torna_titolo="Torna al turno",
                              torna_url=turno.url)
Exemple #11
0
def attivita_scheda_turni_partecipa(request, me, pk=None, turno_pk=None):
    """
    Mostra la scheda "Informazioni" di una attivita'.
    """

    turno = get_object_or_404(Turno, pk=turno_pk)
    stato = turno.persona(me)

    if stato not in turno.TURNO_PUOI_PARTECIPARE:
        return errore_generico(request, me, titolo="Non puoi partecipare a questo turno",
                               messaggio="Siamo spiacenti, ma ci risulta che tu non possa "
                                         "richiedere partecipazione a questo turno. Vai "
                                         "all'elenco dei turni per maggiori informazioni "
                                         "sulla motivazione. ",
                               torna_titolo="Turni dell'attività",
                               torna_url=turno.url,
                               )

    p = Partecipazione(
        turno=turno,
        persona=me,
    )
    p.save()
    p.richiedi()

    return messaggio_generico(request, me, titolo="Ottimo! Richiesta inoltrata.",
                              messaggio="La tua richiesta è stata inoltrata ai referenti di "
                                        "questa attività, che potranno confermarla o negarla. "
                                        "Ti manderemo una e-mail non appena risponderanno alla "
                                        "tua richiesta. Puoi sempre controllare lo stato delle tue"
                                        "richieste di partecipazione da 'Attivita' > 'I miei turni'. ",
                              torna_titolo="Vai a 'I miei turni'",
                              torna_url="/attivita/storico/")
Exemple #12
0
def aspirante_corso_base_iscritti_cancella(request, me, pk, iscritto):
    corso = get_object_or_404(CorsoBase, pk=pk)
    if not me.permessi_almeno(corso, MODIFICA):
        return redirect(ERRORE_PERMESSI)

    if not corso.possibile_cancellare_iscritti:
        return errore_generico(
            request,
            me,
            titolo="Impossibile cancellare iscritti",
            messaggio="Non si possono cancellare iscritti a questo "
            "stadio della vita del corso base.",
            torna_titolo="Torna al corso base",
            torna_url=corso.url_iscritti)

    try:
        persona = Persona.objects.get(pk=iscritto)
    except Persona.DoesNotExist:
        return errore_generico(request,
                               me,
                               titolo="Impossibile cancellare iscritto",
                               messaggio="La persona cercata non è iscritta.",
                               torna_titolo="Torna al corso base",
                               torna_url=corso.url_iscritti)
    if request.method == 'POST':
        for partecipazione in corso.partecipazioni_confermate_o_in_attesa(
        ).filter(persona=persona):
            partecipazione.disiscrivi(mittente=me)
        for partecipazione in corso.inviti_confermati_o_in_attesa().filter(
                persona=persona):
            partecipazione.disiscrivi(mittente=me)
        return messaggio_generico(
            request,
            me,
            titolo="Iscritto cancellato",
            messaggio="{} è stato cancellato dal corso {}.".format(
                persona, corso),
            torna_titolo="Torna al corso base",
            torna_url=corso.url_iscritti)
    contesto = {
        "corso": corso,
        "puo_modificare": True,
        "persona": persona,
    }
    return 'aspirante_corso_base_scheda_iscritti_cancella.html', contesto
Exemple #13
0
def aspirante_corso_base_attiva(request, me, pk):
    corso = get_object_or_404(CorsoBase, pk=pk)
    if not me.permessi_almeno(corso, MODIFICA):
        return redirect(ERRORE_PERMESSI)
    if corso.stato != corso.PREPARAZIONE:
        return messaggio_generico(request, me, titolo="Il corso è già attivo",
                                  messaggio="Non puoi attivare un corso già attivo",
                                  torna_titolo="Torna al Corso",
                                  torna_url=corso.url)
    if not corso.attivabile():
        return errore_generico(request, me, titolo="Impossibile attivare questo corso",
                               messaggio="Non sono soddisfatti tutti i criteri di attivazione. "
                                         "Torna alla pagina del corso e verifica che tutti i "
                                         "criteri siano stati soddisfatti prima di attivare un "
                                         "nuovo corso.",
                               torna_titolo="Torna al Corso",
                               torna_url=corso.url)

    if corso.data_inizio < poco_fa():
        return errore_generico(request, me, titolo="Impossibile attivare un corso già iniziato",
                               messaggio="Siamo spiacenti, ma non possiamo attivare il corso e inviare "
                                         "le e-mail a tutti gli aspiranti nella zona se il corso è "
                                         "già iniziato. Ti inviato a verificare i dati del corso.",
                               torna_titolo="Torna al Corso",
                               torna_url=corso.url)

    corpo = {"corso": corso, "persona": me}
    testo = get_template("email_aspirante_corso_inc_testo.html").render(corpo)

    if request.POST:
        corso.attiva(rispondi_a=me)
        return messaggio_generico(request, me, titolo="Corso attivato con successo",
                                  messaggio="A breve tutti gli aspiranti nelle vicinanze verranno informati "
                                            "dell'attivazione di questo corso base.",
                                  torna_titolo="Torna al Corso",
                                  torna_url=corso.url)

    contesto = {
        "corso": corso,
        "puo_modificare": True,
        "testo": testo,
    }
    return 'aspirante_corso_base_scheda_attiva.html', contesto
Exemple #14
0
def pdf(request, me, app_label, model, pk):
    oggetto = apps.get_model(app_label, model)
    oggetto = oggetto.objects.get(pk=pk)
    if not isinstance(oggetto, ConPDF):
        return errore_generico(request, None,
                               messaggio="Impossibile generare un PDF per il tipo specificato.")

    if 'token' in request.GET:
        if not oggetto.token_valida(request.GET['token']):
            return errore_generico(request, me, titolo="Token scaduta",
                                   messaggio="Il link usato è scaduto.")

    elif not me.permessi_almeno(oggetto, LETTURA):
        return redirect(ERRORE_PERMESSI)

    pdf = oggetto.genera_pdf()

    # Se sto scaricando un tesserino, forza lo scaricamento.
    if 'tesserini' in pdf.file.path:
        return pdf_forza_scaricamento(request, pdf)

    return redirect(pdf.download_url)
Exemple #15
0
def attivita_scheda_cancella(request, me, pk):
    attivita = get_object_or_404(Attivita, pk=pk)
    if not me.permessi_almeno(attivita, COMPLETO):
        return redirect(ERRORE_PERMESSI)

    if not attivita.cancellabile:
        return errore_generico(request, me, titolo="Attività non cancellabile",
                               messaggio="Questa attività non può essere cancellata.")

    attivita.delete()
    return messaggio_generico(request, me, titolo="Attività cancellata",
                              messaggio="L'attività è stata cancellata con successo.",
                              torna_titolo="Gestione attività", torna_url="/attivita/gestisci/")
Exemple #16
0
def attivita_aree_sede_area_cancella(request, me, sede_pk=None, area_pk=None):
    area = get_object_or_404(Area, pk=area_pk)
    if not me.permessi_almeno(area, COMPLETO):
        return redirect(ERRORE_PERMESSI)
    sede = area.sede
    if area.attivita.exists():
        return errore_generico(request, me, titolo="L'area ha delle attività associate",
                               messaggio="Non è possibile cancellare delle aree che hanno delle "
                                         "attività associate.",
                               torna_titolo="Torna indietro",
                               torna_url="/attivita/aree/%d/" % (sede.pk,))
    area.delete()
    return redirect("/attivita/aree/%d/" % (sede.pk,))
Exemple #17
0
def aspirante_impostazioni_cancella(request, me):
    if not me.ha_aspirante:
        return redirect(ERRORE_PERMESSI)

    if not me.cancellabile:
        return errore_generico(request, me, titolo="Impossibile cancellare automaticamente il profilo da Gaia",
                               messaggio="E' necessario richiedere la cancellazione manuale al personale di supporto.")

    # Cancella!
    me.delete()

    return messaggio_generico(request, me, titolo="Il tuo profilo è stato cancellato da Gaia",
                              messaggio="Abbiamo rimosso tutti i tuoi dati dal nostro sistema. "
                                        "Se cambierai idea, non esitare a iscriverti nuovamente! ")
Exemple #18
0
def aspirante_corso_base_iscritti_aggiungi(request, me, pk):
    corso = get_object_or_404(CorsoBase, pk=pk)
    if not me.permessi_almeno(corso, MODIFICA):
        return redirect(ERRORE_PERMESSI)

    if not corso.possibile_aggiungere_iscritti:
        return errore_generico(request, me, titolo="Impossibile aggiungere iscritti",
                               messaggio="Non si possono aggiungere altri iscritti a questo "
                                         "stadio della vita del corso base.",
                               torna_titolo="Torna al corso base", torna_url=corso.url_iscritti)

    modulo = ModuloIscrittiCorsoBaseAggiungi(request.POST or None)
    risultati = []
    if modulo.is_valid():

        for persona in modulo.cleaned_data['persone']:
            esito = corso.persona(persona)
            ok = False

            if esito in corso.PUOI_ISCRIVERTI or \
                            esito in corso.NON_PUOI_ISCRIVERTI_SOLO_SE_IN_AUTONOMIA:
                ok = True
                p = PartecipazioneCorsoBase(persona=persona, corso=corso)
                p.save()
                Log.crea(me, p)
                Messaggio.costruisci_e_invia(
                    oggetto="Iscrizione a Corso Base",
                    modello="email_corso_base_iscritto.html",
                    corpo={
                        "persona": persona,
                        "corso": corso,
                    },
                    mittente=me,
                    destinatari=[persona]
                )

            risultati += [{
                "persona": persona,
                "esito": esito,
                "ok": ok,
            }]

    contesto = {
        "corso": corso,
        "puo_modificare": True,
        "modulo": modulo,
        "risultati": risultati,
    }
    return 'aspirante_corso_base_scheda_iscritti_aggiungi.html', contesto
Exemple #19
0
def attivita_aree_sede_area_cancella(request, me, sede_pk=None, area_pk=None):
    area = get_object_or_404(Area, pk=area_pk)
    if not me.permessi_almeno(area, COMPLETO):
        return redirect(ERRORE_PERMESSI)
    sede = area.sede
    if area.attivita.exists():
        return errore_generico(
            request,
            me,
            titolo="L'area ha delle attività associate",
            messaggio="Non è possibile cancellare delle aree che hanno delle "
            "attività associate.",
            torna_titolo="Torna indietro",
            torna_url="/attivita/aree/%d/" % (sede.pk, ))
    area.delete()
    return redirect("/attivita/aree/%d/" % (sede.pk, ))
Exemple #20
0
def co_poteri_switch(request, me, part_pk):
    sedi = me.oggetti_permesso(GESTIONE_POTERI_CENTRALE_OPERATIVA_SEDE)

    partecipazione = Partecipazione.con_esito_ok(
        turno__attivita__sede__in=sedi,
        pk=part_pk
    ).first()

    next = request.GET.get('next', default='/centrale-operativa/poteri/')

    if not partecipazione:
        return errore_generico(request, me, titolo="Partecipazione non trovata")

    partecipazione.centrale_operativa = not partecipazione.centrale_operativa
    partecipazione.save()

    return redirect(next)
Exemple #21
0
def verifica_token(request, me, token):
    verifica = Token.verifica(token, redirect=True)
    if not verifica:
        return errore_generico(request, me, titolo="Token scaduto",
                               messaggio="Potresti aver seguito un link che è scaduto.")

    persona, url = verifica

    user = Utenza.objects.get(persona=persona)
    if not hasattr(user, 'backend'):
        for backend in settings.AUTHENTICATION_BACKENDS:
            if user == load_backend(backend).get_user(user.pk):
                user.backend = backend
                break
    if hasattr(user, 'backend'):
        login(request, user)
    return redirect(url)
Exemple #22
0
def verifica_token(request, me, token):
    verifica = Token.verifica(token, redirect=True)
    if not verifica:
        return errore_generico(request, me, titolo="Token scaduto",
                               messaggio="Potresti aver seguito un link che è scaduto.")

    persona, url = verifica

    user = Utenza.objects.get(persona=persona)
    if not hasattr(user, 'backend'):
        for backend in settings.AUTHENTICATION_BACKENDS:
            if user == load_backend(backend).get_user(user.pk):
                user.backend = backend
                break
    if hasattr(user, 'backend'):
        login(request, user)
    return redirect(url)
Exemple #23
0
def co_turni_smonta(request, me, partecipazione_pk=None):
    p = get_object_or_404(Partecipazione, pk=partecipazione_pk)
    if p.turno.attivita.sede not in me.oggetti_permesso(GESTIONE_CENTRALE_OPERATIVA_SEDE):
        return redirect(ERRORE_PERMESSI)
    coturno = p.coturno()
    if coturno is None:
        return redirect("/centrale-operativa/turni/")

    if not coturno.smontabile:
        return errore_generico(request, me, titolo="Questa persona non può essere smontata",
                               messaggio="Per qualche motivo la persona non è smontabile. Forse è già "
                                         "stata smontata da qualcun altro?", torna_titolo="Torna indietro",
                               torna_url="/centrale-operativa/turni/")

    coturno.smontato_data = poco_fa()
    coturno.smontato_da = me
    coturno.save()
    return redirect("/centrale-operativa/turni/")
Exemple #24
0
def aspirante_corso_base_iscriviti(request, me=None, pk=None):

    corso = get_object_or_404(CorsoBase, pk=pk)
    puoi_partecipare = corso.persona(me)
    if not puoi_partecipare in corso.PUOI_ISCRIVERTI:
        return errore_generico(request, me, titolo="Non puoi partecipare a questo corso",
                               messaggio="Siamo spiacenti, ma non sembra che tu possa partecipare "
                                         "a questo corso per qualche motivo. ",
                               torna_titolo="Torna al corso",
                               torna_url=corso.url)

    p = PartecipazioneCorsoBase(persona=me, corso=corso)
    p.save()
    p.richiedi()
    return messaggio_generico(request, me, titolo="Sei iscritto al corso base",
                              messaggio="Complimenti! Abbiamo inoltrato la tua richiesta al direttore "
                                        "del corso, che ti contatterà appena possibile.",
                              torna_titolo="Torna al corso",
                              torna_url=corso.url)
Exemple #25
0
def autorizzazione_concedi(request, me, pk=None):
    """
    Mostra il modulo da compilare per il consenso, ed eventualmente registra l'accettazione.
    """
    richiesta = get_object_or_404(Autorizzazione, pk=pk)

    torna_url = request.session.get('autorizzazioni_torna_url', default="/autorizzazioni/")

    # Controlla che io possa firmare questa autorizzazione
    if not me.autorizzazioni_in_attesa().filter(pk=richiesta.pk).exists():
        return errore_generico(request, me,
            titolo="Richiesta non trovata",
            messaggio="E' possibile che la richiesta sia stata già approvata o respinta da qualcun altro.",
            torna_titolo="Richieste in attesa",
            torna_url=torna_url,
        )

    modulo = None

    # Se la richiesta ha un modulo di consenso
    if richiesta.oggetto.autorizzazione_concedi_modulo():
        if request.POST:
            modulo = richiesta.oggetto.autorizzazione_concedi_modulo()(request.POST)

            if modulo.is_valid():
                # Accetta la richiesta con modulo
                richiesta.concedi(me, modulo=modulo)

        else:
            modulo = richiesta.oggetto.autorizzazione_concedi_modulo()()

    else:
        # Accetta la richiesta senza modulo
        richiesta.concedi(me)

    contesto = {
        "modulo": modulo,
        "richiesta": richiesta,
        "torna_url": torna_url,
    }

    return 'base_autorizzazioni_concedi.html', contesto
Exemple #26
0
def attivita_scheda_cancella(request, me, pk):
    attivita = get_object_or_404(Attivita, pk=pk)
    if not me.permessi_almeno(attivita, COMPLETO):
        return redirect(ERRORE_PERMESSI)

    if not attivita.cancellabile:
        return errore_generico(
            request,
            me,
            titolo="Attività non cancellabile",
            messaggio="Questa attività non può essere cancellata.")

    attivita.delete()
    return messaggio_generico(
        request,
        me,
        titolo="Attività cancellata",
        messaggio="L'attività è stata cancellata con successo.",
        torna_titolo="Gestione attività",
        torna_url="/attivita/gestisci/")
Exemple #27
0
def aspirante_corso_base_ritirati(request, me=None, pk=None):

    corso = get_object_or_404(CorsoBase, pk=pk)
    puoi_partecipare = corso.persona(me)
    if not puoi_partecipare == corso.SEI_ISCRITTO_PUOI_RITIRARTI:
        return errore_generico(request, me, titolo="Non puoi ritirarti da questo corso",
                               messaggio="Siamo spiacenti, ma non sembra che tu possa ritirarti "
                                         "da questo corso per qualche motivo. ",
                               torna_titolo="Torna al corso",
                               torna_url=corso.url)

    p = PartecipazioneCorsoBase.con_esito_pending(corso=corso, persona=me).first()
    p.ritira()

    return messaggio_generico(request, me, titolo="Ti sei ritirato dal corso",
                              messaggio="Siamo spiacenti che hai deciso di ritirarti da questo corso. "
                                        "La tua partecipazione è stata ritirata correttamente. "
                                        "Non esitare a iscriverti a questo o un altro corso, nel caso cambiassi idea.",
                              torna_titolo="Torna alla pagina del corso",
                              torna_url=corso.url)
Exemple #28
0
def attivita_scheda_turni_partecipa(request, me, pk=None, turno_pk=None):
    """
    Mostra la scheda "Informazioni" di una attivita'.
    """

    turno = get_object_or_404(Turno, pk=turno_pk)
    stato = turno.persona(me)

    if stato not in turno.TURNO_PUOI_PARTECIPARE:
        return errore_generico(
            request,
            me,
            titolo="Non puoi partecipare a questo turno",
            messaggio="Siamo spiacenti, ma ci risulta che tu non possa "
            "richiedere partecipazione a questo turno. Vai "
            "all'elenco dei turni per maggiori informazioni "
            "sulla motivazione. ",
            torna_titolo="Turni dell'attività",
            torna_url=turno.url,
        )

    p = Partecipazione(
        turno=turno,
        persona=me,
    )
    p.save()
    p.richiedi()

    return messaggio_generico(
        request,
        me,
        titolo="Ottimo! Richiesta inoltrata.",
        messaggio="La tua richiesta è stata inoltrata ai referenti di "
        "questa attività, che potranno confermarla o negarla. "
        "Ti manderemo una e-mail non appena risponderanno alla "
        "tua richiesta. Puoi sempre controllare lo stato delle tue"
        "richieste di partecipazione da 'Attivita' > 'I miei turni'. ",
        torna_titolo="Vai a 'I miei turni'",
        torna_url="/attivita/storico/")
Exemple #29
0
def aspirante_impostazioni_cancella(request, me):
    if not me.ha_aspirante:
        return redirect(ERRORE_PERMESSI)

    if not me.cancellabile:
        return errore_generico(
            request,
            me,
            titolo="Impossibile cancellare automaticamente il profilo da Gaia",
            messaggio=
            "E' necessario richiedere la cancellazione manuale al personale di supporto."
        )

    # Cancella!
    me.delete()

    return messaggio_generico(
        request,
        me,
        titolo="Il tuo profilo è stato cancellato da Gaia",
        messaggio="Abbiamo rimosso tutti i tuoi dati dal nostro sistema. "
        "Se cambierai idea, non esitare a iscriverti nuovamente! ")
Exemple #30
0
def attivita_scheda_cancella(request, me, pk):
    attivita = get_object_or_404(Attivita, pk=pk)
    if not me.permessi_almeno(attivita, COMPLETO):
        return redirect(ERRORE_PERMESSI)

    if not attivita.cancellabile:
        return errore_generico(request, me, titolo="Attività non cancellabile",
                               messaggio="Questa attività non può essere cancellata.")

    titolo_messaggio = "Attività cancellata"
    testo_messaggio = "L'attività è stata cancellata con successo."
    if 'cancella-gruppo' in request.path.split('/'):
        try:
            gruppo = Gruppo.objects.get(attivita=attivita)
            gruppo.delete()
            titolo_messaggio = "Attività e gruppo cancellati"
            testo_messaggio = "L'attività e il gruppo associato sono stati cancellati con successo."
        except Gruppo.DoesNotExist:
            testo_messaggio = "L'attività è stata cancellata con successo (non esisteva un gruppo associato a quest'attività)."
    attivita.delete()
    return messaggio_generico(request, me, titolo=titolo_messaggio,
                              messaggio=testo_messaggio,
                              torna_titolo="Gestione attività", torna_url="/attivita/gestisci/")
Exemple #31
0
def aspirante_corso_base_termina(request, me, pk):
    corso = get_object_or_404(CorsoBase, pk=pk)
    if not me.permessi_almeno(corso, MODIFICA):
        return redirect(ERRORE_PERMESSI)

    torna = {"torna_url": corso.url_modifica, "torna_titolo": "Modifica corso"}

    if (not corso.op_attivazione) or (not corso.data_attivazione):
        return errore_generico(
            request,
            me,
            titolo="Necessari dati attivazione",
            messaggio=
            "Per generare il verbale, sono necessari i dati (O.P. e data) "
            "dell'attivazione del corso.",
            **torna)

    if not corso.partecipazioni_confermate().exists():
        return errore_generico(
            request,
            me,
            titolo="Impossibile terminare questo corso",
            messaggio="Non ci sono partecipanti confermati per questo corso, "
            "non è quindi possibile generare un verbale per il corso.",
            **torna)

    if corso.stato != corso.ATTIVO:
        return errore_generico(
            request,
            me,
            titolo="Impossibile terminare questo corso",
            messaggio="Il corso non è attivo e non può essere terminato.",
            **torna)

    partecipanti_moduli = []

    azione = request.POST.get(
        'azione', default=ModuloVerbaleAspiranteCorsoBase.SALVA_SOLAMENTE)
    generazione_verbale = azione == ModuloVerbaleAspiranteCorsoBase.GENERA_VERBALE

    termina_corso = generazione_verbale

    for partecipante in corso.partecipazioni_confermate():

        modulo = ModuloVerbaleAspiranteCorsoBase(
            request.POST or None,
            prefix="part_%d" % partecipante.pk,
            instance=partecipante,
            generazione_verbale=generazione_verbale)
        modulo.fields['destinazione'].queryset = corso.possibili_destinazioni()
        modulo.fields['destinazione'].initial = corso.sede

        if modulo.is_valid():
            modulo.save()

        elif generazione_verbale:
            termina_corso = False

        partecipanti_moduli += [(partecipante, modulo)]

    if termina_corso:  # Se il corso può essere terminato.
        corso.termina(mittente=me)
        return messaggio_generico(
            request,
            me,
            titolo="Corso base terminato",
            messaggio=
            "Il verbale è stato generato con successo. Tutti gli idonei "
            "sono stati resi volontari delle rispettive sedi.",
            torna_titolo="Vai al Report del Corso Base",
            torna_url=corso.url_report)

    contesto = {
        "corso": corso,
        "puo_modificare": True,
        "partecipanti_moduli": partecipanti_moduli,
        "azione_genera_verbale":
        ModuloVerbaleAspiranteCorsoBase.GENERA_VERBALE,
        "azione_salva_solamente":
        ModuloVerbaleAspiranteCorsoBase.SALVA_SOLAMENTE,
    }
    return 'aspirante_corso_base_scheda_termina.html', contesto
Exemple #32
0
def aspirante_corso_base_iscritti_aggiungi(request, me, pk):
    corso = get_object_or_404(CorsoBase, pk=pk)
    if not me.permessi_almeno(corso, MODIFICA):
        return redirect(ERRORE_PERMESSI)

    if not corso.possibile_aggiungere_iscritti:
        return errore_generico(
            request,
            me,
            titolo="Impossibile aggiungere iscritti",
            messaggio="Non si possono aggiungere altri iscritti a questo "
            "stadio della vita del corso base.",
            torna_titolo="Torna al corso base",
            torna_url=corso.url_iscritti)

    modulo = ModuloIscrittiCorsoBaseAggiungi(request.POST or None)
    risultati = []
    if modulo.is_valid():

        for persona in modulo.cleaned_data['persone']:
            esito = corso.persona(persona)
            ok = PartecipazioneCorsoBase.NON_ISCRITTO
            partecipazione = None

            if esito in corso.PUOI_ISCRIVERTI or esito in corso.NON_PUOI_ISCRIVERTI_SOLO_SE_IN_AUTONOMIA:
                if hasattr(persona, 'aspirante'):
                    inviti = InvitoCorsoBase.con_esito_ok(
                    ) | InvitoCorsoBase.con_esito_pending()
                    if inviti.filter(persona=persona, corso=corso).exists():
                        ok = PartecipazioneCorsoBase.INVITO_INVIATO
                        partecipazione = InvitoCorsoBase.objects.filter(
                            persona=persona, corso=corso).first()
                    else:
                        partecipazione = InvitoCorsoBase(persona=persona,
                                                         corso=corso,
                                                         invitante=me)
                        partecipazione.save()
                        partecipazione.richiedi()
                        ok = PartecipazioneCorsoBase.IN_ATTESA_ASPIRANTE
                else:
                    partecipazione = PartecipazioneCorsoBase.objects.create(
                        persona=persona, corso=corso)
                    ok = PartecipazioneCorsoBase.ISCRITTO
                    Messaggio.costruisci_e_invia(
                        oggetto="Iscrizione a Corso Base",
                        modello="email_corso_base_iscritto.html",
                        corpo={
                            "persona": persona,
                            "corso": corso,
                        },
                        mittente=me,
                        destinatari=[persona])

                Log.crea(me, partecipazione)

            risultati += [{
                "persona": persona,
                "partecipazione": partecipazione,
                "esito": esito,
                "ok": ok,
            }]

    contesto = {
        "corso": corso,
        "puo_modificare": True,
        "modulo": modulo,
        "risultati": risultati,
    }
    return 'aspirante_corso_base_scheda_iscritti_aggiungi.html', contesto
Exemple #33
0
def aspirante_corso_base_termina(request, me, pk):
    corso = get_object_or_404(CorsoBase, pk=pk)
    if not me.permessi_almeno(corso, MODIFICA):
        return redirect(ERRORE_PERMESSI)

    torna = {"torna_url": corso.url_modifica, "torna_titolo": "Modifica corso"}

    if (not corso.op_attivazione) or (not corso.data_attivazione):
        return errore_generico(request, me, titolo="Necessari dati attivazione",
                               messaggio="Per generare il verbale, sono necessari i dati (O.P. e data) "
                                         "dell'attivazione del corso.",
                               **torna)

    if not corso.partecipazioni_confermate().exists():
        return errore_generico(request, me, titolo="Impossibile terminare questo corso",
                               messaggio="Non ci sono partecipanti confermati per questo corso, "
                                         "non è quindi possibile generare un verbale per il corso.",
                               **torna)

    if corso.stato != corso.ATTIVO:
        return errore_generico(request, me, titolo="Impossibile terminare questo corso",
                               messaggio="Il corso non è attivo e non può essere terminato.",
                               **torna)

    partecipanti_moduli = []

    azione = request.POST.get('azione', default=ModuloVerbaleAspiranteCorsoBase.SALVA_SOLAMENTE)
    generazione_verbale = azione == ModuloVerbaleAspiranteCorsoBase.GENERA_VERBALE

    termina_corso = generazione_verbale

    for partecipante in corso.partecipazioni_confermate():

        modulo = ModuloVerbaleAspiranteCorsoBase(
            request.POST or None, prefix="part_%d" % partecipante.pk,
            instance=partecipante,
            generazione_verbale=generazione_verbale
        )
        modulo.fields['destinazione'].queryset = corso.possibili_destinazioni()
        modulo.fields['destinazione'].initial = corso.sede

        if modulo.is_valid():
            modulo.save()

        elif generazione_verbale:
            termina_corso = False

        partecipanti_moduli += [(partecipante, modulo)]

    if termina_corso:  # Se il corso può essere terminato.
        corso.termina(mittente=me)
        return messaggio_generico(request, me, titolo="Corso base terminato",
                                  messaggio="Il verbale è stato generato con successo. Tutti gli idonei "
                                            "sono stati resi volontari delle rispettive sedi.",
                                  torna_titolo="Vai al Report del Corso Base",
                                  torna_url=corso.url_report)

    contesto = {
        "corso": corso,
        "puo_modificare": True,
        "partecipanti_moduli": partecipanti_moduli,
        "azione_genera_verbale": ModuloVerbaleAspiranteCorsoBase.GENERA_VERBALE,
        "azione_salva_solamente": ModuloVerbaleAspiranteCorsoBase.SALVA_SOLAMENTE,
    }
    return 'aspirante_corso_base_scheda_termina.html', contesto
Exemple #34
0
def aspirante_corso_base_iscritti_aggiungi(request, me, pk):
    corso = get_object_or_404(CorsoBase, pk=pk)
    if not me.permessi_almeno(corso, MODIFICA):
        return redirect(ERRORE_PERMESSI)

    if not corso.possibile_aggiungere_iscritti:
        return errore_generico(request, me, titolo="Impossibile aggiungere iscritti",
                               messaggio="Non si possono aggiungere altri iscritti a questo "
                                         "stadio della vita del corso base.",
                               torna_titolo="Torna al corso base", torna_url=corso.url_iscritti)

    modulo = ModuloIscrittiCorsoBaseAggiungi(request.POST or None)
    risultati = []
    if modulo.is_valid():

        for persona in modulo.cleaned_data['persone']:
            esito = corso.persona(persona)
            ok = PartecipazioneCorsoBase.NON_ISCRITTO
            partecipazione = None

            if esito in corso.PUOI_ISCRIVERTI or esito in corso.NON_PUOI_ISCRIVERTI_SOLO_SE_IN_AUTONOMIA:
                if hasattr(persona, 'aspirante'):
                    inviti = InvitoCorsoBase.con_esito_ok() | InvitoCorsoBase.con_esito_pending()
                    if inviti.filter(persona=persona, corso=corso).exists():
                        ok = PartecipazioneCorsoBase.INVITO_INVIATO
                        partecipazione = InvitoCorsoBase.objects.filter(persona=persona, corso=corso).first()
                    else:
                        partecipazione = InvitoCorsoBase(persona=persona, corso=corso, invitante=me)
                        partecipazione.save()
                        partecipazione.richiedi()
                        ok = PartecipazioneCorsoBase.IN_ATTESA_ASPIRANTE
                else:
                    partecipazione = PartecipazioneCorsoBase.objects.create(persona=persona, corso=corso)
                    ok = PartecipazioneCorsoBase.ISCRITTO
                    Messaggio.costruisci_e_invia(
                        oggetto="Iscrizione a Corso Base",
                        modello="email_corso_base_iscritto.html",
                        corpo={
                            "persona": persona,
                            "corso": corso,
                        },
                        mittente=me,
                        destinatari=[persona]
                    )

                Log.crea(me, partecipazione)

            risultati += [{
                "persona": persona,
                "partecipazione": partecipazione,
                "esito": esito,
                "ok": ok,
            }]

    contesto = {
        "corso": corso,
        "puo_modificare": True,
        "modulo": modulo,
        "risultati": risultati,
    }
    return 'aspirante_corso_base_scheda_iscritti_aggiungi.html', contesto
Exemple #35
0
def _profilo_credenziali(request, me, persona):
    utenza = Utenza.objects.filter(persona=persona).first()

    modulo_utenza = modulo_modifica = None
    if utenza:
        modulo_modifica = ModuloUSModificaUtenza(request.POST or None,
                                                 instance=utenza)
    else:
        modulo_utenza = ModuloUtenza(request.POST or None,
                                     instance=utenza,
                                     initial={"email": persona.email_contatto})

    if modulo_utenza and modulo_utenza.is_valid():
        utenza = modulo_utenza.save(commit=False)
        utenza.persona = persona
        utenza.save()
        utenza.genera_credenziali()
        return redirect(persona.url_profilo_credenziali)

    if modulo_modifica and modulo_modifica.is_valid():
        vecchia_email_contatto = persona.email
        vecchia_email = Utenza.objects.get(pk=utenza.pk).email
        nuova_email = modulo_modifica.cleaned_data.get('email')

        if vecchia_email == nuova_email:
            return errore_generico(
                request,
                me,
                titolo="Nessun cambiamento",
                messaggio="Per cambiare indirizzo e-mail, inserisci un "
                "indirizzo differente.",
                torna_titolo="Credenziali",
                torna_url=persona.url_profilo_credenziali)

        if Utenza.objects.filter(email__icontains=nuova_email).first():
            return errore_generico(
                request,
                me,
                titolo="E-mail già utilizzata",
                messaggio="Esiste un altro utente in Gaia che utilizza "
                "questa e-mail (%s). Impossibile associarla quindi "
                "a %s." % (nuova_email, persona.nome_completo),
                torna_titolo="Credenziali",
                torna_url=persona.url_profilo_credenziali)

        def _invia_notifica():
            Messaggio.costruisci_e_invia(
                oggetto=
                "IMPORTANTE: Cambio e-mail di accesso a Gaia (credenziali)",
                modello="email_credenziali_modificate.html",
                corpo={
                    "vecchia_email": vecchia_email,
                    "nuova_email": nuova_email,
                    "persona": persona,
                    "autore": me,
                },
                mittente=me,
                destinatari=[persona],
                utenza=True)

        _invia_notifica()  # Invia notifica alla vecchia e-mail
        Log.registra_modifiche(me, modulo_modifica)
        modulo_modifica.save()  # Effettua le modifiche
        persona.refresh_from_db()
        if persona.email != vecchia_email_contatto:  # Se e-mail principale cambiata
            _invia_notifica()  # Invia la notifica anche al nuovo indirizzo

        return messaggio_generico(
            request,
            me,
            titolo="Credenziali modificate",
            messaggio=
            "Le credenziali di %s sono state correttamente aggiornate." %
            persona.nome,
            torna_titolo="Credenziali",
            torna_url=persona.url_profilo_credenziali)

    contesto = {
        "utenza": utenza,
        "modulo_creazione": modulo_utenza,
        "modulo_modifica": modulo_modifica
    }
    return 'anagrafica_profilo_credenziali.html', contesto