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 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="slug", 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 Meta: model = SecretRole fields = [ 'name', 'slug', 'description', 'users', 'groups', ] widgets = { 'users': StaticSelect2Multiple(), 'groups': StaticSelect2Multiple(), }
class IPAddressFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm): model = IPAddress field_order = [ 'q', 'parent', 'family', 'mask_length', 'vrf_id', 'status', 'role', 'assigned_to_interface', 'tenant_group', 'tenant', ] 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_id = FilterChoiceField( queryset=VRF.objects.all(), label='VRF', null_label='-- Global --', widget=APISelectMultiple( api_url="/api/ipam/vrfs/", 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() ) assigned_to_interface = forms.NullBooleanField( required=False, label='Assigned to an interface', widget=StaticSelect2( choices=BOOLEAN_WITH_BLANK_CHOICES ) )
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 VLANFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm): model = VLAN field_order = [ 'q', 'site', 'group_id', 'status', 'role', 'tenant_group', 'tenant' ] q = forms.CharField(required=False, label='Search') site = FilterChoiceField(queryset=Site.objects.all(), to_field_name='slug', null_label='-- Global --', widget=APISelectMultiple( api_url="/api/dcim/sites/", value_field="slug", null_option=True, )) group_id = FilterChoiceField(queryset=VLANGroup.objects.all(), label='VLAN group', null_label='-- None --', widget=APISelectMultiple( api_url="/api/ipam/vlan-groups/", null_option=True, )) status = forms.MultipleChoiceField(choices=VLAN_STATUS_CHOICES, required=False, widget=StaticSelect2Multiple()) role = FilterChoiceField(queryset=Role.objects.all(), to_field_name='slug', null_label='-- None --', widget=APISelectMultiple( api_url="/api/ipam/roles/", value_field="slug", null_option=True, ))
class CircuitFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm): model = Circuit field_order = [ 'q', 'type', 'provider', 'status', 'region', 'site', 'tenant_group', 'tenant', 'commit_rate', ] q = forms.CharField(required=False, label='Search') type = DynamicModelMultipleChoiceField(queryset=CircuitType.objects.all(), to_field_name='slug', required=False) provider = DynamicModelMultipleChoiceField(queryset=Provider.objects.all(), to_field_name='slug', required=False) status = forms.MultipleChoiceField(choices=CircuitStatusChoices, required=False, widget=StaticSelect2Multiple()) region = DynamicModelMultipleChoiceField(queryset=Region.objects.all(), to_field_name='slug', required=False) site = DynamicModelMultipleChoiceField(queryset=Site.objects.all(), to_field_name='slug', required=False, query_params={'region': '$region'}) commit_rate = forms.IntegerField(required=False, min_value=0, label='Commit rate (Kbps)') tag = TagFilterField(model)
class VLANFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm): model = VLAN field_order = [ 'q', 'region', 'site', 'group_id', 'status', 'role', 'tenant_group', 'tenant' ] q = forms.CharField(required=False, label='Search') region = DynamicModelMultipleChoiceField(queryset=Region.objects.all(), to_field_name='slug', required=False) site = DynamicModelMultipleChoiceField(queryset=Site.objects.all(), to_field_name='slug', required=False, null_option='None', query_params={'region': '$region'}) group_id = DynamicModelMultipleChoiceField( queryset=VLANGroup.objects.all(), required=False, label='VLAN group', null_option='None', query_params={'region': '$region'}) status = forms.MultipleChoiceField(choices=VLANStatusChoices, required=False, widget=StaticSelect2Multiple()) role = DynamicModelMultipleChoiceField(queryset=Role.objects.all(), to_field_name='slug', required=False, null_option='None') tag = TagFilterField(model)
class ServiceMappingFilterForm(BootstrapMixin, forms.ModelForm): model = Device field_order = ['q', 'status', 'role', 'tenant', 'device_type_id', 'tag'] q = forms.CharField(required=False, label='Search device or service') tenant = DynamicModelMultipleChoiceField( queryset=Tenant.objects.all(), to_field_name='slug', required=False, widget=APISelectMultiple( # value_field="slug", # null_option=True, )) role = DynamicModelMultipleChoiceField( queryset=DeviceRole.objects.all(), to_field_name='slug', required=False, widget=APISelectMultiple( # value_field="slug", )) device_type_id = DynamicModelMultipleChoiceField( queryset=DeviceType.objects.all(), required=False, label='Model', display_field="model", widget=APISelectMultiple()) status = forms.MultipleChoiceField(label='Status', choices=ServiceComplianceChoices, required=False, widget=StaticSelect2Multiple()) tag = TagFilterField(model) class Meta: model = Device fields = ['q', 'status', 'role', 'tenant', 'device_type_id', 'tag']
class CircuitFilterForm(BootstrapMixin, CustomFieldFilterForm): model = Circuit q = forms.CharField(required=False, label='Search') type = FilterChoiceField(queryset=CircuitType.objects.all(), to_field_name='slug', widget=APISelectMultiple( api_url="/api/circuits/circuit-types/", value_field="slug", )) provider = FilterChoiceField(queryset=Provider.objects.all(), to_field_name='slug', widget=APISelectMultiple( api_url="/api/circuits/providers/", value_field="slug", )) status = forms.MultipleChoiceField(choices=CIRCUIT_STATUS_CHOICES, required=False, widget=StaticSelect2Multiple()) 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, )) site = FilterChoiceField(queryset=Site.objects.all(), to_field_name='slug', widget=APISelectMultiple( api_url="/api/dcim/sites/", value_field="slug", )) commit_rate = forms.IntegerField(required=False, min_value=0, label='Commit rate (Kbps)')
class ServiceFilterForm(BootstrapMixin, CustomFieldFilterForm): model = Service q = forms.CharField(required=False, label='Search') protocol = forms.ChoiceField(choices=add_blank_choice(IP_PROTOCOL_CHOICES), required=False, widget=StaticSelect2Multiple()) port = forms.IntegerField(required=False, )
class PrefixFilterForm(BootstrapMixin, CustomFieldFilterForm): model = Prefix q = forms.CharField(required=False, label='Search') within_include = forms.CharField( required=False, widget=forms.TextInput(attrs={ 'placeholder': 'Prefix', }), label='Search within') family = forms.ChoiceField(required=False, choices=IP_FAMILY_CHOICES, label='Address family', widget=StaticSelect2()) mask_length = forms.ChoiceField(required=False, choices=PREFIX_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=PREFIX_STATUS_CHOICES, required=False, widget=StaticSelect2Multiple()) site = FilterChoiceField(queryset=Site.objects.all(), to_field_name='slug', null_label='-- None --', widget=APISelectMultiple( api_url="/api/dcim/sites/", value_field="slug", null_option=True, )) role = FilterChoiceField(queryset=Role.objects.all(), to_field_name='slug', null_label='-- None --', widget=APISelectMultiple( api_url="/api/ipam/roles/", value_field="slug", null_option=True, )) is_pool = forms.NullBooleanField( required=False, label='Is a pool', widget=StaticSelect2(choices=BOOLEAN_WITH_BLANK_CHOICES)) expand = forms.BooleanField(required=False, label='Expand prefix hierarchy')
class VirtualMachineFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm): model = VirtualMachine field_order = [ 'q', 'cluster_group_id', 'cluster_type_id', 'cluster_id', 'status', 'role_id', 'region_id', 'site_id', 'tenant_group_id', 'tenant_id', 'platform_id', 'mac_address', ] q = forms.CharField(required=False, label=_('Search')) cluster_group_id = DynamicModelMultipleChoiceField( queryset=ClusterGroup.objects.all(), required=False, null_option='None', label=_('Cluster group')) cluster_type_id = DynamicModelMultipleChoiceField( queryset=ClusterType.objects.all(), required=False, null_option='None', label=_('Cluster type')) cluster_id = DynamicModelMultipleChoiceField( queryset=Cluster.objects.all(), required=False, label=_('Cluster')) region_id = DynamicModelMultipleChoiceField(queryset=Region.objects.all(), required=False, label=_('Region')) site_id = DynamicModelMultipleChoiceField( queryset=Site.objects.all(), required=False, null_option='None', query_params={'region_id': '$region_id'}, label=_('Cluster')) role_id = DynamicModelMultipleChoiceField( queryset=DeviceRole.objects.all(), required=False, null_option='None', query_params={'vm_role': "True"}, label=_('Role')) status = forms.MultipleChoiceField(choices=VirtualMachineStatusChoices, required=False, widget=StaticSelect2Multiple()) platform_id = DynamicModelMultipleChoiceField( queryset=Platform.objects.all(), required=False, null_option='None', label=_('Platform')) mac_address = forms.CharField(required=False, label='MAC address') has_primary_ip = forms.NullBooleanField( required=False, label='Has a primary IP', widget=StaticSelect2(choices=BOOLEAN_WITH_BLANK_CHOICES)) tag = TagFilterField(model)
class PrefixFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm): model = Prefix field_order = [ 'q', 'within_include', 'family', 'mask_length', 'vrf_id', 'status', 'region', 'site', 'role', 'tenant_group', 'tenant', 'is_pool', 'expand', ] mask_length__lte = forms.IntegerField(widget=forms.HiddenInput()) q = forms.CharField(required=False, label='Search') within_include = forms.CharField( required=False, widget=forms.TextInput(attrs={ 'placeholder': 'Prefix', }), label='Search within') family = forms.ChoiceField( required=False, choices=add_blank_choice(IPAddressFamilyChoices), label='Address family', widget=StaticSelect2()) mask_length = forms.ChoiceField(required=False, choices=PREFIX_MASK_LENGTH_CHOICES, label='Mask length', widget=StaticSelect2()) vrf_id = DynamicModelMultipleChoiceField(queryset=VRF.objects.all(), required=False, label='VRF', null_option='Global') status = forms.MultipleChoiceField(choices=PrefixStatusChoices, required=False, widget=StaticSelect2Multiple()) region = DynamicModelMultipleChoiceField(queryset=Region.objects.all(), to_field_name='slug', required=False) site = DynamicModelMultipleChoiceField(queryset=Site.objects.all(), to_field_name='slug', required=False, null_option='None', query_params={'region': '$region'}) role = DynamicModelMultipleChoiceField(queryset=Role.objects.all(), to_field_name='slug', required=False, null_option='None') is_pool = forms.NullBooleanField( required=False, label='Is a pool', widget=StaticSelect2(choices=BOOLEAN_WITH_BLANK_CHOICES)) tag = TagFilterField(model)
class CircuitFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm): model = Circuit field_order = [ 'q', 'type', 'provider', 'status', 'region', 'site', 'tenant_group', 'tenant', 'commit_rate', ] q = forms.CharField( required=False, label='Search' ) type = FilterChoiceField( queryset=CircuitType.objects.all(), to_field_name='slug', widget=APISelectMultiple( api_url="/api/circuits/circuit-types/", value_field="slug", ) ) provider = FilterChoiceField( queryset=Provider.objects.all(), to_field_name='slug', widget=APISelectMultiple( api_url="/api/circuits/providers/", value_field="slug", ) ) status = forms.MultipleChoiceField( choices=CircuitStatusChoices, required=False, widget=StaticSelect2Multiple() ) region = forms.ModelMultipleChoiceField( queryset=Region.objects.all(), to_field_name='slug', required=False, widget=APISelectMultiple( api_url="/api/dcim/regions/", value_field="slug", filter_for={ 'site': 'region' } ) ) site = FilterChoiceField( queryset=Site.objects.all(), to_field_name='slug', widget=APISelectMultiple( api_url="/api/dcim/sites/", value_field="slug", ) ) commit_rate = forms.IntegerField( required=False, min_value=0, label='Commit rate (Kbps)' ) tag = TagFilterField(model)
class VLANFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm): model = VLAN field_order = ['q', 'region', 'site', 'group_id', 'status', 'role', 'tenant_group', 'tenant'] q = forms.CharField( required=False, label='Search' ) region = DynamicModelMultipleChoiceField( queryset=Region.objects.all(), to_field_name='slug', required=False, widget=APISelectMultiple( api_url="/api/dcim/regions/", value_field="slug", filter_for={ 'site': 'region', 'group_id': 'region' } ) ) site = DynamicModelMultipleChoiceField( queryset=Site.objects.all(), to_field_name='slug', required=False, widget=APISelectMultiple( api_url="/api/dcim/sites/", value_field="slug", null_option=True, ) ) group_id = DynamicModelMultipleChoiceField( queryset=VLANGroup.objects.all(), required=False, label='VLAN group', widget=APISelectMultiple( api_url="/api/ipam/vlan-groups/", null_option=True, ) ) status = forms.MultipleChoiceField( choices=VLANStatusChoices, required=False, widget=StaticSelect2Multiple() ) role = DynamicModelMultipleChoiceField( queryset=Role.objects.all(), to_field_name='slug', required=False, widget=APISelectMultiple( api_url="/api/ipam/roles/", value_field="slug", null_option=True, ) ) tag = TagFilterField(model)
class VirtualMachineFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm): model = VirtualMachine field_order = [ 'q', 'cluster_group', 'cluster_type', 'cluster_id', 'status', 'role', 'region', 'site', 'tenant_group', 'tenant', 'platform', 'mac_address', ] q = forms.CharField(required=False, label='Search') cluster_group = DynamicModelMultipleChoiceField( queryset=ClusterGroup.objects.all(), to_field_name='slug', required=False, null_option='None') cluster_type = DynamicModelMultipleChoiceField( queryset=ClusterType.objects.all(), to_field_name='slug', required=False, null_option='None') cluster_id = DynamicModelMultipleChoiceField( queryset=Cluster.objects.all(), required=False, label='Cluster') region = DynamicModelMultipleChoiceField(queryset=Region.objects.all(), to_field_name='slug', required=False) site = DynamicModelMultipleChoiceField(queryset=Site.objects.all(), to_field_name='slug', required=False, null_option='None', query_params={'region': '$region'}) role = DynamicModelMultipleChoiceField( queryset=DeviceRole.objects.filter(vm_role=True), to_field_name='slug', required=False, null_option='None', query_params={'vm_role': "True"}) status = forms.MultipleChoiceField(choices=VirtualMachineStatusChoices, required=False, widget=StaticSelect2Multiple()) platform = DynamicModelMultipleChoiceField(queryset=Platform.objects.all(), to_field_name='slug', required=False, null_option='None') mac_address = forms.CharField(required=False, label='MAC address') 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 VLANFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm): model = VLAN field_order = [ 'q', 'region_id', 'site_group_id', 'site_id', 'group_id', 'status', 'role_id', 'tenant_group_id', 'tenant_id', ] q = forms.CharField( required=False, label='Поиск' ) region_id = DynamicModelMultipleChoiceField( queryset=Region.objects.all(), required=False, label=_('Region') ) site_group_id = DynamicModelMultipleChoiceField( queryset=SiteGroup.objects.all(), required=False, label=_('Site group') ) site_id = DynamicModelMultipleChoiceField( queryset=Site.objects.all(), required=False, null_option='None', query_params={ 'region': '$region' }, label=_('Site') ) group_id = DynamicModelMultipleChoiceField( queryset=VLANGroup.objects.all(), required=False, null_option='None', query_params={ 'region': '$region' }, label=_('VLAN group') ) status = forms.MultipleChoiceField( label='Статус', choices=VLANStatusChoices, required=False, widget=StaticSelect2Multiple() ) role_id = DynamicModelMultipleChoiceField( queryset=Role.objects.all(), required=False, null_option='None', label=_('Role') ) tag = TagFilterField(model)
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 ScheduledTaskFilterForm(BootstrapMixin, forms.ModelForm): model = ScheduledTask q = forms.CharField(required=False, label="Search") task_type = forms.MultipleChoiceField( label="Type", choices=TaskTypeChoices, required=False, widget=StaticSelect2Multiple() ) status = forms.MultipleChoiceField( label="Status", choices=TaskStatusChoices, required=False, widget=StaticSelect2Multiple() ) confirmed = forms.NullBooleanField( required=False, label="Is Confirmed (ACK)", widget=StaticSelect2(choices=BOOLEAN_WITH_BLANK_CHOICES) ) scheduled_time_after = forms.DateTimeField( label=mark_safe("<br/>Scheduled After"), required=False, widget=DateTimePicker() ) scheduled_time_before = forms.DateTimeField(label="Scheduled Before", required=False, widget=DateTimePicker()) start_time_after = forms.DateTimeField( label=mark_safe("<br/>Started After"), required=False, widget=DateTimePicker() ) start_time_before = forms.DateTimeField(label="Started Before", required=False, widget=DateTimePicker()) end_time_after = forms.DateTimeField(label=mark_safe("<br/>Ended After"), required=False, widget=DateTimePicker()) end_time_before = forms.DateTimeField(label="Ended Before", required=False, widget=DateTimePicker()) class Meta: model = ScheduledTask fields = [ "q", "task_type", "status", "confirmed", "scheduled_time_after", "scheduled_time_before", "start_time_after", "start_time_before", "end_time_after", "end_time_before", ]
class ServiceFilterForm(BootstrapMixin, CustomFieldFilterForm): model = Service q = forms.CharField( required=False, label=_('Search') ) protocol = forms.ChoiceField( choices=add_blank_choice(ServiceProtocolChoices), required=False, widget=StaticSelect2Multiple() ) port = forms.IntegerField( required=False, ) tag = TagFilterField(model)
class ConfigContextForm(BootstrapMixin, forms.ModelForm): regions = TreeNodeMultipleChoiceField( queryset=Region.objects.all(), required=False, widget=StaticSelect2Multiple() ) sites = DynamicModelMultipleChoiceField( queryset=Site.objects.all(), required=False ) roles = DynamicModelMultipleChoiceField( queryset=DeviceRole.objects.all(), required=False ) platforms = DynamicModelMultipleChoiceField( queryset=Platform.objects.all(), required=False ) cluster_groups = DynamicModelMultipleChoiceField( queryset=ClusterGroup.objects.all(), required=False ) clusters = DynamicModelMultipleChoiceField( queryset=Cluster.objects.all(), required=False ) tenant_groups = DynamicModelMultipleChoiceField( queryset=TenantGroup.objects.all(), required=False ) tenants = DynamicModelMultipleChoiceField( queryset=Tenant.objects.all(), required=False ) tags = DynamicModelMultipleChoiceField( queryset=Tag.objects.all(), required=False ) data = JSONField( label='' ) class Meta: model = ConfigContext fields = ( 'name', 'weight', 'description', 'is_active', 'regions', 'sites', 'roles', 'platforms', 'cluster_groups', 'clusters', 'tenant_groups', 'tenants', 'tags', 'data', )
class PrefixFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm): model = Prefix field_order = [ 'q', 'within_include', 'family', 'mask_length', 'vrf_id', 'status', 'region', 'site', 'role', 'tenant_group', 'tenant', 'is_pool', 'expand', ] q = forms.CharField(required=False, label='Search') within_include = forms.CharField( required=False, widget=forms.TextInput(attrs={ 'placeholder': 'Prefix', }), label='Search within') family = forms.ChoiceField( required=False, choices=add_blank_choice(IPAddressFamilyChoices), label='Address family', widget=StaticSelect2()) mask_length = forms.ChoiceField(required=False, choices=PREFIX_MASK_LENGTH_CHOICES, label='Mask length', widget=StaticSelect2()) vrf_id = FilterChoiceField(queryset=VRF.objects.all(), label='VRF', null_label='-- Global --', widget=APISelectMultiple( api_url="/api/ipam/vrfs/", null_option=True, )) status = forms.MultipleChoiceField(choices=PrefixStatusChoices, required=False, widget=StaticSelect2Multiple()) region = FilterChoiceField(queryset=Region.objects.all(), to_field_name='slug', required=False, widget=APISelectMultiple( api_url="/api/dcim/regions/", value_field="slug", filter_for={'site': 'region'})) site = FilterChoiceField(queryset=Site.objects.all(), to_field_name='slug', null_label='-- None --', widget=APISelectMultiple( api_url="/api/dcim/sites/", value_field="slug", null_option=True, )) role = FilterChoiceField(queryset=Role.objects.all(), to_field_name='slug', null_label='-- None --', widget=APISelectMultiple( api_url="/api/ipam/roles/", value_field="slug", null_option=True, )) is_pool = forms.NullBooleanField( required=False, label='Is a pool', widget=StaticSelect2(choices=BOOLEAN_WITH_BLANK_CHOICES)) expand = forms.BooleanField(required=False, label='Expand prefix hierarchy')
class VirtualMachineFilterForm(BootstrapMixin, CustomFieldFilterForm): model = VirtualMachine q = forms.CharField(required=False, label='Search') cluster_group = FilterChoiceField( queryset=ClusterGroup.objects.all(), to_field_name='slug', null_label='-- None --', widget=APISelectMultiple( api_url='/api/virtualization/cluster-groups/', value_field="slug", null_option=True, )) cluster_type = FilterChoiceField( queryset=ClusterType.objects.all(), to_field_name='slug', null_label='-- None --', widget=APISelectMultiple( api_url='/api/virtualization/cluster-types/', value_field="slug", null_option=True, )) cluster_id = FilterChoiceField( queryset=Cluster.objects.all(), label='Cluster', widget=APISelectMultiple(api_url='/api/virtualization/clusters/', )) region = FilterChoiceField(queryset=Region.objects.all(), to_field_name='slug', required=False, widget=APISelectMultiple( api_url='/api/dcim/regions/', value_field="slug", null_option=True, )) site = FilterChoiceField(queryset=Site.objects.all(), to_field_name='slug', null_label='-- None --', widget=APISelectMultiple( api_url='/api/dcim/sites/', value_field="slug", null_option=True, )) role = FilterChoiceField(queryset=DeviceRole.objects.filter(vm_role=True), to_field_name='slug', null_label='-- None --', widget=APISelectMultiple( api_url='/api/dcim/device-roles/', value_field="slug", null_option=True, additional_query_params={'vm_role': 'true'})) status = forms.MultipleChoiceField(choices=VM_STATUS_CHOICES, required=False, widget=StaticSelect2Multiple()) 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, )) platform = FilterChoiceField(queryset=Platform.objects.all(), to_field_name='slug', null_label='-- None --', widget=APISelectMultiple( api_url='/api/dcim/platforms/', value_field="slug", null_option=True, ))
class BGPSessionFilterForm(BootstrapMixin, CustomFieldModelForm): 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/', ) ) by_local_address = forms.CharField( required=False, label='Local Address' ) by_remote_address = forms.CharField( required=False, label='Remote Address' ) device_id = DynamicModelMultipleChoiceField( queryset=Device.objects.all(), required=False, label=_('Device') ) status = forms.MultipleChoiceField( choices=SessionStatusChoices, required=False, widget=StaticSelect2Multiple() ) peer_group = DynamicModelMultipleChoiceField( queryset=BGPPeerGroup.objects.all(), required=False, widget=APISelectMultiple( api_url='/api/plugins/bgp/peer-group/' ) ) 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/' ) ) tenant = DynamicModelChoiceField( queryset=Tenant.objects.all(), required=False ) tag = TagFilterField(BGPSession) class Meta: model = BGPSession fields = ['q', 'status', 'device_id', 'remote_as', 'local_as']
class ConfigContextForm(BootstrapMixin, forms.ModelForm): regions = TreeNodeMultipleChoiceField( queryset=Region.objects.all(), required=False, widget=StaticSelect2Multiple() ) sites = DynamicModelMultipleChoiceField( queryset=Site.objects.all(), required=False, widget=APISelectMultiple( api_url="/api/dcim/sites/" ) ) roles = DynamicModelMultipleChoiceField( queryset=DeviceRole.objects.all(), required=False, widget=APISelectMultiple( api_url="/api/dcim/device-roles/" ) ) platforms = DynamicModelMultipleChoiceField( queryset=Platform.objects.all(), required=False, widget=APISelectMultiple( api_url="/api/dcim/platforms/" ) ) cluster_groups = DynamicModelMultipleChoiceField( queryset=ClusterGroup.objects.all(), required=False, widget=APISelectMultiple( api_url="/api/virtualization/cluster-groups/" ) ) clusters = DynamicModelMultipleChoiceField( queryset=Cluster.objects.all(), required=False, widget=APISelectMultiple( api_url="/api/virtualization/clusters/" ) ) tenant_groups = DynamicModelMultipleChoiceField( queryset=TenantGroup.objects.all(), required=False, widget=APISelectMultiple( api_url="/api/tenancy/tenant-groups/" ) ) tenants = DynamicModelMultipleChoiceField( queryset=Tenant.objects.all(), required=False, widget=APISelectMultiple( api_url="/api/tenancy/tenants/" ) ) tags = DynamicModelMultipleChoiceField( queryset=Tag.objects.all(), to_field_name='slug', required=False, widget=APISelectMultiple( api_url="/api/extras/tags/" ) ) data = JSONField( label='' ) class Meta: model = ConfigContext fields = ( 'name', 'weight', 'description', 'is_active', 'regions', 'sites', 'roles', 'platforms', 'cluster_groups', 'clusters', 'tenant_groups', 'tenants', 'tags', 'data', )
class VirtualMachineFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm): model = VirtualMachine field_order = [ 'q', 'cluster_group', 'cluster_type', 'cluster_id', 'status', 'role', 'region', 'site', 'tenant_group', 'tenant', 'platform', 'mac_address', ] q = forms.CharField( required=False, label='Search' ) cluster_group = FilterChoiceField( queryset=ClusterGroup.objects.all(), to_field_name='slug', null_label='-- None --', widget=APISelectMultiple( api_url='/api/virtualization/cluster-groups/', value_field="slug", null_option=True, ) ) cluster_type = FilterChoiceField( queryset=ClusterType.objects.all(), to_field_name='slug', null_label='-- None --', widget=APISelectMultiple( api_url='/api/virtualization/cluster-types/', value_field="slug", null_option=True, ) ) cluster_id = FilterChoiceField( queryset=Cluster.objects.all(), label='Cluster', widget=APISelectMultiple( api_url='/api/virtualization/clusters/', ) ) region = FilterChoiceField( queryset=Region.objects.all(), to_field_name='slug', required=False, widget=APISelectMultiple( api_url='/api/dcim/regions/', value_field="slug", filter_for={ 'site': 'region' } ) ) site = FilterChoiceField( queryset=Site.objects.all(), to_field_name='slug', null_label='-- None --', widget=APISelectMultiple( api_url='/api/dcim/sites/', value_field="slug", null_option=True, ) ) role = FilterChoiceField( queryset=DeviceRole.objects.filter(vm_role=True), to_field_name='slug', null_label='-- None --', widget=APISelectMultiple( api_url='/api/dcim/device-roles/', value_field="slug", null_option=True, additional_query_params={ 'vm_role': "True" } ) ) status = forms.MultipleChoiceField( choices=VirtualMachineStatusChoices, required=False, widget=StaticSelect2Multiple() ) platform = FilterChoiceField( queryset=Platform.objects.all(), to_field_name='slug', null_label='-- None --', widget=APISelectMultiple( api_url='/api/dcim/platforms/', value_field="slug", null_option=True, ) ) mac_address = forms.CharField( required=False, label='MAC address' ) tag = TagFilterField(model)
def to_form_field(self, set_initial=True, enforce_required=True, for_csv_import=False): """ Return a form field suitable for setting a CustomField's value for an object. set_initial: Set initial date for the field. This should be False when generating a field for bulk editing. enforce_required: Honor the value of CustomField.required. Set to False for filtering/bulk editing. for_csv_import: Return a form field suitable for bulk import of objects in CSV format. """ initial = self.default if set_initial else None required = self.required if enforce_required else False # Integer if self.type == CustomFieldTypeChoices.TYPE_INTEGER: field = forms.IntegerField( required=required, initial=initial, min_value=self.validation_minimum, max_value=self.validation_maximum ) # Boolean elif self.type == CustomFieldTypeChoices.TYPE_BOOLEAN: choices = ( (None, '---------'), (True, 'True'), (False, 'False'), ) field = forms.NullBooleanField( required=required, initial=initial, widget=StaticSelect2(choices=choices) ) # Date elif self.type == CustomFieldTypeChoices.TYPE_DATE: field = forms.DateField(required=required, initial=initial, widget=DatePicker()) # Select elif self.type in (CustomFieldTypeChoices.TYPE_SELECT, CustomFieldTypeChoices.TYPE_MULTISELECT): choices = [(c, c) for c in self.choices] default_choice = self.default if self.default in self.choices else None if not required or default_choice is None: choices = add_blank_choice(choices) # Set the initial value to the first available choice (if any) if set_initial and default_choice: initial = default_choice if self.type == CustomFieldTypeChoices.TYPE_SELECT: field_class = CSVChoiceField if for_csv_import else forms.ChoiceField field = field_class( choices=choices, required=required, initial=initial, widget=StaticSelect2() ) else: field_class = CSVChoiceField if for_csv_import else forms.MultipleChoiceField field = field_class( choices=choices, required=required, initial=initial, widget=StaticSelect2Multiple() ) # URL elif self.type == CustomFieldTypeChoices.TYPE_URL: field = LaxURLField(required=required, initial=initial) # Text else: field = forms.CharField(max_length=255, required=required, initial=initial) if self.validation_regex: field.validators = [ RegexValidator( regex=self.validation_regex, message=mark_safe(f"Values must match this regex: <code>{self.validation_regex}</code>") ) ] field.model = self field.label = str(self) if self.description: field.help_text = self.description return field