Skip to content

Commit 6f1d0fc

Browse files
committed
Add termination object filters for cables
1 parent 1f2f086 commit 6f1d0fc

File tree

1 file changed

+67
-0
lines changed

1 file changed

+67
-0
lines changed

netbox/dcim/filtersets.py

+67
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
@@ -1790,6 +1792,35 @@ class CableFilterSet(TenancyFilterSet, NetBoxModelFilterSet):
17901792
field_name='site__slug'
17911793
)
17921794

1795+
# Termination object filters
1796+
consoleport_id = MultiValueNumberFilter(
1797+
method='filter_by_consoleport'
1798+
)
1799+
consoleserverport_id = MultiValueNumberFilter(
1800+
method='filter_by_consoleserverport'
1801+
)
1802+
powerport_id = MultiValueNumberFilter(
1803+
method='filter_by_powerport'
1804+
)
1805+
poweroutlet_id = MultiValueNumberFilter(
1806+
method='filter_by_powerport'
1807+
)
1808+
interface_id = MultiValueNumberFilter(
1809+
method='filter_by_interface'
1810+
)
1811+
frontport_id = MultiValueNumberFilter(
1812+
method='filter_by_frontport'
1813+
)
1814+
rearport_id = MultiValueNumberFilter(
1815+
method='filter_by_rearport'
1816+
)
1817+
powerfeed_id = MultiValueNumberFilter(
1818+
method='filter_by_powerfeed'
1819+
)
1820+
circuittermination_id = MultiValueNumberFilter(
1821+
method='filter_by_circuittermination'
1822+
)
1823+
17931824
class Meta:
17941825
model = Cable
17951826
fields = ['id', 'label', 'length', 'length_unit']
@@ -1829,6 +1860,42 @@ def _unterminated(self, queryset, name, value):
18291860
terminations__cable_end=CableEndChoices.SIDE_B
18301861
)
18311862

1863+
def filter_by_termination_object(self, queryset, model, value):
1864+
# Filter by specific termination object(s)
1865+
content_type = ContentType.objects.get_for_model(model)
1866+
cable_ids = CableTermination.objects.filter(
1867+
termination_type=content_type,
1868+
termination_id__in=value
1869+
).values_list('cable', flat=True)
1870+
return queryset.filter(pk__in=cable_ids)
1871+
1872+
def filter_by_consoleport(self, queryset, name, value):
1873+
return self.filter_by_termination_object(queryset, ConsolePort, value)
1874+
1875+
def filter_by_consoleserverport(self, queryset, name, value):
1876+
return self.filter_by_termination_object(queryset, ConsoleServerPort, value)
1877+
1878+
def filter_by_powerport(self, queryset, name, value):
1879+
return self.filter_by_termination_object(queryset, PowerPort, value)
1880+
1881+
def filter_by_poweroutlet(self, queryset, name, value):
1882+
return self.filter_by_termination_object(queryset, PowerOutlet, value)
1883+
1884+
def filter_by_interface(self, queryset, name, value):
1885+
return self.filter_by_termination_object(queryset, Interface, value)
1886+
1887+
def filter_by_frontport(self, queryset, name, value):
1888+
return self.filter_by_termination_object(queryset, FrontPort, value)
1889+
1890+
def filter_by_rearport(self, queryset, name, value):
1891+
return self.filter_by_termination_object(queryset, RearPort, value)
1892+
1893+
def filter_by_powerfeed(self, queryset, name, value):
1894+
return self.filter_by_termination_object(queryset, PowerFeed, value)
1895+
1896+
def filter_by_circuittermination(self, queryset, name, value):
1897+
return self.filter_by_termination_object(queryset, CircuitTermination, value)
1898+
18321899

18331900
class CableTerminationFilterSet(BaseFilterSet):
18341901
termination_type = ContentTypeFilter()

0 commit comments

Comments
 (0)