diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb.py b/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb.py index c93539ae4f7f85b7673970019d53853b55e69a74..a451527679357a76b4214543821c9f9f1f0f40e3 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb.py +++ b/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb.py @@ -1304,7 +1304,7 @@ class RADatabase: # sort events per resource by event timestamp ascending # and integrate event delta's into usage - all_usages = [] + all_usages = {} for resource_id, status_events in eventsDict.items(): usages = {} for status, events in status_events.items(): @@ -1328,9 +1328,31 @@ class RADatabase: prev_usage = usage resource_usages = { 'resource_id': resource_id, 'usages': usages } - all_usages.append(resource_usages) + all_usages[resource_id] = resource_usages + + resource_ids = all_usages.keys() + resources = self.getResources(resource_ids=resource_ids, include_availability=True) + + for resource in resources: + resource_id = resource['id'] + resource_usages = all_usages[resource_id] + # copy resource capacities + resource_usages['total_capacity'] = resource['total_capacity'] + resource_usages['available_capacity'] = resource['available_capacity'] + resource_usages['used_capacity'] = resource['used_capacity'] + # and compute unaccounted-for usage, + # which is the actual used_capacity minus the currently allocated total claim size + utcnow = datetime.utcnow() + allocated_usages = resource_usages['usages'].get('allocated', []) + past_allocated_usages = sorted([au for au in allocated_usages if au['timestamp'] <= utcnow]) + if past_allocated_usages: + currently_allocated_usage = past_allocated_usages[-1] + resource_usages['misc_used_capacity'] = resource['used_capacity'] - currently_allocated_usage['value'] + else: + resource_usages['misc_used_capacity'] = 0 - return all_usages + all_usages_list = all_usages.values() + return all_usages_list if __name__ == '__main__': diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/chartresourceusagecontroller.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/chartresourceusagecontroller.js index e98475b3b64f9315242f6d8bbda78a3dd78f2c66..c028453a3a5cc39351578d55b178dac2af236733 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/chartresourceusagecontroller.js +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/chartresourceusagecontroller.js @@ -71,7 +71,7 @@ chartResourceUsageControllerMod.controller('ChartResourceUsageController', ['$sc var numResources = $scope.dataService.resources.length; var resource = $scope.dataService.selected_resource; - if(!resource || numResources == 0) { + if(!resource || numResources == 0 || !resourceUsagesDict[resource.id]) { $scope.chartSeries.splice(0, $scope.chartSeries.length); $scope.chartConfig.title.text = "No resource selected"; return; @@ -80,7 +80,7 @@ chartResourceUsageControllerMod.controller('ChartResourceUsageController', ['$sc //set title to resource name $scope.chartConfig.title.text = resource.name; - var status_usages = resourceUsagesDict[resource.id]; + var status_usages = resourceUsagesDict[resource.id].usages; //first scan of all statuses and timestamps in usages for this resource var statuses = []; @@ -140,12 +140,13 @@ chartResourceUsageControllerMod.controller('ChartResourceUsageController', ['$sc t_idx += 1; } - var series = $scope.chartSeries.find(function(series) {return series.name == status}); - - if(!series) { - series = {name: status, type: 'area', step: true, lineWidth:0, marker:{enabled:false} }; - $scope.chartSeries.push(series); + //make sure the series are in the right order for proper stacking + var seriesIdx = $scope.chartSeries.findIndex(function(series) {return series.name == status}); + if(seriesIdx > -1) { + $scope.chartSeries.splice(seriesIdx, 1); } + series = {name: status, type: 'area', step: true, lineWidth:0, marker:{enabled:false}, animation:false }; + $scope.chartSeries.push(series); series.data = usage_data; @@ -156,6 +157,21 @@ chartResourceUsageControllerMod.controller('ChartResourceUsageController', ['$sc } } + //plot area for resource misc_used capacity + //make sure it is the last of the 'area' series so it is at the bottom of the stacked area charts + var misc_used_cap_series_idx = $scope.chartSeries.findIndex(function(series) {return series.name == 'misc used capacity'}); + if(misc_used_cap_series_idx > -1) { + $scope.chartSeries.splice(misc_used_cap_series_idx, 1); + } + + var misc_used_capacity = resourceUsagesDict[resource.id].misc_used_capacity; + if(misc_used_capacity > 0) { + misc_used_cap_series = {name: 'misc used capacity', type: 'area', color: '#aaaaff', lineWidth:1, marker:{enabled:false}, dashStyle:'Dash', animation:false }; + $scope.chartSeries.push(misc_used_cap_series); + misc_used_cap_series.data = timestamps.map(function(t) { return [t.getTime(), misc_used_capacity]; }); + expectedSeriesNames.push('misc used capacity'); + } + //plot horizontal line for resource total capacity var tot_cap_series = $scope.chartSeries.find(function(series) {return series.name == 'total capacity'}); if(!tot_cap_series) { @@ -172,9 +188,8 @@ chartResourceUsageControllerMod.controller('ChartResourceUsageController', ['$sc used_cap_series = {name: 'used capacity', type: 'line', color: '#ff9966', lineWidth:3, marker:{enabled:false}, dashStyle:'Dash'}; $scope.chartSeries.push(used_cap_series); } - var used_capacity = resource.total_capacity - resource.available_capacity; - used_cap_series.data = [[timestamps[0].getTime(), used_capacity], - [timestamps[timestamps.length-1].getTime(), used_capacity]] + used_cap_series.data = [[timestamps[0].getTime(), resource.used_capacity], + [timestamps[timestamps.length-1].getTime(), resource.used_capacity]] expectedSeriesNames.push('used capacity'); } diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/datacontroller.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/datacontroller.js index d5b7f4e049870b4983bedc605f4b5689578554b7..3f7124d94f7a2bab59dd1a10f45f9b47566169e8 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/datacontroller.js +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/datacontroller.js @@ -100,7 +100,7 @@ angular.module('raeApp').factory("dataService", ['$http', '$q', function($http, usage.timestamp = new Date(usage.timestamp); } } - self.resourceUsagesDict[result.resourceusages[i].resource_id] = resource_usages; + self.resourceUsagesDict[result.resourceusages[i].resource_id] = result.resourceusages[i]; } defer.resolve(); @@ -273,7 +273,11 @@ angular.module('raeApp').factory("dataService", ['$http', '$q', function($http, if(existingObj.hasOwnProperty(prop) && changedObj.hasOwnProperty(prop) && existingObj[prop] != changedObj[prop]) { - existingObj[prop] = changedObj[prop]; + if(existingObj[prop] instanceof Date) { + existingObj[prop] = new Date(changedObj[prop]); + } else { + existingObj[prop] = changedObj[prop]; + } } } };