Projet

Général

Profil

0004-wf-LazyFormDataLinksItems-object-for-links-substitut.patch

Lauréline Guérin, 09 septembre 2021 15:03

Télécharger (5,56 ko)

Voir les différences:

Subject: [PATCH 4/4] wf: LazyFormDataLinksItems object for links substitution
 (#56611)

 tests/workflow/test_carddata.py | 96 +++++++++++++++++++++++++++++++++
 wcs/wf/create_formdata.py       | 28 +++++++++-
 2 files changed, 123 insertions(+), 1 deletion(-)
tests/workflow/test_carddata.py
150 150
    assert carddef.data_class().count() == 0
151 151

  
152 152

  
153
def test_create_carddata_with_links(pub):
154
    CardDef.wipe()
155
    FormDef.wipe()
156

  
157
    carddef1 = CardDef()
158
    carddef1.name = 'Card 1'
159
    carddef1.fields = [
160
        StringField(id='1', label='string', varname='foo'),
161
    ]
162
    carddef1.store()
163
    carddef1.data_class().wipe()
164
    carddef2 = CardDef()
165
    carddef2.name = 'Card 2'
166
    carddef2.fields = [
167
        StringField(id='1', label='string', varname='bar'),
168
        ItemField(
169
            id='2', label='card', varname='card1', data_source={'type': 'carddef:%s' % carddef1.url_name}
170
        ),
171
    ]
172
    carddef2.store()
173
    carddef2.data_class().wipe()
174

  
175
    wf = Workflow(name='create-carddata')
176
    st1 = wf.add_status('Create cards', 'st1')
177
    create1 = CreateCarddataWorkflowStatusItem()
178
    create1.label = 'Create CardDef1'
179
    create1.varname = 'mycard1'
180
    create1.id = '_create1'
181
    create1.formdef_slug = carddef1.url_name
182
    create1.mappings = [
183
        Mapping(field_id='1', expression='{{ form_var_card1_foo }}'),
184
    ]
185
    create1.parent = st1
186
    st1.items.append(create1)
187
    create2 = CreateCarddataWorkflowStatusItem()
188
    create2.label = 'Create CardDef2'
189
    create2.varname = 'mycard2'
190
    create2.id = '_create2'
191
    create2.formdef_slug = carddef2.url_name
192
    create2.mappings = [
193
        Mapping(field_id='1', expression='{{ form_var_card2_bar }}'),
194
        Mapping(field_id='2', expression='{{ form_links_mycard1 }}'),
195
    ]
196
    create2.parent = st1
197
    st1.items.append(create2)
198
    wf.store()
199

  
200
    formdef = FormDef()
201
    formdef.name = 'form'
202
    formdef.fields = [
203
        StringField(id='1', label='foo', varname='card1_foo'),
204
        StringField(id='2', label='bar', varname='card2_bar'),
205
    ]
206
    formdef.workflow_id = wf.id
207
    formdef.store()
208

  
209
    formdata = formdef.data_class()()
210
    formdata.data = {
211
        '1': 'card1 foo',
212
        '2': 'card2 bar',
213
    }
214
    formdata.just_created()
215
    formdata.perform_workflow()
216

  
217
    assert carddef1.data_class().count() == 1
218
    assert carddef2.data_class().count() == 1
219
    carddata1 = carddef1.data_class().get(id=1)
220
    carddata2 = carddef2.data_class().get(id=1)
221
    assert carddata1.data['1'] == 'card1 foo'
222
    assert carddata2.data['1'] == 'card2 bar'
223
    assert carddata2.data['2'] == str(carddata1.id)
224

  
225
    create2.mappings[1] = Mapping(field_id='2', expression='{{ form_links_mycard1_form_number_raw }}')
226
    wf.store()
227
    formdef = FormDef.get(formdef.id)
228

  
229
    carddef1.data_class().wipe()
230
    carddef2.data_class().wipe()
231
    formdef.data_class().wipe()
232
    formdata = formdef.data_class()()
233
    formdata.data = {
234
        '1': 'card1 fooo',
235
        '2': 'card2 barr',
236
    }
237
    formdata.just_created()
238
    formdata.perform_workflow()
239

  
240
    assert carddef1.data_class().count() == 1
241
    assert carddef2.data_class().count() == 1
242
    carddata1 = carddef1.data_class().get(id=1)
243
    carddata2 = carddef2.data_class().get(id=1)
244
    assert carddata1.data['1'] == 'card1 fooo'
245
    assert carddata2.data['1'] == 'card2 barr'
246
    assert carddata2.data['2'] == str(carddata1.id)
247

  
248

  
153 249
def test_create_carddata_with_map_field(two_pubs):
154 250
    CardDef.wipe()
155 251
    FormDef.wipe()
wcs/wf/create_formdata.py
205 205
        self._formdata = formdata
206 206

  
207 207
    def __getattr__(self, varname):
208
        linked_formdatas = []
208 209
        for part in self._formdata.iter_evolution_parts():
209 210
            if not isinstance(part, LinkedFormdataEvolutionPart):
210 211
                continue
211 212
            if part.varname == varname and part.formdata:
212
                return CompatibilityNamesDict({'form': part.formdata.get_as_lazy()})
213
                linked_formdatas.append(CompatibilityNamesDict({'form': part.formdata.get_as_lazy()}))
214
        if linked_formdatas:
215
            return LazyFormDataLinksItems(linked_formdatas)
213 216
        raise AttributeError(varname)
214 217

  
215 218
    def inspect_keys(self):
......
218 221
                yield part.varname
219 222

  
220 223

  
224
class LazyFormDataLinksItems:
225
    def __init__(self, linked_formdatas):
226
        self._linked_formdatas = linked_formdatas
227

  
228
    def inspect_keys(self):
229
        return ['form']
230

  
231
    def __str__(self):
232
        return str(self._linked_formdatas[0]['form'].internal_id)
233

  
234
    @property
235
    def form(self):
236
        # alias when there's a single linked formdata
237
        return self._linked_formdatas[0]['form']
238

  
239
    def __getattr__(self, varname):
240
        formdata = self._linked_formdatas[0]['form']
241
        return getattr(formdata, varname)
242

  
243
    def __getitem__(self, key):
244
        return getattr(self, key)
245

  
246

  
221 247
class CreateFormdataWorkflowStatusItem(WorkflowStatusItem):
222 248
    description = _('New Form Creation')
223 249
    key = 'create_formdata'
224
-