X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=bluechips%2Fmodel%2Fexpenditure.py;h=9d0fc7e0f981ad2719f2435789199a934b5c5bca;hb=9458527642fab328a945d06daed04404c1ae2091;hp=88d65b3b6ae52649cd62bc1723a4c69a981d671f;hpb=fe6f77d97eef5621aefcabcb0692cdd1ec6ec181;p=bluechips.git diff --git a/bluechips/model/expenditure.py b/bluechips/model/expenditure.py index 88d65b3..9d0fc7e 100644 --- a/bluechips/model/expenditure.py +++ b/bluechips/model/expenditure.py @@ -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.lib.helpers import round_currency +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 '' % (self.spender, self.amount) @@ -19,6 +28,16 @@ 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): """ Split up an expenditure. @@ -41,30 +60,41 @@ 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() for user, share in split_dict.iteritems(): - amounts_dict[user] = round_currency(split_dict[user] * self.amount) + amounts_dict[user] = Currency(split_dict[user] * self.amount) 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] += Decimal('0.01') + 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] -= Decimal('0.01') + 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) + + 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']