diff --git a/awx/api/views.py b/awx/api/views.py index 2fe96494ab..60357cf347 100644 --- a/awx/api/views.py +++ b/awx/api/views.py @@ -3487,6 +3487,15 @@ class NotificationTemplateDetail(RetrieveUpdateDestroyAPIView): serializer_class = NotificationTemplateSerializer new_in_300 = True + def delete(self, request, *args, **kwargs): + obj = self.get_object() + if not request.user.can_access(self.model, 'delete', obj): + return Response(status=status.HTTP_404_NOT_FOUND) + if obj.notifications.filter(status='pending').exists(): + return Response({"error": "Delete not allowed while there are pending notifications"}, + status=status.HTTP_405_METHOD_NOT_ALLOWED) + return resp + class NotificationTemplateTest(GenericAPIView): view_name = 'NotificationTemplate Test' diff --git a/awx/main/tests/functional/test_notifications.py b/awx/main/tests/functional/test_notifications.py index c54e9fb3f2..babef90290 100644 --- a/awx/main/tests/functional/test_notifications.py +++ b/awx/main/tests/functional/test_notifications.py @@ -1,7 +1,7 @@ import mock import pytest -from awx.main.models.notifications import NotificationTemplate +from awx.main.models.notifications import NotificationTemplate, Notification from awx.main.models.inventory import Inventory, Group from awx.main.models.jobs import JobTemplate @@ -112,3 +112,13 @@ def test_notification_template_simple_patch(patch, notification_template, admin) @pytest.mark.django_db def test_notification_template_invalid_notification_type(patch, notification_template, admin): patch(reverse('api:notification_template_detail', args=(notification_template.id,)), { 'notification_type': 'invalid'}, admin, expect=400) + +@pytest.mark.django_db +def test_disallow_delete_when_notifications_pending(delete, user, notification_template): + u = user('superuser', True) + url = reverse('api:notification_template_detail', args=(notification_template.id,)) + n = Notification.objects.create(notification_template=notification_template, + status='pending') + response = delete(url, user=u) + assert response.status_code == 405 +