diff --git a/awx/ui/client/src/helpers/JobDetail.js b/awx/ui/client/src/helpers/JobDetail.js index 689e7139b5..0c6ea3359c 100644 --- a/awx/ui/client/src/helpers/JobDetail.js +++ b/awx/ui/client/src/helpers/JobDetail.js @@ -822,7 +822,6 @@ export default url += (scope.search_task_name) ? '&task__icontains=' + scope.search_task_name : ''; url += (scope.search_task_status === 'failed') ? '&failed=true' : ''; url += '&page_size=' + scope.tasksMaxRows + '&order=id'; - scope.plays.every(function(p, idx) { if (p.id === scope.selectedPlay) { play = scope.plays[idx]; @@ -931,7 +930,7 @@ export default }]) // Call when the selected task needs to change - .factory('SelectTask', ['LoadHosts', function(LoadHosts) { + .factory('SelectTask', ['LoadHosts', 'JobDetailService', function(LoadHosts, JobDetailService) { return function(params) { var scope = params.scope, id = params.id, @@ -946,11 +945,16 @@ export default scope.tasks[idx].taskActiveClass = ''; } }); - - LoadHosts({ - scope: scope, - callback: callback, - clear: true + // /api/v1/jobs/16/job_events/?parent=832&event__startswith=runner&page_size=200&order=host_name,counte + var params = { + parent: scope.selectedTask, + event__startswith: 'runner', + page_size: scope.hostResultsMaxRows, + order: 'host_name,counter', + }; + JobDetailService.getRelatedJobEvents(scope.job.id, params).success(function(res){ + scope.hostResults = JobDetailService.processHostResults(res.results) + scope.hostResultsLoading = false; }); }; }]) @@ -960,8 +964,7 @@ export default return function(params) { var scope = params.scope, callback = params.callback, - url; - + url; scope.hostResults = []; if (scope.selectedTask) { @@ -970,6 +973,7 @@ export default url += (scope.search_host_name) ? 'host__name__icontains=' + scope.search_host_name + '&' : ''; url += (scope.search_host_status === 'failed') ? 'failed=true&' : ''; url += 'event__startswith=runner&page_size=' + scope.hostResultsMaxRows + '&order=host_name,counter'; + console.log(url) scope.hostResultsLoading = true; Rest.setUrl(url); Rest.get() @@ -1020,7 +1024,6 @@ export default msg = event.event_data.res; } } - if (event.event !== "runner_on_no_hosts") { scope.hostResults.push({ id: event.id, @@ -1037,7 +1040,6 @@ export default }); scope.hostResultsLoading = false; - if (callback) { scope.$emit(callback); } diff --git a/awx/ui/client/src/job-detail/host-event/host-event-details.partial.html b/awx/ui/client/src/job-detail/host-event/host-event-details.partial.html index 66a60fcec9..f650b4335a 100644 --- a/awx/ui/client/src/job-detail/host-event/host-event-details.partial.html +++ b/awx/ui/client/src/job-detail/host-event/host-event-details.partial.html @@ -1,49 +1,49 @@
-
-
EVENT
- -
-
- HOST - - {{event.host_name || "No result found"}} -
-
- STATUS - - - - - {{event.status || "No result found"}} - -
-
- ID - {{event.id || "No result found"}} -
-
- CREATED - {{event.created || "No result found"}} -
-
- PLAY - {{event.play || "No result found"}} -
-
- TASK - {{event.task || "No result found"}} -
-
- MODULE - {{event.event_data.res.invocation.module_name || "No result found"}} -
+
+
EVENT
+ +
+
+ HOST + + {{event.host_name || "No result found"}} +
+
+ STATUS + + + + + {{processEventStatus(event).status || "No result found"}} + +
+
+ ID + {{event.id || "No result found"}} +
+
+ CREATED + {{event.created || "No result found"}} +
+
+ PLAY + {{event.play || "No result found"}} +
+
+ TASK + {{event.task || "No result found"}} +
+
+ MODULE + {{event.event_data.res.invocation.module_name || "No result found"}} +
-
RESULTS
- -
- {{key}} - {{value}} -
+
RESULTS
+ +
+ {{key}} + {{value}} +
diff --git a/awx/ui/client/src/job-detail/host-event/host-event-modal.partial.html b/awx/ui/client/src/job-detail/host-event/host-event-modal.partial.html index db106deb1b..1981b61a04 100644 --- a/awx/ui/client/src/job-detail/host-event/host-event-modal.partial.html +++ b/awx/ui/client/src/job-detail/host-event/host-event-modal.partial.html @@ -14,8 +14,7 @@ - - +
diff --git a/awx/ui/client/src/job-detail/host-event/host-event-stdout.partial.html b/awx/ui/client/src/job-detail/host-event/host-event-stdout.partial.html index 436c25262a..29f3966e86 100644 --- a/awx/ui/client/src/job-detail/host-event/host-event-stdout.partial.html +++ b/awx/ui/client/src/job-detail/host-event/host-event-stdout.partial.html @@ -1,13 +1,2 @@ -
-
-
STANDARD OUT
- -
- -
\ No newline at end of file + \ No newline at end of file diff --git a/awx/ui/client/src/job-detail/host-event/host-event.controller.js b/awx/ui/client/src/job-detail/host-event/host-event.controller.js index ac46279d0f..1c7284ae30 100644 --- a/awx/ui/client/src/job-detail/host-event/host-event.controller.js +++ b/awx/ui/client/src/job-detail/host-event/host-event.controller.js @@ -4,68 +4,78 @@ * All Rights Reserved *************************************************/ + export default - ['$stateParams', '$scope', '$state', 'Wait', 'JobDetailService', 'moment', 'event', - function($stateParams, $scope, $state, Wait, JobDetailService, moment, event){ - // Avoid rendering objects in the details fieldset - // ng-if="processResults(value)" via host-event-details.partial.html - $scope.processResults = function(value){ - if (typeof value == 'object'){return false} - else {return true} - }; + ['$stateParams', '$scope', '$state', 'Wait', 'JobDetailService', 'moment', 'event', + function($stateParams, $scope, $state, Wait, JobDetailService, moment, event){ - var codeMirror = function(){ - var el = $('#HostEvent-json')[0]; - var editor = CodeMirror.fromTextArea(el, { - lineNumbers: true, - mode: {name: "javascript", json: true} - }); - editor.getDoc().setValue(JSON.stringify($scope.json, null, 4)); - }; + $scope.processEventStatus = JobDetailService.processEventStatus; + // Avoid rendering objects in the details fieldset + // ng-if="processResults(value)" via host-event-details.partial.html + $scope.processResults = function(value){ + if (typeof value == 'object'){return false;} + else {return true;} + }; - $scope.getActiveHostIndex = function(){ - var result = $scope.hostResults.filter(function( obj ) { - return obj.id == $scope.event.id; - }); - return $scope.hostResults.indexOf(result[0]) - }; + var codeMirror = function(el, json){ + var el = $(el)[0]; + var editor = CodeMirror.fromTextArea(el, { + lineNumbers: true, + mode: {name: "javascript", json: true} + }); + editor.getDoc().setValue(JSON.stringify(json, null, 4)); + }; - $scope.showPrev = function(){ - return $scope.getActiveHostIndex() != 0 - }; + $scope.getActiveHostIndex = function(){ + var result = $scope.hostResults.filter(function( obj ) { + return obj.id == $scope.event.id; + }); + return $scope.hostResults.indexOf(result[0]); + }; - $scope.showNext = function(){ - return $scope.getActiveHostIndex() < $scope.hostResults.indexOf($scope.hostResults[$scope.hostResults.length - 1]) - }; + $scope.showPrev = function(){ + return $scope.getActiveHostIndex() != 0; + }; - $scope.goNext = function(){ - var index = $scope.getActiveHostIndex() + 1; - var id = $scope.hostResults[index].id; - $state.go('jobDetail.host-event.details', {eventId: id}) - }; + $scope.showNext = function(){ + return $scope.getActiveHostIndex() < $scope.hostResults.indexOf($scope.hostResults[$scope.hostResults.length - 1]); + }; - $scope.goPrev = function(){ - var index = $scope.getActiveHostIndex() - 1; - var id = $scope.hostResults[index].id; - $state.go('jobDetail.host-event.details', {eventId: id}) - }; + $scope.goNext = function(){ + var index = $scope.getActiveHostIndex() + 1; + var id = $scope.hostResults[index].id; + $state.go('jobDetail.host-event.details', {eventId: id}); + }; - var init = function(){ - $scope.event = event.data.results[0]; - $scope.event.created = moment($scope.event.created).format(); - $scope.processEventStatus = JobDetailService.processEventStatus($scope.event); - $scope.hostResults = $stateParams.hostResults; - $scope.json = JobDetailService.processJson($scope.event); - if ($state.current.name == 'jobDetail.host-event.json'){ - codeMirror(); - } - try { - $scope.stdout = $scope.event.event_data.res.stdout - } - catch(err){ - $scope.sdout = null; - } - $('#HostEvent').modal('show'); - }; - init(); - }]; \ No newline at end of file + $scope.goPrev = function(){ + var index = $scope.getActiveHostIndex() - 1; + var id = $scope.hostResults[index].id; + $state.go('jobDetail.host-event.details', {eventId: id}); + }; + + var init = function(){ + console.log(event) + $scope.event = event.data.results[0]; + $scope.event.created = moment($scope.event.created).format(); + $scope.hostResults = $stateParams.hostResults; + $scope.json = JobDetailService.processJson($scope.event); + if ($state.current.name == 'jobDetail.host-event.json'){ + codeMirror('#HostEvent-json', $scope.json); + } + try { + $scope.stdout = JobDetailService.processJson($scope.event.event_data.res) + console.log($scope.stdout) + if ($state.current.name == 'jobDetail.host-event.stdout'){ + codeMirror('#HostEvent-stdout', $scope.stdout); + } + } + catch(err){ + $scope.sdout = null; + } + console.log($scope) + + + $('#HostEvent').modal('show'); + }; + init(); + }]; \ No newline at end of file diff --git a/awx/ui/client/src/job-detail/host-events/host-events.partial.html b/awx/ui/client/src/job-detail/host-events/host-events.partial.html index 9d0ccca40f..7fb46f3234 100644 --- a/awx/ui/client/src/job-detail/host-events/host-events.partial.html +++ b/awx/ui/client/src/job-detail/host-events/host-events.partial.html @@ -36,9 +36,9 @@ - + - {{event.status}} + {{processEventStatus(event).status}} {{event.play}} {{event.task}} diff --git a/awx/ui/client/src/job-detail/job-detail.controller.js b/awx/ui/client/src/job-detail/job-detail.controller.js index d06fa5881f..91264dd1b4 100644 --- a/awx/ui/client/src/job-detail/job-detail.controller.js +++ b/awx/ui/client/src/job-detail/job-detail.controller.js @@ -16,7 +16,7 @@ export default 'ProcessErrors', 'SelectPlay', 'SelectTask', 'Socket', 'GetElapsed', 'DrawGraph', 'LoadHostSummary', 'ReloadHostSummaryList', 'JobIsFinished', 'SetTaskStyles', 'DigestEvent', 'UpdateDOM', 'DeleteJob', 'PlaybookRun', - 'LoadPlays', 'LoadTasks', 'LoadHosts', 'HostsEdit', + 'LoadPlays', 'LoadTasks', 'HostsEdit', 'ParseVariableString', 'GetChoices', 'fieldChoices', 'fieldLabels', 'EditSchedule', 'ParseTypeChange', 'JobDetailService', function( @@ -25,7 +25,7 @@ export default SelectPlay, SelectTask, Socket, GetElapsed, DrawGraph, LoadHostSummary, ReloadHostSummaryList, JobIsFinished, SetTaskStyles, DigestEvent, UpdateDOM, DeleteJob, - PlaybookRun, LoadPlays, LoadTasks, LoadHosts, + PlaybookRun, LoadPlays, LoadTasks, HostsEdit, ParseVariableString, GetChoices, fieldChoices, fieldLabels, EditSchedule, ParseTypeChange, JobDetailService ) { @@ -376,64 +376,26 @@ export default var params = { parent: task.id, event__startswith: 'runner', - page_size: scope.hostResultsMaxRows }; JobDetailService.getRelatedJobEvents(scope.job.id, params) .success(function(data) { + console.log(data) var idx, event, status, status_text, item, msg; - if (data.results.length > 0) { + if (data.results.length > 0) {$ lastEventId = data.results[0].id; } scope.next_host_results = data.next; for (idx=data.results.length - 1; idx >= 0; idx--) { event = data.results[idx]; - if (event.event === "runner_on_skipped") { - status = 'skipped'; - } - else if (event.event === "runner_on_unreachable") { - status = 'unreachable'; - } - else { - status = (event.failed) ? 'failed' : (event.changed) ? 'changed' : 'successful'; - } - switch(status) { - case "successful": - status_text = 'OK'; - break; - case "changed": - status_text = "Changed"; - break; - case "failed": - status_text = "Failed"; - break; - case "unreachable": - status_text = "Unreachable"; - break; - case "skipped": - status_text = "Skipped"; - } + event.status = JobDetailService.processEventStatus(event).status; + msg = JobDetailService.processEventMsg(event); + item = JobDetailService.processEventItem(event); - if (event.event_data && event.event_data.res) { - item = event.event_data.res.item; - if (typeof item === "object") { - item = JSON.stringify(item); - } - } - - msg = ''; - if (event.event_data && event.event_data.res) { - if (typeof event.event_data.res === 'object') { - msg = event.event_data.res.msg; - } else { - msg = event.event_data.res; - } - } - - if (event.event !== "runner_on_no_hosts") { + if (event.event !== "runner_on$_no_hosts") { task.hostResults[event.id] = { id: event.id, - status: status, - status_text: status_text, + status: event.status, + status_text: event.status.toUpperCase(), host_id: event.host, task_id: event.parent, name: event.event_data.host, @@ -673,7 +635,7 @@ export default scope.$emit('LoadTasks', events_url); }); }); - + if (scope.removeLoadJob) { scope.removeLoadJob(); @@ -1037,6 +999,16 @@ export default scope.searchTasksEnabled = true; } if (!scope.liveEventProcessing || scope.pauseLiveEvents) { + // /api/v1/jobs/15/job_tasks/?event_id=762&task__icontains=create&page_size=200&order=id + var params = { + event_id: scope.selectedPlay, + task__icontains: scope.search_task_name, + page_size: scope.tasksMaxRows, + + }; + if (scope.search_task_status === 'failed'){ + params.failed = true; + } LoadTasks({ scope: scope }); @@ -1058,8 +1030,20 @@ export default scope.searchHostsEnabled = true; } if (!scope.liveEventProcessing || scope.pauseLiveEvents) { - LoadHosts({ - scope: scope + scope.hostResultsLoading = true; + var params = { + parent: scope.selectedTask, + event__startswith: 'runner', + page_size: scope.hostResultsMaxRows, + order: 'host_name,counter', + host_name__icontains: scope.search_host_name + } + if (scope.search_host_status === 'failed'){ + params.failed = true; + } + JobDetailService.getRelatedJobEvents(scope.job.id, params).success(function(res){ + scope.hostResults = JobDetailService.processHostResults(res.results) + scope.hostResultsLoading = false; }); } }; @@ -1104,8 +1088,20 @@ export default scope.filterHostStatus = function() { scope.search_host_status = (scope.search_host_status === 'all') ? 'failed' : 'all'; if (!scope.liveEventProcessing || scope.pauseLiveEvents) { - LoadHosts({ - scope: scope + console.log('filterHostStattus', scope) + var params = { + parent: scope.selectedTask, + event__startswith: 'runner', + page_size: scope.hostResultsMaxRows, + order: 'host_name,counter' + } + if (scope.search_host_status === 'failed'){ + params.failed = true; + } + scope.hostResultsLoading = true; + JobDetailService.getRelatedJobEvents(scope.job.id, params).success(function(res){ + scope.hostResults = JobDetailService.processHostResults(res.results) + scope.hostResultsLoading = false; }); } }; diff --git a/awx/ui/client/src/job-detail/job-detail.service.js b/awx/ui/client/src/job-detail/job-detail.service.js index 381ff56c18..2beecdc215 100644 --- a/awx/ui/client/src/job-detail/job-detail.service.js +++ b/awx/ui/client/src/job-detail/job-detail.service.js @@ -1,18 +1,17 @@ export default - ['$rootScope', 'Rest', 'GetBasePath', 'ProcessErrors', function($rootScope, Rest, GetBasePath, ProcessErrors){ - return { + ['$rootScope', 'Rest', 'GetBasePath', 'ProcessErrors', function($rootScope, Rest, GetBasePath, ProcessErrors){ + return { - /* - For ES6 - it might be useful to set some default params here, e.g. - getJobHostSummaries: function(id, page_size=200, order='host_name'){} - without ES6, we'd have to supply defaults like this: - this.page_size = params.page_size ? params.page_size : 200; - */ + /* + * For ES6 + * it might be useful to set some default params here, e.g. + * getJobHostSummaries: function(id, page_size=200, order='host_name'){} + * without ES6, we'd have to supply defaults like this: + * this.page_size = params.page_size ? params.page_size : 200; + */ // the the API passes through Ansible's event_data response // we need to massage away the verbose and redundant properties - processJson: function(data){ // a deep copy var result = $.extend(true, {}, data); @@ -44,147 +43,195 @@ export default } }); } - catch(err){result.event_data = null;} + catch(err){result.event_data = undefined;} return result }, - + // Return Ansible's passed-through response msg on a job_event + processEventMsg: function(event){ + return typeof event.event_data.res === 'object' ? event.event_data.res.msg : event.event_data.res; + }, + // Return only Ansible's passed-through response item on a job_event + processEventItem: function(event){ + try{ + var item = event.event_data.res.item; + return typeof item === 'object' ? JSON.stringify(item) : item + } + catch(err){return;} + }, + // Generate a helper class for job_event statuses + // the stack for which status to display is + // unreachable > failed > changed > ok + // uses the API's runner events and convenience properties .failed .changed to determine status. + // see: job_event_callback.py processEventStatus: function(event){ - // Generate a helper class for job_event statuses - // the stack for which status to display is - // unreachable > failed > changed > ok - // uses the API's runner events and convenience properties .failed .changed to determine status. - // see: job_event_callback.py if (event.event == 'runner_on_unreachable'){ - event.status = 'Unreachable'; - return 'HostEvents-status--unreachable' + return { + class: 'HostEvents-status--unreachable', + status: 'unreachable' + } } // equiv to 'runner_on_error' && 'runner on failed' if (event.failed){ - event.status = 'Failed'; - return 'HostEvents-status--failed' + return { + class: 'HostEvents-status--failed', + status: 'failed' + } } // catch the changed case before ok, because both can be true if (event.changed){ - event.status = 'Changed'; - return 'HostEvents-status--changed' + return { + class: 'HostEvents-status--changed', + status: 'changed' + } } if (event.event == 'runner_on_ok'){ - event.status = 'OK'; - return 'HostEvents-status--ok' + return { + class: 'HostEvents-status--ok', + status: 'ok' + } } if (event.event == 'runner_on_skipped'){ - event.status = 'Skipped'; - return 'HostEvents-status--skipped' + return { + class: 'HostEvents-status--skipped', + status: 'skipped' + } } else{ // study a case where none of these apply } - }, + }, - // GET events related to a job run - // e.g. - // ?event=playbook_on_stats - // ?parent=206&event__startswith=runner&page_size=200&order=host_name,counter - getRelatedJobEvents: function(id, params){ - var url = GetBasePath('jobs'); - url = url + id + '/job_events/?'; - Object.keys(params).forEach(function(key, index) { - // the API is tolerant of extra ampersands - // ?&event=playbook_on_start == ?event=playbook_on_stats - url = url + '&' + key + '=' + params[key]; - }); - Rest.setUrl(url); - return Rest.get() - .success(function(data){ - return data - }) - .error(function(data, status) { - ProcessErrors($rootScope, data, status, null, { hdr: 'Error!', - msg: 'Call to ' + url + '. GET returned: ' + status }); - }); - }, - // GET job host summaries related to a job run - // e.g. ?page_size=200&order=host_name - getJobHostSummaries: function(id, params){ - var url = GetBasePath('jobs'); - url = url + id + '/job_host_summaries/?' - Object.keys(params).forEach(function(key, index) { - // the API is tolerant of extra ampersands - url = url + '&' + key + '=' + params[key]; - }); - Rest.setUrl(url); - return Rest.get() - .success(function(data){ - return data - }) - .error(function(data, status) { - ProcessErrors($rootScope, data, status, null, { hdr: 'Error!', - msg: 'Call to ' + url + '. GET returned: ' + status }); - }); - }, - // GET job plays related to a job run - // e.g. ?page_size=200 - getJobPlays: function(id, params){ - var url = GetBasePath('jobs'); - url = url + id + '/job_plays/?'; - Object.keys(params).forEach(function(key, index) { - // the API is tolerant of extra ampersands - url = url + '&' + key + '=' + params[key]; - }); - Rest.setUrl(url); - return Rest.get() - .success(function(data){ - return data - }) - .error(function(data, status) { - ProcessErrors($rootScope, data, status, null, { hdr: 'Error!', - msg: 'Call to ' + url + '. GET returned: ' + status }); - }); - }, - getJobTasks: function(id, params){ - var url = GetBasePath('jobs'); - url = url + id + '/job_tasks/?'; - Object.keys(params).forEach(function(key, index) { - // the API is tolerant of extra ampersands - url = url + '&' + key + '=' + params[key]; - }); - Rest.setUrl(url); - return Rest.get() - .success(function(data){ - return data - }) - .error(function(data, status) { - ProcessErrors($rootScope, data, status, null, { hdr: 'Error!', - msg: 'Call to ' + url + '. GET returned: ' + status }); - }); - }, - getJob: function(id){ - var url = GetBasePath('jobs'); - url = url + id; - Rest.setUrl(url); - return Rest.get() - .success(function(data){ - return data - }) - .error(function(data, status) { - ProcessErrors($rootScope, data, status, null, { hdr: 'Error!', - msg: 'Call to ' + url + '. GET returned: ' + status }); - }); - }, - // GET next set of paginated results - // expects 'next' param returned by the API e.g. - // "/api/v1/jobs/51/job_plays/?order_by=id&page=2&page_size=1" - getNextPage: function(url){ - return Rest.get() - .success(function(data){ - return data - }) - .error(function(data, status) { - ProcessErrors($rootScope, data, status, null, { hdr: 'Error!', - msg: 'Call to ' + url + '. GET returned: ' + status }); - }); - } - } - } - ]; \ No newline at end of file + // Consumes a response from this.getRelatedJobEvents + // returns an array for view logic to iterate over to build host result rows + processHostResults: function(data){ + var self = this; + var results = []; + data.forEach(function(element, index, array){ + var event = element; + if (event.event !== 'runner_on_no_hosts'){ + var status = self.processEventStatus(event); + var msg = self.processEventMsg(event); + var item = self.processEventItem(event); + results.push({ + id: event.id, + status: status.status, + status_text: status.status.charAt(0).toUpperCase() + status.status.slice(1), + host_id: event.host, + task_id: event.parent, + name: event.event_data.host, + created: event.created, + msg: typeof msg === 'undefined' ? undefined : msg, + item: typeof item === 'undefined' ? undefined : item + }); + } + }); + return results; + }, + + // GET events related to a job run + // e.g. + // ?event=playbook_on_stats + // ?parent=206&event__startswith=runner&page_size=200&order=host_name,counter + getRelatedJobEvents: function(id, params){ + var url = GetBasePath('jobs'); + url = url + id + '/job_events/?'; + Object.keys(params).forEach(function(key, index) { + // the API is tolerant of extra ampersands + // ?&event=playbook_on_start == ?event=playbook_on_stats + url = url + '&' + key + '=' + params[key]; + }); + Rest.setUrl(url); + return Rest.get() + .success(function(data){ + return data + }) + .error(function(data, status) { + ProcessErrors($rootScope, data, status, null, { hdr: 'Error!', + msg: 'Call to ' + url + '. GET returned: ' + status }); + }); + }, + // GET job host summaries related to a job run + // e.g. ?page_size=200&order=host_name + getJobHostSummaries: function(id, params){ + var url = GetBasePath('jobs'); + url = url + id + '/job_host_summaries/?' + Object.keys(params).forEach(function(key, index) { + // the API is tolerant of extra ampersands + url = url + '&' + key + '=' + params[key]; + }); + Rest.setUrl(url); + return Rest.get() + .success(function(data){ + return data + }) + .error(function(data, status) { + ProcessErrors($rootScope, data, status, null, { hdr: 'Error!', + msg: 'Call to ' + url + '. GET returned: ' + status }); + }); + }, + // GET job plays related to a job run + // e.g. ?page_size=200 + getJobPlays: function(id, params){ + var url = GetBasePath('jobs'); + url = url + id + '/job_plays/?'; + Object.keys(params).forEach(function(key, index) { + // the API is tolerant of extra ampersands + url = url + '&' + key + '=' + params[key]; + }); + Rest.setUrl(url); + return Rest.get() + .success(function(data){ + return data + }) + .error(function(data, status) { + ProcessErrors($rootScope, data, status, null, { hdr: 'Error!', + msg: 'Call to ' + url + '. GET returned: ' + status }); + }); + }, + getJobTasks: function(id, params){ + var url = GetBasePath('jobs'); + url = url + id + '/job_tasks/?'; + Object.keys(params).forEach(function(key, index) { + // the API is tolerant of extra ampersands + url = url + '&' + key + '=' + params[key]; + }); + Rest.setUrl(url); + return Rest.get() + .success(function(data){ + return data + }) + .error(function(data, status) { + ProcessErrors($rootScope, data, status, null, { hdr: 'Error!', + msg: 'Call to ' + url + '. GET returned: ' + status }); + }); + }, + getJob: function(id){ + var url = GetBasePath('jobs'); + url = url + id; + Rest.setUrl(url); + return Rest.get() + .success(function(data){ + return data + }) + .error(function(data, status) { + ProcessErrors($rootScope, data, status, null, { hdr: 'Error!', + msg: 'Call to ' + url + '. GET returned: ' + status }); + }); + }, + // GET next set of paginated results + // expects 'next' param returned by the API e.g. + // "/api/v1/jobs/51/job_plays/?order_by=id&page=2&page_size=1" + getNextPage: function(url){ + return Rest.get() + .success(function(data){ + return data + }) + .error(function(data, status) { + ProcessErrors($rootScope, data, status, null, { hdr: 'Error!', + msg: 'Call to ' + url + '. GET returned: ' + status }); + }); + } + } + } + ]; \ No newline at end of file