Projet

Général

Profil

0001-misc-filter_value-exclude_value-with-block-fields-58.patch

Lauréline Guérin, 08 juillet 2022 15:04

Télécharger (8,44 ko)

Voir les différences:

Subject: [PATCH] misc: |filter_value & |exclude_value with block fields
 (#58452)

 tests/test_formdata.py | 132 +++++++++++++++++++++++++++++++++++++++++
 wcs/variables.py       |  13 +++-
 2 files changed, 143 insertions(+), 2 deletions(-)
tests/test_formdata.py
3457 3457
    assert formdata.data.get('1_display') is None
3458 3458

  
3459 3459

  
3460
def test_formdata_filtering_on_block_fields(pub):
3461
    if not pub.is_using_postgresql():
3462
        pytest.skip('this requires SQL')
3463

  
3464
    NamedDataSource.wipe()
3465
    data_source = NamedDataSource(name='foobar')
3466
    data_source.data_source = {
3467
        'type': 'formula',
3468
        'value': repr([{'id': '1', 'text': 'foo'}, {'id': '2', 'text': 'bar'}]),
3469
    }
3470
    data_source.store()
3471

  
3472
    BlockDef.wipe()
3473
    block = BlockDef()
3474
    block.name = 'foobar'
3475
    block.fields = [
3476
        fields.StringField(id='1', label='String', type='string', varname='string'),
3477
        fields.ItemField(id='2', label='Item', type='item', data_source={'type': 'foobar'}, varname='item'),
3478
        fields.BoolField(id='3', label='Bool', type='bool', varname='bool'),
3479
        fields.DateField(id='4', label='Date', type='date', varname='date'),
3480
        fields.EmailField(id='5', label='Email', type='email', varname='email'),
3481
    ]
3482
    block.store()
3483

  
3484
    FormDef.wipe()
3485
    formdef = FormDef()
3486
    formdef.name = 'test'
3487
    formdef.fields = [
3488
        fields.BlockField(id='0', label='Block Data', varname='blockdata', type='block:foobar', max_items=3),
3489
    ]
3490
    formdef.store()
3491

  
3492
    data_class = formdef.data_class()
3493
    data_class.wipe()
3494

  
3495
    for i in range(11):
3496
        formdata = data_class()
3497
        if i < 10:  # None values for the last one
3498
            formdata.data = {
3499
                '0': {
3500
                    'data': [
3501
                        {
3502
                            '1': 'plop%s' % i,
3503
                            '2': '1' if i % 2 else '2',
3504
                            '2_display': 'foo' if i % 2 else 'bar',
3505
                            '2_structured': 'XXX' if i % 2 else 'YYY',
3506
                            '3': bool(i % 2),
3507
                            '4': '2021-06-%02d' % (i + 1),
3508
                            '5': 'a@localhost' if i % 2 else 'b@localhost',
3509
                        },
3510
                    ],
3511
                    'schema': {},  # not important here
3512
                },
3513
                '0_display': 'hello',
3514
            }
3515
            if i == 0:
3516
                formdata.data['0']['data'].append(
3517
                    {
3518
                        '1': 'plop%s' % (i + 1),
3519
                        '2': '1',
3520
                        '2_display': 'foo',
3521
                        '2_structured': 'XXX',
3522
                        '3': True,
3523
                        '4': '2021-06-02',
3524
                        '5': 'a@localhost',
3525
                    },
3526
                )
3527
        formdata.just_created()
3528
        formdata.jump_status('new')
3529
        formdata.store()
3530

  
3531
    context = pub.substitutions.get_context_variables(mode='lazy')
3532

  
3533
    # string
3534
    tmpl = Template('{{forms|objects:"test"|filter_by:"blockdata_string"|filter_value:"plop0"|count}}')
3535
    assert tmpl.render(context) == '1'
3536
    tmpl = Template('{{forms|objects:"test"|filter_by:"blockdata_string"|filter_value:"plop1"|count}}')
3537
    assert tmpl.render(context) == '2'
3538
    tmpl = Template('{{forms|objects:"test"|filter_by:"blockdata_string"|filter_value:"plop10"|count}}')
3539
    assert tmpl.render(context) == '0'
3540
    tmpl = Template('{{forms|objects:"test"|filter_by:"blockdata_string"|exclude_value:"plop0"|count}}')
3541
    assert tmpl.render(context) == '10'
3542
    tmpl = Template('{{forms|objects:"test"|filter_by:"blockdata_string"|exclude_value:"plop1"|count}}')
3543
    assert tmpl.render(context) == '9'
3544
    tmpl = Template('{{forms|objects:"test"|filter_by:"blockdata_string"|exclude_value:"plop10"|count}}')
3545
    assert tmpl.render(context) == '11'
3546
    # item
3547
    tmpl = Template('{{forms|objects:"test"|filter_by:"blockdata_item"|filter_value:"1"|count}}')
3548
    assert tmpl.render(context) == '6'
3549
    tmpl = Template('{{forms|objects:"test"|filter_by:"blockdata_item"|filter_value:"2"|count}}')
3550
    assert tmpl.render(context) == '5'
3551
    tmpl = Template('{{forms|objects:"test"|filter_by:"blockdata_item"|filter_value:"3"|count}}')
3552
    assert tmpl.render(context) == '0'
3553
    tmpl = Template('{{forms|objects:"test"|filter_by:"blockdata_item"|exclude_value:"1"|count}}')
3554
    assert tmpl.render(context) == '5'
3555
    tmpl = Template('{{forms|objects:"test"|filter_by:"blockdata_item"|exclude_value:"2"|count}}')
3556
    assert tmpl.render(context) == '6'
3557
    tmpl = Template('{{forms|objects:"test"|filter_by:"blockdata_item"|exclude_value:"3"|count}}')
3558
    assert tmpl.render(context) == '11'
3559
    # bool
3560
    tmpl = Template('{{forms|objects:"test"|filter_by:"blockdata_bool"|filter_value:"true"|count}}')
3561
    assert tmpl.render(context) == '6'
3562
    tmpl = Template('{{forms|objects:"test"|filter_by:"blockdata_bool"|filter_value:"false"|count}}')
3563
    assert tmpl.render(context) == '5'
3564
    tmpl = Template('{{forms|objects:"test"|filter_by:"blockdata_bool"|exclude_value:"true"|count}}')
3565
    assert tmpl.render(context) == '5'
3566
    tmpl = Template('{{forms|objects:"test"|filter_by:"blockdata_bool"|exclude_value:"false"|count}}')
3567
    assert tmpl.render(context) == '6'
3568
    # date
3569
    tmpl = Template('{{forms|objects:"test"|filter_by:"blockdata_date"|filter_value:"2021-06-01"|count}}')
3570
    assert tmpl.render(context) == '1'
3571
    tmpl = Template('{{forms|objects:"test"|filter_by:"blockdata_date"|filter_value:"2021-06-02"|count}}')
3572
    assert tmpl.render(context) == '2'
3573
    tmpl = Template('{{forms|objects:"test"|filter_by:"blockdata_date"|exclude_value:"2021-06-01"|count}}')
3574
    assert tmpl.render(context) == '10'
3575
    tmpl = Template('{{forms|objects:"test"|filter_by:"blockdata_date"|exclude_value:"2021-06-02"|count}}')
3576
    assert tmpl.render(context) == '9'
3577
    # email
3578
    tmpl = Template('{{forms|objects:"test"|filter_by:"blockdata_email"|filter_value:"a@localhost"|count}}')
3579
    assert tmpl.render(context) == '6'
3580
    tmpl = Template('{{forms|objects:"test"|filter_by:"blockdata_email"|filter_value:"b@localhost"|count}}')
3581
    assert tmpl.render(context) == '5'
3582
    tmpl = Template('{{forms|objects:"test"|filter_by:"blockdata_email"|filter_value:"c@localhost"|count}}')
3583
    assert tmpl.render(context) == '0'
3584
    tmpl = Template('{{forms|objects:"test"|filter_by:"blockdata_email"|exclude_value:"a@localhost"|count}}')
3585
    assert tmpl.render(context) == '5'
3586
    tmpl = Template('{{forms|objects:"test"|filter_by:"blockdata_email"|exclude_value:"b@localhost"|count}}')
3587
    assert tmpl.render(context) == '6'
3588
    tmpl = Template('{{forms|objects:"test"|filter_by:"blockdata_email"|exclude_value:"c@localhost"|count}}')
3589
    assert tmpl.render(context) == '11'
3590

  
3591

  
3460 3592
def test_items_field_getlist(pub):
3461 3593
    NamedDataSource.wipe()
3462 3594
    data_source = NamedDataSource(name='foobar')
wcs/variables.py
187 187
        return self._clone(self._criterias + [Equal('id_display', str(value))])
188 188

  
189 189
    def get_fields(self, key):
190
        for field in self._formdef.get_all_fields():
191
            if getattr(field, 'varname', None) == key:
190
        for field in self._formdef.iter_fields(include_block_fields=True):
191
            if getattr(field, 'block_field', None):
192
                if field.key == 'items':
193
                    # not yet
194
                    continue
195
                if not get_publisher().is_using_postgresql():
196
                    continue
197
            if field.contextual_varname == key:
192 198
                yield field
193 199

  
194 200
    def get_field(self, key):
......
216 222
                    formdata=self._formdata,
217 223
                )
218 224
                return self.none()
225
            if value is not None and fields[0].convert_value_to_str and get_publisher().is_using_postgresql():
226
                # in block fields, we store strings
227
                value = fields[0].convert_value_to_str(value)
219 228

  
220 229
        from wcs import sql
221 230

  
222
-