Ejemplo n.º 1
0
    def get_aggregates(self):
        ##
        # calls the functions to get the aggregates and returns a dict
        # all the function called depend on the filters passed to AggregatePageMixin on initialization
        # so they return context-based data
        ##

        agg_dict = {
            'status': {
                'programmazione': self._get_programmazione_status(),
                'pianificazione': self._get_pianificazione_status(),
                'attuazione': self._get_attuazione_status(),
                'varianti': self._get_varianti_status(),
                'progettazione': self._get_progettazione_status(),
                'in_corso': self._get_in_corso_status(),
                'conclusi': self._get_conclusi_status(),
            },
            'total_percentage': {
                'programmazione': 0,
                'pianificazione': 0,
                'attuazione': 0,
            }
        }

        # calculates percentages of programmazione / pianificazione / attuazione compared to the whole of projects
        agg_dict['total_percentage']['programmazione'] = (agg_dict['status']['programmazione']['sum'] /
                                                          InterventoProgramma.programmati.all().with_count()[
                                                              'sum']) * Decimal(100.0)
        agg_dict['total_percentage']['pianificazione'] = (agg_dict['status']['pianificazione']['sum'] /
                                                          InterventoProgramma.pianificati.all().with_count()[
                                                              'sum']) * Decimal(100.0)
        agg_dict['total_percentage']['attuazione'] = (agg_dict['status']['attuazione']['sum'] /
                                                      InterventoProgramma.attuazione.all().with_count()[
                                                          'sum']) * Decimal(100.0)

        agg_dict['total_percentage']['programmazione'] = "{0:.2f}".format(
            agg_dict['total_percentage']['programmazione'])
        agg_dict['total_percentage']['pianificazione'] = "{0:.2f}".format(
            agg_dict['total_percentage']['pianificazione'])
        agg_dict['total_percentage']['attuazione'] = "{0:.2f}".format(agg_dict['total_percentage']['attuazione'])


        # calculate percentages of pianificazione / attuazione / varianti based on current filters
        agg_dict['status']['pianificazione']['percentage'] = 0.0
        agg_dict['status']['attuazione']['percentage'] = 0.0
        agg_dict['status']['varianti']['percentage'] = 0.0

        if agg_dict['status']['programmazione']['sum'] > 0 and agg_dict['status']['pianificazione']['sum'] > 0:
            agg_dict['status']['pianificazione']['percentage'] = Decimal(100.0) * (
                agg_dict['status']['pianificazione']['sum'] /
                agg_dict['status']['programmazione']['sum'])

            if agg_dict['status']['attuazione']['sum']:
                agg_dict['status']['attuazione']['percentage'] = Decimal(100.0) * (
                    agg_dict['status']['attuazione']['sum'] /
                    agg_dict['status']['programmazione']['sum'])

        # calculates % in varianti compared to attuazione importo
        if agg_dict['status']['attuazione']['sum'] > 0 and agg_dict['status']['varianti']['sum']:
            agg_dict['status']['varianti']['percentage'] = Decimal(100.0) * (
                agg_dict['status']['varianti']['sum'] /
                agg_dict['status']['attuazione']['sum'])

        # top importo interventi fetch
        agg_dict['interventi_top_importo'] = self.fetch_top_interventi_attuazione()

        # Get tipo immobile pie data
        if self.tipologia != self.TIPO_IMMOBILE:
            agg_dict['tipo_immobile_aggregates'] = InterventoProgramma.get_tipo_immobile_aggregates(
                **self.programmazione_filters)

        if self.tipologia != self.IMPRESA:
            agg_dict['imprese_top'] = self.fetch_imprese()

        # Get tipo sogg.att data
        if self.tipologia != self.SOGG_ATT and self.tipologia != self.IMPRESA:
            agg_dict['sogg_att_aggregates'] = InterventoProgramma.get_sogg_attuatore_aggregates(
                **self.programmazione_filters)
            agg_dict['sogg_att_top'] = self.fetch_sogg_att()

        # Get donazioni data

        # if home or localita page: use programmazione filters ( no filters or territorio filters)
        # else (tipo immobile) use DonazioneInterventoProgramma filters
        if self.tipologia == self.HOME or self.tipologia == self.TERRITORIO:
            agg_dict['donazioni_aggregates'] = self._get_aggr_donazioni()
            agg_dict['donazioni_totale'] = self._get_totale_donazioni()
        else:
            agg_dict['donazioni_aggregates'] = self._get_aggr_donazioni_interventi()
            agg_dict['donazioni_totale'] = self._get_totale_donazioni_interventi()

        return agg_dict