10595 fix merge conflicts

This commit is contained in:
Arthur 2022-10-06 16:16:45 -07:00
commit 4ac98a2c26
5 changed files with 61 additions and 5 deletions

View File

@ -18,6 +18,7 @@ A new `PluginMenu` class has been introduced, which enables a plugin to inject a
### Enhancements ### Enhancements
* [#9249](https://github.com/netbox-community/netbox/issues/9249) - Device and virtual machine names are no longer case-sensitive * [#9249](https://github.com/netbox-community/netbox/issues/9249) - Device and virtual machine names are no longer case-sensitive
* [#9478](https://github.com/netbox-community/netbox/issues/9478) - Add `link_peers` field to GraphQL types for cabled objects
* [#9654](https://github.com/netbox-community/netbox/issues/9654) - Add `weight` field to racks, device types, and module types * [#9654](https://github.com/netbox-community/netbox/issues/9654) - Add `weight` field to racks, device types, and module types
* [#9892](https://github.com/netbox-community/netbox/issues/9892) - Add optional `name` field for FHRP groups * [#9892](https://github.com/netbox-community/netbox/issues/9892) - Add optional `name` field for FHRP groups
* [#10348](https://github.com/netbox-community/netbox/issues/10348) - Add decimal custom field type * [#10348](https://github.com/netbox-community/netbox/issues/10348) - Add decimal custom field type
@ -51,3 +52,4 @@ A new `PluginMenu` class has been introduced, which enables a plugin to inject a
### GraphQL API Changes ### GraphQL API Changes
* All object types now include a `display` field * All object types now include a `display` field
* All cabled object types now include a `link_peers` field

View File

@ -37,6 +37,42 @@ from dcim.models import (
) )
class LinkPeerType(graphene.Union):
class Meta:
types = (
CircuitTerminationType,
ConsolePortType,
ConsoleServerPortType,
FrontPortType,
InterfaceType,
PowerFeedType,
PowerOutletType,
PowerPortType,
RearPortType,
)
@classmethod
def resolve_type(cls, instance, info):
if type(instance) == CircuitTermination:
return CircuitTerminationType
if type(instance) == ConsolePortType:
return ConsolePortType
if type(instance) == ConsoleServerPort:
return ConsoleServerPortType
if type(instance) == FrontPort:
return FrontPortType
if type(instance) == Interface:
return InterfaceType
if type(instance) == PowerFeed:
return PowerFeedType
if type(instance) == PowerOutlet:
return PowerOutletType
if type(instance) == PowerPort:
return PowerPortType
if type(instance) == RearPort:
return RearPortType
class CableTerminationTerminationType(graphene.Union): class CableTerminationTerminationType(graphene.Union):
class Meta: class Meta:
types = ( types = (

View File

@ -1,5 +1,12 @@
import graphene
class CabledObjectMixin: class CabledObjectMixin:
link_peers = graphene.List('dcim.graphql.gfk_mixins.LinkPeerType')
def resolve_cable_end(self, info): def resolve_cable_end(self, info):
# Handle empty values # Handle empty values
return self.cable_end or None return self.cable_end or None
def resolve_link_peers(self, info):
return self.link_peers

View File

@ -1,10 +1,14 @@
import graphene import graphene
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from extras.graphql.mixins import (
ChangelogMixin,
CustomFieldsMixin,
JournalEntriesMixin,
TagsMixin,
)
from graphene_django import DjangoObjectType from graphene_django import DjangoObjectType
from extras.graphql.mixins import ChangelogMixin, CustomFieldsMixin, JournalEntriesMixin, TagsMixin
__all__ = ( __all__ = (
'BaseObjectType', 'BaseObjectType',
'ObjectType', 'ObjectType',
@ -22,9 +26,7 @@ class BaseObjectType(DjangoObjectType):
Base GraphQL object type for all NetBox objects. Restricts the model queryset to enforce object permissions. Base GraphQL object type for all NetBox objects. Restricts the model queryset to enforce object permissions.
""" """
display = graphene.String() display = graphene.String()
class_type = graphene.String()
def resolve_display(parent, info, **kwargs):
return str(parent)
class Meta: class Meta:
abstract = True abstract = True
@ -34,6 +36,12 @@ class BaseObjectType(DjangoObjectType):
# Enforce object permissions on the queryset # Enforce object permissions on the queryset
return queryset.restrict(info.context.user, 'view') return queryset.restrict(info.context.user, 'view')
def resolve_display(parent, info, **kwargs):
return str(parent)
def resolve_class_type(parent, info, **kwargs):
return parent.__class__.__name__
class ObjectType( class ObjectType(
ChangelogMixin, ChangelogMixin,

View File

@ -453,6 +453,9 @@ class APIViewTestCases:
elif inspect.isclass(field.type) and issubclass(field.type, GQLUnion): elif inspect.isclass(field.type) and issubclass(field.type, GQLUnion):
# Union types dont' have an id or consistent values # Union types dont' have an id or consistent values
continue continue
elif type(field.type) is GQLList and inspect.isclass(field.type.of_type) and issubclass(field.type.of_type, GQLUnion):
# Union types dont' have an id or consistent values
continue
elif type(field.type) is GQLList and field_name != 'choices': elif type(field.type) is GQLList and field_name != 'choices':
# TODO: Come up with something more elegant # TODO: Come up with something more elegant
# Temporary hack to support automated testing of reverse generic relations # Temporary hack to support automated testing of reverse generic relations