import logging
from bluechips.lib.base import *
+from bluechips.lib.totals import *
+
+import sqlalchemy
+from sqlalchemy import orm
+
+from datetime import date, timedelta
+
+from bluechips.model.types import Currency
+
+from pylons import request
log = logging.getLogger(__name__)
class StatusController(BaseController):
def index(self):
- return 'Hello World'
+ 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
+
+ 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.expenditures = meta.Session.query(model.Expenditure).\
+ 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'],
+ 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_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()