我如何删除 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
中,我们无法删除用户方法,因为有限制。
我的目标是删除所有对象 digitalfile
if flag True
in auto
field.
如果我的结果是空的,我该怎么办?
或者我做错了什么输出是空的?
[更新 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 使用的版本)。
我正在尝试删除一些自定义敏捷对象,下面有这个自定义对象的代码片段。
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
中,我们无法删除用户方法,因为有限制。
我的目标是删除所有对象 digitalfile
if flag True
in auto
field.
如果我的结果是空的,我该怎么办? 或者我做错了什么输出是空的?
[更新 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 使用的版本)。