...
Code Block | ||||
---|---|---|---|---|
| ||||
/** * Populates 'Rank Last Changed', 'Rank Last Changed By' and 'Rank Prior To Last Change' custom fields, for later use by the 'Rank Change Info' script field. * */ import com.atlassian.jira.component.ComponentAccessor import com.atlassian.jira.issue.IssueManager import com.atlassian.jira.issue.fields.CustomField import com.atlassian.jira.datetime.DateTimeFormatterFactory import com.atlassian.jira.datetime.DateTimeStyle import com.atlassian.jira.issue.index.IssueIndexingService import com.atlassian.jira.issue.Issue import com.atlassian.jira.event.type.EventDispatchOption def dateTimeFormatterFactory = ComponentAccessor.getComponentOfType(DateTimeFormatterFactory) def formatter = dateTimeFormatterFactory.formatter().forLoggedInUser().withStyle(DateTimeStyle.DATE_PICKER) IssueManager issueManager = ComponentAccessor.getIssueManager() // event is of type com.atlassian.greenhopper.service.lexorank.balance.LexoRankChangeEvent. There is no JavaDoc on the web, so I had to figure out the structure by decompiling. There is a getIssueId() method, called here: if (event && event?.issueId) { //log.warn "Event re-ranked: " + event.getProperties() def Issue issue = issueManager.getIssueObject(event.issueId as Long) if (issue) { def String dateStr = formatter.format(event.time) def currentUser = ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser() CustomField timeCf = ComponentAccessor.customFieldManager.getCustomFieldObject(16121) // Rank Last Changed CustomField userCf = ComponentAccessor.customFieldManager.getCustomFieldObject(16122) // Rank Last Changed By CustomField pastrankCf = ComponentAccessor.customFieldManager.getCustomFieldObject(16123) // Rank Prior To Last Change issue.setCustomFieldValue(timeCf, event.time?.toTimestamp()) issue.setCustomFieldValue(userCf, currentUser) def List<String> pastranks = (issue.getCustomFieldValue(pastrankCf) as String)?.split(" ")?.toList() if (!pastranks) pastranks = [] // call getNewRank() pastranks.add(0, event.newRank as String) pastranks = [pastranks[0], pastranks[1]] - null issue.setCustomFieldValue(pastrankCf, pastranks.join(" ")); issue.store() log.info("Updated ${issue} '${timeCf}' field value to ${dateStr}, '${userCf}' field value to ${currentUser}") def issueIndexingService = ComponentAccessor.getComponent(IssueIndexingService) issueIndexingService.reIndex(issue) // Useful guide to updating issues: https://community.atlassian.com/t5/Agile-articles/Three-ways-to-update-an-issue-in-Jira-Java-Api/ba-p/736585 issueManager.updateIssue(currentUser, issue, EventDispatchOption.DO_NOT_DISPATCH, false); } } |
...
Next, in Jira, type 'gg' (admin shortcut) 'Script Listeners' to bring up the ScriptRunner Script Listeners page. Add a new Custom listener, listening to event LexoRankChangeEvent, and invoking our groovy script:
There will be a lot of some unavoidable static type checking errors because ScriptRunner is not able to find the LexoRankChangeEvent class, which is technically part of a plugin.
...