2 Calculate the current state of the books
7 from bluechips.lib.base import *
8 from bluechips.lib.totals import *
11 from sqlalchemy import orm
13 from datetime import date, timedelta
15 from bluechips.model.types import Currency
17 from pylons import request
19 log = logging.getLogger(__name__)
21 class StatusController(BaseController):
24 c.settle = settle(c.debts)
27 for from_user, to_user, amount in c.settle:
28 if from_user == request.environ['user']:
30 elif to_user == request.environ['user']:
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])
43 for period in periods.keys():
45 start, end = periods[period]
48 conds.append(model.Expenditure.date >= start)
50 conds.append(model.Expenditure.date < end)
52 conds = sqlalchemy.and_(*conds)
58 for scope in ('all', 'mine'):
59 meth = getattr(self, '_total_%s' % scope)
60 c.totals[period][scope] = meth(conds)
62 c.expenditures = meta.Session.query(model.Expenditure).\
63 filter(sqlalchemy.or_(
64 model.Expenditure.spender == request.environ['user'],
65 model.Expenditure.splits.any(
67 model.Split.user == request.environ['user'],
68 model.Split.share != 0)))).\
69 options(orm.eagerload('splits')).\
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'])).\
76 c.users = meta.Session.query(model.User.id, model.User)
78 return render('/status/index.mako')
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)
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)