Skip to content

Commit f94a862

Browse files
committed
Add termination object filters for cables
1 parent d9c1ba8 commit f94a862

File tree

1 file changed

+67
-0
lines changed

1 file changed

+67
-0
lines changed

netbox/dcim/filtersets.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import django_filters
22
from django.contrib.auth import get_user_model
3+
from django.contrib.contenttypes.models import ContentType
34
from django.utils.translation import gettext as _
45

6+
from circuits.models import CircuitTermination
57
from extras.filtersets import LocalConfigContextFilterSet
68
from extras.models import ConfigTemplate
79
from ipam.filtersets import PrimaryIPFilterSet
@@ -1804,6 +1806,35 @@ class CableFilterSet(TenancyFilterSet, NetBoxModelFilterSet):
18041806
field_name='site__slug'
18051807
)
18061808

1809+
# Termination object filters
1810+
consoleport_id = MultiValueNumberFilter(
1811+
method='filter_by_consoleport'
1812+
)
1813+
consoleserverport_id = MultiValueNumberFilter(
1814+
method='filter_by_consoleserverport'
1815+
)
1816+
powerport_id = MultiValueNumberFilter(
1817+
method='filter_by_powerport'
1818+
)
1819+
poweroutlet_id = MultiValueNumberFilter(
1820+
method='filter_by_powerport'
1821+
)
1822+
interface_id = MultiValueNumberFilter(
1823+
method='filter_by_interface'
1824+
)
1825+
frontport_id = MultiValueNumberFilter(
1826+
method='filter_by_frontport'
1827+
)
1828+
rearport_id = MultiValueNumberFilter(
1829+
method='filter_by_rearport'
1830+
)
1831+
powerfeed_id = MultiValueNumberFilter(
1832+
method='filter_by_powerfeed'
1833+
)
1834+
circuittermination_id = MultiValueNumberFilter(
1835+
method='filter_by_circuittermination'
1836+
)
1837+
18071838
class Meta:
18081839
model = Cable
18091840
fields = ['id', 'label', 'length', 'length_unit', 'description']
@@ -1847,6 +1878,42 @@ def _unterminated(self, queryset, name, value):
18471878
terminations__cable_end=CableEndChoices.SIDE_B
18481879
)
18491880

1881+
def filter_by_termination_object(self, queryset, model, value):
1882+
# Filter by specific termination object(s)
1883+
content_type = ContentType.objects.get_for_model(model)
1884+
cable_ids = CableTermination.objects.filter(
1885+
termination_type=content_type,
1886+
termination_id__in=value
1887+
).values_list('cable', flat=True)
1888+
return queryset.filter(pk__in=cable_ids)
1889+
1890+
def filter_by_consoleport(self, queryset, name, value):
1891+
return self.filter_by_termination_object(queryset, ConsolePort, value)
1892+
1893+
def filter_by_consoleserverport(self, queryset, name, value):
1894+
return self.filter_by_termination_object(queryset, ConsoleServerPort, value)
1895+
1896+
def filter_by_powerport(self, queryset, name, value):
1897+
return self.filter_by_termination_object(queryset, PowerPort, value)
1898+
1899+
def filter_by_poweroutlet(self, queryset, name, value):
1900+
return self.filter_by_termination_object(queryset, PowerOutlet, value)
1901+
1902+
def filter_by_interface(self, queryset, name, value):
1903+
return self.filter_by_termination_object(queryset, Interface, value)
1904+
1905+
def filter_by_frontport(self, queryset, name, value):
1906+
return self.filter_by_termination_object(queryset, FrontPort, value)
1907+
1908+
def filter_by_rearport(self, queryset, name, value):
1909+
return self.filter_by_termination_object(queryset, RearPort, value)
1910+
1911+
def filter_by_powerfeed(self, queryset, name, value):
1912+
return self.filter_by_termination_object(queryset, PowerFeed, value)
1913+
1914+
def filter_by_circuittermination(self, queryset, name, value):
1915+
return self.filter_by_termination_object(queryset, CircuitTermination, value)
1916+
18501917

18511918
class CableTerminationFilterSet(BaseFilterSet):
18521919
termination_type = ContentTypeFilter()

0 commit comments

Comments
 (0)