This repository has been archived on 2023-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
pfwbged.policy/src/pfwbged/policy/upgrades/workflow.py

101 lines
3.8 KiB
Python

from Acquisition import aq_base
from Persistence import PersistentMapping
from Products.CMFCore.utils import getToolByName
from plone import api
def update_role_mappings(context):
wf_tool = getToolByName(context, 'portal_workflow')
wf_tool.updateRoleMappings()
def publish_document_subfolders(context):
portal = api.portal.get()
if 'documents' in portal:
portal_catalog = api.portal.get_tool('portal_catalog')
folder_path = '/'.join(portal['documents'].getPhysicalPath())
query = {'path': {
'query': folder_path},
'review_state': 'private'}
results = portal_catalog.searchResults(query)
for brain in results:
subfolder = brain.getObject()
api.content.transition(
obj=subfolder,
transition="publish"
)
subfolder.reindexObject(idxs=['review_state'])
def overrideStatusOf(wf_id, ob, old_status, new_status):
"""Update a particular status in an object's workflow history,
e.g. dict returned by wf_tool.getStatusOf.
Derived from wf_tool.setStatusOf."""
wfh = None
has_history = 0
if hasattr(aq_base(ob), 'workflow_history'):
history = ob.workflow_history
if history is not None:
has_history = 1
wfh = history.get(wf_id, None)
if wfh is not None:
wfh = list(wfh)
if not wfh:
wfh = []
if old_status in wfh:
position = wfh.index(old_status)
wfh[position] = new_status
if not has_history:
ob.workflow_history = PersistentMapping()
ob.workflow_history[wf_id] = tuple(wfh)
def update_refused_version_state(context):
"""Set refused versions to refused state (instead of draft)."""
portal = api.portal.get()
if 'documents' in portal:
portal_catalog = api.portal.get_tool('portal_catalog')
portal_workflow = api.portal.get_tool('portal_workflow')
wf_id = portal_workflow.getChainFor('dmsmainfile')[0]
wf_def = portal_workflow.getWorkflowById(wf_id)
folder_path = '/'.join(portal['documents'].getPhysicalPath())
query = {'path': {
'query': folder_path},
'portal_type': 'dmsmainfile',
'review_state': 'draft'}
results = portal_catalog.unrestrictedSearchResults(query)
for brain in results:
version = brain.getObject()
old_state = portal_workflow.getStatusOf(wf_id, version)
if old_state and old_state.get('action') == 'refuse':
new_state = old_state.copy()
new_state.update({'review_state': 'refused'})
overrideStatusOf(wf_id, version, old_state, new_state)
wf_def.updateRoleMappingsFor(version)
version.reindexObject(idxs=['allowedRolesAndUsers', 'review_state'])
def refresh_workflow_permissions(context, workflow_id):
portal_workflow = api.portal.get_tool('portal_workflow')
portal_catalog = api.portal.get_tool('portal_catalog')
workflow = portal_workflow.getWorkflowById(workflow_id)
portal = api.portal.get()
folder_path = '/'.join(portal['documents'].getPhysicalPath())
for dx_type, wf_ids in portal_workflow._chains_by_type.items():
if workflow_id in wf_ids:
query = {'path': {
'query': folder_path},
'portal_type': dx_type}
results = portal_catalog.unrestrictedSearchResults(query)
for brain in results:
obj = brain.getObject()
workflow.updateRoleMappingsFor(obj)
obj.reindexObjectSecurity()
obj.reindexObject(idxs=['allowedRolesAndUsers'])
def incomingmail_deletion_permissions(context):
refresh_workflow_permissions(context, "incomingmail_workflow")