views.py 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809
  1. from django.contrib import messages
  2. from django.db import router, transaction
  3. from django.shortcuts import get_object_or_404, redirect, render
  4. from django.utils.translation import gettext_lazy as _
  5. from dcim.views import PathTraceView
  6. from ipam.models import ASN
  7. from netbox.object_actions import AddObject, BulkDelete, BulkEdit, BulkExport, BulkImport
  8. from netbox.views import generic
  9. from utilities.forms import ConfirmationForm
  10. from utilities.query import count_related
  11. from utilities.views import GetRelatedModelsMixin, register_model_view
  12. from . import filtersets, forms, tables
  13. from .models import *
  14. #
  15. # Providers
  16. #
  17. @register_model_view(Provider, 'list', path='', detail=False)
  18. class ProviderListView(generic.ObjectListView):
  19. queryset = Provider.objects.annotate(
  20. count_circuits=count_related(Circuit, 'provider'),
  21. asn_count=count_related(ASN, 'providers'),
  22. account_count=count_related(ProviderAccount, 'provider'),
  23. )
  24. filterset = filtersets.ProviderFilterSet
  25. filterset_form = forms.ProviderFilterForm
  26. table = tables.ProviderTable
  27. @register_model_view(Provider)
  28. class ProviderView(GetRelatedModelsMixin, generic.ObjectView):
  29. queryset = Provider.objects.all()
  30. def get_extra_context(self, request, instance):
  31. return {
  32. 'related_models': self.get_related_models(
  33. request,
  34. instance,
  35. omit=(),
  36. extra=(
  37. (
  38. VirtualCircuit.objects.restrict(request.user, 'view').filter(
  39. provider_network__provider=instance
  40. ),
  41. 'provider_id',
  42. ),
  43. ),
  44. ),
  45. }
  46. @register_model_view(Provider, 'add', detail=False)
  47. @register_model_view(Provider, 'edit')
  48. class ProviderEditView(generic.ObjectEditView):
  49. queryset = Provider.objects.all()
  50. form = forms.ProviderForm
  51. @register_model_view(Provider, 'delete')
  52. class ProviderDeleteView(generic.ObjectDeleteView):
  53. queryset = Provider.objects.all()
  54. @register_model_view(Provider, 'bulk_import', path='import', detail=False)
  55. class ProviderBulkImportView(generic.BulkImportView):
  56. queryset = Provider.objects.all()
  57. model_form = forms.ProviderImportForm
  58. @register_model_view(Provider, 'bulk_edit', path='edit', detail=False)
  59. class ProviderBulkEditView(generic.BulkEditView):
  60. queryset = Provider.objects.annotate(
  61. count_circuits=count_related(Circuit, 'provider')
  62. )
  63. filterset = filtersets.ProviderFilterSet
  64. table = tables.ProviderTable
  65. form = forms.ProviderBulkEditForm
  66. @register_model_view(Provider, 'bulk_rename', path='rename', detail=False)
  67. class ProviderBulkRenameView(generic.BulkRenameView):
  68. queryset = Provider.objects.all()
  69. filterset = filtersets.ProviderFilterSet
  70. @register_model_view(Provider, 'bulk_delete', path='delete', detail=False)
  71. class ProviderBulkDeleteView(generic.BulkDeleteView):
  72. queryset = Provider.objects.annotate(
  73. count_circuits=count_related(Circuit, 'provider')
  74. )
  75. filterset = filtersets.ProviderFilterSet
  76. table = tables.ProviderTable
  77. #
  78. # ProviderAccounts
  79. #
  80. @register_model_view(ProviderAccount, 'list', path='', detail=False)
  81. class ProviderAccountListView(generic.ObjectListView):
  82. queryset = ProviderAccount.objects.annotate(
  83. count_circuits=count_related(Circuit, 'provider_account')
  84. )
  85. filterset = filtersets.ProviderAccountFilterSet
  86. filterset_form = forms.ProviderAccountFilterForm
  87. table = tables.ProviderAccountTable
  88. @register_model_view(ProviderAccount)
  89. class ProviderAccountView(GetRelatedModelsMixin, generic.ObjectView):
  90. queryset = ProviderAccount.objects.all()
  91. def get_extra_context(self, request, instance):
  92. return {
  93. 'related_models': self.get_related_models(request, instance),
  94. }
  95. @register_model_view(ProviderAccount, 'add', detail=False)
  96. @register_model_view(ProviderAccount, 'edit')
  97. class ProviderAccountEditView(generic.ObjectEditView):
  98. queryset = ProviderAccount.objects.all()
  99. form = forms.ProviderAccountForm
  100. @register_model_view(ProviderAccount, 'delete')
  101. class ProviderAccountDeleteView(generic.ObjectDeleteView):
  102. queryset = ProviderAccount.objects.all()
  103. @register_model_view(ProviderAccount, 'bulk_import', path='import', detail=False)
  104. class ProviderAccountBulkImportView(generic.BulkImportView):
  105. queryset = ProviderAccount.objects.all()
  106. model_form = forms.ProviderAccountImportForm
  107. table = tables.ProviderAccountTable
  108. @register_model_view(ProviderAccount, 'bulk_edit', path='edit', detail=False)
  109. class ProviderAccountBulkEditView(generic.BulkEditView):
  110. queryset = ProviderAccount.objects.annotate(
  111. count_circuits=count_related(Circuit, 'provider_account')
  112. )
  113. filterset = filtersets.ProviderAccountFilterSet
  114. table = tables.ProviderAccountTable
  115. form = forms.ProviderAccountBulkEditForm
  116. @register_model_view(ProviderAccount, 'bulk_rename', path='rename', detail=False)
  117. class ProviderAccountBulkRenameView(generic.BulkRenameView):
  118. queryset = ProviderAccount.objects.all()
  119. filterset = filtersets.ProviderAccountFilterSet
  120. @register_model_view(ProviderAccount, 'bulk_delete', path='delete', detail=False)
  121. class ProviderAccountBulkDeleteView(generic.BulkDeleteView):
  122. queryset = ProviderAccount.objects.annotate(
  123. count_circuits=count_related(Circuit, 'provider_account')
  124. )
  125. filterset = filtersets.ProviderAccountFilterSet
  126. table = tables.ProviderAccountTable
  127. #
  128. # Provider networks
  129. #
  130. @register_model_view(ProviderNetwork, 'list', path='', detail=False)
  131. class ProviderNetworkListView(generic.ObjectListView):
  132. queryset = ProviderNetwork.objects.all()
  133. filterset = filtersets.ProviderNetworkFilterSet
  134. filterset_form = forms.ProviderNetworkFilterForm
  135. table = tables.ProviderNetworkTable
  136. @register_model_view(ProviderNetwork)
  137. class ProviderNetworkView(GetRelatedModelsMixin, generic.ObjectView):
  138. queryset = ProviderNetwork.objects.all()
  139. def get_extra_context(self, request, instance):
  140. return {
  141. 'related_models': self.get_related_models(
  142. request,
  143. instance,
  144. omit=(CircuitTermination,),
  145. extra=(
  146. (
  147. Circuit.objects.restrict(request.user, 'view').filter(terminations___provider_network=instance),
  148. 'provider_network_id',
  149. ),
  150. (
  151. CircuitTermination.objects.restrict(request.user, 'view').filter(_provider_network=instance),
  152. 'provider_network_id',
  153. ),
  154. ),
  155. ),
  156. }
  157. @register_model_view(ProviderNetwork, 'add', detail=False)
  158. @register_model_view(ProviderNetwork, 'edit')
  159. class ProviderNetworkEditView(generic.ObjectEditView):
  160. queryset = ProviderNetwork.objects.all()
  161. form = forms.ProviderNetworkForm
  162. @register_model_view(ProviderNetwork, 'delete')
  163. class ProviderNetworkDeleteView(generic.ObjectDeleteView):
  164. queryset = ProviderNetwork.objects.all()
  165. @register_model_view(ProviderNetwork, 'bulk_import', path='import', detail=False)
  166. class ProviderNetworkBulkImportView(generic.BulkImportView):
  167. queryset = ProviderNetwork.objects.all()
  168. model_form = forms.ProviderNetworkImportForm
  169. @register_model_view(ProviderNetwork, 'bulk_edit', path='edit', detail=False)
  170. class ProviderNetworkBulkEditView(generic.BulkEditView):
  171. queryset = ProviderNetwork.objects.all()
  172. filterset = filtersets.ProviderNetworkFilterSet
  173. table = tables.ProviderNetworkTable
  174. form = forms.ProviderNetworkBulkEditForm
  175. @register_model_view(ProviderNetwork, 'bulk_rename', path='rename', detail=False)
  176. class ProviderNetworkBulkRenameView(generic.BulkRenameView):
  177. queryset = ProviderNetwork.objects.all()
  178. filterset = filtersets.ProviderNetworkFilterSet
  179. @register_model_view(ProviderNetwork, 'bulk_delete', path='delete', detail=False)
  180. class ProviderNetworkBulkDeleteView(generic.BulkDeleteView):
  181. queryset = ProviderNetwork.objects.all()
  182. filterset = filtersets.ProviderNetworkFilterSet
  183. table = tables.ProviderNetworkTable
  184. #
  185. # Circuit Types
  186. #
  187. @register_model_view(CircuitType, 'list', path='', detail=False)
  188. class CircuitTypeListView(generic.ObjectListView):
  189. queryset = CircuitType.objects.annotate(
  190. circuit_count=count_related(Circuit, 'type')
  191. )
  192. filterset = filtersets.CircuitTypeFilterSet
  193. filterset_form = forms.CircuitTypeFilterForm
  194. table = tables.CircuitTypeTable
  195. @register_model_view(CircuitType)
  196. class CircuitTypeView(GetRelatedModelsMixin, generic.ObjectView):
  197. queryset = CircuitType.objects.all()
  198. def get_extra_context(self, request, instance):
  199. return {
  200. 'related_models': self.get_related_models(request, instance),
  201. }
  202. @register_model_view(CircuitType, 'add', detail=False)
  203. @register_model_view(CircuitType, 'edit')
  204. class CircuitTypeEditView(generic.ObjectEditView):
  205. queryset = CircuitType.objects.all()
  206. form = forms.CircuitTypeForm
  207. @register_model_view(CircuitType, 'delete')
  208. class CircuitTypeDeleteView(generic.ObjectDeleteView):
  209. queryset = CircuitType.objects.all()
  210. @register_model_view(CircuitType, 'bulk_import', path='import', detail=False)
  211. class CircuitTypeBulkImportView(generic.BulkImportView):
  212. queryset = CircuitType.objects.all()
  213. model_form = forms.CircuitTypeImportForm
  214. @register_model_view(CircuitType, 'bulk_edit', path='edit', detail=False)
  215. class CircuitTypeBulkEditView(generic.BulkEditView):
  216. queryset = CircuitType.objects.annotate(
  217. circuit_count=count_related(Circuit, 'type')
  218. )
  219. filterset = filtersets.CircuitTypeFilterSet
  220. table = tables.CircuitTypeTable
  221. form = forms.CircuitTypeBulkEditForm
  222. @register_model_view(CircuitType, 'bulk_rename', path='rename', detail=False)
  223. class CircuitTypeBulkRenameView(generic.BulkRenameView):
  224. queryset = CircuitType.objects.all()
  225. filterset = filtersets.CircuitTypeFilterSet
  226. @register_model_view(CircuitType, 'bulk_delete', path='delete', detail=False)
  227. class CircuitTypeBulkDeleteView(generic.BulkDeleteView):
  228. queryset = CircuitType.objects.annotate(
  229. circuit_count=count_related(Circuit, 'type')
  230. )
  231. filterset = filtersets.CircuitTypeFilterSet
  232. table = tables.CircuitTypeTable
  233. #
  234. # Circuits
  235. #
  236. @register_model_view(Circuit, 'list', path='', detail=False)
  237. class CircuitListView(generic.ObjectListView):
  238. queryset = Circuit.objects.prefetch_related(
  239. 'tenant__group', 'termination_a__termination', 'termination_z__termination',
  240. )
  241. filterset = filtersets.CircuitFilterSet
  242. filterset_form = forms.CircuitFilterForm
  243. table = tables.CircuitTable
  244. @register_model_view(Circuit)
  245. class CircuitView(generic.ObjectView):
  246. queryset = Circuit.objects.all()
  247. @register_model_view(Circuit, 'add', detail=False)
  248. @register_model_view(Circuit, 'edit')
  249. class CircuitEditView(generic.ObjectEditView):
  250. queryset = Circuit.objects.all()
  251. form = forms.CircuitForm
  252. @register_model_view(Circuit, 'delete')
  253. class CircuitDeleteView(generic.ObjectDeleteView):
  254. queryset = Circuit.objects.all()
  255. @register_model_view(Circuit, 'bulk_import', path='import', detail=False)
  256. class CircuitBulkImportView(generic.BulkImportView):
  257. queryset = Circuit.objects.all()
  258. model_form = forms.CircuitImportForm
  259. additional_permissions = [
  260. 'circuits.add_circuittermination',
  261. ]
  262. related_object_forms = {
  263. 'terminations': forms.CircuitTerminationImportRelatedForm,
  264. }
  265. def prep_related_object_data(self, parent, data):
  266. data.update({'circuit': parent})
  267. return data
  268. @register_model_view(Circuit, 'bulk_edit', path='edit', detail=False)
  269. class CircuitBulkEditView(generic.BulkEditView):
  270. queryset = Circuit.objects.prefetch_related(
  271. 'tenant__group', 'termination_a__termination', 'termination_z__termination',
  272. )
  273. filterset = filtersets.CircuitFilterSet
  274. table = tables.CircuitTable
  275. form = forms.CircuitBulkEditForm
  276. @register_model_view(Circuit, 'bulk_rename', path='rename', detail=False)
  277. class CircuitBulkRenameView(generic.BulkRenameView):
  278. queryset = Circuit.objects.all()
  279. field_name = 'cid'
  280. filterset = filtersets.CircuitFilterSet
  281. @register_model_view(Circuit, 'bulk_delete', path='delete', detail=False)
  282. class CircuitBulkDeleteView(generic.BulkDeleteView):
  283. queryset = Circuit.objects.prefetch_related(
  284. 'tenant__group', 'termination_a__termination', 'termination_z__termination',
  285. )
  286. filterset = filtersets.CircuitFilterSet
  287. table = tables.CircuitTable
  288. class CircuitSwapTerminations(generic.ObjectEditView):
  289. """
  290. Swap the A and Z terminations of a circuit.
  291. """
  292. queryset = Circuit.objects.all()
  293. def get(self, request, pk):
  294. circuit = get_object_or_404(self.queryset, pk=pk)
  295. form = ConfirmationForm()
  296. # Circuit must have at least one termination to swap
  297. if not circuit.termination_a and not circuit.termination_z:
  298. messages.error(request, _(
  299. "No terminations have been defined for circuit {circuit}."
  300. ).format(circuit=circuit))
  301. return redirect('circuits:circuit', pk=circuit.pk)
  302. return render(request, 'circuits/circuit_terminations_swap.html', {
  303. 'circuit': circuit,
  304. 'termination_a': circuit.termination_a,
  305. 'termination_z': circuit.termination_z,
  306. 'form': form,
  307. 'panel_class': 'light',
  308. 'button_class': 'primary',
  309. 'return_url': circuit.get_absolute_url(),
  310. })
  311. def post(self, request, pk):
  312. circuit = get_object_or_404(self.queryset, pk=pk)
  313. form = ConfirmationForm(request.POST)
  314. if form.is_valid():
  315. termination_a = CircuitTermination.objects.filter(pk=circuit.termination_a_id).first()
  316. termination_z = CircuitTermination.objects.filter(pk=circuit.termination_z_id).first()
  317. if termination_a and termination_z:
  318. # Use a placeholder to avoid an IntegrityError on the (circuit, term_side) unique constraint
  319. with transaction.atomic(using=router.db_for_write(CircuitTermination)):
  320. termination_a.term_side = '_'
  321. termination_a.save()
  322. termination_z.term_side = 'A'
  323. termination_z.save()
  324. termination_a.term_side = 'Z'
  325. termination_a.save()
  326. circuit.refresh_from_db()
  327. circuit.termination_a = termination_z
  328. circuit.termination_z = termination_a
  329. circuit.save()
  330. elif termination_a:
  331. termination_a.term_side = 'Z'
  332. termination_a.save()
  333. circuit.refresh_from_db()
  334. circuit.termination_a = None
  335. circuit.save()
  336. else:
  337. termination_z.term_side = 'A'
  338. termination_z.save()
  339. circuit.refresh_from_db()
  340. circuit.termination_z = None
  341. circuit.save()
  342. messages.success(request, _("Swapped terminations for circuit {circuit}.").format(circuit=circuit))
  343. return redirect('circuits:circuit', pk=circuit.pk)
  344. return render(request, 'circuits/circuit_terminations_swap.html', {
  345. 'circuit': circuit,
  346. 'termination_a': circuit.termination_a,
  347. 'termination_z': circuit.termination_z,
  348. 'form': form,
  349. 'panel_class': 'default',
  350. 'button_class': 'primary',
  351. 'return_url': circuit.get_absolute_url(),
  352. })
  353. #
  354. # Circuit terminations
  355. #
  356. @register_model_view(CircuitTermination, 'list', path='', detail=False)
  357. class CircuitTerminationListView(generic.ObjectListView):
  358. queryset = CircuitTermination.objects.all()
  359. filterset = filtersets.CircuitTerminationFilterSet
  360. filterset_form = forms.CircuitTerminationFilterForm
  361. table = tables.CircuitTerminationTable
  362. actions = (AddObject, BulkImport, BulkExport, BulkEdit, BulkDelete)
  363. @register_model_view(CircuitTermination)
  364. class CircuitTerminationView(generic.ObjectView):
  365. queryset = CircuitTermination.objects.all()
  366. @register_model_view(CircuitTermination, 'add', detail=False)
  367. @register_model_view(CircuitTermination, 'edit')
  368. class CircuitTerminationEditView(generic.ObjectEditView):
  369. queryset = CircuitTermination.objects.all()
  370. form = forms.CircuitTerminationForm
  371. @register_model_view(CircuitTermination, 'delete')
  372. class CircuitTerminationDeleteView(generic.ObjectDeleteView):
  373. queryset = CircuitTermination.objects.all()
  374. @register_model_view(CircuitTermination, 'bulk_import', path='import', detail=False)
  375. class CircuitTerminationBulkImportView(generic.BulkImportView):
  376. queryset = CircuitTermination.objects.all()
  377. model_form = forms.CircuitTerminationImportForm
  378. @register_model_view(CircuitTermination, 'bulk_edit', path='edit', detail=False)
  379. class CircuitTerminationBulkEditView(generic.BulkEditView):
  380. queryset = CircuitTermination.objects.all()
  381. filterset = filtersets.CircuitTerminationFilterSet
  382. table = tables.CircuitTerminationTable
  383. form = forms.CircuitTerminationBulkEditForm
  384. @register_model_view(CircuitTermination, 'bulk_delete', path='delete', detail=False)
  385. class CircuitTerminationBulkDeleteView(generic.BulkDeleteView):
  386. queryset = CircuitTermination.objects.all()
  387. filterset = filtersets.CircuitTerminationFilterSet
  388. table = tables.CircuitTerminationTable
  389. # Trace view
  390. register_model_view(CircuitTermination, 'trace', kwargs={'model': CircuitTermination})(PathTraceView)
  391. #
  392. # Circuit Groups
  393. #
  394. @register_model_view(CircuitGroup, 'list', path='', detail=False)
  395. class CircuitGroupListView(generic.ObjectListView):
  396. queryset = CircuitGroup.objects.annotate(
  397. circuit_group_assignment_count=count_related(CircuitGroupAssignment, 'group')
  398. )
  399. filterset = filtersets.CircuitGroupFilterSet
  400. filterset_form = forms.CircuitGroupFilterForm
  401. table = tables.CircuitGroupTable
  402. @register_model_view(CircuitGroup)
  403. class CircuitGroupView(GetRelatedModelsMixin, generic.ObjectView):
  404. queryset = CircuitGroup.objects.all()
  405. def get_extra_context(self, request, instance):
  406. return {
  407. 'related_models': self.get_related_models(request, instance),
  408. }
  409. @register_model_view(CircuitGroup, 'add', detail=False)
  410. @register_model_view(CircuitGroup, 'edit')
  411. class CircuitGroupEditView(generic.ObjectEditView):
  412. queryset = CircuitGroup.objects.all()
  413. form = forms.CircuitGroupForm
  414. @register_model_view(CircuitGroup, 'delete')
  415. class CircuitGroupDeleteView(generic.ObjectDeleteView):
  416. queryset = CircuitGroup.objects.all()
  417. @register_model_view(CircuitGroup, 'bulk_import', path='import', detail=False)
  418. class CircuitGroupBulkImportView(generic.BulkImportView):
  419. queryset = CircuitGroup.objects.all()
  420. model_form = forms.CircuitGroupImportForm
  421. @register_model_view(CircuitGroup, 'bulk_edit', path='edit', detail=False)
  422. class CircuitGroupBulkEditView(generic.BulkEditView):
  423. queryset = CircuitGroup.objects.all()
  424. filterset = filtersets.CircuitGroupFilterSet
  425. table = tables.CircuitGroupTable
  426. form = forms.CircuitGroupBulkEditForm
  427. @register_model_view(CircuitGroup, 'bulk_rename', path='rename', detail=False)
  428. class CircuitGroupBulkRenameView(generic.BulkRenameView):
  429. queryset = CircuitGroup.objects.all()
  430. filterset = filtersets.CircuitGroupFilterSet
  431. @register_model_view(CircuitGroup, 'bulk_delete', path='delete', detail=False)
  432. class CircuitGroupBulkDeleteView(generic.BulkDeleteView):
  433. queryset = CircuitGroup.objects.all()
  434. filterset = filtersets.CircuitGroupFilterSet
  435. table = tables.CircuitGroupTable
  436. #
  437. # Circuit Groups
  438. #
  439. @register_model_view(CircuitGroupAssignment, 'list', path='', detail=False)
  440. class CircuitGroupAssignmentListView(generic.ObjectListView):
  441. queryset = CircuitGroupAssignment.objects.all()
  442. filterset = filtersets.CircuitGroupAssignmentFilterSet
  443. filterset_form = forms.CircuitGroupAssignmentFilterForm
  444. table = tables.CircuitGroupAssignmentTable
  445. actions = (AddObject, BulkImport, BulkExport, BulkEdit, BulkDelete)
  446. @register_model_view(CircuitGroupAssignment)
  447. class CircuitGroupAssignmentView(generic.ObjectView):
  448. queryset = CircuitGroupAssignment.objects.all()
  449. @register_model_view(CircuitGroupAssignment, 'add', detail=False)
  450. @register_model_view(CircuitGroupAssignment, 'edit')
  451. class CircuitGroupAssignmentEditView(generic.ObjectEditView):
  452. queryset = CircuitGroupAssignment.objects.all()
  453. form = forms.CircuitGroupAssignmentForm
  454. @register_model_view(CircuitGroupAssignment, 'delete')
  455. class CircuitGroupAssignmentDeleteView(generic.ObjectDeleteView):
  456. queryset = CircuitGroupAssignment.objects.all()
  457. @register_model_view(CircuitGroupAssignment, 'bulk_import', path='import', detail=False)
  458. class CircuitGroupAssignmentBulkImportView(generic.BulkImportView):
  459. queryset = CircuitGroupAssignment.objects.all()
  460. model_form = forms.CircuitGroupAssignmentImportForm
  461. @register_model_view(CircuitGroupAssignment, 'bulk_edit', path='edit', detail=False)
  462. class CircuitGroupAssignmentBulkEditView(generic.BulkEditView):
  463. queryset = CircuitGroupAssignment.objects.all()
  464. filterset = filtersets.CircuitGroupAssignmentFilterSet
  465. table = tables.CircuitGroupAssignmentTable
  466. form = forms.CircuitGroupAssignmentBulkEditForm
  467. @register_model_view(CircuitGroupAssignment, 'bulk_delete', path='delete', detail=False)
  468. class CircuitGroupAssignmentBulkDeleteView(generic.BulkDeleteView):
  469. queryset = CircuitGroupAssignment.objects.all()
  470. filterset = filtersets.CircuitGroupAssignmentFilterSet
  471. table = tables.CircuitGroupAssignmentTable
  472. #
  473. # Virtual circuit Types
  474. #
  475. @register_model_view(VirtualCircuitType, 'list', path='', detail=False)
  476. class VirtualCircuitTypeListView(generic.ObjectListView):
  477. queryset = VirtualCircuitType.objects.annotate(
  478. virtual_circuit_count=count_related(VirtualCircuit, 'type')
  479. )
  480. filterset = filtersets.VirtualCircuitTypeFilterSet
  481. filterset_form = forms.VirtualCircuitTypeFilterForm
  482. table = tables.VirtualCircuitTypeTable
  483. @register_model_view(VirtualCircuitType)
  484. class VirtualCircuitTypeView(GetRelatedModelsMixin, generic.ObjectView):
  485. queryset = VirtualCircuitType.objects.all()
  486. def get_extra_context(self, request, instance):
  487. return {
  488. 'related_models': self.get_related_models(request, instance),
  489. }
  490. @register_model_view(VirtualCircuitType, 'add', detail=False)
  491. @register_model_view(VirtualCircuitType, 'edit')
  492. class VirtualCircuitTypeEditView(generic.ObjectEditView):
  493. queryset = VirtualCircuitType.objects.all()
  494. form = forms.VirtualCircuitTypeForm
  495. @register_model_view(VirtualCircuitType, 'delete')
  496. class VirtualCircuitTypeDeleteView(generic.ObjectDeleteView):
  497. queryset = VirtualCircuitType.objects.all()
  498. @register_model_view(VirtualCircuitType, 'bulk_import', path='import', detail=False)
  499. class VirtualCircuitTypeBulkImportView(generic.BulkImportView):
  500. queryset = VirtualCircuitType.objects.all()
  501. model_form = forms.VirtualCircuitTypeImportForm
  502. @register_model_view(VirtualCircuitType, 'bulk_edit', path='edit', detail=False)
  503. class VirtualCircuitTypeBulkEditView(generic.BulkEditView):
  504. queryset = VirtualCircuitType.objects.annotate(
  505. circuit_count=count_related(Circuit, 'type')
  506. )
  507. filterset = filtersets.VirtualCircuitTypeFilterSet
  508. table = tables.VirtualCircuitTypeTable
  509. form = forms.VirtualCircuitTypeBulkEditForm
  510. @register_model_view(VirtualCircuitType, 'bulk_rename', path='rename', detail=False)
  511. class VirtualCircuitTypeBulkRenameView(generic.BulkRenameView):
  512. queryset = VirtualCircuitType.objects.all()
  513. filterset = filtersets.VirtualCircuitTypeFilterSet
  514. @register_model_view(VirtualCircuitType, 'bulk_delete', path='delete', detail=False)
  515. class VirtualCircuitTypeBulkDeleteView(generic.BulkDeleteView):
  516. queryset = VirtualCircuitType.objects.annotate(
  517. circuit_count=count_related(Circuit, 'type')
  518. )
  519. filterset = filtersets.VirtualCircuitTypeFilterSet
  520. table = tables.VirtualCircuitTypeTable
  521. #
  522. # Virtual circuits
  523. #
  524. @register_model_view(VirtualCircuit, 'list', path='', detail=False)
  525. class VirtualCircuitListView(generic.ObjectListView):
  526. queryset = VirtualCircuit.objects.annotate(
  527. termination_count=count_related(VirtualCircuitTermination, 'virtual_circuit')
  528. )
  529. filterset = filtersets.VirtualCircuitFilterSet
  530. filterset_form = forms.VirtualCircuitFilterForm
  531. table = tables.VirtualCircuitTable
  532. @register_model_view(VirtualCircuit)
  533. class VirtualCircuitView(generic.ObjectView):
  534. queryset = VirtualCircuit.objects.all()
  535. @register_model_view(VirtualCircuit, 'add', detail=False)
  536. @register_model_view(VirtualCircuit, 'edit')
  537. class VirtualCircuitEditView(generic.ObjectEditView):
  538. queryset = VirtualCircuit.objects.all()
  539. form = forms.VirtualCircuitForm
  540. @register_model_view(VirtualCircuit, 'delete')
  541. class VirtualCircuitDeleteView(generic.ObjectDeleteView):
  542. queryset = VirtualCircuit.objects.all()
  543. @register_model_view(VirtualCircuit, 'bulk_import', path='import', detail=False)
  544. class VirtualCircuitBulkImportView(generic.BulkImportView):
  545. queryset = VirtualCircuit.objects.all()
  546. model_form = forms.VirtualCircuitImportForm
  547. additional_permissions = [
  548. 'circuits.add_virtualcircuittermination',
  549. ]
  550. related_object_forms = {
  551. 'terminations': forms.VirtualCircuitTerminationImportRelatedForm,
  552. }
  553. def prep_related_object_data(self, parent, data):
  554. data.update({'virtual_circuit': parent})
  555. return data
  556. @register_model_view(VirtualCircuit, 'bulk_edit', path='edit', detail=False)
  557. class VirtualCircuitBulkEditView(generic.BulkEditView):
  558. queryset = VirtualCircuit.objects.annotate(
  559. termination_count=count_related(VirtualCircuitTermination, 'virtual_circuit')
  560. )
  561. filterset = filtersets.VirtualCircuitFilterSet
  562. table = tables.VirtualCircuitTable
  563. form = forms.VirtualCircuitBulkEditForm
  564. @register_model_view(VirtualCircuit, 'bulk_rename', path='rename', detail=False)
  565. class VirtualCircuitBulkRenameView(generic.BulkRenameView):
  566. queryset = VirtualCircuit.objects.all()
  567. field_name = 'cid'
  568. filterset = filtersets.VirtualCircuitFilterSet
  569. @register_model_view(VirtualCircuit, 'bulk_delete', path='delete', detail=False)
  570. class VirtualCircuitBulkDeleteView(generic.BulkDeleteView):
  571. queryset = VirtualCircuit.objects.annotate(
  572. termination_count=count_related(VirtualCircuitTermination, 'virtual_circuit')
  573. )
  574. filterset = filtersets.VirtualCircuitFilterSet
  575. table = tables.VirtualCircuitTable
  576. #
  577. # Virtual circuit terminations
  578. #
  579. class VirtualCircuitTerminationListView(generic.ObjectListView):
  580. queryset = VirtualCircuitTermination.objects.all()
  581. filterset = filtersets.VirtualCircuitTerminationFilterSet
  582. filterset_form = forms.VirtualCircuitTerminationFilterForm
  583. table = tables.VirtualCircuitTerminationTable
  584. actions = (AddObject, BulkImport, BulkExport, BulkEdit, BulkDelete)
  585. @register_model_view(VirtualCircuitTermination)
  586. class VirtualCircuitTerminationView(generic.ObjectView):
  587. queryset = VirtualCircuitTermination.objects.all()
  588. @register_model_view(VirtualCircuitTermination, 'edit')
  589. class VirtualCircuitTerminationEditView(generic.ObjectEditView):
  590. queryset = VirtualCircuitTermination.objects.all()
  591. form = forms.VirtualCircuitTerminationForm
  592. @register_model_view(VirtualCircuitTermination, 'delete')
  593. class VirtualCircuitTerminationDeleteView(generic.ObjectDeleteView):
  594. queryset = VirtualCircuitTermination.objects.all()
  595. class VirtualCircuitTerminationBulkImportView(generic.BulkImportView):
  596. queryset = VirtualCircuitTermination.objects.all()
  597. model_form = forms.VirtualCircuitTerminationImportForm
  598. class VirtualCircuitTerminationBulkEditView(generic.BulkEditView):
  599. queryset = VirtualCircuitTermination.objects.all()
  600. filterset = filtersets.VirtualCircuitTerminationFilterSet
  601. table = tables.VirtualCircuitTerminationTable
  602. form = forms.VirtualCircuitTerminationBulkEditForm
  603. class VirtualCircuitTerminationBulkDeleteView(generic.BulkDeleteView):
  604. queryset = VirtualCircuitTermination.objects.all()
  605. filterset = filtersets.VirtualCircuitTerminationFilterSet
  606. table = tables.VirtualCircuitTerminationTable