Package spammcan :: Module model
[hide private]

Source Code for Module spammcan.model

  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  # import some basic SQLAlchemy classes for declaring the data model 
  8  # (see http://www.sqlalchemy.org/docs/04/ormtutorial.html) 
  9  from sqlalchemy import Table, Column, ForeignKey 
 10  from sqlalchemy.orm import relation 
 11  # import some datatypes for table columns from SQLAlchemy 
 12  # (see http://www.sqlalchemy.org/docs/04/types.html for more) 
 13  from sqlalchemy import String, Unicode, Integer, DateTime 
 14  from turbogears import identity 
 15   
 16   
 17  # your data tables 
 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 # your model classes 39 -class Paste(object):
40 @classmethod
41 - def by_guid(self, guid):
42 """Look up paste instance by given GUID.""" 43 return cls.query.get(guid)
44
45 - def __repr__(self):
46 return "<Paste guid=%r title=%r>" % (self.guid, self.title)
47
48 -class Format(object):
49 @classmethod
50 - def options(cls):
51 """Return all Format instances as an iterator yielding 2-item tuples.""" 52 return ((f.name, f.display_name) 53 for f in cls.query().order_by('display_name'))
54
55 - def __str__(self):
56 return "%s (%s)" % (self.display_name, self.name)
57
58 -class Style(object):
59 @classmethod
60 - def options(cls):
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
65 - def __str__(self):
66 return "%s (%s)" % (self.display_name, self.name)
67 68 # set up mappers between your data tables and classes 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 # the identity schema 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 # the identity model 125 126 -class Visit(object):
127 """A visit to your site.""" 128 129 @classmethod
130 - def lookup_visit(cls, visit_key):
131 """Look up Visit by given visit key.""" 132 return cls.query.get(visit_key)
133
134 135 -class VisitIdentity(object):
136 """A Visit that is linked to a User object.""" 137 138 @classmethod
139 - def by_visit_key(cls, visit_key):
140 """Look up VisitIdentity by given visit key.""" 141 return cls.query.get(visit_key)
142
143 144 -class Group(object):
145 """An ultra-simple group definition.""" 146 147 @classmethod
148 - def by_group_name(cls, group_name):
149 """Look up Group by given group name.""" 150 return cls.query.filter_by(group_name=group_name).first()
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
161 - def permissions(self):
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
169 - def by_email_address(cls, email_address):
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
179 - def by_user_name(cls, user_name):
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
189 - def _set_password(self, password):
190 """Run cleartext password through the hash algorithm before saving.""" 191 self._password = identity.encrypt_password(password)
192
193 - def _get_password(self):
194 """Returns password.""" 195 return self._password
196 197 password = property(_get_password, _set_password)
198
199 200 -class Permission(object):
201 """A relationship that determines what each Group can do.""" 202 203 @classmethod
204 - def by_permission_name(cls, permission_name):
205 """Look up Permission by given permission name.""" 206 return cls.query.filter_by(permission_name=permission_name).first()
207 by_name = by_permission_name
208 209 210 # set up mappers between identity tables and classes 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