允许匿名用户添加Dexterity对象

hve*_*rde 5 plone dexterity

我有一个基于Dexterity的容器,它容纳在一个基于敏捷的项目中.我需要让匿名用户在容器中添加此类型的对象.

我已经创建了一个rolemap.xml包含以下内容的文件:

<?xml version="1.0"?>
<rolemap>
  <permissions>
    <permission name="my.package: Add My Type" acquire="True">
      <role name="Anonymous"/>
    </permission>
  </permissions>
</rolemap>
Run Code Online (Sandbox Code Playgroud)

我宣布许可configure.zcml:

<permission
    id="my.package.AddMyType"
    title="my.package: Add My Type"
    />
Run Code Online (Sandbox Code Playgroud)

最后我添加了一个像这样的自定义添加视图:

class MyAddView(dexterity.AddForm):
    grok.name('MyType')
    grok.require('my.package.AddMyType')
Run Code Online (Sandbox Code Playgroud)

该表单已经显示给匿名用户但是,当我按下保存按钮时,我被重定向到登录表单.

此外,登录用户也可以看到表单,这应该不会发生.

还有什么我需要做的?

hve*_*rde 5

感谢David Glick,他指导了我,我最终得到了一个非常简单的解决方案,涉及addAddForm该类的方法:

class MyAddView(dexterity.AddForm):
    grok.name('MyType')
    grok.require('my.package.AddMyType')

    def update(self):
        # check here if the user is anonymous and raise exception if not
        super(AddView, self).update()

    def add(self, object):
        container = aq_inner(self.context)
        addContentToContainer(container, object, checkConstraints=False)
        self.immediate_view = container.absolute_url()
Run Code Online (Sandbox Code Playgroud)

要更好地理解它,您可能需要查看plone.dexterity中的原始代码.

您可能还需要注意的一件重要事情是,您可能需要修复工作流权限以从其中一些用户角色中删除所有者角色,或者您也可以使用匿名用户可编辑的内容来结束.