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