取消分配内容规则会在Plone 4.2中引发回溯错误

时间:2013-07-12 13:26:35

标签: plone

我在Plone 4.2网站上设置了大约15个内容规则,这些规则被分配到各种文件夹。

我最近做了一些整理并删除了一些不需要的规则,但在尝试取消分配任何规则时我得到了回溯。

如何发生追溯:

  • 进入规则标签
  • 勾选规则
  • Unassign

我收到:

Traceback (innermost last):
  Module ZPublisher.Publish, line 126, in publish
  Module ZPublisher.mapply, line 77, in mapply
  Module ZPublisher.Publish, line 46, in call_object
  Module plone.app.contentrules.browser.assignments, line 57, in __call__
KeyError: '/mysite/aFolder/aSubFolder'

我似乎能够毫无问题地分配规则,只要我分配了问题,它就会取消分配。

如果它有助于我的规则如下工作:

  • 内容状态已更改为待处理
  • 发送电子邮件给某人

有关此Traceback试图告诉我的内容或如何修复它的任何信息或想法将不胜感激。

感谢。

编辑#1

自最初分配规则以来唯一发生变化的是我将TinyMCE升级到最新版本,此外还没有安装任何附加组件或者对服务器进行了任何更改。

编辑#2

似乎此错误仅发生在我网站上的某些文件夹中 - 我已设法从一个文件夹取消分配到目前为止,但是我可以在mysite.com/@@rules-controlpanel中查看规则并且能够看到他们被分配到哪个文件夹。

1 个答案:

答案 0 :(得分:1)

我在4.3网站上遇到了同样的问题,在一个被多次复制/移动的对象中......

短篇小说

我禁用了修改第57行的规则(Traceback指出的那个):

Traceback (innermost last):
  Module ZPublisher.Publish, line 126, in publish
  Module ZPublisher.mapply, line 77, in mapply
  Module ZPublisher.Publish, line 46, in call_object
  Module plone.app.contentrules.browser.assignments, line 57, in __call__
KeyError: '/mysite/aFolder/aSubFolder'

来自:

get_assignments(storage[r]).remove(path, None)

到此:

if path in assignments:
    get_assignments(storage[r]).remove(path, None)

**长篇故事**

应用补丁覆盖manage-content-rules视图。 这是所需的zcml

<browser:page
  for="plone.contentrules.engine.interfaces.IRuleAssignable"
  name="manage-content-rules"
  class=".contentrules_patch.PatchedManageAssignments"
  layer="my.abb.browser.interfaces.IMyAppLayer"
  permission="plone.app.contentrules.ManageContentRules"
/>

这是contentrules_patch.py​​中包含的类

class PatchedManageAssignments(ManageAssignments):
    def __call__(self):
        """
        """
        request = aq_inner(self.request)
        form = request.form

        if not 'form.button.Delete' in form:
            return super(PatchedManageAssignments, self).__call__()

        context = aq_inner(self.context)
        assignable = IRuleAssignmentManager(context)
        storage = getUtility(IRuleStorage)
        status = IStatusMessage(self.request)
        rule_ids = form.get('rule_ids', ())
        path = '/'.join(context.getPhysicalPath())

        for r in rule_ids:
            del assignable[r]
            assignments = get_assignments(storage[r])
            if path in assignments:
                get_assignments(storage[r]).remove(path, None)
        status.addStatusMessage(_(u"Assignments deleted."), type='info')
        return self.template()