Changeset d1692e8
- Timestamp:
- Mar 27, 2010, 9:27:30 PM (14 years ago)
- Branches:
- master, client
- Children:
- a838ee3
- Parents:
- 18149fd
- git-author:
- Alex Dehnert <adehnert@…> (03/27/10 21:27:30)
- git-committer:
- Alex Dehnert <adehnert@…> (03/27/10 21:27:30)
- Location:
- remit
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
remit/finance_core/reporting.py
r18149fd rd1692e8 3 3 import finance_core.models 4 4 5 def build_table_annotate(line_items, main_lineitem_limit_primary, primary_axis, primary_axis_objs, secondary_axis, ): 6 # Setup 7 arcprimary = {} 8 table = [] 9 zero = Decimal('0.00') 10 for num, (pk, label, qobj, objrel_qobj) in enumerate(primary_axis): 11 arcprimary[pk] = num 12 table.append([zero]*len(secondary_axis)) 13 14 def lineitem_total(obj): 15 if obj.lineitem__amount__sum is None: return zero 16 else: return obj.lineitem__amount__sum 17 18 # Do the real work 19 for num, (pk, label, qobj_lineitem, qobj_primary) in enumerate(secondary_axis): 20 secondary_results = (primary_axis_objs.filter(main_lineitem_limit_primary, qobj_primary, ).annotate(Sum('lineitem__amount'))) 21 for cell in secondary_results: 22 #print cell, cell.pk, arcprimary[cell.pk], num, table[arcprimary[cell.pk]] 23 table[arcprimary[cell.pk]][num] = lineitem_total(cell) 24 25 return table 26 27 def build_table_valannotate(line_items, primary_field, secondary_field, primary_axis, secondary_axis, ): 5 def build_table_annotate(line_items, primary_field, secondary_field, primary_axis, secondary_axis, ): 28 6 # Setup 29 7 arcprimary = {} … … 31 9 table = [] 32 10 zero = Decimal('0.00') 33 for num, (pk, label, qobj, objrel_qobj) in enumerate(primary_axis):11 for num, (pk, label, qobj, ) in enumerate(primary_axis): 34 12 arcprimary[pk] = num 35 13 table.append([zero]*len(secondary_axis)) 36 for num, (pk, label, qobj, objrel_qobj) in enumerate(secondary_axis):14 for num, (pk, label, qobj, ) in enumerate(secondary_axis): 37 15 arcsecondary[pk] = num 38 16 … … 44 22 results = line_items.values(primary_field, secondary_field,).annotate(Sum('amount')) 45 23 for result in results: 46 print result 47 table[arcprimary[result[primary_field]]][arcsecondary[result[secondary_field]]] = lineitem_total(result) 48 #for num, (pk, label, qobj_lineitem, qobj_primary) in enumerate(secondary_axis): 49 # secondary_results = (primary_axis_objs.filter(main_lineitem_limit_primary, qobj_primary, ).annotate(Sum('lineitem__amount'))) 50 # for cell in secondary_results: 51 # #print cell, cell.pk, arcprimary[cell.pk], num, table[arcprimary[cell.pk]] 52 # table[arcprimary[cell.pk]][num] = lineitem_total(cell) 24 pkey = arcprimary[result[primary_field]] 25 skey = arcsecondary[result[secondary_field]] 26 assert table[pkey][skey] == zero 27 table[pkey][skey] = lineitem_total(result) 53 28 54 29 return table 55 30 56 def build_table_aggregate(line_items, main_lineitem_limit_primary, primary_axis, primary_axis_objs, secondary_axis):31 def build_table_aggregate(line_items, primary_field, secondary_field, primary_axis, secondary_axis): 57 32 # This uses a simpler but probably slower method 58 # In theory, if we grow unit tests, comparing this method with59 # the one above using annotate would be a good idea60 33 zero = Decimal('0.00') 61 34 def total_amount(queryset): … … 72 45 73 46 build_table = build_table_annotate 74 build_table = build_table_aggregate75 47 76 48 77 49 def get_primary_axis(slug, base_area, term, ): 78 50 if slug in axes and axes[slug][3]: 79 return axes[slug][0:2] + axes[slug][2](base_area, term, )51 return axes[slug][0:2] + (axes[slug][2](base_area, term, ), ) 80 52 else: 81 53 raise NotImplementedError … … 83 55 def get_secondary_axis(slug, base_area, term, ): 84 56 if slug in axes and axes[slug][4]: 85 return axes[slug][0:2] + axes[slug][2](base_area, term, )57 return axes[slug][0:2] + (axes[slug][2](base_area, term, ), ) 86 58 else: 87 59 raise NotImplementedError … … 97 69 area.indented_name(base_area_depth), 98 70 Q(budget_area=area), 99 Q(lineitem__budget_area=area),100 71 ) 101 72 for area in areas 102 73 ] 103 axis_objs = areas 104 return axis, axis_objs, 74 return axis 105 75 106 76 def get_budget_terms(base_area, term, ): … … 114 84 term.name, 115 85 Q(budget_term=term), 116 Q(lineitem__budget_term=term),117 86 ) 118 87 for term in terms 119 88 ] 120 return axis , terms89 return axis 121 90 122 91 def get_layers(base_area, term, ): … … 126 95 finance_core.models.layer_name(layer), 127 96 Q(layer=finance_core.models.layer_num(layer)), 128 Q(lineitem__layer=finance_core.models.layer_num(layer)),129 97 ) 130 98 for layer in finance_core.models.layers 131 99 ] 132 return axis , None,100 return axis 133 101 134 102 axes = { 135 103 'budget-areas': ('Budget Areas', 'budget_area', get_budget_areas, True, True, ), 136 104 'budget-terms': ('Budget Terms', 'budget_term', get_budget_terms, True, True, ), 137 'layers': ('Layers', 'layer', get_layers, False,True, ),105 'layers': ('Layers', 'layer', get_layers, True, True, ), 138 106 } 139 107 -
remit/finance_core/reporting_tests.sh
r18149fd rd1692e8 1 1 #!/bin/bash 2 2 3 methods="annotate aggregate valannotate"3 methods="annotate aggregate" 4 4 baseurl=${1:-http://localhost:8001/finance_core/reporting/?a=b} 5 5 baseurls="$baseurl&term=2010-spring $baseurl&area=13 $baseurl&layer=30" … … 8 8 dirname=$(mktemp -d /tmp/remit.XXXXXX) 9 9 cd $dirname 10 wget - O default.html "$baseurl"10 wget -q -O default.html "$baseurl" 11 11 for method in $methods; do 12 12 wget -q -O $method.html "$baseurl&compute_method=$method" -
remit/finance_core/views.py
r18149fd rd1692e8 22 22 ############################### 23 23 line_items = finance_core.models.LineItem.objects.all() 24 # Main limit to lineitems, relative to primary axis25 main_lineitem_limits_primary = []26 24 27 25 # Term … … 30 28 term_name = term_obj.name 31 29 line_items = line_items.filter(budget_term=term_obj) 32 main_lineitem_limits_primary.append(Q(lineitem__budget_term=term_obj))33 30 else: 34 31 term_obj = None … … 41 38 base_area_obj = finance_core.models.BudgetArea.get_by_path(['Accounts']) 42 39 all_relevant_areas = base_area_obj.get_descendants() 40 if term_obj: 41 all_relevant_areas = all_relevant_areas.filter(Q(always=True) | Q(budget_term=term_obj)) 43 42 line_items = line_items.filter(budget_area__in=all_relevant_areas) 44 main_lineitem_limits_primary.append(Q(lineitem__budget_area__in=all_relevant_areas))45 43 46 44 # Layer … … 52 50 raise Http404("Invalid layer %s request" % request.REQUEST['layer']) 53 51 line_items = line_items.filter(layer=layer_id) 54 main_lineitem_limits_primary.append(Q(lineitem__layer=layer_id))55 52 else: 56 53 layer = 'all' 57 main_lineitem_limit_primary = Q(*main_lineitem_limits_primary)58 54 59 55 ####################### … … 66 62 primary_slug = 'budget-areas' 67 63 try: 68 primary_name, primary_field, primary_axis , primary_axis_objs= finance_core.reporting.get_primary_axis(primary_slug, base_area_obj, term_obj, )64 primary_name, primary_field, primary_axis = finance_core.reporting.get_primary_axis(primary_slug, base_area_obj, term_obj, ) 69 65 except NotImplementedError: 70 66 raise Http404("Primary axis %s is not implemented" % primary_slug) … … 76 72 secondary_slug = 'layers' 77 73 try: 78 secondary_name, secondary_field, secondary_axis , secondary_axis_obj= finance_core.reporting.get_secondary_axis(secondary_slug, base_area_obj, term_obj, )74 secondary_name, secondary_field, secondary_axis = finance_core.reporting.get_secondary_axis(secondary_slug, base_area_obj, term_obj, ) 79 75 except NotImplementedError: 80 76 raise Http404("Secondary axis %s is not implemented" % secondary_slug) … … 82 78 83 79 primary_labels = [ ] 84 for num, (pk, label, qobj, objrel_qobj,) in enumerate(primary_axis):80 for num, (pk, label, qobj, ) in enumerate(primary_axis): 85 81 primary_labels.append(label) 86 82 secondary_labels = [ secondary[1] for secondary in secondary_axis ] … … 94 90 'annotate': finance_core.reporting.build_table_annotate, 95 91 } 96 if compute_method == 'valannotate':97 table = finance_core.reporting.build_table_valannotate(line_items, primary_field, secondary_field, primary_axis, secondary_axis, )92 if compute_method in compute_methods: 93 build_table = compute_methods[compute_method] 98 94 else: 99 if compute_method in compute_methods: 100 build_table = compute_methods[compute_method] 101 else: 102 raise Http404("Unknown compute_method selected") 103 table = build_table(line_items, main_lineitem_limit_primary, primary_axis, primary_axis_objs, secondary_axis, ) 95 raise Http404("Unknown compute_method selected") 96 table = build_table(line_items, primary_field, secondary_field, primary_axis, secondary_axis, ) 104 97 98 debug = True 105 99 debug = False 106 100 if debug: -
remit/remit_templates/finance_core/reporting.html
r193dfcd rd1692e8 40 40 <th>Primary Axis</th> 41 41 <td><select name='primary'> 42 {% for slug, content in axes.items %}{% if content. 2%}<option {% ifequal primary_name content.0 %}selected {% endifequal %}value='{{slug}}'>{{content.0}}</option>{% endif %}{% endfor %}42 {% for slug, content in axes.items %}{% if content.3 %}<option {% ifequal primary_name content.0 %}selected {% endifequal %}value='{{slug}}'>{{content.0}}</option>{% endif %}{% endfor %} 43 43 </select></td> 44 44 </tr> … … 46 46 <th>Secondary Axis</th> 47 47 <td><select name='secondary'> 48 {% for slug, content in axes.items %}{% if content. 3%}<option {% ifequal secondary_name content.0 %}selected {% endifequal %}value='{{slug}}'>{{content.0}}</option>{% endif %}{% endfor %}48 {% for slug, content in axes.items %}{% if content.4 %}<option {% ifequal secondary_name content.0 %}selected {% endifequal %}value='{{slug}}'>{{content.0}}</option>{% endif %}{% endfor %} 49 49 </select></td> 50 50 </tr>
Note: See TracChangeset
for help on using the changeset viewer.