From ec6568f9b772b31b16226ceb902eebe805004173 Mon Sep 17 00:00:00 2001 From: Shea Levy Date: Thu, 24 Oct 2013 13:00:41 -0400 Subject: [PATCH] Fix jobset input handling in the API Signed-off-by: Shea Levy --- src/lib/Hydra/Controller/Jobset.pm | 14 ++++++-------- src/root/edit-jobset.tt | 30 +++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/src/lib/Hydra/Controller/Jobset.pm b/src/lib/Hydra/Controller/Jobset.pm index d1761ca0..8f211eaa 100644 --- a/src/lib/Hydra/Controller/Jobset.pm +++ b/src/lib/Hydra/Controller/Jobset.pm @@ -218,13 +218,11 @@ sub updateJobset { # Set the inputs of this jobset. $jobset->jobsetinputs->delete; - foreach my $param (keys %{$c->stash->{params}}) { - next unless $param =~ /^input-(\w+)-name$/; - my $baseName = $1; - next if $baseName eq "template"; - my $name = $c->stash->{params}->{$param}; - my $type = $c->stash->{params}->{"input-$baseName-type"}; - my $values = $c->stash->{params}->{"input-$baseName-values"}; + foreach my $name (keys %{$c->stash->{params}->{inputs}}) { + my $inputData = $c->stash->{params}->{inputs}->{$name}; + my $type = $inputData->{type}; + my $values = $inputData->{values}; + my $emailresponsible = defined $inputData->{emailresponsible} ? 1 : 0; error($c, "Invalid input name ‘$name’.") unless $name =~ /^[[:alpha:]][\w-]*$/; error($c, "Invalid input type ‘$type’.") unless defined $c->stash->{inputTypes}->{$type}; @@ -232,7 +230,7 @@ sub updateJobset { my $input = $jobset->jobsetinputs->create({ name => $name, type => $type, - emailresponsible => defined $c->stash->{params}->{"input-$baseName-emailresponsible"} ? 1 : 0 + emailresponsible => $emailresponsible }); # Set the values for this input. diff --git a/src/root/edit-jobset.tt b/src/root/edit-jobset.tt index 765865ae..87c93bb8 100644 --- a/src/root/edit-jobset.tt +++ b/src/root/edit-jobset.tt @@ -178,13 +178,41 @@ }); $("#submit-jobset").click(function() { + var formElements = $(this).parents("form").serializeArray(); + var data = { 'inputs': {} }; + var inputs = {}; + for (var i = 0; i < formElements.length; i++) { + var elem = formElements[i]; + var match = elem.name.match(/^input-(\w+)-(\w+)$/); + if (match === null) { + data[elem.name] = elem.value; + } else { + var baseName = match[1]; + var param = match[2]; + + if (baseName === "template") { + continue; + } + + if (!(baseName in inputs)) { + inputs[baseName] = {}; + } + + if (param === "name") { + data.inputs[elem.value] = inputs[baseName]; + } else { + inputs[baseName][param] = elem.value; + } + } + } redirectJSON({ [% IF create || clone %] url: "[% c.uri_for('/jobset' project.name '.new') %]", [% ELSE %] url: "[% c.uri_for('/jobset' project.name jobset.name) %]", [% END %] - data: $(this).parents("form").serialize(), + data: JSON.stringify(data), + contentType: 'application/json', type: 'PUT' }); return false;