Beispiel #1
0
class ClusterAddDevicesForm(BootstrapMixin, forms.Form):
    region = DynamicModelChoiceField(queryset=Region.objects.all(),
                                     required=False,
                                     widget=APISelect(filter_for={
                                         "site": "region_id",
                                     },
                                                      attrs={
                                                          'nullable': 'true',
                                                      }))
    site = DynamicModelChoiceField(queryset=Site.objects.all(),
                                   required=False,
                                   widget=APISelect(filter_for={
                                       "rack": "site_id",
                                       "devices": "site_id",
                                   }))
    rack = DynamicModelChoiceField(queryset=Rack.objects.all(),
                                   required=False,
                                   widget=APISelect(
                                       filter_for={"devices": "rack_id"},
                                       attrs={
                                           'nullable': 'true',
                                       }))
    devices = DynamicModelMultipleChoiceField(
        queryset=Device.objects.filter(cluster__isnull=True),
        widget=APISelectMultiple(display_field='display_name',
                                 disabled_indicator='cluster'))

    class Meta:
        fields = [
            'region',
            'site',
            'rack',
            'devices',
        ]

    def __init__(self, cluster, *args, **kwargs):

        self.cluster = cluster

        super().__init__(*args, **kwargs)

        self.fields['devices'].choices = []

    def clean(self):
        super().clean()

        # If the Cluster is assigned to a Site, all Devices must be assigned to that Site.
        if self.cluster.site is not None:
            for device in self.cleaned_data.get('devices', []):
                if device.site != self.cluster.site:
                    raise ValidationError({
                        'devices':
                        "{} belongs to a different site ({}) than the cluster ({})"
                        .format(device, device.site, self.cluster.site)
                    })
Beispiel #2
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',
        ]
Beispiel #3
0
class PrefixBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditForm):
    pk = forms.ModelMultipleChoiceField(
        queryset=Prefix.objects.all(),
        widget=forms.MultipleHiddenInput()
    )
    region = DynamicModelChoiceField(
        queryset=Region.objects.all(),
        required=False,
        to_field_name='slug'
    )
    site = DynamicModelChoiceField(
        queryset=Site.objects.all(),
        required=False,
        query_params={
            'region': '$region'
        }
    )
    vrf = DynamicModelChoiceField(
        queryset=VRF.objects.all(),
        required=False,
        label='VRF',
        display_field='display_name'
    )
    prefix_length = forms.IntegerField(
        min_value=PREFIX_LENGTH_MIN,
        max_value=PREFIX_LENGTH_MAX,
        required=False
    )
    tenant = DynamicModelChoiceField(
        queryset=Tenant.objects.all(),
        required=False
    )
    status = forms.ChoiceField(
        choices=add_blank_choice(PrefixStatusChoices),
        required=False,
        widget=StaticSelect2()
    )
    role = DynamicModelChoiceField(
        queryset=Role.objects.all(),
        required=False
    )
    is_pool = forms.NullBooleanField(
        required=False,
        widget=BulkEditNullBooleanSelect(),
        label='Is a pool'
    )
    description = forms.CharField(
        max_length=100,
        required=False
    )

    class Meta:
        nullable_fields = [
            'site', 'vrf', 'tenant', 'role', 'description',
        ]
Beispiel #4
0
class VMInterfaceForm(BootstrapMixin, InterfaceCommonForm,
                      CustomFieldModelForm):
    parent = DynamicModelChoiceField(queryset=VMInterface.objects.all(),
                                     required=False,
                                     label='Parent interface')
    untagged_vlan = DynamicModelChoiceField(queryset=VLAN.objects.all(),
                                            required=False,
                                            label='Untagged VLAN')
    tagged_vlans = DynamicModelMultipleChoiceField(queryset=VLAN.objects.all(),
                                                   required=False,
                                                   label='Tagged VLANs')
    tags = DynamicModelMultipleChoiceField(queryset=Tag.objects.all(),
                                           required=False)

    class Meta:
        model = VMInterface
        fields = [
            'virtual_machine',
            'name',
            'enabled',
            'parent',
            'mac_address',
            'mtu',
            'description',
            'mode',
            'tags',
            'untagged_vlan',
            'tagged_vlans',
        ]
        widgets = {
            'virtual_machine': forms.HiddenInput(),
            'mode': StaticSelect2()
        }
        labels = {
            'mode': '802.1Q Mode',
        }
        help_texts = {
            'mode': INTERFACE_MODE_HELP_TEXT,
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        vm_id = self.initial.get('virtual_machine') or self.data.get(
            'virtual_machine')

        # Restrict parent interface assignment by VM
        self.fields['parent'].widget.add_query_param('virtualmachine_id',
                                                     vm_id)

        # Limit VLAN choices by virtual machine
        self.fields['untagged_vlan'].widget.add_query_param(
            'available_on_virtualmachine', vm_id)
        self.fields['tagged_vlans'].widget.add_query_param(
            'available_on_virtualmachine', vm_id)
Beispiel #5
0
class LocationBulkEditForm(BootstrapMixin, CustomFieldModelBulkEditForm):
    pk = forms.ModelMultipleChoiceField(queryset=Location.objects.all(),
                                        widget=forms.MultipleHiddenInput)
    site = DynamicModelChoiceField(queryset=Site.objects.all(), required=False)
    parent = DynamicModelChoiceField(queryset=Location.objects.all(),
                                     required=False,
                                     query_params={'site_id': '$site'})
    description = forms.CharField(max_length=200, required=False)

    class Meta:
        nullable_fields = ['parent', 'description']
Beispiel #6
0
class ComponentTemplateCreateForm(BootstrapMixin, ComponentForm):
    """
    Base form for the creation of device component templates (subclassed from ComponentTemplateModel).
    """
    manufacturer = DynamicModelChoiceField(
        queryset=Manufacturer.objects.all(),
        required=False,
        initial_params={'device_types': 'device_type'})
    device_type = DynamicModelChoiceField(
        queryset=DeviceType.objects.all(),
        query_params={'manufacturer_id': '$manufacturer'})
    description = forms.CharField(required=False)
Beispiel #7
0
class SecretForm(BootstrapMixin, CustomFieldModelForm):
    device = DynamicModelChoiceField(queryset=Device.objects.all(),
                                     display_field='display_name')
    plaintext = forms.CharField(
        max_length=SECRET_PLAINTEXT_MAX_LENGTH,
        required=False,
        label='Plaintext',
        widget=forms.PasswordInput(attrs={
            'class': 'requires-session-key',
        }))
    plaintext2 = forms.CharField(max_length=SECRET_PLAINTEXT_MAX_LENGTH,
                                 required=False,
                                 label='Plaintext (verify)',
                                 widget=forms.PasswordInput())
    role = DynamicModelChoiceField(queryset=SecretRole.objects.all())
    tags = DynamicModelMultipleChoiceField(queryset=Tag.objects.all(),
                                           required=False)

    class Meta:
        model = Secret
        fields = [
            'device',
            'role',
            'name',
            'plaintext',
            'plaintext2',
            'tags',
        ]

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        # A plaintext value is required when creating a new Secret
        if not self.instance.pk:
            self.fields['plaintext'].required = True

    def clean(self):

        # Verify that the provided plaintext values match
        if self.cleaned_data['plaintext'] != self.cleaned_data['plaintext2']:
            raise forms.ValidationError({
                'plaintext2':
                "The two given plaintext values do not match. Please check your input."
            })

        # Validate uniqueness
        if Secret.objects.filter(device=self.cleaned_data['device'],
                                 role=self.cleaned_data['role'],
                                 name=self.cleaned_data['name']).exclude(
                                     pk=self.instance.pk).exists():
            raise forms.ValidationError(
                "Each secret assigned to a device must have a unique combination of role and name"
            )
Beispiel #8
0
class ClusterAddDevicesForm(BootstrapMixin, forms.Form):
    region = DynamicModelChoiceField(queryset=Region.objects.all(),
                                     required=False,
                                     null_option='None')
    site_group = DynamicModelChoiceField(queryset=SiteGroup.objects.all(),
                                         required=False,
                                         null_option='None')
    site = DynamicModelChoiceField(queryset=Site.objects.all(),
                                   required=False,
                                   query_params={
                                       'region_id': '$region',
                                       'group_id': '$site_group',
                                   })
    rack = DynamicModelChoiceField(queryset=Rack.objects.all(),
                                   required=False,
                                   null_option='None',
                                   query_params={'site_id': '$site'})
    devices = DynamicModelMultipleChoiceField(queryset=Device.objects.all(),
                                              query_params={
                                                  'site_id': '$site',
                                                  'rack_id': '$rack',
                                                  'cluster_id': 'null',
                                              })

    class Meta:
        fields = [
            'region',
            'site',
            'rack',
            'devices',
        ]

    def __init__(self, cluster, *args, **kwargs):

        self.cluster = cluster

        super().__init__(*args, **kwargs)

        self.fields['devices'].choices = []

    def clean(self):
        super().clean()

        # If the Cluster is assigned to a Site, all Devices must be assigned to that Site.
        if self.cluster.site is not None:
            for device in self.cleaned_data.get('devices', []):
                if device.site != self.cluster.site:
                    raise ValidationError({
                        'devices':
                        "{} belongs to a different site ({}) than the cluster ({})"
                        .format(device, device.site, self.cluster.site)
                    })
Beispiel #9
0
class RackReservationForm(TenancyForm, CustomFieldModelForm):
    region = DynamicModelChoiceField(queryset=Region.objects.all(),
                                     required=False,
                                     initial_params={'sites': '$site'})
    site_group = DynamicModelChoiceField(queryset=SiteGroup.objects.all(),
                                         required=False,
                                         initial_params={'sites': '$site'})
    site = DynamicModelChoiceField(queryset=Site.objects.all(),
                                   required=False,
                                   query_params={
                                       'region_id': '$region',
                                       'group_id': '$site_group',
                                   })
    location = DynamicModelChoiceField(queryset=Location.objects.all(),
                                       required=False,
                                       query_params={'site_id': '$site'})
    rack = DynamicModelChoiceField(queryset=Rack.objects.all(),
                                   query_params={
                                       'site_id': '$site',
                                       'location_id': '$location',
                                   })
    units = NumericArrayField(
        base_field=forms.IntegerField(),
        help_text=
        "Comma-separated list of numeric unit IDs. A range may be specified using a hyphen."
    )
    user = forms.ModelChoiceField(queryset=User.objects.order_by('username'),
                                  widget=StaticSelect())
    tags = DynamicModelMultipleChoiceField(queryset=Tag.objects.all(),
                                           required=False)

    class Meta:
        model = RackReservation
        fields = [
            'region',
            'site_group',
            'site',
            'location',
            'rack',
            'units',
            'user',
            'tenant_group',
            'tenant',
            'description',
            'tags',
        ]
        fieldsets = (
            ('Reservation', ('region', 'site', 'location', 'rack', 'units',
                             'user', 'description', 'tags')),
            ('Tenancy', ('tenant_group', 'tenant')),
        )
Beispiel #10
0
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']
Beispiel #11
0
class CircuitTerminationForm(BootstrapMixin, forms.ModelForm):
    region = DynamicModelChoiceField(
        queryset=Region.objects.all(),
        required=False,
        initial_params={
            'sites': '$site'
        }
    )
    site_group = DynamicModelChoiceField(
        queryset=SiteGroup.objects.all(),
        required=False,
        initial_params={
            'sites': '$site'
        }
    )
    site = DynamicModelChoiceField(
        queryset=Site.objects.all(),
        query_params={
            'region_id': '$region',
            'group_id': '$site_group',
        },
        required=False
    )
    provider_network = DynamicModelChoiceField(
        queryset=ProviderNetwork.objects.all(),
        required=False
    )

    class Meta:
        model = CircuitTermination
        fields = [
            'term_side', 'region', 'site_group', 'site', 'provider_network', 'mark_connected', 'port_speed',
            'upstream_speed', 'xconnect_id', 'pp_info', 'description',
        ]
        help_texts = {
            'port_speed': "Physical circuit speed",
            'xconnect_id': "ID of the local cross-connect",
            'pp_info': "Patch panel ID and port number(s)"
        }
        widgets = {
            'term_side': forms.HiddenInput(),
            'port_speed': SelectSpeedWidget(),
            'upstream_speed': SelectSpeedWidget(),
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.fields['provider_network'].widget.add_query_param('provider_id', self.instance.circuit.provider_id)
Beispiel #12
0
class VLANForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
    region = DynamicModelChoiceField(
        queryset=Region.objects.all(),
        required=False,
        initial_params={
            'sites': '$site'
        }
    )
    site = DynamicModelChoiceField(
        queryset=Site.objects.all(),
        required=False,
        null_option='None',
        query_params={
            'region_id': '$region'
        }
    )
    group = DynamicModelChoiceField(
        queryset=VLANGroup.objects.all(),
        required=False,
        query_params={
            'site_id': '$site'
        }
    )
    role = DynamicModelChoiceField(
        queryset=Role.objects.all(),
        required=False
    )
    tags = DynamicModelMultipleChoiceField(
        queryset=Tag.objects.all(),
        required=False
    )

    class Meta:
        model = VLAN
        fields = [
            'site', 'group', 'vid', 'name', 'status', 'role', 'description', 'tenant_group', 'tenant', 'tags',
        ]
        help_texts = {
            'site': "Leave blank if this VLAN spans multiple sites",
            'group': "VLAN group (optional)",
            'vid': "Configured VLAN ID",
            'name': "Configured VLAN name",
            'status': "Operational status of this VLAN",
            'role': "The primary function of this VLAN",
        }
        widgets = {
            'status': StaticSelect2(),
        }
Beispiel #13
0
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)
Beispiel #14
0
class IPAddressBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditForm):
    pk = forms.ModelMultipleChoiceField(
        queryset=IPAddress.objects.all(),
        widget=forms.MultipleHiddenInput()
    )
    vrf = DynamicModelChoiceField(
        queryset=VRF.objects.all(),
        required=False,
        label='VRF',
        widget=APISelect(
            api_url="/api/ipam/vrfs/"
        )
    )
    mask_length = forms.IntegerField(
        min_value=IPADDRESS_MASK_LENGTH_MIN,
        max_value=IPADDRESS_MASK_LENGTH_MAX,
        required=False
    )
    tenant = DynamicModelChoiceField(
        queryset=Tenant.objects.all(),
        required=False,
        widget=APISelect(
            api_url="/api/tenancy/tenants/"
        )
    )
    status = forms.ChoiceField(
        choices=add_blank_choice(IPAddressStatusChoices),
        required=False,
        widget=StaticSelect2()
    )
    role = forms.ChoiceField(
        choices=add_blank_choice(IPAddressRoleChoices),
        required=False,
        widget=StaticSelect2()
    )
    dns_name = forms.CharField(
        max_length=255,
        required=False
    )
    description = forms.CharField(
        max_length=100,
        required=False
    )

    class Meta:
        nullable_fields = [
            'vrf', 'role', 'tenant', 'dns_name', 'description',
        ]
Beispiel #15
0
class VRFBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditForm):
    pk = forms.ModelMultipleChoiceField(
        queryset=VRF.objects.all(),
        widget=forms.MultipleHiddenInput()
    )
    tenant = DynamicModelChoiceField(
        label='Учреждение',
        queryset=Tenant.objects.all(),
        required=False
    )
    enforce_unique = forms.NullBooleanField(
        required=False,
        widget=BulkEditNullBooleanSelect(),
        label='Принудительное использование уникального пространства'
    )
    description = forms.CharField(
        label='Описание',
        max_length=100,
        required=False
    )

    class Meta:
        nullable_fields = [
            'tenant', 'description',
        ]
Beispiel #16
0
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']
Beispiel #17
0
class VRFBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditForm):
    pk = forms.ModelMultipleChoiceField(
        queryset=VRF.objects.all(),
        widget=forms.MultipleHiddenInput()
    )
    tenant = DynamicModelChoiceField(
        queryset=Tenant.objects.all(),
        required=False,
        widget=APISelect(
            api_url="/api/tenancy/tenants/"
        )
    )
    enforce_unique = forms.NullBooleanField(
        required=False,
        widget=BulkEditNullBooleanSelect(),
        label='Enforce unique space'
    )
    description = forms.CharField(
        max_length=100,
        required=False
    )

    class Meta:
        nullable_fields = [
            'tenant', 'description',
        ]
Beispiel #18
0
class AggregateBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditForm):
    pk = forms.ModelMultipleChoiceField(
        queryset=Aggregate.objects.all(),
        widget=forms.MultipleHiddenInput()
    )
    rir = DynamicModelChoiceField(
        queryset=RIR.objects.all(),
        required=False,
        label='RIR',
        widget=APISelect(
            api_url="/api/ipam/rirs/"
        )
    )
    date_added = forms.DateField(
        required=False
    )
    description = forms.CharField(
        max_length=100,
        required=False
    )

    class Meta:
        nullable_fields = [
            'date_added', 'description',
        ]
        widgets = {
            'date_added': DatePicker(),
        }
Beispiel #19
0
class VMInterfaceForm(BootstrapMixin, InterfaceCommonForm, forms.ModelForm):
    untagged_vlan = DynamicModelChoiceField(queryset=VLAN.objects.all(),
                                            required=False,
                                            label='Untagged VLAN',
                                            display_field='display_name',
                                            brief_mode=False,
                                            query_params={
                                                'site_id': 'null',
                                            })
    tagged_vlans = DynamicModelMultipleChoiceField(
        queryset=VLAN.objects.all(),
        required=False,
        label='Tagged VLANs',
        display_field='display_name',
        brief_mode=False,
        query_params={
            'site_id': 'null',
        })
    tags = DynamicModelMultipleChoiceField(queryset=Tag.objects.all(),
                                           required=False)

    class Meta:
        model = VMInterface
        fields = [
            'virtual_machine',
            'name',
            'enabled',
            'mac_address',
            'mtu',
            'description',
            'mode',
            'tags',
            'untagged_vlan',
            'tagged_vlans',
        ]
        widgets = {
            'virtual_machine': forms.HiddenInput(),
            'mode': StaticSelect2()
        }
        labels = {
            'mode': '802.1Q Mode',
        }
        help_texts = {
            'mode': INTERFACE_MODE_HELP_TEXT,
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        virtual_machine = VirtualMachine.objects.get(
            pk=self.initial.get('virtual_machine')
            or self.data.get('virtual_machine'))

        # Add current site to VLANs query params
        site = virtual_machine.site
        if site:
            self.fields['untagged_vlan'].widget.add_query_param(
                'site_id', site.pk)
            self.fields['tagged_vlans'].widget.add_query_param(
                'site_id', site.pk)
Beispiel #20
0
class TenancyForm(forms.Form):
    tenant_group = DynamicModelChoiceField(
        queryset=TenantGroup.objects.all(),
        required=False,
        null_option='None',
        initial_params={
            'tenants': '$tenant'
        }
    )
    tenant = DynamicModelChoiceField(
        queryset=Tenant.objects.all(),
        required=False,
        query_params={
            'group_id': '$tenant_group'
        }
    )
Beispiel #21
0
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)
Beispiel #22
0
class IPAddressBulkAddForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
    vrf = DynamicModelChoiceField(queryset=VRF.objects.all(),
                                  required=False,
                                  label='VRF')

    class Meta:
        model = IPAddress
        fields = [
            'address',
            'vrf',
            'status',
            'role',
            'dns_name',
            'description',
            'tenant_group',
            'tenant',
        ]
        widgets = {
            'status': StaticSelect2(),
            'role': StaticSelect2(),
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['vrf'].empty_label = 'Global'
Beispiel #23
0
class AggregateForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
    rir = DynamicModelChoiceField(queryset=RIR.objects.all(), label='RIR')
    tags = DynamicModelMultipleChoiceField(queryset=Tag.objects.all(),
                                           required=False)

    class Meta:
        model = Aggregate
        fields = [
            'prefix',
            'rir',
            'date_added',
            'description',
            'tenant_group',
            'tenant',
            'tags',
        ]
        fieldsets = (
            ('Aggregate', ('prefix', 'rir', 'date_added', 'description',
                           'tags')),
            ('Tenancy', ('tenant_group', 'tenant')),
        )
        help_texts = {
            'prefix': "IPv4 or IPv6 network",
            'rir': "Regional Internet Registry responsible for this prefix",
        }
        widgets = {
            'date_added': DatePicker(),
        }
Beispiel #24
0
class RespBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditForm):
    pk = forms.ModelMultipleChoiceField(
        queryset = Resp.objects.all(),
        widget = forms.MultipleHiddenInput(
        # api_url='/api/plugins/sdns/resp'
        )
    )

    tipo = forms.ChoiceField(
        choices=add_blank_choice(RespChoices),
        widget=StaticSelect2()
    )

    dom = DynamicModelChoiceField(
        queryset= Domain.objects.all(),
        display_field='Domain',
        label='Dominio',
        required= False,
        widget= APISelect(
            api_url='/api/plugins/sdns/domain',
        )
    )

    class Meta:
        nullable_fields = [ ]
Beispiel #25
0
class ASNBulkEditForm(NetBoxModelBulkEditForm):
    pk = forms.ModelMultipleChoiceField(
        queryset=ASN.objects.all(),
        widget=forms.MultipleHiddenInput
    )
    tenant = DynamicModelChoiceField(
        queryset=Tenant.objects.all(),
        required=False
    )
    description = forms.CharField(
        max_length=200,
        required=False
    )
    status = forms.ChoiceField(
        required=False,
        choices=ASNStatusChoices,
        widget=StaticSelect()
    )

    model = ASN
    fieldsets = (
        (None, ('tenant', 'description', 'status')),
    )
    nullable_fields = (
        'tenant', 'description',
    )
Beispiel #26
0
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)
Beispiel #27
0
class VLANBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditForm):
    pk = forms.ModelMultipleChoiceField(
        queryset=VLAN.objects.all(),
        widget=forms.MultipleHiddenInput()
    )
    site = DynamicModelChoiceField(
        queryset=Site.objects.all(),
        required=False,
        widget=APISelect(
            api_url="/api/dcim/sites/"
        )
    )
    group = DynamicModelChoiceField(
        queryset=VLANGroup.objects.all(),
        required=False,
        widget=APISelect(
            api_url="/api/ipam/vlan-groups/"
        )
    )
    tenant = DynamicModelChoiceField(
        queryset=Tenant.objects.all(),
        required=False,
        widget=APISelect(
            api_url="/api/tenancy/tenants/"
        )
    )
    status = forms.ChoiceField(
        choices=add_blank_choice(VLANStatusChoices),
        required=False,
        widget=StaticSelect2()
    )
    role = DynamicModelChoiceField(
        queryset=Role.objects.all(),
        required=False,
        widget=APISelect(
            api_url="/api/ipam/roles/"
        )
    )
    description = forms.CharField(
        max_length=100,
        required=False
    )

    class Meta:
        nullable_fields = [
            'site', 'group', 'tenant', 'role', 'description',
        ]
Beispiel #28
0
class LocationForm(TenancyForm, CustomFieldModelForm):
    region = DynamicModelChoiceField(queryset=Region.objects.all(),
                                     required=False,
                                     initial_params={'sites': '$site'})
    site_group = DynamicModelChoiceField(queryset=SiteGroup.objects.all(),
                                         required=False,
                                         initial_params={'sites': '$site'})
    site = DynamicModelChoiceField(queryset=Site.objects.all(),
                                   query_params={
                                       'region_id': '$region',
                                       'group_id': '$site_group',
                                   })
    parent = DynamicModelChoiceField(queryset=Location.objects.all(),
                                     required=False,
                                     query_params={'site_id': '$site'})
    slug = SlugField()
    tags = DynamicModelMultipleChoiceField(queryset=Tag.objects.all(),
                                           required=False)

    class Meta:
        model = Location
        fields = (
            'region',
            'site_group',
            'site',
            'parent',
            'name',
            'slug',
            'description',
            'tenant_group',
            'tenant',
            'tags',
        )
        fieldsets = (
            ('Location', (
                'region',
                'site_group',
                'site',
                'parent',
                'name',
                'slug',
                'description',
                'tags',
            )),
            ('Tenancy', ('tenant_group', 'tenant')),
        )
Beispiel #29
0
class InterfaceCreateForm(ComponentCreateForm, InterfaceCommonForm):
    model = Interface
    type = forms.ChoiceField(
        choices=InterfaceTypeChoices,
        widget=StaticSelect(),
    )
    enabled = forms.BooleanField(required=False, initial=True)
    parent = DynamicModelChoiceField(queryset=Interface.objects.all(),
                                     required=False,
                                     query_params={
                                         'device_id': '$device',
                                     })
    lag = DynamicModelChoiceField(queryset=Interface.objects.all(),
                                  required=False,
                                  query_params={
                                      'device_id': '$device',
                                      'type': 'lag',
                                  })
    mac_address = forms.CharField(required=False, label='MAC Address')
    mgmt_only = forms.BooleanField(
        required=False,
        label='Management only',
        help_text='This interface is used only for out-of-band management')
    mode = forms.ChoiceField(
        choices=add_blank_choice(InterfaceModeChoices),
        required=False,
        widget=StaticSelect(),
    )
    untagged_vlan = DynamicModelChoiceField(queryset=VLAN.objects.all(),
                                            required=False)
    tagged_vlans = DynamicModelMultipleChoiceField(queryset=VLAN.objects.all(),
                                                   required=False)
    field_order = ('device', 'name_pattern', 'label_pattern', 'type',
                   'enabled', 'parent', 'lag', 'mtu', 'mac_address',
                   'description', 'mgmt_only', 'mark_connected', 'mode',
                   'untagged_vlan', 'tagged_vlans', 'tags')

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        # Limit VLAN choices by device
        device_id = self.initial.get('device') or self.data.get('device')
        self.fields['untagged_vlan'].widget.add_query_param(
            'available_on_device', device_id)
        self.fields['tagged_vlans'].widget.add_query_param(
            'available_on_device', device_id)
Beispiel #30
0
class ComponentCreateForm(BootstrapMixin, CustomFieldsMixin, ComponentForm):
    """
    Base form for the creation of device components (models subclassed from ComponentModel).
    """
    device = DynamicModelChoiceField(queryset=Device.objects.all())
    description = forms.CharField(max_length=200, required=False)
    tags = DynamicModelMultipleChoiceField(queryset=Tag.objects.all(),
                                           required=False)