From 82e0b2121b27a4c261515f580d37811a957b7e65 Mon Sep 17 00:00:00 2001 From: beeankha Date: Wed, 10 Jul 2019 16:12:48 -0400 Subject: [PATCH] Add approve/deny endpoints, fix some typos --- awx/api/serializers.py | 12 ++++++++- awx/api/urls/workflow_approval.py | 6 +++-- awx/api/urls/workflow_approval_template.py | 8 +++--- awx/api/views/__init__.py | 29 ++++++++++++++++------ awx/main/access.py | 2 +- awx/main/models/workflow.py | 6 ++--- 6 files changed, 45 insertions(+), 18 deletions(-) diff --git a/awx/api/serializers.py b/awx/api/serializers.py index 15c5433a45..f526fcfdc7 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -3401,11 +3401,18 @@ class WorkflowJobCancelSerializer(WorkflowJobSerializer): fields = ('can_cancel',) +class WorkflowApprovalViewSerializer(UnifiedJobSerializer): + + class Meta: + model = WorkflowApproval + fields = [] + + class WorkflowApprovalSerializer(UnifiedJobSerializer): class Meta: model = WorkflowApproval - fields = ('*', '-controller_node', '-execution_node',) + fields = (['*', '-controller_node', '-execution_node',]) def get_related(self, obj): res = super(WorkflowApprovalSerializer, self).get_related(obj) @@ -3414,9 +3421,12 @@ class WorkflowApprovalSerializer(UnifiedJobSerializer): res['workflow_approval_template'] = self.reverse('api:workflow_approval_template_detail', kwargs={'pk': obj.workflow_approval_template.pk}) res['notifications'] = self.reverse('api:workflow_approval_notifications_list', kwargs={'pk': obj.pk}) + res['approve'] = self.reverse('api:workflow_approval_approve', kwargs={'pk': obj.pk}) + res['deny'] = self.reverse('api:workflow_approval_deny', kwargs={'pk': obj.pk}) return res + class WorkflowApprovalListSerializer(WorkflowApprovalSerializer, UnifiedJobListSerializer): class Meta: diff --git a/awx/api/urls/workflow_approval.py b/awx/api/urls/workflow_approval.py index b66fe751c7..682111b8da 100644 --- a/awx/api/urls/workflow_approval.py +++ b/awx/api/urls/workflow_approval.py @@ -6,6 +6,8 @@ from django.conf.urls import url from awx.api.views import ( WorkflowApprovalList, WorkflowApprovalDetail, + WorkflowApprovalApprove, + WorkflowApprovalDeny, WorkflowApprovalNotificationsList, ) @@ -13,8 +15,8 @@ from awx.api.views import ( urls = [ url(r'^$', WorkflowApprovalList.as_view(), name='workflow_approval_list'), url(r'^(?P[0-9]+)/$', WorkflowApprovalDetail.as_view(), name='workflow_approval_detail'), - url(r'^(?P[0-9]+)/approve/$', WorkflowApprovalDetail.as_view(), name='approved_workflow'), - url(r'^(?P[0-9]+)/reject/$', WorkflowApprovalDetail.as_view(), name='rejected_workflow'), + url(r'^(?P[0-9]+)/approve/$', WorkflowApprovalApprove.as_view(), name='workflow_approval_approve'), + url(r'^(?P[0-9]+)/deny/$', WorkflowApprovalDeny.as_view(), name='workflow_approval_deny'), url(r'^(?P[0-9]+)/notifications/$', WorkflowApprovalNotificationsList.as_view(), name='workflow_approval_notifications_list'), ] diff --git a/awx/api/urls/workflow_approval_template.py b/awx/api/urls/workflow_approval_template.py index e0955f0904..1d6345d01f 100644 --- a/awx/api/urls/workflow_approval_template.py +++ b/awx/api/urls/workflow_approval_template.py @@ -4,8 +4,8 @@ from django.conf.urls import url from awx.api.views import ( - WorfklowApprovalTemplateList, - WorfklowApprovalTemplateDetail, + WorkflowApprovalTemplateList, + WorkflowApprovalTemplateDetail, WorkflowApprovalTemplateJobsList, WorkflowApprovalTemplateNotificationTemplatesErrorList, WorkflowApprovalTemplateNotificationTemplatesStartedList, @@ -14,8 +14,8 @@ from awx.api.views import ( urls = [ - url(r'^$', WorfklowApprovalTemplateList.as_view(), name='workflow_approval_template_list'), - url(r'^(?P[0-9]+)/$', WorfklowApprovalTemplateDetail.as_view(), name='workflow_approval_template_detail'), + url(r'^$', WorkflowApprovalTemplateList.as_view(), name='workflow_approval_template_list'), + url(r'^(?P[0-9]+)/$', WorkflowApprovalTemplateDetail.as_view(), name='workflow_approval_template_detail'), url(r'^(?P[0-9]+)/approvals/$', WorkflowApprovalTemplateJobsList.as_view(), name='workflow_approval_template_jobs_list'), url(r'^(?P[0-9]+)/notification_templates_started/$', WorkflowApprovalTemplateNotificationTemplatesStartedList.as_view(), name='workflow_approval_template_notification_templates_started_list'), diff --git a/awx/api/views/__init__.py b/awx/api/views/__init__.py index 1a75177f9c..58fff401c1 100644 --- a/awx/api/views/__init__.py +++ b/awx/api/views/__init__.py @@ -4407,18 +4407,13 @@ for attr, value in list(locals().items()): setattr(this_module, name, view) -class WorfklowApprovalTemplateList(ListAPIView): +class WorkflowApprovalTemplateList(ListCreateAPIView): model = models.WorkflowApprovalTemplate serializer_class = serializers.WorkflowApprovalTemplateSerializer - def get(self, request, *args, **kwargs): - if not request.user.is_superuser and not request.user.is_system_auditor: - raise PermissionDenied(_("Superuser privileges needed.")) - return super(WorfklowApprovalTemplateList, self).get(request, *args, **kwargs) - -class WorfklowApprovalTemplateDetail(RetrieveAPIView): +class WorkflowApprovalTemplateDetail(RelatedJobsPreventDeleteMixin, RetrieveUpdateDestroyAPIView): model = models.WorkflowApprovalTemplate serializer_class = serializers.WorkflowApprovalTemplateSerializer @@ -4472,6 +4467,26 @@ class WorkflowApprovalDetail(UnifiedJobDeletionMixin, RetrieveDestroyAPIView): serializer_class = serializers.WorkflowApprovalSerializer +class WorkflowApprovalApprove(RetrieveAPIView): + model = models.WorkflowApproval + serializer_class = serializers.WorkflowApprovalViewSerializer + + def post(self, request, *args, **kwargs): + obj = self.get_object() + obj.approve() + return Response(status=status.HTTP_202_ACCEPTED) + + +class WorkflowApprovalDeny(RetrieveAPIView): + model = models.WorkflowApproval + serializer_class = serializers.WorkflowApprovalViewSerializer + + def post(self, request, *args, **kwargs): + obj = self.get_object() + obj.deny() + return Response(status=status.HTTP_202_ACCEPTED) + + class WorkflowApprovalNotificationsList(SubListAPIView): model = models.Notification diff --git a/awx/main/access.py b/awx/main/access.py index f732ae00c9..bcd9cd1dab 100644 --- a/awx/main/access.py +++ b/awx/main/access.py @@ -2812,7 +2812,7 @@ class WorkflowApprovalTemplateAccess(BaseAccess): return True def filtered_queryset(self): - return self.model.objects.all() + return self.model.filter(workflowjobtemplatenodes__workflow_job_template=WorkflowJobTemplate.accessible_pk_qs(self.user, 'read_role')) for cls in BaseAccess.__subclasses__(): diff --git a/awx/main/models/workflow.py b/awx/main/models/workflow.py index 3975b4dbf1..eabfcb9133 100644 --- a/awx/main/models/workflow.py +++ b/awx/main/models/workflow.py @@ -648,10 +648,10 @@ class WorkflowApproval(UnifiedJob): self.status = 'successful' self.save() schedule_task_manager() - return reverse('api:approved_workflow', kwargs={'pk': self.pk}, request=request) + return reverse('api:workflow_approval_approve', kwargs={'pk': self.pk}, request=request) - def reject(self, request=None): + def deny(self, request=None): self.status = 'failed' self.save() schedule_task_manager() - return reverse('api:rejected_workflow', kwargs={'pk': self.pk}, request=request) + return reverse('api:workflow_approval_deny', kwargs={'pk': self.pk}, request=request)