Projet

Général

Profil

0002-unfeed-clean-cached-values-of-substitution-variables.patch

Nicolas Roche, 24 avril 2019 19:08

Télécharger (6,19 ko)

Voir les différences:

Subject: [PATCH 2/2] unfeed: clean cached values of substitution variables
 using a condition when editing on workflow (#32558)

 tests/test_form_pages.py | 94 ++++++++++++++++++++++++++++++++++++++++
 wcs/forms/root.py        | 11 +++--
 2 files changed, 101 insertions(+), 4 deletions(-)
tests/test_form_pages.py
6226 6226

  
6227 6227
    assert formdata.data['bo1'] == 'B2'
6228 6228
    assert formdata.data['bo2'] == 'moreB2'
6229

  
6230
def test_form_edit_and_backoffice_field_condition_change(pub):
6231
    """
6232
    mix bitween test_form_edit_and_backoffice_field_change
6233
    and test_unfeed_structured_list_when_condition_changes:
6234
    test unfeed on ConditionVars within edit context
6235
    """
6236
    Workflow.wipe()
6237
    workflow = Workflow(name='test')
6238
    workflow.backoffice_fields_formdef = WorkflowBackofficeFieldsFormDef(workflow)
6239
    workflow.backoffice_fields_formdef.fields = [
6240
        fields.StringField(
6241
            id='bo1', label='both text', type='string', varname='both_text'),
6242
        fields.StringField(
6243
            id='bo2', label='both more', type='string', varname='both_more')
6244
    ]
6245

  
6246
    st1 = workflow.add_status('Status1', 'st1')
6247
    setbo = SetBackofficeFieldsWorkflowStatusItem()
6248
    setbo.parent = st1
6249
    setbo.fields = [
6250
        {'field_id': 'bo1',
6251
         'value': '{{ form_var_listA }} vs {{ form_var_listB }}'},
6252
        {'field_id': 'bo2',
6253
         'value': '{{ form_var_listA_more }} vs {{ form_var_listB_more }}'}
6254
         ]
6255
    editable = EditableWorkflowStatusItem()
6256
    editable.id = '_editable'
6257
    editable.by = ['_submitter']
6258
    editable.parent = st1
6259
    editable.status = st1.id
6260
    st1.items = [setbo, editable]
6261
    workflow.store()
6262

  
6263
    items_A = [{'id': '1', 'text': 'A1', 'more':'moreA1'}]
6264
    items_B = [{'id': '1', 'text': 'B1', 'more':'moreB1'},
6265
               {'id': '2', 'text': 'B2', 'more':'moreB2'}]
6266
    formdef = create_formdef()
6267
    formdef.fields = [
6268
        fields.ItemField(id='1', varname='choice', items=['A', 'B'],
6269
                         type='item', label='list to choice'),
6270
        fields.ItemField(id='2', varname='listA', type='item', label='list A',
6271
                         data_source={'type': 'formula', 'value': str(items_A)},
6272
                         condition={'type': 'python',
6273
                                    'value': 'form_var_choice_raw == "A"'}),
6274
        fields.ItemField(id='3', varname='listB', type='item', label='list B',
6275
                         data_source={'type': 'formula', 'value': str(items_B)},
6276
                         condition={'type': 'python',
6277
                                    'value': 'form_var_choice_raw == "B"'})
6278
        ]
6279
    formdef.confirmation = False
6280
    formdef.workflow_id = workflow.id
6281
    formdef.store()
6282
    formdef.data_class().wipe()
6283

  
6284
    create_user(pub)
6285
    resp = login(get_app(pub), username='foo', password='foo').get('/test/')
6286

  
6287
    resp.form['f1'].value = 'B'
6288
    resp.form['f2'].value = '1'
6289
    resp.form['f3'].value = '2'
6290

  
6291
    resp = resp.form.submit('submit').follow()
6292
    assert 'The form has been recorded' in resp.body
6293

  
6294
    assert formdef.data_class().count() == 1
6295
    formdata = formdef.data_class().select()[0]
6296
    assert formdata.data['1'] == 'B'
6297
    assert formdata.data.get('2') is None
6298
    assert formdata.data['3'] == '2'
6299

  
6300
    # check unfeed on FormPage::submitted()
6301
    assert formdata.data['bo1'] == 'None vs B2'
6302
    assert formdata.data['bo2'] == ' vs moreB2'
6303

  
6304
    app = login(get_app(pub), username='foo', password='foo')
6305
    resp = app.get('/test/%s/' % formdata.id)
6306
    assert 'button_editable-button' in resp.body
6307

  
6308
    resp = resp.form.submit('button_editable').follow()
6309
    assert resp.form['f1'].value == 'B'
6310
    resp.form['f1'].value = 'A'
6311
    resp = resp.form.submit('submit').follow()  # -> saved
6312
    assert 'The form has been recorded' in resp.body
6313

  
6314
    assert formdef.data_class().count() == 1
6315
    formdata = formdef.data_class().select()[0]
6316
    assert formdata.data['1'] == 'A'
6317
    assert formdata.data['2'] == '1'
6318
    assert formdata.data.get('3') is None
6319

  
6320
    # check unfeed on FormPage::submitted_existing()
6321
    assert formdata.data['bo1'] == 'A1 vs None'
6322
    assert formdata.data['bo2'] == 'moreA1 vs '
wcs/forms/root.py
1117 1117

  
1118 1118
        return json.dumps({'result': result})
1119 1119

  
1120
    @staticmethod
1121
    def remove_previous_formdata_from_substitution_variables():
1122
        get_publisher().substitutions.unfeed(lambda x: x.__class__.__name__ == 'ConditionVars')
1123
        get_publisher().substitutions.unfeed(lambda x: isinstance(x, FormData))
1124

  
1120 1125
    def submitted(self, form, existing_formdata = None):
1121 1126
        if existing_formdata: # modifying
1122 1127
            filled = existing_formdata
......
1148 1153
        get_logger().info('form %s - done (id: %s)' % (self.formdef.name, filled.id))
1149 1154
        url = None
1150 1155
        if existing_formdata is None:
1151
            get_publisher().substitutions.unfeed(lambda x: x.__class__.__name__ == 'ConditionVars')
1152
            get_publisher().substitutions.unfeed(lambda x: isinstance(x, FormData))
1156
            self.remove_previous_formdata_from_substitution_variables()
1153 1157
            url = filled.perform_workflow()
1154 1158

  
1155 1159
        if not filled.user_id:
......
1182 1186
                new_data[k] = v
1183 1187
        self.edited_data.data = new_data
1184 1188
        self.edited_data.store()
1185
        # remove previous formdata from substitution variables
1186
        get_publisher().substitutions.unfeed(lambda x: isinstance(x, FormData))
1189
        self.remove_previous_formdata_from_substitution_variables()
1187 1190
        # and add new one
1188 1191
        get_publisher().substitutions.feed(self.edited_data)
1189 1192
        wf_status = self.edited_data.get_status()
1190
-