X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;ds=sidebyside;f=bluechips%2Fmodel%2Fexpenditure.py;h=6b3b1cb242c6c1e4ecd4de1fef70e537870cc3b6;hb=f4d8f4cc0fa9643c3ca04c7dcc2c87f3790160de;hp=f7e69344dc2cf88bf09cb7f0fa6ea9a81fdc4cb9;hpb=d24e23a6a01ed245e204c8c29fc10a5fbc6f8bc4;p=bluechips.git diff --git a/bluechips/model/expenditure.py b/bluechips/model/expenditure.py index f7e6934..6b3b1cb 100644 --- a/bluechips/model/expenditure.py +++ b/bluechips/model/expenditure.py @@ -2,6 +2,7 @@ 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 Tag from decimal import Decimal from datetime import datetime import random @@ -28,17 +29,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 +54,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 +72,27 @@ class Expenditure(object): amounts_dict[winner] -= Currency(1) for user, share in amounts_dict.iteritems(): - s = Split(self, user, share) + s = Split(self, user, share, split_text_dict[user]) meta.Session.add(s) + def tag(self, tags): + map(meta.Session.delete, + meta.Session.query(Tag).filter_by(expenditure_id=self.id)) + + for tag in tags: + t = Tag(self, tag) + meta.Session.add(t) + + 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']