+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.tag import create_tag
from decimal import Decimal
from datetime import datetime
import random
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)
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.
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())
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 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)
+ 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``."
- 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
+ shares = dict((split.user, split.share)
+ for split in self.splits)
+ return shares.get(user, Currency(0))
__all__ = ['Expenditure']