为了释放命名空间和数据库表以用于其他目的,我一直在努力将 TurboGears 2 的 Repoze “组” 字段重命名为 “角色”。同时,“角色”对我来说更有意义,因为我有很强的 Drupal 背景。
我现在找到了执行此操作的一些文档,例如:
但是这些只介绍了部分方法。在我仔细检查了几次后,我已经做出了我确信至少需要的所有更改,如您在该 diff 中看到的那样。
这似乎工作正常,但我在 TurboGears 管理系统中遇到了一个相当严重的问题。
我尝试了 turbogears.org/2.0/docs/ma…
当我尝试进入 localhost/admin/permissions/ 时,该问题出现。它导致出现内部服务器错误,并输出以下错误。pastebin.com/YWMH3SiU。在角… /edit/1 也同样可行。
我的系统是 kubuntu 10.04,搭载 TG 2.1b2。(我运行 beta 版主要是为了获得更简单的 mako 支持,这非常重要。)
任何帮助将不胜感激。
2、解决方案
要解决此问题,您可以按照以下步骤操作:
- 将 Repoze 库重命名为 TurboGears 库。
- 修改 TurboGears 模型以使用新的字段名称。
- 更新 TurboGears Admin 扩展以使用新的字段名称。
以下是一些代码示例,展示了如何执行这些步骤:
# 将 Repoze 库重命名为 TurboGears 库
from sqlalchemy import Column, Integer, String
class User(Base):
__tablename__ = 'tg_user'
user_id = Column(Integer, primary_key=True)
user_name = Column(String(50), unique=True)
email_address = Column(String(100), unique=True)
password = Column(String(100))
created = Column(DateTime, default=datetime.datetime.now)
class Group(Base):
__tablename__ = 'tg_group'
group_id = Column(Integer, primary_key=True)
group_name = Column(String(50), unique=True)
created = Column(DateTime, default=datetime.datetime.now)
class Permission(Base):
__tablename__ = 'tg_permission'
permission_id = Column(Integer, primary_key=True)
permission_name = Column(String(50), unique=True)
description = Column(String(255))
class UserGroup(Base):
__tablename__ = 'tg_user_group'
user_id = Column(Integer, ForeignKey('tg_user.user_id'), primary_key=True)
group_id = Column(Integer, ForeignKey('tg_group.group_id'), primary_key=True)
class GroupPermission(Base):
__tablename__ = 'tg_group_permission'
group_id = Column(Integer, ForeignKey('tg_group.group_id'), primary_key=True)
permission_id = Column(Integer, ForeignKey('tg_permission.permission_id'), primary_key=True)
# 修改 TurboGears 模型以使用新的字段名称
from sqlalchemy import Table, Column, Integer, String, ForeignKey
# 新的字段名称
ROLE_TABLE = Table(
'tg_role',
Base.metadata,
Column('role_id', Integer, primary_key=True),
Column('role_name', String(50), unique=True)
)
USER_ROLE_TABLE = Table(
'tg_user_role',
Base.metadata,
Column('user_id', Integer, ForeignKey('tg_user.user_id'), primary_key=True),
Column('role_id', Integer, ForeignKey('tg_role.role_id'), primary_key=True)
)
# 更新 TurboGears Admin 扩展以使用新的字段名称
@expose('admin.templates.permissions')
def permissions(self, username=None):
"""Display and edit the permissions for a user."""
user = get_user_by_username(username)
if not user:
raise HTTPNotFound(_("Could not find user %(username)s.", username=username))
# 获取用户角色
roles = [r.role_name for r in user.get_all_roles()]
# 获取所有角色
all_roles = session.query(ROLE_TABLE).all()
# 获取所有权限
permissions = session.query(Permission).all()
# 获取用户权限
user_permissions = [p.permission_name for p in user.get_all_permissions()]
return dict(user=user, roles=roles, all_roles=all_roles, permissions=permissions, user_permissions=user_permissions)
完成这些步骤后,您应该能够在 TurboGears Admin 中成功管理角色和权限。