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

Merge branch 'feature' into 6732-asn-model

This commit is contained in:
Daniel Sheppard
2021-11-03 08:37:11 -05:00
committed by GitHub
40 changed files with 1137 additions and 19 deletions

View File

@ -1,11 +1,13 @@
from django.contrib.contenttypes.models import ContentType
from django.db.models import Prefetch
from django.db.models.expressions import RawSQL
from django.http import Http404
from django.shortcuts import get_object_or_404, redirect, render
from django.urls import reverse
from dcim.models import Device, Interface, Site
from dcim.tables import SiteTable
from netbox.views import generic
from utilities.forms import TableConfigForm
from utilities.tables import paginate_table
from utilities.utils import count_related
from virtualization.models import VirtualMachine, VMInterface
@ -883,6 +885,113 @@ class VLANGroupBulkDeleteView(generic.BulkDeleteView):
table = tables.VLANGroupTable
#
# 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
class FHRPGroupView(generic.ObjectView):
queryset = FHRPGroup.objects.all()
def get_extra_context(self, request, instance):
# Get assigned IP addresses
ipaddress_table = tables.AssignedIPAddressesTable(
data=instance.ip_addresses.restrict(request.user, 'view').prefetch_related('vrf', 'tenant'),
orderable=False
)
# Get assigned interfaces
members_table = tables.FHRPGroupAssignmentTable(
data=FHRPGroupAssignment.objects.restrict(request.user, 'view').filter(group=instance),
orderable=False
)
members_table.columns.hide('group')
return {
'ipaddress_table': ipaddress_table,
'members_table': members_table,
'member_count': FHRPGroupAssignment.objects.filter(group=instance).count(),
}
class FHRPGroupEditView(generic.ObjectEditView):
queryset = FHRPGroup.objects.all()
model_form = forms.FHRPGroupForm
template_name = 'ipam/fhrpgroup_edit.html'
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
class FHRPGroupDeleteView(generic.ObjectDeleteView):
queryset = FHRPGroup.objects.all()
class FHRPGroupBulkImportView(generic.BulkImportView):
queryset = FHRPGroup.objects.all()
model_form = forms.FHRPGroupCSVForm
table = tables.FHRPGroupTable
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
#
class FHRPGroupAssignmentEditView(generic.ObjectEditView):
queryset = FHRPGroupAssignment.objects.all()
model_form = forms.FHRPGroupAssignmentForm
template_name = 'ipam/fhrpgroupassignment_edit.html'
def alter_obj(self, instance, request, args, kwargs):
if not instance.pk:
# Assign the interface based on URL kwargs
try:
app_label, model = request.GET.get('interface_type').split('.')
except (AttributeError, ValueError):
raise Http404("Content type not specified")
content_type = get_object_or_404(ContentType, app_label=app_label, model=model)
instance.interface = get_object_or_404(content_type.model_class(), pk=request.GET.get('interface_id'))
return instance
def get_return_url(self, request, obj=None):
return obj.interface.get_absolute_url() if obj else super().get_return_url(request)
class FHRPGroupAssignmentDeleteView(generic.ObjectDeleteView):
queryset = FHRPGroupAssignment.objects.all()
def get_return_url(self, request, obj=None):
return obj.interface.get_absolute_url() if obj else super().get_return_url(request)
#
# VLANs
#