diff --git a/awx/api/serializers.py b/awx/api/serializers.py index 14d8944dc1..3199cdec84 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -140,6 +140,7 @@ SUMMARIZABLE_FK_FIELDS = { 'source_credential': DEFAULT_SUMMARY_FIELDS + ('kind', 'cloud', 'credential_type_id'), 'target_credential': DEFAULT_SUMMARY_FIELDS + ('kind', 'cloud', 'credential_type_id'), 'webhook_credential': DEFAULT_SUMMARY_FIELDS, + 'approved_or_denied_by': ('id', 'username', 'first_name', 'last_name'), } @@ -3501,6 +3502,8 @@ class WorkflowApprovalSerializer(UnifiedJobSerializer): kwargs={'pk': obj.workflow_approval_template.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}) + if obj.approved_or_denied_by: + res['approved_or_denied_by'] = self.reverse('api:user_detail', kwargs={'pk': obj.approved_or_denied_by.pk}) return res diff --git a/awx/main/migrations/0097_v360_workflowapproval_approved_or_denied_by.py b/awx/main/migrations/0097_v360_workflowapproval_approved_or_denied_by.py new file mode 100644 index 0000000000..84bf80c7f6 --- /dev/null +++ b/awx/main/migrations/0097_v360_workflowapproval_approved_or_denied_by.py @@ -0,0 +1,21 @@ +# Generated by Django 2.2.4 on 2019-10-11 15:40 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('main', '0096_v360_container_groups'), + ] + + operations = [ + migrations.AddField( + model_name='workflowapproval', + name='approved_or_denied_by', + field=models.ForeignKey(default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="{'class': 'workflowapproval', 'model_name': 'workflowapproval', 'app_label': 'main'}(class)s_approved+", to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/awx/main/models/workflow.py b/awx/main/models/workflow.py index 56f5cfd579..bcfee585b8 100644 --- a/awx/main/models/workflow.py +++ b/awx/main/models/workflow.py @@ -13,6 +13,9 @@ from django.utils.translation import ugettext_lazy as _ from django.core.exceptions import ObjectDoesNotExist #from django import settings as tower_settings +# Django-CRUM +from crum import get_current_user + # AWX from awx.api.versioning import reverse from awx.main.models import (prevent_search, accepts_json, UnifiedJobTemplate, @@ -690,6 +693,14 @@ class WorkflowApproval(UnifiedJob, JobNotificationMixin): default=False, help_text=_("Shows when an approval node (with a timeout assigned to it) has timed out.") ) + approved_or_denied_by = models.ForeignKey( + 'auth.User', + related_name='%s(class)s_approved+', + default=None, + null=True, + editable=False, + on_delete=models.SET_NULL, + ) @classmethod @@ -711,6 +722,7 @@ class WorkflowApproval(UnifiedJob, JobNotificationMixin): def approve(self, request=None): self.status = 'successful' + self.approved_or_denied_by = get_current_user() self.save() self.send_approval_notification('approved') self.websocket_emit_status(self.status) @@ -719,6 +731,7 @@ class WorkflowApproval(UnifiedJob, JobNotificationMixin): def deny(self, request=None): self.status = 'failed' + self.approved_or_denied_by = get_current_user() self.save() self.send_approval_notification('denied') self.websocket_emit_status(self.status)