Hello
I am looking for a way to test "assignee in membersOfProjectRole(PROJECTKEY)" as standard "membersOf" is restricted to JIRA groups.
I have found a pending request: https://jira.atlassian.com/browse/JRASERVER-21711
And some example code at https://mraddon.blog/2016/02/17/jql-custom-function-userinrole-with-groovy-for-jira/ and https://mraddon.blog/2017/01/03/lastcommentcontains-jql-function-for-jira-7-2-scriptrunner/
May you please provide updated code of this function for JIRA 7.6/7.7 ?
@Adaptavist SuppWould it be possible for this JQL function to be included in plugin itself ?
Thank you in advance for your help
package com.onresolve.jira.groovy.jqlimport com.atlassian.jira.issue.Issueimport com.atlassian.jira.ComponentManagerimport com.atlassian.jira.ComponentManagerimport com.atlassian.jira.component.ComponentAccessorimport com.atlassian.jira.issue.Issueimport com.atlassian.jira.issue.search.SearchProviderimport com.atlassian.jira.jql.operand.QueryLiteralimport com.atlassian.jira.jql.parser.JqlQueryParserimport com.atlassian.jira.jql.query.RangeQueryFactoryimport com.atlassian.jira.util.MessageSetImplimport com.atlassian.jira.web.bean.PagerFilterimport com.atlassian.query.operand.FunctionOperandimport com.atlassian.query.operator.Operatorimport org.apache.log4j.Categoryimport com.atlassian.jira.util.MessageSetimport com.atlassian.crowd.embedded.api.Userimport com.atlassian.query.clause.TerminalClauseimport com.atlassian.jira.jql.query.QueryCreationContextimport org.apache.lucene.document.NumberToolsimport org.apache.lucene.index.Termimport org.apache.lucene.search.Queryimport org.apache.lucene.search.TermQueryimport com.onresolve.jira.groovy.jql.AbstractScriptedJqlFunctionimport org.apache.lucene.search.BooleanClauseimport org.apache.lucene.search.BooleanQueryimport org.apache.lucene.search.Queryimport org.apache.lucene.search.TermQueryimport com.atlassian.jira.issue.fields.CustomFieldimport com.atlassian.jira.issue.CustomFieldManagerimport com.atlassian.jira.component.ComponentAccessorimport com.atlassian.jira.user.ApplicationUser;import com.atlassian.jira.security.JiraAuthenticationContext;import com.atlassian.jira.security.roles.*import com.atlassian.jira.project.ProjectManagerimport com.atlassian.jira.project.Projectimport com.atlassian.jira.issue.comments.CommentManagerimport com.atlassian.jira.bc.issue.search.SearchServiceimport com.atlassian.jira.component.ComponentAccessorimport com.atlassian.jira.jql.parser.JqlQueryParserimport com.atlassian.jira.jql.query.LuceneQueryBuilderimport com.atlassian.jira.jql.query.QueryCreationContextimport com.atlassian.jira.jql.validator.NumberOfArgumentsValidatorimport com.atlassian.jira.user.ApplicationUserimport com.atlassian.jira.util.MessageSetimport com.atlassian.query.clause.TerminalClauseimport com.atlassian.query.operand.FunctionOperandimport groovy.util.logging.Log4jimport org.apache.lucene.search.Queryimport java.text.MessageFormatclass LastCommentContains extends AbstractScriptedJqlFunction implements JqlQueryFunction{ def queryParser = ComponentAccessor.getComponent(JqlQueryParser) def luceneQueryBuilder = ComponentAccessor.getComponent(LuceneQueryBuilder) def searchService = ComponentAccessor.getComponent(SearchService)@Override String getDescription() { "Function to validate if the last comment contains certain text" }@Override List<Map> getArguments() { [ [ "description": "Subquery", "optional": false], [ "contains": "phrase", "optional": false] ] }@Override String getFunctionName() { "LastCommentContains" } 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(); ApplicationUser applicationUser = context.getLoggedInUser(); def booleanQuery = new BooleanQuery() issues = getIssues(operand.args[0], applicationUser) def comments def lastcommen String lastcomment String texttofind issues.each {Issue issue -> try{ comments = ComponentAccessor.commentManager.getComments(issue) if (comments) { lastcommen = comments.last(); lastcomment = lastcommen.body.toLowerCase(); texttofind = operand.args[1].toLowerCase() if ( lastcomment.contains(texttofind) ) { booleanQuery.add(new TermQuery(new Term("issue_id", issue.id as String)), BooleanClause.Occur.SHOULD) } } }catch(NullPointerException NPE){ } } return booleanQuery }}
Invocation: issuefunction in lastCommentContains("project = 'XXX'","text_to_search")
Best regards!
The code for UserInRole JQL function:
package com.onresolve.jira.groovy.jqlimport com.atlassian.jira.issue.Issueimport com.atlassian.jira.ComponentManagerimport com.atlassian.jira.ComponentManagerimport com.atlassian.jira.component.ComponentAccessorimport com.atlassian.jira.issue.Issueimport com.atlassian.jira.issue.search.SearchProviderimport com.atlassian.jira.jql.operand.QueryLiteralimport com.atlassian.jira.jql.parser.JqlQueryParserimport com.atlassian.jira.jql.query.RangeQueryFactoryimport com.atlassian.jira.util.MessageSetImplimport com.atlassian.jira.web.bean.PagerFilterimport com.atlassian.query.operand.FunctionOperandimport com.atlassian.query.operator.Operatorimport org.apache.log4j.Categoryimport com.atlassian.jira.util.MessageSetimport com.atlassian.crowd.embedded.api.Userimport com.atlassian.query.clause.TerminalClauseimport com.atlassian.jira.jql.query.QueryCreationContextimport org.apache.lucene.document.NumberToolsimport org.apache.lucene.index.Termimport org.apache.lucene.search.Queryimport org.apache.lucene.search.TermQueryimport com.onresolve.jira.groovy.jql.AbstractScriptedJqlFunctionimport org.apache.lucene.search.BooleanClauseimport org.apache.lucene.search.BooleanQueryimport org.apache.lucene.search.Queryimport org.apache.lucene.search.TermQueryimport com.atlassian.jira.issue.fields.CustomFieldimport com.atlassian.jira.issue.CustomFieldManagerimport com.atlassian.jira.component.ComponentAccessorimport com.atlassian.jira.user.ApplicationUser;import com.atlassian.jira.security.JiraAuthenticationContext;import com.atlassian.jira.security.roles.*import com.atlassian.jira.project.ProjectManagerimport com.atlassian.jira.project.Projectclass 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","optional": false], ["field": "assignee","optional": false], ["role": "Product Owner","optional": false] ] }@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(); ProjectManager projectManager = ComponentAccessor.getProjectManager() ProjectRoleManager projectRoleManager = ComponentAccessor.getComponent(ProjectRoleManager.class) //ProjectRoleManager projectRoleManager = ComponentAccessor.getProjectRoleManager() ApplicationUser applicationUser = context.getLoggedInUser(); 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 }}
Usage: issuefunction in UserInRole("project='xxx'","assignee","Administrators")
@Raul Pelaez _QUABU SOLUTIONS_ can you provide updated code of this function for JIRA 8 ?
Ok Dmitry I will try!
New source code for Jira 8
Syntax example:
issuefunction in UserInRole("project = JIRA",assignee,Administrators)
Here the code:
package com.onresolve.jira.groovy.jql
import com.atlassian.jira.issue.Issueimport com.atlassian.jira.component.ComponentAccessorimport com.atlassian.jira.issue.Issueimport com.atlassian.jira.issue.search.SearchProviderimport com.atlassian.jira.jql.operand.QueryLiteralimport com.atlassian.jira.jql.parser.JqlQueryParserimport com.atlassian.jira.jql.query.RangeQueryFactoryimport com.atlassian.jira.util.MessageSetImplimport com.atlassian.jira.web.bean.PagerFilterimport com.atlassian.query.operand.FunctionOperandimport com.atlassian.query.operator.Operatorimport org.apache.log4j.Categoryimport com.atlassian.jira.util.MessageSetimport com.atlassian.crowd.embedded.api.Userimport com.atlassian.query.clause.TerminalClauseimport com.atlassian.jira.jql.query.QueryCreationContextimport org.apache.lucene.index.Termimport org.apache.lucene.search.Queryimport org.apache.lucene.search.TermQueryimport com.onresolve.jira.groovy.jql.AbstractScriptedJqlFunctionimport org.apache.lucene.search.BooleanClauseimport org.apache.lucene.search.BooleanQueryimport org.apache.lucene.search.Queryimport org.apache.lucene.search.TermQueryimport com.atlassian.jira.issue.fields.CustomFieldimport com.atlassian.jira.issue.CustomFieldManagerimport com.atlassian.jira.component.ComponentAccessorimport com.atlassian.jira.user.ApplicationUser;import com.atlassian.jira.security.JiraAuthenticationContext;import com.atlassian.jira.security.roles.*import com.atlassian.jira.project.ProjectManagerimport com.atlassian.jira.project.Project
class UserInRole extends AbstractScriptedJqlFunction implements JqlQueryFunction{@OverrideString getDescription() {"Function to know if user is in any project role of the parameter"}
@OverrideList<Map> getArguments() {[["description": "Subquery","optional": false],["field": "assignee","optional": false],["role": "Product Owner","optional": false]]}
@OverrideString getFunctionName() {"UserInRole"}
def String subquery//@OverrideMessageSet validate(User user, FunctionOperand operand, TerminalClause terminalClause) {def messageSet = new MessageSetImpl()return messageSet}
@OverrideQuery getQuery(QueryCreationContext queryCreationContext, FunctionOperand operand, TerminalClause terminalClause) {
JiraAuthenticationContext context = ComponentAccessor.getJiraAuthenticationContext();ProjectManager projectManager = ComponentAccessor.getProjectManager()ProjectRoleManager projectRoleManager = ComponentAccessor.getComponent(ProjectRoleManager.class)ApplicationUser applicationUser = context.getLoggedInUser();ProjectRoleActors projectRoleActors = null;//JIRA 8BooleanQuery.Builder boolQueryBuilder = new BooleanQuery.Builder();def typeuserissues = 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()elsetypeuser = issue.getReporter()if ( projectRoleActors.getUsers().contains(typeuser) ) {boolQueryBuilder.add(new TermQuery(new Term("issue_id", issue.id as String)), BooleanClause.Occur.SHOULD)}}catch(NullPointerException NPE){}}return boolQueryBuilder.build();}
}
It looks like you're new here. Sign in or register to get started.