ソースを参照

Set related_query_name for GenericRelations to IPAddress

Jeremy Stretch 5 年 前
コミット
fc2d08c407

+ 2 - 4
netbox/dcim/forms.py

@@ -1821,8 +1821,7 @@ class DeviceForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
                 # Collect interface IPs
                 interface_ips = IPAddress.objects.prefetch_related('interface').filter(
                     address__family=family,
-                    assigned_object_type=ContentType.objects.get_for_model(Interface),
-                    assigned_object_id__in=interface_ids
+                    interface__in=interface_ids
                 )
                 if interface_ips:
                     ip_list = [(ip.id, '{} ({})'.format(ip.address, ip.interface)) for ip in interface_ips]
@@ -1830,8 +1829,7 @@ class DeviceForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
                 # Collect NAT IPs
                 nat_ips = IPAddress.objects.prefetch_related('nat_inside').filter(
                     address__family=family,
-                    nat_inside__assigned_object_type=ContentType.objects.get_for_model(Interface),
-                    nat_inside__assigned_object_id__in=interface_ids
+                    nat_inside__interface__in=interface_ids
                 )
                 if nat_ips:
                     ip_list = [(ip.id, '{} ({})'.format(ip.address, ip.nat_inside.address)) for ip in nat_ips]

+ 2 - 1
netbox/dcim/models/device_components.py

@@ -689,7 +689,8 @@ class Interface(CableTermination, ComponentModel, BaseInterface):
     ip_addresses = GenericRelation(
         to='ipam.IPAddress',
         content_type_field='assigned_object_type',
-        object_id_field='assigned_object_id'
+        object_id_field='assigned_object_id',
+        related_query_name='interface'
     )
     tags = TaggableManager(through=TaggedItem)
 

+ 3 - 6
netbox/ipam/filters.py

@@ -1,6 +1,5 @@
 import django_filters
 import netaddr
-from django.contrib.contenttypes.models import ContentType
 from django.core.exceptions import ValidationError
 from django.db.models import Q
 from netaddr.core import AddrFormatError
@@ -12,7 +11,7 @@ from utilities.filters import (
     BaseFilterSet, MultiValueCharFilter, MultiValueNumberFilter, NameSlugSearchFilterSet, TagFilter,
     TreeNodeMultipleChoiceFilter,
 )
-from virtualization.models import Interface as VMInterface, VirtualMachine
+from virtualization.models import VirtualMachine
 from .choices import *
 from .models import Aggregate, IPAddress, Prefix, RIR, Role, Service, VLAN, VLANGroup, VRF
 
@@ -386,8 +385,7 @@ class IPAddressFilterSet(BaseFilterSet, TenancyFilterSet, CustomFieldFilterSet,
         for device in devices:
             interface_ids.extend(device.vc_interfaces.values_list('id', flat=True))
         return queryset.filter(
-            assigned_object_type=ContentType.objects.get_for_model(Interface),
-            assigned_object_id__in=interface_ids
+            interface__in=interface_ids
         )
 
     def filter_virtual_machine(self, queryset, name, value):
@@ -398,8 +396,7 @@ class IPAddressFilterSet(BaseFilterSet, TenancyFilterSet, CustomFieldFilterSet,
         for vm in virtual_machines:
             interface_ids.extend(vm.interfaces.values_list('id', flat=True))
         return queryset.filter(
-            assigned_object_type=ContentType.objects.get_for_model(VMInterface),
-            assigned_object_id__in=interface_ids
+            vm_interface__in=interface_ids
         )
 
     def _assigned_to_interface(self, queryset, name, value):

+ 4 - 7
netbox/ipam/forms.py

@@ -1,8 +1,7 @@
 from django import forms
-from django.contrib.contenttypes.models import ContentType
 from django.core.validators import MaxValueValidator, MinValueValidator
 
-from dcim.models import Device, Interface, Rack, Region, Site
+from dcim.models import Device, Rack, Region, Site
 from extras.forms import (
     AddRemoveTagsForm, CustomFieldBulkEditForm, CustomFieldModelCSVForm, CustomFieldModelForm, CustomFieldFilterForm,
 )
@@ -15,7 +14,7 @@ from utilities.forms import (
     ExpandableIPAddressField, ReturnURLForm, SlugField, StaticSelect2, StaticSelect2Multiple, TagFilterField,
     BOOLEAN_WITH_BLANK_CHOICES,
 )
-from virtualization.models import Interface as VMInterface, VirtualMachine
+from virtualization.models import VirtualMachine
 from .choices import *
 from .constants import *
 from .models import Aggregate, IPAddress, Prefix, RIR, Role, Service, VLAN, VLANGroup, VRF
@@ -1196,13 +1195,11 @@ class ServiceForm(BootstrapMixin, CustomFieldModelForm):
         # Limit IP address choices to those assigned to interfaces of the parent device/VM
         if self.instance.device:
             self.fields['ipaddresses'].queryset = IPAddress.objects.filter(
-                assigned_object_type=ContentType.objects.get_for_model(Interface),
-                assigned_object_id__in=self.instance.device.vc_interfaces.values_list('id', flat=True)
+                interface__in=self.instance.device.vc_interfaces.values_list('id', flat=True)
             )
         elif self.instance.virtual_machine:
             self.fields['ipaddresses'].queryset = IPAddress.objects.filter(
-                assigned_object_type=ContentType.objects.get_for_model(VMInterface),
-                assigned_object_id__in=self.instance.virtual_machine.interfaces.values_list('id', flat=True)
+                vm_interface__in=self.instance.virtual_machine.interfaces.values_list('id', flat=True)
             )
         else:
             self.fields['ipaddresses'].choices = []

+ 2 - 5
netbox/virtualization/forms.py

@@ -1,5 +1,4 @@
 from django import forms
-from django.contrib.contenttypes.models import ContentType
 from django.core.exceptions import ValidationError
 
 from dcim.choices import InterfaceModeChoices
@@ -358,8 +357,7 @@ class VirtualMachineForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
                 # Collect interface IPs
                 interface_ips = IPAddress.objects.prefetch_related('interface').filter(
                     address__family=family,
-                    assigned_object_type=ContentType.objects.get_for_model(Interface),
-                    assigned_object_id__in=self.instance.interfaces.values_list('id', flat=True)
+                    vm_interface__in=self.instance.interfaces.values_list('id', flat=True)
                 )
                 if interface_ips:
                     ip_choices.append(
@@ -370,8 +368,7 @@ class VirtualMachineForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
                 # Collect NAT IPs
                 nat_ips = IPAddress.objects.prefetch_related('nat_inside').filter(
                     address__family=family,
-                    nat_inside__assigned_object_type=ContentType.objects.get_for_model(Interface),
-                    nat_inside__assigned_object_id__in=self.instance.interfaces.values_list('id', flat=True)
+                    nat_inside__vm_interface__in=self.instance.interfaces.values_list('id', flat=True)
                 )
                 if nat_ips:
                     ip_choices.append(

+ 2 - 1
netbox/virtualization/models.py

@@ -408,7 +408,8 @@ class Interface(BaseInterface):
     ip_addresses = GenericRelation(
         to='ipam.IPAddress',
         content_type_field='assigned_object_type',
-        object_id_field='assigned_object_id'
+        object_id_field='assigned_object_id',
+        related_query_name='vm_interface'
     )
     tags = TaggableManager(
         through=TaggedItem,