Hey everyone,
I am running into a problem with association_proxy attributes in
SQLAlchemy 0.5 and python 2.6.
I pasted my model (a simplified version) all the way below.
My model has a Permission object, Project object and a Group object,
and it uses an AccessRule object to grant a permission to a group on a
specific project. To test everything I populated my database with one
permission instance, one project instance and two group instances. I
added the permission object for both groups to the project object.
Up to the last line of the interactive shell which illustrates the
problem, everything works fine. But when I call project.groups
[permission] I don't get a collection of groups which have the
specific permission on the project, I just get one group (the last one
that was granted the permission).
Does anyone have a clue how I can get all the groups from a project
which have a certain permission?
Cheers,
Dolf.
=================== python shell ==================================
>>> a=session.query(model.AccessRule)
>>> print (a[0].group_id,a[0].project_id,a[0].permission_id)
(1L, 1L, 1L)
>>> print (a[1].group_id,a[1].project_id,a[1].permission_id)
(2L, 1L, 1L)
>>> manage=session.query(model.Permission).get(1)
>>> manage.permission_name
u'manage'
>>> manage.permission_id
1L
>>> g1=s.query(model.Group).get(1)
>>> g1.group_id
1L
>>> g2=s.query(model.Group).get(2)
>>> g2.group_id
2L
>>> pr.permissions[g1]
<Permission: name=manage>
>>> pr.permissions[g2]
<Permission: name=manage>
>>> pr.groups[manage]
<Group: name=users>
=================================== model.py
======================================
def _create_access_rule(group,project,permission):
return AccessRule(group,project,permission)
class AccessRule(DeclarativeBase):
__tablename__ = 'tg_access_rule'
def __init__(self,group,project,permission):
self.group=group
self.project=project
self.permission=permission
group_id=Column(Integer,ForeignKey
("tg_group.group_id"),primary_key=True)
project_id=Column(Integer,ForeignKey
("project.project_id"),primary_key=True)
permission_id=Column(Integer,ForeignKey
("tg_permission.permission_id"),primary_key=True)
class Group(DeclarativeBase):
__tablename__ = 'tg_group'
group_id = Column(Integer, autoincrement=True, primary_key=True)
group_name = Column(Unicode(16), unique=True, nullable=False)
permissions_by_project = relation
(AccessRule,collection_class=attribute_mapped_collection
('project'),backref='group')
permissions=association_proxy
('permissions_by_project','permission',creator=_create_access_rule)
class Permission(DeclarativeBase):
__tablename__ = 'tg_permission'
permission_id = Column(Integer, autoincrement=True,
primary_key=True)
permission_name = Column(Unicode(16), unique=True, nullable=False)
description = Column(Unicode(255))
groups_by_project = relation
(AccessRule,collection_class=attribute_mapped_collection
('project'),backref='permission')
groups=association_proxy
('groups_by_project','group',creator=_create_access_rule)
class Project(DeclarativeBase):
__tablename__ = 'project'
project_id = Column(Integer, primary_key=True)
project_name = Column(Unicode(255), nullable=False)
permissions_by_group = relation
(AccessRule,collection_class=attribute_mapped_collection
('group'),backref='project')
permissions=association_proxy
('permissions_by_group','permission',creator=_create_access_rule)
groups_by_permission = relation
(AccessRule,collection_class=attribute_mapped_collection
('permission'))
groups=association_proxy
('groups_by_permission','group',creator=_create_access_rule)
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"sqlalchemy" 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/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---