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):
"""
Split up an expenditure.
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()
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():
s = Split(self, user, share)
- meta.Session.save(s)
+ meta.Session.add(s)
+
+ def involves(self, user):
+ "Returns True if ``user`` is involved in this expenditure."
+ return (meta.Session.query(Split.id).\
+ filter(Split.expenditure == self).\
+ filter(Split.user == user).\
+ filter(Split.share != 0).first() is not None)
+
+ def share(self, user):
+ "Return the share corresponding to ``user``."
+ share = meta.Session.query(Split.share).\
+ filter(Split.expenditure == self).\
+ filter(Split.user == user).scalar()
+ if share is None:
+ return Currency(0)
+ else:
+ return share
__all__ = ['Expenditure']