[13e7c01] | 1 | from decimal import Decimal |
---|
| 2 | from django.db.models import Sum |
---|
| 3 | |
---|
| 4 | def build_table_annotate(line_items, main_lineitem_limit_primary, primary_axis, primary_axis_objs, secondary_axis, ): |
---|
| 5 | # Setup |
---|
| 6 | arcprimary = {} |
---|
| 7 | table = [] |
---|
| 8 | zero = Decimal('0.00') |
---|
| 9 | for num, (pk, label, qobj, ) in enumerate(primary_axis): |
---|
| 10 | arcprimary[pk] = num |
---|
| 11 | table.append([zero]*len(secondary_axis)) |
---|
| 12 | |
---|
| 13 | def lineitem_total(obj): |
---|
| 14 | if obj.lineitem__amount__sum is None: return zero |
---|
| 15 | else: return obj.lineitem__amount__sum |
---|
| 16 | |
---|
| 17 | # Do the real work |
---|
| 18 | print secondary_axis |
---|
| 19 | for num, (label, qobj_lineitem, qobj_primary) in enumerate(secondary_axis): |
---|
| 20 | print num |
---|
| 21 | secondary_results = (primary_axis_objs.filter(main_lineitem_limit_primary, qobj_primary, ).annotate(Sum('lineitem__amount'))) |
---|
| 22 | for cell in secondary_results: |
---|
| 23 | #print cell, cell.pk, arcprimary[cell.pk], num, table[arcprimary[cell.pk]] |
---|
| 24 | table[arcprimary[cell.pk]][num] = lineitem_total(cell) |
---|
| 25 | |
---|
| 26 | return table |
---|
| 27 | |
---|
| 28 | def build_table_aggregate(line_items, main_lineitem_limit_primary, primary_axis, primary_axis_objs, secondary_axis): |
---|
| 29 | # This uses a simpler but probably slower method |
---|
| 30 | # In theory, if we grow unit tests, comparing this method with |
---|
| 31 | # the one above using annotate would be a good idea |
---|
| 32 | zero = Decimal('0.00') |
---|
| 33 | def total_amount(queryset): |
---|
| 34 | amount = queryset.aggregate(Sum('amount'))['amount__sum'] |
---|
| 35 | if amount is None: return zero |
---|
| 36 | else: return amount |
---|
| 37 | table = [ # Primary axis |
---|
| 38 | [ # Secondary axis |
---|
| 39 | total_amount(line_items.filter(primary[2], secondary[1])) |
---|
| 40 | for secondary in secondary_axis] |
---|
| 41 | for primary in primary_axis] |
---|
| 42 | |
---|
| 43 | return table |
---|
| 44 | |
---|
| 45 | |
---|
| 46 | build_table = build_table_annotate |
---|