]> asedeno.scripts.mit.edu Git - bluechips.git/blob - bluechips/controllers/status.py
began work on iphone-targeted web interface
[bluechips.git] / bluechips / controllers / status.py
1 """
2 Calculate the current state of the books
3 """
4
5 import logging
6
7 from bluechips.lib.base import *
8 from bluechips.lib.totals import *
9
10 import sqlalchemy
11 from sqlalchemy import orm
12
13 from datetime import date, timedelta
14
15 from bluechips.model.types import Currency
16
17 from pylons import request
18
19 log = logging.getLogger(__name__)
20
21 class StatusController(BaseController):
22     def index(self):
23         c.debts = debts()
24         c.settle = settle(c.debts)
25         
26         periods = {}
27         periods['Total'] = (None, None)
28         periods['Past year'] = (date.today() - timedelta(days=365), None)
29         periods['Year to date'] = (date.today().replace(month=1, day=1), None)
30         periods['Month to date'] = (date.today().replace(day=1), None)
31         periods['Last month'] = ((date.today() -
32                                   timedelta(days=30)).replace(day=1),
33                                  periods['Month to date'][0])
34         
35         c.totals = {}
36         for period in periods.keys():
37             c.totals[period] = {}
38             start, end = periods[period]
39             conds = []
40             if start is not None:
41                 conds.append(model.Expenditure.date >= start)
42             if end is not None:
43                 conds.append(model.Expenditure.date < end)
44             if len(conds) > 1:
45                 conds = sqlalchemy.and_(*conds)
46             elif len(conds) > 0:
47                 conds = conds[0]
48             else:
49                 conds = None
50
51             for scope in ('all', 'mine'):
52                 meth = getattr(self, '_total_%s' % scope)
53                 c.totals[period][scope] = meth(conds)
54
55         c.expenditures = meta.Session.query(model.Expenditure).\
56                 filter(sqlalchemy.or_(
57                     model.Expenditure.spender == request.environ['user'],
58                     model.Expenditure.splits.any(
59                         sqlalchemy.and_(
60                             model.Split.user == request.environ['user'],
61                             model.Split.share != 0)))).\
62                 options(orm.eagerload('splits')).\
63                 limit(10).all()
64         c.transfers = meta.Session.query(model.Transfer).\
65             filter(sqlalchemy.or_(
66                 model.Transfer.debtor==request.environ['user'],
67                 model.Transfer.creditor==request.environ['user'])).\
68                 limit(10).all()
69         c.users = meta.Session.query(model.User.id, model.User)
70         
71         return render('/status/index.mako')
72     
73     def _total_all(self, conditions=None):
74         q = meta.Session.query(sqlalchemy.func.SUM(
75             model.Expenditure.amount))
76         if conditions is not None:
77             q = q.filter(conditions)
78         return q.scalar()
79
80     def _total_mine(self, conditions=None):
81         q = meta.Session.query(sqlalchemy.func.SUM(
82             model.Split.share)).join(model.Split.expenditure).\
83                 filter(model.Split.user == request.environ['user'])
84         if conditions is not None:
85             q = q.filter(conditions)
86         return q.scalar()