diff --git a/awx/api/urls/urls.py b/awx/api/urls/urls.py index ab7d61fd23..af62c29541 100644 --- a/awx/api/urls/urls.py +++ b/awx/api/urls/urls.py @@ -137,6 +137,8 @@ v2_urls = [ url(r'^activity_stream/', include(activity_stream_urls)), url(r'^workflow_approval_templates/', include(workflow_approval_template_urls)), url(r'^workflow_approvals/', include(workflow_approval_urls)), + url(r'^(?Pjob_templates|workflow_job_templates)/(?P[0-9]+)/', + include('awx.api.urls.webhooks')), ] diff --git a/awx/api/urls/webhooks.py b/awx/api/urls/webhooks.py new file mode 100644 index 0000000000..33fb697fd4 --- /dev/null +++ b/awx/api/urls/webhooks.py @@ -0,0 +1,14 @@ +from django.conf.urls import url + +from awx.api.views import ( + GithubWebhookReceiver, + GitlabWebhookReceiver, + BitbucketWebhookReceiver, +) + + +urlpatterns = [ + url(r'^github/$', GithubWebhookReceiver.as_view(), name='webhook_receiver_github'), + url(r'^gitlab/$', GitlabWebhookReceiver.as_view(), name='webhook_receiver_gitlab'), + url(r'^bitbucket/$', BitbucketWebhookReceiver.as_view(), name='webhook_receiver_bitbucket'), +] diff --git a/awx/api/views/__init__.py b/awx/api/views/__init__.py index 7b831edfa5..9df5567ec3 100644 --- a/awx/api/views/__init__.py +++ b/awx/api/views/__init__.py @@ -150,6 +150,11 @@ from awx.api.views.root import ( # noqa ApiV2ConfigView, ApiV2SubscriptionView, ) +from awx.api.views.webhooks import ( # noqa + GithubWebhookReceiver, + GitlabWebhookReceiver, + BitbucketWebhookReceiver, +) logger = logging.getLogger('awx.api.views') diff --git a/awx/api/views/webhooks.py b/awx/api/views/webhooks.py index 328436d77a..2728e4ac3b 100644 --- a/awx/api/views/webhooks.py +++ b/awx/api/views/webhooks.py @@ -5,11 +5,26 @@ from django.utils.encoding import force_bytes from rest_framework.exceptions import PermissionDenied from awx.api.generics import APIView +from awx.main.models import JobTemplate, WorkflowJobTemplate class WebhookReceiverBase(APIView): + lookup_url_kwarg = None + lookup_field = 'pk' + + def get_queryset(self): + qs_models = { + 'job_templates': JobTemplate, + 'workflow_job_templates': WorkflowJobTemplate, + } + model = qs_models.get(self.kwargs['model_kwarg']) + if model is None: + raise PermissionDenied + + return model.objects.filter(webhook_service=self.service) + def get_object(self): - queryset = self.queryset.filter(webhook_service=self.service) + queryset = self.get_queryset() lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field filter_kwargs = {self.lookup_field: self.kwargs[lookup_url_kwarg]}