Browse Source

Fixes #1513: Correct filtering of custom field choices

Jeremy Stretch 7 years ago
parent
commit
a0b93bb4df
1 changed files with 19 additions and 8 deletions
  1. 19 8
      netbox/extras/filters.py

+ 19 - 8
netbox/extras/filters.py

@@ -19,17 +19,28 @@ class CustomFieldFilter(django_filters.Filter):
         super(CustomFieldFilter, self).__init__(*args, **kwargs)
 
     def filter(self, queryset, value):
+
         # Skip filter on empty value
         if not value.strip():
             return queryset
-        # Treat 0 as None for Select fields
-        try:
-            if self.cf_type == CF_TYPE_SELECT and int(value) == 0:
-                return queryset.exclude(
-                    custom_field_values__field__name=self.name,
-                )
-        except ValueError:
-            pass
+
+        # Selection fields get special treatment (values must be integers)
+        if self.cf_type == CF_TYPE_SELECT:
+            try:
+                # Treat 0 as None
+                if int(value) == 0:
+                    return queryset.exclude(
+                        custom_field_values__field__name=self.name,
+                    )
+                # Match on exact CustomFieldChoice PK
+                else:
+                    return queryset.filter(
+                        custom_field_values__field__name=self.name,
+                        custom_field_values__serialized_value=value,
+                    )
+            except ValueError:
+                return queryset.none()
+
         return queryset.filter(
             custom_field_values__field__name=self.name,
             custom_field_values__serialized_value__icontains=value,