# Path: bluechips/model/user.py
# class User(object):
#     def __init__(self, username, name=u"", resident=True):
#         self.username = username
#         self.name = name
#         self.resident = resident
#     
#     def __repr__(self):
#         return '<User: %s>' % (self.username)
# 
#     def __unicode__(self):
#         return self.name
# 
# Path: bluechips/model/split.py
# class Split(object):
#     def __init__(self, expenditure=None, user=None, share=Currency(0)):
#         self.expenditure = expenditure
#         self.user = user
#         self.share = share
#     
#     def __repr__(self):
#         return '<Split: expense: %s user: %s share: %s>' % (self.expenditure,
#                                                             self.user,
#                                                             self.share)
# 
# Path: bluechips/model/meta.py

# 
# Path: bluechips/model/types.py
# class Currency(object):
#     """
#     Store currency values as an integral number of cents
#     """
#     __metaclass__ = SmartSubclass(int)
#     __old_values__ = WeakValueDictionary()
#     def __new__(cls, value):
#         if value is None:
#             value = 0
#         elif isinstance(value, str):
#             value = int(float(value) * 100)
#         else:
#             value = int(value)
#         
#         if value not in cls.__old_values__:
#             new_object = super(cls, cls).__new__(cls)
#             new_object.value = value
#             cls.__old_values__[value] = new_object
#             return new_object
#         else:
#             return cls.__old_values__[value]
#     
#     def __int__(self):
#         """
#         If I don't define this, SmartSubclass will return
#         Currency(int(self.value))
#         """
#         return self.value
#     def __float__(self):
#         """
#         If I don't define this, SmartSubclass will return
#         Currency(float(self.value))
#         """
#         return float(self.value)
#     def __long__(self):
#         """
#         If I don't define this, SmartSubclass will return
#         Currency(long(self.value))
#         """
#         return long(self.value)
#     
#     def __cmp__(self, other):
#         """
#         This is overridden for when validators compare a Currency to
#         ''
#         """
#         if other == '':
#             return 1
#         else:
#             return self.value.__cmp__(int(other))
#     
#     def __mul__(self, other):
#         """
#         If I don't define this, SmartSubclass will convert the other
#         argument to an int
#         """
#         return Currency(self.value * other)
#     def __rmul__(self, other):
#         """
#         If I don't define this, SmartSubclass will convert the other
#         argument to an int
#         """
#         return self.__mul__(other)
#     def __div__(self, other):
#         """
#         If I don't define this, SmartSubclass will convert the other
#         argument to an int
#         """
#         return Currency(self.value / other)
#     def __truediv__(self, other):
#         """
#         If I don't define this, SmartSubclass will convert the other
#         argument to an int
#         """
#         return Currency(self.value / other)
#     
#     def __repr__(self):
#         return '%s("%s")' % (self.__class__.__name__, str(self))
#     def __str__(self):
#         return locale.currency(self.value / 100., grouping=True)


from bluechips.model.user import User
from bluechips.model.split import Split
from bluechips.model import meta
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 '<Expenditure: spender: %s spent: %s>' % (self.spender,
                                                         self.amount)

    def even_split(self):
        """
        Split up an expenditure evenly among the resident users
        """
        

# Path: bluechips/model/user.py
# class User(object):
#     def __init__(self, username, name=u"", resident=True):
#         self.username = username
#         self.name = name
#         self.resident = resident
#     
#     def __repr__(self):
#         return '<User: %s>' % (self.username)
# 
#     def __unicode__(self):
#         return self.name
# 
# Path: bluechips/model/split.py
# class Split(object):
#     def __init__(self, expenditure=None, user=None, share=Currency(0)):
#         self.expenditure = expenditure
#         self.user = user
#         self.share = share
#     
#     def __repr__(self):
#         return '<Split: expense: %s user: %s share: %s>' % (self.expenditure,
#                                                             self.user,
#                                                             self.share)
# 
# Path: bluechips/model/meta.py

# 
# Path: bluechips/model/types.py
# class Currency(object):
#     """
#     Store currency values as an integral number of cents
#     """
#     __metaclass__ = SmartSubclass(int)
#     __old_values__ = WeakValueDictionary()
#     def __new__(cls, value):
#         if value is None:
#             value = 0
#         elif isinstance(value, str):
#             value = int(float(value) * 100)
#         else:
#             value = int(value)
#         
#         if value not in cls.__old_values__:
#             new_object = super(cls, cls).__new__(cls)
#             new_object.value = value
#             cls.__old_values__[value] = new_object
#             return new_object
#         else:
#             return cls.__old_values__[value]
#     
#     def __int__(self):
#         """
#         If I don't define this, SmartSubclass will return
#         Currency(int(self.value))
#         """
#         return self.value
#     def __float__(self):
#         """
#         If I don't define this, SmartSubclass will return
#         Currency(float(self.value))
#         """
#         return float(self.value)
#     def __long__(self):
#         """
#         If I don't define this, SmartSubclass will return
#         Currency(long(self.value))
#         """
#         return long(self.value)
#     
#     def __cmp__(self, other):
#         """
#         This is overridden for when validators compare a Currency to
#         ''
#         """
#         if other == '':
#             return 1
#         else:
#             return self.value.__cmp__(int(other))
#     
#     def __mul__(self, other):
#         """
#         If I don't define this, SmartSubclass will convert the other
#         argument to an int
#         """
#         return Currency(self.value * other)
#     def __rmul__(self, other):
#         """
#         If I don't define this, SmartSubclass will convert the other
#         argument to an int
#         """
#         return self.__mul__(other)
#     def __div__(self, other):
#         """
#         If I don't define this, SmartSubclass will convert the other
#         argument to an int
#         """
#         return Currency(self.value / other)
#     def __truediv__(self, other):
#         """
#         If I don't define this, SmartSubclass will convert the other
#         argument to an int
#         """
#         return Currency(self.value / other)
#     
#     def __repr__(self):
#         return '%s("%s")' % (self.__class__.__name__, str(self))
#     def __str__(self):
#         return locale.currency(self.value / 100., grouping=True)


# Path: bluechips/model/expenditure.py
from bluechips.model.user import User
from bluechips.model.split import Split
from bluechips.model import meta
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 '<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)