Changeset 1603
- Timestamp:
- 06/30/06 00:26:28 (2 years ago)
- Files:
-
- branches/1.0/setup.py (modified) (1 diff)
- branches/1.0/turbogears/command/base.py (modified) (7 diffs)
- branches/1.0/turbogears/command/quickstart.py (modified) (5 diffs)
- branches/1.0/turbogears/database.py (modified) (5 diffs)
- branches/1.0/turbogears/identity/saprovider.py (modified) (11 diffs)
- branches/1.0/turbogears/identity/soprovider.py (modified) (1 diff)
- branches/1.0/turbogears/qstemplates/quickstart/dev.cfg_tmpl (modified) (2 diffs)
- branches/1.0/turbogears/qstemplates/quickstart/+package+/config/app.cfg_tmpl (modified) (1 diff)
- branches/1.0/turbogears/qstemplates/quickstart/+package+/controllers.py_tmpl (modified) (1 diff)
- branches/1.0/turbogears/qstemplates/quickstart/+package+/model.py_tmpl (modified) (9 diffs)
- branches/1.0/turbogears/qstemplates/quickstart/sample-prod.cfg_tmpl (modified) (2 diffs)
- branches/1.0/turbogears/visit/savisit.py (modified) (2 diffs)
- branches/1.0/turbogears/visit/sovisit.py (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/1.0/setup.py
r1554 r1603 79 79 sqlobject = turbogears.visit.sovisit:SqlObjectVisitManager 80 80 sqlalchemy = turbogears.visit.savisit:SqlAlchemyVisitManager 81 81 82 [turbogears.toolboxcommand] 82 83 widgets = turbogears.toolbox.base:WidgetBrowser branches/1.0/turbogears/command/base.py
r1591 r1603 7 7 8 8 import pkg_resources 9 import dispatch 9 10 10 11 import turbogears 11 12 from turbogears.util import get_model, load_project_config 12 13 from turbogears.identity import SecureObject 14 from turbogears import config, database 13 15 14 16 … … 46 48 self.dburi = self.dburi[8:] 47 49 50 [dispatch.generic()] 51 def sacommand(command, args): 52 pass 53 54 [sacommand.when("command == 'help'")] 55 def sahelp(command, args): 56 print """TurboGears SQLAlchemy Helper 57 58 help this display 59 create create the database tables 60 """ 61 [sacommand.when("command == 'create'")] 62 def sacreate(command, args): 63 print "Creating tables at %s" % (config.get("sqlalchemy.dburi")) 64 from turbogears.database import bind_meta_data, metadata 65 get_model() 66 metadata.create_all() 67 48 68 class SQL(CommandWithDB): 49 69 """Wrapper command for sqlobject-admin. … … 86 106 else: 87 107 sqlobjcommand = sys.argv[1] 88 108 109 if config.get("sqlalchemy.dburi"): 110 try: 111 sacommand(sqlobjcommand, sys.argv) 112 except dispatch.interfaces.NoApplicableMethods: 113 sacommand("help", []) 114 return 115 89 116 if sqlobjcommand not in no_connection_param: 90 117 if not self.dburi: … … 152 179 "Run the shell" 153 180 self.find_config() 154 181 155 182 mod = get_model() 156 183 if mod: … … 158 185 else: 159 186 locals = dict(__name__="tg-admin") 187 188 if config.get("sqlalchemy.dburi"): 189 using_sqlalchemy = True 190 database.bind_meta_data() 191 locals.update(session=database.session, 192 metadata=database.metadata) 193 else: 194 using_sqlalchemy = False 195 160 196 try: 161 197 # try to use IPython if possible … … 165 201 def raw_input(self, *args, **kw): 166 202 try: 167 return IPython.iplib.InteractiveShell.raw_input(self, *args, **kw) 203 return \ 204 IPython.iplib.InteractiveShell.raw_input(self, 205 *args, **kw) 168 206 except EOFError: 169 b = raw_input("Do you wish to commit your database changes? [yes]") 170 if not b.startswith("n"): 171 self.push("hub.commit()") 207 if not using_sqlalchemy: 208 b = raw_input("Do you wish to commit your " 209 "database changes? [yes]") 210 if not b.startswith("n"): 211 self.push("hub.commit()") 172 212 raise EOFError 173 213 174 shell = IPython.Shell.IPShell(user_ns=locals, shell_class=CustomIPShell) 214 shell = IPython.Shell.IPShell(user_ns=locals, 215 shell_class=CustomIPShell) 175 216 shell.mainloop() 176 217 except ImportError: … … 180 221 def raw_input(self, *args, **kw): 181 222 try: 182 return code.InteractiveConsole.raw_input(self, *args, **kw) 223 return code.InteractiveConsole.raw_input(self, 224 *args, **kw) 183 225 except EOFError: 184 b = raw_input("Do you wish to commit your database changes? [yes]") 185 if not b.startswith("n"): 186 self.push("hub.commit()") 226 if not using_sqlalchemy: 227 b = raw_input("Do you wish to commit your " 228 "database changes? [yes]") 229 if not b.startswith("n"): 230 self.push("hub.commit()") 187 231 raise EOFError 188 232 branches/1.0/turbogears/command/quickstart.py
r1593 r1603 97 97 package = None 98 98 templates = "turbogears" 99 identity = None 99 sqlalchemy = False 100 identity = False 100 101 101 102 def __init__(self, version): … … 112 113 help="user specific templates", 113 114 dest="templates", default = self.templates) 114 parser.add_option("-i", "--identity", 115 help="identity provider to use (sqlobject (default)," 116 " sqlalchemy, none)", 117 dest="identity", default = self.identity) 115 parser.add_option("-s", "--sqlalchemy", 116 help="use SQLAlchemy instead of SQLObject", 117 action="store_true", dest="sqlalchemy", default = False) 118 parser.add_option("-i", "--identity", 119 help="provide Identity support", 120 action="store_true", dest="identity", default = False) 118 121 119 122 (options, args) = parser.parse_args() … … 137 140 self.package = package 138 141 139 doidentity = None142 doidentity = self.identity 140 143 while not doidentity: 141 144 doidentity = raw_input("Do you need Identity " … … 146 149 break 147 150 if doidentity.startswith("y"): 151 doidentity = True 148 152 break 149 153 print "Please enter y(es) or n(o)." 150 154 doidentity = None 151 152 while not self.identity: 153 self.identity = raw_input("Select your provider sqlobject or sqlalchemy [sqlobject]: ") 154 if not self.identity: 155 156 if doidentity is True: 157 if self.sqlalchemy: 158 self.identity = "sqlalchemy" 159 else: 155 160 self.identity = "sqlobject" 156 if self.identity not in ["sqlobject", "sqlalchemy"]:157 print "Please enter one of 'sqlobject', 'sqlalchemy'"158 self.identity = ""159 continue160 161 161 self.name = pkg_resources.safe_name(self.name) 162 162 … … 187 187 cmd_args.append("--template=%s" % template) 188 188 cmd_args.append(self.name) 189 cmd_args.append("package=%s" %self.package) 190 cmd_args.append("identity=%s" %self.identity) 189 cmd_args.append("package=%s" % self.package) 190 cmd_args.append("identity=%s" % self.identity) 191 cmd_args.append("sqlalchemy=%s" % self.sqlalchemy) 191 192 if self.dry_run: 192 193 cmd_args.append("--simulate") branches/1.0/turbogears/database.py
r1600 r1603 25 25 26 26 def get_engine(): 27 "Retreives the engine based on the current configuration" 27 28 global _engine 28 29 if not _engine: … … 31 32 raise KeyError("No sqlalchemy database config found!") 32 33 _engine = sqlalchemy.create_engine(dburi) 34 metadata.connect(_engine) 33 35 return _engine 34 36 35 37 def create_session(): 38 "Creates a session with the appropriate engine" 36 39 return sqlalchemy.create_session(bind_to=get_engine()) 37 40 … … 41 44 42 45 def bind_meta_data(): 43 metadata.connect(get_engine())44 46 get_engine() 47 45 48 except ImportError: 46 49 sqlalchemy = None … … 272 275 transaction.rollback() 273 276 raise 274 session.clear()275 277 276 278 def so_to_dict(sqlobj): … … 312 314 class EndTransactionsFilter(BaseFilter): 313 315 def on_end_resource(self): 316 if _use_sa(): 317 session.clear() 314 318 end_all() 315 319 branches/1.0/turbogears/identity/saprovider.py
r1491 r1603 3 3 import md5 4 4 import random 5 from datetime import * 6 5 7 import turbogears 8 from turbogears import identity 9 from turbogears.util import load_class 10 from turbogears.database import session 6 11 from turbojson.jsonify import * 7 from datetime import *8 from sqlalchemy import *9 from sqlalchemy.ext.activemapper import *10 12 11 13 import logging 12 14 log = logging.getLogger("turbogears.identity.saprovider") 13 14 from turbogears import identity15 16 __engine__= turbogears.database.PackageEngine( 'turbogears.identity' )17 18 from turbogears.util import load_class19 15 20 16 try: … … 24 20 25 21 # Global class references -- these will be set when the Provider is initialised. 26 user_class = None27 group_class = None28 permission_class = None29 visit_class = None22 user_class = None 23 group_class = None 24 permission_class = None 25 visit_class = None 30 26 31 27 class SqlAlchemyIdentity(object): 32 28 def __init__(self, visit_key, user=None): 33 29 if user: 34 self._user = user35 self.visit_key = visit_key30 self._user = user 31 self.visit_key = visit_key 36 32 37 33 def _get_user(self): … … 43 39 # Attempt to load the user. After this code executes, there *WILL* be 44 40 # a _user attribute, even if the value is None. 45 visit = visit_class.get_by( visit_key= self.visit_key)41 visit = visit_class.get_by(visit_key = self.visit_key) 46 42 if not visit: 47 self._user = None43 self._user = None 48 44 return None 49 self._user = user_class.get( visit.user_id)45 self._user = user_class.get(visit.user_id) 50 46 return self._user 51 user = property(_get_user)47 user = property(_get_user) 52 48 53 49 def _get_user_name(self): … … 55 51 return None 56 52 return self.user.user_name 57 user_name = property(_get_user_name)53 user_name = property(_get_user_name) 58 54 59 55 def _get_anonymous(self): 60 56 return not self.user 61 anonymous = property(_get_anonymous)57 anonymous = property(_get_anonymous) 62 58 63 59 def _get_permissions(self): … … 68 64 pass 69 65 if not self.user: 70 self._permissions = frozenset()66 self._permissions = frozenset() 71 67 else: 72 self._permissions = frozenset([p.permission_name for p in self.user.permissions])68 self._permissions = frozenset([p.permission_name for p in self.user.permissions]) 73 69 return self._permissions 74 permissions = property(_get_permissions)70 permissions = property(_get_permissions) 75 71 76 72 def _get_groups(self): … … 81 77 pass 82 78 if not self.user: 83 self._groups = frozenset()79 self._groups = frozenset() 84 80 else: 85 self._groups = frozenset([g.group_name for g in self.user.groups])81 self._groups = frozenset([g.group_name for g in self.user.groups]) 86 82 return self._groups 87 groups = property(_get_groups)83 groups = property(_get_groups) 88 84 89 85 def logout(self): … … 94 90 return 95 91 try: 96 visit = visit_class.get_by(visit_key=self.visit_key)97 objectstore.delete( visit)92 visit = visit_class.get_by(visit_key=self.visit_key) 93 session.delete(visit) 98 94 # Clear the current identity 99 anon = SqlAlchemyIdentity(None,None)100 anon.anonymous = True101 identity.set_current_identity( anon)95 anon = SqlAlchemyIdentity(None,None) 96 anon.anonymous = True 97 identity.set_current_identity(anon) 102 98 except: 103 99 pass … … 111 107 def __init__(self): 112 108 super(SqlAlchemyIdentityProvider, self).__init__() 113 get= cherrypy.config.get109 get=turbogears.config.get 114 110 115 111 global user_class, group_class, permission_class, visit_class 116 112 117 user_class_path= get( "identity.saprovider.model.user", 118 __name__ + ".User" ) 119 user_class= load_class(user_class_path) 120 group_class_path= get( "identity.saprovider.model.group", 121 __name__ + ".Group" ) 122 group_class= load_class(group_class_path) 123 permission_class_path= get( "identity.saprovider.model.permission", 124 __name__ + ".Permission" ) 125 permission_class= load_class(permission_class_path) 126 visit_class_path= get( "identity.saprovider.model.visit", 127 __name__ + ".VisitIdentity" ) 128 visit_class= load_class(visit_class_path) 113 user_class_path = get("identity.saprovider.model.user", 114 None) 115 user_class = load_class(user_class_path) 116 group_class_path = get("identity.saprovider.model.group", 117 None) 118 group_class = load_class(group_class_path) 119 permission_class_path = get("identity.saprovider.model.permission", 120 None) 121 permission_class = load_class(permission_class_path) 122 visit_class_path = get("identity.saprovider.model.visit", 123 None) 124 log.info("Loading: %s", visit_class_path) 125 visit_class = load_class(visit_class_path) 129 126 # Default encryption algorithm is to use plain text passwords 130 algorithm = get( "identity.saprovider.encryption_algorithm", None)127 algorithm = get("identity.saprovider.encryption_algorithm", None) 131 128 if "md5"==algorithm: 132 self.encrypt_password = lambda pw: md5.new(pw).hexdigest()129 self.encrypt_password = lambda pw: md5.new(pw).hexdigest() 133 130 elif "sha1"==algorithm: 134 self.encrypt_password = lambda pw: sha.new(pw).hexdigest()131 self.encrypt_password = lambda pw: sha.new(pw).hexdigest() 135 132 else: 136 self.encrypt_password = lambda pw: pw133 self.encrypt_password = lambda pw: pw 137 134 138 def create_provider_model( self ): 139 # create the database tables 135 def create_provider_model(self): 136 "Not implemented. You must create your model tables another way." 137 # model is not created through this mechanism 140 138 return 141 try:142 global user_group, group_permission143 139 144 visit_class.table.create() 145 user_class.table.create() 146 group_class.table.create() 147 permission_class.table.create() 148 user_group.create() 149 group_permission.create() 150 objectstore.commit() 151 except SQLError: 152 return 153 except KeyError: 154 log.warning( "No database is configured: SqlAlchemyIdentityProvider is disabled." ) 155 return 156 157 def validate_identity( self, user_name, password, visit_key ): 140 def validate_identity(self, user_name, password, visit_key): 158 141 ''' 159 142 Look up the identity represented by user_name and determine whether the … … 167 150 permissions: a set of permission IDs 168 151 ''' 169 user = user_class.get_by( user_name=user_name)152 user = user_class.get_by(user_name=user_name) 170 153 if not user: 171 log.warning( "No such user: %s", user_name)154 log.warning("No such user: %s", user_name) 172 155 return None 173 156 if user.password!=self.encrypt_password(password): 174 log.info( "Passwords don't match for user: %s", user_name)157 log.info("Passwords don't match for user: %s", user_name) 175 158 return None 176 159 177 log.info( "associating user (%s) with visit (%s)", user.user_name,178 visit_key )160 log.info("associating user (%s) with visit (%s)", user.user_name, 161 visit_key) 179 162 # Link the user to the visit 180 link = visit_class.get_by( visit_key=visit_key)163 link = visit_class.get_by(visit_key=visit_key) 181 164 if not link: 182 link = visit_class( visit_key=visit_key, user_id=user.user_id)165 link = visit_class(visit_key=visit_key, user_id=user.user_id) 183 166 else: 184 link.user_id= user.user_id 185 link.commit() 186 return SqlAlchemyIdentity( visit_key, user ) 167 link.user_id = user.user_id 168 return SqlAlchemyIdentity(visit_key, user) 187 169 188 def load_identity( self, visit_key):170 def load_identity(self, visit_key): 189 171 ''' 190 172 Lookup the principal represented by user_name. Return None if there is no … … 197 179 permissions: a set of permission IDs 198 180 ''' 199 return SqlAlchemyIdentity( visit_key)181 return SqlAlchemyIdentity(visit_key) 200 182 201 def anonymous_identity( self):183 def anonymous_identity(self): 202 184 ''' 203 185 Must return an object with the following properties: … … 207 189 permissions: a set of permission IDs 208 190 ''' 209 return SqlAlchemyIdentity( None ) 210 211 212 user_group = Table("tg_user_group", __engine__, 213 Column("user_id", Integer, 214 ForeignKey("tg_user.user_id"), 215 primary_key = True), 216 Column("group_id", Integer, 217 ForeignKey("tg_group.group_id"), 218 primary_key = True)) 219 220 group_permission = Table("tg_group_permission", __engine__, 221 Column("group_id", Integer, 222 ForeignKey("tg_group.group_id"), 223 primary_key = True), 224 Column("permission_id", Integer, 225 ForeignKey("permission.permission_id"), 226 primary_key = True)) 227 228 229 class VisitIdentity(ActiveMapper): 230 class mapping: 231 __table__ = "tg_visit_identity" 232 visit_key = column(String, # foreign_key = "visit.visit_key", 233 primary_key = True) 234 user_id = column(Integer, foreign_key = "tg_user.user_id", index = True) 235 236 237 class Group(ActiveMapper): 238 """ 239 An ultra-simple group definition. 240 """ 241 class mapping: 242 __table__ = "tg_group" 243 group_id = column(Integer, primary_key = True) 244 group_name = column(Unicode(16), unique = True) 245 display_name = column(Unicode(255)) 246 created = column(DateTime, default = datetime.now) 247 248 #users = many_to_many("User", user_group, backref = "groups") 249 #permissions = many_to_many("Permission", group_permission, 250 # backref = "groups") 251 252 253 class User(ActiveMapper): 254 """ 255 Reasonably basic User definition. Probably would want additional attributes. 256 """ 257 class mapping: 258 __table__ = "tg_user" 259 user_id = column(Integer, primary_key = True) 260 user_name = column(Unicode(16), unique = True) 261 email_address = column(Unicode(255), unique = True) 262 display_name = column(Unicode(255)) 263 password = column(Unicode(40)) 264 created = column(DateTime, default = datetime.now) 265 266 groups = many_to_many("Group", user_group, backref = "users") 267 268 @property 269 def permissions(self): 270 perms = set() 271 for g in self.groups: 272 perms = perms | set(g.permissions) 273 return perms 274 275 276 class Permission(ActiveMapper): 277 class mapping: 278 __table__ = "tg_permission" 279 permission_id = column(Integer, primary_key = True) 280 permission_name = column(Unicode(16), unique = True) 281 description = column(Unicode(255)) 282 283 groups = many_to_many("Group", group_permission, 284 backref = "permissions") 285 191 return SqlAlchemyIdentity(None) branches/1.0/turbogears/identity/soprovider.py
r1512 r1603 176 176 log.info("Succesfully loaded \"%s\"" % permission_class_path) 177 177 178 visit_class_path= get( " visit.soprovider.model",178 visit_class_path= get( "identity.soprovider.model.visit", 179 179 __name__ + ".TG_VisitIdentity" ) 180 180 visit_class= load_class(visit_class_path) branches/1.0/turbogears/qstemplates/quickstart/dev.cfg_tmpl
r1380 r1603 7 7 # DATABASE 8 8 9 #if $sqlalchemy == "True" 10 # driver://username:password@host:port/database 11 # pick the form for your database 12 # sqlalchemy.dburi="postgres://username@hostname/databasename" 13 # sqlalchemy.dburi="mysql://username:password@hostname:port/databasename" 14 # sqlalchemy.dburi="sqlite:///file_name_and_path" 15 16 # If you have sqlite, here's a simple default to get you started 17 # in development 18 sqlalchemy.dburi="sqlite:///devdata.sqlite" 19 #else 9 20 # pick the form for your database 10 21 # sqlobject.dburi="postgres://username@hostname/databasename" … … 24 35 # for Windows users, sqlite URIs look like: 25 36 # sqlobject.dburi="sqlite:///drive_letter:/path/to/file" 26 37 #end if 27 38 28 39 # SERVER branches/1.0/turbogears/qstemplates/quickstart/+package+/config/app.cfg_tmpl
r1578 r1603 63 63 #if $identity == "sqlobject" 64 64 # Database class to use for visit tracking 65 visit.soprovider.model = "${package}.model.Visit Identity"65 visit.soprovider.model = "${package}.model.Visit" 66 66 #else if $identity == "sqlalchemy" 67 67 # Database class to use for visit tracking 68 visit.saprovider.model = "${package}.model.Visit Identity"68 visit.saprovider.model = "${package}.model.Visit" 69 69 #end if 70 70 branches/1.0/turbogears/qstemplates/quickstart/+package+/controllers.py_tmpl
r1567 r1603 7 7 #if $identity != "none" 8 8 from turbogears import identity 9 #end if 10 #if $sqlalchemy == "True" 11 from turbogears.database import session 9 12 #end if 10 13 branches/1.0/turbogears/qstemplates/quickstart/+package+/model.py_tmpl
r1567 r1603 3 3 4 4 #end if 5 #if $sqlalchemy != "True" 5 6 from sqlobject import * 6 7 7 #if $identity == "sqlobject" 8 #else 9 from sqlalchemy import * 10 from sqlalchemy.ext.activemapper import ActiveMapper, column, \ 11 one_to_many, one_to_one, many_to_many 12 13 #end if 14 #if $identity != "none" 8 15 from turbogears import identity 9 16 #end if 17 #if $sqlalchemy != "True" 10 18 from turbogears.database import PackageHub 11 19 12 20 hub = PackageHub("${package}") 13 21 __connection__ = hub 14 15 #if $identity == "sqlalchemy" 16 from sqlalchemy import * 17 from sqlalchemy.ext.activemapper import * 18 19 from turbogears.database import PackageEngine 20 engine = __engine__ = PackageEngine("${package}") 21 #end if 22 23 #if $identity=="sqlobject" 22 #else 23 from turbogears.database import metadata 24 #end if 25 26 #if $sqlalchemy!="True" 24 27 # class YourDataClass(SQLObject): 25 28 # pass 26 29 30 #end if 31 #if $identity=="sqlobject" 32 class Visit(SQLObject): 33 class sqlmeta: 34 table="visit" 35 36 visit_key= StringCol( length=40, alternateID=True, 37 alternateMethodName="by_visit_key" ) 38 created= DateTimeCol( default=datetime.now ) 39 expiry= DateTimeCol() 40 41 def lookup_visit( cls, visit_key ): 42 try: 43 return cls.by_visit_key( visit_key ) 44 except SQLObjectNotFound: 45 return None 46 lookup_visit= classmethod(lookup_visit) 27 47 28 48 class VisitIdentity(SQLObject): 29 visit_key = StringCol( length=40, alternateID=True,30 alternateMethodName="by_visit_key" )49 visit_key = StringCol(length=40, alternateID=True, 50 alternateMethodName="by_visit_key") 31 51 user_id = IntCol() 32 52 … … 42 62 table="tg_group" 43 63 44 group_name = UnicodeCol( length=16, alternateID=True,45 alternateMethodName="by_group_name" )46 display_name = UnicodeCol( length=255)47 created = DateTimeCol( default=datetime.now)64 group_name = UnicodeCol(length=16, alternateID=True, 65 alternateMethodName="by_group_name") 66 display_name = UnicodeCol(length=255) 67 created = DateTimeCol(default=datetime.now) 48 68 49 69 # collection of all users belonging to this group 50 users = RelatedJoin( "User", intermediateTable="user_group",51 joinColumn="group_id", otherColumn="user_id" )70 users = RelatedJoin("User", intermediateTable="user_group", 71 joinColumn="group_id", otherColumn="user_id") 52 72 53 73 # collection of all permissions for this group 54 permissions = RelatedJoin( "Permission", joinColumn="group_id",74 permissions = RelatedJoin("Permission", joinColumn="group_id", 55 75 intermediateTable="group_permission", 56 otherColumn="permission_id" )76 otherColumn="permission_id") 57 77 58 78 … … 66 86 table="tg_user" 67 87 68 user_name = UnicodeCol( length=16, alternateID=True,69 alternateMethodName="by_user_name" )70 email_address = UnicodeCol( length=255, alternateID=True,71 alternateMethodName="by_email_address" )72 display_name = UnicodeCol( length=255)73 password = UnicodeCol( length=40)74 created = DateTimeCol( default=datetime.now)88 user_name = UnicodeCol(length=16, alternateID=True, 89 alternateMethodName="by_user_name") 90 email_address = UnicodeCol(length=255, alternateID=True, 91 alternateMethodName="by_email_address") 92 display_name = UnicodeCol(length=255) 93 password = UnicodeCol(length=40) 94 created = DateTimeCol(default=datetime.now) 75 95 76 96 # groups this user belongs to 77 groups = RelatedJoin( "Group", intermediateTable="user_group",78 joinColumn="user_id", otherColumn="group_id" )79 80 def _get_permissions( self):97 groups = RelatedJoin("Group", intermediateTable="user_group", 98 joinColumn="user_id", otherColumn="group_id") 99 100 def _get_permissions(self): 81 101 perms = set() 82 102 for g in self.groups: … … 84 104 return perms 85 105 86 def _set_password( self, cleartext_password):106 def _set_password(self, cleartext_password): 87 107 "Runs cleartext_password through the hash algorithm before saving." 88 108 hash = identity.encrypt_password(cleartext_password) 89 109 self._SO_set_password(hash) 90 110 91 def set_password_raw( self, password):111 def set_password_raw(self, password): 92 112 "Saves the password as-is to the database." 93 113 self._SO_set_password(password) … … 96 116 97 117 class Permission(SQLObject): 98 permission_name = UnicodeCol( length=16, alternateID=True,99 alternateMethodName="by_permission_name" )100 description = UnicodeCol( length=255)118 permission_name = UnicodeCol(length=16, alternateID=True, 119 alternateMethodName="by_permission_name") 120 description = UnicodeCol(length=255) 101 121 102 groups = RelatedJoin( "Group",122 groups = RelatedJoin("Group", 103 123 intermediateTable="group_permission", 104 124 joinColumn="permission_id", 105 otherColumn="group_id" )125 otherColumn="group_id") 106 126 107 127 108 128 #else if $identity=="sqlalchemy" 129 130 class Visit(ActiveMapper): 131 class mapping: 132 __table__ = "visit" 133 visit_key = column(String(40), primary_key=True) 134 created = column(DateTime, nullable = False, default=datetime.now) 135 expiry = column(DateTime) 136 137 def lookup_visit(cls, visit_key): 138 return Visit.get( visit_key ); 139 lookup_visit= classmethod(lookup_visit) 140 109 141 # tables for SQLAlchemy identity 110 user_group = Table( "user_group", __engine__,111 Column( "user_id", Integer,112 ForeignKey(" user.user_id"),113 primary_key=True ),114 Column( "group_id", Integer,115 ForeignKey(" group.group_id"),116 primary_key=True ))142 user_group = Table("user_group", metadata, 143 Column("user_id", Integer, 144 ForeignKey("tg_user.user_id"), 145 primary_key=True), 146 Column("group_id", Integer, 147 ForeignKey("tg_group.group_id"), 148 primary_key=True)) 117 149 118 group_permission = Table( "group_permission", __engine__,119 Column( "group_id", Integer,120 ForeignKey(" group.group_id"),121 primary_key=True ),122 Column( "permission_id", Integer,150 group_permission = Table("group_permission", metadata, 151 Column("group_id", Integer, 152 ForeignKey("tg_group.group_id"), 153 primary_key=True), 154 Column("permission_id", Integer, 123 155 ForeignKey("permission.permission_id"), 124 primary_key=True ))156 primary_key=True)) 125 157 126 158 … … 128 160 class mapping: 129 161 __table__="visit_identity" 130 visit_key = column( String, # foreign_key="visit.visit_key",131 primary_key=True )132 user_id = column( Integer, foreign_key="user.user_id", index=True)162 visit_key = column(String, # foreign_key="visit.visit_key", 163 primary_key=True) 164 user_id = column(Integer, foreign_key="tg_user.user_id", index=True) 133 165 134 166 … … 139 171 class mapping: 140 172 __table__="tg_group" 141 group_id = column( Integer, primary_key=True)142 group_name = column( Unicode(16), unique=True)143 display_name = column( Unicode(255))144 created = column( DateTime, default=datetime.now)145 146 users = many_to_many( "User", user_group, backref="groups")147 permissions = many_to_many( "Permission", group_permission,148 backref="groups" )173 group_id = column(Integer, primary_key=True) 174 group_name = column(Unicode(16), unique=True) 175 display_name = column(Unicode(255)) 176 created = column(DateTime, default=datetime.now) 177 178 users = many_to_many("User", user_group, backref="groups") 179 permissions = many_to_many("Permission", group_permission, 180 backref="groups") 149 181 150 182 … … 155 187 class mapping: 156 188 __table__="tg_user" 157 user_id = column( Integer, primary_key=True)158 user_name = column( Unicode(16), unique=True)159 email_address = column( Unicode(255), unique=True)160 display_name = column( Unicode(255))161 password = column( Unicode(40))162 created = column( DateTime, default=datetime.now)163 164 groups = many_to_many( "Group", user_group, backref="users")165 166 def permissions( self):189 user_id = column(Integer, primary_key=True) 190 user_name = column(Unicode(16), unique=True) 191 email_address = column(Unicode(255), unique=True) 192 display_name = column(Unicode(255)) 193 password = column(Unicode(40)) 194 created = column(DateTime, default=datetime.now) 195 196 groups = many_to_many("Group", user_group, backref="users") 197 198 def permissions(self): 167 199 perms = set() 168 200 for g in self.groups: … … 175 207 class mapping: 176 208 __table__="permission" 177 permission_id = column( Integer, primary_key=True)178 permission_name = column( Unicode(16), unique=True)179 description = column( Unicode(255))180 181 groups = many_to_many( "Group", group_permission,182 backref="permmissions" )183 #end if 209 permission_id = column(Integer, primary_key=True) 210 permission_name = column(Unicode(16), unique=True) 211 description = column(Unicode(255)) 212 213 groups = many_to_many("Group", group_permission, 214