]> asedeno.scripts.mit.edu Git - bluechips.git/commitdiff
Move functions for splitting expenditures into Expenditure model
authorEvan Broder <broder@mit.edu>
Fri, 18 Jul 2008 02:59:03 +0000 (02:59 +0000)
committerEvan Broder <broder@mit.edu>
Fri, 18 Jul 2008 02:59:03 +0000 (02:59 +0000)
bluechips/controllers/spend.py
bluechips/lib/split.py [deleted file]
bluechips/model/expenditure.py

index a775084d4e8c1de57818e0a0d9792a924b381a88..a72f65f5b369465e1dfa4179da255a2dd128f4d8 100644 (file)
@@ -6,7 +6,6 @@ import logging
 
 from bluechips.lib.base import *
 from bluechips.widgets import spend
-from bluechips.lib.split import *
 
 from pylons import request
 
@@ -25,7 +24,7 @@ class SpendController(BaseController):
         update_sar(e, self.form_result)
         meta.Session.save(e)
         
-        even_split(e)
+        e.even_split()
         meta.Session.commit()
         
         h.flash('Expenditure recorded.')
diff --git a/bluechips/lib/split.py b/bluechips/lib/split.py
deleted file mode 100644 (file)
index 3d5d88a..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-"""
-Functions for handling splitting expenditures between people
-"""
-
-from bluechips import model
-from bluechips.model.meta import Session
-from bluechips.lib.helpers import round_currency
-from decimal import Decimal
-import random
-
-def even_split(e):
-    """
-    Split up an expenditure evenly among the resident users
-    
-    e should be a bluechips.model:Expenditure object
-    """
-    
-    residents = Session.query(model.User).filter(model.User.resident==True)
-    split_percentage = Decimal(100) / Decimal(residents.count())
-    split(e, dict((resident, split_percentage) for resident in residents))
-
-def split(e, split_dict):
-    """
-    Split up an expenditure.
-    
-    e should be a bluechips.model:Expenditure object.
-    
-    split_dict should be a dict mapping from bluechips.model:User
-    objects to a decimal:Decimal object representing the percentage
-    that user is responsible for.
-    
-    Percentages will be normalized to sum to 100%.
-    
-    If the split leaks or gains money due to rounding errors, the
-    pennies will be randomly distributed to one of the users.
-    
-    I mean, come on. You're already living together. Are you really
-    going to squabble over a few pennies?
-    """
-    
-    map(Session.delete, Session.query(model.Split).\
-            filter_by(expenditure_id=e.id))
-    
-    total = sum(split_dict.itervalues())
-    
-    for user, share in split_dict.iteritems():
-        split_dict[user] = share / total
-    
-    amounts_dict = dict()
-    
-    for user, share in split_dict.iteritems():
-        amounts_dict[user] = round_currency(split_dict[user] * e.amount)
-    
-    difference = e.amount - sum(amounts_dict.itervalues())
-    
-    if difference > 0:
-        for i in xrange(difference * 100):
-            winner = random.choice(amounts_dict.keys())
-            amounts_dict[winner] += Decimal('0.01')
-    elif difference < 0:
-        for i in xrange(difference * -100):
-            winner = random.choice(amounts_dict.keys())
-            amounts_dict[winner] -= Decimal('0.01')
-    
-    for user, share in amounts_dict.iteritems():
-        s = model.Split()
-        s.expenditure = e
-        s.user = user
-        s.share = share
-        Session.save(s)
-
-__all__ = ['split', 'even_split']
index c093e75cdf3f8219120d4af080c3e7fc13369a84..88d65b3b6ae52649cd62bc1723a4c69a981d671f 100644 (file)
@@ -1,6 +1,70 @@
+from user import User
+from split import Split
+from bluechips.model import meta
+from bluechips.lib.helpers import round_currency
+from decimal import Decimal
+import random
+
 class Expenditure(object):
     def __repr__(self):
         return '<Expenditure: spender: %s spent: %s>' % (self.spender,
                                                          self.amount)
 
+    def even_split(self):
+        """
+        Split up an expenditure evenly among the resident users
+        """
+        
+        residents = meta.Session.query(User).filter(User.resident==True)
+        split_percentage = Decimal(100) / Decimal(residents.count())
+        self.split(dict((resident, split_percentage) for resident in residents))
+    
+    def split(self, split_dict):
+        """
+        Split up an expenditure.
+        
+        split_dict should be a dict mapping from bluechips.model:User
+        objects to a decimal:Decimal object representing the percentage
+        that user is responsible for.
+        
+        Percentages will be normalized to sum to 100%.
+        
+        If the split leaks or gains money due to rounding errors, the
+        pennies will be randomly distributed to one of the users.
+        
+        I mean, come on. You're already living together. Are you really
+        going to squabble over a few pennies?
+        """
+        
+        map(meta.Session.delete, meta.Session.query(Split).\
+                filter_by(expenditure_id=self.id))
+        
+        total = sum(split_dict.itervalues())
+        
+        for user, share in split_dict.iteritems():
+            split_dict[user] = share / total
+            
+        amounts_dict = dict()
+        
+        for user, share in split_dict.iteritems():
+            amounts_dict[user] = round_currency(split_dict[user] * self.amount)
+        
+        difference = self.amount - sum(amounts_dict.itervalues())
+        
+        if difference > 0:
+            for i in xrange(difference * 100):
+                winner = random.choice(amounts_dict.keys())
+                amounts_dict[winner] += Decimal('0.01')
+        elif difference < 0:
+            for i in xrange(difference * -100):
+                winner = random.choice(amounts_dict.keys())
+                amounts_dict[winner] -= Decimal('0.01')
+        
+        for user, share in amounts_dict.iteritems():
+            s = Split()
+            s.expenditure = self
+            s.user = user
+            s.share = share
+            meta.Session.save(s)
+
 __all__ = ['Expenditure']