0001-workflows-add-target-roles-in-display-message-workfl.patch
tests/test_form_pages.py | ||
---|---|---|
14 | 14 |
from wcs.qommon.form import UploadedFile |
15 | 15 |
from wcs.qommon.ident.password_accounts import PasswordAccount |
16 | 16 |
from wcs.formdef import FormDef |
17 |
from wcs.workflows import Workflow, EditableWorkflowStatusItem |
|
17 |
from wcs.workflows import Workflow, EditableWorkflowStatusItem, DisplayMessageWorkflowStatusItem
|
|
18 | 18 |
from wcs.wf.export_to_model import ExportToModel |
19 | 19 |
from wcs.wf.jump import JumpWorkflowStatusItem |
20 | 20 |
from wcs.wf.attachment import AddAttachmentWorkflowStatusItem |
... | ... | |
2270 | 2270 | |
2271 | 2271 |
resp = app.get(formdata.get_url()) |
2272 | 2272 |
assert resp.body.count('Status1') == 2 # once in summary and once in journal |
2273 | ||
2274 |
def test_display_message(pub): |
|
2275 |
user = create_user(pub) |
|
2276 | ||
2277 |
formdef = create_formdef() |
|
2278 |
formdef.fields = [] |
|
2279 |
formdef.store() |
|
2280 | ||
2281 |
workflow = Workflow(name='test') |
|
2282 |
st1 = workflow.add_status('Status1', 'st1') |
|
2283 | ||
2284 |
display1 = DisplayMessageWorkflowStatusItem() |
|
2285 |
display1.message = 'message-to-all' |
|
2286 |
display1.to = [] |
|
2287 |
st1.items.append(display1) |
|
2288 |
display1.parent = st1 |
|
2289 | ||
2290 |
display2 = DisplayMessageWorkflowStatusItem() |
|
2291 |
display2.message = 'message-to-submitter' |
|
2292 |
display2.to = ['_submitter'] |
|
2293 |
st1.items.append(display2) |
|
2294 |
display2.parent = st1 |
|
2295 | ||
2296 |
display3 = DisplayMessageWorkflowStatusItem() |
|
2297 |
display3.message = 'message-to-nobody' |
|
2298 |
display3.to = ['xxx'] |
|
2299 |
st1.items.append(display3) |
|
2300 |
display3.parent = st1 |
|
2301 | ||
2302 |
display4 = DisplayMessageWorkflowStatusItem() |
|
2303 |
display4.message = 'message-to-xxx-and-submitter' |
|
2304 |
display4.to = ['_submitter', 'xxx'] |
|
2305 |
st1.items.append(display4) |
|
2306 |
display4.parent = st1 |
|
2307 | ||
2308 |
workflow.store() |
|
2309 | ||
2310 |
formdef.workflow_id = workflow.id |
|
2311 |
formdef.store() |
|
2312 | ||
2313 |
formdef.data_class().wipe() |
|
2314 | ||
2315 |
page = login(get_app(pub), username='foo', password='foo').get('/test/') |
|
2316 |
page = page.forms[0].submit('submit') # form page |
|
2317 |
page = page.forms[0].submit('submit') # confirmation page |
|
2318 |
page = page.follow() |
|
2319 | ||
2320 |
assert 'message-to-all' in page.body |
|
2321 |
assert 'message-to-submitter' in page.body |
|
2322 |
assert 'message-to-nobody' not in page.body |
|
2323 |
assert 'message-to-xxx-and-submitter' in page.body |
tests/test_workflow_import.py | ||
---|---|---|
406 | 406 |
assert wf2.possible_status[0].items[0].rules == [ |
407 | 407 |
{'value': 'a', 'role_id': role3.id}, {'value': 'b', 'role_id': role4.id}] |
408 | 408 |
assert wf2.possible_status[0].items[0].dispatch_type == 'automatic' |
409 | ||
410 | ||
411 |
def test_display_message_action(): |
|
412 |
wf = Workflow(name='status') |
|
413 |
st1 = wf.add_status('Status1', 'st1') |
|
414 | ||
415 |
from wcs.workflows import DisplayMessageWorkflowStatusItem |
|
416 | ||
417 |
display = DisplayMessageWorkflowStatusItem() |
|
418 |
display.message = 'hey' |
|
419 |
display.to = ['_submitter', '1'] |
|
420 |
st1.items.append(display) |
|
421 |
display.parent = st1 |
|
422 | ||
423 |
wf2 = assert_import_export_works(wf) |
|
424 |
assert wf2.possible_status[0].items[0].message == display.message |
|
425 |
for role_id in display.to: |
|
426 |
assert role_id in wf2.possible_status[0].items[0].to |
|
427 | ||
428 |
wf2 = assert_import_export_works(wf, include_id=True) |
tests/test_workflows.py | ||
---|---|---|
779 | 779 |
display_message.message = '[foo]' |
780 | 780 |
assert display_message.get_message(formdata) == '1 < 3' |
781 | 781 | |
782 |
def test_workflow_display_message_to(pub): |
|
783 |
workflow = Workflow(name='display message to') |
|
784 |
st1 = workflow.add_status('Status1', 'st1') |
|
785 | ||
786 |
role = Role(name='foorole') |
|
787 |
role.store() |
|
788 |
role2 = Role(name='no-one-role') |
|
789 |
role2.store() |
|
790 |
user = pub.user_class(name='baruser') |
|
791 |
user.roles = [] |
|
792 |
user.store() |
|
793 | ||
794 |
FormDef.wipe() |
|
795 |
formdef = FormDef() |
|
796 |
formdef.url_name = 'foobar' |
|
797 |
formdef._workflow = workflow |
|
798 | ||
799 |
formdata = formdef.data_class()() |
|
800 |
formdata.status = 'wf-st1' |
|
801 | ||
802 |
display_message = DisplayMessageWorkflowStatusItem() |
|
803 |
display_message.parent = st1 |
|
804 |
st1.items.append(display_message) |
|
805 | ||
806 |
display_message.message = 'all' |
|
807 |
display_message.to = None |
|
808 |
assert display_message.get_message(formdata) == 'all' |
|
809 |
assert formdata.get_workflow_messages() == ['all'] |
|
810 | ||
811 |
display_message.message = 'to-role' |
|
812 |
display_message.to = [role.id] |
|
813 |
assert display_message.get_message(formdata) == '' |
|
814 |
assert formdata.get_workflow_messages() == [] |
|
815 | ||
816 |
pub._request.user = user |
|
817 |
display_message.message = 'to-role' |
|
818 |
display_message.to = [role.id] |
|
819 |
assert display_message.get_message(formdata) == '' |
|
820 |
assert formdata.get_workflow_messages() == [] |
|
821 |
user.roles = [role.id] |
|
822 |
assert display_message.get_message(formdata) == 'to-role' |
|
823 |
assert formdata.get_workflow_messages() == ['to-role'] |
|
824 | ||
825 |
user.roles = [] |
|
826 |
display_message.message = 'to-submitter' |
|
827 |
display_message.to = ['_submitter'] |
|
828 |
assert display_message.get_message(formdata) == '' |
|
829 |
assert formdata.get_workflow_messages() == [] |
|
830 |
formdata.user_id = user.id |
|
831 |
assert display_message.get_message(formdata) == 'to-submitter' |
|
832 |
assert formdata.get_workflow_messages() == ['to-submitter'] |
|
833 | ||
834 |
display_message.message = 'to-role-or-submitter' |
|
835 |
display_message.to = [role.id, '_submitter'] |
|
836 |
assert display_message.get_message(formdata) == 'to-role-or-submitter' |
|
837 |
assert formdata.get_workflow_messages() == ['to-role-or-submitter'] |
|
838 |
formdata.user_id = None |
|
839 |
assert display_message.get_message(formdata) == '' |
|
840 |
assert formdata.get_workflow_messages() == [] |
|
841 |
user.roles = [role.id] |
|
842 |
assert display_message.get_message(formdata) == 'to-role-or-submitter' |
|
843 |
assert formdata.get_workflow_messages() == ['to-role-or-submitter'] |
|
844 |
formdata.user_id = user.id |
|
845 |
assert display_message.get_message(formdata) == 'to-role-or-submitter' |
|
846 |
assert formdata.get_workflow_messages() == ['to-role-or-submitter'] |
|
847 | ||
848 |
display_message.to = [role2.id] |
|
849 |
assert display_message.get_message(formdata) == '' |
|
850 |
assert formdata.get_workflow_messages() == [] |
|
851 | ||
852 |
display_message.message = 'd1' |
|
853 |
display_message2 = DisplayMessageWorkflowStatusItem() |
|
854 |
display_message2.parent = st1 |
|
855 |
st1.items.append(display_message2) |
|
856 |
display_message2.message = 'd2' |
|
857 |
display_message2.to = [role.id, '_submitter'] |
|
858 |
assert formdata.get_workflow_messages() == ['d2'] |
|
859 |
user.roles = [role.id, role2.id] |
|
860 |
assert 'd1' in formdata.get_workflow_messages() |
|
861 |
assert 'd2' in formdata.get_workflow_messages() |
|
862 | ||
782 | 863 |
def test_workflow_roles(pub): |
783 | 864 |
pub.substitutions.feed(MockSubstitutionVariables()) |
784 | 865 |
wcs/formdata.py | ||
---|---|---|
279 | 279 |
url = perform_items(wf_status.items, self) |
280 | 280 |
return url |
281 | 281 | |
282 |
def display_workflow_message(self):
|
|
282 |
def get_workflow_messages(self):
|
|
283 | 283 |
wf_status = self.get_status() |
284 | 284 |
if not wf_status: |
285 |
return '' |
|
286 |
for status in wf_status.items: |
|
287 |
if hasattr(status, 'get_message'): |
|
288 |
return status.get_message(self) |
|
289 |
return '' |
|
285 |
return [] |
|
286 |
messages = [] |
|
287 |
for item in wf_status.items: |
|
288 |
if hasattr(item, 'get_message'): |
|
289 |
message = item.get_message(self) |
|
290 |
if message: |
|
291 |
messages.append(message) |
|
292 |
return messages |
|
290 | 293 | |
291 | 294 |
def get_status(self, status = None): |
292 | 295 |
if not status: |
wcs/forms/common.py | ||
---|---|---|
132 | 132 |
self.check_auth(api_call=True) |
133 | 133 |
return self.export_to_json() |
134 | 134 | |
135 |
def receipt_message(self, mine=False):
|
|
135 |
def workflow_messages(self):
|
|
136 | 136 |
if self.formdef.workflow: |
137 |
workflow_message = self.filled.display_workflow_message()
|
|
138 |
if workflow_message: |
|
137 |
workflow_messages = self.filled.get_workflow_messages()
|
|
138 |
if workflow_messages:
|
|
139 | 139 |
r = TemplateIO(html=True) |
140 |
if workflow_message.startswith('<'): |
|
141 |
r += htmltext(workflow_message) |
|
142 |
else: |
|
143 |
r += htmltext('<p>%s</p>' % workflow_message) |
|
140 |
r += htmltext('<div id="receipt-intro">') |
|
141 |
for workflow_message in workflow_messages: |
|
142 |
if workflow_message.startswith('<'): |
|
143 |
r += htmltext(workflow_message) |
|
144 |
else: |
|
145 |
r += htmltext('<p>%s</p>' % workflow_message) |
|
146 |
r += htmltext('</div>') |
|
144 | 147 |
return r.getvalue() |
148 |
return '' |
|
149 | ||
150 |
def receipt_message(self, mine=False): |
|
151 |
workflow_messages = self.workflow_messages() |
|
152 |
if workflow_messages: |
|
153 |
return workflow_messages |
|
145 | 154 | |
146 | 155 |
r = TemplateIO(html=True) |
147 | 156 |
# behaviour if workflow doesn't display any message |
... | ... | |
483 | 492 |
'date': self.filled.anonymised.strftime(misc.date_format())} |
484 | 493 |
r += htmltext('</div>') |
485 | 494 | |
486 |
r += self.receipt(always_include_user = True)
|
|
495 |
r += htmltext(self.workflow_messages())
|
|
487 | 496 | |
488 |
if self.formdef.workflow: |
|
489 |
r += htmltext(self.filled.display_workflow_message()) |
|
497 |
r += self.receipt(always_include_user = True) |
|
490 | 498 | |
491 | 499 |
r += self.history() |
492 | 500 |
wcs/workflows.py | ||
---|---|---|
1804 | 1804 |
support_substitution_variables = True |
1805 | 1805 |
ok_in_global_action = False |
1806 | 1806 | |
1807 |
to = None |
|
1808 | ||
1807 | 1809 |
message = None |
1808 | 1810 | |
1811 |
def render_as_line(self): |
|
1812 |
if self.to: |
|
1813 |
return _('Display message to %s') % self.render_list_of_roles(self.to) |
|
1814 |
else: |
|
1815 |
return _('Display message') |
|
1816 | ||
1809 | 1817 |
def get_message(self, filled): |
1810 | 1818 |
if not self.message: |
1811 | 1819 |
return '' |
1820 | ||
1821 |
if self.to: |
|
1822 |
if not get_request(): |
|
1823 |
return '' |
|
1824 |
user = get_request().user |
|
1825 |
for role in self.to or []: |
|
1826 |
if role == '_submitter': |
|
1827 |
if filled.is_submitter(user): |
|
1828 |
break |
|
1829 |
elif user: |
|
1830 |
role = get_role_translation(filled, role) |
|
1831 |
if role in (user.roles or []): |
|
1832 |
break |
|
1833 |
else: |
|
1834 |
return '' |
|
1835 | ||
1812 | 1836 |
tmpl = ezt.Template() |
1813 | 1837 |
tmpl.parse(self.message, base_format=ezt.FORMAT_HTML) |
1814 | 1838 | |
... | ... | |
1830 | 1854 |
if 'message' in parameters: |
1831 | 1855 |
form.add(TextWidget, '%smessage' % prefix, title = _('Message'), |
1832 | 1856 |
value = self.message, cols = 80, rows = 10) |
1857 |
if 'to' in parameters: |
|
1858 |
form.add(WidgetList, '%sto' % prefix, title=_('To'), |
|
1859 |
element_type=SingleSelectWidget, |
|
1860 |
value=self.to or [], |
|
1861 |
add_element_label=_('Add Role'), |
|
1862 |
element_kwargs={'render_br': False, |
|
1863 |
'options': [(None, '---', None)] + |
|
1864 |
self.get_list_of_roles(include_logged_in_users=False)}) |
|
1833 | 1865 | |
1834 | 1866 |
def get_parameters(self): |
1835 |
return ('message',) |
|
1867 |
return ('message', 'to')
|
|
1836 | 1868 | |
1837 | 1869 |
register_item_class(DisplayMessageWorkflowStatusItem) |
1838 | 1870 | |
1839 |
- |