From 88d2441ab377ddac17ecf59028fa07623f97f2ab Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 3 Aug 2021 14:51:56 -0400 Subject: [PATCH] Add changelog GraphQL relation for changelogged models --- netbox/circuits/graphql/types.py | 4 ++-- netbox/dcim/graphql/types.py | 4 +++- netbox/extras/graphql/mixins.py | 8 ++++++++ netbox/extras/graphql/types.py | 25 +++++++++++++++++-------- netbox/netbox/graphql/types.py | 15 ++++++++++++++- netbox/netbox/models.py | 5 +++++ 6 files changed, 49 insertions(+), 12 deletions(-) diff --git a/netbox/circuits/graphql/types.py b/netbox/circuits/graphql/types.py index c359acf49..a6c28c4cd 100644 --- a/netbox/circuits/graphql/types.py +++ b/netbox/circuits/graphql/types.py @@ -1,5 +1,5 @@ from circuits import filtersets, models -from netbox.graphql.types import BaseObjectType, OrganizationalObjectType, PrimaryObjectType +from netbox.graphql.types import ObjectType, OrganizationalObjectType, PrimaryObjectType __all__ = ( 'CircuitTerminationType', @@ -10,7 +10,7 @@ __all__ = ( ) -class CircuitTerminationType(BaseObjectType): +class CircuitTerminationType(ObjectType): class Meta: model = models.CircuitTermination diff --git a/netbox/dcim/graphql/types.py b/netbox/dcim/graphql/types.py index c9e538e6e..45552ae8c 100644 --- a/netbox/dcim/graphql/types.py +++ b/netbox/dcim/graphql/types.py @@ -1,5 +1,5 @@ from dcim import filtersets, models -from extras.graphql.mixins import CustomFieldsMixin, ImageAttachmentsMixin, TagsMixin +from extras.graphql.mixins import ChangelogMixin, CustomFieldsMixin, ImageAttachmentsMixin, TagsMixin from ipam.graphql.mixins import IPAddressesMixin, VLANGroupsMixin from netbox.graphql.types import BaseObjectType, OrganizationalObjectType, PrimaryObjectType @@ -47,6 +47,7 @@ __all__ = ( class ComponentObjectType( + ChangelogMixin, CustomFieldsMixin, TagsMixin, BaseObjectType @@ -59,6 +60,7 @@ class ComponentObjectType( class ComponentTemplateObjectType( + ChangelogMixin, BaseObjectType ): """ diff --git a/netbox/extras/graphql/mixins.py b/netbox/extras/graphql/mixins.py index 0a6792025..0afa6732e 100644 --- a/netbox/extras/graphql/mixins.py +++ b/netbox/extras/graphql/mixins.py @@ -2,6 +2,7 @@ import graphene from graphene.types.generic import GenericScalar __all__ = ( + 'ChangelogMixin', 'CustomFieldsMixin', 'ImageAttachmentsMixin', 'JournalEntriesMixin', @@ -9,6 +10,13 @@ __all__ = ( ) +class ChangelogMixin: + changelog = graphene.List('extras.graphql.types.ObjectChangeType') + + def resolve_changelog(self, info): + return self.object_changes.restrict(info.context.user, 'view') + + class CustomFieldsMixin: custom_fields = GenericScalar() diff --git a/netbox/extras/graphql/types.py b/netbox/extras/graphql/types.py index 96651351d..c5f34a11e 100644 --- a/netbox/extras/graphql/types.py +++ b/netbox/extras/graphql/types.py @@ -1,5 +1,5 @@ from extras import filtersets, models -from netbox.graphql.types import BaseObjectType +from netbox.graphql.types import BaseObjectType, ObjectType __all__ = ( 'ConfigContextType', @@ -8,12 +8,13 @@ __all__ = ( 'ExportTemplateType', 'ImageAttachmentType', 'JournalEntryType', + 'ObjectChangeType', 'TagType', 'WebhookType', ) -class ConfigContextType(BaseObjectType): +class ConfigContextType(ObjectType): class Meta: model = models.ConfigContext @@ -21,7 +22,7 @@ class ConfigContextType(BaseObjectType): filterset_class = filtersets.ConfigContextFilterSet -class CustomFieldType(BaseObjectType): +class CustomFieldType(ObjectType): class Meta: model = models.CustomField @@ -29,7 +30,7 @@ class CustomFieldType(BaseObjectType): filterset_class = filtersets.CustomFieldFilterSet -class CustomLinkType(BaseObjectType): +class CustomLinkType(ObjectType): class Meta: model = models.CustomLink @@ -37,7 +38,7 @@ class CustomLinkType(BaseObjectType): filterset_class = filtersets.CustomLinkFilterSet -class ExportTemplateType(BaseObjectType): +class ExportTemplateType(ObjectType): class Meta: model = models.ExportTemplate @@ -53,7 +54,7 @@ class ImageAttachmentType(BaseObjectType): filterset_class = filtersets.ImageAttachmentFilterSet -class JournalEntryType(BaseObjectType): +class JournalEntryType(ObjectType): class Meta: model = models.JournalEntry @@ -61,7 +62,15 @@ class JournalEntryType(BaseObjectType): filterset_class = filtersets.JournalEntryFilterSet -class TagType(BaseObjectType): +class ObjectChangeType(BaseObjectType): + + class Meta: + model = models.ObjectChange + fields = '__all__' + filterset_class = filtersets.ObjectChangeFilterSet + + +class TagType(ObjectType): class Meta: model = models.Tag @@ -69,7 +78,7 @@ class TagType(BaseObjectType): filterset_class = filtersets.TagFilterSet -class WebhookType(BaseObjectType): +class WebhookType(ObjectType): class Meta: model = models.Webhook diff --git a/netbox/netbox/graphql/types.py b/netbox/netbox/graphql/types.py index 275ed0235..181b9a0c6 100644 --- a/netbox/netbox/graphql/types.py +++ b/netbox/netbox/graphql/types.py @@ -1,7 +1,7 @@ from django.contrib.contenttypes.models import ContentType from graphene_django import DjangoObjectType -from extras.graphql.mixins import CustomFieldsMixin, JournalEntriesMixin, TagsMixin +from extras.graphql.mixins import ChangelogMixin, CustomFieldsMixin, JournalEntriesMixin, TagsMixin __all__ = ( 'BaseObjectType', @@ -27,7 +27,19 @@ class BaseObjectType(DjangoObjectType): return queryset.restrict(info.context.user, 'view') +class ObjectType( + ChangelogMixin, + BaseObjectType +): + """ + Base GraphQL object type for unclassified models which support change logging + """ + class Meta: + abstract = True + + class OrganizationalObjectType( + ChangelogMixin, CustomFieldsMixin, BaseObjectType ): @@ -39,6 +51,7 @@ class OrganizationalObjectType( class PrimaryObjectType( + ChangelogMixin, CustomFieldsMixin, JournalEntriesMixin, TagsMixin, diff --git a/netbox/netbox/models.py b/netbox/netbox/models.py index 3045e1fce..317548921 100644 --- a/netbox/netbox/models.py +++ b/netbox/netbox/models.py @@ -40,6 +40,11 @@ class ChangeLoggingMixin(models.Model): blank=True, null=True ) + object_changes = GenericRelation( + to='extras.ObjectChange', + content_type_field='changed_object_type', + object_id_field='changed_object_id' + ) class Meta: abstract = True