share = shares_by_user.get(user, '')
c.values['shares-%d.amount' % ii] = share
- c.values['tags'] = ', '.join([tag.tag for tag in c.expenditure.tags])
+ c.values['tags'] = ', '.join(c.expenditure.tags)
return render('/spend/index.mako')
split_dict[user] = amount
split_text_dict[user] = amount_text
e.split(split_dict, split_text_dict)
- e.tag(tags)
+ e.tags.clear()
+ e.tags |= tags
meta.Session.commit()
tags = sa.Table('tags', meta.metadata,
sa.Column('id', sa.types.Integer, primary_key=True),
- sa.Column('expenditure_id', sa.types.Integer,
- sa.ForeignKey('expenditures.id'), nullable=False),
- sa.Column('tag', sa.Text, nullable=False))
+ sa.Column('name', sa.Text))
+tag_to_expense_map = sa.Table('tag_to_expense_map', meta.metadata,
+ sa.Column('tag_id', sa.types.Integer,
+ sa.ForeignKey('tags.id'),
+ primary_key=True),
+ sa.Column('expenditure_id', sa.types.Integer,
+ sa.ForeignKey('expenditures.id'),
+ primary_key=True))
subitems = sa.Table('subitems', meta.metadata,
sa.Column('id', sa.types.Integer, primary_key=True),
properties={
'splits': orm.relation(Split, backref='expenditure',
cascade='all, delete'),
- 'tags': orm.relation(Tag, backref='expenditure',
- cascade='all, delete'),
+ '_tags': orm.relation(Tag, secondary=tag_to_expense_map,
+ collection_class=set, cascade='all, delete'),
'subitems': orm.relation(Subitem, backref='expenditure',
cascade='all, delete')
})
+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 Tag
+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)
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)
+from bluechips.model import meta
+
class Tag(object):
- def __init__(self, expenditure=None, tag=u""):
- self.expenditure = expenditure
- self.tag = tag
+ def __init__(self, name=u""):
+ self.name = name
def __repr__(self):
- return '<Tag: expense: %s value: %s>' % (self.expenditure,
- self.tag)
+ return '<Tag: name: %s>' % (self.name)
+
+def create_tag(name):
+ if not isinstance(name, unicode):
+ raise TypeError('%r is not a unicode object' % type(name).__name__)
+ t = meta.Session.query(Tag).filter_by(name=name).first()
+ if t is None:
+ t = Tag(name)
+
+ return t
+
__all__ = ['Tag']