]> 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 59968f3e879742d09b65a1c02fb7942a81bdf635..d732fbe18328c9d6b909bbb52635f0f1775b6033 100644 (file)
@@ -1,11 +1,25 @@
+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.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 decimal import Decimal
+from datetime import datetime
 import random
 
 class Expenditure(object):
 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()
+    
+    tags = association_proxy('_tags', 'name', creator=create_tag)
+
     def __repr__(self):
         return '<Expenditure: spender: %s spent: %s>' % (self.spender,
                                                          self.amount)
     def __repr__(self):
         return '<Expenditure: spender: %s spent: %s>' % (self.spender,
                                                          self.amount)
@@ -19,7 +33,7 @@ class Expenditure(object):
         split_percentage = Decimal(100) / Decimal(residents.count())
         self.split(dict((resident, split_percentage) for resident in residents))
     
         split_percentage = Decimal(100) / Decimal(residents.count())
         self.split(dict((resident, split_percentage) for resident in residents))
     
-    def split(self, split_dict):
+    def split(self, split_dict, split_text_dict):
         """
         Split up an expenditure.
         
         """
         Split up an expenditure.
         
@@ -41,13 +55,14 @@ class Expenditure(object):
         
         total = sum(split_dict.itervalues())
         
         
         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]
             
         amounts_dict = dict()
         
         for user, share in split_dict.iteritems():
             
         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())
         
         
         difference = self.amount - sum(amounts_dict.itervalues())
         
@@ -56,12 +71,24 @@ class Expenditure(object):
                 winner = random.choice(amounts_dict.keys())
                 amounts_dict[winner] += Currency(1)
         elif difference < 0:
                 winner = random.choice(amounts_dict.keys())
                 amounts_dict[winner] += Currency(1)
         elif difference < 0:
-            for i in xrange(difference):
+            for i in xrange(-difference):
                 winner = random.choice(amounts_dict.keys())
                 amounts_dict[winner] -= Currency(1)
         
         for user, share in amounts_dict.iteritems():
                 winner = random.choice(amounts_dict.keys())
                 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']
 
 __all__ = ['Expenditure']