How can I distinguish between change to issue and creation of subtask?

Samantha Webber April 27, 2017

Hello,

 

I have a listener which performs some behavior when a change is made to the due date of an issue. The problem is, this behavior is also triggered when a subtask is created for the issue, because technically this is a modification of the parent issue, and apparently to the due date, as well.

How can I differentiate between a true modification to the parent issue's due date and the creation of a subtask, which is interpreted as a modification to the parent issue's due date?

Relevant section of script below:

 

//Takes an IssueEvent and, should that IssueEvent be a change of Due Date, adds the previous Due Date as a label to the affected Issue
    public void dueDateChanged (IssueEvent issueEvent) {

        Issue issue = issueEvent.getIssue();
        List<GenericValue> changeItems = null;
        ApplicationUser user = ComponentAccessor.jiraAuthenticationContext.getLoggedInUser();

        try {
            GenericValue changeLog = issueEvent.getChangeLog();         //grab all changes on this issue
            HashMap<String, Object> fields = new HashMap<String, Object>();
            fields.put("group", changeLog.get("id"));       //make map out of them (unsure what "group" and "id" are for)
            GenericDelegator delegator = changeLog.getDelegator();
            changeItems = delegator.findByAnd("ChangeItem", fields);        //place them in a list
        } catch (GenericEntityException e) {
            log.error(e.getMessage());
        }

        //iterate through list of changes and find if the change was to the duedate
        for(GenericValue changeVal : changeItems) {
            
            String field = changeVal.getString("field");
            def log = Logger.getLogger("com.acme.CreateSubtask");
            log.setLevel(Level.DEBUG);
            log.info("Field: " + field);

            //was the due date edited? was the issue in which the due date was edited the one we're concerned with?
            if(field.equals("Due Date & Time")) {
                
                //check if the issue is brand new, to prevent generation of DUE DATE CHANGE comment for change from null to something
                Object checkPrevDueDate = changeVal.getString("oldstring"); //see if such a string even exists in changeVal!
                String issueTypeId = issue.getIssueTypeId();        //see if we're dealing with a subtask here
                log.info("Issue: " + issueTypeId);

                if(!checkPrevDueDate.equals(null) && !issueTypeId.equals("5")) {     //if such a string does exist, i.e. the due date has actually been set at least once

                    String newDueDate = changeVal.getString("newstring");
                    String prevDueDate = changeVal.getString("oldstring"); 

                    addComment(issue, user, "{color:#d04437}*DUE DATE CHANGE*{color}\n\nOld: " + prevDueDate + "\nNew: " + newDueDate + "\nReason: ");
                    prevDueDate = prevDueDate.split(" ")[0];
                    addLabelToIssue(issue, user, prevDueDate);
                }
            }
        }
    }
}

    DueDateChanger dueDateChanger = new DueDateChanger();
    dueDateChanger.dueDateChanged(event);   //event is automatically given to us by CustomListener environment(?) in JIRA

 

As you can see, I tried excluding the case where the issue ID is 5 (subtask in our JIRA), but this had no effect. It also isn't exactly what I want, because someone might change the due date of a subtask, which should trigger the script because it's a legitimate change to a due date.

1 answer

0 votes
JohnsonHoward
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
April 28, 2017

Hi Samantha,

 

You could check the last change item for that issue and check if it is due date, for example:

def changeItems = changeHistoryManager.getAllChangeItems(issue)
if(changeItems.last().field == "duedate"){

    //some code here
}

Let me know if this works.

Thanks,

Johnson

Samantha Webber May 3, 2017

Hi Johnson,

Thanks for your answer. However, I believe this is already what I'm doing, no? I iterate through the changeItems list, and if one of the fields modified is 'Due Date & Time', then the behavior I've defined should execute.

 

I believe the problem is that creating a subtask is technically a change to the issue, and that the script detects a change from the parent issue's current due date and the 'new' due date of the subtast. I.e. the due date of the subtask crops up as a changeItem with field 'Due Date & Time'.

 

Is there some way I can see if the 'Due Date & Time' field belongs to the parent issue, or a subtask created under this parent issue?

 

Thanks a lot!

JohnsonHoward
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
May 8, 2017

I see what you are looking for.

Each change item contain an issueKey field so you can check if this issue key is equal to the issue key for the parent issue. You could also check if the issue.ParentObject comes back as null. If it does then you know you are in the parent object and then can do the change item checks.

When a sub task is created from a parent issue the  issue = issueEvent.getIssue() method will return the sub task that is being created. So you can use the isSubTask() method to check if it a sub task and do nothing in this case. 

Many options. I hope some make sense.

Suggest an answer

Log in or Sign up to answer