Просмотр исходного кода

Adds custom field on webhook model (#13336)

* adds custom field on webhook model #11936

* adds tags on webhook model #11936

* Remove extraneous import; revert change to NetBoxModelForm (no longer needed)

---------

Co-authored-by: Jeremy Stretch <jstretch@netboxlabs.com>
Abhimanyu Saharan 2 лет назад
Родитель
Сommit
1cc78be6ca

+ 2 - 2
netbox/extras/api/serializers.py

@@ -61,7 +61,7 @@ __all__ = (
 # Webhooks
 # Webhooks
 #
 #
 
 
-class WebhookSerializer(ValidatedModelSerializer):
+class WebhookSerializer(NetBoxModelSerializer):
     url = serializers.HyperlinkedIdentityField(view_name='extras-api:webhook-detail')
     url = serializers.HyperlinkedIdentityField(view_name='extras-api:webhook-detail')
     content_types = ContentTypeField(
     content_types = ContentTypeField(
         queryset=ContentType.objects.filter(FeatureQuery('webhooks').get_query()),
         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',
             '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',
             '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',
             'additional_headers', 'body_template', 'secret', 'conditions', 'ssl_verification', 'ca_file_path',
-            'created', 'last_updated',
+            'custom_fields', 'tags', 'created', 'last_updated',
         ]
         ]
 
 
 
 

+ 1 - 1
netbox/extras/filtersets.py

@@ -34,7 +34,7 @@ __all__ = (
 )
 )
 
 
 
 
-class WebhookFilterSet(BaseFilterSet):
+class WebhookFilterSet(NetBoxModelFilterSet):
     q = django_filters.CharFilter(
     q = django_filters.CharFilter(
         method='search',
         method='search',
         label=_('Search'),
         label=_('Search'),

+ 4 - 1
netbox/extras/forms/bulk_edit.py

@@ -3,6 +3,7 @@ from django.utils.translation import gettext_lazy as _
 
 
 from extras.choices import *
 from extras.choices import *
 from extras.models import *
 from extras.models import *
+from netbox.forms import NetBoxModelBulkEditForm
 from utilities.forms import BulkEditForm, add_blank_choice
 from utilities.forms import BulkEditForm, add_blank_choice
 from utilities.forms.fields import ColorField, DynamicModelChoiceField
 from utilities.forms.fields import ColorField, DynamicModelChoiceField
 from utilities.forms.widgets import BulkEditNullBooleanSelect
 from utilities.forms.widgets import BulkEditNullBooleanSelect
@@ -165,7 +166,9 @@ class SavedFilterBulkEditForm(BulkEditForm):
     nullable_fields = ('description',)
     nullable_fields = ('description',)
 
 
 
 
-class WebhookBulkEditForm(BulkEditForm):
+class WebhookBulkEditForm(NetBoxModelBulkEditForm):
+    model = Webhook
+
     pk = forms.ModelMultipleChoiceField(
     pk = forms.ModelMultipleChoiceField(
         queryset=Webhook.objects.all(),
         queryset=Webhook.objects.all(),
         widget=forms.MultipleHiddenInput
         widget=forms.MultipleHiddenInput

+ 2 - 2
netbox/extras/forms/bulk_import.py

@@ -140,7 +140,7 @@ class SavedFilterImportForm(CSVModelForm):
         )
         )
 
 
 
 
-class WebhookImportForm(CSVModelForm):
+class WebhookImportForm(NetBoxModelImportForm):
     content_types = CSVMultipleContentTypeField(
     content_types = CSVMultipleContentTypeField(
         label=_('Content types'),
         label=_('Content types'),
         queryset=ContentType.objects.all(),
         queryset=ContentType.objects.all(),
@@ -153,7 +153,7 @@ class WebhookImportForm(CSVModelForm):
         fields = (
         fields = (
             'name', 'enabled', 'content_types', 'type_create', 'type_update', 'type_delete', 'type_job_start',
             'name', 'enabled', 'content_types', 'type_create', 'type_update', 'type_delete', 'type_job_start',
             'type_job_end', 'payload_url', 'http_method', 'http_content_type', 'additional_headers', 'body_template',
             'type_job_end', 'payload_url', 'http_method', 'http_content_type', 'additional_headers', 'body_template',
-            'secret', 'ssl_verification', 'ca_file_path'
+            'secret', 'ssl_verification', 'ca_file_path', 'tags'
         )
         )
 
 
 
 

+ 6 - 3
netbox/extras/forms/filtersets.py

@@ -16,7 +16,7 @@ from utilities.forms.fields import (
 )
 )
 from utilities.forms.widgets import APISelectMultiple, DateTimePicker
 from utilities.forms.widgets import APISelectMultiple, DateTimePicker
 from virtualization.models import Cluster, ClusterGroup, ClusterType
 from virtualization.models import Cluster, ClusterGroup, ClusterType
-from .mixins import SavedFiltersMixin
+from .mixins import *
 
 
 __all__ = (
 __all__ = (
     'ConfigContextFilterForm',
     'ConfigContextFilterForm',
@@ -219,9 +219,12 @@ class SavedFilterFilterForm(SavedFiltersMixin, FilterForm):
     )
     )
 
 
 
 
-class WebhookFilterForm(SavedFiltersMixin, FilterForm):
+class WebhookFilterForm(NetBoxModelFilterSetForm):
+    model = Webhook
+    tag = TagFilterField(model)
+
     fieldsets = (
     fieldsets = (
-        (None, ('q', 'filter_id')),
+        (None, ('q', 'filter_id', 'tag')),
         (_('Attributes'), ('content_type_id', 'http_method', 'enabled')),
         (_('Attributes'), ('content_type_id', 'http_method', 'enabled')),
         (_('Events'), ('type_create', 'type_update', 'type_delete', 'type_job_start', 'type_job_end')),
         (_('Events'), ('type_create', 'type_update', 'type_delete', 'type_job_start', 'type_job_end')),
     )
     )

+ 2 - 2
netbox/extras/forms/model_forms.py

@@ -214,7 +214,7 @@ class BookmarkForm(BootstrapMixin, forms.ModelForm):
         fields = ('object_type', 'object_id')
         fields = ('object_type', 'object_id')
 
 
 
 
-class WebhookForm(BootstrapMixin, forms.ModelForm):
+class WebhookForm(NetBoxModelForm):
     content_types = ContentTypeMultipleChoiceField(
     content_types = ContentTypeMultipleChoiceField(
         label=_('Content types'),
         label=_('Content types'),
         queryset=ContentType.objects.all(),
         queryset=ContentType.objects.all(),
@@ -222,7 +222,7 @@ class WebhookForm(BootstrapMixin, forms.ModelForm):
     )
     )
 
 
     fieldsets = (
     fieldsets = (
-        (_('Webhook'), ('name', 'content_types', 'enabled')),
+        (_('Webhook'), ('name', 'content_types', 'enabled', 'tags')),
         (_('Events'), ('type_create', 'type_update', 'type_delete', 'type_job_start', 'type_job_end')),
         (_('Events'), ('type_create', 'type_update', 'type_delete', 'type_job_start', 'type_job_end')),
         (_('HTTP Request'), (
         (_('HTTP Request'), (
             'payload_url', 'http_method', 'http_content_type', 'additional_headers', 'body_template', 'secret',
             'payload_url', 'http_method', 'http_content_type', 'additional_headers', 'body_template', 'secret',

+ 2 - 2
netbox/extras/graphql/types.py

@@ -1,6 +1,6 @@
 from extras import filtersets, models
 from extras import filtersets, models
 from extras.graphql.mixins import CustomFieldsMixin, TagsMixin
 from extras.graphql.mixins import CustomFieldsMixin, TagsMixin
-from netbox.graphql.types import BaseObjectType, ObjectType
+from netbox.graphql.types import BaseObjectType, ObjectType, OrganizationalObjectType
 
 
 __all__ = (
 __all__ = (
     'ConfigContextType',
     'ConfigContextType',
@@ -106,7 +106,7 @@ class TagType(ObjectType):
         filterset_class = filtersets.TagFilterSet
         filterset_class = filtersets.TagFilterSet
 
 
 
 
-class WebhookType(ObjectType):
+class WebhookType(OrganizationalObjectType):
 
 
     class Meta:
     class Meta:
         model = models.Webhook
         model = models.Webhook

+ 25 - 0
netbox/extras/migrations/0098_webhook_custom_field_data_webhook_tags.py

@@ -0,0 +1,25 @@
+# Generated by Django 4.1.10 on 2023-08-01 16:32
+
+from django.db import migrations, models
+import taggit.managers
+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),
+        ),
+        migrations.AddField(
+            model_name='webhook',
+            name='tags',
+            field=taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag'),
+        ),
+    ]

+ 1 - 1
netbox/extras/models/models.py

@@ -39,7 +39,7 @@ __all__ = (
 )
 )
 
 
 
 
-class Webhook(ExportTemplatesMixin, ChangeLoggedModel):
+class Webhook(CustomFieldsMixin, ExportTemplatesMixin, TagsMixin, ChangeLoggedModel):
     """
     """
     A Webhook defines a request that will be sent to a remote application when an object is created, updated, and/or
     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.
     delete in NetBox. The request will contain a representation of the object, which the remote application can act on.

+ 4 - 1
netbox/extras/tables/tables.py

@@ -297,13 +297,16 @@ class WebhookTable(NetBoxTable):
     ssl_validation = columns.BooleanColumn(
     ssl_validation = columns.BooleanColumn(
         verbose_name=_('SSL Validation')
         verbose_name=_('SSL Validation')
     )
     )
+    tags = columns.TagColumn(
+        url_name='extras:webhook_list'
+    )
 
 
     class Meta(NetBoxTable.Meta):
     class Meta(NetBoxTable.Meta):
         model = Webhook
         model = Webhook
         fields = (
         fields = (
             'pk', 'id', 'name', 'content_types', 'enabled', 'type_create', 'type_update', 'type_delete',
             'pk', 'id', 'name', 'content_types', 'enabled', 'type_create', 'type_update', 'type_delete',
             'type_job_start', 'type_job_end', 'http_method', 'payload_url', 'secret', 'ssl_validation', 'ca_file_path',
             'type_job_start', 'type_job_end', 'http_method', 'payload_url', 'secret', 'ssl_validation', 'ca_file_path',
-            'created', 'last_updated',
+            'tags', 'created', 'last_updated',
         )
         )
         default_columns = (
         default_columns = (
             'pk', 'name', 'content_types', 'enabled', 'type_create', 'type_update', 'type_delete', 'type_job_start',
             'pk', 'name', 'content_types', 'enabled', 'type_create', 'type_update', 'type_delete', 'type_job_start',

+ 2 - 0
netbox/templates/extras/webhook.html

@@ -147,6 +147,8 @@
         {% endif %}
         {% endif %}
       </div>
       </div>
     </div>
     </div>
+    {% include 'inc/panels/custom_fields.html' %}
+    {% include 'inc/panels/tags.html' %}
     {% plugin_right_page object %}
     {% plugin_right_page object %}
   </div>
   </div>
 </div>
 </div>