| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378 |
- from django import forms
- from django.contrib.contenttypes.models import ContentType
- from django.core.exceptions import ObjectDoesNotExist
- from django.utils.translation import gettext_lazy as _
- from circuits.choices import (
- CircuitCommitRateChoices, CircuitTerminationPortSpeedChoices, VirtualCircuitTerminationRoleChoices,
- )
- from circuits.constants import *
- from circuits.models import *
- from dcim.models import Interface, Site
- from ipam.models import ASN
- from netbox.forms import NetBoxModelForm, OrganizationalModelForm, PrimaryModelForm
- from tenancy.forms import TenancyForm
- from utilities.forms import get_field_value
- from utilities.forms.fields import (
- ContentTypeChoiceField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, SlugField,
- )
- from utilities.forms.mixins import DistanceValidationMixin
- from utilities.forms.rendering import FieldSet, InlineFields
- from utilities.forms.widgets import DatePicker, HTMXSelect, NumberWithOptions
- from utilities.templatetags.builtins.filters import bettertitle
- __all__ = (
- 'CircuitForm',
- 'CircuitGroupAssignmentForm',
- 'CircuitGroupForm',
- 'CircuitTerminationForm',
- 'CircuitTypeForm',
- 'ProviderForm',
- 'ProviderAccountForm',
- 'ProviderNetworkForm',
- 'VirtualCircuitForm',
- 'VirtualCircuitTerminationForm',
- 'VirtualCircuitTypeForm',
- )
- class ProviderForm(PrimaryModelForm):
- slug = SlugField()
- asns = DynamicModelMultipleChoiceField(
- queryset=ASN.objects.all(),
- label=_('ASNs'),
- required=False
- )
- fieldsets = (
- FieldSet('name', 'slug', 'asns', 'description', 'tags'),
- )
- class Meta:
- model = Provider
- fields = [
- 'name', 'slug', 'asns', 'description', 'owner', 'comments', 'tags',
- ]
- class ProviderAccountForm(PrimaryModelForm):
- provider = DynamicModelChoiceField(
- label=_('Provider'),
- queryset=Provider.objects.all(),
- selector=True,
- quick_add=True
- )
- class Meta:
- model = ProviderAccount
- fields = [
- 'provider', 'name', 'account', 'description', 'owner', 'comments', 'tags',
- ]
- class ProviderNetworkForm(PrimaryModelForm):
- provider = DynamicModelChoiceField(
- label=_('Provider'),
- queryset=Provider.objects.all(),
- selector=True,
- quick_add=True
- )
- fieldsets = (
- FieldSet('provider', 'name', 'service_id', 'description', 'tags'),
- )
- class Meta:
- model = ProviderNetwork
- fields = [
- 'provider', 'name', 'service_id', 'description', 'owner', 'comments', 'tags',
- ]
- class CircuitTypeForm(OrganizationalModelForm):
- fieldsets = (
- FieldSet('name', 'slug', 'color', 'description', 'owner', 'tags'),
- )
- class Meta:
- model = CircuitType
- fields = [
- 'name', 'slug', 'color', 'description', 'comments', 'tags',
- ]
- class CircuitForm(DistanceValidationMixin, TenancyForm, PrimaryModelForm):
- provider = DynamicModelChoiceField(
- label=_('Provider'),
- queryset=Provider.objects.all(),
- selector=True,
- quick_add=True
- )
- provider_account = DynamicModelChoiceField(
- label=_('Provider account'),
- queryset=ProviderAccount.objects.all(),
- required=False,
- query_params={
- 'provider_id': '$provider',
- }
- )
- type = DynamicModelChoiceField(
- queryset=CircuitType.objects.all(),
- quick_add=True
- )
- fieldsets = (
- FieldSet(
- 'provider',
- 'provider_account',
- 'cid',
- 'type',
- 'status',
- InlineFields('distance', 'distance_unit', label=_('Distance')),
- 'description',
- 'tags',
- name=_('Circuit')
- ),
- FieldSet('install_date', 'termination_date', 'commit_rate', name=_('Service Parameters')),
- FieldSet('tenant_group', 'tenant', name=_('Tenancy')),
- )
- class Meta:
- model = Circuit
- fields = [
- 'cid', 'type', 'provider', 'provider_account', 'status', 'install_date', 'termination_date', 'commit_rate',
- 'distance', 'distance_unit', 'description', 'tenant_group', 'tenant', 'owner', 'comments', 'tags',
- ]
- widgets = {
- 'install_date': DatePicker(),
- 'termination_date': DatePicker(),
- 'commit_rate': NumberWithOptions(
- options=CircuitCommitRateChoices
- ),
- }
- class CircuitTerminationForm(NetBoxModelForm):
- circuit = DynamicModelChoiceField(
- label=_('Circuit'),
- queryset=Circuit.objects.all(),
- selector=True
- )
- termination_type = ContentTypeChoiceField(
- queryset=ContentType.objects.filter(model__in=CIRCUIT_TERMINATION_TERMINATION_TYPES),
- widget=HTMXSelect(),
- required=False,
- label=_('Termination type')
- )
- termination = DynamicModelChoiceField(
- label=_('Termination'),
- queryset=Site.objects.none(), # Initial queryset
- required=False,
- disabled=True,
- selector=True
- )
- fieldsets = (
- FieldSet(
- 'circuit', 'term_side', 'description', 'tags',
- 'termination_type', 'termination',
- 'mark_connected', name=_('Circuit Termination')
- ),
- FieldSet('port_speed', 'upstream_speed', 'xconnect_id', 'pp_info', name=_('Termination Details')),
- )
- class Meta:
- model = CircuitTermination
- fields = [
- 'circuit', 'term_side', 'termination_type', 'mark_connected', 'port_speed', 'upstream_speed',
- 'xconnect_id', 'pp_info', 'description', 'tags',
- ]
- widgets = {
- 'port_speed': NumberWithOptions(
- options=CircuitTerminationPortSpeedChoices
- ),
- 'upstream_speed': NumberWithOptions(
- options=CircuitTerminationPortSpeedChoices
- ),
- }
- def __init__(self, *args, **kwargs):
- instance = kwargs.get('instance')
- initial = kwargs.get('initial', {})
- if instance is not None and instance.termination:
- initial['termination'] = instance.termination
- kwargs['initial'] = initial
- super().__init__(*args, **kwargs)
- if termination_type_id := get_field_value(self, 'termination_type'):
- try:
- termination_type = ContentType.objects.get(pk=termination_type_id)
- model = termination_type.model_class()
- self.fields['termination'].queryset = model.objects.all()
- self.fields['termination'].widget.attrs['selector'] = model._meta.label_lower
- self.fields['termination'].disabled = False
- self.fields['termination'].label = _(bettertitle(model._meta.verbose_name))
- except ObjectDoesNotExist:
- pass
- if self.instance and termination_type_id != self.instance.termination_type_id:
- self.initial['termination'] = None
- def clean(self):
- super().clean()
- # Assign the selected termination (if any)
- self.instance.termination = self.cleaned_data.get('termination')
- class CircuitGroupForm(TenancyForm, OrganizationalModelForm):
- fieldsets = (
- FieldSet('name', 'slug', 'description', 'tags', name=_('Circuit Group')),
- FieldSet('tenant_group', 'tenant', name=_('Tenancy')),
- )
- class Meta:
- model = CircuitGroup
- fields = [
- 'name', 'slug', 'description', 'tenant_group', 'tenant', 'owner', 'comments', 'tags',
- ]
- class CircuitGroupAssignmentForm(NetBoxModelForm):
- group = DynamicModelChoiceField(
- label=_('Group'),
- queryset=CircuitGroup.objects.all(),
- )
- member_type = ContentTypeChoiceField(
- queryset=ContentType.objects.filter(CIRCUIT_GROUP_ASSIGNMENT_MEMBER_MODELS),
- widget=HTMXSelect(),
- required=False,
- label=_('Circuit type')
- )
- member = DynamicModelChoiceField(
- label=_('Circuit'),
- queryset=Circuit.objects.none(), # Initial queryset
- required=False,
- disabled=True,
- selector=True
- )
- fieldsets = (
- FieldSet('group', 'member_type', 'member', 'priority', 'tags', name=_('Group Assignment')),
- )
- class Meta:
- model = CircuitGroupAssignment
- fields = [
- 'group', 'member_type', 'priority', 'tags',
- ]
- def __init__(self, *args, **kwargs):
- instance = kwargs.get('instance')
- initial = kwargs.get('initial', {})
- if instance is not None and instance.member:
- initial['member'] = instance.member
- kwargs['initial'] = initial
- super().__init__(*args, **kwargs)
- if member_type_id := get_field_value(self, 'member_type'):
- try:
- model = ContentType.objects.get(pk=member_type_id).model_class()
- self.fields['member'].queryset = model.objects.all()
- self.fields['member'].widget.attrs['selector'] = model._meta.label_lower
- self.fields['member'].disabled = False
- self.fields['member'].label = _(bettertitle(model._meta.verbose_name))
- except ObjectDoesNotExist:
- pass
- if self.instance.pk and member_type_id != self.instance.member_type_id:
- self.initial['member'] = None
- def clean(self):
- super().clean()
- # Assign the selected circuit (if any)
- self.instance.member = self.cleaned_data.get('member')
- class VirtualCircuitTypeForm(OrganizationalModelForm):
- fieldsets = (
- FieldSet('name', 'slug', 'color', 'description', 'tags'),
- )
- class Meta:
- model = VirtualCircuitType
- fields = [
- 'name', 'slug', 'color', 'description', 'owner', 'comments', 'tags',
- ]
- class VirtualCircuitForm(TenancyForm, PrimaryModelForm):
- provider_network = DynamicModelChoiceField(
- label=_('Provider network'),
- queryset=ProviderNetwork.objects.all(),
- selector=True
- )
- provider_account = DynamicModelChoiceField(
- label=_('Provider account'),
- queryset=ProviderAccount.objects.all(),
- required=False
- )
- type = DynamicModelChoiceField(
- queryset=VirtualCircuitType.objects.all(),
- quick_add=True
- )
- fieldsets = (
- FieldSet(
- 'provider_network', 'provider_account', 'cid', 'type', 'status', 'description', 'tags',
- name=_('Virtual circuit'),
- ),
- FieldSet('tenant_group', 'tenant', name=_('Tenancy')),
- )
- class Meta:
- model = VirtualCircuit
- fields = [
- 'cid', 'provider_network', 'provider_account', 'type', 'status', 'description', 'tenant_group', 'tenant',
- 'owner', 'comments', 'tags',
- ]
- class VirtualCircuitTerminationForm(NetBoxModelForm):
- virtual_circuit = DynamicModelChoiceField(
- label=_('Virtual circuit'),
- queryset=VirtualCircuit.objects.all(),
- selector=True
- )
- role = forms.ChoiceField(
- choices=VirtualCircuitTerminationRoleChoices,
- widget=HTMXSelect(),
- label=_('Role')
- )
- interface = DynamicModelChoiceField(
- label=_('Interface'),
- queryset=Interface.objects.all(),
- selector=True,
- query_params={
- 'kind': 'virtual',
- 'virtual_circuit_termination_id': 'null',
- },
- context={
- 'parent': 'device',
- }
- )
- fieldsets = (
- FieldSet('virtual_circuit', 'role', 'interface', 'description', 'tags'),
- )
- class Meta:
- model = VirtualCircuitTermination
- fields = [
- 'virtual_circuit', 'role', 'interface', 'description', 'tags',
- ]
|