]> asedeno.scripts.mit.edu Git - bluechips.git/blobdiff - bluechips/model/expenditure.py
Added UI for working with tags
[bluechips.git] / bluechips / model / expenditure.py
index 8d3bbbc67e74e9c8155df70bcf694e5788a629d4..d732fbe18328c9d6b909bbb52635f0f1775b6033 100644 (file)
@@ -1,7 +1,10 @@
+from sqlalchemy.ext.associationproxy import association_proxy
+
 from bluechips.model.user import User
 from bluechips.model.split import Split
 from bluechips.model import meta
 from bluechips.model.types import Currency
+from bluechips.model.tag import create_tag
 from decimal import Decimal
 from datetime import datetime
 import random
@@ -15,6 +18,8 @@ class Expenditure(object):
         if self.date == None:
             self.date = datetime.now()
     
+    tags = association_proxy('_tags', 'name', creator=create_tag)
+
     def __repr__(self):
         return '<Expenditure: spender: %s spent: %s>' % (self.spender,
                                                          self.amount)
@@ -28,17 +33,7 @@ class Expenditure(object):
         split_percentage = Decimal(100) / Decimal(residents.count())
         self.split(dict((resident, split_percentage) for resident in residents))
     
-    def update_split(self):
-        """
-        Re-split an expenditure using the same percentages as what is
-        currently in the database
-        """
-        
-        old_splits = meta.Session.query(Split).filter(Split.expenditure==self)
-        split_dict = dict((s.user, Decimal(int(s.share))) for s in old_splits)
-        self.split(split_dict)
-    
-    def split(self, split_dict):
+    def split(self, split_dict, split_text_dict):
         """
         Split up an expenditure.
         
@@ -63,13 +58,11 @@ class Expenditure(object):
         for user, share in split_dict.items():
             if share == 0:
                 del split_dict[user]
-            else:
-                split_dict[user] = share / total
             
         amounts_dict = dict()
         
         for user, share in split_dict.iteritems():
-            amounts_dict[user] = Currency(split_dict[user] * self.amount)
+            amounts_dict[user] = Currency((share * self.amount) / total)
         
         difference = self.amount - sum(amounts_dict.itervalues())
         
@@ -83,7 +76,19 @@ class Expenditure(object):
                 amounts_dict[winner] -= Currency(1)
         
         for user, share in amounts_dict.iteritems():
-            s = Split(self, user, share)
-            meta.Session.save(s)
+            s = Split(self, user, share, split_text_dict[user])
+            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']