From 0885333b116640f6164f084a22b6c562d445881d Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Fri, 18 Nov 2022 11:24:14 -0500 Subject: [PATCH] Fixes #9223: Fix serialization of array field values in change log --- docs/release-notes/version-3.3.md | 1 + netbox/netbox/settings.py | 4 ++++ netbox/utilities/serializers/json.py | 19 +++++++++++++++++++ 3 files changed, 24 insertions(+) create mode 100644 netbox/utilities/serializers/json.py diff --git a/docs/release-notes/version-3.3.md b/docs/release-notes/version-3.3.md index 0b84bf8da..d99dc7099 100644 --- a/docs/release-notes/version-3.3.md +++ b/docs/release-notes/version-3.3.md @@ -9,6 +9,7 @@ ### Bug Fixes * [#6389](https://github.com/netbox-community/netbox/issues/6389) - Call `snapshot()` on object when processing deletions +* [#9223](https://github.com/netbox-community/netbox/issues/9223) - Fix serialization of array field values in change log * [#9878](https://github.com/netbox-community/netbox/issues/9878) - Fix spurious error message when rendering REST API docs * [#10236](https://github.com/netbox-community/netbox/issues/10236) - Fix TypeError exception when viewing PDU configured for three-phase power * [#10579](https://github.com/netbox-community/netbox/issues/10579) - Mark cable traces terminating to a provider network as complete diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index ff0551fff..fa5480e19 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -445,6 +445,10 @@ EXEMPT_PATHS = ( f'/{BASE_PATH}metrics', ) +SERIALIZATION_MODULES = { + 'json': 'utilities.serializers.json', +} + # # Sentry diff --git a/netbox/utilities/serializers/json.py b/netbox/utilities/serializers/json.py new file mode 100644 index 000000000..d2e682678 --- /dev/null +++ b/netbox/utilities/serializers/json.py @@ -0,0 +1,19 @@ +from django.contrib.postgres.fields import ArrayField +from django.core.serializers.json import Serializer as Serializer_ +from django.utils.encoding import is_protected_type + + +class Serializer(Serializer_): + """ + Custom extension of Django's JSON serializer to support ArrayFields (see + https://code.djangoproject.com/ticket/33974). + """ + def _value_from_field(self, obj, field): + value = field.value_from_object(obj) + + # Handle ArrayFields of protected types + if type(field) is ArrayField: + if not value or is_protected_type(value[0]): + return value + + return value if is_protected_type(value) else field.value_to_string(obj)