]> asedeno.scripts.mit.edu Git - bluechips.git/blob - bluechips/model/__init__.py
added email notifications. requires schema change to add email column to users table.
[bluechips.git] / bluechips / model / __init__.py
1 """The application's model objects"""
2 import sqlalchemy as sa
3 from sqlalchemy import orm
4
5 from bluechips.model.user import User
6 from bluechips.model.expenditure import Expenditure
7 from bluechips.model.split import Split
8 from bluechips.model.subitem import Subitem
9 from bluechips.model.transfer import Transfer
10
11 from bluechips.model import meta
12 from bluechips.model import types
13
14 from datetime import datetime
15
16 def init_model(engine):
17     """Call me before using any of the tables or classes in the model"""
18
19     sm = orm.sessionmaker(autoflush=True, bind=engine)
20
21     meta.engine = engine
22     meta.Session = orm.scoped_session(sm)
23
24 ### Database Schemas ###
25
26 users = sa.Table('users', meta.metadata,
27                  sa.Column('id', sa.types.Integer, primary_key=True),
28                  sa.Column('username', sa.types.Unicode(32), nullable=False),
29                  sa.Column('name', sa.types.Unicode(64)),
30                  sa.Column('resident', sa.types.Boolean, default=True),
31                  sa.Column('email', sa.types.Unicode(64))
32                  )
33
34 expenditures = sa.Table('expenditures', meta.metadata,
35                         sa.Column('id', sa.types.Integer, primary_key=True),
36                         sa.Column('spender_id', sa.types.Integer,
37                                   sa.ForeignKey('users.id'), nullable=False),
38                         sa.Column('amount', types.DBCurrency, nullable=False),
39                         sa.Column('description', sa.types.Text),
40                         sa.Column('date', sa.types.Date, default=datetime.now),
41                         sa.Column('entered_time', sa.types.DateTime, 
42                                   default=datetime.utcnow)
43                         )
44
45 splits = sa.Table('splits', meta.metadata,
46                   sa.Column('id', sa.types.Integer, primary_key=True),
47                   sa.Column('expenditure_id', sa.types.Integer,
48                             sa.ForeignKey('expenditures.id'), nullable=False),
49                   sa.Column('user_id', sa.types.Integer,
50                             sa.ForeignKey('users.id'), nullable=False),
51                   sa.Column('share', types.DBCurrency, nullable=False)
52                   )
53
54 subitems = sa.Table('subitems', meta.metadata,
55                     sa.Column('id', sa.types.Integer, primary_key=True),
56                     sa.Column('expenditure_id', sa.types.Integer,
57                               sa.ForeignKey('expenditures.id'), nullable=False),
58                     sa.Column('user_id', sa.types.Integer,
59                               sa.ForeignKey('users.id'), nullable=False),
60                     sa.Column('amount', types.DBCurrency, nullable=False)
61                     )
62
63 transfers = sa.Table('transfers', meta.metadata,
64                      sa.Column('id', sa.types.Integer, primary_key=True),
65                      sa.Column('debtor_id', sa.types.Integer,
66                                sa.ForeignKey('users.id'), nullable=False),
67                      sa.Column('creditor_id', sa.types.Integer,
68                                sa.ForeignKey('users.id'), nullable=False),
69                      sa.Column('amount', types.DBCurrency, nullable=False),
70                      sa.Column('description', sa.Text, default=None),
71                      sa.Column('date', sa.types.Date, default=datetime.now),
72                      sa.Column('entered_time', sa.types.DateTime,
73                                default=datetime.utcnow)
74                      )
75
76 ### DB/Class Mapping ###
77
78 orm.mapper(User, users,
79            properties={
80         'expenditures': orm.relation(Expenditure,
81                                      backref='spender')
82 })
83
84 orm.mapper(Expenditure, expenditures,
85            order_by=[expenditures.c.date.desc(), expenditures.c.entered_time.desc()],
86            properties={
87         'splits': orm.relation(Split, backref='expenditure',
88                                cascade='all, delete'),
89         'subitems': orm.relation(Subitem, backref='expenditure',
90                                  cascade='all, delete')
91 })
92
93 orm.mapper(Split, splits, properties={
94         'user': orm.relation(User)
95 })
96
97 orm.mapper(Subitem, subitems, properties={
98         'user': orm.relation(User)
99 })
100
101 orm.mapper(Transfer, transfers,
102            order_by=[transfers.c.date.desc(), transfers.c.entered_time.desc()],
103            properties={
104         'debtor': orm.relation(User,
105                                primaryjoin=(transfers.c.debtor_id==\
106                                                 users.c.id)),
107         'creditor': orm.relation(User,
108                                  primaryjoin=(transfers.c.creditor_id==\
109                                                   users.c.id))
110 })
111
112 __all__ = ['users', 'expenditures', 'splits', 'subitems', 'transfers',
113            'User', 'Expenditure', 'Split', 'Subitem', 'Transfer',
114            'meta']