mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
#9888 - Add filter and columns for device and site
This commit is contained in:
@@ -980,21 +980,65 @@ class L2VPNTerminationFilterSet(NetBoxModelFilterSet):
|
|||||||
to_field_name='slug',
|
to_field_name='slug',
|
||||||
label='L2VPN (slug)',
|
label='L2VPN (slug)',
|
||||||
)
|
)
|
||||||
device = MultiValueCharFilter(
|
region = MultiValueCharFilter(
|
||||||
method='filter_device',
|
method='filter_region',
|
||||||
field_name='name',
|
field_name='slug',
|
||||||
label='Device (name)',
|
label='Region (slug)',
|
||||||
)
|
)
|
||||||
device_id = MultiValueNumberFilter(
|
region_id = MultiValueNumberFilter(
|
||||||
method='filter_device',
|
method='filter_region',
|
||||||
|
field_name='pk',
|
||||||
|
label='Region (ID)',
|
||||||
|
)
|
||||||
|
site = MultiValueCharFilter(
|
||||||
|
method='filter_site',
|
||||||
|
field_name='slug',
|
||||||
|
label='Device (slug)',
|
||||||
|
)
|
||||||
|
site_id = MultiValueNumberFilter(
|
||||||
|
method='filter_site',
|
||||||
field_name='pk',
|
field_name='pk',
|
||||||
label='Device (ID)',
|
label='Device (ID)',
|
||||||
)
|
)
|
||||||
|
device = django_filters.ModelMultipleChoiceFilter(
|
||||||
|
field_name='interface__device__name',
|
||||||
|
queryset=Device.objects.all(),
|
||||||
|
to_field_name='name',
|
||||||
|
label='Device (name)',
|
||||||
|
)
|
||||||
|
device_id = django_filters.ModelMultipleChoiceFilter(
|
||||||
|
field_name='interface__device',
|
||||||
|
queryset=Device.objects.all(),
|
||||||
|
label='Device (ID)',
|
||||||
|
)
|
||||||
|
virtual_machine = django_filters.ModelMultipleChoiceFilter(
|
||||||
|
field_name='vminterface__virtual_machine__name',
|
||||||
|
queryset=VirtualMachine.objects.all(),
|
||||||
|
to_field_name='name',
|
||||||
|
label='Virtual machine (name)',
|
||||||
|
)
|
||||||
|
virtual_machine_id = django_filters.ModelMultipleChoiceFilter(
|
||||||
|
field_name='vminterface__virtual_machine',
|
||||||
|
queryset=VirtualMachine.objects.all(),
|
||||||
|
label='Virtual machine (ID)',
|
||||||
|
)
|
||||||
|
interface = django_filters.ModelMultipleChoiceFilter(
|
||||||
|
field_name='interface__name',
|
||||||
|
queryset=Interface.objects.all(),
|
||||||
|
to_field_name='name',
|
||||||
|
label='Interface (name)',
|
||||||
|
)
|
||||||
interface_id = django_filters.ModelMultipleChoiceFilter(
|
interface_id = django_filters.ModelMultipleChoiceFilter(
|
||||||
field_name='interface',
|
field_name='interface',
|
||||||
queryset=Interface.objects.all(),
|
queryset=Interface.objects.all(),
|
||||||
label='Interface (ID)',
|
label='Interface (ID)',
|
||||||
)
|
)
|
||||||
|
vminterface = django_filters.ModelMultipleChoiceFilter(
|
||||||
|
field_name='vminterface__name',
|
||||||
|
queryset=VMInterface.objects.all(),
|
||||||
|
to_field_name='name',
|
||||||
|
label='VM interface (name)',
|
||||||
|
)
|
||||||
vminterface_id = django_filters.ModelMultipleChoiceFilter(
|
vminterface_id = django_filters.ModelMultipleChoiceFilter(
|
||||||
field_name='vminterface',
|
field_name='vminterface',
|
||||||
queryset=VMInterface.objects.all(),
|
queryset=VMInterface.objects.all(),
|
||||||
@@ -1027,13 +1071,22 @@ class L2VPNTerminationFilterSet(NetBoxModelFilterSet):
|
|||||||
qs_filter = Q(l2vpn__name__icontains=value)
|
qs_filter = Q(l2vpn__name__icontains=value)
|
||||||
return queryset.filter(qs_filter)
|
return queryset.filter(qs_filter)
|
||||||
|
|
||||||
def filter_device(self, queryset, name, value):
|
def filter_site(self, queryset, name, value):
|
||||||
devices = Device.objects.filter(**{'{}__in'.format(name): value})
|
qs = queryset.filter(
|
||||||
if not devices.exists():
|
Q(
|
||||||
return queryset.none()
|
Q(**{'vlan__site__{}__in'.format(name): value}) |
|
||||||
interface_ids = []
|
Q(**{'interface__device__site__{}__in'.format(name): value}) |
|
||||||
for device in devices:
|
Q(**{'vminterface__virtual_machine__site__{}__in'.format(name): value})
|
||||||
interface_ids.extend(device.vc_interfaces().values_list('id', flat=True))
|
)
|
||||||
return queryset.filter(
|
|
||||||
interface__in=interface_ids
|
|
||||||
)
|
)
|
||||||
|
return qs
|
||||||
|
|
||||||
|
def filter_region(self, queryset, name, value):
|
||||||
|
qs = queryset.filter(
|
||||||
|
Q(
|
||||||
|
Q(**{'vlan__site__region__{}__in'.format(name): value}) |
|
||||||
|
Q(**{'interface__device__site__region__{}__in'.format(name): value}) |
|
||||||
|
Q(**{'vminterface__virtual_machine__site__region__{}__in'.format(name): value})
|
||||||
|
)
|
||||||
|
)
|
||||||
|
return qs
|
||||||
|
@@ -508,7 +508,8 @@ class L2VPNFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm):
|
|||||||
class L2VPNTerminationFilterForm(NetBoxModelFilterSetForm):
|
class L2VPNTerminationFilterForm(NetBoxModelFilterSetForm):
|
||||||
model = L2VPNTermination
|
model = L2VPNTermination
|
||||||
fieldsets = (
|
fieldsets = (
|
||||||
(None, ('l2vpn_id', 'assigned_object_type_id')),
|
(None, ('l2vpn_id', 'assigned_object_type_id', )),
|
||||||
|
('Assigned Object', ('region_id', 'site_id', 'device_id', 'virtual_machine_id', 'vlan_id')),
|
||||||
)
|
)
|
||||||
l2vpn_id = DynamicModelChoiceField(
|
l2vpn_id = DynamicModelChoiceField(
|
||||||
queryset=L2VPN.objects.all(),
|
queryset=L2VPN.objects.all(),
|
||||||
@@ -520,3 +521,44 @@ class L2VPNTerminationFilterForm(NetBoxModelFilterSetForm):
|
|||||||
required=False,
|
required=False,
|
||||||
label='Object type'
|
label='Object type'
|
||||||
)
|
)
|
||||||
|
region_id = DynamicModelMultipleChoiceField(
|
||||||
|
queryset=Region.objects.all(),
|
||||||
|
required=False,
|
||||||
|
label=_('Region')
|
||||||
|
)
|
||||||
|
site_id = DynamicModelMultipleChoiceField(
|
||||||
|
queryset=Site.objects.all(),
|
||||||
|
required=False,
|
||||||
|
null_option='None',
|
||||||
|
query_params={
|
||||||
|
'region_id': '$region_id'
|
||||||
|
},
|
||||||
|
label=_('Site')
|
||||||
|
)
|
||||||
|
device_id = DynamicModelMultipleChoiceField(
|
||||||
|
queryset=Device.objects.all(),
|
||||||
|
required=False,
|
||||||
|
null_option='None',
|
||||||
|
query_params={
|
||||||
|
'site_id': '$site_id'
|
||||||
|
},
|
||||||
|
label=_('Device')
|
||||||
|
)
|
||||||
|
vlan_id = DynamicModelMultipleChoiceField(
|
||||||
|
queryset=VLAN.objects.all(),
|
||||||
|
required=False,
|
||||||
|
null_option='None',
|
||||||
|
query_params={
|
||||||
|
'site_id': '$site_id'
|
||||||
|
},
|
||||||
|
label=_('VLAN')
|
||||||
|
)
|
||||||
|
virtual_machine_id = DynamicModelMultipleChoiceField(
|
||||||
|
queryset=VirtualMachine.objects.all(),
|
||||||
|
required=False,
|
||||||
|
null_option='None',
|
||||||
|
query_params={
|
||||||
|
'site_id': '$site_id'
|
||||||
|
},
|
||||||
|
label=_('Virtual Machine')
|
||||||
|
)
|
||||||
|
@@ -113,3 +113,18 @@ class L2VPNTermination(NetBoxModel):
|
|||||||
f'{l2vpn_type} L2VPNs cannot have more than two terminations; found {terminations_count} already '
|
f'{l2vpn_type} L2VPNs cannot have more than two terminations; found {terminations_count} already '
|
||||||
f'defined.'
|
f'defined.'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def assigned_object_parent(self):
|
||||||
|
obj_type = ContentType.objects.get_for_model(self.assigned_object)
|
||||||
|
if obj_type.model == 'vminterface':
|
||||||
|
return self.assigned_object.virtual_machine
|
||||||
|
elif obj_type.model == 'interface':
|
||||||
|
return self.assigned_object.device
|
||||||
|
elif obj_type.model == 'vminterface':
|
||||||
|
return self.assigned_object.virtual_machine
|
||||||
|
return None
|
||||||
|
|
||||||
|
@property
|
||||||
|
def assigned_object_site(self):
|
||||||
|
return self.assigned_object_parent.site
|
||||||
|
@@ -53,8 +53,17 @@ class L2VPNTerminationTable(NetBoxTable):
|
|||||||
linkify=True,
|
linkify=True,
|
||||||
orderable=False
|
orderable=False
|
||||||
)
|
)
|
||||||
|
assigned_object_parent = tables.Column(
|
||||||
|
linkify=True,
|
||||||
|
orderable=False
|
||||||
|
)
|
||||||
|
assigned_object_site = tables.Column(
|
||||||
|
linkify=True,
|
||||||
|
orderable=False
|
||||||
|
)
|
||||||
|
|
||||||
class Meta(NetBoxTable.Meta):
|
class Meta(NetBoxTable.Meta):
|
||||||
model = L2VPNTermination
|
model = L2VPNTermination
|
||||||
fields = ('pk', 'l2vpn', 'assigned_object_type', 'assigned_object', 'actions')
|
fields = ('pk', 'l2vpn', 'assigned_object_type', 'assigned_object', 'assigned_object_parent',
|
||||||
|
'assigned_object_site', 'actions')
|
||||||
default_columns = ('pk', 'l2vpn', 'assigned_object_type', 'assigned_object', 'actions')
|
default_columns = ('pk', 'l2vpn', 'assigned_object_type', 'assigned_object', 'actions')
|
||||||
|
Reference in New Issue
Block a user