我如何删除 Plone 4 中的自定义灵巧对象?

How I delete custom dexterity objects in Plone 4?

我正在尝试删除一些自定义敏捷对象,下面有这个自定义对象的代码片段。

class IDigitalFile(model.Schema):
        """Dexterity-Schema
        """

    ...

    directives.read_permission(auto="cmf.ManagePortal")
    directives.write_permission(auto="cmf.ManagePortal")
    fieldset('Admins Only', fields=['auto', 'uploded_at', 'codLote'] )
    auto = schema.Bool(
        title=_(u"Upload via Script?"),
        required=True,
        default=False,
    )
    ...

然后我尝试使用 sudo plone_daemon bin/client2 -O Plone debug 并应用此代码:

from zope.site.hooks import setSite
site = 'Plone'
context = app[site]
setSite(context)
portal_catalog = context.portal_catalog
itens = portal_catalog(portal_type='digitalfile', path='/ged/')
print itens

朗姆酒之后这个脚本我的输出是 [],只是 epmty 但如果我在 ZMI 中使用类似的代码我有所有的大脑。

因此,在 ZMI 中,我们无法删除用户方法,因为有限制。 我的目标是删除所有对象 digitalfileif flag Truein autofield.

如果我的结果是空的,我该怎么办? 或者我做错了什么输出是空的?

[更新 1]

这个问题适合我:

zero@srv-d:/opt/Plone439/zeocluster$ sudo -u plone_daemon bin/client2 -O Plone debug
Starting debugger (the name "app" is bound to the top-level Zope object)
2017-03-31 10:09:04 WARNING ZODB.blob (18048) Blob dir /opt/Plone439/zeocluster/var/blobstorage/ has insecure mode setting
Traceback (most recent call last):
  File "/opt/Plone439/zeocluster/parts/client2/bin/interpreter", line 281, in <module>
    exec(_val)
  File "<string>", line 1, in <module>
  File "/opt/Plone439/buildout-cache/eggs/Zope2-2.13.24-py2.7.egg/ZPublisher/BaseRequest.py", line 623, in traverse
    response.unauthorized()
  File "/opt/Plone439/buildout-cache/eggs/Zope2-2.13.24-py2.7.egg/ZPublisher/HTTPResponse.py", line 756, in unauthorized
    raise Unauthorized, m
zExceptions.unauthorized.Unauthorized: You are not authorized to access this resource.

[更新 2 - 已解决]

也许有一个简单的方法,但在这一刻,这个脚本解决了我的问题,如果有人需要,我会分享...

# -*- coding: utf-8 -*-
from zope.site.hooks import setSite
from plone import api
import transaction

# Setting the plone portal in var context
site = 'Plone'
context = app[site]
setSite(context)

# grabbing portal_catalog tool
portal_catalog = context.portal_catalog

# setting the user that have permission
with api.env.adopt_user(username='admin'):
    # grabbing all items digitalfile
    brains = portal_catalog(portal_type='digitalfile', path='/ged')

for brain in brains:
    if 'TO BE DELETE' in brain.Description:
        item = api.content.get(path=brain.getPath())
        api.content.delete(obj=item)
        transaction.commit()

尝试在目录搜索路径中添加 Plone 站点的 ID:portal_catalog(portal_type='digitalfile', path='/Plone/ged/')

我认为 portal_type 在这种情况下是 'Dexterity Item'。请尝试 portal_catalog(object_provides=IDigitalFile.__identifier__)。 如果您想在全球范围内执行此操作,则不需要路径参数。

这可能意味着您需要 "security clearance" 才能访问 brains/objects。

通常,门户目录搜索只会 return 为您具有访问权限的对象提供结果。在 ZMI 中,它可以工作,因为您以管理员(或站点管理员)身份登录,而命令行脚本 do not have user information set by default。例如,如果对象未发布(处于 private 状态),它们将不会出现在命令行脚本的目录搜索中。

如果您安装了 plone.api,您可以使用 "api.env.adopt_user" 到 运行 指定用户的命令:

from plone import api

with api.env.adopt_user(username="admin"):
    items = portal_catalog(portal_type='digitalfile', path='/ged/')

或者,您可以使用 portal_catalog.unrestrictedSearchResults 在执行搜索时忽略安全检查:

items = portal_catalog.unrestrictedSearchResults(
    portal_type='digitalfile', path='/ged/')

我记得在后一种情况下有时我不得不使用 brain._unrestrictedGetObject() 来获取实际对象,但现在它似乎也适用于常规 brain.getObject() (可能取决于 Zope/Plone 使用的版本)。