123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252 |
- from __future__ import unicode_literals
- from django.contrib import messages
- from django.contrib.auth.decorators import permission_required
- from django.contrib.auth.mixins import PermissionRequiredMixin
- from django.db import transaction
- from django.db.models import Count
- from django.shortcuts import get_object_or_404, redirect, render
- from django.urls import reverse
- from django.views.generic import View
- from extras.models import Graph, GRAPH_TYPE_PROVIDER
- from utilities.forms import ConfirmationForm
- from utilities.views import (
- BulkDeleteView, BulkEditView, BulkImportView, ObjectDeleteView, ObjectEditView, ObjectListView,
- )
- from . import filters, forms, tables
- from .models import Circuit, CircuitTermination, CircuitType, Provider, TERM_SIDE_A, TERM_SIDE_Z
- #
- # Providers
- #
- class ProviderListView(ObjectListView):
- queryset = Provider.objects.annotate(count_circuits=Count('circuits'))
- filter = filters.ProviderFilter
- filter_form = forms.ProviderFilterForm
- table = tables.ProviderTable
- template_name = 'circuits/provider_list.html'
- class ProviderView(View):
- def get(self, request, slug):
- provider = get_object_or_404(Provider, slug=slug)
- circuits = Circuit.objects.filter(provider=provider).select_related(
- 'type', 'tenant'
- ).prefetch_related(
- 'terminations__site'
- )
- show_graphs = Graph.objects.filter(type=GRAPH_TYPE_PROVIDER).exists()
- return render(request, 'circuits/provider.html', {
- 'provider': provider,
- 'circuits': circuits,
- 'show_graphs': show_graphs,
- })
- class ProviderEditView(PermissionRequiredMixin, ObjectEditView):
- permission_required = 'circuits.change_provider'
- model = Provider
- form_class = forms.ProviderForm
- template_name = 'circuits/provider_edit.html'
- default_return_url = 'circuits:provider_list'
- class ProviderDeleteView(PermissionRequiredMixin, ObjectDeleteView):
- permission_required = 'circuits.delete_provider'
- model = Provider
- default_return_url = 'circuits:provider_list'
- class ProviderBulkImportView(PermissionRequiredMixin, BulkImportView):
- permission_required = 'circuits.add_provider'
- model_form = forms.ProviderCSVForm
- table = tables.ProviderTable
- default_return_url = 'circuits:provider_list'
- class ProviderBulkEditView(PermissionRequiredMixin, BulkEditView):
- permission_required = 'circuits.change_provider'
- cls = Provider
- filter = filters.ProviderFilter
- form = forms.ProviderBulkEditForm
- template_name = 'circuits/provider_bulk_edit.html'
- default_return_url = 'circuits:provider_list'
- class ProviderBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
- permission_required = 'circuits.delete_provider'
- cls = Provider
- filter = filters.ProviderFilter
- default_return_url = 'circuits:provider_list'
- #
- # Circuit Types
- #
- class CircuitTypeListView(ObjectListView):
- queryset = CircuitType.objects.annotate(circuit_count=Count('circuits'))
- table = tables.CircuitTypeTable
- template_name = 'circuits/circuittype_list.html'
- class CircuitTypeEditView(PermissionRequiredMixin, ObjectEditView):
- permission_required = 'circuits.change_circuittype'
- model = CircuitType
- form_class = forms.CircuitTypeForm
- def get_return_url(self, request, obj):
- return reverse('circuits:circuittype_list')
- class CircuitTypeBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
- permission_required = 'circuits.delete_circuittype'
- cls = CircuitType
- default_return_url = 'circuits:circuittype_list'
- #
- # Circuits
- #
- class CircuitListView(ObjectListView):
- queryset = Circuit.objects.select_related('provider', 'type', 'tenant').prefetch_related('terminations__site')
- filter = filters.CircuitFilter
- filter_form = forms.CircuitFilterForm
- table = tables.CircuitTable
- template_name = 'circuits/circuit_list.html'
- class CircuitView(View):
- def get(self, request, pk):
- circuit = get_object_or_404(Circuit.objects.select_related('provider', 'type', 'tenant__group'), pk=pk)
- termination_a = CircuitTermination.objects.select_related(
- 'site__region', 'interface__device'
- ).filter(
- circuit=circuit, term_side=TERM_SIDE_A
- ).first()
- termination_z = CircuitTermination.objects.select_related(
- 'site__region', 'interface__device'
- ).filter(
- circuit=circuit, term_side=TERM_SIDE_Z
- ).first()
- return render(request, 'circuits/circuit.html', {
- 'circuit': circuit,
- 'termination_a': termination_a,
- 'termination_z': termination_z,
- })
- class CircuitEditView(PermissionRequiredMixin, ObjectEditView):
- permission_required = 'circuits.change_circuit'
- model = Circuit
- form_class = forms.CircuitForm
- template_name = 'circuits/circuit_edit.html'
- default_return_url = 'circuits:circuit_list'
- class CircuitDeleteView(PermissionRequiredMixin, ObjectDeleteView):
- permission_required = 'circuits.delete_circuit'
- model = Circuit
- default_return_url = 'circuits:circuit_list'
- class CircuitBulkImportView(PermissionRequiredMixin, BulkImportView):
- permission_required = 'circuits.add_circuit'
- model_form = forms.CircuitCSVForm
- table = tables.CircuitTable
- default_return_url = 'circuits:circuit_list'
- class CircuitBulkEditView(PermissionRequiredMixin, BulkEditView):
- permission_required = 'circuits.change_circuit'
- cls = Circuit
- filter = filters.CircuitFilter
- form = forms.CircuitBulkEditForm
- template_name = 'circuits/circuit_bulk_edit.html'
- default_return_url = 'circuits:circuit_list'
- class CircuitBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
- permission_required = 'circuits.delete_circuit'
- cls = Circuit
- filter = filters.CircuitFilter
- default_return_url = 'circuits:circuit_list'
- @permission_required('circuits.change_circuittermination')
- def circuit_terminations_swap(request, pk):
- circuit = get_object_or_404(Circuit, pk=pk)
- termination_a = CircuitTermination.objects.filter(circuit=circuit, term_side=TERM_SIDE_A).first()
- termination_z = CircuitTermination.objects.filter(circuit=circuit, term_side=TERM_SIDE_Z).first()
- if not termination_a and not termination_z:
- messages.error(request, "No terminations have been defined for circuit {}.".format(circuit))
- return redirect('circuits:circuit', pk=circuit.pk)
- if request.method == 'POST':
- form = ConfirmationForm(request.POST)
- if form.is_valid():
- if termination_a and termination_z:
- # Use a placeholder to avoid an IntegrityError on the (circuit, term_side) unique constraint
- 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)
- else:
- form = ConfirmationForm()
- return render(request, 'circuits/circuit_terminations_swap.html', {
- 'circuit': circuit,
- 'termination_a': termination_a,
- 'termination_z': termination_z,
- 'form': form,
- 'panel_class': 'default',
- 'button_class': 'primary',
- 'return_url': circuit.get_absolute_url(),
- })
- #
- # Circuit terminations
- #
- class CircuitTerminationEditView(PermissionRequiredMixin, ObjectEditView):
- permission_required = 'circuits.change_circuittermination'
- model = CircuitTermination
- form_class = 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()
- class CircuitTerminationDeleteView(PermissionRequiredMixin, ObjectDeleteView):
- permission_required = 'circuits.delete_circuittermination'
- model = CircuitTermination
|