class IPAddressBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=IPAddress.objects.all(), widget=forms.MultipleHiddenInput() ) vrf = forms.ModelChoiceField( queryset=VRF.objects.all(), required=False, label='VRF', widget=APISelect( api_url="/api/ipam/vrfs/" ) ) mask_length = forms.IntegerField( min_value=1, max_value=128, required=False ) tenant = forms.ModelChoiceField( queryset=Tenant.objects.all(), required=False, widget=APISelect( api_url="/api/tenancy/tenants/" ) ) status = forms.ChoiceField( choices=add_blank_choice(IPADDRESS_STATUS_CHOICES), required=False, widget=StaticSelect2() ) role = forms.ChoiceField( choices=add_blank_choice(IPADDRESS_ROLE_CHOICES), required=False, widget=StaticSelect2() ) description = forms.CharField( max_length=100, required=False ) class Meta: nullable_fields = [ 'vrf', 'role', 'tenant', 'description', ]
class VLANForm(BootstrapMixin, TenancyForm, CustomFieldForm): site = forms.ModelChoiceField(queryset=Site.objects.all(), required=False, widget=APISelect( api_url="/api/dcim/sites/", filter_for={'group': 'site_id'}, attrs={ 'nullable': 'true', })) group = ChainedModelChoiceField(queryset=VLANGroup.objects.all(), chains=(('site', 'site'), ), required=False, label='Group', widget=APISelect( api_url='/api/ipam/vlan-groups/', )) tags = TagField(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(), 'role': APISelect(api_url="/api/ipam/roles/") }
class Meta: model = VLANGroup fields = [ 'site', 'name', 'slug', ] widgets = { 'site': APISelect( api_url="/api/dcim/sites/" ) }
class ProviderFilterForm(BootstrapMixin, CustomFieldFilterForm): model = Provider q = forms.CharField(required=False, label='Search') site = FilterChoiceField(queryset=Site.objects.all(), to_field_name='slug', widget=APISelect( api_url="/api/dcim/sites/", value_field="slug", )) asn = forms.IntegerField(required=False, label='ASN')
class Meta: model = Secret fields = [ 'role', 'name', 'plaintext', 'plaintext2', 'tags', ] widgets = {'role': APISelect(api_url="/api/secrets/secret-roles/")}
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 VirtualMachineBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditForm): pk = forms.ModelMultipleChoiceField(queryset=VirtualMachine.objects.all(), widget=forms.MultipleHiddenInput()) status = forms.ChoiceField( choices=add_blank_choice(VM_STATUS_CHOICES), required=False, initial='', widget=StaticSelect2(), ) cluster = forms.ModelChoiceField( queryset=Cluster.objects.all(), required=False, widget=APISelect(api_url='/api/virtualization/clusters/')) role = forms.ModelChoiceField( queryset=DeviceRole.objects.filter(vm_role=True), required=False, widget=APISelect(api_url="/api/dcim/device-roles/", additional_query_params={"vm_role": "true"})) tenant = forms.ModelChoiceField( queryset=Tenant.objects.all(), required=False, widget=APISelect(api_url='/api/tenancy/tenants/')) platform = forms.ModelChoiceField( queryset=Platform.objects.all(), required=False, widget=APISelect(api_url='/api/dcim/platforms/')) 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()) class Meta: nullable_fields = [ 'role', 'tenant', 'platform', 'vcpus', 'memory', 'disk', 'comments', ]
class PowerOutletConnectionForm(forms.Form, BootstrapMixin): rack = forms.ModelChoiceField(queryset=Rack.objects.all(), label='Rack', required=False, widget=forms.Select(attrs={'filter-for': 'device'})) device = forms.ModelChoiceField(queryset=Device.objects.all(), label='Device', required=False, widget=APISelect(api_url='/api/dcim/devices/?rack_id={{rack}}', attrs={'filter-for': 'port'})) livesearch = forms.CharField(required=False, label='Device', widget=Livesearch( query_key='q', query_url='dcim-api:device_list', field_to_update='device') ) port = forms.ModelChoiceField(queryset=PowerPort.objects.all(), label='Port', widget=APISelect(api_url='/api/dcim/devices/{{device}}/power-ports/', disabled_indicator='power_outlet')) connection_status = forms.BooleanField(required=False, initial=CONNECTION_STATUS_CONNECTED, label='Status', widget=forms.Select(choices=CONNECTION_STATUS_CHOICES)) class Meta: fields = ['rack', 'device', 'livesearch', 'port', 'connection_status'] labels = { 'connection_status': 'Status', } def __init__(self, poweroutlet, *args, **kwargs): super(PowerOutletConnectionForm, self).__init__(*args, **kwargs) self.fields['rack'].queryset = Rack.objects.filter(site=poweroutlet.device.rack.site) # Initialize device choices if self.is_bound and self.data.get('rack'): self.fields['device'].queryset = Device.objects.filter(rack=self.data['rack']) elif self.initial.get('rack', None): self.fields['device'].queryset = Device.objects.filter(rack=self.initial['rack']) else: self.fields['device'].choices = [] # Initialize port choices if self.is_bound: self.fields['port'].queryset = PowerPort.objects.filter(device__pk=self.data['device']) elif self.initial.get('device', None): self.fields['port'].queryset = PowerPort.objects.filter(device_pk=self.initial['device']) else: self.fields['port'].choices = []
class Meta: model = Tenant fields = [ 'name', 'slug', 'group', 'description', 'comments', 'tags', ] widgets = {'group': APISelect(api_url="/api/tenancy/tenant-groups/")}
class SoftwareForm(BootstrapMixin, forms.ModelForm): name = forms.CharField(required=True, label="Name", help_text="Name of the software") software_type = DynamicModelChoiceField( queryset=SoftwareType.objects.all(), required=True, widget=APISelect(api_url="/api/plugins/licences/software-types/", )) provider = DynamicModelChoiceField( queryset=SoftwareProvider.objects.all(), required=True, widget=APISelect( api_url="/api/plugins/licences/software-providers/", )) class Meta: model = Software fields = ["name", "provider", "software_type"]
class IPAddressAssignForm(BootstrapMixin, forms.Form): vrf_id = forms.ModelChoiceField( queryset=VRF.objects.all(), required=False, label='VRF', empty_label='Global', widget=APISelect(api_url="/api/ipam/vrfs/")) q = forms.CharField( required=False, label='Search', )
class Meta: model = Circuit fields = [ 'cid', 'type', 'provider', 'status', 'install_date', 'commit_rate', 'description', 'tenant_group', 'tenant', 'comments', 'tags', ] help_texts = { 'cid': "Unique circuit ID", 'commit_rate': "Committed rate", } widgets = { 'provider': APISelect( api_url="/api/circuits/providers/" ), 'type': APISelect( api_url="/api/circuits/circuit-types/" ), 'status': StaticSelect2(), 'install_date': DatePicker(), }
class InterfaceCreateForm(BootstrapMixin, forms.Form): virtual_machine = forms.ModelChoiceField( queryset=VirtualMachine.objects.all(), widget=forms.HiddenInput()) name_pattern = ExpandableNameField(label='Name') type = forms.ChoiceField(choices=VMInterfaceTypeChoices, initial=VMInterfaceTypeChoices.TYPE_VIRTUAL, widget=forms.HiddenInput()) 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, widget=APISelect( display_field='display_name', full=True, additional_query_params={ 'site_id': 'null', }, )) tagged_vlans = DynamicModelMultipleChoiceField( queryset=VLAN.objects.all(), required=False, widget=APISelectMultiple( display_field='display_name', full=True, additional_query_params={ 'site_id': 'null', }, )) tags = TagField(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')) site = getattr(virtual_machine.cluster, 'site', None) if site is not None: # Add current site to VLANs query params self.fields['untagged_vlan'].widget.add_additional_query_param( 'site_id', site.pk) self.fields['tagged_vlans'].widget.add_additional_query_param( 'site_id', site.pk)
class Meta: model = IPAddress fields = [ 'address', 'vrf', 'tenant', 'status', 'nat_inside', 'description' ] widgets = { 'nat_inside': APISelect( api_url='/api/ipam/ip-addresses/?device_id={{nat_device}}', display_field='address') }
class Meta: model = Prefix fields = [ 'prefix', 'vrf', 'site', 'vlan', 'status', 'role', 'is_pool', 'description', 'tenant_group', 'tenant', 'tags', ] widgets = { 'vrf': APISelect(api_url="/api/ipam/vrfs/"), 'status': StaticSelect2(), 'role': APISelect(api_url="/api/ipam/roles/") }
class VRFForm(BootstrapMixin, CustomFieldForm): tags = TagField(required=False) tenant_group = forms.ModelChoiceField( queryset=TenantGroup.objects.all(), required=False, widget=forms.Select( attrs={'filter-for': 'tenant', 'nullable': 'true'} ) ) tenant = ChainedModelChoiceField( queryset=Tenant.objects.all(), chains=( ('group', 'tenant_group'), ), required=False, widget=APISelect( api_url='/api/tenancy/tenants/?group_id={{tenant_group}}', attrs={'filter-for': 'device', 'nullable': 'true'}, ) ) device = ChainedModelChoiceField( queryset=Device.objects.all(), chains=( ('tenant', 'tenant'), ), required=True, widget=APISelect( api_url='/api/dcim/devices/?tenant_id={{tenant}}' ) ) class Meta: model = VRF fields = ['name', 'rd', 'enforce_unique', 'description', 'tenant_group', 'tenant', 'device', 'tags'] labels = { 'rd': "RD", } help_texts = { 'rd': "Route distinguisher in any format", 'device': "Device on which the VRF is configured" }
class Meta: model = IPAddress fields = [ 'address', 'vrf', 'status', 'role', 'dns_name', 'description', 'tenant_group', 'tenant', ] widgets = { 'status': StaticSelect2(), 'role': StaticSelect2(), 'vrf': APISelect( api_url="/api/ipam/vrfs/" ) }
class AccountForm(BootstrapMixin, forms.ModelForm): primary_applicant = DynamicModelChoiceField( queryset=Customer.objects.all(), required=True, display_field='name', widget=APISelect(api_url='/api/plugins/netbox_netisp/customers/'), ) class Meta: model = Account fields = ("primary_applicant", )
class IPAddressAssignForm(BootstrapMixin, forms.Form): site = forms.ModelChoiceField( queryset=Site.objects.all(), label='Site', required=False, widget=forms.Select(attrs={'filter-for': 'rack'})) rack = forms.ModelChoiceField( queryset=Rack.objects.all(), label='Rack', required=False, widget=APISelect(api_url='/api/dcim/racks/?site_id={{site}}', display_field='display_name', attrs={'filter-for': 'device'})) device = forms.ModelChoiceField( queryset=Device.objects.all(), label='Device', required=False, widget=APISelect(api_url='/api/dcim/devices/?rack_id={{rack}}', display_field='display_name', attrs={'filter-for': 'interface'})) livesearch = forms.CharField(required=False, label='Device', widget=Livesearch( query_key='q', query_url='dcim-api:device_list', field_to_update='device')) interface = forms.ModelChoiceField( queryset=Interface.objects.all(), label='Interface', widget=APISelect(api_url='/api/dcim/devices/{{device}}/interfaces/')) set_as_primary = forms.BooleanField(label='Set as primary IP for device', required=False) def __init__(self, *args, **kwargs): super(IPAddressAssignForm, self).__init__(*args, **kwargs) self.fields['rack'].choices = [] self.fields['device'].choices = [] self.fields['interface'].choices = []
class TenantBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditForm): pk = forms.ModelMultipleChoiceField(queryset=Tenant.objects.all(), widget=forms.MultipleHiddenInput()) group = forms.ModelChoiceField( queryset=TenantGroup.objects.all(), required=False, widget=APISelect(api_url="/api/tenancy/tenant-groups/")) class Meta: nullable_fields = [ 'group', ]
class ClusterBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=Cluster.objects.all(), widget=forms.MultipleHiddenInput() ) type = forms.ModelChoiceField( queryset=ClusterType.objects.all(), required=False, widget=APISelect( api_url="/api/virtualization/cluster-types/" ) ) group = forms.ModelChoiceField( queryset=ClusterGroup.objects.all(), required=False, widget=APISelect( api_url="/api/virtualization/cluster-groups/" ) ) tenant = forms.ModelChoiceField( queryset=Tenant.objects.all(), required=False ) site = forms.ModelChoiceField( queryset=Site.objects.all(), required=False, widget=APISelect( api_url="/api/dcim/sites/" ) ) comments = CommentField( widget=SmallTextarea, label='Comments' ) class Meta: nullable_fields = [ 'group', 'site', 'comments', 'tenant', ]
class Meta: model = IPAddress fields = [ 'address', 'vrf', 'status', 'role', 'dns_name', 'description', 'interface', 'primary_for_parent', 'nat_site', 'nat_rack', 'nat_inside', 'tenant_group', 'tenant', 'tags', ] widgets = { 'status': StaticSelect2(), 'role': StaticSelect2(), 'vrf': APISelect( api_url="/api/ipam/vrfs/" ) }
class PrefixBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditForm): pk = forms.ModelMultipleChoiceField(queryset=Prefix.objects.all(), widget=forms.MultipleHiddenInput()) site = DynamicModelChoiceField( queryset=Site.objects.all(), required=False, widget=APISelect(api_url="/api/dcim/sites/")) vrf = DynamicModelChoiceField(queryset=VRF.objects.all(), required=False, label='VRF', widget=APISelect(api_url="/api/ipam/vrfs/")) prefix_length = forms.IntegerField(min_value=PREFIX_LENGTH_MIN, max_value=PREFIX_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(PrefixStatusChoices), required=False, widget=StaticSelect2()) role = DynamicModelChoiceField( queryset=Role.objects.all(), required=False, widget=APISelect(api_url="/api/ipam/roles/")) 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 Meta: model = VirtualMachine fields = [ 'name', 'status', 'cluster_group', 'cluster', 'role', 'tenant_group', 'tenant', 'platform', 'primary_ip4', 'primary_ip6', 'vcpus', 'memory', 'disk', 'comments', 'tags', 'local_context_data', ] help_texts = { 'local_context_data': "Local config context data overwrites all sources contexts in the final rendered " "config context", } widgets = { "status": StaticSelect2(), "role": APISelect(api_url="/api/dcim/device-roles/", additional_query_params={"vm_role": "True"}), 'primary_ip4': StaticSelect2(), 'primary_ip6': StaticSelect2(), 'platform': APISelect(api_url='/api/dcim/platforms/') }
class VLANGroupForm(BootstrapMixin, forms.ModelForm): site = DynamicModelChoiceField( queryset=Site.objects.all(), required=False, widget=APISelect(api_url="/api/dcim/sites/")) slug = SlugField() class Meta: model = VLANGroup fields = [ 'site', 'name', 'slug', ]
class Meta: model = DiscoveryRequest fields = [ 'prefix', 'update_existing', 'platform', 'site', 'device_role' ] widgets = { 'platform': APISelect( api_url="/api/dcim/platforms/" ), 'site': APISelect( api_url="/api/dcim/sites/" ), 'device_role': APISelect( api_url="/api/dcim/device-roles/" ), } help_texts = { 'prefix': "CIDR preix to scan for discovery", 'site': "Site in which to look for and create new devices", 'update_existing': "Update existing devices if they already exist in NetBox", 'device_role': "Device role to use for new and updated devices", 'platform': "Device platform which contains the applicable NAPALM driver" }
class SecretBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditForm): pk = forms.ModelMultipleChoiceField(queryset=Secret.objects.all(), widget=forms.MultipleHiddenInput()) role = DynamicModelChoiceField( queryset=SecretRole.objects.all(), required=False, widget=APISelect(api_url="/api/secrets/secret-roles/")) name = forms.CharField(max_length=100, required=False) class Meta: nullable_fields = [ 'name', ]
class TenantGroupForm(BootstrapMixin, forms.ModelForm): parent = DynamicModelChoiceField( queryset=TenantGroup.objects.all(), required=False, widget=APISelect(api_url="/api/tenancy/tenant-groups/")) slug = SlugField() class Meta: model = TenantGroup fields = [ 'parent', 'name', 'slug', 'description', ]
class Meta: model = Aggregate fields = [ 'prefix', 'rir', 'date_added', 'description', 'tags', ] help_texts = { 'prefix': "IPv4 or IPv6 network", 'rir': "Regional Internet Registry responsible for this prefix", 'date_added': "Format: YYYY-MM-DD", } widgets = { 'rir': APISelect( api_url="/api/ipam/rirs/" ) }
class AggregateBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditForm): pk = forms.ModelMultipleChoiceField(queryset=Aggregate.objects.all(), widget=forms.MultipleHiddenInput()) rir = forms.ModelChoiceField(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', ]