issue #129 fixed

parent 77ae9311
...@@ -10,7 +10,7 @@ module.exports = { ...@@ -10,7 +10,7 @@ module.exports = {
/** /**
* Return all subcategories from a category using the language of the specified supervisor. * Return all subcategories from a category using the language of the specified supervisor.
* If 0 is specified as category all categories without supercategory will be returned. * If 0 is specified as category all categories without supercategory will be returned.
* @param {request} req {} (with supervisorId and categoryId as url parameters) * @param {request} req {} (with lang and categoryId as url parameters)
* @param {response} res * @param {response} res
* [ * [
* { * {
...@@ -31,29 +31,20 @@ module.exports = { ...@@ -31,29 +31,20 @@ module.exports = {
* ] * ]
*/ */
categories: function (req, res) { categories: function (req, res) {
Supervisor.findOne({ id: req.params.id }).then(function (supervisor) { PictoCat
if (supervisor) { .find({ id_supercat: req.params.id_cat })
PictoCat .populate('exps', { lang: req.params.lang })
.find({ id_supercat: req.params.id_cat }) .then(function (categories) {
.populate('exps', { lang: supervisor.lang }) res.ok(categories);
.then(function (categories) { })
res.ok(categories); .catch(function (err) {
}) return res.serverError();
.catch(function (err) { });
throw err;
});
} else {
res.badRequest();
}
})
.catch(function (err) {
res.serverError(err);
});
}, },
/** /**
* Return all pictos from a category using the language of the specified supervisor. * Return all pictos from a category using the language of the specified supervisor.
* @param {request} req {} (with supervisorId and categoryId as url parameters) * @param {request} req {} (with lang and categoryId as url parameters)
* @param {response} res * @param {response} res
* [ * [
* { * {
...@@ -83,45 +74,37 @@ module.exports = { ...@@ -83,45 +74,37 @@ module.exports = {
if (req.params.id_cat == 0) if (req.params.id_cat == 0)
return res.ok(l); return res.ok(l);
Supervisor.findOne({ id: req.params.id }).then(function (supervisor) { Picto.find({ category: req.params.id_cat })
if (supervisor) { .populate('expressions', { lang: req.params.lang })
Picto.find({ category: req.params.id_cat }) .then(function (pictos) {
.populate('expressions', { lang: supervisor.lang }) async.eachSeries(pictos, function(picto, next_cb) {
.then(function (pictos) {
async.eachSeries(pictos, function(picto, next_cb) { // check picto has expressions associated in student language
if (picto.expressions.length == 0 || picto.expressions[0].text.length == 0)
// check picto has expressions associated in student language return next_cb();
if (picto.expressions.length == 0 || picto.expressions[0].text.length == 0)
return next_cb(); // check picto image is available
picto.imageFileExists((found) => {
// check picto image is available if (found) {
picto.imageFileExists((found) => { l.push(picto);
if (found) { next_cb();
l.push(picto); }
next_cb(); else next_cb();
} });
else },
next_cb(); function (err) { // loop has end
}); if (err) throw err;
}, sails.log.debug(pictos.length + " pictos sent for category " + req.params.id_cat + " in language " + req.params.lang);
function (err) { // loop has end return res.ok(l);
if (err) throw err; }); // end async.eachSeries
sails.log.debug(pictos.length + " pictos sent for category " + req.params.id_cat + " in language " + supervisor.lang);
return res.ok(l);
}); // end async.eachSeries
})
.catch(() => res.badRequest());
} else {
return res.badRequest();
}
}) })
.catch(() => res.serverError()); .catch(() => res.badRequest());
}, },
/** /**
* Return all pictos from a category and subcategoriesusing the language * Return all pictos from a category and subcategoriesusing the language
* of the specified supervisor. * of the specified supervisor.
* @param {request} req {} (with supervisorId and categoryId as url parameters) * @param {request} req {} (with lang and categoryId as url parameters)
* @param {response} res * @param {response} res
* [ * [
* { * {
...@@ -147,55 +130,41 @@ module.exports = { ...@@ -147,55 +130,41 @@ module.exports = {
var l = []; var l = [];
var fs = require('fs'); var fs = require('fs');
// return empty for category 0 (that represents category pictos and all custom pictos) PictoCatTree
// if (req.params.id_cat == 0) .find({select: ['id_cat'], id_ancestor: req.params.id_cat })
// return res.ok(l); .then(function (categories) {
var filtered = [Number(req.params.id_cat)]; // Category itself
Supervisor.findOne({ id: req.params.id }).then(function (supervisor) { for(var i =0; i<categories.length;i++){ //All subcategories
if (supervisor) { filtered.push(categories[i].id_cat);
PictoCatTree
.find({select: ['id_cat'], id_ancestor: req.params.id_cat })
.then(function (categories) {
var filtered = [Number(req.params.id_cat)]; // Category itself
for(var i =0; i<categories.length;i++){ //All subcategories
filtered.push(categories[i].id_cat);
}
Picto.find({ category: filtered })
.paginate({ page: req.params.page, limit: req.params.limit})
.populate('expressions', { lang: supervisor.lang })
.then(function (pictos) {
async.eachSeries(pictos, function(picto, next_cb) {
// check picto has expressions associated in student language
if (picto.expressions.length == 0 || picto.expressions[0].text.length == 0)
return next_cb();
// check picto image is available
picto.imageFileExists((found) => {
if (found) {
l.push(picto);
next_cb();
}
else
next_cb();
});
},
function (err) { // loop has end
if (err) throw err;
sails.log.debug(pictos.length + " pictos sent for category " + req.params.id_cat + " in language " + supervisor.lang);
return res.ok(l);
}); // end async.eachSeries
})
.catch(() => res.badRequest());
return categories;
})
.catch(function (err) {
throw err;
});
} else {
return res.badRequest();
} }
Picto.find({ category: filtered })
.paginate({ page: req.params.page, limit: req.params.limit})
.populate('expressions', { lang: req.params.lang })
.then(function (pictos) {
async.eachSeries(pictos, function(picto, next_cb) {
// check picto has expressions associated in student language
if (picto.expressions.length == 0 || picto.expressions[0].text.length == 0)
return next_cb();
// check picto image is available
picto.imageFileExists((found) => {
if (found) {
l.push(picto);
next_cb();
}
else
next_cb();
});
},
function (err) { // loop has end
if (err) throw err;
sails.log.debug(pictos.length + " pictos sent for category " + req.params.id_cat + " in language " + req.params.lang);
return res.ok(l);
}); // end async.eachSeries
})
.catch(() => res.badRequest());
return categories;
}) })
.catch(() => res.serverError()); .catch(() => res.serverError());
}, },
...@@ -203,7 +172,7 @@ module.exports = { ...@@ -203,7 +172,7 @@ module.exports = {
/** /**
* Return own or public pictos using a search string from category * Return own or public pictos using a search string from category
* and subcategories using the language of the specified supervisor. * and subcategories using the language of the specified supervisor.
* @param {request} req {} (with supervisorId and categoryId as url parameters) * @param {request} req {} (with supervisorId, lang and categoryId as url parameters)
* @param {response} res * @param {response} res
* [ * [
* { * {
...@@ -226,34 +195,25 @@ module.exports = { ...@@ -226,34 +195,25 @@ module.exports = {
* ] * ]
*/ */
fromSearch: function (req, res) { fromSearch: function (req, res) {
Supervisor.findOne({ id: req.params.id }).then(function (supervisor) { if (req.params.id_cat == 0){ //Search in all categories
if (supervisor) { getPictos(0);
if (req.params.id_cat == 0){ //Search in all categories } else { //Get selected category and subcategories
getPictos(0, supervisor.lang, supervisor.id); PictoCatTree
}else{//Get selected category and subcategories .find({select: ['id_cat'], id_ancestor: req.params.id_cat })
PictoCatTree .then(function (categories) {
.find({select: ['id_cat'], id_ancestor: req.params.id_cat }) var filtered = [Number(req.params.id_cat)]; //Category itself
.then(function (categories) { for(var i =0; i<categories.length;i++) { //All subcategories
var filtered = [Number(req.params.id_cat)]; //Category itself filtered.push(categories[i].id_cat);
for(var i =0; i<categories.length;i++){ //All subcategories
filtered.push(categories[i].id_cat);
}
getPictos(filtered, supervisor.lang, supervisor.id);
})
.catch(function (err) {
throw err;
});
} }
} else { getPictos(filtered);
return res.badRequest(); })
} .catch(() => res.serverError());
}) }
.catch(() => res.serverError());
// //
// Get pictos within specified categories // Get pictos within specified categories
// //
function getPictos(categories, lang, sup_id){ function getPictos(categories, lang){
var l = []; var l = [];
var fs = require('fs'); var fs = require('fs');
...@@ -261,10 +221,10 @@ module.exports = { ...@@ -261,10 +221,10 @@ module.exports = {
var params = []; var params = [];
if(typeof categories == "object" ){ //Is an array if(typeof categories == "object" ){ //Is an array
sql="SELECT `picto_exp`.`id`, `picto_exp`.`id_pic`, `picto_exp`.`lang`, `picto_exp`.`text`, `picto`.`id`, `picto`.`uri`, `picto`.`id_src`, `picto`.`id_owner`, `picto`.`id_cat` FROM `picto_exp` INNER JOIN `picto` ON `picto_exp`.`id_pic` = `picto`.`id` WHERE `picto_exp`.`lang`=? AND `picto_exp`.`text` LIKE ? AND (`picto`.`id_owner` IS NULL OR `picto`.`id_owner`=?) AND `picto`.`id_src`=? AND `picto`.`id_cat` IN (?);"; sql="SELECT `picto_exp`.`id`, `picto_exp`.`id_pic`, `picto_exp`.`lang`, `picto_exp`.`text`, `picto`.`id`, `picto`.`uri`, `picto`.`id_src`, `picto`.`id_owner`, `picto`.`id_cat` FROM `picto_exp` INNER JOIN `picto` ON `picto_exp`.`id_pic` = `picto`.`id` WHERE `picto_exp`.`lang`=? AND `picto_exp`.`text` LIKE ? AND (`picto`.`id_owner` IS NULL OR `picto`.`id_owner`=?) AND `picto`.`id_src`=? AND `picto`.`id_cat` IN (?);";
params = [lang,'%'+req.params.text+'%', sup_id, req.params.source, categories]; params = [req.params.lang,'%'+req.params.text+'%', req.params.sup_id, req.params.source, categories];
}else{ }else{
sql= "SELECT `picto_exp`.`id`, `picto_exp`.`id_pic`, `picto_exp`.`lang`, `picto_exp`.`text`, `picto`.`id`, `picto`.`uri`, `picto`.`id_src`, `picto`.`id_owner`, `picto`.`id_cat` FROM `picto_exp` INNER JOIN `picto` ON `picto_exp`.`id_pic` = `picto`.`id` WHERE `picto_exp`.`lang`=? AND `picto_exp`.`text` LIKE ? AND (`picto`.`id_owner` IS NULL OR `picto`.`id_owner`=?) AND `picto`.`id_src`=?;"; sql= "SELECT `picto_exp`.`id`, `picto_exp`.`id_pic`, `picto_exp`.`lang`, `picto_exp`.`text`, `picto`.`id`, `picto`.`uri`, `picto`.`id_src`, `picto`.`id_owner`, `picto`.`id_cat` FROM `picto_exp` INNER JOIN `picto` ON `picto_exp`.`id_pic` = `picto`.`id` WHERE `picto_exp`.`lang`=? AND `picto_exp`.`text` LIKE ? AND (`picto`.`id_owner` IS NULL OR `picto`.`id_owner`=?) AND `picto`.`id_src`=?;";
params = [lang,'%'+req.params.text+'%', sup_id, req.params.source]; params = [req.params.lang,'%'+req.params.text+'%', req.params.sup_id, req.params.source];
} }
// PictoExp.find({lang: lang, text: { like: '%'+req.params.text+'%'}}) // PictoExp.find({lang: lang, text: { like: '%'+req.params.text+'%'}})
...@@ -335,40 +295,33 @@ module.exports = { ...@@ -335,40 +295,33 @@ module.exports = {
var fs = require('fs'); var fs = require('fs');
var cat = req.params.id_cat; var cat = req.params.id_cat;
Supervisor.findOne({ id: req.params.id }).then(function (supervisor) { Picto.find({ source: 1})
if (supervisor) { .paginate({page: req.params.page, limit:req.params.limit})
Picto.find({ source: 1}) .populate('expressions', { lang: req.params.lang })
.paginate({page: req.params.page, limit:req.params.limit}) .then(function (pictos) {
.populate('expressions', { lang: supervisor.lang }) async.eachSeries(pictos, function(picto, next_cb) {
.then(function (pictos) {
async.eachSeries(pictos, function(picto, next_cb) { // check picto has expressions associated in student language
if (picto.expressions.length == 0 || picto.expressions[0].text.length == 0)
// check picto has expressions associated in student language return next_cb();
if (picto.expressions.length == 0 || picto.expressions[0].text.length == 0)
return next_cb(); // check picto image is available
picto.imageFileExists((found) => {
// check picto image is available if (found) {
picto.imageFileExists((found) => { l.push(picto);
if (found) { next_cb();
l.push(picto); }
next_cb(); else
} next_cb();
else });
next_cb(); },
}); function (err) { // loop has end
}, if (err) throw err;
function (err) { // loop has end sails.log.debug(pictos.length + " pictos sent from SymbolStx in language " + req.params.lang);
if (err) throw err; return res.ok(l);
sails.log.debug(pictos.length + " pictos sent from SymbolStx in language " + supervisor.lang); }); // end async.eachSeries
return res.ok(l);
}); // end async.eachSeries
})
.catch(() => res.badRequest());
} else {
return res.badRequest();
}
}) })
.catch(() => res.serverError()); .catch(() => res.badRequest());
}, },
/** /**
...@@ -399,40 +352,32 @@ module.exports = { ...@@ -399,40 +352,32 @@ module.exports = {
var l = []; var l = [];
var fs = require('fs'); var fs = require('fs');
Supervisor.findOne({ id: req.params.id }).then(function (supervisor) { Picto.find({ source: 3})
if (supervisor) { .paginate({page: req.params.page, limit:req.params.limit})
Picto.find({ source: 3}) .populate('expressions', { lang: req.params.lang })
.paginate({page: req.params.page, limit:req.params.limit}) .then(function (pictos) {
.populate('expressions', { lang: supervisor.lang }) async.eachSeries(pictos, function(picto, next_cb) {
.then(function (pictos) {
async.eachSeries(pictos, function(picto, next_cb) { // check picto has expressions associated in student language
if (picto.expressions.length == 0 || picto.expressions[0].text.length == 0)
// check picto has expressions associated in student language return next_cb();
if (picto.expressions.length == 0 || picto.expressions[0].text.length == 0)
return next_cb(); // check picto image is available
picto.imageFileExists((found) => {
// check picto image is available if (found) {
picto.imageFileExists((found) => { l.push(picto);
if (found) { next_cb();
l.push(picto); }
next_cb(); else next_cb();
} });
else },
next_cb(); function (err) { // loop has end
}); if (err) throw err;
}, sails.log.debug(pictos.length + " pictos sent from Arasaac in language " + req.params.lang);
function (err) { // loop has end return res.ok(l);
if (err) throw err; }); // end async.eachSeries
sails.log.debug(pictos.length + " pictos sent from Arasaac in language " + supervisor.lang);
return res.ok(l);
}); // end async.eachSeries
})
.catch(() => res.badRequest());
} else {
return res.badRequest();
}
}) })
.catch(() => res.serverError()); .catch(() => res.badRequest());
}, },
/** /**
......
...@@ -591,7 +591,7 @@ module.exports = { ...@@ -591,7 +591,7 @@ module.exports = {
PictoExp.findOne({id_pic: sp.picto.id, lang: sp.student.lang}) PictoExp.findOne({id_pic: sp.picto.id, lang: sp.student.lang})
.then(pe => { .then(pe => {
if (typeof sp.attributes.expression == 'undefined' || sp.attributes.expression == null) if (typeof sp.attributes.expression == 'undefined' || sp.attributes.expression == null)
sp.attributes.expression = pe.text; sp.attributes.expression = pe.text;
sp.student = sp.student.id; sp.student = sp.student.id;
delete sp.picto.expressions; delete sp.picto.expressions;
cb(null,sp); cb(null,sp);
......
...@@ -51,10 +51,10 @@ dashboardControllers.controller('AddPictoCtrl', function ( ...@@ -51,10 +51,10 @@ dashboardControllers.controller('AddPictoCtrl', function (
var request = ""; var request = "";
if(categoryId == 0){ if(categoryId == 0){
//Request page X from all pictos (symbolstx) //Request page X from all pictos (symbolstx)
request = config.backend + '/sup/' + supervisor.id + request = config.backend + '/picto/' + student.lang +
'/pic_fromSymbolStx/page/'+$scope.page+'/limit/'+$scope.limit; '/pic_fromSymbolStx/page/'+$scope.page+'/limit/'+$scope.limit;
}else{ }else{
request = config.backend + '/sup/' + supervisor.id + request = config.backend + '/picto/' + student.lang +
'/pic_fromCatSubcat/category/'+categoryId+'/page/'+$scope.page+'/limit/'+$scope.limit; '/pic_fromCatSubcat/category/'+categoryId+'/page/'+$scope.page+'/limit/'+$scope.limit;
} }
$http.get(request) $http.get(request)
...@@ -96,7 +96,7 @@ dashboardControllers.controller('AddPictoCtrl', function ( ...@@ -96,7 +96,7 @@ dashboardControllers.controller('AddPictoCtrl', function (
var request = ""; var request = "";
//Request page X from all pictos (symbolstx) //Request page X from all pictos (symbolstx)
request = config.backend + '/sup/' + supervisor.id + request = config.backend + '/picto/' + student.lang +
'/pic_fromArasaac/page/'+$scope.page+'/limit/'+$scope.limit; '/pic_fromArasaac/page/'+$scope.page+'/limit/'+$scope.limit;
$http.get(request) $http.get(request)
...@@ -142,7 +142,7 @@ dashboardControllers.controller('AddPictoCtrl', function ( ...@@ -142,7 +142,7 @@ dashboardControllers.controller('AddPictoCtrl', function (
// //
$scope.load_category = function (categoryId){ $scope.load_category = function (categoryId){
$scope.page = 1; $scope.page = 1;
$http.get(config.backend+'/sup/'+ supervisor.id +'/pic_categories/' + categoryId) $http.get(config.backend + '/picto/' + student.lang + '/pic_categories/' + categoryId)
.success(function(data, status, headers, config) { .success(function(data, status, headers, config) {
// Add to list // Add to list
if (data && $scope.source == 'symbolstx'){ if (data && $scope.source == 'symbolstx'){
...@@ -335,16 +335,16 @@ dashboardControllers.controller('AddPictoCtrl', function ( ...@@ -335,16 +335,16 @@ dashboardControllers.controller('AddPictoCtrl', function (
if($scope.source == "symbolstx"){ if($scope.source == "symbolstx"){
if($scope.breadcrumbs.length == 1) { if($scope.breadcrumbs.length == 1) {
//Request page X from all pictos (symbolstx) //Request page X from all pictos (symbolstx)
request = config.backend + '/sup/' + supervisor.id + request = config.backend + '/picto/' + student.lang +
'/pic_fromSymbolStx/page/'+$scope.page+'/limit/'+$scope.limit; '/pic_fromSymbolStx/page/'+$scope.page+'/limit/'+$scope.limit;
}else{ }else{
request = config.backend + '/sup/' + supervisor.id + request = config.backend + '/picto/' + student.lang +
'/pic_fromCatSubcat/category/'+$scope.breadcrumbs[$scope.breadcrumbs.length-1].id '/pic_fromCatSubcat/category/'+$scope.breadcrumbs[$scope.breadcrumbs.length-1].id
+'/page/'+$scope.page+'/limit/'+$scope.limit; +'/page/'+$scope.page+'/limit/'+$scope.limit;
} }
}else if($scope.source == "arasaac"){ }else if($scope.source == "arasaac"){
//Request page X from all pictos (symbolstx) //Request page X from all pictos (symbolstx)
request = config.backend + '/sup/' + supervisor.id + request = config.backend + '/picto/' + student.lang +
'/pic_fromArasaac/page/'+$scope.page+'/limit/'+$scope.limit; '/pic_fromArasaac/page/'+$scope.page+'/limit/'+$scope.limit;
} }
...@@ -399,7 +399,7 @@ dashboardControllers.controller('AddPictoCtrl', function ( ...@@ -399,7 +399,7 @@ dashboardControllers.controller('AddPictoCtrl', function (
}else if($scope.source == "arasaac"){ }else if($scope.source == "arasaac"){
source = 3; source = 3;
} }
request = config.backend + '/sup/' + supervisor.id + request = config.backend + '/picto/' + student.lang + '/' + supervisor.id +
'/pic_fromSearch/'+$scope.srch_term_picto+'/category/'+category+ '/pic_fromSearch/'+$scope.srch_term_picto+'/category/'+category+
'/source/'+source; '/source/'+source;
......
...@@ -59,6 +59,13 @@ module.exports.routes = { ...@@ -59,6 +59,13 @@ module.exports.routes = {
'GET /office/get/:id': 'OfficeController.get', 'GET /office/get/:id': 'OfficeController.get',
'GET /office/get/:id/supervisors': 'OfficeController.supervisors', 'GET /office/get/:id/supervisors': 'OfficeController.supervisors',
'GET /picto/:lang/pic_categories/:id_cat': 'PictoController.categories',
'GET /picto/:lang/pic_fromcategory/:id_cat': 'PictoController.fromcategory',
'GET /picto/:lang/pic_fromSymbolStx/page/:page/limit/:limit': 'PictoController.fromSymbolStx',
'GET /picto/:lang/pic_fromArasaac/page/:page/limit/:limit': 'PictoController.fromArasaac',
'GET /picto/:lang/pic_fromCatSubcat/category/:id_cat/page/:page/limit/:limit': 'PictoController.fromCatSubcat',
'GET /picto/:lang/:id_sup/pic_fromSearch/:text/category/:id_cat/source/:source': 'PictoController.fromSearch',
'POST /picto/upload': 'PictoController.upload', 'POST /picto/upload': 'PictoController.upload',
'POST /picto/tag': 'PictoController.add_tag', 'POST /picto/tag': 'PictoController.add_tag',
'POST /picto/exp': 'PictoController.change_exp', 'POST /picto/exp': 'PictoController.change_exp',
...@@ -74,6 +81,7 @@ module.exports.routes = { ...@@ -74,6 +81,7 @@ module.exports.routes = {
'GET /stu/:id_stu/tutors': 'StudentController.tutors', 'GET /stu/:id_stu/tutors': 'StudentController.tutors',
'POST /stu/:id_stu/sup/:id_sup': 'StudentController.link_supervisor', 'POST /stu/:id_stu/sup/:id_sup': 'StudentController.link_supervisor',
'GET /stu/:id_stu/pictos': 'StudentController.pictos', 'GET /stu/:id_stu/pictos': 'StudentController.pictos',
'GET /stu/:id_stu/methods': 'StudentController.methods', 'GET /stu/:id_stu/methods': 'StudentController.methods',
'GET /stu/:id_stu/lasttries': 'StudentController.lasttries', 'GET /stu/:id_stu/lasttries': 'StudentController.lasttries',
'GET /stu/:id_stu/tries': 'StudentController.tries', 'GET /stu/:id_stu/tries': 'StudentController.tries',
...@@ -105,12 +113,7 @@ module.exports.routes = { ...@@ -105,12 +113,7 @@ module.exports.routes = {
'GET /sup/all': 'SupervisorController.list', 'GET /sup/all': 'SupervisorController.list',
'GET /sup/:id/students': 'SupervisorController.students', 'GET /sup/:id/students': 'SupervisorController.students',
'GET /sup/:id/pictos': 'SupervisorController.pictos', 'GET /sup/:id/pictos': 'SupervisorController.pictos',
'GET /sup/:id/pic_categories/:id_cat': 'PictoController.categories',
'GET /sup/:id/pic_fromcategory/:id_cat': 'PictoController.fromcategory',
'GET /sup/:id/pic_fromSymbolStx/page/:page/limit/:limit': 'PictoController.fromSymbolStx',
'GET /sup/:id/pic_fromArasaac/page/:page/limit/:limit': 'PictoController.fromArasaac',
'GET /sup/:id/pic_fromCatSubcat/category/:id_cat/page/:page/limit/:limit': 'PictoController.fromCatSubcat',
'GET /sup/:id/pic_fromSearch/:text/category/:id_cat/source/:source': 'PictoController.fromSearch',
'GET /sup/email/:email': 'SupervisorController.getByEmail', 'GET /sup/email/:email': 'SupervisorController.getByEmail',
'GET /sup/changepass/:email': 'SupervisorController.request_change_password', 'GET /sup/changepass/:email': 'SupervisorController.request_change_password',
'GET /sup/arasaac_license/:id': 'SupervisorController.accept_arasaac', 'GET /sup/arasaac_license/:id': 'SupervisorController.accept_arasaac',
......
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