匿名ユーザーがportal_catalogを介して検索および取得できるようにカスタムコンテンツにアクセスできるようにする必要があるが、ユーザーには表示できないようにする必要があるという問題があります。
カスタムコンテンツタイプとカスタムワークフローを使用しましたが、取得しているのはおそらくアクセス許可の問題です。ZMI-> portal_workflowを使用してカスタムワークフローを定義し、それをXML定義としてソースコードにエクスポートしました。匿名ユーザーのアクセス許可を「コンテンツ情報へのアクセス」として設定しましたが、「表示」としては設定していません。コードスニペットの「アクティブ」は、その権限が有効になっているワークフロー状態であることに注意してください--sales_workflow
ブレインルックアップは「Manager」ロールに対して機能しますが、ロールが「Anonymous」に切り替えられると、カタログは空のリストを返します。
import unittest2 as unittest
from . import INTEGRATION_TESTING
from AccessControl import getSecurityManager
from plone.app.testing import setRoles, logout
from plone.app.testing import TEST_USER_ID
from Products.CMFCore.utils import getToolByName
def drop_to_anonymous(self):
"""
Drop site roles to anonymous user only.
Note this is a class method and not a function
assign this method as a class member and then call it
"""
logout()
setRoles(self.portal, TEST_USER_ID, ['Anonymous'])
user = getSecurityManager().getUser()
roles = user.getRolesInContext(self.portal)
self.assertListEqual(['Anonymous'], roles)
class TestSalesRepWorkflow(unittest.TestCase):
layer = INTEGRATION_TESTING
drop_to_anonymous = drop_to_anonymous
def setUp(self):
self.portal = self.layer['portal']
self.wftool = getToolByName(self.portal, 'portal_workflow')
self.catalog = getToolByName(self.portal, 'portal_catalog')
def test_workflow_lookup_anon(self):
setRoles(self.portal, TEST_USER_ID, ['Manager'])
self.portal.invokeFactory(
'CustomProduct',
'prod1',
title="Product 1"
)
prod1 = self.portal['prod1']
self.wftool.doActionFor(prod1, action='activate')
review_state = self.wftool.getInfoFor(prod1, 'review_state')
prod1.reindexObject()
self.assertEqual('active', review_state)
lookup = self.catalog(portal_type='CustomProduct', Title='Product 1',
review_state='active')
#This test passes with managerial permissions
self.assertEqual(len(lookup), 1)
#Repeat the same test in 'Anonymous' role
self.drop_to_anonymous()
lookup1 = self.catalog(portal_type='CustomProduct', Title='Product 1',
review_state='active')
#When dropped to anonymous role, the test fails,
#lookup returns an empty list
self.assertEqual(len(lookup1), 1)
権限を大幅に変更せずにこれを修正する方法はありますか?
unrestrictedSearchResultsを使用すると検索が修正されるようですが、ブレインで「getObject」を実行しようとすると、次のエラーが発生します。
Unauthorized: You are not allowed to access 'XXX' in this context