From 319deffc180578cd21ccdcdd39aaf19dfb9350f1 Mon Sep 17 00:00:00 2001 From: Matthew Jones Date: Thu, 4 Feb 2016 11:31:34 -0500 Subject: [PATCH] Implement notification serializer and validations --- awx/api/metadata.py | 8 +++++++- awx/api/serializers.py | 15 +++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/awx/api/metadata.py b/awx/api/metadata.py index 46ea3f36da..b5e6d7043a 100644 --- a/awx/api/metadata.py +++ b/awx/api/metadata.py @@ -12,7 +12,7 @@ from rest_framework import serializers from rest_framework.request import clone_request # Ansible Tower -from awx.main.models import InventorySource +from awx.main.models import InventorySource, NotificationTemplate class Metadata(metadata.SimpleMetadata): @@ -55,6 +55,12 @@ class Metadata(metadata.SimpleMetadata): get_group_by_choices = getattr(InventorySource, 'get_%s_group_by_choices' % cp) field_info['%s_group_by_choices' % cp] = get_group_by_choices() + # Special handling of notification configuration where the required properties + # are conditional on the type selected. + if field.field_name == 'notification_configuration': + for (notification_type_name, notification_tr_name, notification_type_class) in NotificationTemplate.NOTIFICATION_TYPES: + field_info[notification_type_name] = notification_type_class.init_parameters + # Update type of fields returned... if field.field_name == 'type': field_info['type'] = 'multiple choice' diff --git a/awx/api/serializers.py b/awx/api/serializers.py index f655b35f4e..b513af2c68 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -2035,6 +2035,21 @@ class JobLaunchSerializer(BaseSerializer): attrs = super(JobLaunchSerializer, self).validate(attrs) return attrs +class NotificationTemplateSerializer(BaseSerializer): + + class Meta: + model = NotificationTemplate + fields = ('*', 'notification_type', 'notification_configuration') + + def validate(self, attrs): + notification_class = NotificationTemplate.CLASS_FOR_NOTIFICATION_TYPE[attrs['notification_type']] + missing_fields = [] + for field in notification_class.init_parameters: + if field not in attrs['notification_configuration']: + missing_fields.append(field) + if missing_fields: + raise serializers.ValidationError("Missing required fields for Notification Configuration: {}".format(missing_fields)) + return attrs class ScheduleSerializer(BaseSerializer):