示例#1
0
class RoutingPolicyFilterForm(BootstrapMixin, forms.Form):
    model = RoutingPolicy
    q = forms.CharField(required=False, label="Search")
    type = forms.MultipleChoiceField(
        required=False,
        choices=add_blank_choice(RoutingPolicyType.choices),
        widget=StaticSelectMultiple,
    )
    weight = forms.IntegerField(required=False, min_value=0, max_value=32767)
    address_family = forms.ChoiceField(
        required=False, choices=add_blank_choice(IPFamily.choices), widget=StaticSelect
    )
    tag = TagFilterField(model)
示例#2
0
class RouterBulkEditForm(BootstrapMixin, AddRemoveTagsForm, BulkEditForm):
    pk = DynamicModelMultipleChoiceField(queryset=Router.objects.all(),
                                         widget=forms.MultipleHiddenInput)
    local_autonomous_system = DynamicModelChoiceField(
        required=False,
        queryset=AutonomousSystem.objects.defer("prefixes"),
        query_params={"affiliated": True},
        label="Local AS",
    )
    platform = DynamicModelChoiceField(required=False,
                                       queryset=Platform.objects.all())
    encrypt_passwords = forms.NullBooleanField(required=False,
                                               widget=CustomNullBooleanSelect)
    poll_bgp_sessions_state = forms.NullBooleanField(
        required=False,
        widget=CustomNullBooleanSelect,
        label="Poll BGP sessions state")
    configuration_template = DynamicModelChoiceField(
        required=False, queryset=Configuration.objects.all())
    device_state = forms.ChoiceField(
        required=False,
        choices=add_blank_choice(DeviceState.choices),
        widget=StaticSelect,
    )
    comments = CommentField(widget=SmallTextarea)

    class Meta:
        nullable_fields = ["comments"]
示例#3
0
class ConnectionBulkEditForm(BootstrapMixin, AddRemoveTagsForm, BulkEditForm):
    pk = DynamicModelMultipleChoiceField(
        queryset=Connection.objects.all(), widget=forms.MultipleHiddenInput
    )
    state = forms.ChoiceField(
        required=False,
        choices=add_blank_choice(ConnectionState.choices),
        widget=StaticSelect,
    )
    internet_exchange_point = DynamicModelChoiceField(
        required=False,
        queryset=InternetExchange.objects.all(),
        help_text="IXP to which this connection connects",
    )
    router = DynamicModelChoiceField(
        required=False,
        queryset=Router.objects.all(),
        help_text="Router on which this connection is setup",
    )
    config_context = JSONField(
        required=False, label="Config context", widget=SmallTextarea
    )

    class Meta:
        model = Connection
        fields = ("state", "internet_exchange_point", "router", "config_context")
        nullable_fields = ("router",)
示例#4
0
class PlatformForm(BootstrapMixin, forms.ModelForm):
    slug = SlugField(max_length=255)
    napalm_args = JSONField(
        required=False,
        label="Optional arguments",
        help_text=
        "See NAPALM's <a href='http://napalm.readthedocs.io/en/latest/support/#optional-arguments'>documentation</a> for a complete list of optional arguments",
        widget=SmallTextarea,
    )
    password_algorithm = forms.ChoiceField(
        required=False,
        choices=add_blank_choice(PasswordAlgorithm.choices),
        widget=StaticSelect,
    )

    class Meta:
        model = Platform
        fields = [
            "name",
            "slug",
            "napalm_driver",
            "napalm_args",
            "password_algorithm",
            "description",
        ]
示例#5
0
class RouterFilterForm(BootstrapMixin, forms.Form):
    model = Router
    q = forms.CharField(required=False, label="Search")
    local_autonomous_system_id = DynamicModelChoiceField(
        required=False,
        queryset=AutonomousSystem.objects.defer("prefixes"),
        query_params={"affiliated": True},
        label="Local AS",
    )
    platform_id = DynamicModelMultipleChoiceField(
        required=False,
        queryset=Platform.objects.all(),
        to_field_name="pk",
        null_option="None",
        label="Platform",
    )
    device_state = forms.MultipleChoiceField(
        required=False,
        choices=add_blank_choice(DeviceState.choices),
        widget=StaticSelect,
    )
    encrypt_passwords = forms.NullBooleanField(required=False,
                                               widget=CustomNullBooleanSelect)
    configuration_template_id = DynamicModelMultipleChoiceField(
        required=False,
        queryset=Configuration.objects.all(),
        to_field_name="pk",
        null_option="None",
        label="Configuration",
    )
    tag = TagFilterField(model)
示例#6
0
class TemplateFilterForm(BootstrapMixin, forms.Form):
    model = Template
    q = forms.CharField(required=False, label="Search")
    type = forms.MultipleChoiceField(
        required=False,
        choices=add_blank_choice(TEMPLATE_TYPE_CHOICES),
        widget=StaticSelectMultiple,
    )
示例#7
0
class RouterBulkEditForm(BootstrapMixin, BulkEditForm):
    pk = FilterChoiceField(queryset=Router.objects.all(),
                           widget=forms.MultipleHiddenInput)
    platform = forms.ChoiceField(choices=add_blank_choice(PLATFORM_CHOICES),
                                 required=False)
    comment = CommentField(widget=SmallTextarea)

    class Meta:
        nullable_fields = ["comment"]
示例#8
0
class RouterForm(BootstrapMixin, forms.ModelForm):
    netbox_device_id = forms.IntegerField(label="NetBox Device", initial=0)
    platform = forms.ChoiceField(required=False,
                                 choices=add_blank_choice(PLATFORM_CHOICES),
                                 widget=StaticSelect)
    comments = CommentField()
    tags = TagField(required=False)

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

        if settings.NETBOX_API:
            self.fields["netbox_device_id"] = forms.ChoiceField(
                label="NetBox Device",
                choices=[(0, "--------")] +
                [(device.id, device.display_name)
                 for device in NetBox().get_devices()],
                widget=StaticSelect,
            )
            self.fields["netbox_device_id"].widget.attrs["class"] = " ".join([
                self.fields["netbox_device_id"].widget.attrs.get("class", ""),
                "form-control",
            ]).strip()
        else:
            self.fields["netbox_device_id"].widget = forms.HiddenInput()

    class Meta:
        model = Router

        fields = (
            "netbox_device_id",
            "use_netbox",
            "name",
            "hostname",
            "platform",
            "encrypt_passwords",
            "configuration_template",
            "comments",
            "tags",
        )
        labels = {
            "use_netbox": "Use NetBox",
            "configuration_template": "Configuration"
        }
        help_texts = {
            "hostname":
            "Router hostname (must be resolvable) or IP address",
            "configuration_template":
            "Template used to generate device configuration",
        }
        widgets = {
            "configuration_template":
            APISelect(
                api_url="/api/peering/templates/",
                query_filters={"type": "configuration"},
            )
        }
示例#9
0
class CommunityBulkEditForm(BootstrapMixin, BulkEditForm):
    pk = FilterChoiceField(queryset=Community.objects.all(),
                           widget=forms.MultipleHiddenInput)
    type = forms.ChoiceField(choices=add_blank_choice(COMMUNITY_TYPE_CHOICES),
                             required=False)
    comment = CommentField(widget=SmallTextarea)

    class Meta:
        nullable_fields = ["comment"]
示例#10
0
class CommunityFilterForm(BootstrapMixin, forms.Form):
    model = Community
    q = forms.CharField(required=False, label="Search")
    type = forms.MultipleChoiceField(
        required=False,
        choices=add_blank_choice(CommunityType.choices),
        widget=StaticSelectMultiple,
    )
    tag = TagFilterField(model)
示例#11
0
class RoutingPolicyFilterForm(BootstrapMixin, forms.Form):
    model = RoutingPolicy
    q = forms.CharField(required=False, label="Search")
    type = forms.MultipleChoiceField(
        required=False,
        choices=add_blank_choice(ROUTING_POLICY_TYPE_CHOICES),
        widget=StaticSelectMultiple,
    )
    weight = forms.IntegerField(required=False, min_value=0, max_value=32767)
    address_family = forms.ChoiceField(required=False, choices=IP_FAMILY_CHOICES)
示例#12
0
class NetworkIXLanFilterForm(BootstrapMixin, forms.Form):
    model = NetworkIXLan
    q = forms.CharField(required=False, label="Search")
    asn = forms.IntegerField(required=False, label="ASN")
    net__policy_general = forms.ChoiceField(
        label="Peering Policy",
        required=False,
        choices=add_blank_choice(GeneralPolicy.choices),
        widget=StaticSelectMultiple,
    )
示例#13
0
class RoutingPolicyBulkEditForm(BootstrapMixin, BulkEditForm):
    pk = FilterChoiceField(queryset=RoutingPolicy.objects.all(),
                           widget=forms.MultipleHiddenInput)
    type = forms.ChoiceField(
        choices=add_blank_choice(ROUTING_POLICY_TYPE_CHOICES), required=False)
    weight = forms.IntegerField(required=False, min_value=0, max_value=32767)
    comment = CommentField(widget=SmallTextarea)

    class Meta:
        nullable_fields = ["comment"]
示例#14
0
class RouterBulkEditForm(BootstrapMixin, BulkEditForm):
    pk = FilterChoiceField(queryset=Router.objects.all(),
                           widget=forms.MultipleHiddenInput)
    platform = forms.ChoiceField(choices=add_blank_choice(PLATFORM_CHOICES),
                                 required=False)
    encrypt_passwords = forms.NullBooleanField(required=False,
                                               widget=CustomNullBooleanSelect,
                                               label="Encrypt Passwords")
    comment = CommentField(widget=SmallTextarea)

    class Meta:
        nullable_fields = ["comment"]
示例#15
0
class TemplateForm(BootstrapMixin, forms.ModelForm):
    type = forms.ChoiceField(
        required=False,
        choices=add_blank_choice(TEMPLATE_TYPE_CHOICES),
        widget=StaticSelect,
    )
    template = TemplateField()

    class Meta:
        model = Template
        fields = ("name", "type", "template", "comment")
        labels = {"comment": "Comments"}
示例#16
0
class CommunityBulkEditForm(BootstrapMixin, AddRemoveTagsForm, BulkEditForm):
    pk = DynamicModelMultipleChoiceField(queryset=Community.objects.all(),
                                         widget=forms.MultipleHiddenInput)
    type = forms.ChoiceField(
        required=False,
        choices=add_blank_choice(CommunityType.choices),
        widget=StaticSelect,
    )
    comments = CommentField(widget=SmallTextarea)

    class Meta:
        nullable_fields = ["comments"]
示例#17
0
class RouterBulkEditForm(BootstrapMixin, AddRemoveTagsForm, BulkEditForm):
    pk = DynamicModelMultipleChoiceField(queryset=Router.objects.all(),
                                         widget=forms.MultipleHiddenInput)
    platform = forms.ChoiceField(required=False,
                                 choices=add_blank_choice(Platform.choices),
                                 widget=StaticSelect)
    encrypt_passwords = forms.NullBooleanField(required=False,
                                               label="Encrypt Passwords",
                                               widget=CustomNullBooleanSelect)
    configuration_template = DynamicModelChoiceField(
        required=False, queryset=Configuration.objects.all())
    comments = CommentField(widget=SmallTextarea)

    class Meta:
        nullable_fields = ["comments"]
示例#18
0
class DirectPeeringSessionBulkEditForm(BootstrapMixin, AddRemoveTagsForm,
                                       BulkEditForm):
    pk = FilterChoiceField(queryset=DirectPeeringSession.objects.all(),
                           widget=forms.MultipleHiddenInput)
    enabled = forms.NullBooleanField(required=False,
                                     label="Enable",
                                     widget=CustomNullBooleanSelect)
    relationship = forms.ChoiceField(
        required=False,
        choices=add_blank_choice(BGP_RELATIONSHIP_CHOICES),
        widget=StaticSelect,
    )
    bgp_group = forms.ModelChoiceField(
        required=False,
        queryset=BGPGroup.objects.all(),
        label="BGP Group",
        widget=APISelect(api_url="/api/peering/bgp-groups/"),
    )
    import_routing_policies = FilterChoiceField(
        required=False,
        queryset=RoutingPolicy.objects.all(),
        widget=APISelectMultiple(
            api_url="/api/peering/routing-policies/",
            query_filters={"type": "import-policy"},
        ),
    )
    export_routing_policies = FilterChoiceField(
        required=False,
        queryset=RoutingPolicy.objects.all(),
        widget=APISelectMultiple(
            api_url="/api/peering/routing-policies/",
            query_filters={"type": "export-policy"},
        ),
    )
    router = forms.ModelChoiceField(
        required=False,
        queryset=Router.objects.all(),
        widget=APISelect(api_url="/api/peering/routers/"),
    )
    comments = CommentField()

    class Meta:
        nullable_fields = [
            "import_routing_policies",
            "export_routing_policies",
            "router",
            "comments",
        ]
示例#19
0
class JobResultFilterForm(BootstrapMixin, forms.Form):
    model = JobResult
    q = forms.CharField(required=False, label="Search")
    name = forms.CharField(required=False)
    user_id = DynamicModelMultipleChoiceField(
        queryset=User.objects.all(),
        required=False,
        display_field="username",
        label="User",
        widget=APISelectMultiple(api_url="/api/users/users/"),
    )
    status = forms.ChoiceField(
        required=False,
        choices=add_blank_choice(JobResultStatus.choices),
        widget=StaticSelect(),
    )
示例#20
0
class RoutingPolicyBulkEditForm(BootstrapMixin, AddRemoveTagsForm,
                                BulkEditForm):
    pk = FilterChoiceField(queryset=RoutingPolicy.objects.all(),
                           widget=forms.MultipleHiddenInput)
    type = forms.ChoiceField(
        required=False,
        choices=add_blank_choice(ROUTING_POLICY_TYPE_CHOICES),
        widget=StaticSelect,
    )
    weight = forms.IntegerField(required=False, min_value=0, max_value=32767)
    address_family = forms.ChoiceField(required=False,
                                       choices=IP_FAMILY_CHOICES,
                                       widget=StaticSelect)
    comments = CommentField(widget=SmallTextarea)

    class Meta:
        nullable_fields = ["comments"]
示例#21
0
class CommunityForm(BootstrapMixin, forms.ModelForm):
    slug = SlugField(max_length=255)
    type = forms.ChoiceField(
        choices=add_blank_choice(CommunityType.choices),
        widget=StaticSelect,
        help_text="Ingress to tag received routes or Egress to tag advertised routes",
    )
    comments = CommentField()
    tags = TagField(required=False)

    class Meta:
        model = Community

        fields = ("name", "value", "slug", "type", "comments", "tags")
        help_texts = {
            "value": 'Community (<a target="_blank" href="https://tools.ietf.org/html/rfc1997">RFC1997</a>), Extended Communit (<a target="_blank" href="https://tools.ietf.org/html/rfc4360">RFC4360</a>) or Large Community (<a target="_blank" href="https://tools.ietf.org/html/rfc8092">RFC8092</a>)'
        }
示例#22
0
class RoutingPolicyBulkEditForm(BootstrapMixin, AddRemoveTagsForm,
                                BulkEditForm):
    pk = DynamicModelMultipleChoiceField(queryset=RoutingPolicy.objects.all(),
                                         widget=forms.MultipleHiddenInput)
    type = forms.ChoiceField(
        required=False,
        choices=add_blank_choice(RoutingPolicyType.choices),
        widget=StaticSelect,
    )
    weight = forms.IntegerField(required=False, min_value=0, max_value=32767)
    address_family = forms.ChoiceField(required=False,
                                       choices=IPFamily.choices,
                                       widget=StaticSelect)
    comments = CommentField(widget=SmallTextarea)

    class Meta:
        nullable_fields = ["comments"]
示例#23
0
class RouterBulkEditForm(BootstrapMixin, BulkEditForm):
    pk = FilterChoiceField(queryset=Router.objects.all(),
                           widget=forms.MultipleHiddenInput)
    platform = forms.ChoiceField(required=False,
                                 choices=add_blank_choice(PLATFORM_CHOICES),
                                 widget=StaticSelect)
    encrypt_passwords = forms.NullBooleanField(required=False,
                                               label="Encrypt Passwords",
                                               widget=CustomNullBooleanSelect)
    configuration_template = forms.ModelChoiceField(
        required=False,
        queryset=Template.objects.all(),
        widget=APISelect(api_url="/api/peering/templates/",
                         query_filters={"type": "configuration"}),
    )
    comments = CommentField(widget=SmallTextarea)

    class Meta:
        nullable_fields = ["comments"]
示例#24
0
class PlatformForm(BootstrapMixin, forms.ModelForm):
    slug = SlugField(max_length=255)
    password_algorithm = forms.ChoiceField(
        required=False,
        choices=add_blank_choice(PasswordAlgorithm.choices),
        widget=StaticSelect,
    )

    class Meta:
        model = Platform
        fields = [
            "name",
            "slug",
            "napalm_driver",
            "napalm_args",
            "password_algorithm",
            "description",
        ]
        widgets = {"napalm_args": SmallTextarea()}
示例#25
0
class DirectPeeringSessionBulkEditForm(BootstrapMixin, AddRemoveTagsForm,
                                       BulkEditForm):
    pk = DynamicModelMultipleChoiceField(
        queryset=DirectPeeringSession.objects.all(),
        widget=forms.MultipleHiddenInput)
    local_autonomous_system = DynamicModelChoiceField(
        required=False,
        queryset=AutonomousSystem.objects.all(),
        query_params={"affiliated": True},
        label="Local Autonomous System",
    )
    enabled = forms.NullBooleanField(required=False,
                                     label="Enable",
                                     widget=CustomNullBooleanSelect)
    relationship = forms.ChoiceField(
        required=False,
        choices=add_blank_choice(BGPRelationship.choices),
        widget=StaticSelect,
    )
    bgp_group = DynamicModelChoiceField(required=False,
                                        queryset=BGPGroup.objects.all(),
                                        label="BGP Group")
    import_routing_policies = DynamicModelMultipleChoiceField(
        required=False,
        queryset=RoutingPolicy.objects.all(),
        query_params={"type": "import-policy"},
    )
    export_routing_policies = DynamicModelMultipleChoiceField(
        required=False,
        queryset=RoutingPolicy.objects.all(),
        query_params={"type": "export-policy"},
    )
    router = DynamicModelChoiceField(required=False,
                                     queryset=Router.objects.all())
    comments = CommentField()

    class Meta:
        nullable_fields = [
            "import_routing_policies",
            "export_routing_policies",
            "router",
            "comments",
        ]
示例#26
0
class ConnectionFilterForm(BootstrapMixin, forms.Form):
    model = Connection
    q = forms.CharField(required=False, label="Search")
    state = forms.MultipleChoiceField(
        required=False,
        choices=add_blank_choice(ConnectionState.choices),
        widget=StaticSelect,
    )
    internet_exchange_point_id = DynamicModelMultipleChoiceField(
        required=False,
        queryset=InternetExchange.objects.all(),
        to_field_name="pk",
        label="Internet exchange point",
        null_option="None",
    )
    router_id = DynamicModelMultipleChoiceField(
        required=False,
        queryset=Router.objects.all(),
        to_field_name="pk",
        null_option="None",
    )
    tag = TagFilterField(model)
示例#27
0
class NetworkIXLanFilterForm(BootstrapMixin, forms.Form):
    model = NetworkIXLan
    q = forms.CharField(required=False, label="Search")
    asn = forms.IntegerField(required=False, label="ASN")
    is_rs_peer = forms.NullBooleanField(required=False,
                                        label="On Route Server",
                                        widget=CustomNullBooleanSelect)
    net__info_traffic = forms.ChoiceField(
        label="Traffic",
        required=False,
        choices=add_blank_choice(Traffic.choices),
        widget=StaticSelectMultiple,
    )
    net__info_scope = forms.ChoiceField(
        label="Scope",
        required=False,
        choices=add_blank_choice(Scope.choices),
        widget=StaticSelectMultiple,
    )
    net__info_type = forms.ChoiceField(
        label="Type",
        required=False,
        choices=add_blank_choice(NetType.choices),
        widget=StaticSelectMultiple,
    )
    net__policy_general = forms.ChoiceField(
        label="Peering Policy",
        required=False,
        choices=add_blank_choice(GeneralPolicy.choices),
        widget=StaticSelectMultiple,
    )
    net__policy_locations = forms.ChoiceField(
        label="Multiple Locations",
        required=False,
        choices=add_blank_choice(LocationsPolicy.choices),
        widget=StaticSelectMultiple,
    )
    net__policy_ratio = forms.NullBooleanField(required=False,
                                               label="Ratio Requirement",
                                               widget=CustomNullBooleanSelect)
    net__policy_contracts = forms.ChoiceField(
        label="Contract Requirement",
        required=False,
        choices=add_blank_choice(ContractsPolicy.choices),
        widget=StaticSelectMultiple,
    )
示例#28
0
class RouterForm(BootstrapMixin, forms.ModelForm):
    netbox_device_id = forms.IntegerField(label="NetBox device", initial=0)
    platform = DynamicModelChoiceField(required=False,
                                       queryset=Platform.objects.all())
    configuration_template = DynamicModelChoiceField(
        required=False,
        queryset=Configuration.objects.all(),
        label="Configuration",
        help_text="Template used to generate device configuration",
    )
    local_autonomous_system = DynamicModelChoiceField(
        queryset=AutonomousSystem.objects.defer("prefixes"),
        query_params={"affiliated": True},
        label="Local AS",
    )
    config_context = JSONField(required=False,
                               label="Config context",
                               widget=SmallTextarea)
    napalm_username = forms.CharField(required=False, label="Username")
    napalm_password = PasswordField(required=False,
                                    render_value=True,
                                    label="Password")
    napalm_timeout = forms.IntegerField(
        required=False,
        label="Timeout",
        help_text="The maximum time to wait for a connection in seconds",
    )
    napalm_args = JSONField(
        required=False,
        label="Optional arguments",
        help_text=
        "See NAPALM's <a href='http://napalm.readthedocs.io/en/latest/support/#optional-arguments'>documentation</a> for a complete list of optional arguments",
        widget=SmallTextarea,
    )
    device_state = forms.ChoiceField(
        required=False,
        choices=add_blank_choice(DeviceState.choices),
        widget=StaticSelect,
    )
    comments = CommentField()
    tags = TagField(required=False)

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

        if settings.NETBOX_API:
            choices = []
            for device in NetBox().get_devices():
                try:
                    choices.append((device.id, device.display))
                except AttributeError:
                    # Fallback to hold API attribute
                    choices.append((device.id, device.display_name))

            self.fields["netbox_device_id"] = forms.ChoiceField(
                label="NetBox device",
                choices=[(0, "---------")] + choices,
                widget=StaticSelect,
            )
            self.fields["netbox_device_id"].widget.attrs["class"] = " ".join([
                self.fields["netbox_device_id"].widget.attrs.get("class", ""),
                "form-control",
            ]).strip()
        else:
            self.fields["netbox_device_id"].widget = forms.HiddenInput()

    class Meta:
        model = Router

        fields = (
            "netbox_device_id",
            "use_netbox",
            "name",
            "hostname",
            "platform",
            "encrypt_passwords",
            "poll_bgp_sessions_state",
            "device_state",
            "configuration_template",
            "local_autonomous_system",
            "config_context",
            "napalm_username",
            "napalm_password",
            "napalm_timeout",
            "napalm_args",
            "comments",
            "tags",
        )
        help_texts = {
            "hostname": "Router hostname (must be resolvable) or IP address"
        }
示例#29
0
class RouterForm(BootstrapMixin, forms.ModelForm):
    netbox_device_id = forms.IntegerField(label="NetBox Device", initial=0)
    platform = forms.ChoiceField(required=False,
                                 choices=add_blank_choice(Platform.choices),
                                 widget=StaticSelect)
    configuration_template = DynamicModelChoiceField(
        required=False,
        queryset=Configuration.objects.all(),
        label="Configuration",
        help_text="Template used to generate device configuration",
    )
    napalm_username = forms.CharField(required=False, label="Username")
    napalm_password = PasswordField(required=False,
                                    render_value=True,
                                    label="Password")
    napalm_timeout = forms.IntegerField(
        required=False,
        label="Timeout",
        help_text="The maximum time to wait for a connection in seconds",
    )
    napalm_args = JSONField(
        required=False,
        label="Optional Arguments",
        help_text=
        "See NAPALM's <a href='http://napalm.readthedocs.io/en/latest/support/#optional-arguments'>documentation</a> for a complete list of optional arguments",
        widget=SmallTextarea,
    )
    comments = CommentField()
    tags = TagField(required=False)

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

        if settings.NETBOX_API:
            self.fields["netbox_device_id"] = forms.ChoiceField(
                label="NetBox Device",
                choices=[(0, "--------")] +
                [(device.id, device.display_name)
                 for device in NetBox().get_devices()],
                widget=StaticSelect,
            )
            self.fields["netbox_device_id"].widget.attrs["class"] = " ".join([
                self.fields["netbox_device_id"].widget.attrs.get("class", ""),
                "form-control",
            ]).strip()
        else:
            self.fields["netbox_device_id"].widget = forms.HiddenInput()

    class Meta:
        model = Router

        fields = (
            "netbox_device_id",
            "use_netbox",
            "name",
            "hostname",
            "platform",
            "encrypt_passwords",
            "configuration_template",
            "napalm_username",
            "napalm_password",
            "napalm_timeout",
            "napalm_args",
            "comments",
            "tags",
        )
        labels = {"use_netbox": "Use NetBox"}
        help_texts = {
            "hostname": "Router hostname (must be resolvable) or IP address"
        }
示例#30
0
class RoutingPolicyBulkEditForm(BootstrapMixin, BulkEditForm):
    pk = FilterChoiceField(queryset=RoutingPolicy.objects.all(),
                           widget=forms.MultipleHiddenInput)
    type = forms.ChoiceField(
        choices=add_blank_choice(ROUTING_POLICY_TYPE_CHOICES), required=False)
    comment = CommentField()