Преглед на файлове

Wagtail API pages endpoint to respond with a 400 error (instead of 500 error) when entering an invalid value to a filter

Tijani-Dia преди 4 години
родител
ревизия
6349f4a28b
променени са 2 файла, в които са добавени 17 реда и са изтрити 1 реда
  1. 2 0
      wagtail/api/v2/filters.py
  2. 15 1
      wagtail/api/v2/tests/test_pages.py

+ 2 - 0
wagtail/api/v2/filters.py

@@ -36,6 +36,8 @@ class FieldsFilter(BaseFilterBackend):
                         value = parse_boolean(value)
                     elif isinstance(field, (models.IntegerField, models.AutoField)):
                         value = int(value)
+                    elif isinstance(field, models.ForeignKey):
+                        value = field.target_field.get_prep_value(value)
                 except ValueError as e:
                     raise BadRequestError("field filter error. '%s' is not a valid value for %s (%s)" % (
                         value,

+ 15 - 1
wagtail/api/v2/tests/test_pages.py

@@ -454,6 +454,13 @@ class TestPageListing(TestCase):
         page_id_list = self.get_page_id_list(content)
         self.assertEqual(page_id_list, [16])
 
+    def test_filtering_on_foreign_key(self):
+        response = self.get_response(type="demosite.contactpage", feed_image=7)
+        content = json.loads(response.content.decode('UTF-8'))
+
+        page_id_list = self.get_page_id_list(content)
+        self.assertEqual(page_id_list, [12])
+
     def test_filtering_on_boolean(self):
         response = self.get_response(show_in_menus='false')
         content = json.loads(response.content.decode('UTF-8'))
@@ -489,13 +496,20 @@ class TestPageListing(TestCase):
         self.assertEqual(response.status_code, 400)
         self.assertEqual(content, {'message': "query parameter is not an operation or a recognised field: not_a_field"})
 
-    def test_filtering_int_validation(self):
+    def test_filtering_id_int_validation(self):
         response = self.get_response(id='abc')
         content = json.loads(response.content.decode('UTF-8'))
 
         self.assertEqual(response.status_code, 400)
         self.assertEqual(content, {'message': "field filter error. 'abc' is not a valid value for id (invalid literal for int() with base 10: 'abc')"})
 
+    def test_filtering_foreign_key_int_validation(self):
+        response = self.get_response(type="demosite.contactpage", feed_image='abc')
+        content = json.loads(response.content.decode('UTF-8'))
+
+        self.assertEqual(response.status_code, 400)
+        self.assertEqual(content['message'][:61], "field filter error. 'abc' is not a valid value for feed_image")
+
     def test_filtering_boolean_validation(self):
         response = self.get_response(show_in_menus='abc')
         content = json.loads(response.content.decode('UTF-8'))