diff --git a/netbox/circuits/graphql/types.py b/netbox/circuits/graphql/types.py index e96fe98a5..b7fce9041 100644 --- a/netbox/circuits/graphql/types.py +++ b/netbox/circuits/graphql/types.py @@ -1,6 +1,8 @@ +import graphene + from circuits import filtersets, models from dcim.graphql.mixins import CabledObjectMixin -from extras.graphql.mixins import CustomFieldsMixin, TagsMixin +from extras.graphql.mixins import CustomFieldsMixin, TagsMixin, ContactsMixin from netbox.graphql.types import ObjectType, OrganizationalObjectType, NetBoxObjectType __all__ = ( @@ -20,8 +22,7 @@ class CircuitTerminationType(CustomFieldsMixin, TagsMixin, CabledObjectMixin, Ob filterset_class = filtersets.CircuitTerminationFilterSet -class CircuitType(NetBoxObjectType): - +class CircuitType(NetBoxObjectType, ContactsMixin): class Meta: model = models.Circuit fields = '__all__' @@ -44,7 +45,7 @@ class ProviderType(NetBoxObjectType): filterset_class = filtersets.ProviderFilterSet -class ProviderNetworkType(NetBoxObjectType): +class ProviderNetworkType(NetBoxObjectType, ContactsMixin): class Meta: model = models.ProviderNetwork diff --git a/netbox/dcim/graphql/types.py b/netbox/dcim/graphql/types.py index 433deca05..bb414ed00 100644 --- a/netbox/dcim/graphql/types.py +++ b/netbox/dcim/graphql/types.py @@ -2,7 +2,7 @@ import graphene from dcim import filtersets, models from extras.graphql.mixins import ( - ChangelogMixin, ConfigContextMixin, CustomFieldsMixin, ImageAttachmentsMixin, TagsMixin, + ChangelogMixin, ConfigContextMixin, ContactsMixin, CustomFieldsMixin, ImageAttachmentsMixin, TagsMixin, ) from ipam.graphql.mixins import IPAddressesMixin, VLANGroupsMixin from netbox.graphql.scalars import BigInt @@ -161,7 +161,7 @@ class ConsoleServerPortTemplateType(ComponentTemplateObjectType): return self.type or None -class DeviceType(ConfigContextMixin, ImageAttachmentsMixin, NetBoxObjectType): +class DeviceType(ConfigContextMixin, ImageAttachmentsMixin, ContactsMixin, NetBoxObjectType): class Meta: model = models.Device @@ -295,7 +295,7 @@ class InventoryItemRoleType(OrganizationalObjectType): filterset_class = filtersets.InventoryItemRoleFilterSet -class LocationType(VLANGroupsMixin, ImageAttachmentsMixin, OrganizationalObjectType): +class LocationType(VLANGroupsMixin, ImageAttachmentsMixin, ContactsMixin, OrganizationalObjectType): class Meta: model = models.Location @@ -303,7 +303,7 @@ class LocationType(VLANGroupsMixin, ImageAttachmentsMixin, OrganizationalObjectT filterset_class = filtersets.LocationFilterSet -class ManufacturerType(OrganizationalObjectType): +class ManufacturerType(OrganizationalObjectType, ContactsMixin): class Meta: model = models.Manufacturer @@ -390,7 +390,7 @@ class PowerOutletTemplateType(ComponentTemplateObjectType): return self.type or None -class PowerPanelType(NetBoxObjectType): +class PowerPanelType(NetBoxObjectType, ContactsMixin): class Meta: model = models.PowerPanel @@ -420,7 +420,7 @@ class PowerPortTemplateType(ComponentTemplateObjectType): return self.type or None -class RackType(VLANGroupsMixin, ImageAttachmentsMixin, NetBoxObjectType): +class RackType(VLANGroupsMixin, ImageAttachmentsMixin, ContactsMixin, NetBoxObjectType): class Meta: model = models.Rack @@ -469,7 +469,7 @@ class RearPortTemplateType(ComponentTemplateObjectType): filterset_class = filtersets.RearPortTemplateFilterSet -class RegionType(VLANGroupsMixin, OrganizationalObjectType): +class RegionType(VLANGroupsMixin, ContactsMixin, OrganizationalObjectType): class Meta: model = models.Region @@ -477,7 +477,7 @@ class RegionType(VLANGroupsMixin, OrganizationalObjectType): filterset_class = filtersets.RegionFilterSet -class SiteType(VLANGroupsMixin, ImageAttachmentsMixin, NetBoxObjectType): +class SiteType(VLANGroupsMixin, ImageAttachmentsMixin, ContactsMixin, NetBoxObjectType): asn = graphene.Field(BigInt) class Meta: @@ -486,7 +486,7 @@ class SiteType(VLANGroupsMixin, ImageAttachmentsMixin, NetBoxObjectType): filterset_class = filtersets.SiteFilterSet -class SiteGroupType(VLANGroupsMixin, OrganizationalObjectType): +class SiteGroupType(VLANGroupsMixin, ContactsMixin, OrganizationalObjectType): class Meta: model = models.SiteGroup diff --git a/netbox/extras/graphql/mixins.py b/netbox/extras/graphql/mixins.py index 462ba721f..7045575fb 100644 --- a/netbox/extras/graphql/mixins.py +++ b/netbox/extras/graphql/mixins.py @@ -59,3 +59,10 @@ class TagsMixin: def resolve_tags(self, info): return self.tags.all() + + +class ContactsMixin: + contacts = graphene.List('tenancy.graphql.types.ContactAssignmentType') + + def resolve_contacts(self, info): + return list(self.contacts.all()) diff --git a/netbox/ipam/graphql/types.py b/netbox/ipam/graphql/types.py index 4937b6a9f..b8f6221bc 100644 --- a/netbox/ipam/graphql/types.py +++ b/netbox/ipam/graphql/types.py @@ -1,6 +1,7 @@ import graphene from graphene_django import DjangoObjectType +from extras.graphql.mixins import ContactsMixin from ipam import filtersets, models from netbox.graphql.scalars import BigInt from netbox.graphql.types import BaseObjectType, OrganizationalObjectType, NetBoxObjectType @@ -159,7 +160,7 @@ class VRFType(NetBoxObjectType): filterset_class = filtersets.VRFFilterSet -class L2VPNType(NetBoxObjectType): +class L2VPNType(ContactsMixin, NetBoxObjectType): class Meta: model = models.L2VPN fields = '__all__'