- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
04-07-2016 03:32 PM
Hello Community,
I have a question. I am trying to query a certain role and return a true statement when a user has that certain role. What am I doing wrong?
Here is the script I am trying to work with
function userHasRole(UserID, role){
var roles = new GlideRecord('sys_user_has_role');
roles.addQuery('user', userID);
roles.addQuery('role.name', change_manager);
roles.query();
if (roles == change_manager){
return 'true';
}
return 'false';
}
Also you can have a function within a function right? Here is the whole code I am working on:
answer = ifScript();
function ifScript() {
//answer = 'false';
var userID = gs.getUserID();
gs.log("work start check for " + userID + " assigned_to " + current.assigned_to);
if (userID == current.assigned_to) {
return 'true'; }
// query to see if userID has role change management, if so return true
function userHasRole(UserID, role){
var roles = new GlideRecord('sys_user_has_role');
roles.addQuery('user', userID);
roles.addQuery('role.name', change_manager);
roles.query();
if (roles == change_manager){
return 'true';
}
}
}
return 'false';
Thanks in advanced.
Solved! Go to Solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
04-08-2016 01:50 PM
Hello Everyone,
So I managed to hash it out. Here is the code:
answer = ifScript();
function ifScript() {
//answer = 'false';
var userID = gs.getUserID();
gs.log("work start check for " + userID + " assigned_to " + current.assigned_to);
if (userID == current.assigned_to) {
return 'true'; }
// query to see if userID has role change management, if so return true
var cm_role = new GlideRecord('sys_user_role');
cm_role.addQuery('name', "change_management");
cm_role.query();
while (cm_role.next()) {
var roles = new GlideRecord('sys_user_has_role');
roles.addQuery('user', userID);
roles.addQuery('role', cm_role.sys_id);
roles.query();
while (roles.next()){
gs.log("work start role check for " + userID + " has role " + cm_role.name);
return true;
}
}
gs.log("end of work start role check for " + userID + ", no writing allowed" );
return false;
}
The errors were as follows:
- I had to only use one "answer". In one variation of the code I had two answers, I could piggy back of the first answer argument.
- turns out that sys_user_has_role doesnt have a table named "name". This is why I had to query the name from the sys_user_role table while grabbing the sys_id of the name of the sys_user_role and populate that in line 20 of the code.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
04-07-2016 03:50 PM
Hi Orlando,
Try this code for your function:
function userHasRole(UserID, thisRole){
var roles = new GlideRecord('sys_user_has_role');
roles.addQuery('user', userID);
roles.addQuery('role.name', thisRole);
roles.setLimit(1);
roles.query();
if (roles.next()){
return true;
}
else{
return false;
}
}
I think role might be a reserved word, so I've used 'thisRole' as the function argument.
I've referenced 'thisRole' in the query condition, where you had referenced the change_manager role directly.
I've used 'if (roles.next())' to test if there are any results in the query that meet your conditions.
Hope this helps.
Jamie.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
04-07-2016 06:07 PM
Hello Jamie,
Thank you for your prompt reply. I tried your following code and I am not sure where my problem lies. Please let me know what advice you would recommend.
answer = ifScript();
function ifScript() {
//answer = 'false';
var userID = gs.getUserID();
gs.log("work start check for " + userID + " assigned_to " + current.assigned_to);
if (userID == current.assigned_to) {
return 'true'; }
// query to see if userID has role change management, if so return true
function userHasRole(UserID, thisRole){
var roles = new GlideRecord('sys_user_has_role');
roles.addQuery('user', userID);
roles.addQuery(role.name, 'change_management');
roles.setLimit(1);
roles.query();
if (roles.next()){
return true;
}
}
return false;
}
Thank you!
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
04-08-2016 01:09 AM
Hi Orlando,
What problem are you seeing?
What is the output from gs.log?
Is the function userHasRole() intended to be called, if so where from?
Best Regards
Tony
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
04-08-2016 11:51 AM
hello Tony,
It is being used on a ACL for a certain variable on a Change Request.
This is the log
org.mozilla.javascript.EcmaError: "role" is not defined. |
Caused by error in <refname> at line 18
15: var roles = new GlideRecord('sys_user_has_role');
16: //var UserID = gs.getUserID();
17: roles.addQuery('user', gs.getUserID());
==> 18: roles.addQuery(role.name, thisRole);
19: roles.setLimit(2);
20: roles.query();
21: var userIsAChangeManager = userHasRole(UserID, 'change_management');
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
04-08-2016 02:12 AM
Hi Orlando,
Your line 17 should reference thisRole, not 'change_management'.
Then you can pass in 'change_management' or any other role as a parameter when you call the function:
eg
var userIsAChangeManager = userHasRole(UserID, 'change_management');
Jamie.