2019-09-27 16:51:12 -04:00
|
|
|
from collections import OrderedDict
|
2019-01-04 12:30:38 -05:00
|
|
|
|
2016-03-01 11:23:03 -05:00
|
|
|
from django.contrib import messages
|
2019-03-21 17:47:43 -04:00
|
|
|
from django.contrib.contenttypes.models import ContentType
|
2017-04-20 13:07:22 -04:00
|
|
|
from django.core.paginator import EmptyPage, PageNotAnInteger
|
2017-11-29 12:58:36 -05:00
|
|
|
from django.db import transaction
|
2021-09-27 17:00:13 -04:00
|
|
|
from django.db.models import Prefetch
|
2020-06-25 17:08:51 -04:00
|
|
|
from django.forms import ModelMultipleChoiceField, MultipleHiddenInput, modelformset_factory
|
2016-03-01 11:23:03 -05:00
|
|
|
from django.shortcuts import get_object_or_404, redirect, render
|
2021-07-14 15:29:04 -04:00
|
|
|
from django.urls import reverse
|
2017-05-09 17:06:17 -04:00
|
|
|
from django.utils.html import escape
|
2017-05-03 17:12:34 -04:00
|
|
|
from django.utils.safestring import mark_safe
|
2016-03-04 16:41:24 -05:00
|
|
|
from django.views.generic import View
|
2016-03-01 11:23:03 -05:00
|
|
|
|
2019-04-09 16:49:04 -04:00
|
|
|
from circuits.models import Circuit
|
2021-12-17 16:12:03 -05:00
|
|
|
from extras.views import ObjectConfigContextView
|
2022-04-06 20:12:14 -04:00
|
|
|
from ipam.models import ASN, IPAddress, Prefix, Service, VLAN, VLANGroup
|
2021-11-03 11:36:54 -05:00
|
|
|
from ipam.tables import AssignedIPAddressesTable, InterfaceVLANTable
|
2020-11-11 16:07:38 -05:00
|
|
|
from netbox.views import generic
|
2016-03-01 11:23:03 -05:00
|
|
|
from utilities.forms import ConfirmationForm
|
2020-10-02 13:54:57 -04:00
|
|
|
from utilities.paginator import EnhancedPaginator, get_paginate_count
|
2020-05-21 16:11:46 -04:00
|
|
|
from utilities.permissions import get_permission_for_model
|
2021-07-14 15:29:04 -04:00
|
|
|
from utilities.utils import count_related
|
2020-11-11 16:07:38 -05:00
|
|
|
from utilities.views import GetReturnURLMixin, ObjectPermissionRequiredMixin
|
2017-11-27 10:59:24 -05:00
|
|
|
from virtualization.models import VirtualMachine
|
2021-04-29 16:38:56 -04:00
|
|
|
from . import filtersets, forms, tables
|
2020-01-24 15:28:15 -05:00
|
|
|
from .choices import DeviceFaceChoices
|
2020-02-18 16:21:50 -05:00
|
|
|
from .constants import NONCONNECTABLE_IFACE_TYPES
|
2021-12-21 10:48:10 -05:00
|
|
|
from .models import *
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2021-12-14 13:41:01 -05:00
|
|
|
class DeviceComponentsView(generic.ObjectChildrenView):
|
2021-10-20 14:22:11 -04:00
|
|
|
queryset = Device.objects.all()
|
|
|
|
|
2021-12-14 13:41:01 -05:00
|
|
|
def get_children(self, request, parent):
|
|
|
|
return self.child_model.objects.restrict(request.user, 'view').filter(device=parent)
|
2021-10-20 14:22:11 -04:00
|
|
|
|
|
|
|
def get_extra_context(self, request, instance):
|
|
|
|
return {
|
2021-12-14 13:41:01 -05:00
|
|
|
'active_tab': f"{self.child_model._meta.verbose_name_plural.replace(' ', '-')}",
|
2021-10-20 14:22:11 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2021-10-20 15:04:40 -04:00
|
|
|
class DeviceTypeComponentsView(DeviceComponentsView):
|
|
|
|
queryset = DeviceType.objects.all()
|
|
|
|
template_name = 'dcim/devicetype/component_templates.html'
|
2021-12-21 10:28:28 -05:00
|
|
|
viewname = None # Used for return_url resolution
|
2021-10-20 15:04:40 -04:00
|
|
|
|
2021-12-14 13:41:01 -05:00
|
|
|
def get_children(self, request, parent):
|
|
|
|
return self.child_model.objects.restrict(request.user, 'view').filter(device_type=parent)
|
2021-10-20 15:04:40 -04:00
|
|
|
|
2021-12-21 10:28:28 -05:00
|
|
|
def get_extra_context(self, request, instance):
|
2022-02-18 11:56:49 -05:00
|
|
|
context = super().get_extra_context(request, instance)
|
|
|
|
context['return_url'] = reverse(self.viewname, kwargs={'pk': instance.pk})
|
|
|
|
|
|
|
|
return context
|
2021-12-21 10:28:28 -05:00
|
|
|
|
2021-10-20 15:04:40 -04:00
|
|
|
|
2021-12-17 12:18:37 -05:00
|
|
|
class ModuleTypeComponentsView(DeviceComponentsView):
|
|
|
|
queryset = ModuleType.objects.all()
|
|
|
|
template_name = 'dcim/moduletype/component_templates.html'
|
2022-02-18 11:56:49 -05:00
|
|
|
viewname = None # Used for return_url resolution
|
2021-12-17 12:18:37 -05:00
|
|
|
|
|
|
|
def get_children(self, request, parent):
|
|
|
|
return self.child_model.objects.restrict(request.user, 'view').filter(module_type=parent)
|
|
|
|
|
2022-02-18 11:56:49 -05:00
|
|
|
def get_extra_context(self, request, instance):
|
|
|
|
context = super().get_extra_context(request, instance)
|
|
|
|
context['return_url'] = reverse(self.viewname, kwargs={'pk': instance.pk})
|
|
|
|
|
|
|
|
return context
|
|
|
|
|
2021-12-17 12:18:37 -05:00
|
|
|
|
2020-05-21 16:34:15 -04:00
|
|
|
class BulkDisconnectView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View):
|
2017-06-15 14:01:49 -04:00
|
|
|
"""
|
|
|
|
An extendable view for disconnection console/power/interface components in bulk.
|
|
|
|
"""
|
2020-05-21 16:11:46 -04:00
|
|
|
queryset = None
|
2017-06-15 14:01:49 -04:00
|
|
|
template_name = 'dcim/bulk_disconnect.html'
|
|
|
|
|
2020-06-25 17:08:51 -04:00
|
|
|
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
|
|
|
|
|
2020-05-21 16:11:46 -04:00
|
|
|
def get_required_permission(self):
|
|
|
|
return get_permission_for_model(self.queryset.model, 'change')
|
|
|
|
|
2018-11-08 15:04:34 -05:00
|
|
|
def post(self, request):
|
2017-06-15 14:01:49 -04:00
|
|
|
|
|
|
|
selected_objects = []
|
2018-11-08 15:04:34 -05:00
|
|
|
return_url = self.get_return_url(request)
|
2017-06-15 14:01:49 -04:00
|
|
|
|
|
|
|
if '_confirm' in request.POST:
|
|
|
|
form = self.form(request.POST)
|
2018-11-08 15:04:34 -05:00
|
|
|
|
2017-06-15 14:01:49 -04:00
|
|
|
if form.is_valid():
|
2018-11-08 15:04:34 -05:00
|
|
|
|
|
|
|
with transaction.atomic():
|
|
|
|
|
|
|
|
count = 0
|
2020-05-21 16:11:46 -04:00
|
|
|
for obj in self.queryset.filter(pk__in=form.cleaned_data['pk']):
|
2018-11-08 15:04:34 -05:00
|
|
|
if obj.cable is None:
|
|
|
|
continue
|
|
|
|
obj.cable.delete()
|
|
|
|
count += 1
|
|
|
|
|
|
|
|
messages.success(request, "Disconnected {} {}".format(
|
2020-05-21 16:11:46 -04:00
|
|
|
count, self.queryset.model._meta.verbose_name_plural
|
2017-06-15 14:01:49 -04:00
|
|
|
))
|
2018-11-08 15:04:34 -05:00
|
|
|
|
|
|
|
return redirect(return_url)
|
2017-06-15 14:01:49 -04:00
|
|
|
|
|
|
|
else:
|
|
|
|
form = self.form(initial={'pk': request.POST.getlist('pk')})
|
2020-05-21 16:11:46 -04:00
|
|
|
selected_objects = self.queryset.filter(pk__in=form.initial['pk'])
|
2017-06-15 14:01:49 -04:00
|
|
|
|
|
|
|
return render(request, self.template_name, {
|
|
|
|
'form': form,
|
2020-05-21 16:11:46 -04:00
|
|
|
'obj_type_plural': self.queryset.model._meta.verbose_name_plural,
|
2017-06-15 14:01:49 -04:00
|
|
|
'selected_objects': selected_objects,
|
2018-11-08 15:04:34 -05:00
|
|
|
'return_url': return_url,
|
2017-06-15 14:01:49 -04:00
|
|
|
})
|
|
|
|
|
|
|
|
|
2017-02-28 12:11:43 -05:00
|
|
|
#
|
|
|
|
# Regions
|
|
|
|
#
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RegionListView(generic.ObjectListView):
|
2019-02-15 10:10:26 -05:00
|
|
|
queryset = Region.objects.add_related_count(
|
|
|
|
Region.objects.all(),
|
|
|
|
Site,
|
|
|
|
'region',
|
|
|
|
'site_count',
|
|
|
|
cumulative=True
|
|
|
|
)
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.RegionFilterSet
|
2020-01-09 20:57:13 -05:00
|
|
|
filterset_form = forms.RegionFilterForm
|
2017-02-28 12:11:43 -05:00
|
|
|
table = tables.RegionTable
|
|
|
|
|
|
|
|
|
2021-03-26 15:07:29 -04:00
|
|
|
class RegionView(generic.ObjectView):
|
|
|
|
queryset = Region.objects.all()
|
|
|
|
|
|
|
|
def get_extra_context(self, request, instance):
|
2021-04-06 09:42:36 -04:00
|
|
|
child_regions = Region.objects.add_related_count(
|
|
|
|
Region.objects.all(),
|
|
|
|
Site,
|
|
|
|
'region',
|
|
|
|
'site_count',
|
|
|
|
cumulative=True
|
|
|
|
).restrict(request.user, 'view').filter(
|
|
|
|
parent__in=instance.get_descendants(include_self=True)
|
|
|
|
)
|
|
|
|
child_regions_table = tables.RegionTable(child_regions)
|
2021-12-03 11:07:16 -05:00
|
|
|
child_regions_table.columns.hide('actions')
|
2021-04-06 09:42:36 -04:00
|
|
|
|
2021-03-26 15:07:29 -04:00
|
|
|
sites = Site.objects.restrict(request.user, 'view').filter(
|
|
|
|
region=instance
|
|
|
|
)
|
2022-05-04 15:46:13 -04:00
|
|
|
sites_table = tables.SiteTable(sites, user=request.user, exclude=('region',))
|
2022-02-09 14:10:54 -05:00
|
|
|
sites_table.configure(request)
|
2021-03-26 15:07:29 -04:00
|
|
|
|
|
|
|
return {
|
2021-04-06 09:42:36 -04:00
|
|
|
'child_regions_table': child_regions_table,
|
2021-03-26 15:07:29 -04:00
|
|
|
'sites_table': sites_table,
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RegionEditView(generic.ObjectEditView):
|
2020-05-11 12:37:22 -04:00
|
|
|
queryset = Region.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.RegionForm
|
2017-02-28 12:11:43 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RegionDeleteView(generic.ObjectDeleteView):
|
2020-07-01 12:08:26 -04:00
|
|
|
queryset = Region.objects.all()
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RegionBulkImportView(generic.BulkImportView):
|
2020-05-21 11:58:27 -04:00
|
|
|
queryset = Region.objects.all()
|
2017-07-18 01:50:26 +03:00
|
|
|
model_form = forms.RegionCSVForm
|
|
|
|
table = tables.RegionTable
|
|
|
|
|
|
|
|
|
2021-03-12 16:14:42 -05:00
|
|
|
class RegionBulkEditView(generic.BulkEditView):
|
|
|
|
queryset = Region.objects.add_related_count(
|
|
|
|
Region.objects.all(),
|
|
|
|
Site,
|
|
|
|
'region',
|
|
|
|
'site_count',
|
|
|
|
cumulative=True
|
|
|
|
)
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.RegionFilterSet
|
2021-03-12 16:14:42 -05:00
|
|
|
table = tables.RegionTable
|
|
|
|
form = forms.RegionBulkEditForm
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RegionBulkDeleteView(generic.BulkDeleteView):
|
2020-07-20 12:07:19 -04:00
|
|
|
queryset = Region.objects.add_related_count(
|
|
|
|
Region.objects.all(),
|
|
|
|
Site,
|
|
|
|
'region',
|
|
|
|
'site_count',
|
|
|
|
cumulative=True
|
|
|
|
)
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.RegionFilterSet
|
2017-07-13 16:31:47 -04:00
|
|
|
table = tables.RegionTable
|
2017-02-28 12:11:43 -05:00
|
|
|
|
|
|
|
|
2021-03-08 13:28:53 -05:00
|
|
|
#
|
|
|
|
# Site groups
|
|
|
|
#
|
|
|
|
|
|
|
|
class SiteGroupListView(generic.ObjectListView):
|
|
|
|
queryset = SiteGroup.objects.add_related_count(
|
|
|
|
SiteGroup.objects.all(),
|
|
|
|
Site,
|
|
|
|
'group',
|
|
|
|
'site_count',
|
|
|
|
cumulative=True
|
|
|
|
)
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.SiteGroupFilterSet
|
2021-03-08 13:28:53 -05:00
|
|
|
filterset_form = forms.SiteGroupFilterForm
|
|
|
|
table = tables.SiteGroupTable
|
|
|
|
|
|
|
|
|
2021-03-26 15:07:29 -04:00
|
|
|
class SiteGroupView(generic.ObjectView):
|
|
|
|
queryset = SiteGroup.objects.all()
|
|
|
|
|
|
|
|
def get_extra_context(self, request, instance):
|
2021-04-06 09:42:36 -04:00
|
|
|
child_groups = SiteGroup.objects.add_related_count(
|
|
|
|
SiteGroup.objects.all(),
|
|
|
|
Site,
|
|
|
|
'group',
|
|
|
|
'site_count',
|
|
|
|
cumulative=True
|
|
|
|
).restrict(request.user, 'view').filter(
|
|
|
|
parent__in=instance.get_descendants(include_self=True)
|
|
|
|
)
|
|
|
|
child_groups_table = tables.SiteGroupTable(child_groups)
|
2021-12-03 11:07:16 -05:00
|
|
|
child_groups_table.columns.hide('actions')
|
2021-04-06 09:42:36 -04:00
|
|
|
|
2021-03-26 15:07:29 -04:00
|
|
|
sites = Site.objects.restrict(request.user, 'view').filter(
|
|
|
|
group=instance
|
|
|
|
)
|
2022-05-04 15:46:13 -04:00
|
|
|
sites_table = tables.SiteTable(sites, user=request.user, exclude=('group',))
|
2022-02-09 14:10:54 -05:00
|
|
|
sites_table.configure(request)
|
2021-03-26 15:07:29 -04:00
|
|
|
|
|
|
|
return {
|
2021-04-06 09:42:36 -04:00
|
|
|
'child_groups_table': child_groups_table,
|
2021-03-26 15:07:29 -04:00
|
|
|
'sites_table': sites_table,
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2021-03-08 13:28:53 -05:00
|
|
|
class SiteGroupEditView(generic.ObjectEditView):
|
|
|
|
queryset = SiteGroup.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.SiteGroupForm
|
2021-03-08 13:28:53 -05:00
|
|
|
|
|
|
|
|
|
|
|
class SiteGroupDeleteView(generic.ObjectDeleteView):
|
|
|
|
queryset = SiteGroup.objects.all()
|
|
|
|
|
|
|
|
|
|
|
|
class SiteGroupBulkImportView(generic.BulkImportView):
|
|
|
|
queryset = SiteGroup.objects.all()
|
|
|
|
model_form = forms.SiteGroupCSVForm
|
|
|
|
table = tables.SiteGroupTable
|
|
|
|
|
|
|
|
|
2021-03-12 16:14:42 -05:00
|
|
|
class SiteGroupBulkEditView(generic.BulkEditView):
|
|
|
|
queryset = SiteGroup.objects.add_related_count(
|
|
|
|
SiteGroup.objects.all(),
|
|
|
|
Site,
|
|
|
|
'group',
|
|
|
|
'site_count',
|
|
|
|
cumulative=True
|
|
|
|
)
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.SiteGroupFilterSet
|
2021-03-12 16:14:42 -05:00
|
|
|
table = tables.SiteGroupTable
|
|
|
|
form = forms.SiteGroupBulkEditForm
|
|
|
|
|
|
|
|
|
2021-03-08 13:28:53 -05:00
|
|
|
class SiteGroupBulkDeleteView(generic.BulkDeleteView):
|
|
|
|
queryset = SiteGroup.objects.add_related_count(
|
|
|
|
SiteGroup.objects.all(),
|
|
|
|
Site,
|
|
|
|
'group',
|
|
|
|
'site_count',
|
|
|
|
cumulative=True
|
|
|
|
)
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.SiteGroupFilterSet
|
2021-03-08 13:28:53 -05:00
|
|
|
table = tables.SiteGroupTable
|
|
|
|
|
|
|
|
|
2016-03-01 11:23:03 -05:00
|
|
|
#
|
|
|
|
# Sites
|
|
|
|
#
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class SiteListView(generic.ObjectListView):
|
2020-10-30 16:52:40 -04:00
|
|
|
queryset = Site.objects.all()
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.SiteFilterSet
|
2020-01-09 20:57:13 -05:00
|
|
|
filterset_form = forms.SiteFilterForm
|
2018-01-25 13:29:09 -05:00
|
|
|
table = tables.SiteTable
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class SiteView(generic.ObjectView):
|
2020-05-11 14:32:10 -04:00
|
|
|
queryset = Site.objects.prefetch_related('region', 'tenant__group')
|
2017-05-18 17:00:57 -04:00
|
|
|
|
2020-11-19 15:59:11 -05:00
|
|
|
def get_extra_context(self, request, instance):
|
2017-05-18 17:00:57 -04:00
|
|
|
stats = {
|
2021-12-06 13:43:02 -05:00
|
|
|
'location_count': Location.objects.restrict(request.user, 'view').filter(site=instance).count(),
|
2020-11-19 15:59:11 -05:00
|
|
|
'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(),
|
2022-04-06 20:12:14 -04:00
|
|
|
'vlangroup_count': VLANGroup.objects.restrict(request.user, 'view').filter(
|
|
|
|
scope_type=ContentType.objects.get_for_model(Site),
|
|
|
|
scope_id=instance.pk
|
|
|
|
).count(),
|
2020-11-19 15:59:11 -05:00
|
|
|
'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(),
|
2017-05-18 17:00:57 -04:00
|
|
|
}
|
2021-03-03 13:30:33 -05:00
|
|
|
locations = Location.objects.add_related_count(
|
|
|
|
Location.objects.all(),
|
2020-09-23 09:46:52 -04:00
|
|
|
Rack,
|
2021-03-03 13:30:33 -05:00
|
|
|
'location',
|
2020-09-23 09:46:52 -04:00
|
|
|
'rack_count',
|
|
|
|
cumulative=True
|
2021-04-05 11:04:12 -04:00
|
|
|
)
|
|
|
|
locations = Location.objects.add_related_count(
|
|
|
|
locations,
|
|
|
|
Device,
|
|
|
|
'location',
|
|
|
|
'device_count',
|
|
|
|
cumulative=True
|
2020-11-19 15:59:11 -05:00
|
|
|
).restrict(request.user, 'view').filter(site=instance)
|
2022-04-07 08:21:13 +01:00
|
|
|
|
2022-03-14 23:24:29 +00:00
|
|
|
nonracked_devices = Device.objects.filter(
|
|
|
|
site=instance,
|
|
|
|
position__isnull=True,
|
|
|
|
parent_bay__isnull=True
|
|
|
|
).prefetch_related('device_type__manufacturer')
|
2017-05-18 17:00:57 -04:00
|
|
|
|
2021-11-02 12:26:06 -05:00
|
|
|
asns = ASN.objects.restrict(request.user, 'view').filter(sites=instance)
|
|
|
|
asn_count = asns.count()
|
|
|
|
|
|
|
|
stats.update({'asn_count': asn_count})
|
|
|
|
|
2020-11-19 15:59:11 -05:00
|
|
|
return {
|
2017-05-18 17:00:57 -04:00
|
|
|
'stats': stats,
|
2021-03-03 13:30:33 -05:00
|
|
|
'locations': locations,
|
2021-11-02 12:26:06 -05:00
|
|
|
'asns': asns,
|
2022-04-10 09:06:14 +01:00
|
|
|
'nonracked_devices': nonracked_devices.order_by('-pk')[:10],
|
|
|
|
'total_nonracked_devices_count': nonracked_devices.count(),
|
2020-11-19 15:59:11 -05:00
|
|
|
}
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class SiteEditView(generic.ObjectEditView):
|
2020-05-11 12:37:22 -04:00
|
|
|
queryset = Site.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.SiteForm
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class SiteDeleteView(generic.ObjectDeleteView):
|
2020-05-11 12:47:01 -04:00
|
|
|
queryset = Site.objects.all()
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class SiteBulkImportView(generic.BulkImportView):
|
2020-05-21 11:58:27 -04:00
|
|
|
queryset = Site.objects.all()
|
2017-06-02 14:49:25 -04:00
|
|
|
model_form = forms.SiteCSVForm
|
2016-05-18 16:02:53 -04:00
|
|
|
table = tables.SiteTable
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class SiteBulkEditView(generic.BulkEditView):
|
2019-08-19 01:53:39 -04:00
|
|
|
queryset = Site.objects.prefetch_related('region', 'tenant')
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.SiteFilterSet
|
2017-07-13 16:31:47 -04:00
|
|
|
table = tables.SiteTable
|
2016-07-28 15:30:29 -04:00
|
|
|
form = forms.SiteBulkEditForm
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class SiteBulkDeleteView(generic.BulkDeleteView):
|
2019-08-19 01:53:39 -04:00
|
|
|
queryset = Site.objects.prefetch_related('region', 'tenant')
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.SiteFilterSet
|
2019-05-16 20:24:55 -04:00
|
|
|
table = tables.SiteTable
|
|
|
|
|
|
|
|
|
2016-03-30 12:26:37 -04:00
|
|
|
#
|
2021-04-08 10:08:50 -04:00
|
|
|
# Locations
|
2016-03-30 12:26:37 -04:00
|
|
|
#
|
|
|
|
|
2021-03-03 13:30:33 -05:00
|
|
|
class LocationListView(generic.ObjectListView):
|
|
|
|
queryset = Location.objects.add_related_count(
|
2021-04-08 10:08:50 -04:00
|
|
|
Location.objects.add_related_count(
|
|
|
|
Location.objects.all(),
|
|
|
|
Device,
|
|
|
|
'location',
|
|
|
|
'device_count',
|
|
|
|
cumulative=True
|
|
|
|
),
|
2020-03-11 14:40:29 -04:00
|
|
|
Rack,
|
2021-03-03 13:30:33 -05:00
|
|
|
'location',
|
2020-03-11 14:40:29 -04:00
|
|
|
'rack_count',
|
|
|
|
cumulative=True
|
2020-10-30 16:52:40 -04:00
|
|
|
)
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.LocationFilterSet
|
2021-03-03 13:30:33 -05:00
|
|
|
filterset_form = forms.LocationFilterForm
|
|
|
|
table = tables.LocationTable
|
2016-03-30 12:26:37 -04:00
|
|
|
|
|
|
|
|
2021-03-26 15:07:29 -04:00
|
|
|
class LocationView(generic.ObjectView):
|
|
|
|
queryset = Location.objects.all()
|
|
|
|
|
|
|
|
def get_extra_context(self, request, instance):
|
2021-04-20 14:15:12 -04:00
|
|
|
location_ids = instance.get_descendants(include_self=True).values_list('pk', flat=True)
|
|
|
|
rack_count = Rack.objects.filter(location__in=location_ids).count()
|
|
|
|
device_count = Device.objects.filter(location__in=location_ids).count()
|
|
|
|
|
|
|
|
child_locations = Location.objects.add_related_count(
|
|
|
|
Location.objects.add_related_count(
|
|
|
|
Location.objects.all(),
|
|
|
|
Device,
|
|
|
|
'location',
|
|
|
|
'device_count',
|
|
|
|
cumulative=True
|
|
|
|
),
|
|
|
|
Rack,
|
|
|
|
'location',
|
|
|
|
'rack_count',
|
|
|
|
cumulative=True
|
|
|
|
).filter(pk__in=location_ids).exclude(pk=instance.pk)
|
2022-05-04 15:46:13 -04:00
|
|
|
child_locations_table = tables.LocationTable(child_locations, user=request.user)
|
2022-02-09 14:10:54 -05:00
|
|
|
child_locations_table.configure(request)
|
2022-04-07 08:21:13 +01:00
|
|
|
|
2022-03-14 23:24:29 +00:00
|
|
|
nonracked_devices = Device.objects.filter(
|
|
|
|
location=instance,
|
|
|
|
position__isnull=True,
|
|
|
|
parent_bay__isnull=True
|
|
|
|
).prefetch_related('device_type__manufacturer')
|
2021-03-26 15:07:29 -04:00
|
|
|
|
|
|
|
return {
|
2021-04-20 14:15:12 -04:00
|
|
|
'rack_count': rack_count,
|
|
|
|
'device_count': device_count,
|
|
|
|
'child_locations_table': child_locations_table,
|
2022-04-10 09:06:14 +01:00
|
|
|
'nonracked_devices': nonracked_devices.order_by('-pk')[:10],
|
|
|
|
'total_nonracked_devices_count': nonracked_devices.count(),
|
2021-03-26 15:07:29 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2021-03-03 13:30:33 -05:00
|
|
|
class LocationEditView(generic.ObjectEditView):
|
|
|
|
queryset = Location.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.LocationForm
|
2016-03-30 12:26:37 -04:00
|
|
|
|
|
|
|
|
2021-03-03 13:30:33 -05:00
|
|
|
class LocationDeleteView(generic.ObjectDeleteView):
|
|
|
|
queryset = Location.objects.all()
|
2020-07-01 12:08:26 -04:00
|
|
|
|
|
|
|
|
2021-03-03 13:30:33 -05:00
|
|
|
class LocationBulkImportView(generic.BulkImportView):
|
|
|
|
queryset = Location.objects.all()
|
|
|
|
model_form = forms.LocationCSVForm
|
|
|
|
table = tables.LocationTable
|
2017-07-18 02:04:54 +03:00
|
|
|
|
|
|
|
|
2021-03-12 16:14:42 -05:00
|
|
|
class LocationBulkEditView(generic.BulkEditView):
|
|
|
|
queryset = Location.objects.add_related_count(
|
|
|
|
Location.objects.all(),
|
|
|
|
Rack,
|
|
|
|
'location',
|
|
|
|
'rack_count',
|
|
|
|
cumulative=True
|
|
|
|
).prefetch_related('site')
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.LocationFilterSet
|
2021-03-12 16:14:42 -05:00
|
|
|
table = tables.LocationTable
|
|
|
|
form = forms.LocationBulkEditForm
|
|
|
|
|
|
|
|
|
2021-03-03 13:30:33 -05:00
|
|
|
class LocationBulkDeleteView(generic.BulkDeleteView):
|
|
|
|
queryset = Location.objects.add_related_count(
|
|
|
|
Location.objects.all(),
|
2020-07-20 12:07:19 -04:00
|
|
|
Rack,
|
2021-03-03 13:30:33 -05:00
|
|
|
'location',
|
2020-07-20 12:07:19 -04:00
|
|
|
'rack_count',
|
|
|
|
cumulative=True
|
|
|
|
).prefetch_related('site')
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.LocationFilterSet
|
2021-03-03 13:30:33 -05:00
|
|
|
table = tables.LocationTable
|
2016-03-30 12:26:37 -04:00
|
|
|
|
|
|
|
|
2016-08-10 11:52:27 -04:00
|
|
|
#
|
|
|
|
# Rack roles
|
|
|
|
#
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RackRoleListView(generic.ObjectListView):
|
2020-11-25 15:49:18 -05:00
|
|
|
queryset = RackRole.objects.annotate(
|
2020-12-17 14:47:49 -05:00
|
|
|
rack_count=count_related(Rack, 'role')
|
2020-11-25 15:49:18 -05:00
|
|
|
)
|
2021-09-16 16:04:46 -04:00
|
|
|
filterset = filtersets.RackRoleFilterSet
|
|
|
|
filterset_form = forms.RackRoleFilterForm
|
2016-08-10 11:52:27 -04:00
|
|
|
table = tables.RackRoleTable
|
|
|
|
|
|
|
|
|
2021-03-26 14:44:43 -04:00
|
|
|
class RackRoleView(generic.ObjectView):
|
|
|
|
queryset = RackRole.objects.all()
|
|
|
|
|
|
|
|
def get_extra_context(self, request, instance):
|
2022-06-17 14:40:37 -04:00
|
|
|
racks = Rack.objects.restrict(request.user, 'view').filter(role=instance).annotate(
|
|
|
|
device_count=count_related(Device, 'rack')
|
2021-03-26 14:44:43 -04:00
|
|
|
)
|
|
|
|
|
2022-05-04 15:46:13 -04:00
|
|
|
racks_table = tables.RackTable(racks, user=request.user, exclude=(
|
|
|
|
'role', 'get_utilization', 'get_power_utilization',
|
|
|
|
))
|
2022-02-09 14:10:54 -05:00
|
|
|
racks_table.configure(request)
|
2021-03-26 14:44:43 -04:00
|
|
|
|
|
|
|
return {
|
|
|
|
'racks_table': racks_table,
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RackRoleEditView(generic.ObjectEditView):
|
2020-05-11 12:37:22 -04:00
|
|
|
queryset = RackRole.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.RackRoleForm
|
2016-08-10 11:52:27 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RackRoleDeleteView(generic.ObjectDeleteView):
|
2020-07-01 12:08:26 -04:00
|
|
|
queryset = RackRole.objects.all()
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RackRoleBulkImportView(generic.BulkImportView):
|
2020-05-21 11:58:27 -04:00
|
|
|
queryset = RackRole.objects.all()
|
2017-10-09 15:28:46 -04:00
|
|
|
model_form = forms.RackRoleCSVForm
|
|
|
|
table = tables.RackRoleTable
|
|
|
|
|
|
|
|
|
2021-03-12 16:14:42 -05:00
|
|
|
class RackRoleBulkEditView(generic.BulkEditView):
|
|
|
|
queryset = RackRole.objects.annotate(
|
|
|
|
rack_count=count_related(Rack, 'role')
|
|
|
|
)
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.RackRoleFilterSet
|
2021-03-12 16:14:42 -05:00
|
|
|
table = tables.RackRoleTable
|
|
|
|
form = forms.RackRoleBulkEditForm
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RackRoleBulkDeleteView(generic.BulkDeleteView):
|
2020-11-25 15:49:18 -05:00
|
|
|
queryset = RackRole.objects.annotate(
|
2020-12-17 14:47:49 -05:00
|
|
|
rack_count=count_related(Rack, 'role')
|
2020-11-25 15:49:18 -05:00
|
|
|
)
|
2017-07-13 16:31:47 -04:00
|
|
|
table = tables.RackRoleTable
|
2016-08-10 11:52:27 -04:00
|
|
|
|
|
|
|
|
2016-03-01 11:23:03 -05:00
|
|
|
#
|
|
|
|
# Racks
|
|
|
|
#
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RackListView(generic.ObjectListView):
|
2022-07-11 12:45:53 -04:00
|
|
|
queryset = Rack.objects.prefetch_related('devices__device_type').annotate(
|
2020-12-17 14:47:49 -05:00
|
|
|
device_count=count_related(Device, 'rack')
|
2020-11-25 15:49:18 -05:00
|
|
|
)
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.RackFilterSet
|
2020-01-09 20:57:13 -05:00
|
|
|
filterset_form = forms.RackFilterForm
|
2021-09-17 13:55:32 -04:00
|
|
|
table = tables.RackTable
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RackElevationListView(generic.ObjectListView):
|
2017-04-20 13:07:22 -04:00
|
|
|
"""
|
|
|
|
Display a set of rack elevations side-by-side.
|
|
|
|
"""
|
2020-05-22 11:51:04 -04:00
|
|
|
queryset = Rack.objects.prefetch_related('role')
|
2017-04-20 13:07:22 -04:00
|
|
|
|
|
|
|
def get(self, request):
|
|
|
|
|
2021-04-29 16:38:56 -04:00
|
|
|
racks = filtersets.RackFilterSet(request.GET, self.queryset).qs
|
2017-04-20 13:07:22 -04:00
|
|
|
total_count = racks.count()
|
|
|
|
|
2020-09-14 14:22:21 -04:00
|
|
|
# Determine ordering
|
|
|
|
reverse = bool(request.GET.get('reverse', False))
|
|
|
|
if reverse:
|
|
|
|
racks = racks.reverse()
|
|
|
|
|
2017-04-20 13:07:22 -04:00
|
|
|
# Pagination
|
2020-10-02 13:54:57 -04:00
|
|
|
per_page = get_paginate_count(request)
|
2017-04-20 13:07:22 -04:00
|
|
|
page_number = request.GET.get('page', 1)
|
2019-03-11 12:51:03 -04:00
|
|
|
paginator = EnhancedPaginator(racks, per_page)
|
2017-04-20 13:07:22 -04:00
|
|
|
try:
|
|
|
|
page = paginator.page(page_number)
|
|
|
|
except PageNotAnInteger:
|
|
|
|
page = paginator.page(1)
|
|
|
|
except EmptyPage:
|
|
|
|
page = paginator.page(paginator.num_pages)
|
|
|
|
|
|
|
|
# Determine rack face
|
2020-01-24 15:28:15 -05:00
|
|
|
rack_face = request.GET.get('face', DeviceFaceChoices.FACE_FRONT)
|
|
|
|
if rack_face not in DeviceFaceChoices.values():
|
|
|
|
rack_face = DeviceFaceChoices.FACE_FRONT
|
2017-04-20 13:07:22 -04:00
|
|
|
|
|
|
|
return render(request, 'dcim/rack_elevation_list.html', {
|
|
|
|
'paginator': paginator,
|
|
|
|
'page': page,
|
|
|
|
'total_count': total_count,
|
2020-09-14 14:22:21 -04:00
|
|
|
'reverse': reverse,
|
2020-01-24 15:28:15 -05:00
|
|
|
'rack_face': rack_face,
|
2020-01-04 13:30:31 +00:00
|
|
|
'filter_form': forms.RackElevationFilterForm(request.GET),
|
2017-04-20 13:07:22 -04:00
|
|
|
})
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RackView(generic.ObjectView):
|
2021-03-03 13:30:33 -05:00
|
|
|
queryset = Rack.objects.prefetch_related('site__region', 'tenant__group', 'location', 'role')
|
2016-03-01 11:23:03 -05:00
|
|
|
|
2020-11-19 15:59:11 -05:00
|
|
|
def get_extra_context(self, request, instance):
|
2021-03-31 15:33:06 -04:00
|
|
|
# Get 0U devices located within the rack
|
2019-08-19 01:53:39 -04:00
|
|
|
nonracked_devices = Device.objects.filter(
|
2020-11-19 15:59:11 -05:00
|
|
|
rack=instance,
|
2021-03-31 15:33:06 -04:00
|
|
|
position__isnull=True,
|
|
|
|
parent_bay__isnull=True
|
2019-08-19 01:53:39 -04:00
|
|
|
).prefetch_related('device_type__manufacturer')
|
2020-06-16 14:53:51 -04:00
|
|
|
|
2020-11-19 15:59:11 -05:00
|
|
|
peer_racks = Rack.objects.restrict(request.user, 'view').filter(site=instance.site)
|
2020-07-21 12:57:02 -04:00
|
|
|
|
2021-03-03 13:30:33 -05:00
|
|
|
if instance.location:
|
|
|
|
peer_racks = peer_racks.filter(location=instance.location)
|
2019-10-29 15:17:00 -04:00
|
|
|
else:
|
2021-03-03 13:30:33 -05:00
|
|
|
peer_racks = peer_racks.filter(location__isnull=True)
|
2022-03-22 09:50:38 -04:00
|
|
|
next_rack = peer_racks.filter(_name__gt=instance._name).first()
|
|
|
|
prev_rack = peer_racks.filter(_name__lt=instance._name).reverse().first()
|
2017-05-18 17:00:57 -04:00
|
|
|
|
2020-11-19 15:59:11 -05:00
|
|
|
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()
|
2017-05-18 17:00:57 -04:00
|
|
|
|
2020-11-19 15:59:11 -05:00
|
|
|
return {
|
|
|
|
'device_count': device_count,
|
2017-05-18 17:00:57 -04:00
|
|
|
'reservations': reservations,
|
2019-03-12 11:36:29 -04:00
|
|
|
'power_feeds': power_feeds,
|
2017-05-18 17:00:57 -04:00
|
|
|
'nonracked_devices': nonracked_devices,
|
|
|
|
'next_rack': next_rack,
|
|
|
|
'prev_rack': prev_rack,
|
2020-11-19 15:59:11 -05:00
|
|
|
}
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RackEditView(generic.ObjectEditView):
|
2020-05-11 12:37:22 -04:00
|
|
|
queryset = Rack.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.RackForm
|
2016-05-03 16:35:11 -04:00
|
|
|
template_name = 'dcim/rack_edit.html'
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RackDeleteView(generic.ObjectDeleteView):
|
2020-05-11 12:47:01 -04:00
|
|
|
queryset = Rack.objects.all()
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RackBulkImportView(generic.BulkImportView):
|
2020-05-21 11:58:27 -04:00
|
|
|
queryset = Rack.objects.all()
|
2017-06-02 14:49:25 -04:00
|
|
|
model_form = forms.RackCSVForm
|
2018-11-01 16:03:42 -04:00
|
|
|
table = tables.RackTable
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RackBulkEditView(generic.BulkEditView):
|
2021-03-03 13:30:33 -05:00
|
|
|
queryset = Rack.objects.prefetch_related('site', 'location', 'tenant', 'role')
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.RackFilterSet
|
2017-07-13 16:31:47 -04:00
|
|
|
table = tables.RackTable
|
2016-05-18 16:02:53 -04:00
|
|
|
form = forms.RackBulkEditForm
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RackBulkDeleteView(generic.BulkDeleteView):
|
2021-03-03 13:30:33 -05:00
|
|
|
queryset = Rack.objects.prefetch_related('site', 'location', 'tenant', 'role')
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.RackFilterSet
|
2017-07-13 16:31:47 -04:00
|
|
|
table = tables.RackTable
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2017-02-16 13:46:58 -05:00
|
|
|
#
|
|
|
|
# Rack reservations
|
|
|
|
#
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RackReservationListView(generic.ObjectListView):
|
2020-10-30 16:52:40 -04:00
|
|
|
queryset = RackReservation.objects.all()
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.RackReservationFilterSet
|
2020-01-09 20:57:13 -05:00
|
|
|
filterset_form = forms.RackReservationFilterForm
|
2017-04-06 16:26:48 -04:00
|
|
|
table = tables.RackReservationTable
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RackReservationView(generic.ObjectView):
|
2020-05-21 15:39:07 -04:00
|
|
|
queryset = RackReservation.objects.prefetch_related('rack')
|
2020-03-13 13:53:44 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RackReservationEditView(generic.ObjectEditView):
|
2020-05-11 12:37:22 -04:00
|
|
|
queryset = RackReservation.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.RackReservationForm
|
2017-02-16 13:46:58 -05:00
|
|
|
|
2021-12-14 11:28:13 -05:00
|
|
|
def alter_object(self, obj, request, args, kwargs):
|
2017-02-16 13:46:58 -05:00
|
|
|
if not obj.pk:
|
2020-03-12 17:43:11 -04:00
|
|
|
if 'rack' in request.GET:
|
|
|
|
obj.rack = get_object_or_404(Rack, pk=request.GET.get('rack'))
|
2017-02-16 13:46:58 -05:00
|
|
|
obj.user = request.user
|
|
|
|
return obj
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RackReservationDeleteView(generic.ObjectDeleteView):
|
2020-05-11 12:47:01 -04:00
|
|
|
queryset = RackReservation.objects.all()
|
2017-02-16 13:46:58 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RackReservationImportView(generic.BulkImportView):
|
2020-05-21 11:58:27 -04:00
|
|
|
queryset = RackReservation.objects.all()
|
2020-03-06 17:14:26 -05:00
|
|
|
model_form = forms.RackReservationCSVForm
|
|
|
|
table = tables.RackReservationTable
|
|
|
|
|
2020-03-09 12:39:07 -04:00
|
|
|
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
|
|
|
|
|
2020-03-06 17:14:26 -05:00
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RackReservationBulkEditView(generic.BulkEditView):
|
2019-08-19 01:53:39 -04:00
|
|
|
queryset = RackReservation.objects.prefetch_related('rack', 'user')
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.RackReservationFilterSet
|
2017-10-31 13:52:35 -04:00
|
|
|
table = tables.RackReservationTable
|
|
|
|
form = forms.RackReservationBulkEditForm
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RackReservationBulkDeleteView(generic.BulkDeleteView):
|
2019-08-19 01:53:39 -04:00
|
|
|
queryset = RackReservation.objects.prefetch_related('rack', 'user')
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.RackReservationFilterSet
|
2017-07-13 16:31:47 -04:00
|
|
|
table = tables.RackReservationTable
|
2017-04-06 16:26:48 -04:00
|
|
|
|
|
|
|
|
2016-05-13 15:22:31 -04:00
|
|
|
#
|
|
|
|
# Manufacturers
|
|
|
|
#
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ManufacturerListView(generic.ObjectListView):
|
2017-12-19 16:15:26 -05:00
|
|
|
queryset = Manufacturer.objects.annotate(
|
2020-12-17 14:47:49 -05:00
|
|
|
devicetype_count=count_related(DeviceType, 'manufacturer'),
|
|
|
|
inventoryitem_count=count_related(InventoryItem, 'manufacturer'),
|
|
|
|
platform_count=count_related(Platform, 'manufacturer')
|
2017-12-19 16:15:26 -05:00
|
|
|
)
|
2021-09-16 16:04:46 -04:00
|
|
|
filterset = filtersets.ManufacturerFilterSet
|
|
|
|
filterset_form = forms.ManufacturerFilterForm
|
2016-05-18 16:02:53 -04:00
|
|
|
table = tables.ManufacturerTable
|
2016-05-13 15:22:31 -04:00
|
|
|
|
|
|
|
|
2021-03-26 14:44:43 -04:00
|
|
|
class ManufacturerView(generic.ObjectView):
|
|
|
|
queryset = Manufacturer.objects.all()
|
|
|
|
|
|
|
|
def get_extra_context(self, request, instance):
|
2022-03-07 13:44:27 -05:00
|
|
|
device_types = DeviceType.objects.restrict(request.user, 'view').filter(
|
2021-03-26 14:44:43 -04:00
|
|
|
manufacturer=instance
|
2021-04-30 10:08:15 -04:00
|
|
|
).annotate(
|
|
|
|
instance_count=count_related(Device, 'device_type')
|
2021-03-26 14:44:43 -04:00
|
|
|
)
|
2022-03-07 13:44:27 -05:00
|
|
|
module_types = ModuleType.objects.restrict(request.user, 'view').filter(
|
|
|
|
manufacturer=instance
|
|
|
|
)
|
2021-07-28 10:25:52 -04:00
|
|
|
inventory_items = InventoryItem.objects.restrict(request.user, 'view').filter(
|
|
|
|
manufacturer=instance
|
|
|
|
)
|
2021-03-26 14:44:43 -04:00
|
|
|
|
2022-05-04 15:46:13 -04:00
|
|
|
devicetypes_table = tables.DeviceTypeTable(device_types, user=request.user, exclude=('manufacturer',))
|
2022-02-09 14:10:54 -05:00
|
|
|
devicetypes_table.configure(request)
|
2021-03-26 14:44:43 -04:00
|
|
|
|
|
|
|
return {
|
|
|
|
'devicetypes_table': devicetypes_table,
|
2021-07-28 10:25:52 -04:00
|
|
|
'inventory_item_count': inventory_items.count(),
|
2022-03-07 13:44:27 -05:00
|
|
|
'module_type_count': module_types.count(),
|
2021-03-26 14:44:43 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ManufacturerEditView(generic.ObjectEditView):
|
2020-05-11 12:37:22 -04:00
|
|
|
queryset = Manufacturer.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.ManufacturerForm
|
2016-05-13 15:22:31 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ManufacturerDeleteView(generic.ObjectDeleteView):
|
2020-07-01 12:08:26 -04:00
|
|
|
queryset = Manufacturer.objects.all()
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ManufacturerBulkImportView(generic.BulkImportView):
|
2020-05-21 11:58:27 -04:00
|
|
|
queryset = Manufacturer.objects.all()
|
2017-07-18 02:37:28 +03:00
|
|
|
model_form = forms.ManufacturerCSVForm
|
|
|
|
table = tables.ManufacturerTable
|
|
|
|
|
|
|
|
|
2021-03-12 16:14:42 -05:00
|
|
|
class ManufacturerBulkEditView(generic.BulkEditView):
|
|
|
|
queryset = Manufacturer.objects.annotate(
|
|
|
|
devicetype_count=count_related(DeviceType, 'manufacturer')
|
|
|
|
)
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.ManufacturerFilterSet
|
2021-03-12 16:14:42 -05:00
|
|
|
table = tables.ManufacturerTable
|
|
|
|
form = forms.ManufacturerBulkEditForm
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ManufacturerBulkDeleteView(generic.BulkDeleteView):
|
2020-07-20 12:07:19 -04:00
|
|
|
queryset = Manufacturer.objects.annotate(
|
2020-12-17 14:47:49 -05:00
|
|
|
devicetype_count=count_related(DeviceType, 'manufacturer')
|
2020-11-25 15:49:18 -05:00
|
|
|
)
|
2017-07-13 16:31:47 -04:00
|
|
|
table = tables.ManufacturerTable
|
2016-05-13 15:22:31 -04:00
|
|
|
|
|
|
|
|
2016-03-04 14:39:39 -05:00
|
|
|
#
|
|
|
|
# Device types
|
|
|
|
#
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceTypeListView(generic.ObjectListView):
|
2020-07-20 12:07:19 -04:00
|
|
|
queryset = DeviceType.objects.prefetch_related('manufacturer').annotate(
|
2020-12-17 14:47:49 -05:00
|
|
|
instance_count=count_related(Device, 'device_type')
|
2020-11-25 15:49:18 -05:00
|
|
|
)
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.DeviceTypeFilterSet
|
2020-01-09 20:57:13 -05:00
|
|
|
filterset_form = forms.DeviceTypeFilterForm
|
2017-07-13 17:39:28 -04:00
|
|
|
table = tables.DeviceTypeTable
|
2016-03-04 14:39:39 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceTypeView(generic.ObjectView):
|
2020-05-21 15:39:07 -04:00
|
|
|
queryset = DeviceType.objects.prefetch_related('manufacturer')
|
2016-03-04 14:39:39 -05:00
|
|
|
|
2020-11-19 15:59:11 -05:00
|
|
|
def get_extra_context(self, request, instance):
|
|
|
|
instance_count = Device.objects.restrict(request.user).filter(device_type=instance).count()
|
2017-05-18 17:00:57 -04:00
|
|
|
|
2020-11-19 15:59:11 -05:00
|
|
|
return {
|
2020-06-26 12:22:02 -04:00
|
|
|
'instance_count': instance_count,
|
2020-11-19 15:59:11 -05:00
|
|
|
}
|
2016-03-04 14:39:39 -05:00
|
|
|
|
|
|
|
|
2021-10-20 15:04:40 -04:00
|
|
|
class DeviceTypeConsolePortsView(DeviceTypeComponentsView):
|
2021-12-14 13:41:01 -05:00
|
|
|
child_model = ConsolePortTemplate
|
2021-10-20 15:04:40 -04:00
|
|
|
table = tables.ConsolePortTemplateTable
|
2021-12-14 15:31:42 -05:00
|
|
|
filterset = filtersets.ConsolePortTemplateFilterSet
|
2021-12-21 10:28:28 -05:00
|
|
|
viewname = 'dcim:devicetype_consoleports'
|
2021-10-20 15:04:40 -04:00
|
|
|
|
|
|
|
|
|
|
|
class DeviceTypeConsoleServerPortsView(DeviceTypeComponentsView):
|
2021-12-14 13:41:01 -05:00
|
|
|
child_model = ConsoleServerPortTemplate
|
2021-10-20 15:04:40 -04:00
|
|
|
table = tables.ConsoleServerPortTemplateTable
|
2021-12-14 15:31:42 -05:00
|
|
|
filterset = filtersets.ConsoleServerPortTemplateFilterSet
|
2021-12-21 10:28:28 -05:00
|
|
|
viewname = 'dcim:devicetype_consoleserverports'
|
2021-10-20 15:04:40 -04:00
|
|
|
|
|
|
|
|
|
|
|
class DeviceTypePowerPortsView(DeviceTypeComponentsView):
|
2021-12-14 13:41:01 -05:00
|
|
|
child_model = PowerPortTemplate
|
2021-10-20 15:04:40 -04:00
|
|
|
table = tables.PowerPortTemplateTable
|
2021-12-14 15:31:42 -05:00
|
|
|
filterset = filtersets.PowerPortTemplateFilterSet
|
2021-12-21 10:28:28 -05:00
|
|
|
viewname = 'dcim:devicetype_powerports'
|
2021-10-20 15:04:40 -04:00
|
|
|
|
|
|
|
|
|
|
|
class DeviceTypePowerOutletsView(DeviceTypeComponentsView):
|
2021-12-14 13:41:01 -05:00
|
|
|
child_model = PowerOutletTemplate
|
2021-10-20 15:04:40 -04:00
|
|
|
table = tables.PowerOutletTemplateTable
|
2021-12-14 15:31:42 -05:00
|
|
|
filterset = filtersets.PowerOutletTemplateFilterSet
|
2021-12-21 10:28:28 -05:00
|
|
|
viewname = 'dcim:devicetype_poweroutlets'
|
2021-10-20 15:04:40 -04:00
|
|
|
|
|
|
|
|
|
|
|
class DeviceTypeInterfacesView(DeviceTypeComponentsView):
|
2021-12-14 13:41:01 -05:00
|
|
|
child_model = InterfaceTemplate
|
2021-10-20 15:04:40 -04:00
|
|
|
table = tables.InterfaceTemplateTable
|
2021-12-14 15:31:42 -05:00
|
|
|
filterset = filtersets.InterfaceTemplateFilterSet
|
2021-12-21 10:28:28 -05:00
|
|
|
viewname = 'dcim:devicetype_interfaces'
|
2021-10-20 15:04:40 -04:00
|
|
|
|
|
|
|
|
|
|
|
class DeviceTypeFrontPortsView(DeviceTypeComponentsView):
|
2021-12-14 13:41:01 -05:00
|
|
|
child_model = FrontPortTemplate
|
2021-10-20 15:04:40 -04:00
|
|
|
table = tables.FrontPortTemplateTable
|
2021-12-14 15:31:42 -05:00
|
|
|
filterset = filtersets.FrontPortTemplateFilterSet
|
2021-12-21 10:28:28 -05:00
|
|
|
viewname = 'dcim:devicetype_frontports'
|
2021-10-20 15:04:40 -04:00
|
|
|
|
|
|
|
|
|
|
|
class DeviceTypeRearPortsView(DeviceTypeComponentsView):
|
2021-12-14 13:41:01 -05:00
|
|
|
child_model = RearPortTemplate
|
2021-10-20 15:04:40 -04:00
|
|
|
table = tables.RearPortTemplateTable
|
2021-12-14 15:31:42 -05:00
|
|
|
filterset = filtersets.RearPortTemplateFilterSet
|
2021-12-21 10:28:28 -05:00
|
|
|
viewname = 'dcim:devicetype_rearports'
|
2021-10-20 15:04:40 -04:00
|
|
|
|
|
|
|
|
2021-12-17 09:35:57 -05:00
|
|
|
class DeviceTypeModuleBaysView(DeviceTypeComponentsView):
|
|
|
|
child_model = ModuleBayTemplate
|
|
|
|
table = tables.ModuleBayTemplateTable
|
|
|
|
filterset = filtersets.ModuleBayTemplateFilterSet
|
2022-02-18 11:56:49 -05:00
|
|
|
viewname = 'dcim:devicetype_modulebays'
|
2021-12-17 09:35:57 -05:00
|
|
|
|
|
|
|
|
2021-10-20 15:04:40 -04:00
|
|
|
class DeviceTypeDeviceBaysView(DeviceTypeComponentsView):
|
2021-12-14 13:41:01 -05:00
|
|
|
child_model = DeviceBayTemplate
|
2021-10-20 15:04:40 -04:00
|
|
|
table = tables.DeviceBayTemplateTable
|
2021-12-14 15:31:42 -05:00
|
|
|
filterset = filtersets.DeviceBayTemplateFilterSet
|
2021-12-21 10:28:28 -05:00
|
|
|
viewname = 'dcim:devicetype_devicebays'
|
2021-10-20 15:04:40 -04:00
|
|
|
|
|
|
|
|
2021-12-29 15:02:25 -05:00
|
|
|
class DeviceTypeInventoryItemsView(DeviceTypeComponentsView):
|
|
|
|
child_model = InventoryItemTemplate
|
|
|
|
table = tables.InventoryItemTemplateTable
|
|
|
|
filterset = filtersets.InventoryItemTemplateFilterSet
|
|
|
|
viewname = 'dcim:devicetype_inventoryitems'
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceTypeEditView(generic.ObjectEditView):
|
2020-05-11 12:37:22 -04:00
|
|
|
queryset = DeviceType.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.DeviceTypeForm
|
2016-03-04 14:39:39 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceTypeDeleteView(generic.ObjectDeleteView):
|
2020-05-11 12:47:01 -04:00
|
|
|
queryset = DeviceType.objects.all()
|
2016-03-04 14:39:39 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceTypeImportView(generic.ObjectImportView):
|
2020-06-02 14:19:08 -04:00
|
|
|
additional_permissions = [
|
2019-10-01 16:54:10 -04:00
|
|
|
'dcim.add_devicetype',
|
|
|
|
'dcim.add_consoleporttemplate',
|
|
|
|
'dcim.add_consoleserverporttemplate',
|
|
|
|
'dcim.add_powerporttemplate',
|
|
|
|
'dcim.add_poweroutlettemplate',
|
|
|
|
'dcim.add_interfacetemplate',
|
|
|
|
'dcim.add_frontporttemplate',
|
|
|
|
'dcim.add_rearporttemplate',
|
2021-12-17 09:35:57 -05:00
|
|
|
'dcim.add_modulebaytemplate',
|
2019-10-01 16:54:10 -04:00
|
|
|
'dcim.add_devicebaytemplate',
|
2021-12-29 15:02:25 -05:00
|
|
|
'dcim.add_inventoryitemtemplate',
|
2019-10-01 16:54:10 -04:00
|
|
|
]
|
2020-06-02 14:19:08 -04:00
|
|
|
queryset = DeviceType.objects.all()
|
2019-09-05 17:23:56 -04:00
|
|
|
model_form = forms.DeviceTypeImportForm
|
2019-09-27 16:51:12 -04:00
|
|
|
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),
|
2021-12-17 09:35:57 -05:00
|
|
|
('module-bays', forms.ModuleBayTemplateImportForm),
|
2019-09-27 16:51:12 -04:00
|
|
|
('device-bays', forms.DeviceBayTemplateImportForm),
|
2021-12-29 15:02:25 -05:00
|
|
|
('inventory-items', forms.InventoryItemTemplateImportForm),
|
2019-09-27 16:51:12 -04:00
|
|
|
))
|
2017-07-18 04:50:24 +03:00
|
|
|
|
2021-12-17 13:28:17 -05:00
|
|
|
def prep_related_object_data(self, parent, data):
|
|
|
|
data.update({'device_type': parent})
|
|
|
|
return data
|
|
|
|
|
2017-07-18 04:50:24 +03:00
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceTypeBulkEditView(generic.BulkEditView):
|
2020-07-20 12:07:19 -04:00
|
|
|
queryset = DeviceType.objects.prefetch_related('manufacturer').annotate(
|
2020-12-17 14:47:49 -05:00
|
|
|
instance_count=count_related(Device, 'device_type')
|
2020-11-25 15:49:18 -05:00
|
|
|
)
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.DeviceTypeFilterSet
|
2017-07-13 16:31:47 -04:00
|
|
|
table = tables.DeviceTypeTable
|
2016-05-18 16:02:53 -04:00
|
|
|
form = forms.DeviceTypeBulkEditForm
|
2016-03-04 14:39:39 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceTypeBulkDeleteView(generic.BulkDeleteView):
|
2020-07-20 12:07:19 -04:00
|
|
|
queryset = DeviceType.objects.prefetch_related('manufacturer').annotate(
|
2020-12-17 14:47:49 -05:00
|
|
|
instance_count=count_related(Device, 'device_type')
|
2020-11-25 15:49:18 -05:00
|
|
|
)
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.DeviceTypeFilterSet
|
2017-07-13 16:31:47 -04:00
|
|
|
table = tables.DeviceTypeTable
|
2016-03-04 14:39:39 -05:00
|
|
|
|
|
|
|
|
2021-12-17 12:18:37 -05:00
|
|
|
#
|
|
|
|
# Module types
|
|
|
|
#
|
|
|
|
|
|
|
|
class ModuleTypeListView(generic.ObjectListView):
|
|
|
|
queryset = ModuleType.objects.prefetch_related('manufacturer').annotate(
|
2022-04-06 13:46:31 -05:00
|
|
|
instance_count=count_related(Module, 'module_type')
|
2021-12-17 12:18:37 -05:00
|
|
|
)
|
|
|
|
filterset = filtersets.ModuleTypeFilterSet
|
|
|
|
filterset_form = forms.ModuleTypeFilterForm
|
|
|
|
table = tables.ModuleTypeTable
|
|
|
|
|
|
|
|
|
|
|
|
class ModuleTypeView(generic.ObjectView):
|
|
|
|
queryset = ModuleType.objects.prefetch_related('manufacturer')
|
|
|
|
|
|
|
|
def get_extra_context(self, request, instance):
|
2022-02-07 16:50:17 -05:00
|
|
|
instance_count = Module.objects.restrict(request.user).filter(module_type=instance).count()
|
2021-12-17 12:18:37 -05:00
|
|
|
|
|
|
|
return {
|
2022-02-07 16:50:17 -05:00
|
|
|
'instance_count': instance_count,
|
2021-12-17 12:18:37 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class ModuleTypeConsolePortsView(ModuleTypeComponentsView):
|
|
|
|
child_model = ConsolePortTemplate
|
|
|
|
table = tables.ConsolePortTemplateTable
|
|
|
|
filterset = filtersets.ConsolePortTemplateFilterSet
|
2022-02-18 11:56:49 -05:00
|
|
|
viewname = 'dcim:moduletype_consoleports'
|
2021-12-17 12:18:37 -05:00
|
|
|
|
|
|
|
|
|
|
|
class ModuleTypeConsoleServerPortsView(ModuleTypeComponentsView):
|
|
|
|
child_model = ConsoleServerPortTemplate
|
|
|
|
table = tables.ConsoleServerPortTemplateTable
|
|
|
|
filterset = filtersets.ConsoleServerPortTemplateFilterSet
|
2022-02-18 11:56:49 -05:00
|
|
|
viewname = 'dcim:moduletype_consoleserverports'
|
2021-12-17 12:18:37 -05:00
|
|
|
|
|
|
|
|
|
|
|
class ModuleTypePowerPortsView(ModuleTypeComponentsView):
|
|
|
|
child_model = PowerPortTemplate
|
|
|
|
table = tables.PowerPortTemplateTable
|
|
|
|
filterset = filtersets.PowerPortTemplateFilterSet
|
2022-02-18 11:56:49 -05:00
|
|
|
viewname = 'dcim:moduletype_powerports'
|
2021-12-17 12:18:37 -05:00
|
|
|
|
|
|
|
|
|
|
|
class ModuleTypePowerOutletsView(ModuleTypeComponentsView):
|
|
|
|
child_model = PowerOutletTemplate
|
|
|
|
table = tables.PowerOutletTemplateTable
|
|
|
|
filterset = filtersets.PowerOutletTemplateFilterSet
|
2022-02-18 11:56:49 -05:00
|
|
|
viewname = 'dcim:moduletype_poweroutlets'
|
2021-12-17 12:18:37 -05:00
|
|
|
|
|
|
|
|
|
|
|
class ModuleTypeInterfacesView(ModuleTypeComponentsView):
|
|
|
|
child_model = InterfaceTemplate
|
|
|
|
table = tables.InterfaceTemplateTable
|
|
|
|
filterset = filtersets.InterfaceTemplateFilterSet
|
2022-02-18 11:56:49 -05:00
|
|
|
viewname = 'dcim:moduletype_interfaces'
|
2021-12-17 12:18:37 -05:00
|
|
|
|
|
|
|
|
|
|
|
class ModuleTypeFrontPortsView(ModuleTypeComponentsView):
|
|
|
|
child_model = FrontPortTemplate
|
|
|
|
table = tables.FrontPortTemplateTable
|
|
|
|
filterset = filtersets.FrontPortTemplateFilterSet
|
2022-02-18 11:56:49 -05:00
|
|
|
viewname = 'dcim:moduletype_frontports'
|
2021-12-17 12:18:37 -05:00
|
|
|
|
|
|
|
|
|
|
|
class ModuleTypeRearPortsView(ModuleTypeComponentsView):
|
|
|
|
child_model = RearPortTemplate
|
|
|
|
table = tables.RearPortTemplateTable
|
|
|
|
filterset = filtersets.RearPortTemplateFilterSet
|
2022-02-18 11:56:49 -05:00
|
|
|
viewname = 'dcim:moduletype_rearports'
|
2021-12-17 12:18:37 -05:00
|
|
|
|
|
|
|
|
|
|
|
class ModuleTypeEditView(generic.ObjectEditView):
|
|
|
|
queryset = ModuleType.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.ModuleTypeForm
|
2021-12-17 12:18:37 -05:00
|
|
|
|
|
|
|
|
|
|
|
class ModuleTypeDeleteView(generic.ObjectDeleteView):
|
|
|
|
queryset = ModuleType.objects.all()
|
|
|
|
|
|
|
|
|
|
|
|
class ModuleTypeImportView(generic.ObjectImportView):
|
|
|
|
additional_permissions = [
|
|
|
|
'dcim.add_moduletype',
|
|
|
|
'dcim.add_consoleporttemplate',
|
|
|
|
'dcim.add_consoleserverporttemplate',
|
|
|
|
'dcim.add_powerporttemplate',
|
|
|
|
'dcim.add_poweroutlettemplate',
|
|
|
|
'dcim.add_interfacetemplate',
|
|
|
|
'dcim.add_frontporttemplate',
|
|
|
|
'dcim.add_rearporttemplate',
|
|
|
|
]
|
|
|
|
queryset = ModuleType.objects.all()
|
|
|
|
model_form = forms.ModuleTypeImportForm
|
|
|
|
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),
|
|
|
|
))
|
|
|
|
|
2021-12-17 13:28:17 -05:00
|
|
|
def prep_related_object_data(self, parent, data):
|
|
|
|
data.update({'module_type': parent})
|
|
|
|
return data
|
|
|
|
|
2021-12-17 12:18:37 -05:00
|
|
|
|
|
|
|
class ModuleTypeBulkEditView(generic.BulkEditView):
|
|
|
|
queryset = ModuleType.objects.prefetch_related('manufacturer').annotate(
|
2022-04-06 13:46:31 -05:00
|
|
|
instance_count=count_related(Module, 'module_type')
|
2021-12-17 12:18:37 -05:00
|
|
|
)
|
|
|
|
filterset = filtersets.ModuleTypeFilterSet
|
|
|
|
table = tables.ModuleTypeTable
|
|
|
|
form = forms.ModuleTypeBulkEditForm
|
|
|
|
|
|
|
|
|
|
|
|
class ModuleTypeBulkDeleteView(generic.BulkDeleteView):
|
|
|
|
queryset = ModuleType.objects.prefetch_related('manufacturer').annotate(
|
2022-04-06 13:46:31 -05:00
|
|
|
instance_count=count_related(Module, 'module_type')
|
2021-12-17 12:18:37 -05:00
|
|
|
)
|
|
|
|
filterset = filtersets.ModuleTypeFilterSet
|
|
|
|
table = tables.ModuleTypeTable
|
|
|
|
|
|
|
|
|
2016-03-04 23:09:32 -05:00
|
|
|
#
|
2020-02-10 11:43:51 -05:00
|
|
|
# Console port templates
|
2016-03-04 23:09:32 -05:00
|
|
|
#
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ConsolePortTemplateCreateView(generic.ComponentCreateView):
|
2020-05-21 16:28:11 -04:00
|
|
|
queryset = ConsolePortTemplate.objects.all()
|
2022-02-18 11:56:49 -05:00
|
|
|
form = forms.ModularComponentTemplateCreateForm
|
2016-12-21 17:20:27 -05:00
|
|
|
model_form = forms.ConsolePortTemplateForm
|
2022-02-18 11:56:49 -05:00
|
|
|
template_name = 'dcim/component_template_create.html'
|
2016-03-04 16:41:24 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ConsolePortTemplateEditView(generic.ObjectEditView):
|
2020-05-11 12:37:22 -04:00
|
|
|
queryset = ConsolePortTemplate.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.ConsolePortTemplateForm
|
2019-10-07 17:08:51 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ConsolePortTemplateDeleteView(generic.ObjectDeleteView):
|
2020-05-11 12:47:01 -04:00
|
|
|
queryset = ConsolePortTemplate.objects.all()
|
2020-02-10 11:43:51 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ConsolePortTemplateBulkEditView(generic.BulkEditView):
|
2020-02-06 15:29:10 -05:00
|
|
|
queryset = ConsolePortTemplate.objects.all()
|
|
|
|
table = tables.ConsolePortTemplateTable
|
|
|
|
form = forms.ConsolePortTemplateBulkEditForm
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ConsolePortTemplateBulkRenameView(generic.BulkRenameView):
|
2020-07-02 13:58:53 -04:00
|
|
|
queryset = ConsolePortTemplate.objects.all()
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ConsolePortTemplateBulkDeleteView(generic.BulkDeleteView):
|
2018-07-20 21:18:10 -04:00
|
|
|
queryset = ConsolePortTemplate.objects.all()
|
2017-07-13 16:31:47 -04:00
|
|
|
table = tables.ConsolePortTemplateTable
|
2016-07-25 16:32:07 -04:00
|
|
|
|
|
|
|
|
2020-02-10 11:43:51 -05:00
|
|
|
#
|
|
|
|
# Console server port templates
|
|
|
|
#
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ConsoleServerPortTemplateCreateView(generic.ComponentCreateView):
|
2020-05-21 16:28:11 -04:00
|
|
|
queryset = ConsoleServerPortTemplate.objects.all()
|
2022-02-18 11:56:49 -05:00
|
|
|
form = forms.ModularComponentTemplateCreateForm
|
2016-12-21 17:20:27 -05:00
|
|
|
model_form = forms.ConsoleServerPortTemplateForm
|
2022-02-18 11:56:49 -05:00
|
|
|
template_name = 'dcim/component_template_create.html'
|
2016-03-04 16:41:24 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ConsoleServerPortTemplateEditView(generic.ObjectEditView):
|
2020-05-11 12:37:22 -04:00
|
|
|
queryset = ConsoleServerPortTemplate.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.ConsoleServerPortTemplateForm
|
2019-10-07 17:08:51 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ConsoleServerPortTemplateDeleteView(generic.ObjectDeleteView):
|
2020-05-11 12:47:01 -04:00
|
|
|
queryset = ConsoleServerPortTemplate.objects.all()
|
2020-02-10 11:43:51 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ConsoleServerPortTemplateBulkEditView(generic.BulkEditView):
|
2020-02-06 15:29:10 -05:00
|
|
|
queryset = ConsoleServerPortTemplate.objects.all()
|
|
|
|
table = tables.ConsoleServerPortTemplateTable
|
|
|
|
form = forms.ConsoleServerPortTemplateBulkEditForm
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ConsoleServerPortTemplateBulkRenameView(generic.BulkRenameView):
|
2020-07-02 13:58:53 -04:00
|
|
|
queryset = ConsoleServerPortTemplate.objects.all()
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ConsoleServerPortTemplateBulkDeleteView(generic.BulkDeleteView):
|
2018-07-20 21:18:10 -04:00
|
|
|
queryset = ConsoleServerPortTemplate.objects.all()
|
2017-07-13 16:31:47 -04:00
|
|
|
table = tables.ConsoleServerPortTemplateTable
|
2016-07-25 16:32:07 -04:00
|
|
|
|
|
|
|
|
2020-02-10 11:43:51 -05:00
|
|
|
#
|
|
|
|
# Power port templates
|
|
|
|
#
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerPortTemplateCreateView(generic.ComponentCreateView):
|
2020-05-21 16:28:11 -04:00
|
|
|
queryset = PowerPortTemplate.objects.all()
|
2022-02-18 11:56:49 -05:00
|
|
|
form = forms.ModularComponentTemplateCreateForm
|
2016-12-21 17:20:27 -05:00
|
|
|
model_form = forms.PowerPortTemplateForm
|
2022-02-18 11:56:49 -05:00
|
|
|
template_name = 'dcim/component_template_create.html'
|
2016-03-04 16:41:24 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerPortTemplateEditView(generic.ObjectEditView):
|
2020-05-11 12:37:22 -04:00
|
|
|
queryset = PowerPortTemplate.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.PowerPortTemplateForm
|
2019-10-07 17:08:51 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerPortTemplateDeleteView(generic.ObjectDeleteView):
|
2020-05-11 12:47:01 -04:00
|
|
|
queryset = PowerPortTemplate.objects.all()
|
2020-02-10 11:43:51 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerPortTemplateBulkEditView(generic.BulkEditView):
|
2020-02-06 15:29:10 -05:00
|
|
|
queryset = PowerPortTemplate.objects.all()
|
|
|
|
table = tables.PowerPortTemplateTable
|
|
|
|
form = forms.PowerPortTemplateBulkEditForm
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerPortTemplateBulkRenameView(generic.BulkRenameView):
|
2020-07-02 13:58:53 -04:00
|
|
|
queryset = PowerPortTemplate.objects.all()
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerPortTemplateBulkDeleteView(generic.BulkDeleteView):
|
2018-07-20 21:18:10 -04:00
|
|
|
queryset = PowerPortTemplate.objects.all()
|
2017-07-13 16:31:47 -04:00
|
|
|
table = tables.PowerPortTemplateTable
|
2016-07-25 16:32:07 -04:00
|
|
|
|
|
|
|
|
2020-02-10 11:43:51 -05:00
|
|
|
#
|
|
|
|
# Power outlet templates
|
|
|
|
#
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerOutletTemplateCreateView(generic.ComponentCreateView):
|
2020-05-21 16:28:11 -04:00
|
|
|
queryset = PowerOutletTemplate.objects.all()
|
2022-02-18 11:56:49 -05:00
|
|
|
form = forms.ModularComponentTemplateCreateForm
|
2016-12-21 17:20:27 -05:00
|
|
|
model_form = forms.PowerOutletTemplateForm
|
2022-02-18 11:56:49 -05:00
|
|
|
template_name = 'dcim/component_template_create.html'
|
2016-03-04 16:41:24 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerOutletTemplateEditView(generic.ObjectEditView):
|
2020-05-11 12:37:22 -04:00
|
|
|
queryset = PowerOutletTemplate.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.PowerOutletTemplateForm
|
2019-10-07 17:08:51 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerOutletTemplateDeleteView(generic.ObjectDeleteView):
|
2020-05-11 12:47:01 -04:00
|
|
|
queryset = PowerOutletTemplate.objects.all()
|
2020-02-10 11:43:51 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerOutletTemplateBulkEditView(generic.BulkEditView):
|
2020-02-06 15:29:10 -05:00
|
|
|
queryset = PowerOutletTemplate.objects.all()
|
|
|
|
table = tables.PowerOutletTemplateTable
|
|
|
|
form = forms.PowerOutletTemplateBulkEditForm
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerOutletTemplateBulkRenameView(generic.BulkRenameView):
|
2020-07-02 13:58:53 -04:00
|
|
|
queryset = PowerOutletTemplate.objects.all()
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerOutletTemplateBulkDeleteView(generic.BulkDeleteView):
|
2018-07-20 21:18:10 -04:00
|
|
|
queryset = PowerOutletTemplate.objects.all()
|
2017-07-13 16:31:47 -04:00
|
|
|
table = tables.PowerOutletTemplateTable
|
2016-07-25 16:32:07 -04:00
|
|
|
|
|
|
|
|
2020-02-10 11:43:51 -05:00
|
|
|
#
|
|
|
|
# Interface templates
|
|
|
|
#
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class InterfaceTemplateCreateView(generic.ComponentCreateView):
|
2020-05-21 16:28:11 -04:00
|
|
|
queryset = InterfaceTemplate.objects.all()
|
2022-02-18 11:56:49 -05:00
|
|
|
form = forms.ModularComponentTemplateCreateForm
|
2016-12-21 17:20:27 -05:00
|
|
|
model_form = forms.InterfaceTemplateForm
|
2022-02-18 11:56:49 -05:00
|
|
|
template_name = 'dcim/component_template_create.html'
|
2016-03-04 16:41:24 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class InterfaceTemplateEditView(generic.ObjectEditView):
|
2020-05-11 12:37:22 -04:00
|
|
|
queryset = InterfaceTemplate.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.InterfaceTemplateForm
|
2019-10-07 17:08:51 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class InterfaceTemplateDeleteView(generic.ObjectDeleteView):
|
2020-05-11 12:47:01 -04:00
|
|
|
queryset = InterfaceTemplate.objects.all()
|
2020-02-10 11:43:51 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class InterfaceTemplateBulkEditView(generic.BulkEditView):
|
2018-07-20 21:18:10 -04:00
|
|
|
queryset = InterfaceTemplate.objects.all()
|
2017-07-13 16:31:47 -04:00
|
|
|
table = tables.InterfaceTemplateTable
|
2016-10-19 12:15:54 -04:00
|
|
|
form = forms.InterfaceTemplateBulkEditForm
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class InterfaceTemplateBulkRenameView(generic.BulkRenameView):
|
2020-07-02 13:58:53 -04:00
|
|
|
queryset = InterfaceTemplate.objects.all()
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class InterfaceTemplateBulkDeleteView(generic.BulkDeleteView):
|
2018-07-20 21:18:10 -04:00
|
|
|
queryset = InterfaceTemplate.objects.all()
|
2017-07-13 16:31:47 -04:00
|
|
|
table = tables.InterfaceTemplateTable
|
2016-07-25 16:32:07 -04:00
|
|
|
|
|
|
|
|
2020-02-10 11:43:51 -05:00
|
|
|
#
|
|
|
|
# Front port templates
|
|
|
|
#
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class FrontPortTemplateCreateView(generic.ComponentCreateView):
|
2020-05-21 16:28:11 -04:00
|
|
|
queryset = FrontPortTemplate.objects.all()
|
2021-12-28 09:53:56 -05:00
|
|
|
form = forms.FrontPortTemplateCreateForm
|
2018-10-25 12:08:13 -04:00
|
|
|
model_form = forms.FrontPortTemplateForm
|
2022-02-18 11:56:49 -05:00
|
|
|
template_name = 'dcim/frontporttemplate_create.html'
|
2018-10-03 14:04:16 -04:00
|
|
|
|
2021-12-28 09:53:56 -05:00
|
|
|
def initialize_forms(self, request):
|
|
|
|
form, model_form = super().initialize_forms(request)
|
|
|
|
|
|
|
|
model_form.fields.pop('rear_port')
|
|
|
|
model_form.fields.pop('rear_port_position')
|
|
|
|
|
|
|
|
return form, model_form
|
|
|
|
|
2018-10-03 14:04:16 -04:00
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class FrontPortTemplateEditView(generic.ObjectEditView):
|
2020-05-11 12:37:22 -04:00
|
|
|
queryset = FrontPortTemplate.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.FrontPortTemplateForm
|
2019-10-07 17:08:51 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class FrontPortTemplateDeleteView(generic.ObjectDeleteView):
|
2020-05-11 12:47:01 -04:00
|
|
|
queryset = FrontPortTemplate.objects.all()
|
2020-02-10 11:43:51 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class FrontPortTemplateBulkEditView(generic.BulkEditView):
|
2020-02-06 15:29:10 -05:00
|
|
|
queryset = FrontPortTemplate.objects.all()
|
|
|
|
table = tables.FrontPortTemplateTable
|
|
|
|
form = forms.FrontPortTemplateBulkEditForm
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class FrontPortTemplateBulkRenameView(generic.BulkRenameView):
|
2020-07-02 13:58:53 -04:00
|
|
|
queryset = FrontPortTemplate.objects.all()
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class FrontPortTemplateBulkDeleteView(generic.BulkDeleteView):
|
2018-10-25 12:08:13 -04:00
|
|
|
queryset = FrontPortTemplate.objects.all()
|
|
|
|
table = tables.FrontPortTemplateTable
|
2018-10-03 14:04:16 -04:00
|
|
|
|
|
|
|
|
2020-02-10 11:43:51 -05:00
|
|
|
#
|
|
|
|
# Rear port templates
|
|
|
|
#
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RearPortTemplateCreateView(generic.ComponentCreateView):
|
2020-05-21 16:28:11 -04:00
|
|
|
queryset = RearPortTemplate.objects.all()
|
2022-02-18 11:56:49 -05:00
|
|
|
form = forms.ModularComponentTemplateCreateForm
|
2018-10-25 12:08:13 -04:00
|
|
|
model_form = forms.RearPortTemplateForm
|
2022-02-18 11:56:49 -05:00
|
|
|
template_name = 'dcim/component_template_create.html'
|
2018-10-03 14:04:16 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RearPortTemplateEditView(generic.ObjectEditView):
|
2020-05-11 12:37:22 -04:00
|
|
|
queryset = RearPortTemplate.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.RearPortTemplateForm
|
2019-10-07 17:08:51 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RearPortTemplateDeleteView(generic.ObjectDeleteView):
|
2020-05-11 12:47:01 -04:00
|
|
|
queryset = RearPortTemplate.objects.all()
|
2020-02-10 11:43:51 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RearPortTemplateBulkEditView(generic.BulkEditView):
|
2020-02-06 15:29:10 -05:00
|
|
|
queryset = RearPortTemplate.objects.all()
|
|
|
|
table = tables.RearPortTemplateTable
|
|
|
|
form = forms.RearPortTemplateBulkEditForm
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RearPortTemplateBulkRenameView(generic.BulkRenameView):
|
2020-07-02 13:58:53 -04:00
|
|
|
queryset = RearPortTemplate.objects.all()
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RearPortTemplateBulkDeleteView(generic.BulkDeleteView):
|
2018-10-25 12:08:13 -04:00
|
|
|
queryset = RearPortTemplate.objects.all()
|
|
|
|
table = tables.RearPortTemplateTable
|
2018-10-03 14:04:16 -04:00
|
|
|
|
|
|
|
|
2021-12-17 09:35:57 -05:00
|
|
|
#
|
|
|
|
# Module bay templates
|
|
|
|
#
|
|
|
|
|
|
|
|
class ModuleBayTemplateCreateView(generic.ComponentCreateView):
|
|
|
|
queryset = ModuleBayTemplate.objects.all()
|
2022-02-23 13:02:14 -05:00
|
|
|
form = forms.ModuleBayTemplateCreateForm
|
2021-12-17 09:35:57 -05:00
|
|
|
model_form = forms.ModuleBayTemplateForm
|
2022-02-23 13:02:14 -05:00
|
|
|
template_name = 'dcim/modulebaytemplate_create.html'
|
|
|
|
patterned_fields = ('name', 'label', 'position')
|
2021-12-17 09:35:57 -05:00
|
|
|
|
|
|
|
|
|
|
|
class ModuleBayTemplateEditView(generic.ObjectEditView):
|
|
|
|
queryset = ModuleBayTemplate.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.ModuleBayTemplateForm
|
2021-12-17 09:35:57 -05:00
|
|
|
|
|
|
|
|
|
|
|
class ModuleBayTemplateDeleteView(generic.ObjectDeleteView):
|
|
|
|
queryset = ModuleBayTemplate.objects.all()
|
|
|
|
|
|
|
|
|
|
|
|
class ModuleBayTemplateBulkEditView(generic.BulkEditView):
|
|
|
|
queryset = ModuleBayTemplate.objects.all()
|
|
|
|
table = tables.ModuleBayTemplateTable
|
|
|
|
form = forms.ModuleBayTemplateBulkEditForm
|
|
|
|
|
|
|
|
|
|
|
|
class ModuleBayTemplateBulkRenameView(generic.BulkRenameView):
|
|
|
|
queryset = ModuleBayTemplate.objects.all()
|
|
|
|
|
|
|
|
|
|
|
|
class ModuleBayTemplateBulkDeleteView(generic.BulkDeleteView):
|
|
|
|
queryset = ModuleBayTemplate.objects.all()
|
|
|
|
table = tables.ModuleBayTemplateTable
|
|
|
|
|
|
|
|
|
2020-02-10 11:43:51 -05:00
|
|
|
#
|
|
|
|
# Device bay templates
|
|
|
|
#
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceBayTemplateCreateView(generic.ComponentCreateView):
|
2020-05-21 16:28:11 -04:00
|
|
|
queryset = DeviceBayTemplate.objects.all()
|
2022-02-18 11:56:49 -05:00
|
|
|
form = forms.ComponentTemplateCreateForm
|
2016-12-21 17:20:27 -05:00
|
|
|
model_form = forms.DeviceBayTemplateForm
|
2022-02-18 11:56:49 -05:00
|
|
|
template_name = 'dcim/component_template_create.html'
|
2016-07-01 17:12:43 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceBayTemplateEditView(generic.ObjectEditView):
|
2020-05-11 12:37:22 -04:00
|
|
|
queryset = DeviceBayTemplate.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.DeviceBayTemplateForm
|
2019-10-07 17:08:51 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceBayTemplateDeleteView(generic.ObjectDeleteView):
|
2020-05-11 12:47:01 -04:00
|
|
|
queryset = DeviceBayTemplate.objects.all()
|
2020-02-10 11:43:51 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceBayTemplateBulkEditView(generic.BulkEditView):
|
2020-06-30 15:22:30 -04:00
|
|
|
queryset = DeviceBayTemplate.objects.all()
|
|
|
|
table = tables.DeviceBayTemplateTable
|
|
|
|
form = forms.DeviceBayTemplateBulkEditForm
|
2020-02-06 15:29:10 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceBayTemplateBulkRenameView(generic.BulkRenameView):
|
2020-07-02 13:58:53 -04:00
|
|
|
queryset = DeviceBayTemplate.objects.all()
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceBayTemplateBulkDeleteView(generic.BulkDeleteView):
|
2018-07-20 21:18:10 -04:00
|
|
|
queryset = DeviceBayTemplate.objects.all()
|
2017-07-13 16:31:47 -04:00
|
|
|
table = tables.DeviceBayTemplateTable
|
2016-03-04 23:09:32 -05:00
|
|
|
|
|
|
|
|
2021-12-29 15:02:25 -05:00
|
|
|
#
|
|
|
|
# Inventory item templates
|
|
|
|
#
|
|
|
|
|
|
|
|
class InventoryItemTemplateCreateView(generic.ComponentCreateView):
|
|
|
|
queryset = InventoryItemTemplate.objects.all()
|
2022-02-18 11:56:49 -05:00
|
|
|
form = forms.ModularComponentTemplateCreateForm
|
2021-12-29 15:02:25 -05:00
|
|
|
model_form = forms.InventoryItemTemplateForm
|
2022-03-03 11:52:36 -05:00
|
|
|
template_name = 'dcim/inventoryitemtemplate_create.html'
|
2021-12-29 15:02:25 -05:00
|
|
|
|
|
|
|
def alter_object(self, instance, request):
|
|
|
|
# Set component (if any)
|
|
|
|
component_type = request.GET.get('component_type')
|
|
|
|
component_id = request.GET.get('component_id')
|
|
|
|
|
|
|
|
if component_type and component_id:
|
|
|
|
content_type = get_object_or_404(ContentType, pk=component_type)
|
|
|
|
instance.component = get_object_or_404(content_type.model_class(), pk=component_id)
|
|
|
|
|
|
|
|
return instance
|
|
|
|
|
|
|
|
|
|
|
|
class InventoryItemTemplateEditView(generic.ObjectEditView):
|
|
|
|
queryset = InventoryItemTemplate.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.InventoryItemTemplateForm
|
2021-12-29 15:02:25 -05:00
|
|
|
|
|
|
|
|
|
|
|
class InventoryItemTemplateDeleteView(generic.ObjectDeleteView):
|
|
|
|
queryset = InventoryItemTemplate.objects.all()
|
|
|
|
|
|
|
|
|
|
|
|
class InventoryItemTemplateBulkEditView(generic.BulkEditView):
|
|
|
|
queryset = InventoryItemTemplate.objects.all()
|
|
|
|
table = tables.InventoryItemTemplateTable
|
|
|
|
form = forms.InventoryItemTemplateBulkEditForm
|
|
|
|
|
|
|
|
|
|
|
|
class InventoryItemTemplateBulkRenameView(generic.BulkRenameView):
|
|
|
|
queryset = InventoryItemTemplate.objects.all()
|
|
|
|
|
|
|
|
|
|
|
|
class InventoryItemTemplateBulkDeleteView(generic.BulkDeleteView):
|
|
|
|
queryset = InventoryItemTemplate.objects.all()
|
|
|
|
table = tables.InventoryItemTemplateTable
|
|
|
|
|
|
|
|
|
2016-05-12 14:38:34 -04:00
|
|
|
#
|
|
|
|
# Device roles
|
|
|
|
#
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceRoleListView(generic.ObjectListView):
|
2020-07-10 15:38:54 -04:00
|
|
|
queryset = DeviceRole.objects.annotate(
|
2020-12-17 14:47:49 -05:00
|
|
|
device_count=count_related(Device, 'device_role'),
|
|
|
|
vm_count=count_related(VirtualMachine, 'role')
|
2020-07-10 15:38:54 -04:00
|
|
|
)
|
2021-09-16 16:04:46 -04:00
|
|
|
filterset = filtersets.DeviceRoleFilterSet
|
|
|
|
filterset_form = forms.DeviceRoleFilterForm
|
2016-05-18 16:02:53 -04:00
|
|
|
table = tables.DeviceRoleTable
|
2016-05-12 14:38:34 -04:00
|
|
|
|
|
|
|
|
2021-03-26 14:44:43 -04:00
|
|
|
class DeviceRoleView(generic.ObjectView):
|
|
|
|
queryset = DeviceRole.objects.all()
|
|
|
|
|
|
|
|
def get_extra_context(self, request, instance):
|
|
|
|
devices = Device.objects.restrict(request.user, 'view').filter(
|
|
|
|
device_role=instance
|
|
|
|
)
|
2022-05-04 15:46:13 -04:00
|
|
|
devices_table = tables.DeviceTable(devices, user=request.user, exclude=('device_role',))
|
2022-02-09 14:10:54 -05:00
|
|
|
devices_table.configure(request)
|
2021-03-26 14:44:43 -04:00
|
|
|
|
|
|
|
return {
|
|
|
|
'devices_table': devices_table,
|
2021-06-22 14:21:41 -04:00
|
|
|
'device_count': Device.objects.filter(device_role=instance).count(),
|
|
|
|
'virtualmachine_count': VirtualMachine.objects.filter(role=instance).count(),
|
2021-03-26 14:44:43 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceRoleEditView(generic.ObjectEditView):
|
2020-05-11 12:37:22 -04:00
|
|
|
queryset = DeviceRole.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.DeviceRoleForm
|
2016-05-12 14:38:34 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceRoleDeleteView(generic.ObjectDeleteView):
|
2020-07-01 12:08:26 -04:00
|
|
|
queryset = DeviceRole.objects.all()
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceRoleBulkImportView(generic.BulkImportView):
|
2020-05-21 11:58:27 -04:00
|
|
|
queryset = DeviceRole.objects.all()
|
2017-10-09 15:28:46 -04:00
|
|
|
model_form = forms.DeviceRoleCSVForm
|
|
|
|
table = tables.DeviceRoleTable
|
|
|
|
|
|
|
|
|
2021-03-12 16:14:42 -05:00
|
|
|
class DeviceRoleBulkEditView(generic.BulkEditView):
|
2021-04-15 19:53:46 -04:00
|
|
|
queryset = DeviceRole.objects.annotate(
|
|
|
|
device_count=count_related(Device, 'device_role'),
|
|
|
|
vm_count=count_related(VirtualMachine, 'role')
|
|
|
|
)
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.DeviceRoleFilterSet
|
2021-03-12 16:14:42 -05:00
|
|
|
table = tables.DeviceRoleTable
|
|
|
|
form = forms.DeviceRoleBulkEditForm
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceRoleBulkDeleteView(generic.BulkDeleteView):
|
2021-04-15 19:53:46 -04:00
|
|
|
queryset = DeviceRole.objects.annotate(
|
|
|
|
device_count=count_related(Device, 'device_role'),
|
|
|
|
vm_count=count_related(VirtualMachine, 'role')
|
|
|
|
)
|
2017-07-13 16:31:47 -04:00
|
|
|
table = tables.DeviceRoleTable
|
2016-05-12 14:38:34 -04:00
|
|
|
|
|
|
|
|
2016-05-16 11:54:17 -04:00
|
|
|
#
|
|
|
|
# Platforms
|
|
|
|
#
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PlatformListView(generic.ObjectListView):
|
2020-07-10 15:38:54 -04:00
|
|
|
queryset = Platform.objects.annotate(
|
2020-12-17 14:47:49 -05:00
|
|
|
device_count=count_related(Device, 'platform'),
|
|
|
|
vm_count=count_related(VirtualMachine, 'platform')
|
2020-07-10 15:38:54 -04:00
|
|
|
)
|
2016-05-18 16:02:53 -04:00
|
|
|
table = tables.PlatformTable
|
2021-07-20 15:39:58 -04:00
|
|
|
filterset = filtersets.PlatformFilterSet
|
|
|
|
filterset_form = forms.PlatformFilterForm
|
2016-05-16 11:54:17 -04:00
|
|
|
|
|
|
|
|
2021-03-26 14:44:43 -04:00
|
|
|
class PlatformView(generic.ObjectView):
|
|
|
|
queryset = Platform.objects.all()
|
|
|
|
|
|
|
|
def get_extra_context(self, request, instance):
|
|
|
|
devices = Device.objects.restrict(request.user, 'view').filter(
|
|
|
|
platform=instance
|
|
|
|
)
|
2022-05-04 15:46:13 -04:00
|
|
|
devices_table = tables.DeviceTable(devices, user=request.user, exclude=('platform',))
|
2022-02-09 14:10:54 -05:00
|
|
|
devices_table.configure(request)
|
2021-03-26 14:44:43 -04:00
|
|
|
|
|
|
|
return {
|
|
|
|
'devices_table': devices_table,
|
2021-10-06 10:12:44 -04:00
|
|
|
'virtualmachine_count': VirtualMachine.objects.filter(platform=instance).count()
|
2021-03-26 14:44:43 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PlatformEditView(generic.ObjectEditView):
|
2020-05-11 12:37:22 -04:00
|
|
|
queryset = Platform.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.PlatformForm
|
2016-05-16 11:54:17 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PlatformDeleteView(generic.ObjectDeleteView):
|
2020-07-01 12:08:26 -04:00
|
|
|
queryset = Platform.objects.all()
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PlatformBulkImportView(generic.BulkImportView):
|
2020-05-21 11:58:27 -04:00
|
|
|
queryset = Platform.objects.all()
|
2017-10-09 15:28:46 -04:00
|
|
|
model_form = forms.PlatformCSVForm
|
|
|
|
table = tables.PlatformTable
|
|
|
|
|
|
|
|
|
2021-03-12 16:14:42 -05:00
|
|
|
class PlatformBulkEditView(generic.BulkEditView):
|
|
|
|
queryset = Platform.objects.all()
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.PlatformFilterSet
|
2021-03-12 16:14:42 -05:00
|
|
|
table = tables.PlatformTable
|
|
|
|
form = forms.PlatformBulkEditForm
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PlatformBulkDeleteView(generic.BulkDeleteView):
|
2018-07-20 21:18:10 -04:00
|
|
|
queryset = Platform.objects.all()
|
2017-07-13 16:31:47 -04:00
|
|
|
table = tables.PlatformTable
|
2016-05-16 11:54:17 -04:00
|
|
|
|
|
|
|
|
2016-03-01 11:23:03 -05:00
|
|
|
#
|
|
|
|
# Devices
|
|
|
|
#
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceListView(generic.ObjectListView):
|
2020-10-30 16:52:40 -04:00
|
|
|
queryset = Device.objects.all()
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.DeviceFilterSet
|
2020-01-09 20:57:13 -05:00
|
|
|
filterset_form = forms.DeviceFilterForm
|
2020-04-29 10:58:08 -04:00
|
|
|
table = tables.DeviceTable
|
2016-03-04 10:35:39 -05:00
|
|
|
template_name = 'dcim/device_list.html'
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceView(generic.ObjectView):
|
2020-05-21 15:39:07 -04:00
|
|
|
queryset = Device.objects.prefetch_related(
|
2021-03-03 14:28:07 -05:00
|
|
|
'site__region', 'location', 'rack', 'tenant__group', 'device_role', 'platform', 'primary_ip4', 'primary_ip6'
|
2020-05-21 15:39:07 -04:00
|
|
|
)
|
2017-05-18 17:00:57 -04:00
|
|
|
|
2020-11-19 15:59:11 -05:00
|
|
|
def get_extra_context(self, request, instance):
|
2018-01-31 22:47:27 -05:00
|
|
|
# VirtualChassis members
|
2020-11-19 15:59:11 -05:00
|
|
|
if instance.virtual_chassis is not None:
|
2020-06-01 11:43:49 -04:00
|
|
|
vc_members = Device.objects.restrict(request.user, 'view').filter(
|
2020-11-19 15:59:11 -05:00
|
|
|
virtual_chassis=instance.virtual_chassis
|
2018-10-29 12:24:16 -04:00
|
|
|
).order_by('vc_position')
|
2018-01-31 22:47:27 -05:00
|
|
|
else:
|
|
|
|
vc_members = []
|
2017-12-15 15:24:03 -05:00
|
|
|
|
2020-11-13 15:00:12 -05:00
|
|
|
# Services
|
2020-11-19 15:59:11 -05:00
|
|
|
services = Service.objects.restrict(request.user, 'view').filter(device=instance)
|
2020-11-13 15:00:12 -05:00
|
|
|
|
2020-11-19 15:59:11 -05:00
|
|
|
return {
|
2020-11-13 15:00:12 -05:00
|
|
|
'services': services,
|
|
|
|
'vc_members': vc_members,
|
2020-11-19 15:59:11 -05:00
|
|
|
}
|
2020-11-13 15:00:12 -05:00
|
|
|
|
|
|
|
|
2021-10-20 14:22:11 -04:00
|
|
|
class DeviceConsolePortsView(DeviceComponentsView):
|
2021-12-14 13:41:01 -05:00
|
|
|
child_model = ConsolePort
|
2021-10-20 14:22:11 -04:00
|
|
|
table = tables.DeviceConsolePortTable
|
2021-12-14 15:31:42 -05:00
|
|
|
filterset = filtersets.ConsolePortFilterSet
|
2020-11-19 15:59:11 -05:00
|
|
|
template_name = 'dcim/device/consoleports.html'
|
2020-11-13 15:00:12 -05:00
|
|
|
|
|
|
|
|
2021-10-20 14:22:11 -04:00
|
|
|
class DeviceConsoleServerPortsView(DeviceComponentsView):
|
2021-12-14 13:41:01 -05:00
|
|
|
child_model = ConsoleServerPort
|
2021-10-20 14:22:11 -04:00
|
|
|
table = tables.DeviceConsoleServerPortTable
|
2021-12-14 15:31:42 -05:00
|
|
|
filterset = filtersets.ConsoleServerPortFilterSet
|
2020-11-19 15:59:11 -05:00
|
|
|
template_name = 'dcim/device/consoleserverports.html'
|
2020-11-13 15:00:12 -05:00
|
|
|
|
|
|
|
|
2021-10-20 14:22:11 -04:00
|
|
|
class DevicePowerPortsView(DeviceComponentsView):
|
2021-12-14 13:41:01 -05:00
|
|
|
child_model = PowerPort
|
2021-10-20 14:22:11 -04:00
|
|
|
table = tables.DevicePowerPortTable
|
2021-12-14 15:31:42 -05:00
|
|
|
filterset = filtersets.PowerPortFilterSet
|
2020-11-19 15:59:11 -05:00
|
|
|
template_name = 'dcim/device/powerports.html'
|
2020-11-13 15:00:12 -05:00
|
|
|
|
|
|
|
|
2021-10-20 14:22:11 -04:00
|
|
|
class DevicePowerOutletsView(DeviceComponentsView):
|
2021-12-14 13:41:01 -05:00
|
|
|
child_model = PowerOutlet
|
2021-10-20 14:22:11 -04:00
|
|
|
table = tables.DevicePowerOutletTable
|
2021-12-14 15:31:42 -05:00
|
|
|
filterset = filtersets.PowerOutletFilterSet
|
2020-11-19 15:59:11 -05:00
|
|
|
template_name = 'dcim/device/poweroutlets.html'
|
2020-11-13 15:00:12 -05:00
|
|
|
|
|
|
|
|
2021-10-20 14:22:11 -04:00
|
|
|
class DeviceInterfacesView(DeviceComponentsView):
|
2021-12-14 13:41:01 -05:00
|
|
|
child_model = Interface
|
2021-10-20 14:22:11 -04:00
|
|
|
table = tables.DeviceInterfaceTable
|
2021-12-14 15:31:42 -05:00
|
|
|
filterset = filtersets.InterfaceFilterSet
|
2020-11-19 15:59:11 -05:00
|
|
|
template_name = 'dcim/device/interfaces.html'
|
2020-11-13 15:00:12 -05:00
|
|
|
|
2021-12-14 13:41:01 -05:00
|
|
|
def get_children(self, request, parent):
|
|
|
|
return parent.vc_interfaces().restrict(request.user, 'view').prefetch_related(
|
2020-06-26 12:22:02 -04:00
|
|
|
Prefetch('ip_addresses', queryset=IPAddress.objects.restrict(request.user)),
|
2021-10-20 14:22:11 -04:00
|
|
|
Prefetch('member_interfaces', queryset=Interface.objects.restrict(request.user))
|
2020-10-29 14:07:36 -04:00
|
|
|
)
|
2017-12-15 15:24:03 -05:00
|
|
|
|
2020-11-13 15:00:12 -05:00
|
|
|
|
2021-10-20 14:22:11 -04:00
|
|
|
class DeviceFrontPortsView(DeviceComponentsView):
|
2021-12-14 13:41:01 -05:00
|
|
|
child_model = FrontPort
|
2021-10-20 14:22:11 -04:00
|
|
|
table = tables.DeviceFrontPortTable
|
2021-12-14 15:31:42 -05:00
|
|
|
filterset = filtersets.FrontPortFilterSet
|
2020-11-19 15:59:11 -05:00
|
|
|
template_name = 'dcim/device/frontports.html'
|
2020-11-13 15:00:12 -05:00
|
|
|
|
2018-10-03 14:04:16 -04:00
|
|
|
|
2021-10-20 14:22:11 -04:00
|
|
|
class DeviceRearPortsView(DeviceComponentsView):
|
2021-12-14 13:41:01 -05:00
|
|
|
child_model = RearPort
|
2021-10-20 14:22:11 -04:00
|
|
|
table = tables.DeviceRearPortTable
|
2021-12-14 15:31:42 -05:00
|
|
|
filterset = filtersets.RearPortFilterSet
|
2020-11-19 15:59:11 -05:00
|
|
|
template_name = 'dcim/device/rearports.html'
|
2020-11-13 15:00:12 -05:00
|
|
|
|
|
|
|
|
2021-12-17 09:35:57 -05:00
|
|
|
class DeviceModuleBaysView(DeviceComponentsView):
|
|
|
|
child_model = ModuleBay
|
|
|
|
table = tables.DeviceModuleBayTable
|
|
|
|
filterset = filtersets.ModuleBayFilterSet
|
|
|
|
template_name = 'dcim/device/modulebays.html'
|
|
|
|
|
|
|
|
|
2021-10-20 14:22:11 -04:00
|
|
|
class DeviceDeviceBaysView(DeviceComponentsView):
|
2021-12-14 13:41:01 -05:00
|
|
|
child_model = DeviceBay
|
2021-10-20 14:22:11 -04:00
|
|
|
table = tables.DeviceDeviceBayTable
|
2021-12-14 15:31:42 -05:00
|
|
|
filterset = filtersets.DeviceBayFilterSet
|
2020-11-19 15:59:11 -05:00
|
|
|
template_name = 'dcim/device/devicebays.html'
|
2020-11-13 15:00:12 -05:00
|
|
|
|
|
|
|
|
2021-10-20 14:22:11 -04:00
|
|
|
class DeviceInventoryView(DeviceComponentsView):
|
2021-12-14 13:41:01 -05:00
|
|
|
child_model = InventoryItem
|
2021-10-20 14:22:11 -04:00
|
|
|
table = tables.DeviceInventoryItemTable
|
2021-12-14 15:31:42 -05:00
|
|
|
filterset = filtersets.InventoryItemFilterSet
|
2020-11-19 15:59:11 -05:00
|
|
|
template_name = 'dcim/device/inventory.html'
|
2020-11-13 15:00:12 -05:00
|
|
|
|
2017-05-18 17:00:57 -04:00
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceStatusView(generic.ObjectView):
|
2020-06-02 09:36:45 -04:00
|
|
|
additional_permissions = ['dcim.napalm_read_device']
|
2020-05-21 15:39:07 -04:00
|
|
|
queryset = Device.objects.all()
|
2020-11-19 11:29:18 -05:00
|
|
|
template_name = 'dcim/device/status.html'
|
2017-07-14 16:07:28 -04:00
|
|
|
|
2020-11-19 15:59:11 -05:00
|
|
|
def get_extra_context(self, request, instance):
|
2020-11-19 11:29:18 -05:00
|
|
|
return {
|
2018-06-14 13:14:35 -04:00
|
|
|
'active_tab': 'status',
|
2020-11-19 11:29:18 -05:00
|
|
|
}
|
2017-07-14 16:07:28 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceLLDPNeighborsView(generic.ObjectView):
|
2020-06-02 09:36:45 -04:00
|
|
|
additional_permissions = ['dcim.napalm_read_device']
|
2020-05-21 15:39:07 -04:00
|
|
|
queryset = Device.objects.all()
|
2020-11-19 15:59:11 -05:00
|
|
|
template_name = 'dcim/device/lldp_neighbors.html'
|
2017-05-18 17:00:57 -04:00
|
|
|
|
2020-11-19 15:59:11 -05:00
|
|
|
def get_extra_context(self, request, instance):
|
2021-05-07 09:47:32 -04:00
|
|
|
interfaces = instance.vc_interfaces().restrict(request.user, 'view').prefetch_related(
|
2020-11-19 15:59:11 -05:00
|
|
|
'_path__destination'
|
|
|
|
).exclude(
|
2020-06-01 11:43:49 -04:00
|
|
|
type__in=NONCONNECTABLE_IFACE_TYPES
|
2017-05-18 17:00:57 -04:00
|
|
|
)
|
|
|
|
|
2020-11-19 15:59:11 -05:00
|
|
|
return {
|
2017-05-18 17:00:57 -04:00
|
|
|
'interfaces': interfaces,
|
2018-06-14 13:14:35 -04:00
|
|
|
'active_tab': 'lldp-neighbors',
|
2020-11-19 15:59:11 -05:00
|
|
|
}
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceConfigView(generic.ObjectView):
|
2020-06-02 09:36:45 -04:00
|
|
|
additional_permissions = ['dcim.napalm_read_device']
|
2020-05-21 15:39:07 -04:00
|
|
|
queryset = Device.objects.all()
|
2020-11-19 11:29:18 -05:00
|
|
|
template_name = 'dcim/device/config.html'
|
2017-07-17 13:19:25 -04:00
|
|
|
|
2020-11-19 15:59:11 -05:00
|
|
|
def get_extra_context(self, request, instance):
|
2020-11-19 11:29:18 -05:00
|
|
|
return {
|
2018-06-14 13:14:35 -04:00
|
|
|
'active_tab': 'config',
|
2020-11-19 11:29:18 -05:00
|
|
|
}
|
2017-07-17 13:19:25 -04:00
|
|
|
|
|
|
|
|
2020-05-22 11:55:56 -04:00
|
|
|
class DeviceConfigContextView(ObjectConfigContextView):
|
2020-10-23 01:18:04 -04:00
|
|
|
queryset = Device.objects.annotate_config_context_data()
|
2020-11-13 15:00:12 -05:00
|
|
|
base_template = 'dcim/device/base.html'
|
2018-06-27 16:02:34 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceEditView(generic.ObjectEditView):
|
2020-05-11 12:37:22 -04:00
|
|
|
queryset = Device.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.DeviceForm
|
2016-05-09 12:03:02 -04:00
|
|
|
template_name = 'dcim/device_edit.html'
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceDeleteView(generic.ObjectDeleteView):
|
2020-05-11 12:47:01 -04:00
|
|
|
queryset = Device.objects.all()
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceBulkImportView(generic.BulkImportView):
|
2020-05-21 11:58:27 -04:00
|
|
|
queryset = Device.objects.all()
|
2017-06-02 14:49:25 -04:00
|
|
|
model_form = forms.DeviceCSVForm
|
2016-05-18 16:02:53 -04:00
|
|
|
table = tables.DeviceImportTable
|
2016-03-01 11:23:03 -05:00
|
|
|
template_name = 'dcim/device_import.html'
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ChildDeviceBulkImportView(generic.BulkImportView):
|
2020-05-21 11:58:27 -04:00
|
|
|
queryset = Device.objects.all()
|
2017-06-02 14:49:25 -04:00
|
|
|
model_form = forms.ChildDeviceCSVForm
|
2016-07-14 17:35:52 -04:00
|
|
|
table = tables.DeviceImportTable
|
|
|
|
template_name = 'dcim/device_import_child.html'
|
|
|
|
|
2020-03-09 12:39:07 -04:00
|
|
|
def _save_obj(self, obj_form, request):
|
2017-03-13 11:18:33 -04:00
|
|
|
|
2017-06-07 15:30:28 -04:00
|
|
|
obj = obj_form.save()
|
2017-03-13 11:18:33 -04:00
|
|
|
|
2017-06-07 15:30:28 -04:00
|
|
|
# Save the reverse relation to the parent device bay
|
2016-07-14 17:35:52 -04:00
|
|
|
device_bay = obj.parent_bay
|
|
|
|
device_bay.installed_device = obj
|
|
|
|
device_bay.save()
|
|
|
|
|
2017-06-07 15:30:28 -04:00
|
|
|
return obj
|
|
|
|
|
2016-07-14 17:35:52 -04:00
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceBulkEditView(generic.BulkEditView):
|
2019-08-19 01:53:39 -04:00
|
|
|
queryset = Device.objects.prefetch_related('tenant', 'site', 'rack', 'device_role', 'device_type__manufacturer')
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.DeviceFilterSet
|
2017-07-13 16:31:47 -04:00
|
|
|
table = tables.DeviceTable
|
2016-05-18 16:02:53 -04:00
|
|
|
form = forms.DeviceBulkEditForm
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceBulkDeleteView(generic.BulkDeleteView):
|
2019-08-19 01:53:39 -04:00
|
|
|
queryset = Device.objects.prefetch_related('tenant', 'site', 'rack', 'device_role', 'device_type__manufacturer')
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.DeviceFilterSet
|
2017-07-13 16:31:47 -04:00
|
|
|
table = tables.DeviceTable
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2021-12-17 16:12:03 -05:00
|
|
|
#
|
|
|
|
# Devices
|
|
|
|
#
|
|
|
|
|
|
|
|
class ModuleListView(generic.ObjectListView):
|
|
|
|
queryset = Module.objects.prefetch_related('device', 'module_type__manufacturer')
|
|
|
|
filterset = filtersets.ModuleFilterSet
|
|
|
|
filterset_form = forms.ModuleFilterForm
|
|
|
|
table = tables.ModuleTable
|
|
|
|
|
|
|
|
|
|
|
|
class ModuleView(generic.ObjectView):
|
|
|
|
queryset = Module.objects.all()
|
|
|
|
|
|
|
|
|
|
|
|
class ModuleEditView(generic.ObjectEditView):
|
|
|
|
queryset = Module.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.ModuleForm
|
2021-12-17 16:12:03 -05:00
|
|
|
|
|
|
|
|
|
|
|
class ModuleDeleteView(generic.ObjectDeleteView):
|
|
|
|
queryset = Module.objects.all()
|
|
|
|
|
|
|
|
|
|
|
|
class ModuleBulkImportView(generic.BulkImportView):
|
|
|
|
queryset = Module.objects.all()
|
|
|
|
model_form = forms.ModuleCSVForm
|
|
|
|
table = tables.ModuleTable
|
|
|
|
|
|
|
|
|
|
|
|
class ModuleBulkEditView(generic.BulkEditView):
|
|
|
|
queryset = Module.objects.prefetch_related('device', 'module_type__manufacturer')
|
|
|
|
filterset = filtersets.ModuleFilterSet
|
|
|
|
table = tables.ModuleTable
|
|
|
|
form = forms.ModuleBulkEditForm
|
|
|
|
|
|
|
|
|
|
|
|
class ModuleBulkDeleteView(generic.BulkDeleteView):
|
|
|
|
queryset = Module.objects.prefetch_related('device', 'module_type__manufacturer')
|
|
|
|
filterset = filtersets.ModuleFilterSet
|
|
|
|
table = tables.ModuleTable
|
|
|
|
|
|
|
|
|
2016-12-21 15:26:56 -05:00
|
|
|
#
|
|
|
|
# Console ports
|
|
|
|
#
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ConsolePortListView(generic.ObjectListView):
|
2020-10-30 16:52:40 -04:00
|
|
|
queryset = ConsolePort.objects.all()
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.ConsolePortFilterSet
|
2020-01-09 20:57:13 -05:00
|
|
|
filterset_form = forms.ConsolePortFilterForm
|
2020-06-25 11:56:31 -04:00
|
|
|
table = tables.ConsolePortTable
|
2022-02-24 16:33:51 -05:00
|
|
|
actions = ('import', 'export', 'bulk_edit', 'bulk_delete')
|
2019-12-05 16:10:49 -06:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ConsolePortView(generic.ObjectView):
|
2020-06-25 11:01:18 -04:00
|
|
|
queryset = ConsolePort.objects.all()
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ConsolePortCreateView(generic.ComponentCreateView):
|
2020-05-21 16:28:11 -04:00
|
|
|
queryset = ConsolePort.objects.all()
|
2021-12-28 15:07:14 -05:00
|
|
|
form = forms.DeviceComponentCreateForm
|
2016-12-21 15:26:56 -05:00
|
|
|
model_form = forms.ConsolePortForm
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ConsolePortEditView(generic.ObjectEditView):
|
2020-05-11 12:37:22 -04:00
|
|
|
queryset = ConsolePort.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.ConsolePortForm
|
2020-09-04 16:09:05 -04:00
|
|
|
template_name = 'dcim/device_component_edit.html'
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ConsolePortDeleteView(generic.ObjectDeleteView):
|
2020-05-11 12:47:01 -04:00
|
|
|
queryset = ConsolePort.objects.all()
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ConsolePortBulkImportView(generic.BulkImportView):
|
2020-05-21 11:58:27 -04:00
|
|
|
queryset = ConsolePort.objects.all()
|
2019-12-05 21:36:11 +01:00
|
|
|
model_form = forms.ConsolePortCSVForm
|
2020-06-25 11:56:31 -04:00
|
|
|
table = tables.ConsolePortTable
|
2019-12-05 21:36:11 +01:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ConsolePortBulkEditView(generic.BulkEditView):
|
2020-02-06 20:58:14 -05:00
|
|
|
queryset = ConsolePort.objects.all()
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.ConsolePortFilterSet
|
2020-02-06 20:58:14 -05:00
|
|
|
table = tables.ConsolePortTable
|
|
|
|
form = forms.ConsolePortBulkEditForm
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ConsolePortBulkRenameView(generic.BulkRenameView):
|
2020-06-25 14:18:29 -04:00
|
|
|
queryset = ConsolePort.objects.all()
|
|
|
|
|
|
|
|
|
2020-06-25 17:08:51 -04:00
|
|
|
class ConsolePortBulkDisconnectView(BulkDisconnectView):
|
|
|
|
queryset = ConsolePort.objects.all()
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ConsolePortBulkDeleteView(generic.BulkDeleteView):
|
2018-07-20 21:18:10 -04:00
|
|
|
queryset = ConsolePort.objects.all()
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.ConsolePortFilterSet
|
2017-07-13 16:31:47 -04:00
|
|
|
table = tables.ConsolePortTable
|
2016-07-26 10:14:51 -04:00
|
|
|
|
|
|
|
|
2016-03-01 11:23:03 -05:00
|
|
|
#
|
|
|
|
# Console server ports
|
|
|
|
#
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ConsoleServerPortListView(generic.ObjectListView):
|
2020-10-30 16:52:40 -04:00
|
|
|
queryset = ConsoleServerPort.objects.all()
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.ConsoleServerPortFilterSet
|
2020-01-09 20:57:13 -05:00
|
|
|
filterset_form = forms.ConsoleServerPortFilterForm
|
2020-06-25 11:56:31 -04:00
|
|
|
table = tables.ConsoleServerPortTable
|
2022-02-24 16:33:51 -05:00
|
|
|
actions = ('import', 'export', 'bulk_edit', 'bulk_delete')
|
2019-12-05 16:10:49 -06:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ConsoleServerPortView(generic.ObjectView):
|
2020-06-25 11:01:18 -04:00
|
|
|
queryset = ConsoleServerPort.objects.all()
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ConsoleServerPortCreateView(generic.ComponentCreateView):
|
2020-05-21 16:28:11 -04:00
|
|
|
queryset = ConsoleServerPort.objects.all()
|
2021-12-28 15:07:14 -05:00
|
|
|
form = forms.DeviceComponentCreateForm
|
2016-12-21 15:26:56 -05:00
|
|
|
model_form = forms.ConsoleServerPortForm
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ConsoleServerPortEditView(generic.ObjectEditView):
|
2020-05-11 12:37:22 -04:00
|
|
|
queryset = ConsoleServerPort.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.ConsoleServerPortForm
|
2020-09-04 16:09:05 -04:00
|
|
|
template_name = 'dcim/device_component_edit.html'
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ConsoleServerPortDeleteView(generic.ObjectDeleteView):
|
2020-05-11 12:47:01 -04:00
|
|
|
queryset = ConsoleServerPort.objects.all()
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ConsoleServerPortBulkImportView(generic.BulkImportView):
|
2020-05-21 11:58:27 -04:00
|
|
|
queryset = ConsoleServerPort.objects.all()
|
2019-12-05 21:36:11 +01:00
|
|
|
model_form = forms.ConsoleServerPortCSVForm
|
2020-06-25 11:56:31 -04:00
|
|
|
table = tables.ConsoleServerPortTable
|
2019-12-05 21:36:11 +01:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ConsoleServerPortBulkEditView(generic.BulkEditView):
|
2019-05-02 13:56:30 -04:00
|
|
|
queryset = ConsoleServerPort.objects.all()
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.ConsoleServerPortFilterSet
|
2019-05-02 13:56:30 -04:00
|
|
|
table = tables.ConsoleServerPortTable
|
|
|
|
form = forms.ConsoleServerPortBulkEditForm
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ConsoleServerPortBulkRenameView(generic.BulkRenameView):
|
2018-03-29 15:15:13 -04:00
|
|
|
queryset = ConsoleServerPort.objects.all()
|
2018-01-10 15:48:07 -05:00
|
|
|
|
|
|
|
|
2020-05-21 16:11:46 -04:00
|
|
|
class ConsoleServerPortBulkDisconnectView(BulkDisconnectView):
|
|
|
|
queryset = ConsoleServerPort.objects.all()
|
2017-06-15 14:01:49 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ConsoleServerPortBulkDeleteView(generic.BulkDeleteView):
|
2018-07-20 21:18:10 -04:00
|
|
|
queryset = ConsoleServerPort.objects.all()
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.ConsoleServerPortFilterSet
|
2017-07-13 16:31:47 -04:00
|
|
|
table = tables.ConsoleServerPortTable
|
2016-07-26 10:14:51 -04:00
|
|
|
|
|
|
|
|
2016-03-01 11:23:03 -05:00
|
|
|
#
|
|
|
|
# Power ports
|
|
|
|
#
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerPortListView(generic.ObjectListView):
|
2020-10-30 16:52:40 -04:00
|
|
|
queryset = PowerPort.objects.all()
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.PowerPortFilterSet
|
2020-01-09 20:57:13 -05:00
|
|
|
filterset_form = forms.PowerPortFilterForm
|
2020-06-25 11:56:31 -04:00
|
|
|
table = tables.PowerPortTable
|
2022-02-24 16:33:51 -05:00
|
|
|
actions = ('import', 'export', 'bulk_edit', 'bulk_delete')
|
2019-12-05 16:10:49 -06:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerPortView(generic.ObjectView):
|
2020-06-25 11:01:18 -04:00
|
|
|
queryset = PowerPort.objects.all()
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerPortCreateView(generic.ComponentCreateView):
|
2020-05-21 16:28:11 -04:00
|
|
|
queryset = PowerPort.objects.all()
|
2021-12-28 15:07:14 -05:00
|
|
|
form = forms.DeviceComponentCreateForm
|
2016-12-21 15:26:56 -05:00
|
|
|
model_form = forms.PowerPortForm
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerPortEditView(generic.ObjectEditView):
|
2020-05-11 12:37:22 -04:00
|
|
|
queryset = PowerPort.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.PowerPortForm
|
2020-09-04 16:09:05 -04:00
|
|
|
template_name = 'dcim/device_component_edit.html'
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerPortDeleteView(generic.ObjectDeleteView):
|
2020-05-11 12:47:01 -04:00
|
|
|
queryset = PowerPort.objects.all()
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerPortBulkImportView(generic.BulkImportView):
|
2020-05-21 11:58:27 -04:00
|
|
|
queryset = PowerPort.objects.all()
|
2019-12-05 21:36:11 +01:00
|
|
|
model_form = forms.PowerPortCSVForm
|
2020-06-25 11:56:31 -04:00
|
|
|
table = tables.PowerPortTable
|
2019-12-05 21:36:11 +01:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerPortBulkEditView(generic.BulkEditView):
|
2020-02-06 20:58:14 -05:00
|
|
|
queryset = PowerPort.objects.all()
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.PowerPortFilterSet
|
2020-02-06 20:58:14 -05:00
|
|
|
table = tables.PowerPortTable
|
|
|
|
form = forms.PowerPortBulkEditForm
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerPortBulkRenameView(generic.BulkRenameView):
|
2020-06-25 14:18:29 -04:00
|
|
|
queryset = PowerPort.objects.all()
|
|
|
|
|
|
|
|
|
2020-06-25 17:08:51 -04:00
|
|
|
class PowerPortBulkDisconnectView(BulkDisconnectView):
|
|
|
|
queryset = PowerPort.objects.all()
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerPortBulkDeleteView(generic.BulkDeleteView):
|
2018-07-20 21:18:10 -04:00
|
|
|
queryset = PowerPort.objects.all()
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.PowerPortFilterSet
|
2017-07-13 16:31:47 -04:00
|
|
|
table = tables.PowerPortTable
|
2016-07-26 10:14:51 -04:00
|
|
|
|
|
|
|
|
2016-03-01 11:23:03 -05:00
|
|
|
#
|
|
|
|
# Power outlets
|
|
|
|
#
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerOutletListView(generic.ObjectListView):
|
2020-10-30 16:52:40 -04:00
|
|
|
queryset = PowerOutlet.objects.all()
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.PowerOutletFilterSet
|
2020-01-09 20:57:13 -05:00
|
|
|
filterset_form = forms.PowerOutletFilterForm
|
2020-06-25 11:56:31 -04:00
|
|
|
table = tables.PowerOutletTable
|
2022-02-24 16:33:51 -05:00
|
|
|
actions = ('import', 'export', 'bulk_edit', 'bulk_delete')
|
2019-12-05 16:10:49 -06:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerOutletView(generic.ObjectView):
|
2020-06-25 11:01:18 -04:00
|
|
|
queryset = PowerOutlet.objects.all()
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerOutletCreateView(generic.ComponentCreateView):
|
2020-05-21 16:28:11 -04:00
|
|
|
queryset = PowerOutlet.objects.all()
|
2021-12-28 15:07:14 -05:00
|
|
|
form = forms.DeviceComponentCreateForm
|
2016-12-21 15:26:56 -05:00
|
|
|
model_form = forms.PowerOutletForm
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerOutletEditView(generic.ObjectEditView):
|
2020-05-11 12:37:22 -04:00
|
|
|
queryset = PowerOutlet.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.PowerOutletForm
|
2020-09-04 16:09:05 -04:00
|
|
|
template_name = 'dcim/device_component_edit.html'
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerOutletDeleteView(generic.ObjectDeleteView):
|
2020-05-11 12:47:01 -04:00
|
|
|
queryset = PowerOutlet.objects.all()
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerOutletBulkImportView(generic.BulkImportView):
|
2020-05-21 11:58:27 -04:00
|
|
|
queryset = PowerOutlet.objects.all()
|
2019-12-05 21:36:11 +01:00
|
|
|
model_form = forms.PowerOutletCSVForm
|
2020-06-25 11:56:31 -04:00
|
|
|
table = tables.PowerOutletTable
|
2019-12-05 21:36:11 +01:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerOutletBulkEditView(generic.BulkEditView):
|
2019-05-02 13:56:30 -04:00
|
|
|
queryset = PowerOutlet.objects.all()
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.PowerOutletFilterSet
|
2019-05-02 13:56:30 -04:00
|
|
|
table = tables.PowerOutletTable
|
|
|
|
form = forms.PowerOutletBulkEditForm
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerOutletBulkRenameView(generic.BulkRenameView):
|
2018-03-29 15:15:13 -04:00
|
|
|
queryset = PowerOutlet.objects.all()
|
2018-01-10 15:48:07 -05:00
|
|
|
|
|
|
|
|
2020-05-21 16:11:46 -04:00
|
|
|
class PowerOutletBulkDisconnectView(BulkDisconnectView):
|
|
|
|
queryset = PowerOutlet.objects.all()
|
2017-06-15 14:01:49 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerOutletBulkDeleteView(generic.BulkDeleteView):
|
2018-07-20 21:18:10 -04:00
|
|
|
queryset = PowerOutlet.objects.all()
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.PowerOutletFilterSet
|
2017-07-13 16:31:47 -04:00
|
|
|
table = tables.PowerOutletTable
|
2016-07-26 10:14:51 -04:00
|
|
|
|
|
|
|
|
2016-03-01 11:23:03 -05:00
|
|
|
#
|
|
|
|
# Interfaces
|
|
|
|
#
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class InterfaceListView(generic.ObjectListView):
|
2020-10-30 16:52:40 -04:00
|
|
|
queryset = Interface.objects.all()
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.InterfaceFilterSet
|
2020-01-09 20:57:13 -05:00
|
|
|
filterset_form = forms.InterfaceFilterForm
|
2020-06-25 11:56:31 -04:00
|
|
|
table = tables.InterfaceTable
|
2022-02-24 16:33:51 -05:00
|
|
|
actions = ('import', 'export', 'bulk_edit', 'bulk_delete')
|
2019-12-05 16:10:49 -06:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class InterfaceView(generic.ObjectView):
|
2020-05-21 15:39:07 -04:00
|
|
|
queryset = Interface.objects.all()
|
2018-07-11 15:30:54 -04:00
|
|
|
|
2020-11-19 15:59:11 -05:00
|
|
|
def get_extra_context(self, request, instance):
|
2018-07-11 15:30:54 -04:00
|
|
|
# Get assigned IP addresses
|
2021-11-01 16:14:44 -04:00
|
|
|
ipaddress_table = AssignedIPAddressesTable(
|
2020-11-19 15:59:11 -05:00
|
|
|
data=instance.ip_addresses.restrict(request.user, 'view').prefetch_related('vrf', 'tenant'),
|
2018-07-11 15:30:54 -04:00
|
|
|
orderable=False
|
|
|
|
)
|
|
|
|
|
2022-03-28 20:37:00 +02:00
|
|
|
# Get bridge interfaces
|
|
|
|
bridge_interfaces = Interface.objects.restrict(request.user, 'view').filter(bridge=instance)
|
|
|
|
bridge_interfaces_tables = tables.InterfaceTable(
|
|
|
|
bridge_interfaces,
|
|
|
|
exclude=('device', 'parent'),
|
|
|
|
orderable=False
|
|
|
|
)
|
|
|
|
|
2021-04-02 17:33:34 -04:00
|
|
|
# Get child interfaces
|
|
|
|
child_interfaces = Interface.objects.restrict(request.user, 'view').filter(parent=instance)
|
|
|
|
child_interfaces_tables = tables.InterfaceTable(
|
|
|
|
child_interfaces,
|
2021-09-17 14:25:02 -04:00
|
|
|
exclude=('device', 'parent'),
|
2021-04-02 17:33:34 -04:00
|
|
|
orderable=False
|
|
|
|
)
|
|
|
|
|
2018-07-11 15:30:54 -04:00
|
|
|
# Get assigned VLANs and annotate whether each is tagged or untagged
|
|
|
|
vlans = []
|
2020-11-19 15:59:11 -05:00
|
|
|
if instance.untagged_vlan is not None:
|
|
|
|
vlans.append(instance.untagged_vlan)
|
2018-07-11 15:30:54 -04:00
|
|
|
vlans[0].tagged = False
|
2020-11-19 15:59:11 -05:00
|
|
|
for vlan in instance.tagged_vlans.restrict(request.user).prefetch_related('site', 'group', 'tenant', 'role'):
|
2018-07-11 15:30:54 -04:00
|
|
|
vlan.tagged = True
|
|
|
|
vlans.append(vlan)
|
|
|
|
vlan_table = InterfaceVLANTable(
|
2020-11-19 15:59:11 -05:00
|
|
|
interface=instance,
|
2018-07-11 15:30:54 -04:00
|
|
|
data=vlans,
|
|
|
|
orderable=False
|
|
|
|
)
|
|
|
|
|
2020-11-19 15:59:11 -05:00
|
|
|
return {
|
2018-07-11 15:30:54 -04:00
|
|
|
'ipaddress_table': ipaddress_table,
|
2022-03-28 20:37:00 +02:00
|
|
|
'bridge_interfaces_table': bridge_interfaces_tables,
|
2021-04-02 17:33:34 -04:00
|
|
|
'child_interfaces_table': child_interfaces_tables,
|
2018-07-11 15:30:54 -04:00
|
|
|
'vlan_table': vlan_table,
|
2020-11-19 15:59:11 -05:00
|
|
|
}
|
2018-07-11 15:30:54 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class InterfaceCreateView(generic.ComponentCreateView):
|
2020-05-21 16:28:11 -04:00
|
|
|
queryset = Interface.objects.all()
|
2021-12-28 15:07:14 -05:00
|
|
|
form = forms.DeviceComponentCreateForm
|
2016-12-21 15:26:56 -05:00
|
|
|
model_form = forms.InterfaceForm
|
2021-12-27 21:25:47 -05:00
|
|
|
# template_name = 'dcim/interface_create.html'
|
|
|
|
|
|
|
|
# TODO: Figure out what to do with this
|
|
|
|
# def post(self, request):
|
|
|
|
# """
|
|
|
|
# Override inherited post() method to handle request to assign newly created
|
|
|
|
# interface objects (first object) to an IP Address object.
|
|
|
|
# """
|
|
|
|
# form = self.form(request.POST, initial=request.GET)
|
|
|
|
# new_objs = self.validate_form(request, form)
|
|
|
|
#
|
|
|
|
# if form.is_valid() and not form.errors:
|
|
|
|
# if '_addanother' in request.POST:
|
|
|
|
# return redirect(request.get_full_path())
|
|
|
|
# elif new_objs is not None and '_assignip' in request.POST and len(new_objs) >= 1 and \
|
|
|
|
# request.user.has_perm('ipam.add_ipaddress'):
|
|
|
|
# first_obj = new_objs[0].pk
|
|
|
|
# return redirect(
|
|
|
|
# f'/ipam/ip-addresses/add/?interface={first_obj}&return_url={self.get_return_url(request)}'
|
|
|
|
# )
|
|
|
|
# else:
|
|
|
|
# return redirect(self.get_return_url(request))
|
|
|
|
#
|
|
|
|
# return render(request, self.template_name, {
|
|
|
|
# 'obj_type': self.queryset.model._meta.verbose_name,
|
|
|
|
# 'form': form,
|
|
|
|
# 'return_url': self.get_return_url(request),
|
|
|
|
# })
|
2021-04-30 11:13:38 -07:00
|
|
|
|
2016-03-01 11:23:03 -05:00
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class InterfaceEditView(generic.ObjectEditView):
|
2020-05-11 12:37:22 -04:00
|
|
|
queryset = Interface.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.InterfaceForm
|
2017-11-14 15:22:40 -05:00
|
|
|
template_name = 'dcim/interface_edit.html'
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class InterfaceDeleteView(generic.ObjectDeleteView):
|
2020-05-11 12:47:01 -04:00
|
|
|
queryset = Interface.objects.all()
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class InterfaceBulkImportView(generic.BulkImportView):
|
2020-05-21 11:58:27 -04:00
|
|
|
queryset = Interface.objects.all()
|
2019-12-05 21:36:11 +01:00
|
|
|
model_form = forms.InterfaceCSVForm
|
2020-06-25 11:56:31 -04:00
|
|
|
table = tables.InterfaceTable
|
2019-12-05 21:36:11 +01:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class InterfaceBulkEditView(generic.BulkEditView):
|
2018-07-20 21:18:10 -04:00
|
|
|
queryset = Interface.objects.all()
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.InterfaceFilterSet
|
2017-07-13 16:31:47 -04:00
|
|
|
table = tables.InterfaceTable
|
2016-10-14 16:38:46 -04:00
|
|
|
form = forms.InterfaceBulkEditForm
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class InterfaceBulkRenameView(generic.BulkRenameView):
|
2018-11-05 11:51:38 -05:00
|
|
|
queryset = Interface.objects.all()
|
2018-01-10 15:48:07 -05:00
|
|
|
|
|
|
|
|
2020-05-21 16:11:46 -04:00
|
|
|
class InterfaceBulkDisconnectView(BulkDisconnectView):
|
|
|
|
queryset = Interface.objects.all()
|
2018-11-08 15:12:24 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class InterfaceBulkDeleteView(generic.BulkDeleteView):
|
2018-07-20 21:18:10 -04:00
|
|
|
queryset = Interface.objects.all()
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.InterfaceFilterSet
|
2017-07-13 16:31:47 -04:00
|
|
|
table = tables.InterfaceTable
|
2016-07-26 10:14:51 -04:00
|
|
|
|
|
|
|
|
2018-10-03 14:04:16 -04:00
|
|
|
#
|
2018-10-25 12:08:13 -04:00
|
|
|
# Front ports
|
2018-10-03 14:04:16 -04:00
|
|
|
#
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class FrontPortListView(generic.ObjectListView):
|
2020-10-30 16:52:40 -04:00
|
|
|
queryset = FrontPort.objects.all()
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.FrontPortFilterSet
|
2020-01-09 20:57:13 -05:00
|
|
|
filterset_form = forms.FrontPortFilterForm
|
2020-06-25 11:56:31 -04:00
|
|
|
table = tables.FrontPortTable
|
2022-02-24 16:33:51 -05:00
|
|
|
actions = ('import', 'export', 'bulk_edit', 'bulk_delete')
|
2019-12-05 16:10:49 -06:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class FrontPortView(generic.ObjectView):
|
2020-06-25 11:01:18 -04:00
|
|
|
queryset = FrontPort.objects.all()
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class FrontPortCreateView(generic.ComponentCreateView):
|
2020-05-21 16:28:11 -04:00
|
|
|
queryset = FrontPort.objects.all()
|
2021-12-28 09:53:56 -05:00
|
|
|
form = forms.FrontPortCreateForm
|
2018-10-25 12:08:13 -04:00
|
|
|
model_form = forms.FrontPortForm
|
2018-10-03 14:04:16 -04:00
|
|
|
|
2021-12-28 09:53:56 -05:00
|
|
|
def initialize_forms(self, request):
|
|
|
|
form, model_form = super().initialize_forms(request)
|
|
|
|
|
|
|
|
model_form.fields.pop('rear_port')
|
|
|
|
model_form.fields.pop('rear_port_position')
|
|
|
|
|
|
|
|
return form, model_form
|
|
|
|
|
2018-10-03 14:04:16 -04:00
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class FrontPortEditView(generic.ObjectEditView):
|
2020-05-11 12:37:22 -04:00
|
|
|
queryset = FrontPort.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.FrontPortForm
|
2020-09-04 16:09:05 -04:00
|
|
|
template_name = 'dcim/device_component_edit.html'
|
2018-10-03 14:04:16 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class FrontPortDeleteView(generic.ObjectDeleteView):
|
2020-05-11 12:47:01 -04:00
|
|
|
queryset = FrontPort.objects.all()
|
2018-10-03 14:04:16 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class FrontPortBulkImportView(generic.BulkImportView):
|
2020-05-21 11:58:27 -04:00
|
|
|
queryset = FrontPort.objects.all()
|
2019-12-05 21:36:11 +01:00
|
|
|
model_form = forms.FrontPortCSVForm
|
2020-06-25 11:56:31 -04:00
|
|
|
table = tables.FrontPortTable
|
2019-12-05 21:36:11 +01:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class FrontPortBulkEditView(generic.BulkEditView):
|
2019-02-08 09:31:10 -05:00
|
|
|
queryset = FrontPort.objects.all()
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.FrontPortFilterSet
|
2019-02-08 09:31:10 -05:00
|
|
|
table = tables.FrontPortTable
|
|
|
|
form = forms.FrontPortBulkEditForm
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class FrontPortBulkRenameView(generic.BulkRenameView):
|
2018-10-25 12:08:13 -04:00
|
|
|
queryset = FrontPort.objects.all()
|
2018-10-03 14:04:16 -04:00
|
|
|
|
|
|
|
|
2020-05-21 16:11:46 -04:00
|
|
|
class FrontPortBulkDisconnectView(BulkDisconnectView):
|
|
|
|
queryset = FrontPort.objects.all()
|
2018-11-08 15:12:24 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class FrontPortBulkDeleteView(generic.BulkDeleteView):
|
2018-10-25 12:08:13 -04:00
|
|
|
queryset = FrontPort.objects.all()
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.FrontPortFilterSet
|
2018-10-25 12:08:13 -04:00
|
|
|
table = tables.FrontPortTable
|
2018-10-03 14:04:16 -04:00
|
|
|
|
|
|
|
|
|
|
|
#
|
2018-10-25 12:08:13 -04:00
|
|
|
# Rear ports
|
2018-10-03 14:04:16 -04:00
|
|
|
#
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RearPortListView(generic.ObjectListView):
|
2020-10-30 16:52:40 -04:00
|
|
|
queryset = RearPort.objects.all()
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.RearPortFilterSet
|
2020-01-09 20:57:13 -05:00
|
|
|
filterset_form = forms.RearPortFilterForm
|
2020-06-25 11:56:31 -04:00
|
|
|
table = tables.RearPortTable
|
2022-02-24 16:33:51 -05:00
|
|
|
actions = ('import', 'export', 'bulk_edit', 'bulk_delete')
|
2019-12-05 16:10:49 -06:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RearPortView(generic.ObjectView):
|
2020-06-25 11:01:18 -04:00
|
|
|
queryset = RearPort.objects.all()
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RearPortCreateView(generic.ComponentCreateView):
|
2020-05-21 16:28:11 -04:00
|
|
|
queryset = RearPort.objects.all()
|
2021-12-28 15:07:14 -05:00
|
|
|
form = forms.DeviceComponentCreateForm
|
2018-10-25 12:08:13 -04:00
|
|
|
model_form = forms.RearPortForm
|
2018-10-03 14:04:16 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RearPortEditView(generic.ObjectEditView):
|
2020-05-11 12:37:22 -04:00
|
|
|
queryset = RearPort.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.RearPortForm
|
2020-09-04 16:09:05 -04:00
|
|
|
template_name = 'dcim/device_component_edit.html'
|
2018-10-03 14:04:16 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RearPortDeleteView(generic.ObjectDeleteView):
|
2020-05-11 12:47:01 -04:00
|
|
|
queryset = RearPort.objects.all()
|
2018-10-03 14:04:16 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RearPortBulkImportView(generic.BulkImportView):
|
2020-05-21 11:58:27 -04:00
|
|
|
queryset = RearPort.objects.all()
|
2019-12-05 21:36:11 +01:00
|
|
|
model_form = forms.RearPortCSVForm
|
2020-06-25 11:56:31 -04:00
|
|
|
table = tables.RearPortTable
|
2019-12-05 21:36:11 +01:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RearPortBulkEditView(generic.BulkEditView):
|
2019-02-08 09:31:10 -05:00
|
|
|
queryset = RearPort.objects.all()
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.RearPortFilterSet
|
2019-02-08 09:31:10 -05:00
|
|
|
table = tables.RearPortTable
|
|
|
|
form = forms.RearPortBulkEditForm
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RearPortBulkRenameView(generic.BulkRenameView):
|
2018-10-25 12:08:13 -04:00
|
|
|
queryset = RearPort.objects.all()
|
2018-10-03 14:04:16 -04:00
|
|
|
|
|
|
|
|
2020-05-21 16:11:46 -04:00
|
|
|
class RearPortBulkDisconnectView(BulkDisconnectView):
|
|
|
|
queryset = RearPort.objects.all()
|
2018-11-08 15:12:24 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RearPortBulkDeleteView(generic.BulkDeleteView):
|
2018-10-25 12:08:13 -04:00
|
|
|
queryset = RearPort.objects.all()
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.RearPortFilterSet
|
2018-10-25 12:08:13 -04:00
|
|
|
table = tables.RearPortTable
|
2018-10-03 14:04:16 -04:00
|
|
|
|
|
|
|
|
2021-12-17 09:35:57 -05:00
|
|
|
#
|
|
|
|
# Module bays
|
|
|
|
#
|
|
|
|
|
|
|
|
class ModuleBayListView(generic.ObjectListView):
|
2021-12-17 16:27:03 -05:00
|
|
|
queryset = ModuleBay.objects.select_related('installed_module__module_type')
|
2021-12-17 09:35:57 -05:00
|
|
|
filterset = filtersets.ModuleBayFilterSet
|
|
|
|
filterset_form = forms.ModuleBayFilterForm
|
|
|
|
table = tables.ModuleBayTable
|
2022-02-24 16:33:51 -05:00
|
|
|
actions = ('import', 'export', 'bulk_edit', 'bulk_delete')
|
2021-12-17 09:35:57 -05:00
|
|
|
|
|
|
|
|
|
|
|
class ModuleBayView(generic.ObjectView):
|
|
|
|
queryset = ModuleBay.objects.all()
|
|
|
|
|
|
|
|
|
|
|
|
class ModuleBayCreateView(generic.ComponentCreateView):
|
|
|
|
queryset = ModuleBay.objects.all()
|
2022-02-23 13:02:14 -05:00
|
|
|
form = forms.ModuleBayCreateForm
|
2021-12-17 09:35:57 -05:00
|
|
|
model_form = forms.ModuleBayForm
|
2022-02-23 13:02:14 -05:00
|
|
|
patterned_fields = ('name', 'label', 'position')
|
2021-12-17 09:35:57 -05:00
|
|
|
|
|
|
|
|
|
|
|
class ModuleBayEditView(generic.ObjectEditView):
|
|
|
|
queryset = ModuleBay.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.ModuleBayForm
|
2021-12-17 09:35:57 -05:00
|
|
|
template_name = 'dcim/device_component_edit.html'
|
|
|
|
|
|
|
|
|
|
|
|
class ModuleBayDeleteView(generic.ObjectDeleteView):
|
|
|
|
queryset = ModuleBay.objects.all()
|
|
|
|
|
|
|
|
|
|
|
|
class ModuleBayBulkImportView(generic.BulkImportView):
|
|
|
|
queryset = ModuleBay.objects.all()
|
|
|
|
model_form = forms.ModuleBayCSVForm
|
|
|
|
table = tables.ModuleBayTable
|
|
|
|
|
|
|
|
|
|
|
|
class ModuleBayBulkEditView(generic.BulkEditView):
|
|
|
|
queryset = ModuleBay.objects.all()
|
|
|
|
filterset = filtersets.ModuleBayFilterSet
|
|
|
|
table = tables.ModuleBayTable
|
|
|
|
form = forms.ModuleBayBulkEditForm
|
|
|
|
|
|
|
|
|
|
|
|
class ModuleBayBulkRenameView(generic.BulkRenameView):
|
|
|
|
queryset = ModuleBay.objects.all()
|
|
|
|
|
|
|
|
|
|
|
|
class ModuleBayBulkDeleteView(generic.BulkDeleteView):
|
|
|
|
queryset = ModuleBay.objects.all()
|
|
|
|
filterset = filtersets.ModuleBayFilterSet
|
|
|
|
table = tables.ModuleBayTable
|
|
|
|
|
|
|
|
|
2016-07-01 17:12:43 -04:00
|
|
|
#
|
|
|
|
# Device bays
|
|
|
|
#
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceBayListView(generic.ObjectListView):
|
2020-10-30 16:52:40 -04:00
|
|
|
queryset = DeviceBay.objects.all()
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.DeviceBayFilterSet
|
2020-01-09 20:57:13 -05:00
|
|
|
filterset_form = forms.DeviceBayFilterForm
|
2020-06-25 11:56:31 -04:00
|
|
|
table = tables.DeviceBayTable
|
2022-02-24 16:33:51 -05:00
|
|
|
actions = ('import', 'export', 'bulk_edit', 'bulk_delete')
|
2019-12-05 16:10:49 -06:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceBayView(generic.ObjectView):
|
2020-06-25 11:01:18 -04:00
|
|
|
queryset = DeviceBay.objects.all()
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceBayCreateView(generic.ComponentCreateView):
|
2020-05-21 16:28:11 -04:00
|
|
|
queryset = DeviceBay.objects.all()
|
2021-12-28 15:07:14 -05:00
|
|
|
form = forms.DeviceComponentCreateForm
|
2016-12-21 15:26:56 -05:00
|
|
|
model_form = forms.DeviceBayForm
|
2016-07-01 17:12:43 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceBayEditView(generic.ObjectEditView):
|
2020-05-11 12:37:22 -04:00
|
|
|
queryset = DeviceBay.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.DeviceBayForm
|
2020-09-04 16:09:05 -04:00
|
|
|
template_name = 'dcim/device_component_edit.html'
|
2016-07-01 17:12:43 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceBayDeleteView(generic.ObjectDeleteView):
|
2020-05-11 12:47:01 -04:00
|
|
|
queryset = DeviceBay.objects.all()
|
2016-07-01 17:12:43 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceBayPopulateView(generic.ObjectEditView):
|
2020-05-22 11:52:19 -04:00
|
|
|
queryset = DeviceBay.objects.all()
|
2017-12-21 15:08:05 -05:00
|
|
|
|
|
|
|
def get(self, request, pk):
|
2020-05-22 11:52:19 -04:00
|
|
|
device_bay = get_object_or_404(self.queryset, pk=pk)
|
2017-12-21 15:08:05 -05:00
|
|
|
form = forms.PopulateDeviceBayForm(device_bay)
|
|
|
|
|
|
|
|
return render(request, 'dcim/devicebay_populate.html', {
|
|
|
|
'device_bay': device_bay,
|
|
|
|
'form': form,
|
2020-11-10 11:46:04 -05:00
|
|
|
'return_url': self.get_return_url(request, device_bay),
|
2017-12-21 15:08:05 -05:00
|
|
|
})
|
2016-07-01 17:12:43 -04:00
|
|
|
|
2017-12-21 15:08:05 -05:00
|
|
|
def post(self, request, pk):
|
2020-05-22 11:52:19 -04:00
|
|
|
device_bay = get_object_or_404(self.queryset, pk=pk)
|
2016-07-01 17:12:43 -04:00
|
|
|
form = forms.PopulateDeviceBayForm(device_bay, request.POST)
|
2017-12-21 15:08:05 -05:00
|
|
|
|
2016-07-01 17:12:43 -04:00
|
|
|
if form.is_valid():
|
|
|
|
|
|
|
|
device_bay.installed_device = form.cleaned_data['installed_device']
|
|
|
|
device_bay.save()
|
2017-12-21 15:08:05 -05:00
|
|
|
messages.success(request, "Added {} to {}.".format(device_bay.installed_device, device_bay))
|
2022-01-04 13:24:15 -05:00
|
|
|
return_url = self.get_return_url(request)
|
2016-07-01 17:12:43 -04:00
|
|
|
|
2022-01-04 13:24:15 -05:00
|
|
|
return redirect(return_url)
|
2016-07-01 17:12:43 -04:00
|
|
|
|
2017-12-21 15:08:05 -05:00
|
|
|
return render(request, 'dcim/devicebay_populate.html', {
|
|
|
|
'device_bay': device_bay,
|
|
|
|
'form': form,
|
2020-11-10 11:46:04 -05:00
|
|
|
'return_url': self.get_return_url(request, device_bay),
|
2017-12-21 15:08:05 -05:00
|
|
|
})
|
2016-07-01 17:12:43 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceBayDepopulateView(generic.ObjectEditView):
|
2020-05-22 11:52:19 -04:00
|
|
|
queryset = DeviceBay.objects.all()
|
2017-12-21 15:08:05 -05:00
|
|
|
|
|
|
|
def get(self, request, pk):
|
2020-05-22 11:52:19 -04:00
|
|
|
device_bay = get_object_or_404(self.queryset, pk=pk)
|
2017-12-21 15:08:05 -05:00
|
|
|
form = ConfirmationForm()
|
2016-07-01 17:12:43 -04:00
|
|
|
|
2017-12-21 15:08:05 -05:00
|
|
|
return render(request, 'dcim/devicebay_depopulate.html', {
|
|
|
|
'device_bay': device_bay,
|
|
|
|
'form': form,
|
2020-11-10 11:46:04 -05:00
|
|
|
'return_url': self.get_return_url(request, device_bay),
|
2017-12-21 15:08:05 -05:00
|
|
|
})
|
2016-07-01 17:12:43 -04:00
|
|
|
|
2017-12-21 15:08:05 -05:00
|
|
|
def post(self, request, pk):
|
2020-05-22 11:52:19 -04:00
|
|
|
device_bay = get_object_or_404(self.queryset, pk=pk)
|
2016-07-01 17:12:43 -04:00
|
|
|
form = ConfirmationForm(request.POST)
|
2017-12-21 15:08:05 -05:00
|
|
|
|
2016-07-01 17:12:43 -04:00
|
|
|
if form.is_valid():
|
2017-12-21 15:08:05 -05:00
|
|
|
|
2016-07-01 17:12:43 -04:00
|
|
|
removed_device = device_bay.installed_device
|
|
|
|
device_bay.installed_device = None
|
|
|
|
device_bay.save()
|
2021-09-27 09:58:03 -04:00
|
|
|
messages.success(request, f"{removed_device} has been removed from {device_bay}.")
|
|
|
|
return_url = self.get_return_url(request, device_bay.device)
|
2016-07-01 17:12:43 -04:00
|
|
|
|
2021-09-27 09:58:03 -04:00
|
|
|
return redirect(return_url)
|
2016-07-01 17:12:43 -04:00
|
|
|
|
2017-12-21 15:08:05 -05:00
|
|
|
return render(request, 'dcim/devicebay_depopulate.html', {
|
|
|
|
'device_bay': device_bay,
|
|
|
|
'form': form,
|
2020-11-10 11:46:04 -05:00
|
|
|
'return_url': self.get_return_url(request, device_bay),
|
2017-12-21 15:08:05 -05:00
|
|
|
})
|
2016-07-01 17:12:43 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceBayBulkImportView(generic.BulkImportView):
|
2020-05-21 11:58:27 -04:00
|
|
|
queryset = DeviceBay.objects.all()
|
2019-12-05 21:36:11 +01:00
|
|
|
model_form = forms.DeviceBayCSVForm
|
2020-06-25 11:56:31 -04:00
|
|
|
table = tables.DeviceBayTable
|
2019-12-05 21:36:11 +01:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceBayBulkEditView(generic.BulkEditView):
|
2020-03-19 16:25:29 -04:00
|
|
|
queryset = DeviceBay.objects.all()
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.DeviceBayFilterSet
|
2020-03-19 16:25:29 -04:00
|
|
|
table = tables.DeviceBayTable
|
|
|
|
form = forms.DeviceBayBulkEditForm
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceBayBulkRenameView(generic.BulkRenameView):
|
2018-03-29 15:15:13 -04:00
|
|
|
queryset = DeviceBay.objects.all()
|
2018-01-10 15:48:07 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceBayBulkDeleteView(generic.BulkDeleteView):
|
2018-07-20 21:18:10 -04:00
|
|
|
queryset = DeviceBay.objects.all()
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.DeviceBayFilterSet
|
2017-07-13 16:31:47 -04:00
|
|
|
table = tables.DeviceBayTable
|
2016-07-26 10:14:51 -04:00
|
|
|
|
|
|
|
|
2020-07-01 14:46:12 -04:00
|
|
|
#
|
|
|
|
# Inventory items
|
|
|
|
#
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class InventoryItemListView(generic.ObjectListView):
|
2020-10-30 16:52:40 -04:00
|
|
|
queryset = InventoryItem.objects.all()
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.InventoryItemFilterSet
|
2020-07-01 14:46:12 -04:00
|
|
|
filterset_form = forms.InventoryItemFilterForm
|
|
|
|
table = tables.InventoryItemTable
|
2022-02-24 16:33:51 -05:00
|
|
|
actions = ('import', 'export', 'bulk_edit', 'bulk_delete')
|
2020-07-01 14:46:12 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class InventoryItemView(generic.ObjectView):
|
2020-07-01 14:46:12 -04:00
|
|
|
queryset = InventoryItem.objects.all()
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class InventoryItemEditView(generic.ObjectEditView):
|
2020-07-01 14:46:12 -04:00
|
|
|
queryset = InventoryItem.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.InventoryItemForm
|
2020-07-01 14:46:12 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class InventoryItemCreateView(generic.ComponentCreateView):
|
2020-07-01 14:46:12 -04:00
|
|
|
queryset = InventoryItem.objects.all()
|
2022-04-08 09:41:37 -04:00
|
|
|
form = forms.InventoryItemCreateForm
|
2020-07-01 14:46:12 -04:00
|
|
|
model_form = forms.InventoryItemForm
|
2021-12-28 14:06:20 -05:00
|
|
|
template_name = 'dcim/inventoryitem_create.html'
|
|
|
|
|
|
|
|
def alter_object(self, instance, request):
|
|
|
|
# Set component (if any)
|
|
|
|
component_type = request.GET.get('component_type')
|
|
|
|
component_id = request.GET.get('component_id')
|
|
|
|
|
|
|
|
if component_type and component_id:
|
|
|
|
content_type = get_object_or_404(ContentType, pk=component_type)
|
|
|
|
instance.component = get_object_or_404(content_type.model_class(), pk=component_id)
|
|
|
|
|
|
|
|
return instance
|
2020-07-01 14:46:12 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class InventoryItemDeleteView(generic.ObjectDeleteView):
|
2020-07-01 14:46:12 -04:00
|
|
|
queryset = InventoryItem.objects.all()
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class InventoryItemBulkImportView(generic.BulkImportView):
|
2020-07-01 14:46:12 -04:00
|
|
|
queryset = InventoryItem.objects.all()
|
|
|
|
model_form = forms.InventoryItemCSVForm
|
|
|
|
table = tables.InventoryItemTable
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class InventoryItemBulkEditView(generic.BulkEditView):
|
2021-12-27 10:45:33 -05:00
|
|
|
queryset = InventoryItem.objects.prefetch_related('device', 'manufacturer', 'role')
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.InventoryItemFilterSet
|
2020-07-01 14:46:12 -04:00
|
|
|
table = tables.InventoryItemTable
|
|
|
|
form = forms.InventoryItemBulkEditForm
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class InventoryItemBulkRenameView(generic.BulkRenameView):
|
2020-07-01 15:12:05 -04:00
|
|
|
queryset = InventoryItem.objects.all()
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class InventoryItemBulkDeleteView(generic.BulkDeleteView):
|
2021-12-27 10:45:33 -05:00
|
|
|
queryset = InventoryItem.objects.prefetch_related('device', 'manufacturer', 'role')
|
2020-07-01 14:46:12 -04:00
|
|
|
table = tables.InventoryItemTable
|
|
|
|
template_name = 'dcim/inventoryitem_bulk_delete.html'
|
|
|
|
|
|
|
|
|
2021-12-27 10:18:39 -05:00
|
|
|
#
|
|
|
|
# Inventory item roles
|
|
|
|
#
|
|
|
|
|
|
|
|
class InventoryItemRoleListView(generic.ObjectListView):
|
|
|
|
queryset = InventoryItemRole.objects.annotate(
|
|
|
|
inventoryitem_count=count_related(InventoryItem, 'role'),
|
|
|
|
)
|
|
|
|
filterset = filtersets.InventoryItemRoleFilterSet
|
|
|
|
filterset_form = forms.InventoryItemRoleFilterForm
|
|
|
|
table = tables.InventoryItemRoleTable
|
|
|
|
|
|
|
|
|
|
|
|
class InventoryItemRoleView(generic.ObjectView):
|
|
|
|
queryset = InventoryItemRole.objects.all()
|
|
|
|
|
|
|
|
def get_extra_context(self, request, instance):
|
|
|
|
return {
|
|
|
|
'inventoryitem_count': InventoryItem.objects.filter(role=instance).count(),
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class InventoryItemRoleEditView(generic.ObjectEditView):
|
|
|
|
queryset = InventoryItemRole.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.InventoryItemRoleForm
|
2021-12-27 10:18:39 -05:00
|
|
|
|
|
|
|
|
|
|
|
class InventoryItemRoleDeleteView(generic.ObjectDeleteView):
|
|
|
|
queryset = InventoryItemRole.objects.all()
|
|
|
|
|
|
|
|
|
|
|
|
class InventoryItemRoleBulkImportView(generic.BulkImportView):
|
|
|
|
queryset = InventoryItemRole.objects.all()
|
|
|
|
model_form = forms.InventoryItemRoleCSVForm
|
|
|
|
table = tables.InventoryItemRoleTable
|
|
|
|
|
|
|
|
|
|
|
|
class InventoryItemRoleBulkEditView(generic.BulkEditView):
|
|
|
|
queryset = InventoryItemRole.objects.annotate(
|
|
|
|
inventoryitem_count=count_related(InventoryItem, 'role'),
|
|
|
|
)
|
|
|
|
filterset = filtersets.InventoryItemRoleFilterSet
|
|
|
|
table = tables.InventoryItemRoleTable
|
|
|
|
form = forms.InventoryItemRoleBulkEditForm
|
|
|
|
|
|
|
|
|
|
|
|
class InventoryItemRoleBulkDeleteView(generic.BulkDeleteView):
|
|
|
|
queryset = InventoryItemRole.objects.annotate(
|
|
|
|
inventoryitem_count=count_related(InventoryItem, 'role'),
|
|
|
|
)
|
|
|
|
table = tables.InventoryItemRoleTable
|
|
|
|
|
|
|
|
|
2016-12-21 15:26:56 -05:00
|
|
|
#
|
2017-09-12 12:49:01 -04:00
|
|
|
# Bulk Device component creation
|
2016-12-21 15:26:56 -05:00
|
|
|
#
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceBulkAddConsolePortView(generic.BulkComponentCreateView):
|
2017-09-12 12:49:01 -04:00
|
|
|
parent_model = Device
|
|
|
|
parent_field = 'device'
|
2020-04-22 11:15:39 -04:00
|
|
|
form = forms.ConsolePortBulkCreateForm
|
2020-05-22 09:23:00 -04:00
|
|
|
queryset = ConsolePort.objects.all()
|
2016-12-21 15:26:56 -05:00
|
|
|
model_form = forms.ConsolePortForm
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.DeviceFilterSet
|
2017-09-12 12:49:01 -04:00
|
|
|
table = tables.DeviceTable
|
2017-09-29 12:15:14 -04:00
|
|
|
default_return_url = 'dcim:device_list'
|
2016-12-21 15:26:56 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceBulkAddConsoleServerPortView(generic.BulkComponentCreateView):
|
2017-09-12 12:49:01 -04:00
|
|
|
parent_model = Device
|
|
|
|
parent_field = 'device'
|
2020-04-22 11:15:39 -04:00
|
|
|
form = forms.ConsoleServerPortBulkCreateForm
|
2020-05-22 09:23:00 -04:00
|
|
|
queryset = ConsoleServerPort.objects.all()
|
2016-12-21 15:26:56 -05:00
|
|
|
model_form = forms.ConsoleServerPortForm
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.DeviceFilterSet
|
2017-09-12 12:49:01 -04:00
|
|
|
table = tables.DeviceTable
|
2017-09-29 12:15:14 -04:00
|
|
|
default_return_url = 'dcim:device_list'
|
2016-12-21 15:26:56 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceBulkAddPowerPortView(generic.BulkComponentCreateView):
|
2017-09-12 12:49:01 -04:00
|
|
|
parent_model = Device
|
|
|
|
parent_field = 'device'
|
2020-04-22 11:15:39 -04:00
|
|
|
form = forms.PowerPortBulkCreateForm
|
2020-05-22 09:23:00 -04:00
|
|
|
queryset = PowerPort.objects.all()
|
2016-12-21 15:26:56 -05:00
|
|
|
model_form = forms.PowerPortForm
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.DeviceFilterSet
|
2017-09-12 12:49:01 -04:00
|
|
|
table = tables.DeviceTable
|
2017-09-29 12:15:14 -04:00
|
|
|
default_return_url = 'dcim:device_list'
|
2016-12-21 15:26:56 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceBulkAddPowerOutletView(generic.BulkComponentCreateView):
|
2017-09-12 12:49:01 -04:00
|
|
|
parent_model = Device
|
|
|
|
parent_field = 'device'
|
2020-04-22 11:15:39 -04:00
|
|
|
form = forms.PowerOutletBulkCreateForm
|
2020-05-22 09:23:00 -04:00
|
|
|
queryset = PowerOutlet.objects.all()
|
2016-12-21 15:26:56 -05:00
|
|
|
model_form = forms.PowerOutletForm
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.DeviceFilterSet
|
2017-09-12 12:49:01 -04:00
|
|
|
table = tables.DeviceTable
|
2017-09-29 12:15:14 -04:00
|
|
|
default_return_url = 'dcim:device_list'
|
2016-12-21 15:26:56 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceBulkAddInterfaceView(generic.BulkComponentCreateView):
|
2017-09-12 12:49:01 -04:00
|
|
|
parent_model = Device
|
|
|
|
parent_field = 'device'
|
2020-04-22 11:15:39 -04:00
|
|
|
form = forms.InterfaceBulkCreateForm
|
2020-05-22 09:23:00 -04:00
|
|
|
queryset = Interface.objects.all()
|
2016-12-21 15:26:56 -05:00
|
|
|
model_form = forms.InterfaceForm
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.DeviceFilterSet
|
2017-09-12 12:49:01 -04:00
|
|
|
table = tables.DeviceTable
|
2017-09-29 12:15:14 -04:00
|
|
|
default_return_url = 'dcim:device_list'
|
2016-12-21 15:26:56 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
# class DeviceBulkAddFrontPortView(generic.BulkComponentCreateView):
|
2020-04-22 11:26:04 -04:00
|
|
|
# parent_model = Device
|
|
|
|
# parent_field = 'device'
|
|
|
|
# form = forms.FrontPortBulkCreateForm
|
2020-05-22 09:23:00 -04:00
|
|
|
# queryset = FrontPort.objects.all()
|
2020-04-22 11:26:04 -04:00
|
|
|
# model_form = forms.FrontPortForm
|
2021-04-29 16:38:56 -04:00
|
|
|
# filterset = filtersets.DeviceFilterSet
|
2020-04-22 11:26:04 -04:00
|
|
|
# table = tables.DeviceTable
|
|
|
|
# default_return_url = 'dcim:device_list'
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceBulkAddRearPortView(generic.BulkComponentCreateView):
|
2020-04-22 11:26:04 -04:00
|
|
|
parent_model = Device
|
|
|
|
parent_field = 'device'
|
|
|
|
form = forms.RearPortBulkCreateForm
|
2020-05-22 09:23:00 -04:00
|
|
|
queryset = RearPort.objects.all()
|
2020-04-22 11:26:04 -04:00
|
|
|
model_form = forms.RearPortForm
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.DeviceFilterSet
|
2020-04-22 11:26:04 -04:00
|
|
|
table = tables.DeviceTable
|
|
|
|
default_return_url = 'dcim:device_list'
|
|
|
|
|
|
|
|
|
2021-12-17 09:35:57 -05:00
|
|
|
class DeviceBulkAddModuleBayView(generic.BulkComponentCreateView):
|
|
|
|
parent_model = Device
|
|
|
|
parent_field = 'device'
|
|
|
|
form = forms.ModuleBayBulkCreateForm
|
|
|
|
queryset = ModuleBay.objects.all()
|
|
|
|
model_form = forms.ModuleBayForm
|
|
|
|
filterset = filtersets.DeviceFilterSet
|
|
|
|
table = tables.DeviceTable
|
|
|
|
default_return_url = 'dcim:device_list'
|
2022-07-26 17:16:03 -04:00
|
|
|
patterned_fields = ('name', 'label', 'position')
|
2021-12-17 09:35:57 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceBulkAddDeviceBayView(generic.BulkComponentCreateView):
|
2017-09-12 12:49:01 -04:00
|
|
|
parent_model = Device
|
|
|
|
parent_field = 'device'
|
2020-04-22 11:15:39 -04:00
|
|
|
form = forms.DeviceBayBulkCreateForm
|
2020-05-22 09:23:00 -04:00
|
|
|
queryset = DeviceBay.objects.all()
|
2016-12-21 15:26:56 -05:00
|
|
|
model_form = forms.DeviceBayForm
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.DeviceFilterSet
|
2017-09-12 12:49:01 -04:00
|
|
|
table = tables.DeviceTable
|
2017-09-29 12:15:14 -04:00
|
|
|
default_return_url = 'dcim:device_list'
|
2016-12-21 15:26:56 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class DeviceBulkAddInventoryItemView(generic.BulkComponentCreateView):
|
2020-07-01 14:55:11 -04:00
|
|
|
parent_model = Device
|
|
|
|
parent_field = 'device'
|
|
|
|
form = forms.InventoryItemBulkCreateForm
|
|
|
|
queryset = InventoryItem.objects.all()
|
|
|
|
model_form = forms.InventoryItemForm
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.DeviceFilterSet
|
2020-07-01 14:55:11 -04:00
|
|
|
table = tables.DeviceTable
|
|
|
|
default_return_url = 'dcim:device_list'
|
|
|
|
|
|
|
|
|
2018-10-24 14:24:02 -04:00
|
|
|
#
|
|
|
|
# Cables
|
|
|
|
#
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class CableListView(generic.ObjectListView):
|
2020-10-30 16:52:40 -04:00
|
|
|
queryset = Cable.objects.all()
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.CableFilterSet
|
2020-01-09 20:57:13 -05:00
|
|
|
filterset_form = forms.CableFilterForm
|
2018-10-24 14:24:02 -04:00
|
|
|
table = tables.CableTable
|
2022-02-24 16:33:51 -05:00
|
|
|
actions = ('import', 'export', 'bulk_edit', 'bulk_delete')
|
2018-10-24 14:24:02 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class CableView(generic.ObjectView):
|
2020-05-21 15:39:07 -04:00
|
|
|
queryset = Cable.objects.all()
|
2018-10-25 15:51:12 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PathTraceView(generic.ObjectView):
|
2018-10-31 17:05:25 -04:00
|
|
|
"""
|
2020-10-02 14:54:16 -04:00
|
|
|
Trace a cable path beginning from the given path endpoint (origin).
|
2018-10-31 17:05:25 -04:00
|
|
|
"""
|
2020-05-22 12:41:20 -04:00
|
|
|
additional_permissions = ['dcim.view_cable']
|
2020-11-19 15:59:11 -05:00
|
|
|
template_name = 'dcim/cable_trace.html'
|
2018-10-31 17:05:25 -04:00
|
|
|
|
2020-05-22 12:05:34 -04:00
|
|
|
def dispatch(self, request, *args, **kwargs):
|
|
|
|
model = kwargs.pop('model')
|
|
|
|
self.queryset = model.objects.all()
|
2018-10-31 17:05:25 -04:00
|
|
|
|
2020-05-22 12:05:34 -04:00
|
|
|
return super().dispatch(request, *args, **kwargs)
|
|
|
|
|
2020-11-19 15:59:11 -05:00
|
|
|
def get_extra_context(self, request, instance):
|
2020-10-05 16:03:30 -04:00
|
|
|
related_paths = []
|
|
|
|
|
|
|
|
# If tracing a PathEndpoint, locate the CablePath (if one exists) by its origin
|
2020-11-19 15:59:11 -05:00
|
|
|
if isinstance(instance, PathEndpoint):
|
|
|
|
path = instance._path
|
2020-11-11 11:48:55 -05:00
|
|
|
|
2020-10-05 16:03:30 -04:00
|
|
|
# Otherwise, find all CablePaths which traverse the specified object
|
|
|
|
else:
|
2020-11-24 08:41:48 -06:00
|
|
|
related_paths = CablePath.objects.filter(path__contains=instance).prefetch_related('origin')
|
2020-10-05 16:03:30 -04:00
|
|
|
# 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()
|
|
|
|
|
2021-09-16 08:56:26 -04:00
|
|
|
# No paths found
|
|
|
|
if path is None:
|
|
|
|
return {
|
|
|
|
'path': None
|
|
|
|
}
|
|
|
|
|
2021-01-22 16:45:08 +00:00
|
|
|
# Get the total length of the cable and whether the length is definitive (fully defined)
|
2021-03-26 09:40:51 -04:00
|
|
|
total_length, is_definitive = path.get_total_length() if path else (None, False)
|
2021-01-22 16:45:08 +00:00
|
|
|
|
2021-07-14 15:29:04 -04:00
|
|
|
# Determine the path to the SVG trace image
|
|
|
|
api_viewname = f"{path.origin._meta.app_label}-api:{path.origin._meta.model_name}-trace"
|
|
|
|
svg_url = f"{reverse(api_viewname, kwargs={'pk': path.origin.pk})}?render=svg"
|
|
|
|
|
2020-11-19 15:59:11 -05:00
|
|
|
return {
|
2020-11-11 11:48:55 -05:00
|
|
|
'path': path,
|
2020-10-05 16:03:30 -04:00
|
|
|
'related_paths': related_paths,
|
2021-01-22 16:45:08 +00:00
|
|
|
'total_length': total_length,
|
2021-07-14 15:29:04 -04:00
|
|
|
'is_definitive': is_definitive,
|
|
|
|
'svg_url': svg_url,
|
2020-11-19 15:59:11 -05:00
|
|
|
}
|
2018-10-31 17:05:25 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class CableCreateView(generic.ObjectEditView):
|
2020-06-02 15:15:57 -04:00
|
|
|
queryset = Cable.objects.all()
|
2018-10-24 14:24:02 -04:00
|
|
|
template_name = 'dcim/cable_connect.html'
|
|
|
|
|
2019-03-21 17:47:43 -04:00
|
|
|
def dispatch(self, request, *args, **kwargs):
|
2018-10-24 14:24:02 -04:00
|
|
|
|
2022-03-23 10:55:09 -04:00
|
|
|
# Set the form class based on the type of component being connected
|
|
|
|
self.form = {
|
2019-04-09 16:49:04 -04:00
|
|
|
'console-port': forms.ConnectCableToConsolePortForm,
|
|
|
|
'console-server-port': forms.ConnectCableToConsoleServerPortForm,
|
|
|
|
'power-port': forms.ConnectCableToPowerPortForm,
|
|
|
|
'power-outlet': forms.ConnectCableToPowerOutletForm,
|
|
|
|
'interface': forms.ConnectCableToInterfaceForm,
|
|
|
|
'front-port': forms.ConnectCableToFrontPortForm,
|
2019-05-22 19:58:26 +02:00
|
|
|
'rear-port': forms.ConnectCableToRearPortForm,
|
2019-04-09 16:49:04 -04:00
|
|
|
'power-feed': forms.ConnectCableToPowerFeedForm,
|
|
|
|
'circuit-termination': forms.ConnectCableToCircuitTerminationForm,
|
2020-06-02 15:15:57 -04:00
|
|
|
}[kwargs.get('termination_b_type')]
|
2019-03-21 17:47:43 -04:00
|
|
|
|
|
|
|
return super().dispatch(request, *args, **kwargs)
|
|
|
|
|
2022-02-16 09:27:16 -05:00
|
|
|
def get_object(self, **kwargs):
|
|
|
|
# Always return a new instance
|
|
|
|
return self.queryset.model()
|
|
|
|
|
2021-12-14 11:28:13 -05:00
|
|
|
def alter_object(self, obj, request, url_args, url_kwargs):
|
2020-06-02 15:15:57 -04:00
|
|
|
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
|
|
|
|
|
2019-03-21 17:47:43 -04:00
|
|
|
def get(self, request, *args, **kwargs):
|
2021-12-14 11:28:13 -05:00
|
|
|
obj = self.get_object(**kwargs)
|
|
|
|
obj = self.alter_object(obj, request, args, kwargs)
|
2019-03-21 17:47:43 -04:00
|
|
|
|
|
|
|
# Parse initial data manually to avoid setting field values as lists
|
|
|
|
initial_data = {k: request.GET[k] for k in request.GET}
|
|
|
|
|
2020-01-22 16:07:09 -05:00
|
|
|
# Set initial site and rack based on side A termination (if not already set)
|
2021-03-05 13:06:21 -05:00
|
|
|
termination_a_site = getattr(obj.termination_a.parent_object, 'site', None)
|
2020-11-04 15:27:41 -05:00
|
|
|
if termination_a_site and 'termination_b_region' not in initial_data:
|
|
|
|
initial_data['termination_b_region'] = termination_a_site.region
|
2021-03-08 13:28:53 -05:00
|
|
|
if termination_a_site and 'termination_b_site_group' not in initial_data:
|
|
|
|
initial_data['termination_b_site_group'] = termination_a_site.group
|
2020-01-22 16:07:09 -05:00
|
|
|
if 'termination_b_site' not in initial_data:
|
2020-11-04 15:27:41 -05:00
|
|
|
initial_data['termination_b_site'] = termination_a_site
|
2020-01-22 16:07:09 -05:00
|
|
|
if 'termination_b_rack' not in initial_data:
|
2021-03-05 13:06:21 -05:00
|
|
|
initial_data['termination_b_rack'] = getattr(obj.termination_a.parent_object, 'rack', None)
|
2019-03-21 17:47:43 -04:00
|
|
|
|
2022-03-23 10:55:09 -04:00
|
|
|
form = self.form(instance=obj, initial=initial_data)
|
2019-03-21 17:47:43 -04:00
|
|
|
|
|
|
|
return render(request, self.template_name, {
|
2020-06-02 15:15:57 -04:00
|
|
|
'obj': obj,
|
2019-03-21 17:47:43 -04:00
|
|
|
'obj_type': Cable._meta.verbose_name,
|
2019-04-09 16:49:04 -04:00
|
|
|
'termination_b_type': self.termination_b_type.name,
|
2019-03-21 17:47:43 -04:00
|
|
|
'form': form,
|
2020-06-02 15:15:57 -04:00
|
|
|
'return_url': self.get_return_url(request, obj),
|
2019-03-21 17:47:43 -04:00
|
|
|
})
|
2018-10-24 14:24:02 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class CableEditView(generic.ObjectEditView):
|
2020-05-11 12:37:22 -04:00
|
|
|
queryset = Cable.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.CableForm
|
2018-11-01 11:54:34 -04:00
|
|
|
template_name = 'dcim/cable_edit.html'
|
2018-10-25 15:51:12 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class CableDeleteView(generic.ObjectDeleteView):
|
2020-05-11 12:47:01 -04:00
|
|
|
queryset = Cable.objects.all()
|
2018-10-24 14:24:02 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class CableBulkImportView(generic.BulkImportView):
|
2020-05-21 11:58:27 -04:00
|
|
|
queryset = Cable.objects.all()
|
2018-10-31 17:05:25 -04:00
|
|
|
model_form = forms.CableCSVForm
|
|
|
|
table = tables.CableTable
|
2018-10-30 16:30:03 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class CableBulkEditView(generic.BulkEditView):
|
2018-11-01 13:19:24 -04:00
|
|
|
queryset = Cable.objects.prefetch_related('termination_a', 'termination_b')
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.CableFilterSet
|
2018-11-01 13:19:24 -04:00
|
|
|
table = tables.CableTable
|
|
|
|
form = forms.CableBulkEditForm
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class CableBulkDeleteView(generic.BulkDeleteView):
|
2018-11-01 13:19:24 -04:00
|
|
|
queryset = Cable.objects.prefetch_related('termination_a', 'termination_b')
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.CableFilterSet
|
2018-11-01 13:19:24 -04:00
|
|
|
table = tables.CableTable
|
|
|
|
|
|
|
|
|
2016-03-01 11:23:03 -05:00
|
|
|
#
|
|
|
|
# Connections
|
|
|
|
#
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ConsoleConnectionsListView(generic.ObjectListView):
|
2020-10-30 16:52:40 -04:00
|
|
|
queryset = ConsolePort.objects.filter(_path__isnull=False).order_by('device')
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.ConsoleConnectionFilterSet
|
2020-01-09 20:57:13 -05:00
|
|
|
filterset_form = forms.ConsoleConnectionFilterForm
|
2016-05-18 16:02:53 -04:00
|
|
|
table = tables.ConsoleConnectionTable
|
2020-11-10 16:00:21 -05:00
|
|
|
template_name = 'dcim/connections_list.html'
|
2022-02-24 16:33:51 -05:00
|
|
|
actions = ('export',)
|
2016-03-01 11:23:03 -05:00
|
|
|
|
2021-12-14 11:28:13 -05:00
|
|
|
def get_extra_context(self, request):
|
2020-11-10 16:00:21 -05:00
|
|
|
return {
|
|
|
|
'title': 'Console Connections'
|
|
|
|
}
|
|
|
|
|
2016-03-01 11:23:03 -05:00
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerConnectionsListView(generic.ObjectListView):
|
2020-10-30 16:52:40 -04:00
|
|
|
queryset = PowerPort.objects.filter(_path__isnull=False).order_by('device')
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.PowerConnectionFilterSet
|
2020-01-09 20:57:13 -05:00
|
|
|
filterset_form = forms.PowerConnectionFilterForm
|
2016-05-18 16:02:53 -04:00
|
|
|
table = tables.PowerConnectionTable
|
2020-11-10 16:00:21 -05:00
|
|
|
template_name = 'dcim/connections_list.html'
|
2022-02-24 16:33:51 -05:00
|
|
|
actions = ('export',)
|
2016-03-01 11:23:03 -05:00
|
|
|
|
2021-12-14 11:28:13 -05:00
|
|
|
def get_extra_context(self, request):
|
2020-11-10 16:00:21 -05:00
|
|
|
return {
|
|
|
|
'title': 'Power Connections'
|
|
|
|
}
|
|
|
|
|
2016-03-01 11:23:03 -05:00
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class InterfaceConnectionsListView(generic.ObjectListView):
|
2021-07-27 16:21:56 -04:00
|
|
|
queryset = Interface.objects.filter(_path__isnull=False).order_by('device')
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.InterfaceConnectionFilterSet
|
2020-01-09 20:57:13 -05:00
|
|
|
filterset_form = forms.InterfaceConnectionFilterForm
|
2016-05-18 16:02:53 -04:00
|
|
|
table = tables.InterfaceConnectionTable
|
2020-11-10 16:00:21 -05:00
|
|
|
template_name = 'dcim/connections_list.html'
|
2022-02-24 16:33:51 -05:00
|
|
|
actions = ('export',)
|
2016-03-01 11:23:03 -05:00
|
|
|
|
2021-12-14 11:28:13 -05:00
|
|
|
def get_extra_context(self, request):
|
2020-11-10 16:00:21 -05:00
|
|
|
return {
|
|
|
|
'title': 'Interface Connections'
|
|
|
|
}
|
|
|
|
|
2016-03-01 11:23:03 -05:00
|
|
|
|
2017-11-17 16:47:26 -05:00
|
|
|
#
|
|
|
|
# Virtual chassis
|
|
|
|
#
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class VirtualChassisListView(generic.ObjectListView):
|
2020-07-20 12:07:19 -04:00
|
|
|
queryset = VirtualChassis.objects.prefetch_related('master').annotate(
|
2020-12-17 14:47:49 -05:00
|
|
|
member_count=count_related(Device, 'virtual_chassis')
|
2020-11-25 15:49:18 -05:00
|
|
|
)
|
2017-11-17 16:47:26 -05:00
|
|
|
table = tables.VirtualChassisTable
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.VirtualChassisFilterSet
|
2020-01-09 20:57:13 -05:00
|
|
|
filterset_form = forms.VirtualChassisFilterForm
|
2017-11-17 16:47:26 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class VirtualChassisView(generic.ObjectView):
|
2020-06-26 12:22:02 -04:00
|
|
|
queryset = VirtualChassis.objects.all()
|
2020-04-24 14:59:38 -04:00
|
|
|
|
2020-11-19 15:59:11 -05:00
|
|
|
def get_extra_context(self, request, instance):
|
|
|
|
members = Device.objects.restrict(request.user).filter(virtual_chassis=instance)
|
2020-04-24 14:59:38 -04:00
|
|
|
|
2020-11-19 15:59:11 -05:00
|
|
|
return {
|
2020-06-26 12:22:02 -04:00
|
|
|
'members': members,
|
2020-11-19 15:59:11 -05:00
|
|
|
}
|
2020-04-24 14:59:38 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class VirtualChassisCreateView(generic.ObjectEditView):
|
2020-06-02 15:33:41 -04:00
|
|
|
queryset = VirtualChassis.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.VirtualChassisCreateForm
|
2020-06-24 15:12:22 -04:00
|
|
|
template_name = 'dcim/virtualchassis_add.html'
|
2017-11-29 12:58:36 -05:00
|
|
|
|
|
|
|
|
2020-06-02 15:33:41 -04:00
|
|
|
class VirtualChassisEditView(ObjectPermissionRequiredMixin, GetReturnURLMixin, View):
|
|
|
|
queryset = VirtualChassis.objects.all()
|
|
|
|
|
|
|
|
def get_required_permission(self):
|
|
|
|
return 'dcim.change_virtualchassis'
|
2018-01-19 12:34:09 -05:00
|
|
|
|
|
|
|
def get(self, request, pk):
|
|
|
|
|
2020-06-10 16:37:35 -04:00
|
|
|
virtual_chassis = get_object_or_404(self.queryset, pk=pk)
|
2018-02-14 12:05:00 -05:00
|
|
|
VCMemberFormSet = modelformset_factory(
|
|
|
|
model=Device,
|
|
|
|
form=forms.DeviceVCMembershipForm,
|
|
|
|
formset=forms.BaseVCMemberFormSet,
|
|
|
|
extra=0
|
|
|
|
)
|
2019-08-19 01:53:39 -04:00
|
|
|
members_queryset = virtual_chassis.members.prefetch_related('rack').order_by('vc_position')
|
2018-01-19 12:34:09 -05:00
|
|
|
|
2018-01-31 22:47:27 -05:00
|
|
|
vc_form = forms.VirtualChassisForm(instance=virtual_chassis)
|
2018-02-14 12:05:00 -05:00
|
|
|
vc_form.fields['master'].queryset = members_queryset
|
|
|
|
formset = VCMemberFormSet(queryset=members_queryset)
|
2018-01-19 12:34:09 -05:00
|
|
|
|
2018-01-31 22:47:27 -05:00
|
|
|
return render(request, 'dcim/virtualchassis_edit.html', {
|
|
|
|
'vc_form': vc_form,
|
|
|
|
'formset': formset,
|
|
|
|
'return_url': self.get_return_url(request, virtual_chassis),
|
2018-01-19 12:34:09 -05:00
|
|
|
})
|
|
|
|
|
|
|
|
def post(self, request, pk):
|
|
|
|
|
2020-06-10 16:37:35 -04:00
|
|
|
virtual_chassis = get_object_or_404(self.queryset, pk=pk)
|
2018-02-14 12:05:00 -05:00
|
|
|
VCMemberFormSet = modelformset_factory(
|
|
|
|
model=Device,
|
|
|
|
form=forms.DeviceVCMembershipForm,
|
|
|
|
formset=forms.BaseVCMemberFormSet,
|
|
|
|
extra=0
|
|
|
|
)
|
2019-08-19 01:53:39 -04:00
|
|
|
members_queryset = virtual_chassis.members.prefetch_related('rack').order_by('vc_position')
|
2018-01-19 12:34:09 -05:00
|
|
|
|
2018-01-31 22:47:27 -05:00
|
|
|
vc_form = forms.VirtualChassisForm(request.POST, instance=virtual_chassis)
|
2018-02-14 12:05:00 -05:00
|
|
|
vc_form.fields['master'].queryset = members_queryset
|
|
|
|
formset = VCMemberFormSet(request.POST, queryset=members_queryset)
|
2018-01-19 12:34:09 -05:00
|
|
|
|
2018-01-31 22:47:27 -05:00
|
|
|
if vc_form.is_valid() and formset.is_valid():
|
2018-01-19 12:34:09 -05:00
|
|
|
|
2018-02-01 15:53:59 -05:00
|
|
|
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)
|
2019-08-20 17:16:00 -04:00
|
|
|
devices = Device.objects.filter(pk__in=[m.pk for m in members])
|
|
|
|
for device in devices:
|
|
|
|
device.vc_position = None
|
|
|
|
device.save()
|
2018-02-01 15:53:59 -05:00
|
|
|
for member in members:
|
|
|
|
member.save()
|
2018-01-19 12:34:09 -05:00
|
|
|
|
2020-06-24 15:12:22 -04:00
|
|
|
return redirect(virtual_chassis.get_absolute_url())
|
2018-01-19 12:34:09 -05:00
|
|
|
|
2018-02-01 11:39:13 -05:00
|
|
|
return render(request, 'dcim/virtualchassis_edit.html', {
|
2018-01-31 22:47:27 -05:00
|
|
|
'vc_form': vc_form,
|
|
|
|
'formset': formset,
|
|
|
|
'return_url': self.get_return_url(request, virtual_chassis),
|
2018-01-19 12:34:09 -05:00
|
|
|
})
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class VirtualChassisDeleteView(generic.ObjectDeleteView):
|
2020-05-11 12:47:01 -04:00
|
|
|
queryset = VirtualChassis.objects.all()
|
2018-02-01 11:39:13 -05:00
|
|
|
|
|
|
|
|
2020-06-02 15:33:41 -04:00
|
|
|
class VirtualChassisAddMemberView(ObjectPermissionRequiredMixin, GetReturnURLMixin, View):
|
|
|
|
queryset = VirtualChassis.objects.all()
|
|
|
|
|
|
|
|
def get_required_permission(self):
|
|
|
|
return 'dcim.change_virtualchassis'
|
2018-02-01 11:39:13 -05:00
|
|
|
|
|
|
|
def get(self, request, pk):
|
|
|
|
|
2020-06-02 15:33:41 -04:00
|
|
|
virtual_chassis = get_object_or_404(self.queryset, pk=pk)
|
2018-02-01 11:39:13 -05:00
|
|
|
|
|
|
|
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):
|
|
|
|
|
2020-06-02 15:33:41 -04:00
|
|
|
virtual_chassis = get_object_or_404(self.queryset, pk=pk)
|
2018-02-01 11:39:13 -05:00
|
|
|
|
|
|
|
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']}
|
2018-03-06 11:48:26 -05:00
|
|
|
membership_form = forms.DeviceVCMembershipForm(data=data, validate_vc_position=True, instance=device)
|
2018-02-01 11:39:13 -05:00
|
|
|
|
|
|
|
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:
|
|
|
|
|
2018-03-06 11:48:26 -05:00
|
|
|
membership_form = forms.DeviceVCMembershipForm(data=request.POST)
|
2018-02-01 11:39:13 -05:00
|
|
|
|
|
|
|
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),
|
|
|
|
})
|
2018-02-01 12:49:23 -05:00
|
|
|
|
|
|
|
|
2020-06-02 15:33:41 -04:00
|
|
|
class VirtualChassisRemoveMemberView(ObjectPermissionRequiredMixin, GetReturnURLMixin, View):
|
|
|
|
queryset = Device.objects.all()
|
|
|
|
|
|
|
|
def get_required_permission(self):
|
|
|
|
return 'dcim.change_device'
|
2018-02-01 12:49:23 -05:00
|
|
|
|
|
|
|
def get(self, request, pk):
|
|
|
|
|
2020-06-02 15:33:41 -04:00
|
|
|
device = get_object_or_404(self.queryset, pk=pk, virtual_chassis__isnull=False)
|
2018-02-01 12:49:23 -05:00
|
|
|
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):
|
|
|
|
|
2020-06-02 15:33:41 -04:00
|
|
|
device = get_object_or_404(self.queryset, pk=pk, virtual_chassis__isnull=False)
|
2018-02-01 12:49:23 -05:00
|
|
|
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():
|
|
|
|
|
2019-08-20 17:16:00 -04:00
|
|
|
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()
|
2018-02-01 12:49:23 -05:00
|
|
|
|
|
|
|
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),
|
|
|
|
})
|
2019-03-11 22:40:52 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class VirtualChassisBulkImportView(generic.BulkImportView):
|
2020-06-24 15:29:25 -04:00
|
|
|
queryset = VirtualChassis.objects.all()
|
|
|
|
model_form = forms.VirtualChassisCSVForm
|
|
|
|
table = tables.VirtualChassisTable
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class VirtualChassisBulkEditView(generic.BulkEditView):
|
2020-04-24 15:20:52 -04:00
|
|
|
queryset = VirtualChassis.objects.all()
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.VirtualChassisFilterSet
|
2020-04-24 15:20:52 -04:00
|
|
|
table = tables.VirtualChassisTable
|
|
|
|
form = forms.VirtualChassisBulkEditForm
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class VirtualChassisBulkDeleteView(generic.BulkDeleteView):
|
2020-04-24 15:20:52 -04:00
|
|
|
queryset = VirtualChassis.objects.all()
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.VirtualChassisFilterSet
|
2020-04-24 15:20:52 -04:00
|
|
|
table = tables.VirtualChassisTable
|
|
|
|
|
|
|
|
|
2019-03-11 22:40:52 -04:00
|
|
|
#
|
|
|
|
# Power panels
|
|
|
|
#
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerPanelListView(generic.ObjectListView):
|
2019-08-19 01:53:39 -04:00
|
|
|
queryset = PowerPanel.objects.prefetch_related(
|
2021-03-03 13:30:33 -05:00
|
|
|
'site', 'location'
|
2019-03-11 22:40:52 -04:00
|
|
|
).annotate(
|
2020-12-17 14:47:49 -05:00
|
|
|
powerfeed_count=count_related(PowerFeed, 'power_panel')
|
2020-11-25 15:49:18 -05:00
|
|
|
)
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.PowerPanelFilterSet
|
2020-01-09 20:57:13 -05:00
|
|
|
filterset_form = forms.PowerPanelFilterForm
|
2019-03-11 22:40:52 -04:00
|
|
|
table = tables.PowerPanelTable
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerPanelView(generic.ObjectView):
|
2021-03-03 13:30:33 -05:00
|
|
|
queryset = PowerPanel.objects.prefetch_related('site', 'location')
|
2019-03-12 10:15:56 -04:00
|
|
|
|
2020-11-19 15:59:11 -05:00
|
|
|
def get_extra_context(self, request, instance):
|
|
|
|
power_feeds = PowerFeed.objects.restrict(request.user).filter(power_panel=instance).prefetch_related('rack')
|
2019-03-22 21:58:45 -04:00
|
|
|
powerfeed_table = tables.PowerFeedTable(
|
2020-06-26 12:22:02 -04:00
|
|
|
data=power_feeds,
|
2019-03-22 21:58:45 -04:00
|
|
|
orderable=False
|
|
|
|
)
|
2021-04-12 15:02:29 -04:00
|
|
|
if request.user.has_perm('dcim.delete_cable'):
|
|
|
|
powerfeed_table.columns.show('pk')
|
2019-03-22 21:58:45 -04:00
|
|
|
powerfeed_table.exclude = ['power_panel']
|
2019-03-12 10:15:56 -04:00
|
|
|
|
2020-11-19 15:59:11 -05:00
|
|
|
return {
|
2019-03-22 21:58:45 -04:00
|
|
|
'powerfeed_table': powerfeed_table,
|
2020-11-19 15:59:11 -05:00
|
|
|
}
|
2019-03-12 10:15:56 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerPanelEditView(generic.ObjectEditView):
|
2020-05-11 12:37:22 -04:00
|
|
|
queryset = PowerPanel.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.PowerPanelForm
|
2019-03-11 22:40:52 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerPanelDeleteView(generic.ObjectDeleteView):
|
2020-05-11 12:47:01 -04:00
|
|
|
queryset = PowerPanel.objects.all()
|
2019-03-12 10:15:56 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerPanelBulkImportView(generic.BulkImportView):
|
2020-05-21 11:58:27 -04:00
|
|
|
queryset = PowerPanel.objects.all()
|
2019-03-11 22:40:52 -04:00
|
|
|
model_form = forms.PowerPanelCSVForm
|
|
|
|
table = tables.PowerPanelTable
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerPanelBulkEditView(generic.BulkEditView):
|
2021-03-03 13:30:33 -05:00
|
|
|
queryset = PowerPanel.objects.prefetch_related('site', 'location')
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.PowerPanelFilterSet
|
2020-03-06 16:05:26 -05:00
|
|
|
table = tables.PowerPanelTable
|
|
|
|
form = forms.PowerPanelBulkEditForm
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerPanelBulkDeleteView(generic.BulkDeleteView):
|
2019-08-19 01:53:39 -04:00
|
|
|
queryset = PowerPanel.objects.prefetch_related(
|
2021-03-03 13:30:33 -05:00
|
|
|
'site', 'location'
|
2019-03-11 22:40:52 -04:00
|
|
|
).annotate(
|
2020-12-17 14:47:49 -05:00
|
|
|
powerfeed_count=count_related(PowerFeed, 'power_panel')
|
2020-11-25 15:49:18 -05:00
|
|
|
)
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.PowerPanelFilterSet
|
2019-03-11 22:40:52 -04:00
|
|
|
table = tables.PowerPanelTable
|
|
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
# Power feeds
|
|
|
|
#
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerFeedListView(generic.ObjectListView):
|
2020-10-30 16:52:40 -04:00
|
|
|
queryset = PowerFeed.objects.all()
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.PowerFeedFilterSet
|
2020-01-09 20:57:13 -05:00
|
|
|
filterset_form = forms.PowerFeedFilterForm
|
2019-03-11 22:40:52 -04:00
|
|
|
table = tables.PowerFeedTable
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerFeedView(generic.ObjectView):
|
2020-05-21 15:39:07 -04:00
|
|
|
queryset = PowerFeed.objects.prefetch_related('power_panel', 'rack')
|
2019-03-11 22:40:52 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerFeedEditView(generic.ObjectEditView):
|
2020-05-11 12:37:22 -04:00
|
|
|
queryset = PowerFeed.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.PowerFeedForm
|
2019-03-11 22:40:52 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerFeedDeleteView(generic.ObjectDeleteView):
|
2020-05-11 12:47:01 -04:00
|
|
|
queryset = PowerFeed.objects.all()
|
2019-03-11 22:40:52 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerFeedBulkImportView(generic.BulkImportView):
|
2020-05-21 11:58:27 -04:00
|
|
|
queryset = PowerFeed.objects.all()
|
2019-03-11 22:40:52 -04:00
|
|
|
model_form = forms.PowerFeedCSVForm
|
|
|
|
table = tables.PowerFeedTable
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerFeedBulkEditView(generic.BulkEditView):
|
2019-08-19 01:53:39 -04:00
|
|
|
queryset = PowerFeed.objects.prefetch_related('power_panel', 'rack')
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.PowerFeedFilterSet
|
2019-03-11 22:40:52 -04:00
|
|
|
table = tables.PowerFeedTable
|
|
|
|
form = forms.PowerFeedBulkEditForm
|
|
|
|
|
|
|
|
|
2021-04-12 15:02:29 -04:00
|
|
|
class PowerFeedBulkDisconnectView(BulkDisconnectView):
|
|
|
|
queryset = PowerFeed.objects.all()
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PowerFeedBulkDeleteView(generic.BulkDeleteView):
|
2019-08-19 01:53:39 -04:00
|
|
|
queryset = PowerFeed.objects.prefetch_related('power_panel', 'rack')
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.PowerFeedFilterSet
|
2019-03-11 22:40:52 -04:00
|
|
|
table = tables.PowerFeedTable
|