]> asedeno.scripts.mit.edu Git - bluechips.git/blobdiff - bluechips/controllers/status.py
little performance tweaks
[bluechips.git] / bluechips / controllers / status.py
index cba63e394a09e039ea948659f4550f3b8ebc2670..2532dfac2da2d7189dc5bc15acdd1b22100d2c3a 100644 (file)
@@ -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,33 +23,42 @@ class StatusController(BaseController):
         c.debts = debts()
         c.settle = settle(c.debts)
         
-        c.total = self._total(True)
+        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.expenditures.c.date >= i)
+        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]]
         
 
         c.last_month_total = self._total(sqlalchemy.and_(
-                    model.expenditures.c.date >= last_month,
-                    model.expenditures.c.date < this_month))
+                    model.Expenditure.date >= last_month,
+                    model.Expenditure.date < this_month))
         
         c.expenditures = meta.Session.query(model.Expenditure).\
-            filter(model.Expenditure.spender==request.environ['user']).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'],
-                model.Transfer.creditor==request.environ['user'])).all()
+                model.Transfer.creditor==request.environ['user'])).\
+                limit(10).all()
         
         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(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()