Projet

Général

Profil

0001-backoffice-do-not-reduce-options-in-presence-of-temp.patch

Frédéric Péters, 06 décembre 2022 14:07

Télécharger (5,04 ko)

Voir les différences:

Subject: [PATCH] backoffice: do not reduce options in presence of template
 filters (#72055)

 tests/backoffice_pages/test_custom_view.py | 86 ++++++++++++++++++++++
 wcs/backoffice/management.py               | 15 +++-
 2 files changed, 100 insertions(+), 1 deletion(-)
tests/backoffice_pages/test_custom_view.py
1114 1114
    assert resp.forms['listing-settings']['filter-1-value'].value == 'false'
1115 1115
    assert resp.forms['listing-settings']['filter-1-operator'].value == 'ne'
1116 1116
    assert resp.text.count('data-link=') == 5
1117

  
1118

  
1119
def test_item_options_in_dynamic_view(pub):
1120
    pub.user_class.wipe()
1121
    create_superuser(pub)
1122
    pub.role_class.wipe()
1123
    pub.custom_view_class.wipe()
1124
    role = pub.role_class(name='test')
1125
    role.store()
1126

  
1127
    CardDef.wipe()
1128
    carddef = CardDef()
1129
    carddef.name = 'card-title'
1130
    carddef.digest_templates = {'default': '{{ form_var_foo }}'}
1131
    carddef.fields = [
1132
        fields.StringField(
1133
            id='1',
1134
            label='1st field',
1135
            type='string',
1136
        ),
1137
        fields.ItemField(
1138
            id='4',
1139
            label='4th field',
1140
            type='item',
1141
            items=['â', 'b', 'c', 'd'],
1142
            display_locations=['validation', 'summary', 'listings'],
1143
        ),
1144
    ]
1145
    carddef.workflow_roles = {'_editor': role.id}
1146
    carddef.store()
1147

  
1148
    data_class = carddef.data_class()
1149
    data_class.wipe()
1150

  
1151
    for i in range(0, 12):
1152
        carddata = data_class()
1153
        carddata.data = {
1154
            '1': 'plop%s' % (i % 2),
1155
            '4': 'a%s' % (i % 4),
1156
            '4_display': 'a%s' % (i % 4),
1157
        }
1158
        carddata.just_created()
1159
        carddata.store()
1160

  
1161
    custom_view = pub.custom_view_class()
1162
    custom_view.title = 'custom test view'
1163
    custom_view.formdef = carddef
1164
    custom_view.visibility = 'datasource'
1165
    custom_view.columns = {'list': [{'id': '1'}]}
1166
    custom_view.filters = {}
1167
    custom_view.store()
1168

  
1169
    app = login(get_app(pub))
1170
    resp = app.get('/backoffice/data/card-title/custom-test-view/')
1171

  
1172
    # enable both filters
1173
    resp.forms['listing-settings']['filter-1'].checked = True
1174
    resp.forms['listing-settings']['filter-4'].checked = True
1175
    resp = resp.forms['listing-settings'].submit()
1176
    # all used options are listed ({} is "custom value")
1177
    assert [x[0] for x in resp.forms['listing-settings']['filter-4-value'].options] == [
1178
        '',
1179
        'a0',
1180
        'a1',
1181
        'a2',
1182
        'a3',
1183
        '{}',
1184
    ]
1185

  
1186
    # plain filter, only used options are listed
1187
    resp.forms['listing-settings']['filter-1-value'].value = 'plop0'
1188
    resp.forms['listing-settings']['filter-4-value'].value = 'a0'
1189
    resp = resp.forms['listing-settings'].submit()
1190
    assert [x[0] for x in resp.forms['listing-settings']['filter-4-value'].options] == ['', 'a0', 'a2', '{}']
1191

  
1192
    # template filter, all options are listed
1193
    resp.forms['listing-settings']['filter-1-value'].value = '{{ test }}'
1194
    resp = resp.forms['listing-settings'].submit()
1195
    assert [x[0] for x in resp.forms['listing-settings']['filter-4-value'].options] == [
1196
        '',
1197
        'a0',
1198
        'a1',
1199
        'a2',
1200
        'a3',
1201
        '{}',
1202
    ]
wcs/backoffice/management.py
966 966
        # for item/items fields, get actual option values from database
967 967
        if not getattr(filter_field, 'block_field', None):
968 968
            criterias.append(NotNull(sql.get_field_id(filter_field)))
969
            if self.view and self.view.visibility == 'datasource':
970
                # for custom views used as data sources ignore criterias
971
                # that would result in an empty list of options.
972
                # (either "Nothing" or a template string)
973
                options_criterias = []
974
                for criteria in criterias:
975
                    if isinstance(criteria, Nothing):
976
                        continue
977
                    if Template.is_template_string(getattr(criteria, 'value', '')):
978
                        continue
979
                    options_criterias.append(criteria)
980
            else:
981
                options_criterias = criterias
969 982
            options = self.formdef.data_class().select_distinct(
970 983
                [sql.get_field_id(filter_field), '%s_display' % sql.get_field_id(filter_field)],
971
                clause=criterias,
984
                clause=options_criterias,
972 985
            )
973 986
        else:
974 987
            # in case of blocks, this requires digging into the jsonb columns,
975
-