2
0

views.py 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927
  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.panels import (
  8. CommentsPanel,
  9. ObjectsTablePanel,
  10. Panel,
  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. queryset = ProviderAccount.objects.all()
  127. layout = layout.SimpleLayout(
  128. left_panels=[
  129. panels.ProviderAccountPanel(),
  130. TagsPanel(),
  131. ],
  132. right_panels=[
  133. RelatedObjectsPanel(),
  134. CommentsPanel(),
  135. CustomFieldsPanel(),
  136. ],
  137. bottom_panels=[
  138. ObjectsTablePanel(
  139. model='circuits.Circuit',
  140. filters={'provider_account_id': lambda ctx: ctx['object'].pk},
  141. exclude_columns=['provider_account'],
  142. actions=[
  143. actions.AddObject(
  144. 'circuits.Circuit',
  145. url_params={
  146. 'provider': lambda ctx: ctx['object'].provider.pk,
  147. 'provider_account': lambda ctx: ctx['object'].pk,
  148. },
  149. ),
  150. ],
  151. ),
  152. ],
  153. )
  154. def get_extra_context(self, request, instance):
  155. return {
  156. 'related_models': self.get_related_models(request, instance),
  157. }
  158. @register_model_view(ProviderAccount, 'add', detail=False)
  159. @register_model_view(ProviderAccount, 'edit')
  160. class ProviderAccountEditView(generic.ObjectEditView):
  161. queryset = ProviderAccount.objects.all()
  162. form = forms.ProviderAccountForm
  163. @register_model_view(ProviderAccount, 'delete')
  164. class ProviderAccountDeleteView(generic.ObjectDeleteView):
  165. queryset = ProviderAccount.objects.all()
  166. @register_model_view(ProviderAccount, 'bulk_import', path='import', detail=False)
  167. class ProviderAccountBulkImportView(generic.BulkImportView):
  168. queryset = ProviderAccount.objects.all()
  169. model_form = forms.ProviderAccountImportForm
  170. table = tables.ProviderAccountTable
  171. @register_model_view(ProviderAccount, 'bulk_edit', path='edit', detail=False)
  172. class ProviderAccountBulkEditView(generic.BulkEditView):
  173. queryset = ProviderAccount.objects.annotate(
  174. count_circuits=count_related(Circuit, 'provider_account')
  175. )
  176. filterset = filtersets.ProviderAccountFilterSet
  177. table = tables.ProviderAccountTable
  178. form = forms.ProviderAccountBulkEditForm
  179. @register_model_view(ProviderAccount, 'bulk_rename', path='rename', detail=False)
  180. class ProviderAccountBulkRenameView(generic.BulkRenameView):
  181. queryset = ProviderAccount.objects.all()
  182. filterset = filtersets.ProviderAccountFilterSet
  183. @register_model_view(ProviderAccount, 'bulk_delete', path='delete', detail=False)
  184. class ProviderAccountBulkDeleteView(generic.BulkDeleteView):
  185. queryset = ProviderAccount.objects.annotate(
  186. count_circuits=count_related(Circuit, 'provider_account')
  187. )
  188. filterset = filtersets.ProviderAccountFilterSet
  189. table = tables.ProviderAccountTable
  190. #
  191. # Provider networks
  192. #
  193. @register_model_view(ProviderNetwork, 'list', path='', detail=False)
  194. class ProviderNetworkListView(generic.ObjectListView):
  195. queryset = ProviderNetwork.objects.all()
  196. filterset = filtersets.ProviderNetworkFilterSet
  197. filterset_form = forms.ProviderNetworkFilterForm
  198. table = tables.ProviderNetworkTable
  199. @register_model_view(ProviderNetwork)
  200. class ProviderNetworkView(GetRelatedModelsMixin, generic.ObjectView):
  201. queryset = ProviderNetwork.objects.all()
  202. layout = layout.SimpleLayout(
  203. left_panels=[
  204. panels.ProviderNetworkPanel(),
  205. TagsPanel(),
  206. ],
  207. right_panels=[
  208. RelatedObjectsPanel(),
  209. CommentsPanel(),
  210. CustomFieldsPanel(),
  211. ],
  212. bottom_panels=[
  213. ObjectsTablePanel(
  214. model='circuits.Circuit',
  215. filters={'provider_network_id': lambda ctx: ctx['object'].pk},
  216. ),
  217. ObjectsTablePanel(
  218. model='circuits.VirtualCircuit',
  219. filters={'provider_network_id': lambda ctx: ctx['object'].pk},
  220. exclude_columns=['provider_network'],
  221. actions=[
  222. actions.AddObject(
  223. 'circuits.VirtualCircuit', url_params={'provider_network': lambda ctx: ctx['object'].pk}
  224. ),
  225. ],
  226. ),
  227. ],
  228. )
  229. def get_extra_context(self, request, instance):
  230. return {
  231. 'related_models': self.get_related_models(
  232. request,
  233. instance,
  234. omit=(CircuitTermination,),
  235. extra=(
  236. (
  237. Circuit.objects.restrict(request.user, 'view').filter(terminations___provider_network=instance),
  238. 'provider_network_id',
  239. ),
  240. (
  241. CircuitTermination.objects.restrict(request.user, 'view').filter(_provider_network=instance),
  242. 'provider_network_id',
  243. ),
  244. ),
  245. ),
  246. }
  247. @register_model_view(ProviderNetwork, 'add', detail=False)
  248. @register_model_view(ProviderNetwork, 'edit')
  249. class ProviderNetworkEditView(generic.ObjectEditView):
  250. queryset = ProviderNetwork.objects.all()
  251. form = forms.ProviderNetworkForm
  252. @register_model_view(ProviderNetwork, 'delete')
  253. class ProviderNetworkDeleteView(generic.ObjectDeleteView):
  254. queryset = ProviderNetwork.objects.all()
  255. @register_model_view(ProviderNetwork, 'bulk_import', path='import', detail=False)
  256. class ProviderNetworkBulkImportView(generic.BulkImportView):
  257. queryset = ProviderNetwork.objects.all()
  258. model_form = forms.ProviderNetworkImportForm
  259. @register_model_view(ProviderNetwork, 'bulk_edit', path='edit', detail=False)
  260. class ProviderNetworkBulkEditView(generic.BulkEditView):
  261. queryset = ProviderNetwork.objects.all()
  262. filterset = filtersets.ProviderNetworkFilterSet
  263. table = tables.ProviderNetworkTable
  264. form = forms.ProviderNetworkBulkEditForm
  265. @register_model_view(ProviderNetwork, 'bulk_rename', path='rename', detail=False)
  266. class ProviderNetworkBulkRenameView(generic.BulkRenameView):
  267. queryset = ProviderNetwork.objects.all()
  268. filterset = filtersets.ProviderNetworkFilterSet
  269. @register_model_view(ProviderNetwork, 'bulk_delete', path='delete', detail=False)
  270. class ProviderNetworkBulkDeleteView(generic.BulkDeleteView):
  271. queryset = ProviderNetwork.objects.all()
  272. filterset = filtersets.ProviderNetworkFilterSet
  273. table = tables.ProviderNetworkTable
  274. #
  275. # Circuit Types
  276. #
  277. @register_model_view(CircuitType, 'list', path='', detail=False)
  278. class CircuitTypeListView(generic.ObjectListView):
  279. queryset = CircuitType.objects.annotate(
  280. circuit_count=count_related(Circuit, 'type')
  281. )
  282. filterset = filtersets.CircuitTypeFilterSet
  283. filterset_form = forms.CircuitTypeFilterForm
  284. table = tables.CircuitTypeTable
  285. @register_model_view(CircuitType)
  286. class CircuitTypeView(GetRelatedModelsMixin, generic.ObjectView):
  287. queryset = CircuitType.objects.all()
  288. layout = layout.SimpleLayout(
  289. left_panels=[
  290. panels.CircuitTypePanel(),
  291. TagsPanel(),
  292. ],
  293. right_panels=[
  294. RelatedObjectsPanel(),
  295. CommentsPanel(),
  296. CustomFieldsPanel(),
  297. ],
  298. )
  299. def get_extra_context(self, request, instance):
  300. return {
  301. 'related_models': self.get_related_models(request, instance),
  302. }
  303. @register_model_view(CircuitType, 'add', detail=False)
  304. @register_model_view(CircuitType, 'edit')
  305. class CircuitTypeEditView(generic.ObjectEditView):
  306. queryset = CircuitType.objects.all()
  307. form = forms.CircuitTypeForm
  308. @register_model_view(CircuitType, 'delete')
  309. class CircuitTypeDeleteView(generic.ObjectDeleteView):
  310. queryset = CircuitType.objects.all()
  311. @register_model_view(CircuitType, 'bulk_import', path='import', detail=False)
  312. class CircuitTypeBulkImportView(generic.BulkImportView):
  313. queryset = CircuitType.objects.all()
  314. model_form = forms.CircuitTypeImportForm
  315. @register_model_view(CircuitType, 'bulk_edit', path='edit', detail=False)
  316. class CircuitTypeBulkEditView(generic.BulkEditView):
  317. queryset = CircuitType.objects.annotate(
  318. circuit_count=count_related(Circuit, 'type')
  319. )
  320. filterset = filtersets.CircuitTypeFilterSet
  321. table = tables.CircuitTypeTable
  322. form = forms.CircuitTypeBulkEditForm
  323. @register_model_view(CircuitType, 'bulk_rename', path='rename', detail=False)
  324. class CircuitTypeBulkRenameView(generic.BulkRenameView):
  325. queryset = CircuitType.objects.all()
  326. filterset = filtersets.CircuitTypeFilterSet
  327. @register_model_view(CircuitType, 'bulk_delete', path='delete', detail=False)
  328. class CircuitTypeBulkDeleteView(generic.BulkDeleteView):
  329. queryset = CircuitType.objects.annotate(
  330. circuit_count=count_related(Circuit, 'type')
  331. )
  332. filterset = filtersets.CircuitTypeFilterSet
  333. table = tables.CircuitTypeTable
  334. #
  335. # Circuits
  336. #
  337. @register_model_view(Circuit, 'list', path='', detail=False)
  338. class CircuitListView(generic.ObjectListView):
  339. queryset = Circuit.objects.prefetch_related(
  340. 'tenant__group', 'termination_a__termination', 'termination_z__termination',
  341. )
  342. filterset = filtersets.CircuitFilterSet
  343. filterset_form = forms.CircuitFilterForm
  344. table = tables.CircuitTable
  345. @register_model_view(Circuit)
  346. class CircuitView(generic.ObjectView):
  347. queryset = Circuit.objects.all()
  348. layout = layout.SimpleLayout(
  349. left_panels=[
  350. panels.CircuitPanel(),
  351. panels.CircuitGroupAssignmentsPanel(),
  352. CustomFieldsPanel(),
  353. TagsPanel(),
  354. CommentsPanel(),
  355. ],
  356. right_panels=[
  357. panels.CircuitCircuitTerminationPanel(side='A'),
  358. panels.CircuitCircuitTerminationPanel(side='Z'),
  359. ImageAttachmentsPanel(),
  360. ],
  361. )
  362. @register_model_view(Circuit, 'add', detail=False)
  363. @register_model_view(Circuit, 'edit')
  364. class CircuitEditView(generic.ObjectEditView):
  365. queryset = Circuit.objects.all()
  366. form = forms.CircuitForm
  367. @register_model_view(Circuit, 'delete')
  368. class CircuitDeleteView(generic.ObjectDeleteView):
  369. queryset = Circuit.objects.all()
  370. @register_model_view(Circuit, 'bulk_import', path='import', detail=False)
  371. class CircuitBulkImportView(generic.BulkImportView):
  372. queryset = Circuit.objects.all()
  373. model_form = forms.CircuitImportForm
  374. additional_permissions = [
  375. 'circuits.add_circuittermination',
  376. ]
  377. related_object_forms = {
  378. 'terminations': forms.CircuitTerminationImportRelatedForm,
  379. }
  380. def prep_related_object_data(self, parent, data):
  381. data.update({'circuit': parent})
  382. return data
  383. @register_model_view(Circuit, 'bulk_edit', path='edit', detail=False)
  384. class CircuitBulkEditView(generic.BulkEditView):
  385. queryset = Circuit.objects.prefetch_related(
  386. 'tenant__group', 'termination_a__termination', 'termination_z__termination',
  387. )
  388. filterset = filtersets.CircuitFilterSet
  389. table = tables.CircuitTable
  390. form = forms.CircuitBulkEditForm
  391. @register_model_view(Circuit, 'bulk_rename', path='rename', detail=False)
  392. class CircuitBulkRenameView(generic.BulkRenameView):
  393. queryset = Circuit.objects.all()
  394. field_name = 'cid'
  395. filterset = filtersets.CircuitFilterSet
  396. @register_model_view(Circuit, 'bulk_delete', path='delete', detail=False)
  397. class CircuitBulkDeleteView(generic.BulkDeleteView):
  398. queryset = Circuit.objects.prefetch_related(
  399. 'tenant__group', 'termination_a__termination', 'termination_z__termination',
  400. )
  401. filterset = filtersets.CircuitFilterSet
  402. table = tables.CircuitTable
  403. #
  404. # Circuit terminations
  405. #
  406. @register_model_view(CircuitTermination, 'list', path='', detail=False)
  407. class CircuitTerminationListView(generic.ObjectListView):
  408. queryset = CircuitTermination.objects.all()
  409. filterset = filtersets.CircuitTerminationFilterSet
  410. filterset_form = forms.CircuitTerminationFilterForm
  411. table = tables.CircuitTerminationTable
  412. actions = (AddObject, BulkImport, BulkExport, BulkEdit, BulkDelete)
  413. @register_model_view(CircuitTermination)
  414. class CircuitTerminationView(generic.ObjectView):
  415. queryset = CircuitTermination.objects.all()
  416. layout = layout.SimpleLayout(
  417. left_panels=[
  418. Panel(
  419. template_name='circuits/panels/circuit_termination.html',
  420. title=_('Circuit Termination'),
  421. )
  422. ],
  423. right_panels=[
  424. CustomFieldsPanel(),
  425. TagsPanel(),
  426. ],
  427. )
  428. @register_model_view(CircuitTermination, 'add', detail=False)
  429. @register_model_view(CircuitTermination, 'edit')
  430. class CircuitTerminationEditView(generic.ObjectEditView):
  431. queryset = CircuitTermination.objects.all()
  432. form = forms.CircuitTerminationForm
  433. @register_model_view(CircuitTermination, 'delete')
  434. class CircuitTerminationDeleteView(generic.ObjectDeleteView):
  435. queryset = CircuitTermination.objects.all()
  436. @register_model_view(CircuitTermination, 'bulk_import', path='import', detail=False)
  437. class CircuitTerminationBulkImportView(generic.BulkImportView):
  438. queryset = CircuitTermination.objects.all()
  439. model_form = forms.CircuitTerminationImportForm
  440. @register_model_view(CircuitTermination, 'bulk_edit', path='edit', detail=False)
  441. class CircuitTerminationBulkEditView(generic.BulkEditView):
  442. queryset = CircuitTermination.objects.all()
  443. filterset = filtersets.CircuitTerminationFilterSet
  444. table = tables.CircuitTerminationTable
  445. form = forms.CircuitTerminationBulkEditForm
  446. @register_model_view(CircuitTermination, 'bulk_delete', path='delete', detail=False)
  447. class CircuitTerminationBulkDeleteView(generic.BulkDeleteView):
  448. queryset = CircuitTermination.objects.all()
  449. filterset = filtersets.CircuitTerminationFilterSet
  450. table = tables.CircuitTerminationTable
  451. # Trace view
  452. register_model_view(CircuitTermination, 'trace', kwargs={'model': CircuitTermination})(PathTraceView)
  453. #
  454. # Circuit Groups
  455. #
  456. @register_model_view(CircuitGroup, 'list', path='', detail=False)
  457. class CircuitGroupListView(generic.ObjectListView):
  458. queryset = CircuitGroup.objects.annotate(
  459. circuit_group_assignment_count=count_related(CircuitGroupAssignment, 'group')
  460. )
  461. filterset = filtersets.CircuitGroupFilterSet
  462. filterset_form = forms.CircuitGroupFilterForm
  463. table = tables.CircuitGroupTable
  464. @register_model_view(CircuitGroup)
  465. class CircuitGroupView(GetRelatedModelsMixin, generic.ObjectView):
  466. queryset = CircuitGroup.objects.all()
  467. layout = layout.SimpleLayout(
  468. left_panels=[
  469. panels.CircuitGroupPanel(),
  470. TagsPanel(),
  471. ],
  472. right_panels=[
  473. RelatedObjectsPanel(),
  474. CommentsPanel(),
  475. CustomFieldsPanel(),
  476. ],
  477. )
  478. def get_extra_context(self, request, instance):
  479. return {
  480. 'related_models': self.get_related_models(request, instance),
  481. }
  482. @register_model_view(CircuitGroup, 'add', detail=False)
  483. @register_model_view(CircuitGroup, 'edit')
  484. class CircuitGroupEditView(generic.ObjectEditView):
  485. queryset = CircuitGroup.objects.all()
  486. form = forms.CircuitGroupForm
  487. @register_model_view(CircuitGroup, 'delete')
  488. class CircuitGroupDeleteView(generic.ObjectDeleteView):
  489. queryset = CircuitGroup.objects.all()
  490. @register_model_view(CircuitGroup, 'bulk_import', path='import', detail=False)
  491. class CircuitGroupBulkImportView(generic.BulkImportView):
  492. queryset = CircuitGroup.objects.all()
  493. model_form = forms.CircuitGroupImportForm
  494. @register_model_view(CircuitGroup, 'bulk_edit', path='edit', detail=False)
  495. class CircuitGroupBulkEditView(generic.BulkEditView):
  496. queryset = CircuitGroup.objects.all()
  497. filterset = filtersets.CircuitGroupFilterSet
  498. table = tables.CircuitGroupTable
  499. form = forms.CircuitGroupBulkEditForm
  500. @register_model_view(CircuitGroup, 'bulk_rename', path='rename', detail=False)
  501. class CircuitGroupBulkRenameView(generic.BulkRenameView):
  502. queryset = CircuitGroup.objects.all()
  503. filterset = filtersets.CircuitGroupFilterSet
  504. @register_model_view(CircuitGroup, 'bulk_delete', path='delete', detail=False)
  505. class CircuitGroupBulkDeleteView(generic.BulkDeleteView):
  506. queryset = CircuitGroup.objects.all()
  507. filterset = filtersets.CircuitGroupFilterSet
  508. table = tables.CircuitGroupTable
  509. #
  510. # Circuit Groups
  511. #
  512. @register_model_view(CircuitGroupAssignment, 'list', path='', detail=False)
  513. class CircuitGroupAssignmentListView(generic.ObjectListView):
  514. queryset = CircuitGroupAssignment.objects.all()
  515. filterset = filtersets.CircuitGroupAssignmentFilterSet
  516. filterset_form = forms.CircuitGroupAssignmentFilterForm
  517. table = tables.CircuitGroupAssignmentTable
  518. actions = (AddObject, BulkImport, BulkExport, BulkEdit, BulkDelete)
  519. @register_model_view(CircuitGroupAssignment)
  520. class CircuitGroupAssignmentView(generic.ObjectView):
  521. queryset = CircuitGroupAssignment.objects.all()
  522. layout = layout.SimpleLayout(
  523. left_panels=[
  524. panels.CircuitGroupAssignmentPanel(),
  525. TagsPanel(),
  526. ],
  527. right_panels=[
  528. CustomFieldsPanel(),
  529. ],
  530. )
  531. @register_model_view(CircuitGroupAssignment, 'add', detail=False)
  532. @register_model_view(CircuitGroupAssignment, 'edit')
  533. class CircuitGroupAssignmentEditView(generic.ObjectEditView):
  534. queryset = CircuitGroupAssignment.objects.all()
  535. form = forms.CircuitGroupAssignmentForm
  536. @register_model_view(CircuitGroupAssignment, 'delete')
  537. class CircuitGroupAssignmentDeleteView(generic.ObjectDeleteView):
  538. queryset = CircuitGroupAssignment.objects.all()
  539. @register_model_view(CircuitGroupAssignment, 'bulk_import', path='import', detail=False)
  540. class CircuitGroupAssignmentBulkImportView(generic.BulkImportView):
  541. queryset = CircuitGroupAssignment.objects.all()
  542. model_form = forms.CircuitGroupAssignmentImportForm
  543. @register_model_view(CircuitGroupAssignment, 'bulk_edit', path='edit', detail=False)
  544. class CircuitGroupAssignmentBulkEditView(generic.BulkEditView):
  545. queryset = CircuitGroupAssignment.objects.all()
  546. filterset = filtersets.CircuitGroupAssignmentFilterSet
  547. table = tables.CircuitGroupAssignmentTable
  548. form = forms.CircuitGroupAssignmentBulkEditForm
  549. @register_model_view(CircuitGroupAssignment, 'bulk_delete', path='delete', detail=False)
  550. class CircuitGroupAssignmentBulkDeleteView(generic.BulkDeleteView):
  551. queryset = CircuitGroupAssignment.objects.all()
  552. filterset = filtersets.CircuitGroupAssignmentFilterSet
  553. table = tables.CircuitGroupAssignmentTable
  554. #
  555. # Virtual circuit Types
  556. #
  557. @register_model_view(VirtualCircuitType, 'list', path='', detail=False)
  558. class VirtualCircuitTypeListView(generic.ObjectListView):
  559. queryset = VirtualCircuitType.objects.annotate(
  560. virtual_circuit_count=count_related(VirtualCircuit, 'type')
  561. )
  562. filterset = filtersets.VirtualCircuitTypeFilterSet
  563. filterset_form = forms.VirtualCircuitTypeFilterForm
  564. table = tables.VirtualCircuitTypeTable
  565. @register_model_view(VirtualCircuitType)
  566. class VirtualCircuitTypeView(GetRelatedModelsMixin, generic.ObjectView):
  567. queryset = VirtualCircuitType.objects.all()
  568. layout = layout.SimpleLayout(
  569. left_panels=[
  570. panels.VirtualCircuitTypePanel(),
  571. TagsPanel(),
  572. ],
  573. right_panels=[
  574. RelatedObjectsPanel(),
  575. CommentsPanel(),
  576. CustomFieldsPanel(),
  577. ],
  578. )
  579. def get_extra_context(self, request, instance):
  580. return {
  581. 'related_models': self.get_related_models(request, instance),
  582. }
  583. @register_model_view(VirtualCircuitType, 'add', detail=False)
  584. @register_model_view(VirtualCircuitType, 'edit')
  585. class VirtualCircuitTypeEditView(generic.ObjectEditView):
  586. queryset = VirtualCircuitType.objects.all()
  587. form = forms.VirtualCircuitTypeForm
  588. @register_model_view(VirtualCircuitType, 'delete')
  589. class VirtualCircuitTypeDeleteView(generic.ObjectDeleteView):
  590. queryset = VirtualCircuitType.objects.all()
  591. @register_model_view(VirtualCircuitType, 'bulk_import', path='import', detail=False)
  592. class VirtualCircuitTypeBulkImportView(generic.BulkImportView):
  593. queryset = VirtualCircuitType.objects.all()
  594. model_form = forms.VirtualCircuitTypeImportForm
  595. @register_model_view(VirtualCircuitType, 'bulk_edit', path='edit', detail=False)
  596. class VirtualCircuitTypeBulkEditView(generic.BulkEditView):
  597. queryset = VirtualCircuitType.objects.annotate(
  598. circuit_count=count_related(Circuit, 'type')
  599. )
  600. filterset = filtersets.VirtualCircuitTypeFilterSet
  601. table = tables.VirtualCircuitTypeTable
  602. form = forms.VirtualCircuitTypeBulkEditForm
  603. @register_model_view(VirtualCircuitType, 'bulk_rename', path='rename', detail=False)
  604. class VirtualCircuitTypeBulkRenameView(generic.BulkRenameView):
  605. queryset = VirtualCircuitType.objects.all()
  606. filterset = filtersets.VirtualCircuitTypeFilterSet
  607. @register_model_view(VirtualCircuitType, 'bulk_delete', path='delete', detail=False)
  608. class VirtualCircuitTypeBulkDeleteView(generic.BulkDeleteView):
  609. queryset = VirtualCircuitType.objects.annotate(
  610. circuit_count=count_related(Circuit, 'type')
  611. )
  612. filterset = filtersets.VirtualCircuitTypeFilterSet
  613. table = tables.VirtualCircuitTypeTable
  614. #
  615. # Virtual circuits
  616. #
  617. @register_model_view(VirtualCircuit, 'list', path='', detail=False)
  618. class VirtualCircuitListView(generic.ObjectListView):
  619. queryset = VirtualCircuit.objects.annotate(
  620. termination_count=count_related(VirtualCircuitTermination, 'virtual_circuit')
  621. )
  622. filterset = filtersets.VirtualCircuitFilterSet
  623. filterset_form = forms.VirtualCircuitFilterForm
  624. table = tables.VirtualCircuitTable
  625. @register_model_view(VirtualCircuit)
  626. class VirtualCircuitView(generic.ObjectView):
  627. queryset = VirtualCircuit.objects.all()
  628. layout = layout.SimpleLayout(
  629. left_panels=[
  630. panels.VirtualCircuitPanel(),
  631. TagsPanel(),
  632. ],
  633. right_panels=[
  634. CustomFieldsPanel(),
  635. CommentsPanel(),
  636. panels.CircuitGroupAssignmentsPanel(),
  637. ],
  638. bottom_panels=[
  639. ObjectsTablePanel(
  640. model='circuits.VirtualCircuitTermination',
  641. title=_('Terminations'),
  642. filters={'virtual_circuit_id': lambda ctx: ctx['object'].pk},
  643. exclude_columns=['virtual_circuit'],
  644. actions=[
  645. actions.AddObject(
  646. 'circuits.VirtualCircuitTermination',
  647. url_params={'virtual_circuit': lambda ctx: ctx['object'].pk},
  648. ),
  649. ],
  650. ),
  651. ],
  652. )
  653. @register_model_view(VirtualCircuit, 'add', detail=False)
  654. @register_model_view(VirtualCircuit, 'edit')
  655. class VirtualCircuitEditView(generic.ObjectEditView):
  656. queryset = VirtualCircuit.objects.all()
  657. form = forms.VirtualCircuitForm
  658. @register_model_view(VirtualCircuit, 'delete')
  659. class VirtualCircuitDeleteView(generic.ObjectDeleteView):
  660. queryset = VirtualCircuit.objects.all()
  661. @register_model_view(VirtualCircuit, 'bulk_import', path='import', detail=False)
  662. class VirtualCircuitBulkImportView(generic.BulkImportView):
  663. queryset = VirtualCircuit.objects.all()
  664. model_form = forms.VirtualCircuitImportForm
  665. additional_permissions = [
  666. 'circuits.add_virtualcircuittermination',
  667. ]
  668. related_object_forms = {
  669. 'terminations': forms.VirtualCircuitTerminationImportRelatedForm,
  670. }
  671. def prep_related_object_data(self, parent, data):
  672. data.update({'virtual_circuit': parent})
  673. return data
  674. @register_model_view(VirtualCircuit, 'bulk_edit', path='edit', detail=False)
  675. class VirtualCircuitBulkEditView(generic.BulkEditView):
  676. queryset = VirtualCircuit.objects.annotate(
  677. termination_count=count_related(VirtualCircuitTermination, 'virtual_circuit')
  678. )
  679. filterset = filtersets.VirtualCircuitFilterSet
  680. table = tables.VirtualCircuitTable
  681. form = forms.VirtualCircuitBulkEditForm
  682. @register_model_view(VirtualCircuit, 'bulk_rename', path='rename', detail=False)
  683. class VirtualCircuitBulkRenameView(generic.BulkRenameView):
  684. queryset = VirtualCircuit.objects.all()
  685. field_name = 'cid'
  686. filterset = filtersets.VirtualCircuitFilterSet
  687. @register_model_view(VirtualCircuit, 'bulk_delete', path='delete', detail=False)
  688. class VirtualCircuitBulkDeleteView(generic.BulkDeleteView):
  689. queryset = VirtualCircuit.objects.annotate(
  690. termination_count=count_related(VirtualCircuitTermination, 'virtual_circuit')
  691. )
  692. filterset = filtersets.VirtualCircuitFilterSet
  693. table = tables.VirtualCircuitTable
  694. #
  695. # Virtual circuit terminations
  696. #
  697. class VirtualCircuitTerminationListView(generic.ObjectListView):
  698. queryset = VirtualCircuitTermination.objects.all()
  699. filterset = filtersets.VirtualCircuitTerminationFilterSet
  700. filterset_form = forms.VirtualCircuitTerminationFilterForm
  701. table = tables.VirtualCircuitTerminationTable
  702. actions = (AddObject, BulkImport, BulkExport, BulkEdit, BulkDelete)
  703. @register_model_view(VirtualCircuitTermination)
  704. class VirtualCircuitTerminationView(generic.ObjectView):
  705. queryset = VirtualCircuitTermination.objects.all()
  706. layout = layout.SimpleLayout(
  707. left_panels=[
  708. panels.VirtualCircuitTerminationPanel(),
  709. TagsPanel(),
  710. CustomFieldsPanel(),
  711. ],
  712. right_panels=[
  713. panels.VirtualCircuitTerminationInterfacePanel(),
  714. ],
  715. )
  716. @register_model_view(VirtualCircuitTermination, 'edit')
  717. class VirtualCircuitTerminationEditView(generic.ObjectEditView):
  718. queryset = VirtualCircuitTermination.objects.all()
  719. form = forms.VirtualCircuitTerminationForm
  720. @register_model_view(VirtualCircuitTermination, 'delete')
  721. class VirtualCircuitTerminationDeleteView(generic.ObjectDeleteView):
  722. queryset = VirtualCircuitTermination.objects.all()
  723. class VirtualCircuitTerminationBulkImportView(generic.BulkImportView):
  724. queryset = VirtualCircuitTermination.objects.all()
  725. model_form = forms.VirtualCircuitTerminationImportForm
  726. class VirtualCircuitTerminationBulkEditView(generic.BulkEditView):
  727. queryset = VirtualCircuitTermination.objects.all()
  728. filterset = filtersets.VirtualCircuitTerminationFilterSet
  729. table = tables.VirtualCircuitTerminationTable
  730. form = forms.VirtualCircuitTerminationBulkEditForm
  731. class VirtualCircuitTerminationBulkDeleteView(generic.BulkDeleteView):
  732. queryset = VirtualCircuitTermination.objects.all()
  733. filterset = filtersets.VirtualCircuitTerminationFilterSet
  734. table = tables.VirtualCircuitTerminationTable