Projet

Général

Profil

0001-forms-don-t-let-old-formdata-get-used-by-workflow-af.patch

Frédéric Péters, 27 février 2019 15:27

Télécharger (4,43 ko)

Voir les différences:

Subject: [PATCH] forms: don't let old formdata get used by workflow after edit
 jump (#30942)

 tests/test_form_pages.py   | 67 ++++++++++++++++++++++++++++++++++++++
 wcs/forms/root.py          |  4 +++
 wcs/qommon/substitution.py |  4 +++
 3 files changed, 75 insertions(+)
tests/test_form_pages.py
5791 5791
    assert formdata.data['2'] == 'plop'
5792 5792
    assert formdata.data['3'] == 'a'
5793 5793
    assert formdata.data['3_display'] == 'b'
5794

  
5795
def test_form_edit_and_backoffice_field_change(pub):
5796
    create_user(pub)
5797

  
5798
    formdef = create_formdef()
5799
    formdef.fields = [fields.PageField(id='0', label='1st page', type='page'),
5800
            fields.StringField(id='1', label='string', varname='foo'),
5801
            fields.PageField(id='2', label='2nd page', type='page')
5802
            ]
5803
    formdef.store()
5804
    formdef.data_class().wipe()
5805

  
5806
    Workflow.wipe()
5807
    workflow = Workflow(name='test')
5808
    workflow.backoffice_fields_formdef = WorkflowBackofficeFieldsFormDef(workflow)
5809
    workflow.backoffice_fields_formdef.fields = [
5810
        fields.StringField(id='bo1', label='bo field 1', type='string',
5811
            varname='plop'),
5812
    ]
5813
    st1 = workflow.add_status('Status1', 'st1')
5814
    setbo = SetBackofficeFieldsWorkflowStatusItem()
5815
    setbo.parent = st1
5816
    setbo.fields = [{'field_id': 'bo1', 'value': '=form_var_foo'}]
5817
    setbo2 = SetBackofficeFieldsWorkflowStatusItem()
5818
    setbo2.parent = st1
5819
    setbo2.fields = [{'field_id': 'bo1', 'value': '="foo" + form_var_plop'}]
5820
    jump = JumpWorkflowStatusItem()
5821
    jump.status = 'st2'
5822
    st1.items = [setbo, setbo2, jump]
5823

  
5824
    st2 = workflow.add_status('Status2', 'st2')
5825

  
5826
    editable = EditableWorkflowStatusItem()
5827
    editable.id = '_editable'
5828
    editable.by = ['_submitter']
5829
    st2.items.append(editable)
5830
    editable.parent = st2
5831
    editable.status = st1.id
5832
    workflow.store()
5833

  
5834
    formdef.workflow_id = workflow.id
5835
    formdef.store()
5836

  
5837
    formdef.data_class().wipe()
5838

  
5839
    resp = login(get_app(pub), username='foo', password='foo').get('/test/')
5840
    resp.form['f1'] = 'bar'
5841
    resp = resp.form.submit('submit')  # -> page 2
5842
    resp = resp.form.submit('submit')  # -> validation
5843
    resp = resp.form.submit('submit').follow()  # -> submitted
5844
    assert 'The form has been recorded' in resp.body
5845

  
5846
    data_id = formdef.data_class().select()[0].id
5847
    assert formdef.data_class().get(data_id).data['bo1'] == 'foobar'
5848

  
5849
    app = login(get_app(pub), username='foo', password='foo')
5850
    resp = app.get('/test/%s/' % data_id)
5851
    assert 'button_editable-button' in resp.body
5852

  
5853
    resp = resp.form.submit('button_editable')
5854
    resp = resp.follow()
5855
    assert resp.form['f1'].value == 'bar'
5856
    resp.form['f1'].value = 'baz'
5857
    resp = resp.form.submit('submit')  # -> page 2
5858
    resp = resp.form.submit('submit').follow()  # -> saved
5859

  
5860
    assert formdef.data_class().get(data_id).data['bo1'] == 'foobaz'
wcs/forms/root.py
1150 1150
                new_data[k] = v
1151 1151
        self.edited_data.data = new_data
1152 1152
        self.edited_data.store()
1153
        # remove previous formdata from substitution variables
1154
        get_publisher().substitutions.unfeed(lambda x: isinstance(x, FormData))
1155
        # and add new one
1156
        get_publisher().substitutions.feed(self.edited_data)
1153 1157
        wf_status = self.edited_data.get_status()
1154 1158
        url = None
1155 1159
        for item in wf_status.items:
wcs/qommon/substitution.py
69 69
            self.sources.append(source)
70 70
            self.invalidate_cache()
71 71

  
72
    def unfeed(self, cmp_function):
73
        self.sources = [x for x in self.sources if not cmp_function(x)]
74
        self.invalidate_cache()
75

  
72 76
    @contextmanager
73 77
    def freeze(self):
74 78
        orig_sources, self.sources = self.sources, self.sources[:]
75
-