diff --git a/docs/release-notes/version-2.6.md b/docs/release-notes/version-2.6.md index a1e860272..ef0db8bb0 100644 --- a/docs/release-notes/version-2.6.md +++ b/docs/release-notes/version-2.6.md @@ -10,6 +10,7 @@ * [#3574](https://github.com/netbox-community/netbox/issues/3574) - Change `device` to `parent` in interface editing VLAN filtering logic * [#3575](https://github.com/netbox-community/netbox/issues/3575) - Restore label for comments field when bulk editing circuits * [#3582](https://github.com/netbox-community/netbox/issues/3582) - Enforce view permissions on global search results +* [#3588](https://github.com/netbox-community/netbox/issues/3588) - Enforce object-form JSON for local context data on devices and VMs ## Enhancements diff --git a/netbox/dcim/models.py b/netbox/dcim/models.py index 984bb2798..03f560a59 100644 --- a/netbox/dcim/models.py +++ b/netbox/dcim/models.py @@ -1609,6 +1609,8 @@ class Device(ChangeLoggedModel, ConfigContextModel, CustomFieldModel): def clean(self): + super().clean() + # Validate site/rack combination if self.rack and self.site != self.rack.site: raise ValidationError({ diff --git a/netbox/extras/models.py b/netbox/extras/models.py index c49192a93..d4125c327 100644 --- a/netbox/extras/models.py +++ b/netbox/extras/models.py @@ -805,7 +805,10 @@ class ConfigContext(models.Model): class ConfigContextModel(models.Model): - + """ + A model which includes local configuration context data. This local data will override any inherited data from + ConfigContexts. + """ local_context_data = JSONField( blank=True, null=True, @@ -830,6 +833,16 @@ class ConfigContextModel(models.Model): return data + def clean(self): + + 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: + raise ValidationError( + {'local_context_data': 'JSON data must be in object form. Example: {"foo": 123}'} + ) + # # Custom scripts diff --git a/netbox/virtualization/models.py b/netbox/virtualization/models.py index 57351b7f6..6fea769e5 100644 --- a/netbox/virtualization/models.py +++ b/netbox/virtualization/models.py @@ -255,6 +255,8 @@ class VirtualMachine(ChangeLoggedModel, ConfigContextModel, CustomFieldModel): def clean(self): + super().clean() + # Validate primary IP addresses interfaces = self.interfaces.all() for field in ['primary_ip4', 'primary_ip6']: