1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

464 lines
12 KiB
Python
Raw Normal View History

2016-03-01 11:23:03 -05:00
from django import forms
from django.utils.translation import gettext as _
2016-03-01 11:23:03 -05:00
from dcim.models import Region, Site, SiteGroup
2020-01-29 13:53:26 -05:00
from extras.forms import (
AddRemoveTagsForm, CustomFieldBulkEditForm, CustomFieldFilterForm, CustomFieldModelForm, CustomFieldModelCSVForm,
)
2020-06-12 09:58:59 -04:00
from extras.models import Tag
2019-10-04 12:08:48 -04:00
from tenancy.forms import TenancyFilterForm, TenancyForm
from tenancy.models import Tenant
2016-05-18 15:17:58 -04:00
from utilities.forms import (
add_blank_choice, BootstrapMixin, CommentField, CSVChoiceField, CSVModelChoiceField, DatePicker,
DynamicModelChoiceField, DynamicModelMultipleChoiceField, SelectSpeedWidget, SmallTextarea, SlugField,
StaticSelect2, StaticSelect2Multiple, TagFilterField,
2016-05-18 15:17:58 -04:00
)
2019-11-07 11:10:46 -05:00
from .choices import CircuitStatusChoices
2021-03-18 11:10:48 -04:00
from .models import *
2016-03-01 11:23:03 -05:00
#
# Providers
#
2020-01-29 10:49:02 -05:00
class ProviderForm(BootstrapMixin, CustomFieldModelForm):
2016-05-20 15:32:17 -04:00
slug = SlugField()
2016-03-01 11:23:03 -05:00
comments = CommentField()
2020-06-12 09:58:59 -04:00
tags = DynamicModelMultipleChoiceField(
queryset=Tag.objects.all(),
2018-11-27 11:57:29 -05:00
required=False
)
2016-03-01 11:23:03 -05:00
class Meta:
model = Provider
2018-11-27 11:57:29 -05:00
fields = [
'name', 'slug', 'asn', 'account', 'portal_url', 'noc_contact', 'admin_contact', 'comments', 'tags',
]
fieldsets = (
('Provider', ('name', 'slug', 'asn', 'tags')),
('Support Info', ('account', 'portal_url', 'noc_contact', 'admin_contact')),
)
2016-03-01 11:23:03 -05:00
widgets = {
2018-11-27 11:57:29 -05:00
'noc_contact': SmallTextarea(
attrs={'rows': 5}
),
'admin_contact': SmallTextarea(
attrs={'rows': 5}
),
2016-03-01 11:23:03 -05:00
}
help_texts = {
'name': "Full name of the provider",
'asn': "BGP autonomous system number (if applicable)",
'portal_url': "URL of the provider's customer support portal",
'noc_contact': "NOC email address and phone number",
'admin_contact': "Administrative contact email address and phone number",
}
2020-01-29 13:53:26 -05:00
class ProviderCSVForm(CustomFieldModelCSVForm):
slug = SlugField()
2016-03-01 11:23:03 -05:00
class Meta:
model = Provider
fields = Provider.csv_headers
2016-03-01 11:23:03 -05:00
2018-07-10 10:00:21 -04:00
class ProviderBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditForm):
2018-11-27 11:57:29 -05:00
pk = forms.ModelMultipleChoiceField(
queryset=Provider.objects.all(),
widget=forms.MultipleHiddenInput
)
asn = forms.IntegerField(
required=False,
label='ASN'
)
account = forms.CharField(
max_length=30,
required=False,
label='Account number'
)
portal_url = forms.URLField(
required=False,
label='Portal'
)
noc_contact = forms.CharField(
required=False,
widget=SmallTextarea,
label='NOC contact'
)
admin_contact = forms.CharField(
required=False,
widget=SmallTextarea,
label='Admin contact'
)
comments = CommentField(
widget=SmallTextarea,
label='Comments'
2018-11-27 11:57:29 -05:00
)
2016-03-01 11:23:03 -05:00
class Meta:
2018-11-27 11:57:29 -05:00
nullable_fields = [
'asn', 'account', 'portal_url', 'noc_contact', 'admin_contact', 'comments',
]
2016-03-01 11:23:03 -05:00
class ProviderFilterForm(BootstrapMixin, CustomFieldFilterForm):
model = Provider
2018-11-27 11:57:29 -05:00
q = forms.CharField(
required=False,
label=_('Search')
2018-11-27 11:57:29 -05:00
)
region_id = DynamicModelMultipleChoiceField(
queryset=Region.objects.all(),
required=False,
label=_('Region')
)
site_id = DynamicModelMultipleChoiceField(
2018-11-27 11:57:29 -05:00
queryset=Site.objects.all(),
required=False,
query_params={
'region_id': '$region_id'
},
label=_('Site')
2018-11-27 11:57:29 -05:00
)
asn = forms.IntegerField(
required=False,
label=_('ASN')
2018-11-27 11:57:29 -05:00
)
tag = TagFilterField(model)
2020-01-13 20:16:13 +00:00
2021-03-18 11:10:48 -04:00
#
2021-04-01 10:21:41 -04:00
# Provider networks
2021-03-18 11:10:48 -04:00
#
2021-04-01 10:21:41 -04:00
class ProviderNetworkForm(BootstrapMixin, CustomFieldModelForm):
2021-03-18 11:10:48 -04:00
provider = DynamicModelChoiceField(
queryset=Provider.objects.all()
)
comments = CommentField()
tags = DynamicModelMultipleChoiceField(
queryset=Tag.objects.all(),
required=False
)
class Meta:
2021-04-01 10:21:41 -04:00
model = ProviderNetwork
2021-03-18 11:10:48 -04:00
fields = [
'provider', 'name', 'description', 'comments', 'tags',
]
fieldsets = (
2021-04-01 10:21:41 -04:00
('Provider Network', ('provider', 'name', 'description', 'tags')),
2021-03-18 11:10:48 -04:00
)
2021-04-01 10:21:41 -04:00
class ProviderNetworkCSVForm(CustomFieldModelCSVForm):
2021-03-18 11:10:48 -04:00
provider = CSVModelChoiceField(
queryset=Provider.objects.all(),
to_field_name='name',
help_text='Assigned provider'
)
class Meta:
2021-04-01 10:21:41 -04:00
model = ProviderNetwork
2021-03-18 11:10:48 -04:00
fields = [
'provider', 'name', 'description', 'comments',
]
2021-04-01 10:21:41 -04:00
class ProviderNetworkBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditForm):
2021-03-18 11:10:48 -04:00
pk = forms.ModelMultipleChoiceField(
2021-04-01 10:21:41 -04:00
queryset=ProviderNetwork.objects.all(),
2021-03-18 11:10:48 -04:00
widget=forms.MultipleHiddenInput
)
provider = DynamicModelChoiceField(
queryset=Provider.objects.all(),
required=False
)
description = forms.CharField(
max_length=100,
required=False
)
comments = CommentField(
widget=SmallTextarea,
label='Comments'
)
class Meta:
nullable_fields = [
'description', 'comments',
]
2021-04-01 10:21:41 -04:00
class ProviderNetworkFilterForm(BootstrapMixin, CustomFieldFilterForm):
model = ProviderNetwork
2021-03-18 11:10:48 -04:00
field_order = ['q', 'provider_id']
q = forms.CharField(
required=False,
label=_('Search')
)
provider_id = DynamicModelMultipleChoiceField(
queryset=Provider.objects.all(),
required=False,
label=_('Provider')
)
tag = TagFilterField(model)
2016-05-13 12:44:03 -04:00
#
# Circuit types
#
class CircuitTypeForm(BootstrapMixin, CustomFieldModelForm):
2016-05-20 15:32:17 -04:00
slug = SlugField()
2016-05-13 12:44:03 -04:00
class Meta:
model = CircuitType
2018-11-27 11:57:29 -05:00
fields = [
'name', 'slug', 'description',
2018-11-27 11:57:29 -05:00
]
2016-05-13 12:44:03 -04:00
class CircuitTypeBulkEditForm(BootstrapMixin, CustomFieldBulkEditForm):
pk = forms.ModelMultipleChoiceField(
queryset=CircuitType.objects.all(),
widget=forms.MultipleHiddenInput
)
description = forms.CharField(
max_length=200,
required=False
)
class Meta:
nullable_fields = ['description']
class CircuitTypeCSVForm(CustomFieldModelCSVForm):
slug = SlugField()
class Meta:
model = CircuitType
fields = CircuitType.csv_headers
help_texts = {
'name': 'Name of circuit type',
}
2016-03-01 11:23:03 -05:00
#
# Circuits
#
2020-01-29 10:49:02 -05:00
class CircuitForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
provider = DynamicModelChoiceField(
queryset=Provider.objects.all()
)
type = DynamicModelChoiceField(
queryset=CircuitType.objects.all()
)
comments = CommentField()
2020-06-12 09:58:59 -04:00
tags = DynamicModelMultipleChoiceField(
queryset=Tag.objects.all(),
2018-11-27 11:57:29 -05:00
required=False
)
class Meta:
model = Circuit
fields = [
'cid', 'type', 'provider', 'status', 'install_date', 'commit_rate', 'description', 'tenant_group', 'tenant',
'comments', 'tags',
]
fieldsets = (
('Circuit', ('provider', 'cid', 'type', 'status', 'install_date', 'commit_rate', 'description', 'tags')),
('Tenancy', ('tenant_group', 'tenant')),
)
help_texts = {
'cid': "Unique circuit ID",
2017-01-03 14:25:51 -05:00
'commit_rate': "Committed rate",
}
2019-01-10 17:50:06 -05:00
widgets = {
'status': StaticSelect2(),
2019-12-28 22:55:00 +00:00
'install_date': DatePicker(),
'commit_rate': SelectSpeedWidget(),
2019-01-10 17:50:06 -05:00
}
2020-01-29 13:53:26 -05:00
class CircuitCSVForm(CustomFieldModelCSVForm):
provider = CSVModelChoiceField(
queryset=Provider.objects.all(),
to_field_name='name',
help_text='Assigned provider'
)
type = CSVModelChoiceField(
queryset=CircuitType.objects.all(),
to_field_name='name',
help_text='Type of circuit'
)
status = CSVChoiceField(
2019-11-07 11:10:46 -05:00
choices=CircuitStatusChoices,
required=False,
help_text='Operational status'
)
tenant = CSVModelChoiceField(
queryset=Tenant.objects.all(),
required=False,
to_field_name='name',
help_text='Assigned tenant'
)
class Meta:
model = Circuit
fields = [
'cid', 'provider', 'type', 'status', 'tenant', 'install_date', 'commit_rate', 'description', 'comments',
]
2018-07-10 10:00:21 -04:00
class CircuitBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditForm):
2018-11-27 11:57:29 -05:00
pk = forms.ModelMultipleChoiceField(
queryset=Circuit.objects.all(),
widget=forms.MultipleHiddenInput
)
type = DynamicModelChoiceField(
2018-11-27 11:57:29 -05:00
queryset=CircuitType.objects.all(),
required=False
2018-11-27 11:57:29 -05:00
)
provider = DynamicModelChoiceField(
2018-11-27 11:57:29 -05:00
queryset=Provider.objects.all(),
required=False
2018-11-27 11:57:29 -05:00
)
status = forms.ChoiceField(
2019-11-07 11:10:46 -05:00
choices=add_blank_choice(CircuitStatusChoices),
2018-11-27 11:57:29 -05:00
required=False,
2019-01-10 17:50:06 -05:00
initial='',
widget=StaticSelect2()
2018-11-27 11:57:29 -05:00
)
tenant = DynamicModelChoiceField(
2018-11-27 11:57:29 -05:00
queryset=Tenant.objects.all(),
required=False
2018-11-27 11:57:29 -05:00
)
commit_rate = forms.IntegerField(
required=False,
label='Commit rate (Kbps)'
)
description = forms.CharField(
max_length=100,
required=False
)
comments = CommentField(
widget=SmallTextarea,
label='Comments'
2018-11-27 11:57:29 -05:00
)
class Meta:
2018-11-27 11:57:29 -05:00
nullable_fields = [
'tenant', 'commit_rate', 'description', 'comments',
]
class CircuitFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm):
model = Circuit
field_order = [
2021-04-01 10:21:41 -04:00
'q', 'type_id', 'provider_id', 'provider_network_id', 'status', 'region_id', 'site_id', 'tenant_group_id', 'tenant_id',
2021-03-18 14:32:28 -04:00
'commit_rate',
]
2018-11-27 11:57:29 -05:00
q = forms.CharField(
required=False,
label=_('Search')
2018-11-27 11:57:29 -05:00
)
type_id = DynamicModelMultipleChoiceField(
2019-01-10 17:50:06 -05:00
queryset=CircuitType.objects.all(),
required=False,
label=_('Type')
)
provider_id = DynamicModelMultipleChoiceField(
2019-01-10 17:50:06 -05:00
queryset=Provider.objects.all(),
required=False,
label=_('Provider')
)
2021-04-01 10:21:41 -04:00
provider_network_id = DynamicModelMultipleChoiceField(
queryset=ProviderNetwork.objects.all(),
2021-03-18 14:32:28 -04:00
required=False,
query_params={
'provider_id': '$provider_id'
},
2021-04-01 10:21:41 -04:00
label=_('Provider network')
2021-03-18 14:32:28 -04:00
)
2019-01-10 17:50:06 -05:00
status = forms.MultipleChoiceField(
2019-11-07 11:10:46 -05:00
choices=CircuitStatusChoices,
2019-01-10 17:50:06 -05:00
required=False,
widget=StaticSelect2Multiple()
)
region_id = DynamicModelMultipleChoiceField(
queryset=Region.objects.all(),
required=False,
label=_('Region')
)
site_id = DynamicModelMultipleChoiceField(
2019-01-10 17:50:06 -05:00
queryset=Site.objects.all(),
required=False,
query_params={
'region_id': '$region_id'
},
label=_('Site')
)
2018-11-27 11:57:29 -05:00
commit_rate = forms.IntegerField(
required=False,
min_value=0,
label=_('Commit rate (Kbps)')
2018-11-27 11:57:29 -05:00
)
tag = TagFilterField(model)
2020-01-13 20:16:13 +00:00
#
# Circuit terminations
#
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
)
2021-04-01 10:21:41 -04:00
provider_network = DynamicModelChoiceField(
queryset=ProviderNetwork.objects.all(),
required=False
)
2016-03-01 11:23:03 -05:00
class Meta:
model = CircuitTermination
fields = [
2021-04-01 10:21:41 -04:00
'term_side', 'region', 'site_group', 'site', 'provider_network', 'mark_connected', 'port_speed',
'upstream_speed', 'xconnect_id', 'pp_info', 'description',
]
2016-03-01 11:23:03 -05:00
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)
2021-04-01 10:21:41 -04:00
self.fields['provider_network'].widget.add_query_param('provider_id', self.instance.circuit.provider_id)