Changeset d1692e8


Ignore:
Timestamp:
Mar 27, 2010, 9:27:30 PM (14 years ago)
Author:
Alex Dehnert <adehnert@…>
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)
Message:

Finally completely punt the old-style annotate

Location:
remit
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • remit/finance_core/reporting.py

    r18149fd rd1692e8  
    33import finance_core.models
    44
    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, ):
     5def build_table_annotate(line_items, primary_field, secondary_field, primary_axis, secondary_axis, ):
    286    # Setup
    297    arcprimary = {}
     
    319    table = []
    3210    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):
    3412        arcprimary[pk] = num
    3513        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):
    3715        arcsecondary[pk] = num
    3816
     
    4422    results = line_items.values(primary_field, secondary_field,).annotate(Sum('amount'))
    4523    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)
    5328
    5429    return table
    5530
    56 def build_table_aggregate(line_items, main_lineitem_limit_primary, primary_axis, primary_axis_objs, secondary_axis):
     31def build_table_aggregate(line_items, primary_field, secondary_field, primary_axis, secondary_axis):
    5732    # This uses a simpler but probably slower method
    58     # In theory, if we grow unit tests, comparing this method with
    59     # the one above using annotate would be a good idea
    6033    zero = Decimal('0.00')
    6134    def total_amount(queryset):
     
    7245
    7346build_table = build_table_annotate
    74 build_table = build_table_aggregate
    7547
    7648
    7749def get_primary_axis(slug, base_area, term, ):
    7850    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, ), )
    8052    else:
    8153        raise NotImplementedError
     
    8355def get_secondary_axis(slug, base_area, term, ):
    8456    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, ), )
    8658    else:
    8759        raise NotImplementedError
     
    9769            area.indented_name(base_area_depth),
    9870            Q(budget_area=area),
    99             Q(lineitem__budget_area=area),
    10071        )
    10172        for area in areas
    10273    ]
    103     axis_objs = areas
    104     return axis, axis_objs,
     74    return axis
    10575
    10676def get_budget_terms(base_area, term, ):
     
    11484            term.name,
    11585            Q(budget_term=term),
    116             Q(lineitem__budget_term=term),
    11786        )
    11887        for term in terms
    11988    ]
    120     return axis, terms
     89    return axis
    12190
    12291def get_layers(base_area, term, ):
     
    12695            finance_core.models.layer_name(layer),
    12796            Q(layer=finance_core.models.layer_num(layer)),
    128             Q(lineitem__layer=finance_core.models.layer_num(layer)),
    12997        )
    13098        for layer in finance_core.models.layers
    13199    ]
    132     return axis, None,
     100    return axis
    133101
    134102axes = {
    135103    'budget-areas': ('Budget Areas', 'budget_area', get_budget_areas, True,  True,  ),
    136104    '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,  ),
    138106}
    139107
  • remit/finance_core/reporting_tests.sh

    r18149fd rd1692e8  
    11#!/bin/bash
    22
    3 methods="annotate aggregate valannotate"
     3methods="annotate aggregate"
    44baseurl=${1:-http://localhost:8001/finance_core/reporting/?a=b}
    55baseurls="$baseurl&term=2010-spring $baseurl&area=13 $baseurl&layer=30"
     
    88    dirname=$(mktemp -d /tmp/remit.XXXXXX)
    99    cd $dirname
    10     wget -O default.html "$baseurl"
     10    wget -q -O default.html "$baseurl"
    1111    for method in $methods; do
    1212        wget -q -O $method.html  "$baseurl&compute_method=$method"
  • remit/finance_core/views.py

    r18149fd rd1692e8  
    2222    ###############################
    2323    line_items = finance_core.models.LineItem.objects.all()
    24     # Main limit to lineitems, relative to primary axis
    25     main_lineitem_limits_primary = []
    2624
    2725    # Term
     
    3028        term_name = term_obj.name
    3129        line_items = line_items.filter(budget_term=term_obj)
    32         main_lineitem_limits_primary.append(Q(lineitem__budget_term=term_obj))
    3330    else:
    3431        term_obj = None
     
    4138        base_area_obj = finance_core.models.BudgetArea.get_by_path(['Accounts'])
    4239    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))
    4342    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))
    4543
    4644    # Layer
     
    5250            raise Http404("Invalid layer %s request" % request.REQUEST['layer'])
    5351        line_items = line_items.filter(layer=layer_id)
    54         main_lineitem_limits_primary.append(Q(lineitem__layer=layer_id))
    5552    else:
    5653        layer = 'all'
    57     main_lineitem_limit_primary = Q(*main_lineitem_limits_primary)
    5854
    5955    #######################
     
    6662        primary_slug = 'budget-areas'
    6763    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, )
    6965    except NotImplementedError:
    7066        raise Http404("Primary axis %s is not implemented" % primary_slug)
     
    7672        secondary_slug = 'layers'
    7773    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, )
    7975    except NotImplementedError:
    8076        raise Http404("Secondary axis %s is not implemented" % secondary_slug)
     
    8278
    8379    primary_labels = [ ]
    84     for num, (pk, label, qobj, objrel_qobj, ) in enumerate(primary_axis):
     80    for num, (pk, label, qobj, ) in enumerate(primary_axis):
    8581        primary_labels.append(label)
    8682    secondary_labels = [ secondary[1] for secondary in secondary_axis ]
     
    9490        'annotate':  finance_core.reporting.build_table_annotate,
    9591    }
    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]
    9894    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, )
    10497
     98    debug = True
    10599    debug = False
    106100    if debug:
  • remit/remit_templates/finance_core/reporting.html

    r193dfcd rd1692e8  
    4040    <th>Primary Axis</th>
    4141    <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 %}
    4343    </select></td>
    4444</tr>
     
    4646    <th>Secondary Axis</th>
    4747    <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 %}
    4949    </select></td>
    5050</tr>
Note: See TracChangeset for help on using the changeset viewer.