2011-07-20 24 views
3

我使用貼圖來創建我的內容類型和視圖。我正在使用Plone 3.3。如何在browser/configure.zcml中使用config.py和__init__.py(使用paster)創建的權限以獲得自定義權限?

在我config.py

ADD_PERMISSIONS = { 
    # -*- extra stuff goes here -*- 
    'MyContentType': 'mynamespace.mypackage: Add My Content Type' 
} 

在我__init__.py

for atype, constructor in zip(content_types, constructors): 
    utils.ContentInit('%s: %s' % (config.PROJECTNAME, atype.portal_type), 
     content_types=(atype,), 
     permission=config.ADD_PERMISSIONS[atype.portal_type], 
     extra_constructors=(constructor,), 
     ).initialize(context) 

...在browser/configure.zcml

<browser:page 
     for="*" 
     name="myview" 
     class=".myview.MyView" 
     template="myview.pt" 
     allowed_interface=".myview.IMyView" 
     permission="the permissions defined in ADD_PERMISSIONS: what is the name I can put here?" 
     /> 

我知道我可以創建使用colective.autopermission自定義權限,但是II已經創建了它們config.py,我如何在configure.zcml中使用它們?

編輯:嗡嗡聲,ZCML中定義的瀏覽器視圖使用Zope 3權限ID,但是我的config.py使用Zope 2權限標題。我需要使用collective.autopermission來創建zope 3權限ID,或者我可以使用另一種方法(比如創建一個permissions.zcml,title屬性,使用ADD_PERMISSIONS字典中提供的相同title,因爲zope 2樣式中的權限已經創建,所以我不需要collective.autopermission)?

回答

5

你確實應該使用collective.autopermission並創建一個permissions.zcml(並將其加載到你的configure.zcml中,或只加在configure.zcml中本身的線),包含下面的語句:

<permission 
     id="mynamespace.mypackage.AddMyContentType" 
     title="mynamespace.mypackage: Add My Content Type" 
     /> 

你可以選擇一個不同的ID,但標題需要和你在config.py中給出的標題相同。

編輯:

注意Zope2版本使用在Plone 4.0或更高版本都包含在collective.autopermission補丁,這樣你就不需要再使用該包裝;你當然還是需要在zcml中的權限聲明。

在Plone 3上,您確實需要collective.autopermission包,您應該在setup.py中依賴它並在權限註冊之前在您的zcml中添加​​(或者使用zone包含在Plone 3.3中的z3c.autoinclude加載zcml自動)。

+0

但是,我應該刪除config.py部分?或者我可以保留它?我的理解是:使用autopermission來避免在config.py和__init__.py中使用該方法。但我的疑問是,如果我使用config.py方法來讀取數據,我應該停止使用它並且僅使用自動許可,或者我可以使用permission.zcml(並且在title屬性中,我使用config.py中的那個) ,沒有自動許可? –

+0

你仍然需要'__init __。py',所以你仍然需要它在config.py中。 – maurits

+0

請注意,您可能只想用'zope2.View'權限來保護您的視圖,或者在標題爲'查看我的內容類型'的zcml中創建特定權限。 – maurits