コード例 #1
0
ファイル: forms.py プロジェクト: w33ha-zxc/netbox
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',
        ]
コード例 #2
0
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/")
        }
コード例 #3
0
ファイル: forms.py プロジェクト: w33ha-zxc/netbox
 class Meta:
     model = VLANGroup
     fields = [
         'site', 'name', 'slug',
     ]
     widgets = {
         'site': APISelect(
             api_url="/api/dcim/sites/"
         )
     }
コード例 #4
0
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')
コード例 #5
0
 class Meta:
     model = Secret
     fields = [
         'role',
         'name',
         'plaintext',
         'plaintext2',
         'tags',
     ]
     widgets = {'role': APISelect(api_url="/api/secrets/secret-roles/")}
コード例 #6
0
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',
        ]
コード例 #7
0
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',
        ]
コード例 #8
0
ファイル: forms.py プロジェクト: yuyongwei/netbox
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 = []
コード例 #9
0
ファイル: forms.py プロジェクト: wuwx/netbox
 class Meta:
     model = Tenant
     fields = [
         'name',
         'slug',
         'group',
         'description',
         'comments',
         'tags',
     ]
     widgets = {'group': APISelect(api_url="/api/tenancy/tenant-groups/")}
コード例 #10
0
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"]
コード例 #11
0
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',
    )
コード例 #12
0
 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(),
     }
コード例 #13
0
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)
コード例 #14
0
 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')
     }
コード例 #15
0
 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/")
     }
コード例 #16
0
ファイル: forms.py プロジェクト: UrosTodorovic/netbox
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"
        }
コード例 #17
0
 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/"
         )
     }
コード例 #18
0
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", )
コード例 #19
0
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 = []
コード例 #20
0
ファイル: forms.py プロジェクト: wuwx/netbox
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',
        ]
コード例 #21
0
ファイル: forms.py プロジェクト: yuta2/netbox
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',
        ]
コード例 #22
0
 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/"
         )
     }
コード例 #23
0
ファイル: forms.py プロジェクト: vrnaveenkr/netbox
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',
        ]
コード例 #24
0
 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/')
     }
コード例 #25
0
ファイル: forms.py プロジェクト: vrnaveenkr/netbox
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',
        ]
コード例 #26
0
 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"
     }
コード例 #27
0
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',
        ]
コード例 #28
0
ファイル: forms.py プロジェクト: ffddorf/netbox
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',
        ]
コード例 #29
0
 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/"
         )
     }
コード例 #30
0
ファイル: forms.py プロジェクト: wuwx/netbox
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',
        ]