1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

357 lines
11 KiB
Python
Raw Normal View History

from django.contrib import messages
from django.db import transaction
2021-03-18 14:05:32 -04:00
from django.db.models import Q
from django.shortcuts import get_object_or_404, redirect, render
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
from netbox.views import generic
from utilities.forms import ConfirmationForm
from utilities.tables import paginate_table
from utilities.utils import count_related
2016-05-18 16:35:35 -04:00
from . import filters, forms, tables
from .choices import CircuitTerminationSideChoices
2021-03-18 11:10:48 -04:00
from .models import *
2016-03-01 11:23:03 -05:00
#
# Providers
#
2020-11-11 16:07:38 -05:00
class ProviderListView(generic.ObjectListView):
queryset = Provider.objects.annotate(
count_circuits=count_related(Circuit, 'provider')
)
filterset = filters.ProviderFilterSet
filterset_form = forms.ProviderFilterForm
table = tables.ProviderTable
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class ProviderView(generic.ObjectView):
queryset = Provider.objects.all()
2016-03-01 11:23:03 -05:00
def get_extra_context(self, request, instance):
2020-06-01 11:43:49 -04:00
circuits = Circuit.objects.restrict(request.user, 'view').filter(
provider=instance
).prefetch_related(
'type', 'tenant', 'terminations__site'
2021-03-18 13:54:05 -04:00
)
circuits_table = tables.CircuitTable(circuits)
2020-01-09 20:15:22 +00:00
circuits_table.columns.hide('provider')
paginate_table(circuits_table, request)
return {
'circuits_table': circuits_table,
}
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class ProviderEditView(generic.ObjectEditView):
queryset = Provider.objects.all()
model_form = forms.ProviderForm
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class ProviderDeleteView(generic.ObjectDeleteView):
queryset = Provider.objects.all()
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class ProviderBulkImportView(generic.BulkImportView):
2020-05-21 11:58:27 -04:00
queryset = Provider.objects.all()
model_form = forms.ProviderCSVForm
2016-05-18 16:35:35 -04:00
table = tables.ProviderTable
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class ProviderBulkEditView(generic.BulkEditView):
queryset = Provider.objects.annotate(
count_circuits=count_related(Circuit, 'provider')
)
filterset = filters.ProviderFilterSet
table = tables.ProviderTable
2016-05-18 15:17:58 -04:00
form = forms.ProviderBulkEditForm
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class ProviderBulkDeleteView(generic.BulkDeleteView):
queryset = Provider.objects.annotate(
count_circuits=count_related(Circuit, 'provider')
)
filterset = filters.ProviderFilterSet
table = tables.ProviderTable
2016-03-01 11:23:03 -05:00
2021-03-18 11:10:48 -04:00
#
2021-04-01 10:21:41 -04:00
# Provider networks
2021-03-18 11:10:48 -04:00
#
2021-04-01 10:21:41 -04:00
class ProviderNetworkListView(generic.ObjectListView):
queryset = ProviderNetwork.objects.all()
filterset = filters.ProviderNetworkFilterSet
filterset_form = forms.ProviderNetworkFilterForm
table = tables.ProviderNetworkTable
2021-03-18 11:10:48 -04:00
2021-04-01 10:21:41 -04:00
class ProviderNetworkView(generic.ObjectView):
queryset = ProviderNetwork.objects.all()
2021-03-18 11:10:48 -04:00
2021-03-18 14:05:32 -04:00
def get_extra_context(self, request, instance):
circuits = Circuit.objects.restrict(request.user, 'view').filter(
2021-04-01 10:21:41 -04:00
Q(termination_a__provider_network=instance.pk) |
Q(termination_z__provider_network=instance.pk)
2021-03-18 14:05:32 -04:00
).prefetch_related(
'type', 'tenant', 'terminations__site'
)
circuits_table = tables.CircuitTable(circuits)
circuits_table.columns.hide('termination_a')
circuits_table.columns.hide('termination_z')
paginate_table(circuits_table, request)
2021-03-18 14:05:32 -04:00
return {
'circuits_table': circuits_table,
}
2021-03-18 11:10:48 -04:00
2021-04-01 10:21:41 -04:00
class ProviderNetworkEditView(generic.ObjectEditView):
queryset = ProviderNetwork.objects.all()
model_form = forms.ProviderNetworkForm
2021-03-18 11:10:48 -04:00
2021-04-01 10:21:41 -04:00
class ProviderNetworkDeleteView(generic.ObjectDeleteView):
queryset = ProviderNetwork.objects.all()
2021-03-18 11:10:48 -04:00
2021-04-01 10:21:41 -04:00
class ProviderNetworkBulkImportView(generic.BulkImportView):
queryset = ProviderNetwork.objects.all()
model_form = forms.ProviderNetworkCSVForm
table = tables.ProviderNetworkTable
2021-03-18 11:10:48 -04:00
2021-04-01 10:21:41 -04:00
class ProviderNetworkBulkEditView(generic.BulkEditView):
queryset = ProviderNetwork.objects.all()
filterset = filters.ProviderNetworkFilterSet
table = tables.ProviderNetworkTable
form = forms.ProviderNetworkBulkEditForm
2021-03-18 11:10:48 -04:00
2021-04-01 10:21:41 -04:00
class ProviderNetworkBulkDeleteView(generic.BulkDeleteView):
queryset = ProviderNetwork.objects.all()
filterset = filters.ProviderNetworkFilterSet
table = tables.ProviderNetworkTable
2021-03-18 11:10:48 -04:00
2016-05-13 12:44:03 -04:00
#
# Circuit Types
#
2020-11-11 16:07:38 -05:00
class CircuitTypeListView(generic.ObjectListView):
queryset = CircuitType.objects.annotate(
circuit_count=count_related(Circuit, 'type')
)
2016-05-18 16:35:35 -04:00
table = tables.CircuitTypeTable
2016-05-13 12:44:03 -04:00
class CircuitTypeView(generic.ObjectView):
queryset = CircuitType.objects.all()
def get_extra_context(self, request, instance):
circuits = Circuit.objects.restrict(request.user, 'view').filter(
type=instance
)
circuits_table = tables.CircuitTable(circuits)
circuits_table.columns.hide('type')
paginate_table(circuits_table, request)
return {
'circuits_table': circuits_table,
}
2020-11-11 16:07:38 -05:00
class CircuitTypeEditView(generic.ObjectEditView):
queryset = CircuitType.objects.all()
model_form = forms.CircuitTypeForm
2016-05-13 12:44:03 -04:00
2020-11-11 16:07:38 -05:00
class CircuitTypeDeleteView(generic.ObjectDeleteView):
queryset = CircuitType.objects.all()
2020-11-11 16:07:38 -05:00
class CircuitTypeBulkImportView(generic.BulkImportView):
2020-05-21 11:58:27 -04:00
queryset = CircuitType.objects.all()
model_form = forms.CircuitTypeCSVForm
table = tables.CircuitTypeTable
class CircuitTypeBulkEditView(generic.BulkEditView):
queryset = CircuitType.objects.annotate(
circuit_count=count_related(Circuit, 'type')
)
filterset = filters.CircuitTypeFilterSet
table = tables.CircuitTypeTable
form = forms.CircuitTypeBulkEditForm
2020-11-11 16:07:38 -05:00
class CircuitTypeBulkDeleteView(generic.BulkDeleteView):
queryset = CircuitType.objects.annotate(
circuit_count=count_related(Circuit, 'type')
)
table = tables.CircuitTypeTable
2016-05-13 12:44:03 -04:00
2016-03-01 11:23:03 -05:00
#
# Circuits
#
2020-11-11 16:07:38 -05:00
class CircuitListView(generic.ObjectListView):
queryset = Circuit.objects.prefetch_related(
2021-03-18 13:54:05 -04:00
'provider', 'type', 'tenant', 'termination_a', 'termination_z'
)
filterset = filters.CircuitFilterSet
filterset_form = forms.CircuitFilterForm
2016-05-18 16:35:35 -04:00
table = tables.CircuitTable
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class CircuitView(generic.ObjectView):
queryset = Circuit.objects.all()
def get_extra_context(self, request, instance):
# A-side termination
2020-06-01 11:43:49 -04:00
termination_a = CircuitTermination.objects.restrict(request.user, 'view').prefetch_related(
'site__region'
).filter(
circuit=instance, term_side=CircuitTerminationSideChoices.SIDE_A
).first()
# Z-side termination
2020-06-01 11:43:49 -04:00
termination_z = CircuitTermination.objects.restrict(request.user, 'view').prefetch_related(
'site__region'
).filter(
circuit=instance, term_side=CircuitTerminationSideChoices.SIDE_Z
).first()
return {
'termination_a': termination_a,
'termination_z': termination_z,
}
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class CircuitEditView(generic.ObjectEditView):
queryset = Circuit.objects.all()
model_form = forms.CircuitForm
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class CircuitDeleteView(generic.ObjectDeleteView):
queryset = Circuit.objects.all()
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class CircuitBulkImportView(generic.BulkImportView):
2020-05-21 11:58:27 -04:00
queryset = Circuit.objects.all()
model_form = forms.CircuitCSVForm
2016-05-18 16:35:35 -04:00
table = tables.CircuitTable
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class CircuitBulkEditView(generic.BulkEditView):
queryset = Circuit.objects.prefetch_related(
'provider', 'type', 'tenant', 'terminations'
)
filterset = filters.CircuitFilterSet
table = tables.CircuitTable
2016-05-18 15:17:58 -04:00
form = forms.CircuitBulkEditForm
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class CircuitBulkDeleteView(generic.BulkDeleteView):
queryset = Circuit.objects.prefetch_related(
'provider', 'type', 'tenant', 'terminations'
)
filterset = filters.CircuitFilterSet
table = tables.CircuitTable
2020-11-11 16:07:38 -05:00
class CircuitSwapTerminations(generic.ObjectEditView):
"""
Swap the A and Z terminations of a circuit.
"""
queryset = Circuit.objects.all()
def get(self, request, pk):
circuit = get_object_or_404(self.queryset, pk=pk)
form = ConfirmationForm()
# Circuit must have at least one termination to swap
if not circuit.termination_a and not circuit.termination_z:
messages.error(request, "No terminations have been defined for circuit {}.".format(circuit))
return redirect('circuits:circuit', pk=circuit.pk)
return render(request, 'circuits/circuit_terminations_swap.html', {
'circuit': circuit,
'termination_a': circuit.termination_a,
'termination_z': circuit.termination_z,
'form': form,
'panel_class': 'default',
'button_class': 'primary',
'return_url': circuit.get_absolute_url(),
})
def post(self, request, pk):
circuit = get_object_or_404(self.queryset, pk=pk)
form = ConfirmationForm(request.POST)
if form.is_valid():
termination_a = CircuitTermination.objects.filter(
circuit=circuit, term_side=CircuitTerminationSideChoices.SIDE_A
).first()
termination_z = CircuitTermination.objects.filter(
circuit=circuit, term_side=CircuitTerminationSideChoices.SIDE_Z
).first()
if termination_a and termination_z:
# Use a placeholder to avoid an IntegrityError on the (circuit, term_side) unique constraint
print('swapping')
with transaction.atomic():
termination_a.term_side = '_'
termination_a.save()
termination_z.term_side = 'A'
termination_z.save()
termination_a.term_side = 'Z'
termination_a.save()
elif termination_a:
termination_a.term_side = 'Z'
termination_a.save()
else:
termination_z.term_side = 'A'
termination_z.save()
messages.success(request, "Swapped terminations for circuit {}.".format(circuit))
return redirect('circuits:circuit', pk=circuit.pk)
return render(request, 'circuits/circuit_terminations_swap.html', {
'circuit': circuit,
'termination_a': circuit.termination_a,
'termination_z': circuit.termination_z,
'form': form,
'panel_class': 'default',
'button_class': 'primary',
'return_url': circuit.get_absolute_url(),
})
#
# Circuit terminations
#
2020-11-11 16:07:38 -05:00
class CircuitTerminationEditView(generic.ObjectEditView):
queryset = CircuitTermination.objects.all()
model_form = forms.CircuitTerminationForm
template_name = 'circuits/circuittermination_edit.html'
def alter_obj(self, obj, request, url_args, url_kwargs):
if 'circuit' in url_kwargs:
obj.circuit = get_object_or_404(Circuit, pk=url_kwargs['circuit'])
return obj
def get_return_url(self, request, obj):
return obj.circuit.get_absolute_url()
2020-11-11 16:07:38 -05:00
class CircuitTerminationDeleteView(generic.ObjectDeleteView):
queryset = CircuitTermination.objects.all()