From 02eda72bd9432ef892390c26fc0a6a039bced9ec Mon Sep 17 00:00:00 2001 From: Chris Church Date: Tue, 31 Mar 2015 16:42:26 -0400 Subject: [PATCH] Add name field for ad hoc commands, get relaunch working. --- awx/api/serializers.py | 4 +++- awx/main/access.py | 9 +++++++++ awx/main/models/ad_hoc_commands.py | 20 +++++++++++++++----- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/awx/api/serializers.py b/awx/api/serializers.py index 63b7f51374..636833edab 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -1483,12 +1483,14 @@ class JobCancelSerializer(JobSerializer): class AdHocCommandSerializer(UnifiedJobSerializer): + name = serializers.CharField(source='name', read_only=True) + class Meta: model = AdHocCommand fields = ('*', 'job_type', 'inventory', 'limit', 'credential', 'module_name', 'module_args', 'forks', 'verbosity', 'privilege_escalation') - exclude = ('unified_job_template', 'name', 'description') + exclude = ('unified_job_template', 'description') def get_related(self, obj): res = super(AdHocCommandSerializer, self).get_related(obj) diff --git a/awx/main/access.py b/awx/main/access.py index 328a983c91..4f92d6a462 100644 --- a/awx/main/access.py +++ b/awx/main/access.py @@ -1232,6 +1232,15 @@ class AdHocCommandAccess(BaseAccess): def can_delete(self, obj): return False + def can_start(self, obj): + return self.can_add({ + 'credential': obj.credential_id, + 'inventory': obj.inventory_id, + }) + + def can_cancel(self, obj): + return self.can_read(obj) and obj.can_cancel + class AdHocCommandEventAccess(BaseAccess): ''' I can see ad hoc command event records whenever I can read both ad hoc diff --git a/awx/main/models/ad_hoc_commands.py b/awx/main/models/ad_hoc_commands.py index 8f81481793..27ccf7790f 100644 --- a/awx/main/models/ad_hoc_commands.py +++ b/awx/main/models/ad_hoc_commands.py @@ -10,6 +10,7 @@ import logging from django.conf import settings from django.db import models from django.db.models import Q +from django.utils.text import Truncator from django.utils.translation import ugettext_lazy as _ from django.core.exceptions import ValidationError from django.core.urlresolvers import reverse @@ -199,11 +200,20 @@ class AdHocCommand(UnifiedJob): return dependencies def copy(self): - raise NotImplementedError - presets = {} - for kw in self.job_template._get_unified_job_field_names(): - presets[kw] = getattr(self, kw) - return self.job_template.create_unified_job(**presets) + data = {} + for field in ('job_type', 'inventory_id', 'limit', 'credential_id', + 'module_name', 'module_args', 'forks', 'verbosity', + 'privilege_escalation'): + data[field] = getattr(self, field) + return AdHocCommand.objects.create(**data) + + def save(self, *args, **kwargs): + update_fields = kwargs.get('update_fields', []) + if not self.name: + self.name = Truncator(u'%s: %s' % (self.module_name, self.module_args)).chars(512) + if 'name' not in update_fields: + update_fields.append('name') + super(AdHocCommand, self).save(*args, **kwargs) class AdHocCommandEvent(CreatedModifiedModel):