在Plone 4上的文件夹中限制每个成员的一个内容项

时间:2011-04-29 13:47:47

标签: python permissions plone zope archetypes

我创建了一个名为“Résumé”的自定义Archetypes内容类型,并希望强制执行限制,允许成员在文件夹中仅添加此类型的一个项目。更好的方法是将会员重定向到他或她的项目的编辑页面,如果它已存在于该文件夹中。

如何执行此限制并提供此额外功能?

3 个答案:

答案 0 :(得分:5)

可以在eestec.base中找到针对Plone 3的类似用例的解决方案。我们通过覆盖createObject.cpy并为此添加一个特殊检查来完成它。

代码位于集体SVN中,http://dev.plone.org/collective/browser/eestec.base/trunk/eestec/base/skins/eestec_base_templates/createObject.cpy,第20-32行。

答案 1 :(得分:2)

嗯,这是一种验证约束,所以也许在标题字段中添加一个验证器,实际上并不打扰标题,但检查用户等? (我认为一个字段验证器传递了足够的信息来解决这个问题,如果没有,覆盖post_validate方法或者听相应的事件应该有效。)

如果您尝试这样做,请记住在用户编辑时已经调用了post_validate(即将焦点移出字段时)。

答案 2 :(得分:1)

我不知道这是否是最佳做法,但您可以在创建时与基础对象挂钩def at_post_create_script,在删除时挂钩manage_beforeDelete

例如:

from Products.ATContentTypes.lib import constraintypes

class YourContentype(folder.ATFolder)
[...]

    def at_post_create(self):
        origin = aq_parent(aq_inner(self))
        origin.setConstrainTypesMode(constraintypes.ENABLED)  # enable constrain types
        org_types = origin.getLocallyAllowedTypes()           # returns an immutable tuple
        new_types = [x for x in org_types if x! = self.portal_type]       # filter tuple into a list
        origin.setLocallyAllowedTypes(new_types)

    def manage_beforeDelete(self, item, container)          
        BaseObject.manage_beforeDelete(self, item, container)     # from baseObject
        self._v_cp_refs = None                                    # from baseObject
        origin = aq_parent(aq_inner(self))
        origin.setConstrainTypesMode(constraintypes.ENABLED)  # enable constrain types
        org_types = origin.getLocallyAllowedTypes()           # returns an immutable tuple
        new_types = [x for x in org_types].append(self.portal_type)
        origin.setLocallyAllowedTypes(new_types)

注意:还有一个名为setImmediatelyAddableTypes()的方法,您可能想要探索它。 注意II:这在内容迁移中无法存在。