From 3f6149889f08ab0923b7ed6fea8890a0d430d373 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Mon, 6 Jun 2016 19:17:27 +0200 Subject: [PATCH 2/5] workflows: add support for per-workflow action availability check (#11230) --- tests/test_admin_pages.py | 23 ++++++++++++++++++++++- wcs/admin/workflows.py | 2 +- wcs/wf/criticality.py | 8 ++++---- wcs/wf/resubmit.py | 2 +- wcs/wf/timeout_jump.py | 2 +- wcs/workflows.py | 2 +- 6 files changed, 30 insertions(+), 9 deletions(-) diff --git a/tests/test_admin_pages.py b/tests/test_admin_pages.py index 41087e3..eb016ab 100644 --- a/tests/test_admin_pages.py +++ b/tests/test_admin_pages.py @@ -27,7 +27,7 @@ from wcs.qommon.template import get_current_theme from wcs.categories import Category from wcs.data_sources import NamedDataSource from wcs.roles import Role -from wcs.workflows import Workflow, DisplayMessageWorkflowStatusItem +from wcs.workflows import Workflow, DisplayMessageWorkflowStatusItem, WorkflowCriticalityLevel from wcs.wf.wscall import WebserviceCallStatusItem from wcs.formdef import FormDef from wcs import fields @@ -1421,6 +1421,27 @@ def test_workflows_add_all_actions(pub): resp = resp.follow() # redirect to items/ resp = resp.follow() # redirect to ./ +def test_workflows_check_available_actions(pub): + create_superuser(pub) + + Workflow.wipe() + workflow = Workflow(name='foo') + workflow.add_status(name='baz') + workflow.store() + + app = login(get_app(pub)) + resp = app.get('/backoffice/workflows/1/') + resp = resp.click('baz') + + assert not 'Modify Criticality' in [x[0] for x in resp.forms[0]['type'].options] + + workflow.criticality_levels = [WorkflowCriticalityLevel(name='green')] + workflow.store() + resp = app.get('/backoffice/workflows/1/') + resp = resp.click('baz') + assert 'Modify Criticality' in [x[0] for x in resp.forms[0]['type'].options] + + def test_workflows_edit_dispatch_action(pub): create_superuser(pub) role = create_role() diff --git a/wcs/admin/workflows.py b/wcs/admin/workflows.py index afcd08a..c7cfed1 100644 --- a/wcs/admin/workflows.py +++ b/wcs/admin/workflows.py @@ -500,7 +500,7 @@ class WorkflowStatusPage(Directory): return r.getvalue() def is_item_available(self, item): - return item.is_available() + return item.is_available(workflow=self.workflow) def get_new_item_form(self): form = Form(enctype='multipart/form-data', action = 'newitem') diff --git a/wcs/wf/criticality.py b/wcs/wf/criticality.py index ac14052..7fb6c9b 100644 --- a/wcs/wf/criticality.py +++ b/wcs/wf/criticality.py @@ -34,10 +34,10 @@ class ModifyCriticalityWorkflowStatusItem(WorkflowStatusItem): return ('mode', 'absolute_value') @classmethod - def is_available(cls): - # TODO: if we had per-workflow availability we could show this action - # only on the workflow where criticality levels are set. - return get_publisher().has_site_option('workflow-criticality-levels') + def is_available(cls, workflow=None): + if not get_publisher().has_site_option('workflow-criticality-levels'): + return False + return workflow and workflow.criticality_levels def add_parameters_widgets(self, form, parameters, prefix='', formdef=None): if 'mode' in parameters: diff --git a/wcs/wf/resubmit.py b/wcs/wf/resubmit.py index 075d79b..3aade51 100644 --- a/wcs/wf/resubmit.py +++ b/wcs/wf/resubmit.py @@ -34,7 +34,7 @@ class ResubmitWorkflowStatusItem(WorkflowStatusItem): backoffice_info_text = None @classmethod - def is_available(cls): + def is_available(cls, workflow=None): return get_publisher().has_site_option('workflow-resubmit-action') def render_as_line(self): diff --git a/wcs/wf/timeout_jump.py b/wcs/wf/timeout_jump.py index ca9d84e..9daa1b5 100644 --- a/wcs/wf/timeout_jump.py +++ b/wcs/wf/timeout_jump.py @@ -31,7 +31,7 @@ class TimeoutWorkflowStatusItem(WorkflowStatusJumpItem): _granularity = 20 * 60 # default: 20 minutes, see bottom of file @classmethod - def is_available(cls): + def is_available(cls, workflow=None): return False def render_as_line(self): diff --git a/wcs/workflows.py b/wcs/workflows.py index 741cb72..84a70cf 100644 --- a/wcs/workflows.py +++ b/wcs/workflows.py @@ -1471,7 +1471,7 @@ class WorkflowStatusItem(XmlSerialisable): pass @classmethod - def is_available(cls): + def is_available(cls, workflow=None): return True def migrate(self): -- 2.8.1