Пример #1
0
 def choices_for_request(self):
     self.choices = self.choices.filter(
         Q(Appartenenza.query_attuale(membro=Appartenenza.SOSTENITORE).via("appartenenze")) |
         Q(aspirante__isnull=False)
     ).exclude(
         Q(Appartenenza.query_attuale(membro=Appartenenza.VOLONTARIO).via("appartenenze"))
     ).order_by('nome', 'cognome', 'codice_fiscale').distinct('nome', 'cognome', 'codice_fiscale')
     return super(PersonaAutocompletamento, self).choices_for_request()
Пример #2
0
def crea_appartenenza(persona, sede):
    app = Appartenenza(
        persona=persona,
        sede=sede,
        membro=Appartenenza.VOLONTARIO,
        inizio="1980-12-10",
    )
    app.save()
    return app
Пример #3
0
def _calcola_anni_attivita(queryset, meno=True):

    limite = now().replace(year=now().year - LIMITE_ANNI_ATTIVITA)
    if meno:
        appartenenze_filtrate = Appartenenza.query_attuale().filter(inizio__gte=limite)
    else:
        appartenenze_filtrate = Appartenenza.query_attuale().filter(inizio__lt=limite)

    return queryset.filter(appartenenze__in=appartenenze_filtrate)
Пример #4
0
    def risultati(self):
        qs_sedi = self.args[0]

        oggi = self.modulo_riempito.cleaned_data['al_giorno']
        nascita_minima = date(oggi.year - 18, oggi.month, oggi.day)
        if self.modulo_riempito.cleaned_data['elettorato'] == ModuloElencoElettorato.ELETTORATO_ATTIVO:
            anzianita_minima = datetime(
                oggi.year - Appartenenza.MEMBRO_ANZIANITA_ELETTORATO_ATTIVO, oggi.month, oggi.day, 23, 59, 59
            )
        else:
            anzianita_minima = datetime(
                oggi.year - Appartenenza.MEMBRO_ANZIANITA_ANNI, oggi.month, oggi.day, 23, 59, 59
            )

        aggiuntivi = {
            # Anzianita' minima
            "pk__in": Persona.objects.filter(
                Appartenenza.con_esito_ok(
                    membro__in=Appartenenza.MEMBRO_ANZIANITA,
                    inizio__lte=anzianita_minima
                ).via("appartenenze")
            ).only("id")
        }
        if self.modulo_riempito.cleaned_data['elettorato'] == ModuloElencoElettorato.ELETTORATO_PASSIVO:
            # Elettorato passivo,
            aggiuntivi.update({
                # Eta' minima
                "data_nascita__lte": nascita_minima,
            })

        r = Persona.objects.filter(
            Appartenenza.query_attuale(
                al_giorno=oggi,
                sede__in=qs_sedi, membro=Appartenenza.VOLONTARIO,
            ).via("appartenenze"),
            Q(**aggiuntivi),

        ).exclude(  # Escludi quelli con dimissione negli anni di anzianita'
            appartenenze__terminazione__in=[Appartenenza.DIMISSIONE, Appartenenza.ESPULSIONE],
            appartenenze__fine__gte=anzianita_minima,

        ).exclude(  # Escludi quelli con provvedimento di sospensione non terminato
            pk__in=ProvvedimentoDisciplinare.objects.filter(
                Q(fine__gte=oggi) | Q(fine__isnull=True), inizio__lte=oggi, tipo=ProvvedimentoDisciplinare.SOSPENSIONE
            ).values_list('persona_id', flat=True)

        ).annotate(
            appartenenza_tipo=F('appartenenze__membro'),
            appartenenza_inizio=F('appartenenze__inizio'),
            appartenenza_sede=F('appartenenze__sede'),
        ).prefetch_related(
            'appartenenze', 'appartenenze__sede',
            'utenza', 'numeri_telefono'
        ).distinct('cognome', 'nome', 'codice_fiscale')
        return r
Пример #5
0
def import_import_volontari(risultato):
    i = 0
    for p in risultato:
        if _ha_errore(p):
            continue

        dati = _ottieni_dati(p)

        dati_persona = {x: y for x, y in dati.items() if x in [
            "nome", "cognome", "codice_fiscale", "data_nascita", "comune_nascita",
            "provincia_nascita", "stato_nascita", "stato_residenza",
            "cap_residenza", "indirizzo_residenza", "comune_residenza",
            "email_contatto"
        ]}

        try:
            persona = Persona.objects.get(codice_fiscale__iexact=dati_persona['codice_fiscale'])

        except Persona.DoesNotExist:
            persona = Persona(**dati_persona)
            persona.save()

        if dati['telefono']:
            persona.aggiungi_numero_telefono(dati['telefono'], servizio=False)

        if dati['telefono_servizio']:
            persona.aggiungi_numero_telefono(dati['telefono_servizio'], servizio=True)

        for app in persona.appartenenze_attuali():
            app.fine = poco_fa()
            app.save()

        # Cancella aspirante associato
        Aspirante.objects.filter(persona=persona).delete()

        app = Appartenenza(
            persona=persona,
            sede=dati['sede'],
            inizio=dati['data_ingresso'],
            membro=Appartenenza.VOLONTARIO,
        )
        app.save()

        if dati['email'] and not Utenza.objects.filter(persona=persona).exists():
            # Non ha utenza
            if not Utenza.objects.filter(email__iexact=dati['email']):
                # Non esiste, prova a creare
                u = Utenza(persona=persona, email=dati['email'])
                u.save()
                u.genera_credenziali()

        i += 1

    return i
Пример #6
0
def espandi_gestione_soci(qs_sedi, al_giorno=None):
    from anagrafica.models import Persona, Appartenenza, Trasferimento, Estensione, Riserva
    from ufficio_soci.models import Quota, Tesserino
    return [
        (MODIFICA,  Persona.objects.filter(Appartenenza.query_attuale(al_giorno=al_giorno, sede__in=qs_sedi, membro__in=Appartenenza.MEMBRO_DIRETTO).via("appartenenze"))),
        (LETTURA,   Persona.objects.filter(Appartenenza.query_attuale(al_giorno=al_giorno, sede__in=qs_sedi, membro__in=Appartenenza.MEMBRO_ESTESO).via("appartenenze"))),
        (MODIFICA,  Trasferimento.objects.filter(Appartenenza.query_attuale(al_giorno=al_giorno, sede__in=qs_sedi, membro__in=Appartenenza.MEMBRO_DIRETTO).via("persona__appartenenze"))),
        ##(LETTURA, Trasferimento.objects.filter(Appartenenza.query_attuale(al_giorno=al_giorno, sede__in=qs_sedi, membro__in=Appartenenza.MEMBRO_DIRETTO).via("persona__appartenenze__precedente")))
        (MODIFICA,  Estensione.objects.filter(Appartenenza.query_attuale(al_giorno=al_giorno, sede__in=qs_sedi, membro__in=Appartenenza.MEMBRO_DIRETTO).via("persona__appartenenze"))),
        (LETTURA,   Estensione.objects.filter(Appartenenza.query_attuale(al_giorno=al_giorno, sede__in=qs_sedi, membro__in=Appartenenza.MEMBRO_ESTESO).via("persona__appartenenze"))),
        (MODIFICA,  Quota.objects.filter(sede__in=qs_sedi)),
        (LETTURA,   Riserva.objects.filter(appartenenza__sede__in=qs_sedi)),
    ]
Пример #7
0
    def test_elettorato_passivo_trasferimento_anzianita_soddisfatta(self):

        x = Appartenenza(
            persona=self.p,
            sede=self.s,
            inizio=self.due_anni_e_mezo_fa,
            fine=self.un_anno_fa,
            terminazione=Appartenenza.TRASFERIMENTO,
        )
        x.save()

        self.a.inizio = self.un_anno_fa
        self.a.fine = None
        self.a.precedente = x
        self.a.save()

        self.assertTrue(
            self._elettorato_contiene(tipo="passivo", persona=self.p),
            "Elettorato passivo contiene volontari con doppia appartenenza valida (trasf.)"
        )

        x.inizio = self.un_anno_e_mezzo_fa
        x.save()

        self.assertFalse(
            self._elettorato_contiene(tipo="passivo", persona=self.p),
            "Elettorato attivo non contiene volontari con doppia appartenenza invalida (trasf.)"
        )

        self.a.precedente = None
        self.a.save()
        x.delete()
Пример #8
0
    def test_elettorato_attivo_dimissione_anzianita_soddisfatta(self):

        x = Appartenenza(
            persona=self.p,
            sede=self.s,
            inizio=self.due_anni_e_mezo_fa,
            fine=self.un_anno_fa,
            terminazione=Appartenenza.DIMISSIONE,
        )
        x.save()

        self.a.inizio = self.sei_mesi_fa
        self.a.fine = None
        self.a.precedente = x
        self.a.save()

        self.assertFalse(
            self._elettorato_contiene(tipo="attivo", persona=self.p),
            "Elettorato attivo NON contiene volontari con doppia appartenenza valida (DIMISSIONE)"
        )

        x.inizio = self.un_anno_e_mezzo_fa
        x.save()

        self.assertFalse(
            self._elettorato_contiene(tipo="attivo", persona=self.p),
            "Elettorato attivo non contiene volontari con doppia appartenenza invalida (DIMISSIONE)"
        )

        self.a.precedente = None
        self.a.save()
        x.delete()
Пример #9
0
    def choices_for_request(self):

        # Le mie sedi di competenza:
        #  1. La mia Sede attuale
        #  2. Il mio Comitato
        #  3. Le mie Sedi di competenza
        sedi = self.request.user.persona.sedi_attuali() \
            | self.request.user.persona.sedi_attuali().ottieni_comitati().espandi() \
            | self.request.user.persona.sedi_deleghe_attuali(espandi=True, pubblici=True)

        self.choices = self.choices.filter(
            # 1. Appartenente a una delle sedi
            Q(Appartenenza.query_attuale(sede__in=sedi).via("appartenenze"),)
            # 2. Iscritto confermato a un corso base presso una mia sede
            | Q(PartecipazioneCorsoBase.con_esito(
                    PartecipazioneCorsoBase.ESITO_OK,
                    corso__sede__in=sedi
                ).via("partecipazioni_corsi"))
            # 3. Iscritto in attesa a un corso base presso una mia sede
            | Q(PartecipazioneCorsoBase.con_esito(
                    PartecipazioneCorsoBase.ESITO_PENDING,
                    corso__sede__in=sedi
                ).via("partecipazioni_corsi"))
        )\
            .order_by('nome', 'cognome', 'codice_fiscale')\
            .distinct('nome', 'cognome', 'codice_fiscale')
        return super(PersonaAutocompletamento, self).choices_for_request()
Пример #10
0
    def risultati(self):
        qs_sedi = self.args[0]
        modulo = self.modulo_riempito

        membri = modulo.cleaned_data['membri']
        attivi = membri == modulo.MEMBRI_VOLONTARI
        ordinari = membri == modulo.MEMBRI_ORDINARI

        try:
            tesseramento = Tesseramento.objects.get(anno=modulo.cleaned_data.get('anno'))

        except Tesseramento.DoesNotExist:  # Errore tesseramento anno non esistente
            raise ValueError("Anno di tesseramento non valido o gestito da Gaia.")

        if modulo.cleaned_data['tipo'] == modulo.VERSATE:
            origine = tesseramento.paganti(attivi=attivi, ordinari=ordinari)  # Persone con quote pagate

        else:
            origine = tesseramento.non_paganti(attivi=attivi, ordinari=ordinari)  # Persone con quote NON pagate

        # Ora filtra per Sede
        q = Appartenenza.query_attuale_in_anno(modulo.cleaned_data.get('anno'))
        app = Appartenenza.objects.filter(pk__in=q).filter(sede__in=qs_sedi, membro=Appartenenza.VOLONTARIO)
        return origine.filter(appartenenze__in=app).annotate(
                appartenenza_tipo=F('appartenenze__membro'),
                appartenenza_inizio=F('appartenenze__inizio'),
                appartenenza_sede=F('appartenenze__sede'),
        ).prefetch_related('quote').distinct('cognome', 'nome', 'codice_fiscale')
Пример #11
0
    def risultati(self):
        qs_sedi = self.args[0]

        cd = self.modulo_riempito.cleaned_data
        metodo = cd['metodo']
        titoli = cd['titoli']

        base = Persona.objects.filter(
            Appartenenza.query_attuale(
                sede__in=qs_sedi, membro__in=Appartenenza.MEMBRO_SOCIO,
            ).via("appartenenze")
        ).prefetch_related(
            'appartenenze', 'appartenenze__sede',
            'utenza', 'numeri_telefono'
        )

        if metodo == self.modulo_riempito.METODO_OR:
            # Almeno un titolo
            return base.filter(titoli_personali__in=TitoloPersonale.con_esito_ok().filter(
                    titolo__in=titoli,
            )).distinct('cognome', 'nome', 'codice_fiscale')
        else:
            # Tutti i titoli
            base = base.filter(titoli_personali__in=TitoloPersonale.con_esito_ok())
            for titolo in titoli:
                base = base.filter(titoli_personali__titolo=titolo)
            return base.distinct('cognome', 'nome', 'codice_fiscale')
Пример #12
0
    def risultati(self):
        qs_sedi = self.args[0]
        tesserini_richiesti = super(ElencoTesseriniDaRichiedere, self).risultati()
        return Persona.objects.filter(
            Appartenenza.query_attuale(
                sede__in=qs_sedi, membro__in=Appartenenza.MEMBRO_TESSERINO,
            ).via("appartenenze"),

            # Con fototessera confermata
            Fototessera.con_esito_ok().via("fototessere"),

            # Escludi tesserini rifiutati
            ~Q(tesserini__stato_richiesta=Tesserino.RIFIUTATO),

        ).exclude(  # Escludi quelli richiesti da genitore
            pk__in=tesserini_richiesti.values_list('id', flat=True)

        ).annotate(
            appartenenza_tipo=F('appartenenze__membro'),
            appartenenza_inizio=F('appartenenze__inizio'),
            appartenenza_sede=F('appartenenze__sede'),
        ).prefetch_related(
            'appartenenze', 'appartenenze__sede',
            'utenza', 'numeri_telefono'
        ).distinct('cognome', 'nome', 'codice_fiscale')
Пример #13
0
def espandi_gestione_gruppo(qs_gruppi, al_giorno=None):
    from anagrafica.models import Persona
    from gruppi.models import Appartenenza
    return [
        (MODIFICA,  qs_gruppi),
        (LETTURA,   Persona.objects.filter(Appartenenza.query_attuale(al_giorno=al_giorno).via("appartenenze_gruppi"),
                                           appartenenze_gruppi__gruppo__in=qs_gruppi)),
    ]
Пример #14
0
    def risultati(self):
        qs_sedi = self.args[0]
        gruppo = self.args[1]

        return Persona.objects.filter(
            Appartenenza.query_attuale().via("appartenenze_gruppi"),
            App.query_attuale(sede__in=qs_sedi).via("appartenenze"),
            appartenenze_gruppi__gruppo=gruppo
        ).distinct('cognome', 'nome', 'codice_fiscale')
Пример #15
0
    def clean_membro(self):
        membro = self.cleaned_data['membro']
        sede = self.cleaned_data['sede']

        if not Appartenenza.membro_permesso(sede.estensione, membro):
            raise ValidationError("La Sede selezionata non può avere questo "
                                  "tipo di membri.")

        return membro
Пример #16
0
    def clean_membro(self):
        membro = self.cleaned_data['membro']
        sede = self.cleaned_data['sede']

        if not Appartenenza.membro_permesso(sede.estensione, membro):
            raise ValidationError("La Sede selezionata non può avere questo "
                                  "tipo di membri.")

        return membro
Пример #17
0
    def risultati(self):
        qs_sedi = self.args[0]
        gruppo = self.args[1]

        return Persona.objects.filter(
            Appartenenza.query_attuale().via("appartenenze_gruppi"),
            App.query_attuale(sede__in=qs_sedi).via("appartenenze"),
            appartenenze_gruppi__gruppo=gruppo).distinct(
                'cognome', 'nome', 'codice_fiscale')
Пример #18
0
def espandi_elenchi_soci(qs_sedi, al_giorno=None):
    from anagrafica.models import Persona, Appartenenza, Sede, Riserva
    from ufficio_soci.models import Quota, Tesserino
    return [
        (LETTURA,  Persona.objects.filter(Appartenenza.query_attuale(al_giorno=al_giorno, sede__in=qs_sedi).via("appartenenze"))),
        (LETTURA,  Persona.objects.filter(Appartenenza.query_attuale(al_giorno=al_giorno, sede__in=qs_sedi, membro__in=Appartenenza.MEMBRO_DIRETTO).via("appartenenze"))),
        (LETTURA,  Persona.objects.filter(Appartenenza.query_attuale(al_giorno=al_giorno, sede__in=qs_sedi, membro__in=Appartenenza.MEMBRO_ESTESO).via("appartenenze"))),
        (LETTURA,  Quota.objects.filter(Appartenenza.query_attuale(al_giorno=al_giorno, sede__in=qs_sedi, membro__in=Appartenenza.MEMBRO_ESTESO).via("persona__appartenenze"))),
        (LETTURA,  Quota.objects.filter(Q(Q(sede__in=qs_sedi) | Q(appartenenza__sede__in=qs_sedi)))),
        (LETTURA,  Persona.objects.filter(Appartenenza.query_attuale(al_giorno=al_giorno, sede__in=qs_sedi, confermata=True, ritirata=False).via("appartenenze"))),
        (LETTURA,  Persona.objects.filter(Appartenenza.con_esito_pending(sede__in=qs_sedi).via("appartenenze"))),
        (LETTURA,  Persona.objects.filter(Appartenenza.con_esito_no(sede__in=qs_sedi).via("appartenenze"))),
        (LETTURA,  Riserva.objects.filter(Appartenenza.query_attuale(al_giorno=al_giorno, sede__in=qs_sedi, confermata=True, ritirata=False).via("persona__appartenenze"))),
        (LETTURA,  Tesserino.objects.filter(Appartenenza.query_attuale(al_giorno=al_giorno, sede__in=qs_sedi, confermata=True, ritirata=False).via("persona__appartenenze"))),
    ]
Пример #19
0
 def risultati(self):
     qs_sedi = self.args[0]
     return Persona.objects.filter(
         Appartenenza.query_attuale(
             sede__in=qs_sedi, membro=Appartenenza.SOSTENITORE,
         ).via("appartenenze")
     ).prefetch_related(
         'appartenenze', 'appartenenze__sede',
         'utenza', 'numeri_telefono'
     )
 def choices_for_request(self):
     sedi = [
         d.oggetto for d in self.request.user.persona.deleghe_attuali(
             tipo__in=(UFFICIO_SOCI, UFFICIO_SOCI_UNITA))
     ]
     self.choices = self.choices.filter(
         Appartenenza.query_attuale(membro=Appartenenza.VOLONTARIO,
                                    sede__in=sedi).via("appartenenze"))
     return super(VolontarioSedeAutocompletamento,
                  self).choices_for_request()
Пример #21
0
 def risultati(self):
     qs_sedi = self.args[0]
     return Persona.objects.filter(
         Appartenenza.query_attuale(
             sede__in=qs_sedi, membro=Appartenenza.SOSTENITORE,
         ).via("appartenenze")
     ).prefetch_related(
         'appartenenze', 'appartenenze__sede',
         'utenza', 'numeri_telefono'
     )
Пример #22
0
def co_reperibilita(request, me):
    sedi = me.oggetti_permesso(GESTIONE_CENTRALE_OPERATIVA_SEDE)
    ora = poco_fa()
    reperibilita = Reperibilita.query_attuale(Appartenenza.query_attuale(sede__in=sedi).via("persona__appartenenze"),
                                              al_giorno=ora).order_by('attivazione', '-creazione')
    contesto = {
        "reperibilita": reperibilita,
        "ora": ora,
    }
    return "centrale_operativa_reperibilita.html", contesto
Пример #23
0
def espandi_gestione_gruppo(qs_gruppi, al_giorno=None):
    from anagrafica.models import Persona
    from gruppi.models import Appartenenza
    try:
        return [
            (MODIFICA, qs_gruppi),
            (LETTURA, Persona.objects.filter(Appartenenza.query_attuale(al_giorno=al_giorno).via("appartenenze_gruppi"),
                                             appartenenze_gruppi__gruppo__in=qs_gruppi)),
        ]
    except (AttributeError, ValueError, KeyError, TypeError):
        return []
Пример #24
0
    def test_dimissione_passaggio_sostenitore(self):
        c = crea_sede(estensione=PROVINCIALE)
        c.save()

        p = crea_persona()
        p.save()

        a = Appartenenza(
            persona=p,
            sede=c,
            membro=Appartenenza.VOLONTARIO,
            inizio="1980-12-10",
            confermata=True
        )
        a.save()

        d = Dimissione(
            persona=p,
            sede=c,
            appartenenza=a
        )
        d.save()

        self.assertTrue(
            a.attuale(),
            msg="L'appartenenza risulta quella attuale."
        )

        d.applica(trasforma_in_sostenitore=True)

        self.assertFalse(
            a.attuale(),
            msg="L'appartenenza risulta non più attuale."
        )

        appartenenze_attuali = p.appartenenze_attuali()

        self.assertTrue(
            appartenenze_attuali.count() == 1,
            msg="Esiste solo una appartenenza attuale come sostenitore."
        )
Пример #25
0
    def test_dimissione(self):
        c = crea_sede(estensione=PROVINCIALE)
        c.save()

        p = crea_persona()
        p.save()

        a = Appartenenza(
            persona=p,
            sede=c,
            membro=Appartenenza.VOLONTARIO,
            inizio="1980-12-10",
            confermata=True
        )
        a.save()

        d = Dimissione(
            persona=p,
            sede=c,
            appartenenza=a
        )
        d.save()

        self.assertTrue(
            a.attuale(),
            msg="L'appartenenza risulta quella attuale."
        )

        d.applica()

        self.assertFalse(
            a.attuale(),
            msg="L'appartenenza risulta non più attuale."
        )

        appartenenze_attuali = p.appartenenze_attuali()

        self.assertTrue(
            appartenenze_attuali.count() == 0,
            msg="Non esiste alcuna appartenenza attuale per dimissioni normali."
        )
Пример #26
0
 def risultati(self):
     qs_sedi = self.args[0]
     return Persona.objects.filter(
         ~Appartenenza.query_attuale(
             sede__in=qs_sedi,
         ).via("appartenenze"),
         appartenenze__sede__in=qs_sedi,
         appartenenze__terminazione__in=[Appartenenza.DIMISSIONE, Appartenenza.ESPULSIONE],
     ).prefetch_related(
         'appartenenze', 'appartenenze__sede',
         'utenza', 'numeri_telefono'
     ).distinct('cognome', 'nome', 'codice_fiscale')
Пример #27
0
 def risultati(self):
     qs_sedi = self.args[0]
     return Persona.objects.filter(
         ~Appartenenza.query_attuale(
             sede__in=qs_sedi,
         ).via("appartenenze"),
         appartenenze__sede__in=qs_sedi,
         appartenenze__terminazione__in=[Appartenenza.DIMISSIONE, Appartenenza.ESPULSIONE],
     ).prefetch_related(
         'appartenenze', 'appartenenze__sede',
         'utenza', 'numeri_telefono'
     ).distinct('cognome', 'nome', 'codice_fiscale')
Пример #28
0
 def risultati(self):
     qs_sedi = self.args[0]
     return Persona.objects.filter(
         Riserva.query_attuale(
             Riserva.con_esito_ok().q,
             Appartenenza.query_attuale(sede__in=qs_sedi).via(
                 "appartenenza")).via("riserve")).annotate(
                     appartenenza_tipo=F('appartenenze__membro'),
                     appartenenza_inizio=F('appartenenze__inizio'),
                 ).prefetch_related('appartenenze', 'appartenenze__sede',
                                    'utenza', 'numeri_telefono').distinct(
                                        'cognome', 'nome', 'codice_fiscale')
Пример #29
0
    def risultati(self):
        qs_sedi = self.args[0]

        from django.db.models import BooleanField, Value
        if self.modulo_riempito.cleaned_data['estesi'] == self.modulo_riempito.ESTESI_INGRESSO:
            # Estesi in ingresso
            risultati = Persona.objects.filter(
                Appartenenza.query_attuale(
                    sede__in=qs_sedi, membro=Appartenenza.ESTESO,
                ).via("appartenenze")
            ).annotate(is_ingresso=Value(value=True, output_field=BooleanField()))

        else:
            # Estesi in uscita
            estesi_da_qualche_parte = Persona.objects.filter(
                Appartenenza.query_attuale(
                    membro=Appartenenza.ESTESO
                ).via("appartenenze")
            ).values_list('pk', flat=True)

            volontari_da_me = Persona.objects.filter(
                Appartenenza.query_attuale(
                    sede__in=qs_sedi, membro=Appartenenza.VOLONTARIO,
                ).via("appartenenze")
            ).values_list('pk', flat=True)

            risultati = Persona.objects.filter(
                pk__in=volontari_da_me
            ).filter(
                pk__in=estesi_da_qualche_parte
            ).annotate(is_ingresso=Value(value=False, output_field=BooleanField()))

        return risultati.annotate(
                appartenenza_tipo=F('appartenenze__membro'),
                appartenenza_inizio=F('appartenenze__inizio'),
                appartenenza_sede=F('appartenenze__sede'),
        ).prefetch_related(
            'appartenenze', 'appartenenze__sede',
            'utenza', 'numeri_telefono'
        ).distinct('cognome', 'nome', 'codice_fiscale')
Пример #30
0
    def risultati(self):
        qs_sedi = self.args[0]

        from django.db.models import BooleanField, Value
        if self.modulo_riempito.cleaned_data['estesi'] == self.modulo_riempito.ESTESI_INGRESSO:
            # Estesi in ingresso
            risultati = Persona.objects.filter(
                Appartenenza.query_attuale(
                    sede__in=qs_sedi, membro=Appartenenza.ESTESO,
                ).via("appartenenze")
            ).annotate(is_ingresso=Value(value=True, output_field=BooleanField()))

        else:
            # Estesi in uscita
            estesi_da_qualche_parte = Persona.objects.filter(
                Appartenenza.query_attuale(
                    membro=Appartenenza.ESTESO
                ).via("appartenenze")
            ).values_list('pk', flat=True)

            volontari_da_me = Persona.objects.filter(
                Appartenenza.query_attuale(
                    sede__in=qs_sedi, membro=Appartenenza.VOLONTARIO,
                ).via("appartenenze")
            ).values_list('pk', flat=True)

            risultati = Persona.objects.filter(
                pk__in=volontari_da_me
            ).filter(
                pk__in=estesi_da_qualche_parte
            ).annotate(is_ingresso=Value(value=False, output_field=BooleanField()))

        return risultati.annotate(
                appartenenza_tipo=F('appartenenze__membro'),
                appartenenza_inizio=F('appartenenze__inizio'),
                appartenenza_sede=F('appartenenze__sede'),
        ).prefetch_related(
            'appartenenze', 'appartenenze__sede',
            'utenza', 'numeri_telefono'
        ).distinct('cognome', 'nome', 'codice_fiscale')
Пример #31
0
def espandi_elenchi_soci(qs_sedi, al_giorno=None):
    from anagrafica.models import Persona, Appartenenza, Sede, Riserva
    from ufficio_soci.models import Quota, Tesserino
    try:
        return [
            (LETTURA, Persona.objects.filter(Appartenenza.query_attuale(al_giorno=al_giorno, sede__in=qs_sedi).via("appartenenze"))),
            (LETTURA, Persona.objects.filter(Appartenenza.query_attuale(al_giorno=al_giorno, sede__in=qs_sedi, membro__in=Appartenenza.MEMBRO_DIRETTO).via("appartenenze"))),
            (LETTURA, Persona.objects.filter(Appartenenza.query_attuale(al_giorno=al_giorno, sede__in=qs_sedi, membro__in=Appartenenza.MEMBRO_ESTESO).via("appartenenze"))),
            (LETTURA, Quota.objects.filter(Appartenenza.query_attuale(al_giorno=al_giorno, sede__in=qs_sedi, membro__in=Appartenenza.MEMBRO_ESTESO).via("persona__appartenenze"))),
            (LETTURA, Quota.objects.filter(Q(Q(sede__in=qs_sedi) | Q(appartenenza__sede__in=qs_sedi)))),
            (LETTURA, Persona.objects.filter(Appartenenza.query_attuale(al_giorno=al_giorno, sede__in=qs_sedi, confermata=True, ritirata=False).via("appartenenze"))),
            (LETTURA, Persona.objects.filter(Appartenenza.con_esito_pending(sede__in=qs_sedi).via("appartenenze"))),
            (LETTURA, Persona.objects.filter(Appartenenza.con_esito_no(sede__in=qs_sedi).via("appartenenze"))),
            (LETTURA, Riserva.objects.filter(Appartenenza.query_attuale(al_giorno=al_giorno, sede__in=qs_sedi, confermata=True, ritirata=False).via("persona__appartenenze"))),
            (LETTURA, Tesserino.objects.filter(Appartenenza.query_attuale(al_giorno=al_giorno, sede__in=qs_sedi, confermata=True, ritirata=False).via("persona__appartenenze"))),
        ]
    except (AttributeError, ValueError, KeyError):
        return []
Пример #32
0
 def risultati(self):
     qs_sedi = self.args[0]
     return Persona.objects.filter(
         Appartenenza.query_attuale(
             sede__in=qs_sedi,
             membro=Appartenenza.ORDINARIO,
         ).via("appartenenze")).annotate(
             appartenenza_tipo=F('appartenenze__membro'),
             appartenenza_inizio=F('appartenenze__inizio'),
             appartenenza_sede=F('appartenenze__sede'),
         ).prefetch_related('appartenenze', 'appartenenze__sede', 'utenza',
                            'numeri_telefono').distinct(
                                'cognome', 'nome', 'codice_fiscale')
Пример #33
0
 def risultati(self):
     qs_sedi = self.args[0]
     return Persona.objects.filter(
         Appartenenza.query_attuale(
             sede__in=qs_sedi, membro=Appartenenza.ORDINARIO,
         ).via("appartenenze")
     ).annotate(
             appartenenza_tipo=F('appartenenze__membro'),
             appartenenza_inizio=F('appartenenze__inizio'),
             appartenenza_sede=F('appartenenze__sede'),
     ).prefetch_related(
         'appartenenze', 'appartenenze__sede',
         'utenza', 'numeri_telefono'
     ).distinct('cognome', 'nome', 'codice_fiscale')
Пример #34
0
 def risultati(self):
     qs_sedi = self.args[0]
     return Persona.objects.filter(
         Appartenenza.query_attuale(
             al_giorno=self.modulo_riempito.cleaned_data['al_giorno'],
             sede__in=qs_sedi,
             membro__in=Appartenenza.MEMBRO_SOCIO,
         ).via("appartenenze")).annotate(
             appartenenza_tipo=F('appartenenze__membro'),
             appartenenza_inizio=F('appartenenze__inizio'),
             appartenenza_sede=F('appartenenze__sede'),
         ).prefetch_related('appartenenze', 'appartenenze__sede', 'utenza',
                            'numeri_telefono').distinct(
                                'cognome', 'nome', 'codice_fiscale')
Пример #35
0
    def passibili_pagamento(self, membri=Appartenenza.MEMBRO_SOCIO):
        """
        Ritorna un elenco di tutti i passibili di pagamento di quota
         associativa per il tesseramento in essere.
        :param membri: Lista o tupla di appartenenze da considerare
        :return: QuerySet<Persona>
        """

        # Soci che hanno almeno una appartenenza confermata
        #  durante l'anno presso un Comitato CRI
        return Persona.objects.filter(
            Appartenenza.query_attuale_in_anno(self.anno).via("appartenenze"),              # Membri nell'anno
            appartenenze__membro__in=membri,                                                # ...di un socio cri
            appartenenze__sede__tipo=Sede.COMITATO,                                         # ...presso un Comitato
        )
Пример #36
0
 def risultati(self):
     qs_sedi = self.args[0]
     return Persona.objects.filter(
         Appartenenza.query_attuale(
             al_giorno=self.modulo_riempito.cleaned_data['al_giorno'],
             sede__in=qs_sedi, membro__in=Appartenenza.MEMBRO_SOCIO,
         ).via("appartenenze")
     ).annotate(
             appartenenza_tipo=F('appartenenze__membro'),
             appartenenza_inizio=F('appartenenze__inizio'),
             appartenenza_sede=F('appartenenze__sede'),
     ).prefetch_related(
         'appartenenze', 'appartenenze__sede',
         'utenza', 'numeri_telefono'
     ).distinct('cognome', 'nome', 'codice_fiscale')
Пример #37
0
    def risultati(self):
        qs_sedi = self.args[0]

        sostenitori = Persona.objects.filter(
            Appartenenza.query_attuale(
                sede__in=qs_sedi,
                membro=Appartenenza.SOSTENITORE,
            ).via("appartenenze")).values_list('pk', flat=True)
        ex = Persona.objects.filter(
            appartenenze__in=Appartenenza.objects.filter(
                sede__in=qs_sedi,
                membro=Appartenenza.SOSTENITORE,
                fine__isnull=False)).exclude(pk__in=sostenitori)
        return ex.prefetch_related('appartenenze', 'appartenenze__sede',
                                   'utenza', 'numeri_telefono')
Пример #38
0
    def passibili_pagamento(self, membri=Appartenenza.MEMBRO_SOCIO):
        """
        Ritorna un elenco di tutti i passibili di pagamento di quota
         associativa per il tesseramento in essere.
        :param membri: Lista o tupla di appartenenze da considerare
        :return: QuerySet<Persona>
        """

        # Soci che hanno almeno una appartenenza confermata
        #  durante l'anno presso un Comitato CRI
        return Persona.objects.filter(
            Appartenenza.query_attuale_in_anno(self.anno).via("appartenenze"),              # Membri nell'anno
            appartenenze__membro__in=membri,                                                # ...di un socio cri
            appartenenze__sede__tipo=Sede.COMITATO,                                         # ...presso un Comitato
        )
Пример #39
0
 def risultati(self):
     qs_sedi = self.args[0]
     return Persona.objects.filter(
         appartenenze__sede__in=qs_sedi,
         appartenenze__terminazione__in=[
             Appartenenza.TRASFERIMENTO,
         ],
     ).exclude(  # Escludi tutti i membri attuali delle mie sedi (es. trasf. interni)
         pk__in=Persona.objects.filter(
             Appartenenza.query_attuale(
                 sede__in=qs_sedi).via("appartenenze")).values_list(
                     'id', flat=True)).prefetch_related(
                         'appartenenze', 'appartenenze__sede', 'utenza',
                         'numeri_telefono').distinct(
                             'cognome', 'nome', 'codice_fiscale')
Пример #40
0
 def risultati(self):
     qs_sedi = self.args[0]
     return Persona.objects.filter(
         Riserva.query_attuale(
             Riserva.con_esito_ok().q,
             Appartenenza.query_attuale(
                 sede__in=qs_sedi
             ).via("appartenenza"),
         ).via("riserve")
     ).annotate(
             appartenenza_tipo=F('appartenenze__membro'),
             appartenenza_inizio=F('appartenenze__inizio'),
     ).prefetch_related(
         'appartenenze', 'appartenenze__sede',
         'utenza', 'numeri_telefono'
     ).distinct('cognome', 'nome', 'codice_fiscale')
Пример #41
0
 def risultati(self):
     qs_sedi = self.args[0]
     return Persona.objects.filter(
         Appartenenza.query_attuale(
             sede__in=qs_sedi, membro__in=Appartenenza.MEMBRO_TESSERINO,
         ).via("appartenenze"),
         tesserini__stato_richiesta__in=(Tesserino.ACCETTATO, Tesserino.RICHIESTO),
     ).annotate(
             appartenenza_tipo=F('appartenenze__membro'),
             appartenenza_inizio=F('appartenenze__inizio'),
             appartenenza_sede=F('appartenenze__sede'),
             tesserino_codice=F('tesserini__codice'),
     ).prefetch_related(
         'appartenenze', 'appartenenze__sede',
         'utenza', 'numeri_telefono'
     ).distinct('cognome', 'nome', 'codice_fiscale')
Пример #42
0
def attivita_gruppi_gruppo(request, me, pk):
    """
    Mostra i membri del gruppo
    """
    gruppo = get_object_or_404(Gruppo, pk=pk)
    if not me.permessi_almeno(gruppo, MODIFICA):
        return redirect(ERRORE_PERMESSI)

    sedi = Sede.objects.filter(App.query_attuale().via("appartenenze"),
                               appartenenze__persona__appartenenze_gruppi__in=gruppo.appartenenze.all())
    elenco = ElencoMembriGruppo(sedi, gruppo, gruppo=gruppo)

    contesto = {
        "elenco": elenco,
        "gruppo": gruppo,
    }
    return 'attivita_gruppi_gruppo.html', contesto
Пример #43
0
    def risultati(self):
        qs_sedi = self.args[0]
        return Persona.objects.filter(
            appartenenze__sede__in=qs_sedi,
            appartenenze__terminazione__in=[Appartenenza.TRASFERIMENTO,],

        ).exclude(  # Escludi tutti i membri attuali delle mie sedi (es. trasf. interni)
            pk__in=Persona.objects.filter(
                Appartenenza.query_attuale(
                    sede__in=qs_sedi
                ).via("appartenenze")
            ).values_list('id', flat=True)

        ).prefetch_related(
            'appartenenze', 'appartenenze__sede',
            'utenza', 'numeri_telefono'
        ).distinct('cognome', 'nome', 'codice_fiscale')
Пример #44
0
 def risultati(self):
     qs_sedi = self.args[0]
     return Persona.objects.filter(
         Appartenenza.query_attuale(
             sede__in=qs_sedi, membro__in=Appartenenza.MEMBRO_TESSERINO,
         ).via("appartenenze"),
         tesserini__stato_richiesta__in=(Tesserino.ACCETTATO, Tesserino.RICHIESTO, Tesserino.DUPLICATO),
     ).annotate(
             appartenenza_tipo=F('appartenenze__membro'),
             appartenenza_inizio=F('appartenenze__inizio'),
             appartenenza_sede=F('appartenenze__sede'),
             tesserino_pk=F('tesserini__pk'),
             tesserino_codice=F('tesserini__codice'),
             tesserino_tipo_richiesta=F('tesserini__tipo_richiesta'),
     ).prefetch_related(
         'appartenenze', 'appartenenze__sede',
         'utenza', 'numeri_telefono'
     ).distinct('cognome', 'nome', 'codice_fiscale')
Пример #45
0
    def risultati(self):
        qs_sedi = self.args[0]

        sostenitori = Persona.objects.filter(
            Appartenenza.query_attuale(
                sede__in=qs_sedi, membro=Appartenenza.SOSTENITORE,
            ).via("appartenenze")
        ).values_list('pk', flat=True)
        ex = Persona.objects.filter(
            appartenenze__in=Appartenenza.objects.filter(
                sede__in=qs_sedi, membro=Appartenenza.SOSTENITORE,
                fine__isnull=False
            )
        ).exclude(pk__in=sostenitori)
        return ex.prefetch_related(
            'appartenenze', 'appartenenze__sede',
            'utenza', 'numeri_telefono'
        )
Пример #46
0
    def risultati(self):
        qs_sedi = self.args[0]
        modulo = self.modulo_riempito

        membri = modulo.cleaned_data['membri']
        attivi = membri == modulo.MEMBRI_VOLONTARI
        ordinari = membri == modulo.MEMBRI_ORDINARI

        anno = modulo.cleaned_data['anno']

        try:
            tesseramento = Tesseramento.objects.get(anno=anno)

        except Tesseramento.DoesNotExist:  # Errore tesseramento anno non esistente
            raise ValueError(
                "Anno di tesseramento non valido o gestito da Gaia.")

        # Dobbiamo ridurre il set a tutti i volontari che sono, al giorno attuale, appartenenti a questa sede
        # Nel caso di un anno passato, generiamo l'elenco al 31 dicembre. Nel caso dell'anno in corso,
        # generiamo l'elenco al giorno attuale. Questo e' equivalente a:
        #  giorno = min(31/dicembre/<anno selezionato>, oggi)
        giorno_appartenenza = min(date(day=31, month=12, year=anno), oggi())

        if modulo.cleaned_data['tipo'] == modulo.VERSATE:
            origine = tesseramento.paganti(
                attivi=attivi, ordinari=ordinari)  # Persone con quote pagate

        else:
            origine = tesseramento.non_paganti(
                attivi=attivi,
                ordinari=ordinari)  # Persone con quote NON pagate

        # Ora filtra per Sede
        q = Appartenenza.query_attuale(
            al_giorno=giorno_appartenenza,
            membro=Appartenenza.VOLONTARIO).filter(sede__in=qs_sedi).defer(
                'membro', 'inizio', 'sede')

        return origine.filter(appartenenze__in=q).annotate(
            appartenenza_tipo=F('appartenenze__membro'),
            appartenenza_inizio=F('appartenenze__inizio'),
            appartenenza_sede=F('appartenenze__sede'),
        ).prefetch_related('quote').distinct('cognome', 'nome',
                                             'codice_fiscale')
Пример #47
0
def attivita_gruppi_gruppo(request, me, pk):
    """
    Mostra i membri del gruppo
    """
    gruppo = get_object_or_404(Gruppo, pk=pk)
    if not me.permessi_almeno(gruppo, MODIFICA):
        return redirect(ERRORE_PERMESSI)

    sedi = Sede.objects.filter(
        App.query_attuale().via("appartenenze"),
        appartenenze__persona__appartenenze_gruppi__in=gruppo.appartenenze.all(
        ))
    elenco = ElencoMembriGruppo(sedi, gruppo, gruppo=gruppo)

    contesto = {
        "elenco": elenco,
        "gruppo": gruppo,
    }
    return 'attivita_gruppi_gruppo.html', contesto
Пример #48
0
    def risultati(self):
        qs_sedi = self.args[0]
        tesserini_richiesti = super(ElencoTesseriniRifiutati, self).risultati()
        return Persona.objects.filter(
            Appartenenza.query_attuale(
                sede__in=qs_sedi,
                membro__in=Appartenenza.MEMBRO_TESSERINO,
            ).via("appartenenze"),

            # Escludi tesserini non rifiutati
            Q(tesserini__stato_richiesta=Tesserino.RIFIUTATO),
        ).exclude(  # Escludi quelli richiesti da genitore
            pk__in=tesserini_richiesti.values_list('id', flat=True)).annotate(
                appartenenza_tipo=F('appartenenze__membro'),
                appartenenza_inizio=F('appartenenze__inizio'),
                appartenenza_sede=F('appartenenze__sede'),
            ).prefetch_related('appartenenze', 'appartenenze__sede', 'utenza',
                               'numeri_telefono').distinct(
                                   'cognome', 'nome', 'codice_fiscale')
Пример #49
0
    def risultati(self):
        qs_sedi = self.args[0]

        modulo = self.modulo_riempito
        query = Q()
        if modulo.IV == modulo.cleaned_data['includi']:
            query &= Q(iv=True)
        if modulo.CM == modulo.cleaned_data['includi']:
            query &= Q(cm=True)
        return Persona.objects.filter(
            query,
            Appartenenza.query_attuale(
                sede__in=qs_sedi,
                membro__in=Appartenenza.MEMBRO_DIRETTO,
            ).via("appartenenze")).annotate(
                appartenenza_tipo=F('appartenenze__membro'),
                appartenenza_inizio=F('appartenenze__inizio'),
                appartenenza_sede=F('appartenenze__sede'),
            ).prefetch_related('appartenenze', 'appartenenze__sede', 'utenza',
                               'numeri_telefono').distinct(
                                   'cognome', 'nome', 'codice_fiscale')
Пример #50
0
    def risultati(self):
        qs_sedi = self.args[0]

        modulo = self.modulo_riempito
        attivi = Partecipazione.objects.filter(
            turno__fine__gte=modulo.cleaned_data['inizio'], turno__inizio__lte=modulo.cleaned_data['fine'],
            turno__attivita__sede__in=qs_sedi,
            confermata=True,
        ).values_list('persona_id', flat=True)
        return Persona.objects.filter(
            Appartenenza.query_attuale(
                sede__in=qs_sedi, membro__in=Appartenenza.MEMBRO_ATTIVITA,
            ).via("appartenenze")
        ).exclude(pk__in=attivi).annotate(
                appartenenza_tipo=F('appartenenze__membro'),
                appartenenza_inizio=F('appartenenze__inizio'),
                appartenenza_sede=F('appartenenze__sede'),
        ).prefetch_related(
            'appartenenze', 'appartenenze__sede',
            'utenza', 'numeri_telefono'
        ).distinct('cognome', 'nome', 'codice_fiscale')
Пример #51
0
    def risultati(self):
        qs_sedi = self.args[0]

        modulo = self.modulo_riempito
        if modulo and modulo.cleaned_data['includi_estesi'] == modulo.SI:
            appartenenze = [Appartenenza.VOLONTARIO, Appartenenza.ESTESO]
        else:
            appartenenze = [Appartenenza.VOLONTARIO,]

        return Persona.objects.filter(
            Appartenenza.query_attuale(
                sede__in=qs_sedi, membro__in=appartenenze,
            ).via("appartenenze")
        ).annotate(
                appartenenza_tipo=F('appartenenze__membro'),
                appartenenza_inizio=F('appartenenze__inizio'),
                appartenenza_sede=F('appartenenze__sede'),
        ).prefetch_related(
            'appartenenze', 'appartenenze__sede',
            'utenza', 'numeri_telefono'
        ).distinct('cognome', 'nome', 'codice_fiscale')
Пример #52
0
 def risultati(self):
     qs_sedi = self.args[0]
     tesserini_da_richiedere = super(ElencoTesseriniSenzaFototessera,
                                     self).risultati()
     tesserini_richiesti = super(ElencoTesseriniDaRichiedere,
                                 self).risultati()
     return Persona.objects.filter(
         Appartenenza.query_attuale(
             sede__in=qs_sedi,
             membro__in=Appartenenza.MEMBRO_TESSERINO,
         ).via("appartenenze"),
     ).exclude(  # Escludi quelli che posso richiedere
         pk__in=tesserini_da_richiedere.values_list(
             'id', flat=True)).exclude(  # Escludi quelli gia richiesti
                 pk__in=tesserini_richiesti.values_list('id', flat=True),
             ).annotate(
                 appartenenza_tipo=F('appartenenze__membro'),
                 appartenenza_inizio=F('appartenenze__inizio'),
                 appartenenza_sede=F('appartenenze__sede'),
             ).prefetch_related('appartenenze', 'appartenenze__sede',
                                'utenza', 'numeri_telefono').distinct(
                                    'cognome', 'nome', 'codice_fiscale')
Пример #53
0
    def choices_for_request(self, filtra_per_sede=True):
        persona = self.request.user.persona

        # Le mie sedi di competenza:
        #  1. La mia Sede attuale
        #  2. Il mio Comitato
        #  3. Le mie Sedi di competenza
        sedi_attuali = persona.sedi_attuali()
        sedi_comitato = sedi_attuali.ottieni_comitati().espandi()
        sedi_competenza = persona.sedi_deleghe_attuali(espandi=True,
                                                       pubblici=True)
        sedi = sedi_attuali | sedi_comitato | sedi_competenza

        # 1. Appartenente a una delle sedi
        q_appartenenza_sede = Q(
            Appartenenza.query_attuale(sede__in=sedi).via("appartenenze"), )

        # 2. Iscritto confermato a un corso base presso una mia sede
        q_iscritto_corso_base_mia_sede = Q(
            PartecipazioneCorsoBase.con_esito(
                PartecipazioneCorsoBase.ESITO_OK,
                corso__sede__in=sedi).via("partecipazioni_corsi"))

        # 3. Iscritto in attesa a un corso base presso una mia sede
        q_iscritto_in_attesa_corso_base_mia_sede = Q(
            PartecipazioneCorsoBase.con_esito(
                PartecipazioneCorsoBase.ESITO_PENDING,
                corso__sede__in=sedi).via("partecipazioni_corsi"))

        self.choices = self.choices.filter(
            q_appartenenza_sede |
            q_iscritto_corso_base_mia_sede |
            q_iscritto_in_attesa_corso_base_mia_sede
        ).order_by('nome', 'cognome', 'codice_fiscale')\
        .distinct('nome', 'cognome', 'codice_fiscale')

        return super(PersonaAutocompletamento, self).choices_for_request()
Пример #54
0
    def test_attivita_estesa(self):

        sicilia = Sede(
            nome="Comitato Regionale di Sicilia",
            tipo=Sede.COMITATO,
            estensione=LOCALE,
        )
        sicilia.save()

        fiumefreddo = Sede(
            nome="Comitato Locale di Fiumefreddo di Sicilia",
            tipo=Sede.COMITATO,
            estensione=LOCALE,
            genitore=sicilia,
        )
        fiumefreddo.save()

        mascali = Sede(
            nome="Comitato Locale di Mascali",
            tipo=Sede.COMITATO,
            estensione=LOCALE,
            genitore=sicilia,
        )
        mascali.save()

        calabria = Sede(
            nome="Comitato Regionale di Calabria",
            tipo=Sede.COMITATO,
            estensione=LOCALE,
        )
        calabria.save()

        area = Area(
            nome="6",
            obiettivo=6,
            sede=sicilia,
        )
        area.save()

        a = Attivita(
            stato=Attivita.VISIBILE,
            nome="Att 1",
            apertura=Attivita.APERTA,
            area=area,
            descrizione="1",
            sede=sicilia,
            estensione=sicilia,
        )
        a.save()

        a1 = Attivita(
            stato=Attivita.VISIBILE,
            nome="Att 1",
            apertura=Attivita.APERTA,
            area=area,
            descrizione="1",
            sede=fiumefreddo,
            estensione=sicilia,
        )
        a1.save()

        t = Turno(
            attivita=a,
            prenotazione=datetime.datetime(2015, 11, 10),
            inizio=datetime.datetime(2015, 11, 10),
            fine=datetime.datetime(2015, 11, 30),
            minimo=1,
            massimo=6,
        )
        t.save()

        t1 = Turno(attivita=a,
                   prenotazione=datetime.datetime(2015, 11, 10),
                   inizio=datetime.datetime(2015, 10, 10),
                   fine=datetime.datetime(2015, 10, 30))
        t1.save()

        t2 = Turno(attivita=a1,
                   prenotazione=datetime.datetime(2015, 11, 10),
                   inizio=datetime.datetime(2015, 11, 10),
                   fine=datetime.datetime(2015, 11, 30))
        t2.save()

        p = Persona(nome="Mario",
                    cognome="Rossi",
                    codice_fiscale="FRSSAKJSIKAJDO",
                    data_nascita="1994-2-5")
        p.save()

        p1 = Persona(nome="Mario",
                     cognome="Rossi",
                     codice_fiscale="FRSSAKJSIRAJDO",
                     data_nascita="1994-2-5")
        p1.save()

        p2 = Persona(nome="Mario",
                     cognome="Rossi",
                     codice_fiscale="FRSSAKJNOKAJDO",
                     data_nascita="1994-2-5")
        p2.save()

        p3 = Persona(nome="Mario",
                     cognome="Rossi",
                     codice_fiscale="FRSSAKJNOKAJMI",
                     data_nascita="1994-2-5")
        p3.save()

        app = Appartenenza(
            persona=p,
            sede=sicilia,
            membro=Appartenenza.VOLONTARIO,
            inizio="1980-12-10",
        )
        app.save()

        app1 = Appartenenza(
            persona=p1,
            sede=fiumefreddo,
            membro=Appartenenza.VOLONTARIO,
            inizio="1980-12-10",
        )
        app1.save()

        app2 = Appartenenza(
            persona=p2,
            sede=mascali,
            membro=Appartenenza.VOLONTARIO,
            inizio="1980-12-10",
        )
        app2.save()

        app3 = Appartenenza(
            persona=p3,
            sede=calabria,
            membro=Appartenenza.VOLONTARIO,
            inizio="1980-12-10",
        )
        app3.save()

        self.assertTrue(
            p2.calendario_turni(datetime.date(2015, 11, 1),
                                datetime.date(2015, 11,
                                              30)).filter(pk=t2.pk).exists(),
            msg=
            "Il turno viene trovato nel calendario - attivita' estesa al volontario"
        )

        self.assertFalse(
            p3.calendario_turni(datetime.date(2015, 11, 1),
                                datetime.date(2015, 11,
                                              30)).filter(pk=t2.pk).exists(),
            msg=
            "Il turno non viene trovato nel calendario - attivita' estesa al volontario"
        )
Пример #55
0
    def risultati(self):
        from datetime import datetime

        qs_sedi = self.args[0]
        form = self.modulo_riempito
        cd = form.cleaned_data

        oggi = cd['al_giorno']  # date
        elettorato = cd['elettorato']

        # Impostazione Anzianità
        oggi = datetime.combine(oggi, datetime.min.time())  # date -> datetime
        delta_months = oggi - relativedelta(months=Appartenenza.MEMBRO_ANZIANITA_MESI)
        anzianita_minima = delta_months.replace(hour=23, minute=59, second=59)

        aggiuntivi = {
            # Anzianita' minima 
            "pk__in": Persona.objects.filter(
                Appartenenza.con_esito_ok(
                    membro__in=[Appartenenza.VOLONTARIO, ],
                    inizio__lte=anzianita_minima,
                    terminazione__isnull=True,
                ).via("appartenenze")
            ).only("id")
        }

        # Impostazione età minima
        ETA_MINIMA_ANNI = 18 if elettorato == ModuloElencoElettorato.ELETTORATO_PASSIVO else 14
        nascita_minima = date(oggi.year - ETA_MINIMA_ANNI, oggi.month, oggi.day)

        # Update criteri query
        aggiuntivi.update({
            # Registrazione versamento della quota associativa annuale (da commentare)
            # 'quota__stato': Quota.REGISTRATA,
            # 'quota__tipo': Quota.QUOTA_SOCIO,

            "data_nascita__lte": nascita_minima,  # Età minima
        })

        # Cerca dipendenti da escludere
        dipendenti = Persona.objects.filter(
            Q(Appartenenza.query_attuale(
                membro=Appartenenza.DIPENDENTE,
                sede__in=qs_sedi,
                al_giorno=oggi,
            ).via("appartenenze")))

        # print("dipendenti", dipendenti.values_list('pk', flat=True) )

        # Query finale
        persone = Persona.objects.filter(Appartenenza.query_attuale(
            membro=Appartenenza.VOLONTARIO,
            sede__in=qs_sedi,
            al_giorno=oggi,
        ).via("appartenenze"), Q(**aggiuntivi))

        r = persone.exclude(
            # Escludi quelli con provvedimento di sospensione non terminato
            pk__in=ProvvedimentoDisciplinare.objects.filter(
                Q(fine__lte=oggi) | Q(fine__isnull=True),
                inizio__gte=oggi - relativedelta(months=24),
                tipo__in=[ProvvedimentoDisciplinare.SOSPENSIONE,
                          ProvvedimentoDisciplinare.ESPULSIONE,
                          ProvvedimentoDisciplinare.RADIAZIONE, ]
            ).values_list('persona__id', flat=True)

        ).exclude(
            pk__in=dipendenti.values_list('pk', flat=True)
        )

        # Escludi nelle liste elettorali di dove è volontario, essendo dipendente,
        # anche se in un altro comitato, non DEVE essere nella lista ne attiva e ne passiva
        qs_sedi_pk_list = qs_sedi if isinstance(qs_sedi, list) else qs_sedi.values_list('pk', flat=True)

        return r.exclude(
            pk__in=Appartenenza.query_attuale(
                membro=Appartenenza.DIPENDENTE,
                al_giorno=oggi,
                sede__pk__in=set(qs_sedi_pk_list) ^
                             set(Persona.objects.filter(pk__in=r.values_list('pk', flat=True)).values_list('appartenenze__sede__pk', flat=True)),
            ).values_list('persona__pk', flat=True)
        ).annotate(
            appartenenza_tipo=F('appartenenze__membro'),
            appartenenza_inizio=F('appartenenze__inizio'),
            appartenenza_sede=F('appartenenze__sede'),
        ).prefetch_related(
            'appartenenze', 'appartenenze__sede', 'utenza', 'numeri_telefono'
        ).distinct('cognome', 'nome', 'codice_fiscale')
Пример #56
0
 def _q_ordinari(self, solo_paganti=True):
     return Q(  # Ordinario che ha pagato almeno quota ordinario
         Appartenenza.query_attuale_in_anno(self.anno).via("appartenenze"),
         self._q_pagante() if solo_paganti else Q(),
         appartenenze__membro=Appartenenza.ORDINARIO,
     )
Пример #57
0
 def _q_volontari(self, solo_paganti=True):
     return Q(  # Oppure volontario che ha pagato almeno quota volontario
         Appartenenza.query_attuale_in_anno(self.anno).via("appartenenze"),
         self._q_pagante() if solo_paganti else Q(),
         appartenenze__membro=Appartenenza.VOLONTARIO,
     )
Пример #58
0
def _appartenenze_attive(queryset):
    return queryset.filter(
        appartenenze__in=Appartenenza.query_attuale().values_list('pk', flat='True')
    )
Пример #59
0
    def test_permessi_attivita(self):

        fiumefreddo = Sede(
            nome="Comitato Locale di Fiumefreddo di Sicilia",
            tipo=Sede.COMITATO,
            estensione=LOCALE,
        )
        fiumefreddo.save()

        mascali = Sede(
            nome="Comitato Locale di Mascali",
            tipo=Sede.COMITATO,
            estensione=LOCALE,
        )
        mascali.save()

        area = Area(
            nome="6",
            obiettivo=6,
            sede=fiumefreddo,
        )
        area.save()

        a = Attivita(
            stato=Attivita.VISIBILE,
            nome="Att 1",
            apertura=Attivita.APERTA,
            area=area,
            descrizione="1",
            sede=mascali,
        )
        a.save()

        p = Persona(nome="Mario",
                    cognome="Rossi",
                    codice_fiscale="FRSSAKJNOKAJMI",
                    data_nascita="1994-2-5")
        p.save()

        app = Appartenenza(
            persona=p,
            sede=fiumefreddo,
            membro=Appartenenza.VOLONTARIO,
            inizio="1980-12-10",
        )
        app.save()

        t = Turno(
            attivita=a,
            prenotazione=datetime.datetime(2015, 11, 10),
            inizio=datetime.datetime(2015, 11, 10),
            fine=datetime.datetime(2015, 11, 30),
            minimo=1,
            massimo=6,
        )
        t.save()

        delega = Delega(
            oggetto=a,
            persona=p,
            tipo=REFERENTE,
            inizio="2015-11-15",
        )
        delega.save()

        self.assertTrue(
            p.calendario_turni(datetime.date(2015, 11, 1),
                               datetime.date(2015, 11,
                                             30)).filter(pk=t.pk).exists(),
            msg=
            "Il turno viene trovato nel calendario - attivita' creata dalla sede del volontario"
        )