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 # Collect interface IPs
interface_ips = IPAddress.objects.prefetch_related('interface').filter( interface_ips = IPAddress.objects.prefetch_related('interface').filter(
address__family=family, address__family=family,
assigned_object_type=ContentType.objects.get_for_model(Interface), interface__in=interface_ids
assigned_object_id__in=interface_ids
) )
if interface_ips: if interface_ips:
ip_list = [(ip.id, '{} ({})'.format(ip.address, ip.interface)) for ip in 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 # Collect NAT IPs
nat_ips = IPAddress.objects.prefetch_related('nat_inside').filter( nat_ips = IPAddress.objects.prefetch_related('nat_inside').filter(
address__family=family, address__family=family,
nat_inside__assigned_object_type=ContentType.objects.get_for_model(Interface), nat_inside__interface__in=interface_ids
nat_inside__assigned_object_id__in=interface_ids
) )
if nat_ips: if nat_ips:
ip_list = [(ip.id, '{} ({})'.format(ip.address, ip.nat_inside.address)) for ip in 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( ip_addresses = GenericRelation(
to='ipam.IPAddress', to='ipam.IPAddress',
content_type_field='assigned_object_type', 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) tags = TaggableManager(through=TaggedItem)

View File

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

View File

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

View File

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

View File

@ -408,7 +408,8 @@ class Interface(BaseInterface):
ip_addresses = GenericRelation( ip_addresses = GenericRelation(
to='ipam.IPAddress', to='ipam.IPAddress',
content_type_field='assigned_object_type', 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( tags = TaggableManager(
through=TaggedItem, through=TaggedItem,