diff --git a/netbox/circuits/graphql/types_v1.py b/netbox/circuits/graphql/types_v1.py index 3e7669df6..c9f9234dc 100644 --- a/netbox/circuits/graphql/types_v1.py +++ b/netbox/circuits/graphql/types_v1.py @@ -6,7 +6,9 @@ import strawberry_django from circuits import models from dcim.graphql.mixins_v1 import CabledObjectMixinV1 from extras.graphql.mixins_v1 import ContactsMixinV1, CustomFieldsMixinV1, TagsMixinV1 -from netbox.graphql.types_v1 import BaseObjectTypeV1, NetBoxObjectTypeV1, ObjectTypeV1, OrganizationalObjectTypeV1 +from netbox.graphql.types_v1 import ( + BaseObjectTypeV1, ObjectTypeV1, OrganizationalObjectTypeV1, PrimaryObjectTypeV1 +) from tenancy.graphql.types_v1 import TenantTypeV1 from .filters_v1 import * @@ -35,7 +37,7 @@ __all__ = ( filters=ProviderFilterV1, pagination=True ) -class ProviderTypeV1(NetBoxObjectTypeV1, ContactsMixinV1): +class ProviderTypeV1(ContactsMixinV1, PrimaryObjectTypeV1): networks: List[Annotated["ProviderNetworkTypeV1", strawberry.lazy('circuits.graphql.types_v1')]] circuits: List[Annotated["CircuitTypeV1", strawberry.lazy('circuits.graphql.types_v1')]] @@ -49,7 +51,7 @@ class ProviderTypeV1(NetBoxObjectTypeV1, ContactsMixinV1): filters=ProviderAccountFilterV1, pagination=True ) -class ProviderAccountTypeV1(ContactsMixinV1, NetBoxObjectTypeV1): +class ProviderAccountTypeV1(ContactsMixinV1, PrimaryObjectTypeV1): provider: Annotated["ProviderTypeV1", strawberry.lazy('circuits.graphql.types_v1')] circuits: List[Annotated["CircuitTypeV1", strawberry.lazy('circuits.graphql.types_v1')]] @@ -61,7 +63,7 @@ class ProviderAccountTypeV1(ContactsMixinV1, NetBoxObjectTypeV1): filters=ProviderNetworkFilterV1, pagination=True ) -class ProviderNetworkTypeV1(NetBoxObjectTypeV1): +class ProviderNetworkTypeV1(PrimaryObjectTypeV1): provider: Annotated["ProviderTypeV1", strawberry.lazy('circuits.graphql.types_v1')] circuit_terminations: List[Annotated["CircuitTerminationTypeV1", strawberry.lazy('circuits.graphql.types_v1')]] @@ -105,7 +107,7 @@ class CircuitTypeTypeV1(OrganizationalObjectTypeV1): filters=CircuitFilterV1, pagination=True ) -class CircuitTypeV1(NetBoxObjectTypeV1, ContactsMixinV1): +class CircuitTypeV1(PrimaryObjectTypeV1, ContactsMixinV1): provider: ProviderTypeV1 provider_account: ProviderAccountTypeV1 | None termination_a: CircuitTerminationTypeV1 | None @@ -178,7 +180,7 @@ class VirtualCircuitTerminationTypeV1(CustomFieldsMixinV1, TagsMixinV1, ObjectTy filters=VirtualCircuitFilterV1, pagination=True ) -class VirtualCircuitTypeV1(NetBoxObjectTypeV1): +class VirtualCircuitTypeV1(PrimaryObjectTypeV1): provider_network: ProviderNetworkTypeV1 = strawberry_django.field(select_related=["provider_network"]) provider_account: ProviderAccountTypeV1 | None type: Annotated["VirtualCircuitTypeTypeV1", strawberry.lazy('circuits.graphql.types_v1')] = strawberry_django.field( diff --git a/netbox/core/graphql/types_v1.py b/netbox/core/graphql/types_v1.py index 67effeae4..7dc8c0e3b 100644 --- a/netbox/core/graphql/types_v1.py +++ b/netbox/core/graphql/types_v1.py @@ -5,7 +5,7 @@ import strawberry_django from django.contrib.contenttypes.models import ContentType as DjangoContentType from core import models -from netbox.graphql.types_v1 import BaseObjectTypeV1, NetBoxObjectTypeV1 +from netbox.graphql.types_v1 import BaseObjectTypeV1, PrimaryObjectTypeV1 from .filters_v1 import * __all__ = ( @@ -32,8 +32,7 @@ class DataFileTypeV1(BaseObjectTypeV1): filters=DataSourceFilterV1, pagination=True ) -class DataSourceTypeV1(NetBoxObjectTypeV1): - +class DataSourceTypeV1(PrimaryObjectTypeV1): datafiles: List[Annotated["DataFileTypeV1", strawberry.lazy('core.graphql.types_v1')]] diff --git a/netbox/dcim/graphql/types_v1.py b/netbox/dcim/graphql/types_v1.py index 53f89087a..ab0ba5f07 100644 --- a/netbox/dcim/graphql/types_v1.py +++ b/netbox/dcim/graphql/types_v1.py @@ -8,13 +8,14 @@ from dcim import models from extras.graphql.mixins_v1 import ( ConfigContextMixinV1, ContactsMixinV1, - CustomFieldsMixinV1, ImageAttachmentsMixinV1, - TagsMixinV1, ) from ipam.graphql.mixins_v1 import IPAddressesMixinV1, VLANGroupsMixinV1 from netbox.graphql.scalars import BigInt -from netbox.graphql.types_v1 import BaseObjectTypeV1, NetBoxObjectTypeV1, OrganizationalObjectTypeV1 +from netbox.graphql.types_v1 import ( + BaseObjectTypeV1, NetBoxObjectTypeV1, OrganizationalObjectTypeV1, PrimaryObjectTypeV1 +) +from users.graphql.mixins_v1 import OwnerMixinV1 from .filters_v1 import * from .mixins_v1 import CabledObjectMixinV1, PathEndpointMixinV1 @@ -91,12 +92,7 @@ __all__ = ( @strawberry.type -class ComponentTypeV1( - ChangelogMixinV1, - CustomFieldsMixinV1, - TagsMixinV1, - BaseObjectTypeV1 -): +class ComponentTypeV1(OwnerMixinV1, NetBoxObjectTypeV1): """ Base type for device/VM components """ @@ -159,7 +155,7 @@ class CableTerminationTypeV1(NetBoxObjectTypeV1): filters=CableFilterV1, pagination=True ) -class CableTypeV1(NetBoxObjectTypeV1): +class CableTypeV1(PrimaryObjectTypeV1): color: str tenant: Annotated["TenantTypeV1", strawberry.lazy('tenancy.graphql.types_v1')] | None @@ -236,7 +232,7 @@ class ConsoleServerPortTemplateTypeV1(ModularComponentTemplateTypeV1): filters=DeviceFilterV1, pagination=True ) -class DeviceTypeV1(ConfigContextMixinV1, ImageAttachmentsMixinV1, ContactsMixinV1, NetBoxObjectTypeV1): +class DeviceTypeV1(ConfigContextMixinV1, ImageAttachmentsMixinV1, ContactsMixinV1, PrimaryObjectTypeV1): console_port_count: BigInt console_server_port_count: BigInt power_port_count: BigInt @@ -355,7 +351,7 @@ class DeviceRoleTypeV1(OrganizationalObjectTypeV1): filters=DeviceTypeFilterV1, pagination=True ) -class DeviceTypeTypeV1(NetBoxObjectTypeV1): +class DeviceTypeTypeV1(PrimaryObjectTypeV1): console_port_template_count: BigInt console_server_port_template_count: BigInt power_port_template_count: BigInt @@ -414,7 +410,7 @@ class FrontPortTemplateTypeV1(ModularComponentTemplateTypeV1): filters=MACAddressFilterV1, pagination=True ) -class MACAddressTypeV1(NetBoxObjectTypeV1): +class MACAddressTypeV1(PrimaryObjectTypeV1): mac_address: str @strawberry_django.field @@ -557,7 +553,7 @@ class ManufacturerTypeV1(OrganizationalObjectTypeV1, ContactsMixinV1): filters=ModuleFilterV1, pagination=True ) -class ModuleTypeV1(NetBoxObjectTypeV1): +class ModuleTypeV1(PrimaryObjectTypeV1): device: Annotated["DeviceTypeV1", strawberry.lazy('dcim.graphql.types_v1')] module_bay: Annotated["ModuleBayTypeV1", strawberry.lazy('dcim.graphql.types_v1')] module_type: Annotated["ModuleTypeTypeV1", strawberry.lazy('dcim.graphql.types_v1')] @@ -604,7 +600,7 @@ class ModuleBayTemplateTypeV1(ModularComponentTemplateTypeV1): filters=ModuleTypeProfileFilterV1, pagination=True ) -class ModuleTypeProfileTypeV1(NetBoxObjectTypeV1): +class ModuleTypeProfileTypeV1(PrimaryObjectTypeV1): module_types: List[Annotated["ModuleTypeV1", strawberry.lazy('dcim.graphql.types_v1')]] @@ -614,7 +610,7 @@ class ModuleTypeProfileTypeV1(NetBoxObjectTypeV1): filters=ModuleTypeFilterV1, pagination=True ) -class ModuleTypeTypeV1(NetBoxObjectTypeV1): +class ModuleTypeTypeV1(PrimaryObjectTypeV1): profile: Annotated["ModuleTypeProfileTypeV1", strawberry.lazy('dcim.graphql.types_v1')] | None manufacturer: Annotated["ManufacturerTypeV1", strawberry.lazy('dcim.graphql.types_v1')] @@ -652,7 +648,7 @@ class PlatformTypeV1(OrganizationalObjectTypeV1): filters=PowerFeedFilterV1, pagination=True ) -class PowerFeedTypeV1(NetBoxObjectTypeV1, CabledObjectMixinV1, PathEndpointMixinV1): +class PowerFeedTypeV1(CabledObjectMixinV1, PathEndpointMixinV1, PrimaryObjectTypeV1): power_panel: Annotated["PowerPanelTypeV1", strawberry.lazy('dcim.graphql.types_v1')] rack: Annotated["RackTypeV1", strawberry.lazy('dcim.graphql.types_v1')] | None tenant: Annotated["TenantTypeV1", strawberry.lazy('tenancy.graphql.types_v1')] | None @@ -686,7 +682,7 @@ class PowerOutletTemplateTypeV1(ModularComponentTemplateTypeV1): filters=PowerPanelFilterV1, pagination=True ) -class PowerPanelTypeV1(NetBoxObjectTypeV1, ContactsMixinV1): +class PowerPanelTypeV1(ContactsMixinV1, PrimaryObjectTypeV1): site: Annotated["SiteTypeV1", strawberry.lazy('dcim.graphql.types_v1')] location: Annotated["LocationTypeV1", strawberry.lazy('dcim.graphql.types_v1')] | None @@ -720,7 +716,7 @@ class PowerPortTemplateTypeV1(ModularComponentTemplateTypeV1): filters=RackTypeFilterV1, pagination=True ) -class RackTypeTypeV1(NetBoxObjectTypeV1): +class RackTypeTypeV1(PrimaryObjectTypeV1): manufacturer: Annotated["ManufacturerTypeV1", strawberry.lazy('dcim.graphql.types_v1')] @@ -730,7 +726,7 @@ class RackTypeTypeV1(NetBoxObjectTypeV1): filters=RackFilterV1, pagination=True ) -class RackTypeV1(VLANGroupsMixinV1, ImageAttachmentsMixinV1, ContactsMixinV1, NetBoxObjectTypeV1): +class RackTypeV1(VLANGroupsMixinV1, ImageAttachmentsMixinV1, ContactsMixinV1, PrimaryObjectTypeV1): site: Annotated["SiteTypeV1", strawberry.lazy('dcim.graphql.types_v1')] location: Annotated["LocationTypeV1", strawberry.lazy('dcim.graphql.types_v1')] | None tenant: Annotated["TenantTypeV1", strawberry.lazy('tenancy.graphql.types_v1')] | None @@ -749,7 +745,7 @@ class RackTypeV1(VLANGroupsMixinV1, ImageAttachmentsMixinV1, ContactsMixinV1, Ne filters=RackReservationFilterV1, pagination=True ) -class RackReservationTypeV1(NetBoxObjectTypeV1): +class RackReservationTypeV1(PrimaryObjectTypeV1): units: List[int] rack: Annotated["RackTypeV1", strawberry.lazy('dcim.graphql.types_v1')] tenant: Annotated["TenantTypeV1", strawberry.lazy('tenancy.graphql.types_v1')] | None @@ -824,7 +820,7 @@ class RegionTypeV1(VLANGroupsMixinV1, ContactsMixinV1, OrganizationalObjectTypeV filters=SiteFilterV1, pagination=True ) -class SiteTypeV1(VLANGroupsMixinV1, ImageAttachmentsMixinV1, ContactsMixinV1, NetBoxObjectTypeV1): +class SiteTypeV1(VLANGroupsMixinV1, ImageAttachmentsMixinV1, ContactsMixinV1, PrimaryObjectTypeV1): time_zone: str | None region: Annotated["RegionTypeV1", strawberry.lazy('dcim.graphql.types_v1')] | None group: Annotated["SiteGroupTypeV1", strawberry.lazy('dcim.graphql.types_v1')] | None @@ -885,7 +881,7 @@ class SiteGroupTypeV1(VLANGroupsMixinV1, ContactsMixinV1, OrganizationalObjectTy filters=VirtualChassisFilterV1, pagination=True ) -class VirtualChassisTypeV1(NetBoxObjectTypeV1): +class VirtualChassisTypeV1(PrimaryObjectTypeV1): member_count: BigInt master: Annotated["DeviceTypeV1", strawberry.lazy('dcim.graphql.types_v1')] | None @@ -898,7 +894,7 @@ class VirtualChassisTypeV1(NetBoxObjectTypeV1): filters=VirtualDeviceContextFilterV1, pagination=True ) -class VirtualDeviceContextTypeV1(NetBoxObjectTypeV1): +class VirtualDeviceContextTypeV1(PrimaryObjectTypeV1): device: Annotated["DeviceTypeV1", strawberry.lazy('dcim.graphql.types_v1')] | None primary_ip4: Annotated["IPAddressTypeV1", strawberry.lazy('ipam.graphql.types_v1')] | None primary_ip6: Annotated["IPAddressTypeV1", strawberry.lazy('ipam.graphql.types_v1')] | None diff --git a/netbox/extras/graphql/types_v1.py b/netbox/extras/graphql/types_v1.py index d51b57e88..1693fe1da 100644 --- a/netbox/extras/graphql/types_v1.py +++ b/netbox/extras/graphql/types_v1.py @@ -7,8 +7,9 @@ from core.graphql.mixins_v1 import SyncedDataMixinV1 from extras import models from extras.graphql.mixins_v1 import CustomFieldsMixinV1, TagsMixinV1 from netbox.graphql.types_v1 import ( - BaseObjectTypeV1, ContentTypeTypeV1, NetBoxObjectTypeV1, ObjectTypeV1, OrganizationalObjectTypeV1 + BaseObjectTypeV1, ContentTypeTypeV1, ObjectTypeV1, OrganizationalObjectTypeV1, PrimaryObjectTypeV1 ) +from users.graphql.mixins_v1 import OwnerMixinV1 from .filters_v1 import * if TYPE_CHECKING: @@ -55,7 +56,7 @@ __all__ = ( filters=ConfigContextProfileFilterV1, pagination=True ) -class ConfigContextProfileTypeV1(SyncedDataMixinV1, NetBoxObjectTypeV1): +class ConfigContextProfileTypeV1(SyncedDataMixinV1, PrimaryObjectTypeV1): pass @@ -65,7 +66,7 @@ class ConfigContextProfileTypeV1(SyncedDataMixinV1, NetBoxObjectTypeV1): filters=ConfigContextFilterV1, pagination=True ) -class ConfigContextTypeV1(SyncedDataMixinV1, ObjectTypeV1): +class ConfigContextTypeV1(SyncedDataMixinV1, OwnerMixinV1, ObjectTypeV1): profile: ConfigContextProfileTypeV1 | None roles: List[Annotated["DeviceRoleTypeV1", strawberry.lazy('dcim.graphql.types_v1')]] device_types: List[Annotated["DeviceTypeTypeV1", strawberry.lazy('dcim.graphql.types_v1')]] @@ -88,7 +89,7 @@ class ConfigContextTypeV1(SyncedDataMixinV1, ObjectTypeV1): filters=ConfigTemplateFilterV1, pagination=True ) -class ConfigTemplateTypeV1(SyncedDataMixinV1, TagsMixinV1, ObjectTypeV1): +class ConfigTemplateTypeV1(SyncedDataMixinV1, OwnerMixinV1, TagsMixinV1, ObjectTypeV1): virtualmachines: List[Annotated["VirtualMachineTypeV1", strawberry.lazy('virtualization.graphql.types_v1')]] devices: List[Annotated["DeviceTypeV1", strawberry.lazy('dcim.graphql.types_v1')]] platforms: List[Annotated["PlatformTypeV1", strawberry.lazy('dcim.graphql.types_v1')]] @@ -101,7 +102,7 @@ class ConfigTemplateTypeV1(SyncedDataMixinV1, TagsMixinV1, ObjectTypeV1): filters=CustomFieldFilterV1, pagination=True ) -class CustomFieldTypeV1(ObjectTypeV1): +class CustomFieldTypeV1(OwnerMixinV1, ObjectTypeV1): related_object_type: Annotated["ContentTypeTypeV1", strawberry.lazy('netbox.graphql.types_v1')] | None choice_set: Annotated["CustomFieldChoiceSetTypeV1", strawberry.lazy('extras.graphql.types_v1')] | None @@ -112,7 +113,7 @@ class CustomFieldTypeV1(ObjectTypeV1): filters=CustomFieldChoiceSetFilterV1, pagination=True ) -class CustomFieldChoiceSetTypeV1(ObjectTypeV1): +class CustomFieldChoiceSetTypeV1(OwnerMixinV1, ObjectTypeV1): choices_for: List[Annotated["CustomFieldTypeV1", strawberry.lazy('extras.graphql.types_v1')]] extra_choices: List[List[str]] | None @@ -124,7 +125,7 @@ class CustomFieldChoiceSetTypeV1(ObjectTypeV1): filters=CustomLinkFilterV1, pagination=True ) -class CustomLinkTypeV1(ObjectTypeV1): +class CustomLinkTypeV1(OwnerMixinV1, ObjectTypeV1): pass @@ -134,7 +135,7 @@ class CustomLinkTypeV1(ObjectTypeV1): filters=ExportTemplateFilterV1, pagination=True ) -class ExportTemplateTypeV1(SyncedDataMixinV1, ObjectTypeV1): +class ExportTemplateTypeV1(SyncedDataMixinV1, OwnerMixinV1, ObjectTypeV1): pass @@ -184,7 +185,7 @@ class NotificationGroupTypeV1(ObjectTypeV1): filters=SavedFilterFilterV1, pagination=True ) -class SavedFilterTypeV1(ObjectTypeV1): +class SavedFilterTypeV1(OwnerMixinV1, ObjectTypeV1): user: Annotated["UserTypeV1", strawberry.lazy('users.graphql.types_v1')] | None @@ -213,7 +214,7 @@ class TableConfigTypeV1(ObjectTypeV1): filters=TagFilterV1, pagination=True ) -class TagTypeV1(ObjectTypeV1): +class TagTypeV1(OwnerMixinV1, ObjectTypeV1): color: str object_types: List[ContentTypeTypeV1] diff --git a/netbox/ipam/graphql/types_v1.py b/netbox/ipam/graphql/types_v1.py index 7b5d2c652..091a2f215 100644 --- a/netbox/ipam/graphql/types_v1.py +++ b/netbox/ipam/graphql/types_v1.py @@ -8,7 +8,9 @@ from dcim.graphql.types_v1 import SiteTypeV1 from extras.graphql.mixins_v1 import ContactsMixinV1 from ipam import models from netbox.graphql.scalars import BigInt -from netbox.graphql.types_v1 import BaseObjectTypeV1, NetBoxObjectTypeV1, OrganizationalObjectTypeV1 +from netbox.graphql.types_v1 import ( + BaseObjectTypeV1, NetBoxObjectTypeV1, OrganizationalObjectTypeV1, PrimaryObjectTypeV1 +) from .filters_v1 import * from .mixins_v1 import IPAddressesMixinV1 @@ -76,7 +78,7 @@ class BaseIPAddressFamilyTypeV1: filters=ASNFilterV1, pagination=True ) -class ASNTypeV1(NetBoxObjectTypeV1, ContactsMixinV1): +class ASNTypeV1(ContactsMixinV1, PrimaryObjectTypeV1): asn: BigInt rir: Annotated["RIRTypeV1", strawberry.lazy('ipam.graphql.types_v1')] | None tenant: Annotated["TenantTypeV1", strawberry.lazy('tenancy.graphql.types_v1')] | None @@ -91,7 +93,7 @@ class ASNTypeV1(NetBoxObjectTypeV1, ContactsMixinV1): filters=ASNRangeFilterV1, pagination=True ) -class ASNRangeTypeV1(NetBoxObjectTypeV1): +class ASNRangeTypeV1(OrganizationalObjectTypeV1): start: BigInt end: BigInt rir: Annotated["RIRTypeV1", strawberry.lazy('ipam.graphql.types_v1')] | None @@ -104,7 +106,7 @@ class ASNRangeTypeV1(NetBoxObjectTypeV1): filters=AggregateFilterV1, pagination=True ) -class AggregateTypeV1(NetBoxObjectTypeV1, ContactsMixinV1, BaseIPAddressFamilyTypeV1): +class AggregateTypeV1(ContactsMixinV1, BaseIPAddressFamilyTypeV1, PrimaryObjectTypeV1): prefix: str rir: Annotated["RIRTypeV1", strawberry.lazy('ipam.graphql.types_v1')] | None tenant: Annotated["TenantTypeV1", strawberry.lazy('tenancy.graphql.types_v1')] | None @@ -116,8 +118,7 @@ class AggregateTypeV1(NetBoxObjectTypeV1, ContactsMixinV1, BaseIPAddressFamilyTy filters=FHRPGroupFilterV1, pagination=True ) -class FHRPGroupTypeV1(NetBoxObjectTypeV1, IPAddressesMixinV1): - +class FHRPGroupTypeV1(IPAddressesMixinV1, PrimaryObjectTypeV1): fhrpgroupassignment_set: List[Annotated["FHRPGroupAssignmentTypeV1", strawberry.lazy('ipam.graphql.types_v1')]] @@ -144,7 +145,7 @@ class FHRPGroupAssignmentTypeV1(BaseObjectTypeV1): filters=IPAddressFilterV1, pagination=True ) -class IPAddressTypeV1(NetBoxObjectTypeV1, ContactsMixinV1, BaseIPAddressFamilyTypeV1): +class IPAddressTypeV1(ContactsMixinV1, BaseIPAddressFamilyTypeV1, PrimaryObjectTypeV1): address: str vrf: Annotated["VRFTypeV1", strawberry.lazy('ipam.graphql.types_v1')] | None tenant: Annotated["TenantTypeV1", strawberry.lazy('tenancy.graphql.types_v1')] | None @@ -169,7 +170,7 @@ class IPAddressTypeV1(NetBoxObjectTypeV1, ContactsMixinV1, BaseIPAddressFamilyTy filters=IPRangeFilterV1, pagination=True ) -class IPRangeTypeV1(NetBoxObjectTypeV1, ContactsMixinV1): +class IPRangeTypeV1(ContactsMixinV1, PrimaryObjectTypeV1): start_address: str end_address: str vrf: Annotated["VRFTypeV1", strawberry.lazy('ipam.graphql.types_v1')] | None @@ -183,7 +184,7 @@ class IPRangeTypeV1(NetBoxObjectTypeV1, ContactsMixinV1): filters=PrefixFilterV1, pagination=True ) -class PrefixTypeV1(NetBoxObjectTypeV1, ContactsMixinV1, BaseIPAddressFamilyTypeV1): +class PrefixTypeV1(ContactsMixinV1, BaseIPAddressFamilyTypeV1, PrimaryObjectTypeV1): prefix: str vrf: Annotated["VRFTypeV1", strawberry.lazy('ipam.graphql.types_v1')] | None tenant: Annotated["TenantTypeV1", strawberry.lazy('tenancy.graphql.types_v1')] | None @@ -232,7 +233,7 @@ class RoleTypeV1(OrganizationalObjectTypeV1): filters=RouteTargetFilterV1, pagination=True ) -class RouteTargetTypeV1(NetBoxObjectTypeV1): +class RouteTargetTypeV1(PrimaryObjectTypeV1): tenant: Annotated["TenantTypeV1", strawberry.lazy('tenancy.graphql.types_v1')] | None importing_l2vpns: List[Annotated["L2VPNTypeV1", strawberry.lazy('vpn.graphql.types_v1')]] @@ -247,7 +248,7 @@ class RouteTargetTypeV1(NetBoxObjectTypeV1): filters=ServiceFilterV1, pagination=True ) -class ServiceTypeV1(NetBoxObjectTypeV1, ContactsMixinV1): +class ServiceTypeV1(ContactsMixinV1, PrimaryObjectTypeV1): ports: List[int] ipaddresses: List[Annotated["IPAddressTypeV1", strawberry.lazy('ipam.graphql.types_v1')]] @@ -266,7 +267,7 @@ class ServiceTypeV1(NetBoxObjectTypeV1, ContactsMixinV1): filters=ServiceTemplateFilterV1, pagination=True ) -class ServiceTemplateTypeV1(NetBoxObjectTypeV1): +class ServiceTemplateTypeV1(PrimaryObjectTypeV1): ports: List[int] @@ -276,7 +277,7 @@ class ServiceTemplateTypeV1(NetBoxObjectTypeV1): filters=VLANFilterV1, pagination=True ) -class VLANTypeV1(NetBoxObjectTypeV1): +class VLANTypeV1(PrimaryObjectTypeV1): site: Annotated["SiteTypeV1", strawberry.lazy('ipam.graphql.types_v1')] | None group: Annotated["VLANGroupTypeV1", strawberry.lazy('ipam.graphql.types_v1')] | None tenant: Annotated["TenantTypeV1", strawberry.lazy('tenancy.graphql.types_v1')] | None @@ -325,7 +326,7 @@ class VLANGroupTypeV1(OrganizationalObjectTypeV1): filters=VLANTranslationPolicyFilterV1, pagination=True ) -class VLANTranslationPolicyTypeV1(NetBoxObjectTypeV1): +class VLANTranslationPolicyTypeV1(PrimaryObjectTypeV1): rules: List[Annotated["VLANTranslationRuleTypeV1", strawberry.lazy('ipam.graphql.types_v1')]] @@ -348,7 +349,7 @@ class VLANTranslationRuleTypeV1(NetBoxObjectTypeV1): filters=VRFFilterV1, pagination=True ) -class VRFTypeV1(NetBoxObjectTypeV1): +class VRFTypeV1(PrimaryObjectTypeV1): tenant: Annotated["TenantTypeV1", strawberry.lazy('tenancy.graphql.types_v1')] | None interfaces: List[Annotated["InterfaceTypeV1", strawberry.lazy('dcim.graphql.types_v1')]] diff --git a/netbox/netbox/graphql/types_v1.py b/netbox/netbox/graphql/types_v1.py index 66a3ac905..5fc776d8d 100644 --- a/netbox/netbox/graphql/types_v1.py +++ b/netbox/netbox/graphql/types_v1.py @@ -3,10 +3,10 @@ import strawberry_django from strawberry.types import Info from django.contrib.contenttypes.models import ContentType -from core.graphql.mixins import ChangelogMixin +from core.graphql.mixins_v1 import ChangelogMixinV1 from core.models import ObjectType as ObjectType_ -from extras.graphql.mixins import CustomFieldsMixin, JournalEntriesMixin, TagsMixin -from users.graphql.mixins import OwnerMixin +from extras.graphql.mixins_v1 import CustomFieldsMixinV1, JournalEntriesMixinV1, TagsMixinV1 +from users.graphql.mixins_v1 import OwnerMixinV1 __all__ = ( 'BaseObjectTypeV1', @@ -47,7 +47,7 @@ class BaseObjectTypeV1: class ObjectTypeV1( - ChangelogMixin, + ChangelogMixinV1, BaseObjectTypeV1 ): """ @@ -57,11 +57,11 @@ class ObjectTypeV1( class PrimaryObjectTypeV1( - ChangelogMixin, - CustomFieldsMixin, - JournalEntriesMixin, - TagsMixin, - OwnerMixin, + ChangelogMixinV1, + CustomFieldsMixinV1, + JournalEntriesMixinV1, + TagsMixinV1, + OwnerMixinV1, BaseObjectTypeV1 ): """ @@ -71,11 +71,11 @@ class PrimaryObjectTypeV1( class OrganizationalObjectTypeV1( - ChangelogMixin, - CustomFieldsMixin, - JournalEntriesMixin, - TagsMixin, - OwnerMixin, + ChangelogMixinV1, + CustomFieldsMixinV1, + JournalEntriesMixinV1, + TagsMixinV1, + OwnerMixinV1, BaseObjectTypeV1 ): """ @@ -85,11 +85,11 @@ class OrganizationalObjectTypeV1( class NestedGroupObjectTypeV1( - ChangelogMixin, - CustomFieldsMixin, - JournalEntriesMixin, - TagsMixin, - OwnerMixin, + ChangelogMixinV1, + CustomFieldsMixinV1, + JournalEntriesMixinV1, + TagsMixinV1, + OwnerMixinV1, BaseObjectTypeV1 ): """ @@ -99,10 +99,10 @@ class NestedGroupObjectTypeV1( class NetBoxObjectTypeV1( - ChangelogMixin, - CustomFieldsMixin, - JournalEntriesMixin, - TagsMixin, + ChangelogMixinV1, + CustomFieldsMixinV1, + JournalEntriesMixinV1, + TagsMixinV1, BaseObjectTypeV1 ): """ diff --git a/netbox/tenancy/graphql/types_v1.py b/netbox/tenancy/graphql/types_v1.py index cc4b774bc..82e7d7610 100644 --- a/netbox/tenancy/graphql/types_v1.py +++ b/netbox/tenancy/graphql/types_v1.py @@ -4,7 +4,9 @@ import strawberry import strawberry_django from extras.graphql.mixins_v1 import CustomFieldsMixinV1, TagsMixinV1, ContactsMixinV1 -from netbox.graphql.types_v1 import BaseObjectTypeV1, OrganizationalObjectTypeV1, NetBoxObjectTypeV1 +from netbox.graphql.types_v1 import ( + BaseObjectTypeV1, OrganizationalObjectTypeV1, PrimaryObjectTypeV1 +) from tenancy import models from .filters_v1 import * from .mixins_v1 import ContactAssignmentsMixinV1 @@ -57,7 +59,7 @@ __all__ = ( filters=TenantFilterV1, pagination=True ) -class TenantTypeV1(ContactsMixinV1, NetBoxObjectTypeV1): +class TenantTypeV1(ContactsMixinV1, PrimaryObjectTypeV1): group: Annotated['TenantGroupTypeV1', strawberry.lazy('tenancy.graphql.types_v1')] | None asns: List[Annotated['ASNTypeV1', strawberry.lazy('ipam.graphql.types_v1')]] circuits: List[Annotated['CircuitTypeV1', strawberry.lazy('circuits.graphql.types_v1')]] @@ -108,7 +110,7 @@ class TenantGroupTypeV1(OrganizationalObjectTypeV1): filters=ContactFilterV1, pagination=True ) -class ContactTypeV1(ContactAssignmentsMixinV1, NetBoxObjectTypeV1): +class ContactTypeV1(ContactAssignmentsMixinV1, PrimaryObjectTypeV1): groups: List[Annotated['ContactGroupTypeV1', strawberry.lazy('tenancy.graphql.types_v1')]] diff --git a/netbox/users/graphql/filters_v1.py b/netbox/users/graphql/filters_v1.py index 1b08ed6fc..951c666ae 100644 --- a/netbox/users/graphql/filters_v1.py +++ b/netbox/users/graphql/filters_v1.py @@ -10,6 +10,8 @@ from users import models __all__ = ( 'GroupFilterV1', + 'OwnerFilterV1', + 'OwnerGroupFilterV1', 'UserFilterV1', ) @@ -32,3 +34,24 @@ class UserFilterV1(BaseObjectTypeFilterMixinV1): last_login: DatetimeFilterLookup[datetime] | None = strawberry_django.filter_field() groups: Annotated['GroupFilterV1', strawberry.lazy('users.graphql.filters_v1')] | None = ( strawberry_django.filter_field()) + + +@strawberry_django.filter_type(models.Owner, lookups=True) +class OwnerFilterV1(BaseObjectTypeFilterMixinV1): + name: FilterLookup[str] | None = strawberry_django.filter_field() + description: FilterLookup[str] | None = strawberry_django.filter_field() + group: Annotated['OwnerGroupFilterV1', strawberry.lazy('users.graphql.filters_v1')] | None = ( + strawberry_django.filter_field() + ) + user_groups: Annotated['GroupFilterV1', strawberry.lazy('users.graphql.filters_v1')] | None = ( + strawberry_django.filter_field() + ) + users: Annotated['UserFilterV1', strawberry.lazy('users.graphql.filters_v1')] | None = ( + strawberry_django.filter_field() + ) + + +@strawberry_django.filter_type(models.OwnerGroup, lookups=True) +class OwnerGroupFilterV1(BaseObjectTypeFilterMixinV1): + name: FilterLookup[str] | None = strawberry_django.filter_field() + description: FilterLookup[str] | None = strawberry_django.filter_field() diff --git a/netbox/users/graphql/mixins_v1.py b/netbox/users/graphql/mixins_v1.py new file mode 100644 index 000000000..b2fb22e6d --- /dev/null +++ b/netbox/users/graphql/mixins_v1.py @@ -0,0 +1,15 @@ +from typing import Annotated, TYPE_CHECKING + +import strawberry + +if TYPE_CHECKING: + from users.graphql.types_v1 import OwnerTypeV1 + +__all__ = ( + 'OwnerMixinV1', +) + + +@strawberry.type +class OwnerMixinV1: + owner: Annotated['OwnerTypeV1', strawberry.lazy('users.graphql.types_v1')] | None diff --git a/netbox/users/graphql/schema_v1.py b/netbox/users/graphql/schema_v1.py index 69c3b9d57..b5389f35e 100644 --- a/netbox/users/graphql/schema_v1.py +++ b/netbox/users/graphql/schema_v1.py @@ -13,3 +13,9 @@ class UsersQueryV1: user: UserTypeV1 = strawberry_django.field() user_list: List[UserTypeV1] = strawberry_django.field() + + owner_group: OwnerGroupTypeV1 = strawberry_django.field() + owner_group_list: List[OwnerGroupTypeV1] = strawberry_django.field() + + owner: OwnerTypeV1 = strawberry_django.field() + owner_list: List[OwnerTypeV1] = strawberry_django.field() diff --git a/netbox/users/graphql/types_v1.py b/netbox/users/graphql/types_v1.py index 3b48431d0..16b0aecde 100644 --- a/netbox/users/graphql/types_v1.py +++ b/netbox/users/graphql/types_v1.py @@ -3,11 +3,13 @@ from typing import List import strawberry_django from netbox.graphql.types_v1 import BaseObjectTypeV1 -from users.models import Group, User +from users.models import Group, Owner, OwnerGroup, User from .filters_v1 import * __all__ = ( 'GroupTypeV1', + 'OwnerGroupTypeV1', + 'OwnerTypeV1', 'UserTypeV1', ) @@ -32,3 +34,23 @@ class GroupTypeV1(BaseObjectTypeV1): ) class UserTypeV1(BaseObjectTypeV1): groups: List[GroupTypeV1] + + +@strawberry_django.type( + OwnerGroup, + fields=['id', 'name', 'description'], + filters=OwnerGroupFilterV1, + pagination=True +) +class OwnerGroupTypeV1(BaseObjectTypeV1): + pass + + +@strawberry_django.type( + Owner, + fields=['id', 'group', 'name', 'description', 'user_groups', 'users'], + filters=OwnerFilterV1, + pagination=True +) +class OwnerTypeV1(BaseObjectTypeV1): + group: OwnerGroupTypeV1 | None diff --git a/netbox/virtualization/graphql/types_v1.py b/netbox/virtualization/graphql/types_v1.py index 079fa7b29..ba6add3cb 100644 --- a/netbox/virtualization/graphql/types_v1.py +++ b/netbox/virtualization/graphql/types_v1.py @@ -6,7 +6,8 @@ import strawberry_django from extras.graphql.mixins_v1 import ConfigContextMixinV1, ContactsMixinV1 from ipam.graphql.mixins_v1 import IPAddressesMixinV1, VLANGroupsMixinV1 from netbox.graphql.scalars import BigInt -from netbox.graphql.types_v1 import OrganizationalObjectTypeV1, NetBoxObjectTypeV1 +from netbox.graphql.types_v1 import OrganizationalObjectTypeV1, NetBoxObjectTypeV1, PrimaryObjectTypeV1 +from users.graphql.mixins_v1 import OwnerMixinV1 from virtualization import models from .filters_v1 import * @@ -36,7 +37,7 @@ __all__ = ( @strawberry.type -class ComponentTypeV1(NetBoxObjectTypeV1): +class ComponentTypeV1(OwnerMixinV1, NetBoxObjectTypeV1): """ Base type for device/VM components """ @@ -49,7 +50,7 @@ class ComponentTypeV1(NetBoxObjectTypeV1): filters=ClusterFilterV1, pagination=True ) -class ClusterTypeV1(ContactsMixinV1, VLANGroupsMixinV1, NetBoxObjectTypeV1): +class ClusterTypeV1(ContactsMixinV1, VLANGroupsMixinV1, PrimaryObjectTypeV1): type: Annotated["ClusterTypeTypeV1", strawberry.lazy('virtualization.graphql.types_v1')] | None group: Annotated["ClusterGroupTypeV1", strawberry.lazy('virtualization.graphql.types_v1')] | None tenant: Annotated["TenantTypeV1", strawberry.lazy('tenancy.graphql.types_v1')] | None @@ -94,7 +95,7 @@ class ClusterTypeTypeV1(OrganizationalObjectTypeV1): filters=VirtualMachineFilterV1, pagination=True ) -class VirtualMachineTypeV1(ConfigContextMixinV1, ContactsMixinV1, NetBoxObjectTypeV1): +class VirtualMachineTypeV1(ConfigContextMixinV1, ContactsMixinV1, PrimaryObjectTypeV1): interface_count: BigInt virtual_disk_count: BigInt interface_count: BigInt diff --git a/netbox/vpn/graphql/types_v1.py b/netbox/vpn/graphql/types_v1.py index 7812f88bb..6872cf6e2 100644 --- a/netbox/vpn/graphql/types_v1.py +++ b/netbox/vpn/graphql/types_v1.py @@ -4,7 +4,7 @@ import strawberry import strawberry_django from extras.graphql.mixins_v1 import ContactsMixinV1, CustomFieldsMixinV1, TagsMixinV1 -from netbox.graphql.types_v1 import ObjectTypeV1, OrganizationalObjectTypeV1, NetBoxObjectTypeV1 +from netbox.graphql.types_v1 import ObjectTypeV1, OrganizationalObjectTypeV1, NetBoxObjectTypeV1, PrimaryObjectTypeV1 from vpn import models from .filters_v1 import * @@ -58,7 +58,7 @@ class TunnelTerminationTypeV1(CustomFieldsMixinV1, TagsMixinV1, ObjectTypeV1): filters=TunnelFilterV1, pagination=True ) -class TunnelTypeV1(ContactsMixinV1, NetBoxObjectTypeV1): +class TunnelTypeV1(ContactsMixinV1, PrimaryObjectTypeV1): group: Annotated["TunnelGroupTypeV1", strawberry.lazy('vpn.graphql.types_v1')] | None ipsec_profile: Annotated["IPSecProfileTypeV1", strawberry.lazy('vpn.graphql.types_v1')] | None tenant: Annotated["TenantTypeV1", strawberry.lazy('tenancy.graphql.types_v1')] | None @@ -72,8 +72,7 @@ class TunnelTypeV1(ContactsMixinV1, NetBoxObjectTypeV1): filters=IKEProposalFilterV1, pagination=True ) -class IKEProposalTypeV1(OrganizationalObjectTypeV1): - +class IKEProposalTypeV1(PrimaryObjectTypeV1): ike_policies: List[Annotated["IKEPolicyTypeV1", strawberry.lazy('vpn.graphql.types_v1')]] @@ -95,7 +94,7 @@ class IKEPolicyTypeV1(OrganizationalObjectTypeV1): filters=IPSecProposalFilterV1, pagination=True ) -class IPSecProposalTypeV1(OrganizationalObjectTypeV1): +class IPSecProposalTypeV1(PrimaryObjectTypeV1): ipsec_policies: List[Annotated["IPSecPolicyTypeV1", strawberry.lazy('vpn.graphql.types_v1')]] @@ -131,7 +130,7 @@ class IPSecProfileTypeV1(OrganizationalObjectTypeV1): filters=L2VPNFilterV1, pagination=True ) -class L2VPNTypeV1(ContactsMixinV1, NetBoxObjectTypeV1): +class L2VPNTypeV1(ContactsMixinV1, PrimaryObjectTypeV1): tenant: Annotated["TenantTypeV1", strawberry.lazy('tenancy.graphql.types_v1')] | None export_targets: List[Annotated["RouteTargetTypeV1", strawberry.lazy('ipam.graphql.types_v1')]] diff --git a/netbox/wireless/graphql/types_v1.py b/netbox/wireless/graphql/types_v1.py index b774f8f28..2c0fbe12f 100644 --- a/netbox/wireless/graphql/types_v1.py +++ b/netbox/wireless/graphql/types_v1.py @@ -3,7 +3,7 @@ from typing import Annotated, List, TYPE_CHECKING, Union import strawberry import strawberry_django -from netbox.graphql.types_v1 import OrganizationalObjectTypeV1, NetBoxObjectTypeV1 +from netbox.graphql.types_v1 import PrimaryObjectTypeV1, NestedGroupObjectTypeV1 from wireless import models from .filters_v1 import * @@ -27,7 +27,7 @@ __all__ = ( filters=WirelessLANGroupFilterV1, pagination=True ) -class WirelessLANGroupTypeV1(OrganizationalObjectTypeV1): +class WirelessLANGroupTypeV1(NestedGroupObjectTypeV1): parent: Annotated["WirelessLANGroupTypeV1", strawberry.lazy('wireless.graphql.types_v1')] | None wireless_lans: List[Annotated["WirelessLANTypeV1", strawberry.lazy('wireless.graphql.types_v1')]] @@ -40,7 +40,7 @@ class WirelessLANGroupTypeV1(OrganizationalObjectTypeV1): filters=WirelessLANFilterV1, pagination=True ) -class WirelessLANTypeV1(NetBoxObjectTypeV1): +class WirelessLANTypeV1(PrimaryObjectTypeV1): group: Annotated["WirelessLANGroupTypeV1", strawberry.lazy('wireless.graphql.types_v1')] | None vlan: Annotated["VLANTypeV1", strawberry.lazy('ipam.graphql.types_v1')] | None tenant: Annotated["TenantTypeV1", strawberry.lazy('tenancy.graphql.types_v1')] | None @@ -63,7 +63,7 @@ class WirelessLANTypeV1(NetBoxObjectTypeV1): filters=WirelessLinkFilterV1, pagination=True ) -class WirelessLinkTypeV1(NetBoxObjectTypeV1): +class WirelessLinkTypeV1(PrimaryObjectTypeV1): interface_a: Annotated["InterfaceTypeV1", strawberry.lazy('dcim.graphql.types_v1')] interface_b: Annotated["InterfaceTypeV1", strawberry.lazy('dcim.graphql.types_v1')] tenant: Annotated["TenantTypeV1", strawberry.lazy('tenancy.graphql.types_v1')] | None