Plone:如何更改原型内容的所有权?

4 投票
3 回答
647 浏览
提问于 2025-04-17 17:33

我有一些内容需要更改它的拥有者。默认情况下,这些内容的拥有者是管理员,也就是通过代码 obj.getOwner() 获取的。但是,这些内容的创建者并不是管理员,比如说是某个用户,比如 someuser@samplemail.com。

我参考了这个链接:http://developer.plone.org/content/ownership.html,并为这个内容类型创建了一个视图方法。以下是我的代码片段:

def change_owner(self):
    membership = getToolByName(self.context,'portal_membership')
    path='/'.join(self.context.getPhysicalPath())
    brains=self.portal_catalog.searchResults(path={'query':path,'depth':0})
    for brain in brains:
        creator = brain.Creator
        crtor_obj = membership.getMemberById(crtor1).getUser()
        brain.getObject().setCreators(creator,)
        brain.getObject().changeOwnership(crtor_obj)
        brain.getObject().reindexObjectSecurity()
    return

看起来我的代码并没有成功更改内容的拥有者。拥有者仍然是管理员,而创建者还是原来的创建者。我的代码有什么问题吗?

3 个回答

2

plone_utils 里,有一个叫 changeOwnershipOf(self, object, userid, recursive=0, REQUEST=None) 的助手函数,它可以帮你完成所有这些事情。

(你可以通过不太显眼的 change_ownership 表单找到它。)

3

你有没有看过 plone.app.changeownership 这个东西?

4

我看到三个问题:

  • 你重复调用了 getObject()。这个操作比较耗费资源,建议把结果缓存到一个本地变量中:

    obj = brain.getObject()
    
  • 你调用 setCreators() 时只传了一个参数,而不是一个列表:

    obj.setCreators([creator])
    
  • 你没有改变 Owner 的角色:

    roles = list(obj.get_local_roles_for_userid(crtor_obj))
    if 'Owner' not in roles:
        roles.append('Owner')
        obj.manage_setLocalRoles(crtor_obj, roles)
    

有一个 plone.app.changeownership 产品 可以帮你处理这些细节。

撰写回答