3

在很长一段时间没有使用 Plone 后,我又开始使用它了。我们已经用 Plone 4.0.5 建立了一个 Intranet。我们已经将大量文件(主要是文件)上传到内部网。

该站点是使用具有 ZEO 配置的 Plone Unified Installer 安装的。一些产品(鸡蛋)被添加到我们的 buildout.cfg

ZEO 服务器和客户端都在运行;我正在做:

 $ bin/client1 debug
 Starting debugger (the name "app" is bound to the top-level Zope object)
 ... several warnings ...
 >>>

现在,我像这样查询目录:

 >>> len(app.plone.portal_catalog(portal_type="File"))
 17

但是,如果转到 ZMI 并遍历 portal_catalog/Indexes,转到 portal_type 并浏览,“文件”项具有更多的元素。

这可能是因为我没有登录:

 >>> from Products.CMFCore.utils import _getAuthenticatedUser
 >>> _getAuthenticatedUser(app.ca.portal_catalog)
 <SpecialUser 'Anonymous User'>

如何将控制台置于管理员用户的“上下文”中?

4

2 回答 2

6

目录未返回所有条目可能有多种原因:

  • 他们的许可不允许你看到他们,句号。在这方面使用匿名用户当然没有帮助。:-)

  • 条目已过期;他们的过期日期现在已经过去,您无权查看这些内容。同样,使用非特权用户也无济于事。

  • 您正在使用多语言设置,并且项目不是“当前”语言。如果您的查询包含Language='all'此过滤器,则该过滤器将被禁用。

要在控制台上设置替代用户(最好是具有该Manager角色的用户),请使用以下代码:

from AccessControl.SecurityManagement import newSecurityManager

site = app['Plone'] # Adjust as needed
# Assuming your username is 'admin', adjust as needed again:
user = app.acl_users.getUser('admin').__of__(site.acl_users) 
newSecurityManager(None, user)

就个人而言,每当我使用控制台时,我都会使用以下代码段;如果在我的 Quicksilver 架子上有这个以便于访问。首先我输入:

site_id = '<id of Plone site>' # Adjust as needed

然后粘贴:

import transaction, pdb
from zope.interface import implementedBy
from zope.component import getUtility, queryUtility, queryAdapter
from Zope2 import debug
from Acquisition import aq_inner, aq_parent, aq_chain
from zope.app.component.hooks import setSite, getSiteManager
from Testing.makerequest import makerequest
from AccessControl.SecurityManagement import newSecurityManager, getSecurityManager

try:
    import readline
except ImportError:
    print "Module readline not available."
else:
    import rlcompleter
    readline.parse_and_bind("tab: complete")

app = makerequest(app)
site = app[site_id]
setSite(site)
user = app.acl_users.getUser('admin').__of__(site.acl_users)
newSecurityManager(None, user)

现在我已经完成了 readline 以及在我的网站上做一些真正的破坏所需的一切!

于 2012-08-27T22:27:17.770 回答
5

对于非常特殊的情况(例如迁移),您可以使用

results = catalog.unrestrictedSearchResults(...)

这将返回所有结果而不过滤(绕过所有安全检查等)

然而,这种方法是官方的一种私有方法,并且如书面所述:小心使用它。

于 2012-08-28T06:13:16.343 回答