From 41d7bd84a8894de060cb25b31d46fa18e64c208f Mon Sep 17 00:00:00 2001 From: AlanCoding Date: Mon, 17 Oct 2016 17:38:42 -0400 Subject: [PATCH] implement labels for workflows JT and workflow jobs --- awx/api/serializers.py | 26 +++++++++++++++----------- awx/api/urls.py | 2 ++ awx/api/views.py | 8 ++++++++ awx/main/access.py | 2 ++ awx/main/models/workflow.py | 3 +-- 5 files changed, 28 insertions(+), 13 deletions(-) diff --git a/awx/api/serializers.py b/awx/api/serializers.py index ded5d454c3..7be39a054d 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -1783,7 +1783,17 @@ class OrganizationCredentialSerializerCreate(CredentialSerializerCreate): fields = ('*', '-user', '-team') -class JobOptionsSerializer(BaseSerializer): +class LabelsListMixin(object): + + def _summary_field_labels(self, obj): + return {'count': obj.labels.count(), 'results': [{'id': x.id, 'name': x.name} for x in obj.labels.all().order_by('name')[:10]]} + + def get_summary_fields(self, obj): + res = super(LabelsListMixin, self).get_summary_fields(obj) + res['labels'] = self._summary_field_labels(obj) + return res + +class JobOptionsSerializer(LabelsListMixin, BaseSerializer): class Meta: fields = ('*', 'job_type', 'inventory', 'project', 'playbook', @@ -1808,14 +1818,6 @@ class JobOptionsSerializer(BaseSerializer): args=(obj.network_credential.pk,)) return res - def _summary_field_labels(self, obj): - return {'count': obj.labels.count(), 'results': [{'id': x.id, 'name': x.name} for x in obj.labels.all().order_by('name')[:10]]} - - def get_summary_fields(self, obj): - res = super(JobOptionsSerializer, self).get_summary_fields(obj) - res['labels'] = self._summary_field_labels(obj) - return res - def to_representation(self, obj): ret = super(JobOptionsSerializer, self).to_representation(obj) if obj is None: @@ -2178,7 +2180,7 @@ class SystemJobCancelSerializer(SystemJobSerializer): class Meta: fields = ('can_cancel',) -class WorkflowJobTemplateSerializer(UnifiedJobTemplateSerializer): +class WorkflowJobTemplateSerializer(LabelsListMixin, UnifiedJobTemplateSerializer): show_capabilities = ['start', 'edit', 'delete'] class Meta: @@ -2192,6 +2194,7 @@ class WorkflowJobTemplateSerializer(UnifiedJobTemplateSerializer): #schedules = reverse('api:workflow_job_template_schedules_list', args=(obj.pk,)), launch = reverse('api:workflow_job_template_launch', args=(obj.pk,)), workflow_nodes = reverse('api:workflow_job_template_workflow_nodes_list', args=(obj.pk,)), + labels = reverse('api:workflow_job_template_label_list', args=(obj.pk,)), # TODO: Implement notifications #notification_templates_any = reverse('api:system_job_template_notification_templates_any_list', args=(obj.pk,)), #notification_templates_success = reverse('api:system_job_template_notification_templates_success_list', args=(obj.pk,)), @@ -2208,7 +2211,7 @@ class WorkflowJobTemplateListSerializer(WorkflowJobTemplateSerializer): pass # TODO: -class WorkflowJobSerializer(UnifiedJobSerializer): +class WorkflowJobSerializer(LabelsListMixin, UnifiedJobSerializer): class Meta: model = WorkflowJob @@ -2222,6 +2225,7 @@ class WorkflowJobSerializer(UnifiedJobSerializer): # TODO: #res['notifications'] = reverse('api:system_job_notifications_list', args=(obj.pk,)) res['workflow_nodes'] = reverse('api:workflow_job_workflow_nodes_list', args=(obj.pk,)) + res['labels'] = reverse('api:workflow_job_label_list', args=(obj.pk,)) # TODO: Cancel job ''' if obj.can_cancel or True: diff --git a/awx/api/urls.py b/awx/api/urls.py index f5add3329c..2e1ad4afad 100644 --- a/awx/api/urls.py +++ b/awx/api/urls.py @@ -263,6 +263,7 @@ workflow_job_template_urls = patterns('awx.api.views', url(r'^(?P[0-9]+)/jobs/$', 'workflow_job_template_jobs_list'), url(r'^(?P[0-9]+)/launch/$', 'workflow_job_template_launch'), url(r'^(?P[0-9]+)/workflow_nodes/$', 'workflow_job_template_workflow_nodes_list'), + url(r'^(?P[0-9]+)/labels/$', 'workflow_job_template_label_list'), # url(r'^(?P[0-9]+)/cancel/$', 'workflow_job_template_cancel'), ) @@ -270,6 +271,7 @@ workflow_job_urls = patterns('awx.api.views', url(r'^$', 'workflow_job_list'), url(r'^(?P[0-9]+)/$', 'workflow_job_detail'), url(r'^(?P[0-9]+)/workflow_nodes/$', 'workflow_job_workflow_nodes_list'), + url(r'^(?P[0-9]+)/labels/$', 'workflow_job_label_list'), # url(r'^(?P[0-9]+)/cancel/$', 'workflow_job_cancel'), #url(r'^(?P[0-9]+)/notifications/$', 'workflow_job_notifications_list'), ) diff --git a/awx/api/views.py b/awx/api/views.py index 1343b34d3b..8195137aeb 100644 --- a/awx/api/views.py +++ b/awx/api/views.py @@ -2726,6 +2726,11 @@ class WorkflowJobTemplateDetail(RetrieveUpdateDestroyAPIView): serializer_class = WorkflowJobTemplateSerializer always_allow_superuser = False + +class WorkflowJobTemplateLabelList(JobTemplateLabelList): + parent_model = WorkflowJobTemplate + + # TODO: class WorkflowJobTemplateLaunch(GenericAPIView): @@ -2883,6 +2888,9 @@ class JobLabelList(SubListAPIView): relationship = 'labels' parent_key = 'job' +class WorkflowJobLabelList(JobLabelList): + parent_model = WorkflowJob + class JobActivityStreamList(SubListAPIView): model = ActivityStream diff --git a/awx/main/access.py b/awx/main/access.py index 421e0e73ab..e805c32ac5 100644 --- a/awx/main/access.py +++ b/awx/main/access.py @@ -1474,6 +1474,8 @@ class WorkflowJobTemplateAccess(BaseAccess): if self.user.is_superuser: return True + if data is None: + return self.user in obj.admin_role org_pk = get_pk_from_dict(data, 'organization') if ('organization' not in data or diff --git a/awx/main/models/workflow.py b/awx/main/models/workflow.py index b444cdb4ab..2848b38a4a 100644 --- a/awx/main/models/workflow.py +++ b/awx/main/models/workflow.py @@ -275,8 +275,7 @@ class WorkflowJobTemplate(UnifiedJobTemplate, WorkflowJobOptions, ResourceMixin) @classmethod def _get_unified_job_field_names(cls): - # TODO: ADD LABELS - return ['name', 'description', 'extra_vars',] + return ['name', 'description', 'extra_vars', 'labels',] def get_absolute_url(self): return reverse('api:workflow_job_template_detail', args=(self.pk,))