| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777 |
- from collections import OrderedDict
- from django.contrib import messages
- from django.contrib.contenttypes.models import ContentType
- from django.core.paginator import EmptyPage, PageNotAnInteger
- from django.db import transaction
- from django.db.models import F, Prefetch
- from django.forms import ModelMultipleChoiceField, MultipleHiddenInput, modelformset_factory
- from django.shortcuts import get_object_or_404, redirect, render
- from django.utils.html import escape
- from django.utils.safestring import mark_safe
- from django.views.generic import View
- from circuits.models import Circuit
- from extras.views import ObjectChangeLogView, ObjectConfigContextView
- from ipam.models import IPAddress, Prefix, Service, VLAN
- from ipam.tables import InterfaceIPAddressTable, InterfaceVLANTable
- from netbox.views import generic
- from secrets.models import Secret
- from utilities.forms import ConfirmationForm
- from utilities.paginator import EnhancedPaginator, get_paginate_count
- from utilities.permissions import get_permission_for_model
- from utilities.utils import csv_format, count_related
- from utilities.views import GetReturnURLMixin, ObjectPermissionRequiredMixin
- from virtualization.models import VirtualMachine
- from . import filters, forms, tables
- from .choices import DeviceFaceChoices
- from .constants import NONCONNECTABLE_IFACE_TYPES
- from .models import (
- Cable, CablePath, ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay,
- DeviceBayTemplate, DeviceRole, DeviceType, FrontPort, FrontPortTemplate, Interface, InterfaceTemplate,
- InventoryItem, Manufacturer, PathEndpoint, Platform, PowerFeed, PowerOutlet, PowerOutletTemplate, PowerPanel,
- PowerPort, PowerPortTemplate, Rack, Location, RackReservation, RackRole, RearPort, RearPortTemplate, Region, Site,
- SiteGroup, VirtualChassis,
- )
- class BulkDisconnectView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View):
- """
- An extendable view for disconnection console/power/interface components in bulk.
- """
- queryset = None
- template_name = 'dcim/bulk_disconnect.html'
- def __init__(self, *args, **kwargs):
- super().__init__(*args, **kwargs)
- # Create a new Form class from ConfirmationForm
- class _Form(ConfirmationForm):
- pk = ModelMultipleChoiceField(
- queryset=self.queryset,
- widget=MultipleHiddenInput()
- )
- self.form = _Form
- def get_required_permission(self):
- return get_permission_for_model(self.queryset.model, 'change')
- def post(self, request):
- selected_objects = []
- return_url = self.get_return_url(request)
- if '_confirm' in request.POST:
- form = self.form(request.POST)
- if form.is_valid():
- with transaction.atomic():
- count = 0
- for obj in self.queryset.filter(pk__in=form.cleaned_data['pk']):
- if obj.cable is None:
- continue
- obj.cable.delete()
- count += 1
- messages.success(request, "Disconnected {} {}".format(
- count, self.queryset.model._meta.verbose_name_plural
- ))
- return redirect(return_url)
- else:
- form = self.form(initial={'pk': request.POST.getlist('pk')})
- selected_objects = self.queryset.filter(pk__in=form.initial['pk'])
- return render(request, self.template_name, {
- 'form': form,
- 'obj_type_plural': self.queryset.model._meta.verbose_name_plural,
- 'selected_objects': selected_objects,
- 'return_url': return_url,
- })
- #
- # Regions
- #
- class RegionListView(generic.ObjectListView):
- queryset = Region.objects.add_related_count(
- Region.objects.all(),
- Site,
- 'region',
- 'site_count',
- cumulative=True
- )
- filterset = filters.RegionFilterSet
- filterset_form = forms.RegionFilterForm
- table = tables.RegionTable
- class RegionEditView(generic.ObjectEditView):
- queryset = Region.objects.all()
- model_form = forms.RegionForm
- class RegionDeleteView(generic.ObjectDeleteView):
- queryset = Region.objects.all()
- class RegionBulkImportView(generic.BulkImportView):
- queryset = Region.objects.all()
- model_form = forms.RegionCSVForm
- table = tables.RegionTable
- class RegionBulkEditView(generic.BulkEditView):
- queryset = Region.objects.add_related_count(
- Region.objects.all(),
- Site,
- 'region',
- 'site_count',
- cumulative=True
- )
- filterset = filters.RegionFilterSet
- table = tables.RegionTable
- form = forms.RegionBulkEditForm
- class RegionBulkDeleteView(generic.BulkDeleteView):
- queryset = Region.objects.add_related_count(
- Region.objects.all(),
- Site,
- 'region',
- 'site_count',
- cumulative=True
- )
- filterset = filters.RegionFilterSet
- table = tables.RegionTable
- #
- # Site groups
- #
- class SiteGroupListView(generic.ObjectListView):
- queryset = SiteGroup.objects.add_related_count(
- SiteGroup.objects.all(),
- Site,
- 'group',
- 'site_count',
- cumulative=True
- )
- filterset = filters.SiteGroupFilterSet
- filterset_form = forms.SiteGroupFilterForm
- table = tables.SiteGroupTable
- class SiteGroupEditView(generic.ObjectEditView):
- queryset = SiteGroup.objects.all()
- model_form = forms.SiteGroupForm
- class SiteGroupDeleteView(generic.ObjectDeleteView):
- queryset = SiteGroup.objects.all()
- class SiteGroupBulkImportView(generic.BulkImportView):
- queryset = SiteGroup.objects.all()
- model_form = forms.SiteGroupCSVForm
- table = tables.SiteGroupTable
- class SiteGroupBulkEditView(generic.BulkEditView):
- queryset = SiteGroup.objects.add_related_count(
- SiteGroup.objects.all(),
- Site,
- 'group',
- 'site_count',
- cumulative=True
- )
- filterset = filters.SiteGroupFilterSet
- table = tables.SiteGroupTable
- form = forms.SiteGroupBulkEditForm
- class SiteGroupBulkDeleteView(generic.BulkDeleteView):
- queryset = SiteGroup.objects.add_related_count(
- SiteGroup.objects.all(),
- Site,
- 'group',
- 'site_count',
- cumulative=True
- )
- filterset = filters.SiteGroupFilterSet
- table = tables.SiteGroupTable
- #
- # Sites
- #
- class SiteListView(generic.ObjectListView):
- queryset = Site.objects.all()
- filterset = filters.SiteFilterSet
- filterset_form = forms.SiteFilterForm
- table = tables.SiteTable
- class SiteView(generic.ObjectView):
- queryset = Site.objects.prefetch_related('region', 'tenant__group')
- def get_extra_context(self, request, instance):
- stats = {
- 'rack_count': Rack.objects.restrict(request.user, 'view').filter(site=instance).count(),
- 'device_count': Device.objects.restrict(request.user, 'view').filter(site=instance).count(),
- 'prefix_count': Prefix.objects.restrict(request.user, 'view').filter(site=instance).count(),
- 'vlan_count': VLAN.objects.restrict(request.user, 'view').filter(site=instance).count(),
- 'circuit_count': Circuit.objects.restrict(request.user, 'view').filter(terminations__site=instance).count(),
- 'vm_count': VirtualMachine.objects.restrict(request.user, 'view').filter(cluster__site=instance).count(),
- }
- locations = Location.objects.add_related_count(
- Location.objects.all(),
- Rack,
- 'location',
- 'rack_count',
- cumulative=True
- ).restrict(request.user, 'view').filter(site=instance)
- return {
- 'stats': stats,
- 'locations': locations,
- }
- class SiteEditView(generic.ObjectEditView):
- queryset = Site.objects.all()
- model_form = forms.SiteForm
- class SiteDeleteView(generic.ObjectDeleteView):
- queryset = Site.objects.all()
- class SiteBulkImportView(generic.BulkImportView):
- queryset = Site.objects.all()
- model_form = forms.SiteCSVForm
- table = tables.SiteTable
- class SiteBulkEditView(generic.BulkEditView):
- queryset = Site.objects.prefetch_related('region', 'tenant')
- filterset = filters.SiteFilterSet
- table = tables.SiteTable
- form = forms.SiteBulkEditForm
- class SiteBulkDeleteView(generic.BulkDeleteView):
- queryset = Site.objects.prefetch_related('region', 'tenant')
- filterset = filters.SiteFilterSet
- table = tables.SiteTable
- #
- # Rack groups
- #
- class LocationListView(generic.ObjectListView):
- queryset = Location.objects.add_related_count(
- Location.objects.all(),
- Rack,
- 'location',
- 'rack_count',
- cumulative=True
- )
- filterset = filters.LocationFilterSet
- filterset_form = forms.LocationFilterForm
- table = tables.LocationTable
- class LocationEditView(generic.ObjectEditView):
- queryset = Location.objects.all()
- model_form = forms.LocationForm
- class LocationDeleteView(generic.ObjectDeleteView):
- queryset = Location.objects.all()
- class LocationBulkImportView(generic.BulkImportView):
- queryset = Location.objects.all()
- model_form = forms.LocationCSVForm
- table = tables.LocationTable
- class LocationBulkEditView(generic.BulkEditView):
- queryset = Location.objects.add_related_count(
- Location.objects.all(),
- Rack,
- 'location',
- 'rack_count',
- cumulative=True
- ).prefetch_related('site')
- filterset = filters.LocationFilterSet
- table = tables.LocationTable
- form = forms.LocationBulkEditForm
- class LocationBulkDeleteView(generic.BulkDeleteView):
- queryset = Location.objects.add_related_count(
- Location.objects.all(),
- Rack,
- 'location',
- 'rack_count',
- cumulative=True
- ).prefetch_related('site')
- filterset = filters.LocationFilterSet
- table = tables.LocationTable
- #
- # Rack roles
- #
- class RackRoleListView(generic.ObjectListView):
- queryset = RackRole.objects.annotate(
- rack_count=count_related(Rack, 'role')
- )
- table = tables.RackRoleTable
- class RackRoleEditView(generic.ObjectEditView):
- queryset = RackRole.objects.all()
- model_form = forms.RackRoleForm
- class RackRoleDeleteView(generic.ObjectDeleteView):
- queryset = RackRole.objects.all()
- class RackRoleBulkImportView(generic.BulkImportView):
- queryset = RackRole.objects.all()
- model_form = forms.RackRoleCSVForm
- table = tables.RackRoleTable
- class RackRoleBulkEditView(generic.BulkEditView):
- queryset = RackRole.objects.annotate(
- rack_count=count_related(Rack, 'role')
- )
- filterset = filters.RackRoleFilterSet
- table = tables.RackRoleTable
- form = forms.RackRoleBulkEditForm
- class RackRoleBulkDeleteView(generic.BulkDeleteView):
- queryset = RackRole.objects.annotate(
- rack_count=count_related(Rack, 'role')
- )
- table = tables.RackRoleTable
- #
- # Racks
- #
- class RackListView(generic.ObjectListView):
- queryset = Rack.objects.prefetch_related(
- 'site', 'location', 'tenant', 'role', 'devices__device_type'
- ).annotate(
- device_count=count_related(Device, 'rack')
- )
- filterset = filters.RackFilterSet
- filterset_form = forms.RackFilterForm
- table = tables.RackDetailTable
- class RackElevationListView(generic.ObjectListView):
- """
- Display a set of rack elevations side-by-side.
- """
- queryset = Rack.objects.prefetch_related('role')
- def get(self, request):
- racks = filters.RackFilterSet(request.GET, self.queryset).qs
- total_count = racks.count()
- # Determine ordering
- reverse = bool(request.GET.get('reverse', False))
- if reverse:
- racks = racks.reverse()
- # Pagination
- per_page = get_paginate_count(request)
- page_number = request.GET.get('page', 1)
- paginator = EnhancedPaginator(racks, per_page)
- try:
- page = paginator.page(page_number)
- except PageNotAnInteger:
- page = paginator.page(1)
- except EmptyPage:
- page = paginator.page(paginator.num_pages)
- # Determine rack face
- rack_face = request.GET.get('face', DeviceFaceChoices.FACE_FRONT)
- if rack_face not in DeviceFaceChoices.values():
- rack_face = DeviceFaceChoices.FACE_FRONT
- return render(request, 'dcim/rack_elevation_list.html', {
- 'paginator': paginator,
- 'page': page,
- 'total_count': total_count,
- 'reverse': reverse,
- 'rack_face': rack_face,
- 'filter_form': forms.RackElevationFilterForm(request.GET),
- })
- class RackView(generic.ObjectView):
- queryset = Rack.objects.prefetch_related('site__region', 'tenant__group', 'location', 'role')
- def get_extra_context(self, request, instance):
- # Get 0U and child devices located within the rack
- nonracked_devices = Device.objects.filter(
- rack=instance,
- position__isnull=True
- ).prefetch_related('device_type__manufacturer')
- peer_racks = Rack.objects.restrict(request.user, 'view').filter(site=instance.site)
- if instance.location:
- peer_racks = peer_racks.filter(location=instance.location)
- else:
- peer_racks = peer_racks.filter(location__isnull=True)
- next_rack = peer_racks.filter(name__gt=instance.name).order_by('name').first()
- prev_rack = peer_racks.filter(name__lt=instance.name).order_by('-name').first()
- reservations = RackReservation.objects.restrict(request.user, 'view').filter(rack=instance)
- power_feeds = PowerFeed.objects.restrict(request.user, 'view').filter(rack=instance).prefetch_related(
- 'power_panel'
- )
- device_count = Device.objects.restrict(request.user, 'view').filter(rack=instance).count()
- return {
- 'device_count': device_count,
- 'reservations': reservations,
- 'power_feeds': power_feeds,
- 'nonracked_devices': nonracked_devices,
- 'next_rack': next_rack,
- 'prev_rack': prev_rack,
- }
- class RackEditView(generic.ObjectEditView):
- queryset = Rack.objects.all()
- model_form = forms.RackForm
- template_name = 'dcim/rack_edit.html'
- class RackDeleteView(generic.ObjectDeleteView):
- queryset = Rack.objects.all()
- class RackBulkImportView(generic.BulkImportView):
- queryset = Rack.objects.all()
- model_form = forms.RackCSVForm
- table = tables.RackTable
- class RackBulkEditView(generic.BulkEditView):
- queryset = Rack.objects.prefetch_related('site', 'location', 'tenant', 'role')
- filterset = filters.RackFilterSet
- table = tables.RackTable
- form = forms.RackBulkEditForm
- class RackBulkDeleteView(generic.BulkDeleteView):
- queryset = Rack.objects.prefetch_related('site', 'location', 'tenant', 'role')
- filterset = filters.RackFilterSet
- table = tables.RackTable
- #
- # Rack reservations
- #
- class RackReservationListView(generic.ObjectListView):
- queryset = RackReservation.objects.all()
- filterset = filters.RackReservationFilterSet
- filterset_form = forms.RackReservationFilterForm
- table = tables.RackReservationTable
- class RackReservationView(generic.ObjectView):
- queryset = RackReservation.objects.prefetch_related('rack')
- class RackReservationEditView(generic.ObjectEditView):
- queryset = RackReservation.objects.all()
- model_form = forms.RackReservationForm
- def alter_obj(self, obj, request, args, kwargs):
- if not obj.pk:
- if 'rack' in request.GET:
- obj.rack = get_object_or_404(Rack, pk=request.GET.get('rack'))
- obj.user = request.user
- return obj
- class RackReservationDeleteView(generic.ObjectDeleteView):
- queryset = RackReservation.objects.all()
- class RackReservationImportView(generic.BulkImportView):
- queryset = RackReservation.objects.all()
- model_form = forms.RackReservationCSVForm
- table = tables.RackReservationTable
- def _save_obj(self, obj_form, request):
- """
- Assign the currently authenticated user to the RackReservation.
- """
- instance = obj_form.save(commit=False)
- instance.user = request.user
- instance.save()
- return instance
- class RackReservationBulkEditView(generic.BulkEditView):
- queryset = RackReservation.objects.prefetch_related('rack', 'user')
- filterset = filters.RackReservationFilterSet
- table = tables.RackReservationTable
- form = forms.RackReservationBulkEditForm
- class RackReservationBulkDeleteView(generic.BulkDeleteView):
- queryset = RackReservation.objects.prefetch_related('rack', 'user')
- filterset = filters.RackReservationFilterSet
- table = tables.RackReservationTable
- #
- # Manufacturers
- #
- class ManufacturerListView(generic.ObjectListView):
- queryset = Manufacturer.objects.annotate(
- devicetype_count=count_related(DeviceType, 'manufacturer'),
- inventoryitem_count=count_related(InventoryItem, 'manufacturer'),
- platform_count=count_related(Platform, 'manufacturer')
- )
- table = tables.ManufacturerTable
- class ManufacturerEditView(generic.ObjectEditView):
- queryset = Manufacturer.objects.all()
- model_form = forms.ManufacturerForm
- class ManufacturerDeleteView(generic.ObjectDeleteView):
- queryset = Manufacturer.objects.all()
- class ManufacturerBulkImportView(generic.BulkImportView):
- queryset = Manufacturer.objects.all()
- model_form = forms.ManufacturerCSVForm
- table = tables.ManufacturerTable
- class ManufacturerBulkEditView(generic.BulkEditView):
- queryset = Manufacturer.objects.annotate(
- devicetype_count=count_related(DeviceType, 'manufacturer')
- )
- filterset = filters.ManufacturerFilterSet
- table = tables.ManufacturerTable
- form = forms.ManufacturerBulkEditForm
- class ManufacturerBulkDeleteView(generic.BulkDeleteView):
- queryset = Manufacturer.objects.annotate(
- devicetype_count=count_related(DeviceType, 'manufacturer')
- )
- table = tables.ManufacturerTable
- #
- # Device types
- #
- class DeviceTypeListView(generic.ObjectListView):
- queryset = DeviceType.objects.prefetch_related('manufacturer').annotate(
- instance_count=count_related(Device, 'device_type')
- )
- filterset = filters.DeviceTypeFilterSet
- filterset_form = forms.DeviceTypeFilterForm
- table = tables.DeviceTypeTable
- class DeviceTypeView(generic.ObjectView):
- queryset = DeviceType.objects.prefetch_related('manufacturer')
- def get_extra_context(self, request, instance):
- instance_count = Device.objects.restrict(request.user).filter(device_type=instance).count()
- # Component tables
- consoleport_table = tables.ConsolePortTemplateTable(
- ConsolePortTemplate.objects.restrict(request.user, 'view').filter(device_type=instance),
- orderable=False
- )
- consoleserverport_table = tables.ConsoleServerPortTemplateTable(
- ConsoleServerPortTemplate.objects.restrict(request.user, 'view').filter(device_type=instance),
- orderable=False
- )
- powerport_table = tables.PowerPortTemplateTable(
- PowerPortTemplate.objects.restrict(request.user, 'view').filter(device_type=instance),
- orderable=False
- )
- poweroutlet_table = tables.PowerOutletTemplateTable(
- PowerOutletTemplate.objects.restrict(request.user, 'view').filter(device_type=instance),
- orderable=False
- )
- interface_table = tables.InterfaceTemplateTable(
- list(InterfaceTemplate.objects.restrict(request.user, 'view').filter(device_type=instance)),
- orderable=False
- )
- front_port_table = tables.FrontPortTemplateTable(
- FrontPortTemplate.objects.restrict(request.user, 'view').filter(device_type=instance),
- orderable=False
- )
- rear_port_table = tables.RearPortTemplateTable(
- RearPortTemplate.objects.restrict(request.user, 'view').filter(device_type=instance),
- orderable=False
- )
- devicebay_table = tables.DeviceBayTemplateTable(
- DeviceBayTemplate.objects.restrict(request.user, 'view').filter(device_type=instance),
- orderable=False
- )
- if request.user.has_perm('dcim.change_devicetype'):
- consoleport_table.columns.show('pk')
- consoleserverport_table.columns.show('pk')
- powerport_table.columns.show('pk')
- poweroutlet_table.columns.show('pk')
- interface_table.columns.show('pk')
- front_port_table.columns.show('pk')
- rear_port_table.columns.show('pk')
- devicebay_table.columns.show('pk')
- return {
- 'instance_count': instance_count,
- 'consoleport_table': consoleport_table,
- 'consoleserverport_table': consoleserverport_table,
- 'powerport_table': powerport_table,
- 'poweroutlet_table': poweroutlet_table,
- 'interface_table': interface_table,
- 'front_port_table': front_port_table,
- 'rear_port_table': rear_port_table,
- 'devicebay_table': devicebay_table,
- }
- class DeviceTypeEditView(generic.ObjectEditView):
- queryset = DeviceType.objects.all()
- model_form = forms.DeviceTypeForm
- class DeviceTypeDeleteView(generic.ObjectDeleteView):
- queryset = DeviceType.objects.all()
- class DeviceTypeImportView(generic.ObjectImportView):
- additional_permissions = [
- 'dcim.add_devicetype',
- 'dcim.add_consoleporttemplate',
- 'dcim.add_consoleserverporttemplate',
- 'dcim.add_powerporttemplate',
- 'dcim.add_poweroutlettemplate',
- 'dcim.add_interfacetemplate',
- 'dcim.add_frontporttemplate',
- 'dcim.add_rearporttemplate',
- 'dcim.add_devicebaytemplate',
- ]
- queryset = DeviceType.objects.all()
- model_form = forms.DeviceTypeImportForm
- related_object_forms = OrderedDict((
- ('console-ports', forms.ConsolePortTemplateImportForm),
- ('console-server-ports', forms.ConsoleServerPortTemplateImportForm),
- ('power-ports', forms.PowerPortTemplateImportForm),
- ('power-outlets', forms.PowerOutletTemplateImportForm),
- ('interfaces', forms.InterfaceTemplateImportForm),
- ('rear-ports', forms.RearPortTemplateImportForm),
- ('front-ports', forms.FrontPortTemplateImportForm),
- ('device-bays', forms.DeviceBayTemplateImportForm),
- ))
- class DeviceTypeBulkEditView(generic.BulkEditView):
- queryset = DeviceType.objects.prefetch_related('manufacturer').annotate(
- instance_count=count_related(Device, 'device_type')
- )
- filterset = filters.DeviceTypeFilterSet
- table = tables.DeviceTypeTable
- form = forms.DeviceTypeBulkEditForm
- class DeviceTypeBulkDeleteView(generic.BulkDeleteView):
- queryset = DeviceType.objects.prefetch_related('manufacturer').annotate(
- instance_count=count_related(Device, 'device_type')
- )
- filterset = filters.DeviceTypeFilterSet
- table = tables.DeviceTypeTable
- #
- # Console port templates
- #
- class ConsolePortTemplateCreateView(generic.ComponentCreateView):
- queryset = ConsolePortTemplate.objects.all()
- form = forms.ConsolePortTemplateCreateForm
- model_form = forms.ConsolePortTemplateForm
- template_name = 'dcim/device_component_add.html'
- class ConsolePortTemplateEditView(generic.ObjectEditView):
- queryset = ConsolePortTemplate.objects.all()
- model_form = forms.ConsolePortTemplateForm
- class ConsolePortTemplateDeleteView(generic.ObjectDeleteView):
- queryset = ConsolePortTemplate.objects.all()
- class ConsolePortTemplateBulkEditView(generic.BulkEditView):
- queryset = ConsolePortTemplate.objects.all()
- table = tables.ConsolePortTemplateTable
- form = forms.ConsolePortTemplateBulkEditForm
- class ConsolePortTemplateBulkRenameView(generic.BulkRenameView):
- queryset = ConsolePortTemplate.objects.all()
- class ConsolePortTemplateBulkDeleteView(generic.BulkDeleteView):
- queryset = ConsolePortTemplate.objects.all()
- table = tables.ConsolePortTemplateTable
- #
- # Console server port templates
- #
- class ConsoleServerPortTemplateCreateView(generic.ComponentCreateView):
- queryset = ConsoleServerPortTemplate.objects.all()
- form = forms.ConsoleServerPortTemplateCreateForm
- model_form = forms.ConsoleServerPortTemplateForm
- template_name = 'dcim/device_component_add.html'
- class ConsoleServerPortTemplateEditView(generic.ObjectEditView):
- queryset = ConsoleServerPortTemplate.objects.all()
- model_form = forms.ConsoleServerPortTemplateForm
- class ConsoleServerPortTemplateDeleteView(generic.ObjectDeleteView):
- queryset = ConsoleServerPortTemplate.objects.all()
- class ConsoleServerPortTemplateBulkEditView(generic.BulkEditView):
- queryset = ConsoleServerPortTemplate.objects.all()
- table = tables.ConsoleServerPortTemplateTable
- form = forms.ConsoleServerPortTemplateBulkEditForm
- class ConsoleServerPortTemplateBulkRenameView(generic.BulkRenameView):
- queryset = ConsoleServerPortTemplate.objects.all()
- class ConsoleServerPortTemplateBulkDeleteView(generic.BulkDeleteView):
- queryset = ConsoleServerPortTemplate.objects.all()
- table = tables.ConsoleServerPortTemplateTable
- #
- # Power port templates
- #
- class PowerPortTemplateCreateView(generic.ComponentCreateView):
- queryset = PowerPortTemplate.objects.all()
- form = forms.PowerPortTemplateCreateForm
- model_form = forms.PowerPortTemplateForm
- template_name = 'dcim/device_component_add.html'
- class PowerPortTemplateEditView(generic.ObjectEditView):
- queryset = PowerPortTemplate.objects.all()
- model_form = forms.PowerPortTemplateForm
- class PowerPortTemplateDeleteView(generic.ObjectDeleteView):
- queryset = PowerPortTemplate.objects.all()
- class PowerPortTemplateBulkEditView(generic.BulkEditView):
- queryset = PowerPortTemplate.objects.all()
- table = tables.PowerPortTemplateTable
- form = forms.PowerPortTemplateBulkEditForm
- class PowerPortTemplateBulkRenameView(generic.BulkRenameView):
- queryset = PowerPortTemplate.objects.all()
- class PowerPortTemplateBulkDeleteView(generic.BulkDeleteView):
- queryset = PowerPortTemplate.objects.all()
- table = tables.PowerPortTemplateTable
- #
- # Power outlet templates
- #
- class PowerOutletTemplateCreateView(generic.ComponentCreateView):
- queryset = PowerOutletTemplate.objects.all()
- form = forms.PowerOutletTemplateCreateForm
- model_form = forms.PowerOutletTemplateForm
- template_name = 'dcim/device_component_add.html'
- class PowerOutletTemplateEditView(generic.ObjectEditView):
- queryset = PowerOutletTemplate.objects.all()
- model_form = forms.PowerOutletTemplateForm
- class PowerOutletTemplateDeleteView(generic.ObjectDeleteView):
- queryset = PowerOutletTemplate.objects.all()
- class PowerOutletTemplateBulkEditView(generic.BulkEditView):
- queryset = PowerOutletTemplate.objects.all()
- table = tables.PowerOutletTemplateTable
- form = forms.PowerOutletTemplateBulkEditForm
- class PowerOutletTemplateBulkRenameView(generic.BulkRenameView):
- queryset = PowerOutletTemplate.objects.all()
- class PowerOutletTemplateBulkDeleteView(generic.BulkDeleteView):
- queryset = PowerOutletTemplate.objects.all()
- table = tables.PowerOutletTemplateTable
- #
- # Interface templates
- #
- class InterfaceTemplateCreateView(generic.ComponentCreateView):
- queryset = InterfaceTemplate.objects.all()
- form = forms.InterfaceTemplateCreateForm
- model_form = forms.InterfaceTemplateForm
- template_name = 'dcim/device_component_add.html'
- class InterfaceTemplateEditView(generic.ObjectEditView):
- queryset = InterfaceTemplate.objects.all()
- model_form = forms.InterfaceTemplateForm
- class InterfaceTemplateDeleteView(generic.ObjectDeleteView):
- queryset = InterfaceTemplate.objects.all()
- class InterfaceTemplateBulkEditView(generic.BulkEditView):
- queryset = InterfaceTemplate.objects.all()
- table = tables.InterfaceTemplateTable
- form = forms.InterfaceTemplateBulkEditForm
- class InterfaceTemplateBulkRenameView(generic.BulkRenameView):
- queryset = InterfaceTemplate.objects.all()
- class InterfaceTemplateBulkDeleteView(generic.BulkDeleteView):
- queryset = InterfaceTemplate.objects.all()
- table = tables.InterfaceTemplateTable
- #
- # Front port templates
- #
- class FrontPortTemplateCreateView(generic.ComponentCreateView):
- queryset = FrontPortTemplate.objects.all()
- form = forms.FrontPortTemplateCreateForm
- model_form = forms.FrontPortTemplateForm
- template_name = 'dcim/device_component_add.html'
- class FrontPortTemplateEditView(generic.ObjectEditView):
- queryset = FrontPortTemplate.objects.all()
- model_form = forms.FrontPortTemplateForm
- class FrontPortTemplateDeleteView(generic.ObjectDeleteView):
- queryset = FrontPortTemplate.objects.all()
- class FrontPortTemplateBulkEditView(generic.BulkEditView):
- queryset = FrontPortTemplate.objects.all()
- table = tables.FrontPortTemplateTable
- form = forms.FrontPortTemplateBulkEditForm
- class FrontPortTemplateBulkRenameView(generic.BulkRenameView):
- queryset = FrontPortTemplate.objects.all()
- class FrontPortTemplateBulkDeleteView(generic.BulkDeleteView):
- queryset = FrontPortTemplate.objects.all()
- table = tables.FrontPortTemplateTable
- #
- # Rear port templates
- #
- class RearPortTemplateCreateView(generic.ComponentCreateView):
- queryset = RearPortTemplate.objects.all()
- form = forms.RearPortTemplateCreateForm
- model_form = forms.RearPortTemplateForm
- template_name = 'dcim/device_component_add.html'
- class RearPortTemplateEditView(generic.ObjectEditView):
- queryset = RearPortTemplate.objects.all()
- model_form = forms.RearPortTemplateForm
- class RearPortTemplateDeleteView(generic.ObjectDeleteView):
- queryset = RearPortTemplate.objects.all()
- class RearPortTemplateBulkEditView(generic.BulkEditView):
- queryset = RearPortTemplate.objects.all()
- table = tables.RearPortTemplateTable
- form = forms.RearPortTemplateBulkEditForm
- class RearPortTemplateBulkRenameView(generic.BulkRenameView):
- queryset = RearPortTemplate.objects.all()
- class RearPortTemplateBulkDeleteView(generic.BulkDeleteView):
- queryset = RearPortTemplate.objects.all()
- table = tables.RearPortTemplateTable
- #
- # Device bay templates
- #
- class DeviceBayTemplateCreateView(generic.ComponentCreateView):
- queryset = DeviceBayTemplate.objects.all()
- form = forms.DeviceBayTemplateCreateForm
- model_form = forms.DeviceBayTemplateForm
- template_name = 'dcim/device_component_add.html'
- class DeviceBayTemplateEditView(generic.ObjectEditView):
- queryset = DeviceBayTemplate.objects.all()
- model_form = forms.DeviceBayTemplateForm
- class DeviceBayTemplateDeleteView(generic.ObjectDeleteView):
- queryset = DeviceBayTemplate.objects.all()
- class DeviceBayTemplateBulkEditView(generic.BulkEditView):
- queryset = DeviceBayTemplate.objects.all()
- table = tables.DeviceBayTemplateTable
- form = forms.DeviceBayTemplateBulkEditForm
- class DeviceBayTemplateBulkRenameView(generic.BulkRenameView):
- queryset = DeviceBayTemplate.objects.all()
- class DeviceBayTemplateBulkDeleteView(generic.BulkDeleteView):
- queryset = DeviceBayTemplate.objects.all()
- table = tables.DeviceBayTemplateTable
- #
- # Device roles
- #
- class DeviceRoleListView(generic.ObjectListView):
- queryset = DeviceRole.objects.annotate(
- device_count=count_related(Device, 'device_role'),
- vm_count=count_related(VirtualMachine, 'role')
- )
- table = tables.DeviceRoleTable
- class DeviceRoleEditView(generic.ObjectEditView):
- queryset = DeviceRole.objects.all()
- model_form = forms.DeviceRoleForm
- class DeviceRoleDeleteView(generic.ObjectDeleteView):
- queryset = DeviceRole.objects.all()
- class DeviceRoleBulkImportView(generic.BulkImportView):
- queryset = DeviceRole.objects.all()
- model_form = forms.DeviceRoleCSVForm
- table = tables.DeviceRoleTable
- class DeviceRoleBulkEditView(generic.BulkEditView):
- queryset = DeviceRole.objects.all()
- filterset = filters.DeviceRoleFilterSet
- table = tables.DeviceRoleTable
- form = forms.DeviceRoleBulkEditForm
- class DeviceRoleBulkDeleteView(generic.BulkDeleteView):
- queryset = DeviceRole.objects.all()
- table = tables.DeviceRoleTable
- #
- # Platforms
- #
- class PlatformListView(generic.ObjectListView):
- queryset = Platform.objects.annotate(
- device_count=count_related(Device, 'platform'),
- vm_count=count_related(VirtualMachine, 'platform')
- )
- table = tables.PlatformTable
- class PlatformEditView(generic.ObjectEditView):
- queryset = Platform.objects.all()
- model_form = forms.PlatformForm
- class PlatformDeleteView(generic.ObjectDeleteView):
- queryset = Platform.objects.all()
- class PlatformBulkImportView(generic.BulkImportView):
- queryset = Platform.objects.all()
- model_form = forms.PlatformCSVForm
- table = tables.PlatformTable
- class PlatformBulkEditView(generic.BulkEditView):
- queryset = Platform.objects.all()
- filterset = filters.PlatformFilterSet
- table = tables.PlatformTable
- form = forms.PlatformBulkEditForm
- class PlatformBulkDeleteView(generic.BulkDeleteView):
- queryset = Platform.objects.all()
- table = tables.PlatformTable
- #
- # Devices
- #
- class DeviceListView(generic.ObjectListView):
- queryset = Device.objects.all()
- filterset = filters.DeviceFilterSet
- filterset_form = forms.DeviceFilterForm
- table = tables.DeviceTable
- template_name = 'dcim/device_list.html'
- class DeviceView(generic.ObjectView):
- queryset = Device.objects.prefetch_related(
- 'site__region', 'location', 'rack', 'tenant__group', 'device_role', 'platform', 'primary_ip4', 'primary_ip6'
- )
- def get_extra_context(self, request, instance):
- # VirtualChassis members
- if instance.virtual_chassis is not None:
- vc_members = Device.objects.restrict(request.user, 'view').filter(
- virtual_chassis=instance.virtual_chassis
- ).order_by('vc_position')
- else:
- vc_members = []
- # Services
- services = Service.objects.restrict(request.user, 'view').filter(device=instance)
- # Secrets
- secrets = Secret.objects.restrict(request.user, 'view').filter(device=instance)
- # Find up to ten devices in the same site with the same functional role for quick reference.
- related_devices = Device.objects.restrict(request.user, 'view').filter(
- site=instance.site, device_role=instance.device_role
- ).exclude(
- pk=instance.pk
- ).prefetch_related(
- 'rack', 'device_type__manufacturer'
- )[:10]
- return {
- 'services': services,
- 'secrets': secrets,
- 'vc_members': vc_members,
- 'related_devices': related_devices,
- 'active_tab': 'device',
- }
- class DeviceConsolePortsView(generic.ObjectView):
- queryset = Device.objects.all()
- template_name = 'dcim/device/consoleports.html'
- def get_extra_context(self, request, instance):
- consoleports = ConsolePort.objects.restrict(request.user, 'view').filter(device=instance).prefetch_related(
- 'cable', '_path__destination',
- )
- consoleport_table = tables.DeviceConsolePortTable(
- data=consoleports,
- user=request.user,
- orderable=False
- )
- if request.user.has_perm('dcim.change_consoleport') or request.user.has_perm('dcim.delete_consoleport'):
- consoleport_table.columns.show('pk')
- return {
- 'consoleport_table': consoleport_table,
- 'active_tab': 'console-ports',
- }
- class DeviceConsoleServerPortsView(generic.ObjectView):
- queryset = Device.objects.all()
- template_name = 'dcim/device/consoleserverports.html'
- def get_extra_context(self, request, instance):
- consoleserverports = ConsoleServerPort.objects.restrict(request.user, 'view').filter(
- device=instance
- ).prefetch_related(
- 'cable', '_path__destination',
- )
- consoleserverport_table = tables.DeviceConsoleServerPortTable(
- data=consoleserverports,
- user=request.user,
- orderable=False
- )
- if request.user.has_perm('dcim.change_consoleserverport') or \
- request.user.has_perm('dcim.delete_consoleserverport'):
- consoleserverport_table.columns.show('pk')
- return {
- 'consoleserverport_table': consoleserverport_table,
- 'active_tab': 'console-server-ports',
- }
- class DevicePowerPortsView(generic.ObjectView):
- queryset = Device.objects.all()
- template_name = 'dcim/device/powerports.html'
- def get_extra_context(self, request, instance):
- powerports = PowerPort.objects.restrict(request.user, 'view').filter(device=instance).prefetch_related(
- 'cable', '_path__destination',
- )
- powerport_table = tables.DevicePowerPortTable(
- data=powerports,
- user=request.user,
- orderable=False
- )
- if request.user.has_perm('dcim.change_powerport') or request.user.has_perm('dcim.delete_powerport'):
- powerport_table.columns.show('pk')
- return {
- 'powerport_table': powerport_table,
- 'active_tab': 'power-ports',
- }
- class DevicePowerOutletsView(generic.ObjectView):
- queryset = Device.objects.all()
- template_name = 'dcim/device/poweroutlets.html'
- def get_extra_context(self, request, instance):
- poweroutlets = PowerOutlet.objects.restrict(request.user, 'view').filter(device=instance).prefetch_related(
- 'cable', 'power_port', '_path__destination',
- )
- poweroutlet_table = tables.DevicePowerOutletTable(
- data=poweroutlets,
- user=request.user,
- orderable=False
- )
- if request.user.has_perm('dcim.change_poweroutlet') or request.user.has_perm('dcim.delete_poweroutlet'):
- poweroutlet_table.columns.show('pk')
- return {
- 'poweroutlet_table': poweroutlet_table,
- 'active_tab': 'power-outlets',
- }
- class DeviceInterfacesView(generic.ObjectView):
- queryset = Device.objects.all()
- template_name = 'dcim/device/interfaces.html'
- def get_extra_context(self, request, instance):
- interfaces = instance.vc_interfaces.restrict(request.user, 'view').prefetch_related(
- Prefetch('ip_addresses', queryset=IPAddress.objects.restrict(request.user)),
- Prefetch('member_interfaces', queryset=Interface.objects.restrict(request.user)),
- 'lag', 'cable', '_path__destination', 'tags',
- )
- interface_table = tables.DeviceInterfaceTable(
- data=interfaces,
- user=request.user,
- orderable=False
- )
- if request.user.has_perm('dcim.change_interface') or request.user.has_perm('dcim.delete_interface'):
- interface_table.columns.show('pk')
- return {
- 'interface_table': interface_table,
- 'active_tab': 'interfaces',
- }
- class DeviceFrontPortsView(generic.ObjectView):
- queryset = Device.objects.all()
- template_name = 'dcim/device/frontports.html'
- def get_extra_context(self, request, instance):
- frontports = FrontPort.objects.restrict(request.user, 'view').filter(device=instance).prefetch_related(
- 'rear_port', 'cable',
- )
- frontport_table = tables.DeviceFrontPortTable(
- data=frontports,
- user=request.user,
- orderable=False
- )
- if request.user.has_perm('dcim.change_frontport') or request.user.has_perm('dcim.delete_frontport'):
- frontport_table.columns.show('pk')
- return {
- 'frontport_table': frontport_table,
- 'active_tab': 'front-ports',
- }
- class DeviceRearPortsView(generic.ObjectView):
- queryset = Device.objects.all()
- template_name = 'dcim/device/rearports.html'
- def get_extra_context(self, request, instance):
- rearports = RearPort.objects.restrict(request.user, 'view').filter(device=instance).prefetch_related('cable')
- rearport_table = tables.DeviceRearPortTable(
- data=rearports,
- user=request.user,
- orderable=False
- )
- if request.user.has_perm('dcim.change_rearport') or request.user.has_perm('dcim.delete_rearport'):
- rearport_table.columns.show('pk')
- return {
- 'rearport_table': rearport_table,
- 'active_tab': 'rear-ports',
- }
- class DeviceDeviceBaysView(generic.ObjectView):
- queryset = Device.objects.all()
- template_name = 'dcim/device/devicebays.html'
- def get_extra_context(self, request, instance):
- devicebays = DeviceBay.objects.restrict(request.user, 'view').filter(device=instance).prefetch_related(
- 'installed_device__device_type__manufacturer',
- )
- devicebay_table = tables.DeviceDeviceBayTable(
- data=devicebays,
- user=request.user,
- orderable=False
- )
- if request.user.has_perm('dcim.change_devicebay') or request.user.has_perm('dcim.delete_devicebay'):
- devicebay_table.columns.show('pk')
- return {
- 'devicebay_table': devicebay_table,
- 'active_tab': 'device-bays',
- }
- class DeviceInventoryView(generic.ObjectView):
- queryset = Device.objects.all()
- template_name = 'dcim/device/inventory.html'
- def get_extra_context(self, request, instance):
- inventoryitems = InventoryItem.objects.restrict(request.user, 'view').filter(
- device=instance
- ).prefetch_related('manufacturer')
- inventoryitem_table = tables.DeviceInventoryItemTable(
- data=inventoryitems,
- user=request.user,
- orderable=False
- )
- if request.user.has_perm('dcim.change_inventoryitem') or request.user.has_perm('dcim.delete_inventoryitem'):
- inventoryitem_table.columns.show('pk')
- return {
- 'inventoryitem_table': inventoryitem_table,
- 'active_tab': 'inventory',
- }
- class DeviceStatusView(generic.ObjectView):
- additional_permissions = ['dcim.napalm_read_device']
- queryset = Device.objects.all()
- template_name = 'dcim/device/status.html'
- def get_extra_context(self, request, instance):
- return {
- 'active_tab': 'status',
- }
- class DeviceLLDPNeighborsView(generic.ObjectView):
- additional_permissions = ['dcim.napalm_read_device']
- queryset = Device.objects.all()
- template_name = 'dcim/device/lldp_neighbors.html'
- def get_extra_context(self, request, instance):
- interfaces = instance.vc_interfaces.restrict(request.user, 'view').prefetch_related(
- '_path__destination'
- ).exclude(
- type__in=NONCONNECTABLE_IFACE_TYPES
- )
- return {
- 'interfaces': interfaces,
- 'active_tab': 'lldp-neighbors',
- }
- class DeviceConfigView(generic.ObjectView):
- additional_permissions = ['dcim.napalm_read_device']
- queryset = Device.objects.all()
- template_name = 'dcim/device/config.html'
- def get_extra_context(self, request, instance):
- return {
- 'active_tab': 'config',
- }
- class DeviceConfigContextView(ObjectConfigContextView):
- queryset = Device.objects.annotate_config_context_data()
- base_template = 'dcim/device/base.html'
- class DeviceChangeLogView(ObjectChangeLogView):
- base_template = 'dcim/device/base.html'
- class DeviceEditView(generic.ObjectEditView):
- queryset = Device.objects.all()
- model_form = forms.DeviceForm
- template_name = 'dcim/device_edit.html'
- class DeviceDeleteView(generic.ObjectDeleteView):
- queryset = Device.objects.all()
- class DeviceBulkImportView(generic.BulkImportView):
- queryset = Device.objects.all()
- model_form = forms.DeviceCSVForm
- table = tables.DeviceImportTable
- template_name = 'dcim/device_import.html'
- class ChildDeviceBulkImportView(generic.BulkImportView):
- queryset = Device.objects.all()
- model_form = forms.ChildDeviceCSVForm
- table = tables.DeviceImportTable
- template_name = 'dcim/device_import_child.html'
- def _save_obj(self, obj_form, request):
- obj = obj_form.save()
- # Save the reverse relation to the parent device bay
- device_bay = obj.parent_bay
- device_bay.installed_device = obj
- device_bay.save()
- return obj
- class DeviceBulkEditView(generic.BulkEditView):
- queryset = Device.objects.prefetch_related('tenant', 'site', 'rack', 'device_role', 'device_type__manufacturer')
- filterset = filters.DeviceFilterSet
- table = tables.DeviceTable
- form = forms.DeviceBulkEditForm
- class DeviceBulkDeleteView(generic.BulkDeleteView):
- queryset = Device.objects.prefetch_related('tenant', 'site', 'rack', 'device_role', 'device_type__manufacturer')
- filterset = filters.DeviceFilterSet
- table = tables.DeviceTable
- #
- # Console ports
- #
- class ConsolePortListView(generic.ObjectListView):
- queryset = ConsolePort.objects.all()
- filterset = filters.ConsolePortFilterSet
- filterset_form = forms.ConsolePortFilterForm
- table = tables.ConsolePortTable
- action_buttons = ('import', 'export')
- class ConsolePortView(generic.ObjectView):
- queryset = ConsolePort.objects.all()
- def get_extra_context(self, request, instance):
- return {
- 'breadcrumb_url': 'dcim:device_consoleports'
- }
- class ConsolePortCreateView(generic.ComponentCreateView):
- queryset = ConsolePort.objects.all()
- form = forms.ConsolePortCreateForm
- model_form = forms.ConsolePortForm
- template_name = 'dcim/device_component_add.html'
- class ConsolePortEditView(generic.ObjectEditView):
- queryset = ConsolePort.objects.all()
- model_form = forms.ConsolePortForm
- template_name = 'dcim/device_component_edit.html'
- class ConsolePortDeleteView(generic.ObjectDeleteView):
- queryset = ConsolePort.objects.all()
- class ConsolePortBulkImportView(generic.BulkImportView):
- queryset = ConsolePort.objects.all()
- model_form = forms.ConsolePortCSVForm
- table = tables.ConsolePortTable
- class ConsolePortBulkEditView(generic.BulkEditView):
- queryset = ConsolePort.objects.all()
- filterset = filters.ConsolePortFilterSet
- table = tables.ConsolePortTable
- form = forms.ConsolePortBulkEditForm
- class ConsolePortBulkRenameView(generic.BulkRenameView):
- queryset = ConsolePort.objects.all()
- class ConsolePortBulkDisconnectView(BulkDisconnectView):
- queryset = ConsolePort.objects.all()
- class ConsolePortBulkDeleteView(generic.BulkDeleteView):
- queryset = ConsolePort.objects.all()
- filterset = filters.ConsolePortFilterSet
- table = tables.ConsolePortTable
- #
- # Console server ports
- #
- class ConsoleServerPortListView(generic.ObjectListView):
- queryset = ConsoleServerPort.objects.all()
- filterset = filters.ConsoleServerPortFilterSet
- filterset_form = forms.ConsoleServerPortFilterForm
- table = tables.ConsoleServerPortTable
- action_buttons = ('import', 'export')
- class ConsoleServerPortView(generic.ObjectView):
- queryset = ConsoleServerPort.objects.all()
- def get_extra_context(self, request, instance):
- return {
- 'breadcrumb_url': 'dcim:device_consoleserverports'
- }
- class ConsoleServerPortCreateView(generic.ComponentCreateView):
- queryset = ConsoleServerPort.objects.all()
- form = forms.ConsoleServerPortCreateForm
- model_form = forms.ConsoleServerPortForm
- template_name = 'dcim/device_component_add.html'
- class ConsoleServerPortEditView(generic.ObjectEditView):
- queryset = ConsoleServerPort.objects.all()
- model_form = forms.ConsoleServerPortForm
- template_name = 'dcim/device_component_edit.html'
- class ConsoleServerPortDeleteView(generic.ObjectDeleteView):
- queryset = ConsoleServerPort.objects.all()
- class ConsoleServerPortBulkImportView(generic.BulkImportView):
- queryset = ConsoleServerPort.objects.all()
- model_form = forms.ConsoleServerPortCSVForm
- table = tables.ConsoleServerPortTable
- class ConsoleServerPortBulkEditView(generic.BulkEditView):
- queryset = ConsoleServerPort.objects.all()
- filterset = filters.ConsoleServerPortFilterSet
- table = tables.ConsoleServerPortTable
- form = forms.ConsoleServerPortBulkEditForm
- class ConsoleServerPortBulkRenameView(generic.BulkRenameView):
- queryset = ConsoleServerPort.objects.all()
- class ConsoleServerPortBulkDisconnectView(BulkDisconnectView):
- queryset = ConsoleServerPort.objects.all()
- class ConsoleServerPortBulkDeleteView(generic.BulkDeleteView):
- queryset = ConsoleServerPort.objects.all()
- filterset = filters.ConsoleServerPortFilterSet
- table = tables.ConsoleServerPortTable
- #
- # Power ports
- #
- class PowerPortListView(generic.ObjectListView):
- queryset = PowerPort.objects.all()
- filterset = filters.PowerPortFilterSet
- filterset_form = forms.PowerPortFilterForm
- table = tables.PowerPortTable
- action_buttons = ('import', 'export')
- class PowerPortView(generic.ObjectView):
- queryset = PowerPort.objects.all()
- def get_extra_context(self, request, instance):
- return {
- 'breadcrumb_url': 'dcim:device_powerports'
- }
- class PowerPortCreateView(generic.ComponentCreateView):
- queryset = PowerPort.objects.all()
- form = forms.PowerPortCreateForm
- model_form = forms.PowerPortForm
- template_name = 'dcim/device_component_add.html'
- class PowerPortEditView(generic.ObjectEditView):
- queryset = PowerPort.objects.all()
- model_form = forms.PowerPortForm
- template_name = 'dcim/device_component_edit.html'
- class PowerPortDeleteView(generic.ObjectDeleteView):
- queryset = PowerPort.objects.all()
- class PowerPortBulkImportView(generic.BulkImportView):
- queryset = PowerPort.objects.all()
- model_form = forms.PowerPortCSVForm
- table = tables.PowerPortTable
- class PowerPortBulkEditView(generic.BulkEditView):
- queryset = PowerPort.objects.all()
- filterset = filters.PowerPortFilterSet
- table = tables.PowerPortTable
- form = forms.PowerPortBulkEditForm
- class PowerPortBulkRenameView(generic.BulkRenameView):
- queryset = PowerPort.objects.all()
- class PowerPortBulkDisconnectView(BulkDisconnectView):
- queryset = PowerPort.objects.all()
- class PowerPortBulkDeleteView(generic.BulkDeleteView):
- queryset = PowerPort.objects.all()
- filterset = filters.PowerPortFilterSet
- table = tables.PowerPortTable
- #
- # Power outlets
- #
- class PowerOutletListView(generic.ObjectListView):
- queryset = PowerOutlet.objects.all()
- filterset = filters.PowerOutletFilterSet
- filterset_form = forms.PowerOutletFilterForm
- table = tables.PowerOutletTable
- action_buttons = ('import', 'export')
- class PowerOutletView(generic.ObjectView):
- queryset = PowerOutlet.objects.all()
- def get_extra_context(self, request, instance):
- return {
- 'breadcrumb_url': 'dcim:device_poweroutlets'
- }
- class PowerOutletCreateView(generic.ComponentCreateView):
- queryset = PowerOutlet.objects.all()
- form = forms.PowerOutletCreateForm
- model_form = forms.PowerOutletForm
- template_name = 'dcim/device_component_add.html'
- class PowerOutletEditView(generic.ObjectEditView):
- queryset = PowerOutlet.objects.all()
- model_form = forms.PowerOutletForm
- template_name = 'dcim/device_component_edit.html'
- class PowerOutletDeleteView(generic.ObjectDeleteView):
- queryset = PowerOutlet.objects.all()
- class PowerOutletBulkImportView(generic.BulkImportView):
- queryset = PowerOutlet.objects.all()
- model_form = forms.PowerOutletCSVForm
- table = tables.PowerOutletTable
- class PowerOutletBulkEditView(generic.BulkEditView):
- queryset = PowerOutlet.objects.all()
- filterset = filters.PowerOutletFilterSet
- table = tables.PowerOutletTable
- form = forms.PowerOutletBulkEditForm
- class PowerOutletBulkRenameView(generic.BulkRenameView):
- queryset = PowerOutlet.objects.all()
- class PowerOutletBulkDisconnectView(BulkDisconnectView):
- queryset = PowerOutlet.objects.all()
- class PowerOutletBulkDeleteView(generic.BulkDeleteView):
- queryset = PowerOutlet.objects.all()
- filterset = filters.PowerOutletFilterSet
- table = tables.PowerOutletTable
- #
- # Interfaces
- #
- class InterfaceListView(generic.ObjectListView):
- queryset = Interface.objects.all()
- filterset = filters.InterfaceFilterSet
- filterset_form = forms.InterfaceFilterForm
- table = tables.InterfaceTable
- action_buttons = ('import', 'export')
- class InterfaceView(generic.ObjectView):
- queryset = Interface.objects.all()
- def get_extra_context(self, request, instance):
- # Get assigned IP addresses
- ipaddress_table = InterfaceIPAddressTable(
- data=instance.ip_addresses.restrict(request.user, 'view').prefetch_related('vrf', 'tenant'),
- orderable=False
- )
- # Get assigned VLANs and annotate whether each is tagged or untagged
- vlans = []
- if instance.untagged_vlan is not None:
- vlans.append(instance.untagged_vlan)
- vlans[0].tagged = False
- for vlan in instance.tagged_vlans.restrict(request.user).prefetch_related('site', 'group', 'tenant', 'role'):
- vlan.tagged = True
- vlans.append(vlan)
- vlan_table = InterfaceVLANTable(
- interface=instance,
- data=vlans,
- orderable=False
- )
- return {
- 'ipaddress_table': ipaddress_table,
- 'vlan_table': vlan_table,
- 'breadcrumb_url': 'dcim:device_interfaces'
- }
- class InterfaceCreateView(generic.ComponentCreateView):
- queryset = Interface.objects.all()
- form = forms.InterfaceCreateForm
- model_form = forms.InterfaceForm
- template_name = 'dcim/device_component_add.html'
- class InterfaceEditView(generic.ObjectEditView):
- queryset = Interface.objects.all()
- model_form = forms.InterfaceForm
- template_name = 'dcim/interface_edit.html'
- class InterfaceDeleteView(generic.ObjectDeleteView):
- queryset = Interface.objects.all()
- class InterfaceBulkImportView(generic.BulkImportView):
- queryset = Interface.objects.all()
- model_form = forms.InterfaceCSVForm
- table = tables.InterfaceTable
- class InterfaceBulkEditView(generic.BulkEditView):
- queryset = Interface.objects.all()
- filterset = filters.InterfaceFilterSet
- table = tables.InterfaceTable
- form = forms.InterfaceBulkEditForm
- class InterfaceBulkRenameView(generic.BulkRenameView):
- queryset = Interface.objects.all()
- class InterfaceBulkDisconnectView(BulkDisconnectView):
- queryset = Interface.objects.all()
- class InterfaceBulkDeleteView(generic.BulkDeleteView):
- queryset = Interface.objects.all()
- filterset = filters.InterfaceFilterSet
- table = tables.InterfaceTable
- #
- # Front ports
- #
- class FrontPortListView(generic.ObjectListView):
- queryset = FrontPort.objects.all()
- filterset = filters.FrontPortFilterSet
- filterset_form = forms.FrontPortFilterForm
- table = tables.FrontPortTable
- action_buttons = ('import', 'export')
- class FrontPortView(generic.ObjectView):
- queryset = FrontPort.objects.all()
- def get_extra_context(self, request, instance):
- return {
- 'breadcrumb_url': 'dcim:device_frontports'
- }
- class FrontPortCreateView(generic.ComponentCreateView):
- queryset = FrontPort.objects.all()
- form = forms.FrontPortCreateForm
- model_form = forms.FrontPortForm
- template_name = 'dcim/device_component_add.html'
- class FrontPortEditView(generic.ObjectEditView):
- queryset = FrontPort.objects.all()
- model_form = forms.FrontPortForm
- template_name = 'dcim/device_component_edit.html'
- class FrontPortDeleteView(generic.ObjectDeleteView):
- queryset = FrontPort.objects.all()
- class FrontPortBulkImportView(generic.BulkImportView):
- queryset = FrontPort.objects.all()
- model_form = forms.FrontPortCSVForm
- table = tables.FrontPortTable
- class FrontPortBulkEditView(generic.BulkEditView):
- queryset = FrontPort.objects.all()
- filterset = filters.FrontPortFilterSet
- table = tables.FrontPortTable
- form = forms.FrontPortBulkEditForm
- class FrontPortBulkRenameView(generic.BulkRenameView):
- queryset = FrontPort.objects.all()
- class FrontPortBulkDisconnectView(BulkDisconnectView):
- queryset = FrontPort.objects.all()
- class FrontPortBulkDeleteView(generic.BulkDeleteView):
- queryset = FrontPort.objects.all()
- filterset = filters.FrontPortFilterSet
- table = tables.FrontPortTable
- #
- # Rear ports
- #
- class RearPortListView(generic.ObjectListView):
- queryset = RearPort.objects.all()
- filterset = filters.RearPortFilterSet
- filterset_form = forms.RearPortFilterForm
- table = tables.RearPortTable
- action_buttons = ('import', 'export')
- class RearPortView(generic.ObjectView):
- queryset = RearPort.objects.all()
- def get_extra_context(self, request, instance):
- return {
- 'breadcrumb_url': 'dcim:device_rearports'
- }
- class RearPortCreateView(generic.ComponentCreateView):
- queryset = RearPort.objects.all()
- form = forms.RearPortCreateForm
- model_form = forms.RearPortForm
- template_name = 'dcim/device_component_add.html'
- class RearPortEditView(generic.ObjectEditView):
- queryset = RearPort.objects.all()
- model_form = forms.RearPortForm
- template_name = 'dcim/device_component_edit.html'
- class RearPortDeleteView(generic.ObjectDeleteView):
- queryset = RearPort.objects.all()
- class RearPortBulkImportView(generic.BulkImportView):
- queryset = RearPort.objects.all()
- model_form = forms.RearPortCSVForm
- table = tables.RearPortTable
- class RearPortBulkEditView(generic.BulkEditView):
- queryset = RearPort.objects.all()
- filterset = filters.RearPortFilterSet
- table = tables.RearPortTable
- form = forms.RearPortBulkEditForm
- class RearPortBulkRenameView(generic.BulkRenameView):
- queryset = RearPort.objects.all()
- class RearPortBulkDisconnectView(BulkDisconnectView):
- queryset = RearPort.objects.all()
- class RearPortBulkDeleteView(generic.BulkDeleteView):
- queryset = RearPort.objects.all()
- filterset = filters.RearPortFilterSet
- table = tables.RearPortTable
- #
- # Device bays
- #
- class DeviceBayListView(generic.ObjectListView):
- queryset = DeviceBay.objects.all()
- filterset = filters.DeviceBayFilterSet
- filterset_form = forms.DeviceBayFilterForm
- table = tables.DeviceBayTable
- action_buttons = ('import', 'export')
- class DeviceBayView(generic.ObjectView):
- queryset = DeviceBay.objects.all()
- def get_extra_context(self, request, instance):
- return {
- 'breadcrumb_url': 'dcim:device_devicebays'
- }
- class DeviceBayCreateView(generic.ComponentCreateView):
- queryset = DeviceBay.objects.all()
- form = forms.DeviceBayCreateForm
- model_form = forms.DeviceBayForm
- template_name = 'dcim/device_component_add.html'
- class DeviceBayEditView(generic.ObjectEditView):
- queryset = DeviceBay.objects.all()
- model_form = forms.DeviceBayForm
- template_name = 'dcim/device_component_edit.html'
- class DeviceBayDeleteView(generic.ObjectDeleteView):
- queryset = DeviceBay.objects.all()
- class DeviceBayPopulateView(generic.ObjectEditView):
- queryset = DeviceBay.objects.all()
- def get(self, request, pk):
- device_bay = get_object_or_404(self.queryset, pk=pk)
- form = forms.PopulateDeviceBayForm(device_bay)
- return render(request, 'dcim/devicebay_populate.html', {
- 'device_bay': device_bay,
- 'form': form,
- 'return_url': self.get_return_url(request, device_bay),
- })
- def post(self, request, pk):
- device_bay = get_object_or_404(self.queryset, pk=pk)
- form = forms.PopulateDeviceBayForm(device_bay, request.POST)
- if form.is_valid():
- device_bay.installed_device = form.cleaned_data['installed_device']
- device_bay.save()
- messages.success(request, "Added {} to {}.".format(device_bay.installed_device, device_bay))
- return redirect('dcim:device', pk=device_bay.device.pk)
- return render(request, 'dcim/devicebay_populate.html', {
- 'device_bay': device_bay,
- 'form': form,
- 'return_url': self.get_return_url(request, device_bay),
- })
- class DeviceBayDepopulateView(generic.ObjectEditView):
- queryset = DeviceBay.objects.all()
- def get(self, request, pk):
- device_bay = get_object_or_404(self.queryset, pk=pk)
- form = ConfirmationForm()
- return render(request, 'dcim/devicebay_depopulate.html', {
- 'device_bay': device_bay,
- 'form': form,
- 'return_url': self.get_return_url(request, device_bay),
- })
- def post(self, request, pk):
- device_bay = get_object_or_404(self.queryset, pk=pk)
- form = ConfirmationForm(request.POST)
- if form.is_valid():
- removed_device = device_bay.installed_device
- device_bay.installed_device = None
- device_bay.save()
- messages.success(request, "{} has been removed from {}.".format(removed_device, device_bay))
- return redirect('dcim:device', pk=device_bay.device.pk)
- return render(request, 'dcim/devicebay_depopulate.html', {
- 'device_bay': device_bay,
- 'form': form,
- 'return_url': self.get_return_url(request, device_bay),
- })
- class DeviceBayBulkImportView(generic.BulkImportView):
- queryset = DeviceBay.objects.all()
- model_form = forms.DeviceBayCSVForm
- table = tables.DeviceBayTable
- class DeviceBayBulkEditView(generic.BulkEditView):
- queryset = DeviceBay.objects.all()
- filterset = filters.DeviceBayFilterSet
- table = tables.DeviceBayTable
- form = forms.DeviceBayBulkEditForm
- class DeviceBayBulkRenameView(generic.BulkRenameView):
- queryset = DeviceBay.objects.all()
- class DeviceBayBulkDeleteView(generic.BulkDeleteView):
- queryset = DeviceBay.objects.all()
- filterset = filters.DeviceBayFilterSet
- table = tables.DeviceBayTable
- #
- # Inventory items
- #
- class InventoryItemListView(generic.ObjectListView):
- queryset = InventoryItem.objects.all()
- filterset = filters.InventoryItemFilterSet
- filterset_form = forms.InventoryItemFilterForm
- table = tables.InventoryItemTable
- action_buttons = ('import', 'export')
- class InventoryItemView(generic.ObjectView):
- queryset = InventoryItem.objects.all()
- def get_extra_context(self, request, instance):
- return {
- 'breadcrumb_url': 'dcim:device_inventory'
- }
- class InventoryItemEditView(generic.ObjectEditView):
- queryset = InventoryItem.objects.all()
- model_form = forms.InventoryItemForm
- class InventoryItemCreateView(generic.ComponentCreateView):
- queryset = InventoryItem.objects.all()
- form = forms.InventoryItemCreateForm
- model_form = forms.InventoryItemForm
- template_name = 'dcim/device_component_add.html'
- class InventoryItemDeleteView(generic.ObjectDeleteView):
- queryset = InventoryItem.objects.all()
- class InventoryItemBulkImportView(generic.BulkImportView):
- queryset = InventoryItem.objects.all()
- model_form = forms.InventoryItemCSVForm
- table = tables.InventoryItemTable
- class InventoryItemBulkEditView(generic.BulkEditView):
- queryset = InventoryItem.objects.prefetch_related('device', 'manufacturer')
- filterset = filters.InventoryItemFilterSet
- table = tables.InventoryItemTable
- form = forms.InventoryItemBulkEditForm
- class InventoryItemBulkRenameView(generic.BulkRenameView):
- queryset = InventoryItem.objects.all()
- class InventoryItemBulkDeleteView(generic.BulkDeleteView):
- queryset = InventoryItem.objects.prefetch_related('device', 'manufacturer')
- table = tables.InventoryItemTable
- template_name = 'dcim/inventoryitem_bulk_delete.html'
- #
- # Bulk Device component creation
- #
- class DeviceBulkAddConsolePortView(generic.BulkComponentCreateView):
- parent_model = Device
- parent_field = 'device'
- form = forms.ConsolePortBulkCreateForm
- queryset = ConsolePort.objects.all()
- model_form = forms.ConsolePortForm
- filterset = filters.DeviceFilterSet
- table = tables.DeviceTable
- default_return_url = 'dcim:device_list'
- class DeviceBulkAddConsoleServerPortView(generic.BulkComponentCreateView):
- parent_model = Device
- parent_field = 'device'
- form = forms.ConsoleServerPortBulkCreateForm
- queryset = ConsoleServerPort.objects.all()
- model_form = forms.ConsoleServerPortForm
- filterset = filters.DeviceFilterSet
- table = tables.DeviceTable
- default_return_url = 'dcim:device_list'
- class DeviceBulkAddPowerPortView(generic.BulkComponentCreateView):
- parent_model = Device
- parent_field = 'device'
- form = forms.PowerPortBulkCreateForm
- queryset = PowerPort.objects.all()
- model_form = forms.PowerPortForm
- filterset = filters.DeviceFilterSet
- table = tables.DeviceTable
- default_return_url = 'dcim:device_list'
- class DeviceBulkAddPowerOutletView(generic.BulkComponentCreateView):
- parent_model = Device
- parent_field = 'device'
- form = forms.PowerOutletBulkCreateForm
- queryset = PowerOutlet.objects.all()
- model_form = forms.PowerOutletForm
- filterset = filters.DeviceFilterSet
- table = tables.DeviceTable
- default_return_url = 'dcim:device_list'
- class DeviceBulkAddInterfaceView(generic.BulkComponentCreateView):
- parent_model = Device
- parent_field = 'device'
- form = forms.InterfaceBulkCreateForm
- queryset = Interface.objects.all()
- model_form = forms.InterfaceForm
- filterset = filters.DeviceFilterSet
- table = tables.DeviceTable
- default_return_url = 'dcim:device_list'
- # class DeviceBulkAddFrontPortView(generic.BulkComponentCreateView):
- # parent_model = Device
- # parent_field = 'device'
- # form = forms.FrontPortBulkCreateForm
- # queryset = FrontPort.objects.all()
- # model_form = forms.FrontPortForm
- # filterset = filters.DeviceFilterSet
- # table = tables.DeviceTable
- # default_return_url = 'dcim:device_list'
- class DeviceBulkAddRearPortView(generic.BulkComponentCreateView):
- parent_model = Device
- parent_field = 'device'
- form = forms.RearPortBulkCreateForm
- queryset = RearPort.objects.all()
- model_form = forms.RearPortForm
- filterset = filters.DeviceFilterSet
- table = tables.DeviceTable
- default_return_url = 'dcim:device_list'
- class DeviceBulkAddDeviceBayView(generic.BulkComponentCreateView):
- parent_model = Device
- parent_field = 'device'
- form = forms.DeviceBayBulkCreateForm
- queryset = DeviceBay.objects.all()
- model_form = forms.DeviceBayForm
- filterset = filters.DeviceFilterSet
- table = tables.DeviceTable
- default_return_url = 'dcim:device_list'
- class DeviceBulkAddInventoryItemView(generic.BulkComponentCreateView):
- parent_model = Device
- parent_field = 'device'
- form = forms.InventoryItemBulkCreateForm
- queryset = InventoryItem.objects.all()
- model_form = forms.InventoryItemForm
- filterset = filters.DeviceFilterSet
- table = tables.DeviceTable
- default_return_url = 'dcim:device_list'
- #
- # Cables
- #
- class CableListView(generic.ObjectListView):
- queryset = Cable.objects.all()
- filterset = filters.CableFilterSet
- filterset_form = forms.CableFilterForm
- table = tables.CableTable
- action_buttons = ('import', 'export')
- class CableView(generic.ObjectView):
- queryset = Cable.objects.all()
- class PathTraceView(generic.ObjectView):
- """
- Trace a cable path beginning from the given path endpoint (origin).
- """
- additional_permissions = ['dcim.view_cable']
- template_name = 'dcim/cable_trace.html'
- def dispatch(self, request, *args, **kwargs):
- model = kwargs.pop('model')
- self.queryset = model.objects.all()
- return super().dispatch(request, *args, **kwargs)
- def get_extra_context(self, request, instance):
- related_paths = []
- # If tracing a PathEndpoint, locate the CablePath (if one exists) by its origin
- if isinstance(instance, PathEndpoint):
- path = instance._path
- # Otherwise, find all CablePaths which traverse the specified object
- else:
- related_paths = CablePath.objects.filter(path__contains=instance).prefetch_related('origin')
- # Check for specification of a particular path (when tracing pass-through ports)
- try:
- path_id = int(request.GET.get('cablepath_id'))
- except TypeError:
- path_id = None
- if path_id in list(related_paths.values_list('pk', flat=True)):
- path = CablePath.objects.get(pk=path_id)
- else:
- path = related_paths.first()
- return {
- 'path': path,
- 'related_paths': related_paths,
- 'total_length': path.get_total_length() if path else None,
- }
- class CableCreateView(generic.ObjectEditView):
- queryset = Cable.objects.all()
- template_name = 'dcim/cable_connect.html'
- def dispatch(self, request, *args, **kwargs):
- # Set the model_form class based on the type of component being connected
- self.model_form = {
- 'console-port': forms.ConnectCableToConsolePortForm,
- 'console-server-port': forms.ConnectCableToConsoleServerPortForm,
- 'power-port': forms.ConnectCableToPowerPortForm,
- 'power-outlet': forms.ConnectCableToPowerOutletForm,
- 'interface': forms.ConnectCableToInterfaceForm,
- 'front-port': forms.ConnectCableToFrontPortForm,
- 'rear-port': forms.ConnectCableToRearPortForm,
- 'power-feed': forms.ConnectCableToPowerFeedForm,
- 'circuit-termination': forms.ConnectCableToCircuitTerminationForm,
- }[kwargs.get('termination_b_type')]
- return super().dispatch(request, *args, **kwargs)
- def alter_obj(self, obj, request, url_args, url_kwargs):
- termination_a_type = url_kwargs.get('termination_a_type')
- termination_a_id = url_kwargs.get('termination_a_id')
- termination_b_type_name = url_kwargs.get('termination_b_type')
- self.termination_b_type = ContentType.objects.get(model=termination_b_type_name.replace('-', ''))
- # Initialize Cable termination attributes
- obj.termination_a = termination_a_type.objects.get(pk=termination_a_id)
- obj.termination_b_type = self.termination_b_type
- return obj
- def get(self, request, *args, **kwargs):
- obj = self.alter_obj(self.get_object(kwargs), request, args, kwargs)
- # Parse initial data manually to avoid setting field values as lists
- initial_data = {k: request.GET[k] for k in request.GET}
- # Set initial site and rack based on side A termination (if not already set)
- termination_a_site = getattr(obj.termination_a.parent_object, 'site', None)
- if termination_a_site and 'termination_b_region' not in initial_data:
- initial_data['termination_b_region'] = termination_a_site.region
- if termination_a_site and 'termination_b_site_group' not in initial_data:
- initial_data['termination_b_site_group'] = termination_a_site.group
- if 'termination_b_site' not in initial_data:
- initial_data['termination_b_site'] = termination_a_site
- if 'termination_b_rack' not in initial_data:
- initial_data['termination_b_rack'] = getattr(obj.termination_a.parent_object, 'rack', None)
- form = self.model_form(instance=obj, initial=initial_data)
- return render(request, self.template_name, {
- 'obj': obj,
- 'obj_type': Cable._meta.verbose_name,
- 'termination_b_type': self.termination_b_type.name,
- 'form': form,
- 'return_url': self.get_return_url(request, obj),
- })
- class CableEditView(generic.ObjectEditView):
- queryset = Cable.objects.all()
- model_form = forms.CableForm
- template_name = 'dcim/cable_edit.html'
- class CableDeleteView(generic.ObjectDeleteView):
- queryset = Cable.objects.all()
- class CableBulkImportView(generic.BulkImportView):
- queryset = Cable.objects.all()
- model_form = forms.CableCSVForm
- table = tables.CableTable
- class CableBulkEditView(generic.BulkEditView):
- queryset = Cable.objects.prefetch_related('termination_a', 'termination_b')
- filterset = filters.CableFilterSet
- table = tables.CableTable
- form = forms.CableBulkEditForm
- class CableBulkDeleteView(generic.BulkDeleteView):
- queryset = Cable.objects.prefetch_related('termination_a', 'termination_b')
- filterset = filters.CableFilterSet
- table = tables.CableTable
- #
- # Connections
- #
- class ConsoleConnectionsListView(generic.ObjectListView):
- queryset = ConsolePort.objects.filter(_path__isnull=False).order_by('device')
- filterset = filters.ConsoleConnectionFilterSet
- filterset_form = forms.ConsoleConnectionFilterForm
- table = tables.ConsoleConnectionTable
- template_name = 'dcim/connections_list.html'
- def queryset_to_csv(self):
- csv_data = [
- # Headers
- ','.join(['console_server', 'port', 'device', 'console_port', 'reachable'])
- ]
- for obj in self.queryset:
- csv = csv_format([
- obj._path.destination.device.identifier if obj._path.destination else None,
- obj._path.destination.name if obj._path.destination else None,
- obj.device.identifier,
- obj.name,
- obj._path.is_active
- ])
- csv_data.append(csv)
- return '\n'.join(csv_data)
- def extra_context(self):
- return {
- 'title': 'Console Connections'
- }
- class PowerConnectionsListView(generic.ObjectListView):
- queryset = PowerPort.objects.filter(_path__isnull=False).order_by('device')
- filterset = filters.PowerConnectionFilterSet
- filterset_form = forms.PowerConnectionFilterForm
- table = tables.PowerConnectionTable
- template_name = 'dcim/connections_list.html'
- def queryset_to_csv(self):
- csv_data = [
- # Headers
- ','.join(['pdu', 'outlet', 'device', 'power_port', 'reachable'])
- ]
- for obj in self.queryset:
- csv = csv_format([
- obj._path.destination.device.identifier if obj._path.destination else None,
- obj._path.destination.name if obj._path.destination else None,
- obj.device.identifier,
- obj.name,
- obj._path.is_active
- ])
- csv_data.append(csv)
- return '\n'.join(csv_data)
- def extra_context(self):
- return {
- 'title': 'Power Connections'
- }
- class InterfaceConnectionsListView(generic.ObjectListView):
- queryset = Interface.objects.filter(
- # Avoid duplicate connections by only selecting the lower PK in a connected pair
- _path__isnull=False,
- pk__lt=F('_path__destination_id')
- ).order_by('device')
- filterset = filters.InterfaceConnectionFilterSet
- filterset_form = forms.InterfaceConnectionFilterForm
- table = tables.InterfaceConnectionTable
- template_name = 'dcim/connections_list.html'
- def queryset_to_csv(self):
- csv_data = [
- # Headers
- ','.join([
- 'device_a', 'interface_a', 'device_b', 'interface_b', 'reachable'
- ])
- ]
- for obj in self.queryset:
- csv = csv_format([
- obj._path.destination.device.identifier if obj._path.destination else None,
- obj._path.destination.name if obj._path.destination else None,
- obj.device.identifier,
- obj.name,
- obj._path.is_active
- ])
- csv_data.append(csv)
- return '\n'.join(csv_data)
- def extra_context(self):
- return {
- 'title': 'Interface Connections'
- }
- #
- # Virtual chassis
- #
- class VirtualChassisListView(generic.ObjectListView):
- queryset = VirtualChassis.objects.prefetch_related('master').annotate(
- member_count=count_related(Device, 'virtual_chassis')
- )
- table = tables.VirtualChassisTable
- filterset = filters.VirtualChassisFilterSet
- filterset_form = forms.VirtualChassisFilterForm
- class VirtualChassisView(generic.ObjectView):
- queryset = VirtualChassis.objects.all()
- def get_extra_context(self, request, instance):
- members = Device.objects.restrict(request.user).filter(virtual_chassis=instance)
- return {
- 'members': members,
- }
- class VirtualChassisCreateView(generic.ObjectEditView):
- queryset = VirtualChassis.objects.all()
- model_form = forms.VirtualChassisCreateForm
- template_name = 'dcim/virtualchassis_add.html'
- class VirtualChassisEditView(ObjectPermissionRequiredMixin, GetReturnURLMixin, View):
- queryset = VirtualChassis.objects.all()
- def get_required_permission(self):
- return 'dcim.change_virtualchassis'
- def get(self, request, pk):
- virtual_chassis = get_object_or_404(self.queryset, pk=pk)
- VCMemberFormSet = modelformset_factory(
- model=Device,
- form=forms.DeviceVCMembershipForm,
- formset=forms.BaseVCMemberFormSet,
- extra=0
- )
- members_queryset = virtual_chassis.members.prefetch_related('rack').order_by('vc_position')
- vc_form = forms.VirtualChassisForm(instance=virtual_chassis)
- vc_form.fields['master'].queryset = members_queryset
- formset = VCMemberFormSet(queryset=members_queryset)
- return render(request, 'dcim/virtualchassis_edit.html', {
- 'vc_form': vc_form,
- 'formset': formset,
- 'return_url': self.get_return_url(request, virtual_chassis),
- })
- def post(self, request, pk):
- virtual_chassis = get_object_or_404(self.queryset, pk=pk)
- VCMemberFormSet = modelformset_factory(
- model=Device,
- form=forms.DeviceVCMembershipForm,
- formset=forms.BaseVCMemberFormSet,
- extra=0
- )
- members_queryset = virtual_chassis.members.prefetch_related('rack').order_by('vc_position')
- vc_form = forms.VirtualChassisForm(request.POST, instance=virtual_chassis)
- vc_form.fields['master'].queryset = members_queryset
- formset = VCMemberFormSet(request.POST, queryset=members_queryset)
- if vc_form.is_valid() and formset.is_valid():
- with transaction.atomic():
- # Save the VirtualChassis
- vc_form.save()
- # Nullify the vc_position of each member first to allow reordering without raising an IntegrityError on
- # duplicate positions. Then save each member instance.
- members = formset.save(commit=False)
- devices = Device.objects.filter(pk__in=[m.pk for m in members])
- for device in devices:
- device.vc_position = None
- device.save()
- for member in members:
- member.save()
- return redirect(virtual_chassis.get_absolute_url())
- return render(request, 'dcim/virtualchassis_edit.html', {
- 'vc_form': vc_form,
- 'formset': formset,
- 'return_url': self.get_return_url(request, virtual_chassis),
- })
- class VirtualChassisDeleteView(generic.ObjectDeleteView):
- queryset = VirtualChassis.objects.all()
- class VirtualChassisAddMemberView(ObjectPermissionRequiredMixin, GetReturnURLMixin, View):
- queryset = VirtualChassis.objects.all()
- def get_required_permission(self):
- return 'dcim.change_virtualchassis'
- def get(self, request, pk):
- virtual_chassis = get_object_or_404(self.queryset, pk=pk)
- initial_data = {k: request.GET[k] for k in request.GET}
- member_select_form = forms.VCMemberSelectForm(initial=initial_data)
- membership_form = forms.DeviceVCMembershipForm(initial=initial_data)
- return render(request, 'dcim/virtualchassis_add_member.html', {
- 'virtual_chassis': virtual_chassis,
- 'member_select_form': member_select_form,
- 'membership_form': membership_form,
- 'return_url': self.get_return_url(request, virtual_chassis),
- })
- def post(self, request, pk):
- virtual_chassis = get_object_or_404(self.queryset, pk=pk)
- member_select_form = forms.VCMemberSelectForm(request.POST)
- if member_select_form.is_valid():
- device = member_select_form.cleaned_data['device']
- device.virtual_chassis = virtual_chassis
- data = {k: request.POST[k] for k in ['vc_position', 'vc_priority']}
- membership_form = forms.DeviceVCMembershipForm(data=data, validate_vc_position=True, instance=device)
- if membership_form.is_valid():
- membership_form.save()
- msg = 'Added member <a href="{}">{}</a>'.format(device.get_absolute_url(), escape(device))
- messages.success(request, mark_safe(msg))
- if '_addanother' in request.POST:
- return redirect(request.get_full_path())
- return redirect(self.get_return_url(request, device))
- else:
- membership_form = forms.DeviceVCMembershipForm(data=request.POST)
- return render(request, 'dcim/virtualchassis_add_member.html', {
- 'virtual_chassis': virtual_chassis,
- 'member_select_form': member_select_form,
- 'membership_form': membership_form,
- 'return_url': self.get_return_url(request, virtual_chassis),
- })
- class VirtualChassisRemoveMemberView(ObjectPermissionRequiredMixin, GetReturnURLMixin, View):
- queryset = Device.objects.all()
- def get_required_permission(self):
- return 'dcim.change_device'
- def get(self, request, pk):
- device = get_object_or_404(self.queryset, pk=pk, virtual_chassis__isnull=False)
- form = ConfirmationForm(initial=request.GET)
- return render(request, 'dcim/virtualchassis_remove_member.html', {
- 'device': device,
- 'form': form,
- 'return_url': self.get_return_url(request, device),
- })
- def post(self, request, pk):
- device = get_object_or_404(self.queryset, pk=pk, virtual_chassis__isnull=False)
- form = ConfirmationForm(request.POST)
- # Protect master device from being removed
- virtual_chassis = VirtualChassis.objects.filter(master=device).first()
- if virtual_chassis is not None:
- msg = 'Unable to remove master device {} from the virtual chassis.'.format(escape(device))
- messages.error(request, mark_safe(msg))
- return redirect(device.get_absolute_url())
- if form.is_valid():
- devices = Device.objects.filter(pk=device.pk)
- for device in devices:
- device.virtual_chassis = None
- device.vc_position = None
- device.vc_priority = None
- device.save()
- msg = 'Removed {} from virtual chassis {}'.format(device, device.virtual_chassis)
- messages.success(request, msg)
- return redirect(self.get_return_url(request, device))
- return render(request, 'dcim/virtualchassis_remove_member.html', {
- 'device': device,
- 'form': form,
- 'return_url': self.get_return_url(request, device),
- })
- class VirtualChassisBulkImportView(generic.BulkImportView):
- queryset = VirtualChassis.objects.all()
- model_form = forms.VirtualChassisCSVForm
- table = tables.VirtualChassisTable
- class VirtualChassisBulkEditView(generic.BulkEditView):
- queryset = VirtualChassis.objects.all()
- filterset = filters.VirtualChassisFilterSet
- table = tables.VirtualChassisTable
- form = forms.VirtualChassisBulkEditForm
- class VirtualChassisBulkDeleteView(generic.BulkDeleteView):
- queryset = VirtualChassis.objects.all()
- filterset = filters.VirtualChassisFilterSet
- table = tables.VirtualChassisTable
- #
- # Power panels
- #
- class PowerPanelListView(generic.ObjectListView):
- queryset = PowerPanel.objects.prefetch_related(
- 'site', 'location'
- ).annotate(
- powerfeed_count=count_related(PowerFeed, 'power_panel')
- )
- filterset = filters.PowerPanelFilterSet
- filterset_form = forms.PowerPanelFilterForm
- table = tables.PowerPanelTable
- class PowerPanelView(generic.ObjectView):
- queryset = PowerPanel.objects.prefetch_related('site', 'location')
- def get_extra_context(self, request, instance):
- power_feeds = PowerFeed.objects.restrict(request.user).filter(power_panel=instance).prefetch_related('rack')
- powerfeed_table = tables.PowerFeedTable(
- data=power_feeds,
- orderable=False
- )
- powerfeed_table.exclude = ['power_panel']
- return {
- 'powerfeed_table': powerfeed_table,
- }
- class PowerPanelEditView(generic.ObjectEditView):
- queryset = PowerPanel.objects.all()
- model_form = forms.PowerPanelForm
- class PowerPanelDeleteView(generic.ObjectDeleteView):
- queryset = PowerPanel.objects.all()
- class PowerPanelBulkImportView(generic.BulkImportView):
- queryset = PowerPanel.objects.all()
- model_form = forms.PowerPanelCSVForm
- table = tables.PowerPanelTable
- class PowerPanelBulkEditView(generic.BulkEditView):
- queryset = PowerPanel.objects.prefetch_related('site', 'location')
- filterset = filters.PowerPanelFilterSet
- table = tables.PowerPanelTable
- form = forms.PowerPanelBulkEditForm
- class PowerPanelBulkDeleteView(generic.BulkDeleteView):
- queryset = PowerPanel.objects.prefetch_related(
- 'site', 'location'
- ).annotate(
- powerfeed_count=count_related(PowerFeed, 'power_panel')
- )
- filterset = filters.PowerPanelFilterSet
- table = tables.PowerPanelTable
- #
- # Power feeds
- #
- class PowerFeedListView(generic.ObjectListView):
- queryset = PowerFeed.objects.all()
- filterset = filters.PowerFeedFilterSet
- filterset_form = forms.PowerFeedFilterForm
- table = tables.PowerFeedTable
- class PowerFeedView(generic.ObjectView):
- queryset = PowerFeed.objects.prefetch_related('power_panel', 'rack')
- class PowerFeedEditView(generic.ObjectEditView):
- queryset = PowerFeed.objects.all()
- model_form = forms.PowerFeedForm
- class PowerFeedDeleteView(generic.ObjectDeleteView):
- queryset = PowerFeed.objects.all()
- class PowerFeedBulkImportView(generic.BulkImportView):
- queryset = PowerFeed.objects.all()
- model_form = forms.PowerFeedCSVForm
- table = tables.PowerFeedTable
- class PowerFeedBulkEditView(generic.BulkEditView):
- queryset = PowerFeed.objects.prefetch_related('power_panel', 'rack')
- filterset = filters.PowerFeedFilterSet
- table = tables.PowerFeedTable
- form = forms.PowerFeedBulkEditForm
- class PowerFeedBulkDeleteView(generic.BulkDeleteView):
- queryset = PowerFeed.objects.prefetch_related('power_panel', 'rack')
- filterset = filters.PowerFeedFilterSet
- table = tables.PowerFeedTable
|