2014-01-09 50 views
0

使用Intranet工作流程,當用戶選擇隱藏轉換將內容移動到私有狀態時,我想要禁用本地角色獲取。我想我會在重新啓用內部選秀時重新啓用它。如何在工作流程轉換後禁用本地角色獲取?

我可以看到這是如何通過plone.app.workflow中的共享視圖完成的。它有一個方法update_inherit,它將context.__ac_local_roles_block__設置爲TrueNone

我怎麼可以做一些類似的過渡after_script?

  • 的Plone 4.1.5
  • plone.app.workflow 2.0.6

在我的使用情況下更多信息:

我們有兩個用戶,contributor_1和contributor_2,僅在全球擁有會員角色。在站點根目錄下,創建一個文件夾並分配兩個用戶本地角色以添加,編輯和查看。

這是默認的私有狀態/ manage_permissions: default private state permissions

如果contributor_1創建了一個頁面,並試圖掩蓋它,contributor_2仍然可以查看,編輯,因爲contributor_2是繼承那些地方過渡回內部草案角色。

這是我第一次嘗試: enter image description here

雖然這並有效地使私人頁面只contributor_1任何經理,contributor_1不能,而項目仍處於私有狀態共享contributor_2訪問。沒有私人協作。更新:contributor_1可以操作共享視圖(即他們可以訪問委託本地角色),但委託這些本地角色(Contributor,Editor,Reader)不會轉換爲各自的訪問權限,因爲我已經撤銷了角色權限映射以上工作流程

現在,如果設置回默認權限映射,用戶可以通過隱藏內容項然後轉到共享選項卡並禁用本地角色獲取來實現他們想要的私有狀態。問題是他們不希望每次想隱藏某些內容時都要點擊共享選項卡上的複選框。

+3

請理解' __ac_local_roles_block__「(和」共享「選項卡中的等效複選框)是一個大錘子;你冒險鎖定自己。如果您可以澄清爲什麼編輯/ portal_workflow/intranet_workflow/states/private/manage_permissions不足以實現您的目標,我會採取措施回答您的問題。 – sdupton

+0

用戶希望能夠爲自己(所有者角色)創建一些私密的內容,但他們也希望能夠通過共享選項卡發佈選擇訪問權限。如果我只將權限減少到所有者,則將編輯者角色委派給其他用戶實際上並不會爲其他用戶提供編輯內容的權限。 – Travv15

+3

您所描述的問題可以通過自定義工作流權限來解決。不需要極端的措施。 – SteveM

回答

0

我在我的包中創建了utils.py模塊,其中包含一個方法:共享視圖使用update_inherit方法的(幾乎)直接副本。然後,我在我的包的__init__.py中導入了utils。

from AccessControl import Unauthorized 
from AccessControl.SecurityInfo import ModuleSecurityInfo 
from Acquisition import aq_base 
from Products.CMFCore import permissions 
from Products.CMFCore.utils import getToolByName 

security = ModuleSecurityInfo('united.policy.utils') 

security.declarePublic('update_inherit') 
def update_inherit(context, status=True, reindex=True): 
    """Enable or disable local role acquisition on the context. 

    Returns True if changes were made, or False if the new settings are the 
    same as the existing settings. 
    """ 
    portal_membership = getToolByName(context, 'portal_membership') 

    if not portal_membership.checkPermission(permissions.ModifyPortalContent, 
              context): 
     raise Unauthorized 

    block = not status 
    oldblock = bool(getattr(aq_base(context), '__ac_local_roles_block__', 
          False)) 

    if block == oldblock: 
     return False 

    if block: 
     # If user has inherited local roles and removes inheritance, locally 
     # set roles he inherited before to avoid definitive loss of access 
     # (refs #11945) 
     user = portal_membership.getAuthenticatedMember() 
     context_roles = user.getRolesInContext(context) 
     global_roles = user.getRoles() 
     local_roles = [r for r in context_roles if r not in global_roles] 
     if local_roles: 
      context.manage_setLocalRoles(user.getId(), local_roles) 

    context.__ac_local_roles_block__ = block and True or None 
    if reindex: 
     context.reindexObjectSecurity() 

    return True 

然後,我創建了./profiles/default/workflows/intranet_workflow/scripts/目錄內的兩個腳本綁定到其各自的轉換:

after_hide.py

## Script (Python) "after_hide" 
##bind container=container 
##bind context=context 
##bind namespace= 
##bind script=script 
##bind subpath=traverse_subpath 
##parameters=review_state 
##title= 
## 
from united.policy.utils import update_inherit 

update_inherit(review_state.object, False) 

after_show.py

## Script (Python) "after_show" 
##bind container=container 
##bind context=context 
##bind namespace= 
##bind script=script 
##bind subpath=traverse_subpath 
##parameters=review_state 
##title= 
## 
from united.policy.utils import update_inherit 

update_inherit(review_state.object, True) 
1

正如SteveM已經評論過的那樣,工作流工具可以爲您處理這個問題。

  1. 您需要在工作流程中管理所有必要的權限,這取決於您的需求。 更新:您的工作流必須管理「代理角色XYZ [讀者/參與者/等]」和「更改本地角色」權限。通過這種方式,用戶「contributor_1」可以在「私人」區域中委派角色。

  2. 請勿在hidden狀態下獲取任何權限設置。 plone workflow state permissions

  3. 在你的情況下,所有者(也可能是經理)需要一些權限來查看/編輯/ changestate。

定義工作流程的另一個提示。 檢查this package它通常管理操作組中的所有權限,如查看(查看,訪問內容權限等)或添加(添加文件夾,添加門戶內容,添加...等)所有Plone默認權限被映射到正確的行動小組,讓你在5分鐘內創建一個工作流程。最好的部分是,您可以將工作流程寫入可讀的規範文件(自定義DSL)中。

相關問題