views.py 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967
  1. from django.utils.translation import gettext_lazy as _
  2. from dcim.views import PathTraceView
  3. from extras.ui.panels import CustomFieldsPanel, ImageAttachmentsPanel, TagsPanel
  4. from ipam.models import ASN
  5. from netbox.object_actions import AddObject, BulkDelete, BulkEdit, BulkExport, BulkImport
  6. from netbox.ui import actions, layout
  7. from netbox.ui.breadcrumbs import Breadcrumb, filtered_list_url
  8. from netbox.ui.panels import (
  9. CommentsPanel,
  10. ObjectsTablePanel,
  11. RelatedObjectsPanel,
  12. )
  13. from netbox.views import generic
  14. from utilities.query import count_related
  15. from utilities.views import GetRelatedModelsMixin, register_model_view
  16. from . import filtersets, forms, tables
  17. from .models import *
  18. from .ui import panels
  19. #
  20. # Providers
  21. #
  22. @register_model_view(Provider, 'list', path='', detail=False)
  23. class ProviderListView(generic.ObjectListView):
  24. queryset = Provider.objects.annotate(
  25. count_circuits=count_related(Circuit, 'provider'),
  26. asn_count=count_related(ASN, 'providers'),
  27. account_count=count_related(ProviderAccount, 'provider'),
  28. )
  29. filterset = filtersets.ProviderFilterSet
  30. filterset_form = forms.ProviderFilterForm
  31. table = tables.ProviderTable
  32. @register_model_view(Provider)
  33. class ProviderView(GetRelatedModelsMixin, generic.ObjectView):
  34. queryset = Provider.objects.all()
  35. layout = layout.SimpleLayout(
  36. left_panels=[
  37. panels.ProviderPanel(),
  38. TagsPanel(),
  39. CommentsPanel(),
  40. ],
  41. right_panels=[
  42. RelatedObjectsPanel(),
  43. CustomFieldsPanel(),
  44. ],
  45. bottom_panels=[
  46. ObjectsTablePanel(
  47. model='circuits.ProviderAccount',
  48. filters={'provider_id': lambda ctx: ctx['object'].pk},
  49. exclude_columns=['provider'],
  50. actions=[
  51. actions.AddObject(
  52. 'circuits.ProviderAccount', url_params={'provider': lambda ctx: ctx['object'].pk}
  53. ),
  54. ],
  55. ),
  56. ObjectsTablePanel(
  57. model='circuits.Circuit',
  58. filters={'provider_id': lambda ctx: ctx['object'].pk},
  59. exclude_columns=['provider'],
  60. actions=[
  61. actions.AddObject('circuits.Circuit', url_params={'provider': lambda ctx: ctx['object'].pk}),
  62. ],
  63. ),
  64. ],
  65. )
  66. def get_extra_context(self, request, instance):
  67. return {
  68. 'related_models': self.get_related_models(
  69. request,
  70. instance,
  71. omit=(),
  72. extra=(
  73. (
  74. VirtualCircuit.objects.restrict(request.user, 'view').filter(
  75. provider_network__provider=instance
  76. ),
  77. 'provider_id',
  78. ),
  79. ),
  80. ),
  81. }
  82. @register_model_view(Provider, 'add', detail=False)
  83. @register_model_view(Provider, 'edit')
  84. class ProviderEditView(generic.ObjectEditView):
  85. queryset = Provider.objects.all()
  86. form = forms.ProviderForm
  87. @register_model_view(Provider, 'delete')
  88. class ProviderDeleteView(generic.ObjectDeleteView):
  89. queryset = Provider.objects.all()
  90. @register_model_view(Provider, 'bulk_import', path='import', detail=False)
  91. class ProviderBulkImportView(generic.BulkImportView):
  92. queryset = Provider.objects.all()
  93. model_form = forms.ProviderImportForm
  94. @register_model_view(Provider, 'bulk_edit', path='edit', detail=False)
  95. class ProviderBulkEditView(generic.BulkEditView):
  96. queryset = Provider.objects.annotate(
  97. count_circuits=count_related(Circuit, 'provider')
  98. )
  99. filterset = filtersets.ProviderFilterSet
  100. table = tables.ProviderTable
  101. form = forms.ProviderBulkEditForm
  102. @register_model_view(Provider, 'bulk_rename', path='rename', detail=False)
  103. class ProviderBulkRenameView(generic.BulkRenameView):
  104. queryset = Provider.objects.all()
  105. filterset = filtersets.ProviderFilterSet
  106. @register_model_view(Provider, 'bulk_delete', path='delete', detail=False)
  107. class ProviderBulkDeleteView(generic.BulkDeleteView):
  108. queryset = Provider.objects.annotate(
  109. count_circuits=count_related(Circuit, 'provider')
  110. )
  111. filterset = filtersets.ProviderFilterSet
  112. table = tables.ProviderTable
  113. #
  114. # ProviderAccounts
  115. #
  116. @register_model_view(ProviderAccount, 'list', path='', detail=False)
  117. class ProviderAccountListView(generic.ObjectListView):
  118. queryset = ProviderAccount.objects.annotate(
  119. count_circuits=count_related(Circuit, 'provider_account')
  120. )
  121. filterset = filtersets.ProviderAccountFilterSet
  122. filterset_form = forms.ProviderAccountFilterForm
  123. table = tables.ProviderAccountTable
  124. @register_model_view(ProviderAccount)
  125. class ProviderAccountView(GetRelatedModelsMixin, generic.ObjectView):
  126. template_name = 'generic/object.html'
  127. queryset = ProviderAccount.objects.all()
  128. layout = layout.SimpleLayout(
  129. breadcrumbs=[
  130. Breadcrumb('provider', url=filtered_list_url('circuits:provideraccount_list', 'provider_id')),
  131. ],
  132. left_panels=[
  133. panels.ProviderAccountPanel(),
  134. TagsPanel(),
  135. ],
  136. right_panels=[
  137. RelatedObjectsPanel(),
  138. CommentsPanel(),
  139. CustomFieldsPanel(),
  140. ],
  141. bottom_panels=[
  142. ObjectsTablePanel(
  143. model='circuits.Circuit',
  144. filters={'provider_account_id': lambda ctx: ctx['object'].pk},
  145. exclude_columns=['provider_account'],
  146. actions=[
  147. actions.AddObject(
  148. 'circuits.Circuit',
  149. url_params={
  150. 'provider': lambda ctx: ctx['object'].provider.pk,
  151. 'provider_account': lambda ctx: ctx['object'].pk,
  152. },
  153. ),
  154. ],
  155. ),
  156. ],
  157. )
  158. def get_extra_context(self, request, instance):
  159. return {
  160. 'related_models': self.get_related_models(request, instance),
  161. }
  162. @register_model_view(ProviderAccount, 'add', detail=False)
  163. @register_model_view(ProviderAccount, 'edit')
  164. class ProviderAccountEditView(generic.ObjectEditView):
  165. queryset = ProviderAccount.objects.all()
  166. form = forms.ProviderAccountForm
  167. @register_model_view(ProviderAccount, 'delete')
  168. class ProviderAccountDeleteView(generic.ObjectDeleteView):
  169. queryset = ProviderAccount.objects.all()
  170. @register_model_view(ProviderAccount, 'bulk_import', path='import', detail=False)
  171. class ProviderAccountBulkImportView(generic.BulkImportView):
  172. queryset = ProviderAccount.objects.all()
  173. model_form = forms.ProviderAccountImportForm
  174. table = tables.ProviderAccountTable
  175. @register_model_view(ProviderAccount, 'bulk_edit', path='edit', detail=False)
  176. class ProviderAccountBulkEditView(generic.BulkEditView):
  177. queryset = ProviderAccount.objects.annotate(
  178. count_circuits=count_related(Circuit, 'provider_account')
  179. )
  180. filterset = filtersets.ProviderAccountFilterSet
  181. table = tables.ProviderAccountTable
  182. form = forms.ProviderAccountBulkEditForm
  183. @register_model_view(ProviderAccount, 'bulk_rename', path='rename', detail=False)
  184. class ProviderAccountBulkRenameView(generic.BulkRenameView):
  185. queryset = ProviderAccount.objects.all()
  186. filterset = filtersets.ProviderAccountFilterSet
  187. @register_model_view(ProviderAccount, 'bulk_delete', path='delete', detail=False)
  188. class ProviderAccountBulkDeleteView(generic.BulkDeleteView):
  189. queryset = ProviderAccount.objects.annotate(
  190. count_circuits=count_related(Circuit, 'provider_account')
  191. )
  192. filterset = filtersets.ProviderAccountFilterSet
  193. table = tables.ProviderAccountTable
  194. #
  195. # Provider networks
  196. #
  197. @register_model_view(ProviderNetwork, 'list', path='', detail=False)
  198. class ProviderNetworkListView(generic.ObjectListView):
  199. queryset = ProviderNetwork.objects.all()
  200. filterset = filtersets.ProviderNetworkFilterSet
  201. filterset_form = forms.ProviderNetworkFilterForm
  202. table = tables.ProviderNetworkTable
  203. @register_model_view(ProviderNetwork)
  204. class ProviderNetworkView(GetRelatedModelsMixin, generic.ObjectView):
  205. template_name = 'generic/object.html'
  206. queryset = ProviderNetwork.objects.all()
  207. layout = layout.SimpleLayout(
  208. breadcrumbs=[
  209. Breadcrumb('provider', url=filtered_list_url('circuits:providernetwork_list', 'provider_id')),
  210. ],
  211. left_panels=[
  212. panels.ProviderNetworkPanel(),
  213. TagsPanel(),
  214. ],
  215. right_panels=[
  216. RelatedObjectsPanel(),
  217. CommentsPanel(),
  218. CustomFieldsPanel(),
  219. ],
  220. bottom_panels=[
  221. ObjectsTablePanel(
  222. model='circuits.Circuit',
  223. filters={'provider_network_id': lambda ctx: ctx['object'].pk},
  224. ),
  225. ObjectsTablePanel(
  226. model='circuits.VirtualCircuit',
  227. filters={'provider_network_id': lambda ctx: ctx['object'].pk},
  228. exclude_columns=['provider_network'],
  229. actions=[
  230. actions.AddObject(
  231. 'circuits.VirtualCircuit', url_params={'provider_network': lambda ctx: ctx['object'].pk}
  232. ),
  233. ],
  234. ),
  235. ],
  236. )
  237. def get_extra_context(self, request, instance):
  238. return {
  239. 'related_models': self.get_related_models(
  240. request,
  241. instance,
  242. omit=(CircuitTermination,),
  243. extra=(
  244. (
  245. Circuit.objects.restrict(request.user, 'view').filter(terminations___provider_network=instance),
  246. 'provider_network_id',
  247. ),
  248. (
  249. CircuitTermination.objects.restrict(request.user, 'view').filter(_provider_network=instance),
  250. 'provider_network_id',
  251. ),
  252. ),
  253. ),
  254. }
  255. @register_model_view(ProviderNetwork, 'add', detail=False)
  256. @register_model_view(ProviderNetwork, 'edit')
  257. class ProviderNetworkEditView(generic.ObjectEditView):
  258. queryset = ProviderNetwork.objects.all()
  259. form = forms.ProviderNetworkForm
  260. @register_model_view(ProviderNetwork, 'delete')
  261. class ProviderNetworkDeleteView(generic.ObjectDeleteView):
  262. queryset = ProviderNetwork.objects.all()
  263. @register_model_view(ProviderNetwork, 'bulk_import', path='import', detail=False)
  264. class ProviderNetworkBulkImportView(generic.BulkImportView):
  265. queryset = ProviderNetwork.objects.all()
  266. model_form = forms.ProviderNetworkImportForm
  267. @register_model_view(ProviderNetwork, 'bulk_edit', path='edit', detail=False)
  268. class ProviderNetworkBulkEditView(generic.BulkEditView):
  269. queryset = ProviderNetwork.objects.all()
  270. filterset = filtersets.ProviderNetworkFilterSet
  271. table = tables.ProviderNetworkTable
  272. form = forms.ProviderNetworkBulkEditForm
  273. @register_model_view(ProviderNetwork, 'bulk_rename', path='rename', detail=False)
  274. class ProviderNetworkBulkRenameView(generic.BulkRenameView):
  275. queryset = ProviderNetwork.objects.all()
  276. filterset = filtersets.ProviderNetworkFilterSet
  277. @register_model_view(ProviderNetwork, 'bulk_delete', path='delete', detail=False)
  278. class ProviderNetworkBulkDeleteView(generic.BulkDeleteView):
  279. queryset = ProviderNetwork.objects.all()
  280. filterset = filtersets.ProviderNetworkFilterSet
  281. table = tables.ProviderNetworkTable
  282. #
  283. # Circuit Types
  284. #
  285. @register_model_view(CircuitType, 'list', path='', detail=False)
  286. class CircuitTypeListView(generic.ObjectListView):
  287. queryset = CircuitType.objects.annotate(
  288. circuit_count=count_related(Circuit, 'type')
  289. )
  290. filterset = filtersets.CircuitTypeFilterSet
  291. filterset_form = forms.CircuitTypeFilterForm
  292. table = tables.CircuitTypeTable
  293. @register_model_view(CircuitType)
  294. class CircuitTypeView(GetRelatedModelsMixin, generic.ObjectView):
  295. queryset = CircuitType.objects.all()
  296. layout = layout.SimpleLayout(
  297. left_panels=[
  298. panels.CircuitTypePanel(),
  299. TagsPanel(),
  300. ],
  301. right_panels=[
  302. RelatedObjectsPanel(),
  303. CommentsPanel(),
  304. CustomFieldsPanel(),
  305. ],
  306. )
  307. def get_extra_context(self, request, instance):
  308. return {
  309. 'related_models': self.get_related_models(request, instance),
  310. }
  311. @register_model_view(CircuitType, 'add', detail=False)
  312. @register_model_view(CircuitType, 'edit')
  313. class CircuitTypeEditView(generic.ObjectEditView):
  314. queryset = CircuitType.objects.all()
  315. form = forms.CircuitTypeForm
  316. @register_model_view(CircuitType, 'delete')
  317. class CircuitTypeDeleteView(generic.ObjectDeleteView):
  318. queryset = CircuitType.objects.all()
  319. @register_model_view(CircuitType, 'bulk_import', path='import', detail=False)
  320. class CircuitTypeBulkImportView(generic.BulkImportView):
  321. queryset = CircuitType.objects.all()
  322. model_form = forms.CircuitTypeImportForm
  323. @register_model_view(CircuitType, 'bulk_edit', path='edit', detail=False)
  324. class CircuitTypeBulkEditView(generic.BulkEditView):
  325. queryset = CircuitType.objects.annotate(
  326. circuit_count=count_related(Circuit, 'type')
  327. )
  328. filterset = filtersets.CircuitTypeFilterSet
  329. table = tables.CircuitTypeTable
  330. form = forms.CircuitTypeBulkEditForm
  331. @register_model_view(CircuitType, 'bulk_rename', path='rename', detail=False)
  332. class CircuitTypeBulkRenameView(generic.BulkRenameView):
  333. queryset = CircuitType.objects.all()
  334. filterset = filtersets.CircuitTypeFilterSet
  335. @register_model_view(CircuitType, 'bulk_delete', path='delete', detail=False)
  336. class CircuitTypeBulkDeleteView(generic.BulkDeleteView):
  337. queryset = CircuitType.objects.annotate(
  338. circuit_count=count_related(Circuit, 'type')
  339. )
  340. filterset = filtersets.CircuitTypeFilterSet
  341. table = tables.CircuitTypeTable
  342. #
  343. # Circuits
  344. #
  345. @register_model_view(Circuit, 'list', path='', detail=False)
  346. class CircuitListView(generic.ObjectListView):
  347. queryset = Circuit.objects.prefetch_related(
  348. 'tenant__group', 'termination_a__termination', 'termination_z__termination',
  349. )
  350. filterset = filtersets.CircuitFilterSet
  351. filterset_form = forms.CircuitFilterForm
  352. table = tables.CircuitTable
  353. @register_model_view(Circuit)
  354. class CircuitView(generic.ObjectView):
  355. template_name = 'generic/object.html'
  356. queryset = Circuit.objects.all()
  357. layout = layout.SimpleLayout(
  358. breadcrumbs=[
  359. Breadcrumb('provider', url=filtered_list_url('circuits:circuit_list', 'provider_id')),
  360. ],
  361. left_panels=[
  362. panels.CircuitPanel(),
  363. panels.CircuitGroupAssignmentsPanel(),
  364. CustomFieldsPanel(),
  365. TagsPanel(),
  366. CommentsPanel(),
  367. ],
  368. right_panels=[
  369. panels.CircuitCircuitTerminationPanel(side='A'),
  370. panels.CircuitCircuitTerminationPanel(side='Z'),
  371. ImageAttachmentsPanel(),
  372. ],
  373. )
  374. @register_model_view(Circuit, 'add', detail=False)
  375. @register_model_view(Circuit, 'edit')
  376. class CircuitEditView(generic.ObjectEditView):
  377. queryset = Circuit.objects.all()
  378. form = forms.CircuitForm
  379. @register_model_view(Circuit, 'delete')
  380. class CircuitDeleteView(generic.ObjectDeleteView):
  381. queryset = Circuit.objects.all()
  382. @register_model_view(Circuit, 'bulk_import', path='import', detail=False)
  383. class CircuitBulkImportView(generic.BulkImportView):
  384. queryset = Circuit.objects.all()
  385. model_form = forms.CircuitImportForm
  386. additional_permissions = [
  387. 'circuits.add_circuittermination',
  388. ]
  389. related_object_forms = {
  390. 'terminations': forms.CircuitTerminationImportRelatedForm,
  391. }
  392. def prep_related_object_data(self, parent, data):
  393. data.update({'circuit': parent})
  394. return data
  395. @register_model_view(Circuit, 'bulk_edit', path='edit', detail=False)
  396. class CircuitBulkEditView(generic.BulkEditView):
  397. queryset = Circuit.objects.prefetch_related(
  398. 'tenant__group', 'termination_a__termination', 'termination_z__termination',
  399. )
  400. filterset = filtersets.CircuitFilterSet
  401. table = tables.CircuitTable
  402. form = forms.CircuitBulkEditForm
  403. @register_model_view(Circuit, 'bulk_rename', path='rename', detail=False)
  404. class CircuitBulkRenameView(generic.BulkRenameView):
  405. queryset = Circuit.objects.all()
  406. field_name = 'cid'
  407. filterset = filtersets.CircuitFilterSet
  408. @register_model_view(Circuit, 'bulk_delete', path='delete', detail=False)
  409. class CircuitBulkDeleteView(generic.BulkDeleteView):
  410. queryset = Circuit.objects.prefetch_related(
  411. 'tenant__group', 'termination_a__termination', 'termination_z__termination',
  412. )
  413. filterset = filtersets.CircuitFilterSet
  414. table = tables.CircuitTable
  415. #
  416. # Circuit terminations
  417. #
  418. @register_model_view(CircuitTermination, 'list', path='', detail=False)
  419. class CircuitTerminationListView(generic.ObjectListView):
  420. queryset = CircuitTermination.objects.all()
  421. filterset = filtersets.CircuitTerminationFilterSet
  422. filterset_form = forms.CircuitTerminationFilterForm
  423. table = tables.CircuitTerminationTable
  424. actions = (AddObject, BulkImport, BulkExport, BulkEdit, BulkDelete)
  425. @register_model_view(CircuitTermination)
  426. class CircuitTerminationView(generic.ObjectView):
  427. template_name = 'generic/object.html'
  428. queryset = CircuitTermination.objects.all()
  429. layout = layout.SimpleLayout(
  430. breadcrumbs=[
  431. Breadcrumb('circuit.provider', url=filtered_list_url('circuits:circuit_list', 'provider_id')),
  432. ],
  433. left_panels=[
  434. panels.CircuitTerminationPanel(),
  435. ],
  436. right_panels=[
  437. CustomFieldsPanel(),
  438. TagsPanel(),
  439. ],
  440. )
  441. @register_model_view(CircuitTermination, 'add', detail=False)
  442. @register_model_view(CircuitTermination, 'edit')
  443. class CircuitTerminationEditView(generic.ObjectEditView):
  444. queryset = CircuitTermination.objects.all()
  445. form = forms.CircuitTerminationForm
  446. @register_model_view(CircuitTermination, 'delete')
  447. class CircuitTerminationDeleteView(generic.ObjectDeleteView):
  448. queryset = CircuitTermination.objects.all()
  449. @register_model_view(CircuitTermination, 'bulk_import', path='import', detail=False)
  450. class CircuitTerminationBulkImportView(generic.BulkImportView):
  451. queryset = CircuitTermination.objects.all()
  452. model_form = forms.CircuitTerminationImportForm
  453. @register_model_view(CircuitTermination, 'bulk_edit', path='edit', detail=False)
  454. class CircuitTerminationBulkEditView(generic.BulkEditView):
  455. queryset = CircuitTermination.objects.all()
  456. filterset = filtersets.CircuitTerminationFilterSet
  457. table = tables.CircuitTerminationTable
  458. form = forms.CircuitTerminationBulkEditForm
  459. @register_model_view(CircuitTermination, 'bulk_delete', path='delete', detail=False)
  460. class CircuitTerminationBulkDeleteView(generic.BulkDeleteView):
  461. queryset = CircuitTermination.objects.all()
  462. filterset = filtersets.CircuitTerminationFilterSet
  463. table = tables.CircuitTerminationTable
  464. # Trace view
  465. register_model_view(CircuitTermination, 'trace', kwargs={'model': CircuitTermination})(PathTraceView)
  466. #
  467. # Circuit Groups
  468. #
  469. @register_model_view(CircuitGroup, 'list', path='', detail=False)
  470. class CircuitGroupListView(generic.ObjectListView):
  471. queryset = CircuitGroup.objects.annotate(
  472. circuit_group_assignment_count=count_related(CircuitGroupAssignment, 'group')
  473. )
  474. filterset = filtersets.CircuitGroupFilterSet
  475. filterset_form = forms.CircuitGroupFilterForm
  476. table = tables.CircuitGroupTable
  477. @register_model_view(CircuitGroup)
  478. class CircuitGroupView(GetRelatedModelsMixin, generic.ObjectView):
  479. queryset = CircuitGroup.objects.all()
  480. layout = layout.SimpleLayout(
  481. left_panels=[
  482. panels.CircuitGroupPanel(),
  483. TagsPanel(),
  484. ],
  485. right_panels=[
  486. RelatedObjectsPanel(),
  487. CommentsPanel(),
  488. CustomFieldsPanel(),
  489. ],
  490. )
  491. def get_extra_context(self, request, instance):
  492. return {
  493. 'related_models': self.get_related_models(request, instance),
  494. }
  495. @register_model_view(CircuitGroup, 'add', detail=False)
  496. @register_model_view(CircuitGroup, 'edit')
  497. class CircuitGroupEditView(generic.ObjectEditView):
  498. queryset = CircuitGroup.objects.all()
  499. form = forms.CircuitGroupForm
  500. @register_model_view(CircuitGroup, 'delete')
  501. class CircuitGroupDeleteView(generic.ObjectDeleteView):
  502. queryset = CircuitGroup.objects.all()
  503. @register_model_view(CircuitGroup, 'bulk_import', path='import', detail=False)
  504. class CircuitGroupBulkImportView(generic.BulkImportView):
  505. queryset = CircuitGroup.objects.all()
  506. model_form = forms.CircuitGroupImportForm
  507. @register_model_view(CircuitGroup, 'bulk_edit', path='edit', detail=False)
  508. class CircuitGroupBulkEditView(generic.BulkEditView):
  509. queryset = CircuitGroup.objects.all()
  510. filterset = filtersets.CircuitGroupFilterSet
  511. table = tables.CircuitGroupTable
  512. form = forms.CircuitGroupBulkEditForm
  513. @register_model_view(CircuitGroup, 'bulk_rename', path='rename', detail=False)
  514. class CircuitGroupBulkRenameView(generic.BulkRenameView):
  515. queryset = CircuitGroup.objects.all()
  516. filterset = filtersets.CircuitGroupFilterSet
  517. @register_model_view(CircuitGroup, 'bulk_delete', path='delete', detail=False)
  518. class CircuitGroupBulkDeleteView(generic.BulkDeleteView):
  519. queryset = CircuitGroup.objects.all()
  520. filterset = filtersets.CircuitGroupFilterSet
  521. table = tables.CircuitGroupTable
  522. #
  523. # Circuit Groups
  524. #
  525. @register_model_view(CircuitGroupAssignment, 'list', path='', detail=False)
  526. class CircuitGroupAssignmentListView(generic.ObjectListView):
  527. queryset = CircuitGroupAssignment.objects.all()
  528. filterset = filtersets.CircuitGroupAssignmentFilterSet
  529. filterset_form = forms.CircuitGroupAssignmentFilterForm
  530. table = tables.CircuitGroupAssignmentTable
  531. actions = (AddObject, BulkImport, BulkExport, BulkEdit, BulkDelete)
  532. @register_model_view(CircuitGroupAssignment)
  533. class CircuitGroupAssignmentView(generic.ObjectView):
  534. template_name = 'generic/object.html'
  535. queryset = CircuitGroupAssignment.objects.all()
  536. layout = layout.SimpleLayout(
  537. breadcrumbs=[
  538. Breadcrumb('group', url=filtered_list_url('circuits:circuitgroupassignment_list', 'group_id')),
  539. ],
  540. left_panels=[
  541. panels.CircuitGroupAssignmentPanel(),
  542. TagsPanel(),
  543. ],
  544. right_panels=[
  545. CustomFieldsPanel(),
  546. ],
  547. )
  548. @register_model_view(CircuitGroupAssignment, 'add', detail=False)
  549. @register_model_view(CircuitGroupAssignment, 'edit')
  550. class CircuitGroupAssignmentEditView(generic.ObjectEditView):
  551. queryset = CircuitGroupAssignment.objects.all()
  552. form = forms.CircuitGroupAssignmentForm
  553. @register_model_view(CircuitGroupAssignment, 'delete')
  554. class CircuitGroupAssignmentDeleteView(generic.ObjectDeleteView):
  555. queryset = CircuitGroupAssignment.objects.all()
  556. @register_model_view(CircuitGroupAssignment, 'bulk_import', path='import', detail=False)
  557. class CircuitGroupAssignmentBulkImportView(generic.BulkImportView):
  558. queryset = CircuitGroupAssignment.objects.all()
  559. model_form = forms.CircuitGroupAssignmentImportForm
  560. @register_model_view(CircuitGroupAssignment, 'bulk_edit', path='edit', detail=False)
  561. class CircuitGroupAssignmentBulkEditView(generic.BulkEditView):
  562. queryset = CircuitGroupAssignment.objects.all()
  563. filterset = filtersets.CircuitGroupAssignmentFilterSet
  564. table = tables.CircuitGroupAssignmentTable
  565. form = forms.CircuitGroupAssignmentBulkEditForm
  566. @register_model_view(CircuitGroupAssignment, 'bulk_delete', path='delete', detail=False)
  567. class CircuitGroupAssignmentBulkDeleteView(generic.BulkDeleteView):
  568. queryset = CircuitGroupAssignment.objects.all()
  569. filterset = filtersets.CircuitGroupAssignmentFilterSet
  570. table = tables.CircuitGroupAssignmentTable
  571. #
  572. # Virtual circuit Types
  573. #
  574. @register_model_view(VirtualCircuitType, 'list', path='', detail=False)
  575. class VirtualCircuitTypeListView(generic.ObjectListView):
  576. queryset = VirtualCircuitType.objects.annotate(
  577. virtual_circuit_count=count_related(VirtualCircuit, 'type')
  578. )
  579. filterset = filtersets.VirtualCircuitTypeFilterSet
  580. filterset_form = forms.VirtualCircuitTypeFilterForm
  581. table = tables.VirtualCircuitTypeTable
  582. @register_model_view(VirtualCircuitType)
  583. class VirtualCircuitTypeView(GetRelatedModelsMixin, generic.ObjectView):
  584. queryset = VirtualCircuitType.objects.all()
  585. layout = layout.SimpleLayout(
  586. left_panels=[
  587. panels.VirtualCircuitTypePanel(),
  588. TagsPanel(),
  589. ],
  590. right_panels=[
  591. RelatedObjectsPanel(),
  592. CommentsPanel(),
  593. CustomFieldsPanel(),
  594. ],
  595. )
  596. def get_extra_context(self, request, instance):
  597. return {
  598. 'related_models': self.get_related_models(request, instance),
  599. }
  600. @register_model_view(VirtualCircuitType, 'add', detail=False)
  601. @register_model_view(VirtualCircuitType, 'edit')
  602. class VirtualCircuitTypeEditView(generic.ObjectEditView):
  603. queryset = VirtualCircuitType.objects.all()
  604. form = forms.VirtualCircuitTypeForm
  605. @register_model_view(VirtualCircuitType, 'delete')
  606. class VirtualCircuitTypeDeleteView(generic.ObjectDeleteView):
  607. queryset = VirtualCircuitType.objects.all()
  608. @register_model_view(VirtualCircuitType, 'bulk_import', path='import', detail=False)
  609. class VirtualCircuitTypeBulkImportView(generic.BulkImportView):
  610. queryset = VirtualCircuitType.objects.all()
  611. model_form = forms.VirtualCircuitTypeImportForm
  612. @register_model_view(VirtualCircuitType, 'bulk_edit', path='edit', detail=False)
  613. class VirtualCircuitTypeBulkEditView(generic.BulkEditView):
  614. queryset = VirtualCircuitType.objects.annotate(
  615. circuit_count=count_related(Circuit, 'type')
  616. )
  617. filterset = filtersets.VirtualCircuitTypeFilterSet
  618. table = tables.VirtualCircuitTypeTable
  619. form = forms.VirtualCircuitTypeBulkEditForm
  620. @register_model_view(VirtualCircuitType, 'bulk_rename', path='rename', detail=False)
  621. class VirtualCircuitTypeBulkRenameView(generic.BulkRenameView):
  622. queryset = VirtualCircuitType.objects.all()
  623. filterset = filtersets.VirtualCircuitTypeFilterSet
  624. @register_model_view(VirtualCircuitType, 'bulk_delete', path='delete', detail=False)
  625. class VirtualCircuitTypeBulkDeleteView(generic.BulkDeleteView):
  626. queryset = VirtualCircuitType.objects.annotate(
  627. circuit_count=count_related(Circuit, 'type')
  628. )
  629. filterset = filtersets.VirtualCircuitTypeFilterSet
  630. table = tables.VirtualCircuitTypeTable
  631. #
  632. # Virtual circuits
  633. #
  634. @register_model_view(VirtualCircuit, 'list', path='', detail=False)
  635. class VirtualCircuitListView(generic.ObjectListView):
  636. queryset = VirtualCircuit.objects.annotate(
  637. termination_count=count_related(VirtualCircuitTermination, 'virtual_circuit')
  638. )
  639. filterset = filtersets.VirtualCircuitFilterSet
  640. filterset_form = forms.VirtualCircuitFilterForm
  641. table = tables.VirtualCircuitTable
  642. @register_model_view(VirtualCircuit)
  643. class VirtualCircuitView(generic.ObjectView):
  644. template_name = 'generic/object.html'
  645. queryset = VirtualCircuit.objects.all()
  646. layout = layout.SimpleLayout(
  647. breadcrumbs=[
  648. Breadcrumb('provider', url=filtered_list_url('circuits:virtualcircuit_list', 'provider_id')),
  649. Breadcrumb(
  650. 'provider_network',
  651. url=filtered_list_url('circuits:virtualcircuit_list', 'provider_network_id'),
  652. ),
  653. ],
  654. left_panels=[
  655. panels.VirtualCircuitPanel(),
  656. TagsPanel(),
  657. ],
  658. right_panels=[
  659. CustomFieldsPanel(),
  660. CommentsPanel(),
  661. panels.CircuitGroupAssignmentsPanel(),
  662. ],
  663. bottom_panels=[
  664. ObjectsTablePanel(
  665. model='circuits.VirtualCircuitTermination',
  666. title=_('Terminations'),
  667. filters={'virtual_circuit_id': lambda ctx: ctx['object'].pk},
  668. exclude_columns=['virtual_circuit'],
  669. actions=[
  670. actions.AddObject(
  671. 'circuits.VirtualCircuitTermination',
  672. url_params={'virtual_circuit': lambda ctx: ctx['object'].pk},
  673. ),
  674. ],
  675. ),
  676. ],
  677. )
  678. @register_model_view(VirtualCircuit, 'add', detail=False)
  679. @register_model_view(VirtualCircuit, 'edit')
  680. class VirtualCircuitEditView(generic.ObjectEditView):
  681. queryset = VirtualCircuit.objects.all()
  682. form = forms.VirtualCircuitForm
  683. @register_model_view(VirtualCircuit, 'delete')
  684. class VirtualCircuitDeleteView(generic.ObjectDeleteView):
  685. queryset = VirtualCircuit.objects.all()
  686. @register_model_view(VirtualCircuit, 'bulk_import', path='import', detail=False)
  687. class VirtualCircuitBulkImportView(generic.BulkImportView):
  688. queryset = VirtualCircuit.objects.all()
  689. model_form = forms.VirtualCircuitImportForm
  690. additional_permissions = [
  691. 'circuits.add_virtualcircuittermination',
  692. ]
  693. related_object_forms = {
  694. 'terminations': forms.VirtualCircuitTerminationImportRelatedForm,
  695. }
  696. def prep_related_object_data(self, parent, data):
  697. data.update({'virtual_circuit': parent})
  698. return data
  699. @register_model_view(VirtualCircuit, 'bulk_edit', path='edit', detail=False)
  700. class VirtualCircuitBulkEditView(generic.BulkEditView):
  701. queryset = VirtualCircuit.objects.annotate(
  702. termination_count=count_related(VirtualCircuitTermination, 'virtual_circuit')
  703. )
  704. filterset = filtersets.VirtualCircuitFilterSet
  705. table = tables.VirtualCircuitTable
  706. form = forms.VirtualCircuitBulkEditForm
  707. @register_model_view(VirtualCircuit, 'bulk_rename', path='rename', detail=False)
  708. class VirtualCircuitBulkRenameView(generic.BulkRenameView):
  709. queryset = VirtualCircuit.objects.all()
  710. field_name = 'cid'
  711. filterset = filtersets.VirtualCircuitFilterSet
  712. @register_model_view(VirtualCircuit, 'bulk_delete', path='delete', detail=False)
  713. class VirtualCircuitBulkDeleteView(generic.BulkDeleteView):
  714. queryset = VirtualCircuit.objects.annotate(
  715. termination_count=count_related(VirtualCircuitTermination, 'virtual_circuit')
  716. )
  717. filterset = filtersets.VirtualCircuitFilterSet
  718. table = tables.VirtualCircuitTable
  719. #
  720. # Virtual circuit terminations
  721. #
  722. class VirtualCircuitTerminationListView(generic.ObjectListView):
  723. queryset = VirtualCircuitTermination.objects.all()
  724. filterset = filtersets.VirtualCircuitTerminationFilterSet
  725. filterset_form = forms.VirtualCircuitTerminationFilterForm
  726. table = tables.VirtualCircuitTerminationTable
  727. actions = (AddObject, BulkImport, BulkExport, BulkEdit, BulkDelete)
  728. @register_model_view(VirtualCircuitTermination)
  729. class VirtualCircuitTerminationView(generic.ObjectView):
  730. template_name = 'generic/object.html'
  731. queryset = VirtualCircuitTermination.objects.all()
  732. layout = layout.SimpleLayout(
  733. breadcrumbs=[
  734. Breadcrumb(
  735. 'virtual_circuit.provider',
  736. url=filtered_list_url('circuits:virtualcircuit_list', 'provider_id'),
  737. ),
  738. Breadcrumb(
  739. 'virtual_circuit.provider_network',
  740. url=filtered_list_url('circuits:virtualcircuit_list', 'provider_network_id'),
  741. ),
  742. Breadcrumb(
  743. 'virtual_circuit',
  744. url=filtered_list_url('circuits:virtualcircuittermination_list', 'virtual_circuit_id'),
  745. ),
  746. ],
  747. left_panels=[
  748. panels.VirtualCircuitTerminationPanel(),
  749. TagsPanel(),
  750. CustomFieldsPanel(),
  751. ],
  752. right_panels=[
  753. panels.VirtualCircuitTerminationInterfacePanel(),
  754. ],
  755. )
  756. @register_model_view(VirtualCircuitTermination, 'edit')
  757. class VirtualCircuitTerminationEditView(generic.ObjectEditView):
  758. queryset = VirtualCircuitTermination.objects.all()
  759. form = forms.VirtualCircuitTerminationForm
  760. @register_model_view(VirtualCircuitTermination, 'delete')
  761. class VirtualCircuitTerminationDeleteView(generic.ObjectDeleteView):
  762. queryset = VirtualCircuitTermination.objects.all()
  763. class VirtualCircuitTerminationBulkImportView(generic.BulkImportView):
  764. queryset = VirtualCircuitTermination.objects.all()
  765. model_form = forms.VirtualCircuitTerminationImportForm
  766. class VirtualCircuitTerminationBulkEditView(generic.BulkEditView):
  767. queryset = VirtualCircuitTermination.objects.all()
  768. filterset = filtersets.VirtualCircuitTerminationFilterSet
  769. table = tables.VirtualCircuitTerminationTable
  770. form = forms.VirtualCircuitTerminationBulkEditForm
  771. class VirtualCircuitTerminationBulkDeleteView(generic.BulkDeleteView):
  772. queryset = VirtualCircuitTermination.objects.all()
  773. filterset = filtersets.VirtualCircuitTerminationFilterSet
  774. table = tables.VirtualCircuitTerminationTable