| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513 |
- from django import forms
- from django.utils.translation import gettext as _
- from dcim.models import Region, Site, SiteGroup
- from extras.forms import (
- AddRemoveTagsForm, CustomFieldModelBulkEditForm, CustomFieldModelFilterForm, CustomFieldModelForm, CustomFieldModelCSVForm,
- )
- from extras.models import Tag
- from tenancy.forms import TenancyFilterForm, TenancyForm
- from tenancy.models import Tenant
- from utilities.forms import (
- add_blank_choice, BootstrapMixin, CommentField, CSVChoiceField, CSVModelChoiceField, DatePicker,
- DynamicModelChoiceField, DynamicModelMultipleChoiceField, SelectSpeedWidget, SmallTextarea, SlugField,
- StaticSelect, StaticSelectMultiple, TagFilterField,
- )
- from .choices import CircuitStatusChoices
- from .models import *
- #
- # Providers
- #
- class ProviderForm(BootstrapMixin, CustomFieldModelForm):
- slug = SlugField()
- comments = CommentField()
- tags = DynamicModelMultipleChoiceField(
- queryset=Tag.objects.all(),
- required=False
- )
- class Meta:
- model = Provider
- 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')),
- )
- widgets = {
- 'noc_contact': SmallTextarea(
- attrs={'rows': 5}
- ),
- 'admin_contact': SmallTextarea(
- attrs={'rows': 5}
- ),
- }
- 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",
- }
- class ProviderCSVForm(CustomFieldModelCSVForm):
- slug = SlugField()
- class Meta:
- model = Provider
- fields = (
- 'name', 'slug', 'asn', 'account', 'portal_url', 'noc_contact', 'admin_contact', 'comments',
- )
- class ProviderBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
- 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'
- )
- class Meta:
- nullable_fields = [
- 'asn', 'account', 'portal_url', 'noc_contact', 'admin_contact', 'comments',
- ]
- class ProviderFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
- model = Provider
- field_groups = [
- ['q', 'tag'],
- ['region_id', 'site_group_id', 'site_id'],
- ['asn'],
- ]
- q = forms.CharField(
- required=False,
- widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
- label=_('Search')
- )
- region_id = DynamicModelMultipleChoiceField(
- queryset=Region.objects.all(),
- required=False,
- label=_('Region'),
- fetch_trigger='open'
- )
- site_group_id = DynamicModelMultipleChoiceField(
- queryset=SiteGroup.objects.all(),
- required=False,
- label=_('Site group'),
- fetch_trigger='open'
- )
- site_id = DynamicModelMultipleChoiceField(
- queryset=Site.objects.all(),
- required=False,
- query_params={
- 'region_id': '$region_id',
- 'site_group_id': '$site_group_id',
- },
- label=_('Site'),
- fetch_trigger='open'
- )
- asn = forms.IntegerField(
- required=False,
- label=_('ASN')
- )
- tag = TagFilterField(model)
- #
- # Provider networks
- #
- class ProviderNetworkForm(BootstrapMixin, CustomFieldModelForm):
- provider = DynamicModelChoiceField(
- queryset=Provider.objects.all()
- )
- comments = CommentField()
- tags = DynamicModelMultipleChoiceField(
- queryset=Tag.objects.all(),
- required=False
- )
- class Meta:
- model = ProviderNetwork
- fields = [
- 'provider', 'name', 'description', 'comments', 'tags',
- ]
- fieldsets = (
- ('Provider Network', ('provider', 'name', 'description', 'tags')),
- )
- class ProviderNetworkCSVForm(CustomFieldModelCSVForm):
- provider = CSVModelChoiceField(
- queryset=Provider.objects.all(),
- to_field_name='name',
- help_text='Assigned provider'
- )
- class Meta:
- model = ProviderNetwork
- fields = [
- 'provider', 'name', 'description', 'comments',
- ]
- class ProviderNetworkBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
- pk = forms.ModelMultipleChoiceField(
- queryset=ProviderNetwork.objects.all(),
- 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',
- ]
- class ProviderNetworkFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
- model = ProviderNetwork
- field_groups = (
- ('q', 'tag'),
- ('provider_id',),
- )
- q = forms.CharField(
- required=False,
- widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
- label=_('Search')
- )
- provider_id = DynamicModelMultipleChoiceField(
- queryset=Provider.objects.all(),
- required=False,
- label=_('Provider'),
- fetch_trigger='open'
- )
- tag = TagFilterField(model)
- #
- # Circuit types
- #
- class CircuitTypeForm(BootstrapMixin, CustomFieldModelForm):
- slug = SlugField()
- class Meta:
- model = CircuitType
- fields = [
- 'name', 'slug', 'description',
- ]
- class CircuitTypeBulkEditForm(BootstrapMixin, CustomFieldModelBulkEditForm):
- 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 = ('name', 'slug', 'description')
- help_texts = {
- 'name': 'Name of circuit type',
- }
- class CircuitTypeFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
- model = CircuitType
- field_groups = [
- ['q'],
- ]
- q = forms.CharField(
- required=False,
- widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
- label=_('Search')
- )
- #
- # Circuits
- #
- class CircuitForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
- provider = DynamicModelChoiceField(
- queryset=Provider.objects.all()
- )
- type = DynamicModelChoiceField(
- queryset=CircuitType.objects.all()
- )
- comments = CommentField()
- tags = DynamicModelMultipleChoiceField(
- queryset=Tag.objects.all(),
- 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",
- 'commit_rate': "Committed rate",
- }
- widgets = {
- 'status': StaticSelect(),
- 'install_date': DatePicker(),
- 'commit_rate': SelectSpeedWidget(),
- }
- 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(
- 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',
- ]
- class CircuitBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
- pk = forms.ModelMultipleChoiceField(
- queryset=Circuit.objects.all(),
- widget=forms.MultipleHiddenInput
- )
- type = DynamicModelChoiceField(
- queryset=CircuitType.objects.all(),
- required=False
- )
- provider = DynamicModelChoiceField(
- queryset=Provider.objects.all(),
- required=False
- )
- status = forms.ChoiceField(
- choices=add_blank_choice(CircuitStatusChoices),
- required=False,
- initial='',
- widget=StaticSelect()
- )
- tenant = DynamicModelChoiceField(
- queryset=Tenant.objects.all(),
- required=False
- )
- commit_rate = forms.IntegerField(
- required=False,
- label='Commit rate (Kbps)'
- )
- description = forms.CharField(
- max_length=100,
- required=False
- )
- comments = CommentField(
- widget=SmallTextarea,
- label='Comments'
- )
- class Meta:
- nullable_fields = [
- 'tenant', 'commit_rate', 'description', 'comments',
- ]
- class CircuitFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
- model = Circuit
- field_groups = [
- ['q', 'tag'],
- ['provider_id', 'provider_network_id'],
- ['type_id', 'status', 'commit_rate'],
- ['region_id', 'site_group_id', 'site_id'],
- ['tenant_group_id', 'tenant_id'],
- ]
- q = forms.CharField(
- required=False,
- widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
- label=_('Search')
- )
- type_id = DynamicModelMultipleChoiceField(
- queryset=CircuitType.objects.all(),
- required=False,
- label=_('Type'),
- fetch_trigger='open'
- )
- provider_id = DynamicModelMultipleChoiceField(
- queryset=Provider.objects.all(),
- required=False,
- label=_('Provider'),
- fetch_trigger='open'
- )
- provider_network_id = DynamicModelMultipleChoiceField(
- queryset=ProviderNetwork.objects.all(),
- required=False,
- query_params={
- 'provider_id': '$provider_id'
- },
- label=_('Provider network'),
- fetch_trigger='open'
- )
- status = forms.MultipleChoiceField(
- choices=CircuitStatusChoices,
- required=False,
- widget=StaticSelectMultiple()
- )
- region_id = DynamicModelMultipleChoiceField(
- queryset=Region.objects.all(),
- required=False,
- label=_('Region'),
- fetch_trigger='open'
- )
- site_group_id = DynamicModelMultipleChoiceField(
- queryset=SiteGroup.objects.all(),
- required=False,
- label=_('Site group'),
- fetch_trigger='open'
- )
- site_id = DynamicModelMultipleChoiceField(
- queryset=Site.objects.all(),
- required=False,
- query_params={
- 'region_id': '$region_id',
- 'site_group_id': '$site_group_id',
- },
- label=_('Site'),
- fetch_trigger='open'
- )
- commit_rate = forms.IntegerField(
- required=False,
- min_value=0,
- label=_('Commit rate (Kbps)')
- )
- tag = TagFilterField(model)
- #
- # 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
- )
- 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)
|