如何在browser/configure.zcml中使用config.py和__init__.py(使用paster)创建的权限获取自定义权限?

Som*_*DOS 3 plone

我正在使用贴纸来创建我的内容类型和视图.我正在使用Plone 3.3.

在我的config.py:

ADD_PERMISSIONS = {
    # -*- extra stuff goes here -*-
    'MyContentType': 'mynamespace.mypackage: Add My Content Type'
}
Run Code Online (Sandbox Code Playgroud)

在我的__init__.py:

for atype, constructor in zip(content_types, constructors):
    utils.ContentInit('%s: %s' % (config.PROJECTNAME, atype.portal_type),
        content_types=(atype, ),
        permission=config.ADD_PERMISSIONS[atype.portal_type],
        extra_constructors=(constructor,),
        ).initialize(context)
Run Code Online (Sandbox Code Playgroud)

......并且在browser/configure.zcml:

  <browser:page
      for="*"
      name="myview"
      class=".myview.MyView"
      template="myview.pt"
      allowed_interface=".myview.IMyView"
      permission="the permissions defined in ADD_PERMISSIONS: what is the name I can put here?"
      />
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用colective.autopermission创建自定义权限,但我已经使用config.py创建了它们,如何在configure.zcml中使用它们?

编辑:Hum,ZCML中定义的浏览器视图使用Zope 3权限ID,但我的config.py使用Zope 2权限标题.我需要使用collective.autopermission来创建zope 3权限id,或者我可以使用另一种方法(比如只title使用dict中title提供的属性创建permissions.zcml ADD_PERMISSIONS,因为zope 2样式中的权限已经创建所以我不需要collective.autopermission)?

mau*_*its 5

您确实应该使用collective.autopermission并创建一个permissions.zcml(并在configure.zcml中加载,或者只在configure.zcml中添加行),其中包含如下语句:

  <permission
      id="mynamespace.mypackage.AddMyContentType"
      title="mynamespace.mypackage: Add My Content Type"
      />
Run Code Online (Sandbox Code Playgroud)

您可以选择不同的ID,但标题必须与您在config.py中提供的标题相同.

编辑:

请注意,Plone 4.0或更高版本中使用的Zope2版本包含collective.autopermission修补程序,因此您不再需要使用该程序包; 你还需要在过程的ZCML许可声明.

在Plone 3上你确实需要collective.autopermission包,你应该在setup.py中依赖它并<include package="collective.autopermission" />在权限注册之前添加你的zcml(或者使用包含在Plone 3.3中的z3c.autoinclude来自动加载zcml).