[For those just coming in: This thread has been relocated from the 
SQLAlchemy list, where it was becoming increasingly off-topic]

An updated version of the patch for fixing the SQLAlchemy identity and 
visit implementations to work with the changes from r1600 is attached. 
This one takes advantage of Jonathan's implicit primary key support and 
updates the quickstart templates.

Note that it moves TG_Visit out of turbogears.visit.saprovider and into 
the user-provided model.


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"TurboGears" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at http://groups.google.com/group/turbogears
-~----------~----~----~----~------~----~------~--~---
Index: turbogears/identity/saprovider.py
===================================================================
--- turbogears/identity/saprovider.py	(revision 1602)
+++ turbogears/identity/saprovider.py	(working copy)
@@ -7,16 +7,19 @@
 from datetime import *
 from sqlalchemy import *
 from sqlalchemy.ext.activemapper import *
+import sqlalchemy.ext.activemapper as activemapper
 
 import logging
 log = logging.getLogger("turbogears.identity.saprovider")
 
 from turbogears import identity
+from turbogears.database import metadata
 
-__engine__= turbogears.database.PackageEngine( 'turbogears.identity' )
-
 from turbogears.util import load_class
 
+turbogears.database.bind_meta_data()
+activemapper.metadata = turbogears.database.metadata
+
 try:
     set, frozenset
 except NameError:
@@ -179,10 +182,9 @@
         # Link the user to the visit
         link= visit_class.get_by( visit_key=visit_key )
         if not link:
-            link= visit_class( visit_key=visit_key, user_id=user.user_id )
+            link= visit_class( visit_key=visit_key, user_id=user.id )
         else:
-            link.user_id= user.user_id
-        link.commit()
+            link.user_id= user.id
         return SqlAlchemyIdentity( visit_key, user )
             
     def load_identity( self, visit_key ):
@@ -208,78 +210,3 @@
         '''
         return SqlAlchemyIdentity( None )
         
-
-user_group = Table("tg_user_group", __engine__, 
-                      Column("user_id", Integer,
-                              ForeignKey("tg_user.user_id"),
-                              primary_key = True),
-                      Column("group_id", Integer,
-                              ForeignKey("tg_group.group_id"),
-                              primary_key = True))
-                      
-group_permission = Table("tg_group_permission", __engine__,
-                            Column("group_id", Integer,
-                                    ForeignKey("tg_group.group_id"),
-                                    primary_key = True),
-                            Column("permission_id", Integer,
-                                ForeignKey("permission.permission_id"),
-                                    primary_key = True))
-
-
-class VisitIdentity(ActiveMapper):
-    class mapping:
-        __table__ = "tg_visit_identity"
-        visit_key = column(String, # foreign_key = "visit.visit_key",
-                          primary_key = True)
-        user_id = column(Integer, foreign_key = "tg_user.user_id", index = True)
-
-
-class Group(ActiveMapper):
-    """
-    An ultra-simple group definition.
-    """
-    class mapping:
-        __table__ = "tg_group"
-        group_id = column(Integer, primary_key = True)
-        group_name = column(Unicode(16), unique = True)
-        display_name = column(Unicode(255))
-        created = column(DateTime, default = datetime.now)
-
-        #users = many_to_many("User", user_group, backref = "groups")
-        #permissions = many_to_many("Permission", group_permission,
-        #                           backref = "groups")
-
-
-class User(ActiveMapper):
-    """
-    Reasonably basic User definition. Probably would want additional attributes.
-    """
-    class mapping:
-        __table__ = "tg_user"
-        user_id = column(Integer, primary_key = True)
-        user_name = column(Unicode(16), unique = True)
-        email_address = column(Unicode(255), unique = True)
-        display_name = column(Unicode(255))
-        password = column(Unicode(40))
-        created = column(DateTime, default = datetime.now)
-
-        groups = many_to_many("Group", user_group, backref = "users")
-
-    @property
-    def permissions(self):
-        perms = set()
-        for g in self.groups:
-            perms = perms | set(g.permissions)
-        return perms
-        
-
-class Permission(ActiveMapper):
-    class mapping:
-        __table__ = "tg_permission"
-        permission_id = column(Integer, primary_key = True)
-        permission_name = column(Unicode(16), unique = True)
-        description = column(Unicode(255))
-        
-        groups = many_to_many("Group", group_permission,
-                              backref = "permissions")
-
Index: turbogears/visit/savisit.py
===================================================================
--- turbogears/visit/savisit.py	(revision 1602)
+++ turbogears/visit/savisit.py	(working copy)
@@ -1,29 +1,41 @@
+import cherrypy
 import turbogears
 from datetime import *
+from turbogears.database import metadata
+from turbogears.util import load_class
 from turbogears.visit.api import BaseVisitManager, Visit
+import sqlalchemy
 from sqlalchemy import *
 from sqlalchemy.ext.activemapper import *
 
 import logging
 log = logging.getLogger("turbogears.identity.savisit")
 
-__engine__= turbogears.database.PackageEngine( 'turbogears.visit' )
+turbogears.database.bind_meta_data()
 
+visit_class = None
 
 class SqlAlchemyVisitManager(BaseVisitManager):
     def __init__(self, timeout):
         super(SqlAlchemyVisitManager,self).__init__( timeout )
+
+        global visit_class
+
+        visit_class_path = cherrypy.config.get(
+            "visit.saprovider.model",
+            __name__ + ".TG_Visit" )
+        visit_class= load_class(visit_class_path)
         
     def create_model(self):
         try:
-            TG_Visit.table.create()
-            objectstore.commit()
-        except SQLError:
+            visit_class.table.create()
+        except sqlalchemy.exceptions.SQLError:
             pass
+        except sqlalchemy.exceptions.ArgumentError:
+            pass
             
     def new_visit_with_key(self, visit_key):
-        visit= TG_Visit( visit_key=visit_key, expiry=datetime.now()+self.timeout )
-        visit.commit()
+        visit= visit_class( visit_key=visit_key, expiry=datetime.now()+self.timeout )
         return Visit( visit_key, True )
         
     def visit_for_key(self, visit_key):
@@ -31,7 +43,7 @@
         Return the visit for this key or None if the visit doesn't exist or has
         expired.
         '''
-        visit= TG_Visit.lookup_visit( visit_key )
+        visit= visit_class.lookup_visit( visit_key )
         now= datetime.now()
         if not visit or visit.expiry < now:
             return None
@@ -41,33 +53,17 @@
         
     def update_queued_visits(self, queue):
         try:
-            table= TG_Visit.table
+            table= visit_class.table
+            if not hasattr(table.metadata, 'engine') or table.metadata.engine is not None:
+                turbogears.database.bind_meta_data()
             # Now update each of the visits with the most recent expiry
             for visit_key,expiry in queue.items():
                 log.info( "updating visit (%s) to expire at %s", visit_key,
                           expiry )
                 table.update( table.c.visit_key==visit_key,
                                   values={'expiry': expiry} ).execute()
-            objectstore.commit()
         except:
             objectstore.clear()
             raise
             
 
-tbl__tgvisit = Table('tg_visit', __engine__,
-    Column('visit_key', String(40) , primary_key=True),
-    Column('created', DateTime  , nullable = False ),
-    Column('expiry', DateTime ),
-)
-
-
-class TG_Visit(object):
-    table = tbl__tgvisit
-
-    def lookup_visit( cls, visit_key ):
-        return TG_Visit.get( visit_key );
-    lookup_visit= classmethod(lookup_visit)
-
-assign_mapper( TG_Visit , tbl__tgvisit )
-
-
Index: turbogears/qstemplates/quickstart/+package+/model.py_tmpl
===================================================================
--- turbogears/qstemplates/quickstart/+package+/model.py_tmpl	(revision 1602)
+++ turbogears/qstemplates/quickstart/+package+/model.py_tmpl	(working copy)
@@ -6,18 +6,20 @@
 
 #if $identity == "sqlobject"
 from turbogears import identity 
-#end if
 from turbogears.database import PackageHub
 
 hub = PackageHub("${package}")
 __connection__ = hub
+#end if
 
 #if $identity == "sqlalchemy"
+import turbogears.database
 from sqlalchemy import *
 from sqlalchemy.ext.activemapper import *
+import sqlalchemy.ext.activemapper as activemapper
 
-from turbogears.database import PackageEngine 
-engine = __engine__ = PackageEngine("${package}")
+metadata = activemapper.metadata = turbogears.database.metadata
+turbogears.database.bind_meta_data()
 #end if
 
 #if $identity=="sqlobject"
@@ -107,29 +109,44 @@
 
 #else if $identity=="sqlalchemy"
 # tables for SQLAlchemy identity
-user_group = Table( "user_group", __engine__, 
+user_group = Table( "user_group", metadata, 
                       Column( "user_id", Integer,
-                              ForeignKey("user.user_id"),
+                              ForeignKey("tg_user.id"),
                               primary_key=True ),
                       Column( "group_id", Integer,
-                              ForeignKey("group.group_id"),
+                              ForeignKey("tg_group.id"),
                               primary_key=True ) )
                       
-group_permission = Table( "group_permission", __engine__,
+group_permission = Table( "group_permission", metadata,
                             Column( "group_id", Integer,
-                                    ForeignKey("group.group_id"),
+                                    ForeignKey("tg_group.id"),
                                     primary_key=True ),
                             Column( "permission_id", Integer,
-                                ForeignKey("permission.permission_id"),
+                                ForeignKey("permission.id"),
                                     primary_key=True ) )
 
 
+class TG_Visit(ActiveMapper):
+    class mapping:
+        __table__ = 'tg_visit'
+        visit_key = column(String(40), primary_key=True)
+        created = column(DateTime, nullable=False, default=datetime.now)
+        expiry = column(DateTime)
+
+    def lookup_visit( cls, visit_key ):
+        return TG_Visit.get( visit_key );
+    lookup_visit= classmethod(lookup_visit)
+
+
 class VisitIdentity(ActiveMapper):
     class mapping:
-        __table__="visit_identity"
-        visit_key = column( String, # foreign_key="visit.visit_key",
-                          primary_key=True )
-        user_id = column( Integer, foreign_key="user.user_id", index=True )
+        __table__ = 'visit_identity'
+        visit_key = column(String(40), nullable=False, unique=True)
+        user_id = column(Integer, foreign_key=ForeignKey('tg_user.id'), index=True)
+    
+    def __init__(self, visit_key, user_id):
+        self.visit_key = visit_key
+        self.user_id = user_id
 
 
 class Group(ActiveMapper):
@@ -138,7 +155,6 @@
     """
     class mapping:
         __table__="tg_group"
-        group_id = column( Integer, primary_key=True )
         group_name = column( Unicode(16), unique=True )
         display_name = column( Unicode(255) )
         created = column( DateTime, default=datetime.now )
@@ -154,7 +170,6 @@
     """
     class mapping:
         __table__="tg_user"
-        user_id = column( Integer, primary_key=True )
         user_name = column( Unicode(16), unique=True )
         email_address = column( Unicode(255), unique=True )
         display_name = column( Unicode(255) )
@@ -174,10 +189,11 @@
 class Permission(ActiveMapper):
     class mapping:
         __table__="permission"
-        permission_id = column( Integer, primary_key=True )
         permission_name = column( Unicode(16), unique=True )
         description = column( Unicode(255) )
         
         groups = many_to_many( "Group", group_permission,
-                              backref="permmissions" )
+                              backref="permissions" )
+
+metadata.create_all()
 #end if
Index: turbogears/qstemplates/quickstart/+package+/config/app.cfg_tmpl
===================================================================
--- turbogears/qstemplates/quickstart/+package+/config/app.cfg_tmpl	(revision 1602)
+++ turbogears/qstemplates/quickstart/+package+/config/app.cfg_tmpl	(working copy)
@@ -65,7 +65,7 @@
 visit.soprovider.model = "${package}.model.VisitIdentity"
 #else if $identity == "sqlalchemy"
 # Database class to use for visit tracking
-visit.saprovider.model = "${package}.model.VisitIdentity"
+visit.saprovider.model = "${package}.model.TG_Visit"
 #end if
 
 # IDENTITY
Index: turbogears/qstemplates/quickstart/dev.cfg_tmpl
===================================================================
--- turbogears/qstemplates/quickstart/dev.cfg_tmpl	(revision 1602)
+++ turbogears/qstemplates/quickstart/dev.cfg_tmpl	(working copy)
@@ -14,6 +14,7 @@
 # If you have sqlite, here's a simple default to get you started
 # in development
 sqlobject.dburi="sqlite://%(current_dir_uri)s/devdata.sqlite"
+sqlalchemy.dburi="sqlite:///%(current_dir_uri)s/devdata.sqlite"
 
 
 # if you are using a database or table type without transactions

Reply via email to