]> asedeno.scripts.mit.edu Git - bluechips.git/blobdiff - bluechips/model/expenditure.py
don't need update_split() anymore
[bluechips.git] / bluechips / model / expenditure.py
index 252a93b714025eb42a98663d808d3fb6c92d1baf..21172b9bcb046185e36e7c9ebf369651585623ac 100644 (file)
@@ -1,11 +1,20 @@
-from user import User
-from split import Split
+from bluechips.model.user import User
+from bluechips.model.split import Split
 from bluechips.model import meta
 from bluechips.model.types import Currency
 from decimal import Decimal
+from datetime import datetime
 import random
 
 class Expenditure(object):
+    def __init__(self, spender=None, amount=Currency(0), description=u"",
+                 date=None):
+        self.spender = spender
+        self.amount = amount
+        self.description = description
+        if self.date == None:
+            self.date = datetime.now()
+    
     def __repr__(self):
         return '<Expenditure: spender: %s spent: %s>' % (self.spender,
                                                          self.amount)
@@ -41,8 +50,11 @@ class Expenditure(object):
         
         total = sum(split_dict.itervalues())
         
-        for user, share in split_dict.iteritems():
-            split_dict[user] = share / total
+        for user, share in split_dict.items():
+            if share == 0:
+                del split_dict[user]
+            else:
+                split_dict[user] = share / total
             
         amounts_dict = dict()
         
@@ -52,19 +64,28 @@ class Expenditure(object):
         difference = self.amount - sum(amounts_dict.itervalues())
         
         if difference > 0:
-            for i in xrange(difference * 100):
+            for i in xrange(difference):
                 winner = random.choice(amounts_dict.keys())
                 amounts_dict[winner] += Currency(1)
         elif difference < 0:
-            for i in xrange(difference * -100):
+            for i in xrange(-difference):
                 winner = random.choice(amounts_dict.keys())
                 amounts_dict[winner] -= Currency(1)
         
         for user, share in amounts_dict.iteritems():
-            s = Split()
-            s.expenditure = self
-            s.user = user
-            s.share = share
-            meta.Session.save(s)
+            s = Split(self, user, share)
+            meta.Session.add(s)
+
+    def involves(self, user):
+        "Returns True if ``user`` is involved in this expenditure."
+        return (any((split.user == user) and (split.share != 0)
+                    for split in self.splits) or
+                (self.spender == user))
+
+    def share(self, user):
+        "Return the share corresponding to ``user``."
+        shares = dict((split.user, split.share)
+                      for split in self.splits)
+        return shares.get(user, Currency(0))
 
 __all__ = ['Expenditure']