Add refused state for versions (+ upgrade step) #22010

This commit is contained in:
Nicolas Demonte 2019-03-01 14:07:40 +01:00
parent ced874866e
commit c7707a34ad
5 changed files with 97 additions and 5 deletions

View File

@ -1,6 +1,6 @@
<?xml version="1.0"?>
<metadata>
<version>3</version>
<version>4</version>
<dependencies>
<dependency>profile-collective.dms.basecontent:default</dependency>
<dependency>profile-collective.dms.batchimport:default</dependency>

View File

@ -16,7 +16,6 @@
<exit-transition transition_id="submit"/>
<exit-transition transition_id="ask_opinion"/>
<exit-transition transition_id="obsolete"/>
<exit-transition transition_id="cancel-refusal"/>
<permission-map name="View" acquired="False">
<permission-role>Editor</permission-role>
<permission-role>Manager</permission-role>
@ -134,6 +133,30 @@
<permission-role>Manager</permission-role>
</permission-map>
</state>
<state state_id="refused" title="Refused" i18n:attributes="title">
<exit-transition transition_id="cancel-refusal"/>
<exit-transition transition_id="obsolete"/>
<permission-map name="View" acquired="False">
<permission-role>Editor</permission-role>
<permission-role>Manager</permission-role>
<permission-role>Reader</permission-role>
<permission-role>Reviewer</permission-role>
<permission-role>Owner</permission-role>
</permission-map>
<permission-map name="Access contents information" acquired="False">
<permission-role>Editor</permission-role>
<permission-role>Manager</permission-role>
<permission-role>Reader</permission-role>
<permission-role>Reviewer</permission-role>
<permission-role>Owner</permission-role>
</permission-map>
<permission-map name="Modify portal content" acquired="False">
<permission-role>Manager</permission-role>
</permission-map>
<permission-map name="Delete objects" acquired="False">
<permission-role>Manager</permission-role>
</permission-map>
</state>
<state state_id="trashed" title="Trashed" i18n:attributes="title">
<exit-transition transition_id="restore_from_trash"/>
<permission-map name="View" acquired="False">
@ -189,7 +212,7 @@
<guard>
</guard>
</transition>
<transition transition_id="refuse" title="Refuse" new_state="draft" trigger="USER" before_script="" after_script="" i18n:attributes="title">
<transition transition_id="refuse" title="Refuse" new_state="refused" trigger="USER" before_script="" after_script="" i18n:attributes="title">
<action url="%(content_url)s/@@refuse?workflow_action=refuse" category="workflow" icon="" i18n:translate="">Refuse</action>
<guard>
<guard-expression>here/@@can_validate_or_refuse</guard-expression>

View File

@ -89,7 +89,7 @@ def change_validation_state(context, event):
query = {'to_id': version_intid,
'from_interfaces_flattened': IValidation,
'from_attribute': 'target'}
if event.new_state.id == 'draft':
if event.new_state.id == 'refused':
for ref in catalog.findRelations(query):
validation = ref.from_object
if api.content.get_state(validation) == 'todo':
@ -254,7 +254,7 @@ def version_note_finished(context, event):
# make obsolete other versions
for version_brain in version_notes:
version = version_brain._unrestrictedGetObject()
if api.content.get_state(obj=version) in ('draft', 'pending', 'validated'):
if api.content.get_state(obj=version) in ('draft', 'pending', 'refused', 'validated'):
api.content.transition(obj=version, transition='obsolete')
version.reindexObject(idxs=['review_state'])
context.__ac_local_roles_block__ = False

View File

@ -19,4 +19,22 @@
handler=".workflow.update_role_mappings"
profile="pfwbged.policy:default" />
<genericsetup:upgradeSteps
source="3"
destination="4"
profile="pfwbged.policy:default">
<genericsetup:upgradeStep
title="Set up refused version state"
description="Set refused state to version in draft state, that were lastly refused"
handler=".workflow.update_refused_version_state"
/>
<genericsetup:upgradeDepends
title="Reimport workflows"
import_steps="workflow" />
</genericsetup:upgradeSteps>
</configure>

View File

@ -1,3 +1,5 @@
from Acquisition import aq_base
from Persistence import PersistentMapping
from Products.CMFCore.utils import getToolByName
from plone import api
@ -23,3 +25,52 @@ def publish_document_subfolders(context):
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.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'])