diff --git a/netbox/utilities/data.py b/netbox/utilities/data.py
index 73c8476ec..7b50d26b8 100644
--- a/netbox/utilities/data.py
+++ b/netbox/utilities/data.py
@@ -160,9 +160,17 @@ def string_to_ranges(value):
return None
value.replace(' ', '') # Remove whitespace
values = []
- for dash_range in value.split(','):
- if '-' not in dash_range:
+ for data in value.split(','):
+ dash_range = data.strip().split('-')
+ if len(dash_range) == 1 and str(dash_range[0]).isdigit():
+ # Single integer value; expand to a range
+ lower = dash_range[0]
+ upper = dash_range[0]
+ elif len(dash_range) == 2 and str(dash_range[0]).isdigit() and str(dash_range[1]).isdigit():
+ # The range has two values and both are valid integers
+ lower = dash_range[0]
+ upper = dash_range[1]
+ else:
return None
- lower, upper = dash_range.split('-')
values.append(NumericRange(int(lower), int(upper), bounds='[]'))
return values
diff --git a/netbox/utilities/forms/fields/array.py b/netbox/utilities/forms/fields/array.py
index e6de2d89f..e4f6c972f 100644
--- a/netbox/utilities/forms/fields/array.py
+++ b/netbox/utilities/forms/fields/array.py
@@ -32,12 +32,14 @@ class NumericArrayField(SimpleArrayField):
class NumericRangeArrayField(forms.CharField):
"""
A field which allows for array of numeric ranges:
- Example: 1-5,7-20,30-50
+ Example: 1-5,10,20-30
"""
def __init__(self, *args, help_text='', **kwargs):
if not help_text:
help_text = mark_safe(
- _("Specify one or more numeric ranges separated by commas. Example: " + "1-5,20-30
")
+ _(
+ "Specify one or more individual numbers or numeric ranges separated by commas. Example: {example}"
+ ).format(example="1-5,10,20-30
")
)
super().__init__(*args, help_text=help_text, **kwargs)
diff --git a/netbox/utilities/tests/test_data.py b/netbox/utilities/tests/test_data.py
index c83885233..7b313baf7 100644
--- a/netbox/utilities/tests/test_data.py
+++ b/netbox/utilities/tests/test_data.py
@@ -66,3 +66,17 @@ class RangeFunctionsTestCase(TestCase):
NumericRange(100, 199, bounds='[]'), # 100-199
]
)
+
+ self.assertEqual(
+ string_to_ranges('1-2, 5, 10-12'),
+ [
+ NumericRange(1, 2, bounds='[]'), # 1-2
+ NumericRange(5, 5, bounds='[]'), # 5-5
+ NumericRange(10, 12, bounds='[]'), # 10-12
+ ]
+ )
+
+ self.assertEqual(
+ string_to_ranges('2-10, a-b'),
+ None # Fails to convert
+ )