1

我在 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

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

4

1 回答 1

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)

** 很长的故事 **

该补丁被应用覆盖管理内容规则视图。这是需要的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()
于 2014-05-29T15:27:11.040 回答