|
1 | 1 | from typing import Annotated, TYPE_CHECKING
|
2 | 2 |
|
| 3 | +from django.db.models import Q |
3 | 4 | import strawberry
|
4 | 5 | import strawberry_django
|
5 | 6 | from strawberry.scalars import ID
|
6 | 7 | from strawberry_django import FilterLookup
|
7 | 8 |
|
8 | 9 | from core.graphql.filter_mixins import ChangeLogFilterMixin
|
9 | 10 | from dcim import models
|
| 11 | +from dcim.constants import * |
| 12 | +from dcim.graphql.enums import InterfaceKindEnum |
10 | 13 | from extras.graphql.filter_mixins import ConfigContextFilterMixin
|
11 | 14 | from netbox.graphql.filter_mixins import (
|
12 | 15 | PrimaryModelFilterMixin,
|
@@ -485,6 +488,27 @@ class InterfaceFilter(ModularComponentModelFilterMixin, InterfaceBaseFilterMixin
|
485 | 488 | strawberry_django.filter_field()
|
486 | 489 | )
|
487 | 490 |
|
| 491 | + @strawberry_django.filter_field |
| 492 | + def connected(self, queryset, value: bool, prefix: str): |
| 493 | + if value is True: |
| 494 | + return queryset, Q(**{f"{prefix}_path__is_active": True}) |
| 495 | + else: |
| 496 | + return queryset, Q(**{f"{prefix}_path__isnull": True}) | Q(**{f"{prefix}_path__is_active": False}) |
| 497 | + |
| 498 | + @strawberry_django.filter_field |
| 499 | + def kind( |
| 500 | + self, |
| 501 | + queryset, |
| 502 | + value: Annotated['InterfaceKindEnum', strawberry.lazy('dcim.graphql.enums')], |
| 503 | + prefix: str |
| 504 | + ): |
| 505 | + if value == InterfaceKindEnum.KIND_PHYSICAL: |
| 506 | + return queryset, ~Q(**{f"{prefix}type__in": NONCONNECTABLE_IFACE_TYPES}) |
| 507 | + elif value == InterfaceKindEnum.KIND_VIRTUAL: |
| 508 | + return queryset, Q(**{f"{prefix}type__in": VIRTUAL_IFACE_TYPES}) |
| 509 | + elif value == InterfaceKindEnum.KIND_WIRELESS: |
| 510 | + return queryset, Q(**{f"{prefix}type__in": WIRELESS_IFACE_TYPES}) |
| 511 | + |
488 | 512 |
|
489 | 513 | @strawberry_django.filter_type(models.InterfaceTemplate, lookups=True)
|
490 | 514 | class InterfaceTemplateFilter(ModularComponentTemplateFilterMixin):
|
|
0 commit comments