|
1 | 1 | import django_filters
|
2 | 2 | from django.contrib.auth import get_user_model
|
| 3 | +from django.contrib.contenttypes.models import ContentType |
3 | 4 | from django.utils.translation import gettext as _
|
4 | 5 |
|
| 6 | +from circuits.models import CircuitTermination |
5 | 7 | from extras.filtersets import LocalConfigContextFilterSet
|
6 | 8 | from extras.models import ConfigTemplate
|
7 | 9 | from ipam.filtersets import PrimaryIPFilterSet
|
@@ -1790,6 +1792,35 @@ class CableFilterSet(TenancyFilterSet, NetBoxModelFilterSet):
|
1790 | 1792 | field_name='site__slug'
|
1791 | 1793 | )
|
1792 | 1794 |
|
| 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 | + |
1793 | 1824 | class Meta:
|
1794 | 1825 | model = Cable
|
1795 | 1826 | fields = ['id', 'label', 'length', 'length_unit']
|
@@ -1829,6 +1860,42 @@ def _unterminated(self, queryset, name, value):
|
1829 | 1860 | terminations__cable_end=CableEndChoices.SIDE_B
|
1830 | 1861 | )
|
1831 | 1862 |
|
| 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 | + |
1832 | 1899 |
|
1833 | 1900 | class CableTerminationFilterSet(BaseFilterSet):
|
1834 | 1901 | termination_type = ContentTypeFilter()
|
|
0 commit comments