Update GraphQL types to support owner assignment

This commit is contained in:
Jeremy Stretch
2025-10-21 12:22:40 -04:00
parent a4d52b46ed
commit 7d0f68c97f
11 changed files with 133 additions and 93 deletions

View File

@@ -6,7 +6,7 @@ import strawberry_django
from circuits import models
from dcim.graphql.mixins import CabledObjectMixin
from extras.graphql.mixins import ContactsMixin, CustomFieldsMixin, TagsMixin
from netbox.graphql.types import BaseObjectType, NetBoxObjectType, ObjectType, OrganizationalObjectType
from netbox.graphql.types import BaseObjectType, ObjectType, OrganizationalObjectType, PrimaryObjectType
from tenancy.graphql.types import TenantType
from .filters import *
@@ -35,8 +35,7 @@ __all__ = (
filters=ProviderFilter,
pagination=True
)
class ProviderType(NetBoxObjectType, ContactsMixin):
class ProviderType(ContactsMixin, PrimaryObjectType):
networks: List[Annotated["ProviderNetworkType", strawberry.lazy('circuits.graphql.types')]]
circuits: List[Annotated["CircuitType", strawberry.lazy('circuits.graphql.types')]]
asns: List[Annotated["ASNType", strawberry.lazy('ipam.graphql.types')]]
@@ -49,9 +48,8 @@ class ProviderType(NetBoxObjectType, ContactsMixin):
filters=ProviderAccountFilter,
pagination=True
)
class ProviderAccountType(ContactsMixin, NetBoxObjectType):
class ProviderAccountType(ContactsMixin, PrimaryObjectType):
provider: Annotated["ProviderType", strawberry.lazy('circuits.graphql.types')]
circuits: List[Annotated["CircuitType", strawberry.lazy('circuits.graphql.types')]]
@@ -61,9 +59,8 @@ class ProviderAccountType(ContactsMixin, NetBoxObjectType):
filters=ProviderNetworkFilter,
pagination=True
)
class ProviderNetworkType(NetBoxObjectType):
class ProviderNetworkType(PrimaryObjectType):
provider: Annotated["ProviderType", strawberry.lazy('circuits.graphql.types')]
circuit_terminations: List[Annotated["CircuitTerminationType", strawberry.lazy('circuits.graphql.types')]]
@@ -105,14 +102,13 @@ class CircuitTypeType(OrganizationalObjectType):
filters=CircuitFilter,
pagination=True
)
class CircuitType(NetBoxObjectType, ContactsMixin):
class CircuitType(PrimaryObjectType, ContactsMixin):
provider: ProviderType
provider_account: ProviderAccountType | None
termination_a: CircuitTerminationType | None
termination_z: CircuitTerminationType | None
type: CircuitTypeType
tenant: TenantType | None
terminations: List[CircuitTerminationType]
@@ -178,12 +174,11 @@ class VirtualCircuitTerminationType(CustomFieldsMixin, TagsMixin, ObjectType):
filters=VirtualCircuitFilter,
pagination=True
)
class VirtualCircuitType(NetBoxObjectType):
class VirtualCircuitType(PrimaryObjectType):
provider_network: ProviderNetworkType = strawberry_django.field(select_related=["provider_network"])
provider_account: ProviderAccountType | None
type: Annotated["VirtualCircuitTypeType", strawberry.lazy('circuits.graphql.types')] = strawberry_django.field(
select_related=["type"]
)
tenant: TenantType | None
terminations: List[VirtualCircuitTerminationType]

View File

@@ -5,7 +5,7 @@ import strawberry_django
from django.contrib.contenttypes.models import ContentType as DjangoContentType
from core import models
from netbox.graphql.types import BaseObjectType, NetBoxObjectType
from netbox.graphql.types import BaseObjectType, PrimaryObjectType
from .filters import *
__all__ = (
@@ -32,8 +32,7 @@ class DataFileType(BaseObjectType):
filters=DataSourceFilter,
pagination=True
)
class DataSourceType(NetBoxObjectType):
class DataSourceType(PrimaryObjectType):
datafiles: List[Annotated["DataFileType", strawberry.lazy('core.graphql.types')]]

View File

@@ -14,7 +14,10 @@ from extras.graphql.mixins import (
)
from ipam.graphql.mixins import IPAddressesMixin, VLANGroupsMixin
from netbox.graphql.scalars import BigInt
from netbox.graphql.types import BaseObjectType, NetBoxObjectType, OrganizationalObjectType
from netbox.graphql.types import (
BaseObjectType, NestedGroupObjectType, NetBoxObjectType, OrganizationalObjectType, PrimaryObjectType,
)
from users.graphql.mixins import OwnerMixin
from .filters import *
from .mixins import CabledObjectMixin, PathEndpointMixin
@@ -94,6 +97,7 @@ __all__ = (
class ComponentType(
ChangelogMixin,
CustomFieldsMixin,
OwnerMixin,
TagsMixin,
BaseObjectType
):
@@ -159,7 +163,7 @@ class CableTerminationType(NetBoxObjectType):
filters=CableFilter,
pagination=True
)
class CableType(NetBoxObjectType):
class CableType(PrimaryObjectType):
color: str
tenant: Annotated["TenantType", strawberry.lazy('tenancy.graphql.types')] | None
@@ -236,7 +240,7 @@ class ConsoleServerPortTemplateType(ModularComponentTemplateType):
filters=DeviceFilter,
pagination=True
)
class DeviceType(ConfigContextMixin, ImageAttachmentsMixin, ContactsMixin, NetBoxObjectType):
class DeviceType(ConfigContextMixin, ImageAttachmentsMixin, ContactsMixin, PrimaryObjectType):
console_port_count: BigInt
console_server_port_count: BigInt
power_port_count: BigInt
@@ -339,7 +343,7 @@ class InventoryItemTemplateType(ComponentTemplateType):
filters=DeviceRoleFilter,
pagination=True
)
class DeviceRoleType(OrganizationalObjectType):
class DeviceRoleType(NestedGroupObjectType):
parent: Annotated['DeviceRoleType', strawberry.lazy('dcim.graphql.types')] | None
children: List[Annotated['DeviceRoleType', strawberry.lazy('dcim.graphql.types')]]
color: str
@@ -355,7 +359,7 @@ class DeviceRoleType(OrganizationalObjectType):
filters=DeviceTypeFilter,
pagination=True
)
class DeviceTypeType(NetBoxObjectType):
class DeviceTypeType(PrimaryObjectType):
console_port_template_count: BigInt
console_server_port_template_count: BigInt
power_port_template_count: BigInt
@@ -412,7 +416,7 @@ class FrontPortTemplateType(ModularComponentTemplateType):
filters=MACAddressFilter,
pagination=True
)
class MACAddressType(NetBoxObjectType):
class MACAddressType(PrimaryObjectType):
mac_address: str
@strawberry_django.field
@@ -512,7 +516,7 @@ class InventoryItemRoleType(OrganizationalObjectType):
filters=LocationFilter,
pagination=True
)
class LocationType(VLANGroupsMixin, ImageAttachmentsMixin, ContactsMixin, OrganizationalObjectType):
class LocationType(VLANGroupsMixin, ImageAttachmentsMixin, ContactsMixin, NestedGroupObjectType):
site: Annotated["SiteType", strawberry.lazy('dcim.graphql.types')]
tenant: Annotated["TenantType", strawberry.lazy('tenancy.graphql.types')] | None
parent: Annotated["LocationType", strawberry.lazy('dcim.graphql.types')] | None
@@ -555,7 +559,7 @@ class ManufacturerType(OrganizationalObjectType, ContactsMixin):
filters=ModuleFilter,
pagination=True
)
class ModuleType(NetBoxObjectType):
class ModuleType(PrimaryObjectType):
device: Annotated["DeviceType", strawberry.lazy('dcim.graphql.types')]
module_bay: Annotated["ModuleBayType", strawberry.lazy('dcim.graphql.types')]
module_type: Annotated["ModuleTypeType", strawberry.lazy('dcim.graphql.types')]
@@ -602,7 +606,7 @@ class ModuleBayTemplateType(ModularComponentTemplateType):
filters=ModuleTypeProfileFilter,
pagination=True
)
class ModuleTypeProfileType(NetBoxObjectType):
class ModuleTypeProfileType(PrimaryObjectType):
module_types: List[Annotated["ModuleType", strawberry.lazy('dcim.graphql.types')]]
@@ -612,7 +616,7 @@ class ModuleTypeProfileType(NetBoxObjectType):
filters=ModuleTypeFilter,
pagination=True
)
class ModuleTypeType(NetBoxObjectType):
class ModuleTypeType(PrimaryObjectType):
profile: Annotated["ModuleTypeProfileType", strawberry.lazy('dcim.graphql.types')] | None
manufacturer: Annotated["ManufacturerType", strawberry.lazy('dcim.graphql.types')]
@@ -632,7 +636,7 @@ class ModuleTypeType(NetBoxObjectType):
filters=PlatformFilter,
pagination=True
)
class PlatformType(OrganizationalObjectType):
class PlatformType(NestedGroupObjectType):
parent: Annotated['PlatformType', strawberry.lazy('dcim.graphql.types')] | None
children: List[Annotated['PlatformType', strawberry.lazy('dcim.graphql.types')]]
manufacturer: Annotated["ManufacturerType", strawberry.lazy('dcim.graphql.types')] | None
@@ -648,7 +652,7 @@ class PlatformType(OrganizationalObjectType):
filters=PowerFeedFilter,
pagination=True
)
class PowerFeedType(NetBoxObjectType, CabledObjectMixin, PathEndpointMixin):
class PowerFeedType(CabledObjectMixin, PathEndpointMixin, PrimaryObjectType):
power_panel: Annotated["PowerPanelType", strawberry.lazy('dcim.graphql.types')]
rack: Annotated["RackType", strawberry.lazy('dcim.graphql.types')] | None
tenant: Annotated["TenantType", strawberry.lazy('tenancy.graphql.types')] | None
@@ -681,7 +685,7 @@ class PowerOutletTemplateType(ModularComponentTemplateType):
filters=PowerPanelFilter,
pagination=True
)
class PowerPanelType(NetBoxObjectType, ContactsMixin):
class PowerPanelType(ContactsMixin, PrimaryObjectType):
site: Annotated["SiteType", strawberry.lazy('dcim.graphql.types')]
location: Annotated["LocationType", strawberry.lazy('dcim.graphql.types')] | None
@@ -715,7 +719,7 @@ class PowerPortTemplateType(ModularComponentTemplateType):
filters=RackTypeFilter,
pagination=True
)
class RackTypeType(NetBoxObjectType):
class RackTypeType(PrimaryObjectType):
manufacturer: Annotated["ManufacturerType", strawberry.lazy('dcim.graphql.types')]
@@ -725,7 +729,7 @@ class RackTypeType(NetBoxObjectType):
filters=RackFilter,
pagination=True
)
class RackType(VLANGroupsMixin, ImageAttachmentsMixin, ContactsMixin, NetBoxObjectType):
class RackType(VLANGroupsMixin, ImageAttachmentsMixin, ContactsMixin, PrimaryObjectType):
site: Annotated["SiteType", strawberry.lazy('dcim.graphql.types')]
location: Annotated["LocationType", strawberry.lazy('dcim.graphql.types')] | None
tenant: Annotated["TenantType", strawberry.lazy('tenancy.graphql.types')] | None
@@ -744,7 +748,7 @@ class RackType(VLANGroupsMixin, ImageAttachmentsMixin, ContactsMixin, NetBoxObje
filters=RackReservationFilter,
pagination=True
)
class RackReservationType(NetBoxObjectType):
class RackReservationType(PrimaryObjectType):
units: List[int]
rack: Annotated["RackType", strawberry.lazy('dcim.graphql.types')]
tenant: Annotated["TenantType", strawberry.lazy('tenancy.graphql.types')] | None
@@ -793,7 +797,7 @@ class RearPortTemplateType(ModularComponentTemplateType):
filters=RegionFilter,
pagination=True
)
class RegionType(VLANGroupsMixin, ContactsMixin, OrganizationalObjectType):
class RegionType(VLANGroupsMixin, ContactsMixin, NestedGroupObjectType):
sites: List[Annotated["SiteType", strawberry.lazy('dcim.graphql.types')]]
children: List[Annotated["RegionType", strawberry.lazy('dcim.graphql.types')]]
@@ -819,7 +823,7 @@ class RegionType(VLANGroupsMixin, ContactsMixin, OrganizationalObjectType):
filters=SiteFilter,
pagination=True
)
class SiteType(VLANGroupsMixin, ImageAttachmentsMixin, ContactsMixin, NetBoxObjectType):
class SiteType(VLANGroupsMixin, ImageAttachmentsMixin, ContactsMixin, PrimaryObjectType):
time_zone: str | None
region: Annotated["RegionType", strawberry.lazy('dcim.graphql.types')] | None
group: Annotated["SiteGroupType", strawberry.lazy('dcim.graphql.types')] | None
@@ -854,7 +858,7 @@ class SiteType(VLANGroupsMixin, ImageAttachmentsMixin, ContactsMixin, NetBoxObje
filters=SiteGroupFilter,
pagination=True
)
class SiteGroupType(VLANGroupsMixin, ContactsMixin, OrganizationalObjectType):
class SiteGroupType(VLANGroupsMixin, ContactsMixin, NestedGroupObjectType):
sites: List[Annotated["SiteType", strawberry.lazy('dcim.graphql.types')]]
children: List[Annotated["SiteGroupType", strawberry.lazy('dcim.graphql.types')]]
@@ -880,7 +884,7 @@ class SiteGroupType(VLANGroupsMixin, ContactsMixin, OrganizationalObjectType):
filters=VirtualChassisFilter,
pagination=True
)
class VirtualChassisType(NetBoxObjectType):
class VirtualChassisType(PrimaryObjectType):
member_count: BigInt
master: Annotated["DeviceType", strawberry.lazy('dcim.graphql.types')] | None
@@ -893,7 +897,7 @@ class VirtualChassisType(NetBoxObjectType):
filters=VirtualDeviceContextFilter,
pagination=True
)
class VirtualDeviceContextType(NetBoxObjectType):
class VirtualDeviceContextType(PrimaryObjectType):
device: Annotated["DeviceType", strawberry.lazy('dcim.graphql.types')] | None
primary_ip4: Annotated["IPAddressType", strawberry.lazy('ipam.graphql.types')] | None
primary_ip6: Annotated["IPAddressType", strawberry.lazy('ipam.graphql.types')] | None

View File

@@ -6,7 +6,8 @@ import strawberry_django
from core.graphql.mixins import SyncedDataMixin
from extras import models
from extras.graphql.mixins import CustomFieldsMixin, TagsMixin
from netbox.graphql.types import BaseObjectType, ContentTypeType, NetBoxObjectType, ObjectType, OrganizationalObjectType
from netbox.graphql.types import BaseObjectType, ContentTypeType, ObjectType, PrimaryObjectType
from users.graphql.mixins import OwnerMixin
from .filters import *
if TYPE_CHECKING:
@@ -51,7 +52,7 @@ __all__ = (
filters=ConfigContextProfileFilter,
pagination=True
)
class ConfigContextProfileType(SyncedDataMixin, NetBoxObjectType):
class ConfigContextProfileType(SyncedDataMixin, PrimaryObjectType):
pass
@@ -61,7 +62,7 @@ class ConfigContextProfileType(SyncedDataMixin, NetBoxObjectType):
filters=ConfigContextFilter,
pagination=True
)
class ConfigContextType(SyncedDataMixin, ObjectType):
class ConfigContextType(SyncedDataMixin, OwnerMixin, ObjectType):
profile: ConfigContextProfileType | None
roles: List[Annotated["DeviceRoleType", strawberry.lazy('dcim.graphql.types')]]
device_types: List[Annotated["DeviceTypeType", strawberry.lazy('dcim.graphql.types')]]
@@ -84,7 +85,7 @@ class ConfigContextType(SyncedDataMixin, ObjectType):
filters=ConfigTemplateFilter,
pagination=True
)
class ConfigTemplateType(SyncedDataMixin, TagsMixin, ObjectType):
class ConfigTemplateType(SyncedDataMixin, OwnerMixin, TagsMixin, ObjectType):
virtualmachines: List[Annotated["VirtualMachineType", strawberry.lazy('virtualization.graphql.types')]]
devices: List[Annotated["DeviceType", strawberry.lazy('dcim.graphql.types')]]
platforms: List[Annotated["PlatformType", strawberry.lazy('dcim.graphql.types')]]
@@ -97,7 +98,7 @@ class ConfigTemplateType(SyncedDataMixin, TagsMixin, ObjectType):
filters=CustomFieldFilter,
pagination=True
)
class CustomFieldType(ObjectType):
class CustomFieldType(OwnerMixin, ObjectType):
related_object_type: Annotated["ContentTypeType", strawberry.lazy('netbox.graphql.types')] | None
choice_set: Annotated["CustomFieldChoiceSetType", strawberry.lazy('extras.graphql.types')] | None
@@ -108,7 +109,7 @@ class CustomFieldType(ObjectType):
filters=CustomFieldChoiceSetFilter,
pagination=True
)
class CustomFieldChoiceSetType(ObjectType):
class CustomFieldChoiceSetType(OwnerMixin, ObjectType):
choices_for: List[Annotated["CustomFieldType", strawberry.lazy('extras.graphql.types')]]
extra_choices: List[List[str]] | None
@@ -120,7 +121,7 @@ class CustomFieldChoiceSetType(ObjectType):
filters=CustomLinkFilter,
pagination=True
)
class CustomLinkType(ObjectType):
class CustomLinkType(OwnerMixin, ObjectType):
pass
@@ -130,7 +131,7 @@ class CustomLinkType(ObjectType):
filters=ExportTemplateFilter,
pagination=True
)
class ExportTemplateType(SyncedDataMixin, ObjectType):
class ExportTemplateType(SyncedDataMixin, OwnerMixin, ObjectType):
pass
@@ -180,7 +181,7 @@ class NotificationGroupType(ObjectType):
filters=SavedFilterFilter,
pagination=True
)
class SavedFilterType(ObjectType):
class SavedFilterType(OwnerMixin, ObjectType):
user: Annotated["UserType", strawberry.lazy('users.graphql.types')] | None
@@ -209,7 +210,7 @@ class TableConfigType(ObjectType):
filters=TagFilter,
pagination=True
)
class TagType(ObjectType):
class TagType(OwnerMixin, ObjectType):
color: str
object_types: List[ContentTypeType]
@@ -221,7 +222,7 @@ class TagType(ObjectType):
filters=WebhookFilter,
pagination=True
)
class WebhookType(OrganizationalObjectType):
class WebhookType(OwnerMixin, CustomFieldsMixin, TagsMixin, ObjectType):
pass
@@ -231,5 +232,5 @@ class WebhookType(OrganizationalObjectType):
filters=EventRuleFilter,
pagination=True
)
class EventRuleType(OrganizationalObjectType):
class EventRuleType(OwnerMixin, CustomFieldsMixin, TagsMixin, ObjectType):
action_object_type: Annotated["ContentTypeType", strawberry.lazy('netbox.graphql.types')] | None

View File

@@ -8,7 +8,7 @@ from dcim.graphql.types import SiteType
from extras.graphql.mixins import ContactsMixin
from ipam import models
from netbox.graphql.scalars import BigInt
from netbox.graphql.types import BaseObjectType, NetBoxObjectType, OrganizationalObjectType
from netbox.graphql.types import BaseObjectType, NetBoxObjectType, OrganizationalObjectType, PrimaryObjectType
from .filters import *
from .mixins import IPAddressesMixin
@@ -74,7 +74,7 @@ class BaseIPAddressFamilyType:
filters=ASNFilter,
pagination=True
)
class ASNType(NetBoxObjectType, ContactsMixin):
class ASNType(ContactsMixin, PrimaryObjectType):
asn: BigInt
rir: Annotated["RIRType", strawberry.lazy('ipam.graphql.types')] | None
tenant: Annotated["TenantType", strawberry.lazy('tenancy.graphql.types')] | None
@@ -89,7 +89,7 @@ class ASNType(NetBoxObjectType, ContactsMixin):
filters=ASNRangeFilter,
pagination=True
)
class ASNRangeType(NetBoxObjectType):
class ASNRangeType(OrganizationalObjectType):
start: BigInt
end: BigInt
rir: Annotated["RIRType", strawberry.lazy('ipam.graphql.types')] | None
@@ -102,7 +102,7 @@ class ASNRangeType(NetBoxObjectType):
filters=AggregateFilter,
pagination=True
)
class AggregateType(NetBoxObjectType, ContactsMixin, BaseIPAddressFamilyType):
class AggregateType(ContactsMixin, BaseIPAddressFamilyType, PrimaryObjectType):
prefix: str
rir: Annotated["RIRType", strawberry.lazy('ipam.graphql.types')] | None
tenant: Annotated["TenantType", strawberry.lazy('tenancy.graphql.types')] | None
@@ -114,8 +114,7 @@ class AggregateType(NetBoxObjectType, ContactsMixin, BaseIPAddressFamilyType):
filters=FHRPGroupFilter,
pagination=True
)
class FHRPGroupType(NetBoxObjectType, IPAddressesMixin):
class FHRPGroupType(IPAddressesMixin, PrimaryObjectType):
fhrpgroupassignment_set: List[Annotated["FHRPGroupAssignmentType", strawberry.lazy('ipam.graphql.types')]]
@@ -142,7 +141,7 @@ class FHRPGroupAssignmentType(BaseObjectType):
filters=IPAddressFilter,
pagination=True
)
class IPAddressType(NetBoxObjectType, ContactsMixin, BaseIPAddressFamilyType):
class IPAddressType(ContactsMixin, BaseIPAddressFamilyType, PrimaryObjectType):
address: str
vrf: Annotated["VRFType", strawberry.lazy('ipam.graphql.types')] | None
tenant: Annotated["TenantType", strawberry.lazy('tenancy.graphql.types')] | None
@@ -167,7 +166,7 @@ class IPAddressType(NetBoxObjectType, ContactsMixin, BaseIPAddressFamilyType):
filters=IPRangeFilter,
pagination=True
)
class IPRangeType(NetBoxObjectType, ContactsMixin):
class IPRangeType(ContactsMixin, PrimaryObjectType):
start_address: str
end_address: str
vrf: Annotated["VRFType", strawberry.lazy('ipam.graphql.types')] | None
@@ -181,7 +180,7 @@ class IPRangeType(NetBoxObjectType, ContactsMixin):
filters=PrefixFilter,
pagination=True
)
class PrefixType(NetBoxObjectType, ContactsMixin, BaseIPAddressFamilyType):
class PrefixType(ContactsMixin, BaseIPAddressFamilyType, PrimaryObjectType):
prefix: str
vrf: Annotated["VRFType", strawberry.lazy('ipam.graphql.types')] | None
tenant: Annotated["TenantType", strawberry.lazy('tenancy.graphql.types')] | None
@@ -230,7 +229,7 @@ class RoleType(OrganizationalObjectType):
filters=RouteTargetFilter,
pagination=True
)
class RouteTargetType(NetBoxObjectType):
class RouteTargetType(PrimaryObjectType):
tenant: Annotated["TenantType", strawberry.lazy('tenancy.graphql.types')] | None
importing_l2vpns: List[Annotated["L2VPNType", strawberry.lazy('vpn.graphql.types')]]
@@ -245,7 +244,7 @@ class RouteTargetType(NetBoxObjectType):
filters=ServiceFilter,
pagination=True
)
class ServiceType(NetBoxObjectType, ContactsMixin):
class ServiceType(ContactsMixin, PrimaryObjectType):
ports: List[int]
ipaddresses: List[Annotated["IPAddressType", strawberry.lazy('ipam.graphql.types')]]
@@ -264,7 +263,7 @@ class ServiceType(NetBoxObjectType, ContactsMixin):
filters=ServiceTemplateFilter,
pagination=True
)
class ServiceTemplateType(NetBoxObjectType):
class ServiceTemplateType(PrimaryObjectType):
ports: List[int]
@@ -274,7 +273,7 @@ class ServiceTemplateType(NetBoxObjectType):
filters=VLANFilter,
pagination=True
)
class VLANType(NetBoxObjectType):
class VLANType(PrimaryObjectType):
site: Annotated["SiteType", strawberry.lazy('ipam.graphql.types')] | None
group: Annotated["VLANGroupType", strawberry.lazy('ipam.graphql.types')] | None
tenant: Annotated["TenantType", strawberry.lazy('tenancy.graphql.types')] | None
@@ -323,7 +322,7 @@ class VLANGroupType(OrganizationalObjectType):
filters=VLANTranslationPolicyFilter,
pagination=True
)
class VLANTranslationPolicyType(NetBoxObjectType):
class VLANTranslationPolicyType(PrimaryObjectType):
rules: List[Annotated["VLANTranslationRuleType", strawberry.lazy('ipam.graphql.types')]]
@@ -346,7 +345,7 @@ class VLANTranslationRuleType(NetBoxObjectType):
filters=VRFFilter,
pagination=True
)
class VRFType(NetBoxObjectType):
class VRFType(PrimaryObjectType):
tenant: Annotated["TenantType", strawberry.lazy('tenancy.graphql.types')] | None
interfaces: List[Annotated["InterfaceType", strawberry.lazy('dcim.graphql.types')]]

View File

@@ -6,13 +6,16 @@ from django.contrib.contenttypes.models import ContentType
from core.graphql.mixins import ChangelogMixin
from core.models import ObjectType as ObjectType_
from extras.graphql.mixins import CustomFieldsMixin, JournalEntriesMixin, TagsMixin
from users.graphql.mixins import OwnerMixin
__all__ = (
'BaseObjectType',
'ContentTypeType',
'NestedGroupObjectType',
'NetBoxObjectType',
'ObjectType',
'OrganizationalObjectType',
'NetBoxObjectType',
'PrimaryObjectType',
)
@@ -53,14 +56,44 @@ class ObjectType(
pass
class OrganizationalObjectType(
class PrimaryObjectType(
ChangelogMixin,
CustomFieldsMixin,
JournalEntriesMixin,
TagsMixin,
OwnerMixin,
BaseObjectType
):
"""
Base type for organizational models
Base GraphQL type for models which inherit from PrimaryModel.
"""
pass
class OrganizationalObjectType(
ChangelogMixin,
CustomFieldsMixin,
JournalEntriesMixin,
TagsMixin,
OwnerMixin,
BaseObjectType
):
"""
Base GraphQL type for models which inherit from OrganizationalModel.
"""
pass
class NestedGroupObjectType(
ChangelogMixin,
CustomFieldsMixin,
JournalEntriesMixin,
TagsMixin,
OwnerMixin,
BaseObjectType
):
"""
Base GraphQL type for models which inherit from NestedGroupModel.
"""
pass
@@ -72,9 +105,6 @@ class NetBoxObjectType(
TagsMixin,
BaseObjectType
):
"""
GraphQL type for most NetBox models. Includes support for custom fields, change logging, journaling, and tags.
"""
pass

View File

@@ -4,7 +4,7 @@ import strawberry
import strawberry_django
from extras.graphql.mixins import CustomFieldsMixin, TagsMixin, ContactsMixin
from netbox.graphql.types import BaseObjectType, OrganizationalObjectType, NetBoxObjectType
from netbox.graphql.types import BaseObjectType, NestedGroupObjectType, OrganizationalObjectType, PrimaryObjectType
from tenancy import models
from .filters import *
from .mixins import ContactAssignmentsMixin
@@ -57,7 +57,7 @@ __all__ = (
filters=TenantFilter,
pagination=True
)
class TenantType(ContactsMixin, NetBoxObjectType):
class TenantType(ContactsMixin, PrimaryObjectType):
group: Annotated['TenantGroupType', strawberry.lazy('tenancy.graphql.types')] | None
asns: List[Annotated['ASNType', strawberry.lazy('ipam.graphql.types')]]
circuits: List[Annotated['CircuitType', strawberry.lazy('circuits.graphql.types')]]
@@ -91,7 +91,7 @@ class TenantType(ContactsMixin, NetBoxObjectType):
filters=TenantGroupFilter,
pagination=True
)
class TenantGroupType(OrganizationalObjectType):
class TenantGroupType(NestedGroupObjectType):
parent: Annotated['TenantGroupType', strawberry.lazy('tenancy.graphql.types')] | None
tenants: List[TenantType]
@@ -108,7 +108,7 @@ class TenantGroupType(OrganizationalObjectType):
filters=ContactFilter,
pagination=True
)
class ContactType(ContactAssignmentsMixin, NetBoxObjectType):
class ContactType(ContactAssignmentsMixin, PrimaryObjectType):
groups: List[Annotated['ContactGroupType', strawberry.lazy('tenancy.graphql.types')]]
@@ -128,7 +128,7 @@ class ContactRoleType(ContactAssignmentsMixin, OrganizationalObjectType):
filters=ContactGroupFilter,
pagination=True
)
class ContactGroupType(OrganizationalObjectType):
class ContactGroupType(NestedGroupObjectType):
parent: Annotated['ContactGroupType', strawberry.lazy('tenancy.graphql.types')] | None
contacts: List[ContactType]

View File

@@ -0,0 +1,15 @@
from typing import Annotated, TYPE_CHECKING
import strawberry
if TYPE_CHECKING:
from users.graphql.types import OwnerType
__all__ = (
'OwnerMixin',
)
@strawberry.type
class OwnerMixin:
owner: Annotated['OwnerType', strawberry.lazy('users.graphql.types')] | None

View File

@@ -6,7 +6,8 @@ import strawberry_django
from extras.graphql.mixins import ConfigContextMixin, ContactsMixin
from ipam.graphql.mixins import IPAddressesMixin, VLANGroupsMixin
from netbox.graphql.scalars import BigInt
from netbox.graphql.types import OrganizationalObjectType, NetBoxObjectType
from netbox.graphql.types import NetBoxObjectType, OrganizationalObjectType, PrimaryObjectType
from users.graphql.mixins import OwnerMixin
from virtualization import models
from .filters import *
@@ -36,7 +37,7 @@ __all__ = (
@strawberry.type
class ComponentType(NetBoxObjectType):
class ComponentType(OwnerMixin, NetBoxObjectType):
"""
Base type for device/VM components
"""
@@ -49,7 +50,7 @@ class ComponentType(NetBoxObjectType):
filters=ClusterFilter,
pagination=True
)
class ClusterType(ContactsMixin, VLANGroupsMixin, NetBoxObjectType):
class ClusterType(ContactsMixin, VLANGroupsMixin, PrimaryObjectType):
type: Annotated["ClusterTypeType", strawberry.lazy('virtualization.graphql.types')] | None
group: Annotated["ClusterGroupType", strawberry.lazy('virtualization.graphql.types')] | None
tenant: Annotated["TenantType", strawberry.lazy('tenancy.graphql.types')] | None
@@ -94,7 +95,7 @@ class ClusterTypeType(OrganizationalObjectType):
filters=VirtualMachineFilter,
pagination=True
)
class VirtualMachineType(ConfigContextMixin, ContactsMixin, NetBoxObjectType):
class VirtualMachineType(ConfigContextMixin, ContactsMixin, PrimaryObjectType):
interface_count: BigInt
virtual_disk_count: BigInt
interface_count: BigInt

View File

@@ -4,7 +4,7 @@ import strawberry
import strawberry_django
from extras.graphql.mixins import ContactsMixin, CustomFieldsMixin, TagsMixin
from netbox.graphql.types import ObjectType, OrganizationalObjectType, NetBoxObjectType
from netbox.graphql.types import ObjectType, OrganizationalObjectType, NetBoxObjectType, PrimaryObjectType
from vpn import models
from .filters import *
@@ -58,7 +58,7 @@ class TunnelTerminationType(CustomFieldsMixin, TagsMixin, ObjectType):
filters=TunnelFilter,
pagination=True
)
class TunnelType(ContactsMixin, NetBoxObjectType):
class TunnelType(ContactsMixin, PrimaryObjectType):
group: Annotated["TunnelGroupType", strawberry.lazy('vpn.graphql.types')] | None
ipsec_profile: Annotated["IPSecProfileType", strawberry.lazy('vpn.graphql.types')] | None
tenant: Annotated["TenantType", strawberry.lazy('tenancy.graphql.types')] | None
@@ -72,8 +72,7 @@ class TunnelType(ContactsMixin, NetBoxObjectType):
filters=IKEProposalFilter,
pagination=True
)
class IKEProposalType(OrganizationalObjectType):
class IKEProposalType(PrimaryObjectType):
ike_policies: List[Annotated["IKEPolicyType", strawberry.lazy('vpn.graphql.types')]]
@@ -83,8 +82,7 @@ class IKEProposalType(OrganizationalObjectType):
filters=IKEPolicyFilter,
pagination=True
)
class IKEPolicyType(OrganizationalObjectType):
class IKEPolicyType(PrimaryObjectType):
proposals: List[Annotated["IKEProposalType", strawberry.lazy('vpn.graphql.types')]]
ipsec_profiles: List[Annotated["IPSecProfileType", strawberry.lazy('vpn.graphql.types')]]
@@ -95,8 +93,7 @@ class IKEPolicyType(OrganizationalObjectType):
filters=IPSecProposalFilter,
pagination=True
)
class IPSecProposalType(OrganizationalObjectType):
class IPSecProposalType(PrimaryObjectType):
ipsec_policies: List[Annotated["IPSecPolicyType", strawberry.lazy('vpn.graphql.types')]]
@@ -106,8 +103,7 @@ class IPSecProposalType(OrganizationalObjectType):
filters=IPSecPolicyFilter,
pagination=True
)
class IPSecPolicyType(OrganizationalObjectType):
class IPSecPolicyType(PrimaryObjectType):
proposals: List[Annotated["IPSecProposalType", strawberry.lazy('vpn.graphql.types')]]
ipsec_profiles: List[Annotated["IPSecProfileType", strawberry.lazy('vpn.graphql.types')]]
@@ -118,7 +114,7 @@ class IPSecPolicyType(OrganizationalObjectType):
filters=IPSecProfileFilter,
pagination=True
)
class IPSecProfileType(OrganizationalObjectType):
class IPSecProfileType(PrimaryObjectType):
ike_policy: Annotated["IKEPolicyType", strawberry.lazy('vpn.graphql.types')]
ipsec_policy: Annotated["IPSecPolicyType", strawberry.lazy('vpn.graphql.types')]
@@ -131,7 +127,7 @@ class IPSecProfileType(OrganizationalObjectType):
filters=L2VPNFilter,
pagination=True
)
class L2VPNType(ContactsMixin, NetBoxObjectType):
class L2VPNType(ContactsMixin, PrimaryObjectType):
tenant: Annotated["TenantType", strawberry.lazy('tenancy.graphql.types')] | None
export_targets: List[Annotated["RouteTargetType", strawberry.lazy('ipam.graphql.types')]]

View File

@@ -3,7 +3,7 @@ from typing import Annotated, List, TYPE_CHECKING, Union
import strawberry
import strawberry_django
from netbox.graphql.types import OrganizationalObjectType, NetBoxObjectType
from netbox.graphql.types import NestedGroupObjectType, PrimaryObjectType
from wireless import models
from .filters import *
@@ -25,7 +25,7 @@ __all__ = (
filters=WirelessLANGroupFilter,
pagination=True
)
class WirelessLANGroupType(OrganizationalObjectType):
class WirelessLANGroupType(NestedGroupObjectType):
parent: Annotated["WirelessLANGroupType", strawberry.lazy('wireless.graphql.types')] | None
wireless_lans: List[Annotated["WirelessLANType", strawberry.lazy('wireless.graphql.types')]]
@@ -38,7 +38,7 @@ class WirelessLANGroupType(OrganizationalObjectType):
filters=WirelessLANFilter,
pagination=True
)
class WirelessLANType(NetBoxObjectType):
class WirelessLANType(PrimaryObjectType):
group: Annotated["WirelessLANGroupType", strawberry.lazy('wireless.graphql.types')] | None
vlan: Annotated["VLANType", strawberry.lazy('ipam.graphql.types')] | None
tenant: Annotated["TenantType", strawberry.lazy('tenancy.graphql.types')] | None
@@ -61,7 +61,7 @@ class WirelessLANType(NetBoxObjectType):
filters=WirelessLinkFilter,
pagination=True
)
class WirelessLinkType(NetBoxObjectType):
class WirelessLinkType(PrimaryObjectType):
interface_a: Annotated["InterfaceType", strawberry.lazy('dcim.graphql.types')]
interface_b: Annotated["InterfaceType", strawberry.lazy('dcim.graphql.types')]
tenant: Annotated["TenantType", strawberry.lazy('tenancy.graphql.types')] | None