1 from datetime import datetime
2
3 import pkg_resources
4 pkg_resources.require("SQLAlchemy>=0.4.0")
5
6 from turbogears.database import mapper, metadata, session
7
8
9 from sqlalchemy import Table, Column, ForeignKey
10 from sqlalchemy.orm import relation
11
12
13 from sqlalchemy import String, Unicode, Integer, DateTime
14 from turbogears import identity
15
16
17
18 paste_table = Table('paste', metadata,
19 Column('guid', String(32), primary_key=True),
20 Column('title', Unicode(100)),
21 Column('code', Unicode(10000)),
22 Column('format_id', ForeignKey('format.name')),
23 Column('creator', String(32)),
24 Column('created', DateTime, nullable=False, default=datetime.now),
25 Column('last_access', DateTime, nullable=False, default=datetime.now)
26 )
27
28 format_table = Table('format', metadata,
29 Column('name', String(20), primary_key=True),
30 Column('display_name', Unicode(20))
31 )
32
33 style_table = Table('style', metadata,
34 Column('name', String(20), primary_key=True),
35 Column('display_name', Unicode(20))
36 )
37
38
39 -class Paste(object):
40 @classmethod
42 """Look up paste instance by given GUID."""
43 return cls.query.get(guid)
44
46 return "<Paste guid=%r title=%r>" % (self.guid, self.title)
47
57
59 @classmethod
61 """Return all Style instances as an iterator yielding 2-item tuples."""
62 return ((s.name, s.display_name)
63 for s in cls.query().order_by('display_name'))
64
67
68
69 mapper(Paste, paste_table,
70 properties=dict(format=relation(Format, backref='pastes')))
71 mapper(Format, format_table)
72 mapper(Style, style_table)
73
74
75
76 visits_table = Table('visit', metadata,
77 Column('visit_key', String(40), primary_key=True),
78 Column('created', DateTime, nullable=False, default=datetime.now),
79 Column('expiry', DateTime)
80 )
81
82 visit_identity_table = Table('visit_identity', metadata,
83 Column('visit_key', String(40), primary_key=True),
84 Column('user_id', Integer, ForeignKey('tg_user.user_id'), index=True)
85 )
86
87 groups_table = Table('tg_group', metadata,
88 Column('group_id', Integer, primary_key=True),
89 Column('group_name', Unicode(16), unique=True),
90 Column('display_name', Unicode(255)),
91 Column('created', DateTime, default=datetime.now)
92 )
93
94 users_table = Table('tg_user', metadata,
95 Column('user_id', Integer, primary_key=True),
96 Column('user_name', Unicode(16), unique=True),
97 Column('email_address', Unicode(255), unique=True),
98 Column('display_name', Unicode(255)),
99 Column('password', Unicode(40)),
100 Column('created', DateTime, default=datetime.now)
101 )
102
103 permissions_table = Table('permission', metadata,
104 Column('permission_id', Integer, primary_key=True),
105 Column('permission_name', Unicode(16), unique=True),
106 Column('description', Unicode(255))
107 )
108
109 user_group_table = Table('user_group', metadata,
110 Column('user_id', Integer, ForeignKey('tg_user.user_id',
111 onupdate='CASCADE', ondelete='CASCADE'), primary_key=True),
112 Column('group_id', Integer, ForeignKey('tg_group.group_id',
113 onupdate='CASCADE', ondelete='CASCADE'), primary_key=True)
114 )
115
116 group_permission_table = Table('group_permission', metadata,
117 Column('group_id', Integer, ForeignKey('tg_group.group_id',
118 onupdate='CASCADE', ondelete='CASCADE'), primary_key=True),
119 Column('permission_id', Integer, ForeignKey('permission.permission_id',
120 onupdate='CASCADE', ondelete='CASCADE'), primary_key=True)
121 )
122
123
124
125
126 -class Visit(object):
127 """A visit to your site."""
128
129 @classmethod
131 """Look up Visit by given visit key."""
132 return cls.query.get(visit_key)
133
136 """A Visit that is linked to a User object."""
137
138 @classmethod
140 """Look up VisitIdentity by given visit key."""
141 return cls.query.get(visit_key)
142
145 """An ultra-simple group definition."""
146
147 @classmethod
151 by_name = by_group_name
152
153
154 -class User(object):
155 """Reasonably basic User definition.
156
157 Probably would want additional attributes.
158
159 """
160 @property
162 """Return all permissions os all groups the user belongs to."""
163 p = set()
164 for g in self.groups:
165 p |= set(g.permissions)
166 return p
167
168 @classmethod
170 """Look up User by given email address.
171
172 This class method that can be used to search users based on their email
173 addresses since it is unique.
174
175 """
176 return cls.query.filter_by(email_address=email_address).first()
177
178 @classmethod
180 """Look up User by given user name.
181
182 This class method that permits to search users based on their
183 user_name attribute.
184
185 """
186 return cls.query.filter_by(user_name=user_name).first()
187 by_name = by_user_name
188
190 """Run cleartext password through the hash algorithm before saving."""
191 self._password = identity.encrypt_password(password)
192
194 """Returns password."""
195 return self._password
196
197 password = property(_get_password, _set_password)
198
201 """A relationship that determines what each Group can do."""
202
203 @classmethod
207 by_name = by_permission_name
208
209
210
211
212 mapper(Visit, visits_table)
213
214 mapper(VisitIdentity, visit_identity_table,
215 properties=dict(users=relation(User, backref='visit_identity')))
216
217 mapper(User, users_table,
218 properties=dict(_password=users_table.c.password))
219
220 mapper(Group, groups_table,
221 properties=dict(users=relation(User,
222 secondary=user_group_table, backref='groups')))
223
224 mapper(Permission, permissions_table,
225 properties=dict(groups=relation(Group,
226 secondary=group_permission_table, backref='permissions')))
227