Projet

Général

Profil

0001-cards-make-id-lookup-work-with-display-id-52647.patch

Frédéric Péters, 02 avril 2021 08:10

Télécharger (4,85 ko)

Voir les différences:

Subject: [PATCH] cards: make id lookup work with display id (#52647)

 tests/test_carddef.py   | 38 ++++++++++++++++++++++++++++++++++++++
 tests/test_workflows.py | 11 +++++++++++
 wcs/carddef.py          | 15 ++++++++++-----
 wcs/data_sources.py     |  8 +-------
 4 files changed, 60 insertions(+), 12 deletions(-)
tests/test_carddef.py
330 330
    assert tmpl.render(context) == '0'
331 331

  
332 332

  
333
def test_data_source_access_by_id(pub):
334
    CardDef.wipe()
335
    carddef = CardDef()
336
    carddef.name = 'foo'
337
    carddef.fields = [
338
        StringField(id='1', label='Test', type='string', varname='foo'),
339
    ]
340
    carddef.digest_template = '{{ form_var_foo }}'
341
    carddef.store()
342
    carddef.data_class().wipe()
343

  
344
    carddata = carddef.data_class()()
345
    carddata.data = {'1': 'hello world'}
346
    carddata.just_created()
347
    carddata.store()
348

  
349
    carddata2 = carddef.data_class()()
350
    carddata2.data = {'1': 'bye'}
351
    carddata2.just_created()
352
    carddata2.store()
353

  
354
    cards = CardDef.get_data_source_items('carddef:foo', get_by_id=carddata.id)
355
    assert len(cards) == 1
356
    assert cards[0]['text'] == 'hello world'
357

  
358
    cards = CardDef.get_data_source_items('carddef:foo', get_by_id=carddata2.id)
359
    assert len(cards) == 1
360
    assert cards[0]['text'] == 'bye'
361

  
362
    cards = CardDef.get_data_source_items('carddef:foo', get_by_id=carddata.get_display_id())
363
    assert len(cards) == 1
364
    assert cards[0]['text'] == 'hello world'
365

  
366
    cards = CardDef.get_data_source_items('carddef:foo', get_by_id=carddata2.get_display_id())
367
    assert len(cards) == 1
368
    assert cards[0]['text'] == 'bye'
369

  
370

  
333 371
def test_data_source_access_invalid_id(pub):
334 372
    CardDef.wipe()
335 373
    carddef = CardDef()
tests/test_workflows.py
4669 4669
        }
4670 4670
        carddata.just_created()
4671 4671
        carddata.store()
4672
    latest_carddata = carddata
4672 4673
    latest_carddata_id = carddata.id
4673 4674
    ds = {'type': 'carddef:%s' % carddef.url_name}
4674 4675

  
......
4713 4714
    assert formdata.data['bo1_display'] == 'baz'
4714 4715
    assert formdata.data['bo1_structured']['attr'] == 'attr2'
4715 4716

  
4717
    # reset, and get by display id value
4718
    formdata.data = {}
4719
    formdata.store()
4720
    item.fields = [{'field_id': 'bo1', 'value': latest_carddata.get_display_id()}]
4721
    item.perform(formdata)
4722
    formdata = formdef.data_class().get(formdata.id)
4723
    assert formdata.data['bo1'] == str(latest_carddata_id)
4724
    assert formdata.data['bo1_display'] == 'baz'
4725
    assert formdata.data['bo1_structured']['attr'] == 'attr2'
4726

  
4716 4727
    # reset, and get by text value
4717 4728
    formdata.data = {}
4718 4729
    formdata.store()
wcs/carddef.py
209 209
        if query:
210 210
            criterias.append(ILike('digest', query))
211 211
        if get_by_id:
212
            if int(get_by_id) >= 2 ** 31:
213
                # out of range for postgresql integer type; would raise
214
                # DataError.
215
                return []
216
            criterias.append(Equal('id', get_by_id))
212
            try:
213
                if int(get_by_id) >= 2 ** 31:
214
                    # out of range for postgresql integer type; would raise
215
                    # DataError.
216
                    return []
217
            except ValueError:
218
                # get_by_id not an integer, it could be id_display
219
                criterias.append(Equal('id_display', get_by_id))
220
            else:
221
                criterias.append(Equal('id', get_by_id))
217 222
        if get_by_text:
218 223
            criterias.append(Equal('digest', get_by_text))
219 224

  
wcs/data_sources.py
690 690
    def get_card_structured_value_by_id(self, option_id):
691 691
        from wcs.carddef import CardDef
692 692

  
693
        values = []
694
        try:
695
            int(option_id)
696
        except ValueError:
697
            pass
698
        else:
699
            values = CardDef.get_data_source_items(self.type, get_by_id=option_id)
693
        values = CardDef.get_data_source_items(self.type, get_by_id=option_id)
700 694
        if not values:
701 695
            values = CardDef.get_data_source_items(self.type, get_by_text=option_id)
702 696
            if not values:
703
-