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)
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"]
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",)
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", ]
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)
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, )
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"]
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"}, ) }
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"]
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)
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)
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, )
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"]
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"]
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"}
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"]
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"]
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", ]
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(), )
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"]
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>)' }
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"]
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"]
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()}
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", ]
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)
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, )
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" }
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" }
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()