How to query a certain user's role

humblecommitted
Kilo Guru

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.

1 ACCEPTED SOLUTION

humblecommitted
Kilo Guru

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:


  1. 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.
  2. 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.

View solution in original post

21 REPLIES 21

Jamsta1912
Tera Guru

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.


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!


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


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');


Jamsta1912
Tera Guru

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.