feat: IPAM-Bereiche automatisch ergänzen

Fehlende Prefixe können direkt aus der IPAM-Bereichsliste für alle sichtbaren IP-Adressen angelegt werden. Zusätzlich zeigt die Prefix-IP-Ansicht das zugewiesene Gerät oder die VM standardmäßig an.
This commit is contained in:
2026-07-23 11:15:58 +02:00
parent 65ea56f67e
commit acb4e449bc
9 changed files with 87 additions and 9 deletions
+34 -1
View File
@@ -1,13 +1,18 @@
from django.contrib.contenttypes.models import ContentType
from django.contrib import messages
from django.contrib.auth.decorators import permission_required
from django.contrib.auth.mixins import PermissionRequiredMixin
from django.core.paginator import Paginator
from django.db.models import Q
from django.shortcuts import redirect
from django.views.decorators.http import require_POST
from django.views.generic import TemplateView
from dcim.models import Location, Region, Site, SiteGroup
from ipam.models import Prefix
from ipam.models import IPAddress, Prefix
import netaddr
from .forms import NetworkOverviewFilterForm
from .services import ensure_prefix_for_ip
def _descendant_ids(obj):
@@ -87,3 +92,31 @@ class NetworkOverviewView(PermissionRequiredMixin, TemplateView):
}
)
return context
@require_POST
@permission_required(("ipam.view_ipaddress", "ipam.add_prefix"), raise_exception=True)
def reconcile_missing_prefixes(request):
created = skipped = failed = 0
addresses = IPAddress.objects.restrict(request.user, "view").select_related(
"tenant", "assigned_object_type"
)
for address in addresses.iterator():
try:
prefix, was_created = ensure_prefix_for_ip(address)
created += int(was_created)
skipped += int(prefix is None)
except Exception:
failed += 1
if failed:
messages.warning(
request,
f"{created} Bereiche wurden angelegt; {failed} IP-Adressen konnten nicht verarbeitet werden.",
)
else:
messages.success(
request,
f"{created} fehlende Bereiche wurden angelegt. {skipped} Host-Adressen wurden ignoriert.",
)
return redirect("ipam:prefix_list")