views.py 5.7 KB

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