Hi,
I tried the following example, rows are inserting fine but when I try
to login I am getting the following error.
Error -<class 'sqlalchemy.exc.InvalidRequestError'>: Mapper 'Mapper|
User|t_user' has no property 'groups'
URL: http://192.168.2.129:8081/login_handler?__logins=0&came_from=%2F
File
'/home/gaffar/ProjectWork/tg2env/lib/python2.6/site-packages/WebError-0.10.1-py2.6.egg/weberror/errormiddleware.py',
line 162 in __call__
app_iter = self.application(environ, sr_checker)
File
'/home/gaffar/ProjectWork/tg2env/lib/python2.6/site-packages/TurboGears2-2.1-py2.6.egg/tg/configuration.py',
line 796 in remover
return app(environ, start_response)
File
'/home/gaffar/ProjectWork/tg2env/lib/python2.6/site-packages/repoze.tm2-1.0b1-py2.6.egg/repoze/tm/__init__.py',
line 23 in __call__
result = self.application(environ, save_status_and_headers)
File
'/home/gaffar/ProjectWork/tg2env/lib/python2.6/site-packages/repoze.who-1.0.18-py2.6.egg/repoze/who/middleware.py',
line 85 in __call__
self.add_metadata(environ, classification, identity)
File
'/home/gaffar/ProjectWork/tg2env/lib/python2.6/site-packages/repoze.who-1.0.18-py2.6.egg/repoze/who/middleware.py',
line 179 in add_metadata
plugin.add_metadata(environ, identity)
File
'/home/gaffar/ProjectWork/tg2env/lib/python2.6/site-packages/repoze.what-1.0.9-py2.6.egg/repoze/what/middleware.py',
line 98 in add_metadata
groups, permissions = self._find_groups(identity)
File
'/home/gaffar/ProjectWork/tg2env/lib/python2.6/site-packages/repoze.what-1.0.9-py2.6.egg/repoze/what/middleware.py',
line 78 in _find_groups
groups |= set(grp_fetcher.find_sections(credentials))
File
'/home/gaffar/ProjectWork/tg2env/lib/python2.6/site-packages/repoze.what-1.0.9-py2.6.egg/repoze/what/adapters/__init__.py',
line 170 in find_sections
return self._find_sections(hint)
File
'/home/gaffar/ProjectWork/tg2env/lib/python2.6/site-packages/repoze.what.plugins.sql-1.0-py2.6.egg/repoze/what/plugins/sql/adapters.py',
line 307 in _find_sections
user = self._get_item_as_row(id_)
File
'/home/gaffar/ProjectWork/tg2env/lib/python2.6/site-packages/repoze.what.plugins.sql-1.0-py2.6.egg/repoze/what/plugins/sql/adapters.py',
line 197 in _get_item_as_row
query =
self.dbsession.query(self.children_class).options(eagerload(self.translations['sections']))
File
'/home/gaffar/ProjectWork/tg2env/lib/python2.6/site-packages/SQLAlchemy-0.6.6-py2.6.egg/sqlalchemy/orm/query.py',
line 853 in options
return self._options(False, *args)
File '<string>', line 1 in<lambda>
File
'/home/gaffar/ProjectWork/tg2env/lib/python2.6/site-packages/SQLAlchemy-0.6.6-py2.6.egg/sqlalchemy/orm/query.py',
line 52 in generate
fn(self, *args[1:], **kw)
File
'/home/gaffar/ProjectWork/tg2env/lib/python2.6/site-packages/SQLAlchemy-0.6.6-py2.6.egg/sqlalchemy/orm/query.py',
line 870 in _options
opt.process_query(self)
File
'/home/gaffar/ProjectWork/tg2env/lib/python2.6/site-packages/SQLAlchemy-0.6.6-py2.6.egg/sqlalchemy/orm/interfaces.py',
line 760 in process_query
self._process(query, True)
File
'/home/gaffar/ProjectWork/tg2env/lib/python2.6/site-packages/SQLAlchemy-0.6.6-py2.6.egg/sqlalchemy/orm/interfaces.py',
line 766 in _process
paths, mappers = self._get_paths(query, raiseerr)
File
'/home/gaffar/ProjectWork/tg2env/lib/python2.6/site-packages/SQLAlchemy-0.6.6-py2.6.egg/sqlalchemy/orm/interfaces.py',
line 843 in _get_paths
resolve_synonyms=True, raiseerr=raiseerr)
File
'/home/gaffar/ProjectWork/tg2env/lib/python2.6/site-packages/SQLAlchemy-0.6.6-py2.6.egg/sqlalchemy/orm/mapper.py',
line 941 in get_property
"Mapper '%s' has no property '%s'" % (self, key))
InvalidRequestError: Mapper 'Mapper|User|t_user' has no property
'groups'
------------------------------------
On Thu, 2011-02-17 at 14:02 +0100, Christoph Zwerschke wrote:
Am 17.02.2011 13:00 schrieb Abdul Gaffar:
I tried this example, I am facing proble while inserting the records..
I think the problem is you can't easily associate items with SQLAlchemy
by using the relationship property. It's really made only for binary
relationships. I guess you need to do it explicitely, like this:
user = User.query.filter_by(user_name='abdul').one()
group = Group.query.filter_by(group_name='foo').one()
project = Project.query.filter_by(project_name='tg').one()
DBSession.add(Association(user, group, project))
DBSession.flush()
print user.groups_for_project(project)
where the classes are defined like that:
class Association(DeclarativeBase):
__tablename__ = 't_assoc'
user_id = Column(Integer, ForeignKey('t_user.user_id',
onupdate="CASCADE", ondelete="CASCADE"), primary_key=True)
group_id = Column(Integer, ForeignKey('t_group.group_id',
onupdate="CASCADE", ondelete="CASCADE"), primary_key=True,)
project_id = Column(Integer, ForeignKey('t_project.project_id',
onupdate="CASCADE", ondelete="CASCADE"), primary_key=True)
user = relationship('User', backref='associations',
cascade="all, delete")
group = relationship('Group', backref='associations',
cascade="all, delete")
project = relationship('Project', backref='associations',
cascade="all, delete")
def __init__(self, user, group, project):
self.user_id = user.user_id
self.group_id = group.group_id
self.project_id = project.project_id
class User(DeclarativeBase):
__tablename__ = 't_user'
user_id = Column(Integer, autoincrement=True, primary_key=True)
user_name = Column(Unicode(32), unique=True, nullable=False)
email_address = Column(Unicode(320), unique=True, nullable=False,
info={'rum': {'field':'Email'}})
def __repr__(self):
return ('<User: user_name=%r, email=%r>' % (
self.user_name, self.email_address))
def __unicode__(self):
return self.user_name
def groups_for_project(self, project):
return Project.query.join(Association).filter_by(
project_id=project.project_id, user_id=self.user_id).all()
class Group(DeclarativeBase):
__tablename__ = 't_group'
group_id = Column(Integer, autoincrement=True, primary_key=True)
group_name = Column(Unicode(16), unique=True)
def __repr__(self):
return '<Group: name=%r>' % self.group_name
def __unicode__(self):
return self.group_name
class Project(DeclarativeBase):
__tablename__ = 't_project'
project_id = Column(Integer, autoincrement=True, primary_key=True)
project_name = Column(Unicode(80), unique=True, nullable=False)
def __repr__(self):
return '<Project(%r)>' % self.project_name
Similarly, you can define User.projects_for_group and the corresponding
methods on the other classes.
But you'll probably get a more profound answer on the SA mailing list
(if you follow http://www.gerv.net/hacking/how-to-ask-good-questions/).
-- Christoph