From ad1298428fa013d80d9dcc034014509e78e0a2a5 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 11 Mar 2024 10:35:56 -0400 Subject: [PATCH] Simplify range detection --- netbox/utilities/forms/utils.py | 36 +++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/netbox/utilities/forms/utils.py b/netbox/utilities/forms/utils.py index 6ea25b8e7..0429fe571 100644 --- a/netbox/utilities/forms/utils.py +++ b/netbox/utilities/forms/utils.py @@ -51,37 +51,43 @@ def parse_alphanumeric_range(string): '0-3,a-d' => [0, 1, 2, 3, a, b, c, d] """ values = [] - for dash_range in string.split(','): + for value in string.split(','): + if '-' not in value: + # Item is not a range + values.append(value) + continue + + # Find the range's beginning & end values try: - begin, end = dash_range.split('-') + begin, end = value.split('-') vals = begin + end # Break out of loop if there's an invalid pattern to return an error if (not (vals.isdigit() or vals.isalpha())) or (vals.isalpha() and not (vals.isupper() or vals.islower())): return [] except ValueError: - begin, end = dash_range, dash_range + raise forms.ValidationError(_('Range "{value}" is invalid.').format(value=value)) - # Value-based - if begin == end: - values.append(begin) - # Numeric range-based - elif begin.isdigit() and end.isdigit(): + # Numeric range + if begin.isdigit() and end.isdigit(): if int(begin) >= int(end): - raise forms.ValidationError(_('Range "{value}" is invalid.').format(value=dash_range)) - + raise forms.ValidationError( + _('Invalid range: Ending value ({end}) must be greater than beginning value ({begin}).').format( + begin=begin, end=end + ) + ) for n in list(range(int(begin), int(end) + 1)): values.append(n) - # Range-based + + # Alphanumeric range else: # Not a valid range (more than a single character) if not len(begin) == len(end) == 1: - raise forms.ValidationError(_('Range "{value}" is invalid.').format(value=dash_range)) - + raise forms.ValidationError(_('Range "{value}" is invalid.').format(value=value)) if ord(begin) >= ord(end): - raise forms.ValidationError(_('Range "{value}" is invalid.').format(value=dash_range)) - + raise forms.ValidationError(_('Range "{value}" is invalid.').format(value=value)) for n in list(range(ord(begin), ord(end) + 1)): values.append(chr(n)) + return values