Esempio n. 1
0
def attivita_statistiche(request, me):
    sedi = me.oggetti_permesso(GESTIONE_ATTIVITA_SEDE)

    modulo = ModuloStatisticheAttivita(request.POST or None, initial={"sedi": sedi})
    modulo.fields['sedi'].queryset = sedi

    statistiche = []
    chart = {}

    periodi = 12

    if modulo.is_valid():

        oggi = date.today()

        giorni = int(modulo.cleaned_data['periodo'])
        if giorni == modulo.SETTIMANA:
            etichetta = "sett."
        elif giorni == modulo.QUINDICI_GIORNI:
            etichetta = "fortn."
        elif giorni == modulo.MESE:
            etichetta = "mesi"
        else:
            raise ValueError("Etichetta mancante.")

        for periodo in range(periodi, 0, -1):

            dati = {}

            fine = oggi - timedelta(days=(giorni*periodo))
            inizio = fine - timedelta(days=giorni-1)

            fine = datetime.combine(fine, time(23, 59, 59))
            inizio = datetime.combine(inizio, time(0, 0, 0))

            dati['inizio'] = inizio
            dati['fine'] = fine

            # Prima, ottiene tutti i queryset.
            qs_attivita = Attivita.objects.filter(stato=Attivita.VISIBILE, sede__in=sedi)
            qs_turni = Turno.objects.filter(attivita__in=qs_attivita, inizio__lte=fine, fine__gte=inizio)
            qs_part = Partecipazione.con_esito_ok(turno__in=qs_turni)

            ore_di_servizio = qs_turni.annotate(durata=F('fine') - F('inizio')).aggregate(totale_ore=Sum('durata'))['totale_ore'] or timedelta()
            ore_uomo_di_servizio = qs_part.annotate(durata=F('turno__fine') - F('turno__inizio')).aggregate(totale_ore=Sum('durata'))['totale_ore'] or timedelta()

            # Poi, associa al dizionario statistiche.
            dati['etichetta'] = "%d %s fa" % (periodo, etichetta,)
            dati['num_turni'] = qs_turni.count()
            dati['ore_di_servizio'] = ore_di_servizio
            dati['ore_uomo_di_servizio'] = ore_uomo_di_servizio
            try:
                dati['rapporto'] = round(ore_uomo_di_servizio / ore_di_servizio, 3)
            except ZeroDivisionError:
                dati['rapporto'] = 0

            statistiche.append(dati)

        chart['labels'] = json.dumps([x['etichetta'] for x in statistiche])
        chart['num_turni'] = json.dumps([x['num_turni'] for x in statistiche])
        chart['ore_di_servizio'] = json.dumps([timedelta_ore(x['ore_di_servizio']) for x in statistiche])
        chart['ore_uomo_di_servizio'] = json.dumps([timedelta_ore(x['ore_uomo_di_servizio']) for x in statistiche])
        chart['rapporto'] = json.dumps([x['rapporto'] for x in statistiche])

    contesto = {
        "modulo": modulo,
        "statistiche": statistiche,
        "chart": chart,
    }
    return 'attivita_statistiche.html', contesto
Esempio n. 2
0
def attivita_statistiche(request, me):
    sedi = me.oggetti_permesso(GESTIONE_ATTIVITA_SEDE)

    modulo = ModuloStatisticheAttivita(request.POST or None,
                                       initial={"sedi": sedi})
    modulo.fields['sedi'].queryset = sedi

    statistiche = []
    chart = {}

    periodi = 12

    if modulo.is_valid():

        oggi = date.today()

        giorni = int(modulo.cleaned_data['periodo'])
        if giorni == modulo.SETTIMANA:
            etichetta = "sett."
        elif giorni == modulo.QUINDICI_GIORNI:
            etichetta = "fortn."
        elif giorni == modulo.MESE:
            etichetta = "mesi"
        else:
            raise ValueError("Etichetta mancante.")

        for periodo in range(periodi, 0, -1):

            dati = {}

            fine = oggi - timedelta(days=(giorni * periodo))
            inizio = fine - timedelta(days=giorni - 1)

            fine = datetime.combine(fine, time(23, 59, 59))
            inizio = datetime.combine(inizio, time(0, 0, 0))

            dati['inizio'] = inizio
            dati['fine'] = fine

            # Prima, ottiene tutti i queryset.
            qs_attivita = Attivita.objects.filter(stato=Attivita.VISIBILE,
                                                  sede__in=sedi)
            qs_turni = Turno.objects.filter(attivita__in=qs_attivita,
                                            inizio__lte=fine,
                                            fine__gte=inizio)
            qs_part = Partecipazione.con_esito_ok(turno__in=qs_turni)

            ore_di_servizio = qs_turni.annotate(
                durata=F('fine') - F('inizio')).aggregate(
                    totale_ore=Sum('durata'))['totale_ore'] or timedelta()
            ore_uomo_di_servizio = qs_part.annotate(
                durata=F('turno__fine') - F('turno__inizio')).aggregate(
                    totale_ore=Sum('durata'))['totale_ore'] or timedelta()

            # Poi, associa al dizionario statistiche.
            dati['etichetta'] = "%d %s fa" % (
                periodo,
                etichetta,
            )
            dati['num_turni'] = qs_turni.count()
            dati['ore_di_servizio'] = ore_di_servizio
            dati['ore_uomo_di_servizio'] = ore_uomo_di_servizio
            try:
                dati['rapporto'] = round(
                    ore_uomo_di_servizio / ore_di_servizio, 3)
            except ZeroDivisionError:
                dati['rapporto'] = 0

            statistiche.append(dati)

        chart['labels'] = json.dumps([x['etichetta'] for x in statistiche])
        chart['num_turni'] = json.dumps([x['num_turni'] for x in statistiche])
        chart['ore_di_servizio'] = json.dumps(
            [timedelta_ore(x['ore_di_servizio']) for x in statistiche])
        chart['ore_uomo_di_servizio'] = json.dumps(
            [timedelta_ore(x['ore_uomo_di_servizio']) for x in statistiche])
        chart['rapporto'] = json.dumps([x['rapporto'] for x in statistiche])

    contesto = {
        "modulo": modulo,
        "statistiche": statistiche,
        "chart": chart,
    }
    return 'attivita_statistiche.html', contesto
Esempio n. 3
0
def statistiche_attivita_persona(persona, modulo):
    """
    Ritorna un dizionario di parametri, che puo' essere passato alla vista,
    con tutti i dati statistici relativi alle attivita' effettuate da una determinata
    persona.

    :param persona_id: ID della persona.
    :param modulo: Il form validato.
    :return: Un dizionario, o None se il form non e' valido.
    """

    if not modulo.is_valid():
        return None

    oggi = date.today()

    impostazioni = {
        # num_giorni: (nome, numero_periodi)
        modulo.SETTIMANA: ("sett.", 20),
        modulo.QUINDICI_GIORNI: ("fortn.", 20),
        modulo.MESE: ("mesi", 12),
        modulo.ANNO: ("anni", 4),
    }

    giorni = int(modulo.cleaned_data['periodo'])
    etichetta, periodi = impostazioni[giorni]

    statistiche = []
    chart = {}

    for periodo in range(periodi, -1, -1):

        dati = {}

        fine = oggi - timedelta(days=(giorni * periodo))
        inizio = fine - timedelta(days=giorni - 1)

        fine = datetime.combine(fine, time(23, 59, 59))
        inizio = datetime.combine(inizio, time(0, 0, 0))

        dati['inizio'] = inizio
        dati['fine'] = fine

        # Prima, ottiene tutti i queryset.
        qs_turni = Turno.objects.filter(inizio__lte=fine, fine__gte=inizio)
        qs_part = Partecipazione.con_esito_ok(turno__in=qs_turni, persona=persona)

        ore_di_servizio = qs_part.annotate(durata=F('turno__fine') - F('turno__inizio'))\
            .aggregate(totale_ore=Sum('durata'))['totale_ore'] or timedelta()

        # Poi, associa al dizionario statistiche.
        dati['etichetta'] = "%d %s fa" % (periodo, etichetta,)
        dati['num_turni'] = qs_part.count()
        dati['ore_di_servizio'] = ore_di_servizio
        dati['ore_di_servizio_int'] = round(ore_di_servizio.total_seconds() / 3600, 3)

        statistiche.append(dati)

    chart['labels'] = json.dumps([x['etichetta'] for x in statistiche])
    chart['num_turni'] = json.dumps([x['num_turni'] for x in statistiche])
    chart['ore_di_servizio'] = json.dumps([timedelta_ore(x['ore_di_servizio']) for x in statistiche])

    return {'statistiche': statistiche,
            'chart': chart}