Projet

Général

Profil

0001-fields-add-check-for-value-given-as-block-field-6343.patch

Frédéric Péters, 15 août 2022 20:37

Télécharger (4,06 ko)

Voir les différences:

Subject: [PATCH] fields: add check for value given as block field (#63437)

 tests/workflow/test_all.py  | 46 +++++++++++++++++++++++++++++++++++++
 wcs/fields.py               |  2 ++
 wcs/wf/backoffice_fields.py |  4 ++--
 3 files changed, 50 insertions(+), 2 deletions(-)
tests/workflow/test_all.py
5749 5749
    assert formdata.data['bo1_display'] == 'XNoneY'
5750 5750

  
5751 5751

  
5752
def test_set_backoffice_field_invalid_block_value(pub):
5753
    BlockDef.wipe()
5754
    Workflow.wipe()
5755
    FormDef.wipe()
5756

  
5757
    block = BlockDef()
5758
    block.name = 'foobar'
5759
    block.fields = [StringField(id='123', required=True, label='Test', type='string', varname='foo')]
5760
    block.store()
5761

  
5762
    wf = Workflow(name='xxx')
5763
    wf.backoffice_fields_formdef = WorkflowBackofficeFieldsFormDef(wf)
5764
    st1 = wf.add_status('Status1')
5765
    wf.backoffice_fields_formdef.fields = [
5766
        BlockField(id='bo1', label='1st backoffice field', max_items=3, type='block:foobar'),
5767
    ]
5768
    wf.store()
5769

  
5770
    formdef = FormDef()
5771
    formdef.name = 'baz'
5772
    formdef.fields = []
5773
    formdef.workflow_id = wf.id
5774
    formdef.store()
5775

  
5776
    formdata = formdef.data_class()()
5777
    formdata.just_created()
5778
    formdata.store()
5779
    get_publisher().substitutions.feed(formdata)
5780

  
5781
    item = SetBackofficeFieldsWorkflowStatusItem()
5782
    item.parent = st1
5783
    item.fields = [{'field_id': 'bo1', 'value': 'xxx'}]
5784

  
5785
    pub.loggederror_class.wipe()
5786
    item.perform(formdata)
5787
    assert pub.loggederror_class.count() == 1
5788
    logged_error = pub.loggederror_class.select()[0]
5789
    assert (
5790
        logged_error.summary
5791
        == 'Failed to set Field Block (foobar) field (bo1), error: invalid value for block'
5792
    )
5793

  
5794
    formdata = formdef.data_class().get(formdata.id)
5795
    assert not formdata.data.get('bo1')
5796

  
5797

  
5752 5798
def test_set_backoffice_field_immediate_use(http_requests, pub):
5753 5799
    Workflow.wipe()
5754 5800
    FormDef.wipe()
wcs/fields.py
3855 3855
            value = None
3856 3856
        if isinstance(value, BlockRowValue):
3857 3857
            value = value.make_value(block=self.block, field=self, data=data)
3858
        elif value and not (isinstance(value, dict) and 'data' in value and 'schema' in value):
3859
            raise SetValueError('invalid value for block')
3858 3860
        super().set_value(data, value, **kwargs)
3859 3861

  
3860 3862
    def get_json_value(self, value, **kwargs):
wcs/wf/backoffice_fields.py
169 169
                except ValueError as e:
170 170
                    summary = _('Failed to convert %(class)s value to %(kind)s field (%(id)s)') % {
171 171
                        'class': type(new_value),
172
                        'kind': getattr(formdef_field, 'description', _('unknown')),
172
                        'kind': formdef_field.get_type_label(),
173 173
                        'id': field['field_id'],
174 174
                    }
175 175
                    expression_dict = self.get_expression(field['value'])
......
187 187
                formdef_field.set_value(formdata.data, new_value)
188 188
            except SetValueError as e:
189 189
                summary = _('Failed to set %(kind)s field (%(id)s), error: %(exc)s') % {
190
                    'kind': getattr(formdef_field, 'description', _('unknown')),
190
                    'kind': formdef_field.get_type_label(),
191 191
                    'id': field['field_id'],
192 192
                    'exc': e,
193 193
                }
194
-