JQL Syntax sample:
- project = XXX AND issueFunction in UserInRole(” “, assignee, “Developer”) // note the space in the first parameter, this syntax is less efficient
- issueFunction in UserInRole(” project = XXX “, assignee, “Developer”) //more efficient
- issueFunction in UserInRole(” project = XXX “, reporter, “Developer”)
package com.onresolve.jira.groovy.jql import com.atlassian.jira.issue.Issue import com.atlassian.jira.ComponentManager import com.atlassian.jira.ComponentManager import com.atlassian.jira.component.ComponentAccessor import com.atlassian.jira.issue.Issue import com.atlassian.jira.issue.search.SearchProvider import com.atlassian.jira.jql.operand.QueryLiteral import com.atlassian.jira.jql.parser.JqlQueryParser import com.atlassian.jira.jql.query.RangeQueryFactory import com.atlassian.jira.util.MessageSetImpl import com.atlassian.jira.web.bean.PagerFilter import com.atlassian.query.operand.FunctionOperand import com.atlassian.query.operator.Operator import org.apache.log4j.Category import com.atlassian.jira.util.MessageSet import com.atlassian.crowd.embedded.api.User import com.atlassian.query.clause.TerminalClause import com.atlassian.jira.jql.query.QueryCreationContext import org.apache.lucene.document.NumberTools import org.apache.lucene.index.Term import org.apache.lucene.search.Query import org.apache.lucene.search.TermQuery import com.onresolve.jira.groovy.jql.AbstractScriptedJqlFunction import org.apache.lucene.search.BooleanClause import org.apache.lucene.search.BooleanQuery import org.apache.lucene.search.Query import org.apache.lucene.search.TermQuery import com.atlassian.jira.issue.fields.CustomField import com.atlassian.jira.issue.CustomFieldManager import com.atlassian.jira.component.ComponentAccessor import com.atlassian.jira.user.ApplicationUser; import com.atlassian.jira.security.JiraAuthenticationContext; import com.atlassian.jira.security.roles.* import com.atlassian.jira.project.ProjectManager import com.atlassian.jira.project.Project class UserInRole extends AbstractScriptedJqlFunction implements JqlQueryFunction{ @Override String getDescription() { "Function to know if user is in any project role of the parameter" } @Override List<Map> getArguments() { [ [ "description": "Subquery", "field": "assignee or reporter", "role": "Role X" ] ] } @Override String getFunctionName() { "UserInRole" } def String subquery //@Override MessageSet validate(User user, FunctionOperand operand, TerminalClause terminalClause) { def messageSet = new MessageSetImpl() return messageSet } @Override Query getQuery(QueryCreationContext queryCreationContext, FunctionOperand operand, TerminalClause terminalClause) { JiraAuthenticationContext context = ComponentAccessor.getJiraAuthenticationContext(); ComponentManager componentManager=ComponentManager.getInstance() ProjectManager projectManager = componentManager.getProjectManager() ProjectRoleManager projectRoleManager = ComponentManager.getComponentInstanceOfType(ProjectRoleManager.class) ApplicationUser applicationUser = context.getUser(); ProjectRoleActors projectRoleActors = null; def booleanQuery = new BooleanQuery() def typeuser issues = getIssues(operand.args[0], applicationUser) issues.each {Issue issue -> try{ projectRoleActors = projectRoleManager.getProjectRoleActors(projectRoleManager.getProjectRole(operand.args[2]), issue.getProjectObject()) if (operand.args[1] == "assignee" ) typeuser = issue.getAssignee() else typeuser = issue.getReporter() if ( projectRoleActors.getUsers().contains(typeuser) ) { booleanQuery.add(new TermQuery(new Term("issue_id", issue.id as String)), BooleanClause.Occur.SHOULD) } }catch(NullPointerException NPE){ } } return booleanQuery } }
Which version of Jira support this feature and where this should be implemented?
LikeLike
Version 6.3.15 to 7.1.2 and more. This must be implemented with the plugin ScriptRunner.
See this: https://jirasupport.wordpress.com/2015/08/27/how-to-add-new-custom-jql-function-with-scriptrunner/
Otherwise you can implement a plugin JIRA native.
See this: https://jirasupport.wordpress.com/2016/03/24/tutorial-adding-a-jql-function-to-jira-6-7/
LikeLike
Unfortunately this doesnt work
After installing the script and the scan successfully added it as a custom jql function
issueFunction in UserInRole(” project = XXX “, reporter, “Developer”)
Error in the JQL Query: Expecting ‘)’ or ‘,’ but got ‘project’. (line 1, character 31)
😦
LikeLike
Sendme the script to my mail raulpelaez@gmail.com
LikeLike
Use project = ‘XXX’
LikeLike
And “reporter”
LikeLike
Thank you very much, it works like a charm!
For the user: Pay attention to put the correct name of the project role and also try to do a ‘good’ JQL query as the first parameter because it will check the role condition for every issue that it will find with that.
LikeLiked by 1 person
Hi Luca, take care because the code must be a little different in JIRA 7.2. See this post https://jirasupport.wordpress.com/2017/01/03/lastcommentcontains-jql-function-for-jira-7-2-scriptrunner/ and this other https://jirasupport.wordpress.com/2016/12/27/migrating-groovy-scripts-from-jira-6-to-jira-7/ Best regards!
LikeLike
Do i need to do any changes in the above code .
“role”: “Role X” do i need to put the roles in X ?
LikeLiked by 1 person
DO i need to do any changes in the code.
such as here :
“role”: “Role X”
LikeLiked by 1 person
Hi Abyaktatech, take care because the code must be a little different in JIRA 7.x. See this post https://jirasupport.wordpress.com/2017/01/03/lastcommentcontains-jql-function-for-jira-7-2-scriptrunner/ and this other https://jirasupport.wordpress.com/2016/12/27/migrating-groovy-scripts-from-jira-6-to-jira-7/ Best regards!
LikeLike
Hi,
The above code doesn’t work for me. I am using jira7.5.1. when I scan the Script JQL Functions it gives me ‘Success, no function added or removed”. Can you please guide. Please is the code I have, let me know what am i missing.
Thanks,
Deepali
package com.onresolve.jira.groovy.jql
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.ComponentManager
import com.atlassian.jira.ComponentManager
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.issue.search.SearchProvider
import com.atlassian.jira.jql.operand.QueryLiteral
import com.atlassian.jira.jql.parser.JqlQueryParser
import com.atlassian.jira.jql.query.RangeQueryFactory
import com.atlassian.jira.util.MessageSetImpl
import com.atlassian.jira.web.bean.PagerFilter
import com.atlassian.query.operand.FunctionOperand
import com.atlassian.query.operator.Operator
import org.apache.log4j.Category
import com.atlassian.jira.util.MessageSet
import com.atlassian.crowd.embedded.api.User
import com.atlassian.query.clause.TerminalClause
import com.atlassian.jira.jql.query.QueryCreationContext
import org.apache.lucene.document.NumberTools
import org.apache.lucene.index.Term
import org.apache.lucene.search.Query
import org.apache.lucene.search.TermQuery
import com.onresolve.jira.groovy.jql.AbstractScriptedJqlFunction
import org.apache.lucene.search.BooleanClause
import org.apache.lucene.search.BooleanQuery
import org.apache.lucene.search.Query
import org.apache.lucene.search.TermQuery
import com.atlassian.jira.issue.fields.CustomField
import com.atlassian.jira.issue.CustomFieldManager
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.user.ApplicationUser;
import com.atlassian.jira.security.JiraAuthenticationContext;
import com.atlassian.jira.security.roles.*
import com.atlassian.jira.project.ProjectManager
import com.atlassian.jira.project.Project
class UserInRole extends AbstractScriptedJqlFunction implements JqlQueryFunction{
@Override
String getDescription() {
“Function to know if user is in any project role of the parameter”
}
@Override
List getArguments() {
[
[
[
description: “Subquery”,
optional: false,
]
“field”: “assignee or reporter”,
“role”: “Role X”
]
]
}
@Override
String getFunctionName() {
“UserInRole”
}
def String subquery
//@Override
MessageSet validate(User user, FunctionOperand operand, TerminalClause terminalClause) {
def messageSet = new MessageSetImpl()
return messageSet
}
@Override
Query getQuery(QueryCreationContext queryCreationContext, FunctionOperand operand, TerminalClause terminalClause) {
JiraAuthenticationContext context = ComponentAccessor.getJiraAuthenticationContext();
ComponentManager componentManager=ComponentManager.getInstance()
ProjectManager projectManager = componentManager.getProjectManager()
ProjectRoleManager projectRoleManager = ComponentManager.getComponentInstanceOfType(ProjectRoleManager.class)
ApplicationUser applicationUser = context.getUser();
ProjectRoleActors projectRoleActors = null;
def booleanQuery = new BooleanQuery()
def typeuser
issues = getIssues(operand.args[0], applicationUser)
issues.each {Issue issue ->
try{
projectRoleActors = projectRoleManager.getProjectRoleActors(projectRoleManager.getProjectRole(operand.args[2]), issue.getProjectObject())
if (operand.args[1] == “assignee” )
typeuser = issue.getAssignee()
else
typeuser = issue.getReporter()
if ( projectRoleActors.getUsers().contains(typeuser) ) {
booleanQuery.add(new TermQuery(new Term(“issue_id”, issue.id as String)), BooleanClause.Occur.SHOULD)
}
}catch(NullPointerException NPE){
}
}
return booleanQuery
}
}
LikeLike
Hi Deepali,
You must read this post https://mraddon.blog/2017/01/03/lastcommentcontains-jql-function-for-jira-7-2-scriptrunner/
The code must be a little different in your Jira version
Regards
LikeLike
New updated code:
https://community.atlassian.com/t5/Adaptavist-questions/Custom-JQL-function-membersOfProjectRole/qaq-p/717026#U851261
LikeLike
New source code for Jira 8
Syntax example:
Here the code:
LikeLiked by 1 person