Projet

Général

Profil

0001-misc-make-exclude_self-work-in-post-conditions-47746.patch

Frédéric Péters, 01 décembre 2020 08:39

Télécharger (4,55 ko)

Voir les différences:

Subject: [PATCH] misc: make |exclude_self work in post conditions (#47746)

 tests/form_pages/test_all.py | 64 ++++++++++++++++++++++++++++++++++++
 wcs/forms/root.py            |  3 ++
 wcs/variables.py             |  4 +++
 3 files changed, 71 insertions(+)
tests/form_pages/test_all.py
2311 2311
    assert resp.forms[0]['f1'].value == 'foo2'
2312 2312
    resp.forms[0]['f1'] = 'foo3'
2313 2313
    resp = resp.forms[0].submit('submit')
2314
    assert formdef.data_class().get(data_id).data['1'] == 'foo2'  # check foo3 has not been overwritten in database
2314 2315
    assert resp.forms[0]['f3'].value == 'barXYZ'
2315 2316
    resp = resp.forms[0].submit('submit')
2316 2317
    assert resp.location == 'http://example.net/test/%s/' % data_id
......
9036 9037
        '1_structured': {'id': '1', 'text': 'un', 'more': 'foo'},
9037 9038
    }
9038 9039
    assert '2020-04-18' in formdata.evolution[0].parts[0].content
9040

  
9041

  
9042
def test_exclude_self_condition(pub):
9043
    FormDef.wipe()
9044

  
9045
    formdef = FormDef()
9046
    formdef.name = 'form title'
9047
    formdef.fields = [
9048
        fields.PageField(id='1', label='1st page', type='page',
9049
            post_conditions=[{
9050
                'condition': {
9051
                    'type': 'django', 'value': 'form_objects|filter_by:"foo"|filter_value:form_var_foo|exclude_self|count == 0',
9052
                },
9053
                'error_message': 'You shall not pass.'
9054
            }]
9055
        ),
9056
        fields.StringField(id='1', label='string', type='string', varname='foo'),
9057
    ]
9058

  
9059
    workflow = Workflow(name='test')
9060
    st1 = workflow.add_status('Status1', 'st1')
9061
    editable = EditableWorkflowStatusItem()
9062
    editable.id = '_editable'
9063
    editable.by = ['_submitter', '_receiver']
9064
    st1.items.append(editable)
9065
    editable.parent = st1
9066
    workflow.store()
9067

  
9068
    formdef.workflow_id = workflow.id
9069
    formdef.store()
9070

  
9071
    app = get_app(pub)
9072
    resp = app.get(formdef.get_url())
9073
    resp.form['f1'] = 'test'
9074
    resp = resp.form.submit('submit')  # -> validation page
9075
    assert 'You shall not pass.' not in resp.text
9076
    resp = resp.form.submit('submit')  # -> submit
9077
    resp = resp.follow()
9078

  
9079
    # edit is ok
9080
    resp = resp.form.submit('button_editable').follow()
9081
    resp = resp.form.submit('submit')  # -> validation page
9082
    assert 'You shall not pass.' not in resp
9083

  
9084
    # 2nd submission
9085
    resp = app.get(formdef.get_url())
9086
    resp.form['f1'] = 'test'
9087
    resp = resp.form.submit('submit')  # -> validation page
9088
    assert 'You shall not pass.' in resp.text
9089

  
9090
    # submission with other value
9091
    resp = app.get(formdef.get_url())
9092
    resp.form['f1'] = 'other'
9093
    resp = resp.form.submit('submit')  # -> validation page
9094
    assert 'You shall not pass.' not in resp.text
9095
    resp = resp.form.submit('submit')  # -> submit
9096
    resp = resp.follow()
9097

  
9098
    # edit is ok
9099
    resp = resp.form.submit('button_editable').follow()
9100
    resp.form['f1'] = 'test'
9101
    resp = resp.form.submit('submit')  # -> validation page
9102
    assert 'You shall not pass.' in resp
wcs/forms/root.py
619 619
            # keep associated user as it may be required as a parameter in
620 620
            # data source URLs.
621 621
            formdata.user = self.edited_data.user
622
            # keep track of original formdata id so it can be used by
623
            # |exclude_self filter.
624
            formdata._edited_id = self.edited_data.id
622 625
            return formdata
623 626

  
624 627
        if get_request().is_in_backoffice():
wcs/variables.py
106 106

  
107 107
    def exclude_self(self):
108 108
        assert self._formdata
109
        if not self._formdata.id:
110
            if hasattr(self._formdata, '_edited_id'):
111
                return self._clone(self._criterias + [NotEqual('id', str(self._formdata._edited_id))])
112
            return self._clone(self._criterias)
109 113
        return self._clone(self._criterias + [NotEqual('id', str(self._formdata.id))])
110 114

  
111 115
    def same_user(self):
112
-