X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=bluechips%2Fcontrollers%2Fstatus.py;h=df0522e4a359ed8951a67dc4857afdad665767f1;hb=378790bb6dfd727bb25bb27dde22c484fc957267;hp=d19dd4ad6139853300356c57afc891b63b05ed32;hpb=2b77a3bedbc04fafd15ba8cadd1adad91a44d465;p=bluechips.git diff --git a/bluechips/controllers/status.py b/bluechips/controllers/status.py index d19dd4a..df0522e 100644 --- a/bluechips/controllers/status.py +++ b/bluechips/controllers/status.py @@ -8,6 +8,7 @@ from bluechips.lib.base import * from bluechips.lib.totals import * import sqlalchemy +from sqlalchemy import orm from datetime import date, timedelta @@ -21,23 +22,43 @@ class StatusController(BaseController): def index(self): c.debts = debts() c.settle = settle(c.debts) + + c.net = 0 + for from_user, to_user, amount in c.settle: + if from_user == request.environ['user']: + c.net -= amount + elif to_user == request.environ['user']: + c.net += amount - c.total = self._total() - - year = date.today() - timedelta(days=365) - this_year = date.today().replace(month=1, day=1) - this_month = date.today().replace(day=1) - last_month = (date.today() - timedelta(days=30)).replace(day=1) - - c.year_total, c.this_year_total, c.this_month_total = \ - [self._total(model.Expenditure.date >= i) - for i in [year, this_year, this_month]] + periods = {} + periods['Total'] = (None, None) + periods['Past year'] = (date.today() - timedelta(days=365), None) + periods['Year to date'] = (date.today().replace(month=1, day=1), None) + periods['Month to date'] = (date.today().replace(day=1), None) + periods['Last month'] = ((date.today() - + timedelta(days=30)).replace(day=1), + periods['Month to date'][0]) + c.totals = {} + for period in periods.keys(): + c.totals[period] = {} + start, end = periods[period] + conds = [] + if start is not None: + conds.append(model.Expenditure.date >= start) + if end is not None: + conds.append(model.Expenditure.date < end) + if len(conds) > 1: + conds = sqlalchemy.and_(*conds) + elif len(conds) > 0: + conds = conds[0] + else: + conds = None + + for scope in ('all', 'mine'): + meth = getattr(self, '_total_%s' % scope) + c.totals[period][scope] = meth(conds) - c.last_month_total = self._total(sqlalchemy.and_( - model.Expenditure.date >= last_month, - model.Expenditure.date < this_month)) - c.expenditures = meta.Session.query(model.Expenditure).\ filter(sqlalchemy.or_( model.Expenditure.spender == request.environ['user'], @@ -45,18 +66,28 @@ class StatusController(BaseController): sqlalchemy.and_( model.Split.user == request.environ['user'], model.Split.share != 0)))).\ + options(orm.eagerload('splits')).\ limit(10).all() c.transfers = meta.Session.query(model.Transfer).\ filter(sqlalchemy.or_( model.Transfer.debtor==request.environ['user'], model.Transfer.creditor==request.environ['user'])).\ limit(10).all() + c.users = meta.Session.query(model.User.id, model.User) return render('/status/index.mako') - def _total(self, conditions=None): + def _total_all(self, conditions=None): q = meta.Session.query(sqlalchemy.func.SUM( model.Expenditure.amount)) if conditions is not None: q = q.filter(conditions) return q.scalar() + + def _total_mine(self, conditions=None): + q = meta.Session.query(sqlalchemy.func.SUM( + model.Split.share)).join(model.Split.expenditure).\ + filter(model.Split.user == request.environ['user']) + if conditions is not None: + q = q.filter(conditions) + return q.scalar()