class BackupFileFilterForm(BootstrapMixin, forms.Form): model = BackupFile q = forms.CharField( required=False, label='Search' ) upload_server_id = forms.ModelChoiceField( queryset=UploadServer.objects.all(), required=False, to_field_name='id', label='Upload Server', widget=StaticSelect2() )
class Meta: model = IPAddress fields = [ 'address', 'vrf', 'status', 'role', '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 ObjectChangeFilterForm(BootstrapMixin, forms.Form): model = ObjectChange q = forms.CharField(required=False, label='Search') time_after = forms.DateTimeField(label='After', required=False, widget=DateTimePicker()) time_before = forms.DateTimeField(label='Before', required=False, widget=DateTimePicker()) action = forms.ChoiceField( choices=add_blank_choice(ObjectChangeActionChoices), required=False, widget=StaticSelect2()) # TODO: Convert to DynamicModelMultipleChoiceField once we have an API endpoint for users user = forms.ModelChoiceField(queryset=User.objects.order_by('username'), required=False, widget=StaticSelect2()) changed_object_type = forms.ModelChoiceField( queryset=ContentType.objects.order_by('model'), required=False, widget=ContentTypeSelect(), label='Object Type')
class AggregateFilterForm(BootstrapMixin, CustomFieldFilterForm): model = Aggregate q = forms.CharField(required=False, label='Search') family = forms.ChoiceField( required=False, choices=add_blank_choice(IPAddressFamilyChoices), label='Address family', widget=StaticSelect2()) rir = DynamicModelMultipleChoiceField(queryset=RIR.objects.all(), to_field_name='slug', required=False, label='RIR') tag = TagFilterField(model)
class IPAddressFilterForm(BootstrapMixin, CustomFieldFilterForm): model = IPAddress 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=IP_FAMILY_CHOICES, label='Address family', widget=StaticSelect2()) mask_length = forms.ChoiceField(required=False, choices=IPADDRESS_MASK_LENGTH_CHOICES, label='Mask length', widget=StaticSelect2()) vrf = FilterChoiceField(queryset=VRF.objects.all(), to_field_name='rd', label='VRF', null_label='-- Global --', widget=APISelectMultiple( api_url="/api/ipam/vrfs/", value_field="rd", null_option=True, )) tenant = FilterChoiceField(queryset=Tenant.objects.all(), to_field_name='slug', null_label='-- None --', widget=APISelectMultiple( api_url="/api/tenancy/tenants/", value_field="slug", null_option=True, )) status = forms.MultipleChoiceField(choices=IPADDRESS_STATUS_CHOICES, required=False, widget=StaticSelect2Multiple()) role = forms.MultipleChoiceField(choices=IPADDRESS_ROLE_CHOICES, required=False, widget=StaticSelect2Multiple())
class VMInterfaceFilterForm(forms.Form): model = VMInterface cluster_id = DynamicModelMultipleChoiceField( queryset=Cluster.objects.all(), required=False, label='Cluster') virtual_machine_id = DynamicModelMultipleChoiceField( queryset=VirtualMachine.objects.all(), required=False, label='Virtual machine', query_params={'cluster_id': '$cluster_id'}) enabled = forms.NullBooleanField( required=False, widget=StaticSelect2(choices=BOOLEAN_WITH_BLANK_CHOICES)) tag = TagFilterField(model)
class Meta: model = Service fields = [ 'name', 'protocol', 'port', 'ipaddresses', 'description', 'tags', ] help_texts = { 'ipaddresses': "IP address assignment is optional. If no IPs are selected, the service is assumed to be " "reachable via all IPs assigned to the device.", } widgets = { 'protocol': StaticSelect2(), 'ipaddresses': StaticSelect2Multiple(), }
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', ] fieldsets = ( ('Virtual Machine', ('name', 'role', 'status', 'tags')), ('Cluster', ('cluster_group', 'cluster')), ('Tenancy', ('tenant_group', 'tenant')), ('Management', ('platform', 'primary_ip4', 'primary_ip6')), ('Resources', ('vcpus', 'memory', 'disk')), ('Config Context', ('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(), 'primary_ip4': StaticSelect2(), 'primary_ip6': StaticSelect2(), }
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 Meta: model = Prefix fields = [ 'prefix', 'vrf', 'site', 'vlan', 'status', 'role', 'is_pool', 'description', 'tenant_group', 'tenant', 'tags', ] fieldsets = ( ('Prefix', ('prefix', 'status', 'vrf', 'role', 'is_pool', 'description', 'tags')), ('Site/VLAN Assignment', ('region', 'site_group', 'site', 'vlan_group', 'vlan')), ('Tenancy', ('tenant_group', 'tenant')), ) widgets = { 'status': StaticSelect2(), }
class AggregateFilterForm(BootstrapMixin, CustomFieldFilterForm): model = Aggregate q = forms.CharField(required=False, label='Search') family = forms.ChoiceField(required=False, choices=IP_FAMILY_CHOICES, label='Address family', widget=StaticSelect2()) rir = FilterChoiceField(queryset=RIR.objects.all(), to_field_name='slug', label='RIR', widget=APISelectMultiple( api_url="/api/ipam/rirs/", value_field="slug", ))
class VLANBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=VLAN.objects.all(), widget=forms.MultipleHiddenInput() ) region = DynamicModelChoiceField( queryset=Region.objects.all(), required=False ) site_group = DynamicModelChoiceField( queryset=SiteGroup.objects.all(), required=False ) site = DynamicModelChoiceField( queryset=Site.objects.all(), required=False, query_params={ 'region_id': '$region', 'group_id': '$site_group', } ) group = DynamicModelChoiceField( queryset=VLANGroup.objects.all(), required=False, query_params={ 'site_id': '$site' } ) tenant = DynamicModelChoiceField( queryset=Tenant.objects.all(), required=False ) status = forms.ChoiceField( choices=add_blank_choice(VLANStatusChoices), required=False, widget=StaticSelect2() ) role = DynamicModelChoiceField( queryset=Role.objects.all(), required=False ) description = forms.CharField( max_length=100, required=False ) class Meta: nullable_fields = [ 'site', 'group', 'tenant', 'role', 'description', ]
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 = { 'status': StaticSelect2(), 'install_date': DatePicker(), }
class CircuitBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=Circuit.objects.all(), widget=forms.MultipleHiddenInput ) type = forms.ModelChoiceField( queryset=CircuitType.objects.all(), required=False, widget=APISelect( api_url="/api/circuits/circuit-types/" ) ) provider = forms.ModelChoiceField( queryset=Provider.objects.all(), required=False, widget=APISelect( api_url="/api/circuits/providers/" ) ) status = forms.ChoiceField( choices=add_blank_choice(CircuitStatusChoices), required=False, initial='', widget=StaticSelect2() ) tenant = forms.ModelChoiceField( queryset=Tenant.objects.all(), required=False, widget=APISelect( api_url="/api/tenancy/tenants/" ) ) commit_rate = forms.IntegerField( required=False, label='Commit rate (Kbps)' ) description = forms.CharField( max_length=100, required=False ) comments = CommentField( widget=SmallTextarea, label='Comments' ) class Meta: nullable_fields = [ 'tenant', 'commit_rate', 'description', 'comments', ]
class ASNBulkEditForm(BootstrapMixin, BulkEditForm): 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=StaticSelect2()) class Meta: nullable_fields = [ 'tenant', 'description', ]
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 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 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, }
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 VLANBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=VLAN.objects.all(), widget=forms.MultipleHiddenInput() ) site = forms.ModelChoiceField( queryset=Site.objects.all(), required=False, widget=APISelect( api_url="/api/dcim/sites/" ) ) group = forms.ModelChoiceField( queryset=VLANGroup.objects.all(), required=False, widget=APISelect( api_url="/api/ipam/vlan-groups/" ) ) tenant = forms.ModelChoiceField( queryset=Tenant.objects.all(), required=False, widget=APISelect( api_url="/api/tenancy/tenants/" ) ) status = forms.ChoiceField( choices=add_blank_choice(VLAN_STATUS_CHOICES), required=False, widget=StaticSelect2() ) role = forms.ModelChoiceField( 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 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 ServiceBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditForm): pk = forms.ModelMultipleChoiceField(queryset=Service.objects.all(), widget=forms.MultipleHiddenInput()) protocol = forms.ChoiceField( choices=add_blank_choice(ServiceProtocolChoices), required=False, widget=StaticSelect2()) ports = NumericArrayField(base_field=forms.IntegerField( min_value=SERVICE_PORT_MIN, max_value=SERVICE_PORT_MAX), required=False) description = forms.CharField(max_length=100, required=False) class Meta: nullable_fields = [ 'description', ]
class Meta: model = Prefix fields = [ 'prefix', 'vrf', 'site', 'vlan', 'status', 'role', 'is_pool', 'description', 'tenant_group', 'tenant', 'tags', ] widgets = { 'status': StaticSelect2(), }
class ServiceBulkEditForm(BootstrapMixin, CustomFieldBulkEditForm): pk = forms.ModelMultipleChoiceField(queryset=Service.objects.all(), widget=forms.MultipleHiddenInput()) protocol = forms.ChoiceField( choices=add_blank_choice(ServiceProtocolChoices), required=False, widget=StaticSelect2()) port = forms.IntegerField(validators=[ MinValueValidator(1), MaxValueValidator(65535), ], required=False) description = forms.CharField(max_length=100, required=False) class Meta: nullable_fields = [ 'description', ]
class AggregateFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm): model = Aggregate field_order = ['q', 'family', 'rir', 'tenant_group_id', 'tenant_id'] q = forms.CharField( required=False, label=_('Search') ) family = forms.ChoiceField( required=False, choices=add_blank_choice(IPAddressFamilyChoices), label=_('Address family'), widget=StaticSelect2() ) rir_id = DynamicModelMultipleChoiceField( queryset=RIR.objects.all(), required=False, label=_('RIR') ) tag = TagFilterField(model)
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 Meta: model = Circuit fields = [ 'cid', 'type', 'provider', 'status', 'install_date', 'commit_rate', 'description', 'tenant_group', 'tenant', 'comments', 'tags', ] help_texts = { 'cid': "Unique circuit ID", 'install_date': "Format: YYYY-MM-DD", 'commit_rate': "Committed rate", } widgets = { 'provider': APISelect( api_url="/api/circuits/providers/" ), 'type': APISelect( api_url="/api/circuits/circuit-types/" ), 'status': StaticSelect2(), }
class JournalEntryFilterForm(BootstrapMixin, forms.Form): model = JournalEntry q = forms.CharField(required=False, label=_('Search')) created_after = forms.DateTimeField(required=False, label=_('After'), widget=DateTimePicker()) created_before = forms.DateTimeField(required=False, label=_('Before'), widget=DateTimePicker()) created_by_id = DynamicModelMultipleChoiceField( queryset=User.objects.all(), required=False, label=_('User'), widget=APISelectMultiple(api_url='/api/users/users/', )) assigned_object_type_id = DynamicModelMultipleChoiceField( queryset=ContentType.objects.all(), required=False, label=_('Object Type'), widget=APISelectMultiple(api_url='/api/extras/content-types/', )) kind = forms.ChoiceField(choices=add_blank_choice(JournalEntryKindChoices), required=False, widget=StaticSelect2())
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 ObjectChangeFilterForm(BootstrapMixin, forms.Form): model = ObjectChange q = forms.CharField( required=False, label='Search' ) time_after = forms.DateTimeField( label='After', required=False, widget=DateTimePicker() ) time_before = forms.DateTimeField( label='Before', required=False, widget=DateTimePicker() ) action = forms.ChoiceField( choices=add_blank_choice(ObjectChangeActionChoices), required=False, widget=StaticSelect2() ) user_id = DynamicModelMultipleChoiceField( queryset=User.objects.all(), required=False, display_field='username', label='User', widget=APISelectMultiple( api_url='/api/users/users/', ) ) changed_object_type_id = DynamicModelMultipleChoiceField( queryset=ContentType.objects.all(), required=False, display_field='display_name', label='Object Type', widget=APISelectMultiple( api_url='/api/extras/content-types/', ) )