Projet

Général

Profil

0001-misc-allow-filter_by-filter_value-for-some-fake-fiel.patch

Lauréline Guérin, 10 octobre 2022 13:58

Télécharger (8,91 ko)

Voir les différences:

Subject: [PATCH 1/2] misc: allow |filter_by & |filter_value for some fake
 fields (#68943)

fake fields: status, user, internal_id, number
 tests/test_formdata.py | 84 ++++++++++++++++++++++++------------------
 wcs/variables.py       | 12 +++---
 2 files changed, 56 insertions(+), 40 deletions(-)
tests/test_formdata.py
1498 1498

  
1499 1499
    # test |filter_by_user
1500 1500
    context = pub.substitutions.get_context_variables(mode='lazy')
1501
    tmpl = Template('{{form_objects|filter_by_user:form_user|filter_by:"foo_foo"|filter_value:"foo"|count}}')
1502
    assert tmpl.render(context) == '1'
1501
    for tpl in ['filter_by_user', 'filter_by:"user"|filter_value']:
1502
        tmpl = Template('{{form_objects|%s:form_user|filter_by:"foo_foo"|filter_value:"foo"|count}}' % tpl)
1503
        assert tmpl.render(context) == '1'
1504
        tmpl = Template(
1505
            '{{form_objects|%s:form_user_email|filter_by:"foo_foo"|filter_value:"foo"|count}}' % tpl
1506
        )
1507
        assert tmpl.render(context) == '1'
1508
        tmpl = Template(
1509
            '{{form_objects|%s:form_user_nameid|filter_by:"foo_foo"|filter_value:"foo"|count}}' % tpl
1510
        )
1511
        assert tmpl.render(context) == '1'
1512
        tmpl = Template('{{form_objects|%s:"foo@bar"|filter_by:"foo_foo"|filter_value:"foo"|count}}' % tpl)
1513
        assert tmpl.render(context) == '0'
1503 1514
    assert (
1504 1515
        LazyFormData(formdata)
1505 1516
        .objects.filter_by_user(lazy_formdata.user)
......
1508 1519
        .count
1509 1520
        == 1
1510 1521
    )
1511
    tmpl = Template(
1512
        '{{form_objects|filter_by_user:form_user_email|filter_by:"foo_foo"|filter_value:"foo"|count}}'
1513
    )
1514
    assert tmpl.render(context) == '1'
1515
    tmpl = Template(
1516
        '{{form_objects|filter_by_user:form_user_nameid|filter_by:"foo_foo"|filter_value:"foo"|count}}'
1522
    assert (
1523
        LazyFormData(formdata)
1524
        .objects.filter_by('user')
1525
        .apply_filter_value(lazy_formdata.user)
1526
        .filter_by('foo_foo')
1527
        .apply_filter_value('foo')
1528
        .count
1529
        == 1
1517 1530
    )
1518
    assert tmpl.render(context) == '1'
1519
    tmpl = Template('{{form_objects|filter_by_user:"foo@bar"|filter_by:"foo_foo"|filter_value:"foo"|count}}')
1520
    assert tmpl.render(context) == '0'
1521 1531

  
1522 1532
    # test |current_user
1523 1533
    pub.get_request()._user = ()  # reset cache
......
1527 1537
    assert tmpl.render(context) == '1'
1528 1538

  
1529 1539
    # test |filter_by_status
1530
    context = pub.substitutions.get_context_variables(mode='lazy')
1531
    tmpl = Template('{{form_objects|filter_by_status:"Just Submitted"|count}}')
1532
    assert tmpl.render(context) == '7'
1533
    tmpl = Template(
1534
        '{{form_objects|filter_by_status:"Just Submitted"|filter_by:"foo_foo"|filter_value:"foo"|count}}'
1535
    )
1536
    assert tmpl.render(context) == '0'
1540
    for tpl in ['filter_by_status', 'filter_by:"status"|filter_value']:
1541
        context = pub.substitutions.get_context_variables(mode='lazy')
1542
        tmpl = Template('{{form_objects|%s:"Just Submitted"|count}}' % tpl)
1543
        assert tmpl.render(context) == '7'
1544
        tmpl = Template(
1545
            '{{form_objects|%s:"Just Submitted"|filter_by:"foo_foo"|filter_value:"foo"|count}}' % tpl
1546
        )
1547
        assert tmpl.render(context) == '0'
1537 1548
    assert LazyFormData(formdata).objects.filter_by_status('Just Submitted').count == 7
1549
    assert LazyFormData(formdata).objects.filter_by('status').apply_filter_value('Just Submitted').count == 7
1538 1550
    assert (
1539 1551
        LazyFormData(formdata)
1540
        .objects.filter_by_status('Just Submitted')
1552
        .objects.filter_by('status')
1553
        .apply_filter_value('Just Submitted')
1541 1554
        .filter_by('foo_foo')
1542 1555
        .apply_filter_value('foo')
1543 1556
        .count
1544 1557
        == 0
1545 1558
    )
1546
    assert LazyFormData(formdata).objects.filter_by_status('Finished').count == 4
1547
    assert LazyFormData(formdata).objects.filter_by_status('Unknown').count == 0
1559
    assert LazyFormData(formdata).objects.filter_by('status').apply_filter_value('Finished').count == 4
1560
    assert LazyFormData(formdata).objects.filter_by('status').apply_filter_value('Unknown').count == 0
1548 1561

  
1549 1562
    # test |pending
1550 1563
    context = pub.substitutions.get_context_variables(mode='lazy')
......
1562 1575

  
1563 1576
    # test |filter_by_internal_id
1564 1577
    context = pub.substitutions.get_context_variables(mode='lazy')
1565
    tmpl = Template('{{form_objects|filter_by_internal_id:"%s"|count}}' % finished_formdata.id)
1566
    assert tmpl.render(context) == '1'
1567
    tmpl = Template('{{form_objects|filter_by_internal_id:"%s"|count}}' % '0')
1568
    assert tmpl.render(context) == '0'
1569
    tmpl = Template('{{form_objects|filter_by_internal_id:"%s"|count}}' % 'invalid value')
1570
    assert tmpl.render(context) == '0'
1571
    assert pub.loggederror_class.count() == 4
1572
    logged_error = pub.loggederror_class.select(order_by='id')[3]
1573
    assert logged_error.summary == 'Invalid value "invalid value" for "filter_by_internal_id"'
1578
    for tpl in ['filter_by_internal_id', 'filter_by:"internal_id"|filter_value']:
1579
        tmpl = Template('{{form_objects|%s:"%s"|count}}' % (tpl, finished_formdata.id))
1580
        assert tmpl.render(context) == '1'
1581
        tmpl = Template('{{form_objects|%s:"%s"|count}}' % (tpl, '0'))
1582
        assert tmpl.render(context) == '0'
1583
        tmpl = Template('{{form_objects|%s:"%s"|count}}' % (tpl, 'invalid value'))
1584
        assert tmpl.render(context) == '0'
1585
        assert pub.loggederror_class.count() == 4
1586
        logged_error = pub.loggederror_class.select(order_by='id')[3]
1587
        assert logged_error.summary == 'Invalid value "invalid value" for filter "internal_id"'
1574 1588

  
1575 1589
    # test |filter_by_number
1576
    context = pub.substitutions.get_context_variables(mode='lazy')
1577
    tmpl = Template('{{form_objects|filter_by_number:"%s"|count}}' % finished_formdata.get_display_id())
1578
    assert tmpl.render(context) == '1'
1579
    tmpl = Template('{{form_objects|filter_by_number:"%s"|count}}' % 'invalid value')
1580
    assert tmpl.render(context) == '0'
1590
    for tpl in ['filter_by_number', 'filter_by:"number"|filter_value']:
1591
        tmpl = Template('{{form_objects|%s:"%s"|count}}' % (tpl, finished_formdata.get_display_id()))
1592
        assert tmpl.render(context) == '1'
1593
        tmpl = Template('{{form_objects|%s:"%s"|count}}' % (tpl, 'invalid value'))
1594
        assert tmpl.render(context) == '0'
1581 1595

  
1582 1596
    # test |is_empty
1583 1597
    tmpl = Template('{{form_objects|pending|is_empty}}')
wcs/variables.py
115 115
    def current_user(self):  # filter on current user
116 116
        return self.filter_by_user(get_request().user)
117 117

  
118
    def filter_by_user(self, user):
118
    def filter_by_user(self, user, op='eq'):
119 119
        if isinstance(user, str):
120 120
            user = get_publisher().user_class.lookup_by_string(user)
121 121
        if not user:
122 122
            return self.none()
123 123
        return self._clone(self._criterias + [Equal('user_id', str(user.id))])
124 124

  
125
    def filter_by_status(self, status):
125
    def filter_by_status(self, status, op='eq'):
126 126
        for wfs in self._formdef.workflow.possible_status:
127 127
            if wfs.name == status:
128 128
                wf_status = 'wf-%s' % wfs.id
......
194 194
        qs.pending_attr = attribute
195 195
        return qs
196 196

  
197
    def filter_by_internal_id(self, value):
197
    def filter_by_internal_id(self, value, op='eq'):
198 198
        try:
199 199
            int(value)
200 200
        except ValueError:
201 201
            get_publisher().record_error(
202
                _('Invalid value "%s" for "filter_by_internal_id"') % (value),
202
                _('Invalid value "%s" for filter "internal_id"') % (value),
203 203
                formdata=self._formdata,
204 204
            )
205 205
            return self.none()
206 206
        return self._clone(self._criterias + [Equal('id', str(value))])
207 207

  
208
    def filter_by_number(self, value):
208
    def filter_by_number(self, value, op='eq'):
209 209
        return self._clone(self._criterias + [Equal('id_display', str(value))])
210 210

  
211 211
    def get_fields(self, key):
......
233 233
    def apply_filter_value(self, value, exclude=False):
234 234
        assert self.pending_attr
235 235
        op = 'ne' if exclude else getattr(self, 'pending_op', 'eq')
236
        if self.pending_attr in ['status', 'user', 'internal_id', 'number']:
237
            return getattr(self, 'filter_by_%s' % self.pending_attr)(value, op)
236 238

  
237 239
        fields = list(self.get_fields(self.pending_attr))
238 240
        if not fields:
239
-