From d70140f148c4972a7f1a1aa5fef4066c3c26bfdf Mon Sep 17 00:00:00 2001 From: Sander Steffann Date: Wed, 8 Jul 2020 22:20:20 +0200 Subject: [PATCH 1/2] Fix typo in format string --- netbox/dcim/api/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index 924f14a93..ea875d8c8 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -376,7 +376,7 @@ class DeviceViewSet(CustomFieldModelViewSet): if device.platform is None: raise ServiceUnavailable("No platform is configured for this device.") if not device.platform.napalm_driver: - raise ServiceUnavailable("No NAPALM driver is configured for this device's platform ().".format( + raise ServiceUnavailable("No NAPALM driver is configured for this device's platform {}.".format( device.platform )) From 683ba5eed31f22294a0d9f97408be05d67dba950 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 9 Jul 2020 16:35:02 -0400 Subject: [PATCH 2/2] #4835: Cleanup and improved error handling --- docs/release-notes/version-2.8.md | 2 +- netbox/utilities/forms.py | 29 +++++++---------------------- 2 files changed, 8 insertions(+), 23 deletions(-) diff --git a/docs/release-notes/version-2.8.md b/docs/release-notes/version-2.8.md index 7b6d545ee..05487516f 100644 --- a/docs/release-notes/version-2.8.md +++ b/docs/release-notes/version-2.8.md @@ -1,6 +1,6 @@ # NetBox v2.8 -## v2.8.7 (FUTURE) +## v2.8.8 (FUTURE) ### Bug Fixes diff --git a/netbox/utilities/forms.py b/netbox/utilities/forms.py index 9ed0cca5c..539347aaa 100644 --- a/netbox/utilities/forms.py +++ b/netbox/utilities/forms.py @@ -594,16 +594,6 @@ class DynamicModelChoiceMixin: filter = django_filters.ModelChoiceFilter widget = APISelect - def filter_queryset(self, data): - field_name = getattr(self, 'to_field_name') or 'pk' - # If multiple values have been provided, use only the last. - if type(data) in (list, tuple): - data = data[-1] - filter = self.filter( - field_name=field_name - ) - return filter.filter(self.queryset, data) - def get_bound_field(self, form, field_name): bound_field = BoundField(form, self, field_name) @@ -611,7 +601,13 @@ class DynamicModelChoiceMixin: # will be populated on-demand via the APISelect widget. data = bound_field.value() if data: - self.queryset = self.filter_queryset(data) + field_name = getattr(self, 'to_field_name') or 'pk' + filter = self.filter(field_name=field_name) + try: + self.queryset = filter.filter(self.queryset, data) + except TypeError: + # Catch any error caused by invalid initial data passed from the user + self.queryset = self.queryset.none() else: self.queryset = self.queryset.none() @@ -641,17 +637,6 @@ class DynamicModelMultipleChoiceField(DynamicModelChoiceMixin, forms.ModelMultip filter = django_filters.ModelMultipleChoiceFilter widget = APISelectMultiple - def filter_queryset(self, data): - field_name = getattr(self, 'to_field_name') or 'pk' - # Normalize data to a list - if type(data) not in (list, tuple): - data = [data] - filter = self.filter( - field_name=field_name, - lookup_expr='in' - ) - return filter.filter(self.queryset, data) - class LaxURLField(forms.URLField): """