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
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)
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
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
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
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/")
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)
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)
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)
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)
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/")
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
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
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)
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/")
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,))
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! ")
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
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, ))
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)
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)
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/")
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)
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
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/")
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)
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/")
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! ")
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/")
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
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
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
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
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