| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239 |
- from django import forms
- from django.utils.translation import gettext as _
- from django.contrib.auth.models import User
- from timezone_field import TimeZoneFormField
- from dcim.choices import *
- from dcim.constants import *
- from dcim.models import *
- from ipam.models import ASN, VLAN, VRF
- from netbox.forms import NetBoxModelBulkEditForm
- from tenancy.models import Tenant
- from utilities.forms import (
- add_blank_choice, BulkEditForm, BulkEditNullBooleanSelect, ColorField, CommentField, DynamicModelChoiceField,
- DynamicModelMultipleChoiceField, form_from_model, SmallTextarea, StaticSelect, SelectSpeedWidget,
- )
- __all__ = (
- 'CableBulkEditForm',
- 'ConsolePortBulkEditForm',
- 'ConsolePortTemplateBulkEditForm',
- 'ConsoleServerPortBulkEditForm',
- 'ConsoleServerPortTemplateBulkEditForm',
- 'DeviceBayBulkEditForm',
- 'DeviceBayTemplateBulkEditForm',
- 'DeviceBulkEditForm',
- 'DeviceRoleBulkEditForm',
- 'DeviceTypeBulkEditForm',
- 'FrontPortBulkEditForm',
- 'FrontPortTemplateBulkEditForm',
- 'InterfaceBulkEditForm',
- 'InterfaceTemplateBulkEditForm',
- 'InventoryItemBulkEditForm',
- 'InventoryItemRoleBulkEditForm',
- 'InventoryItemTemplateBulkEditForm',
- 'LocationBulkEditForm',
- 'ManufacturerBulkEditForm',
- 'ModuleBulkEditForm',
- 'ModuleBayBulkEditForm',
- 'ModuleBayTemplateBulkEditForm',
- 'ModuleTypeBulkEditForm',
- 'PlatformBulkEditForm',
- 'PowerFeedBulkEditForm',
- 'PowerOutletBulkEditForm',
- 'PowerOutletTemplateBulkEditForm',
- 'PowerPanelBulkEditForm',
- 'PowerPortBulkEditForm',
- 'PowerPortTemplateBulkEditForm',
- 'RackBulkEditForm',
- 'RackReservationBulkEditForm',
- 'RackRoleBulkEditForm',
- 'RearPortBulkEditForm',
- 'RearPortTemplateBulkEditForm',
- 'RegionBulkEditForm',
- 'SiteBulkEditForm',
- 'SiteGroupBulkEditForm',
- 'VirtualChassisBulkEditForm',
- )
- class RegionBulkEditForm(NetBoxModelBulkEditForm):
- pk = forms.ModelMultipleChoiceField(
- queryset=Region.objects.all(),
- widget=forms.MultipleHiddenInput
- )
- parent = DynamicModelChoiceField(
- queryset=Region.objects.all(),
- required=False
- )
- description = forms.CharField(
- max_length=200,
- required=False
- )
- class Meta:
- nullable_fields = ('parent', 'description')
- class SiteGroupBulkEditForm(NetBoxModelBulkEditForm):
- pk = forms.ModelMultipleChoiceField(
- queryset=SiteGroup.objects.all(),
- widget=forms.MultipleHiddenInput
- )
- parent = DynamicModelChoiceField(
- queryset=SiteGroup.objects.all(),
- required=False
- )
- description = forms.CharField(
- max_length=200,
- required=False
- )
- class Meta:
- nullable_fields = ('parent', 'description')
- class SiteBulkEditForm(NetBoxModelBulkEditForm):
- pk = forms.ModelMultipleChoiceField(
- queryset=Site.objects.all(),
- widget=forms.MultipleHiddenInput
- )
- status = forms.ChoiceField(
- choices=add_blank_choice(SiteStatusChoices),
- required=False,
- initial='',
- widget=StaticSelect()
- )
- region = DynamicModelChoiceField(
- queryset=Region.objects.all(),
- required=False
- )
- group = DynamicModelChoiceField(
- queryset=SiteGroup.objects.all(),
- required=False
- )
- tenant = DynamicModelChoiceField(
- queryset=Tenant.objects.all(),
- required=False
- )
- asns = DynamicModelMultipleChoiceField(
- queryset=ASN.objects.all(),
- label=_('ASNs'),
- required=False
- )
- description = forms.CharField(
- max_length=100,
- required=False
- )
- time_zone = TimeZoneFormField(
- choices=add_blank_choice(TimeZoneFormField().choices),
- required=False,
- widget=StaticSelect()
- )
- class Meta:
- nullable_fields = (
- 'region', 'group', 'tenant', 'asns', 'description', 'time_zone',
- )
- class LocationBulkEditForm(NetBoxModelBulkEditForm):
- pk = forms.ModelMultipleChoiceField(
- queryset=Location.objects.all(),
- widget=forms.MultipleHiddenInput
- )
- site = DynamicModelChoiceField(
- queryset=Site.objects.all(),
- required=False
- )
- parent = DynamicModelChoiceField(
- queryset=Location.objects.all(),
- required=False,
- query_params={
- 'site_id': '$site'
- }
- )
- tenant = DynamicModelChoiceField(
- queryset=Tenant.objects.all(),
- required=False
- )
- description = forms.CharField(
- max_length=200,
- required=False
- )
- class Meta:
- nullable_fields = ('parent', 'tenant', 'description')
- class RackRoleBulkEditForm(NetBoxModelBulkEditForm):
- pk = forms.ModelMultipleChoiceField(
- queryset=RackRole.objects.all(),
- widget=forms.MultipleHiddenInput
- )
- color = ColorField(
- required=False
- )
- description = forms.CharField(
- max_length=200,
- required=False
- )
- class Meta:
- nullable_fields = ('color', 'description')
- class RackBulkEditForm(NetBoxModelBulkEditForm):
- pk = forms.ModelMultipleChoiceField(
- queryset=Rack.objects.all(),
- widget=forms.MultipleHiddenInput
- )
- 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(),
- required=False,
- query_params={
- 'region_id': '$region',
- 'group_id': '$site_group',
- }
- )
- location = DynamicModelChoiceField(
- queryset=Location.objects.all(),
- required=False,
- query_params={
- 'site_id': '$site'
- }
- )
- tenant = DynamicModelChoiceField(
- queryset=Tenant.objects.all(),
- required=False
- )
- status = forms.ChoiceField(
- choices=add_blank_choice(RackStatusChoices),
- required=False,
- initial='',
- widget=StaticSelect()
- )
- role = DynamicModelChoiceField(
- queryset=RackRole.objects.all(),
- required=False
- )
- serial = forms.CharField(
- max_length=50,
- required=False,
- label='Serial Number'
- )
- asset_tag = forms.CharField(
- max_length=50,
- required=False
- )
- type = forms.ChoiceField(
- choices=add_blank_choice(RackTypeChoices),
- required=False,
- widget=StaticSelect()
- )
- width = forms.ChoiceField(
- choices=add_blank_choice(RackWidthChoices),
- required=False,
- widget=StaticSelect()
- )
- u_height = forms.IntegerField(
- required=False,
- label='Height (U)'
- )
- desc_units = forms.NullBooleanField(
- required=False,
- widget=BulkEditNullBooleanSelect,
- label='Descending units'
- )
- outer_width = forms.IntegerField(
- required=False,
- min_value=1
- )
- outer_depth = forms.IntegerField(
- required=False,
- min_value=1
- )
- outer_unit = forms.ChoiceField(
- choices=add_blank_choice(RackDimensionUnitChoices),
- required=False,
- widget=StaticSelect()
- )
- comments = CommentField(
- widget=SmallTextarea,
- label='Comments'
- )
- class Meta:
- nullable_fields = (
- 'location', 'tenant', 'role', 'serial', 'asset_tag', 'outer_width', 'outer_depth', 'outer_unit', 'comments',
- )
- class RackReservationBulkEditForm(NetBoxModelBulkEditForm):
- pk = forms.ModelMultipleChoiceField(
- queryset=RackReservation.objects.all(),
- widget=forms.MultipleHiddenInput()
- )
- user = forms.ModelChoiceField(
- queryset=User.objects.order_by(
- 'username'
- ),
- required=False,
- widget=StaticSelect()
- )
- tenant = DynamicModelChoiceField(
- queryset=Tenant.objects.all(),
- required=False
- )
- description = forms.CharField(
- max_length=100,
- required=False
- )
- class ManufacturerBulkEditForm(NetBoxModelBulkEditForm):
- pk = forms.ModelMultipleChoiceField(
- queryset=Manufacturer.objects.all(),
- widget=forms.MultipleHiddenInput
- )
- description = forms.CharField(
- max_length=200,
- required=False
- )
- class Meta:
- nullable_fields = ('description',)
- class DeviceTypeBulkEditForm(NetBoxModelBulkEditForm):
- pk = forms.ModelMultipleChoiceField(
- queryset=DeviceType.objects.all(),
- widget=forms.MultipleHiddenInput()
- )
- manufacturer = DynamicModelChoiceField(
- queryset=Manufacturer.objects.all(),
- required=False
- )
- part_number = forms.CharField(
- required=False
- )
- u_height = forms.IntegerField(
- min_value=1,
- required=False
- )
- is_full_depth = forms.NullBooleanField(
- required=False,
- widget=BulkEditNullBooleanSelect(),
- label='Is full depth'
- )
- airflow = forms.ChoiceField(
- choices=add_blank_choice(DeviceAirflowChoices),
- required=False,
- widget=StaticSelect()
- )
- class Meta:
- nullable_fields = ('part_number', 'airflow')
- class ModuleTypeBulkEditForm(NetBoxModelBulkEditForm):
- pk = forms.ModelMultipleChoiceField(
- queryset=ModuleType.objects.all(),
- widget=forms.MultipleHiddenInput()
- )
- manufacturer = DynamicModelChoiceField(
- queryset=Manufacturer.objects.all(),
- required=False
- )
- part_number = forms.CharField(
- required=False
- )
- class Meta:
- nullable_fields = ('part_number',)
- class DeviceRoleBulkEditForm(NetBoxModelBulkEditForm):
- pk = forms.ModelMultipleChoiceField(
- queryset=DeviceRole.objects.all(),
- widget=forms.MultipleHiddenInput
- )
- color = ColorField(
- required=False
- )
- vm_role = forms.NullBooleanField(
- required=False,
- widget=BulkEditNullBooleanSelect,
- label='VM role'
- )
- description = forms.CharField(
- max_length=200,
- required=False
- )
- class Meta:
- nullable_fields = ('color', 'description')
- class PlatformBulkEditForm(NetBoxModelBulkEditForm):
- pk = forms.ModelMultipleChoiceField(
- queryset=Platform.objects.all(),
- widget=forms.MultipleHiddenInput
- )
- manufacturer = DynamicModelChoiceField(
- queryset=Manufacturer.objects.all(),
- required=False
- )
- napalm_driver = forms.CharField(
- max_length=50,
- required=False
- )
- # TODO: Bulk edit support for napalm_args
- description = forms.CharField(
- max_length=200,
- required=False
- )
- class Meta:
- nullable_fields = ('manufacturer', 'napalm_driver', 'description')
- class DeviceBulkEditForm(NetBoxModelBulkEditForm):
- pk = forms.ModelMultipleChoiceField(
- queryset=Device.objects.all(),
- widget=forms.MultipleHiddenInput()
- )
- manufacturer = DynamicModelChoiceField(
- queryset=Manufacturer.objects.all(),
- required=False
- )
- device_type = DynamicModelChoiceField(
- queryset=DeviceType.objects.all(),
- required=False,
- query_params={
- 'manufacturer_id': '$manufacturer'
- }
- )
- device_role = DynamicModelChoiceField(
- queryset=DeviceRole.objects.all(),
- required=False
- )
- site = DynamicModelChoiceField(
- queryset=Site.objects.all(),
- required=False
- )
- location = DynamicModelChoiceField(
- queryset=Location.objects.all(),
- required=False,
- query_params={
- 'site_id': '$site'
- }
- )
- tenant = DynamicModelChoiceField(
- queryset=Tenant.objects.all(),
- required=False
- )
- platform = DynamicModelChoiceField(
- queryset=Platform.objects.all(),
- required=False
- )
- status = forms.ChoiceField(
- choices=add_blank_choice(DeviceStatusChoices),
- required=False,
- widget=StaticSelect()
- )
- airflow = forms.ChoiceField(
- choices=add_blank_choice(DeviceAirflowChoices),
- required=False,
- widget=StaticSelect()
- )
- serial = forms.CharField(
- max_length=50,
- required=False,
- label='Serial Number'
- )
- class Meta:
- nullable_fields = (
- 'tenant', 'platform', 'serial', 'airflow',
- )
- class ModuleBulkEditForm(NetBoxModelBulkEditForm):
- pk = forms.ModelMultipleChoiceField(
- queryset=Module.objects.all(),
- widget=forms.MultipleHiddenInput()
- )
- manufacturer = DynamicModelChoiceField(
- queryset=Manufacturer.objects.all(),
- required=False
- )
- module_type = DynamicModelChoiceField(
- queryset=ModuleType.objects.all(),
- required=False,
- query_params={
- 'manufacturer_id': '$manufacturer'
- }
- )
- serial = forms.CharField(
- max_length=50,
- required=False,
- label='Serial Number'
- )
- class Meta:
- nullable_fields = ('serial',)
- class CableBulkEditForm(NetBoxModelBulkEditForm):
- pk = forms.ModelMultipleChoiceField(
- queryset=Cable.objects.all(),
- widget=forms.MultipleHiddenInput
- )
- type = forms.ChoiceField(
- choices=add_blank_choice(CableTypeChoices),
- required=False,
- initial='',
- widget=StaticSelect()
- )
- status = forms.ChoiceField(
- choices=add_blank_choice(LinkStatusChoices),
- required=False,
- widget=StaticSelect(),
- initial=''
- )
- tenant = DynamicModelChoiceField(
- queryset=Tenant.objects.all(),
- required=False
- )
- label = forms.CharField(
- max_length=100,
- required=False
- )
- color = ColorField(
- required=False
- )
- length = forms.DecimalField(
- min_value=0,
- required=False
- )
- length_unit = forms.ChoiceField(
- choices=add_blank_choice(CableLengthUnitChoices),
- required=False,
- initial='',
- widget=StaticSelect()
- )
- class Meta:
- nullable_fields = (
- 'type', 'status', 'tenant', 'label', 'color', 'length',
- )
- def clean(self):
- super().clean()
- # Validate length/unit
- length = self.cleaned_data.get('length')
- length_unit = self.cleaned_data.get('length_unit')
- if length and not length_unit:
- raise forms.ValidationError({
- 'length_unit': "Must specify a unit when setting length"
- })
- class VirtualChassisBulkEditForm(NetBoxModelBulkEditForm):
- pk = forms.ModelMultipleChoiceField(
- queryset=VirtualChassis.objects.all(),
- widget=forms.MultipleHiddenInput()
- )
- domain = forms.CharField(
- max_length=30,
- required=False
- )
- class Meta:
- nullable_fields = ('domain',)
- class PowerPanelBulkEditForm(NetBoxModelBulkEditForm):
- pk = forms.ModelMultipleChoiceField(
- queryset=PowerPanel.objects.all(),
- widget=forms.MultipleHiddenInput
- )
- 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(),
- required=False,
- query_params={
- 'region_id': '$region',
- 'group_id': '$site_group',
- }
- )
- location = DynamicModelChoiceField(
- queryset=Location.objects.all(),
- required=False,
- query_params={
- 'site_id': '$site'
- }
- )
- class Meta:
- nullable_fields = ('location',)
- class PowerFeedBulkEditForm(NetBoxModelBulkEditForm):
- pk = forms.ModelMultipleChoiceField(
- queryset=PowerFeed.objects.all(),
- widget=forms.MultipleHiddenInput
- )
- power_panel = DynamicModelChoiceField(
- queryset=PowerPanel.objects.all(),
- required=False
- )
- rack = DynamicModelChoiceField(
- queryset=Rack.objects.all(),
- required=False,
- )
- status = forms.ChoiceField(
- choices=add_blank_choice(PowerFeedStatusChoices),
- required=False,
- initial='',
- widget=StaticSelect()
- )
- type = forms.ChoiceField(
- choices=add_blank_choice(PowerFeedTypeChoices),
- required=False,
- initial='',
- widget=StaticSelect()
- )
- supply = forms.ChoiceField(
- choices=add_blank_choice(PowerFeedSupplyChoices),
- required=False,
- initial='',
- widget=StaticSelect()
- )
- phase = forms.ChoiceField(
- choices=add_blank_choice(PowerFeedPhaseChoices),
- required=False,
- initial='',
- widget=StaticSelect()
- )
- voltage = forms.IntegerField(
- required=False
- )
- amperage = forms.IntegerField(
- required=False
- )
- max_utilization = forms.IntegerField(
- required=False
- )
- mark_connected = forms.NullBooleanField(
- required=False,
- widget=BulkEditNullBooleanSelect
- )
- comments = CommentField(
- widget=SmallTextarea,
- label='Comments'
- )
- class Meta:
- nullable_fields = (
- 'location', 'comments',
- )
- #
- # Device component templates
- #
- class ConsolePortTemplateBulkEditForm(BulkEditForm):
- pk = forms.ModelMultipleChoiceField(
- queryset=ConsolePortTemplate.objects.all(),
- widget=forms.MultipleHiddenInput()
- )
- label = forms.CharField(
- max_length=64,
- required=False
- )
- type = forms.ChoiceField(
- choices=add_blank_choice(ConsolePortTypeChoices),
- required=False,
- widget=StaticSelect()
- )
- class Meta:
- nullable_fields = ('label', 'type', 'description')
- class ConsoleServerPortTemplateBulkEditForm(BulkEditForm):
- pk = forms.ModelMultipleChoiceField(
- queryset=ConsoleServerPortTemplate.objects.all(),
- widget=forms.MultipleHiddenInput()
- )
- label = forms.CharField(
- max_length=64,
- required=False
- )
- type = forms.ChoiceField(
- choices=add_blank_choice(ConsolePortTypeChoices),
- required=False,
- widget=StaticSelect()
- )
- description = forms.CharField(
- required=False
- )
- class Meta:
- nullable_fields = ('label', 'type', 'description')
- class PowerPortTemplateBulkEditForm(BulkEditForm):
- pk = forms.ModelMultipleChoiceField(
- queryset=PowerPortTemplate.objects.all(),
- widget=forms.MultipleHiddenInput()
- )
- label = forms.CharField(
- max_length=64,
- required=False
- )
- type = forms.ChoiceField(
- choices=add_blank_choice(PowerPortTypeChoices),
- required=False,
- widget=StaticSelect()
- )
- maximum_draw = forms.IntegerField(
- min_value=1,
- required=False,
- help_text="Maximum power draw (watts)"
- )
- allocated_draw = forms.IntegerField(
- min_value=1,
- required=False,
- help_text="Allocated power draw (watts)"
- )
- description = forms.CharField(
- required=False
- )
- class Meta:
- nullable_fields = ('label', 'type', 'maximum_draw', 'allocated_draw', 'description')
- class PowerOutletTemplateBulkEditForm(BulkEditForm):
- pk = forms.ModelMultipleChoiceField(
- queryset=PowerOutletTemplate.objects.all(),
- widget=forms.MultipleHiddenInput()
- )
- device_type = forms.ModelChoiceField(
- queryset=DeviceType.objects.all(),
- required=False,
- disabled=True,
- widget=forms.HiddenInput()
- )
- label = forms.CharField(
- max_length=64,
- required=False
- )
- type = forms.ChoiceField(
- choices=add_blank_choice(PowerOutletTypeChoices),
- required=False,
- widget=StaticSelect()
- )
- power_port = forms.ModelChoiceField(
- queryset=PowerPortTemplate.objects.all(),
- required=False
- )
- feed_leg = forms.ChoiceField(
- choices=add_blank_choice(PowerOutletFeedLegChoices),
- required=False,
- widget=StaticSelect()
- )
- description = forms.CharField(
- required=False
- )
- class Meta:
- nullable_fields = ('label', 'type', 'power_port', 'feed_leg', 'description')
- def __init__(self, *args, **kwargs):
- super().__init__(*args, **kwargs)
- # Limit power_port queryset to PowerPortTemplates which belong to the parent DeviceType
- if 'device_type' in self.initial:
- device_type = DeviceType.objects.filter(pk=self.initial['device_type']).first()
- self.fields['power_port'].queryset = PowerPortTemplate.objects.filter(device_type=device_type)
- else:
- self.fields['power_port'].choices = ()
- self.fields['power_port'].widget.attrs['disabled'] = True
- class InterfaceTemplateBulkEditForm(BulkEditForm):
- pk = forms.ModelMultipleChoiceField(
- queryset=InterfaceTemplate.objects.all(),
- widget=forms.MultipleHiddenInput()
- )
- label = forms.CharField(
- max_length=64,
- required=False
- )
- type = forms.ChoiceField(
- choices=add_blank_choice(InterfaceTypeChoices),
- required=False,
- widget=StaticSelect()
- )
- mgmt_only = forms.NullBooleanField(
- required=False,
- widget=BulkEditNullBooleanSelect,
- label='Management only'
- )
- description = forms.CharField(
- required=False
- )
- class Meta:
- nullable_fields = ('label', 'description')
- class FrontPortTemplateBulkEditForm(BulkEditForm):
- pk = forms.ModelMultipleChoiceField(
- queryset=FrontPortTemplate.objects.all(),
- widget=forms.MultipleHiddenInput()
- )
- label = forms.CharField(
- max_length=64,
- required=False
- )
- type = forms.ChoiceField(
- choices=add_blank_choice(PortTypeChoices),
- required=False,
- widget=StaticSelect()
- )
- color = ColorField(
- required=False
- )
- description = forms.CharField(
- required=False
- )
- class Meta:
- nullable_fields = ('description',)
- class RearPortTemplateBulkEditForm(BulkEditForm):
- pk = forms.ModelMultipleChoiceField(
- queryset=RearPortTemplate.objects.all(),
- widget=forms.MultipleHiddenInput()
- )
- label = forms.CharField(
- max_length=64,
- required=False
- )
- type = forms.ChoiceField(
- choices=add_blank_choice(PortTypeChoices),
- required=False,
- widget=StaticSelect()
- )
- color = ColorField(
- required=False
- )
- description = forms.CharField(
- required=False
- )
- class Meta:
- nullable_fields = ('description',)
- class ModuleBayTemplateBulkEditForm(BulkEditForm):
- pk = forms.ModelMultipleChoiceField(
- queryset=ModuleBayTemplate.objects.all(),
- widget=forms.MultipleHiddenInput()
- )
- label = forms.CharField(
- max_length=64,
- required=False
- )
- description = forms.CharField(
- required=False
- )
- class Meta:
- nullable_fields = ('label', 'position', 'description')
- class DeviceBayTemplateBulkEditForm(BulkEditForm):
- pk = forms.ModelMultipleChoiceField(
- queryset=DeviceBayTemplate.objects.all(),
- widget=forms.MultipleHiddenInput()
- )
- label = forms.CharField(
- max_length=64,
- required=False
- )
- description = forms.CharField(
- required=False
- )
- class Meta:
- nullable_fields = ('label', 'description')
- class InventoryItemTemplateBulkEditForm(BulkEditForm):
- pk = forms.ModelMultipleChoiceField(
- queryset=InventoryItemTemplate.objects.all(),
- widget=forms.MultipleHiddenInput()
- )
- label = forms.CharField(
- max_length=64,
- required=False
- )
- description = forms.CharField(
- required=False
- )
- role = DynamicModelChoiceField(
- queryset=InventoryItemRole.objects.all(),
- required=False
- )
- manufacturer = DynamicModelChoiceField(
- queryset=Manufacturer.objects.all(),
- required=False
- )
- class Meta:
- nullable_fields = ('label', 'role', 'manufacturer', 'part_id', 'description')
- #
- # Device components
- #
- class ConsolePortBulkEditForm(
- form_from_model(ConsolePort, ['label', 'type', 'speed', 'mark_connected', 'description']),
- NetBoxModelBulkEditForm
- ):
- pk = forms.ModelMultipleChoiceField(
- queryset=ConsolePort.objects.all(),
- widget=forms.MultipleHiddenInput()
- )
- mark_connected = forms.NullBooleanField(
- required=False,
- widget=BulkEditNullBooleanSelect
- )
- class Meta:
- nullable_fields = ('label', 'description')
- class ConsoleServerPortBulkEditForm(
- form_from_model(ConsoleServerPort, ['label', 'type', 'speed', 'mark_connected', 'description']),
- NetBoxModelBulkEditForm
- ):
- pk = forms.ModelMultipleChoiceField(
- queryset=ConsoleServerPort.objects.all(),
- widget=forms.MultipleHiddenInput()
- )
- mark_connected = forms.NullBooleanField(
- required=False,
- widget=BulkEditNullBooleanSelect
- )
- class Meta:
- nullable_fields = ('label', 'description')
- class PowerPortBulkEditForm(
- form_from_model(PowerPort, ['label', 'type', 'maximum_draw', 'allocated_draw', 'mark_connected', 'description']),
- NetBoxModelBulkEditForm
- ):
- pk = forms.ModelMultipleChoiceField(
- queryset=PowerPort.objects.all(),
- widget=forms.MultipleHiddenInput()
- )
- mark_connected = forms.NullBooleanField(
- required=False,
- widget=BulkEditNullBooleanSelect
- )
- class Meta:
- nullable_fields = ('label', 'description')
- class PowerOutletBulkEditForm(
- form_from_model(PowerOutlet, ['label', 'type', 'feed_leg', 'power_port', 'mark_connected', 'description']),
- NetBoxModelBulkEditForm
- ):
- pk = forms.ModelMultipleChoiceField(
- queryset=PowerOutlet.objects.all(),
- widget=forms.MultipleHiddenInput()
- )
- device = forms.ModelChoiceField(
- queryset=Device.objects.all(),
- required=False,
- disabled=True,
- widget=forms.HiddenInput()
- )
- mark_connected = forms.NullBooleanField(
- required=False,
- widget=BulkEditNullBooleanSelect
- )
- class Meta:
- nullable_fields = ('label', 'type', 'feed_leg', 'power_port', 'description')
- def __init__(self, *args, **kwargs):
- super().__init__(*args, **kwargs)
- # Limit power_port queryset to PowerPorts which belong to the parent Device
- if 'device' in self.initial:
- device = Device.objects.filter(pk=self.initial['device']).first()
- self.fields['power_port'].queryset = PowerPort.objects.filter(device=device)
- else:
- self.fields['power_port'].choices = ()
- self.fields['power_port'].widget.attrs['disabled'] = True
- class InterfaceBulkEditForm(
- form_from_model(Interface, [
- 'label', 'type', 'parent', 'bridge', 'lag', 'speed', 'duplex', 'mac_address', 'wwn', 'mtu', 'mgmt_only', 'mark_connected',
- 'description', 'mode', 'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power',
- ]),
- NetBoxModelBulkEditForm
- ):
- pk = forms.ModelMultipleChoiceField(
- queryset=Interface.objects.all(),
- widget=forms.MultipleHiddenInput()
- )
- device = forms.ModelChoiceField(
- queryset=Device.objects.all(),
- required=False,
- disabled=True,
- widget=forms.HiddenInput()
- )
- enabled = forms.NullBooleanField(
- required=False,
- widget=BulkEditNullBooleanSelect
- )
- parent = DynamicModelChoiceField(
- queryset=Interface.objects.all(),
- required=False
- )
- bridge = DynamicModelChoiceField(
- queryset=Interface.objects.all(),
- required=False
- )
- lag = DynamicModelChoiceField(
- queryset=Interface.objects.all(),
- required=False,
- query_params={
- 'type': 'lag',
- },
- label='LAG'
- )
- speed = forms.IntegerField(
- required=False,
- widget=SelectSpeedWidget(attrs={'readonly': None}),
- label='Speed'
- )
- mgmt_only = forms.NullBooleanField(
- required=False,
- widget=BulkEditNullBooleanSelect,
- label='Management only'
- )
- mark_connected = forms.NullBooleanField(
- required=False,
- widget=BulkEditNullBooleanSelect
- )
- untagged_vlan = DynamicModelChoiceField(
- queryset=VLAN.objects.all(),
- required=False
- )
- tagged_vlans = DynamicModelMultipleChoiceField(
- queryset=VLAN.objects.all(),
- required=False
- )
- vrf = DynamicModelChoiceField(
- queryset=VRF.objects.all(),
- required=False,
- label='VRF'
- )
- class Meta:
- nullable_fields = (
- 'label', 'parent', 'bridge', 'lag', 'speed', 'duplex', 'mac_address', 'wwn', 'mtu', 'description', 'mode',
- 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'untagged_vlan', 'tagged_vlans',
- 'vrf',
- )
- def __init__(self, *args, **kwargs):
- super().__init__(*args, **kwargs)
- if 'device' in self.initial:
- device = Device.objects.filter(pk=self.initial['device']).first()
- # Restrict parent/bridge/LAG interface assignment by device
- self.fields['parent'].widget.add_query_param('device_id', device.pk)
- self.fields['bridge'].widget.add_query_param('device_id', device.pk)
- self.fields['lag'].widget.add_query_param('device_id', device.pk)
- # Limit VLAN choices by device
- self.fields['untagged_vlan'].widget.add_query_param('available_on_device', device.pk)
- self.fields['tagged_vlans'].widget.add_query_param('available_on_device', device.pk)
- else:
- # See #4523
- if 'pk' in self.initial:
- site = None
- interfaces = Interface.objects.filter(pk__in=self.initial['pk']).prefetch_related('device__site')
- # Check interface sites. First interface should set site, further interfaces will either continue the
- # loop or reset back to no site and break the loop.
- for interface in interfaces:
- if site is None:
- site = interface.device.site
- elif interface.device.site is not site:
- site = None
- break
- if site is not None:
- self.fields['untagged_vlan'].widget.add_query_param('site_id', site.pk)
- self.fields['tagged_vlans'].widget.add_query_param('site_id', site.pk)
- self.fields['parent'].choices = ()
- self.fields['parent'].widget.attrs['disabled'] = True
- self.fields['bridge'].choices = ()
- self.fields['bridge'].widget.attrs['disabled'] = True
- self.fields['lag'].choices = ()
- self.fields['lag'].widget.attrs['disabled'] = True
- def clean(self):
- super().clean()
- # Untagged interfaces cannot be assigned tagged VLANs
- if self.cleaned_data['mode'] == InterfaceModeChoices.MODE_ACCESS and self.cleaned_data['tagged_vlans']:
- raise forms.ValidationError({
- 'mode': "An access interface cannot have tagged VLANs assigned."
- })
- # Remove all tagged VLAN assignments from "tagged all" interfaces
- elif self.cleaned_data['mode'] == InterfaceModeChoices.MODE_TAGGED_ALL:
- self.cleaned_data['tagged_vlans'] = []
- class FrontPortBulkEditForm(
- form_from_model(FrontPort, ['label', 'type', 'color', 'mark_connected', 'description']),
- NetBoxModelBulkEditForm
- ):
- pk = forms.ModelMultipleChoiceField(
- queryset=FrontPort.objects.all(),
- widget=forms.MultipleHiddenInput()
- )
- class Meta:
- nullable_fields = ('label', 'description')
- class RearPortBulkEditForm(
- form_from_model(RearPort, ['label', 'type', 'color', 'mark_connected', 'description']),
- NetBoxModelBulkEditForm
- ):
- pk = forms.ModelMultipleChoiceField(
- queryset=RearPort.objects.all(),
- widget=forms.MultipleHiddenInput()
- )
- class Meta:
- nullable_fields = ('label', 'description')
- class ModuleBayBulkEditForm(
- form_from_model(DeviceBay, ['label', 'description']),
- NetBoxModelBulkEditForm
- ):
- pk = forms.ModelMultipleChoiceField(
- queryset=ModuleBay.objects.all(),
- widget=forms.MultipleHiddenInput()
- )
- class Meta:
- nullable_fields = ('label', 'position', 'description')
- class DeviceBayBulkEditForm(
- form_from_model(DeviceBay, ['label', 'description']),
- NetBoxModelBulkEditForm
- ):
- pk = forms.ModelMultipleChoiceField(
- queryset=DeviceBay.objects.all(),
- widget=forms.MultipleHiddenInput()
- )
- class Meta:
- nullable_fields = ('label', 'description')
- class InventoryItemBulkEditForm(
- form_from_model(InventoryItem, ['label', 'role', 'manufacturer', 'part_id', 'description']),
- NetBoxModelBulkEditForm
- ):
- pk = forms.ModelMultipleChoiceField(
- queryset=InventoryItem.objects.all(),
- widget=forms.MultipleHiddenInput()
- )
- role = DynamicModelChoiceField(
- queryset=InventoryItemRole.objects.all(),
- required=False
- )
- manufacturer = DynamicModelChoiceField(
- queryset=Manufacturer.objects.all(),
- required=False
- )
- class Meta:
- nullable_fields = ('label', 'role', 'manufacturer', 'part_id', 'description')
- #
- # Device component roles
- #
- class InventoryItemRoleBulkEditForm(NetBoxModelBulkEditForm):
- pk = forms.ModelMultipleChoiceField(
- queryset=InventoryItemRole.objects.all(),
- widget=forms.MultipleHiddenInput
- )
- color = ColorField(
- required=False
- )
- description = forms.CharField(
- max_length=200,
- required=False
- )
- class Meta:
- nullable_fields = ('color', 'description')
|