X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=bluechips%2Fcontrollers%2Fstatus.py;h=04ad79b6a5bce8476f51942fe8172f81ca1770d5;hb=c0cc786ed11a60845d1cd2a97c702f7f1d723409;hp=faadfc5085b318fbaf2ed65dc74563eff14d9888;hpb=512db6643a148932d6f734972f23ddf55a2e91ac;p=bluechips.git diff --git a/bluechips/controllers/status.py b/bluechips/controllers/status.py index faadfc5..04ad79b 100644 --- a/bluechips/controllers/status.py +++ b/bluechips/controllers/status.py @@ -8,9 +8,11 @@ from bluechips.lib.base import * from bluechips.lib.totals import * import sqlalchemy +from sqlalchemy import orm from datetime import date, timedelta -from decimal import Decimal + +from bluechips.model.types import Currency from pylons import request @@ -21,25 +23,44 @@ class StatusController(BaseController): c.debts = debts() c.settle = settle(c.debts) - c.total = self._total(True) - - 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.expenditures.c.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.expenditures.c.date >= last_month, - model.expenditures.c.date < this_month)) - c.expenditures = meta.Session.query(model.Expenditure).\ - filter(model.Expenditure.spender==request.environ['user']).\ - limit(10).all() + filter(sqlalchemy.or_( + model.Expenditure.spender == request.environ['user'], + model.Expenditure.splits.any( + 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'], @@ -48,8 +69,17 @@ class StatusController(BaseController): return render('/status/index.mako') - def _total(self, where): - return (meta.Session.execute(sqlalchemy.sql.select([ - sqlalchemy.func.sum(model.expenditures.c.amount).\ - label('total')]).\ - where(where)).scalar() or Decimal("0.00")) / 100 + 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()