From 836e6e008d1732c42b986405901a8c3070d14657 Mon Sep 17 00:00:00 2001 From: Abhimanyu Saharan Date: Tue, 1 Aug 2023 21:27:49 +0530 Subject: [PATCH] adds custom field on webhook model #11936 --- netbox/extras/api/serializers.py | 6 +++--- netbox/extras/forms/bulk_edit.py | 9 ++++++++- netbox/extras/forms/bulk_import.py | 4 +++- netbox/extras/forms/filtersets.py | 6 ++++-- netbox/extras/forms/model_forms.py | 4 +++- netbox/extras/graphql/types.py | 2 +- .../0098_webhook_custom_field_data.py | 19 +++++++++++++++++++ netbox/extras/models/models.py | 2 +- netbox/netbox/forms/base.py | 2 +- netbox/templates/extras/webhook.html | 1 + 10 files changed, 44 insertions(+), 11 deletions(-) create mode 100644 netbox/extras/migrations/0098_webhook_custom_field_data.py diff --git a/netbox/extras/api/serializers.py b/netbox/extras/api/serializers.py index d5d09301c..266a376cb 100644 --- a/netbox/extras/api/serializers.py +++ b/netbox/extras/api/serializers.py @@ -18,7 +18,7 @@ from extras.utils import FeatureQuery from netbox.api.exceptions import SerializerNotFound from netbox.api.fields import ChoiceField, ContentTypeField, SerializedPKRelatedField from netbox.api.serializers import BaseModelSerializer, NetBoxModelSerializer, ValidatedModelSerializer -from netbox.api.serializers.features import TaggableModelSerializer +from netbox.api.serializers.features import CustomFieldModelSerializer, TaggableModelSerializer from netbox.constants import NESTED_SERIALIZER_PREFIX from tenancy.api.nested_serializers import NestedTenantSerializer, NestedTenantGroupSerializer from tenancy.models import Tenant, TenantGroup @@ -61,7 +61,7 @@ __all__ = ( # Webhooks # -class WebhookSerializer(ValidatedModelSerializer): +class WebhookSerializer(CustomFieldModelSerializer, ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:webhook-detail') content_types = ContentTypeField( queryset=ContentType.objects.filter(FeatureQuery('webhooks').get_query()), @@ -74,7 +74,7 @@ class WebhookSerializer(ValidatedModelSerializer): 'id', 'url', 'display', 'content_types', 'name', 'type_create', 'type_update', 'type_delete', 'type_job_start', 'type_job_end', 'payload_url', 'enabled', 'http_method', 'http_content_type', 'additional_headers', 'body_template', 'secret', 'conditions', 'ssl_verification', 'ca_file_path', - 'created', 'last_updated', + 'custom_fields', 'created', 'last_updated', ] diff --git a/netbox/extras/forms/bulk_edit.py b/netbox/extras/forms/bulk_edit.py index 46bd4d64c..02e7b462e 100644 --- a/netbox/extras/forms/bulk_edit.py +++ b/netbox/extras/forms/bulk_edit.py @@ -3,6 +3,7 @@ from django.utils.translation import gettext_lazy as _ from extras.choices import * from extras.models import * +from netbox.forms import NetBoxModelBulkEditForm from utilities.forms import BulkEditForm, add_blank_choice from utilities.forms.fields import ColorField, DynamicModelChoiceField from utilities.forms.widgets import BulkEditNullBooleanSelect @@ -165,7 +166,9 @@ class SavedFilterBulkEditForm(BulkEditForm): nullable_fields = ('description',) -class WebhookBulkEditForm(BulkEditForm): +class WebhookBulkEditForm(NetBoxModelBulkEditForm): + model = Webhook + pk = forms.ModelMultipleChoiceField( queryset=Webhook.objects.all(), widget=forms.MultipleHiddenInput @@ -223,6 +226,10 @@ class WebhookBulkEditForm(BulkEditForm): label=_('CA file path') ) + add_tags = None + + remove_tags = None + nullable_fields = ('secret', 'conditions', 'ca_file_path') diff --git a/netbox/extras/forms/bulk_import.py b/netbox/extras/forms/bulk_import.py index 31afbd39d..419f06c0e 100644 --- a/netbox/extras/forms/bulk_import.py +++ b/netbox/extras/forms/bulk_import.py @@ -140,7 +140,7 @@ class SavedFilterImportForm(CSVModelForm): ) -class WebhookImportForm(CSVModelForm): +class WebhookImportForm(NetBoxModelImportForm): content_types = CSVMultipleContentTypeField( label=_('Content types'), queryset=ContentType.objects.all(), @@ -148,6 +148,8 @@ class WebhookImportForm(CSVModelForm): help_text=_("One or more assigned object types") ) + tags = None + class Meta: model = Webhook fields = ( diff --git a/netbox/extras/forms/filtersets.py b/netbox/extras/forms/filtersets.py index 5d1d2015e..cc292f60f 100644 --- a/netbox/extras/forms/filtersets.py +++ b/netbox/extras/forms/filtersets.py @@ -16,7 +16,7 @@ from utilities.forms.fields import ( ) from utilities.forms.widgets import APISelectMultiple, DateTimePicker from virtualization.models import Cluster, ClusterGroup, ClusterType -from .mixins import SavedFiltersMixin +from .mixins import * __all__ = ( 'ConfigContextFilterForm', @@ -219,7 +219,9 @@ class SavedFilterFilterForm(SavedFiltersMixin, FilterForm): ) -class WebhookFilterForm(SavedFiltersMixin, FilterForm): +class WebhookFilterForm(CustomFieldsMixin, SavedFiltersMixin, FilterForm): + model = Webhook + fieldsets = ( (None, ('q', 'filter_id')), (_('Attributes'), ('content_type_id', 'http_method', 'enabled')), diff --git a/netbox/extras/forms/model_forms.py b/netbox/extras/forms/model_forms.py index 414563f59..9f13bed66 100644 --- a/netbox/extras/forms/model_forms.py +++ b/netbox/extras/forms/model_forms.py @@ -214,13 +214,15 @@ class BookmarkForm(BootstrapMixin, forms.ModelForm): fields = ('object_type', 'object_id') -class WebhookForm(BootstrapMixin, forms.ModelForm): +class WebhookForm(NetBoxModelForm): content_types = ContentTypeMultipleChoiceField( label=_('Content types'), queryset=ContentType.objects.all(), limit_choices_to=FeatureQuery('webhooks') ) + tags = None + fieldsets = ( (_('Webhook'), ('name', 'content_types', 'enabled')), (_('Events'), ('type_create', 'type_update', 'type_delete', 'type_job_start', 'type_job_end')), diff --git a/netbox/extras/graphql/types.py b/netbox/extras/graphql/types.py index 73ff8eb8a..b3c6a4abb 100644 --- a/netbox/extras/graphql/types.py +++ b/netbox/extras/graphql/types.py @@ -106,7 +106,7 @@ class TagType(ObjectType): filterset_class = filtersets.TagFilterSet -class WebhookType(ObjectType): +class WebhookType(CustomFieldsMixin, ObjectType): class Meta: model = models.Webhook diff --git a/netbox/extras/migrations/0098_webhook_custom_field_data.py b/netbox/extras/migrations/0098_webhook_custom_field_data.py new file mode 100644 index 000000000..d9f2da0b8 --- /dev/null +++ b/netbox/extras/migrations/0098_webhook_custom_field_data.py @@ -0,0 +1,19 @@ +# Generated by Django 4.1.10 on 2023-08-01 15:29 + +from django.db import migrations, models +import utilities.json + + +class Migration(migrations.Migration): + + dependencies = [ + ('extras', '0097_customfield_remove_choices'), + ] + + operations = [ + migrations.AddField( + model_name='webhook', + name='custom_field_data', + field=models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder), + ), + ] diff --git a/netbox/extras/models/models.py b/netbox/extras/models/models.py index b209f0d5b..144032f1f 100644 --- a/netbox/extras/models/models.py +++ b/netbox/extras/models/models.py @@ -39,7 +39,7 @@ __all__ = ( ) -class Webhook(ExportTemplatesMixin, ChangeLoggedModel): +class Webhook(CustomFieldsMixin, ExportTemplatesMixin, ChangeLoggedModel): """ A Webhook defines a request that will be sent to a remote application when an object is created, updated, and/or delete in NetBox. The request will contain a representation of the object, which the remote application can act on. diff --git a/netbox/netbox/forms/base.py b/netbox/netbox/forms/base.py index 91c4dab43..e1cecaa18 100644 --- a/netbox/netbox/forms/base.py +++ b/netbox/netbox/forms/base.py @@ -36,7 +36,7 @@ class NetBoxModelForm(BootstrapMixin, CheckLastUpdatedMixin, CustomFieldsMixin, super().__init__(*args, **kwargs) # Limit tags to those applicable to the object type - if (ct := self._get_content_type()) and hasattr(self.fields['tags'].widget, 'add_query_param'): + if self.fields.get('tags') and (ct := self._get_content_type()) and hasattr(self.fields['tags'].widget, 'add_query_param'): self.fields['tags'].widget.add_query_param('for_object_type_id', ct.pk) def _get_content_type(self): diff --git a/netbox/templates/extras/webhook.html b/netbox/templates/extras/webhook.html index dde5d6897..7bfd4cc0c 100644 --- a/netbox/templates/extras/webhook.html +++ b/netbox/templates/extras/webhook.html @@ -147,6 +147,7 @@ {% endif %} + {% include 'inc/panels/custom_fields.html' %} {% plugin_right_page object %}