]> asedeno.scripts.mit.edu Git - bluechips.git/blob - bluechips/controllers/status.py
df0522e4a359ed8951a67dc4857afdad665767f1
[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         c.net = 0
27         for from_user, to_user, amount in c.settle:
28             if from_user == request.environ['user']:
29                 c.net -= amount
30             elif to_user == request.environ['user']:
31                 c.net += amount
32         
33         periods = {}
34         periods['Total'] = (None, None)
35         periods['Past year'] = (date.today() - timedelta(days=365), None)
36         periods['Year to date'] = (date.today().replace(month=1, day=1), None)
37         periods['Month to date'] = (date.today().replace(day=1), None)
38         periods['Last month'] = ((date.today() -
39                                   timedelta(days=30)).replace(day=1),
40                                  periods['Month to date'][0])
41         
42         c.totals = {}
43         for period in periods.keys():
44             c.totals[period] = {}
45             start, end = periods[period]
46             conds = []
47             if start is not None:
48                 conds.append(model.Expenditure.date >= start)
49             if end is not None:
50                 conds.append(model.Expenditure.date < end)
51             if len(conds) > 1:
52                 conds = sqlalchemy.and_(*conds)
53             elif len(conds) > 0:
54                 conds = conds[0]
55             else:
56                 conds = None
57
58             for scope in ('all', 'mine'):
59                 meth = getattr(self, '_total_%s' % scope)
60                 c.totals[period][scope] = meth(conds)
61
62         c.expenditures = meta.Session.query(model.Expenditure).\
63                 filter(sqlalchemy.or_(
64                     model.Expenditure.spender == request.environ['user'],
65                     model.Expenditure.splits.any(
66                         sqlalchemy.and_(
67                             model.Split.user == request.environ['user'],
68                             model.Split.share != 0)))).\
69                 options(orm.eagerload('splits')).\
70                 limit(10).all()
71         c.transfers = meta.Session.query(model.Transfer).\
72             filter(sqlalchemy.or_(
73                 model.Transfer.debtor==request.environ['user'],
74                 model.Transfer.creditor==request.environ['user'])).\
75                 limit(10).all()
76         c.users = meta.Session.query(model.User.id, model.User)
77         
78         return render('/status/index.mako')
79     
80     def _total_all(self, conditions=None):
81         q = meta.Session.query(sqlalchemy.func.SUM(
82             model.Expenditure.amount))
83         if conditions is not None:
84             q = q.filter(conditions)
85         return q.scalar()
86
87     def _total_mine(self, conditions=None):
88         q = meta.Session.query(sqlalchemy.func.SUM(
89             model.Split.share)).join(model.Split.expenditure).\
90                 filter(model.Split.user == request.environ['user'])
91         if conditions is not None:
92             q = q.filter(conditions)
93         return q.scalar()