diff --git a/netbox/ipam/models/vlans.py b/netbox/ipam/models/vlans.py index 44d81ecef..43e190e5c 100644 --- a/netbox/ipam/models/vlans.py +++ b/netbox/ipam/models/vlans.py @@ -98,7 +98,13 @@ class VLANGroup(OrganizationalModel): # Validate vlan ranges if check_ranges_overlap(self.vlan_id_ranges): - raise ValidationError(_("Ranges cannot overlap.")) + raise ValidationError({'vlan_id_ranges': _("Ranges cannot overlap.")}) + + for ranges in self.vlan_id_ranges: + if ranges.lower >= ranges.upper: + raise ValidationError({ + 'vlan_id_ranges': _("Maximum child VID must be greater than or equal to minimum child VID Invalid range ({value})").format(value=ranges) + }) def save(self, *args, **kwargs): self._total_vlan_ids = 0 diff --git a/netbox/utilities/data.py b/netbox/utilities/data.py index a10a01230..d6d889694 100644 --- a/netbox/utilities/data.py +++ b/netbox/utilities/data.py @@ -140,6 +140,9 @@ def ranges_to_string(ranges): For example: [1-100, 200-300] => "1-100, 200-300" """ + if not ranges: + return "" + return ', '.join([f"{val.lower}-{val.upper}" for val in ranges])