class ClusterAddDevicesForm(BootstrapMixin, forms.Form): region = DynamicModelChoiceField(queryset=Region.objects.all(), required=False, widget=APISelect(filter_for={ "site": "region_id", }, attrs={ 'nullable': 'true', })) site = DynamicModelChoiceField(queryset=Site.objects.all(), required=False, widget=APISelect(filter_for={ "rack": "site_id", "devices": "site_id", })) rack = DynamicModelChoiceField(queryset=Rack.objects.all(), required=False, widget=APISelect( filter_for={"devices": "rack_id"}, attrs={ 'nullable': 'true', })) devices = DynamicModelMultipleChoiceField( queryset=Device.objects.filter(cluster__isnull=True), widget=APISelectMultiple(display_field='display_name', disabled_indicator='cluster')) class Meta: fields = [ 'region', 'site', 'rack', 'devices', ] def __init__(self, cluster, *args, **kwargs): self.cluster = cluster super().__init__(*args, **kwargs) self.fields['devices'].choices = [] def clean(self): super().clean() # If the Cluster is assigned to a Site, all Devices must be assigned to that Site. if self.cluster.site is not None: for device in self.cleaned_data.get('devices', []): if device.site != self.cluster.site: raise ValidationError({ 'devices': "{} belongs to a different site ({}) than the cluster ({})" .format(device, device.site, self.cluster.site) })
class VirtualMachineBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=VirtualMachine.objects.all(), widget=forms.MultipleHiddenInput() ) status = forms.ChoiceField( choices=add_blank_choice(VirtualMachineStatusChoices), required=False, initial='', widget=StaticSelect2(), ) cluster = DynamicModelChoiceField( queryset=Cluster.objects.all(), required=False ) role = DynamicModelChoiceField( queryset=DeviceRole.objects.filter( vm_role=True ), required=False, widget=APISelect( additional_query_params={ "vm_role": "True" } ) ) tenant = DynamicModelChoiceField( queryset=Tenant.objects.all(), required=False ) platform = DynamicModelChoiceField( queryset=Platform.objects.all(), required=False ) vcpus = forms.IntegerField( required=False, label='vCPUs' ) memory = forms.IntegerField( required=False, label='Memory (MB)' ) disk = forms.IntegerField( required=False, label='Disk (GB)' ) comments = CommentField( widget=SmallTextarea, label='Comments' ) class Meta: nullable_fields = [ 'role', 'tenant', 'platform', 'vcpus', 'memory', 'disk', 'comments', ]
class PrefixBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=Prefix.objects.all(), widget=forms.MultipleHiddenInput() ) region = DynamicModelChoiceField( queryset=Region.objects.all(), required=False, to_field_name='slug' ) site = DynamicModelChoiceField( queryset=Site.objects.all(), required=False, query_params={ 'region': '$region' } ) vrf = DynamicModelChoiceField( queryset=VRF.objects.all(), required=False, label='VRF', display_field='display_name' ) prefix_length = forms.IntegerField( min_value=PREFIX_LENGTH_MIN, max_value=PREFIX_LENGTH_MAX, required=False ) tenant = DynamicModelChoiceField( queryset=Tenant.objects.all(), required=False ) status = forms.ChoiceField( choices=add_blank_choice(PrefixStatusChoices), required=False, widget=StaticSelect2() ) role = DynamicModelChoiceField( queryset=Role.objects.all(), required=False ) is_pool = forms.NullBooleanField( required=False, widget=BulkEditNullBooleanSelect(), label='Is a pool' ) description = forms.CharField( max_length=100, required=False ) class Meta: nullable_fields = [ 'site', 'vrf', 'tenant', 'role', 'description', ]
class VMInterfaceForm(BootstrapMixin, InterfaceCommonForm, CustomFieldModelForm): parent = DynamicModelChoiceField(queryset=VMInterface.objects.all(), required=False, label='Parent interface') untagged_vlan = DynamicModelChoiceField(queryset=VLAN.objects.all(), required=False, label='Untagged VLAN') tagged_vlans = DynamicModelMultipleChoiceField(queryset=VLAN.objects.all(), required=False, label='Tagged VLANs') tags = DynamicModelMultipleChoiceField(queryset=Tag.objects.all(), required=False) class Meta: model = VMInterface fields = [ 'virtual_machine', 'name', 'enabled', 'parent', 'mac_address', 'mtu', 'description', 'mode', 'tags', 'untagged_vlan', 'tagged_vlans', ] widgets = { 'virtual_machine': forms.HiddenInput(), 'mode': StaticSelect2() } labels = { 'mode': '802.1Q Mode', } help_texts = { 'mode': INTERFACE_MODE_HELP_TEXT, } def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) vm_id = self.initial.get('virtual_machine') or self.data.get( 'virtual_machine') # Restrict parent interface assignment by VM self.fields['parent'].widget.add_query_param('virtualmachine_id', vm_id) # Limit VLAN choices by virtual machine self.fields['untagged_vlan'].widget.add_query_param( 'available_on_virtualmachine', vm_id) self.fields['tagged_vlans'].widget.add_query_param( 'available_on_virtualmachine', vm_id)
class LocationBulkEditForm(BootstrapMixin, CustomFieldModelBulkEditForm): pk = forms.ModelMultipleChoiceField(queryset=Location.objects.all(), widget=forms.MultipleHiddenInput) site = DynamicModelChoiceField(queryset=Site.objects.all(), required=False) parent = DynamicModelChoiceField(queryset=Location.objects.all(), required=False, query_params={'site_id': '$site'}) description = forms.CharField(max_length=200, required=False) class Meta: nullable_fields = ['parent', 'description']
class ComponentTemplateCreateForm(BootstrapMixin, ComponentForm): """ Base form for the creation of device component templates (subclassed from ComponentTemplateModel). """ manufacturer = DynamicModelChoiceField( queryset=Manufacturer.objects.all(), required=False, initial_params={'device_types': 'device_type'}) device_type = DynamicModelChoiceField( queryset=DeviceType.objects.all(), query_params={'manufacturer_id': '$manufacturer'}) description = forms.CharField(required=False)
class SecretForm(BootstrapMixin, CustomFieldModelForm): device = DynamicModelChoiceField(queryset=Device.objects.all(), display_field='display_name') plaintext = forms.CharField( max_length=SECRET_PLAINTEXT_MAX_LENGTH, required=False, label='Plaintext', widget=forms.PasswordInput(attrs={ 'class': 'requires-session-key', })) plaintext2 = forms.CharField(max_length=SECRET_PLAINTEXT_MAX_LENGTH, required=False, label='Plaintext (verify)', widget=forms.PasswordInput()) role = DynamicModelChoiceField(queryset=SecretRole.objects.all()) tags = DynamicModelMultipleChoiceField(queryset=Tag.objects.all(), required=False) class Meta: model = Secret fields = [ 'device', 'role', 'name', 'plaintext', 'plaintext2', 'tags', ] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # A plaintext value is required when creating a new Secret if not self.instance.pk: self.fields['plaintext'].required = True def clean(self): # Verify that the provided plaintext values match if self.cleaned_data['plaintext'] != self.cleaned_data['plaintext2']: raise forms.ValidationError({ 'plaintext2': "The two given plaintext values do not match. Please check your input." }) # Validate uniqueness if Secret.objects.filter(device=self.cleaned_data['device'], role=self.cleaned_data['role'], name=self.cleaned_data['name']).exclude( pk=self.instance.pk).exists(): raise forms.ValidationError( "Each secret assigned to a device must have a unique combination of role and name" )
class ClusterAddDevicesForm(BootstrapMixin, forms.Form): region = DynamicModelChoiceField(queryset=Region.objects.all(), required=False, null_option='None') site_group = DynamicModelChoiceField(queryset=SiteGroup.objects.all(), required=False, null_option='None') site = DynamicModelChoiceField(queryset=Site.objects.all(), required=False, query_params={ 'region_id': '$region', 'group_id': '$site_group', }) rack = DynamicModelChoiceField(queryset=Rack.objects.all(), required=False, null_option='None', query_params={'site_id': '$site'}) devices = DynamicModelMultipleChoiceField(queryset=Device.objects.all(), query_params={ 'site_id': '$site', 'rack_id': '$rack', 'cluster_id': 'null', }) class Meta: fields = [ 'region', 'site', 'rack', 'devices', ] def __init__(self, cluster, *args, **kwargs): self.cluster = cluster super().__init__(*args, **kwargs) self.fields['devices'].choices = [] def clean(self): super().clean() # If the Cluster is assigned to a Site, all Devices must be assigned to that Site. if self.cluster.site is not None: for device in self.cleaned_data.get('devices', []): if device.site != self.cluster.site: raise ValidationError({ 'devices': "{} belongs to a different site ({}) than the cluster ({})" .format(device, device.site, self.cluster.site) })
class RackReservationForm(TenancyForm, CustomFieldModelForm): region = DynamicModelChoiceField(queryset=Region.objects.all(), required=False, initial_params={'sites': '$site'}) site_group = DynamicModelChoiceField(queryset=SiteGroup.objects.all(), required=False, initial_params={'sites': '$site'}) site = DynamicModelChoiceField(queryset=Site.objects.all(), required=False, query_params={ 'region_id': '$region', 'group_id': '$site_group', }) location = DynamicModelChoiceField(queryset=Location.objects.all(), required=False, query_params={'site_id': '$site'}) rack = DynamicModelChoiceField(queryset=Rack.objects.all(), query_params={ 'site_id': '$site', 'location_id': '$location', }) units = NumericArrayField( base_field=forms.IntegerField(), help_text= "Comma-separated list of numeric unit IDs. A range may be specified using a hyphen." ) user = forms.ModelChoiceField(queryset=User.objects.order_by('username'), widget=StaticSelect()) tags = DynamicModelMultipleChoiceField(queryset=Tag.objects.all(), required=False) class Meta: model = RackReservation fields = [ 'region', 'site_group', 'site', 'location', 'rack', 'units', 'user', 'tenant_group', 'tenant', 'description', 'tags', ] fieldsets = ( ('Reservation', ('region', 'site', 'location', 'rack', 'units', 'user', 'description', 'tags')), ('Tenancy', ('tenant_group', 'tenant')), )
class CommunityFilterForm(BootstrapMixin, forms.ModelForm): q = forms.CharField(required=False, label='Search') tenant = DynamicModelChoiceField(queryset=Tenant.objects.all(), required=False) status = forms.MultipleChoiceField(choices=ASNStatusChoices, required=False, widget=StaticSelect2Multiple()) site = DynamicModelChoiceField(queryset=Site.objects.all(), required=False) tag = TagFilterField(Community) class Meta: model = Community fields = ['q', 'status', 'tenant']
class CircuitTerminationForm(BootstrapMixin, forms.ModelForm): region = DynamicModelChoiceField( queryset=Region.objects.all(), required=False, initial_params={ 'sites': '$site' } ) site_group = DynamicModelChoiceField( queryset=SiteGroup.objects.all(), required=False, initial_params={ 'sites': '$site' } ) site = DynamicModelChoiceField( queryset=Site.objects.all(), query_params={ 'region_id': '$region', 'group_id': '$site_group', }, required=False ) provider_network = DynamicModelChoiceField( queryset=ProviderNetwork.objects.all(), required=False ) class Meta: model = CircuitTermination fields = [ 'term_side', 'region', 'site_group', 'site', 'provider_network', 'mark_connected', 'port_speed', 'upstream_speed', 'xconnect_id', 'pp_info', 'description', ] help_texts = { 'port_speed': "Physical circuit speed", 'xconnect_id': "ID of the local cross-connect", 'pp_info': "Patch panel ID and port number(s)" } widgets = { 'term_side': forms.HiddenInput(), 'port_speed': SelectSpeedWidget(), 'upstream_speed': SelectSpeedWidget(), } def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields['provider_network'].widget.add_query_param('provider_id', self.instance.circuit.provider_id)
class VLANForm(BootstrapMixin, TenancyForm, CustomFieldModelForm): region = DynamicModelChoiceField( queryset=Region.objects.all(), required=False, initial_params={ 'sites': '$site' } ) site = DynamicModelChoiceField( queryset=Site.objects.all(), required=False, null_option='None', query_params={ 'region_id': '$region' } ) group = DynamicModelChoiceField( queryset=VLANGroup.objects.all(), required=False, query_params={ 'site_id': '$site' } ) role = DynamicModelChoiceField( queryset=Role.objects.all(), required=False ) tags = DynamicModelMultipleChoiceField( queryset=Tag.objects.all(), required=False ) class Meta: model = VLAN fields = [ 'site', 'group', 'vid', 'name', 'status', 'role', 'description', 'tenant_group', 'tenant', 'tags', ] help_texts = { 'site': "Leave blank if this VLAN spans multiple sites", 'group': "VLAN group (optional)", 'vid': "Configured VLAN ID", 'name': "Configured VLAN name", 'status': "Operational status of this VLAN", 'role': "The primary function of this VLAN", } widgets = { 'status': StaticSelect2(), }
class VMInterfaceCreateForm(BootstrapMixin, forms.Form): virtual_machine = DynamicModelChoiceField( queryset=VirtualMachine.objects.all()) name_pattern = ExpandableNameField(label='Name') enabled = forms.BooleanField(required=False, initial=True) mtu = forms.IntegerField(required=False, min_value=INTERFACE_MTU_MIN, max_value=INTERFACE_MTU_MAX, label='MTU') mac_address = forms.CharField(required=False, label='MAC Address') description = forms.CharField(max_length=100, required=False) mode = forms.ChoiceField( choices=add_blank_choice(InterfaceModeChoices), required=False, widget=StaticSelect2(), ) untagged_vlan = DynamicModelChoiceField(queryset=VLAN.objects.all(), required=False, display_field='display_name', brief_mode=False, query_params={ 'site_id': 'null', }) tagged_vlans = DynamicModelMultipleChoiceField( queryset=VLAN.objects.all(), required=False, display_field='display_name', brief_mode=False, query_params={ 'site_id': 'null', }) tags = DynamicModelMultipleChoiceField(queryset=Tag.objects.all(), required=False) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) virtual_machine = VirtualMachine.objects.get( pk=self.initial.get('virtual_machine') or self.data.get('virtual_machine')) # Add current site to VLANs query params site = virtual_machine.site if site: self.fields['untagged_vlan'].widget.add_query_param( 'site_id', site.pk) self.fields['tagged_vlans'].widget.add_query_param( 'site_id', site.pk)
class IPAddressBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=IPAddress.objects.all(), widget=forms.MultipleHiddenInput() ) vrf = DynamicModelChoiceField( queryset=VRF.objects.all(), required=False, label='VRF', widget=APISelect( api_url="/api/ipam/vrfs/" ) ) mask_length = forms.IntegerField( min_value=IPADDRESS_MASK_LENGTH_MIN, max_value=IPADDRESS_MASK_LENGTH_MAX, required=False ) tenant = DynamicModelChoiceField( queryset=Tenant.objects.all(), required=False, widget=APISelect( api_url="/api/tenancy/tenants/" ) ) status = forms.ChoiceField( choices=add_blank_choice(IPAddressStatusChoices), required=False, widget=StaticSelect2() ) role = forms.ChoiceField( choices=add_blank_choice(IPAddressRoleChoices), required=False, widget=StaticSelect2() ) dns_name = forms.CharField( max_length=255, required=False ) description = forms.CharField( max_length=100, required=False ) class Meta: nullable_fields = [ 'vrf', 'role', 'tenant', 'dns_name', 'description', ]
class VRFBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=VRF.objects.all(), widget=forms.MultipleHiddenInput() ) tenant = DynamicModelChoiceField( label='Учреждение', queryset=Tenant.objects.all(), required=False ) enforce_unique = forms.NullBooleanField( required=False, widget=BulkEditNullBooleanSelect(), label='Принудительное использование уникального пространства' ) description = forms.CharField( label='Описание', max_length=100, required=False ) class Meta: nullable_fields = [ 'tenant', 'description', ]
class BGPSessionFilterForm(BootstrapMixin, forms.ModelForm): q = forms.CharField(required=False, label='Search') remote_as = DynamicModelMultipleChoiceField( queryset=ASN.objects.all(), required=False, display_field='number', widget=APISelectMultiple(api_url='/api/plugins/bgp/asn/', )) local_as = DynamicModelMultipleChoiceField( queryset=ASN.objects.all(), required=False, display_field='number', widget=APISelectMultiple(api_url='/api/plugins/bgp/asn/', )) tenant = DynamicModelChoiceField(queryset=Tenant.objects.all(), required=False) status = forms.MultipleChoiceField(choices=SessionStatusChoices, required=False, widget=StaticSelect2Multiple()) import_policies = DynamicModelMultipleChoiceField( queryset=RoutingPolicy.objects.all(), required=False, widget=APISelectMultiple(api_url='/api/plugins/bgp/routing-policy/')) export_policies = DynamicModelMultipleChoiceField( queryset=RoutingPolicy.objects.all(), required=False, widget=APISelectMultiple(api_url='/api/plugins/bgp/routing-policy/')) tag = TagFilterField(BGPSession) class Meta: model = BGPSession fields = ['q', 'status', 'tenant', 'remote_as', 'local_as']
class VRFBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=VRF.objects.all(), widget=forms.MultipleHiddenInput() ) tenant = DynamicModelChoiceField( queryset=Tenant.objects.all(), required=False, widget=APISelect( api_url="/api/tenancy/tenants/" ) ) enforce_unique = forms.NullBooleanField( required=False, widget=BulkEditNullBooleanSelect(), label='Enforce unique space' ) description = forms.CharField( max_length=100, required=False ) class Meta: nullable_fields = [ 'tenant', 'description', ]
class AggregateBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=Aggregate.objects.all(), widget=forms.MultipleHiddenInput() ) rir = DynamicModelChoiceField( queryset=RIR.objects.all(), required=False, label='RIR', widget=APISelect( api_url="/api/ipam/rirs/" ) ) date_added = forms.DateField( required=False ) description = forms.CharField( max_length=100, required=False ) class Meta: nullable_fields = [ 'date_added', 'description', ] widgets = { 'date_added': DatePicker(), }
class VMInterfaceForm(BootstrapMixin, InterfaceCommonForm, forms.ModelForm): untagged_vlan = DynamicModelChoiceField(queryset=VLAN.objects.all(), required=False, label='Untagged VLAN', display_field='display_name', brief_mode=False, query_params={ 'site_id': 'null', }) tagged_vlans = DynamicModelMultipleChoiceField( queryset=VLAN.objects.all(), required=False, label='Tagged VLANs', display_field='display_name', brief_mode=False, query_params={ 'site_id': 'null', }) tags = DynamicModelMultipleChoiceField(queryset=Tag.objects.all(), required=False) class Meta: model = VMInterface fields = [ 'virtual_machine', 'name', 'enabled', 'mac_address', 'mtu', 'description', 'mode', 'tags', 'untagged_vlan', 'tagged_vlans', ] widgets = { 'virtual_machine': forms.HiddenInput(), 'mode': StaticSelect2() } labels = { 'mode': '802.1Q Mode', } help_texts = { 'mode': INTERFACE_MODE_HELP_TEXT, } def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) virtual_machine = VirtualMachine.objects.get( pk=self.initial.get('virtual_machine') or self.data.get('virtual_machine')) # Add current site to VLANs query params site = virtual_machine.site if site: self.fields['untagged_vlan'].widget.add_query_param( 'site_id', site.pk) self.fields['tagged_vlans'].widget.add_query_param( 'site_id', site.pk)
class TenancyForm(forms.Form): tenant_group = DynamicModelChoiceField( queryset=TenantGroup.objects.all(), required=False, null_option='None', initial_params={ 'tenants': '$tenant' } ) tenant = DynamicModelChoiceField( queryset=Tenant.objects.all(), required=False, query_params={ 'group_id': '$tenant_group' } )
class IPAddressFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm): model = IPAddress field_order = [ 'q', 'parent', 'family', 'mask_length', 'vrf_id', 'present_in_vrf_id', 'status', 'role', 'assigned_to_interface', 'tenant_group_id', 'tenant_id', ] q = forms.CharField( required=False, label=_('Search') ) parent = forms.CharField( required=False, widget=forms.TextInput( attrs={ 'placeholder': 'Prefix', } ), label='Parent Prefix' ) family = forms.ChoiceField( required=False, choices=add_blank_choice(IPAddressFamilyChoices), label=_('Address family'), widget=StaticSelect2() ) mask_length = forms.ChoiceField( required=False, choices=IPADDRESS_MASK_LENGTH_CHOICES, label=_('Mask length'), widget=StaticSelect2() ) vrf_id = DynamicModelMultipleChoiceField( queryset=VRF.objects.all(), required=False, label=_('Assigned VRF'), null_option='Global' ) present_in_vrf_id = DynamicModelChoiceField( queryset=VRF.objects.all(), required=False, label=_('Present in VRF') ) status = forms.MultipleChoiceField( choices=IPAddressStatusChoices, required=False, widget=StaticSelect2Multiple() ) role = forms.MultipleChoiceField( choices=IPAddressRoleChoices, required=False, widget=StaticSelect2Multiple() ) assigned_to_interface = forms.NullBooleanField( required=False, label=_('Assigned to an interface'), widget=StaticSelect2( choices=BOOLEAN_WITH_BLANK_CHOICES ) ) tag = TagFilterField(model)
class IPAddressBulkAddForm(BootstrapMixin, TenancyForm, CustomFieldModelForm): vrf = DynamicModelChoiceField(queryset=VRF.objects.all(), required=False, label='VRF') class Meta: model = IPAddress fields = [ 'address', 'vrf', 'status', 'role', 'dns_name', 'description', 'tenant_group', 'tenant', ] widgets = { 'status': StaticSelect2(), 'role': StaticSelect2(), } def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields['vrf'].empty_label = 'Global'
class AggregateForm(BootstrapMixin, TenancyForm, CustomFieldModelForm): rir = DynamicModelChoiceField(queryset=RIR.objects.all(), label='RIR') tags = DynamicModelMultipleChoiceField(queryset=Tag.objects.all(), required=False) class Meta: model = Aggregate fields = [ 'prefix', 'rir', 'date_added', 'description', 'tenant_group', 'tenant', 'tags', ] fieldsets = ( ('Aggregate', ('prefix', 'rir', 'date_added', 'description', 'tags')), ('Tenancy', ('tenant_group', 'tenant')), ) help_texts = { 'prefix': "IPv4 or IPv6 network", 'rir': "Regional Internet Registry responsible for this prefix", } widgets = { 'date_added': DatePicker(), }
class RespBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset = Resp.objects.all(), widget = forms.MultipleHiddenInput( # api_url='/api/plugins/sdns/resp' ) ) tipo = forms.ChoiceField( choices=add_blank_choice(RespChoices), widget=StaticSelect2() ) dom = DynamicModelChoiceField( queryset= Domain.objects.all(), display_field='Domain', label='Dominio', required= False, widget= APISelect( api_url='/api/plugins/sdns/domain', ) ) class Meta: nullable_fields = [ ]
class ASNBulkEditForm(NetBoxModelBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=ASN.objects.all(), widget=forms.MultipleHiddenInput ) tenant = DynamicModelChoiceField( queryset=Tenant.objects.all(), required=False ) description = forms.CharField( max_length=200, required=False ) status = forms.ChoiceField( required=False, choices=ASNStatusChoices, widget=StaticSelect() ) model = ASN fieldsets = ( (None, ('tenant', 'description', 'status')), ) nullable_fields = ( 'tenant', 'description', )
class VMInterfaceCreateForm(BootstrapMixin, InterfaceCommonForm): virtual_machine = DynamicModelChoiceField( queryset=VirtualMachine.objects.all()) name_pattern = ExpandableNameField(label='Name') enabled = forms.BooleanField(required=False, initial=True) parent = DynamicModelChoiceField(queryset=VMInterface.objects.all(), required=False, display_field='display_name', query_params={ 'virtualmachine_id': 'virtual_machine', }) mtu = forms.IntegerField(required=False, min_value=INTERFACE_MTU_MIN, max_value=INTERFACE_MTU_MAX, label='MTU') mac_address = forms.CharField(required=False, label='MAC Address') description = forms.CharField(max_length=100, required=False) mode = forms.ChoiceField( choices=add_blank_choice(InterfaceModeChoices), required=False, widget=StaticSelect2(), ) untagged_vlan = DynamicModelChoiceField(queryset=VLAN.objects.all(), required=False) tagged_vlans = DynamicModelMultipleChoiceField(queryset=VLAN.objects.all(), required=False) tags = DynamicModelMultipleChoiceField(queryset=Tag.objects.all(), required=False) field_order = ('virtual_machine', 'name_pattern', 'enabled', 'parent', 'mtu', 'mac_address', 'description', 'mode', 'untagged_vlan', 'tagged_vlans', 'tags') def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) vm_id = self.initial.get('virtual_machine') or self.data.get( 'virtual_machine') # Restrict parent interface assignment by VM self.fields['parent'].widget.add_query_param('virtualmachine_id', vm_id) # Limit VLAN choices by virtual machine self.fields['untagged_vlan'].widget.add_query_param( 'available_on_virtualmachine', vm_id) self.fields['tagged_vlans'].widget.add_query_param( 'available_on_virtualmachine', vm_id)
class VLANBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=VLAN.objects.all(), widget=forms.MultipleHiddenInput() ) site = DynamicModelChoiceField( queryset=Site.objects.all(), required=False, widget=APISelect( api_url="/api/dcim/sites/" ) ) group = DynamicModelChoiceField( queryset=VLANGroup.objects.all(), required=False, widget=APISelect( api_url="/api/ipam/vlan-groups/" ) ) tenant = DynamicModelChoiceField( queryset=Tenant.objects.all(), required=False, widget=APISelect( api_url="/api/tenancy/tenants/" ) ) status = forms.ChoiceField( choices=add_blank_choice(VLANStatusChoices), required=False, widget=StaticSelect2() ) role = DynamicModelChoiceField( queryset=Role.objects.all(), required=False, widget=APISelect( api_url="/api/ipam/roles/" ) ) description = forms.CharField( max_length=100, required=False ) class Meta: nullable_fields = [ 'site', 'group', 'tenant', 'role', 'description', ]
class LocationForm(TenancyForm, CustomFieldModelForm): region = DynamicModelChoiceField(queryset=Region.objects.all(), required=False, initial_params={'sites': '$site'}) site_group = DynamicModelChoiceField(queryset=SiteGroup.objects.all(), required=False, initial_params={'sites': '$site'}) site = DynamicModelChoiceField(queryset=Site.objects.all(), query_params={ 'region_id': '$region', 'group_id': '$site_group', }) parent = DynamicModelChoiceField(queryset=Location.objects.all(), required=False, query_params={'site_id': '$site'}) slug = SlugField() tags = DynamicModelMultipleChoiceField(queryset=Tag.objects.all(), required=False) class Meta: model = Location fields = ( 'region', 'site_group', 'site', 'parent', 'name', 'slug', 'description', 'tenant_group', 'tenant', 'tags', ) fieldsets = ( ('Location', ( 'region', 'site_group', 'site', 'parent', 'name', 'slug', 'description', 'tags', )), ('Tenancy', ('tenant_group', 'tenant')), )
class InterfaceCreateForm(ComponentCreateForm, InterfaceCommonForm): model = Interface type = forms.ChoiceField( choices=InterfaceTypeChoices, widget=StaticSelect(), ) enabled = forms.BooleanField(required=False, initial=True) parent = DynamicModelChoiceField(queryset=Interface.objects.all(), required=False, query_params={ 'device_id': '$device', }) lag = DynamicModelChoiceField(queryset=Interface.objects.all(), required=False, query_params={ 'device_id': '$device', 'type': 'lag', }) mac_address = forms.CharField(required=False, label='MAC Address') mgmt_only = forms.BooleanField( required=False, label='Management only', help_text='This interface is used only for out-of-band management') mode = forms.ChoiceField( choices=add_blank_choice(InterfaceModeChoices), required=False, widget=StaticSelect(), ) untagged_vlan = DynamicModelChoiceField(queryset=VLAN.objects.all(), required=False) tagged_vlans = DynamicModelMultipleChoiceField(queryset=VLAN.objects.all(), required=False) field_order = ('device', 'name_pattern', 'label_pattern', 'type', 'enabled', 'parent', 'lag', 'mtu', 'mac_address', 'description', 'mgmt_only', 'mark_connected', 'mode', 'untagged_vlan', 'tagged_vlans', 'tags') def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # Limit VLAN choices by device device_id = self.initial.get('device') or self.data.get('device') self.fields['untagged_vlan'].widget.add_query_param( 'available_on_device', device_id) self.fields['tagged_vlans'].widget.add_query_param( 'available_on_device', device_id)
class ComponentCreateForm(BootstrapMixin, CustomFieldsMixin, ComponentForm): """ Base form for the creation of device components (models subclassed from ComponentModel). """ device = DynamicModelChoiceField(queryset=Device.objects.all()) description = forms.CharField(max_length=200, required=False) tags = DynamicModelMultipleChoiceField(queryset=Tag.objects.all(), required=False)