mirror of
https://github.com/netbox-community/netbox.git
synced 2025-08-24 00:15:17 -06:00
rebased file
This commit is contained in:
parent
3a67598ca9
commit
e37297b296
@ -9,13 +9,16 @@ from ipam.constants import *
|
|||||||
from ipam.models import *
|
from ipam.models import *
|
||||||
from netbox.forms import NetBoxModelImportForm
|
from netbox.forms import NetBoxModelImportForm
|
||||||
from tenancy.models import Tenant
|
from tenancy.models import Tenant
|
||||||
from utilities.forms import CSVChoiceField, CSVContentTypeField, CSVModelChoiceField, SlugField, \
|
from utilities.forms.fields import (
|
||||||
CSVModelMultipleChoiceField
|
CSVChoiceField, CSVContentTypeField, CSVModelChoiceField, CSVModelMultipleChoiceField, SlugField,
|
||||||
|
)
|
||||||
|
|
||||||
from virtualization.models import VirtualMachine, VMInterface
|
from virtualization.models import VirtualMachine, VMInterface
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
'AggregateImportForm',
|
'AggregateImportForm',
|
||||||
'ASNImportForm',
|
'ASNImportForm',
|
||||||
|
'ASNRangeImportForm',
|
||||||
'FHRPGroupImportForm',
|
'FHRPGroupImportForm',
|
||||||
'IPAddressImportForm',
|
'IPAddressImportForm',
|
||||||
'IPRangeImportForm',
|
'IPRangeImportForm',
|
||||||
@ -40,10 +43,25 @@ class VRFImportForm(NetBoxModelImportForm):
|
|||||||
to_field_name='name',
|
to_field_name='name',
|
||||||
help_text=_('Assigned tenant')
|
help_text=_('Assigned tenant')
|
||||||
)
|
)
|
||||||
|
import_targets = CSVModelMultipleChoiceField(
|
||||||
|
queryset=RouteTarget.objects.all(),
|
||||||
|
required=False,
|
||||||
|
to_field_name='name',
|
||||||
|
help_text=_('Import route targets')
|
||||||
|
)
|
||||||
|
export_targets = CSVModelMultipleChoiceField(
|
||||||
|
queryset=RouteTarget.objects.all(),
|
||||||
|
required=False,
|
||||||
|
to_field_name='name',
|
||||||
|
help_text=_('Export route targets')
|
||||||
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = VRF
|
model = VRF
|
||||||
fields = ('name', 'rd', 'tenant', 'enforce_unique', 'description', 'comments', 'tags')
|
fields = (
|
||||||
|
'name', 'rd', 'tenant', 'enforce_unique', 'description', 'import_targets', 'export_targets', 'comments',
|
||||||
|
'tags',
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class RouteTargetImportForm(NetBoxModelImportForm):
|
class RouteTargetImportForm(NetBoxModelImportForm):
|
||||||
@ -65,9 +83,6 @@ class RIRImportForm(NetBoxModelImportForm):
|
|||||||
class Meta:
|
class Meta:
|
||||||
model = RIR
|
model = RIR
|
||||||
fields = ('name', 'slug', 'is_private', 'description', 'tags')
|
fields = ('name', 'slug', 'is_private', 'description', 'tags')
|
||||||
help_texts = {
|
|
||||||
'name': _('RIR name'),
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class AggregateImportForm(NetBoxModelImportForm):
|
class AggregateImportForm(NetBoxModelImportForm):
|
||||||
@ -88,6 +103,24 @@ class AggregateImportForm(NetBoxModelImportForm):
|
|||||||
fields = ('prefix', 'rir', 'tenant', 'date_added', 'description', 'comments', 'tags')
|
fields = ('prefix', 'rir', 'tenant', 'date_added', 'description', 'comments', 'tags')
|
||||||
|
|
||||||
|
|
||||||
|
class ASNRangeImportForm(NetBoxModelImportForm):
|
||||||
|
rir = CSVModelChoiceField(
|
||||||
|
queryset=RIR.objects.all(),
|
||||||
|
to_field_name='name',
|
||||||
|
help_text=_('Assigned RIR')
|
||||||
|
)
|
||||||
|
tenant = CSVModelChoiceField(
|
||||||
|
queryset=Tenant.objects.all(),
|
||||||
|
required=False,
|
||||||
|
to_field_name='name',
|
||||||
|
help_text=_('Assigned tenant')
|
||||||
|
)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = ASNRange
|
||||||
|
fields = ('name', 'slug', 'rir', 'start', 'end', 'tenant', 'description', 'tags')
|
||||||
|
|
||||||
|
|
||||||
class ASNImportForm(NetBoxModelImportForm):
|
class ASNImportForm(NetBoxModelImportForm):
|
||||||
rir = CSVModelChoiceField(
|
rir = CSVModelChoiceField(
|
||||||
queryset=RIR.objects.all(),
|
queryset=RIR.objects.all(),
|
||||||
@ -166,16 +199,31 @@ class PrefixImportForm(NetBoxModelImportForm):
|
|||||||
def __init__(self, data=None, *args, **kwargs):
|
def __init__(self, data=None, *args, **kwargs):
|
||||||
super().__init__(data, *args, **kwargs)
|
super().__init__(data, *args, **kwargs)
|
||||||
|
|
||||||
if data:
|
if not data:
|
||||||
|
return
|
||||||
|
|
||||||
# Limit VLAN queryset by assigned site and/or group (if specified)
|
site = data.get('site')
|
||||||
params = {}
|
vlan_group = data.get('vlan_group')
|
||||||
if data.get('site'):
|
|
||||||
params[f"site__{self.fields['site'].to_field_name}"] = data.get('site')
|
# Limit VLAN queryset by assigned site and/or group (if specified)
|
||||||
if data.get('vlan_group'):
|
query = Q()
|
||||||
params[f"group__{self.fields['vlan_group'].to_field_name}"] = data.get('vlan_group')
|
|
||||||
if params:
|
if site:
|
||||||
self.fields['vlan'].queryset = self.fields['vlan'].queryset.filter(**params)
|
query |= Q(**{
|
||||||
|
f"site__{self.fields['site'].to_field_name}": site
|
||||||
|
})
|
||||||
|
# Don't Forget to include VLANs without a site in the filter
|
||||||
|
query |= Q(**{
|
||||||
|
f"site__{self.fields['site'].to_field_name}__isnull": True
|
||||||
|
})
|
||||||
|
|
||||||
|
if vlan_group:
|
||||||
|
query &= Q(**{
|
||||||
|
f"group__{self.fields['vlan_group'].to_field_name}": vlan_group
|
||||||
|
})
|
||||||
|
|
||||||
|
queryset = self.fields['vlan'].queryset.filter(query)
|
||||||
|
self.fields['vlan'].queryset = queryset
|
||||||
|
|
||||||
|
|
||||||
class IPRangeImportForm(NetBoxModelImportForm):
|
class IPRangeImportForm(NetBoxModelImportForm):
|
||||||
@ -205,7 +253,8 @@ class IPRangeImportForm(NetBoxModelImportForm):
|
|||||||
class Meta:
|
class Meta:
|
||||||
model = IPRange
|
model = IPRange
|
||||||
fields = (
|
fields = (
|
||||||
'start_address', 'end_address', 'vrf', 'tenant', 'status', 'role', 'description', 'comments', 'tags',
|
'start_address', 'end_address', 'vrf', 'tenant', 'status', 'role', 'mark_utilized', 'description',
|
||||||
|
'comments', 'tags',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -391,10 +440,6 @@ class VLANImportForm(NetBoxModelImportForm):
|
|||||||
class Meta:
|
class Meta:
|
||||||
model = VLAN
|
model = VLAN
|
||||||
fields = ('site', 'group', 'vid', 'name', 'tenant', 'status', 'role', 'description', 'comments', 'tags')
|
fields = ('site', 'group', 'vid', 'name', 'tenant', 'status', 'role', 'description', 'comments', 'tags')
|
||||||
help_texts = {
|
|
||||||
'vid': 'Numeric VLAN ID (1-4094)',
|
|
||||||
'name': 'VLAN name',
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class ServiceTemplateImportForm(NetBoxModelImportForm):
|
class ServiceTemplateImportForm(NetBoxModelImportForm):
|
||||||
@ -435,7 +480,7 @@ class ServiceImportForm(NetBoxModelImportForm):
|
|||||||
class Meta:
|
class Meta:
|
||||||
model = Service
|
model = Service
|
||||||
fields = (
|
fields = (
|
||||||
'device', 'virtual_machine', 'ipaddresses', 'name', 'protocol', 'ports', 'description', 'comments', 'tags')
|
'device', 'virtual_machine', 'ipaddresses', 'name', 'protocol', 'ports', 'description', 'comments', 'tags')
|
||||||
|
|
||||||
|
|
||||||
class L2VPNImportForm(NetBoxModelImportForm):
|
class L2VPNImportForm(NetBoxModelImportForm):
|
||||||
@ -451,7 +496,8 @@ class L2VPNImportForm(NetBoxModelImportForm):
|
|||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = L2VPN
|
model = L2VPN
|
||||||
fields = ('identifier', 'name', 'slug', 'type', 'description', 'comments', 'tags')
|
fields = ('identifier', 'name', 'slug', 'tenant', 'type', 'description',
|
||||||
|
'comments', 'tags')
|
||||||
|
|
||||||
|
|
||||||
class L2VPNTerminationImportForm(NetBoxModelImportForm):
|
class L2VPNTerminationImportForm(NetBoxModelImportForm):
|
||||||
@ -510,9 +556,11 @@ class L2VPNTerminationImportForm(NetBoxModelImportForm):
|
|||||||
|
|
||||||
if self.cleaned_data.get('device') and self.cleaned_data.get('virtual_machine'):
|
if self.cleaned_data.get('device') and self.cleaned_data.get('virtual_machine'):
|
||||||
raise ValidationError('Cannot import device and VM interface terminations simultaneously.')
|
raise ValidationError('Cannot import device and VM interface terminations simultaneously.')
|
||||||
if not (self.cleaned_data.get('interface') or self.cleaned_data.get('vlan')):
|
if not self.instance and not (self.cleaned_data.get('interface') or self.cleaned_data.get('vlan')):
|
||||||
raise ValidationError('Each termination must specify either an interface or a VLAN.')
|
raise ValidationError('Each termination must specify either an interface or a VLAN.')
|
||||||
if self.cleaned_data.get('interface') and self.cleaned_data.get('vlan'):
|
if self.cleaned_data.get('interface') and self.cleaned_data.get('vlan'):
|
||||||
raise ValidationError('Cannot assign both an interface and a VLAN.')
|
raise ValidationError('Cannot assign both an interface and a VLAN.')
|
||||||
|
|
||||||
self.instance.assigned_object = self.cleaned_data.get('interface') or self.cleaned_data.get('vlan')
|
# if this is an update we might not have interface or vlan in the form data
|
||||||
|
if self.cleaned_data.get('interface') or self.cleaned_data.get('vlan'):
|
||||||
|
self.instance.assigned_object = self.cleaned_data.get('interface') or self.cleaned_data.get('vlan')
|
||||||
|
Loading…
Reference in New Issue
Block a user