def report(self, date, step, length, **kwargs): gr = self.group_report(date, step, length, **kwargs) max_date = date if date else latest_entry_date() return { self.pk: self.group_report(date, step, length, **kwargs), 'max_date': max_date, 'length': length, 'step': step, 'pk': self.pk, }
def report(self, date, step, length, **kwargs): result = self.group_report(date, step, length, **kwargs) roots = self.groups.values_list('pk', flat=True) monthly_result = { 'group_id': None, 'level': 0, 'name': self.name, 'parent_id': None, 'lft': 0, 'json': {} } if roots: root_results = {pk: result[pk]['json'] for pk in roots} for group, group_result in root_results.items(): for _date, data in group_result.items(): date_dict = monthly_result['json'].get(_date, { 'billed_cons': 0.0, 'billed_corp': 0.0, 'billed': 0.0, 'total': 0.0,}) date_dict['billed_cons'] += data['billed_cons'] date_dict['billed_corp'] += data['billed_corp'] date_dict['billed'] += data['billed_cons'] + data['billed_corp'] date_dict['total'] += data['total'] monthly_result['json'][_date] = date_dict # generate corp/cons etc for the monthly dict json = monthly_result['json'] for _date, data in json.items(): try: cons_index = data['billed_cons'] / data['billed'] except ZeroDivisionError: cons_index = 0.5 corp_index = 1 - cons_index json[_date]['cons'] = data['total'] * cons_index json[_date]['corp'] = data['total'] * corp_index json[_date]['corp_index'] = corp_index json[_date]['cons_index'] = cons_index result.update({'total': monthly_result}) return { 'total': result, 'max_date': date if date else latest_entry_date(), 'length': length, 'step': step, 'pk': 'total', }
def report(self, date, step, length, **kwargs): from pannel.report import Report date = date if date else latest_entry_date() result = Report(Account.objects.filter(pk=self.pk)).report(date, step, length, **kwargs) result[self.pk].update({ 'name': self.name, }) return { self.pk: result, 'step': step, 'length': length, 'max_date': date, 'pk': self.pk, 'name': self.name, }
def group_report(self, date, step, length, **kwargs): date = date if date else latest_entry_date() qs = kwargs.get('queryset', self.report_queryset()) reporting = kwargs.get('reporting', self.reporting()) if not kwargs.get('fields', None): kwargs['fields'] = {'group_id': F('group_id'), 'parent_id': F('group_id'), 'lft': 9000, 'name': F('name'), 'id': F('pk')} kwargs.update({'queryset': qs}) report = self.accounts_report(date, step, length, **kwargs) groups = list(qs.values('name', 'id', 'level', 'parent_id', 'lft')) result = {} for g in groups: g['json'] = {} g['group_id'] = g['id'] result[g['id']] = g # for every account, insert elements into group # this part of the code must be wrong, because we don't need # an O(n) operation, so we could probably skip the reporting() bit. for code, values in report.items(): result[code] = values group_id = report[code]['group_id'] for contributor, parent in self.reporting(): if group_id == parent: for _date, data in values['json'].items(): date_dict = result[group_id]['json'].get(_date, { 'billed_cons': 0.0, 'billed_corp': 0.0, 'billed': 0.0, 'total': 0.0,}) date_dict['billed_cons'] += data['billed_cons'] date_dict['billed_corp'] += data['billed_corp'] date_dict['billed'] += data['billed_cons'] + data['billed_corp'] date_dict['total'] += data['total'] result[group_id]['json'][_date] = date_dict for group, values in result.items(): json = values['json'] for _date, d in json.items(): try: cons_index = d['billed_cons'] / d['billed'] except ZeroDivisionError: cons_index = 0.5 corp_index = 1 - cons_index json[_date]['cons'] = d['total'] * cons_index json[_date]['corp'] = d['total'] * corp_index json[_date]['cons_index'] = cons_index json[_date]['corp_index'] = corp_index result.update(**report) final_result = result.copy() # now, for every group, insert elements into parent_id json dict for contributor, parent in self.reporting(): if contributor != parent: for _date, data in result[contributor]['json'].items(): date_dict = final_result[parent]['json'].get(_date, { 'billed_cons': 0.0, 'billed_corp': 0.0, 'billed': 0.0, 'total': 0.0,}) date_dict['billed_cons'] += data['billed_cons'] date_dict['billed_corp'] += data['billed_corp'] date_dict['billed'] += data['billed_cons'] + data['billed_corp'] date_dict['total'] += data['total'] final_result[parent]['json'][_date] = date_dict else: # At this point we're done inheriting from subgroups, # so we can build the final corp and cons values from billed for _date, data in final_result[parent]['json'].items(): date_dict = final_result[parent]['json'].get(_date) try: cons_index = date_dict['billed_cons'] / date_dict['billed'] except ZeroDivisionError: cons_index = 0.5 corp_index = 1 - cons_index final_result[parent]['json'][_date]['cons'] = date_dict['total'] * cons_index final_result[parent]['json'][_date]['corp'] = date_dict['total'] * corp_index final_result[parent]['json'][_date]['cons_index'] = cons_index final_result[parent]['json'][_date]['corp_index'] = corp_index return final_result
def accounts_report(self, date, step, length, **kwargs): from pannel.report import Report qs = kwargs.pop('queryset', self.report_queryset()) pks = qs.values('pk') date = date if date else latest_entry_date() return Report(Account.objects.filter(group_id__in=pks)).report(date, step, length, **kwargs)