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 attivita_gruppo(request, me): """ Crea gruppi di lavoro per il mio comitato o elimina quelli di cui sono responsabile. """ # Sono responsabile di queste aree di intervento. area_permessi = me.oggetti_permesso(GESTIONE_ATTIVITA_AREA) # Attività nelle aree di cui sono responsabile. attivita_specifica = Attivita.objects.filter(area__in=area_permessi) # Gruppi nelle aree di cui sono responsabile. gruppi_gestione = Gruppo.objects.filter(area__in=area_permessi) modulo_attivita_specifica = ModuloGruppoSpecifico(request.POST or None, attivita_specifica=attivita_specifica, request=request.POST) modulo_attivita_non_specifica = ModuloGruppoNonSpecifico(request.POST or None, area_permessi=area_permessi, request=request.POST) from anagrafica.permessi.applicazioni import REFERENTE_GRUPPO if 'specifico' in request.POST: if modulo_attivita_specifica.is_valid(): attivita_specifica = modulo_attivita_specifica.cleaned_data['attivita_specifica'] area = Area.objects.get(id=attivita_specifica.area_id) gruppo = Gruppo.objects.create(nome=attivita_specifica.nome, sede=attivita_specifica.sede, obiettivo=area.obiettivo, attivita=attivita_specifica, estensione=attivita_specifica.estensione.estensione, area=attivita_specifica.area) gruppo.aggiungi_delegato(REFERENTE_GRUPPO, me) return messaggio_generico(request, None, titolo="Gruppo creato", messaggio="Hai creato un gruppo per un attività specifica", torna_url="/attivita/gruppo/", torna_titolo="Torna alla gestione dei gruppi") if 'non_specifico' in request.POST: if modulo_attivita_non_specifica.is_valid(): nome_gruppo = modulo_attivita_non_specifica.cleaned_data['nome'] area = modulo_attivita_non_specifica.cleaned_data['area'] gruppo = Gruppo.objects.create(nome=nome_gruppo, sede=area.sede, obiettivo=area.obiettivo, attivita=None, estensione=area.sede.estensione, area_id=area.id) gruppo.aggiungi_delegato(REFERENTE_GRUPPO, me) return messaggio_generico(request, None, titolo="Gruppo creato", messaggio="Hai creato un gruppo per un'area", torna_url="/attivita/gruppo/", torna_titolo="Torna alla gestione dei gruppi") contesto = { "gruppi_gestione": gruppi_gestione, "modulo_attivita_specifica": modulo_attivita_specifica, "modulo_attivita_non_specifica": modulo_attivita_non_specifica, } return 'attivita_gruppo.html', contesto
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 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 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 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 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 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_organizza(request, me): aree = me.oggetti_permesso(GESTIONE_ATTIVITA_AREA) sedi = Sede.objects.filter(aree__in=aree) if not aree: return messaggio_generico(request, me, titolo="Crea un'area di intervento, prima!", messaggio="Le aree di intervento fungono da 'contenitori' per le " "attività. Per organizzare un'attività, è necessario creare " "almeno un'area di intervento. ", torna_titolo="Gestisci le Aree di intervento", torna_url="/attivita/aree/") modulo_referente = ModuloOrganizzaAttivitaReferente(request.POST or None) modulo = ModuloOrganizzaAttivita(request.POST or None) modulo.fields['area'].queryset = aree if modulo_referente.is_valid() and modulo.is_valid(): attivita = modulo.save(commit=False) attivita.sede = attivita.area.sede attivita.estensione = attivita.sede.comitato attivita.save() if modulo_referente.cleaned_data['scelta'] == modulo_referente.SONO_IO: # Io sono il referente. attivita.aggiungi_delegato(REFERENTE, me, firmatario=me, inizio=poco_fa()) return redirect(attivita.url_modifica) else: # Il referente e' qualcun altro. return redirect("/attivita/organizza/%d/referenti/" % (attivita.pk,)) contesto = { "modulo": modulo, "modulo_referente": modulo_referente, } return 'attivita_organizza.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 attivita_organizza_fatto(request, me, pk=None): attivita = get_object_or_404(Attivita, pk=pk) if not me.permessi_almeno(attivita, MODIFICA): return redirect(ERRORE_PERMESSI) return messaggio_generico(request, me, titolo="Attività organizzata", messaggio="Abbiamo inviato un messaggio ai referenti che hai " "selezionato. Appena accederanno a Gaia, gli chiederemo " "di darci maggiori informazioni sull'attività, come " "gli orari dei turni e l'indirizzo.", torna_titolo="Torna a Gestione Attività", torna_url="/attivita/gestisci/")
def attivita_organizza(request, me): aree = me.oggetti_permesso(GESTIONE_ATTIVITA_AREA) sedi = Sede.objects.filter(aree__in=aree) if not aree: return messaggio_generico( request, me, titolo="Crea un'area di intervento, prima!", messaggio="Le aree di intervento fungono da 'contenitori' per le " "attività. Per organizzare un'attività, è necessario creare " "almeno un'area di intervento. ", torna_titolo="Gestisci le Aree di intervento", torna_url="/attivita/aree/") modulo_referente = ModuloOrganizzaAttivitaReferente(request.POST or None) modulo = ModuloOrganizzaAttivita(request.POST or None) modulo.fields['area'].queryset = aree if modulo_referente.is_valid() and modulo.is_valid(): attivita = modulo.save(commit=False) attivita.sede = attivita.area.sede attivita.estensione = attivita.sede.comitato attivita.save() # Crea gruppo per questa specifica attività se la casella viene selezionata. crea_gruppo = modulo.cleaned_data['gruppo'] if crea_gruppo: area = attivita.area gruppo = Gruppo.objects.create( nome=attivita.nome, sede=attivita.sede, obiettivo=area.obiettivo, attivita=attivita, estensione=attivita.estensione.estensione, area=area) gruppo.aggiungi_delegato(REFERENTE_GRUPPO, me) if modulo_referente.cleaned_data['scelta'] == modulo_referente.SONO_IO: # Io sono il referente. attivita.aggiungi_delegato(REFERENTE, me, firmatario=me, inizio=poco_fa()) return redirect(attivita.url_modifica) else: # Il referente e' qualcun altro. return redirect("/attivita/organizza/%d/referenti/" % (attivita.pk, )) contesto = { "modulo": modulo, "modulo_referente": modulo_referente, } return 'attivita_organizza.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 supporto(request, me=None): from base.forms_extra import ModuloRichiestaSupporto modulo = None if me: deleghe = set([d.tipo for d in me.deleghe_attuali()]) tipi = set((UFFICIO_SOCI, UFFICIO_SOCI_TEMPORANEO, UFFICIO_SOCI_UNITA, PRESIDENTE)) if deleghe.intersection(tipi): modulo = ModuloRichiestaSupportoPersone(request.POST or None) else: modulo = ModuloRichiestaSupporto(request.POST or None) scelte = modulo.fields['tipo'].choices # Solo i delegati possono contattare SECONDO_LIVELLO e TERZO_LIVELLO if not me.deleghe_attuali().exists(): scelte = rimuovi_scelte( [modulo.TERZO_LIVELLO, modulo.SECONDO_LIVELLO], scelte) modulo.fields['tipo'].choices = scelte if modulo and modulo.is_valid(): tipo = modulo.cleaned_data['tipo'] oggetto = modulo.cleaned_data['oggetto'] descrizione = modulo.cleaned_data['descrizione'] persona = modulo.cleaned_data.get('persona', None) oggetto = "(%s) %s" % (tipo, oggetto) Messaggio.costruisci_e_invia( oggetto=oggetto, modello="email_supporto.html", mittente=me, destinatari=[], corpo={ "testo": descrizione, "mittente": me, "persona": persona }, ) return messaggio_generico( request, me, titolo="Richiesta inoltrata", messaggio= "Grazie per aver contattato il supporto. La tua richiesta con " "oggetto '%s' è stata correttamente inoltrata. Riceverai a minuti " "un messaggio di conferma del codice ticket assegnato alla " "tua richiesta." % (oggetto, )) contesto = {"modulo": modulo} return 'supporto.html', contesto
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_gruppi_gruppo_abbandona(request, me, pk): """ Abbandona un gruppo. """ gruppo = get_object_or_404(Gruppo, pk=pk) Appartenenza.query_attuale().filter( gruppo=gruppo, persona=me ).update(fine=poco_fa()) return messaggio_generico(request, me, titolo="Hai abbandonato il gruppo", messaggio="Non fai più parte del gruppo '%s'. <br />" "Sei stato disiscritto con successo." % ( gruppo.nome, ), torna_titolo="Torna all'elenco dei gruppi", torna_url="/attivita/gruppi/")
def attivita_organizza_fatto(request, me, pk=None): attivita = get_object_or_404(Attivita, pk=pk) if not me.permessi_almeno(attivita, MODIFICA): return redirect(ERRORE_PERMESSI) return messaggio_generico( request, me, titolo="Attività organizzata", messaggio="Abbiamo inviato un messaggio ai referenti che hai " "selezionato. Appena accederanno a Gaia, gli chiederemo " "di darci maggiori informazioni sull'attività, come " "gli orari dei turni e l'indirizzo.", torna_titolo="Torna a Gestione Attività", torna_url="/attivita/gestisci/")
def attivita_gruppi_gruppo_abbandona(request, me, pk): """ Abbandona un gruppo. """ gruppo = get_object_or_404(Gruppo, pk=pk) Appartenenza.query_attuale().filter(gruppo=gruppo, persona=me).update(fine=poco_fa()) return messaggio_generico( request, me, titolo="Hai abbandonato il gruppo", messaggio="Non fai più parte del gruppo '%s'. <br />" "Sei stato disiscritto con successo." % (gruppo.nome, ), torna_titolo="Torna all'elenco dei gruppi", torna_url="/attivita/gruppi/")
def attivita_gruppi_gruppo_elimina_conferma(request, me, pk): """ Elimina un gruppo. """ gruppo = get_object_or_404(Gruppo, pk=pk) # Se non ho i permessi per eliminare il gruppo. if not me.permessi_almeno(gruppo, MODIFICA): return redirect(ERRORE_PERMESSI) gruppo.delete() return messaggio_generico(request, me, titolo="Hai eliminato il gruppo", messaggio="Il gruppo '%s' è stato eliminato con successo." % ( gruppo.nome, ), torna_titolo="Torna a crea gruppo", torna_url="/attivita/gruppo/")
def supporto(request, me=None): from base.forms_extra import ModuloRichiestaSupporto modulo = None if me: deleghe = set([d.tipo for d in me.deleghe_attuali()]) tipi = set((UFFICIO_SOCI, UFFICIO_SOCI_TEMPORANEO, UFFICIO_SOCI_UNITA, PRESIDENTE)) if deleghe.intersection(tipi): modulo = ModuloRichiestaSupportoPersone(request.POST or None) else: modulo = ModuloRichiestaSupporto(request.POST or None) scelte = modulo.fields['tipo'].choices # Solo i delegati possono contattare SECONDO_LIVELLO e TERZO_LIVELLO if not me.deleghe_attuali().exists(): scelte = rimuovi_scelte([modulo.TERZO_LIVELLO, modulo.SECONDO_LIVELLO], scelte) modulo.fields['tipo'].choices = scelte if modulo and modulo.is_valid(): tipo = modulo.cleaned_data['tipo'] oggetto = modulo.cleaned_data['oggetto'] descrizione = modulo.cleaned_data['descrizione'] persona = modulo.cleaned_data.get('persona', None) oggetto = "(%s) %s" % (tipo, oggetto) Messaggio.costruisci_e_invia( oggetto=oggetto, modello="email_supporto.html", mittente=me, destinatari=[], corpo={ "testo": descrizione, "mittente": me, "persona": persona }, ) return messaggio_generico(request, me, titolo="Richiesta inoltrata", messaggio="Grazie per aver contattato il supporto. La tua richiesta con " "oggetto '%s' è stata correttamente inoltrata. Riceverai a minuti " "un messaggio di conferma del codice ticket assegnato alla " "tua richiesta." % (oggetto,)) contesto = { "modulo": modulo } return 'supporto.html', contesto
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_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_gruppi_gruppo_elimina_conferma(request, me, pk): """ Elimina un gruppo. """ gruppo = get_object_or_404(Gruppo, pk=pk) # Se non ho i permessi per eliminare il gruppo. if not me.permessi_almeno(gruppo, MODIFICA): return redirect(ERRORE_PERMESSI) gruppo.delete() return messaggio_generico( request, me, titolo="Hai eliminato il gruppo", messaggio="Il gruppo '%s' è stato eliminato con successo." % (gruppo.nome, ), torna_titolo="Torna a crea gruppo", torna_url="/attivita/gruppo/")
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_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_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 attivita_gruppi_gruppo_iscriviti(request, me, pk): """ Abbandona un gruppo. """ gruppo = get_object_or_404(Gruppo, pk=pk) if Appartenenza.query_attuale().filter( gruppo=gruppo, persona=me ).exists(): # Gia membro return redirect("/attivita/gruppi/?gia_membro") a = Appartenenza( gruppo=gruppo, persona=me, inizio=poco_fa() ) a.save() return messaggio_generico(request, me, titolo="Iscrizione effettuata", messaggio="Sei ora iscritt%s al gruppo di lavoro '%s'. <br />" "Riceverai per e-mail tutte le comunicazioni " "relative a questo gruppo" % ( me.genere_o_a, gruppo.nome, ), torna_titolo="Torna all'elenco dei gruppi", torna_url="/attivita/gruppi/")
def attivita_gruppi_gruppo_iscriviti(request, me, pk): """ Abbandona un gruppo. """ gruppo = get_object_or_404(Gruppo, pk=pk) if Appartenenza.query_attuale().filter(gruppo=gruppo, persona=me).exists(): # Gia membro return redirect("/attivita/gruppi/?gia_membro") a = Appartenenza(gruppo=gruppo, persona=me, inizio=poco_fa()) a.save() return messaggio_generico( request, me, titolo="Iscrizione effettuata", messaggio="Sei ora iscritt%s al gruppo di lavoro '%s'. <br />" "Riceverai per e-mail tutte le comunicazioni " "relative a questo gruppo" % ( me.genere_o_a, gruppo.nome, ), torna_titolo="Torna all'elenco dei gruppi", torna_url="/attivita/gruppi/")
def recupera_password(request): """ Mostra semplicemente la pagina di recupero password. """ def _errore(contesto, modulo, livello=None, delegati=None, email=None, codice_fiscale=None): contesto.update({ 'modulo': ModuloRecuperaPassword(), }) if livello: contesto.update({'errore': livello}) if delegati: contesto.update({'delegati': delegati}) if email: contesto.update({'email': email}) if codice_fiscale: contesto.update({'codice_fiscale': codice_fiscale}) return 'base_recupera_password.html', contesto contesto = {} if request.method == 'POST': modulo = ModuloRecuperaPassword(request.POST) if modulo.is_valid(): codice_fiscale = modulo.cleaned_data['codice_fiscale'].upper() email = modulo.cleaned_data['email'].lower() try: per = Persona.objects.get(codice_fiscale=codice_fiscale) delegati = per.deleghe_anagrafica() if not hasattr(per, 'utenza'): return _errore(contesto, modulo, 2, delegati, email=email, codice_fiscale=codice_fiscale) if per.utenza.email != email: return _errore(contesto, modulo, 3, delegati, email=email, codice_fiscale=codice_fiscale) Messaggio.costruisci_e_invia( destinatari=[per], oggetto="Nuova password", modello="email_recupero_password.html", corpo={ "persona": per, "uid": urlsafe_base64_encode(force_bytes(per.utenza.pk)), "reset_pw_link": default_token_generator.make_token(per.utenza), "scadenza_token": django_settings.PASSWORD_RESET_TIMEOUT_DAYS * 24 }, utenza=True ) return messaggio_generico(request, None, titolo="Controlla la tua casella e-mail", messaggio="Ti abbiamo inviato le istruzioni per cambiare la " "tua password tramite e-mail. Controlla la tua " "casella al più presto. ", torna_url="/utente/cambia-password/", torna_titolo="Accedi e cambia la tua password") except Persona.DoesNotExist: return _errore(contesto, modulo, 1, email=email, codice_fiscale=codice_fiscale) else: modulo = ModuloRecuperaPassword() contesto.update({ 'modulo': modulo, }) return 'base_recupera_password.html', contesto
def attivita_organizza(request, me): aree = me.oggetti_permesso(GESTIONE_ATTIVITA_AREA) sedi = Sede.objects.filter(aree__in=aree) deleghe = me.deleghe_attuali() from anagrafica.permessi.applicazioni import DELEGATI_NON_SONO_UN_BERSAGLIO deleghe_bersaglio = deleghe.filter(tipo__in=DELEGATI_NON_SONO_UN_BERSAGLIO) if deleghe_bersaglio: if not aree.filter(obiettivo=4, nome__icontains='non sono un bersaglio'): for delega in deleghe.filter( tipo__in=DELEGATI_NON_SONO_UN_BERSAGLIO): area = Area(nome='Non sono un bersaglio', obiettivo=4, sede=delega.oggetto) area.save() if not aree: return messaggio_generico( request, me, titolo="Crea un'area di intervento, prima!", messaggio="Le aree di intervento fungono da 'contenitori' per le " "attività. Per organizzare un'attività, è necessario creare " "almeno un'area di intervento. ", torna_titolo="Gestisci le Aree di intervento", torna_url="/attivita/aree/") modulo_referente = ModuloOrganizzaAttivitaReferente(request.POST or None) modulo = ModuloOrganizzaAttivita(request.POST or None) modulo.fields['area'].queryset = me.oggetti_permesso( GESTIONE_ATTIVITA_AREA) if deleghe_bersaglio: modulo_referente.fields[ 'scelta'].choices = ModuloOrganizzaAttivitaReferente.popola_scelta( ) if modulo_referente.is_valid() and modulo.is_valid(): attivita = modulo.save(commit=False) attivita.sede = attivita.area.sede attivita.estensione = attivita.sede.comitato attivita.save() # Crea gruppo per questa specifica attività se la casella viene selezionata. crea_gruppo = modulo.cleaned_data['gruppo'] if crea_gruppo: area = attivita.area gruppo = Gruppo.objects.create( nome=attivita.nome, sede=attivita.sede, obiettivo=area.obiettivo, attivita=attivita, estensione=attivita.estensione.estensione, area=area) gruppo.aggiungi_delegato(REFERENTE_GRUPPO, me) if modulo_referente.cleaned_data['scelta'] == modulo_referente.SONO_IO: # Io sono il referente. attivita.aggiungi_delegato(REFERENTE, me, firmatario=me, inizio=poco_fa()) return redirect(attivita.url_modifica) elif modulo_referente.cleaned_data[ 'scelta'] == modulo_referente.SCEGLI_REFERENTI: # Il referente e' qualcun altro. return redirect("/attivita/organizza/%d/referenti/" % (attivita.pk, )) else: from anagrafica.models import Persona persona = Persona.objects.get( pk=modulo_referente.cleaned_data['scelta']) attivita.aggiungi_delegato(REFERENTE, persona, firmatario=me, inizio=poco_fa()) return redirect(attivita.url_modifica) contesto = { "modulo": modulo, "modulo_referente": modulo_referente, } return 'attivita_organizza.html', contesto
def attivita_gruppo(request, me): """ Crea gruppi di lavoro per il mio comitato o elimina quelli di cui sono responsabile. """ # Sono responsabile di queste aree di intervento. area_permessi = me.oggetti_permesso(GESTIONE_ATTIVITA_AREA) # Attività nelle aree di cui sono responsabile. attivita_specifica = Attivita.objects.filter(area__in=area_permessi) # Gruppi nelle aree di cui sono responsabile. gruppi_gestione = Gruppo.objects.filter(area__in=area_permessi) modulo_attivita_specifica = ModuloGruppoSpecifico( request.POST or None, attivita_specifica=attivita_specifica, request=request.POST) modulo_attivita_non_specifica = ModuloGruppoNonSpecifico( request.POST or None, area_permessi=area_permessi, request=request.POST) from anagrafica.permessi.applicazioni import REFERENTE_GRUPPO if 'specifico' in request.POST: if modulo_attivita_specifica.is_valid(): attivita_specifica = modulo_attivita_specifica.cleaned_data[ 'attivita_specifica'] area = Area.objects.get(id=attivita_specifica.area_id) gruppo = Gruppo.objects.create( nome=attivita_specifica.nome, sede=attivita_specifica.sede, obiettivo=area.obiettivo, attivita=attivita_specifica, estensione=attivita_specifica.estensione.estensione, area=attivita_specifica.area) gruppo.aggiungi_delegato(REFERENTE_GRUPPO, me) return messaggio_generico( request, None, titolo="Gruppo creato", messaggio="Hai creato un gruppo per un attività specifica", torna_url="/attivita/gruppo/", torna_titolo="Torna alla gestione dei gruppi") if 'non_specifico' in request.POST: if modulo_attivita_non_specifica.is_valid(): nome_gruppo = modulo_attivita_non_specifica.cleaned_data['nome'] area = modulo_attivita_non_specifica.cleaned_data['area'] gruppo = Gruppo.objects.create(nome=nome_gruppo, sede=area.sede, obiettivo=area.obiettivo, attivita=None, estensione=area.sede.estensione, area_id=area.id) gruppo.aggiungi_delegato(REFERENTE_GRUPPO, me) return messaggio_generico( request, None, titolo="Gruppo creato", messaggio="Hai creato un gruppo per un'area", torna_url="/attivita/gruppo/", torna_titolo="Torna alla gestione dei gruppi") contesto = { "gruppi_gestione": gruppi_gestione, "modulo_attivita_specifica": modulo_attivita_specifica, "modulo_attivita_non_specifica": modulo_attivita_non_specifica, } return 'attivita_gruppo.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
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_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