1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00
Files
netbox-community-netbox/netbox/ipam/views.py

1353 lines
40 KiB
Python
Raw Normal View History

2021-11-01 16:14:44 -04:00
from django.contrib.contenttypes.models import ContentType
from django.db.models import Prefetch
from django.db.models.expressions import RawSQL
from django.shortcuts import get_object_or_404, redirect, render
from django.urls import reverse
from django.utils.translation import gettext as _
2016-03-01 11:23:03 -05:00
from circuits.models import Provider
from dcim.filtersets import InterfaceFilterSet
from dcim.models import Interface, Site
2020-11-11 16:07:38 -05:00
from netbox.views import generic
from tenancy.views import ObjectContactsView
from utilities.utils import count_related
from utilities.views import ViewTab, register_model_view
from virtualization.filtersets import VMInterfaceFilterSet
from virtualization.models import VMInterface
2021-04-29 16:38:56 -04:00
from . import filtersets, forms, tables
from .choices import PrefixStatusChoices
from .constants import *
2021-07-16 09:15:19 -04:00
from .models import *
2022-06-27 23:24:50 -05:00
from .tables.l2vpn import L2VPNTable, L2VPNTerminationTable
from .utils import add_requested_prefixes, add_available_ipaddresses, add_available_vlans
2016-03-01 11:23:03 -05:00
#
# VRFs
#
2020-11-11 16:07:38 -05:00
class VRFListView(generic.ObjectListView):
queryset = VRF.objects.all()
2021-04-29 16:38:56 -04:00
filterset = filtersets.VRFFilterSet
filterset_form = forms.VRFFilterForm
2016-05-18 16:20:30 -04:00
table = tables.VRFTable
2016-03-01 11:23:03 -05:00
@register_model_view(VRF)
2020-11-11 16:07:38 -05:00
class VRFView(generic.ObjectView):
queryset = VRF.objects.all()
2016-03-01 11:23:03 -05:00
def get_extra_context(self, request, instance):
related_models = (
(Prefix.objects.restrict(request.user, 'view').filter(vrf=instance), 'vrf_id'),
(IPAddress.objects.restrict(request.user, 'view').filter(vrf=instance), 'vrf_id'),
)
import_targets_table = tables.RouteTargetTable(
instance.import_targets.all(),
orderable=False
)
export_targets_table = tables.RouteTargetTable(
instance.export_targets.all(),
orderable=False
)
return {
'related_models': related_models,
'import_targets_table': import_targets_table,
'export_targets_table': export_targets_table,
}
2016-03-01 11:23:03 -05:00
@register_model_view(VRF, 'edit')
2020-11-11 16:07:38 -05:00
class VRFEditView(generic.ObjectEditView):
queryset = VRF.objects.all()
form = forms.VRFForm
2016-03-01 11:23:03 -05:00
@register_model_view(VRF, 'delete')
2020-11-11 16:07:38 -05:00
class VRFDeleteView(generic.ObjectDeleteView):
queryset = VRF.objects.all()
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class VRFBulkImportView(generic.BulkImportView):
2020-05-21 11:58:27 -04:00
queryset = VRF.objects.all()
model_form = forms.VRFImportForm
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class VRFBulkEditView(generic.BulkEditView):
queryset = VRF.objects.all()
2021-04-29 16:38:56 -04:00
filterset = filtersets.VRFFilterSet
table = tables.VRFTable
2016-05-18 16:20:30 -04:00
form = forms.VRFBulkEditForm
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class VRFBulkDeleteView(generic.BulkDeleteView):
queryset = VRF.objects.all()
2021-04-29 16:38:56 -04:00
filterset = filtersets.VRFFilterSet
table = tables.VRFTable
2016-03-01 11:23:03 -05:00
2020-09-24 11:25:52 -04:00
#
# Route targets
#
2020-11-11 16:07:38 -05:00
class RouteTargetListView(generic.ObjectListView):
queryset = RouteTarget.objects.all()
2021-04-29 16:38:56 -04:00
filterset = filtersets.RouteTargetFilterSet
2020-09-24 11:25:52 -04:00
filterset_form = forms.RouteTargetFilterForm
table = tables.RouteTargetTable
@register_model_view(RouteTarget)
2020-11-11 16:07:38 -05:00
class RouteTargetView(generic.ObjectView):
2020-09-24 11:25:52 -04:00
queryset = RouteTarget.objects.all()
@register_model_view(RouteTarget, 'edit')
2020-11-11 16:07:38 -05:00
class RouteTargetEditView(generic.ObjectEditView):
2020-09-24 11:25:52 -04:00
queryset = RouteTarget.objects.all()
form = forms.RouteTargetForm
2020-09-24 11:25:52 -04:00
@register_model_view(RouteTarget, 'delete')
2020-11-11 16:07:38 -05:00
class RouteTargetDeleteView(generic.ObjectDeleteView):
2020-09-24 11:25:52 -04:00
queryset = RouteTarget.objects.all()
2020-11-11 16:07:38 -05:00
class RouteTargetBulkImportView(generic.BulkImportView):
2020-09-24 11:25:52 -04:00
queryset = RouteTarget.objects.all()
model_form = forms.RouteTargetImportForm
2020-09-24 11:25:52 -04:00
2020-11-11 16:07:38 -05:00
class RouteTargetBulkEditView(generic.BulkEditView):
queryset = RouteTarget.objects.all()
2021-04-29 16:38:56 -04:00
filterset = filtersets.RouteTargetFilterSet
2020-09-24 11:25:52 -04:00
table = tables.RouteTargetTable
form = forms.RouteTargetBulkEditForm
2020-11-11 16:07:38 -05:00
class RouteTargetBulkDeleteView(generic.BulkDeleteView):
queryset = RouteTarget.objects.all()
2021-04-29 16:38:56 -04:00
filterset = filtersets.RouteTargetFilterSet
2020-09-24 11:25:52 -04:00
table = tables.RouteTargetTable
2016-05-16 13:04:45 -04:00
#
# RIRs
#
2020-11-11 16:07:38 -05:00
class RIRListView(generic.ObjectListView):
queryset = RIR.objects.annotate(
aggregate_count=count_related(Aggregate, 'rir')
)
2021-04-29 16:38:56 -04:00
filterset = filtersets.RIRFilterSet
filterset_form = forms.RIRFilterForm
table = tables.RIRTable
2016-05-16 13:04:45 -04:00
@register_model_view(RIR)
class RIRView(generic.ObjectView):
queryset = RIR.objects.all()
def get_extra_context(self, request, instance):
related_models = (
(Aggregate.objects.restrict(request.user, 'view').filter(rir=instance), 'rir_id'),
)
return {
'related_models': related_models,
}
@register_model_view(RIR, 'edit')
2020-11-11 16:07:38 -05:00
class RIREditView(generic.ObjectEditView):
queryset = RIR.objects.all()
form = forms.RIRForm
2016-05-16 13:04:45 -04:00
@register_model_view(RIR, 'delete')
2020-11-11 16:07:38 -05:00
class RIRDeleteView(generic.ObjectDeleteView):
queryset = RIR.objects.all()
2020-11-11 16:07:38 -05:00
class RIRBulkImportView(generic.BulkImportView):
2020-05-21 11:58:27 -04:00
queryset = RIR.objects.all()
model_form = forms.RIRImportForm
class RIRBulkEditView(generic.BulkEditView):
queryset = RIR.objects.annotate(
aggregate_count=count_related(Aggregate, 'rir')
)
2021-04-29 16:38:56 -04:00
filterset = filtersets.RIRFilterSet
table = tables.RIRTable
form = forms.RIRBulkEditForm
2020-11-11 16:07:38 -05:00
class RIRBulkDeleteView(generic.BulkDeleteView):
queryset = RIR.objects.annotate(
aggregate_count=count_related(Aggregate, 'rir')
)
2021-04-29 16:38:56 -04:00
filterset = filtersets.RIRFilterSet
table = tables.RIRTable
2016-05-16 13:04:45 -04:00
#
# ASN ranges
#
class ASNRangeListView(generic.ObjectListView):
queryset = ASNRange.objects.all()
filterset = filtersets.ASNRangeFilterSet
filterset_form = forms.ASNRangeFilterForm
table = tables.ASNRangeTable
@register_model_view(ASNRange)
class ASNRangeView(generic.ObjectView):
queryset = ASNRange.objects.all()
@register_model_view(ASNRange, 'asns')
class ASNRangeASNsView(generic.ObjectChildrenView):
queryset = ASNRange.objects.all()
child_model = ASN
table = tables.ASNTable
filterset = filtersets.ASNFilterSet
template_name = 'ipam/asnrange/asns.html'
tab = ViewTab(
label=_('ASNs'),
badge=lambda x: x.get_child_asns().count(),
permission='ipam.view_asns',
weight=500
)
def get_children(self, request, parent):
return parent.get_child_asns().restrict(request.user, 'view').annotate(
site_count=count_related(Site, 'asns'),
provider_count=count_related(Provider, 'asns')
)
@register_model_view(ASNRange, 'edit')
class ASNRangeEditView(generic.ObjectEditView):
queryset = ASNRange.objects.all()
form = forms.ASNRangeForm
@register_model_view(ASNRange, 'delete')
class ASNRangeDeleteView(generic.ObjectDeleteView):
queryset = ASNRange.objects.all()
class ASNRangeBulkImportView(generic.BulkImportView):
queryset = ASNRange.objects.all()
model_form = forms.ASNRangeImportForm
class ASNRangeBulkEditView(generic.BulkEditView):
queryset = ASNRange.objects.annotate(
site_count=count_related(Site, 'asns')
)
filterset = filtersets.ASNRangeFilterSet
table = tables.ASNRangeTable
form = forms.ASNRangeBulkEditForm
class ASNRangeBulkDeleteView(generic.BulkDeleteView):
queryset = ASNRange.objects.annotate(
site_count=count_related(Site, 'asns')
)
filterset = filtersets.ASNRangeFilterSet
table = tables.ASNRangeTable
2021-10-24 23:42:47 -05:00
#
# ASNs
#
class ASNListView(generic.ObjectListView):
queryset = ASN.objects.annotate(
site_count=count_related(Site, 'asns'),
provider_count=count_related(Provider, 'asns')
2021-10-24 23:42:47 -05:00
)
filterset = filtersets.ASNFilterSet
filterset_form = forms.ASNFilterForm
table = tables.ASNTable
@register_model_view(ASN)
2021-10-24 23:42:47 -05:00
class ASNView(generic.ObjectView):
queryset = ASN.objects.all()
def get_extra_context(self, request, instance):
related_models = (
(Site.objects.restrict(request.user, 'view').filter(asns__in=[instance]), 'asn_id'),
(Provider.objects.restrict(request.user, 'view').filter(asns__in=[instance]), 'asn_id'),
)
2021-10-24 23:42:47 -05:00
return {
'related_models': related_models,
2021-10-24 23:42:47 -05:00
}
@register_model_view(ASN, 'edit')
2021-10-24 23:42:47 -05:00
class ASNEditView(generic.ObjectEditView):
queryset = ASN.objects.all()
form = forms.ASNForm
2021-10-24 23:42:47 -05:00
@register_model_view(ASN, 'delete')
2021-10-24 23:42:47 -05:00
class ASNDeleteView(generic.ObjectDeleteView):
queryset = ASN.objects.all()
class ASNBulkImportView(generic.BulkImportView):
queryset = ASN.objects.all()
model_form = forms.ASNImportForm
2021-10-24 23:42:47 -05:00
class ASNBulkEditView(generic.BulkEditView):
queryset = ASN.objects.annotate(
site_count=count_related(Site, 'asns')
)
filterset = filtersets.ASNFilterSet
table = tables.ASNTable
form = forms.ASNBulkEditForm
class ASNBulkDeleteView(generic.BulkDeleteView):
queryset = ASN.objects.annotate(
site_count=count_related(Site, 'asns')
)
filterset = filtersets.ASNFilterSet
table = tables.ASNTable
2016-03-01 11:23:03 -05:00
#
# Aggregates
#
2020-11-11 16:07:38 -05:00
class AggregateListView(generic.ObjectListView):
queryset = Aggregate.objects.annotate(
child_count=RawSQL('SELECT COUNT(*) FROM ipam_prefix WHERE ipam_prefix.prefix <<= ipam_aggregate.prefix', ())
)
2021-04-29 16:38:56 -04:00
filterset = filtersets.AggregateFilterSet
filterset_form = forms.AggregateFilterForm
table = tables.AggregateTable
2016-03-01 11:23:03 -05:00
@register_model_view(Aggregate)
2020-11-11 16:07:38 -05:00
class AggregateView(generic.ObjectView):
queryset = Aggregate.objects.all()
@register_model_view(Aggregate, 'prefixes')
class AggregatePrefixesView(generic.ObjectChildrenView):
queryset = Aggregate.objects.all()
child_model = Prefix
table = tables.PrefixTable
filterset = filtersets.PrefixFilterSet
template_name = 'ipam/aggregate/prefixes.html'
tab = ViewTab(
label=_('Prefixes'),
badge=lambda x: x.get_child_prefixes().count(),
permission='ipam.view_prefix',
weight=500
)
2016-03-01 11:23:03 -05:00
def get_children(self, request, parent):
return Prefix.objects.restrict(request.user, 'view').filter(
prefix__net_contained_or_equal=str(parent.prefix)
).prefetch_related('site', 'role', 'tenant', 'tenant__group', 'vlan')
2016-03-01 11:23:03 -05:00
def prep_table_data(self, request, queryset, parent):
# Determine whether to show assigned prefixes, available prefixes, or both
show_available = bool(request.GET.get('show_available', 'true') == 'true')
show_assigned = bool(request.GET.get('show_assigned', 'true') == 'true')
return add_requested_prefixes(parent.prefix, queryset, show_available, show_assigned)
def get_extra_context(self, request, instance):
return {
'bulk_querystring': f'within={instance.prefix}',
'first_available_prefix': instance.get_first_available_prefix(),
'show_available': bool(request.GET.get('show_available', 'true') == 'true'),
'show_assigned': bool(request.GET.get('show_assigned', 'true') == 'true'),
}
2016-03-01 11:23:03 -05:00
@register_model_view(Aggregate, 'edit')
2020-11-11 16:07:38 -05:00
class AggregateEditView(generic.ObjectEditView):
queryset = Aggregate.objects.all()
form = forms.AggregateForm
2016-03-01 11:23:03 -05:00
@register_model_view(Aggregate, 'delete')
2020-11-11 16:07:38 -05:00
class AggregateDeleteView(generic.ObjectDeleteView):
queryset = Aggregate.objects.all()
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class AggregateBulkImportView(generic.BulkImportView):
2020-05-21 11:58:27 -04:00
queryset = Aggregate.objects.all()
model_form = forms.AggregateImportForm
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class AggregateBulkEditView(generic.BulkEditView):
queryset = Aggregate.objects.annotate(
child_count=RawSQL('SELECT COUNT(*) FROM ipam_prefix WHERE ipam_prefix.prefix <<= ipam_aggregate.prefix', ())
)
2021-04-29 16:38:56 -04:00
filterset = filtersets.AggregateFilterSet
table = tables.AggregateTable
2016-05-18 16:20:30 -04:00
form = forms.AggregateBulkEditForm
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class AggregateBulkDeleteView(generic.BulkDeleteView):
queryset = Aggregate.objects.annotate(
child_count=RawSQL('SELECT COUNT(*) FROM ipam_prefix WHERE ipam_prefix.prefix <<= ipam_aggregate.prefix', ())
)
2021-04-29 16:38:56 -04:00
filterset = filtersets.AggregateFilterSet
table = tables.AggregateTable
2016-03-01 11:23:03 -05:00
2016-05-17 15:04:16 -04:00
#
# Prefix/VLAN roles
#
2020-11-11 16:07:38 -05:00
class RoleListView(generic.ObjectListView):
queryset = Role.objects.annotate(
prefix_count=count_related(Prefix, 'role'),
iprange_count=count_related(IPRange, 'role'),
vlan_count=count_related(VLAN, 'role')
)
filterset = filtersets.RoleFilterSet
filterset_form = forms.RoleFilterForm
2016-05-18 16:20:30 -04:00
table = tables.RoleTable
2016-05-17 15:04:16 -04:00
@register_model_view(Role)
class RoleView(generic.ObjectView):
queryset = Role.objects.all()
def get_extra_context(self, request, instance):
related_models = (
(Prefix.objects.restrict(request.user, 'view').filter(role=instance), 'role_id'),
(IPRange.objects.restrict(request.user, 'view').filter(role=instance), 'role_id'),
(VLAN.objects.restrict(request.user, 'view').filter(role=instance), 'role_id'),
)
return {
'related_models': related_models,
}
@register_model_view(Role, 'edit')
2020-11-11 16:07:38 -05:00
class RoleEditView(generic.ObjectEditView):
queryset = Role.objects.all()
form = forms.RoleForm
2016-05-17 15:04:16 -04:00
@register_model_view(Role, 'delete')
2020-11-11 16:07:38 -05:00
class RoleDeleteView(generic.ObjectDeleteView):
queryset = Role.objects.all()
2020-11-11 16:07:38 -05:00
class RoleBulkImportView(generic.BulkImportView):
2020-05-21 11:58:27 -04:00
queryset = Role.objects.all()
model_form = forms.RoleImportForm
class RoleBulkEditView(generic.BulkEditView):
queryset = Role.objects.all()
2021-04-29 16:38:56 -04:00
filterset = filtersets.RoleFilterSet
table = tables.RoleTable
form = forms.RoleBulkEditForm
2020-11-11 16:07:38 -05:00
class RoleBulkDeleteView(generic.BulkDeleteView):
queryset = Role.objects.all()
filterset = filtersets.RoleFilterSet
table = tables.RoleTable
2016-05-17 15:04:16 -04:00
2016-03-01 11:23:03 -05:00
#
# Prefixes
#
2020-11-11 16:07:38 -05:00
class PrefixListView(generic.ObjectListView):
2021-05-24 16:51:05 -04:00
queryset = Prefix.objects.all()
2021-04-29 16:38:56 -04:00
filterset = filtersets.PrefixFilterSet
filterset_form = forms.PrefixFilterForm
table = tables.PrefixTable
template_name = 'ipam/prefix_list.html'
2016-03-01 11:23:03 -05:00
@register_model_view(Prefix)
2020-11-11 16:07:38 -05:00
class PrefixView(generic.ObjectView):
queryset = Prefix.objects.all()
def get_extra_context(self, request, instance):
try:
2020-06-01 11:43:49 -04:00
aggregate = Aggregate.objects.restrict(request.user, 'view').get(
prefix__net_contains_or_equals=str(instance.prefix)
2020-06-01 11:43:49 -04:00
)
except Aggregate.DoesNotExist:
aggregate = None
# Parent prefixes table
2020-06-01 11:43:49 -04:00
parent_prefixes = Prefix.objects.restrict(request.user, 'view').filter(
Q(vrf=instance.vrf) | Q(vrf__isnull=True, status=PrefixStatusChoices.STATUS_CONTAINER)
).filter(
prefix__net_contains=str(instance.prefix)
).prefetch_related(
'site', 'role', 'tenant', 'vlan',
2021-05-24 16:51:05 -04:00
)
parent_prefix_table = tables.PrefixTable(
list(parent_prefixes),
exclude=('vrf', 'utilization'),
orderable=False
)
# Duplicate prefixes table
2020-06-01 11:43:49 -04:00
duplicate_prefixes = Prefix.objects.restrict(request.user, 'view').filter(
vrf=instance.vrf, prefix=str(instance.prefix)
).exclude(
pk=instance.pk
).prefetch_related(
'site', 'role', 'tenant', 'vlan',
)
duplicate_prefix_table = tables.PrefixTable(
list(duplicate_prefixes),
exclude=('vrf', 'utilization'),
orderable=False
)
return {
'aggregate': aggregate,
'parent_prefix_table': parent_prefix_table,
'duplicate_prefix_table': duplicate_prefix_table,
}
@register_model_view(Prefix, 'prefixes')
class PrefixPrefixesView(generic.ObjectChildrenView):
queryset = Prefix.objects.all()
child_model = Prefix
table = tables.PrefixTable
filterset = filtersets.PrefixFilterSet
template_name = 'ipam/prefix/prefixes.html'
tab = ViewTab(
label=_('Child Prefixes'),
badge=lambda x: x.get_child_prefixes().count(),
permission='ipam.view_prefix',
weight=500
)
def get_children(self, request, parent):
return parent.get_child_prefixes().restrict(request.user, 'view').prefetch_related(
'site', 'vrf', 'vlan', 'role', 'tenant', 'tenant__group'
)
def prep_table_data(self, request, queryset, parent):
# Determine whether to show assigned prefixes, available prefixes, or both
show_available = bool(request.GET.get('show_available', 'true') == 'true')
show_assigned = bool(request.GET.get('show_assigned', 'true') == 'true')
return add_requested_prefixes(parent.prefix, queryset, show_available, show_assigned)
def get_extra_context(self, request, instance):
return {
'bulk_querystring': f"vrf_id={instance.vrf.pk if instance.vrf else '0'}&within={instance.prefix}",
'first_available_prefix': instance.get_first_available_prefix(),
'show_available': bool(request.GET.get('show_available', 'true') == 'true'),
'show_assigned': bool(request.GET.get('show_assigned', 'true') == 'true'),
}
@register_model_view(Prefix, 'ipranges', path='ip-ranges')
class PrefixIPRangesView(generic.ObjectChildrenView):
queryset = Prefix.objects.all()
child_model = IPRange
table = tables.IPRangeTable
filterset = filtersets.IPRangeFilterSet
template_name = 'ipam/prefix/ip_ranges.html'
tab = ViewTab(
label=_('Child Ranges'),
badge=lambda x: x.get_child_ranges().count(),
permission='ipam.view_iprange',
weight=600
)
def get_children(self, request, parent):
return parent.get_child_ranges().restrict(request.user, 'view').prefetch_related(
'tenant__group',
)
def get_extra_context(self, request, instance):
return {
'bulk_querystring': f"vrf_id={instance.vrf.pk if instance.vrf else '0'}&parent={instance.prefix}",
'first_available_ip': instance.get_first_available_ip(),
}
@register_model_view(Prefix, 'ipaddresses', path='ip-addresses')
class PrefixIPAddressesView(generic.ObjectChildrenView):
queryset = Prefix.objects.all()
child_model = IPAddress
table = tables.IPAddressTable
filterset = filtersets.IPAddressFilterSet
template_name = 'ipam/prefix/ip_addresses.html'
tab = ViewTab(
label=_('IP Addresses'),
badge=lambda x: x.get_child_ips().count(),
permission='ipam.view_ipaddress',
weight=700
)
def get_children(self, request, parent):
return parent.get_child_ips().restrict(request.user, 'view').prefetch_related('vrf', 'tenant', 'tenant__group')
def prep_table_data(self, request, queryset, parent):
if not request.GET.get('q') and not request.GET.get('sort'):
return add_available_ipaddresses(parent.prefix, queryset, parent.is_pool)
return queryset
def get_extra_context(self, request, instance):
return {
'bulk_querystring': f"vrf_id={instance.vrf.pk if instance.vrf else '0'}&parent={instance.prefix}",
'first_available_ip': instance.get_first_available_ip(),
}
2016-03-01 11:23:03 -05:00
@register_model_view(Prefix, 'edit')
2020-11-11 16:07:38 -05:00
class PrefixEditView(generic.ObjectEditView):
queryset = Prefix.objects.all()
form = forms.PrefixForm
2016-03-01 11:23:03 -05:00
@register_model_view(Prefix, 'delete')
2020-11-11 16:07:38 -05:00
class PrefixDeleteView(generic.ObjectDeleteView):
queryset = Prefix.objects.all()
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class PrefixBulkImportView(generic.BulkImportView):
queryset = Prefix.objects.all()
model_form = forms.PrefixImportForm
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class PrefixBulkEditView(generic.BulkEditView):
queryset = Prefix.objects.prefetch_related('vrf__tenant')
2021-04-29 16:38:56 -04:00
filterset = filtersets.PrefixFilterSet
table = tables.PrefixTable
2016-05-18 16:20:30 -04:00
form = forms.PrefixBulkEditForm
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class PrefixBulkDeleteView(generic.BulkDeleteView):
queryset = Prefix.objects.prefetch_related('vrf__tenant')
2021-04-29 16:38:56 -04:00
filterset = filtersets.PrefixFilterSet
table = tables.PrefixTable
2016-03-01 11:23:03 -05:00
2021-07-16 09:15:19 -04:00
#
# IP Ranges
#
class IPRangeListView(generic.ObjectListView):
queryset = IPRange.objects.all()
filterset = filtersets.IPRangeFilterSet
filterset_form = forms.IPRangeFilterForm
table = tables.IPRangeTable
@register_model_view(IPRange)
2021-07-16 09:15:19 -04:00
class IPRangeView(generic.ObjectView):
queryset = IPRange.objects.all()
@register_model_view(IPRange, 'ipaddresses', path='ip-addresses')
class IPRangeIPAddressesView(generic.ObjectChildrenView):
2021-07-16 09:15:19 -04:00
queryset = IPRange.objects.all()
child_model = IPAddress
table = tables.IPAddressTable
filterset = filtersets.IPAddressFilterSet
2021-07-16 09:15:19 -04:00
template_name = 'ipam/iprange/ip_addresses.html'
tab = ViewTab(
label=_('IP Addresses'),
badge=lambda x: x.get_child_ips().count(),
permission='ipam.view_ipaddress',
weight=500
)
2021-07-16 09:15:19 -04:00
def get_children(self, request, parent):
2022-07-11 12:45:53 -04:00
return parent.get_child_ips().restrict(request.user, 'view')
2021-07-16 09:15:19 -04:00
@register_model_view(IPRange, 'edit')
2021-07-16 09:15:19 -04:00
class IPRangeEditView(generic.ObjectEditView):
queryset = IPRange.objects.all()
form = forms.IPRangeForm
2021-07-16 09:15:19 -04:00
@register_model_view(IPRange, 'delete')
2021-07-16 09:15:19 -04:00
class IPRangeDeleteView(generic.ObjectDeleteView):
queryset = IPRange.objects.all()
class IPRangeBulkImportView(generic.BulkImportView):
queryset = IPRange.objects.all()
model_form = forms.IPRangeImportForm
2021-07-16 09:15:19 -04:00
class IPRangeBulkEditView(generic.BulkEditView):
queryset = IPRange.objects.all()
2021-07-16 09:15:19 -04:00
filterset = filtersets.IPRangeFilterSet
table = tables.IPRangeTable
form = forms.IPRangeBulkEditForm
class IPRangeBulkDeleteView(generic.BulkDeleteView):
queryset = IPRange.objects.all()
2021-07-16 09:15:19 -04:00
filterset = filtersets.IPRangeFilterSet
table = tables.IPRangeTable
2016-03-01 11:23:03 -05:00
#
# IP addresses
#
2020-11-11 16:07:38 -05:00
class IPAddressListView(generic.ObjectListView):
queryset = IPAddress.objects.all()
2021-04-29 16:38:56 -04:00
filterset = filtersets.IPAddressFilterSet
filterset_form = forms.IPAddressFilterForm
table = tables.IPAddressTable
2016-03-01 11:23:03 -05:00
@register_model_view(IPAddress)
2020-11-11 16:07:38 -05:00
class IPAddressView(generic.ObjectView):
queryset = IPAddress.objects.prefetch_related('vrf__tenant', 'tenant')
def get_extra_context(self, request, instance):
2020-06-23 16:39:43 -04:00
# Parent prefixes table
parent_prefixes = Prefix.objects.restrict(request.user, 'view').filter(
vrf=instance.vrf,
2021-06-04 16:46:02 +02:00
prefix__net_contains_or_equals=str(instance.address.ip)
2020-06-23 16:39:43 -04:00
).prefetch_related(
'site', 'role'
)
parent_prefixes_table = tables.PrefixTable(
list(parent_prefixes),
exclude=('vrf', 'utilization'),
orderable=False
)
2020-06-23 16:39:43 -04:00
# Duplicate IPs table
duplicate_ips = IPAddress.objects.restrict(request.user, 'view').filter(
vrf=instance.vrf,
address=str(instance.address)
2020-06-23 16:39:43 -04:00
).exclude(
pk=instance.pk
2020-06-23 16:39:43 -04:00
).prefetch_related(
'nat_inside'
)
# Exclude anycast IPs if this IP is anycast
if instance.role == IPAddressRoleChoices.ROLE_ANYCAST:
2020-06-23 16:39:43 -04:00
duplicate_ips = duplicate_ips.exclude(role=IPAddressRoleChoices.ROLE_ANYCAST)
# Limit to a maximum of 10 duplicates displayed here
duplicate_ips_table = tables.IPAddressTable(duplicate_ips[:10], orderable=False)
2020-06-23 16:39:43 -04:00
return {
2020-06-23 16:39:43 -04:00
'parent_prefixes_table': parent_prefixes_table,
'duplicate_ips_table': duplicate_ips_table,
}
2016-03-01 11:23:03 -05:00
@register_model_view(IPAddress, 'edit')
2020-11-11 16:07:38 -05:00
class IPAddressEditView(generic.ObjectEditView):
queryset = IPAddress.objects.all()
form = forms.IPAddressForm
template_name = 'ipam/ipaddress_edit.html'
2016-03-01 11:23:03 -05:00
2021-12-14 11:28:13 -05:00
def alter_object(self, obj, request, url_args, url_kwargs):
2020-06-24 09:52:22 -04:00
if 'interface' in request.GET:
try:
2020-06-24 09:52:22 -04:00
obj.assigned_object = Interface.objects.get(pk=request.GET['interface'])
except (ValueError, Interface.DoesNotExist):
pass
2020-06-24 09:52:22 -04:00
elif 'vminterface' in request.GET:
try:
obj.assigned_object = VMInterface.objects.get(pk=request.GET['vminterface'])
except (ValueError, VMInterface.DoesNotExist):
pass
elif 'fhrpgroup' in request.GET:
try:
obj.assigned_object = FHRPGroup.objects.get(pk=request.GET['fhrpgroup'])
except (ValueError, FHRPGroup.DoesNotExist):
pass
return obj
2016-03-01 11:23:03 -05:00
# TODO: Standardize or remove this view
2020-11-11 16:07:38 -05:00
class IPAddressAssignView(generic.ObjectView):
"""
Search for IPAddresses to be assigned to an Interface.
"""
queryset = IPAddress.objects.all()
def dispatch(self, request, *args, **kwargs):
# Redirect user if an interface has not been provided
2020-09-04 16:09:05 -04:00
if 'interface' not in request.GET and 'vminterface' not in request.GET:
return redirect('ipam:ipaddress_add')
return super().dispatch(request, *args, **kwargs)
def get(self, request):
form = forms.IPAddressAssignForm()
return render(request, 'ipam/ipaddress_assign.html', {
'form': form,
'return_url': request.GET.get('return_url', ''),
})
def post(self, request):
form = forms.IPAddressAssignForm(request.POST)
table = None
if form.is_valid():
2020-06-22 14:46:25 -04:00
addresses = self.queryset.prefetch_related('vrf', 'tenant')
2020-01-09 16:26:11 +00:00
# Limit to 100 results
2021-04-29 16:38:56 -04:00
addresses = filtersets.IPAddressFilterSet(request.POST, addresses).qs[:100]
2020-01-09 16:26:11 +00:00
table = tables.IPAddressAssignTable(addresses)
return render(request, 'ipam/ipaddress_assign.html', {
'form': form,
'table': table,
2020-09-04 16:09:05 -04:00
'return_url': request.GET.get('return_url'),
})
@register_model_view(IPAddress, 'delete')
2020-11-11 16:07:38 -05:00
class IPAddressDeleteView(generic.ObjectDeleteView):
queryset = IPAddress.objects.all()
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class IPAddressBulkCreateView(generic.BulkCreateView):
queryset = IPAddress.objects.all()
form = forms.IPAddressBulkCreateForm
model_form = forms.IPAddressBulkAddForm
pattern_target = 'address'
template_name = 'ipam/ipaddress_bulk_add.html'
2020-11-11 16:07:38 -05:00
class IPAddressBulkImportView(generic.BulkImportView):
2020-05-21 11:58:27 -04:00
queryset = IPAddress.objects.all()
model_form = forms.IPAddressImportForm
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class IPAddressBulkEditView(generic.BulkEditView):
queryset = IPAddress.objects.prefetch_related('vrf__tenant')
2021-04-29 16:38:56 -04:00
filterset = filtersets.IPAddressFilterSet
table = tables.IPAddressTable
2016-05-18 16:20:30 -04:00
form = forms.IPAddressBulkEditForm
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class IPAddressBulkDeleteView(generic.BulkDeleteView):
queryset = IPAddress.objects.prefetch_related('vrf__tenant')
2021-04-29 16:38:56 -04:00
filterset = filtersets.IPAddressFilterSet
table = tables.IPAddressTable
2016-03-01 11:23:03 -05:00
@register_model_view(IPAddress, 'related_ips', path='related-ip-addresses')
class IPAddressRelatedIPsView(generic.ObjectChildrenView):
queryset = IPAddress.objects.prefetch_related('vrf__tenant', 'tenant')
child_model = IPAddress
table = tables.IPAddressTable
filterset = filtersets.IPAddressFilterSet
template_name = 'ipam/ipaddress/ip_addresses.html'
tab = ViewTab(
label=_('Related IPs'),
badge=lambda x: x.get_related_ips().count(),
weight=500,
hide_if_empty=True,
)
def get_children(self, request, parent):
return parent.get_related_ips().restrict(request.user, 'view')
2016-07-15 13:26:54 -04:00
#
# VLAN groups
#
2020-11-11 16:07:38 -05:00
class VLANGroupListView(generic.ObjectListView):
2021-03-15 20:35:18 -04:00
queryset = VLANGroup.objects.annotate(
vlan_count=count_related(VLAN, 'group')
)
2021-04-29 16:38:56 -04:00
filterset = filtersets.VLANGroupFilterSet
filterset_form = forms.VLANGroupFilterForm
2016-07-15 13:26:54 -04:00
table = tables.VLANGroupTable
@register_model_view(VLANGroup)
class VLANGroupView(generic.ObjectView):
queryset = VLANGroup.objects.all()
def get_extra_context(self, request, instance):
related_models = (
(VLAN.objects.restrict(request.user, 'view').filter(group=instance), 'group_id'),
)
# TODO: Replace with embedded table
vlans = VLAN.objects.restrict(request.user, 'view').filter(group=instance).prefetch_related(
Prefetch('prefixes', queryset=Prefix.objects.restrict(request.user)),
'tenant', 'site', 'role',
).order_by('vid')
vlans = add_available_vlans(vlans, vlan_group=instance)
vlans_table = tables.VLANTable(vlans, user=request.user, exclude=('group',))
if request.user.has_perm('ipam.change_vlan') or request.user.has_perm('ipam.delete_vlan'):
vlans_table.columns.show('pk')
vlans_table.configure(request)
return {
'related_models': related_models,
'vlans_table': vlans_table,
}
@register_model_view(VLANGroup, 'edit')
2020-11-11 16:07:38 -05:00
class VLANGroupEditView(generic.ObjectEditView):
queryset = VLANGroup.objects.all()
form = forms.VLANGroupForm
2016-07-15 13:26:54 -04:00
@register_model_view(VLANGroup, 'delete')
2020-11-11 16:07:38 -05:00
class VLANGroupDeleteView(generic.ObjectDeleteView):
queryset = VLANGroup.objects.all()
2020-11-11 16:07:38 -05:00
class VLANGroupBulkImportView(generic.BulkImportView):
2020-05-21 11:58:27 -04:00
queryset = VLANGroup.objects.all()
model_form = forms.VLANGroupImportForm
class VLANGroupBulkEditView(generic.BulkEditView):
2021-03-15 20:58:23 -04:00
queryset = VLANGroup.objects.annotate(
vlan_count=count_related(VLAN, 'group')
)
2021-04-29 16:38:56 -04:00
filterset = filtersets.VLANGroupFilterSet
table = tables.VLANGroupTable
form = forms.VLANGroupBulkEditForm
2020-11-11 16:07:38 -05:00
class VLANGroupBulkDeleteView(generic.BulkDeleteView):
queryset = VLANGroup.objects.annotate(
vlan_count=count_related(VLAN, 'group')
)
2021-04-29 16:38:56 -04:00
filterset = filtersets.VLANGroupFilterSet
table = tables.VLANGroupTable
2016-07-15 13:26:54 -04:00
2021-11-01 16:14:44 -04:00
#
# FHRP groups
#
class FHRPGroupListView(generic.ObjectListView):
queryset = FHRPGroup.objects.annotate(
member_count=count_related(FHRPGroupAssignment, 'group')
)
filterset = filtersets.FHRPGroupFilterSet
filterset_form = forms.FHRPGroupFilterForm
table = tables.FHRPGroupTable
@register_model_view(FHRPGroup)
2021-11-01 16:14:44 -04:00
class FHRPGroupView(generic.ObjectView):
queryset = FHRPGroup.objects.all()
def get_extra_context(self, request, instance):
# Get assigned interfaces
members_table = tables.FHRPGroupAssignmentTable(
data=FHRPGroupAssignment.objects.restrict(request.user, 'view').filter(group=instance),
orderable=False
2021-11-01 16:14:44 -04:00
)
members_table.columns.hide('group')
return {
'members_table': members_table,
'member_count': FHRPGroupAssignment.objects.filter(group=instance).count(),
}
@register_model_view(FHRPGroup, 'edit')
2021-11-01 16:14:44 -04:00
class FHRPGroupEditView(generic.ObjectEditView):
queryset = FHRPGroup.objects.all()
form = forms.FHRPGroupForm
2021-11-01 16:14:44 -04:00
def get_return_url(self, request, obj=None):
return_url = super().get_return_url(request, obj)
# If we're redirecting the user to the FHRPGroupAssignment creation form,
# initialize the group field with the FHRPGroup we just saved.
if return_url.startswith(reverse('ipam:fhrpgroupassignment_add')):
return_url += f'&group={obj.pk}'
return return_url
def alter_object(self, obj, request, url_args, url_kwargs):
# Workaround to solve #10719. Capture the current user on the FHRPGroup instance so that
# we can evaluate permissions during the creation of a new IPAddress within the form.
obj._user = request.user
return obj
2021-11-01 16:14:44 -04:00
@register_model_view(FHRPGroup, 'delete')
2021-11-01 16:14:44 -04:00
class FHRPGroupDeleteView(generic.ObjectDeleteView):
queryset = FHRPGroup.objects.all()
class FHRPGroupBulkImportView(generic.BulkImportView):
queryset = FHRPGroup.objects.all()
model_form = forms.FHRPGroupImportForm
2021-11-01 16:14:44 -04:00
class FHRPGroupBulkEditView(generic.BulkEditView):
queryset = FHRPGroup.objects.all()
filterset = filtersets.FHRPGroupFilterSet
table = tables.FHRPGroupTable
form = forms.FHRPGroupBulkEditForm
class FHRPGroupBulkDeleteView(generic.BulkDeleteView):
queryset = FHRPGroup.objects.all()
filterset = filtersets.FHRPGroupFilterSet
table = tables.FHRPGroupTable
#
# FHRP group assignments
#
@register_model_view(FHRPGroupAssignment, 'edit')
2021-11-01 16:14:44 -04:00
class FHRPGroupAssignmentEditView(generic.ObjectEditView):
queryset = FHRPGroupAssignment.objects.all()
form = forms.FHRPGroupAssignmentForm
2021-11-02 13:32:41 -04:00
template_name = 'ipam/fhrpgroupassignment_edit.html'
2021-11-01 16:14:44 -04:00
2021-12-14 11:28:13 -05:00
def alter_object(self, instance, request, args, kwargs):
2021-11-01 16:14:44 -04:00
if not instance.pk:
# Assign the interface based on URL kwargs
content_type = get_object_or_404(ContentType, pk=request.GET.get('interface_type'))
instance.interface = get_object_or_404(content_type.model_class(), pk=request.GET.get('interface_id'))
2021-11-01 16:14:44 -04:00
return instance
@register_model_view(FHRPGroupAssignment, 'delete')
2021-11-01 16:14:44 -04:00
class FHRPGroupAssignmentDeleteView(generic.ObjectDeleteView):
queryset = FHRPGroupAssignment.objects.all()
2016-03-01 11:23:03 -05:00
#
# VLANs
#
2020-11-11 16:07:38 -05:00
class VLANListView(generic.ObjectListView):
queryset = VLAN.objects.all()
2021-04-29 16:38:56 -04:00
filterset = filtersets.VLANFilterSet
filterset_form = forms.VLANFilterForm
table = tables.VLANTable
2016-03-01 11:23:03 -05:00
@register_model_view(VLAN)
2020-11-11 16:07:38 -05:00
class VLANView(generic.ObjectView):
queryset = VLAN.objects.all()
2016-03-01 11:23:03 -05:00
def get_extra_context(self, request, instance):
prefixes = Prefix.objects.restrict(request.user, 'view').filter(vlan=instance).prefetch_related(
'vrf', 'site', 'role', 'tenant'
2020-06-01 11:43:49 -04:00
)
prefix_table = tables.PrefixTable(list(prefixes), exclude=('vlan', 'utilization'), orderable=False)
return {
'prefix_table': prefix_table,
}
2016-03-01 11:23:03 -05:00
@register_model_view(VLAN, 'interfaces')
class VLANInterfacesView(generic.ObjectChildrenView):
queryset = VLAN.objects.all()
child_model = Interface
table = tables.VLANDevicesTable
filterset = InterfaceFilterSet
template_name = 'ipam/vlan/interfaces.html'
tab = ViewTab(
label=_('Device Interfaces'),
badge=lambda x: x.get_interfaces().count(),
permission='dcim.view_interface',
weight=500
)
def get_children(self, request, parent):
return parent.get_interfaces().restrict(request.user, 'view')
@register_model_view(VLAN, 'vminterfaces', path='vm-interfaces')
class VLANVMInterfacesView(generic.ObjectChildrenView):
queryset = VLAN.objects.all()
child_model = VMInterface
table = tables.VLANVirtualMachinesTable
filterset = VMInterfaceFilterSet
template_name = 'ipam/vlan/vminterfaces.html'
tab = ViewTab(
label=_('VM Interfaces'),
badge=lambda x: x.get_vminterfaces().count(),
permission='virtualization.view_vminterface',
weight=510
)
def get_children(self, request, parent):
return parent.get_vminterfaces().restrict(request.user, 'view')
@register_model_view(VLAN, 'edit')
2020-11-11 16:07:38 -05:00
class VLANEditView(generic.ObjectEditView):
queryset = VLAN.objects.all()
form = forms.VLANForm
2021-03-11 11:07:27 -05:00
template_name = 'ipam/vlan_edit.html'
2016-03-01 11:23:03 -05:00
@register_model_view(VLAN, 'delete')
2020-11-11 16:07:38 -05:00
class VLANDeleteView(generic.ObjectDeleteView):
queryset = VLAN.objects.all()
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class VLANBulkImportView(generic.BulkImportView):
2020-05-21 11:58:27 -04:00
queryset = VLAN.objects.all()
model_form = forms.VLANImportForm
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class VLANBulkEditView(generic.BulkEditView):
queryset = VLAN.objects.all()
2021-04-29 16:38:56 -04:00
filterset = filtersets.VLANFilterSet
table = tables.VLANTable
2016-05-18 16:20:30 -04:00
form = forms.VLANBulkEditForm
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class VLANBulkDeleteView(generic.BulkDeleteView):
queryset = VLAN.objects.all()
2021-04-29 16:38:56 -04:00
filterset = filtersets.VLANFilterSet
table = tables.VLANTable
2022-01-12 16:42:28 -05:00
#
# Service templates
#
class ServiceTemplateListView(generic.ObjectListView):
queryset = ServiceTemplate.objects.all()
filterset = filtersets.ServiceTemplateFilterSet
filterset_form = forms.ServiceTemplateFilterForm
table = tables.ServiceTemplateTable
@register_model_view(ServiceTemplate)
2022-01-12 16:42:28 -05:00
class ServiceTemplateView(generic.ObjectView):
queryset = ServiceTemplate.objects.all()
@register_model_view(ServiceTemplate, 'edit')
2022-01-12 16:42:28 -05:00
class ServiceTemplateEditView(generic.ObjectEditView):
queryset = ServiceTemplate.objects.all()
form = forms.ServiceTemplateForm
2022-01-12 16:42:28 -05:00
@register_model_view(ServiceTemplate, 'delete')
2022-01-12 16:42:28 -05:00
class ServiceTemplateDeleteView(generic.ObjectDeleteView):
queryset = ServiceTemplate.objects.all()
class ServiceTemplateBulkImportView(generic.BulkImportView):
queryset = ServiceTemplate.objects.all()
model_form = forms.ServiceTemplateImportForm
2022-01-12 16:42:28 -05:00
class ServiceTemplateBulkEditView(generic.BulkEditView):
queryset = ServiceTemplate.objects.all()
filterset = filtersets.ServiceTemplateFilterSet
table = tables.ServiceTemplateTable
form = forms.ServiceTemplateBulkEditForm
class ServiceTemplateBulkDeleteView(generic.BulkDeleteView):
queryset = ServiceTemplate.objects.all()
filterset = filtersets.ServiceTemplateFilterSet
table = tables.ServiceTemplateTable
#
# Services
#
2020-11-11 16:07:38 -05:00
class ServiceListView(generic.ObjectListView):
queryset = Service.objects.prefetch_related('device', 'virtual_machine')
2021-04-29 16:38:56 -04:00
filterset = filtersets.ServiceFilterSet
filterset_form = forms.ServiceFilterForm
table = tables.ServiceTable
@register_model_view(Service)
2020-11-11 16:07:38 -05:00
class ServiceView(generic.ObjectView):
queryset = Service.objects.all()
class ServiceCreateView(generic.ObjectEditView):
queryset = Service.objects.all()
form = forms.ServiceCreateForm
template_name = 'ipam/service_create.html'
@register_model_view(Service, 'edit')
2020-11-11 16:07:38 -05:00
class ServiceEditView(generic.ObjectEditView):
queryset = Service.objects.all()
form = forms.ServiceForm
template_name = 'ipam/service_edit.html'
@register_model_view(Service, 'delete')
2022-01-12 16:42:28 -05:00
class ServiceDeleteView(generic.ObjectDeleteView):
2020-05-21 11:58:27 -04:00
queryset = Service.objects.all()
2022-01-12 16:42:28 -05:00
class ServiceBulkImportView(generic.BulkImportView):
queryset = Service.objects.all()
model_form = forms.ServiceImportForm
2020-11-11 16:07:38 -05:00
class ServiceBulkEditView(generic.BulkEditView):
queryset = Service.objects.prefetch_related('device', 'virtual_machine')
2021-04-29 16:38:56 -04:00
filterset = filtersets.ServiceFilterSet
table = tables.ServiceTable
form = forms.ServiceBulkEditForm
2020-11-11 16:07:38 -05:00
class ServiceBulkDeleteView(generic.BulkDeleteView):
queryset = Service.objects.prefetch_related('device', 'virtual_machine')
2021-04-29 16:38:56 -04:00
filterset = filtersets.ServiceFilterSet
table = tables.ServiceTable
2022-06-27 23:24:50 -05:00
# L2VPN
class L2VPNListView(generic.ObjectListView):
queryset = L2VPN.objects.all()
table = L2VPNTable
filterset = filtersets.L2VPNFilterSet
filterset_form = forms.L2VPNFilterForm
@register_model_view(L2VPN)
2022-06-27 23:24:50 -05:00
class L2VPNView(generic.ObjectView):
queryset = L2VPN.objects.all()
def get_extra_context(self, request, instance):
import_targets_table = tables.RouteTargetTable(
instance.import_targets.prefetch_related('tenant'),
orderable=False
)
export_targets_table = tables.RouteTargetTable(
instance.export_targets.prefetch_related('tenant'),
orderable=False
)
return {
'import_targets_table': import_targets_table,
'export_targets_table': export_targets_table,
}
@register_model_view(L2VPN, 'edit')
2022-06-27 23:24:50 -05:00
class L2VPNEditView(generic.ObjectEditView):
queryset = L2VPN.objects.all()
form = forms.L2VPNForm
@register_model_view(L2VPN, 'delete')
2022-06-27 23:24:50 -05:00
class L2VPNDeleteView(generic.ObjectDeleteView):
queryset = L2VPN.objects.all()
class L2VPNBulkImportView(generic.BulkImportView):
queryset = L2VPN.objects.all()
model_form = forms.L2VPNImportForm
2022-06-27 23:24:50 -05:00
class L2VPNBulkEditView(generic.BulkEditView):
queryset = L2VPN.objects.all()
filterset = filtersets.L2VPNFilterSet
table = tables.L2VPNTable
form = forms.L2VPNBulkEditForm
class L2VPNBulkDeleteView(generic.BulkDeleteView):
queryset = L2VPN.objects.all()
filterset = filtersets.L2VPNFilterSet
table = tables.L2VPNTable
@register_model_view(L2VPN, 'contacts')
class L2VPNContactsView(ObjectContactsView):
queryset = L2VPN.objects.all()
#
# L2VPN terminations
#
2022-06-27 23:24:50 -05:00
class L2VPNTerminationListView(generic.ObjectListView):
queryset = L2VPNTermination.objects.all()
table = L2VPNTerminationTable
filterset = filtersets.L2VPNTerminationFilterSet
filterset_form = forms.L2VPNTerminationFilterForm
@register_model_view(L2VPNTermination)
2022-06-27 23:24:50 -05:00
class L2VPNTerminationView(generic.ObjectView):
queryset = L2VPNTermination.objects.all()
@register_model_view(L2VPNTermination, 'edit')
2022-06-27 23:24:50 -05:00
class L2VPNTerminationEditView(generic.ObjectEditView):
queryset = L2VPNTermination.objects.all()
form = forms.L2VPNTerminationForm
template_name = 'ipam/l2vpntermination_edit.html'
@register_model_view(L2VPNTermination, 'delete')
2022-06-27 23:24:50 -05:00
class L2VPNTerminationDeleteView(generic.ObjectDeleteView):
queryset = L2VPNTermination.objects.all()
class L2VPNTerminationBulkImportView(generic.BulkImportView):
queryset = L2VPNTermination.objects.all()
model_form = forms.L2VPNTerminationImportForm
2022-06-27 23:24:50 -05:00
2022-06-29 16:01:20 -05:00
class L2VPNTerminationBulkEditView(generic.BulkEditView):
2022-06-27 23:24:50 -05:00
queryset = L2VPNTermination.objects.all()
filterset = filtersets.L2VPNTerminationFilterSet
table = tables.L2VPNTerminationTable
2022-06-29 16:01:20 -05:00
form = forms.L2VPNTerminationBulkEditForm
2022-06-29 16:01:20 -05:00
class L2VPNTerminationBulkDeleteView(generic.BulkDeleteView):
queryset = L2VPNTermination.objects.all()
filterset = filtersets.L2VPNTerminationFilterSet
table = tables.L2VPNTerminationTable