1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

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>
This commit is contained in:
Abhimanyu Saharan
2023-08-01 23:35:47 +05:30
committed by GitHub
parent 7b998cfeb4
commit 1cc78be6ca
11 changed files with 51 additions and 15 deletions

View File

@ -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',
] ]

View File

@ -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'),

View File

@ -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

View File

@ -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'
) )

View File

@ -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')),
) )

View File

@ -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',

View File

@ -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

View File

@ -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'),
),
]

View File

@ -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.

View File

@ -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',

View File

@ -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>