mirror of
https://github.com/netbox-community/netbox.git
synced 2026-01-10 05:42:16 -06:00
Compare commits
46 Commits
v4.5-beta1
...
5bf34b0c32
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5bf34b0c32 | ||
|
|
0319fd599a | ||
|
|
6c94d8d49b | ||
|
|
35de0c59cd | ||
|
|
44362dc191 | ||
|
|
d9e4c78dcc | ||
|
|
f84ccb6e85 | ||
|
|
e18a0f4dde | ||
|
|
1923d889f5 | ||
|
|
197f94a6ef | ||
|
|
575dcea478 | ||
|
|
42df6be604 | ||
|
|
9d60342ec7 | ||
|
|
edbcea817c | ||
|
|
860bdae1e9 | ||
|
|
d4f0eeb0a7 | ||
|
|
39e1eefe36 | ||
|
|
078231a46b | ||
|
|
fba56d3704 | ||
|
|
9de61fe1a8 | ||
|
|
c2bd57eecf | ||
|
|
ab5005ec09 | ||
|
|
84ba09bf02 | ||
|
|
ee6a3a495b | ||
|
|
5664684530 | ||
|
|
562334eac8 | ||
|
|
560dcb6af1 | ||
|
|
ac74d9f9be | ||
|
|
05e1317f5e | ||
|
|
c8af43f3f2 | ||
|
|
b410b4e107 | ||
|
|
4ca4983204 | ||
|
|
fd9a6b958b | ||
|
|
99781888d3 | ||
|
|
b6fe79e647 | ||
|
|
44a1e45fe0 | ||
|
|
93b934701d | ||
|
|
c0de8748a2 | ||
|
|
e7ad66f2ef | ||
|
|
067c670243 | ||
|
|
9cb7f4b9ad | ||
|
|
8d191b5d5b | ||
|
|
aeb6024502 | ||
|
|
5458873cdc | ||
|
|
ad96fb3ab4 | ||
|
|
fd67acc3ab |
@@ -325,14 +325,14 @@ class CircuitTypeType(OrganizationalObjectType):
|
|||||||
|
|
||||||
### Change filters.py
|
### Change filters.py
|
||||||
|
|
||||||
Filter classes should inherit from `netbox.graphql.filters.BaseModelFilter`.
|
Strawberry currently doesn't directly support django-filter, so an explicit filters.py file will need to be created. NetBox includes a new `autotype_decorator` used to automatically wrap FilterSets to reduce the required code to a minimum.
|
||||||
|
|
||||||
```python title="New"
|
```python title="New"
|
||||||
import strawberry
|
import strawberry
|
||||||
import strawberry_django
|
import strawberry_django
|
||||||
from circuits import filtersets, models
|
from circuits import filtersets, models
|
||||||
|
|
||||||
from netbox.graphql.filters import BaseModelFilter
|
from netbox.graphql.filter_mixins import autotype_decorator, BaseFilterMixin
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
'CircuitFilter',
|
'CircuitFilter',
|
||||||
@@ -340,7 +340,8 @@ __all__ = (
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter(models.Circuit, lookups=True)
|
@strawberry_django.filter(models.Circuit, lookups=True)
|
||||||
class CircuitFilter(BaseModelFilter):
|
@autotype_decorator(filtersets.CircuitFilterSet)
|
||||||
|
class CircuitFilter(BaseFilterMixin):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -1,111 +0,0 @@
|
|||||||
## v4.5.0 (FUTURE)
|
|
||||||
|
|
||||||
### Breaking Changes
|
|
||||||
|
|
||||||
* Python 3.10 and 3.11 are no longer supported. NetBox now requires Python 3.12 or later.
|
|
||||||
* GraphQL API queries which filter by object IDs or enums must now specify a filter lookup similar to other fields. (For example, `id: 123` becomes `id: {exact: 123 }`.)
|
|
||||||
* Rendering a device or virtual machine configuration is now restricted to users with the `render_config` permission for the applicable object type.
|
|
||||||
* Retrieval of API token plaintexts is no longer supported. The `ALLOW_TOKEN_RETRIEVAL` config parameter has been removed.
|
|
||||||
* The owner of an API token can no longer be changed once it has been created.
|
|
||||||
* Config contexts now apply to all child platforms of a parent platform.
|
|
||||||
* The `/api/extras/object-types/` REST API endpoint has been removed. (Use `/api/core/object-types/` instead.)
|
|
||||||
* The `/api/dcim/cable-terminations/` REST API endpoint is now read-only. Cable terminations must be set on cables directly.
|
|
||||||
* The UI view dedicated to swaping A/Z circuit terminations has been removed.
|
|
||||||
* Webhooks no longer specify a `model` in payload data. (Reference `object_type` instead, which includes the parent app label.)
|
|
||||||
* The obsolete module `core.models.contenttypes` has been removed (replaced in v4.4 by `core.models.object_types`).
|
|
||||||
* The `load_yaml()` and `load_json()` utility methods have been removed from the base class for custom scripts.
|
|
||||||
* The experimental HTMX navigation feature has been removed.
|
|
||||||
* The obsolete field `is_staff` has been removed from the `User` model.
|
|
||||||
|
|
||||||
### New Features
|
|
||||||
|
|
||||||
#### Lookup Modifiers in Filter Forms ([#7604](https://github.com/netbox-community/netbox/issues/7604))
|
|
||||||
|
|
||||||
#### Improved API Authentication Tokens ([#20210](https://github.com/netbox-community/netbox/issues/20210))
|
|
||||||
|
|
||||||
#### Object Ownership ([#20304](https://github.com/netbox-community/netbox/issues/20304))
|
|
||||||
|
|
||||||
#### Advanced Port Mappings ([#20564](https://github.com/netbox-community/netbox/issues/20564))
|
|
||||||
|
|
||||||
#### Cable Profiles ([#20788](https://github.com/netbox-community/netbox/issues/20788))
|
|
||||||
|
|
||||||
### Enhancements
|
|
||||||
|
|
||||||
* [#16681](https://github.com/netbox-community/netbox/issues/16681) - Introduce a `render_config` permission, which is noq required to render a device or virtual machine configuration
|
|
||||||
* [#18658](https://github.com/netbox-community/netbox/issues/18658) - Add a `start_on_boot` choice field for virtual machines
|
|
||||||
* [#19095](https://github.com/netbox-community/netbox/issues/19095) - Add support for Python 3.13 and 3.14
|
|
||||||
* [#19338](https://github.com/netbox-community/netbox/issues/19338) - Enable filter lookups for object IDs and enums in GraphQL API queries
|
|
||||||
* [#19523](https://github.com/netbox-community/netbox/issues/19523) - Cache the number of instances for device, module, and rack types, and enable filtering by these counts
|
|
||||||
* [#20417](https://github.com/netbox-community/netbox/issues/20417) - Add an optional `color` field for device type power outlets
|
|
||||||
* [#20476](https://github.com/netbox-community/netbox/issues/20476) - Once provisioned, the owner of an API token cannot be changed
|
|
||||||
* [#20492](https://github.com/netbox-community/netbox/issues/20492) - Completely disabled the means to retrieve legacy API token plaintexts (removed the `ALLOW_TOKEN_RETRIEVAL` config parameter)
|
|
||||||
* [#20639](https://github.com/netbox-community/netbox/issues/20639) - Apply config contexts to devices/VMs assigned any child platform of the parent platform
|
|
||||||
* [#20834](https://github.com/netbox-community/netbox/issues/20834) - Add an `enabled` boolean field to API tokens
|
|
||||||
* [#20917](https://github.com/netbox-community/netbox/issues/20917) - Include usage reference on API token views
|
|
||||||
* [#20925](https://github.com/netbox-community/netbox/issues/20925) - Add optional `comments` field to all subclasses of `OrganizationalModel`
|
|
||||||
* [#20936](https://github.com/netbox-community/netbox/issues/20936) - Introduce the `/api/authentication-check/` REST API endpoint for validating authentication tokens
|
|
||||||
|
|
||||||
### Plugins
|
|
||||||
|
|
||||||
* [#13182](https://github.com/netbox-community/netbox/issues/13182) - Added `PrimaryModel`, `OrganizationalModel`, and `NestedGroupModel` to the plugins API, as well as their respective base classes for various resources
|
|
||||||
|
|
||||||
### Other Changes
|
|
||||||
|
|
||||||
* [#16137](https://github.com/netbox-community/netbox/issues/16137) - Remove the obsolete boolean field `is_staff` from the `User` model
|
|
||||||
* [#17571](https://github.com/netbox-community/netbox/issues/17571) - Remove the experimental HTMX navigation feature
|
|
||||||
* [#17936](https://github.com/netbox-community/netbox/issues/17936) - Introduce a dedicated `GFKSerializerField` for representing generic foreign keys in API serializers
|
|
||||||
* [#19889](https://github.com/netbox-community/netbox/issues/19889) - Drop support for Python 3.10 and 3.11
|
|
||||||
* [#19898](https://github.com/netbox-community/netbox/issues/19898) - Remove the obsolete REST API endpoint `/api/extras/object-types/`
|
|
||||||
* [#20088](https://github.com/netbox-community/netbox/issues/20088) - Remove the non-deterministic `model` key from webhook payload data
|
|
||||||
* [#20095](https://github.com/netbox-community/netbox/issues/20095) - Remove the obsolete module `core.models.contenttypes`
|
|
||||||
* [#20096](https://github.com/netbox-community/netbox/issues/20096) - Remove the `load_yaml()` and `load_json()` utility methods from the `BaseScript` class
|
|
||||||
* [#20204](https://github.com/netbox-community/netbox/issues/20204) - Started migrating object views from custom HTML templates to declarative layouts
|
|
||||||
* [#20617](https://github.com/netbox-community/netbox/issues/20617) - Introduce `BaseModel` as the global base class for models
|
|
||||||
* [#20683](https://github.com/netbox-community/netbox/issues/20683) - Remove the UI view dedicated to swaping A/Z circuit terminations
|
|
||||||
* [#20926](https://github.com/netbox-community/netbox/issues/20926) - Standardize naming of GraphQL filters
|
|
||||||
|
|
||||||
### REST API Changes
|
|
||||||
|
|
||||||
* Most objects now include an optional `owner` foreign key field.
|
|
||||||
* The `/api/dcim/cable-terminations` endpoint is now read-only.
|
|
||||||
* Introduced the `/api/authentication-check/` endpoint.
|
|
||||||
* `circuits.CircuitGroup`
|
|
||||||
* Add optional `comments` field
|
|
||||||
* `circuits.CircuitType`
|
|
||||||
* Add optional `comments` field
|
|
||||||
* `circuits.VirtualCircuitType`
|
|
||||||
* Add optional `comments` field
|
|
||||||
* `dcim.Cable`
|
|
||||||
* Add the optional `profile` choice field
|
|
||||||
* `dcim.InventoryItemRole`
|
|
||||||
* Add optional `comments` field
|
|
||||||
* `dcim.Manufacturer`
|
|
||||||
* Add optional `comments` field
|
|
||||||
* `dcim.ModuleType`
|
|
||||||
* Add read-only `module_count` integer field
|
|
||||||
* `dcim.PowerOutletTemplate`
|
|
||||||
* Add optional `color` field
|
|
||||||
* `dcim.RackRole`
|
|
||||||
* Add optional `comments` field
|
|
||||||
* `dcim.RackType`
|
|
||||||
* Add read-only `rack_count` integer field
|
|
||||||
* `ipam.ASNRange`
|
|
||||||
* Add optional `comments` field
|
|
||||||
* `ipam.RIR`
|
|
||||||
* Add optional `comments` field
|
|
||||||
* `ipam.Role`
|
|
||||||
* Add optional `comments` field
|
|
||||||
* `ipam.VLANGroup`
|
|
||||||
* Add optional `comments` field
|
|
||||||
* `tenancy.ContactRole`
|
|
||||||
* Add optional `comments` field
|
|
||||||
* `users.Token`
|
|
||||||
* Add `enabled` boolean field
|
|
||||||
* `virtualization.ClusterGroup`
|
|
||||||
* Add optional `comments` field
|
|
||||||
* `virtualization.ClusterType`
|
|
||||||
* Add optional `comments` field
|
|
||||||
* `virtualization.VirtualMachine`
|
|
||||||
* Add optional `start_on_boot` choice field
|
|
||||||
* `vpn.TunnelGroup`
|
|
||||||
* Add optional `comments` field
|
|
||||||
@@ -3,18 +3,17 @@ from typing import Annotated, TYPE_CHECKING
|
|||||||
|
|
||||||
import strawberry
|
import strawberry
|
||||||
import strawberry_django
|
import strawberry_django
|
||||||
from strawberry_django import BaseFilterLookup
|
|
||||||
|
from netbox.graphql.filter_mixins import OrganizationalModelFilterMixin
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from netbox.graphql.enums import ColorEnum
|
from netbox.graphql.enums import ColorEnum
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
'CircuitTypeFilterMixin',
|
'BaseCircuitTypeFilterMixin',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class CircuitTypeFilterMixin:
|
class BaseCircuitTypeFilterMixin(OrganizationalModelFilterMixin):
|
||||||
color: BaseFilterLookup[Annotated['ColorEnum', strawberry.lazy('netbox.graphql.enums')]] | None = (
|
color: Annotated['ColorEnum', strawberry.lazy('netbox.graphql.enums')] | None = strawberry_django.filter_field()
|
||||||
strawberry_django.filter_field()
|
|
||||||
)
|
|
||||||
|
|||||||
@@ -7,12 +7,17 @@ from strawberry.scalars import ID
|
|||||||
from strawberry_django import BaseFilterLookup, FilterLookup, DateFilterLookup
|
from strawberry_django import BaseFilterLookup, FilterLookup, DateFilterLookup
|
||||||
|
|
||||||
from circuits import models
|
from circuits import models
|
||||||
from circuits.graphql.filter_mixins import CircuitTypeFilterMixin
|
from core.graphql.filter_mixins import BaseObjectTypeFilterMixin, ChangeLogFilterMixin
|
||||||
from dcim.graphql.filter_mixins import CabledObjectModelFilterMixin
|
from dcim.graphql.filter_mixins import CabledObjectModelFilterMixin
|
||||||
from extras.graphql.filter_mixins import CustomFieldsFilterMixin, TagsFilterMixin
|
from extras.graphql.filter_mixins import CustomFieldsFilterMixin, TagsFilterMixin
|
||||||
from netbox.graphql.filter_mixins import DistanceFilterMixin, ImageAttachmentFilterMixin
|
from netbox.graphql.filter_mixins import (
|
||||||
from netbox.graphql.filters import ChangeLoggedModelFilter, OrganizationalModelFilter, PrimaryModelFilter
|
DistanceFilterMixin,
|
||||||
|
ImageAttachmentFilterMixin,
|
||||||
|
OrganizationalModelFilterMixin,
|
||||||
|
PrimaryModelFilterMixin,
|
||||||
|
)
|
||||||
from tenancy.graphql.filter_mixins import ContactFilterMixin, TenancyFilterMixin
|
from tenancy.graphql.filter_mixins import ContactFilterMixin, TenancyFilterMixin
|
||||||
|
from .filter_mixins import BaseCircuitTypeFilterMixin
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from core.graphql.filters import ContentTypeFilter
|
from core.graphql.filters import ContentTypeFilter
|
||||||
@@ -38,9 +43,10 @@ __all__ = (
|
|||||||
|
|
||||||
@strawberry_django.filter_type(models.CircuitTermination, lookups=True)
|
@strawberry_django.filter_type(models.CircuitTermination, lookups=True)
|
||||||
class CircuitTerminationFilter(
|
class CircuitTerminationFilter(
|
||||||
|
BaseObjectTypeFilterMixin,
|
||||||
CustomFieldsFilterMixin,
|
CustomFieldsFilterMixin,
|
||||||
TagsFilterMixin,
|
TagsFilterMixin,
|
||||||
ChangeLoggedModelFilter,
|
ChangeLogFilterMixin,
|
||||||
CabledObjectModelFilterMixin,
|
CabledObjectModelFilterMixin,
|
||||||
):
|
):
|
||||||
circuit: Annotated['CircuitFilter', strawberry.lazy('circuits.graphql.filters')] | None = (
|
circuit: Annotated['CircuitFilter', strawberry.lazy('circuits.graphql.filters')] | None = (
|
||||||
@@ -89,7 +95,7 @@ class CircuitFilter(
|
|||||||
ImageAttachmentFilterMixin,
|
ImageAttachmentFilterMixin,
|
||||||
DistanceFilterMixin,
|
DistanceFilterMixin,
|
||||||
TenancyFilterMixin,
|
TenancyFilterMixin,
|
||||||
PrimaryModelFilter
|
PrimaryModelFilterMixin
|
||||||
):
|
):
|
||||||
cid: FilterLookup[str] | None = strawberry_django.filter_field()
|
cid: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
provider: Annotated['ProviderFilter', strawberry.lazy('circuits.graphql.filters')] | None = (
|
provider: Annotated['ProviderFilter', strawberry.lazy('circuits.graphql.filters')] | None = (
|
||||||
@@ -118,17 +124,19 @@ class CircuitFilter(
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.CircuitType, lookups=True)
|
@strawberry_django.filter_type(models.CircuitType, lookups=True)
|
||||||
class CircuitTypeFilter(CircuitTypeFilterMixin, OrganizationalModelFilter):
|
class CircuitTypeFilter(BaseCircuitTypeFilterMixin):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.CircuitGroup, lookups=True)
|
@strawberry_django.filter_type(models.CircuitGroup, lookups=True)
|
||||||
class CircuitGroupFilter(TenancyFilterMixin, OrganizationalModelFilter):
|
class CircuitGroupFilter(TenancyFilterMixin, OrganizationalModelFilterMixin):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.CircuitGroupAssignment, lookups=True)
|
@strawberry_django.filter_type(models.CircuitGroupAssignment, lookups=True)
|
||||||
class CircuitGroupAssignmentFilter(CustomFieldsFilterMixin, TagsFilterMixin, ChangeLoggedModelFilter):
|
class CircuitGroupAssignmentFilter(
|
||||||
|
BaseObjectTypeFilterMixin, CustomFieldsFilterMixin, TagsFilterMixin, ChangeLogFilterMixin
|
||||||
|
):
|
||||||
member_type: Annotated['ContentTypeFilter', strawberry.lazy('core.graphql.filters')] | None = (
|
member_type: Annotated['ContentTypeFilter', strawberry.lazy('core.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -143,7 +151,7 @@ class CircuitGroupAssignmentFilter(CustomFieldsFilterMixin, TagsFilterMixin, Cha
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.Provider, lookups=True)
|
@strawberry_django.filter_type(models.Provider, lookups=True)
|
||||||
class ProviderFilter(ContactFilterMixin, PrimaryModelFilter):
|
class ProviderFilter(ContactFilterMixin, PrimaryModelFilterMixin):
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
slug: FilterLookup[str] | None = strawberry_django.filter_field()
|
slug: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
asns: Annotated['ASNFilter', strawberry.lazy('ipam.graphql.filters')] | None = strawberry_django.filter_field()
|
asns: Annotated['ASNFilter', strawberry.lazy('ipam.graphql.filters')] | None = strawberry_django.filter_field()
|
||||||
@@ -153,7 +161,7 @@ class ProviderFilter(ContactFilterMixin, PrimaryModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.ProviderAccount, lookups=True)
|
@strawberry_django.filter_type(models.ProviderAccount, lookups=True)
|
||||||
class ProviderAccountFilter(ContactFilterMixin, PrimaryModelFilter):
|
class ProviderAccountFilter(ContactFilterMixin, PrimaryModelFilterMixin):
|
||||||
provider: Annotated['ProviderFilter', strawberry.lazy('circuits.graphql.filters')] | None = (
|
provider: Annotated['ProviderFilter', strawberry.lazy('circuits.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -163,7 +171,7 @@ class ProviderAccountFilter(ContactFilterMixin, PrimaryModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.ProviderNetwork, lookups=True)
|
@strawberry_django.filter_type(models.ProviderNetwork, lookups=True)
|
||||||
class ProviderNetworkFilter(PrimaryModelFilter):
|
class ProviderNetworkFilter(PrimaryModelFilterMixin):
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
provider: Annotated['ProviderFilter', strawberry.lazy('circuits.graphql.filters')] | None = (
|
provider: Annotated['ProviderFilter', strawberry.lazy('circuits.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
@@ -173,12 +181,12 @@ class ProviderNetworkFilter(PrimaryModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.VirtualCircuitType, lookups=True)
|
@strawberry_django.filter_type(models.VirtualCircuitType, lookups=True)
|
||||||
class VirtualCircuitTypeFilter(CircuitTypeFilterMixin, OrganizationalModelFilter):
|
class VirtualCircuitTypeFilter(BaseCircuitTypeFilterMixin):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.VirtualCircuit, lookups=True)
|
@strawberry_django.filter_type(models.VirtualCircuit, lookups=True)
|
||||||
class VirtualCircuitFilter(TenancyFilterMixin, PrimaryModelFilter):
|
class VirtualCircuitFilter(TenancyFilterMixin, PrimaryModelFilterMixin):
|
||||||
cid: FilterLookup[str] | None = strawberry_django.filter_field()
|
cid: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
provider_network: Annotated['ProviderNetworkFilter', strawberry.lazy('circuits.graphql.filters')] | None = (
|
provider_network: Annotated['ProviderNetworkFilter', strawberry.lazy('circuits.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
@@ -201,7 +209,9 @@ class VirtualCircuitFilter(TenancyFilterMixin, PrimaryModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.VirtualCircuitTermination, lookups=True)
|
@strawberry_django.filter_type(models.VirtualCircuitTermination, lookups=True)
|
||||||
class VirtualCircuitTerminationFilter(CustomFieldsFilterMixin, TagsFilterMixin, ChangeLoggedModelFilter):
|
class VirtualCircuitTerminationFilter(
|
||||||
|
BaseObjectTypeFilterMixin, CustomFieldsFilterMixin, TagsFilterMixin, ChangeLogFilterMixin
|
||||||
|
):
|
||||||
virtual_circuit: Annotated['VirtualCircuitFilter', strawberry.lazy('circuits.graphql.filters')] | None = (
|
virtual_circuit: Annotated['VirtualCircuitFilter', strawberry.lazy('circuits.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -4,18 +4,31 @@ from typing import Annotated, TYPE_CHECKING
|
|||||||
|
|
||||||
import strawberry
|
import strawberry
|
||||||
import strawberry_django
|
import strawberry_django
|
||||||
from strawberry_django import DatetimeFilterLookup
|
from strawberry import ID
|
||||||
|
from strawberry_django import FilterLookup, DatetimeFilterLookup
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from .filters import *
|
from .filters import *
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
'ChangeLoggingMixin',
|
'BaseFilterMixin',
|
||||||
|
'BaseObjectTypeFilterMixin',
|
||||||
|
'ChangeLogFilterMixin',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# @strawberry.input
|
||||||
|
class BaseFilterMixin: ...
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class ChangeLoggingMixin:
|
class BaseObjectTypeFilterMixin(BaseFilterMixin):
|
||||||
|
id: FilterLookup[ID] | None = strawberry_django.filter_field()
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class ChangeLogFilterMixin(BaseFilterMixin):
|
||||||
|
id: FilterLookup[ID] | None = strawberry_django.filter_field()
|
||||||
# TODO: "changelog" is not a valid field name; needs to be updated for ObjectChange
|
# TODO: "changelog" is not a valid field name; needs to be updated for ObjectChange
|
||||||
changelog: Annotated['ObjectChangeFilter', strawberry.lazy('core.graphql.filters')] | None = (
|
changelog: Annotated['ObjectChangeFilter', strawberry.lazy('core.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
|
|||||||
@@ -8,7 +8,8 @@ from strawberry.scalars import ID
|
|||||||
from strawberry_django import BaseFilterLookup, DatetimeFilterLookup, FilterLookup
|
from strawberry_django import BaseFilterLookup, DatetimeFilterLookup, FilterLookup
|
||||||
|
|
||||||
from core import models
|
from core import models
|
||||||
from netbox.graphql.filters import BaseModelFilter, PrimaryModelFilter
|
from core.graphql.filter_mixins import BaseFilterMixin
|
||||||
|
from netbox.graphql.filter_mixins import PrimaryModelFilterMixin
|
||||||
from .enums import *
|
from .enums import *
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
@@ -24,7 +25,8 @@ __all__ = (
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.DataFile, lookups=True)
|
@strawberry_django.filter_type(models.DataFile, lookups=True)
|
||||||
class DataFileFilter(BaseModelFilter):
|
class DataFileFilter(BaseFilterMixin):
|
||||||
|
id: FilterLookup[ID] | None = strawberry_django.filter_field()
|
||||||
created: DatetimeFilterLookup[datetime] | None = strawberry_django.filter_field()
|
created: DatetimeFilterLookup[datetime] | None = strawberry_django.filter_field()
|
||||||
last_updated: DatetimeFilterLookup[datetime] | None = strawberry_django.filter_field()
|
last_updated: DatetimeFilterLookup[datetime] | None = strawberry_django.filter_field()
|
||||||
source: Annotated['DataSourceFilter', strawberry.lazy('core.graphql.filters')] | None = (
|
source: Annotated['DataSourceFilter', strawberry.lazy('core.graphql.filters')] | None = (
|
||||||
@@ -39,7 +41,7 @@ class DataFileFilter(BaseModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.DataSource, lookups=True)
|
@strawberry_django.filter_type(models.DataSource, lookups=True)
|
||||||
class DataSourceFilter(PrimaryModelFilter):
|
class DataSourceFilter(PrimaryModelFilterMixin):
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
type: FilterLookup[str] | None = strawberry_django.filter_field()
|
type: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
source_url: FilterLookup[str] | None = strawberry_django.filter_field()
|
source_url: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
@@ -58,7 +60,8 @@ class DataSourceFilter(PrimaryModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.ObjectChange, lookups=True)
|
@strawberry_django.filter_type(models.ObjectChange, lookups=True)
|
||||||
class ObjectChangeFilter(BaseModelFilter):
|
class ObjectChangeFilter(BaseFilterMixin):
|
||||||
|
id: FilterLookup[ID] | None = strawberry_django.filter_field()
|
||||||
time: DatetimeFilterLookup[datetime] | None = strawberry_django.filter_field()
|
time: DatetimeFilterLookup[datetime] | None = strawberry_django.filter_field()
|
||||||
user: Annotated['UserFilter', strawberry.lazy('users.graphql.filters')] | None = strawberry_django.filter_field()
|
user: Annotated['UserFilter', strawberry.lazy('users.graphql.filters')] | None = strawberry_django.filter_field()
|
||||||
user_name: FilterLookup[str] | None = strawberry_django.filter_field()
|
user_name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
@@ -85,6 +88,7 @@ class ObjectChangeFilter(BaseModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(DjangoContentType, lookups=True)
|
@strawberry_django.filter_type(DjangoContentType, lookups=True)
|
||||||
class ContentTypeFilter(BaseModelFilter):
|
class ContentTypeFilter(BaseFilterMixin):
|
||||||
|
id: FilterLookup[ID] | None = strawberry_django.filter_field()
|
||||||
app_label: FilterLookup[str] | None = strawberry_django.filter_field()
|
app_label: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
model: FilterLookup[str] | None = strawberry_django.filter_field()
|
model: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
|
|||||||
@@ -6,7 +6,9 @@ import strawberry_django
|
|||||||
from strawberry import ID
|
from strawberry import ID
|
||||||
from strawberry_django import BaseFilterLookup, FilterLookup
|
from strawberry_django import BaseFilterLookup, FilterLookup
|
||||||
|
|
||||||
|
from core.graphql.filter_mixins import BaseFilterMixin, ChangeLogFilterMixin
|
||||||
from core.graphql.filters import ContentTypeFilter
|
from core.graphql.filters import ContentTypeFilter
|
||||||
|
from netbox.graphql.filter_mixins import NetBoxModelFilterMixin, PrimaryModelFilterMixin, WeightFilterMixin
|
||||||
from .enums import *
|
from .enums import *
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
@@ -20,16 +22,16 @@ __all__ = (
|
|||||||
'ComponentModelFilterMixin',
|
'ComponentModelFilterMixin',
|
||||||
'ComponentTemplateFilterMixin',
|
'ComponentTemplateFilterMixin',
|
||||||
'InterfaceBaseFilterMixin',
|
'InterfaceBaseFilterMixin',
|
||||||
'ModularComponentFilterMixin',
|
'ModularComponentModelFilterMixin',
|
||||||
'ModularComponentTemplateFilterMixin',
|
'ModularComponentTemplateFilterMixin',
|
||||||
'RackFilterMixin',
|
'RackBaseFilterMixin',
|
||||||
'RenderConfigFilterMixin',
|
'RenderConfigFilterMixin',
|
||||||
'ScopedFilterMixin',
|
'ScopedFilterMixin',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class ScopedFilterMixin:
|
class ScopedFilterMixin(BaseFilterMixin):
|
||||||
scope_type: Annotated['ContentTypeFilter', strawberry.lazy('core.graphql.filters')] | None = (
|
scope_type: Annotated['ContentTypeFilter', strawberry.lazy('core.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -37,7 +39,7 @@ class ScopedFilterMixin:
|
|||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class ComponentModelFilterMixin:
|
class ComponentModelFilterMixin(NetBoxModelFilterMixin):
|
||||||
device: Annotated['DeviceFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
|
device: Annotated['DeviceFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
|
||||||
device_id: ID | None = strawberry_django.filter_field()
|
device_id: ID | None = strawberry_django.filter_field()
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
@@ -46,7 +48,7 @@ class ComponentModelFilterMixin:
|
|||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class ModularComponentFilterMixin(ComponentModelFilterMixin):
|
class ModularComponentModelFilterMixin(ComponentModelFilterMixin):
|
||||||
module: Annotated['ModuleFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
|
module: Annotated['ModuleFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
|
||||||
module_id: ID | None = strawberry_django.filter_field()
|
module_id: ID | None = strawberry_django.filter_field()
|
||||||
inventory_items: Annotated['InventoryItemFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
|
inventory_items: Annotated['InventoryItemFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
|
||||||
@@ -55,7 +57,7 @@ class ModularComponentFilterMixin(ComponentModelFilterMixin):
|
|||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class CabledObjectModelFilterMixin:
|
class CabledObjectModelFilterMixin(BaseFilterMixin):
|
||||||
cable: Annotated['CableFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
|
cable: Annotated['CableFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
|
||||||
cable_id: ID | None = strawberry_django.filter_field()
|
cable_id: ID | None = strawberry_django.filter_field()
|
||||||
cable_end: (
|
cable_end: (
|
||||||
@@ -65,7 +67,7 @@ class CabledObjectModelFilterMixin:
|
|||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class ComponentTemplateFilterMixin:
|
class ComponentTemplateFilterMixin(ChangeLogFilterMixin):
|
||||||
device_type: Annotated['DeviceTypeFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
|
device_type: Annotated['DeviceTypeFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -83,7 +85,7 @@ class ModularComponentTemplateFilterMixin(ComponentTemplateFilterMixin):
|
|||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class RenderConfigFilterMixin:
|
class RenderConfigFilterMixin(BaseFilterMixin):
|
||||||
config_template: Annotated['ConfigTemplateFilter', strawberry.lazy('extras.graphql.filters')] | None = (
|
config_template: Annotated['ConfigTemplateFilter', strawberry.lazy('extras.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -91,7 +93,7 @@ class RenderConfigFilterMixin:
|
|||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class InterfaceBaseFilterMixin:
|
class InterfaceBaseFilterMixin(BaseFilterMixin):
|
||||||
enabled: FilterLookup[bool] | None = strawberry_django.filter_field()
|
enabled: FilterLookup[bool] | None = strawberry_django.filter_field()
|
||||||
mtu: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
|
mtu: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
@@ -122,7 +124,7 @@ class InterfaceBaseFilterMixin:
|
|||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class RackFilterMixin:
|
class RackBaseFilterMixin(WeightFilterMixin, PrimaryModelFilterMixin):
|
||||||
width: BaseFilterLookup[Annotated['RackWidthEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
width: BaseFilterLookup[Annotated['RackWidthEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -6,24 +6,29 @@ import strawberry_django
|
|||||||
from strawberry.scalars import ID
|
from strawberry.scalars import ID
|
||||||
from strawberry_django import BaseFilterLookup, ComparisonFilterLookup, FilterLookup
|
from strawberry_django import BaseFilterLookup, ComparisonFilterLookup, FilterLookup
|
||||||
|
|
||||||
|
from core.graphql.filter_mixins import ChangeLogFilterMixin
|
||||||
from dcim import models
|
from dcim import models
|
||||||
from dcim.constants import *
|
from dcim.constants import *
|
||||||
from dcim.graphql.enums import InterfaceKindEnum
|
from dcim.graphql.enums import InterfaceKindEnum
|
||||||
from dcim.graphql.filter_mixins import (
|
|
||||||
ComponentModelFilterMixin, ComponentTemplateFilterMixin, ModularComponentFilterMixin,
|
|
||||||
ModularComponentTemplateFilterMixin, RackFilterMixin,
|
|
||||||
)
|
|
||||||
from extras.graphql.filter_mixins import ConfigContextFilterMixin
|
from extras.graphql.filter_mixins import ConfigContextFilterMixin
|
||||||
from netbox.graphql.filter_mixins import ImageAttachmentFilterMixin, WeightFilterMixin
|
from netbox.graphql.filter_mixins import (
|
||||||
from netbox.graphql.filters import (
|
PrimaryModelFilterMixin,
|
||||||
ChangeLoggedModelFilter, NestedGroupModelFilter, OrganizationalModelFilter, PrimaryModelFilter, NetBoxModelFilter,
|
OrganizationalModelFilterMixin,
|
||||||
|
NestedGroupModelFilterMixin,
|
||||||
|
ImageAttachmentFilterMixin,
|
||||||
|
WeightFilterMixin,
|
||||||
)
|
)
|
||||||
from tenancy.graphql.filter_mixins import ContactFilterMixin, TenancyFilterMixin
|
from tenancy.graphql.filter_mixins import ContactFilterMixin, TenancyFilterMixin
|
||||||
from virtualization.models import VMInterface
|
from virtualization.models import VMInterface
|
||||||
|
|
||||||
from .filter_mixins import (
|
from .filter_mixins import (
|
||||||
CabledObjectModelFilterMixin,
|
CabledObjectModelFilterMixin,
|
||||||
|
ComponentModelFilterMixin,
|
||||||
|
ComponentTemplateFilterMixin,
|
||||||
InterfaceBaseFilterMixin,
|
InterfaceBaseFilterMixin,
|
||||||
|
ModularComponentModelFilterMixin,
|
||||||
|
ModularComponentTemplateFilterMixin,
|
||||||
|
RackBaseFilterMixin,
|
||||||
RenderConfigFilterMixin,
|
RenderConfigFilterMixin,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -91,7 +96,7 @@ __all__ = (
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.Cable, lookups=True)
|
@strawberry_django.filter_type(models.Cable, lookups=True)
|
||||||
class CableFilter(TenancyFilterMixin, PrimaryModelFilter):
|
class CableFilter(PrimaryModelFilterMixin, TenancyFilterMixin):
|
||||||
type: BaseFilterLookup[Annotated['CableTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
type: BaseFilterLookup[Annotated['CableTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -114,7 +119,7 @@ class CableFilter(TenancyFilterMixin, PrimaryModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.CableTermination, lookups=True)
|
@strawberry_django.filter_type(models.CableTermination, lookups=True)
|
||||||
class CableTerminationFilter(ChangeLoggedModelFilter):
|
class CableTerminationFilter(ChangeLogFilterMixin):
|
||||||
cable: Annotated['CableFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
|
cable: Annotated['CableFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
|
||||||
cable_id: ID | None = strawberry_django.filter_field()
|
cable_id: ID | None = strawberry_django.filter_field()
|
||||||
cable_end: BaseFilterLookup[Annotated['CableEndEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
cable_end: BaseFilterLookup[Annotated['CableEndEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
||||||
@@ -127,7 +132,7 @@ class CableTerminationFilter(ChangeLoggedModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.ConsolePort, lookups=True)
|
@strawberry_django.filter_type(models.ConsolePort, lookups=True)
|
||||||
class ConsolePortFilter(ModularComponentFilterMixin, CabledObjectModelFilterMixin, NetBoxModelFilter):
|
class ConsolePortFilter(ModularComponentModelFilterMixin, CabledObjectModelFilterMixin):
|
||||||
type: BaseFilterLookup[Annotated['ConsolePortTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
type: BaseFilterLookup[Annotated['ConsolePortTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -137,14 +142,14 @@ class ConsolePortFilter(ModularComponentFilterMixin, CabledObjectModelFilterMixi
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.ConsolePortTemplate, lookups=True)
|
@strawberry_django.filter_type(models.ConsolePortTemplate, lookups=True)
|
||||||
class ConsolePortTemplateFilter(ModularComponentTemplateFilterMixin, ChangeLoggedModelFilter):
|
class ConsolePortTemplateFilter(ModularComponentTemplateFilterMixin):
|
||||||
type: BaseFilterLookup[Annotated['ConsolePortTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
type: BaseFilterLookup[Annotated['ConsolePortTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.ConsoleServerPort, lookups=True)
|
@strawberry_django.filter_type(models.ConsoleServerPort, lookups=True)
|
||||||
class ConsoleServerPortFilter(ModularComponentFilterMixin, CabledObjectModelFilterMixin, NetBoxModelFilter):
|
class ConsoleServerPortFilter(ModularComponentModelFilterMixin, CabledObjectModelFilterMixin):
|
||||||
type: BaseFilterLookup[Annotated['ConsolePortTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
type: BaseFilterLookup[Annotated['ConsolePortTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -154,7 +159,7 @@ class ConsoleServerPortFilter(ModularComponentFilterMixin, CabledObjectModelFilt
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.ConsoleServerPortTemplate, lookups=True)
|
@strawberry_django.filter_type(models.ConsoleServerPortTemplate, lookups=True)
|
||||||
class ConsoleServerPortTemplateFilter(ModularComponentTemplateFilterMixin, ChangeLoggedModelFilter):
|
class ConsoleServerPortTemplateFilter(ModularComponentTemplateFilterMixin):
|
||||||
type: BaseFilterLookup[Annotated['ConsolePortTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
type: BaseFilterLookup[Annotated['ConsolePortTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -167,7 +172,7 @@ class DeviceFilter(
|
|||||||
ImageAttachmentFilterMixin,
|
ImageAttachmentFilterMixin,
|
||||||
RenderConfigFilterMixin,
|
RenderConfigFilterMixin,
|
||||||
ConfigContextFilterMixin,
|
ConfigContextFilterMixin,
|
||||||
PrimaryModelFilter,
|
PrimaryModelFilterMixin,
|
||||||
):
|
):
|
||||||
device_type: Annotated['DeviceTypeFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
|
device_type: Annotated['DeviceTypeFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
@@ -280,7 +285,7 @@ class DeviceFilter(
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.DeviceBay, lookups=True)
|
@strawberry_django.filter_type(models.DeviceBay, lookups=True)
|
||||||
class DeviceBayFilter(ComponentModelFilterMixin, NetBoxModelFilter):
|
class DeviceBayFilter(ComponentModelFilterMixin):
|
||||||
installed_device: Annotated['DeviceFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
|
installed_device: Annotated['DeviceFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -288,12 +293,12 @@ class DeviceBayFilter(ComponentModelFilterMixin, NetBoxModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.DeviceBayTemplate, lookups=True)
|
@strawberry_django.filter_type(models.DeviceBayTemplate, lookups=True)
|
||||||
class DeviceBayTemplateFilter(ComponentTemplateFilterMixin, ChangeLoggedModelFilter):
|
class DeviceBayTemplateFilter(ComponentTemplateFilterMixin):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.InventoryItemTemplate, lookups=True)
|
@strawberry_django.filter_type(models.InventoryItemTemplate, lookups=True)
|
||||||
class InventoryItemTemplateFilter(ComponentTemplateFilterMixin, ChangeLoggedModelFilter):
|
class InventoryItemTemplateFilter(ComponentTemplateFilterMixin):
|
||||||
parent: Annotated['InventoryItemTemplateFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
|
parent: Annotated['InventoryItemTemplateFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -313,7 +318,7 @@ class InventoryItemTemplateFilter(ComponentTemplateFilterMixin, ChangeLoggedMode
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.DeviceRole, lookups=True)
|
@strawberry_django.filter_type(models.DeviceRole, lookups=True)
|
||||||
class DeviceRoleFilter(RenderConfigFilterMixin, OrganizationalModelFilter):
|
class DeviceRoleFilter(OrganizationalModelFilterMixin, RenderConfigFilterMixin):
|
||||||
color: BaseFilterLookup[Annotated['ColorEnum', strawberry.lazy('netbox.graphql.enums')]] | None = (
|
color: BaseFilterLookup[Annotated['ColorEnum', strawberry.lazy('netbox.graphql.enums')]] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -321,7 +326,7 @@ class DeviceRoleFilter(RenderConfigFilterMixin, OrganizationalModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.DeviceType, lookups=True)
|
@strawberry_django.filter_type(models.DeviceType, lookups=True)
|
||||||
class DeviceTypeFilter(ImageAttachmentFilterMixin, WeightFilterMixin, PrimaryModelFilter):
|
class DeviceTypeFilter(ImageAttachmentFilterMixin, PrimaryModelFilterMixin, WeightFilterMixin):
|
||||||
manufacturer: Annotated['ManufacturerFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
|
manufacturer: Annotated['ManufacturerFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -397,7 +402,7 @@ class DeviceTypeFilter(ImageAttachmentFilterMixin, WeightFilterMixin, PrimaryMod
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.FrontPort, lookups=True)
|
@strawberry_django.filter_type(models.FrontPort, lookups=True)
|
||||||
class FrontPortFilter(ModularComponentFilterMixin, CabledObjectModelFilterMixin, NetBoxModelFilter):
|
class FrontPortFilter(ModularComponentModelFilterMixin, CabledObjectModelFilterMixin):
|
||||||
type: BaseFilterLookup[Annotated['PortTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
type: BaseFilterLookup[Annotated['PortTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -414,7 +419,7 @@ class FrontPortFilter(ModularComponentFilterMixin, CabledObjectModelFilterMixin,
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.FrontPortTemplate, lookups=True)
|
@strawberry_django.filter_type(models.FrontPortTemplate, lookups=True)
|
||||||
class FrontPortTemplateFilter(ModularComponentTemplateFilterMixin, ChangeLoggedModelFilter):
|
class FrontPortTemplateFilter(ModularComponentTemplateFilterMixin):
|
||||||
type: BaseFilterLookup[Annotated['PortTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
type: BaseFilterLookup[Annotated['PortTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -431,7 +436,7 @@ class FrontPortTemplateFilter(ModularComponentTemplateFilterMixin, ChangeLoggedM
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.MACAddress, lookups=True)
|
@strawberry_django.filter_type(models.MACAddress, lookups=True)
|
||||||
class MACAddressFilter(PrimaryModelFilter):
|
class MACAddressFilter(PrimaryModelFilterMixin):
|
||||||
mac_address: FilterLookup[str] | None = strawberry_django.filter_field()
|
mac_address: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
assigned_object_type: Annotated['ContentTypeFilter', strawberry.lazy('core.graphql.filters')] | None = (
|
assigned_object_type: Annotated['ContentTypeFilter', strawberry.lazy('core.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
@@ -458,12 +463,7 @@ class MACAddressFilter(PrimaryModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.Interface, lookups=True)
|
@strawberry_django.filter_type(models.Interface, lookups=True)
|
||||||
class InterfaceFilter(
|
class InterfaceFilter(ModularComponentModelFilterMixin, InterfaceBaseFilterMixin, CabledObjectModelFilterMixin):
|
||||||
ModularComponentFilterMixin,
|
|
||||||
InterfaceBaseFilterMixin,
|
|
||||||
CabledObjectModelFilterMixin,
|
|
||||||
NetBoxModelFilter
|
|
||||||
):
|
|
||||||
vcdcs: Annotated['VirtualDeviceContextFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
|
vcdcs: Annotated['VirtualDeviceContextFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -553,7 +553,7 @@ class InterfaceFilter(
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.InterfaceTemplate, lookups=True)
|
@strawberry_django.filter_type(models.InterfaceTemplate, lookups=True)
|
||||||
class InterfaceTemplateFilter(ModularComponentTemplateFilterMixin, ChangeLoggedModelFilter):
|
class InterfaceTemplateFilter(ModularComponentTemplateFilterMixin):
|
||||||
type: BaseFilterLookup[Annotated['InterfaceTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
type: BaseFilterLookup[Annotated['InterfaceTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -575,7 +575,7 @@ class InterfaceTemplateFilter(ModularComponentTemplateFilterMixin, ChangeLoggedM
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.InventoryItem, lookups=True)
|
@strawberry_django.filter_type(models.InventoryItem, lookups=True)
|
||||||
class InventoryItemFilter(ComponentModelFilterMixin, NetBoxModelFilter):
|
class InventoryItemFilter(ComponentModelFilterMixin):
|
||||||
parent: Annotated['InventoryItemFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
|
parent: Annotated['InventoryItemFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -602,14 +602,14 @@ class InventoryItemFilter(ComponentModelFilterMixin, NetBoxModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.InventoryItemRole, lookups=True)
|
@strawberry_django.filter_type(models.InventoryItemRole, lookups=True)
|
||||||
class InventoryItemRoleFilter(OrganizationalModelFilter):
|
class InventoryItemRoleFilter(OrganizationalModelFilterMixin):
|
||||||
color: BaseFilterLookup[Annotated['ColorEnum', strawberry.lazy('netbox.graphql.enums')]] | None = (
|
color: BaseFilterLookup[Annotated['ColorEnum', strawberry.lazy('netbox.graphql.enums')]] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.Location, lookups=True)
|
@strawberry_django.filter_type(models.Location, lookups=True)
|
||||||
class LocationFilter(ContactFilterMixin, ImageAttachmentFilterMixin, TenancyFilterMixin, NestedGroupModelFilter):
|
class LocationFilter(ContactFilterMixin, ImageAttachmentFilterMixin, TenancyFilterMixin, NestedGroupModelFilterMixin):
|
||||||
site: Annotated['SiteFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
|
site: Annotated['SiteFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
|
||||||
site_id: ID | None = strawberry_django.filter_field()
|
site_id: ID | None = strawberry_django.filter_field()
|
||||||
status: BaseFilterLookup[Annotated['LocationStatusEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
status: BaseFilterLookup[Annotated['LocationStatusEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
||||||
@@ -625,12 +625,12 @@ class LocationFilter(ContactFilterMixin, ImageAttachmentFilterMixin, TenancyFilt
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.Manufacturer, lookups=True)
|
@strawberry_django.filter_type(models.Manufacturer, lookups=True)
|
||||||
class ManufacturerFilter(ContactFilterMixin, OrganizationalModelFilter):
|
class ManufacturerFilter(ContactFilterMixin, OrganizationalModelFilterMixin):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.Module, lookups=True)
|
@strawberry_django.filter_type(models.Module, lookups=True)
|
||||||
class ModuleFilter(ConfigContextFilterMixin, PrimaryModelFilter):
|
class ModuleFilter(PrimaryModelFilterMixin, ConfigContextFilterMixin):
|
||||||
device: Annotated['DeviceFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
|
device: Annotated['DeviceFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
|
||||||
device_id: ID | None = strawberry_django.filter_field()
|
device_id: ID | None = strawberry_django.filter_field()
|
||||||
module_bay: Annotated['ModuleBayFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
|
module_bay: Annotated['ModuleBayFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
|
||||||
@@ -679,7 +679,7 @@ class ModuleFilter(ConfigContextFilterMixin, PrimaryModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.ModuleBay, lookups=True)
|
@strawberry_django.filter_type(models.ModuleBay, lookups=True)
|
||||||
class ModuleBayFilter(ModularComponentFilterMixin, NetBoxModelFilter):
|
class ModuleBayFilter(ModularComponentModelFilterMixin):
|
||||||
parent: Annotated['ModuleBayFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
|
parent: Annotated['ModuleBayFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -688,17 +688,17 @@ class ModuleBayFilter(ModularComponentFilterMixin, NetBoxModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.ModuleBayTemplate, lookups=True)
|
@strawberry_django.filter_type(models.ModuleBayTemplate, lookups=True)
|
||||||
class ModuleBayTemplateFilter(ModularComponentTemplateFilterMixin, ChangeLoggedModelFilter):
|
class ModuleBayTemplateFilter(ModularComponentTemplateFilterMixin):
|
||||||
position: FilterLookup[str] | None = strawberry_django.filter_field()
|
position: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.ModuleTypeProfile, lookups=True)
|
@strawberry_django.filter_type(models.ModuleTypeProfile, lookups=True)
|
||||||
class ModuleTypeProfileFilter(PrimaryModelFilter):
|
class ModuleTypeProfileFilter(PrimaryModelFilterMixin):
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.ModuleType, lookups=True)
|
@strawberry_django.filter_type(models.ModuleType, lookups=True)
|
||||||
class ModuleTypeFilter(ImageAttachmentFilterMixin, WeightFilterMixin, PrimaryModelFilter):
|
class ModuleTypeFilter(ImageAttachmentFilterMixin, PrimaryModelFilterMixin, WeightFilterMixin):
|
||||||
manufacturer: Annotated['ManufacturerFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
|
manufacturer: Annotated['ManufacturerFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -749,7 +749,7 @@ class ModuleTypeFilter(ImageAttachmentFilterMixin, WeightFilterMixin, PrimaryMod
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.Platform, lookups=True)
|
@strawberry_django.filter_type(models.Platform, lookups=True)
|
||||||
class PlatformFilter(OrganizationalModelFilter):
|
class PlatformFilter(OrganizationalModelFilterMixin):
|
||||||
manufacturer: Annotated['ManufacturerFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
|
manufacturer: Annotated['ManufacturerFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -761,7 +761,7 @@ class PlatformFilter(OrganizationalModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.PowerFeed, lookups=True)
|
@strawberry_django.filter_type(models.PowerFeed, lookups=True)
|
||||||
class PowerFeedFilter(CabledObjectModelFilterMixin, TenancyFilterMixin, PrimaryModelFilter):
|
class PowerFeedFilter(CabledObjectModelFilterMixin, TenancyFilterMixin, PrimaryModelFilterMixin):
|
||||||
power_panel: Annotated['PowerPanelFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
|
power_panel: Annotated['PowerPanelFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -796,7 +796,7 @@ class PowerFeedFilter(CabledObjectModelFilterMixin, TenancyFilterMixin, PrimaryM
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.PowerOutlet, lookups=True)
|
@strawberry_django.filter_type(models.PowerOutlet, lookups=True)
|
||||||
class PowerOutletFilter(ModularComponentFilterMixin, CabledObjectModelFilterMixin, NetBoxModelFilter):
|
class PowerOutletFilter(ModularComponentModelFilterMixin, CabledObjectModelFilterMixin):
|
||||||
type: BaseFilterLookup[Annotated['PowerOutletTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
type: BaseFilterLookup[Annotated['PowerOutletTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -816,7 +816,7 @@ class PowerOutletFilter(ModularComponentFilterMixin, CabledObjectModelFilterMixi
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.PowerOutletTemplate, lookups=True)
|
@strawberry_django.filter_type(models.PowerOutletTemplate, lookups=True)
|
||||||
class PowerOutletTemplateFilter(ModularComponentTemplateFilterMixin, ChangeLoggedModelFilter):
|
class PowerOutletTemplateFilter(ModularComponentModelFilterMixin):
|
||||||
type: BaseFilterLookup[Annotated['PowerOutletTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
type: BaseFilterLookup[Annotated['PowerOutletTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -830,7 +830,7 @@ class PowerOutletTemplateFilter(ModularComponentTemplateFilterMixin, ChangeLogge
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.PowerPanel, lookups=True)
|
@strawberry_django.filter_type(models.PowerPanel, lookups=True)
|
||||||
class PowerPanelFilter(ContactFilterMixin, ImageAttachmentFilterMixin, PrimaryModelFilter):
|
class PowerPanelFilter(ContactFilterMixin, ImageAttachmentFilterMixin, PrimaryModelFilterMixin):
|
||||||
site: Annotated['SiteFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
|
site: Annotated['SiteFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
|
||||||
site_id: ID | None = strawberry_django.filter_field()
|
site_id: ID | None = strawberry_django.filter_field()
|
||||||
location: Annotated['LocationFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
|
location: Annotated['LocationFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
|
||||||
@@ -843,7 +843,7 @@ class PowerPanelFilter(ContactFilterMixin, ImageAttachmentFilterMixin, PrimaryMo
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.PowerPort, lookups=True)
|
@strawberry_django.filter_type(models.PowerPort, lookups=True)
|
||||||
class PowerPortFilter(ModularComponentFilterMixin, CabledObjectModelFilterMixin, NetBoxModelFilter):
|
class PowerPortFilter(ModularComponentModelFilterMixin, CabledObjectModelFilterMixin):
|
||||||
type: BaseFilterLookup[Annotated['PowerPortTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
type: BaseFilterLookup[Annotated['PowerPortTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -856,7 +856,7 @@ class PowerPortFilter(ModularComponentFilterMixin, CabledObjectModelFilterMixin,
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.PowerPortTemplate, lookups=True)
|
@strawberry_django.filter_type(models.PowerPortTemplate, lookups=True)
|
||||||
class PowerPortTemplateFilter(ModularComponentTemplateFilterMixin, ChangeLoggedModelFilter):
|
class PowerPortTemplateFilter(ModularComponentTemplateFilterMixin):
|
||||||
type: BaseFilterLookup[Annotated['PowerPortTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
type: BaseFilterLookup[Annotated['PowerPortTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -869,7 +869,7 @@ class PowerPortTemplateFilter(ModularComponentTemplateFilterMixin, ChangeLoggedM
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.RackType, lookups=True)
|
@strawberry_django.filter_type(models.RackType, lookups=True)
|
||||||
class RackTypeFilter(RackFilterMixin, WeightFilterMixin, PrimaryModelFilter):
|
class RackTypeFilter(RackBaseFilterMixin):
|
||||||
form_factor: BaseFilterLookup[Annotated['RackFormFactorEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
form_factor: BaseFilterLookup[Annotated['RackFormFactorEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -884,14 +884,7 @@ class RackTypeFilter(RackFilterMixin, WeightFilterMixin, PrimaryModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.Rack, lookups=True)
|
@strawberry_django.filter_type(models.Rack, lookups=True)
|
||||||
class RackFilter(
|
class RackFilter(ContactFilterMixin, ImageAttachmentFilterMixin, TenancyFilterMixin, RackBaseFilterMixin):
|
||||||
ContactFilterMixin,
|
|
||||||
ImageAttachmentFilterMixin,
|
|
||||||
TenancyFilterMixin,
|
|
||||||
WeightFilterMixin,
|
|
||||||
RackFilterMixin,
|
|
||||||
PrimaryModelFilter
|
|
||||||
):
|
|
||||||
form_factor: BaseFilterLookup[Annotated['RackFormFactorEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
form_factor: BaseFilterLookup[Annotated['RackFormFactorEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -925,7 +918,7 @@ class RackFilter(
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.RackReservation, lookups=True)
|
@strawberry_django.filter_type(models.RackReservation, lookups=True)
|
||||||
class RackReservationFilter(TenancyFilterMixin, PrimaryModelFilter):
|
class RackReservationFilter(TenancyFilterMixin, PrimaryModelFilterMixin):
|
||||||
rack: Annotated['RackFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
|
rack: Annotated['RackFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
|
||||||
rack_id: ID | None = strawberry_django.filter_field()
|
rack_id: ID | None = strawberry_django.filter_field()
|
||||||
units: Annotated['IntegerArrayLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
|
units: Annotated['IntegerArrayLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
|
||||||
@@ -940,14 +933,14 @@ class RackReservationFilter(TenancyFilterMixin, PrimaryModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.RackRole, lookups=True)
|
@strawberry_django.filter_type(models.RackRole, lookups=True)
|
||||||
class RackRoleFilter(OrganizationalModelFilter):
|
class RackRoleFilter(OrganizationalModelFilterMixin):
|
||||||
color: BaseFilterLookup[Annotated['ColorEnum', strawberry.lazy('netbox.graphql.enums')]] | None = (
|
color: BaseFilterLookup[Annotated['ColorEnum', strawberry.lazy('netbox.graphql.enums')]] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.RearPort, lookups=True)
|
@strawberry_django.filter_type(models.RearPort, lookups=True)
|
||||||
class RearPortFilter(ModularComponentFilterMixin, CabledObjectModelFilterMixin, NetBoxModelFilter):
|
class RearPortFilter(ModularComponentModelFilterMixin, CabledObjectModelFilterMixin):
|
||||||
type: BaseFilterLookup[Annotated['PortTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
type: BaseFilterLookup[Annotated['PortTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -960,7 +953,7 @@ class RearPortFilter(ModularComponentFilterMixin, CabledObjectModelFilterMixin,
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.RearPortTemplate, lookups=True)
|
@strawberry_django.filter_type(models.RearPortTemplate, lookups=True)
|
||||||
class RearPortTemplateFilter(ModularComponentTemplateFilterMixin, ChangeLoggedModelFilter):
|
class RearPortTemplateFilter(ModularComponentTemplateFilterMixin):
|
||||||
type: BaseFilterLookup[Annotated['PortTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
type: BaseFilterLookup[Annotated['PortTypeEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -973,7 +966,7 @@ class RearPortTemplateFilter(ModularComponentTemplateFilterMixin, ChangeLoggedMo
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.Region, lookups=True)
|
@strawberry_django.filter_type(models.Region, lookups=True)
|
||||||
class RegionFilter(ContactFilterMixin, NestedGroupModelFilter):
|
class RegionFilter(ContactFilterMixin, NestedGroupModelFilterMixin):
|
||||||
prefixes: Annotated['PrefixFilter', strawberry.lazy('ipam.graphql.filters')] | None = (
|
prefixes: Annotated['PrefixFilter', strawberry.lazy('ipam.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -983,7 +976,7 @@ class RegionFilter(ContactFilterMixin, NestedGroupModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.Site, lookups=True)
|
@strawberry_django.filter_type(models.Site, lookups=True)
|
||||||
class SiteFilter(ContactFilterMixin, ImageAttachmentFilterMixin, TenancyFilterMixin, PrimaryModelFilter):
|
class SiteFilter(ContactFilterMixin, ImageAttachmentFilterMixin, TenancyFilterMixin, PrimaryModelFilterMixin):
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
slug: FilterLookup[str] | None = strawberry_django.filter_field()
|
slug: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
status: BaseFilterLookup[Annotated['SiteStatusEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
status: BaseFilterLookup[Annotated['SiteStatusEnum', strawberry.lazy('dcim.graphql.enums')]] | None = (
|
||||||
@@ -1019,7 +1012,7 @@ class SiteFilter(ContactFilterMixin, ImageAttachmentFilterMixin, TenancyFilterMi
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.SiteGroup, lookups=True)
|
@strawberry_django.filter_type(models.SiteGroup, lookups=True)
|
||||||
class SiteGroupFilter(ContactFilterMixin, NestedGroupModelFilter):
|
class SiteGroupFilter(ContactFilterMixin, NestedGroupModelFilterMixin):
|
||||||
prefixes: Annotated['PrefixFilter', strawberry.lazy('ipam.graphql.filters')] | None = (
|
prefixes: Annotated['PrefixFilter', strawberry.lazy('ipam.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -1029,7 +1022,7 @@ class SiteGroupFilter(ContactFilterMixin, NestedGroupModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.VirtualChassis, lookups=True)
|
@strawberry_django.filter_type(models.VirtualChassis, lookups=True)
|
||||||
class VirtualChassisFilter(PrimaryModelFilter):
|
class VirtualChassisFilter(PrimaryModelFilterMixin):
|
||||||
master: Annotated['DeviceFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
|
master: Annotated['DeviceFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
|
||||||
master_id: ID | None = strawberry_django.filter_field()
|
master_id: ID | None = strawberry_django.filter_field()
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
@@ -1041,7 +1034,7 @@ class VirtualChassisFilter(PrimaryModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.VirtualDeviceContext, lookups=True)
|
@strawberry_django.filter_type(models.VirtualDeviceContext, lookups=True)
|
||||||
class VirtualDeviceContextFilter(TenancyFilterMixin, PrimaryModelFilter):
|
class VirtualDeviceContextFilter(TenancyFilterMixin, PrimaryModelFilterMixin):
|
||||||
device: Annotated['DeviceFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
|
device: Annotated['DeviceFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
|
||||||
device_id: ID | None = strawberry_django.filter_field()
|
device_id: ID | None = strawberry_django.filter_field()
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
|
|||||||
@@ -3,6 +3,9 @@ from typing import Annotated, TYPE_CHECKING
|
|||||||
|
|
||||||
import strawberry
|
import strawberry
|
||||||
import strawberry_django
|
import strawberry_django
|
||||||
|
from strawberry_django import FilterLookup
|
||||||
|
|
||||||
|
from core.graphql.filter_mixins import BaseFilterMixin
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from netbox.graphql.filter_lookups import JSONFilter
|
from netbox.graphql.filter_lookups import JSONFilter
|
||||||
@@ -13,30 +16,37 @@ __all__ = (
|
|||||||
'JournalEntriesFilterMixin',
|
'JournalEntriesFilterMixin',
|
||||||
'TagsFilterMixin',
|
'TagsFilterMixin',
|
||||||
'ConfigContextFilterMixin',
|
'ConfigContextFilterMixin',
|
||||||
|
'TagBaseFilterMixin',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class CustomFieldsFilterMixin:
|
class CustomFieldsFilterMixin(BaseFilterMixin):
|
||||||
custom_field_data: Annotated['JSONFilter', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
|
custom_field_data: Annotated['JSONFilter', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class JournalEntriesFilterMixin:
|
class JournalEntriesFilterMixin(BaseFilterMixin):
|
||||||
journal_entries: Annotated['JournalEntryFilter', strawberry.lazy('extras.graphql.filters')] | None = (
|
journal_entries: Annotated['JournalEntryFilter', strawberry.lazy('extras.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class TagsFilterMixin:
|
class TagsFilterMixin(BaseFilterMixin):
|
||||||
tags: Annotated['TagFilter', strawberry.lazy('extras.graphql.filters')] | None = strawberry_django.filter_field()
|
tags: Annotated['TagFilter', strawberry.lazy('extras.graphql.filters')] | None = strawberry_django.filter_field()
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class ConfigContextFilterMixin:
|
class ConfigContextFilterMixin(BaseFilterMixin):
|
||||||
local_context_data: Annotated['JSONFilter', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
|
local_context_data: Annotated['JSONFilter', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class TagBaseFilterMixin(BaseFilterMixin):
|
||||||
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
|
slug: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
|
|||||||
@@ -5,10 +5,10 @@ import strawberry_django
|
|||||||
from strawberry.scalars import ID
|
from strawberry.scalars import ID
|
||||||
from strawberry_django import BaseFilterLookup, FilterLookup
|
from strawberry_django import BaseFilterLookup, FilterLookup
|
||||||
|
|
||||||
|
from core.graphql.filter_mixins import BaseObjectTypeFilterMixin, ChangeLogFilterMixin
|
||||||
from extras import models
|
from extras import models
|
||||||
from extras.graphql.filter_mixins import CustomFieldsFilterMixin, TagsFilterMixin
|
from extras.graphql.filter_mixins import TagBaseFilterMixin, CustomFieldsFilterMixin, TagsFilterMixin
|
||||||
from netbox.graphql.filter_mixins import SyncedDataFilterMixin
|
from netbox.graphql.filter_mixins import PrimaryModelFilterMixin, SyncedDataFilterMixin
|
||||||
from netbox.graphql.filters import ChangeLoggedModelFilter, PrimaryModelFilter
|
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from core.graphql.filters import ContentTypeFilter
|
from core.graphql.filters import ContentTypeFilter
|
||||||
@@ -42,7 +42,7 @@ __all__ = (
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.ConfigContext, lookups=True)
|
@strawberry_django.filter_type(models.ConfigContext, lookups=True)
|
||||||
class ConfigContextFilter(SyncedDataFilterMixin, ChangeLoggedModelFilter):
|
class ConfigContextFilter(BaseObjectTypeFilterMixin, SyncedDataFilterMixin, ChangeLogFilterMixin):
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
weight: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
|
weight: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
@@ -99,14 +99,14 @@ class ConfigContextFilter(SyncedDataFilterMixin, ChangeLoggedModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.ConfigContextProfile, lookups=True)
|
@strawberry_django.filter_type(models.ConfigContextProfile, lookups=True)
|
||||||
class ConfigContextProfileFilter(SyncedDataFilterMixin, PrimaryModelFilter):
|
class ConfigContextProfileFilter(SyncedDataFilterMixin, PrimaryModelFilterMixin):
|
||||||
name: FilterLookup[str] = strawberry_django.filter_field()
|
name: FilterLookup[str] = strawberry_django.filter_field()
|
||||||
description: FilterLookup[str] = strawberry_django.filter_field()
|
description: FilterLookup[str] = strawberry_django.filter_field()
|
||||||
tags: Annotated['TagFilter', strawberry.lazy('extras.graphql.filters')] | None = strawberry_django.filter_field()
|
tags: Annotated['TagFilter', strawberry.lazy('extras.graphql.filters')] | None = strawberry_django.filter_field()
|
||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.ConfigTemplate, lookups=True)
|
@strawberry_django.filter_type(models.ConfigTemplate, lookups=True)
|
||||||
class ConfigTemplateFilter(SyncedDataFilterMixin, ChangeLoggedModelFilter):
|
class ConfigTemplateFilter(BaseObjectTypeFilterMixin, SyncedDataFilterMixin, ChangeLogFilterMixin):
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
description: FilterLookup[str] | None = strawberry_django.filter_field()
|
description: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
template_code: FilterLookup[str] | None = strawberry_django.filter_field()
|
template_code: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
@@ -120,7 +120,7 @@ class ConfigTemplateFilter(SyncedDataFilterMixin, ChangeLoggedModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.CustomField, lookups=True)
|
@strawberry_django.filter_type(models.CustomField, lookups=True)
|
||||||
class CustomFieldFilter(ChangeLoggedModelFilter):
|
class CustomFieldFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin):
|
||||||
type: BaseFilterLookup[Annotated['CustomFieldTypeEnum', strawberry.lazy('extras.graphql.enums')]] | None = (
|
type: BaseFilterLookup[Annotated['CustomFieldTypeEnum', strawberry.lazy('extras.graphql.enums')]] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -179,7 +179,7 @@ class CustomFieldFilter(ChangeLoggedModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.CustomFieldChoiceSet, lookups=True)
|
@strawberry_django.filter_type(models.CustomFieldChoiceSet, lookups=True)
|
||||||
class CustomFieldChoiceSetFilter(ChangeLoggedModelFilter):
|
class CustomFieldChoiceSetFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin):
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
description: FilterLookup[str] | None = strawberry_django.filter_field()
|
description: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
base_choices: (
|
base_choices: (
|
||||||
@@ -194,7 +194,7 @@ class CustomFieldChoiceSetFilter(ChangeLoggedModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.CustomLink, lookups=True)
|
@strawberry_django.filter_type(models.CustomLink, lookups=True)
|
||||||
class CustomLinkFilter(ChangeLoggedModelFilter):
|
class CustomLinkFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin):
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
enabled: FilterLookup[bool] | None = strawberry_django.filter_field()
|
enabled: FilterLookup[bool] | None = strawberry_django.filter_field()
|
||||||
link_text: FilterLookup[str] | None = strawberry_django.filter_field()
|
link_text: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
@@ -212,7 +212,7 @@ class CustomLinkFilter(ChangeLoggedModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.ExportTemplate, lookups=True)
|
@strawberry_django.filter_type(models.ExportTemplate, lookups=True)
|
||||||
class ExportTemplateFilter(SyncedDataFilterMixin, ChangeLoggedModelFilter):
|
class ExportTemplateFilter(BaseObjectTypeFilterMixin, SyncedDataFilterMixin, ChangeLogFilterMixin):
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
description: FilterLookup[str] | None = strawberry_django.filter_field()
|
description: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
template_code: FilterLookup[str] | None = strawberry_django.filter_field()
|
template_code: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
@@ -226,7 +226,7 @@ class ExportTemplateFilter(SyncedDataFilterMixin, ChangeLoggedModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.ImageAttachment, lookups=True)
|
@strawberry_django.filter_type(models.ImageAttachment, lookups=True)
|
||||||
class ImageAttachmentFilter(ChangeLoggedModelFilter):
|
class ImageAttachmentFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin):
|
||||||
object_type: Annotated['ContentTypeFilter', strawberry.lazy('core.graphql.filters')] | None = (
|
object_type: Annotated['ContentTypeFilter', strawberry.lazy('core.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -241,7 +241,7 @@ class ImageAttachmentFilter(ChangeLoggedModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.JournalEntry, lookups=True)
|
@strawberry_django.filter_type(models.JournalEntry, lookups=True)
|
||||||
class JournalEntryFilter(CustomFieldsFilterMixin, TagsFilterMixin, ChangeLoggedModelFilter):
|
class JournalEntryFilter(BaseObjectTypeFilterMixin, CustomFieldsFilterMixin, TagsFilterMixin, ChangeLogFilterMixin):
|
||||||
assigned_object_type: Annotated['ContentTypeFilter', strawberry.lazy('core.graphql.filters')] | None = (
|
assigned_object_type: Annotated['ContentTypeFilter', strawberry.lazy('core.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -257,7 +257,7 @@ class JournalEntryFilter(CustomFieldsFilterMixin, TagsFilterMixin, ChangeLoggedM
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.NotificationGroup, lookups=True)
|
@strawberry_django.filter_type(models.NotificationGroup, lookups=True)
|
||||||
class NotificationGroupFilter(ChangeLoggedModelFilter):
|
class NotificationGroupFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin):
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
description: FilterLookup[str] | None = strawberry_django.filter_field()
|
description: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
groups: Annotated['GroupFilter', strawberry.lazy('users.graphql.filters')] | None = strawberry_django.filter_field()
|
groups: Annotated['GroupFilter', strawberry.lazy('users.graphql.filters')] | None = strawberry_django.filter_field()
|
||||||
@@ -265,7 +265,7 @@ class NotificationGroupFilter(ChangeLoggedModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.SavedFilter, lookups=True)
|
@strawberry_django.filter_type(models.SavedFilter, lookups=True)
|
||||||
class SavedFilterFilter(ChangeLoggedModelFilter):
|
class SavedFilterFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin):
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
slug: FilterLookup[str] | None = strawberry_django.filter_field()
|
slug: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
description: FilterLookup[str] | None = strawberry_django.filter_field()
|
description: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
@@ -282,7 +282,7 @@ class SavedFilterFilter(ChangeLoggedModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.TableConfig, lookups=True)
|
@strawberry_django.filter_type(models.TableConfig, lookups=True)
|
||||||
class TableConfigFilter(ChangeLoggedModelFilter):
|
class TableConfigFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin):
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
description: FilterLookup[str] | None = strawberry_django.filter_field()
|
description: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
user: Annotated['UserFilter', strawberry.lazy('users.graphql.filters')] | None = strawberry_django.filter_field()
|
user: Annotated['UserFilter', strawberry.lazy('users.graphql.filters')] | None = strawberry_django.filter_field()
|
||||||
@@ -295,9 +295,7 @@ class TableConfigFilter(ChangeLoggedModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.Tag, lookups=True)
|
@strawberry_django.filter_type(models.Tag, lookups=True)
|
||||||
class TagFilter(ChangeLoggedModelFilter):
|
class TagFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin, TagBaseFilterMixin):
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
|
||||||
slug: FilterLookup[str] | None = strawberry_django.filter_field()
|
|
||||||
color: BaseFilterLookup[Annotated['ColorEnum', strawberry.lazy('netbox.graphql.enums')]] | None = (
|
color: BaseFilterLookup[Annotated['ColorEnum', strawberry.lazy('netbox.graphql.enums')]] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -305,7 +303,7 @@ class TagFilter(ChangeLoggedModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.Webhook, lookups=True)
|
@strawberry_django.filter_type(models.Webhook, lookups=True)
|
||||||
class WebhookFilter(CustomFieldsFilterMixin, TagsFilterMixin, ChangeLoggedModelFilter):
|
class WebhookFilter(BaseObjectTypeFilterMixin, CustomFieldsFilterMixin, TagsFilterMixin, ChangeLogFilterMixin):
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
description: FilterLookup[str] | None = strawberry_django.filter_field()
|
description: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
payload_url: FilterLookup[str] | None = strawberry_django.filter_field()
|
payload_url: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
@@ -326,7 +324,7 @@ class WebhookFilter(CustomFieldsFilterMixin, TagsFilterMixin, ChangeLoggedModelF
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.EventRule, lookups=True)
|
@strawberry_django.filter_type(models.EventRule, lookups=True)
|
||||||
class EventRuleFilter(CustomFieldsFilterMixin, TagsFilterMixin, ChangeLoggedModelFilter):
|
class EventRuleFilter(BaseObjectTypeFilterMixin, CustomFieldsFilterMixin, TagsFilterMixin, ChangeLogFilterMixin):
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
description: FilterLookup[str] | None = strawberry_django.filter_field()
|
description: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
event_types: Annotated['StringArrayLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
|
event_types: Annotated['StringArrayLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
|
||||||
|
|||||||
@@ -3,20 +3,21 @@ from typing import Annotated, TYPE_CHECKING
|
|||||||
|
|
||||||
import strawberry
|
import strawberry
|
||||||
import strawberry_django
|
import strawberry_django
|
||||||
from strawberry_django import BaseFilterLookup
|
|
||||||
|
from core.graphql.filter_mixins import BaseFilterMixin
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from netbox.graphql.filter_lookups import IntegerLookup
|
from netbox.graphql.filter_lookups import IntegerLookup
|
||||||
from .enums import *
|
from .enums import *
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
'ServiceFilterMixin',
|
'ServiceBaseFilterMixin',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class ServiceFilterMixin:
|
class ServiceBaseFilterMixin(BaseFilterMixin):
|
||||||
protocol: BaseFilterLookup[Annotated['ServiceProtocolEnum', strawberry.lazy('ipam.graphql.enums')]] | None = (
|
protocol: Annotated['ServiceProtocolEnum', strawberry.lazy('ipam.graphql.enums')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
ports: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
|
ports: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
|
||||||
|
|||||||
@@ -9,13 +9,12 @@ from netaddr.core import AddrFormatError
|
|||||||
from strawberry.scalars import ID
|
from strawberry.scalars import ID
|
||||||
from strawberry_django import BaseFilterLookup, FilterLookup, DateFilterLookup
|
from strawberry_django import BaseFilterLookup, FilterLookup, DateFilterLookup
|
||||||
|
|
||||||
|
from core.graphql.filter_mixins import BaseObjectTypeFilterMixin, ChangeLogFilterMixin
|
||||||
from dcim.graphql.filter_mixins import ScopedFilterMixin
|
from dcim.graphql.filter_mixins import ScopedFilterMixin
|
||||||
from dcim.models import Device
|
from dcim.models import Device
|
||||||
from ipam import models
|
from ipam import models
|
||||||
from ipam.graphql.filter_mixins import ServiceFilterMixin
|
from ipam.graphql.filter_mixins import ServiceBaseFilterMixin
|
||||||
from netbox.graphql.filters import (
|
from netbox.graphql.filter_mixins import NetBoxModelFilterMixin, OrganizationalModelFilterMixin, PrimaryModelFilterMixin
|
||||||
ChangeLoggedModelFilter, NetBoxModelFilter, OrganizationalModelFilter, PrimaryModelFilter,
|
|
||||||
)
|
|
||||||
from tenancy.graphql.filter_mixins import ContactFilterMixin, TenancyFilterMixin
|
from tenancy.graphql.filter_mixins import ContactFilterMixin, TenancyFilterMixin
|
||||||
from virtualization.models import VMInterface
|
from virtualization.models import VMInterface
|
||||||
|
|
||||||
@@ -50,7 +49,7 @@ __all__ = (
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.ASN, lookups=True)
|
@strawberry_django.filter_type(models.ASN, lookups=True)
|
||||||
class ASNFilter(TenancyFilterMixin, PrimaryModelFilter):
|
class ASNFilter(TenancyFilterMixin, PrimaryModelFilterMixin):
|
||||||
rir: Annotated['RIRFilter', strawberry.lazy('ipam.graphql.filters')] | None = strawberry_django.filter_field()
|
rir: Annotated['RIRFilter', strawberry.lazy('ipam.graphql.filters')] | None = strawberry_django.filter_field()
|
||||||
rir_id: ID | None = strawberry_django.filter_field()
|
rir_id: ID | None = strawberry_django.filter_field()
|
||||||
asn: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
|
asn: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
|
||||||
@@ -65,7 +64,7 @@ class ASNFilter(TenancyFilterMixin, PrimaryModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.ASNRange, lookups=True)
|
@strawberry_django.filter_type(models.ASNRange, lookups=True)
|
||||||
class ASNRangeFilter(TenancyFilterMixin, OrganizationalModelFilter):
|
class ASNRangeFilter(TenancyFilterMixin, OrganizationalModelFilterMixin):
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
slug: FilterLookup[str] | None = strawberry_django.filter_field()
|
slug: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
rir: Annotated['RIRFilter', strawberry.lazy('ipam.graphql.filters')] | None = strawberry_django.filter_field()
|
rir: Annotated['RIRFilter', strawberry.lazy('ipam.graphql.filters')] | None = strawberry_django.filter_field()
|
||||||
@@ -79,7 +78,7 @@ class ASNRangeFilter(TenancyFilterMixin, OrganizationalModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.Aggregate, lookups=True)
|
@strawberry_django.filter_type(models.Aggregate, lookups=True)
|
||||||
class AggregateFilter(ContactFilterMixin, TenancyFilterMixin, PrimaryModelFilter):
|
class AggregateFilter(ContactFilterMixin, TenancyFilterMixin, PrimaryModelFilterMixin):
|
||||||
prefix: FilterLookup[str] | None = strawberry_django.filter_field()
|
prefix: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
rir: Annotated['RIRFilter', strawberry.lazy('ipam.graphql.filters')] | None = strawberry_django.filter_field()
|
rir: Annotated['RIRFilter', strawberry.lazy('ipam.graphql.filters')] | None = strawberry_django.filter_field()
|
||||||
rir_id: ID | None = strawberry_django.filter_field()
|
rir_id: ID | None = strawberry_django.filter_field()
|
||||||
@@ -112,7 +111,7 @@ class AggregateFilter(ContactFilterMixin, TenancyFilterMixin, PrimaryModelFilter
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.FHRPGroup, lookups=True)
|
@strawberry_django.filter_type(models.FHRPGroup, lookups=True)
|
||||||
class FHRPGroupFilter(PrimaryModelFilter):
|
class FHRPGroupFilter(PrimaryModelFilterMixin):
|
||||||
group_id: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
|
group_id: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -130,7 +129,7 @@ class FHRPGroupFilter(PrimaryModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.FHRPGroupAssignment, lookups=True)
|
@strawberry_django.filter_type(models.FHRPGroupAssignment, lookups=True)
|
||||||
class FHRPGroupAssignmentFilter(ChangeLoggedModelFilter):
|
class FHRPGroupAssignmentFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin):
|
||||||
interface_type: Annotated['ContentTypeFilter', strawberry.lazy('core.graphql.filters')] | None = (
|
interface_type: Annotated['ContentTypeFilter', strawberry.lazy('core.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -169,7 +168,7 @@ class FHRPGroupAssignmentFilter(ChangeLoggedModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.IPAddress, lookups=True)
|
@strawberry_django.filter_type(models.IPAddress, lookups=True)
|
||||||
class IPAddressFilter(ContactFilterMixin, TenancyFilterMixin, PrimaryModelFilter):
|
class IPAddressFilter(ContactFilterMixin, TenancyFilterMixin, PrimaryModelFilterMixin):
|
||||||
address: FilterLookup[str] | None = strawberry_django.filter_field()
|
address: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
vrf: Annotated['VRFFilter', strawberry.lazy('ipam.graphql.filters')] | None = strawberry_django.filter_field()
|
vrf: Annotated['VRFFilter', strawberry.lazy('ipam.graphql.filters')] | None = strawberry_django.filter_field()
|
||||||
vrf_id: ID | None = strawberry_django.filter_field()
|
vrf_id: ID | None = strawberry_django.filter_field()
|
||||||
@@ -220,7 +219,7 @@ class IPAddressFilter(ContactFilterMixin, TenancyFilterMixin, PrimaryModelFilter
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.IPRange, lookups=True)
|
@strawberry_django.filter_type(models.IPRange, lookups=True)
|
||||||
class IPRangeFilter(ContactFilterMixin, TenancyFilterMixin, PrimaryModelFilter):
|
class IPRangeFilter(ContactFilterMixin, TenancyFilterMixin, PrimaryModelFilterMixin):
|
||||||
start_address: FilterLookup[str] | None = strawberry_django.filter_field()
|
start_address: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
end_address: FilterLookup[str] | None = strawberry_django.filter_field()
|
end_address: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
size: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
|
size: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
|
||||||
@@ -274,7 +273,7 @@ class IPRangeFilter(ContactFilterMixin, TenancyFilterMixin, PrimaryModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.Prefix, lookups=True)
|
@strawberry_django.filter_type(models.Prefix, lookups=True)
|
||||||
class PrefixFilter(ContactFilterMixin, ScopedFilterMixin, TenancyFilterMixin, PrimaryModelFilter):
|
class PrefixFilter(ContactFilterMixin, ScopedFilterMixin, TenancyFilterMixin, PrimaryModelFilterMixin):
|
||||||
prefix: FilterLookup[str] | None = strawberry_django.filter_field()
|
prefix: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
vrf: Annotated['VRFFilter', strawberry.lazy('ipam.graphql.filters')] | None = strawberry_django.filter_field()
|
vrf: Annotated['VRFFilter', strawberry.lazy('ipam.graphql.filters')] | None = strawberry_django.filter_field()
|
||||||
vrf_id: ID | None = strawberry_django.filter_field()
|
vrf_id: ID | None = strawberry_django.filter_field()
|
||||||
@@ -311,19 +310,19 @@ class PrefixFilter(ContactFilterMixin, ScopedFilterMixin, TenancyFilterMixin, Pr
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.RIR, lookups=True)
|
@strawberry_django.filter_type(models.RIR, lookups=True)
|
||||||
class RIRFilter(OrganizationalModelFilter):
|
class RIRFilter(OrganizationalModelFilterMixin):
|
||||||
is_private: FilterLookup[bool] | None = strawberry_django.filter_field()
|
is_private: FilterLookup[bool] | None = strawberry_django.filter_field()
|
||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.Role, lookups=True)
|
@strawberry_django.filter_type(models.Role, lookups=True)
|
||||||
class RoleFilter(OrganizationalModelFilter):
|
class RoleFilter(OrganizationalModelFilterMixin):
|
||||||
weight: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
|
weight: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.RouteTarget, lookups=True)
|
@strawberry_django.filter_type(models.RouteTarget, lookups=True)
|
||||||
class RouteTargetFilter(TenancyFilterMixin, PrimaryModelFilter):
|
class RouteTargetFilter(TenancyFilterMixin, PrimaryModelFilterMixin):
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
importing_vrfs: Annotated['VRFFilter', strawberry.lazy('ipam.graphql.filters')] | None = (
|
importing_vrfs: Annotated['VRFFilter', strawberry.lazy('ipam.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
@@ -340,7 +339,7 @@ class RouteTargetFilter(TenancyFilterMixin, PrimaryModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.Service, lookups=True)
|
@strawberry_django.filter_type(models.Service, lookups=True)
|
||||||
class ServiceFilter(ContactFilterMixin, ServiceFilterMixin, PrimaryModelFilter):
|
class ServiceFilter(ContactFilterMixin, ServiceBaseFilterMixin, PrimaryModelFilterMixin):
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
ip_addresses: Annotated['IPAddressFilter', strawberry.lazy('ipam.graphql.filters')] | None = (
|
ip_addresses: Annotated['IPAddressFilter', strawberry.lazy('ipam.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
@@ -352,12 +351,12 @@ class ServiceFilter(ContactFilterMixin, ServiceFilterMixin, PrimaryModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.ServiceTemplate, lookups=True)
|
@strawberry_django.filter_type(models.ServiceTemplate, lookups=True)
|
||||||
class ServiceTemplateFilter(ServiceFilterMixin, PrimaryModelFilter):
|
class ServiceTemplateFilter(ServiceBaseFilterMixin, PrimaryModelFilterMixin):
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.VLAN, lookups=True)
|
@strawberry_django.filter_type(models.VLAN, lookups=True)
|
||||||
class VLANFilter(TenancyFilterMixin, PrimaryModelFilter):
|
class VLANFilter(TenancyFilterMixin, PrimaryModelFilterMixin):
|
||||||
site: Annotated['SiteFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
|
site: Annotated['SiteFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
|
||||||
site_id: ID | None = strawberry_django.filter_field()
|
site_id: ID | None = strawberry_django.filter_field()
|
||||||
group: Annotated['VLANGroupFilter', strawberry.lazy('ipam.graphql.filters')] | None = (
|
group: Annotated['VLANGroupFilter', strawberry.lazy('ipam.graphql.filters')] | None = (
|
||||||
@@ -389,19 +388,19 @@ class VLANFilter(TenancyFilterMixin, PrimaryModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.VLANGroup, lookups=True)
|
@strawberry_django.filter_type(models.VLANGroup, lookups=True)
|
||||||
class VLANGroupFilter(ScopedFilterMixin, OrganizationalModelFilter):
|
class VLANGroupFilter(ScopedFilterMixin, OrganizationalModelFilterMixin):
|
||||||
vid_ranges: Annotated['IntegerRangeArrayLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
|
vid_ranges: Annotated['IntegerRangeArrayLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.VLANTranslationPolicy, lookups=True)
|
@strawberry_django.filter_type(models.VLANTranslationPolicy, lookups=True)
|
||||||
class VLANTranslationPolicyFilter(PrimaryModelFilter):
|
class VLANTranslationPolicyFilter(PrimaryModelFilterMixin):
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.VLANTranslationRule, lookups=True)
|
@strawberry_django.filter_type(models.VLANTranslationRule, lookups=True)
|
||||||
class VLANTranslationRuleFilter(NetBoxModelFilter):
|
class VLANTranslationRuleFilter(NetBoxModelFilterMixin):
|
||||||
policy: Annotated['VLANTranslationPolicyFilter', strawberry.lazy('ipam.graphql.filters')] | None = (
|
policy: Annotated['VLANTranslationPolicyFilter', strawberry.lazy('ipam.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -416,7 +415,7 @@ class VLANTranslationRuleFilter(NetBoxModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.VRF, lookups=True)
|
@strawberry_django.filter_type(models.VRF, lookups=True)
|
||||||
class VRFFilter(TenancyFilterMixin, PrimaryModelFilter):
|
class VRFFilter(TenancyFilterMixin, PrimaryModelFilterMixin):
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
rd: FilterLookup[str] | None = strawberry_django.filter_field()
|
rd: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
enforce_unique: FilterLookup[bool] | None = strawberry_django.filter_field()
|
enforce_unique: FilterLookup[bool] | None = strawberry_django.filter_field()
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ from django.conf import settings
|
|||||||
from django_rq.queues import get_connection
|
from django_rq.queues import get_connection
|
||||||
from drf_spectacular.types import OpenApiTypes
|
from drf_spectacular.types import OpenApiTypes
|
||||||
from drf_spectacular.utils import extend_schema
|
from drf_spectacular.utils import extend_schema
|
||||||
from rest_framework.permissions import IsAuthenticated
|
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from rest_framework.reverse import reverse
|
from rest_framework.reverse import reverse
|
||||||
from rest_framework.views import APIView
|
from rest_framework.views import APIView
|
||||||
@@ -13,7 +12,6 @@ from rq.worker import Worker
|
|||||||
|
|
||||||
from netbox.api.authentication import IsAuthenticatedOrLoginNotRequired
|
from netbox.api.authentication import IsAuthenticatedOrLoginNotRequired
|
||||||
from netbox.plugins.utils import get_installed_plugins
|
from netbox.plugins.utils import get_installed_plugins
|
||||||
from users.api.serializers import UserSerializer
|
|
||||||
from utilities.apps import get_installed_apps
|
from utilities.apps import get_installed_apps
|
||||||
|
|
||||||
|
|
||||||
@@ -64,15 +62,3 @@ class StatusView(APIView):
|
|||||||
'python-version': platform.python_version(),
|
'python-version': platform.python_version(),
|
||||||
'rq-workers-running': Worker.count(get_connection('default')),
|
'rq-workers-running': Worker.count(get_connection('default')),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
class AuthenticationCheckView(APIView):
|
|
||||||
"""
|
|
||||||
Return the user making the request, if authenticated successfully.
|
|
||||||
"""
|
|
||||||
permission_classes = [IsAuthenticated]
|
|
||||||
|
|
||||||
@extend_schema(responses={200: OpenApiTypes.OBJECT})
|
|
||||||
def get(self, request):
|
|
||||||
serializer = UserSerializer(request.user, context={'request': request})
|
|
||||||
return Response(serializer.data)
|
|
||||||
|
|||||||
@@ -4,11 +4,19 @@ from typing import TypeVar, TYPE_CHECKING, Annotated
|
|||||||
|
|
||||||
import strawberry
|
import strawberry
|
||||||
import strawberry_django
|
import strawberry_django
|
||||||
|
from strawberry import ID
|
||||||
from strawberry_django import BaseFilterLookup, FilterLookup, DatetimeFilterLookup
|
from strawberry_django import BaseFilterLookup, FilterLookup, DatetimeFilterLookup
|
||||||
|
|
||||||
|
from core.graphql.filter_mixins import BaseFilterMixin, BaseObjectTypeFilterMixin, ChangeLogFilterMixin
|
||||||
|
from extras.graphql.filter_mixins import CustomFieldsFilterMixin, JournalEntriesFilterMixin, TagsFilterMixin
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
'DistanceFilterMixin',
|
'DistanceFilterMixin',
|
||||||
'ImageAttachmentFilterMixin',
|
'ImageAttachmentFilterMixin',
|
||||||
|
'NestedGroupModelFilterMixin',
|
||||||
|
'NetBoxModelFilterMixin',
|
||||||
|
'OrganizationalModelFilterMixin',
|
||||||
|
'PrimaryModelFilterMixin',
|
||||||
'SyncedDataFilterMixin',
|
'SyncedDataFilterMixin',
|
||||||
'WeightFilterMixin',
|
'WeightFilterMixin',
|
||||||
)
|
)
|
||||||
@@ -22,15 +30,51 @@ if TYPE_CHECKING:
|
|||||||
from extras.graphql.filters import *
|
from extras.graphql.filters import *
|
||||||
|
|
||||||
|
|
||||||
|
class NetBoxModelFilterMixin(
|
||||||
|
ChangeLogFilterMixin,
|
||||||
|
CustomFieldsFilterMixin,
|
||||||
|
JournalEntriesFilterMixin,
|
||||||
|
TagsFilterMixin,
|
||||||
|
BaseObjectTypeFilterMixin,
|
||||||
|
):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class ImageAttachmentFilterMixin:
|
class NestedGroupModelFilterMixin(NetBoxModelFilterMixin):
|
||||||
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
|
slug: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
|
description: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
|
parent_id: ID | None = strawberry_django.filter_field()
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class OrganizationalModelFilterMixin(
|
||||||
|
ChangeLogFilterMixin,
|
||||||
|
CustomFieldsFilterMixin,
|
||||||
|
TagsFilterMixin,
|
||||||
|
BaseObjectTypeFilterMixin,
|
||||||
|
):
|
||||||
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
|
slug: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
|
description: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class PrimaryModelFilterMixin(NetBoxModelFilterMixin):
|
||||||
|
description: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
|
comments: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class ImageAttachmentFilterMixin(BaseFilterMixin):
|
||||||
images: Annotated['ImageAttachmentFilter', strawberry.lazy('extras.graphql.filters')] | None = (
|
images: Annotated['ImageAttachmentFilter', strawberry.lazy('extras.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class WeightFilterMixin:
|
class WeightFilterMixin(BaseFilterMixin):
|
||||||
weight: FilterLookup[float] | None = strawberry_django.filter_field()
|
weight: FilterLookup[float] | None = strawberry_django.filter_field()
|
||||||
weight_unit: BaseFilterLookup[Annotated['WeightUnitEnum', strawberry.lazy('netbox.graphql.enums')]] | None = (
|
weight_unit: BaseFilterLookup[Annotated['WeightUnitEnum', strawberry.lazy('netbox.graphql.enums')]] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
@@ -38,7 +82,7 @@ class WeightFilterMixin:
|
|||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class SyncedDataFilterMixin:
|
class SyncedDataFilterMixin(BaseFilterMixin):
|
||||||
data_source: Annotated['DataSourceFilter', strawberry.lazy('core.graphql.filters')] | None = (
|
data_source: Annotated['DataSourceFilter', strawberry.lazy('core.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -53,7 +97,7 @@ class SyncedDataFilterMixin:
|
|||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class DistanceFilterMixin:
|
class DistanceFilterMixin(BaseFilterMixin):
|
||||||
distance: FilterLookup[float] | None = strawberry_django.filter_field()
|
distance: FilterLookup[float] | None = strawberry_django.filter_field()
|
||||||
distance_unit: BaseFilterLookup[Annotated['DistanceUnitEnum', strawberry.lazy('netbox.graphql.enums')]] | None = (
|
distance_unit: BaseFilterLookup[Annotated['DistanceUnitEnum', strawberry.lazy('netbox.graphql.enums')]] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
|
|||||||
@@ -1,61 +0,0 @@
|
|||||||
from dataclasses import dataclass
|
|
||||||
from typing import TYPE_CHECKING
|
|
||||||
|
|
||||||
import strawberry_django
|
|
||||||
from strawberry import ID
|
|
||||||
from strawberry_django import FilterLookup
|
|
||||||
|
|
||||||
from core.graphql.filter_mixins import ChangeLoggingMixin
|
|
||||||
from extras.graphql.filter_mixins import CustomFieldsFilterMixin, JournalEntriesFilterMixin, TagsFilterMixin
|
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
|
||||||
from .filters import *
|
|
||||||
|
|
||||||
__all__ = (
|
|
||||||
'BaseModelFilter',
|
|
||||||
'ChangeLoggedModelFilter',
|
|
||||||
'NestedGroupModelFilter',
|
|
||||||
'NetBoxModelFilter',
|
|
||||||
'OrganizationalModelFilter',
|
|
||||||
'PrimaryModelFilter',
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
|
||||||
class BaseModelFilter:
|
|
||||||
id: FilterLookup[ID] | None = strawberry_django.filter_field()
|
|
||||||
|
|
||||||
|
|
||||||
class ChangeLoggedModelFilter(ChangeLoggingMixin, BaseModelFilter):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class NetBoxModelFilter(
|
|
||||||
CustomFieldsFilterMixin,
|
|
||||||
JournalEntriesFilterMixin,
|
|
||||||
TagsFilterMixin,
|
|
||||||
ChangeLoggingMixin,
|
|
||||||
BaseModelFilter
|
|
||||||
):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
|
||||||
class NestedGroupModelFilter(NetBoxModelFilter):
|
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
|
||||||
slug: FilterLookup[str] | None = strawberry_django.filter_field()
|
|
||||||
description: FilterLookup[str] | None = strawberry_django.filter_field()
|
|
||||||
parent_id: ID | None = strawberry_django.filter_field()
|
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
|
||||||
class OrganizationalModelFilter(NetBoxModelFilter):
|
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
|
||||||
slug: FilterLookup[str] | None = strawberry_django.filter_field()
|
|
||||||
description: FilterLookup[str] | None = strawberry_django.filter_field()
|
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
|
||||||
class PrimaryModelFilter(NetBoxModelFilter):
|
|
||||||
description: FilterLookup[str] | None = strawberry_django.filter_field()
|
|
||||||
comments: FilterLookup[str] | None = strawberry_django.filter_field()
|
|
||||||
@@ -32,18 +32,6 @@ class AppTest(APITestCase):
|
|||||||
|
|
||||||
self.assertEqual(response.status_code, 200)
|
self.assertEqual(response.status_code, 200)
|
||||||
|
|
||||||
def test_authentication_check(self):
|
|
||||||
url = reverse('api-authentication-check')
|
|
||||||
|
|
||||||
# Test an unauthenticated request
|
|
||||||
response = self.client.get(f'{url}')
|
|
||||||
self.assertEqual(response.status_code, 403)
|
|
||||||
|
|
||||||
# Test an authenticated request
|
|
||||||
response = self.client.get(f'{url}', **self.header)
|
|
||||||
self.assertEqual(response.status_code, 200)
|
|
||||||
self.assertEqual(response.data['id'], self.user.pk)
|
|
||||||
|
|
||||||
|
|
||||||
class OptionalLimitOffsetPaginationTest(TestCase):
|
class OptionalLimitOffsetPaginationTest(TestCase):
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ from django.views.decorators.cache import cache_page
|
|||||||
from drf_spectacular.views import SpectacularAPIView, SpectacularRedocView, SpectacularSwaggerView
|
from drf_spectacular.views import SpectacularAPIView, SpectacularRedocView, SpectacularSwaggerView
|
||||||
|
|
||||||
from account.views import LoginView, LogoutView
|
from account.views import LoginView, LogoutView
|
||||||
from netbox.api.views import APIRootView, AuthenticationCheckView, StatusView
|
from netbox.api.views import APIRootView, StatusView
|
||||||
from netbox.graphql.schema import schema
|
from netbox.graphql.schema import schema
|
||||||
from netbox.graphql.views import NetBoxGraphQLView
|
from netbox.graphql.views import NetBoxGraphQLView
|
||||||
from netbox.plugins.urls import plugin_patterns, plugin_api_patterns
|
from netbox.plugins.urls import plugin_patterns, plugin_api_patterns
|
||||||
@@ -53,7 +53,6 @@ _patterns = [
|
|||||||
path('api/vpn/', include('vpn.api.urls')),
|
path('api/vpn/', include('vpn.api.urls')),
|
||||||
path('api/wireless/', include('wireless.api.urls')),
|
path('api/wireless/', include('wireless.api.urls')),
|
||||||
path('api/status/', StatusView.as_view(), name='api-status'),
|
path('api/status/', StatusView.as_view(), name='api-status'),
|
||||||
path('api/authentication-check/', AuthenticationCheckView.as_view(), name='api-authentication-check'),
|
|
||||||
|
|
||||||
# REST API schema
|
# REST API schema
|
||||||
path(
|
path(
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ import strawberry
|
|||||||
import strawberry_django
|
import strawberry_django
|
||||||
from strawberry import ID
|
from strawberry import ID
|
||||||
|
|
||||||
|
from core.graphql.filter_mixins import BaseFilterMixin
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from netbox.graphql.filter_lookups import TreeNodeFilter
|
from netbox.graphql.filter_lookups import TreeNodeFilter
|
||||||
from .filters import ContactAssignmentFilter, TenantFilter, TenantGroupFilter
|
from .filters import ContactAssignmentFilter, TenantFilter, TenantGroupFilter
|
||||||
@@ -16,14 +18,14 @@ __all__ = (
|
|||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class ContactFilterMixin:
|
class ContactFilterMixin(BaseFilterMixin):
|
||||||
contacts: Annotated['ContactAssignmentFilter', strawberry.lazy('tenancy.graphql.filters')] | None = (
|
contacts: Annotated['ContactAssignmentFilter', strawberry.lazy('tenancy.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class TenancyFilterMixin:
|
class TenancyFilterMixin(BaseFilterMixin):
|
||||||
tenant: Annotated['TenantFilter', strawberry.lazy('tenancy.graphql.filters')] | None = (
|
tenant: Annotated['TenantFilter', strawberry.lazy('tenancy.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -5,9 +5,12 @@ import strawberry_django
|
|||||||
from strawberry.scalars import ID
|
from strawberry.scalars import ID
|
||||||
from strawberry_django import BaseFilterLookup, FilterLookup
|
from strawberry_django import BaseFilterLookup, FilterLookup
|
||||||
|
|
||||||
|
from core.graphql.filter_mixins import ChangeLogFilterMixin
|
||||||
from extras.graphql.filter_mixins import CustomFieldsFilterMixin, TagsFilterMixin
|
from extras.graphql.filter_mixins import CustomFieldsFilterMixin, TagsFilterMixin
|
||||||
from netbox.graphql.filters import (
|
from netbox.graphql.filter_mixins import (
|
||||||
ChangeLoggedModelFilter, NestedGroupModelFilter, OrganizationalModelFilter, PrimaryModelFilter,
|
NestedGroupModelFilterMixin,
|
||||||
|
OrganizationalModelFilterMixin,
|
||||||
|
PrimaryModelFilterMixin,
|
||||||
)
|
)
|
||||||
from tenancy import models
|
from tenancy import models
|
||||||
from .filter_mixins import ContactFilterMixin
|
from .filter_mixins import ContactFilterMixin
|
||||||
@@ -54,7 +57,7 @@ __all__ = (
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.Tenant, lookups=True)
|
@strawberry_django.filter_type(models.Tenant, lookups=True)
|
||||||
class TenantFilter(ContactFilterMixin, PrimaryModelFilter):
|
class TenantFilter(PrimaryModelFilterMixin, ContactFilterMixin):
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
slug: FilterLookup[str] | None = strawberry_django.filter_field()
|
slug: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
group: Annotated['TenantGroupFilter', strawberry.lazy('tenancy.graphql.filters')] | None = (
|
group: Annotated['TenantGroupFilter', strawberry.lazy('tenancy.graphql.filters')] | None = (
|
||||||
@@ -133,7 +136,7 @@ class TenantFilter(ContactFilterMixin, PrimaryModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.TenantGroup, lookups=True)
|
@strawberry_django.filter_type(models.TenantGroup, lookups=True)
|
||||||
class TenantGroupFilter(OrganizationalModelFilter):
|
class TenantGroupFilter(OrganizationalModelFilterMixin):
|
||||||
parent: Annotated['TenantGroupFilter', strawberry.lazy('tenancy.graphql.filters')] | None = (
|
parent: Annotated['TenantGroupFilter', strawberry.lazy('tenancy.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -147,7 +150,7 @@ class TenantGroupFilter(OrganizationalModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.Contact, lookups=True)
|
@strawberry_django.filter_type(models.Contact, lookups=True)
|
||||||
class ContactFilter(PrimaryModelFilter):
|
class ContactFilter(PrimaryModelFilterMixin):
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
title: FilterLookup[str] | None = strawberry_django.filter_field()
|
title: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
phone: FilterLookup[str] | None = strawberry_django.filter_field()
|
phone: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
@@ -163,19 +166,19 @@ class ContactFilter(PrimaryModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.ContactRole, lookups=True)
|
@strawberry_django.filter_type(models.ContactRole, lookups=True)
|
||||||
class ContactRoleFilter(OrganizationalModelFilter):
|
class ContactRoleFilter(OrganizationalModelFilterMixin):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.ContactGroup, lookups=True)
|
@strawberry_django.filter_type(models.ContactGroup, lookups=True)
|
||||||
class ContactGroupFilter(NestedGroupModelFilter):
|
class ContactGroupFilter(NestedGroupModelFilterMixin):
|
||||||
parent: Annotated['ContactGroupFilter', strawberry.lazy('tenancy.graphql.filters')] | None = (
|
parent: Annotated['ContactGroupFilter', strawberry.lazy('tenancy.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.ContactAssignment, lookups=True)
|
@strawberry_django.filter_type(models.ContactAssignment, lookups=True)
|
||||||
class ContactAssignmentFilter(CustomFieldsFilterMixin, TagsFilterMixin, ChangeLoggedModelFilter):
|
class ContactAssignmentFilter(CustomFieldsFilterMixin, TagsFilterMixin, ChangeLogFilterMixin):
|
||||||
object_type: Annotated['ContentTypeFilter', strawberry.lazy('core.graphql.filters')] | None = (
|
object_type: Annotated['ContentTypeFilter', strawberry.lazy('core.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import strawberry
|
|||||||
import strawberry_django
|
import strawberry_django
|
||||||
from strawberry_django import DatetimeFilterLookup, FilterLookup
|
from strawberry_django import DatetimeFilterLookup, FilterLookup
|
||||||
|
|
||||||
from netbox.graphql.filters import BaseModelFilter
|
from core.graphql.filter_mixins import BaseObjectTypeFilterMixin
|
||||||
from users import models
|
from users import models
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
@@ -17,13 +17,13 @@ __all__ = (
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.Group, lookups=True)
|
@strawberry_django.filter_type(models.Group, lookups=True)
|
||||||
class GroupFilter(BaseModelFilter):
|
class GroupFilter(BaseObjectTypeFilterMixin):
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
description: FilterLookup[str] | None = strawberry_django.filter_field()
|
description: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.User, lookups=True)
|
@strawberry_django.filter_type(models.User, lookups=True)
|
||||||
class UserFilter(BaseModelFilter):
|
class UserFilter(BaseObjectTypeFilterMixin):
|
||||||
username: FilterLookup[str] | None = strawberry_django.filter_field()
|
username: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
first_name: FilterLookup[str] | None = strawberry_django.filter_field()
|
first_name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
last_name: FilterLookup[str] | None = strawberry_django.filter_field()
|
last_name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
@@ -36,7 +36,7 @@ class UserFilter(BaseModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.Owner, lookups=True)
|
@strawberry_django.filter_type(models.Owner, lookups=True)
|
||||||
class OwnerFilter(BaseModelFilter):
|
class OwnerFilter(BaseObjectTypeFilterMixin):
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
description: FilterLookup[str] | None = strawberry_django.filter_field()
|
description: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
group: Annotated['OwnerGroupFilter', strawberry.lazy('users.graphql.filters')] | None = (
|
group: Annotated['OwnerGroupFilter', strawberry.lazy('users.graphql.filters')] | None = (
|
||||||
@@ -49,6 +49,6 @@ class OwnerFilter(BaseModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.OwnerGroup, lookups=True)
|
@strawberry_django.filter_type(models.OwnerGroup, lookups=True)
|
||||||
class OwnerGroupFilter(BaseModelFilter):
|
class OwnerGroupFilter(BaseObjectTypeFilterMixin):
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
description: FilterLookup[str] | None = strawberry_django.filter_field()
|
description: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
|
|||||||
@@ -3,9 +3,11 @@ from typing import Annotated, TYPE_CHECKING
|
|||||||
|
|
||||||
import strawberry
|
import strawberry
|
||||||
import strawberry_django
|
import strawberry_django
|
||||||
from strawberry.scalars import ID
|
from strawberry import ID
|
||||||
from strawberry_django import FilterLookup
|
from strawberry_django import FilterLookup
|
||||||
|
|
||||||
|
from netbox.graphql.filter_mixins import NetBoxModelFilterMixin
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from .filters import VirtualMachineFilter
|
from .filters import VirtualMachineFilter
|
||||||
|
|
||||||
@@ -15,7 +17,7 @@ __all__ = (
|
|||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class VMComponentFilterMixin:
|
class VMComponentFilterMixin(NetBoxModelFilterMixin):
|
||||||
virtual_machine: Annotated['VirtualMachineFilter', strawberry.lazy('virtualization.graphql.filters')] | None = (
|
virtual_machine: Annotated['VirtualMachineFilter', strawberry.lazy('virtualization.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -7,8 +7,11 @@ from strawberry_django import BaseFilterLookup, FilterLookup
|
|||||||
|
|
||||||
from dcim.graphql.filter_mixins import InterfaceBaseFilterMixin, RenderConfigFilterMixin, ScopedFilterMixin
|
from dcim.graphql.filter_mixins import InterfaceBaseFilterMixin, RenderConfigFilterMixin, ScopedFilterMixin
|
||||||
from extras.graphql.filter_mixins import ConfigContextFilterMixin
|
from extras.graphql.filter_mixins import ConfigContextFilterMixin
|
||||||
from netbox.graphql.filter_mixins import ImageAttachmentFilterMixin
|
from netbox.graphql.filter_mixins import (
|
||||||
from netbox.graphql.filters import NetBoxModelFilter, OrganizationalModelFilter, PrimaryModelFilter
|
ImageAttachmentFilterMixin,
|
||||||
|
OrganizationalModelFilterMixin,
|
||||||
|
PrimaryModelFilterMixin,
|
||||||
|
)
|
||||||
from tenancy.graphql.filter_mixins import ContactFilterMixin, TenancyFilterMixin
|
from tenancy.graphql.filter_mixins import ContactFilterMixin, TenancyFilterMixin
|
||||||
from virtualization import models
|
from virtualization import models
|
||||||
from virtualization.graphql.filter_mixins import VMComponentFilterMixin
|
from virtualization.graphql.filter_mixins import VMComponentFilterMixin
|
||||||
@@ -37,7 +40,7 @@ __all__ = (
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.Cluster, lookups=True)
|
@strawberry_django.filter_type(models.Cluster, lookups=True)
|
||||||
class ClusterFilter(ContactFilterMixin, ScopedFilterMixin, TenancyFilterMixin, PrimaryModelFilter):
|
class ClusterFilter(ContactFilterMixin, ScopedFilterMixin, TenancyFilterMixin, PrimaryModelFilterMixin):
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
type: Annotated['ClusterTypeFilter', strawberry.lazy('virtualization.graphql.filters')] | None = (
|
type: Annotated['ClusterTypeFilter', strawberry.lazy('virtualization.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
@@ -56,14 +59,14 @@ class ClusterFilter(ContactFilterMixin, ScopedFilterMixin, TenancyFilterMixin, P
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.ClusterGroup, lookups=True)
|
@strawberry_django.filter_type(models.ClusterGroup, lookups=True)
|
||||||
class ClusterGroupFilter(ContactFilterMixin, OrganizationalModelFilter):
|
class ClusterGroupFilter(ContactFilterMixin, OrganizationalModelFilterMixin):
|
||||||
vlan_groups: Annotated['VLANGroupFilter', strawberry.lazy('ipam.graphql.filters')] | None = (
|
vlan_groups: Annotated['VLANGroupFilter', strawberry.lazy('ipam.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.ClusterType, lookups=True)
|
@strawberry_django.filter_type(models.ClusterType, lookups=True)
|
||||||
class ClusterTypeFilter(OrganizationalModelFilter):
|
class ClusterTypeFilter(OrganizationalModelFilterMixin):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
@@ -74,7 +77,7 @@ class VirtualMachineFilter(
|
|||||||
RenderConfigFilterMixin,
|
RenderConfigFilterMixin,
|
||||||
ConfigContextFilterMixin,
|
ConfigContextFilterMixin,
|
||||||
TenancyFilterMixin,
|
TenancyFilterMixin,
|
||||||
PrimaryModelFilter,
|
PrimaryModelFilterMixin,
|
||||||
):
|
):
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
site: Annotated['SiteFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
|
site: Annotated['SiteFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
|
||||||
@@ -135,7 +138,7 @@ class VirtualMachineFilter(
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.VMInterface, lookups=True)
|
@strawberry_django.filter_type(models.VMInterface, lookups=True)
|
||||||
class VMInterfaceFilter(InterfaceBaseFilterMixin, VMComponentFilterMixin, NetBoxModelFilter):
|
class VMInterfaceFilter(VMComponentFilterMixin, InterfaceBaseFilterMixin):
|
||||||
ip_addresses: Annotated['IPAddressFilter', strawberry.lazy('ipam.graphql.filters')] | None = (
|
ip_addresses: Annotated['IPAddressFilter', strawberry.lazy('ipam.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
@@ -160,7 +163,7 @@ class VMInterfaceFilter(InterfaceBaseFilterMixin, VMComponentFilterMixin, NetBox
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.VirtualDisk, lookups=True)
|
@strawberry_django.filter_type(models.VirtualDisk, lookups=True)
|
||||||
class VirtualDiskFilter(VMComponentFilterMixin, NetBoxModelFilter):
|
class VirtualDiskFilter(VMComponentFilterMixin):
|
||||||
size: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
|
size: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -5,10 +5,9 @@ import strawberry_django
|
|||||||
from strawberry.scalars import ID
|
from strawberry.scalars import ID
|
||||||
from strawberry_django import BaseFilterLookup, FilterLookup
|
from strawberry_django import BaseFilterLookup, FilterLookup
|
||||||
|
|
||||||
|
from core.graphql.filter_mixins import BaseObjectTypeFilterMixin, ChangeLogFilterMixin
|
||||||
from extras.graphql.filter_mixins import CustomFieldsFilterMixin, TagsFilterMixin
|
from extras.graphql.filter_mixins import CustomFieldsFilterMixin, TagsFilterMixin
|
||||||
from netbox.graphql.filters import (
|
from netbox.graphql.filter_mixins import NetBoxModelFilterMixin, OrganizationalModelFilterMixin, PrimaryModelFilterMixin
|
||||||
ChangeLoggedModelFilter, NetBoxModelFilter, OrganizationalModelFilter, PrimaryModelFilter,
|
|
||||||
)
|
|
||||||
from tenancy.graphql.filter_mixins import ContactFilterMixin, TenancyFilterMixin
|
from tenancy.graphql.filter_mixins import ContactFilterMixin, TenancyFilterMixin
|
||||||
from vpn import models
|
from vpn import models
|
||||||
|
|
||||||
@@ -33,12 +32,14 @@ __all__ = (
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.TunnelGroup, lookups=True)
|
@strawberry_django.filter_type(models.TunnelGroup, lookups=True)
|
||||||
class TunnelGroupFilter(OrganizationalModelFilter):
|
class TunnelGroupFilter(OrganizationalModelFilterMixin):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.TunnelTermination, lookups=True)
|
@strawberry_django.filter_type(models.TunnelTermination, lookups=True)
|
||||||
class TunnelTerminationFilter(CustomFieldsFilterMixin, TagsFilterMixin, ChangeLoggedModelFilter):
|
class TunnelTerminationFilter(
|
||||||
|
BaseObjectTypeFilterMixin, CustomFieldsFilterMixin, TagsFilterMixin, ChangeLogFilterMixin
|
||||||
|
):
|
||||||
tunnel: Annotated['TunnelFilter', strawberry.lazy('vpn.graphql.filters')] | None = strawberry_django.filter_field()
|
tunnel: Annotated['TunnelFilter', strawberry.lazy('vpn.graphql.filters')] | None = strawberry_django.filter_field()
|
||||||
tunnel_id: ID | None = strawberry_django.filter_field()
|
tunnel_id: ID | None = strawberry_django.filter_field()
|
||||||
role: BaseFilterLookup[Annotated['TunnelTerminationRoleEnum', strawberry.lazy('vpn.graphql.enums')]] | None = (
|
role: BaseFilterLookup[Annotated['TunnelTerminationRoleEnum', strawberry.lazy('vpn.graphql.enums')]] | None = (
|
||||||
@@ -58,7 +59,7 @@ class TunnelTerminationFilter(CustomFieldsFilterMixin, TagsFilterMixin, ChangeLo
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.Tunnel, lookups=True)
|
@strawberry_django.filter_type(models.Tunnel, lookups=True)
|
||||||
class TunnelFilter(TenancyFilterMixin, PrimaryModelFilter):
|
class TunnelFilter(TenancyFilterMixin, PrimaryModelFilterMixin):
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
status: BaseFilterLookup[Annotated['TunnelStatusEnum', strawberry.lazy('vpn.graphql.enums')]] | None = (
|
status: BaseFilterLookup[Annotated['TunnelStatusEnum', strawberry.lazy('vpn.graphql.enums')]] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
@@ -84,7 +85,7 @@ class TunnelFilter(TenancyFilterMixin, PrimaryModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.IKEProposal, lookups=True)
|
@strawberry_django.filter_type(models.IKEProposal, lookups=True)
|
||||||
class IKEProposalFilter(PrimaryModelFilter):
|
class IKEProposalFilter(PrimaryModelFilterMixin):
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
authentication_method: (
|
authentication_method: (
|
||||||
BaseFilterLookup[Annotated['AuthenticationMethodEnum', strawberry.lazy('vpn.graphql.enums')]] | None
|
BaseFilterLookup[Annotated['AuthenticationMethodEnum', strawberry.lazy('vpn.graphql.enums')]] | None
|
||||||
@@ -113,7 +114,7 @@ class IKEProposalFilter(PrimaryModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.IKEPolicy, lookups=True)
|
@strawberry_django.filter_type(models.IKEPolicy, lookups=True)
|
||||||
class IKEPolicyFilter(PrimaryModelFilter):
|
class IKEPolicyFilter(PrimaryModelFilterMixin):
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
version: BaseFilterLookup[Annotated['IKEVersionEnum', strawberry.lazy('vpn.graphql.enums')]] | None = (
|
version: BaseFilterLookup[Annotated['IKEVersionEnum', strawberry.lazy('vpn.graphql.enums')]] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
@@ -128,7 +129,7 @@ class IKEPolicyFilter(PrimaryModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.IPSecProposal, lookups=True)
|
@strawberry_django.filter_type(models.IPSecProposal, lookups=True)
|
||||||
class IPSecProposalFilter(PrimaryModelFilter):
|
class IPSecProposalFilter(PrimaryModelFilterMixin):
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
encryption_algorithm: (
|
encryption_algorithm: (
|
||||||
BaseFilterLookup[Annotated['EncryptionAlgorithmEnum', strawberry.lazy('vpn.graphql.enums')]] | None
|
BaseFilterLookup[Annotated['EncryptionAlgorithmEnum', strawberry.lazy('vpn.graphql.enums')]] | None
|
||||||
@@ -154,7 +155,7 @@ class IPSecProposalFilter(PrimaryModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.IPSecPolicy, lookups=True)
|
@strawberry_django.filter_type(models.IPSecPolicy, lookups=True)
|
||||||
class IPSecPolicyFilter(PrimaryModelFilter):
|
class IPSecPolicyFilter(PrimaryModelFilterMixin):
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
proposals: Annotated['IPSecProposalFilter', strawberry.lazy('vpn.graphql.filters')] | None = (
|
proposals: Annotated['IPSecProposalFilter', strawberry.lazy('vpn.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
@@ -165,7 +166,7 @@ class IPSecPolicyFilter(PrimaryModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.IPSecProfile, lookups=True)
|
@strawberry_django.filter_type(models.IPSecProfile, lookups=True)
|
||||||
class IPSecProfileFilter(PrimaryModelFilter):
|
class IPSecProfileFilter(PrimaryModelFilterMixin):
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
mode: BaseFilterLookup[Annotated['IPSecModeEnum', strawberry.lazy('vpn.graphql.enums')]] | None = (
|
mode: BaseFilterLookup[Annotated['IPSecModeEnum', strawberry.lazy('vpn.graphql.enums')]] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
@@ -181,7 +182,7 @@ class IPSecProfileFilter(PrimaryModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.L2VPN, lookups=True)
|
@strawberry_django.filter_type(models.L2VPN, lookups=True)
|
||||||
class L2VPNFilter(ContactFilterMixin, TenancyFilterMixin, PrimaryModelFilter):
|
class L2VPNFilter(ContactFilterMixin, TenancyFilterMixin, PrimaryModelFilterMixin):
|
||||||
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
name: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
slug: FilterLookup[str] | None = strawberry_django.filter_field()
|
slug: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
type: BaseFilterLookup[Annotated['L2VPNTypeEnum', strawberry.lazy('vpn.graphql.enums')]] | None = (
|
type: BaseFilterLookup[Annotated['L2VPNTypeEnum', strawberry.lazy('vpn.graphql.enums')]] | None = (
|
||||||
@@ -205,7 +206,7 @@ class L2VPNFilter(ContactFilterMixin, TenancyFilterMixin, PrimaryModelFilter):
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.L2VPNTermination, lookups=True)
|
@strawberry_django.filter_type(models.L2VPNTermination, lookups=True)
|
||||||
class L2VPNTerminationFilter(NetBoxModelFilter):
|
class L2VPNTerminationFilter(NetBoxModelFilterMixin):
|
||||||
l2vpn: Annotated['L2VPNFilter', strawberry.lazy('vpn.graphql.filters')] | None = strawberry_django.filter_field()
|
l2vpn: Annotated['L2VPNFilter', strawberry.lazy('vpn.graphql.filters')] | None = strawberry_django.filter_field()
|
||||||
l2vpn_id: ID | None = strawberry_django.filter_field()
|
l2vpn_id: ID | None = strawberry_django.filter_field()
|
||||||
assigned_object_type: Annotated['ContentTypeFilter', strawberry.lazy('core.graphql.filters')] | None = (
|
assigned_object_type: Annotated['ContentTypeFilter', strawberry.lazy('core.graphql.filters')] | None = (
|
||||||
|
|||||||
@@ -5,16 +5,18 @@ import strawberry
|
|||||||
import strawberry_django
|
import strawberry_django
|
||||||
from strawberry_django import FilterLookup
|
from strawberry_django import FilterLookup
|
||||||
|
|
||||||
|
from core.graphql.filter_mixins import BaseFilterMixin
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from .enums import *
|
from .enums import *
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
'WirelessAuthenticationFilterMixin',
|
'WirelessAuthenticationBaseFilterMixin',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class WirelessAuthenticationFilterMixin:
|
class WirelessAuthenticationBaseFilterMixin(BaseFilterMixin):
|
||||||
auth_type: Annotated['WirelessAuthTypeEnum', strawberry.lazy('wireless.graphql.enums')] | None = (
|
auth_type: Annotated['WirelessAuthTypeEnum', strawberry.lazy('wireless.graphql.enums')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -6,11 +6,10 @@ from strawberry.scalars import ID
|
|||||||
from strawberry_django import BaseFilterLookup, FilterLookup
|
from strawberry_django import BaseFilterLookup, FilterLookup
|
||||||
|
|
||||||
from dcim.graphql.filter_mixins import ScopedFilterMixin
|
from dcim.graphql.filter_mixins import ScopedFilterMixin
|
||||||
from netbox.graphql.filter_mixins import DistanceFilterMixin
|
from netbox.graphql.filter_mixins import DistanceFilterMixin, PrimaryModelFilterMixin, NestedGroupModelFilterMixin
|
||||||
from netbox.graphql.filters import PrimaryModelFilter, NestedGroupModelFilter
|
|
||||||
from tenancy.graphql.filter_mixins import TenancyFilterMixin
|
from tenancy.graphql.filter_mixins import TenancyFilterMixin
|
||||||
from wireless import models
|
from wireless import models
|
||||||
from .filter_mixins import WirelessAuthenticationFilterMixin
|
from .filter_mixins import WirelessAuthenticationBaseFilterMixin
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from dcim.graphql.filters import InterfaceFilter
|
from dcim.graphql.filters import InterfaceFilter
|
||||||
@@ -25,16 +24,16 @@ __all__ = (
|
|||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.WirelessLANGroup, lookups=True)
|
@strawberry_django.filter_type(models.WirelessLANGroup, lookups=True)
|
||||||
class WirelessLANGroupFilter(NestedGroupModelFilter):
|
class WirelessLANGroupFilter(NestedGroupModelFilterMixin):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
@strawberry_django.filter_type(models.WirelessLAN, lookups=True)
|
@strawberry_django.filter_type(models.WirelessLAN, lookups=True)
|
||||||
class WirelessLANFilter(
|
class WirelessLANFilter(
|
||||||
WirelessAuthenticationFilterMixin,
|
WirelessAuthenticationBaseFilterMixin,
|
||||||
ScopedFilterMixin,
|
ScopedFilterMixin,
|
||||||
TenancyFilterMixin,
|
TenancyFilterMixin,
|
||||||
PrimaryModelFilter
|
PrimaryModelFilterMixin
|
||||||
):
|
):
|
||||||
ssid: FilterLookup[str] | None = strawberry_django.filter_field()
|
ssid: FilterLookup[str] | None = strawberry_django.filter_field()
|
||||||
status: BaseFilterLookup[Annotated['WirelessLANStatusEnum', strawberry.lazy('wireless.graphql.enums')]] | None = (
|
status: BaseFilterLookup[Annotated['WirelessLANStatusEnum', strawberry.lazy('wireless.graphql.enums')]] | None = (
|
||||||
@@ -50,10 +49,10 @@ class WirelessLANFilter(
|
|||||||
|
|
||||||
@strawberry_django.filter_type(models.WirelessLink, lookups=True)
|
@strawberry_django.filter_type(models.WirelessLink, lookups=True)
|
||||||
class WirelessLinkFilter(
|
class WirelessLinkFilter(
|
||||||
WirelessAuthenticationFilterMixin,
|
WirelessAuthenticationBaseFilterMixin,
|
||||||
DistanceFilterMixin,
|
DistanceFilterMixin,
|
||||||
TenancyFilterMixin,
|
TenancyFilterMixin,
|
||||||
PrimaryModelFilter
|
PrimaryModelFilterMixin
|
||||||
):
|
):
|
||||||
interface_a: Annotated['InterfaceFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
|
interface_a: Annotated['InterfaceFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
|
||||||
strawberry_django.filter_field()
|
strawberry_django.filter_field()
|
||||||
|
|||||||
Reference in New Issue
Block a user