Projet

Général

Profil

0001-workflows-add-target-roles-in-display-message-workfl.patch

Thomas Noël, 23 janvier 2016 15:03

Télécharger (12,4 ko)

Voir les différences:

Subject: [PATCH] workflows: add target roles in display message workflow item
 (#9705)

 tests/test_form_pages.py      | 53 +++++++++++++++++++++++++++-
 tests/test_workflow_import.py | 20 +++++++++++
 tests/test_workflows.py       | 81 +++++++++++++++++++++++++++++++++++++++++++
 wcs/formdata.py               | 15 ++++----
 wcs/forms/common.py           | 28 +++++++++------
 wcs/workflows.py              | 34 +++++++++++++++++-
 6 files changed, 213 insertions(+), 18 deletions(-)
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
-