Projet

Général

Profil

0002-api-expose-card-relations-in-schema-58448.patch

Lauréline Guérin, 22 novembre 2021 16:59

Télécharger (10,1 ko)

Voir les différences:

Subject: [PATCH 2/2] api: expose card relations in schema (#58448)

 tests/api/test_carddef.py | 159 ++++++++++++++++++++++++++++++++++++++
 wcs/formdef.py            |  35 +++++++++
 2 files changed, 194 insertions(+)
tests/api/test_carddef.py
13 13
from wcs import fields, qommon
14 14
from wcs.api_access import ApiAccess
15 15
from wcs.api_utils import sign_url
16
from wcs.blocks import BlockDef
16 17
from wcs.carddef import CardDef
17 18
from wcs.categories import CardDefCategory
18 19
from wcs.data_sources import NamedDataSource
20
from wcs.formdef import FormDef
19 21
from wcs.qommon.afterjobs import AfterJob
20 22
from wcs.qommon.http_request import HTTPRequest
21 23
from wcs.qommon.upload_storage import PicklableUpload
......
222 224
    resp = get_app(pub).get('/api/cards/test/@schema', status=403)
223 225

  
224 226

  
227
def test_carddef_schema_relations(pub):
228
    FormDef.wipe()
229
    CardDef.wipe()
230
    BlockDef.wipe()
231

  
232
    formdef = FormDef()
233
    formdef.name = 'formdef'
234
    formdef.fields = [
235
        fields.ItemField(
236
            id='0', label='unknown', type='item', varname='unknown', data_source={'type': 'carddef:unknown'}
237
        ),
238
        fields.ItemField(id='1', label='card1', type='item', data_source={'type': 'carddef:carddef-1'}),
239
        fields.ItemField(
240
            id='2', label='card2', type='item', varname='card2', data_source={'type': 'carddef:carddef-2'}
241
        ),
242
        fields.ItemsField(id='3', label='cards1', type='items', data_source={'type': 'carddef:carddef-1'}),
243
        fields.ItemsField(
244
            id='4', label='cards2', type='items', varname='cards2', data_source={'type': 'carddef:carddef-2'}
245
        ),
246
    ]
247
    formdef.store()
248

  
249
    carddef1 = CardDef()
250
    carddef1.name = 'carddef 1'
251
    carddef1.fields = [
252
        fields.ItemField(
253
            id='0', label='unknown', type='item', varname='unknown', data_source={'type': 'carddef:unknown'}
254
        ),
255
        fields.ItemField(
256
            id='1', label='card2', type='item', varname='card2', data_source={'type': 'carddef:carddef-2'}
257
        ),
258
        fields.ItemField(
259
            id='2', label='card3', type='item', data_source={'type': 'carddef:carddef-3'}
260
        ),  # no varname
261
        fields.ItemsField(
262
            id='3', label='cards2', type='items', varname='cards2', data_source={'type': 'carddef:carddef-2'}
263
        ),
264
        fields.ItemsField(
265
            id='4', label='cards3', type='items', data_source={'type': 'carddef:carddef-3'}
266
        ),  # no varname
267
    ]
268
    carddef1.store()
269

  
270
    carddef2 = CardDef()
271
    carddef2.name = 'carddef 2'
272
    carddef2.store()
273

  
274
    carddef3 = CardDef()
275
    carddef3.name = 'carddef 3'
276
    carddef3.fields = [
277
        # no varnames
278
        fields.ItemField(id='1', label='card2', type='item', data_source={'type': 'carddef:carddef-2'}),
279
        fields.ItemsField(id='2', label='cards2', type='items', data_source={'type': 'carddef:carddef-2'}),
280
    ]
281
    carddef3.store()
282

  
283
    resp = get_app(pub).get(sign_uri('/api/cards/carddef-1/@schema'), status=200)
284
    assert resp.json['relations'] == [
285
        {'varname': 'card2', 'type': 'item', 'obj': 'carddef:carddef-2', 'reverse': False},
286
        {'varname': 'cards2', 'type': 'items', 'obj': 'carddef:carddef-2', 'reverse': False},
287
    ]
288
    resp = get_app(pub).get(sign_uri('/api/cards/carddef-2/@schema'), status=200)
289
    assert resp.json['relations'] == [
290
        {'varname': 'card2', 'type': 'item', 'obj': 'carddef:carddef-1', 'reverse': True},
291
        {'varname': 'cards2', 'type': 'items', 'obj': 'carddef:carddef-1', 'reverse': True},
292
    ]
293

  
294
    # custom views ?
295
    carddef1.fields[1] = fields.ItemField(
296
        id='1', label='card2', type='item', varname='card2', data_source={'type': 'carddef:carddef-2:view'}
297
    )
298
    carddef1.store()
299
    resp = get_app(pub).get(sign_uri('/api/cards/carddef-1/@schema'), status=200)
300
    assert resp.json['relations'] == [
301
        {'varname': 'card2', 'type': 'item', 'obj': 'carddef:carddef-2', 'reverse': False},
302
        {'varname': 'cards2', 'type': 'items', 'obj': 'carddef:carddef-2', 'reverse': False},
303
    ]
304
    resp = get_app(pub).get(sign_uri('/api/cards/carddef-2/@schema'), status=200)
305
    assert resp.json['relations'] == [
306
        {'varname': 'card2', 'type': 'item', 'obj': 'carddef:carddef-1', 'reverse': True},
307
        {'varname': 'cards2', 'type': 'items', 'obj': 'carddef:carddef-1', 'reverse': True},
308
    ]
309

  
310
    # circular relation ?
311
    carddef1.fields = [
312
        fields.ItemField(
313
            id='1', label='card1', type='item', varname='card1', data_source={'type': 'carddef:carddef-1'}
314
        ),
315
    ]
316
    carddef1.store()
317
    resp = get_app(pub).get(sign_uri('/api/cards/carddef-1/@schema'), status=200)
318
    assert resp.json['relations'] == [
319
        {'varname': 'card1', 'type': 'item', 'obj': 'carddef:carddef-1', 'reverse': False},
320
        {'varname': 'card1', 'type': 'item', 'obj': 'carddef:carddef-1', 'reverse': True},
321
    ]
322
    resp = get_app(pub).get(sign_uri('/api/cards/carddef-2/@schema'), status=200)
323
    assert resp.json['relations'] == []
324

  
325
    # block field
326
    block1 = BlockDef()
327
    block1.name = 'block 1'
328
    block1.fields = [
329
        fields.ItemField(
330
            id='0', label='unknown', type='item', varname='unknown', data_source={'type': 'carddef:unknown'}
331
        ),
332
        fields.ItemField(
333
            id='1',
334
            label='card1',
335
            type='item',
336
            varname='card1',
337
            data_source={'type': 'carddef:carddef-1'},
338
        ),
339
        fields.ItemField(
340
            id='2',
341
            label='card2',
342
            type='item',
343
            varname='card2',
344
            data_source={'type': 'carddef:carddef-2'},
345
        ),
346
        fields.ItemsField(
347
            id='3', label='cards1', type='items', varname='cards1', data_source={'type': 'carddef:carddef-1'}
348
        ),
349
        fields.ItemsField(
350
            id='4', label='cards2', type='items', varname='cards2', data_source={'type': 'carddef:carddef-2'}
351
        ),
352
    ]
353
    block1.store()
354

  
355
    # no varname on block field
356
    carddef1.fields = [fields.BlockField(id='1', label='block', type='block:%s' % block1.slug)]
357
    carddef1.store()
358
    resp = get_app(pub).get(sign_uri('/api/cards/carddef-1/@schema'), status=200)
359
    assert resp.json['relations'] == []
360
    resp = get_app(pub).get(sign_uri('/api/cards/carddef-2/@schema'), status=200)
361
    assert resp.json['relations'] == []
362

  
363
    # with varname
364
    carddef1.fields = [
365
        fields.BlockField(id='1', label='block', varname='block1', type='block:%s' % block1.slug)
366
    ]
367
    carddef1.store()
368
    resp = get_app(pub).get(sign_uri('/api/cards/carddef-1/@schema'), status=200)
369
    assert resp.json['relations'] == [
370
        {'varname': 'block1_card1', 'type': 'item', 'obj': 'carddef:carddef-1', 'reverse': False},
371
        {'varname': 'block1_card1', 'type': 'item', 'obj': 'carddef:carddef-1', 'reverse': True},
372
        {'varname': 'block1_card2', 'type': 'item', 'obj': 'carddef:carddef-2', 'reverse': False},
373
        {'varname': 'block1_cards1', 'type': 'items', 'obj': 'carddef:carddef-1', 'reverse': False},
374
        {'varname': 'block1_cards1', 'type': 'items', 'obj': 'carddef:carddef-1', 'reverse': True},
375
        {'varname': 'block1_cards2', 'type': 'items', 'obj': 'carddef:carddef-2', 'reverse': False},
376
    ]
377
    resp = get_app(pub).get(sign_uri('/api/cards/carddef-2/@schema'), status=200)
378
    assert resp.json['relations'] == [
379
        {'varname': 'block1_card2', 'type': 'item', 'obj': 'carddef:carddef-1', 'reverse': True},
380
        {'varname': 'block1_cards2', 'type': 'items', 'obj': 'carddef:carddef-1', 'reverse': True},
381
    ]
382

  
383

  
225 384
@pytest.mark.parametrize('auth', ['signature', 'http-basic'])
226 385
def test_cards_import_csv(pub, local_user, auth):
227 386
    pub.role_class.wipe()
wcs/formdef.py
949 949
        return d
950 950

  
951 951
    def export_to_json(self, include_id=False, indent=None):
952
        from wcs.carddef import CardDef
953

  
952 954
        charset = get_publisher().site_charset
953 955
        root = {}
954 956
        root['name'] = force_text(self.name, charset)
......
993 995
        if self.required_authentication_contexts:
994 996
            root['required_authentication_contexts'] = self.required_authentication_contexts[:]
995 997

  
998
        if isinstance(self, CardDef):
999
            card_relations = []
1000
            for objdef, relations in self.build_relations_by_ref().items():
1001
                print(objdef, relations)
1002
                if not objdef.startswith('carddef:'):
1003
                    continue
1004
                try:
1005
                    CardDef.get_by_urlname(objdef.split(':')[1])
1006
                except KeyError:
1007
                    continue
1008
                for relation in relations:
1009
                    if not relation['varname']:
1010
                        continue
1011
                    card_relations.append(
1012
                        {
1013
                            'varname': relation['varname'],
1014
                            'type': relation['type'],
1015
                            'obj': objdef,
1016
                            'reverse': False,
1017
                        }
1018
                    )
1019

  
1020
            for relation in self.reverse_relations or []:
1021
                if not relation['obj'].startswith('carddef:'):
1022
                    continue
1023
                if not relation['varname']:
1024
                    continue
1025
                rel = relation.copy()
1026
                rel.update({'reverse': True})
1027
                card_relations.append(rel)
1028

  
1029
            root['relations'] = sorted(card_relations, key=itemgetter('varname'))
1030

  
996 1031
        return json.dumps(root, indent=indent, sort_keys=True, cls=JSONEncoder)
997 1032

  
998 1033
    @classmethod
999
-