3

Plone を長い間使用していなかったのに、再び使用するようになりました。Plone 4.0.5 でイントラネットをセットアップしました。多くのドキュメント (主にファイル) をイントラネットにアップロードしています。

このサイトは Plone Unified Installer を ZEO 構成で使用してインストールされました。一部の製品 (eggs) が追加されました (buildout.cfg および/または versions.cfg の一部が必要な場合は、お問い合わせください) 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)

個人的には、コンソールを使用するときは常に次のスニペットを使用します。簡単にアクセスできるように、これをクイックシルバーの棚に入れておけば。まず、次のように入力します。

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 に答える