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

Set related_query_name for GenericRelations to IPAddress

This commit is contained in:
Jeremy Stretch
2020-06-22 16:27:13 -04:00
parent 40938f0c8a
commit fc2d08c407
6 changed files with 15 additions and 24 deletions

View File

@ -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]

View File

@ -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)

View File

@ -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):

View File

@ -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 = []

View File

@ -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(

View File

@ -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,