| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440 |
- from django import forms
- from django.contrib.auth.models import User
- from django.utils.translation import gettext as _
- from timezone_field import TimeZoneFormField
- from dcim.choices import *
- from dcim.constants import *
- from dcim.models import *
- from extras.models import ConfigTemplate
- from ipam.models import ASN, VLAN, VLANGroup, VRF
- from netbox.forms import NetBoxModelBulkEditForm
- from tenancy.models import Tenant
- from utilities.forms import BulkEditForm, add_blank_choice, form_from_model
- from utilities.forms.fields import ColorField, CommentField, DynamicModelChoiceField, DynamicModelMultipleChoiceField
- from utilities.forms.widgets import BulkEditNullBooleanSelect, NumberWithOptions
- from wireless.models import WirelessLAN, WirelessLANGroup
- __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',
- 'VirtualDeviceContextBulkEditForm'
- )
- class RegionBulkEditForm(NetBoxModelBulkEditForm):
- parent = DynamicModelChoiceField(
- queryset=Region.objects.all(),
- required=False
- )
- description = forms.CharField(
- max_length=200,
- required=False
- )
- model = Region
- fieldsets = (
- (None, ('parent', 'description')),
- )
- nullable_fields = ('parent', 'description')
- class SiteGroupBulkEditForm(NetBoxModelBulkEditForm):
- parent = DynamicModelChoiceField(
- queryset=SiteGroup.objects.all(),
- required=False
- )
- description = forms.CharField(
- max_length=200,
- required=False
- )
- model = SiteGroup
- fieldsets = (
- (None, ('parent', 'description')),
- )
- nullable_fields = ('parent', 'description')
- class SiteBulkEditForm(NetBoxModelBulkEditForm):
- status = forms.ChoiceField(
- choices=add_blank_choice(SiteStatusChoices),
- required=False,
- initial=''
- )
- 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
- )
- contact_name = forms.CharField(
- max_length=50,
- required=False
- )
- contact_phone = forms.CharField(
- max_length=20,
- required=False
- )
- contact_email = forms.EmailField(
- required=False,
- label=_('Contact E-mail')
- )
- time_zone = TimeZoneFormField(
- choices=add_blank_choice(TimeZoneFormField().choices),
- required=False
- )
- description = forms.CharField(
- max_length=200,
- required=False
- )
- comments = CommentField(
- label='Comments'
- )
- model = Site
- fieldsets = (
- (None, ('status', 'region', 'group', 'tenant', 'asns', 'time_zone', 'description')),
- )
- nullable_fields = (
- 'region', 'group', 'tenant', 'asns', 'time_zone', 'description', 'comments',
- )
- class LocationBulkEditForm(NetBoxModelBulkEditForm):
- site = DynamicModelChoiceField(
- queryset=Site.objects.all(),
- required=False
- )
- parent = DynamicModelChoiceField(
- queryset=Location.objects.all(),
- required=False,
- query_params={
- 'site_id': '$site'
- }
- )
- status = forms.ChoiceField(
- choices=add_blank_choice(LocationStatusChoices),
- required=False,
- initial=''
- )
- tenant = DynamicModelChoiceField(
- queryset=Tenant.objects.all(),
- required=False
- )
- description = forms.CharField(
- max_length=200,
- required=False
- )
- model = Location
- fieldsets = (
- (None, ('site', 'parent', 'status', 'tenant', 'description')),
- )
- nullable_fields = ('parent', 'tenant', 'description')
- class RackRoleBulkEditForm(NetBoxModelBulkEditForm):
- color = ColorField(
- required=False
- )
- description = forms.CharField(
- max_length=200,
- required=False
- )
- model = RackRole
- fieldsets = (
- (None, ('color', 'description')),
- )
- nullable_fields = ('color', 'description')
- class RackBulkEditForm(NetBoxModelBulkEditForm):
- 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=''
- )
- 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
- )
- width = forms.ChoiceField(
- choices=add_blank_choice(RackWidthChoices),
- required=False
- )
- 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
- )
- mounting_depth = forms.IntegerField(
- required=False,
- min_value=1
- )
- weight = forms.DecimalField(
- min_value=0,
- required=False
- )
- max_weight = forms.IntegerField(
- min_value=0,
- required=False
- )
- weight_unit = forms.ChoiceField(
- choices=add_blank_choice(WeightUnitChoices),
- required=False,
- initial=''
- )
- description = forms.CharField(
- max_length=200,
- required=False
- )
- comments = CommentField(
- label='Comments'
- )
- model = Rack
- fieldsets = (
- ('Rack', ('status', 'role', 'tenant', 'serial', 'asset_tag', 'description')),
- ('Location', ('region', 'site_group', 'site', 'location')),
- ('Hardware', (
- 'type', 'width', 'u_height', 'desc_units', 'outer_width', 'outer_depth', 'outer_unit', 'mounting_depth',
- )),
- ('Weight', ('weight', 'max_weight', 'weight_unit')),
- )
- nullable_fields = (
- 'location', 'tenant', 'role', 'serial', 'asset_tag', 'outer_width', 'outer_depth', 'outer_unit', 'weight',
- 'max_weight', 'weight_unit', 'description', 'comments',
- )
- class RackReservationBulkEditForm(NetBoxModelBulkEditForm):
- user = forms.ModelChoiceField(
- queryset=User.objects.order_by(
- 'username'
- ),
- required=False
- )
- tenant = DynamicModelChoiceField(
- queryset=Tenant.objects.all(),
- required=False
- )
- description = forms.CharField(
- max_length=200,
- required=False
- )
- comments = CommentField(
- label='Comments'
- )
- model = RackReservation
- fieldsets = (
- (None, ('user', 'tenant', 'description')),
- )
- nullable_fields = ('comments',)
- class ManufacturerBulkEditForm(NetBoxModelBulkEditForm):
- description = forms.CharField(
- max_length=200,
- required=False
- )
- model = Manufacturer
- fieldsets = (
- (None, ('description',)),
- )
- nullable_fields = ('description',)
- class DeviceTypeBulkEditForm(NetBoxModelBulkEditForm):
- manufacturer = DynamicModelChoiceField(
- queryset=Manufacturer.objects.all(),
- required=False
- )
- default_platform = DynamicModelChoiceField(
- queryset=Platform.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
- )
- weight = forms.DecimalField(
- min_value=0,
- required=False
- )
- weight_unit = forms.ChoiceField(
- choices=add_blank_choice(WeightUnitChoices),
- required=False,
- initial=''
- )
- description = forms.CharField(
- max_length=200,
- required=False
- )
- comments = CommentField(
- label='Comments'
- )
- model = DeviceType
- fieldsets = (
- ('Device Type', ('manufacturer', 'default_platform', 'part_number', 'u_height', 'is_full_depth', 'airflow', 'description')),
- ('Weight', ('weight', 'weight_unit')),
- )
- nullable_fields = ('part_number', 'airflow', 'weight', 'weight_unit', 'description', 'comments')
- class ModuleTypeBulkEditForm(NetBoxModelBulkEditForm):
- manufacturer = DynamicModelChoiceField(
- queryset=Manufacturer.objects.all(),
- required=False
- )
- part_number = forms.CharField(
- required=False
- )
- weight = forms.DecimalField(
- min_value=0,
- required=False
- )
- weight_unit = forms.ChoiceField(
- choices=add_blank_choice(WeightUnitChoices),
- required=False,
- initial=''
- )
- description = forms.CharField(
- max_length=200,
- required=False
- )
- comments = CommentField(
- label='Comments'
- )
- model = ModuleType
- fieldsets = (
- ('Module Type', ('manufacturer', 'part_number', 'description')),
- ('Weight', ('weight', 'weight_unit')),
- )
- nullable_fields = ('part_number', 'weight', 'weight_unit', 'description', 'comments')
- class DeviceRoleBulkEditForm(NetBoxModelBulkEditForm):
- color = ColorField(
- required=False
- )
- vm_role = forms.NullBooleanField(
- required=False,
- widget=BulkEditNullBooleanSelect,
- label=_('VM role')
- )
- config_template = DynamicModelChoiceField(
- queryset=ConfigTemplate.objects.all(),
- required=False
- )
- description = forms.CharField(
- max_length=200,
- required=False
- )
- model = DeviceRole
- fieldsets = (
- (None, ('color', 'vm_role', 'config_template', 'description')),
- )
- nullable_fields = ('color', 'config_template', 'description')
- class PlatformBulkEditForm(NetBoxModelBulkEditForm):
- manufacturer = DynamicModelChoiceField(
- queryset=Manufacturer.objects.all(),
- required=False
- )
- napalm_driver = forms.CharField(
- max_length=50,
- required=False
- )
- config_template = DynamicModelChoiceField(
- queryset=ConfigTemplate.objects.all(),
- required=False
- )
- description = forms.CharField(
- max_length=200,
- required=False
- )
- model = Platform
- fieldsets = (
- (None, ('manufacturer', 'config_template', 'napalm_driver', 'description')),
- )
- nullable_fields = ('manufacturer', 'config_template', 'napalm_driver', 'description')
- class DeviceBulkEditForm(NetBoxModelBulkEditForm):
- 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
- )
- airflow = forms.ChoiceField(
- choices=add_blank_choice(DeviceAirflowChoices),
- required=False
- )
- serial = forms.CharField(
- max_length=50,
- required=False,
- label=_('Serial Number')
- )
- description = forms.CharField(
- max_length=200,
- required=False
- )
- config_template = DynamicModelChoiceField(
- queryset=ConfigTemplate.objects.all(),
- required=False
- )
- comments = CommentField(
- label='Comments'
- )
- model = Device
- fieldsets = (
- ('Device', ('device_role', 'status', 'tenant', 'platform', 'description')),
- ('Location', ('site', 'location')),
- ('Hardware', ('manufacturer', 'device_type', 'airflow', 'serial')),
- ('Configuration', ('config_template',)),
- )
- nullable_fields = (
- 'location', 'tenant', 'platform', 'serial', 'airflow', 'description', 'comments',
- )
- class ModuleBulkEditForm(NetBoxModelBulkEditForm):
- manufacturer = DynamicModelChoiceField(
- queryset=Manufacturer.objects.all(),
- required=False
- )
- module_type = DynamicModelChoiceField(
- queryset=ModuleType.objects.all(),
- required=False,
- query_params={
- 'manufacturer_id': '$manufacturer'
- }
- )
- status = forms.ChoiceField(
- choices=add_blank_choice(ModuleStatusChoices),
- required=False,
- initial=''
- )
- serial = forms.CharField(
- max_length=50,
- required=False,
- label=_('Serial Number')
- )
- description = forms.CharField(
- max_length=200,
- required=False
- )
- comments = CommentField(
- label='Comments'
- )
- model = Module
- fieldsets = (
- (None, ('manufacturer', 'module_type', 'status', 'serial', 'description')),
- )
- nullable_fields = ('serial', 'description', 'comments')
- class CableBulkEditForm(NetBoxModelBulkEditForm):
- type = forms.ChoiceField(
- choices=add_blank_choice(CableTypeChoices),
- required=False,
- initial=''
- )
- status = forms.ChoiceField(
- choices=add_blank_choice(LinkStatusChoices),
- required=False,
- 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=''
- )
- description = forms.CharField(
- max_length=200,
- required=False
- )
- comments = CommentField(
- label='Comments'
- )
- model = Cable
- fieldsets = (
- (None, ('type', 'status', 'tenant', 'label', 'description')),
- ('Attributes', ('color', 'length', 'length_unit')),
- )
- nullable_fields = (
- 'type', 'status', 'tenant', 'label', 'color', 'length', 'description', 'comments',
- )
- class VirtualChassisBulkEditForm(NetBoxModelBulkEditForm):
- domain = forms.CharField(
- max_length=30,
- required=False
- )
- description = forms.CharField(
- max_length=200,
- required=False
- )
- comments = CommentField(
- label='Comments'
- )
- model = VirtualChassis
- fieldsets = (
- (None, ('domain', 'description')),
- )
- nullable_fields = ('domain', 'description', 'comments')
- class PowerPanelBulkEditForm(NetBoxModelBulkEditForm):
- 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'
- }
- )
- description = forms.CharField(
- max_length=200,
- required=False
- )
- comments = CommentField(
- label='Comments'
- )
- model = PowerPanel
- fieldsets = (
- (None, ('region', 'site_group', 'site', 'location', 'description')),
- )
- nullable_fields = ('location', 'description', 'comments')
- class PowerFeedBulkEditForm(NetBoxModelBulkEditForm):
- 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=''
- )
- type = forms.ChoiceField(
- choices=add_blank_choice(PowerFeedTypeChoices),
- required=False,
- initial=''
- )
- supply = forms.ChoiceField(
- choices=add_blank_choice(PowerFeedSupplyChoices),
- required=False,
- initial=''
- )
- phase = forms.ChoiceField(
- choices=add_blank_choice(PowerFeedPhaseChoices),
- required=False,
- initial=''
- )
- voltage = forms.IntegerField(
- required=False
- )
- amperage = forms.IntegerField(
- required=False
- )
- max_utilization = forms.IntegerField(
- required=False
- )
- mark_connected = forms.NullBooleanField(
- required=False,
- widget=BulkEditNullBooleanSelect
- )
- description = forms.CharField(
- max_length=200,
- required=False
- )
- comments = CommentField(
- label=_('Comments')
- )
- model = PowerFeed
- fieldsets = (
- (None, ('power_panel', 'rack', 'status', 'type', 'mark_connected', 'description')),
- ('Power', ('supply', 'phase', 'voltage', 'amperage', 'max_utilization'))
- )
- nullable_fields = ('location', 'description', '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
- )
- 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
- )
- description = forms.CharField(
- required=False
- )
- 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
- )
- 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
- )
- 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
- )
- power_port = forms.ModelChoiceField(
- queryset=PowerPortTemplate.objects.all(),
- required=False
- )
- feed_leg = forms.ChoiceField(
- choices=add_blank_choice(PowerOutletFeedLegChoices),
- required=False
- )
- description = forms.CharField(
- required=False
- )
- 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
- )
- enabled = forms.NullBooleanField(
- required=False,
- widget=BulkEditNullBooleanSelect
- )
- mgmt_only = forms.NullBooleanField(
- required=False,
- widget=BulkEditNullBooleanSelect,
- label=_('Management only')
- )
- description = forms.CharField(
- required=False
- )
- poe_mode = forms.ChoiceField(
- choices=add_blank_choice(InterfacePoEModeChoices),
- required=False,
- initial='',
- label=_('PoE mode')
- )
- poe_type = forms.ChoiceField(
- choices=add_blank_choice(InterfacePoETypeChoices),
- required=False,
- initial='',
- label=_('PoE type')
- )
- nullable_fields = ('label', 'description', 'poe_mode', 'poe_type')
- 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
- )
- color = ColorField(
- required=False
- )
- description = forms.CharField(
- required=False
- )
- 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
- )
- color = ColorField(
- required=False
- )
- description = forms.CharField(
- required=False
- )
- 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
- )
- 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
- )
- 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
- )
- nullable_fields = ('label', 'role', 'manufacturer', 'part_id', 'description')
- #
- # Device components
- #
- class ComponentBulkEditForm(NetBoxModelBulkEditForm):
- device = forms.ModelChoiceField(
- queryset=Device.objects.all(),
- required=False,
- disabled=True,
- widget=forms.HiddenInput()
- )
- module = forms.ModelChoiceField(
- queryset=Module.objects.all(),
- required=False
- )
- def __init__(self, *args, **kwargs):
- super().__init__(*args, **kwargs)
- # Limit module queryset to Modules which belong to the parent Device
- if 'device' in self.initial:
- device = Device.objects.filter(pk=self.initial['device']).first()
- self.fields['module'].queryset = Module.objects.filter(device=device)
- else:
- self.fields['module'].choices = ()
- self.fields['module'].widget.attrs['disabled'] = True
- class ConsolePortBulkEditForm(
- form_from_model(ConsolePort, ['label', 'type', 'speed', 'mark_connected', 'description']),
- ComponentBulkEditForm
- ):
- mark_connected = forms.NullBooleanField(
- required=False,
- widget=BulkEditNullBooleanSelect
- )
- model = ConsolePort
- fieldsets = (
- (None, ('module', 'type', 'label', 'speed', 'description', 'mark_connected')),
- )
- nullable_fields = ('module', 'label', 'description')
- class ConsoleServerPortBulkEditForm(
- form_from_model(ConsoleServerPort, ['label', 'type', 'speed', 'mark_connected', 'description']),
- ComponentBulkEditForm
- ):
- mark_connected = forms.NullBooleanField(
- required=False,
- widget=BulkEditNullBooleanSelect
- )
- model = ConsoleServerPort
- fieldsets = (
- (None, ('module', 'type', 'label', 'speed', 'description', 'mark_connected')),
- )
- nullable_fields = ('module', 'label', 'description')
- class PowerPortBulkEditForm(
- form_from_model(PowerPort, ['label', 'type', 'maximum_draw', 'allocated_draw', 'mark_connected', 'description']),
- ComponentBulkEditForm
- ):
- mark_connected = forms.NullBooleanField(
- required=False,
- widget=BulkEditNullBooleanSelect
- )
- model = PowerPort
- fieldsets = (
- (None, ('module', 'type', 'label', 'description', 'mark_connected')),
- ('Power', ('maximum_draw', 'allocated_draw')),
- )
- nullable_fields = ('module', 'label', 'description')
- class PowerOutletBulkEditForm(
- form_from_model(PowerOutlet, ['label', 'type', 'feed_leg', 'power_port', 'mark_connected', 'description']),
- ComponentBulkEditForm
- ):
- mark_connected = forms.NullBooleanField(
- required=False,
- widget=BulkEditNullBooleanSelect
- )
- model = PowerOutlet
- fieldsets = (
- (None, ('module', 'type', 'label', 'description', 'mark_connected')),
- ('Power', ('feed_leg', 'power_port')),
- )
- nullable_fields = ('module', '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', 'wireless_lans'
- ]),
- ComponentBulkEditForm
- ):
- 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')
- )
- vdcs = DynamicModelMultipleChoiceField(
- queryset=VirtualDeviceContext.objects.all(),
- required=False,
- label='Virtual Device Contexts',
- query_params={
- 'device_id': '$device',
- }
- )
- speed = forms.IntegerField(
- required=False,
- widget=NumberWithOptions(
- options=InterfaceSpeedChoices
- )
- )
- mgmt_only = forms.NullBooleanField(
- required=False,
- widget=BulkEditNullBooleanSelect,
- label=_('Management only')
- )
- poe_mode = forms.ChoiceField(
- choices=add_blank_choice(InterfacePoEModeChoices),
- required=False,
- initial='',
- label=_('PoE mode')
- )
- poe_type = forms.ChoiceField(
- choices=add_blank_choice(InterfacePoETypeChoices),
- required=False,
- initial='',
- label=_('PoE type')
- )
- mark_connected = forms.NullBooleanField(
- required=False,
- widget=BulkEditNullBooleanSelect
- )
- mode = forms.ChoiceField(
- choices=add_blank_choice(InterfaceModeChoices),
- required=False,
- initial=''
- )
- vlan_group = DynamicModelChoiceField(
- queryset=VLANGroup.objects.all(),
- required=False,
- label=_('VLAN group')
- )
- untagged_vlan = DynamicModelChoiceField(
- queryset=VLAN.objects.all(),
- required=False,
- query_params={
- 'group_id': '$vlan_group',
- },
- label=_('Untagged VLAN')
- )
- tagged_vlans = DynamicModelMultipleChoiceField(
- queryset=VLAN.objects.all(),
- required=False,
- query_params={
- 'group_id': '$vlan_group',
- },
- label=_('Tagged VLANs')
- )
- vrf = DynamicModelChoiceField(
- queryset=VRF.objects.all(),
- required=False,
- label=_('VRF')
- )
- wireless_lan_group = DynamicModelChoiceField(
- queryset=WirelessLANGroup.objects.all(),
- required=False,
- label=_('Wireless LAN group')
- )
- wireless_lans = DynamicModelMultipleChoiceField(
- queryset=WirelessLAN.objects.all(),
- required=False,
- label=_('Wireless LANs'),
- query_params={
- 'group_id': '$wireless_lan_group',
- }
- )
- model = Interface
- fieldsets = (
- (None, ('module', 'type', 'label', 'speed', 'duplex', 'description')),
- ('Addressing', ('vrf', 'mac_address', 'wwn')),
- ('Operation', ('vdcs', 'mtu', 'tx_power', 'enabled', 'mgmt_only', 'mark_connected')),
- ('PoE', ('poe_mode', 'poe_type')),
- ('Related Interfaces', ('parent', 'bridge', 'lag')),
- ('802.1Q Switching', ('mode', 'vlan_group', 'untagged_vlan', 'tagged_vlans')),
- ('Wireless', (
- 'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'wireless_lan_group', 'wireless_lans',
- )),
- )
- nullable_fields = (
- 'module', 'label', 'parent', 'bridge', 'lag', 'speed', 'duplex', 'mac_address', 'wwn', 'vdcs', 'mtu', 'description',
- 'poe_mode', 'poe_type', 'mode', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power',
- 'vlan_group', 'untagged_vlan', 'tagged_vlans', 'vrf', 'wireless_lans'
- )
- 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()
- if not self.cleaned_data['mode']:
- if self.cleaned_data['untagged_vlan']:
- raise forms.ValidationError({'untagged_vlan': "Interface mode must be specified to assign VLANs"})
- elif self.cleaned_data['tagged_vlans']:
- raise forms.ValidationError({'tagged_vlans': "Interface mode must be specified to assign VLANs"})
- # Untagged interfaces cannot be assigned tagged VLANs
- elif 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']),
- ComponentBulkEditForm
- ):
- mark_connected = forms.NullBooleanField(
- required=False,
- widget=BulkEditNullBooleanSelect
- )
- model = FrontPort
- fieldsets = (
- (None, ('module', 'type', 'label', 'color', 'description', 'mark_connected')),
- )
- nullable_fields = ('module', 'label', 'description', 'color')
- class RearPortBulkEditForm(
- form_from_model(RearPort, ['label', 'type', 'color', 'mark_connected', 'description']),
- ComponentBulkEditForm
- ):
- mark_connected = forms.NullBooleanField(
- required=False,
- widget=BulkEditNullBooleanSelect
- )
- model = RearPort
- fieldsets = (
- (None, ('module', 'type', 'label', 'color', 'description', 'mark_connected')),
- )
- nullable_fields = ('module', 'label', 'description', 'color')
- class ModuleBayBulkEditForm(
- form_from_model(ModuleBay, ['label', 'position', 'description']),
- NetBoxModelBulkEditForm
- ):
- model = ModuleBay
- fieldsets = (
- (None, ('label', 'position', 'description')),
- )
- nullable_fields = ('label', 'position', 'description')
- class DeviceBayBulkEditForm(
- form_from_model(DeviceBay, ['label', 'description']),
- NetBoxModelBulkEditForm
- ):
- model = DeviceBay
- fieldsets = (
- (None, ('label', 'description')),
- )
- nullable_fields = ('label', 'description')
- class InventoryItemBulkEditForm(
- form_from_model(InventoryItem, ['label', 'role', 'manufacturer', 'part_id', 'description']),
- NetBoxModelBulkEditForm
- ):
- device = DynamicModelChoiceField(
- queryset=Device.objects.all(),
- required=False
- )
- role = DynamicModelChoiceField(
- queryset=InventoryItemRole.objects.all(),
- required=False
- )
- manufacturer = DynamicModelChoiceField(
- queryset=Manufacturer.objects.all(),
- required=False
- )
- model = InventoryItem
- fieldsets = (
- (None, ('device', 'label', 'role', 'manufacturer', 'part_id', 'description')),
- )
- nullable_fields = ('label', 'role', 'manufacturer', 'part_id', 'description')
- #
- # Device component roles
- #
- class InventoryItemRoleBulkEditForm(NetBoxModelBulkEditForm):
- color = ColorField(
- required=False
- )
- description = forms.CharField(
- max_length=200,
- required=False
- )
- model = InventoryItemRole
- fieldsets = (
- (None, ('color', 'description')),
- )
- nullable_fields = ('color', 'description')
- class VirtualDeviceContextBulkEditForm(NetBoxModelBulkEditForm):
- device = DynamicModelChoiceField(
- queryset=Device.objects.all(),
- required=False
- )
- status = forms.ChoiceField(
- required=False,
- choices=add_blank_choice(VirtualDeviceContextStatusChoices)
- )
- tenant = DynamicModelChoiceField(
- queryset=Tenant.objects.all(),
- required=False
- )
- model = VirtualDeviceContext
- fieldsets = (
- (None, ('device', 'status', 'tenant')),
- )
- nullable_fields = ('device', 'tenant', )
|