From 06781beb817142679808812317ab685b4e1b075f Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 7 Mar 2022 13:30:52 -0500 Subject: [PATCH] Fixes #8815: Fix display of custom object fields in table columns --- docs/release-notes/version-3.2.md | 1 + netbox/netbox/tables/columns.py | 28 ++++++++++++++++++---------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/docs/release-notes/version-3.2.md b/docs/release-notes/version-3.2.md index db52f0150..8b3574699 100644 --- a/docs/release-notes/version-3.2.md +++ b/docs/release-notes/version-3.2.md @@ -159,6 +159,7 @@ Where it is desired to limit the range of available VLANs within a group, users * [#8764](https://github.com/netbox-community/netbox/issues/8764) - Correct view name resolution for dynamic form fields * [#8791](https://github.com/netbox-community/netbox/issues/8791) - Fix display of form validation failures during device component creation * [#8792](https://github.com/netbox-community/netbox/issues/8792) - Fix creation of circuit terminations via UI +* [#8815](https://github.com/netbox-community/netbox/issues/8815) - Fix display of custom object fields in table columns ### Other Changes diff --git a/netbox/netbox/tables/columns.py b/netbox/netbox/tables/columns.py index 5ec84d5b6..6cad42514 100644 --- a/netbox/netbox/tables/columns.py +++ b/netbox/netbox/tables/columns.py @@ -361,27 +361,35 @@ class CustomFieldColumn(tables.Column): super().__init__(*args, **kwargs) + @staticmethod + def _likify_item(item): + if hasattr(item, 'get_absolute_url'): + return f'{item}' + return item + def render(self, value): - if isinstance(value, list): - return ', '.join(v for v in value) - elif self.customfield.type == CustomFieldTypeChoices.TYPE_BOOLEAN and value is True: + if self.customfield.type == CustomFieldTypeChoices.TYPE_BOOLEAN and value is True: return mark_safe('') - elif self.customfield.type == CustomFieldTypeChoices.TYPE_BOOLEAN and value is False: + if self.customfield.type == CustomFieldTypeChoices.TYPE_BOOLEAN and value is False: return mark_safe('') - elif self.customfield.type == CustomFieldTypeChoices.TYPE_URL: + if self.customfield.type == CustomFieldTypeChoices.TYPE_URL: return mark_safe(f'{value}') + if self.customfield.type == CustomFieldTypeChoices.TYPE_MULTISELECT: + return ', '.join(v for v in value) + if self.customfield.type == CustomFieldTypeChoices.TYPE_MULTIOBJECT: + return mark_safe(', '.join([ + self._likify_item(obj) for obj in self.customfield.deserialize(value) + ])) if value is not None: obj = self.customfield.deserialize(value) - if hasattr(obj, 'get_absolute_url'): - return mark_safe(f'{obj}') - return obj + return mark_safe(self._likify_item(obj)) return self.default def value(self, value): if isinstance(value, list): - return ','.join(v for v in value) + return ','.join(str(v) for v in self.customfield.deserialize(value)) if value is not None: - return value + return self.customfield.deserialize(value) return self.default