重命名 TurboGears 2 的 Repoze 字段,以通过 TGAdmin 实现

57 阅读2分钟

为了释放命名空间和数据库表以用于其他目的,我一直在努力将 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、解决方案

要解决此问题,您可以按照以下步骤操作:

  1. 将 Repoze 库重命名为 TurboGears 库。
  2. 修改 TurboGears 模型以使用新的字段名称。
  3. 更新 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 中成功管理角色和权限。