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