Commit 4fafad3f by Jose Antonio

Working on Issue #200

parent ef5d94ba
......@@ -51,9 +51,10 @@ thisTrigger: BEGIN
-- 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();
CALL scene_create_core(LID,new.id);
UPDATE student SET attributes = JSON_SET(attributes, "$.id_active_scene",@LID);
END;;
......
......@@ -12,6 +12,14 @@ Changes to be performed manually in servers to upgrade
`bower install`
## 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)
......@@ -25,7 +33,6 @@ Changes to be performed manually in servers to upgrade
`CREATE TABLE IF NOT EXISTS `scene` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
`active` boolean NOT NULL DEFAULT 0,
`categories` boolean NOT NULL DEFAULT 0,
`id_sup` int(11) DEFAULT NULL,
`id_stu` int(11) NOT NULL,
......
......@@ -17,13 +17,12 @@ module.exports = {
var params = req.params.all();
Scene.create({
name: params.name,
active: false,
categories: params.categories,
supervisor: params.id_sup,
student: params.id_stu
}).then(scene=>{
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) {
// return res.serverError("Could not call stored procedure create scene picto core "+err);
// } else {
......@@ -46,45 +45,22 @@ module.exports = {
var params= req.allParams();
if (typeof req.params.id == 'undefined' || !req.params.id)
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) {
if (!scene) {
res.badRequest();
throw new Error('Scene not found');
}
var cat = scene.categories;;
delete scene.categories;//To avoid update these fields
delete scene.supervisor;
delete scene.student;
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) {
if (error) {
return res.serverError("Could not save scene "+ error);
}
var cat = false;
if(scene.active){
cat=true;
}
Student.findOne({id:scene.student})
.then(student => {
student.attributes.categories=cat;
......@@ -98,7 +74,6 @@ module.exports = {
}
})
});
});
})
.catch(function (err) {
......@@ -158,7 +133,6 @@ module.exports = {
.populate('stuPictos').then(function(scene){
Scene.create({
name: scene.name,
active: false,
categories: scene.categories,
supervisor: scene.supervisor,
student: scene.student
......
......@@ -826,24 +826,53 @@ module.exports = {
getActiveScene: function(req, res){
if (typeof req.params.id_stu == 'undefined' || !req.params.id_stu)
return res.badRequest("id_stu not defined");
Scene.findOne({student: req.params.id_stu, active: true})
.then(function(scene){
if(!scene)
return res.badRequest("Scene not found");
else
Scene.pictos(scene.id, function(err, pictos){
if (err){
return res.serverError("Error obtaining pictos: "+ err);
}
scene.pictos=pictos;
return res.ok(scene);
});
}).catch(function (err){
return res.serverError("Error finding scene "+err);
Student.findOne({id:req.params.id_stu}).then(function(student){
Scene.findOne({id: student.id_active_scene})
.then(function(scene){
if(!scene)
return res.badRequest("Scene not found");
else
Scene.pictos(scene.id, function(err, pictos){
if (err){
return res.serverError("Error obtaining pictos: "+ err);
}
scene.active = true;
scene.pictos=pictos;
return res.ok(scene);
});
}).catch(function (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");
});
},
/**
* Return all scenes of a student
* @param {request} req {} (with studentId as url parameter)
* @param {response} res {}
......@@ -851,15 +880,25 @@ module.exports = {
getScenes: function(req, res){
if (typeof req.params.id_stu == 'undefined' || !req.params.id_stu)
return res.badRequest("id_stu not defined");
Scene.find({student: req.params.id_stu})
.then(function(scenes){
if(!scenes)
return res.badRequest("No scenes found");
else
return res.ok(scenes);
}).catch(function (err){
return res.serverError("Error finding scene "+err);
});
Student.findOne({id:params.id_stu})
.then(student => {
Scene.find({student: req.params.id_stu})
.then(function(scenes){
if(!scenes){
return res.serverError("No scenes found");
}else{
scenes.forEach(function(scene, cb){
scene.active = scene.id == student.attributes.id_active_scene;
});
return res.ok(scenes);
}
}).catch(function (err){
return res.serverError("Error finding scene "+err);
});
}).catch(function(err){
return res.badRequest("Student not found");
});
},
//
......@@ -1248,24 +1287,24 @@ module.exports = {
upload_sound: function (req, res) {
var soundFileName;
var soundDirectory = sails.config.pictogram.paths.pictoSoundDirectory;
soundFileName = sails.config.pictogram.paths.getCustomPictoSoundFilename(req.params.id_stu, req.params.id_picto);
soundFileName = sails.config.pictogram.paths.getCustomPictoSoundFilename(req.params.id_stu, req.params.id_picto);
req.file('file').upload({
maxBytes: 1048576,
dirname: soundDirectory,
saveAs: soundFileName
}, function whenDone(err, uploadedFiles) {
var fs = require('fs');
if (err || (uploadedFiles.length === 0))
return res.serverError("Error uploading " + err ? err : "");
StuPicto.findOne({ student: req.params.id_stu, picto: req.params.id_picto})
.then((sp) => {
if (!sp)
throw Error("Not found");
.then((sp) => {
if (!sp)
throw Error("Not found");
sp.attributes.uri_sound = sails.config.pictogram.urls.getSoundUrl(soundFileName);
sp.save(function (err) {
......
......@@ -25,9 +25,6 @@ module.exports = {
type: "string",
size: 100
},
active: {
type: "boolean"
},
categories: {
type: "boolean"
},
......
......@@ -162,6 +162,7 @@ module.exports = {
const validAttributes = {};
const defaultAttributes = {
categories: true,
id_active_scene: null,
input_feedback: {
vibration: true,
read: false,
......@@ -236,6 +237,9 @@ module.exports = {
if (!((/^#([0-9a-f]{3}){1,2}$/i).test(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('Valid attributes for Student', validAttributes);
......
......@@ -269,13 +269,11 @@ dashboardControllers.controller('StudentCollectionsCtrl', function StudentCollec
$http.put(config.backend + '/scene/' + scene.id + '/stu/' + $scope.studentData.id, {
name: scene.name,
active: scene.active,
id_stu:scene.student})
.success(function (scene) {
var data= {
id: scene.id,
name: scene.name,
active: scene.active,
categories: scene.categories,
student: scene.student,
supervisor: scene.supervisor};
......@@ -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
$scope.copy_scene = function () {
......@@ -618,7 +638,7 @@ dashboardControllers.controller('StudentCollectionsCtrl', function StudentCollec
.success(function (scene) {
var data = {
name: scene.name,
active: scene.active,
active: false,
categories: scene.categories,
student: scene.student,
supervisor: scene.supervisor
......
......@@ -323,7 +323,7 @@
<div class="text-center">
<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_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>
<hr>
......
......@@ -127,7 +127,8 @@ module.exports.policies = {
unlink_supervisor: ['tokenAuth', 'isSupAdmin'],
delete_picto: ['tokenAuth', 'isSupervisorOfStudent'],
getActiveScene: ['tokenAuth'],
getScenes: ['tokenAuth']
getScenes: ['tokenAuth'],
updateActiveScene: ['tokenAuth', 'isSupervisorOfStudent']
},
LicenseController: {
......
......@@ -104,6 +104,7 @@ module.exports.routes = {
'PUT /stu/:id_stu/legend/:legend_value': 'StudentController.update_legend',
'PUT /stu/:id_stu/picto': 'StudentController.update_picto',
'PUT /stu/:id_stu/cat': 'StudentController.update_category',
'PUT /stu/:id_stu/activeScene/:id_scene': 'StudentController.updateActiveScene',
'POST /stu/login': 'StudentController.login',
'POST /stu': 'StudentController.create',
'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