On Fri, 2007-01-12 at 10:18 -0200, Jorge Godoy wrote: > Toshio Kuratomi <[EMAIL PROTECTED]> writes: > > > Is it possible to hook visit to a second database? > > > > I'm trying to share visit and identity sessions among several different > > web applications that we're deploying here. The goal is to log into one > > application and then access a second one without re-logging in. To do > > this, I have to be able to share the database that visit uses to store > > its vist_keys. > > I haven't tried, but you can specify the connection for each class on your > model. There you can specify a connection to a second database... You'll > just have to set it up by hand. > I'm not certain how you see me doing this. I'll present the code that I've hacked together and you can tell me if I'm taking any wrong turns. So far, I have visit loading but can't test it because I don't yet have identity working. I needed to patch some TurboGears code to get it running which makes me think I'm doing something wrong. (This initial work is done with SQLAlchemy, BTW. I haven't looked into doing it with SQLObject yet)
* savisit.py.diff: Small patch to visit.py to use the correct session when saving. * tgfas.py: My model for visit. All the identity stuff is commented because I'm going to need to tie identity into an external account system and I'd like to keep from saving the user information in two places. (We'll see if that's doable as I hack identity.) * safasvisit.py: My visit plugin. Am I doing something wrong in my model or is the patch to savisit.py appropriate? -Toshio
import turbogears
from datetime import *
from sqlalchemy import *
from sqlalchemy.ext.sessioncontext import SessionContext
from sqlalchemy.ext.assignmapper import assign_mapper
# The identity schema.
### FIXME:
# Steps to abstracting this:
# [x] Move this to its own model.py
# [x] in app.cfg, set the config to point to a different model.py
# [x] Move the visit/identity model.py into fedora-accounts.
### FIXME: Construct the default dburi from the /etc/sysconfig file like
# website.py does
#dburi = turbogears.config.get('fedora.fasdburi', 'sqlite://')
dburi = 'sqlite:////var/tmp/fasdb.sqlite'
engine = create_engine(dburi)
metadata = DynamicMetaData()
metadata.connect(dburi)
context = SessionContext(lambda:create_session(bind_to=engine))
visits_table = Table('visit', metadata,
Column('visit_key', String(40), primary_key=True),
Column('created', DateTime, nullable=False, default=datetime.now),
Column('expiry', DateTime)
)
visit_identity_table = Table('visit_identity', metadata,
Column('visit_key', String(40), primary_key=True),
Column('user_id', Integer, index=True)
)
'''
visit_identity_table = Table('visit_identity', metadata,
Column('visit_key', String(40), primary_key=True),
Column('user_id', Integer, ForeignKey('tg_user.user_id'), index=True)
)
groups_table = Table('tg_group', metadata,
Column('group_id', Integer, primary_key=True),
Column('group_name', Unicode(16), unique=True),
Column('display_name', Unicode(255)),
Column('created', DateTime, default=datetime.now)
)
users_table = Table('tg_user', metadata,
Column('user_id', Integer, primary_key=True),
Column('user_name', Unicode(16), unique=True),
Column('email_address', Unicode(255), unique=True),
Column('display_name', Unicode(255)),
Column('password', Unicode(40)),
Column('created', DateTime, default=datetime.now)
)
permissions_table = Table('permission', metadata,
Column('permission_id', Integer, primary_key=True),
Column('permission_name', Unicode(16), unique=True),
Column('description', Unicode(255))
)
user_group_table = Table('user_group', metadata,
Column('user_id', Integer, ForeignKey('tg_user.user_id')),
Column('group_id', Integer, ForeignKey('tg_group.group_id'))
)
group_permission_table = Table('group_permission', metadata,
Column('group_id', Integer, ForeignKey('tg_group.group_id')),
Column('permission_id', Integer, ForeignKey('permission.permission_id'))
)
'''
class Visit(object):
def lookup_visit(cls, visit_key):
return Visit.get(visit_key)
lookup_visit = classmethod(lookup_visit)
class VisitIdentity(object):
pass
'''
class Group(object):
"""
An ultra-simple group definition.
"""
pass
class User(object):
"""
Reasonably basic User definition. Probably would want additional
attributes.
"""
def permissions(self):
perms = set()
for g in self.groups:
perms = perms | set(g.permissions)
return perms
permissions = property(permissions)
class Permission(object):
pass
'''
assign_mapper(context, Visit, visits_table)
assign_mapper(context, VisitIdentity, visit_identity_table)
'''
assign_mapper(context, VisitIdentity, visit_identity_table,
properties=dict(users=relation(User, backref='visit_identity')))
assign_mapper(context, User, users_table)
assign_mapper(context, Group, groups_table,
properties=dict(users=relation(User,secondary=user_group_table, backref='groups')))
assign_mapper(context, Permission, permissions_table,
properties=dict(groups=relation(Group,secondary=group_permission_table, backref='permissions')))
'''
from turbogears.visit.savisit import SqlAlchemyVisitManager
from turbogears import config
from turbogears.util import load_class
from turbogears.database import bind_meta_data
class SaFASVisitManager(SqlAlchemyVisitManager):
'''Visit Manager that talks to the Fedora Account System'''
def __init__(self, timeout):
global visit_class
super(SaFASVisitManager, self).__init__(timeout)
visit_class_path = config.get('visit.safasprovider.model',
'fedora.accounts.tgfas.Visit')
visit_class = load_class(visit_class_path)
bind_meta_data()
--- /usr/lib/python2.4/site-packages/turbogears/visit/savisit.py 2006-11-13 15:09:48.000000000 -0800
+++ savisit.py 2007-01-12 10:31:54.000000000 -0800
@@ -29,7 +29,7 @@
def new_visit_with_key(self, visit_key):
visit = visit_class(visit_key=visit_key,
expiry=datetime.now()+self.timeout)
- session.save(visit)
+ visit_class.mapper.get_session().save(visit)
return Visit(visit_key, True)
def visit_for_key(self, visit_key):
signature.asc
Description: This is a digitally signed message part

