Commit 4fafad3f by Jose Antonio

Working on Issue #200

parent ef5d94ba
...@@ -51,9 +51,10 @@ thisTrigger: BEGIN ...@@ -51,9 +51,10 @@ thisTrigger: BEGIN
-- Load core collection for student -- Load core collection for student
INSERT INTO scene (id_stu,id_sup,name,active,categories) VALUES (new.id, null, 'with_categories', TRUE, TRUE); INSERT INTO scene (id_stu,id_sup,name,categories) VALUES (new.id, null, 'with_categories', TRUE);
SET LID = LAST_INSERT_ID(); SET LID = LAST_INSERT_ID();
CALL scene_create_core(LID,new.id); CALL scene_create_core(LID,new.id);
UPDATE student SET attributes = JSON_SET(attributes, "$.id_active_scene",@LID);
END;; END;;
......
...@@ -12,6 +12,14 @@ Changes to be performed manually in servers to upgrade ...@@ -12,6 +12,14 @@ Changes to be performed manually in servers to upgrade
`bower install` `bower install`
## Database ## Database
- Delete active column from scene table (deleted from `already done in dev` sql `create scene table` statement)
`alter table scene drop active;`
- Alter table scene to add ON DELETE CASCADE constraint
`ALTER TABLE `scene` ADD CONSTRAINT `stu_scene_fk` FOREIGN KEY (`id_stu`) REFERENCES `student` (`id`) ON DELETE CASCADE;`
- Reload enrolments trigger
`source /vagrant/roles/database/files/triggers-enrolments-integrity-constraints.sql;`
(already done in dev) (already done in dev)
...@@ -25,7 +33,6 @@ Changes to be performed manually in servers to upgrade ...@@ -25,7 +33,6 @@ Changes to be performed manually in servers to upgrade
`CREATE TABLE IF NOT EXISTS `scene` ( `CREATE TABLE IF NOT EXISTS `scene` (
`id` int(11) NOT NULL AUTO_INCREMENT, `id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL, `name` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
`active` boolean NOT NULL DEFAULT 0,
`categories` boolean NOT NULL DEFAULT 0, `categories` boolean NOT NULL DEFAULT 0,
`id_sup` int(11) DEFAULT NULL, `id_sup` int(11) DEFAULT NULL,
`id_stu` int(11) NOT NULL, `id_stu` int(11) NOT NULL,
......
...@@ -17,13 +17,12 @@ module.exports = { ...@@ -17,13 +17,12 @@ module.exports = {
var params = req.params.all(); var params = req.params.all();
Scene.create({ Scene.create({
name: params.name, name: params.name,
active: false,
categories: params.categories, categories: params.categories,
supervisor: params.id_sup, supervisor: params.id_sup,
student: params.id_stu student: params.id_stu
}).then(scene=>{ }).then(scene=>{
if(scene.categories){ if(scene.categories){
Scene.query('CALL scene_create_core(?,?) ',[scene.id, scene.student], function(err, result) { Scene.query('CALL sceneº_create_core(?,?) ',[scene.id, scene.student], function(err, result) {
// if (err) { // if (err) {
// return res.serverError("Could not call stored procedure create scene picto core "+err); // return res.serverError("Could not call stored procedure create scene picto core "+err);
// } else { // } else {
...@@ -46,45 +45,22 @@ module.exports = { ...@@ -46,45 +45,22 @@ module.exports = {
var params= req.allParams(); var params= req.allParams();
if (typeof req.params.id == 'undefined' || !req.params.id) if (typeof req.params.id == 'undefined' || !req.params.id)
return res.badRequest("scene id not defined"); return res.badRequest("scene id not defined");
//If active field is true, check if other scene is active before
if(params.active){
Scene.findOne({active:true, student:params.id_stu})
.then(function(scene){
if(scene.id != req.params.id){
//Is not same scene so it might be deactivated
scene.active = false;
scene.save(function(err){
if(err){
return res.serverError("Could not deactivate previos active_scene");
}
});
}
}).catch(function(err){
throw new Error("Could not find active_scene, maybe there is not an active scene yet");
});
}
Scene.findOne({ id: params.id }).then(function (scene) { Scene.findOne({ id: params.id }).then(function (scene) {
if (!scene) { if (!scene) {
res.badRequest(); res.badRequest();
throw new Error('Scene not found'); throw new Error('Scene not found');
} }
var cat = scene.categories;;
delete scene.categories;//To avoid update these fields delete scene.categories;//To avoid update these fields
delete scene.supervisor; delete scene.supervisor;
delete scene.student; delete scene.student;
scene.name = params.name || scene.name; scene.name = params.name || scene.name;
if (typeof params.active == 'undefined' || !params.active)
scene.active = scene.active;
else
scene.active = params.active;
scene.save(function (error) { scene.save(function (error) {
if (error) { if (error) {
return res.serverError("Could not save scene "+ error); return res.serverError("Could not save scene "+ error);
} }
var cat = false;
if(scene.active){
cat=true;
}
Student.findOne({id:scene.student}) Student.findOne({id:scene.student})
.then(student => { .then(student => {
student.attributes.categories=cat; student.attributes.categories=cat;
...@@ -98,7 +74,6 @@ module.exports = { ...@@ -98,7 +74,6 @@ module.exports = {
} }
}) })
}); });
}); });
}) })
.catch(function (err) { .catch(function (err) {
...@@ -158,7 +133,6 @@ module.exports = { ...@@ -158,7 +133,6 @@ module.exports = {
.populate('stuPictos').then(function(scene){ .populate('stuPictos').then(function(scene){
Scene.create({ Scene.create({
name: scene.name, name: scene.name,
active: false,
categories: scene.categories, categories: scene.categories,
supervisor: scene.supervisor, supervisor: scene.supervisor,
student: scene.student student: scene.student
......
...@@ -826,7 +826,8 @@ module.exports = { ...@@ -826,7 +826,8 @@ module.exports = {
getActiveScene: function(req, res){ getActiveScene: function(req, res){
if (typeof req.params.id_stu == 'undefined' || !req.params.id_stu) if (typeof req.params.id_stu == 'undefined' || !req.params.id_stu)
return res.badRequest("id_stu not defined"); return res.badRequest("id_stu not defined");
Scene.findOne({student: req.params.id_stu, active: true}) Student.findOne({id:req.params.id_stu}).then(function(student){
Scene.findOne({id: student.id_active_scene})
.then(function(scene){ .then(function(scene){
if(!scene) if(!scene)
return res.badRequest("Scene not found"); return res.badRequest("Scene not found");
...@@ -835,12 +836,40 @@ module.exports = { ...@@ -835,12 +836,40 @@ module.exports = {
if (err){ if (err){
return res.serverError("Error obtaining pictos: "+ err); return res.serverError("Error obtaining pictos: "+ err);
} }
scene.active = true;
scene.pictos=pictos; scene.pictos=pictos;
return res.ok(scene); return res.ok(scene);
}); });
}).catch(function (err){ }).catch(function (err){
return res.serverError("Error finding scene "+err); return res.serverError("Error finding scene "+err);
}); });
}).catch(function(err){
return res.badRequest("Student not found");
});
},
/**
* Update the active scene of a student
* @param {request} req {} (with id_stu and id_scene as url parameters)
* @param {response} res {}
*/
updateActiveScene: function(req,res){
var params = req.allParams();
Student.findOne({id:params.id_stu})
.then(student => {
student.attributes.id_active_scene=params.id_scene;
delete student.password;
student.save(function(error){
if(error){
return res.serverError("Error updating active scene");
}
else{
return res.ok();
}
})
}).catch(function(err){
return res.badRequest("Student not found");
});
}, },
/** /**
...@@ -851,15 +880,25 @@ module.exports = { ...@@ -851,15 +880,25 @@ module.exports = {
getScenes: function(req, res){ getScenes: function(req, res){
if (typeof req.params.id_stu == 'undefined' || !req.params.id_stu) if (typeof req.params.id_stu == 'undefined' || !req.params.id_stu)
return res.badRequest("id_stu not defined"); return res.badRequest("id_stu not defined");
Student.findOne({id:params.id_stu})
.then(student => {
Scene.find({student: req.params.id_stu}) Scene.find({student: req.params.id_stu})
.then(function(scenes){ .then(function(scenes){
if(!scenes) if(!scenes){
return res.badRequest("No scenes found"); return res.serverError("No scenes found");
else }else{
scenes.forEach(function(scene, cb){
scene.active = scene.id == student.attributes.id_active_scene;
});
return res.ok(scenes); return res.ok(scenes);
}
}).catch(function (err){ }).catch(function (err){
return res.serverError("Error finding scene "+err); return res.serverError("Error finding scene "+err);
}); });
}).catch(function(err){
return res.badRequest("Student not found");
});
}, },
// //
......
...@@ -25,9 +25,6 @@ module.exports = { ...@@ -25,9 +25,6 @@ module.exports = {
type: "string", type: "string",
size: 100 size: 100
}, },
active: {
type: "boolean"
},
categories: { categories: {
type: "boolean" type: "boolean"
}, },
......
...@@ -162,6 +162,7 @@ module.exports = { ...@@ -162,6 +162,7 @@ module.exports = {
const validAttributes = {}; const validAttributes = {};
const defaultAttributes = { const defaultAttributes = {
categories: true, categories: true,
id_active_scene: null,
input_feedback: { input_feedback: {
vibration: true, vibration: true,
read: false, read: false,
...@@ -236,6 +237,9 @@ module.exports = { ...@@ -236,6 +237,9 @@ module.exports = {
if (!((/^#([0-9a-f]{3}){1,2}$/i).test(validAttributes.tape_background))) { if (!((/^#([0-9a-f]{3}){1,2}$/i).test(validAttributes.tape_background))) {
delete validAttributes.tape_background; delete validAttributes.tape_background;
} }
if (typeof validAttributes.id_active_scene !== 'number') {
delete validAttributes.id_active_scene;
}
} }
sails.log.verbose('Requested attributes for Student', attributes); sails.log.verbose('Requested attributes for Student', attributes);
sails.log.verbose('Valid attributes for Student', validAttributes); sails.log.verbose('Valid attributes for Student', validAttributes);
......
...@@ -269,13 +269,11 @@ dashboardControllers.controller('StudentCollectionsCtrl', function StudentCollec ...@@ -269,13 +269,11 @@ dashboardControllers.controller('StudentCollectionsCtrl', function StudentCollec
$http.put(config.backend + '/scene/' + scene.id + '/stu/' + $scope.studentData.id, { $http.put(config.backend + '/scene/' + scene.id + '/stu/' + $scope.studentData.id, {
name: scene.name, name: scene.name,
active: scene.active,
id_stu:scene.student}) id_stu:scene.student})
.success(function (scene) { .success(function (scene) {
var data= { var data= {
id: scene.id, id: scene.id,
name: scene.name, name: scene.name,
active: scene.active,
categories: scene.categories, categories: scene.categories,
student: scene.student, student: scene.student,
supervisor: scene.supervisor}; supervisor: scene.supervisor};
...@@ -295,6 +293,28 @@ dashboardControllers.controller('StudentCollectionsCtrl', function StudentCollec ...@@ -295,6 +293,28 @@ dashboardControllers.controller('StudentCollectionsCtrl', function StudentCollec
}; };
// Activate student scene
$scope.activate_scene = function (scene) {
$http.put(config.backend + '/stu/' + $scope.studentData.id + '/activeScene/' + scene.id, {})
.success(function () {
var data= {
id: scene.id};
io.socket.post('/scene', {
action: 'activate',
scene: data
}, function () {});
$translate('scene_updated').then(function (translation) {
ngToast.success({ content: translation });
});
$scope.loadScenesList();
}).error(function () {});
};
// Duplicate viewing scene // Duplicate viewing scene
$scope.copy_scene = function () { $scope.copy_scene = function () {
...@@ -618,7 +638,7 @@ dashboardControllers.controller('StudentCollectionsCtrl', function StudentCollec ...@@ -618,7 +638,7 @@ dashboardControllers.controller('StudentCollectionsCtrl', function StudentCollec
.success(function (scene) { .success(function (scene) {
var data = { var data = {
name: scene.name, name: scene.name,
active: scene.active, active: false,
categories: scene.categories, categories: scene.categories,
student: scene.student, student: scene.student,
supervisor: scene.supervisor supervisor: scene.supervisor
......
...@@ -323,7 +323,7 @@ ...@@ -323,7 +323,7 @@
<div class="text-center"> <div class="text-center">
<input type="text" class="editable scene-name text-center" ng-model="viewingScene.name" ng-blur="update_scene(viewingScene)"> <input type="text" class="editable scene-name text-center" ng-model="viewingScene.name" ng-blur="update_scene(viewingScene)">
<a style="text-decoration:none" popover="{{ 'scene_already_activated' | translate}}" popover-trigger="mouseenter" ng-if="viewingScene.active"><span class="label label-success"><i class="fa fa-star" aria-hidden="true"></i> {{ 'scene_active' | translate }}</span></a> <a style="text-decoration:none" popover="{{ 'scene_already_activated' | translate}}" popover-trigger="mouseenter" ng-if="viewingScene.active"><span class="label label-success"><i class="fa fa-star" aria-hidden="true"></i> {{ 'scene_active' | translate }}</span></a>
<a style="text-decoration:none" popover="{{ 'scene_activate' | translate}}" popover-trigger="mouseenter" ng-if="!viewingScene.active" ng-click="viewingScene.active=true;update_scene(viewingScene)"><span class="label label-default"><i class="fa fa-star-o" aria-hidden="true"></i> {{ 'scene_inactive' | translate }}</span></a> <a style="text-decoration:none" popover="{{ 'scene_activate' | translate}}" popover-trigger="mouseenter" ng-if="!viewingScene.active" ng-click="viewingScene.active=true;activate_scene(viewingScene)"><span class="label label-default"><i class="fa fa-star-o" aria-hidden="true"></i> {{ 'scene_inactive' | translate }}</span></a>
</div> </div>
<hr> <hr>
......
...@@ -127,7 +127,8 @@ module.exports.policies = { ...@@ -127,7 +127,8 @@ module.exports.policies = {
unlink_supervisor: ['tokenAuth', 'isSupAdmin'], unlink_supervisor: ['tokenAuth', 'isSupAdmin'],
delete_picto: ['tokenAuth', 'isSupervisorOfStudent'], delete_picto: ['tokenAuth', 'isSupervisorOfStudent'],
getActiveScene: ['tokenAuth'], getActiveScene: ['tokenAuth'],
getScenes: ['tokenAuth'] getScenes: ['tokenAuth'],
updateActiveScene: ['tokenAuth', 'isSupervisorOfStudent']
}, },
LicenseController: { LicenseController: {
......
...@@ -104,6 +104,7 @@ module.exports.routes = { ...@@ -104,6 +104,7 @@ module.exports.routes = {
'PUT /stu/:id_stu/legend/:legend_value': 'StudentController.update_legend', 'PUT /stu/:id_stu/legend/:legend_value': 'StudentController.update_legend',
'PUT /stu/:id_stu/picto': 'StudentController.update_picto', 'PUT /stu/:id_stu/picto': 'StudentController.update_picto',
'PUT /stu/:id_stu/cat': 'StudentController.update_category', 'PUT /stu/:id_stu/cat': 'StudentController.update_category',
'PUT /stu/:id_stu/activeScene/:id_scene': 'StudentController.updateActiveScene',
'POST /stu/login': 'StudentController.login', 'POST /stu/login': 'StudentController.login',
'POST /stu': 'StudentController.create', 'POST /stu': 'StudentController.create',
'POST /stu/upload': 'StudentController.upload', 'POST /stu/upload': 'StudentController.upload',
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment