Closes #4869: Enable search by MAC Address

This commit is contained in:
kobayashi 2020-08-03 01:52:44 -04:00
parent fd564f09d1
commit 23e7fbe94b
3 changed files with 22 additions and 7 deletions

View File

@ -4,6 +4,7 @@
### Enhancements ### Enhancements
* [#4869](https://github.com/netbox-community/netbox/issues/4869) - Allow global search by MAC address
* [#4898](https://github.com/netbox-community/netbox/issues/4898) - Add MAC address search field to interfaces list * [#4898](https://github.com/netbox-community/netbox/issues/4898) - Add MAC address search field to interfaces list
* [#4899](https://github.com/netbox-community/netbox/issues/4899) - Add MAC address column to interfaces table * [#4899](https://github.com/netbox-community/netbox/issues/4899) - Add MAC address column to interfaces table

View File

@ -741,13 +741,14 @@ class DeviceComponentFilterSet(django_filters.FilterSet):
) )
tag = TagFilter() tag = TagFilter()
def search(self, queryset, name, value): def search(self, queryset, name, value, additional_fields):
if not value.strip(): if not value.strip():
return queryset return queryset
return queryset.filter( fields = ['name__icontains', 'description__icontains']
Q(name__icontains=value) | if additional_fields:
Q(description__icontains=value) fields.extend(additional_fields)
) query_fields = {field: value for field in fields}
return queryset.filter(Q(**query_fields, _connector=Q.OR))
class ConsolePortFilterSet(BaseFilterSet, DeviceComponentFilterSet): class ConsolePortFilterSet(BaseFilterSet, DeviceComponentFilterSet):
@ -911,6 +912,10 @@ class InterfaceFilterSet(BaseFilterSet, DeviceComponentFilterSet):
'wireless': queryset.filter(type__in=WIRELESS_IFACE_TYPES), 'wireless': queryset.filter(type__in=WIRELESS_IFACE_TYPES),
}.get(value, queryset.none()) }.get(value, queryset.none())
def search(self, queryset, name, value):
additional_fields = ['mac_address__icontains']
return super().search(queryset=queryset, name=name, value=value, additional_fields=additional_fields)
class FrontPortFilterSet(BaseFilterSet, DeviceComponentFilterSet): class FrontPortFilterSet(BaseFilterSet, DeviceComponentFilterSet):
cabled = django_filters.BooleanFilter( cabled = django_filters.BooleanFilter(

View File

@ -13,14 +13,14 @@ from circuits.filters import CircuitFilterSet, ProviderFilterSet
from circuits.models import Circuit, Provider from circuits.models import Circuit, Provider
from circuits.tables import CircuitTable, ProviderTable from circuits.tables import CircuitTable, ProviderTable
from dcim.filters import ( from dcim.filters import (
CableFilterSet, DeviceFilterSet, DeviceTypeFilterSet, PowerFeedFilterSet, RackFilterSet, RackGroupFilterSet, SiteFilterSet, CableFilterSet, DeviceFilterSet, DeviceTypeFilterSet, InterfaceFilterSet, PowerFeedFilterSet, RackFilterSet, RackGroupFilterSet, SiteFilterSet,
VirtualChassisFilterSet, VirtualChassisFilterSet,
) )
from dcim.models import ( from dcim.models import (
Cable, ConsolePort, Device, DeviceType, Interface, PowerPanel, PowerFeed, PowerPort, Rack, RackGroup, Site, VirtualChassis Cable, ConsolePort, Device, DeviceType, Interface, PowerPanel, PowerFeed, PowerPort, Rack, RackGroup, Site, VirtualChassis
) )
from dcim.tables import ( from dcim.tables import (
CableTable, DeviceTable, DeviceTypeTable, PowerFeedTable, RackTable, RackGroupTable, SiteTable, CableTable, DeviceTable, DeviceTypeTable, InterfaceDetailTable, PowerFeedTable, RackTable, RackGroupTable, SiteTable,
VirtualChassisTable, VirtualChassisTable,
) )
from extras.models import ObjectChange, ReportResult from extras.models import ObjectChange, ReportResult
@ -96,6 +96,15 @@ SEARCH_TYPES = OrderedDict((
'table': DeviceTable, 'table': DeviceTable,
'url': 'dcim:device_list', 'url': 'dcim:device_list',
}), }),
('interface', {
'permission': 'dcim.view_interface',
'queryset': Interface.objects.prefetch_related(
'device', 'virtual_machine',
),
'filterset': InterfaceFilterSet,
'table': InterfaceDetailTable,
'url': 'dcim:interface_list',
}),
('virtualchassis', { ('virtualchassis', {
'permission': 'dcim.view_virtualchassis', 'permission': 'dcim.view_virtualchassis',
'queryset': VirtualChassis.objects.prefetch_related('master').annotate(member_count=Count('members')), 'queryset': VirtualChassis.objects.prefetch_related('master').annotate(member_count=Count('members')),