Hi all,
Im trying to pal up with jql functions and write a function to catch the issues with inactive users in some single user picker field. In the internet I've found this code, but cannot figure it out how to use it in my case (not reporter / assignee, but any other field. For example, issueFunction in HasInactiveUser('Manager')
Could you please help with this?
Thank you!
class HasInactiveAssignee extends AbstractScriptedJqlFunction implements JqlQueryFunction{ @Override String getDescription() { "Function to show only the inactive users" } @Override List<Map> getArguments() { [ [ "description": "Subquery", "optional": false, ] ] } @Override String getFunctionName() { "hasInactiveAssignee" } 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) { //User user=ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser(); JiraAuthenticationContext context = ComponentAccessor.getJiraAuthenticationContext(); ApplicationUser applicationUser = context.getUser(); def booleanQuery = new BooleanQuery() issues = getIssues(operand.args[0], applicationUser) issues.each {Issue issue -> try{ def active = issue.assignee.isActive() if ( !active ) booleanQuery.add(new TermQuery(new Term("issue_id", issue.id as String)), BooleanClause.Occur.SHOULD) }catch(NullPointerException NPE){ } } return booleanQuery } }
So, first things first: can you use the built-in InactiveUsers function in ScriptRunner? https://scriptrunner.adaptavist.com/4.3.16/jira/jql-functions.html#_inactiveusers
If you really want to roll your own JQL function, you'll want to review the documentation on Custom JQL Functions. In short, you'll need to create the directory path com/onresolve/jira/groovy/jql
under one of your script roots on your JIRA server's filesystem (of course, your path will use backslashes if your JIRA server is a Windows machine). Take that code and put it in a HasInactiveAssignee.groovy file.
Also, it looks like your code is missing some imports and a package declaration ( package com.onresolve.jira.groovy.jql
) at the top. Make sure to include those, or the script won't work.
Once that's in place, you'll need to rescan for the new JQL function and you should be able to use it, assuming that code is good and you got all the imports added.
Hi Jonny,
Thank you for your help! We are on an older version now, so I havent seen this function. Need to try
And about custom functions, I have tested this one, it works, but to be honest I'm not a professional in groovy, so cannot find which part of this code can get a custom field, for example as it is in your function
user in InactiveUsers()
or IssueFunction in inactiveUser(customfield)
maybe there is some "create a function" tutorial for very-very new groovy developers? With explaining 'who is who'
Thanks again!
package com.onresolve.jira.groovy.jql 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; class HasInactiveAssignee extends AbstractScriptedJqlFunction implements JqlQueryFunction{ @Override String getDescription() { "Function to show only the inactive users" } @Override List<Map> getArguments() { [ [ "description": "Subquery", "optional": false, ] ] } @Override String getFunctionName() { "hasInactiveAssignee" } 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) { //User user=ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser(); JiraAuthenticationContext context = ComponentAccessor.getJiraAuthenticationContext(); ApplicationUser applicationUser = context.getUser(); def booleanQuery = new BooleanQuery() issues = getIssues(operand.args[0], applicationUser) issues.each {Issue issue -> try{ def active = issue.assignee.isActive() if ( !active ) booleanQuery.add(new TermQuery(new Term("issue_id", issue.id as String)), BooleanClause.Occur.SHOULD) }catch(NullPointerException NPE){ } } return booleanQuery } }
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Online forums and learning are now in one easy-to-use experience.
By continuing, you accept the updated Community Terms of Use and acknowledge the Privacy Policy. Your public name, photo, and achievements may be publicly visible and available in search engines.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.