views.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. from django.contrib import messages
  2. from django.contrib.auth.mixins import PermissionRequiredMixin
  3. from django.db.models import Count
  4. from django.shortcuts import get_object_or_404, render
  5. from utilities.views import (
  6. BulkImportView, BulkEditView, BulkDeleteView, ObjectListView, ObjectEditView, ObjectDeleteView,
  7. )
  8. from . import forms
  9. from .filters import CircuitFilter
  10. from .models import Circuit, CircuitType, Provider
  11. from .tables import CircuitTable, CircuitTypeTable, ProviderTable
  12. #
  13. # Providers
  14. #
  15. class ProviderListView(ObjectListView):
  16. queryset = Provider.objects.annotate(count_circuits=Count('circuits'))
  17. table = ProviderTable
  18. edit_permissions = ['circuits.change_provider', 'circuits.delete_provider']
  19. template_name = 'circuits/provider_list.html'
  20. def provider(request, slug):
  21. provider = get_object_or_404(Provider, slug=slug)
  22. circuits = Circuit.objects.filter(provider=provider).select_related('site', 'interface__device')
  23. return render(request, 'circuits/provider.html', {
  24. 'provider': provider,
  25. 'circuits': circuits,
  26. })
  27. class ProviderEditView(PermissionRequiredMixin, ObjectEditView):
  28. permission_required = 'circuits.change_provider'
  29. model = Provider
  30. form_class = forms.ProviderForm
  31. template_name = 'circuits/provider_edit.html'
  32. cancel_url = 'circuits:provider_list'
  33. class ProviderDeleteView(PermissionRequiredMixin, ObjectDeleteView):
  34. permission_required = 'circuits.delete_provider'
  35. model = Provider
  36. redirect_url = 'circuits:provider_list'
  37. class ProviderBulkImportView(PermissionRequiredMixin, BulkImportView):
  38. permission_required = 'circuits.add_provider'
  39. form = forms.ProviderImportForm
  40. table = ProviderTable
  41. template_name = 'circuits/provider_import.html'
  42. obj_list_url = 'circuits:provider_list'
  43. class ProviderBulkEditView(PermissionRequiredMixin, BulkEditView):
  44. permission_required = 'circuits.change_provider'
  45. cls = Provider
  46. form = forms.ProviderBulkEditForm
  47. template_name = 'circuits/provider_bulk_edit.html'
  48. default_redirect_url = 'circuits:provider_list'
  49. def update_objects(self, pk_list, form):
  50. fields_to_update = {}
  51. for field in ['asn', 'account', 'portal_url', 'noc_contact', 'admin_contact', 'comments']:
  52. if form.cleaned_data[field]:
  53. fields_to_update[field] = form.cleaned_data[field]
  54. updated_count = self.cls.objects.filter(pk__in=pk_list).update(**fields_to_update)
  55. messages.success(self.request, "Updated {} providers".format(updated_count))
  56. class ProviderBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
  57. permission_required = 'circuits.delete_provider'
  58. cls = Provider
  59. form = forms.ProviderBulkDeleteForm
  60. default_redirect_url = 'circuits:provider_list'
  61. #
  62. # Circuit Types
  63. #
  64. class CircuitTypeListView(ObjectListView):
  65. queryset = CircuitType.objects.annotate(circuit_count=Count('circuits'))
  66. table = CircuitTypeTable
  67. edit_permissions = ['circuits.change_circuittype', 'circuits.delete_circuittype']
  68. template_name = 'circuits/circuittype_list.html'
  69. class CircuitTypeEditView(PermissionRequiredMixin, ObjectEditView):
  70. permission_required = 'circuits.change_circuittype'
  71. model = CircuitType
  72. form_class = forms.CircuitTypeForm
  73. success_url = 'circuits:circuittype_list'
  74. cancel_url = 'circuits:circuittype_list'
  75. class CircuitTypeBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
  76. permission_required = 'circuits.delete_circuittype'
  77. cls = CircuitType
  78. form = forms.CircuitTypeBulkDeleteForm
  79. default_redirect_url = 'circuits:circuittype_list'
  80. #
  81. # Circuits
  82. #
  83. class CircuitListView(ObjectListView):
  84. queryset = Circuit.objects.select_related('provider', 'type', 'site')
  85. filter = CircuitFilter
  86. filter_form = forms.CircuitFilterForm
  87. table = CircuitTable
  88. edit_permissions = ['circuits.change_circuit', 'circuits.delete_circuit']
  89. template_name = 'circuits/circuit_list.html'
  90. def circuit(request, pk):
  91. circuit = get_object_or_404(Circuit, pk=pk)
  92. return render(request, 'circuits/circuit.html', {
  93. 'circuit': circuit,
  94. })
  95. class CircuitEditView(PermissionRequiredMixin, ObjectEditView):
  96. permission_required = 'circuits.change_circuit'
  97. model = Circuit
  98. form_class = forms.CircuitForm
  99. fields_initial = ['site']
  100. template_name = 'circuits/circuit_edit.html'
  101. cancel_url = 'circuits:circuit_list'
  102. class CircuitDeleteView(PermissionRequiredMixin, ObjectDeleteView):
  103. permission_required = 'circuits.delete_circuit'
  104. model = Circuit
  105. redirect_url = 'circuits:circuit_list'
  106. class CircuitBulkImportView(PermissionRequiredMixin, BulkImportView):
  107. permission_required = 'circuits.add_circuit'
  108. form = forms.CircuitImportForm
  109. table = CircuitTable
  110. template_name = 'circuits/circuit_import.html'
  111. obj_list_url = 'circuits:circuit_list'
  112. class CircuitBulkEditView(PermissionRequiredMixin, BulkEditView):
  113. permission_required = 'circuits.change_circuit'
  114. cls = Circuit
  115. form = forms.CircuitBulkEditForm
  116. template_name = 'circuits/circuit_bulk_edit.html'
  117. default_redirect_url = 'circuits:circuit_list'
  118. def update_objects(self, pk_list, form):
  119. fields_to_update = {}
  120. for field in ['type', 'provider', 'port_speed', 'commit_rate', 'comments']:
  121. if form.cleaned_data[field]:
  122. fields_to_update[field] = form.cleaned_data[field]
  123. updated_count = self.cls.objects.filter(pk__in=pk_list).update(**fields_to_update)
  124. messages.success(self.request, "Updated {} circuits".format(updated_count))
  125. class CircuitBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
  126. permission_required = 'circuits.delete_circuit'
  127. cls = Circuit
  128. form = forms.CircuitBulkDeleteForm
  129. default_redirect_url = 'circuits:circuit_list'