我在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中查看规则并且能够看到他们被分配到哪个文件夹。
答案 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()