From ea36e301903c553dc67f8cad1dd3da75215fc411 Mon Sep 17 00:00:00 2001 From: Matthew Jones Date: Tue, 7 Oct 2014 16:34:10 -0400 Subject: [PATCH] Cancel any running or pending actions when one of the unified job types is deleted/marked inactive --- awx/api/views.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/awx/api/views.py b/awx/api/views.py index 09e205edf0..1319d23672 100644 --- a/awx/api/views.py +++ b/awx/api/views.py @@ -570,6 +570,15 @@ class ProjectDetail(RetrieveUpdateDestroyAPIView): model = Project serializer_class = ProjectSerializer + def destroy(self, request, *args, **kwargs): + obj = Project.objects.get(pk=kwargs['pk']) + can_delete = request.user.can_access(Project, 'delete', obj) + if not can_delete: + raise PermissionDenied("Cannot delete project") + for pu in obj.project_updates.filter(status__in=['pending', 'waiting', 'running']): + pu.cancel() + return super(ProjectDetail, self).destroy(request, *args, **kwargs) + class ProjectPlaybooks(RetrieveAPIView): model = Project @@ -1244,6 +1253,15 @@ class InventorySourceDetail(RetrieveUpdateAPIView): serializer_class = InventorySourceSerializer new_in_14 = True + def destroy(self, request, *args, **kwargs): + obj = InventorySource.objects.get(pk=kwargs['pk']) + can_delete = request.user.can_access(InventorySource, 'delete', obj) + if not can_delete: + raise PermissionDenied("Cannot delete inventory source") + for pu in obj.inventory_updates.filter(status__in=['pending', 'waiting', 'running']): + pu.cancel() + return super(InventorySourceDetail, self).destroy(request, *args, **kwargs) + class InventorySourceSchedulesList(SubListCreateAPIView): view_name = "Inventory Source Schedules" @@ -1349,6 +1367,16 @@ class JobTemplateDetail(RetrieveUpdateDestroyAPIView): model = JobTemplate serializer_class = JobTemplateSerializer + def destroy(self, request, *args, **kwargs): + obj = JobTemplate.objects.get(pk=kwargs['pk']) + can_delete = request.user.can_access(JobTemplate, 'delete', obj) + if not can_delete: + raise PermissionDenied("Cannot delete job template") + for pu in obj.jobs.filter(status__in=['pending', 'waiting', 'running']): + pu.cancel() + return super(JobTemplateDetail, self).destroy(request, *args, **kwargs) + + class JobTemplateLaunch(GenericAPIView): model = JobTemplate