Relocate and group generic views

This commit is contained in:
Jeremy Stretch 2020-11-11 16:07:38 -05:00
parent 8714c33e8a
commit b3c770216e
12 changed files with 1682 additions and 1699 deletions

View File

@ -4,11 +4,9 @@ from django.db.models import Count
from django.shortcuts import get_object_or_404, redirect, render from django.shortcuts import get_object_or_404, redirect, render
from django_tables2 import RequestConfig from django_tables2 import RequestConfig
from netbox.views import generic
from utilities.forms import ConfirmationForm from utilities.forms import ConfirmationForm
from utilities.paginator import EnhancedPaginator, get_paginate_count from utilities.paginator import EnhancedPaginator, get_paginate_count
from utilities.views import (
BulkDeleteView, BulkEditView, BulkImportView, ObjectView, ObjectDeleteView, ObjectEditView, ObjectListView,
)
from . import filters, forms, tables from . import filters, forms, tables
from .choices import CircuitTerminationSideChoices from .choices import CircuitTerminationSideChoices
from .models import Circuit, CircuitTermination, CircuitType, Provider from .models import Circuit, CircuitTermination, CircuitType, Provider
@ -18,14 +16,14 @@ from .models import Circuit, CircuitTermination, CircuitType, Provider
# Providers # Providers
# #
class ProviderListView(ObjectListView): class ProviderListView(generic.ObjectListView):
queryset = Provider.objects.annotate(count_circuits=Count('circuits')).order_by(*Provider._meta.ordering) queryset = Provider.objects.annotate(count_circuits=Count('circuits')).order_by(*Provider._meta.ordering)
filterset = filters.ProviderFilterSet filterset = filters.ProviderFilterSet
filterset_form = forms.ProviderFilterForm filterset_form = forms.ProviderFilterForm
table = tables.ProviderTable table = tables.ProviderTable
class ProviderView(ObjectView): class ProviderView(generic.ObjectView):
queryset = Provider.objects.all() queryset = Provider.objects.all()
def get(self, request, slug): def get(self, request, slug):
@ -52,30 +50,30 @@ class ProviderView(ObjectView):
}) })
class ProviderEditView(ObjectEditView): class ProviderEditView(generic.ObjectEditView):
queryset = Provider.objects.all() queryset = Provider.objects.all()
model_form = forms.ProviderForm model_form = forms.ProviderForm
template_name = 'circuits/provider_edit.html' template_name = 'circuits/provider_edit.html'
class ProviderDeleteView(ObjectDeleteView): class ProviderDeleteView(generic.ObjectDeleteView):
queryset = Provider.objects.all() queryset = Provider.objects.all()
class ProviderBulkImportView(BulkImportView): class ProviderBulkImportView(generic.BulkImportView):
queryset = Provider.objects.all() queryset = Provider.objects.all()
model_form = forms.ProviderCSVForm model_form = forms.ProviderCSVForm
table = tables.ProviderTable table = tables.ProviderTable
class ProviderBulkEditView(BulkEditView): class ProviderBulkEditView(generic.BulkEditView):
queryset = Provider.objects.annotate(count_circuits=Count('circuits')).order_by(*Provider._meta.ordering) queryset = Provider.objects.annotate(count_circuits=Count('circuits')).order_by(*Provider._meta.ordering)
filterset = filters.ProviderFilterSet filterset = filters.ProviderFilterSet
table = tables.ProviderTable table = tables.ProviderTable
form = forms.ProviderBulkEditForm form = forms.ProviderBulkEditForm
class ProviderBulkDeleteView(BulkDeleteView): class ProviderBulkDeleteView(generic.BulkDeleteView):
queryset = Provider.objects.annotate(count_circuits=Count('circuits')).order_by(*Provider._meta.ordering) queryset = Provider.objects.annotate(count_circuits=Count('circuits')).order_by(*Provider._meta.ordering)
filterset = filters.ProviderFilterSet filterset = filters.ProviderFilterSet
table = tables.ProviderTable table = tables.ProviderTable
@ -85,27 +83,27 @@ class ProviderBulkDeleteView(BulkDeleteView):
# Circuit Types # Circuit Types
# #
class CircuitTypeListView(ObjectListView): class CircuitTypeListView(generic.ObjectListView):
queryset = CircuitType.objects.annotate(circuit_count=Count('circuits')).order_by(*CircuitType._meta.ordering) queryset = CircuitType.objects.annotate(circuit_count=Count('circuits')).order_by(*CircuitType._meta.ordering)
table = tables.CircuitTypeTable table = tables.CircuitTypeTable
class CircuitTypeEditView(ObjectEditView): class CircuitTypeEditView(generic.ObjectEditView):
queryset = CircuitType.objects.all() queryset = CircuitType.objects.all()
model_form = forms.CircuitTypeForm model_form = forms.CircuitTypeForm
class CircuitTypeDeleteView(ObjectDeleteView): class CircuitTypeDeleteView(generic.ObjectDeleteView):
queryset = CircuitType.objects.all() queryset = CircuitType.objects.all()
class CircuitTypeBulkImportView(BulkImportView): class CircuitTypeBulkImportView(generic.BulkImportView):
queryset = CircuitType.objects.all() queryset = CircuitType.objects.all()
model_form = forms.CircuitTypeCSVForm model_form = forms.CircuitTypeCSVForm
table = tables.CircuitTypeTable table = tables.CircuitTypeTable
class CircuitTypeBulkDeleteView(BulkDeleteView): class CircuitTypeBulkDeleteView(generic.BulkDeleteView):
queryset = CircuitType.objects.annotate(circuit_count=Count('circuits')).order_by(*CircuitType._meta.ordering) queryset = CircuitType.objects.annotate(circuit_count=Count('circuits')).order_by(*CircuitType._meta.ordering)
table = tables.CircuitTypeTable table = tables.CircuitTypeTable
@ -114,7 +112,7 @@ class CircuitTypeBulkDeleteView(BulkDeleteView):
# Circuits # Circuits
# #
class CircuitListView(ObjectListView): class CircuitListView(generic.ObjectListView):
queryset = Circuit.objects.prefetch_related( queryset = Circuit.objects.prefetch_related(
'provider', 'type', 'tenant', 'terminations' 'provider', 'type', 'tenant', 'terminations'
).annotate_sites() ).annotate_sites()
@ -123,7 +121,7 @@ class CircuitListView(ObjectListView):
table = tables.CircuitTable table = tables.CircuitTable
class CircuitView(ObjectView): class CircuitView(generic.ObjectView):
queryset = Circuit.objects.all() queryset = Circuit.objects.all()
def get(self, request, pk): def get(self, request, pk):
@ -152,23 +150,23 @@ class CircuitView(ObjectView):
}) })
class CircuitEditView(ObjectEditView): class CircuitEditView(generic.ObjectEditView):
queryset = Circuit.objects.all() queryset = Circuit.objects.all()
model_form = forms.CircuitForm model_form = forms.CircuitForm
template_name = 'circuits/circuit_edit.html' template_name = 'circuits/circuit_edit.html'
class CircuitDeleteView(ObjectDeleteView): class CircuitDeleteView(generic.ObjectDeleteView):
queryset = Circuit.objects.all() queryset = Circuit.objects.all()
class CircuitBulkImportView(BulkImportView): class CircuitBulkImportView(generic.BulkImportView):
queryset = Circuit.objects.all() queryset = Circuit.objects.all()
model_form = forms.CircuitCSVForm model_form = forms.CircuitCSVForm
table = tables.CircuitTable table = tables.CircuitTable
class CircuitBulkEditView(BulkEditView): class CircuitBulkEditView(generic.BulkEditView):
queryset = Circuit.objects.prefetch_related( queryset = Circuit.objects.prefetch_related(
'provider', 'type', 'tenant', 'terminations' 'provider', 'type', 'tenant', 'terminations'
) )
@ -177,7 +175,7 @@ class CircuitBulkEditView(BulkEditView):
form = forms.CircuitBulkEditForm form = forms.CircuitBulkEditForm
class CircuitBulkDeleteView(BulkDeleteView): class CircuitBulkDeleteView(generic.BulkDeleteView):
queryset = Circuit.objects.prefetch_related( queryset = Circuit.objects.prefetch_related(
'provider', 'type', 'tenant', 'terminations' 'provider', 'type', 'tenant', 'terminations'
) )
@ -185,7 +183,7 @@ class CircuitBulkDeleteView(BulkDeleteView):
table = tables.CircuitTable table = tables.CircuitTable
class CircuitSwapTerminations(ObjectEditView): class CircuitSwapTerminations(generic.ObjectEditView):
""" """
Swap the A and Z terminations of a circuit. Swap the A and Z terminations of a circuit.
""" """
@ -258,7 +256,7 @@ class CircuitSwapTerminations(ObjectEditView):
# Circuit terminations # Circuit terminations
# #
class CircuitTerminationEditView(ObjectEditView): class CircuitTerminationEditView(generic.ObjectEditView):
queryset = CircuitTermination.objects.all() queryset = CircuitTermination.objects.all()
model_form = forms.CircuitTerminationForm model_form = forms.CircuitTerminationForm
template_name = 'circuits/circuittermination_edit.html' template_name = 'circuits/circuittermination_edit.html'
@ -272,5 +270,5 @@ class CircuitTerminationEditView(ObjectEditView):
return obj.circuit.get_absolute_url() return obj.circuit.get_absolute_url()
class CircuitTerminationDeleteView(ObjectDeleteView): class CircuitTerminationDeleteView(generic.ObjectDeleteView):
queryset = CircuitTermination.objects.all() queryset = CircuitTermination.objects.all()

File diff suppressed because it is too large Load Diff

View File

@ -10,14 +10,12 @@ from django_tables2 import RequestConfig
from rq import Worker from rq import Worker
from dcim.models import DeviceRole, Platform, Region, Site from dcim.models import DeviceRole, Platform, Region, Site
from netbox.views import generic
from tenancy.models import Tenant, TenantGroup from tenancy.models import Tenant, TenantGroup
from utilities.forms import ConfirmationForm from utilities.forms import ConfirmationForm
from utilities.paginator import EnhancedPaginator, get_paginate_count from utilities.paginator import EnhancedPaginator, get_paginate_count
from utilities.utils import copy_safe_request, shallow_compare_dict from utilities.utils import copy_safe_request, shallow_compare_dict
from utilities.views import ( from utilities.views import ContentTypePermissionRequiredMixin
BulkDeleteView, BulkEditView, BulkImportView, ObjectView, ObjectDeleteView, ObjectEditView, ObjectListView,
ContentTypePermissionRequiredMixin,
)
from virtualization.models import Cluster, ClusterGroup from virtualization.models import Cluster, ClusterGroup
from . import filters, forms, tables from . import filters, forms, tables
from .choices import JobResultStatusChoices from .choices import JobResultStatusChoices
@ -30,7 +28,7 @@ from .scripts import get_scripts, run_script
# Tags # Tags
# #
class TagListView(ObjectListView): class TagListView(generic.ObjectListView):
queryset = Tag.objects.annotate( queryset = Tag.objects.annotate(
items=Count('extras_taggeditem_items') items=Count('extras_taggeditem_items')
).order_by(*Tag._meta.ordering) ).order_by(*Tag._meta.ordering)
@ -39,23 +37,23 @@ class TagListView(ObjectListView):
table = tables.TagTable table = tables.TagTable
class TagEditView(ObjectEditView): class TagEditView(generic.ObjectEditView):
queryset = Tag.objects.all() queryset = Tag.objects.all()
model_form = forms.TagForm model_form = forms.TagForm
template_name = 'extras/tag_edit.html' template_name = 'extras/tag_edit.html'
class TagDeleteView(ObjectDeleteView): class TagDeleteView(generic.ObjectDeleteView):
queryset = Tag.objects.all() queryset = Tag.objects.all()
class TagBulkImportView(BulkImportView): class TagBulkImportView(generic.BulkImportView):
queryset = Tag.objects.all() queryset = Tag.objects.all()
model_form = forms.TagCSVForm model_form = forms.TagCSVForm
table = tables.TagTable table = tables.TagTable
class TagBulkEditView(BulkEditView): class TagBulkEditView(generic.BulkEditView):
queryset = Tag.objects.annotate( queryset = Tag.objects.annotate(
items=Count('extras_taggeditem_items') items=Count('extras_taggeditem_items')
).order_by(*Tag._meta.ordering) ).order_by(*Tag._meta.ordering)
@ -63,7 +61,7 @@ class TagBulkEditView(BulkEditView):
form = forms.TagBulkEditForm form = forms.TagBulkEditForm
class TagBulkDeleteView(BulkDeleteView): class TagBulkDeleteView(generic.BulkDeleteView):
queryset = Tag.objects.annotate( queryset = Tag.objects.annotate(
items=Count('extras_taggeditem_items') items=Count('extras_taggeditem_items')
).order_by(*Tag._meta.ordering) ).order_by(*Tag._meta.ordering)
@ -74,7 +72,7 @@ class TagBulkDeleteView(BulkDeleteView):
# Config contexts # Config contexts
# #
class ConfigContextListView(ObjectListView): class ConfigContextListView(generic.ObjectListView):
queryset = ConfigContext.objects.all() queryset = ConfigContext.objects.all()
filterset = filters.ConfigContextFilterSet filterset = filters.ConfigContextFilterSet
filterset_form = forms.ConfigContextFilterForm filterset_form = forms.ConfigContextFilterForm
@ -82,7 +80,7 @@ class ConfigContextListView(ObjectListView):
action_buttons = ('add',) action_buttons = ('add',)
class ConfigContextView(ObjectView): class ConfigContextView(generic.ObjectView):
queryset = ConfigContext.objects.all() queryset = ConfigContext.objects.all()
def get(self, request, pk): def get(self, request, pk):
@ -116,29 +114,29 @@ class ConfigContextView(ObjectView):
}) })
class ConfigContextEditView(ObjectEditView): class ConfigContextEditView(generic.ObjectEditView):
queryset = ConfigContext.objects.all() queryset = ConfigContext.objects.all()
model_form = forms.ConfigContextForm model_form = forms.ConfigContextForm
template_name = 'extras/configcontext_edit.html' template_name = 'extras/configcontext_edit.html'
class ConfigContextBulkEditView(BulkEditView): class ConfigContextBulkEditView(generic.BulkEditView):
queryset = ConfigContext.objects.all() queryset = ConfigContext.objects.all()
filterset = filters.ConfigContextFilterSet filterset = filters.ConfigContextFilterSet
table = tables.ConfigContextTable table = tables.ConfigContextTable
form = forms.ConfigContextBulkEditForm form = forms.ConfigContextBulkEditForm
class ConfigContextDeleteView(ObjectDeleteView): class ConfigContextDeleteView(generic.ObjectDeleteView):
queryset = ConfigContext.objects.all() queryset = ConfigContext.objects.all()
class ConfigContextBulkDeleteView(BulkDeleteView): class ConfigContextBulkDeleteView(generic.BulkDeleteView):
queryset = ConfigContext.objects.all() queryset = ConfigContext.objects.all()
table = tables.ConfigContextTable table = tables.ConfigContextTable
class ObjectConfigContextView(ObjectView): class ObjectConfigContextView(generic.ObjectView):
base_template = None base_template = None
def get(self, request, pk): def get(self, request, pk):
@ -172,7 +170,7 @@ class ObjectConfigContextView(ObjectView):
# Change logging # Change logging
# #
class ObjectChangeListView(ObjectListView): class ObjectChangeListView(generic.ObjectListView):
queryset = ObjectChange.objects.all() queryset = ObjectChange.objects.all()
filterset = filters.ObjectChangeFilterSet filterset = filters.ObjectChangeFilterSet
filterset_form = forms.ObjectChangeFilterForm filterset_form = forms.ObjectChangeFilterForm
@ -181,7 +179,7 @@ class ObjectChangeListView(ObjectListView):
action_buttons = ('export',) action_buttons = ('export',)
class ObjectChangeView(ObjectView): class ObjectChangeView(generic.ObjectView):
queryset = ObjectChange.objects.all() queryset = ObjectChange.objects.all()
def get(self, request, pk): def get(self, request, pk):
@ -283,7 +281,7 @@ class ObjectChangeLogView(View):
# Image attachments # Image attachments
# #
class ImageAttachmentEditView(ObjectEditView): class ImageAttachmentEditView(generic.ObjectEditView):
queryset = ImageAttachment.objects.all() queryset = ImageAttachment.objects.all()
model_form = forms.ImageAttachmentForm model_form = forms.ImageAttachmentForm
@ -298,7 +296,7 @@ class ImageAttachmentEditView(ObjectEditView):
return imageattachment.parent.get_absolute_url() return imageattachment.parent.get_absolute_url()
class ImageAttachmentDeleteView(ObjectDeleteView): class ImageAttachmentDeleteView(generic.ObjectDeleteView):
queryset = ImageAttachment.objects.all() queryset = ImageAttachment.objects.all()
def get_return_url(self, request, imageattachment): def get_return_url(self, request, imageattachment):

View File

@ -1,20 +1,14 @@
import netaddr
from django.conf import settings
from django.db.models import Count, Prefetch from django.db.models import Count, Prefetch
from django.db.models.expressions import RawSQL from django.db.models.expressions import RawSQL
from django.shortcuts import get_object_or_404, redirect, render from django.shortcuts import get_object_or_404, redirect, render
from django_tables2 import RequestConfig from django_tables2 import RequestConfig
from dcim.models import Device, Interface from dcim.models import Device, Interface
from netbox.views import generic
from utilities.paginator import EnhancedPaginator, get_paginate_count from utilities.paginator import EnhancedPaginator, get_paginate_count
from utilities.utils import get_subquery from utilities.utils import get_subquery
from utilities.views import (
BulkCreateView, BulkDeleteView, BulkEditView, BulkImportView, ObjectView, ObjectDeleteView, ObjectEditView,
ObjectListView,
)
from virtualization.models import VirtualMachine, VMInterface from virtualization.models import VirtualMachine, VMInterface
from . import filters, forms, tables from . import filters, forms, tables
from .choices import *
from .constants import * from .constants import *
from .models import Aggregate, IPAddress, Prefix, RIR, Role, RouteTarget, Service, VLAN, VLANGroup, VRF from .models import Aggregate, IPAddress, Prefix, RIR, Role, RouteTarget, Service, VLAN, VLANGroup, VRF
from .utils import add_available_ipaddresses, add_available_prefixes, add_available_vlans from .utils import add_available_ipaddresses, add_available_prefixes, add_available_vlans
@ -24,14 +18,14 @@ from .utils import add_available_ipaddresses, add_available_prefixes, add_availa
# VRFs # VRFs
# #
class VRFListView(ObjectListView): class VRFListView(generic.ObjectListView):
queryset = VRF.objects.all() queryset = VRF.objects.all()
filterset = filters.VRFFilterSet filterset = filters.VRFFilterSet
filterset_form = forms.VRFFilterForm filterset_form = forms.VRFFilterForm
table = tables.VRFTable table = tables.VRFTable
class VRFView(ObjectView): class VRFView(generic.ObjectView):
queryset = VRF.objects.all() queryset = VRF.objects.all()
def get(self, request, pk): def get(self, request, pk):
@ -56,30 +50,30 @@ class VRFView(ObjectView):
}) })
class VRFEditView(ObjectEditView): class VRFEditView(generic.ObjectEditView):
queryset = VRF.objects.all() queryset = VRF.objects.all()
model_form = forms.VRFForm model_form = forms.VRFForm
template_name = 'ipam/vrf_edit.html' template_name = 'ipam/vrf_edit.html'
class VRFDeleteView(ObjectDeleteView): class VRFDeleteView(generic.ObjectDeleteView):
queryset = VRF.objects.all() queryset = VRF.objects.all()
class VRFBulkImportView(BulkImportView): class VRFBulkImportView(generic.BulkImportView):
queryset = VRF.objects.all() queryset = VRF.objects.all()
model_form = forms.VRFCSVForm model_form = forms.VRFCSVForm
table = tables.VRFTable table = tables.VRFTable
class VRFBulkEditView(BulkEditView): class VRFBulkEditView(generic.BulkEditView):
queryset = VRF.objects.prefetch_related('tenant') queryset = VRF.objects.prefetch_related('tenant')
filterset = filters.VRFFilterSet filterset = filters.VRFFilterSet
table = tables.VRFTable table = tables.VRFTable
form = forms.VRFBulkEditForm form = forms.VRFBulkEditForm
class VRFBulkDeleteView(BulkDeleteView): class VRFBulkDeleteView(generic.BulkDeleteView):
queryset = VRF.objects.prefetch_related('tenant') queryset = VRF.objects.prefetch_related('tenant')
filterset = filters.VRFFilterSet filterset = filters.VRFFilterSet
table = tables.VRFTable table = tables.VRFTable
@ -89,14 +83,14 @@ class VRFBulkDeleteView(BulkDeleteView):
# Route targets # Route targets
# #
class RouteTargetListView(ObjectListView): class RouteTargetListView(generic.ObjectListView):
queryset = RouteTarget.objects.all() queryset = RouteTarget.objects.all()
filterset = filters.RouteTargetFilterSet filterset = filters.RouteTargetFilterSet
filterset_form = forms.RouteTargetFilterForm filterset_form = forms.RouteTargetFilterForm
table = tables.RouteTargetTable table = tables.RouteTargetTable
class RouteTargetView(ObjectView): class RouteTargetView(generic.ObjectView):
queryset = RouteTarget.objects.all() queryset = RouteTarget.objects.all()
def get(self, request, pk): def get(self, request, pk):
@ -118,29 +112,29 @@ class RouteTargetView(ObjectView):
}) })
class RouteTargetEditView(ObjectEditView): class RouteTargetEditView(generic.ObjectEditView):
queryset = RouteTarget.objects.all() queryset = RouteTarget.objects.all()
model_form = forms.RouteTargetForm model_form = forms.RouteTargetForm
class RouteTargetDeleteView(ObjectDeleteView): class RouteTargetDeleteView(generic.ObjectDeleteView):
queryset = RouteTarget.objects.all() queryset = RouteTarget.objects.all()
class RouteTargetBulkImportView(BulkImportView): class RouteTargetBulkImportView(generic.BulkImportView):
queryset = RouteTarget.objects.all() queryset = RouteTarget.objects.all()
model_form = forms.RouteTargetCSVForm model_form = forms.RouteTargetCSVForm
table = tables.RouteTargetTable table = tables.RouteTargetTable
class RouteTargetBulkEditView(BulkEditView): class RouteTargetBulkEditView(generic.BulkEditView):
queryset = RouteTarget.objects.prefetch_related('tenant') queryset = RouteTarget.objects.prefetch_related('tenant')
filterset = filters.RouteTargetFilterSet filterset = filters.RouteTargetFilterSet
table = tables.RouteTargetTable table = tables.RouteTargetTable
form = forms.RouteTargetBulkEditForm form = forms.RouteTargetBulkEditForm
class RouteTargetBulkDeleteView(BulkDeleteView): class RouteTargetBulkDeleteView(generic.BulkDeleteView):
queryset = RouteTarget.objects.prefetch_related('tenant') queryset = RouteTarget.objects.prefetch_related('tenant')
filterset = filters.RouteTargetFilterSet filterset = filters.RouteTargetFilterSet
table = tables.RouteTargetTable table = tables.RouteTargetTable
@ -150,7 +144,7 @@ class RouteTargetBulkDeleteView(BulkDeleteView):
# RIRs # RIRs
# #
class RIRListView(ObjectListView): class RIRListView(generic.ObjectListView):
queryset = RIR.objects.annotate(aggregate_count=Count('aggregates')).order_by(*RIR._meta.ordering) queryset = RIR.objects.annotate(aggregate_count=Count('aggregates')).order_by(*RIR._meta.ordering)
filterset = filters.RIRFilterSet filterset = filters.RIRFilterSet
filterset_form = forms.RIRFilterForm filterset_form = forms.RIRFilterForm
@ -158,22 +152,22 @@ class RIRListView(ObjectListView):
template_name = 'ipam/rir_list.html' template_name = 'ipam/rir_list.html'
class RIREditView(ObjectEditView): class RIREditView(generic.ObjectEditView):
queryset = RIR.objects.all() queryset = RIR.objects.all()
model_form = forms.RIRForm model_form = forms.RIRForm
class RIRDeleteView(ObjectDeleteView): class RIRDeleteView(generic.ObjectDeleteView):
queryset = RIR.objects.all() queryset = RIR.objects.all()
class RIRBulkImportView(BulkImportView): class RIRBulkImportView(generic.BulkImportView):
queryset = RIR.objects.all() queryset = RIR.objects.all()
model_form = forms.RIRCSVForm model_form = forms.RIRCSVForm
table = tables.RIRTable table = tables.RIRTable
class RIRBulkDeleteView(BulkDeleteView): class RIRBulkDeleteView(generic.BulkDeleteView):
queryset = RIR.objects.annotate(aggregate_count=Count('aggregates')).order_by(*RIR._meta.ordering) queryset = RIR.objects.annotate(aggregate_count=Count('aggregates')).order_by(*RIR._meta.ordering)
filterset = filters.RIRFilterSet filterset = filters.RIRFilterSet
table = tables.RIRTable table = tables.RIRTable
@ -183,7 +177,7 @@ class RIRBulkDeleteView(BulkDeleteView):
# Aggregates # Aggregates
# #
class AggregateListView(ObjectListView): class AggregateListView(generic.ObjectListView):
queryset = Aggregate.objects.annotate( queryset = Aggregate.objects.annotate(
child_count=RawSQL('SELECT COUNT(*) FROM ipam_prefix WHERE ipam_prefix.prefix <<= ipam_aggregate.prefix', ()) child_count=RawSQL('SELECT COUNT(*) FROM ipam_prefix WHERE ipam_prefix.prefix <<= ipam_aggregate.prefix', ())
).order_by(*Aggregate._meta.ordering) ).order_by(*Aggregate._meta.ordering)
@ -209,7 +203,7 @@ class AggregateListView(ObjectListView):
} }
class AggregateView(ObjectView): class AggregateView(generic.ObjectView):
queryset = Aggregate.objects.all() queryset = Aggregate.objects.all()
def get(self, request, pk): def get(self, request, pk):
@ -254,30 +248,30 @@ class AggregateView(ObjectView):
}) })
class AggregateEditView(ObjectEditView): class AggregateEditView(generic.ObjectEditView):
queryset = Aggregate.objects.all() queryset = Aggregate.objects.all()
model_form = forms.AggregateForm model_form = forms.AggregateForm
template_name = 'ipam/aggregate_edit.html' template_name = 'ipam/aggregate_edit.html'
class AggregateDeleteView(ObjectDeleteView): class AggregateDeleteView(generic.ObjectDeleteView):
queryset = Aggregate.objects.all() queryset = Aggregate.objects.all()
class AggregateBulkImportView(BulkImportView): class AggregateBulkImportView(generic.BulkImportView):
queryset = Aggregate.objects.all() queryset = Aggregate.objects.all()
model_form = forms.AggregateCSVForm model_form = forms.AggregateCSVForm
table = tables.AggregateTable table = tables.AggregateTable
class AggregateBulkEditView(BulkEditView): class AggregateBulkEditView(generic.BulkEditView):
queryset = Aggregate.objects.prefetch_related('rir') queryset = Aggregate.objects.prefetch_related('rir')
filterset = filters.AggregateFilterSet filterset = filters.AggregateFilterSet
table = tables.AggregateTable table = tables.AggregateTable
form = forms.AggregateBulkEditForm form = forms.AggregateBulkEditForm
class AggregateBulkDeleteView(BulkDeleteView): class AggregateBulkDeleteView(generic.BulkDeleteView):
queryset = Aggregate.objects.prefetch_related('rir') queryset = Aggregate.objects.prefetch_related('rir')
filterset = filters.AggregateFilterSet filterset = filters.AggregateFilterSet
table = tables.AggregateTable table = tables.AggregateTable
@ -287,7 +281,7 @@ class AggregateBulkDeleteView(BulkDeleteView):
# Prefix/VLAN roles # Prefix/VLAN roles
# #
class RoleListView(ObjectListView): class RoleListView(generic.ObjectListView):
queryset = Role.objects.annotate( queryset = Role.objects.annotate(
prefix_count=get_subquery(Prefix, 'role'), prefix_count=get_subquery(Prefix, 'role'),
vlan_count=get_subquery(VLAN, 'role') vlan_count=get_subquery(VLAN, 'role')
@ -295,22 +289,22 @@ class RoleListView(ObjectListView):
table = tables.RoleTable table = tables.RoleTable
class RoleEditView(ObjectEditView): class RoleEditView(generic.ObjectEditView):
queryset = Role.objects.all() queryset = Role.objects.all()
model_form = forms.RoleForm model_form = forms.RoleForm
class RoleDeleteView(ObjectDeleteView): class RoleDeleteView(generic.ObjectDeleteView):
queryset = Role.objects.all() queryset = Role.objects.all()
class RoleBulkImportView(BulkImportView): class RoleBulkImportView(generic.BulkImportView):
queryset = Role.objects.all() queryset = Role.objects.all()
model_form = forms.RoleCSVForm model_form = forms.RoleCSVForm
table = tables.RoleTable table = tables.RoleTable
class RoleBulkDeleteView(BulkDeleteView): class RoleBulkDeleteView(generic.BulkDeleteView):
queryset = Role.objects.all() queryset = Role.objects.all()
table = tables.RoleTable table = tables.RoleTable
@ -319,7 +313,7 @@ class RoleBulkDeleteView(BulkDeleteView):
# Prefixes # Prefixes
# #
class PrefixListView(ObjectListView): class PrefixListView(generic.ObjectListView):
queryset = Prefix.objects.annotate_tree() queryset = Prefix.objects.annotate_tree()
filterset = filters.PrefixFilterSet filterset = filters.PrefixFilterSet
filterset_form = forms.PrefixFilterForm filterset_form = forms.PrefixFilterForm
@ -327,7 +321,7 @@ class PrefixListView(ObjectListView):
template_name = 'ipam/prefix_list.html' template_name = 'ipam/prefix_list.html'
class PrefixView(ObjectView): class PrefixView(generic.ObjectView):
queryset = Prefix.objects.prefetch_related('vrf', 'site__region', 'tenant__group', 'vlan__group', 'role') queryset = Prefix.objects.prefetch_related('vrf', 'site__region', 'tenant__group', 'vlan__group', 'role')
def get(self, request, pk): def get(self, request, pk):
@ -371,7 +365,7 @@ class PrefixView(ObjectView):
}) })
class PrefixPrefixesView(ObjectView): class PrefixPrefixesView(generic.ObjectView):
queryset = Prefix.objects.all() queryset = Prefix.objects.all()
def get(self, request, pk): def get(self, request, pk):
@ -415,7 +409,7 @@ class PrefixPrefixesView(ObjectView):
}) })
class PrefixIPAddressesView(ObjectView): class PrefixIPAddressesView(generic.ObjectView):
queryset = Prefix.objects.all() queryset = Prefix.objects.all()
def get(self, request, pk): def get(self, request, pk):
@ -459,31 +453,31 @@ class PrefixIPAddressesView(ObjectView):
}) })
class PrefixEditView(ObjectEditView): class PrefixEditView(generic.ObjectEditView):
queryset = Prefix.objects.all() queryset = Prefix.objects.all()
model_form = forms.PrefixForm model_form = forms.PrefixForm
template_name = 'ipam/prefix_edit.html' template_name = 'ipam/prefix_edit.html'
class PrefixDeleteView(ObjectDeleteView): class PrefixDeleteView(generic.ObjectDeleteView):
queryset = Prefix.objects.all() queryset = Prefix.objects.all()
template_name = 'ipam/prefix_delete.html' template_name = 'ipam/prefix_delete.html'
class PrefixBulkImportView(BulkImportView): class PrefixBulkImportView(generic.BulkImportView):
queryset = Prefix.objects.all() queryset = Prefix.objects.all()
model_form = forms.PrefixCSVForm model_form = forms.PrefixCSVForm
table = tables.PrefixTable table = tables.PrefixTable
class PrefixBulkEditView(BulkEditView): class PrefixBulkEditView(generic.BulkEditView):
queryset = Prefix.objects.prefetch_related('site', 'vrf__tenant', 'tenant', 'vlan', 'role') queryset = Prefix.objects.prefetch_related('site', 'vrf__tenant', 'tenant', 'vlan', 'role')
filterset = filters.PrefixFilterSet filterset = filters.PrefixFilterSet
table = tables.PrefixTable table = tables.PrefixTable
form = forms.PrefixBulkEditForm form = forms.PrefixBulkEditForm
class PrefixBulkDeleteView(BulkDeleteView): class PrefixBulkDeleteView(generic.BulkDeleteView):
queryset = Prefix.objects.prefetch_related('site', 'vrf__tenant', 'tenant', 'vlan', 'role') queryset = Prefix.objects.prefetch_related('site', 'vrf__tenant', 'tenant', 'vlan', 'role')
filterset = filters.PrefixFilterSet filterset = filters.PrefixFilterSet
table = tables.PrefixTable table = tables.PrefixTable
@ -493,14 +487,14 @@ class PrefixBulkDeleteView(BulkDeleteView):
# IP addresses # IP addresses
# #
class IPAddressListView(ObjectListView): class IPAddressListView(generic.ObjectListView):
queryset = IPAddress.objects.all() queryset = IPAddress.objects.all()
filterset = filters.IPAddressFilterSet filterset = filters.IPAddressFilterSet
filterset_form = forms.IPAddressFilterForm filterset_form = forms.IPAddressFilterForm
table = tables.IPAddressDetailTable table = tables.IPAddressDetailTable
class IPAddressView(ObjectView): class IPAddressView(generic.ObjectView):
queryset = IPAddress.objects.prefetch_related('vrf__tenant', 'tenant') queryset = IPAddress.objects.prefetch_related('vrf__tenant', 'tenant')
def get(self, request, pk): def get(self, request, pk):
@ -553,7 +547,7 @@ class IPAddressView(ObjectView):
}) })
class IPAddressEditView(ObjectEditView): class IPAddressEditView(generic.ObjectEditView):
queryset = IPAddress.objects.all() queryset = IPAddress.objects.all()
model_form = forms.IPAddressForm model_form = forms.IPAddressForm
template_name = 'ipam/ipaddress_edit.html' template_name = 'ipam/ipaddress_edit.html'
@ -575,7 +569,7 @@ class IPAddressEditView(ObjectEditView):
return obj return obj
class IPAddressAssignView(ObjectView): class IPAddressAssignView(generic.ObjectView):
""" """
Search for IPAddresses to be assigned to an Interface. Search for IPAddresses to be assigned to an Interface.
""" """
@ -615,11 +609,11 @@ class IPAddressAssignView(ObjectView):
}) })
class IPAddressDeleteView(ObjectDeleteView): class IPAddressDeleteView(generic.ObjectDeleteView):
queryset = IPAddress.objects.all() queryset = IPAddress.objects.all()
class IPAddressBulkCreateView(BulkCreateView): class IPAddressBulkCreateView(generic.BulkCreateView):
queryset = IPAddress.objects.all() queryset = IPAddress.objects.all()
form = forms.IPAddressBulkCreateForm form = forms.IPAddressBulkCreateForm
model_form = forms.IPAddressBulkAddForm model_form = forms.IPAddressBulkAddForm
@ -627,20 +621,20 @@ class IPAddressBulkCreateView(BulkCreateView):
template_name = 'ipam/ipaddress_bulk_add.html' template_name = 'ipam/ipaddress_bulk_add.html'
class IPAddressBulkImportView(BulkImportView): class IPAddressBulkImportView(generic.BulkImportView):
queryset = IPAddress.objects.all() queryset = IPAddress.objects.all()
model_form = forms.IPAddressCSVForm model_form = forms.IPAddressCSVForm
table = tables.IPAddressTable table = tables.IPAddressTable
class IPAddressBulkEditView(BulkEditView): class IPAddressBulkEditView(generic.BulkEditView):
queryset = IPAddress.objects.prefetch_related('vrf__tenant', 'tenant') queryset = IPAddress.objects.prefetch_related('vrf__tenant', 'tenant')
filterset = filters.IPAddressFilterSet filterset = filters.IPAddressFilterSet
table = tables.IPAddressTable table = tables.IPAddressTable
form = forms.IPAddressBulkEditForm form = forms.IPAddressBulkEditForm
class IPAddressBulkDeleteView(BulkDeleteView): class IPAddressBulkDeleteView(generic.BulkDeleteView):
queryset = IPAddress.objects.prefetch_related('vrf__tenant', 'tenant') queryset = IPAddress.objects.prefetch_related('vrf__tenant', 'tenant')
filterset = filters.IPAddressFilterSet filterset = filters.IPAddressFilterSet
table = tables.IPAddressTable table = tables.IPAddressTable
@ -650,7 +644,7 @@ class IPAddressBulkDeleteView(BulkDeleteView):
# VLAN groups # VLAN groups
# #
class VLANGroupListView(ObjectListView): class VLANGroupListView(generic.ObjectListView):
queryset = VLANGroup.objects.annotate( queryset = VLANGroup.objects.annotate(
vlan_count=Count('vlans') vlan_count=Count('vlans')
).order_by(*VLANGroup._meta.ordering) ).order_by(*VLANGroup._meta.ordering)
@ -659,22 +653,22 @@ class VLANGroupListView(ObjectListView):
table = tables.VLANGroupTable table = tables.VLANGroupTable
class VLANGroupEditView(ObjectEditView): class VLANGroupEditView(generic.ObjectEditView):
queryset = VLANGroup.objects.all() queryset = VLANGroup.objects.all()
model_form = forms.VLANGroupForm model_form = forms.VLANGroupForm
class VLANGroupDeleteView(ObjectDeleteView): class VLANGroupDeleteView(generic.ObjectDeleteView):
queryset = VLANGroup.objects.all() queryset = VLANGroup.objects.all()
class VLANGroupBulkImportView(BulkImportView): class VLANGroupBulkImportView(generic.BulkImportView):
queryset = VLANGroup.objects.all() queryset = VLANGroup.objects.all()
model_form = forms.VLANGroupCSVForm model_form = forms.VLANGroupCSVForm
table = tables.VLANGroupTable table = tables.VLANGroupTable
class VLANGroupBulkDeleteView(BulkDeleteView): class VLANGroupBulkDeleteView(generic.BulkDeleteView):
queryset = VLANGroup.objects.prefetch_related('site').annotate( queryset = VLANGroup.objects.prefetch_related('site').annotate(
vlan_count=Count('vlans') vlan_count=Count('vlans')
).order_by(*VLANGroup._meta.ordering) ).order_by(*VLANGroup._meta.ordering)
@ -682,7 +676,7 @@ class VLANGroupBulkDeleteView(BulkDeleteView):
table = tables.VLANGroupTable table = tables.VLANGroupTable
class VLANGroupVLANsView(ObjectView): class VLANGroupVLANsView(generic.ObjectView):
queryset = VLANGroup.objects.all() queryset = VLANGroup.objects.all()
def get(self, request, pk): def get(self, request, pk):
@ -725,14 +719,14 @@ class VLANGroupVLANsView(ObjectView):
# VLANs # VLANs
# #
class VLANListView(ObjectListView): class VLANListView(generic.ObjectListView):
queryset = VLAN.objects.all() queryset = VLAN.objects.all()
filterset = filters.VLANFilterSet filterset = filters.VLANFilterSet
filterset_form = forms.VLANFilterForm filterset_form = forms.VLANFilterForm
table = tables.VLANDetailTable table = tables.VLANDetailTable
class VLANView(ObjectView): class VLANView(generic.ObjectView):
queryset = VLAN.objects.prefetch_related('site__region', 'tenant__group', 'role') queryset = VLAN.objects.prefetch_related('site__region', 'tenant__group', 'role')
def get(self, request, pk): def get(self, request, pk):
@ -750,7 +744,7 @@ class VLANView(ObjectView):
}) })
class VLANInterfacesView(ObjectView): class VLANInterfacesView(generic.ObjectView):
queryset = VLAN.objects.all() queryset = VLAN.objects.all()
def get(self, request, pk): def get(self, request, pk):
@ -771,7 +765,7 @@ class VLANInterfacesView(ObjectView):
}) })
class VLANVMInterfacesView(ObjectView): class VLANVMInterfacesView(generic.ObjectView):
queryset = VLAN.objects.all() queryset = VLAN.objects.all()
def get(self, request, pk): def get(self, request, pk):
@ -792,30 +786,30 @@ class VLANVMInterfacesView(ObjectView):
}) })
class VLANEditView(ObjectEditView): class VLANEditView(generic.ObjectEditView):
queryset = VLAN.objects.all() queryset = VLAN.objects.all()
model_form = forms.VLANForm model_form = forms.VLANForm
template_name = 'ipam/vlan_edit.html' template_name = 'ipam/vlan_edit.html'
class VLANDeleteView(ObjectDeleteView): class VLANDeleteView(generic.ObjectDeleteView):
queryset = VLAN.objects.all() queryset = VLAN.objects.all()
class VLANBulkImportView(BulkImportView): class VLANBulkImportView(generic.BulkImportView):
queryset = VLAN.objects.all() queryset = VLAN.objects.all()
model_form = forms.VLANCSVForm model_form = forms.VLANCSVForm
table = tables.VLANTable table = tables.VLANTable
class VLANBulkEditView(BulkEditView): class VLANBulkEditView(generic.BulkEditView):
queryset = VLAN.objects.prefetch_related('site', 'group', 'tenant', 'role') queryset = VLAN.objects.prefetch_related('site', 'group', 'tenant', 'role')
filterset = filters.VLANFilterSet filterset = filters.VLANFilterSet
table = tables.VLANTable table = tables.VLANTable
form = forms.VLANBulkEditForm form = forms.VLANBulkEditForm
class VLANBulkDeleteView(BulkDeleteView): class VLANBulkDeleteView(generic.BulkDeleteView):
queryset = VLAN.objects.prefetch_related('site', 'group', 'tenant', 'role') queryset = VLAN.objects.prefetch_related('site', 'group', 'tenant', 'role')
filterset = filters.VLANFilterSet filterset = filters.VLANFilterSet
table = tables.VLANTable table = tables.VLANTable
@ -825,7 +819,7 @@ class VLANBulkDeleteView(BulkDeleteView):
# Services # Services
# #
class ServiceListView(ObjectListView): class ServiceListView(generic.ObjectListView):
queryset = Service.objects.all() queryset = Service.objects.all()
filterset = filters.ServiceFilterSet filterset = filters.ServiceFilterSet
filterset_form = forms.ServiceFilterForm filterset_form = forms.ServiceFilterForm
@ -833,7 +827,7 @@ class ServiceListView(ObjectListView):
action_buttons = ('export',) action_buttons = ('export',)
class ServiceView(ObjectView): class ServiceView(generic.ObjectView):
queryset = Service.objects.prefetch_related('ipaddresses') queryset = Service.objects.prefetch_related('ipaddresses')
def get(self, request, pk): def get(self, request, pk):
@ -845,7 +839,7 @@ class ServiceView(ObjectView):
}) })
class ServiceEditView(ObjectEditView): class ServiceEditView(generic.ObjectEditView):
queryset = Service.objects.prefetch_related('ipaddresses') queryset = Service.objects.prefetch_related('ipaddresses')
model_form = forms.ServiceForm model_form = forms.ServiceForm
template_name = 'ipam/service_edit.html' template_name = 'ipam/service_edit.html'
@ -864,24 +858,24 @@ class ServiceEditView(ObjectEditView):
return obj return obj
class ServiceBulkImportView(BulkImportView): class ServiceBulkImportView(generic.BulkImportView):
queryset = Service.objects.all() queryset = Service.objects.all()
model_form = forms.ServiceCSVForm model_form = forms.ServiceCSVForm
table = tables.ServiceTable table = tables.ServiceTable
class ServiceDeleteView(ObjectDeleteView): class ServiceDeleteView(generic.ObjectDeleteView):
queryset = Service.objects.all() queryset = Service.objects.all()
class ServiceBulkEditView(BulkEditView): class ServiceBulkEditView(generic.BulkEditView):
queryset = Service.objects.prefetch_related('device', 'virtual_machine') queryset = Service.objects.prefetch_related('device', 'virtual_machine')
filterset = filters.ServiceFilterSet filterset = filters.ServiceFilterSet
table = tables.ServiceTable table = tables.ServiceTable
form = forms.ServiceBulkEditForm form = forms.ServiceBulkEditForm
class ServiceBulkDeleteView(BulkDeleteView): class ServiceBulkDeleteView(generic.BulkDeleteView):
queryset = Service.objects.prefetch_related('device', 'virtual_machine') queryset = Service.objects.prefetch_related('device', 'virtual_machine')
filterset = filters.ServiceFilterSet filterset = filters.ServiceFilterSet
table = tables.ServiceTable table = tables.ServiceTable

View File

@ -8,8 +8,8 @@ from django.http import Http404, HttpResponseRedirect
from django.urls import reverse from django.urls import reverse
from extras.context_managers import change_logging from extras.context_managers import change_logging
from netbox.views import server_error
from utilities.api import is_api_request, rest_api_server_error from utilities.api import is_api_request, rest_api_server_error
from utilities.views import server_error
class LoginRequiredMiddleware(object): class LoginRequiredMiddleware(object):

View File

@ -94,4 +94,4 @@ urlpatterns = [
path('{}'.format(settings.BASE_PATH), include(_patterns)) path('{}'.format(settings.BASE_PATH), include(_patterns))
] ]
handler500 = 'utilities.views.server_error' handler500 = 'netbox.views.server_error'

View File

@ -1,22 +1,32 @@
import platform
import sys
from django.conf import settings from django.conf import settings
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.db.models import F from django.db.models import F
from django.http import HttpResponseServerError
from django.shortcuts import render from django.shortcuts import render
from django.template import loader
from django.template.exceptions import TemplateDoesNotExist
from django.urls import reverse from django.urls import reverse
from django.views.decorators.csrf import requires_csrf_token
from django.views.defaults import ERROR_500_TEMPLATE_NAME
from django.views.generic import View from django.views.generic import View
from packaging import version from packaging import version
from circuits.models import Circuit, Provider from circuits.models import Circuit, Provider
from dcim.models import Cable, ConsolePort, Device, DeviceType, Interface, PowerPanel, PowerFeed, PowerPort, Rack, Site from dcim.models import (
Cable, ConsolePort, Device, DeviceType, Interface, PowerPanel, PowerFeed, PowerPort, Rack, Site,
)
from extras.choices import JobResultStatusChoices from extras.choices import JobResultStatusChoices
from extras.models import ObjectChange, JobResult from extras.models import ObjectChange, JobResult
from ipam.models import Aggregate, IPAddress, Prefix, VLAN, VRF from ipam.models import Aggregate, IPAddress, Prefix, VLAN, VRF
from netbox.constants import SEARCH_MAX_RESULTS, SEARCH_TYPES
from netbox.forms import SearchForm
from netbox.releases import get_latest_release from netbox.releases import get_latest_release
from secrets.models import Secret from secrets.models import Secret
from tenancy.models import Tenant from tenancy.models import Tenant
from virtualization.models import Cluster, VirtualMachine from virtualization.models import Cluster, VirtualMachine
from .constants import SEARCH_MAX_RESULTS, SEARCH_TYPES
from .forms import SearchForm
class HomeView(View): class HomeView(View):
@ -157,3 +167,22 @@ class StaticMediaFailureView(View):
return render(request, 'media_failure.html', { return render(request, 'media_failure.html', {
'filename': request.GET.get('filename') 'filename': request.GET.get('filename')
}) })
@requires_csrf_token
def server_error(request, template_name=ERROR_500_TEMPLATE_NAME):
"""
Custom 500 handler to provide additional context when rendering 500.html.
"""
try:
template = loader.get_template(template_name)
except TemplateDoesNotExist:
return HttpResponseServerError('<h1>Server Error (500)</h1>', content_type='text/html')
type_, error, traceback = sys.exc_info()
return HttpResponseServerError(template.render({
'error': error,
'exception': str(type_),
'netbox_version': settings.VERSION,
'python_version': platform.python_version(),
}))

File diff suppressed because it is too large Load Diff

View File

@ -7,9 +7,7 @@ from django.shortcuts import get_object_or_404, redirect, render
from django.utils.html import escape from django.utils.html import escape
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
from utilities.views import ( from netbox.views import generic
BulkDeleteView, BulkEditView, BulkImportView, ObjectView, ObjectDeleteView, ObjectEditView, ObjectListView,
)
from . import filters, forms, tables from . import filters, forms, tables
from .models import SecretRole, Secret, SessionKey, UserKey from .models import SecretRole, Secret, SessionKey, UserKey
@ -28,27 +26,27 @@ def get_session_key(request):
# Secret roles # Secret roles
# #
class SecretRoleListView(ObjectListView): class SecretRoleListView(generic.ObjectListView):
queryset = SecretRole.objects.annotate(secret_count=Count('secrets')).order_by(*SecretRole._meta.ordering) queryset = SecretRole.objects.annotate(secret_count=Count('secrets')).order_by(*SecretRole._meta.ordering)
table = tables.SecretRoleTable table = tables.SecretRoleTable
class SecretRoleEditView(ObjectEditView): class SecretRoleEditView(generic.ObjectEditView):
queryset = SecretRole.objects.all() queryset = SecretRole.objects.all()
model_form = forms.SecretRoleForm model_form = forms.SecretRoleForm
class SecretRoleDeleteView(ObjectDeleteView): class SecretRoleDeleteView(generic.ObjectDeleteView):
queryset = SecretRole.objects.all() queryset = SecretRole.objects.all()
class SecretRoleBulkImportView(BulkImportView): class SecretRoleBulkImportView(generic.BulkImportView):
queryset = SecretRole.objects.all() queryset = SecretRole.objects.all()
model_form = forms.SecretRoleCSVForm model_form = forms.SecretRoleCSVForm
table = tables.SecretRoleTable table = tables.SecretRoleTable
class SecretRoleBulkDeleteView(BulkDeleteView): class SecretRoleBulkDeleteView(generic.BulkDeleteView):
queryset = SecretRole.objects.annotate(secret_count=Count('secrets')).order_by(*SecretRole._meta.ordering) queryset = SecretRole.objects.annotate(secret_count=Count('secrets')).order_by(*SecretRole._meta.ordering)
table = tables.SecretRoleTable table = tables.SecretRoleTable
@ -57,7 +55,7 @@ class SecretRoleBulkDeleteView(BulkDeleteView):
# Secrets # Secrets
# #
class SecretListView(ObjectListView): class SecretListView(generic.ObjectListView):
queryset = Secret.objects.all() queryset = Secret.objects.all()
filterset = filters.SecretFilterSet filterset = filters.SecretFilterSet
filterset_form = forms.SecretFilterForm filterset_form = forms.SecretFilterForm
@ -65,7 +63,7 @@ class SecretListView(ObjectListView):
action_buttons = ('import', 'export') action_buttons = ('import', 'export')
class SecretView(ObjectView): class SecretView(generic.ObjectView):
queryset = Secret.objects.all() queryset = Secret.objects.all()
def get(self, request, pk): def get(self, request, pk):
@ -77,7 +75,7 @@ class SecretView(ObjectView):
}) })
class SecretEditView(ObjectEditView): class SecretEditView(generic.ObjectEditView):
queryset = Secret.objects.all() queryset = Secret.objects.all()
model_form = forms.SecretForm model_form = forms.SecretForm
template_name = 'secrets/secret_edit.html' template_name = 'secrets/secret_edit.html'
@ -146,11 +144,11 @@ class SecretEditView(ObjectEditView):
}) })
class SecretDeleteView(ObjectDeleteView): class SecretDeleteView(generic.ObjectDeleteView):
queryset = Secret.objects.all() queryset = Secret.objects.all()
class SecretBulkImportView(BulkImportView): class SecretBulkImportView(generic.BulkImportView):
queryset = Secret.objects.all() queryset = Secret.objects.all()
model_form = forms.SecretCSVForm model_form = forms.SecretCSVForm
table = tables.SecretTable table = tables.SecretTable
@ -197,14 +195,14 @@ class SecretBulkImportView(BulkImportView):
}) })
class SecretBulkEditView(BulkEditView): class SecretBulkEditView(generic.BulkEditView):
queryset = Secret.objects.prefetch_related('role') queryset = Secret.objects.prefetch_related('role')
filterset = filters.SecretFilterSet filterset = filters.SecretFilterSet
table = tables.SecretTable table = tables.SecretTable
form = forms.SecretBulkEditForm form = forms.SecretBulkEditForm
class SecretBulkDeleteView(BulkDeleteView): class SecretBulkDeleteView(generic.BulkDeleteView):
queryset = Secret.objects.prefetch_related('role') queryset = Secret.objects.prefetch_related('role')
filterset = filters.SecretFilterSet filterset = filters.SecretFilterSet
table = tables.SecretTable table = tables.SecretTable

View File

@ -1,12 +1,9 @@
from django.db.models import Count
from django.shortcuts import get_object_or_404, render from django.shortcuts import get_object_or_404, render
from circuits.models import Circuit from circuits.models import Circuit
from dcim.models import Site, Rack, Device, RackReservation from dcim.models import Site, Rack, Device, RackReservation
from ipam.models import IPAddress, Prefix, VLAN, VRF from ipam.models import IPAddress, Prefix, VLAN, VRF
from utilities.views import ( from netbox.views import generic
BulkDeleteView, BulkEditView, BulkImportView, ObjectView, ObjectDeleteView, ObjectEditView, ObjectListView,
)
from virtualization.models import VirtualMachine, Cluster from virtualization.models import VirtualMachine, Cluster
from . import filters, forms, tables from . import filters, forms, tables
from .models import Tenant, TenantGroup from .models import Tenant, TenantGroup
@ -16,7 +13,7 @@ from .models import Tenant, TenantGroup
# Tenant groups # Tenant groups
# #
class TenantGroupListView(ObjectListView): class TenantGroupListView(generic.ObjectListView):
queryset = TenantGroup.objects.add_related_count( queryset = TenantGroup.objects.add_related_count(
TenantGroup.objects.all(), TenantGroup.objects.all(),
Tenant, Tenant,
@ -27,22 +24,22 @@ class TenantGroupListView(ObjectListView):
table = tables.TenantGroupTable table = tables.TenantGroupTable
class TenantGroupEditView(ObjectEditView): class TenantGroupEditView(generic.ObjectEditView):
queryset = TenantGroup.objects.all() queryset = TenantGroup.objects.all()
model_form = forms.TenantGroupForm model_form = forms.TenantGroupForm
class TenantGroupDeleteView(ObjectDeleteView): class TenantGroupDeleteView(generic.ObjectDeleteView):
queryset = TenantGroup.objects.all() queryset = TenantGroup.objects.all()
class TenantGroupBulkImportView(BulkImportView): class TenantGroupBulkImportView(generic.BulkImportView):
queryset = TenantGroup.objects.all() queryset = TenantGroup.objects.all()
model_form = forms.TenantGroupCSVForm model_form = forms.TenantGroupCSVForm
table = tables.TenantGroupTable table = tables.TenantGroupTable
class TenantGroupBulkDeleteView(BulkDeleteView): class TenantGroupBulkDeleteView(generic.BulkDeleteView):
queryset = TenantGroup.objects.add_related_count( queryset = TenantGroup.objects.add_related_count(
TenantGroup.objects.all(), TenantGroup.objects.all(),
Tenant, Tenant,
@ -57,14 +54,14 @@ class TenantGroupBulkDeleteView(BulkDeleteView):
# Tenants # Tenants
# #
class TenantListView(ObjectListView): class TenantListView(generic.ObjectListView):
queryset = Tenant.objects.all() queryset = Tenant.objects.all()
filterset = filters.TenantFilterSet filterset = filters.TenantFilterSet
filterset_form = forms.TenantFilterForm filterset_form = forms.TenantFilterForm
table = tables.TenantTable table = tables.TenantTable
class TenantView(ObjectView): class TenantView(generic.ObjectView):
queryset = Tenant.objects.prefetch_related('group') queryset = Tenant.objects.prefetch_related('group')
def get(self, request, slug): def get(self, request, slug):
@ -90,30 +87,30 @@ class TenantView(ObjectView):
}) })
class TenantEditView(ObjectEditView): class TenantEditView(generic.ObjectEditView):
queryset = Tenant.objects.all() queryset = Tenant.objects.all()
model_form = forms.TenantForm model_form = forms.TenantForm
template_name = 'tenancy/tenant_edit.html' template_name = 'tenancy/tenant_edit.html'
class TenantDeleteView(ObjectDeleteView): class TenantDeleteView(generic.ObjectDeleteView):
queryset = Tenant.objects.all() queryset = Tenant.objects.all()
class TenantBulkImportView(BulkImportView): class TenantBulkImportView(generic.BulkImportView):
queryset = Tenant.objects.all() queryset = Tenant.objects.all()
model_form = forms.TenantCSVForm model_form = forms.TenantCSVForm
table = tables.TenantTable table = tables.TenantTable
class TenantBulkEditView(BulkEditView): class TenantBulkEditView(generic.BulkEditView):
queryset = Tenant.objects.prefetch_related('group') queryset = Tenant.objects.prefetch_related('group')
filterset = filters.TenantFilterSet filterset = filters.TenantFilterSet
table = tables.TenantTable table = tables.TenantTable
form = forms.TenantBulkEditForm form = forms.TenantBulkEditForm
class TenantBulkDeleteView(BulkDeleteView): class TenantBulkDeleteView(generic.BulkDeleteView):
queryset = Tenant.objects.prefetch_related('group') queryset = Tenant.objects.prefetch_related('group')
filterset = filters.TenantFilterSet filterset = filters.TenantFilterSet
table = tables.TenantTable table = tables.TenantTable

File diff suppressed because it is too large Load Diff

View File

@ -9,12 +9,9 @@ from dcim.tables import DeviceTable
from extras.views import ObjectConfigContextView from extras.views import ObjectConfigContextView
from ipam.models import IPAddress, Service from ipam.models import IPAddress, Service
from ipam.tables import InterfaceIPAddressTable, InterfaceVLANTable from ipam.tables import InterfaceIPAddressTable, InterfaceVLANTable
from netbox.views import generic
from secrets.models import Secret from secrets.models import Secret
from utilities.utils import get_subquery from utilities.utils import get_subquery
from utilities.views import (
BulkComponentCreateView, BulkDeleteView, BulkEditView, BulkImportView, BulkRenameView, ComponentCreateView,
ObjectView, ObjectDeleteView, ObjectEditView, ObjectListView,
)
from . import filters, forms, tables from . import filters, forms, tables
from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface
@ -23,27 +20,27 @@ from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterf
# Cluster types # Cluster types
# #
class ClusterTypeListView(ObjectListView): class ClusterTypeListView(generic.ObjectListView):
queryset = ClusterType.objects.annotate(cluster_count=Count('clusters')).order_by(*ClusterType._meta.ordering) queryset = ClusterType.objects.annotate(cluster_count=Count('clusters')).order_by(*ClusterType._meta.ordering)
table = tables.ClusterTypeTable table = tables.ClusterTypeTable
class ClusterTypeEditView(ObjectEditView): class ClusterTypeEditView(generic.ObjectEditView):
queryset = ClusterType.objects.all() queryset = ClusterType.objects.all()
model_form = forms.ClusterTypeForm model_form = forms.ClusterTypeForm
class ClusterTypeDeleteView(ObjectDeleteView): class ClusterTypeDeleteView(generic.ObjectDeleteView):
queryset = ClusterType.objects.all() queryset = ClusterType.objects.all()
class ClusterTypeBulkImportView(BulkImportView): class ClusterTypeBulkImportView(generic.BulkImportView):
queryset = ClusterType.objects.all() queryset = ClusterType.objects.all()
model_form = forms.ClusterTypeCSVForm model_form = forms.ClusterTypeCSVForm
table = tables.ClusterTypeTable table = tables.ClusterTypeTable
class ClusterTypeBulkDeleteView(BulkDeleteView): class ClusterTypeBulkDeleteView(generic.BulkDeleteView):
queryset = ClusterType.objects.annotate(cluster_count=Count('clusters')).order_by(*ClusterType._meta.ordering) queryset = ClusterType.objects.annotate(cluster_count=Count('clusters')).order_by(*ClusterType._meta.ordering)
table = tables.ClusterTypeTable table = tables.ClusterTypeTable
@ -52,27 +49,27 @@ class ClusterTypeBulkDeleteView(BulkDeleteView):
# Cluster groups # Cluster groups
# #
class ClusterGroupListView(ObjectListView): class ClusterGroupListView(generic.ObjectListView):
queryset = ClusterGroup.objects.annotate(cluster_count=Count('clusters')).order_by(*ClusterGroup._meta.ordering) queryset = ClusterGroup.objects.annotate(cluster_count=Count('clusters')).order_by(*ClusterGroup._meta.ordering)
table = tables.ClusterGroupTable table = tables.ClusterGroupTable
class ClusterGroupEditView(ObjectEditView): class ClusterGroupEditView(generic.ObjectEditView):
queryset = ClusterGroup.objects.all() queryset = ClusterGroup.objects.all()
model_form = forms.ClusterGroupForm model_form = forms.ClusterGroupForm
class ClusterGroupDeleteView(ObjectDeleteView): class ClusterGroupDeleteView(generic.ObjectDeleteView):
queryset = ClusterGroup.objects.all() queryset = ClusterGroup.objects.all()
class ClusterGroupBulkImportView(BulkImportView): class ClusterGroupBulkImportView(generic.BulkImportView):
queryset = ClusterGroup.objects.all() queryset = ClusterGroup.objects.all()
model_form = forms.ClusterGroupCSVForm model_form = forms.ClusterGroupCSVForm
table = tables.ClusterGroupTable table = tables.ClusterGroupTable
class ClusterGroupBulkDeleteView(BulkDeleteView): class ClusterGroupBulkDeleteView(generic.BulkDeleteView):
queryset = ClusterGroup.objects.annotate(cluster_count=Count('clusters')).order_by(*ClusterGroup._meta.ordering) queryset = ClusterGroup.objects.annotate(cluster_count=Count('clusters')).order_by(*ClusterGroup._meta.ordering)
table = tables.ClusterGroupTable table = tables.ClusterGroupTable
@ -81,7 +78,7 @@ class ClusterGroupBulkDeleteView(BulkDeleteView):
# Clusters # Clusters
# #
class ClusterListView(ObjectListView): class ClusterListView(generic.ObjectListView):
permission_required = 'virtualization.view_cluster' permission_required = 'virtualization.view_cluster'
queryset = Cluster.objects.annotate( queryset = Cluster.objects.annotate(
device_count=get_subquery(Device, 'cluster'), device_count=get_subquery(Device, 'cluster'),
@ -92,7 +89,7 @@ class ClusterListView(ObjectListView):
filterset_form = forms.ClusterFilterForm filterset_form = forms.ClusterFilterForm
class ClusterView(ObjectView): class ClusterView(generic.ObjectView):
queryset = Cluster.objects.all() queryset = Cluster.objects.all()
def get(self, request, pk): def get(self, request, pk):
@ -114,36 +111,36 @@ class ClusterView(ObjectView):
}) })
class ClusterEditView(ObjectEditView): class ClusterEditView(generic.ObjectEditView):
template_name = 'virtualization/cluster_edit.html' template_name = 'virtualization/cluster_edit.html'
queryset = Cluster.objects.all() queryset = Cluster.objects.all()
model_form = forms.ClusterForm model_form = forms.ClusterForm
class ClusterDeleteView(ObjectDeleteView): class ClusterDeleteView(generic.ObjectDeleteView):
queryset = Cluster.objects.all() queryset = Cluster.objects.all()
class ClusterBulkImportView(BulkImportView): class ClusterBulkImportView(generic.BulkImportView):
queryset = Cluster.objects.all() queryset = Cluster.objects.all()
model_form = forms.ClusterCSVForm model_form = forms.ClusterCSVForm
table = tables.ClusterTable table = tables.ClusterTable
class ClusterBulkEditView(BulkEditView): class ClusterBulkEditView(generic.BulkEditView):
queryset = Cluster.objects.prefetch_related('type', 'group', 'site') queryset = Cluster.objects.prefetch_related('type', 'group', 'site')
filterset = filters.ClusterFilterSet filterset = filters.ClusterFilterSet
table = tables.ClusterTable table = tables.ClusterTable
form = forms.ClusterBulkEditForm form = forms.ClusterBulkEditForm
class ClusterBulkDeleteView(BulkDeleteView): class ClusterBulkDeleteView(generic.BulkDeleteView):
queryset = Cluster.objects.prefetch_related('type', 'group', 'site') queryset = Cluster.objects.prefetch_related('type', 'group', 'site')
filterset = filters.ClusterFilterSet filterset = filters.ClusterFilterSet
table = tables.ClusterTable table = tables.ClusterTable
class ClusterAddDevicesView(ObjectEditView): class ClusterAddDevicesView(generic.ObjectEditView):
queryset = Cluster.objects.all() queryset = Cluster.objects.all()
form = forms.ClusterAddDevicesForm form = forms.ClusterAddDevicesForm
template_name = 'virtualization/cluster_add_devices.html' template_name = 'virtualization/cluster_add_devices.html'
@ -184,7 +181,7 @@ class ClusterAddDevicesView(ObjectEditView):
}) })
class ClusterRemoveDevicesView(ObjectEditView): class ClusterRemoveDevicesView(generic.ObjectEditView):
queryset = Cluster.objects.all() queryset = Cluster.objects.all()
form = forms.ClusterRemoveDevicesForm form = forms.ClusterRemoveDevicesForm
template_name = 'utilities/obj_bulk_remove.html' template_name = 'utilities/obj_bulk_remove.html'
@ -229,7 +226,7 @@ class ClusterRemoveDevicesView(ObjectEditView):
# Virtual machines # Virtual machines
# #
class VirtualMachineListView(ObjectListView): class VirtualMachineListView(generic.ObjectListView):
queryset = VirtualMachine.objects.all() queryset = VirtualMachine.objects.all()
filterset = filters.VirtualMachineFilterSet filterset = filters.VirtualMachineFilterSet
filterset_form = forms.VirtualMachineFilterForm filterset_form = forms.VirtualMachineFilterForm
@ -237,7 +234,7 @@ class VirtualMachineListView(ObjectListView):
template_name = 'virtualization/virtualmachine_list.html' template_name = 'virtualization/virtualmachine_list.html'
class VirtualMachineView(ObjectView): class VirtualMachineView(generic.ObjectView):
queryset = VirtualMachine.objects.prefetch_related('tenant__group') queryset = VirtualMachine.objects.prefetch_related('tenant__group')
def get(self, request, pk): def get(self, request, pk):
@ -277,30 +274,30 @@ class VirtualMachineConfigContextView(ObjectConfigContextView):
base_template = 'virtualization/virtualmachine.html' base_template = 'virtualization/virtualmachine.html'
class VirtualMachineEditView(ObjectEditView): class VirtualMachineEditView(generic.ObjectEditView):
queryset = VirtualMachine.objects.all() queryset = VirtualMachine.objects.all()
model_form = forms.VirtualMachineForm model_form = forms.VirtualMachineForm
template_name = 'virtualization/virtualmachine_edit.html' template_name = 'virtualization/virtualmachine_edit.html'
class VirtualMachineDeleteView(ObjectDeleteView): class VirtualMachineDeleteView(generic.ObjectDeleteView):
queryset = VirtualMachine.objects.all() queryset = VirtualMachine.objects.all()
class VirtualMachineBulkImportView(BulkImportView): class VirtualMachineBulkImportView(generic.BulkImportView):
queryset = VirtualMachine.objects.all() queryset = VirtualMachine.objects.all()
model_form = forms.VirtualMachineCSVForm model_form = forms.VirtualMachineCSVForm
table = tables.VirtualMachineTable table = tables.VirtualMachineTable
class VirtualMachineBulkEditView(BulkEditView): class VirtualMachineBulkEditView(generic.BulkEditView):
queryset = VirtualMachine.objects.prefetch_related('cluster', 'tenant', 'role') queryset = VirtualMachine.objects.prefetch_related('cluster', 'tenant', 'role')
filterset = filters.VirtualMachineFilterSet filterset = filters.VirtualMachineFilterSet
table = tables.VirtualMachineTable table = tables.VirtualMachineTable
form = forms.VirtualMachineBulkEditForm form = forms.VirtualMachineBulkEditForm
class VirtualMachineBulkDeleteView(BulkDeleteView): class VirtualMachineBulkDeleteView(generic.BulkDeleteView):
queryset = VirtualMachine.objects.prefetch_related('cluster', 'tenant', 'role') queryset = VirtualMachine.objects.prefetch_related('cluster', 'tenant', 'role')
filterset = filters.VirtualMachineFilterSet filterset = filters.VirtualMachineFilterSet
table = tables.VirtualMachineTable table = tables.VirtualMachineTable
@ -310,7 +307,7 @@ class VirtualMachineBulkDeleteView(BulkDeleteView):
# VM interfaces # VM interfaces
# #
class VMInterfaceListView(ObjectListView): class VMInterfaceListView(generic.ObjectListView):
queryset = VMInterface.objects.all() queryset = VMInterface.objects.all()
filterset = filters.VMInterfaceFilterSet filterset = filters.VMInterfaceFilterSet
filterset_form = forms.VMInterfaceFilterForm filterset_form = forms.VMInterfaceFilterForm
@ -318,7 +315,7 @@ class VMInterfaceListView(ObjectListView):
action_buttons = ('export',) action_buttons = ('export',)
class VMInterfaceView(ObjectView): class VMInterfaceView(generic.ObjectView):
queryset = VMInterface.objects.all() queryset = VMInterface.objects.all()
def get(self, request, pk): def get(self, request, pk):
@ -353,41 +350,41 @@ class VMInterfaceView(ObjectView):
# TODO: This should not use ComponentCreateView # TODO: This should not use ComponentCreateView
class VMInterfaceCreateView(ComponentCreateView): class VMInterfaceCreateView(generic.ComponentCreateView):
queryset = VMInterface.objects.all() queryset = VMInterface.objects.all()
form = forms.VMInterfaceCreateForm form = forms.VMInterfaceCreateForm
model_form = forms.VMInterfaceForm model_form = forms.VMInterfaceForm
template_name = 'virtualization/virtualmachine_component_add.html' template_name = 'virtualization/virtualmachine_component_add.html'
class VMInterfaceEditView(ObjectEditView): class VMInterfaceEditView(generic.ObjectEditView):
queryset = VMInterface.objects.all() queryset = VMInterface.objects.all()
model_form = forms.VMInterfaceForm model_form = forms.VMInterfaceForm
template_name = 'virtualization/vminterface_edit.html' template_name = 'virtualization/vminterface_edit.html'
class VMInterfaceDeleteView(ObjectDeleteView): class VMInterfaceDeleteView(generic.ObjectDeleteView):
queryset = VMInterface.objects.all() queryset = VMInterface.objects.all()
class VMInterfaceBulkImportView(BulkImportView): class VMInterfaceBulkImportView(generic.BulkImportView):
queryset = VMInterface.objects.all() queryset = VMInterface.objects.all()
model_form = forms.VMInterfaceCSVForm model_form = forms.VMInterfaceCSVForm
table = tables.VMInterfaceTable table = tables.VMInterfaceTable
class VMInterfaceBulkEditView(BulkEditView): class VMInterfaceBulkEditView(generic.BulkEditView):
queryset = VMInterface.objects.all() queryset = VMInterface.objects.all()
table = tables.VMInterfaceTable table = tables.VMInterfaceTable
form = forms.VMInterfaceBulkEditForm form = forms.VMInterfaceBulkEditForm
class VMInterfaceBulkRenameView(BulkRenameView): class VMInterfaceBulkRenameView(generic.BulkRenameView):
queryset = VMInterface.objects.all() queryset = VMInterface.objects.all()
form = forms.VMInterfaceBulkRenameForm form = forms.VMInterfaceBulkRenameForm
class VMInterfaceBulkDeleteView(BulkDeleteView): class VMInterfaceBulkDeleteView(generic.BulkDeleteView):
queryset = VMInterface.objects.all() queryset = VMInterface.objects.all()
table = tables.VMInterfaceTable table = tables.VMInterfaceTable
@ -396,7 +393,7 @@ class VMInterfaceBulkDeleteView(BulkDeleteView):
# Bulk Device component creation # Bulk Device component creation
# #
class VirtualMachineBulkAddInterfaceView(BulkComponentCreateView): class VirtualMachineBulkAddInterfaceView(generic.BulkComponentCreateView):
parent_model = VirtualMachine parent_model = VirtualMachine
parent_field = 'virtual_machine' parent_field = 'virtual_machine'
form = forms.VMInterfaceBulkCreateForm form = forms.VMInterfaceBulkCreateForm