Просмотр исходного кода

Fixes #18838: Correctly reject invalid falsy local context data (#18860)

* Correctly reject invalid falsy local context data.

* move tests
Fabi 11 месяцев назад
Родитель
Сommit
19d1282683
2 измененных файлов с 29 добавлено и 1 удалено
  1. 1 1
      netbox/extras/models/configs.py
  2. 28 0
      netbox/extras/tests/test_models.py

+ 1 - 1
netbox/extras/models/configs.py

@@ -200,7 +200,7 @@ class ConfigContextModel(models.Model):
         super().clean()
 
         # Verify that JSON data is provided as an object
-        if self.local_context_data and type(self.local_context_data) is not dict:
+        if self.local_context_data is not None and type(self.local_context_data) is not dict:
             raise ValidationError(
                 {'local_context_data': _('JSON data must be in object form. Example:') + ' {"foo": 123}'}
             )

+ 28 - 0
netbox/extras/tests/test_models.py

@@ -1,3 +1,4 @@
+from django.forms import ValidationError
 from django.test import TestCase
 
 from core.models import ObjectType
@@ -478,3 +479,30 @@ class ConfigContextTest(TestCase):
         annotated_queryset = Device.objects.filter(name=device.name).annotate_config_context_data()
         self.assertEqual(ConfigContext.objects.get_for_object(device).count(), 2)
         self.assertEqual(device.get_config_context(), annotated_queryset[0].get_config_context())
+
+    def test_valid_local_context_data(self):
+        device = Device.objects.first()
+        device.local_context_data = None
+        device.clean()
+
+        device.local_context_data = {"foo": "bar"}
+        device.clean()
+
+    def test_invalid_local_context_data(self):
+        device = Device.objects.first()
+
+        device.local_context_data = ""
+        with self.assertRaises(ValidationError):
+            device.clean()
+
+        device.local_context_data = 0
+        with self.assertRaises(ValidationError):
+            device.clean()
+
+        device.local_context_data = False
+        with self.assertRaises(ValidationError):
+            device.clean()
+
+        device.local_context_data = 'foo'
+        with self.assertRaises(ValidationError):
+            device.clean()