Forums

Articles
Create
cancel
Showing results for 
Search instead for 
Did you mean: 

JIRA Server 7.3.4 with JMWE - Groovy help to copy an issue.

Christa Meck
I'm New Here
I'm New Here
Those new to the Atlassian Community have posted less than three times. Give them a warm welcome!
March 21, 2018

Hi Team.  

Scenario:  On transition from New -> Approved, determine if a custom field checkbox is checked.  If checked, clone the ticket to another project and link to this ticket.

Details: JIRA Server 7.3.4 with JMWE 

User level:  I'm a Groovy newb.  I am the JIRA application admin but not the sys admin.

 

This code is getting me a 1 if the checkbox is checked.  So I feel like I am on the right track there.


import com.atlassian.jira.component.ComponentAccessor;
import com.atlassian.jira.ComponentManager;
import com.atlassian.jira.issue.CustomFieldManager;
import com.atlassian.jira.issue.fields.CustomField;
import com.atlassian.jira.issue.IssueManager;
import com.atlassian.jira.issue.Issue;
def issueManager = ComponentAccessor.getIssueManager()
def customFieldManager = ComponentAccessor.getCustomFieldManager()
def cField = customFieldManager.getCustomFieldObjectsByName("HR: Personnel Change (Needs Facilities)?")
def cFieldValue = issue.getCustomFieldValue(cField).toString();

if (cFieldValue == "[Yes]") { return "1" }
else { return cFieldValue }

As for the copy/linking part...  I've scoured the internet and all I can find are a bunch of code snippets to copy using ScriptRunner.  I can't add additional libraries as I am not the system administrator, just the app admin.  Keep running into class issues and method challenges.  

The most promising code I found is this:

package example.CloneTicketAndLink

import com.atlassian.jira.event.issue.AbstractIssueEventListener
import com.atlassian.jira.event.issue.IssueEvent
import com.atlassian.jira.user.util.UserUtil
import com.atlassian.jira.ComponentManager
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.link.IssueLink
import com.atlassian.jira.util.ImportUtils
import com.atlassian.crowd.embedded.api.User;
import com.opensymphony.workflow.WorkflowContext
import org.apache.log4j.Category
import com.atlassian.jira.issue.customfields.CustomFieldType
import com.atlassian.jira.issue.CustomFieldManager
import com.atlassian.jira.issue.fields.CustomField
import com.atlassian.jira.issue.IssueManager
import com.atlassian.jira.project.ProjectManager
import com.atlassian.jira.project.Project
import com.atlassian.jira.issue.IssueFactory;

class TaskVersionListener extends AbstractIssueEventListener {
Category log = Category.getInstance(TaskVersionListener.class)

@Override
void workflowEvent(IssueEvent event) {
log.setLevel(org.apache.log4j.Level.DEBUG)
def issue = event.getIssue()
if ( issue.getIssueTypeId() == "XXXXX" ) { // The Issue Type to catch in the Listener
def projectName = "YYYYY" //Target project name

def issueMgr = ComponentManager.getInstance().getIssueManager()
def projectMgr = ComponentManager.getInstance().getProjectManager()
String currentUser = event.getUser().getName();
User currentUserObj = ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser();
ComponentManager componentManager=ComponentManager.getInstance()
CustomFieldManager customFieldManager = componentManager.getCustomFieldManager()
log.debug "IF ISSUE IS TYPE XXXXX CLONE ISSUE TO PROJECT YYYYY WITH SAME FIELDS, ETC"

def issueFactory = ComponentManager.getInstance().getIssueFactory()
def newissue = issueFactory.getIssue()
newissue.setSummary (issue.summary)
newissue.setProject (projectMgr.getProjectByName(projectName))
newissue.setIssueTypeId("JJJJ") //The ID of the target Issue Type
newissue.description = issue.description
newissue.reporter = issue.getReporter()

//Set the Project Lead of the target project as assignee of the new ticket
def project = projectMgr.getProjectObjByName(projectName)
newissue.setAssigneeId(project.getLeadUserKey())

//Copy the fields that you want
def cf = null;
//ZZZZZ (list)
cf = customFieldManager.getCustomFieldObjects(issue).find {it.name == 'ZZZZZ'}
newissue.setCustomFieldValue(cf, issue.getCustomFieldValue(cf))
//YYYYYY (date) another way to obtain the custom field
cf = customFieldManager.getCustomFieldObject("customfield_NNNNN");
newissue.setCustomFieldValue(cf, issue.getCustomFieldValue(cf))
//XXXXXX (text, numeric, ...)
cf = customFieldManager.getCustomFieldObjects(issue).find {it.name == 'XXXXX'}
newissue.setCustomFieldValue(cf, issue.getCustomFieldValue(cf))


def params = ["issue":newissue]
def subTask = issueMgr.createIssue(currentUserObj, params)


def linkMgr = ComponentManager.getInstance().getIssueLinkManager()
linkMgr.createIssueLink (newissue.id, issue.id, Long.parseLong("ZZZZZ"),Long.valueOf(1), currentUserObj) //ZZZZZ is the id of the type of link
}
}
}

 

But my version of JIRA doesn't like those first two imports.  Links, references, anything is helpful.  I'm totally stuck. :(

- Christa

1 answer

1 accepted

Suggest an answer

Log in or Sign up to answer
1 vote
Answer accepted
David Fischer
Community Champion
March 21, 2018

Hi Christa,

the code you likely copied from the Internet is meant for ScriptRunner, not JMWE. To check whether a checkbox is checked, see https://innovalog.atlassian.net/wiki/spaces/JMWE/pages/107413622/User+created+custom+fields#Usercreatedcustomfields-Checkboxes/Multi-selectlist

As for copying the issue, you should just use the "Create/Clone Issue" post-function, with the checkbox-checking code as the Conditional Execution script.

Christa Meck
I'm New Here
I'm New Here
Those new to the Atlassian Community have posted less than three times. Give them a warm welcome!
March 21, 2018

David,

Thank you for breaking me out of my rut and making me rethink the approach.  Using Create/Clone issue worked perfectly and the link above made my life simpler.  

Seriously.  Thank you.

For anyone curious, my post function looks like this:

Create a new issue:
Project: FAC
Issue type: Room Change
Link type: 5-related task (Related)
Fields:
Summary: Set value from Groovy Template:
Seating Change - <%=issue.get("summary")%>

Run this post-function conditionally.

I'll refine it over time.  :)

- Christa 

TAGS
AUG Leaders

Atlassian Community Events