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 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])
36 for period in periods.keys():
38 start, end = periods[period]
41 conds.append(model.Expenditure.date >= start)
43 conds.append(model.Expenditure.date < end)
45 conds = sqlalchemy.and_(*conds)
51 for scope in ('all', 'mine'):
52 meth = getattr(self, '_total_%s' % scope)
53 c.totals[period][scope] = meth(conds)
55 c.expenditures = meta.Session.query(model.Expenditure).\
56 filter(sqlalchemy.or_(
57 model.Expenditure.spender == request.environ['user'],
58 model.Expenditure.splits.any(
60 model.Split.user == request.environ['user'],
61 model.Split.share != 0)))).\
62 options(orm.eagerload('splits')).\
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'])).\
70 return render('/status/index.mako')
72 def _total_all(self, conditions=None):
73 q = meta.Session.query(sqlalchemy.func.SUM(
74 model.Expenditure.amount))
75 if conditions is not None:
76 q = q.filter(conditions)
79 def _total_mine(self, conditions=None):
80 q = meta.Session.query(sqlalchemy.func.SUM(
81 model.Split.share)).join(model.Split.expenditure).\
82 filter(model.Split.user == request.environ['user'])
83 if conditions is not None:
84 q = q.filter(conditions)