Projet

Général

Profil

0001-backoffice-fix-filtering-on-backoffice-item-s-fields.patch

Frédéric Péters, 18 décembre 2019 16:02

Télécharger (4,92 ko)

Voir les différences:

Subject: [PATCH] backoffice: fix filtering on backoffice item/s fields
 (#38627)

 tests/test_backoffice_pages.py | 76 ++++++++++++++++++++++++++++++++++
 wcs/backoffice/management.py   |  5 ++-
 2 files changed, 79 insertions(+), 2 deletions(-)
tests/test_backoffice_pages.py
832 832
    assert [x[0] for x in resp.form['filter-4-value'].options] == ['', 'a', 'b']
833 833
    assert [x[0] for x in resp.form['filter-5-value'].options] == ['', 'A', 'B', 'C']
834 834

  
835
def test_backoffice_bofield_item_filter(pub):
836
    create_superuser(pub)
837
    create_environment(pub)
838
    formdef = FormDef.get_by_urlname('form-title')
839
    workflow = Workflow.get_default_workflow()
840
    workflow.id = '2'
841
    workflow.backoffice_fields_formdef = WorkflowBackofficeFieldsFormDef(workflow)
842
    workflow.backoffice_fields_formdef.fields = [
843
            fields.ItemField(id='bo0-1', label='4th field', type='item',
844
                items=['â', 'b', 'c', 'd'],
845
                display_locations=['validation', 'summary', 'listings'])
846
    ]
847
    workflow.store()
848
    formdef.workflow_id = workflow.id
849
    formdef.store()
850

  
851
    for i, formdata in enumerate(formdef.data_class().select()):
852
        if i%4 == 0:
853
            formdata.data['bo0-1'] = 'â'
854
            formdata.data['bo0-1_display'] = 'â'
855
        elif i%4 == 1:
856
            formdata.data['bo0-1'] = 'b'
857
            formdata.data['bo0-1_display'] = 'b'
858
        elif i%4 == 2:
859
            formdata.data['bo0-1'] = 'd'
860
            formdata.data['bo0-1_display'] = 'd'
861
        formdata.store()
862

  
863
    app = login(get_app(pub))
864
    resp = app.get('/backoffice/management/form-title/')
865
    resp.form['filter-bo0-1'].checked = True
866
    resp = resp.form.submit()
867

  
868
    assert resp.form['filter-bo0-1-value'].value == ''
869

  
870
    resp.form['filter-bo0-1-value'].value = 'â'
871
    resp = resp.form.submit()
872
    assert resp.text.count(u'<td>â</td>') > 0
873
    assert resp.text.count(u'<td>b</td>') == 0
874
    assert resp.text.count(u'<td>d</td>') == 0
875

  
876
    resp.form['filter-bo0-1-value'].value = 'b'
877
    resp = resp.form.submit()
878
    assert resp.text.count(u'<td>â</td>') == 0
879
    assert resp.text.count(u'<td>b</td>') > 0
880
    assert resp.text.count(u'<td>d</td>') == 0
881

  
882
    if not pub.is_using_postgresql():
883
        # in pickle all options are always displayed
884
        resp.form['filter-bo0-1-value'].value = 'c'
885
        resp = resp.form.submit()
886
        assert resp.text.count(u'<td>â</td>') == 0
887
        assert resp.text.count(u'<td>b</td>') == 0
888
        assert resp.text.count(u'<td>c</td>') == 0
889

  
890
    else:
891
        # in postgresql, option 'c' is never used so not even listed
892
        with pytest.raises(ValueError):
893
            resp.form['filter-bo0-1-value'].value = 'c'
894

  
895
        # check json view used to fill select filters from javascript
896
        resp2 = app.get(resp.request.path + 'filter-options?filter_field_id=bo0-1&' + resp.request.query_string)
897
        assert [x['id'] for x in resp2.json['data']] == [u'â', u'b', u'd']
898
        resp2 = app.get(resp.request.path + 'filter-options?filter_field_id=bo0-1&_search=d&' + resp.request.query_string)
899
        assert [x['id'] for x in resp2.json['data']] == ['d']
900

  
901
        for status in ('all', 'waiting', 'pending', 'done', 'accepted'):
902
            resp.form['filter'] = status
903
            resp = resp.form.submit()
904
            resp2 = app.get(resp.request.path + 'filter-options?filter_field_id=bo0-1&' + resp.request.query_string)
905
            if status == 'accepted':
906
                assert [x['id'] for x in resp2.json['data']] == []
907
            else:
908
                assert [x['id'] for x in resp2.json['data']] == [u'â', u'b', u'd']
909

  
910

  
835 911
def test_backoffice_items_filter(pub):
836 912
    create_superuser(pub)
837 913
    create_environment(pub)
wcs/backoffice/management.py
1070 1070
            criterias.append(Contains('status', statuses))
1071 1071
        else:
1072 1072
            criterias.append(Equal('status', 'wf-%s' % selected_filter))
1073
        criterias.append(NotNull('f%s' % filter_field.id))
1073
        from wcs import sql
1074
        criterias.append(NotNull(sql.get_field_id(filter_field)))
1074 1075
        options = self.formdef.data_class().select_distinct(
1075
                ['f%s' % filter_field.id, 'f%s_display' % filter_field.id],
1076
                [sql.get_field_id(filter_field), '%s_display' % sql.get_field_id(filter_field)],
1076 1077
                clause=criterias)
1077 1078

  
1078 1079
        if filter_field.type == 'items':
1079
-