views.py 5.6 KB

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