9627 available_vlans

This commit is contained in:
Arthur Hanson 2024-06-21 13:00:09 -07:00
parent 9bc2b8ebf8
commit 35d7ba113f
3 changed files with 23 additions and 2 deletions

View File

@ -11,6 +11,7 @@ from ipam.choices import *
from ipam.constants import *
from ipam.querysets import VLANQuerySet, VLANGroupQuerySet
from netbox.models import OrganizationalModel, PrimaryModel
from utilities.data import check_ranges_overlap
from virtualization.models import VMInterface
__all__ = (
@ -89,10 +90,14 @@ class VLANGroup(OrganizationalModel):
if self.scope_id and not self.scope_type:
raise ValidationError(_("Cannot set scope_id without scope_type."))
# Validate vlan ranges
if check_ranges_overlap(self.vlan_id_ranges):
raise ValidationError(_("Ranges cannot overlap."))
def save(self, *args, **kwargs):
self._total_vlan_ids = 0
for vlan_range in self.vlan_id_ranges:
self._total_vlan_ids += int(vlan_range.upper) - int(vlan_range.lower) + 1
self._total_vlan_ids += vlan_range.upper - vlan_range.lower + 1
super().save(*args, **kwargs)

View File

@ -4,6 +4,7 @@ from itertools import count, groupby
__all__ = (
'array_to_ranges',
'array_to_string',
'check_ranges_overlap',
'deepmerge',
'drange',
'flatten_dict',
@ -113,3 +114,18 @@ def drange(start, end, step=decimal.Decimal(1)):
while start > end:
yield start
start += step
def check_ranges_overlap(ranges):
"""
Check if array of ranges overlap
"""
# sort the ranges in increasing order
ranges.sort(key=lambda x: x.lower)
for i in range(1, len(ranges)):
if (ranges[i - 1].upper > ranges[i].lower):
return True
return False

View File

@ -52,5 +52,5 @@ class NumericRangeArrayField(forms.CharField):
values = []
for dash_range in value.split(','):
lower, upper = dash_range.split('-')
values.append(NumericRange(lower, upper))
values.append(NumericRange(int(lower), int(upper)))
return values