diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/mom.py b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/mom.py index 70c414eeb3a8ff3129a4443730ac6db632f3333c..328c24e9904319c7cf80861197359733f066d88b 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/mom.py +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/mom.py @@ -69,6 +69,7 @@ def updateTaskMomDetails(task, momrpc): t['mom_object_group_id'] = m['object_group_id'] t['mom_object_group_name'] = m.get('object_group_name') t['mom_object_group_mom2object_id'] = m.get('object_group_mom2objectid') + t['mom_object_parent_group_id'] = m['parent_group_mom2id'] else: t['project_name'] = 'OTDB Only' t['project_mom_id'] = -98 diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/datacontroller.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/datacontroller.js index 9011f4b027a8295aed79842adac5b9582ec2c966..51441b873305b41c671c3e85b3a32df7e82b2133 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/datacontroller.js +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/datacontroller.js @@ -439,6 +439,41 @@ angular.module('raeApp').factory("dataService", ['$http', '$q', function($http, return defer.promise; }; + self.getTasksByMoMParentGroupId = function(mom_object_parent_group_id) { + var defer = $q.defer(); + var url = '/rest/tasks/mom/parentgroup/' + mom_object_parent_group_id; + + $http.get(url).success(function(result) { + //convert datetime strings to Date objects + for(var i in result.tasks) { + var task = result.tasks[i]; + task.starttime = self.convertDatestringToLocalUTCDate(task.starttime); + task.endtime = self.convertDatestringToLocalUTCDate(task.endtime); + } + + var newTaskDict = self.toIdBasedDict(result.tasks); + var newTaskIds = Object.keys(newTaskDict); + + for(var i = newTaskIds.length-1; i >= 0; i--) { + var task_id = newTaskIds[i]; + if(!self.taskDict.hasOwnProperty(task_id)) { + var task = newTaskDict[task_id]; + self.tasks.push(task); + self.taskDict[task_id] = task; + } + } + + self.taskChangeCntr++; + self.computeMinMaxTaskTimes(); + + defer.resolve(result.tasks); + }).error(function(result) { + defer.resolve(undefined); + }); + + return defer.promise; + }; + self.copyTask = function(task) { $http.put('/rest/tasks/' + task.id + '/copy').error(function(result) { console.log("Error. Could not copy task. " + result); @@ -950,6 +985,27 @@ dataControllerMod.controller('DataController', return defer.promise; }; + $scope.loadTasksByMoMParentGroupIdSelectAndJumpIntoView = function(mom_parent_group_id) { + var defer = $q.defer(); + $scope.dataService.getTasksByMoMParentGroupId(mom_parent_group_id).then(function(tasks) { + if(tasks) { + var task_ids = tasks.map(function(t) { return t.id; }); + + $scope.dataService.setSelectedTaskIds(task_ids); + + if(tasks.length > 1) { + $scope.dataService.selected_project_id = tasks[0].project_mom_id; + } + + $scope.jumpToSelectedTasks(); + defer.resolve(tasks); + } else { + defer.resolve(undefined); + } + }); + return defer.promise; + }; + $scope.selectCurrentTask = function() { var currentTasks = dataService.tasks.filter(function(t) { return t.starttime <= dataService.viewTimeSpan.to && t.endime >= dataService.viewTimeSpan.from; }); if(currentTasks.lenght > 0) { diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/gridcontroller.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/gridcontroller.js index bc41062e8bfed91338fe600793b586ed943a2343..5c19bb062b45755636aab3fffc33bc2bf25390a8 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/gridcontroller.js +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/gridcontroller.js @@ -223,14 +223,20 @@ $scope.columns = [ if(mom_col && mom_col.filters.length && mom_col.filters[0].hasOwnProperty('term')) { var mom_id = mom_col.filters[0].term; $scope.$parent.$parent.loadTaskByMoMIdSelectAndJumpIntoView(mom_id).then(function(task) { - if(task) { - mom_col.filters[0].term = null; - } else { + mom_col.filters[0].term = null; + if(task == undefined) { //getting the task by mom_id did not find a task //maybe the entered id was a mom group_id? //let's try to loadTasksByMoMGroupIdSelectAndJumpIntoView $scope.$parent.$parent.loadTasksByMoMGroupIdSelectAndJumpIntoView(mom_id).then(function(tasks) { - mom_col.filters[0].term = null; + if(tasks == undefined || tasks.length == 0) { + //getting the tasks by mom group id did not find any tasks + //maybe the entered id was a mom parent group_id? + //let's try to loadTasksByMoMParentGroupIdSelectAndJumpIntoView + $scope.$parent.$parent.loadTasksByMoMParentGroupIdSelectAndJumpIntoView(mom_id).then(function(tasks) { + //pass + }); + } }); } }); @@ -318,6 +324,7 @@ $scope.columns = [ mom_object_group_id: task.mom_object_group_id, mom_object_group_name: task.mom_object_group_name, mom_object_group_mom2object_id: task.mom_object_group_mom2object_id, + mom_object_parent_group_id: task.mom_object_parent_group_id, cluster: task.cluster, blocked_by_ids: task.blocked_by_ids, ingest_status: task.ingest_status === null ? undefined : task.ingest_status, @@ -536,8 +543,24 @@ $scope.columns = [ fillColumFilterSelectOptions(task_info, $scope.columns[6]); }; - $scope.$watch('dataService.selected_task_ids', onSelectedTaskIdsChanged, true);} -]); + $scope.$watch('dataService.selected_task_ids', onSelectedTaskIdsChanged, true); + $scope.$watch('dataService.selected_project_id', function() { + fillProjectsColumFilterSelectOptions(); + + var project_col = $scope.gridApi.grid.columns.find(function(c) {return c.field == 'project_name'; }); + if(project_col && project_col.filters.length) { + if(dataService.selected_project_id != undefined) { + var projectName = dataService.momProjectsDict[dataService.selected_project_id].name; + if(projectName != undefined) { + var project_names = project_col.filter.selectOptions.map(function(so) { return so.value;}); + if(project_names.includes(projectName)) { + project_col.filters[0].term = projectName; + } + } + } + } + }); +}]); gridControllerMod.directive('contextMenu', ['$document', '$window', function($document, $window) { return { @@ -602,6 +625,14 @@ gridControllerMod.directive('contextMenu', ['$document', '$window', function($do dataCtrlScope.loadTasksByMoMGroupIdSelectAndJumpIntoView(task.mom_object_group_id); }); + var liElement = angular.element('<li><a href="#">Select parent group</a></li>'); + ulElement.append(liElement); + liElement.on('click', function() { + closeContextMenu(); + var dataCtrlScope = $scope.$parent.$parent.$parent.$parent.$parent.$parent.$parent.$parent.$parent.$parent; + dataCtrlScope.loadTasksByMoMParentGroupIdSelectAndJumpIntoView(task.mom_object_parent_group_id); + }); + var blocked_selected_cep4_tasks = selected_cep4_tasks.filter(function(t) { return (t.blocked_by_ids.length > 0); }); if(blocked_selected_cep4_tasks.length > 0) { diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/gantt-plugins/angular-gantt-contextmenu-plugin.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/gantt-plugins/angular-gantt-contextmenu-plugin.js index ede6e85c255625569dbcad19f9a4391a6a26fef0..746cd6707e5418a217307c23f6d8c5a17d9bc8c7 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/gantt-plugins/angular-gantt-contextmenu-plugin.js +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/gantt-plugins/angular-gantt-contextmenu-plugin.js @@ -76,6 +76,13 @@ dataCtrlScope.loadTasksByMoMGroupIdSelectAndJumpIntoView(task.mom_object_group_id); }); + var liElement = angular.element('<li><a href="#">Select parent group</a></li>'); + ulElement.append(liElement); + liElement.on('click', function() { + closeContextMenu(); + dataCtrlScope.loadTasksByMoMParentGroupIdSelectAndJumpIntoView(task.mom_object_parent_group_id); + }); + var blocked_selected_cep4_tasks = selected_cep4_tasks.filter(function(t) { return (t.blocked_by_ids.length > 0); }); if(blocked_selected_cep4_tasks.length > 0) { diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/webservice.py b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/webservice.py index df76efa8cc5e72ea603473693cd9482c4c04d8fa..146ef8a2a7958e93d5dc4ff4579c7bc5aee3ce1f 100755 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/webservice.py +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/webservice.py @@ -295,6 +295,20 @@ def getTasksByMoMGroupId(mom_group_id): except Exception as e: abort(404) +@app.route('/rest/tasks/mom/parentgroup/<int:mom_parent_group_id>', methods=['GET']) +@gzipped +def getTasksByMoMParentGroupId(mom_parent_group_id): + try: + mom_ids = momqueryrpc.getTaskIdsInParentGroup(mom_parent_group_id)[str(mom_parent_group_id)] + tasks = rarpc.getTasks(mom_ids=mom_ids) + + updateTaskMomDetails(tasks, momqueryrpc) + updateTaskStorageDetails(tasks, sqrpc) + + return jsonify({'tasks': tasks}) + except Exception as e: + abort(404) + @app.route('/rest/tasks/<int:task_id>', methods=['PUT']) def putTask(task_id): if 'Content-Type' in request.headers and \ @@ -751,7 +765,7 @@ def main(): global rarpc rarpc = RARPC(busname=options.radb_busname, servicename=options.radb_servicename, broker=options.broker) global momrpc - momrpc = MoMRPC(busname=options.mom_busname, servicename=options.mom_servicename, timeout=2.5, broker=options.broker) + momrpc = MoMRPC(busname=options.mom_busname, servicename=options.mom_servicename, timeout=10, broker=options.broker) global otdbrpc otdbrpc = OTDBRPC(busname=options.otdb_busname, servicename=options.otdb_servicename, broker=options.broker) global curpc @@ -759,7 +773,7 @@ def main(): global sqrpc sqrpc = StorageQueryRPC(busname=options.storagequery_busname, servicename=options.storagequery_servicename, broker=options.broker) global momqueryrpc - momqueryrpc = MoMQueryRPC(busname=options.mom_query_busname, servicename=options.mom_query_servicename, timeout=2.5, broker=options.broker) + momqueryrpc = MoMQueryRPC(busname=options.mom_query_busname, servicename=options.mom_query_servicename, timeout=10, broker=options.broker) global changeshandler changeshandler = ChangesHandler(radb_busname=options.radb_notification_busname, radb_subjects=options.radb_notification_subjects, dm_busname=options.dm_notification_busname, dm_subjects=options.dm_notification_subjects,