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
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
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}