Merge pull request #31 from OpenStackweb/development
Product release v1.0.2.4
This commit is contained in:
commit
763b52a6b7
|
@ -2,18 +2,15 @@ module.exports = function(UserStory) {
|
|||
var fs = require("fs");
|
||||
var route = '../tracker';
|
||||
var app = require('../../server/server');
|
||||
var http = require("http");
|
||||
var https = require('https');
|
||||
var markdown = require("markdown").markdown;
|
||||
var async = require("async");
|
||||
var htmlparser = require("htmlparser");
|
||||
var cheerio = require('cheerio');
|
||||
var xssFilters = require("xss-filters");
|
||||
const SPEC_URL = "http://specs.openstack.org/openstack/openstack-user-stories/user-stories/proposed/";
|
||||
|
||||
|
||||
var blueprintsResume = [];
|
||||
|
||||
|
||||
var getAllfiles = function(){
|
||||
return fs.readdirSync(route)
|
||||
.map(function(file){
|
||||
|
@ -29,11 +26,11 @@ module.exports = function(UserStory) {
|
|||
var userStories = getAllfiles();
|
||||
//filter by Id
|
||||
var file = userStories.filter(function(item){
|
||||
return item.id == id;
|
||||
// VALIDATE IF A VALID ID IS COMING!
|
||||
return item.id == xssFilters.inHTMLData(id);
|
||||
})
|
||||
|
||||
file = (file.length > 0)?file[0]:null;
|
||||
|
||||
return file;
|
||||
|
||||
};
|
||||
|
@ -45,18 +42,18 @@ module.exports = function(UserStory) {
|
|||
total: 0
|
||||
}
|
||||
|
||||
userStory.tasks.forEach(function (taskName, index, array) {
|
||||
userStory.tasks.forEach(function (taskName) {
|
||||
|
||||
var task = userStory.tasks_status[taskName];
|
||||
|
||||
task.projects.forEach(function (projectName, index, array) {
|
||||
|
||||
var blueprints = task.projects_status[projectName].blueprints;
|
||||
task.projects.forEach(function (projectName) {
|
||||
//VALIDATE projectName EXISTS
|
||||
var blueprints = task.projects_status[xssFilters.inHTMLData(projectName)].blueprints;
|
||||
var blueprintNames = Object.keys(blueprints);
|
||||
|
||||
blueprintNames.forEach(function (blueprintName, index, array) {
|
||||
|
||||
if (blueprints[blueprintName] == 'completed')
|
||||
blueprintNames.forEach(function (blueprintName) {
|
||||
// VALIDATE PROPERLY if this statement is not true
|
||||
if (blueprints[xssFilters.inHTMLData(blueprintName)] == 'completed')
|
||||
blueprintsResume.completed = blueprintsResume.completed + 1;
|
||||
|
||||
blueprintsResume.total = blueprintsResume.total + 1;
|
||||
|
@ -77,7 +74,7 @@ module.exports = function(UserStory) {
|
|||
var Patch = app.models.Patch;
|
||||
var lastUpdate = '';
|
||||
|
||||
Patch.latestUpdate(userStory.source, function (err, response, next) {
|
||||
Patch.latestUpdate(userStory.source, function (err, response) {
|
||||
response = JSON.parse(response.substring(5));
|
||||
|
||||
if(response.length > 0){
|
||||
|
@ -95,99 +92,7 @@ module.exports = function(UserStory) {
|
|||
|
||||
}
|
||||
|
||||
|
||||
// Parse data from userStory
|
||||
var parseUserStory = function(userStory, callback){
|
||||
|
||||
async.waterfall([function(cb){
|
||||
|
||||
getLastUpdated(userStory, cb)
|
||||
|
||||
},function(lastUpdated, cb){
|
||||
userStory.updatedOn = lastUpdated;
|
||||
userStory.showDetailedUri = SPEC_URL + userStory.source + '.html';
|
||||
userStory.createdOn = userStory.date;
|
||||
userStory.completed = getbluePrintResume(userStory);
|
||||
|
||||
cb(null, userStory);
|
||||
|
||||
},function(userStory, cb){
|
||||
|
||||
var tasksName = userStory.tasks;
|
||||
var tasks = userStory.tasks_status;
|
||||
|
||||
parseTasks(userStory, tasksName, tasks, cb)
|
||||
|
||||
}],function(err,userStory){
|
||||
callback(null, userStory);
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
//??
|
||||
var parseTasks = function(userStory, tasksNames, tasks, callback) { //get tasks
|
||||
|
||||
var tmpTasks = {};
|
||||
async.each(tasksNames, function(taskName, callbackInner) {
|
||||
|
||||
parseTask(tasks[taskName], function(err, parsedTask){
|
||||
|
||||
tmpTasks[taskName] = parsedTask;
|
||||
|
||||
var tmpProjects = {};
|
||||
async.each(tmpTasks[taskName].projects, function(projectName, callbackInner2) {
|
||||
|
||||
parseProject(tmpTasks[taskName].projects_status[projectName], function(err, parsedProject){
|
||||
tmpProjects[projectName] = parsedProject;
|
||||
|
||||
//Bluprints
|
||||
var blueprintNames = Object.keys(tmpProjects[projectName].blueprints);
|
||||
|
||||
async.map(blueprintNames, function(blueprintName, callbackInner3) {
|
||||
|
||||
parseBlueprint(tmpProjects[projectName].blueprints[blueprintName], blueprintName, projectName, function(err, parsedBlueprint){
|
||||
// tmpProjects[projectName].blueprints[blueprintName] = parsedBlueprint
|
||||
callbackInner3(null, parsedBlueprint)
|
||||
})
|
||||
|
||||
}, function(err, blueprints) {
|
||||
|
||||
tmpProjects[projectName].blueprints = blueprints;
|
||||
|
||||
var project = {};
|
||||
project[projectName] = tmpProjects[projectName];
|
||||
|
||||
callbackInner2(null)
|
||||
|
||||
});
|
||||
//fin blueprints
|
||||
|
||||
})
|
||||
|
||||
}, function(err) {
|
||||
|
||||
tmpTasks[taskName].projects_status = tmpProjects;
|
||||
callbackInner(null)
|
||||
});
|
||||
|
||||
})
|
||||
|
||||
}, function(err) {
|
||||
|
||||
userStory.tasks = tasksNames;
|
||||
userStory.tasks_status = tmpTasks;
|
||||
|
||||
//userStory.percentageComplete = getPercentage(blueprintsResume)
|
||||
|
||||
callback(null, userStory);
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
//?
|
||||
|
||||
//getting task description
|
||||
var getTaskDescription = function(task, callback){
|
||||
|
||||
var Rst = app.models.Rst;
|
||||
|
@ -199,8 +104,9 @@ module.exports = function(UserStory) {
|
|||
var $ = cheerio.load(html_content);
|
||||
|
||||
var index = null;
|
||||
var description;
|
||||
//Find the title
|
||||
var description = $('h1').each(function(i, elem) {
|
||||
$('h1').each(function(i, elem) {
|
||||
if(elem.children[0].data == 'Problem description'){
|
||||
index = i;
|
||||
}
|
||||
|
@ -218,13 +124,14 @@ module.exports = function(UserStory) {
|
|||
})
|
||||
|
||||
}
|
||||
//?
|
||||
|
||||
var getUriTask = function(spec){
|
||||
var base = 'https://github.com/openstack/openstack-specs/blob/master/specs/';
|
||||
|
||||
return base + spec + '.rst';
|
||||
}
|
||||
//?
|
||||
|
||||
//parsing task
|
||||
var parseTask = function(originalTask, callback){
|
||||
|
||||
getTaskDescription(originalTask, function(err, description){
|
||||
|
@ -234,8 +141,8 @@ module.exports = function(UserStory) {
|
|||
})
|
||||
|
||||
}
|
||||
//?
|
||||
|
||||
//parsing project
|
||||
var parseProject = function(originalProject, callback){
|
||||
|
||||
var urlArray = originalProject.spec.split('/');
|
||||
|
@ -245,7 +152,7 @@ module.exports = function(UserStory) {
|
|||
callback(null, originalProject)
|
||||
}
|
||||
|
||||
//?
|
||||
//parsing blueprints
|
||||
var parseBlueprint = function(originalBlueprint, blueprintName, projectName, callback){
|
||||
var Blueprint = app.models.Blueprint;
|
||||
var Patch = app.models.Patch;
|
||||
|
@ -287,8 +194,93 @@ module.exports = function(UserStory) {
|
|||
|
||||
}
|
||||
|
||||
//parsing tasks
|
||||
var parseTasks = function(userStory, tasksNames, tasks, callback) { //get tasks
|
||||
|
||||
var tmpTasks = {};
|
||||
async.each(tasksNames, function(taskName, callbackInner) {
|
||||
|
||||
parseTask(tasks[taskName], function(err, parsedTask){
|
||||
|
||||
tmpTasks[taskName] = parsedTask;
|
||||
|
||||
var tmpProjects = {};
|
||||
async.each(tmpTasks[taskName].projects, function(projectName, callbackInner2) {
|
||||
|
||||
parseProject(tmpTasks[taskName].projects_status[projectName], function(err, parsedProject){
|
||||
tmpProjects[projectName] = parsedProject;
|
||||
|
||||
//Bluprints
|
||||
var blueprintNames = Object.keys(tmpProjects[projectName].blueprints);
|
||||
|
||||
async.map(blueprintNames, function(blueprintName, callbackInner3) {
|
||||
|
||||
parseBlueprint(tmpProjects[projectName].blueprints[blueprintName], blueprintName, projectName, function(err, parsedBlueprint){
|
||||
// tmpProjects[projectName].blueprints[blueprintName] = parsedBlueprint
|
||||
callbackInner3(null, parsedBlueprint)
|
||||
})
|
||||
|
||||
}, function(err, blueprints) {
|
||||
|
||||
tmpProjects[projectName].blueprints = blueprints;
|
||||
|
||||
var project = {};
|
||||
project[projectName] = tmpProjects[projectName];
|
||||
|
||||
callbackInner2(null)
|
||||
|
||||
});
|
||||
//fin blueprints
|
||||
|
||||
})
|
||||
|
||||
}, function() {
|
||||
tmpTasks[taskName].projects_status = tmpProjects;
|
||||
callbackInner(null)
|
||||
});
|
||||
|
||||
})
|
||||
|
||||
}, function() {
|
||||
userStory.tasks = tasksNames;
|
||||
userStory.tasks_status = tmpTasks;
|
||||
|
||||
//userStory.percentageComplete = getPercentage(blueprintsResume)
|
||||
|
||||
callback(null, userStory);
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
// Parse data from userStory
|
||||
var parseUserStory = function(userStory, callback){
|
||||
|
||||
async.waterfall([function(cb){
|
||||
|
||||
getLastUpdated(userStory, cb)
|
||||
|
||||
},function(lastUpdated, cb){
|
||||
userStory.updatedOn = lastUpdated;
|
||||
userStory.showDetailedUri = SPEC_URL + userStory.source + '.html';
|
||||
userStory.createdOn = userStory.date;
|
||||
userStory.completed = getbluePrintResume(userStory);
|
||||
|
||||
cb(null, userStory);
|
||||
|
||||
},function(userStory, cb){
|
||||
|
||||
var tasksName = userStory.tasks;
|
||||
var tasks = userStory.tasks_status;
|
||||
|
||||
parseTasks(userStory, tasksName, tasks, cb)
|
||||
|
||||
}],function(err,userStory){
|
||||
callback(null, userStory);
|
||||
})
|
||||
}
|
||||
|
||||
//?
|
||||
UserStory.on('attached',function(){
|
||||
|
||||
UserStory.findById = function(id, params, cb){
|
||||
|
@ -316,10 +308,10 @@ module.exports = function(UserStory) {
|
|||
|
||||
var itemResult = {
|
||||
completed: getbluePrintResume(userStory),
|
||||
dateCreated: userStory.date,
|
||||
lastUpdate: lastUpdated,
|
||||
userStory: userStory.description,
|
||||
id:userStory.id
|
||||
dateCreated: xssFilters.inHTMLData(userStory.date),
|
||||
lastUpdate: xssFilters.inHTMLData(lastUpdated),
|
||||
userStory: xssFilters.inHTMLData(userStory.description),
|
||||
id:xssFilters.inHTMLData(userStory.id)
|
||||
};
|
||||
|
||||
cb(null, itemResult);
|
||||
|
|
|
@ -22,7 +22,8 @@
|
|||
"loopback-datasource-juggler": "^2.39.0",
|
||||
"markdown": "^0.5.0",
|
||||
"serve-favicon": "^2.0.1",
|
||||
"underscore": "^1.8.3"
|
||||
"underscore": "^1.8.3",
|
||||
"xss-filters": "^1.2.7"
|
||||
},
|
||||
"devDependencies": {
|
||||
"jshint": "^2.5.6",
|
||||
|
|
|
@ -53,17 +53,25 @@
|
|||
description;
|
||||
}
|
||||
|
||||
$scope.userStory.updatedOn = moment($scope.userStory.
|
||||
updatedOn).format("MM-DD-YYYY");
|
||||
$scope.userStory.createdOn = moment($scope.userStory.
|
||||
createdOn, "DD-MM-YYYY").format("MM-DD-YYYY");
|
||||
|
||||
if($scope.userStory.updatedOn !=='') {
|
||||
$scope.userStory.updatedOn = moment($scope.userStory.
|
||||
updatedOn, "YYYY-MM-DD").format("MM-DD-YYYY");
|
||||
} else {
|
||||
$scope.userStory.updatedOn = $scope.userStory.createdOn;
|
||||
}
|
||||
|
||||
for(var key in $scope.userStory.tasks_status) {
|
||||
$scope.actualProject[key] = $scope.userStory.
|
||||
tasks_status[key].projects[0]
|
||||
}
|
||||
}, function onError(error){
|
||||
}, function onError(){
|
||||
$location.path('/projectDetail/notFound/' + $scope.taskId);
|
||||
}
|
||||
);
|
||||
};
|
||||
}
|
||||
|
||||
$scope.selectProject = function(keyProject, idTask){
|
||||
$scope.actualProject[idTask] = keyProject
|
||||
|
|
|
@ -10,7 +10,7 @@ describe('Component: ProjectDetailComponent', function () {
|
|||
// Initialize the controller and a mock scope
|
||||
beforeEach(inject(function ($componentController, $rootScope) {
|
||||
scope = $rootScope.$new();
|
||||
ProjectDetailComponent = $componentController('ProjectDetailComponent', {
|
||||
$componentController('ProjectDetailComponent', {
|
||||
$scope: scope
|
||||
});
|
||||
}));
|
||||
|
|
|
@ -1,41 +1,41 @@
|
|||
'use strict';
|
||||
|
||||
angular.module('dashboardProjectApp').controller('projectListCtrl', function(
|
||||
angular.module('dashboardProjectApp').controller('projectListCtrl', function (
|
||||
$scope,
|
||||
UserStory
|
||||
){
|
||||
) {
|
||||
var data = [];
|
||||
var lastUpdate;
|
||||
function getFiles() {
|
||||
UserStory.find(
|
||||
function success(userStories, fillTable) {
|
||||
new Promise(function(resolve, reject) {
|
||||
var stringDate, realDate;
|
||||
function success(userStories) {
|
||||
new Promise(function(resolve) {
|
||||
|
||||
|
||||
userStories.forEach(function each (story) {
|
||||
|
||||
console.log('userStories', story);
|
||||
if(story.lastUpdate !== '') {
|
||||
lastUpdate = moment(story.lastUpdate, "YYYY-MM-DD").format("MM-DD-YYYY");
|
||||
lastUpdate = moment(story.lastUpdate,
|
||||
"YYYY-MM-DD").format("MM-DD-YYYY");
|
||||
} else {
|
||||
lastUpdate = moment(story.dateCreated, "DD-MM-YYYY").format("MM-DD-YYYY");
|
||||
lastUpdate = moment(story.dateCreated,
|
||||
"DD-MM-YYYY").format("MM-DD-YYYY");
|
||||
}
|
||||
data.push(
|
||||
{
|
||||
userStory: story.id+'-'+story.userStory,
|
||||
dateCreated: moment(story.dateCreated, "DD-MM-YYYY").format("MM-DD-YYYY"),
|
||||
dateCreated: moment(story.dateCreated,
|
||||
"DD-MM-YYYY").format("MM-DD-YYYY"),
|
||||
lastUpdate: lastUpdate,
|
||||
progressPercentage: story.completed.percentage,
|
||||
progressLabel: story.completed.completed + ' / ' + story.completed.total
|
||||
progressLabel: story.completed.completed + ' / '
|
||||
+ story.completed.total
|
||||
}
|
||||
)
|
||||
|
||||
console.log('data', data);
|
||||
resolve(data);
|
||||
});
|
||||
})
|
||||
.then(function(result) {
|
||||
.then(function() {
|
||||
$(function () {
|
||||
$('#table').bootstrapTable({
|
||||
data: data
|
||||
|
@ -43,6 +43,6 @@ angular.module('dashboardProjectApp').controller('projectListCtrl', function(
|
|||
});
|
||||
});
|
||||
});
|
||||
};
|
||||
}
|
||||
getFiles();
|
||||
});
|
||||
|
|
|
@ -10,7 +10,7 @@ describe('Component: ProjectListComponent', function () {
|
|||
// Initialize the controller and a mock scope
|
||||
beforeEach(inject(function ($componentController, $rootScope) {
|
||||
scope = $rootScope.$new();
|
||||
ProjectListComponent = $componentController('ProjectListComponent', {
|
||||
$componentController('ProjectListComponent', {
|
||||
$scope: scope
|
||||
});
|
||||
}));
|
||||
|
|
Loading…
Reference in New Issue