Skip to content

Commit c8a8030

Browse files
Stefan Majoorknokko
authored andcommitted
Add which qualifiers are supported in error message if you use an unsupported qualifier
1 parent abc47b7 commit c8a8030

File tree

2 files changed

+26
-11
lines changed

2 files changed

+26
-11
lines changed

binder/models.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,8 +216,9 @@ def clean_value(self, qualifier, v):
216216

217217
def check_qualifier(self, qualifier):
218218
if qualifier not in self.allowed_qualifiers:
219-
raise BinderRequestError('Qualifier {} not supported for type {} ({}).'
220-
.format(qualifier, self.__class__.__name__, self.field_description()))
219+
raise BinderRequestError('Qualifier {} not supported for type {} ({}). Supported qualifiers: {}'
220+
.format(qualifier, self.__class__.__name__, self.field_description(),
221+
self.allowed_qualifiers))
221222

222223

223224

tests/test_filter_alternative_filters.py

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ def setUp(self):
2222
z1 = Zoo(id=1, name='zoo1')
2323
z1.save()
2424
z1.contacts.set([1, 2])
25-
25+
2626
z2 = Zoo(id=2, name='zoo2')
2727
z2.save()
2828
z2.contacts.set([2])
@@ -35,7 +35,7 @@ def test_filter_alternative_contacts_one_foreign_field(self):
3535
response = self.client.get('/zoo/?.all_contact_name:icontains=contact1')
3636
self.assertEqual(response.status_code, 200)
3737
returned_data = jsonloads(response.content)
38-
38+
3939
# only zoo1 contain contacts.name=contact1
4040

4141
assert_json(returned_data, {
@@ -53,7 +53,7 @@ def test_filter_alternative_contacts_multiple_foreign_fields(self):
5353
response = self.client.get('/zoo/?.all_contact_name:icontains=contact2')
5454
self.assertEqual(response.status_code, 200)
5555
returned_data = jsonloads(response.content)
56-
56+
5757
# both zoos contain contacts.name=contact2
5858

5959
assert_json(returned_data, {
@@ -71,12 +71,12 @@ def test_filter_alternative_contacts_multiple_foreign_fields(self):
7171
],
7272
EXTRA(): None, # Debug, meta, with, etc
7373
})
74-
74+
7575
def test_filter_alternative_contacts_regular_field(self):
7676
response = self.client.get('/zoo/?.all_contact_name:icontains=zoo2')
7777
self.assertEqual(response.status_code, 200)
7878
returned_data = jsonloads(response.content)
79-
79+
8080
# only zoo 2 contain .name=zoo2
8181

8282
assert_json(returned_data, {
@@ -95,7 +95,7 @@ def test_alt_filters_any(self):
9595
response = self.client.get('/zoo/?.all_contact_name:any:icontains=zoo2')
9696
self.assertEqual(response.status_code, 200)
9797
returned_data = jsonloads(response.content)
98-
98+
9999
# only zoo 2 contain .name=zoo2
100100

101101
assert_json(returned_data, {
@@ -114,7 +114,7 @@ def test_alt_filters_all(self):
114114
response = self.client.get('/zoo/?.all_contact_name:all=zoo3')
115115
self.assertEqual(response.status_code, 200)
116116
returned_data = jsonloads(response.content)
117-
117+
118118
# only zoo 3 has all related names =zoo3 (both contact.name and .name)
119119

120120
assert_json(returned_data, {
@@ -132,7 +132,7 @@ def test_alt_filters_not_any(self):
132132
response = self.client.get('/zoo/?.all_contact_name:any:not=contact2')
133133
self.assertEqual(response.status_code, 200)
134134
returned_data = jsonloads(response.content)
135-
135+
136136
# :not:any means none, so only for zoo3 NONE of the name_fields contains contact2
137137

138138
assert_json(returned_data, {
@@ -150,7 +150,7 @@ def test_alt_filters_not_all(self):
150150
response = self.client.get('/zoo/?.all_contact_name:all:not=zoo3')
151151
self.assertEqual(response.status_code, 200)
152152
returned_data = jsonloads(response.content)
153-
153+
154154
# :not:all means that it must contain a field that is NOT zoo3; all but zoo3 contains such a field
155155

156156
assert_json(returned_data, {
@@ -183,3 +183,17 @@ def test_alt_filters_both(self):
183183
response = self.client.get(f'/zoo/?.{filter_value}=zoo2')
184184
self.assertEqual(response.status_code, 418)
185185
body = jsonloads(response.content)
186+
187+
def test_not_existing_qualifier_gives_error(self):
188+
response = self.client.get(f'/zoo/?.all_contact_name:qualifier=zoo2')
189+
self.assertEqual(response.status_code, 418)
190+
body = jsonloads(response.content)
191+
message = body['message']
192+
193+
# We get a message which qualifier is incorrect
194+
self.assertIn("Qualifier qualifier not supported for type TextFieldFilter (CharField {ContactPerson}.{name}).", message)
195+
196+
# And we get a suggestion of supported qualifiers:
197+
self.assertIn("Supported qualifiers", message)
198+
self.assertIn("contains", message)
199+
self.assertIn("icontains", message)

0 commit comments

Comments
 (0)