Changeset 1204352


Ignore:
Timestamp:
Mar 28, 2010, 2:46:00 AM (15 years ago)
Author:
Alex Dehnert <adehnert@…>
Branches:
master, client
Children:
3111c8a
Parents:
c1d9650 (diff), ea32cd9 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
git-author:
Alex Dehnert <adehnert@…> (03/28/10 02:46:00)
git-committer:
Alex Dehnert <adehnert@…> (03/28/10 02:46:00)
Message:

Merge branch 'balances'

Location:
remit
Files:
3 added
7 edited

Legend:

Unmodified
Added
Removed
  • remit/finance_core/models.py

    r0e58ad0 rdd2c3d9  
    1212    # Applicable to every term?
    1313    always = models.BooleanField(blank=True, default=False)
     14    budget_term = models.ManyToManyField('BudgetTerm', through='BudgetAreaTerm')
    1415
    1516    # Contact / ACL information
  • remit/finance_core/urls.py

    r92ca60e red4ccc7  
    44urlpatterns = patterns('',
    55    (r'^display_accounts', finance_core.views.display_tree),
     6    url(r'reporting/', finance_core.views.reporting, name='reporting', ),
    67)
  • remit/finance_core/views.py

    r92ca60e rea32cd9  
    11from django.http import HttpResponse
    2 import vouchers.models
     2import finance_core.models
     3from django.contrib.auth.decorators import user_passes_test
     4from django.shortcuts import render_to_response, get_object_or_404
     5from django.template import RequestContext
     6from django.http import Http404, HttpResponseRedirect
     7from django.db.models import Q
     8from decimal import Decimal
     9import finance_core.reporting
    310
    411def display_tree(request):
    5     root = vouchers.models.BudgetArea.get_by_path(['Accounts'])
     12    root = finance_core.models.BudgetArea.get_by_path(['Accounts'])
    613    return HttpResponse(root.dump_to_html())
     14
     15def reporting(request):
     16    compute_method = 'default'
     17    if 'compute_method' in request.REQUEST:
     18        compute_method = request.REQUEST['compute_method']
     19
     20    ###############################
     21    # Retrieve the various limits #
     22    ###############################
     23    line_items = finance_core.models.LineItem.objects.all()
     24
     25    # Term
     26    if 'term' in request.REQUEST and not request.REQUEST['term'] == 'all':
     27        term_obj = get_object_or_404(finance_core.models.BudgetTerm, slug=request.REQUEST['term'])
     28        term_name = term_obj.name
     29        line_items = line_items.filter(budget_term=term_obj)
     30    else:
     31        term_obj = None
     32        term_name = 'All'
     33
     34    # Area
     35    if 'area' in request.REQUEST:
     36        base_area_obj = get_object_or_404(finance_core.models.BudgetArea, pk=request.REQUEST['area'])
     37    else:
     38        base_area_obj = finance_core.models.BudgetArea.get_by_path(['Accounts'])
     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))
     42    line_items = line_items.filter(budget_area__in=all_relevant_areas)
     43
     44    # Layer
     45    if 'layer' in request.REQUEST and request.REQUEST['layer'] != 'all':
     46        try:
     47            layer_id = int(request.REQUEST['layer'])
     48            layer = finance_core.models.get_layer_by_num(layer_id)
     49        except KeyError:
     50            raise Http404("Invalid layer %s request" % request.REQUEST['layer'])
     51        line_items = line_items.filter(layer=layer_id)
     52    else:
     53        layer = 'all'
     54
     55    #######################
     56    # Initialize the axes #
     57    #######################
     58    # Primary
     59    if 'primary' in request.REQUEST:
     60        primary_slug = request.REQUEST['primary']
     61    else:
     62        primary_slug = 'budget-areas'
     63    try:
     64        primary_name, primary_field, primary_axis = finance_core.reporting.get_primary_axis(primary_slug, base_area_obj, term_obj, )
     65    except NotImplementedError:
     66        raise Http404("Primary axis %s is not implemented" % primary_slug)
     67
     68    # Secondary
     69    if 'secondary' in request.REQUEST:
     70        secondary_slug = request.REQUEST['secondary']
     71    else:
     72        secondary_slug = 'layers'
     73    try:
     74        secondary_name, secondary_field, secondary_axis = finance_core.reporting.get_secondary_axis(secondary_slug, base_area_obj, term_obj, )
     75    except NotImplementedError:
     76        raise Http404("Secondary axis %s is not implemented" % secondary_slug)
     77
     78    primary_labels = [ ]
     79    for num, (pk, label, qobj, ) in enumerate(primary_axis):
     80        primary_labels.append(label)
     81    secondary_labels = [ secondary[1] for secondary in secondary_axis ]
     82
     83    ######################
     84    # Do the computation #
     85    ######################
     86    compute_methods = {
     87        'default':   finance_core.reporting.build_table,
     88        'aggregate': finance_core.reporting.build_table_aggregate,
     89        'annotate':  finance_core.reporting.build_table_annotate,
     90    }
     91    if compute_method in compute_methods:
     92        build_table = compute_methods[compute_method]
     93    else:
     94        raise Http404("Unknown compute_method selected")
     95    table = build_table(line_items, primary_field, secondary_field, primary_axis, secondary_axis, )
     96    finance_core.reporting.append_totals(table)
     97    primary_labels.append("Total")
     98    secondary_labels.append("Total")
     99
     100    debug = True
     101    debug = False
     102    if debug:
     103        from django.db import connection
     104        print connection.queries
     105        print "Number of queries:\t%d" % (len(connection.queries),)
     106        print "Table size:\t%dx%d" % (len(primary_labels), len(secondary_labels), )
     107
     108    ##########
     109    # Render #
     110    ##########
     111    term_options = finance_core.models.BudgetTerm.objects.all()
     112    area_options = finance_core.models.BudgetArea.objects.filter(always=True)
     113    context = {
     114        'pagename':'reporting',
     115        'term_name': term_name,
     116        'term_options': term_options,
     117        'area': base_area_obj,
     118        'area_options': area_options,
     119        'layer': layer,
     120        'layer_options': finance_core.models.layers,
     121        'axes': finance_core.reporting.axes,
     122        'primary_name': primary_name,
     123        'secondary_name': secondary_name,
     124        'primary_labels': primary_labels,
     125        'secondary_labels': secondary_labels,
     126        'table': table,
     127        'table_with_row_labels': zip(primary_labels, table),
     128    }
     129    return render_to_response('finance_core/reporting.html', context, context_instance=RequestContext(request), )
  • remit/media/style/style.css

    rf114f8b red4ccc7  
    7878    background: #F88;
    7979}
     80
     81table.money-table td
     82{
     83    text-align: right;
     84}
     85table.money-table th
     86{
     87    white-space: pre-wrap;
     88    text-align: left;
     89    font-weight: normal;
     90}
  • remit/remit_templates/base.html

    r3a0c51b red4ccc7  
    1616        <li{% ifequal pagename "list_requests" %} class='selected'{% endifequal %}><a href="{% url list_requests %}">List requests</a></li>
    1717        {% endif %}
     18        <li{% ifequal pagename "reporting" %} class='selected'{% endifequal %}><a href="{% url reporting %}">Reporting</a></li>
    1819    </ul>
    1920    <div id='content'>
  • remit/util/templatetags/misc.py

    rf114f8b rc968555  
    11from django import template
     2import finance_core.models
    23
    34register = template.Library()
     
    2223        if num == value: return name.lower()
    2324    else: return value
     25
     26register.filter('layer_num', finance_core.models.layer_num)
     27register.filter('layer_name', finance_core.models.layer_name)
  • remit/vouchers/add_gl_accounts.py

    r92ca60e rc1d9650  
    4848            else:
    4949                parent = base
    50             parent.add_child(name=name, account_number=number)
     50            parent.add_child(name=name, account_number=number, always=True, )
    5151        else:
    5252            print "%s (%s) already present" % (name, number,)
Note: See TracChangeset for help on using the changeset viewer.