Hello all!
Sorry, this is the first time I try to create my own custom listener with Script Runner Listeners. And I don't know a lot of groovy, so I maybe tell some enormous mistakes...
My use case is:
When a ticket is updated, I want to check if a field A value was changed during this update, and maybe to edit this ticket
The A field could be system field (description) or custom field, it depends.
I have many problems doing that:
1. The "IssueEvent" object doesn't have the Issue BEFORE the update and the Issue AFTER the update (but why... :( ), so I try to find what was changed during this update. But when i have a look on event.toString(), i just see that:
changelog=[GenericEntity:ChangeGroup][issue,17543][author,c_droobi][created,2019-04-21 18:24:28.473][id,80599],eventTypeId=2,sendMail=true,params={eventsource=action, baseurl=https://tst-jira.myjira.com},subtasksUpdated=true]
There is nothing!
I saw on different other topics solutions like this (for example in https://community.atlassian.com/t5/Marketplace-Apps-questions/Find-out-if-a-JIRA-update-event-changes-a-specific-issue-field/qaq-p/618091):
def change = event?.getChangeLog()?.getRelated("ChildChangeItem")?.find {it.field == "SelectListA"}
but I can't find anything, my "change" variable is empty...
2. When i try to change the value of one of my fields, for example "description field", i see that the Issue object has no setter... I can see with the help of Google I should have a "mutable Issue" object, but I don't find how to transform my original Issue on mutable issue to work with...
Could you please help me to go further on this issue?
Thank you very much. Appreciate! :)
It might help to break some of those long lines down and output some messages to the log.
For example, change:
def change = event?.getChangeLog()?.getRelated("ChildChangeItem")?.find {it.field == "SelectListA"}
To
def changeLog = event?.changeLog //with groovy, all get methods can be accessed with this sort of shortcut)
def changeItems = changeLog.getRelated("ChildChangeItem")
def change changeItems?.find{ it.field == "SelectListA"}
if(!change){
//no changes found, let's try to see why not
if(!changeItems){
log.debug "There are no changes values in this event"
} else {
changeItems.each{
log.debug it
}
}
}
This should show you the before and after of every change (if none are found that match SelectListA
For your second option, it's more than just getting a mutable issue. I think by default the issue associated with the event is mutable. I've never bothered to try to cast it to a specific type.
The following should just work:
event.issue.description = "my new description"
But that doesn't impact the db, it's just updating the object instance in memory. To complete the process and fully replicate the UI, you have to perform the following.
Something like this:
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.index.IssueIndexingService
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.event.type.EventDispatchOption
import com.atlassian.jira.util.ImportUtils
import com.atlassian.jira.issue.history.ChangeLogUtils
def issueManager = ComponentAccessor.issueManager
event.issue.description = "my new description"
issueManager.updateIssue(event.user, event.issue, EventDispatchOption.DO_NOT_DISPATCH, false)
def wasIndexing = ImportUtils.isIndexIssues()
ImportUtils.setIndexIssues(true)
indexingService.reIndex(subTask)
ImportUtils.setIndexIssues(wasIndexing)
Wow, Peter-Dave, you're wonderful!
Thank you SO MUCH for helping me. That's perfect.
I succeeded to do what I wanted to do. I won't use your second part because I just wanted to change the Assignee so I used this method:
(with ValidateAssign and Assign methods).
Just for some people who would see this topic, you have some little mistakes in your code:
childChangeItem => should have a cap ChildChangeItem
( it.field == "SelectListA"}
=>
{ it.field == "SelectListA"}
changeIteams
=>
changeItems
Thank you again!! :) :)
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Thanks for catching my typos. I corrected them.
Glad I was able to help.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Hi All,
Have you any experiences in updating changes custom field when Indicator (TimeTOSLA field) changed?
I had below code to change value of custom field 2 when Indicator (TTS type) changed but it did work
Issue issue = event.getIssue()
def changeHolder = new DefaultIssueChangeHolder()
def customFieldManager = ComponentAccessor.getCustomFieldManager()
def issueService = ComponentAccessor.getIssueService()
def Indicator = "customfield_10815"
def change = event?.getChangeLog()?.getRelated("ChildChangeItem")?.find {it.field == "Indicator"}
def customField1 = customFieldManager.getCustomFieldObject("customfield_10815") ---Indicator field
def customField2 = customFieldManager.getCustomFieldObject("customfield_13007")
def customField1Value = customField1.getValue(event.issue).toString()
def customField2Value = customField2.getValue(event.issue).toString()
if (change) {
def issueInputParameters = issueService.newIssueInputParameters()
issueInputParameters.addCustomFieldValue(customField2.idAsLong, customField1Value)
def validationResult = issueService.validateUpdate(event.user, event.issue.id, issueInputParameters)
if (validationResult.isValid()) {
issueService.update(event.user, validationResult)
} else {
log.warn "Did not update issue: $validationResult.errorCollection.errors"
}
}
Br,
Sao
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Join us to learn how your team can stay fully engaged in meetings without worrying about writing everything down. Dive into Loom's newest feature, Loom AI for meetings, which automatically takes notes and tracks action items.
Register today!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.