Changeset 13e7c01


Ignore:
Timestamp:
Mar 27, 2010, 1:57:39 AM (15 years ago)
Author:
Alex Dehnert <adehnert@…>
Branches:
master, client
Children:
83d9608
Parents:
3f1e074
git-author:
Alex Dehnert <adehnert@…> (03/27/10 01:57:39)
git-committer:
Alex Dehnert <adehnert@…> (03/27/10 01:57:39)
Message:

Minor refactoring of the reporting code

Location:
remit/finance_core
Files:
1 added
1 edited

Legend:

Unmodified
Added
Removed
  • remit/finance_core/views.py

    r3f1e074 r13e7c01  
    55from django.template import RequestContext
    66from django.http import Http404, HttpResponseRedirect
    7 from django.db.models import Q, Sum
     7from django.db.models import Q
    88from decimal import Decimal
     9import finance_core.reporting
    910
    1011def display_tree(request):
     
    1516    line_items = finance_core.models.LineItem.objects.all()
    1617    term_name = 'All'
    17     term_primary_Q = Q()
     18    compute_method = 'default'
     19
     20    # Main limit to lineitems, relative to primary axis
     21    main_lineitem_limit_primary = Q()
     22    if 'compute_method' in request.REQUEST:
     23        compute_method = request.REQUEST['compute_method']
    1824    if 'term' in request.REQUEST:
    1925        term_obj = get_object_or_404(finance_core.models.BudgetTerm, slug=request.REQUEST['term'])
    2026        term_name = term_obj.name
    2127        line_items = line_items.filter(budget_term=term_obj)
    22         term_primary_Q = Q(lineitem__budget_term=term_obj)
     28        main_lineitem_limit_primary = Q(lineitem__budget_term=term_obj)
    2329    if 'area' in request.REQUEST:
    2430        base_area_obj = get_object_or_404(finance_core.models.BudgetArea, pk=request.REQUEST['area'])
     
    2733    line_items = line_items.filter(budget_area__in=base_area_obj.get_descendants())
    2834    base_area_depth = base_area_obj.depth
    29     print base_area_obj
     35    #print base_area_obj
    3036
     37    # Initialize the axis
    3138    primary_name = 'Budget Areas'
    3239    primary_axis = [
     
    4350        for layer in finance_core.models.layers
    4451    ]
    45 
    4652    secondary_axis.append(('Total', Q(), Q()))
    4753
    4854    primary_labels = [ ]
    49     arcprimary = {}
    50     table = []
    51     zero = Decimal('0.00')
    5255    for num, (pk, label, qobj, ) in enumerate(primary_axis):
    5356        primary_labels.append(label)
    54         arcprimary[pk] = num
    55         table.append([zero]*len(secondary_axis))
    56     print arcprimary
    57 
    5857    secondary_labels = [ secondary[0] for secondary in secondary_axis ]
    5958
    60     def lineitem_total(obj):
    61         if obj.lineitem__amount__sum is None: return zero
    62         else: return obj.lineitem__amount__sum
    63     for num, (label, qobj_lineitem, qobj_primary) in enumerate(secondary_axis):
    64         secondary_results = (primary_axis_objs.filter(qobj_primary, term_primary_Q).annotate(Sum('lineitem__amount')))
    65         for cell in secondary_results:
    66             print cell, cell.pk, arcprimary[cell.pk], num, table[arcprimary[cell.pk]]
    67             table[arcprimary[cell.pk]][num] = lineitem_total(cell)
    68 
    69     slow = False
    70     if slow:
    71         # This uses a simpler but probably slower method
    72         # In theory, if we grow unit tests, comparing this method with
    73         # the one above using annotate would be a good idea
    74         def total_amount(queryset):
    75             amount = queryset.aggregate(Sum('amount'))['amount__sum']
    76             if amount is None: return zero
    77             else: return amount
    78         table = [ # Primary axis
    79                 [ # Secondary axis
    80                     total_amount(line_items.filter(primary[1], secondary[1]))
    81                 for secondary in secondary_axis]
    82             for primary in primary_axis]
     59    # Do the computation
     60    compute_methods = {
     61        'default':   finance_core.reporting.build_table,
     62        'aggregate': finance_core.reporting.build_table_aggregate,
     63        'annotate':  finance_core.reporting.build_table_annotate,
     64    }
     65    if compute_method in compute_methods:
     66        build_table = compute_methods[compute_method]
     67    else:
     68        raise Http404("Unknown compute_method selected")
     69    table = build_table(line_items, main_lineitem_limit_primary, primary_axis, primary_axis_objs, secondary_axis, )
    8370
    8471    debug = False
Note: See TracChangeset for help on using the changeset viewer.