From 1e06d3ce3cb2d4cd79247a7d67fdd582f4aa38bc Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Fri, 25 Jun 2021 14:12:09 -0400 Subject: [PATCH] Add GraphQL for extras --- netbox/extras/graphql/__init__.py | 0 netbox/extras/graphql/schema.py | 30 ++++++++++++ netbox/extras/graphql/types.py | 77 +++++++++++++++++++++++++++++++ netbox/extras/tests/test_api.py | 17 +++---- netbox/netbox/graphql/schema.py | 2 + netbox/netbox/graphql/types.py | 6 +-- 6 files changed, 121 insertions(+), 11 deletions(-) create mode 100644 netbox/extras/graphql/__init__.py create mode 100644 netbox/extras/graphql/schema.py create mode 100644 netbox/extras/graphql/types.py diff --git a/netbox/extras/graphql/__init__.py b/netbox/extras/graphql/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/netbox/extras/graphql/schema.py b/netbox/extras/graphql/schema.py new file mode 100644 index 000000000..a0456e7cc --- /dev/null +++ b/netbox/extras/graphql/schema.py @@ -0,0 +1,30 @@ +import graphene + +from netbox.graphql.fields import ObjectField, ObjectListField +from .types import * + + +class ExtrasQuery(graphene.ObjectType): + config_context = ObjectField(ConfigContextType) + config_contexts = ObjectListField(ConfigContextType) + + custom_field = ObjectField(CustomFieldType) + custom_fields = ObjectListField(CustomFieldType) + + custom_link = ObjectField(CustomLinkType) + custom_links = ObjectListField(CustomLinkType) + + export_template = ObjectField(ExportTemplateType) + export_templates = ObjectListField(ExportTemplateType) + + image_attachment = ObjectField(ImageAttachmentType) + image_attachments = ObjectListField(ImageAttachmentType) + + journal_entry = ObjectField(JournalEntryType) + journal_entries = ObjectListField(JournalEntryType) + + tag = ObjectField(TagType) + tags = ObjectListField(TagType) + + webhook = ObjectField(WebhookType) + webhooks = ObjectListField(WebhookType) diff --git a/netbox/extras/graphql/types.py b/netbox/extras/graphql/types.py new file mode 100644 index 000000000..abaed4de7 --- /dev/null +++ b/netbox/extras/graphql/types.py @@ -0,0 +1,77 @@ +from extras import filtersets, models +from netbox.graphql.types import BaseObjectType + +__all__ = ( + 'ConfigContextType', + 'CustomFieldType', + 'CustomLinkType', + 'ExportTemplateType', + 'ImageAttachmentType', + 'JournalEntryType', + 'TagType', + 'WebhookType', +) + + +class ConfigContextType(BaseObjectType): + + class Meta: + model = models.ConfigContext + fields = '__all__' + filterset_class = filtersets.ConfigContextFilterSet + + +class CustomFieldType(BaseObjectType): + + class Meta: + model = models.CustomField + fields = '__all__' + filterset_class = filtersets.CustomFieldFilterSet + + +class CustomLinkType(BaseObjectType): + + class Meta: + model = models.CustomLink + fields = '__all__' + filterset_class = filtersets.CustomLinkFilterSet + + +class ExportTemplateType(BaseObjectType): + + class Meta: + model = models.ExportTemplate + fields = '__all__' + filterset_class = filtersets.ExportTemplateFilterSet + + +class ImageAttachmentType(BaseObjectType): + + class Meta: + model = models.ImageAttachment + fields = '__all__' + filterset_class = filtersets.ImageAttachmentFilterSet + + +class JournalEntryType(BaseObjectType): + + class Meta: + model = models.JournalEntry + fields = '__all__' + filterset_class = filtersets.JournalEntryFilterSet + + +class TagType(BaseObjectType): + + class Meta: + model = models.Tag + fields = '__all__' + filterset_class = filtersets.TagFilterSet + + +class WebhookType(BaseObjectType): + + class Meta: + model = models.Webhook + fields = '__all__' + filterset_class = filtersets.WebhookFilterSet diff --git a/netbox/extras/tests/test_api.py b/netbox/extras/tests/test_api.py index da0e6dbb2..76f8bfea3 100644 --- a/netbox/extras/tests/test_api.py +++ b/netbox/extras/tests/test_api.py @@ -31,7 +31,7 @@ class AppTest(APITestCase): self.assertEqual(response.status_code, 200) -class WebhookTest(APIViewTestCases.APIViewTestCase): +class WebhookTest(APIViewTestCases.GraphQLTestCase, APIViewTestCases.APIViewTestCase): model = Webhook brief_fields = ['display', 'id', 'name', 'url'] create_data = [ @@ -85,7 +85,7 @@ class WebhookTest(APIViewTestCases.APIViewTestCase): webhook.content_types.add(site_ct, rack_ct) -class CustomFieldTest(APIViewTestCases.APIViewTestCase): +class CustomFieldTest(APIViewTestCases.GraphQLTestCase, APIViewTestCases.APIViewTestCase): model = CustomField brief_fields = ['display', 'id', 'name', 'url'] create_data = [ @@ -132,7 +132,7 @@ class CustomFieldTest(APIViewTestCases.APIViewTestCase): cf.content_types.add(site_ct) -class CustomLinkTest(APIViewTestCases.APIViewTestCase): +class CustomLinkTest(APIViewTestCases.GraphQLTestCase, APIViewTestCases.APIViewTestCase): model = CustomLink brief_fields = ['display', 'id', 'name', 'url'] create_data = [ @@ -186,7 +186,7 @@ class CustomLinkTest(APIViewTestCases.APIViewTestCase): CustomLink.objects.bulk_create(custom_links) -class ExportTemplateTest(APIViewTestCases.APIViewTestCase): +class ExportTemplateTest(APIViewTestCases.GraphQLTestCase, APIViewTestCases.APIViewTestCase): model = ExportTemplate brief_fields = ['display', 'id', 'name', 'url'] create_data = [ @@ -234,7 +234,7 @@ class ExportTemplateTest(APIViewTestCases.APIViewTestCase): ExportTemplate.objects.bulk_create(export_templates) -class TagTest(APIViewTestCases.APIViewTestCase): +class TagTest(APIViewTestCases.GraphQLTestCase, APIViewTestCases.APIViewTestCase): model = Tag brief_fields = ['color', 'display', 'id', 'name', 'slug', 'url'] create_data = [ @@ -270,7 +270,8 @@ class TagTest(APIViewTestCases.APIViewTestCase): class ImageAttachmentTest( APIViewTestCases.GetObjectViewTestCase, APIViewTestCases.ListObjectsViewTestCase, - APIViewTestCases.DeleteObjectViewTestCase + APIViewTestCases.DeleteObjectViewTestCase, + APIViewTestCases.GraphQLTestCase ): model = ImageAttachment brief_fields = ['display', 'id', 'image', 'name', 'url'] @@ -310,7 +311,7 @@ class ImageAttachmentTest( ImageAttachment.objects.bulk_create(image_attachments) -class JournalEntryTest(APIViewTestCases.APIViewTestCase): +class JournalEntryTest(APIViewTestCases.GraphQLTestCase, APIViewTestCases.APIViewTestCase): model = JournalEntry brief_fields = ['created', 'display', 'id', 'url'] bulk_update_data = { @@ -360,7 +361,7 @@ class JournalEntryTest(APIViewTestCases.APIViewTestCase): ] -class ConfigContextTest(APIViewTestCases.APIViewTestCase): +class ConfigContextTest(APIViewTestCases.GraphQLTestCase, APIViewTestCases.APIViewTestCase): model = ConfigContext brief_fields = ['display', 'id', 'name', 'url'] create_data = [ diff --git a/netbox/netbox/graphql/schema.py b/netbox/netbox/graphql/schema.py index ff64416bb..0899bd564 100644 --- a/netbox/netbox/graphql/schema.py +++ b/netbox/netbox/graphql/schema.py @@ -1,11 +1,13 @@ import graphene from circuits.graphql.schema import CircuitsQuery +from extras.graphql.schema import ExtrasQuery from ipam.graphql.schema import IPAMQuery class Query( CircuitsQuery, + ExtrasQuery, IPAMQuery, graphene.ObjectType ): diff --git a/netbox/netbox/graphql/types.py b/netbox/netbox/graphql/types.py index 5a4d16a8f..f6d116f59 100644 --- a/netbox/netbox/graphql/types.py +++ b/netbox/netbox/graphql/types.py @@ -26,13 +26,13 @@ class ObjectType(BaseObjectType): """ Extends BaseObjectType with support for custom field data. """ - custom_fields = GenericScalar() + # custom_fields = GenericScalar() class Meta: abstract = True - def resolve_custom_fields(self, info): - return self.custom_field_data + # def resolve_custom_fields(self, info): + # return self.custom_field_data class TaggedObjectType(ObjectType):