Projet

Général

Profil

0001-workflows-consider-parent-object-when-looking-for-re.patch

Frédéric Péters, 27 mai 2020 09:52

Télécharger (4,55 ko)

Voir les différences:

Subject: [PATCH] workflows: consider parent object when looking for related
 objects (#43022)

 tests/test_workflows.py     | 87 +++++++++++++++++++++++++++++++++++++
 wcs/wf/external_workflow.py |  7 +++
 2 files changed, 94 insertions(+)
tests/test_workflows.py
4934 4934
    logged_error = LoggedError.select()[0]
4935 4935
    assert logged_error.summary == 'Could not find linked "Data" object by id %s' % carddata.id
4936 4936
    assert logged_error.exception_class == 'KeyError'
4937

  
4938

  
4939
def test_call_external_workflow_with_parent_object(pub):
4940
    FormDef.wipe()
4941
    CardDef.wipe()
4942
    LoggedError.wipe()
4943

  
4944
    # carddef workflow, with global action to increment a counter in its
4945
    # backoffice fields.
4946
    carddef_wf = Workflow(name='Carddef Workflow')
4947
    carddef_wf.backoffice_fields_formdef = WorkflowBackofficeFieldsFormDef(carddef_wf)
4948
    carddef_wf.backoffice_fields_formdef.fields = [
4949
        StringField(id='bo0', varname='bo', type='string', label='bo variable'),
4950
    ]
4951
    increment_global_action = carddef_wf.add_global_action('Update')
4952
    increment_global_action.append_item('set-backoffice-fields')
4953
    setbo = increment_global_action.items[0]
4954
    setbo.fields = [{'field_id': 'bo0',
4955
                     'value': '{{ form_var_bo|default:"0"|add:1 }}'}]
4956
    trigger = increment_global_action.append_trigger('webservice')
4957
    trigger.identifier = 'update'
4958
    carddef_wf.store()
4959

  
4960
    # associated carddef
4961
    carddef = CardDef()
4962
    carddef.name = 'Data'
4963
    carddef.fields = [
4964
        StringField(id='0', label='string', varname='card_string'),
4965
    ]
4966
    carddef.workflow = carddef_wf
4967
    carddef.store()
4968

  
4969
    # and sample carddata
4970
    carddata = carddef.data_class()()
4971
    carddata.data = {'0': 'Text'}
4972
    carddata.store()
4973

  
4974
    # formdef workflow that will trigger the global action
4975
    wf = Workflow(name='External actions')
4976
    wf.add_status('Action')
4977

  
4978
    update_global_action = wf.add_global_action('Update linked object data')
4979
    update_action = update_global_action.append_item('external_workflow_global_action')
4980
    update_action.slug = 'carddef:%s' % carddef.url_name
4981
    update_action.trigger_id = 'action:update'
4982
    wf.store()
4983

  
4984
    # associated formdef
4985
    formdef = FormDef()
4986
    formdef.name = 'External action form'
4987
    formdef.fields = [EmailField(id='1', label='Email', varname='email')]
4988
    formdef.workflow = wf
4989
    formdef.store()
4990

  
4991
    # and formdata
4992
    formdata = formdef.data_class()()
4993
    formdata.data = {'1': 'foo@example.com'}
4994
    formdata.store()
4995
    formdata.just_created()
4996
    formdata.perform_workflow()
4997

  
4998
    # run, against no parent
4999
    perform_items([update_action], formdata)
5000
    card = carddef.data_class().get(carddata.id)
5001
    assert 'bo0' not in card.data  # not called
5002

  
5003
    # other parent
5004
    formdata.submission_context = {
5005
        'orig_object_type': 'formdef',
5006
        'orig_formdata_id': str(formdata.id),
5007
        'orig_formdef_id': str(formdef.id),
5008
    }
5009
    formdata.store()
5010
    perform_items([update_action], formdata)
5011
    card = carddef.data_class().get(carddata.id)
5012
    assert 'bo0' not in card.data  # not called
5013

  
5014
    # appropriate parent
5015
    formdata.submission_context = {
5016
        'orig_object_type': 'carddef',
5017
        'orig_formdata_id': str(carddata.id),
5018
        'orig_formdef_id': str(carddef.id),
5019
    }
5020
    formdata.store()
5021
    perform_items([update_action], formdata)
5022
    card = carddef.data_class().get(carddata.id)
5023
    assert card.data['bo0'] == '1'  # got called
wcs/wf/external_workflow.py
112 112
        return _('not completed')
113 113

  
114 114
    def iter_target_datas(self, formdata, objectdef):
115
        parent = formdata.get_parent()
116
        if parent:
117
            parent_identifier = '%s:%s' % (parent.formdef.xml_root_node,
118
                    parent.formdef.url_name)
119
            if parent_identifier == self.slug:
120
                yield parent
121

  
115 122
        data_ids = []
116 123
        # search linked objects in data sources
117 124
        for field in formdata.get_formdef().get_all_fields():
118
-