From e2fff66d4a13f1fcd570630649bb3988d9a7c006 Mon Sep 17 00:00:00 2001 From: Thomas NOEL Date: Fri, 22 Jan 2016 19:16:09 +0100 Subject: [PATCH] workflows: add target roles in display message workflow item (#9705) --- tests/test_workflows.py | 26 ++++++++++++++++++++++++++ wcs/formdata.py | 15 +++++++++------ wcs/forms/common.py | 24 +++++++++++++++--------- wcs/workflows.py | 34 +++++++++++++++++++++++++++++++++- 4 files changed, 83 insertions(+), 16 deletions(-) diff --git a/tests/test_workflows.py b/tests/test_workflows.py index 1325cc9..3aa2545 100644 --- a/tests/test_workflows.py +++ b/tests/test_workflows.py @@ -779,6 +779,32 @@ def test_workflow_display_message(pub): display_message.message = '[foo]' assert display_message.get_message(formdata) == '1 < 3' +def test_workflow_display_message_to(pub): + workflow = Workflow(name='display message') + st1 = workflow.add_status('Status1', 'st1') + + FormDef.wipe() + formdef = FormDef() + formdef.url_name = 'foobar' + formdef._workflow = workflow + + formdata = formdef.data_class()() + formdata.status = 'wf-st1' + + display_message = DisplayMessageWorkflowStatusItem() + display_message.parent = st1 + st1.items.append(display_message) + + display_message.message = 'all' + display_message.to = None + assert display_message.get_message(formdata) == 'all' + assert formdata.workflow_messages() == ['all'] + + display_message.message = 'only-submitter' + display_message.to = ['_submitter'] + assert display_message.get_message(formdata) == '' + assert formdata.workflow_messages() == [] + def test_workflow_roles(pub): pub.substitutions.feed(MockSubstitutionVariables()) diff --git a/wcs/formdata.py b/wcs/formdata.py index dd78074..cbe94fe 100644 --- a/wcs/formdata.py +++ b/wcs/formdata.py @@ -279,14 +279,17 @@ class FormData(StorableObject): url = perform_items(wf_status.items, self) return url - def display_workflow_message(self): + def workflow_messages(self): wf_status = self.get_status() if not wf_status: - return '' - for status in wf_status.items: - if hasattr(status, 'get_message'): - return status.get_message(self) - return '' + return [] + messages = [] + for item in wf_status.items: + if hasattr(item, 'get_message'): + message = item.get_message(self) + if message: + messages.append(message) + return messages def get_status(self, status = None): if not status: diff --git a/wcs/forms/common.py b/wcs/forms/common.py index d3d888d..a68f307 100644 --- a/wcs/forms/common.py +++ b/wcs/forms/common.py @@ -132,16 +132,23 @@ class FormStatusPage(Directory): self.check_auth(api_call=True) return self.export_to_json() - def receipt_message(self, mine=False): + def workflow_messages(self): if self.formdef.workflow: - workflow_message = self.filled.display_workflow_message() - if workflow_message: + workflow_messages = self.filled.workflow_messages() + if workflow_messages: r = TemplateIO(html=True) - if workflow_message.startswith('<'): - r += htmltext(workflow_message) - else: - r += htmltext('

%s

' % workflow_message) + for workflow_message in workflow_messages: + if workflow_message.startswith('<'): + r += htmltext(workflow_message) + else: + r += htmltext('

%s

' % workflow_message) return r.getvalue() + return '' + + def receipt_message(self, mine=False): + workflow_messages = self.workflow_messages() + if workflow_messages: + return workflow_messages r = TemplateIO(html=True) # behaviour if workflow doesn't display any message @@ -485,8 +492,7 @@ class FormStatusPage(Directory): r += self.receipt(always_include_user = True) - if self.formdef.workflow: - r += htmltext(self.filled.display_workflow_message()) + r += htmltext(self.workflow_messages()) r += self.history() diff --git a/wcs/workflows.py b/wcs/workflows.py index 946233d..b980408 100644 --- a/wcs/workflows.py +++ b/wcs/workflows.py @@ -1804,11 +1804,35 @@ class DisplayMessageWorkflowStatusItem(WorkflowStatusItem): support_substitution_variables = True ok_in_global_action = False + to = None + message = None + def render_as_line(self): + if self.to: + return _('Display message to %s') % self.render_list_of_roles(self.to) + else: + return _('Display message') + def get_message(self, filled): if not self.message: return '' + + if self.to: + if not get_request(): + return '' + user = get_request().user + for role in self.to or []: + if role == '_submitter': + if filled.is_submitter(user): + break + elif user: + role = get_role_translation(filled, role) + if role in (user.roles or []): + break + else: + return '' + tmpl = ezt.Template() tmpl.parse(self.message, base_format=ezt.FORMAT_HTML) @@ -1830,9 +1854,17 @@ class DisplayMessageWorkflowStatusItem(WorkflowStatusItem): if 'message' in parameters: form.add(TextWidget, '%smessage' % prefix, title = _('Message'), value = self.message, cols = 80, rows = 10) + if 'to' in parameters: + form.add(WidgetList, '%sto' % prefix, title=_('To'), + element_type=SingleSelectWidget, + value=self.to or [], + add_element_label=_('Add Role'), + element_kwargs={'render_br': False, + 'options': [(None, '---', None)] + + self.get_list_of_roles(include_logged_in_users=False)}) def get_parameters(self): - return ('message',) + return ('message', 'to') register_item_class(DisplayMessageWorkflowStatusItem) -- 2.7.0.rc3