|
|
@@ -1,10 +1,12 @@
|
|
|
+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
|
|
|
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
|
|
|
@@ -825,6 +827,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
|
|
|
#
|