Coverage for vpn/views.py: 97%
399 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 18:35 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 18:35 +0000
1from django.utils.translation import gettext_lazy as _
3from extras.ui.panels import CustomFieldsPanel, TagsPanel
4from ipam.tables import RouteTargetTable
5from netbox.object_actions import AddObject, BulkDelete, BulkEdit, BulkExport, BulkImport
6from netbox.ui import actions, layout
7from netbox.ui.panels import (
8 CommentsPanel,
9 ContextTablePanel,
10 ObjectsTablePanel,
11 PluginContentPanel,
12 RelatedObjectsPanel,
13)
14from netbox.views import generic
15from utilities.query import count_related
16from utilities.views import GetRelatedModelsMixin, register_model_view
18from . import filtersets, forms, tables
19from .models import *
20from .ui import panels
22#
23# Tunnel groups
24#
27@register_model_view(TunnelGroup, 'list', path='', detail=False)
28class TunnelGroupListView(generic.ObjectListView):
29 queryset = TunnelGroup.objects.annotate(
30 tunnel_count=count_related(Tunnel, 'group')
31 )
32 filterset = filtersets.TunnelGroupFilterSet
33 filterset_form = forms.TunnelGroupFilterForm
34 table = tables.TunnelGroupTable
37@register_model_view(TunnelGroup)
38class TunnelGroupView(GetRelatedModelsMixin, generic.ObjectView):
39 queryset = TunnelGroup.objects.all()
40 layout = layout.SimpleLayout(
41 left_panels=[
42 panels.TunnelGroupPanel(),
43 TagsPanel(),
44 ],
45 right_panels=[
46 RelatedObjectsPanel(),
47 CommentsPanel(),
48 CustomFieldsPanel(),
49 ],
50 )
52 def get_extra_context(self, request, instance):
53 return {
54 'related_models': self.get_related_models(request, instance),
55 }
58@register_model_view(TunnelGroup, 'add', detail=False)
59@register_model_view(TunnelGroup, 'edit')
60class TunnelGroupEditView(generic.ObjectEditView):
61 queryset = TunnelGroup.objects.all()
62 form = forms.TunnelGroupForm
65@register_model_view(TunnelGroup, 'delete')
66class TunnelGroupDeleteView(generic.ObjectDeleteView):
67 queryset = TunnelGroup.objects.all()
70@register_model_view(TunnelGroup, 'bulk_import', path='import', detail=False)
71class TunnelGroupBulkImportView(generic.BulkImportView):
72 queryset = TunnelGroup.objects.all()
73 model_form = forms.TunnelGroupImportForm
76@register_model_view(TunnelGroup, 'bulk_edit', path='edit', detail=False)
77class TunnelGroupBulkEditView(generic.BulkEditView):
78 queryset = TunnelGroup.objects.annotate(
79 tunnel_count=count_related(Tunnel, 'group')
80 )
81 filterset = filtersets.TunnelGroupFilterSet
82 table = tables.TunnelGroupTable
83 form = forms.TunnelGroupBulkEditForm
86@register_model_view(TunnelGroup, 'bulk_rename', path='rename', detail=False)
87class TunnelGroupBulkRenameView(generic.BulkRenameView):
88 queryset = TunnelGroup.objects.all()
89 filterset = filtersets.TunnelGroupFilterSet
92@register_model_view(TunnelGroup, 'bulk_delete', path='delete', detail=False)
93class TunnelGroupBulkDeleteView(generic.BulkDeleteView):
94 queryset = TunnelGroup.objects.annotate(
95 tunnel_count=count_related(Tunnel, 'group')
96 )
97 filterset = filtersets.TunnelGroupFilterSet
98 table = tables.TunnelGroupTable
101#
102# Tunnels
103#
105@register_model_view(Tunnel, 'list', path='', detail=False)
106class TunnelListView(generic.ObjectListView):
107 queryset = Tunnel.objects.annotate(
108 count_terminations=count_related(TunnelTermination, 'tunnel')
109 )
110 filterset = filtersets.TunnelFilterSet
111 filterset_form = forms.TunnelFilterForm
112 table = tables.TunnelTable
115@register_model_view(Tunnel)
116class TunnelView(generic.ObjectView):
117 queryset = Tunnel.objects.all()
118 layout = layout.SimpleLayout(
119 left_panels=[
120 panels.TunnelPanel(),
121 ],
122 right_panels=[
123 CustomFieldsPanel(),
124 TagsPanel(),
125 CommentsPanel(),
126 ],
127 bottom_panels=[
128 ObjectsTablePanel(
129 'vpn.tunneltermination',
130 filters={'tunnel_id': lambda ctx: ctx['object'].pk},
131 exclude_columns=['tunnel'],
132 actions=[
133 actions.AddObject(
134 'vpn.tunneltermination',
135 url_params={'tunnel': lambda ctx: ctx['object'].pk},
136 label=_('Add a Termination'),
137 ),
138 ],
139 title=_('Terminations'),
140 ),
141 ],
142 )
145@register_model_view(Tunnel, 'add', detail=False)
146@register_model_view(Tunnel, 'edit')
147class TunnelEditView(generic.ObjectEditView):
148 queryset = Tunnel.objects.all()
149 form = forms.TunnelForm
151 def dispatch(self, request, *args, **kwargs):
153 # If creating a new Tunnel, use the creation form
154 if 'pk' not in kwargs:
155 self.form = forms.TunnelCreateForm
157 return super().dispatch(request, *args, **kwargs)
160@register_model_view(Tunnel, 'delete')
161class TunnelDeleteView(generic.ObjectDeleteView):
162 queryset = Tunnel.objects.all()
165@register_model_view(Tunnel, 'bulk_import', path='import', detail=False)
166class TunnelBulkImportView(generic.BulkImportView):
167 queryset = Tunnel.objects.all()
168 model_form = forms.TunnelImportForm
171@register_model_view(Tunnel, 'bulk_edit', path='edit', detail=False)
172class TunnelBulkEditView(generic.BulkEditView):
173 queryset = Tunnel.objects.annotate(
174 count_terminations=count_related(TunnelTermination, 'tunnel')
175 )
176 filterset = filtersets.TunnelFilterSet
177 table = tables.TunnelTable
178 form = forms.TunnelBulkEditForm
181@register_model_view(Tunnel, 'bulk_rename', path='rename', detail=False)
182class TunnelBulkRenameView(generic.BulkRenameView):
183 queryset = Tunnel.objects.all()
184 filterset = filtersets.TunnelFilterSet
187@register_model_view(Tunnel, 'bulk_delete', path='delete', detail=False)
188class TunnelBulkDeleteView(generic.BulkDeleteView):
189 queryset = Tunnel.objects.annotate(
190 count_terminations=count_related(TunnelTermination, 'tunnel')
191 )
192 filterset = filtersets.TunnelFilterSet
193 table = tables.TunnelTable
196#
197# Tunnel terminations
198#
200@register_model_view(TunnelTermination, 'list', path='', detail=False)
201class TunnelTerminationListView(generic.ObjectListView):
202 queryset = TunnelTermination.objects.all()
203 filterset = filtersets.TunnelTerminationFilterSet
204 filterset_form = forms.TunnelTerminationFilterForm
205 table = tables.TunnelTerminationTable
208@register_model_view(TunnelTermination)
209class TunnelTerminationView(generic.ObjectView):
210 queryset = TunnelTermination.objects.all()
211 template_name = 'generic/object.html'
212 layout = layout.SimpleLayout(
213 left_panels=[
214 panels.TunnelTerminationPanel(),
215 ],
216 right_panels=[
217 CustomFieldsPanel(),
218 TagsPanel(),
219 ],
220 bottom_panels=[
221 ObjectsTablePanel(
222 'vpn.tunneltermination',
223 filters={
224 'tunnel_id': lambda ctx: ctx['object'].tunnel.pk,
225 'id__n': lambda ctx: ctx['object'].pk,
226 },
227 exclude_columns=['tunnel'],
228 title=_('Peer Terminations'),
229 ),
230 ],
231 )
234@register_model_view(TunnelTermination, 'add', detail=False)
235@register_model_view(TunnelTermination, 'edit')
236class TunnelTerminationEditView(generic.ObjectEditView):
237 queryset = TunnelTermination.objects.all()
238 form = forms.TunnelTerminationForm
241@register_model_view(TunnelTermination, 'delete')
242class TunnelTerminationDeleteView(generic.ObjectDeleteView):
243 queryset = TunnelTermination.objects.all()
246@register_model_view(TunnelTermination, 'bulk_import', path='import', detail=False)
247class TunnelTerminationBulkImportView(generic.BulkImportView):
248 queryset = TunnelTermination.objects.all()
249 model_form = forms.TunnelTerminationImportForm
252@register_model_view(TunnelTermination, 'bulk_edit', path='edit', detail=False)
253class TunnelTerminationBulkEditView(generic.BulkEditView):
254 queryset = TunnelTermination.objects.all()
255 filterset = filtersets.TunnelTerminationFilterSet
256 table = tables.TunnelTerminationTable
257 form = forms.TunnelTerminationBulkEditForm
260@register_model_view(TunnelTermination, 'bulk_delete', path='delete', detail=False)
261class TunnelTerminationBulkDeleteView(generic.BulkDeleteView):
262 queryset = TunnelTermination.objects.all()
263 filterset = filtersets.TunnelTerminationFilterSet
264 table = tables.TunnelTerminationTable
267#
268# IKE proposals
269#
271@register_model_view(IKEProposal, 'list', path='', detail=False)
272class IKEProposalListView(generic.ObjectListView):
273 queryset = IKEProposal.objects.all()
274 filterset = filtersets.IKEProposalFilterSet
275 filterset_form = forms.IKEProposalFilterForm
276 table = tables.IKEProposalTable
279@register_model_view(IKEProposal)
280class IKEProposalView(generic.ObjectView):
281 queryset = IKEProposal.objects.all()
282 template_name = 'generic/object.html'
283 layout = layout.SimpleLayout(
284 left_panels=[
285 panels.IKEProposalPanel(),
286 ],
287 right_panels=[
288 CustomFieldsPanel(),
289 CommentsPanel(),
290 TagsPanel(),
291 ],
292 bottom_panels=[
293 ObjectsTablePanel(
294 'vpn.ikepolicy',
295 filters={'ike_proposal_id': lambda ctx: ctx['object'].pk},
296 title=_('IKE Policies'),
297 ),
298 ],
299 )
302@register_model_view(IKEProposal, 'add', detail=False)
303@register_model_view(IKEProposal, 'edit')
304class IKEProposalEditView(generic.ObjectEditView):
305 queryset = IKEProposal.objects.all()
306 form = forms.IKEProposalForm
309@register_model_view(IKEProposal, 'delete')
310class IKEProposalDeleteView(generic.ObjectDeleteView):
311 queryset = IKEProposal.objects.all()
314@register_model_view(IKEProposal, 'bulk_import', path='import', detail=False)
315class IKEProposalBulkImportView(generic.BulkImportView):
316 queryset = IKEProposal.objects.all()
317 model_form = forms.IKEProposalImportForm
320@register_model_view(IKEProposal, 'bulk_edit', path='edit', detail=False)
321class IKEProposalBulkEditView(generic.BulkEditView):
322 queryset = IKEProposal.objects.all()
323 filterset = filtersets.IKEProposalFilterSet
324 table = tables.IKEProposalTable
325 form = forms.IKEProposalBulkEditForm
328@register_model_view(IKEProposal, 'bulk_rename', path='rename', detail=False)
329class IKEProposalBulkRenameView(generic.BulkRenameView):
330 queryset = IKEProposal.objects.all()
331 filterset = filtersets.IKEProposalFilterSet
334@register_model_view(IKEProposal, 'bulk_delete', path='delete', detail=False)
335class IKEProposalBulkDeleteView(generic.BulkDeleteView):
336 queryset = IKEProposal.objects.all()
337 filterset = filtersets.IKEProposalFilterSet
338 table = tables.IKEProposalTable
341#
342# IKE policies
343#
345@register_model_view(IKEPolicy, 'list', path='', detail=False)
346class IKEPolicyListView(generic.ObjectListView):
347 queryset = IKEPolicy.objects.all()
348 filterset = filtersets.IKEPolicyFilterSet
349 filterset_form = forms.IKEPolicyFilterForm
350 table = tables.IKEPolicyTable
353@register_model_view(IKEPolicy)
354class IKEPolicyView(GetRelatedModelsMixin, generic.ObjectView):
355 queryset = IKEPolicy.objects.all()
356 template_name = 'generic/object.html'
357 layout = layout.SimpleLayout(
358 left_panels=[
359 panels.IKEPolicyPanel(),
360 ],
361 right_panels=[
362 CustomFieldsPanel(),
363 CommentsPanel(),
364 TagsPanel(),
365 RelatedObjectsPanel(),
366 ],
367 bottom_panels=[
368 ObjectsTablePanel(
369 'vpn.ikeproposal',
370 filters={'ike_policy_id': lambda ctx: ctx['object'].pk},
371 title=_('Proposals'),
372 ),
373 ],
374 )
376 def get_extra_context(self, request, instance):
377 return {
378 'related_models': self.get_related_models(request, instance),
379 }
382@register_model_view(IKEPolicy, 'add', detail=False)
383@register_model_view(IKEPolicy, 'edit')
384class IKEPolicyEditView(generic.ObjectEditView):
385 queryset = IKEPolicy.objects.all()
386 form = forms.IKEPolicyForm
389@register_model_view(IKEPolicy, 'delete')
390class IKEPolicyDeleteView(generic.ObjectDeleteView):
391 queryset = IKEPolicy.objects.all()
394@register_model_view(IKEPolicy, 'bulk_import', path='import', detail=False)
395class IKEPolicyBulkImportView(generic.BulkImportView):
396 queryset = IKEPolicy.objects.all()
397 model_form = forms.IKEPolicyImportForm
400@register_model_view(IKEPolicy, 'bulk_edit', path='edit', detail=False)
401class IKEPolicyBulkEditView(generic.BulkEditView):
402 queryset = IKEPolicy.objects.all()
403 filterset = filtersets.IKEPolicyFilterSet
404 table = tables.IKEPolicyTable
405 form = forms.IKEPolicyBulkEditForm
408@register_model_view(IKEPolicy, 'bulk_rename', path='rename', detail=False)
409class IKEPolicyBulkRenameView(generic.BulkRenameView):
410 queryset = IKEPolicy.objects.all()
411 filterset = filtersets.IKEPolicyFilterSet
414@register_model_view(IKEPolicy, 'bulk_delete', path='delete', detail=False)
415class IKEPolicyBulkDeleteView(generic.BulkDeleteView):
416 queryset = IKEPolicy.objects.all()
417 filterset = filtersets.IKEPolicyFilterSet
418 table = tables.IKEPolicyTable
421#
422# IPSec proposals
423#
425@register_model_view(IPSecProposal, 'list', path='', detail=False)
426class IPSecProposalListView(generic.ObjectListView):
427 queryset = IPSecProposal.objects.all()
428 filterset = filtersets.IPSecProposalFilterSet
429 filterset_form = forms.IPSecProposalFilterForm
430 table = tables.IPSecProposalTable
433@register_model_view(IPSecProposal)
434class IPSecProposalView(generic.ObjectView):
435 queryset = IPSecProposal.objects.all()
436 template_name = 'generic/object.html'
437 layout = layout.SimpleLayout(
438 left_panels=[
439 panels.IPSecProposalPanel(),
440 ],
441 right_panels=[
442 CustomFieldsPanel(),
443 CommentsPanel(),
444 TagsPanel(),
445 ],
446 bottom_panels=[
447 ObjectsTablePanel(
448 'vpn.ipsecpolicy',
449 filters={'ipsec_proposal_id': lambda ctx: ctx['object'].pk},
450 title=_('IPSec Policies'),
451 ),
452 ],
453 )
456@register_model_view(IPSecProposal, 'add', detail=False)
457@register_model_view(IPSecProposal, 'edit')
458class IPSecProposalEditView(generic.ObjectEditView):
459 queryset = IPSecProposal.objects.all()
460 form = forms.IPSecProposalForm
463@register_model_view(IPSecProposal, 'delete')
464class IPSecProposalDeleteView(generic.ObjectDeleteView):
465 queryset = IPSecProposal.objects.all()
468@register_model_view(IPSecProposal, 'bulk_import', path='import', detail=False)
469class IPSecProposalBulkImportView(generic.BulkImportView):
470 queryset = IPSecProposal.objects.all()
471 model_form = forms.IPSecProposalImportForm
474@register_model_view(IPSecProposal, 'bulk_edit', path='edit', detail=False)
475class IPSecProposalBulkEditView(generic.BulkEditView):
476 queryset = IPSecProposal.objects.all()
477 filterset = filtersets.IPSecProposalFilterSet
478 table = tables.IPSecProposalTable
479 form = forms.IPSecProposalBulkEditForm
482@register_model_view(IPSecProposal, 'bulk_rename', path='rename', detail=False)
483class IPSecProposalBulkRenameView(generic.BulkRenameView):
484 queryset = IPSecProposal.objects.all()
485 filterset = filtersets.IPSecProposalFilterSet
488@register_model_view(IPSecProposal, 'bulk_delete', path='delete', detail=False)
489class IPSecProposalBulkDeleteView(generic.BulkDeleteView):
490 queryset = IPSecProposal.objects.all()
491 filterset = filtersets.IPSecProposalFilterSet
492 table = tables.IPSecProposalTable
495#
496# IPSec policies
497#
499@register_model_view(IPSecPolicy, 'list', path='', detail=False)
500class IPSecPolicyListView(generic.ObjectListView):
501 queryset = IPSecPolicy.objects.all()
502 filterset = filtersets.IPSecPolicyFilterSet
503 filterset_form = forms.IPSecPolicyFilterForm
504 table = tables.IPSecPolicyTable
507@register_model_view(IPSecPolicy)
508class IPSecPolicyView(GetRelatedModelsMixin, generic.ObjectView):
509 queryset = IPSecPolicy.objects.all()
510 template_name = 'generic/object.html'
511 layout = layout.SimpleLayout(
512 left_panels=[
513 panels.IPSecPolicyPanel(),
514 ],
515 right_panels=[
516 CustomFieldsPanel(),
517 CommentsPanel(),
518 TagsPanel(),
519 RelatedObjectsPanel(),
520 ],
521 bottom_panels=[
522 ObjectsTablePanel(
523 'vpn.ipsecproposal',
524 filters={'ipsec_policy_id': lambda ctx: ctx['object'].pk},
525 title=_('Proposals'),
526 ),
527 ],
528 )
530 def get_extra_context(self, request, instance):
531 return {
532 'related_models': self.get_related_models(request, instance),
533 }
536@register_model_view(IPSecPolicy, 'add', detail=False)
537@register_model_view(IPSecPolicy, 'edit')
538class IPSecPolicyEditView(generic.ObjectEditView):
539 queryset = IPSecPolicy.objects.all()
540 form = forms.IPSecPolicyForm
543@register_model_view(IPSecPolicy, 'delete')
544class IPSecPolicyDeleteView(generic.ObjectDeleteView):
545 queryset = IPSecPolicy.objects.all()
548@register_model_view(IPSecPolicy, 'bulk_import', path='import', detail=False)
549class IPSecPolicyBulkImportView(generic.BulkImportView):
550 queryset = IPSecPolicy.objects.all()
551 model_form = forms.IPSecPolicyImportForm
554@register_model_view(IPSecPolicy, 'bulk_edit', path='edit', detail=False)
555class IPSecPolicyBulkEditView(generic.BulkEditView):
556 queryset = IPSecPolicy.objects.all()
557 filterset = filtersets.IPSecPolicyFilterSet
558 table = tables.IPSecPolicyTable
559 form = forms.IPSecPolicyBulkEditForm
562@register_model_view(IPSecPolicy, 'bulk_rename', path='rename', detail=False)
563class IPSecPolicyBulkRenameView(generic.BulkRenameView):
564 queryset = IPSecPolicy.objects.all()
565 filterset = filtersets.IPSecPolicyFilterSet
568@register_model_view(IPSecPolicy, 'bulk_delete', path='delete', detail=False)
569class IPSecPolicyBulkDeleteView(generic.BulkDeleteView):
570 queryset = IPSecPolicy.objects.all()
571 filterset = filtersets.IPSecPolicyFilterSet
572 table = tables.IPSecPolicyTable
575#
576# IPSec profiles
577#
579@register_model_view(IPSecProfile, 'list', path='', detail=False)
580class IPSecProfileListView(generic.ObjectListView):
581 queryset = IPSecProfile.objects.all()
582 filterset = filtersets.IPSecProfileFilterSet
583 filterset_form = forms.IPSecProfileFilterForm
584 table = tables.IPSecProfileTable
587@register_model_view(IPSecProfile)
588class IPSecProfileView(generic.ObjectView):
589 queryset = IPSecProfile.objects.all()
590 template_name = 'generic/object.html'
591 layout = layout.SimpleLayout(
592 left_panels=[
593 panels.IPSecProfilePanel(),
594 TagsPanel(),
595 CustomFieldsPanel(),
596 CommentsPanel(),
597 ],
598 right_panels=[
599 panels.IPSecProfileIKEPolicyPanel(),
600 panels.IPSecProfileIPSecPolicyPanel(),
601 ],
602 )
605@register_model_view(IPSecProfile, 'add', detail=False)
606@register_model_view(IPSecProfile, 'edit')
607class IPSecProfileEditView(generic.ObjectEditView):
608 queryset = IPSecProfile.objects.all()
609 form = forms.IPSecProfileForm
612@register_model_view(IPSecProfile, 'delete')
613class IPSecProfileDeleteView(generic.ObjectDeleteView):
614 queryset = IPSecProfile.objects.all()
617@register_model_view(IPSecProfile, 'bulk_import', path='import', detail=False)
618class IPSecProfileBulkImportView(generic.BulkImportView):
619 queryset = IPSecProfile.objects.all()
620 model_form = forms.IPSecProfileImportForm
623@register_model_view(IPSecProfile, 'bulk_edit', path='edit', detail=False)
624class IPSecProfileBulkEditView(generic.BulkEditView):
625 queryset = IPSecProfile.objects.all()
626 filterset = filtersets.IPSecProfileFilterSet
627 table = tables.IPSecProfileTable
628 form = forms.IPSecProfileBulkEditForm
631@register_model_view(IPSecProfile, 'bulk_rename', path='rename', detail=False)
632class IPSecProfileBulkRenameView(generic.BulkRenameView):
633 queryset = IPSecProfile.objects.all()
634 filterset = filtersets.IPSecProfileFilterSet
637@register_model_view(IPSecProfile, 'bulk_delete', path='delete', detail=False)
638class IPSecProfileBulkDeleteView(generic.BulkDeleteView):
639 queryset = IPSecProfile.objects.all()
640 filterset = filtersets.IPSecProfileFilterSet
641 table = tables.IPSecProfileTable
644#
645# L2VPN
646#
648@register_model_view(L2VPN, 'list', path='', detail=False)
649class L2VPNListView(generic.ObjectListView):
650 queryset = L2VPN.objects.all()
651 table = tables.L2VPNTable
652 filterset = filtersets.L2VPNFilterSet
653 filterset_form = forms.L2VPNFilterForm
656@register_model_view(L2VPN)
657class L2VPNView(generic.ObjectView):
658 queryset = L2VPN.objects.all()
659 template_name = 'generic/object.html'
660 layout = layout.Layout(
661 layout.Row(
662 layout.Column(
663 panels.L2VPNPanel(),
664 TagsPanel(),
665 PluginContentPanel('left_page'),
666 ),
667 layout.Column(
668 CustomFieldsPanel(),
669 CommentsPanel(),
670 PluginContentPanel('right_page'),
671 ),
672 ),
673 layout.Row(
674 layout.Column(
675 ContextTablePanel('import_targets_table', title=_('Import Route Targets')),
676 ),
677 layout.Column(
678 ContextTablePanel('export_targets_table', title=_('Export Route Targets')),
679 ),
680 ),
681 layout.Row(
682 layout.Column(
683 ObjectsTablePanel(
684 'vpn.l2vpntermination',
685 filters={'l2vpn_id': lambda ctx: ctx['object'].pk},
686 exclude_columns=['l2vpn'],
687 actions=[
688 actions.AddObject(
689 'vpn.l2vpntermination',
690 url_params={'l2vpn': lambda ctx: ctx['object'].pk},
691 label=_('Add a Termination'),
692 ),
693 ],
694 title=_('Terminations'),
695 ),
696 PluginContentPanel('full_width_page'),
697 ),
698 ),
699 )
701 def get_extra_context(self, request, instance):
702 import_targets_table = RouteTargetTable(
703 instance.import_targets.prefetch_related('tenant'),
704 orderable=False
705 )
706 import_targets_table.configure(request)
707 export_targets_table = RouteTargetTable(
708 instance.export_targets.prefetch_related('tenant'),
709 orderable=False
710 )
711 export_targets_table.configure(request)
713 return {
714 'import_targets_table': import_targets_table,
715 'export_targets_table': export_targets_table,
716 }
719@register_model_view(L2VPN, 'add', detail=False)
720@register_model_view(L2VPN, 'edit')
721class L2VPNEditView(generic.ObjectEditView):
722 queryset = L2VPN.objects.all()
723 form = forms.L2VPNForm
726@register_model_view(L2VPN, 'delete')
727class L2VPNDeleteView(generic.ObjectDeleteView):
728 queryset = L2VPN.objects.all()
731@register_model_view(L2VPN, 'bulk_import', path='import', detail=False)
732class L2VPNBulkImportView(generic.BulkImportView):
733 queryset = L2VPN.objects.all()
734 model_form = forms.L2VPNImportForm
737@register_model_view(L2VPN, 'bulk_edit', path='edit', detail=False)
738class L2VPNBulkEditView(generic.BulkEditView):
739 queryset = L2VPN.objects.all()
740 filterset = filtersets.L2VPNFilterSet
741 table = tables.L2VPNTable
742 form = forms.L2VPNBulkEditForm
745@register_model_view(L2VPN, 'bulk_rename', path='rename', detail=False)
746class L2VPNBulkRenameView(generic.BulkRenameView):
747 queryset = L2VPN.objects.all()
748 filterset = filtersets.L2VPNFilterSet
751@register_model_view(L2VPN, 'bulk_delete', path='delete', detail=False)
752class L2VPNBulkDeleteView(generic.BulkDeleteView):
753 queryset = L2VPN.objects.all()
754 filterset = filtersets.L2VPNFilterSet
755 table = tables.L2VPNTable
758#
759# L2VPN terminations
760#
762@register_model_view(L2VPNTermination, 'list', path='', detail=False)
763class L2VPNTerminationListView(generic.ObjectListView):
764 queryset = L2VPNTermination.objects.all()
765 table = tables.L2VPNTerminationTable
766 filterset = filtersets.L2VPNTerminationFilterSet
767 filterset_form = forms.L2VPNTerminationFilterForm
768 actions = (AddObject, BulkImport, BulkExport, BulkEdit, BulkDelete)
771@register_model_view(L2VPNTermination)
772class L2VPNTerminationView(generic.ObjectView):
773 queryset = L2VPNTermination.objects.all()
774 template_name = 'generic/object.html'
775 layout = layout.SimpleLayout(
776 left_panels=[
777 panels.L2VPNTerminationPanel(),
778 ],
779 right_panels=[
780 CustomFieldsPanel(),
781 TagsPanel(),
782 ],
783 )
786@register_model_view(L2VPNTermination, 'add', detail=False)
787@register_model_view(L2VPNTermination, 'edit')
788class L2VPNTerminationEditView(generic.ObjectEditView):
789 queryset = L2VPNTermination.objects.all()
790 form = forms.L2VPNTerminationForm
793@register_model_view(L2VPNTermination, 'delete')
794class L2VPNTerminationDeleteView(generic.ObjectDeleteView):
795 queryset = L2VPNTermination.objects.all()
798@register_model_view(L2VPNTermination, 'bulk_import', path='import', detail=False)
799class L2VPNTerminationBulkImportView(generic.BulkImportView):
800 queryset = L2VPNTermination.objects.all()
801 model_form = forms.L2VPNTerminationImportForm
804@register_model_view(L2VPNTermination, 'bulk_edit', path='edit', detail=False)
805class L2VPNTerminationBulkEditView(generic.BulkEditView):
806 queryset = L2VPNTermination.objects.all()
807 filterset = filtersets.L2VPNTerminationFilterSet
808 table = tables.L2VPNTerminationTable
809 form = forms.L2VPNTerminationBulkEditForm
812@register_model_view(L2VPNTermination, 'bulk_delete', path='delete', detail=False)
813class L2VPNTerminationBulkDeleteView(generic.BulkDeleteView):
814 queryset = L2VPNTermination.objects.all()
815 filterset = filtersets.L2VPNTerminationFilterSet
816 table = tables.L2VPNTerminationTable