mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-29 11:56:25 -06:00
Closes #4869: Enable search by MAC Address
This commit is contained in:
parent
fd564f09d1
commit
23e7fbe94b
@ -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
|
||||||
|
|
||||||
|
@ -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(
|
||||||
|
@ -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')),
|
||||||
|
Loading…
Reference in New Issue
Block a user