Date: Thu, 28 Mar 2024 18:15:59 +0000 (UTC) Message-ID: <40236289.1985.1711649759719@50041d78312e> Subject: Exported From Confluence MIME-Version: 1.0 Content-Type: multipart/related; boundary="----=_Part_1984_1125474049.1711649759719" ------=_Part_1984_1125474049.1711649759719 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Content-Location: file:///C:/exported.html
This = Plugin gives some extremely nice features, like:
With JIRA 7 the "ComponentManager" is deprecated, use "ComponentAccessor= " instead.
With JIRA 8 the "ComponentManager" is removed, use "ComponentAccessor" i= nstead.
The plugin has been purchased by Adaptavist in 2015 and is from version = 4 Paid Product.
This actually gets hold on a clone and changes the "Task Type" Custom Fi= eld to "Clone", whereas on the Master it is still "Master"
import co= m.atlassian.jira.ComponentAccessor import com.atlassian.jira.issue.customfields.manager.OptionsManager import com.atlassian.jira.issue.CustomFieldManager componentManager (componentManager) ComponentAccessor.getComponentManager() optionsManager =3D (optionsManager) ComponentAccessor.getOptionsManager() customFieldManager customFieldManager =3D ComponentAccessor.getCustomFieldM= anager() def cf =3D customFieldManager.getCustomFieldObjects(issue).find {it.name = =3D=3D 'Task Type'} def fieldConfig =3D cf.getRelevantConfig(issue) def optionClone =3D optionsManager.getOptions(fieldConfig).find {it.value = =3D=3D "Clone"} issue.setCustomFieldValue(cf, optionClone)
This script sends "passesCondition =3D false" if there is an "Awaiting" = Link type on the Issue.
import co= m.atlassian.jira.component.ComponentAccessor import com.atlassian.jira.issue.link.IssueLink import com.atlassian.jira.issue.link.IssueLinkManager import com.atlassian.jira.issue.Issue import org.apache.log4j.Category IssueLinkManager issueLinkManager =3D ComponentAccessor.getIssueLinkManager= () String IssueType =3D issue.getIssueType().name String ProjectName =3D issue.getProjectObject().name String IssueKey =3D issue.key passesCondition =3D true System.out.println("script=3DCheckTOPSLinkStatus.groovy Issuekey: " + Issue= Key + " IssueType: " + IssueType + " ProjectName: " + ProjectName + " actio= n=3DStartScript") //Traverse all links issueLinkManager.getOutwardLinks(issue.id)?.each {issueLink -> String LinkTypeName =3D issueLink.issueLinkType.name String LinkStatus =3D issueLink.getDestinationObject().getStatus().= name String LinkIssueKey =3D issueLink.getDestinationObject().key System.out.println("script=3DCheckTOPSLinkStatus.groovy Issuekey: " + Is= sueKey + " Issue Link key: " + LinkIssueKey + " Issue Link Type: " + LinkTy= peName + " Linked Issue Status: " + LinkStatus) if (LinkTypeName =3D=3D "Awaiting") { passesCondition =3D false System.out.println("script=3DCheckTOPSLinkStatus.groovy Issuekey: "= + IssueKey + " IssueType: " + IssueType + " ProjectName: " + ProjectName += " action=3DHide Transition") } } System.out.println("script=3DCheckTOPSLinkStatus.groovy Issuekey: " + Issue= Key + " IssueType: " + IssueType + " ProjectName: " + ProjectName + " actio= n=3DEndScript")
In This sample "transientVars" refers to the parent values
See issue pr= operties/methods reference
issue.ass= ignee =3D=3D transientVars["issue"].assignee; issue.setAssignee(null); issue.setDescription("A new Description"); issue.setSummary("Unit Test - " + transientVars["issue"].key)
import co= m.atlassian.jira.ComponentAccessor; import com.atlassian.jira.issue.fields.CustomField import com.atlassian.jira.issue.CustomFieldManager customFieldManager customFieldManager =3D ComponentAccessor.getCustomFieldM= anager() CustomField UseCustomer =3D customFieldManager.getCustomFieldObject(10600) System.out.println("Custom field value: " + issue.getCustomFieldValue(UseCu= stomer))
Taken the value fetched above:
issue.set= CustomFieldValue(Customer,issue.getCustomFieldValue(UseCustomer))
This does not work for all field types (like labels).
String us= erName=3D"pho" def userManager =3D ComponentAccessor.getUserManager() def user =3D userManager.getUserObject(userName) issue.setAssignee(user) //Update the issue - may not be nessesary ComponentManager.getInstance().getIssueManager().updateIssue(ComponentManag= er.getInstance().jiraAuthenticationContext?.user, issue, EventDispatchOptio= n.DO_NOT_DISPATCH, false) ComponentManager.getInstance().getIndexManager().reIndex(issue)
A broader picture (ref: https://answers.atlassian.com/questions/98433/assigning-issues-via-groo= vy):
import co= m.atlassian.jira.ComponentAccessor import com.atlassian.jira.security.Permissions import com.atlassian.jira.event.type.EventDispatchOption import com.atlassian.jira.util.ImportUtils =20 //Examples, 8 is my subtask issue type id. Will be different for others updateAssignee("PRJ-1485", "user1") =20 //Method to do all the work def updateAssignee(parentId, userName) { def issue =3D ComponentAccessor.getIssueManager().getIssueObject(parentId) def userManager =3D ComponentAccessor.getUserManager() def user =3D userManager.getUserObject(userName) issue.setAssignee(user) //Update the issue ComponentAccessor.getIssueManager().updateIssue(ComponentAccessor.jiraAuthe= nticationContext?.user, issue, EventDispatchOption.DO_NOT_DISPATCH, false) ComponentAccessor.getIndexManager().reIndex(issue) }
import co= m.atlassian.jira.ComponentAccessor import com.atlassian.jira.issue.fields.CustomField import com.atlassian.jira.issue.CustomFieldManager import com.atlassian.jira.issue.label.LabelManager import org.springframework.util.StringUtils import java.util.Arrays import java.util.HashSet import java.util.Set labelManager =3D ComponentAccessor.getLabelManager() CustomFieldManager customFieldManager =3D ComponentAccessor.getCustomFieldM= anager() CustomField UseCustomer =3D customFieldManager.getCustomFieldObject(10600) CustomField Customer =3D customFieldManager.getCustomFieldObject(10900) labelManager.removeLabelsForCustomField(10900) Set labelSet =3D new HashSet(); labelSet.add(issue.getCustomFieldValue(UseCustomer)) def authContext =3D ComponentAccessor.getJiraAuthenticationContext() def user =3D authContext.getUser() // issue.getCustomFieldValue(UseCustomer) // Does not work - the "labelSet" is not a valid set - https://answers.atla= ssian.com/questions/332748/set-labels-in-jira labelManager.setLabels(user, issue.id,labelSet, false,false)
This is very nice, for "auto" progressing linked issues. (Idea and sourc= e from t= his)
import co= m.atlassian.jira.component.ComponentAccessor import com.atlassian.jira.issue.link.IssueLink def issueLinkManager =3D ComponentAccessor.getIssueLinkManager() import org.apache.log4j.Category import com.atlassian.jira.issue.comments.CommentManager import com.opensymphony.workflow.WorkflowContext import com.atlassian.jira.workflow.WorkflowTransitionUtil import com.atlassian.jira.workflow.WorkflowTransitionUtilImpl import com.atlassian.jira.util.JiraUtils def Category log =3D Category.getInstance("com.onresolve.jira.groovy.PostFu= nction") log.setLevel(org.apache.log4j.Level.DEBUG) log.debug "debug statements" String currentUser =3D ((WorkflowContext) transientVars.get("context")).get= Caller() WorkflowTransitionUtil workflowTransitionUtil =3D ( WorkflowTransitionUtil = ) JiraUtils.loadComponent( WorkflowTransitionUtilImpl.class ) issueLinkManager.getOutwardLinks(issue.id)?.each {issueLink -> if (issueLink.issueLinkType.name =3D=3D "parent-child") { // Transist Issue workflowTransitionUtil.setIssue(issueLink.getDestinationObj= ect()); workflowTransitionUtil.setUsername(currentUser); workflowTransitionUtil.setAction (741) // 741 =3D Waitin= g // validate and transition issue workflowTransitionUtil.validate() workflowTransitionUtil.progress() // Add a comment so people have a clue why the child has been close= d CommentManager commentManager =3D (CommentManager) Componen= tAccessor.getCommentManager() String comment =3D "Status changed to *WAit for solution* a= s a result of the *Resolve* action being applied to the TD Issue." commentManager.create(issueLink.getDestinationObject(), cur= rentUser, comment, true) } }
The
workflowT= ransitionUtil.setIssue(issueLink.getDestinationObject())
should be
workflowT= ransitionUtil.setIssue(issueLink.getSourceObject())
Going "the other way". There is also an getInwardLinks(issue.id) collect= ion.
import co= m.atlassian.jira.issue.Issue import com.atlassian.jira.ComponentManager User =3D ComponentAccessor.getJiraAuthenticationContext().getUser().getName= ()
Some standard JIRA Field can be accessed very direct, other must be thro= ught the
issue.get= CustomFieldValue(componentManager.getCustomFieldManager().getCustomFieldObj= ectByName("Advisory Subject"))
function.
Subject can be text or like:
($issue) = <% out << issue.getCustomFieldValue(com.atlassian.jira.component.C= omponentAccessor.getCustomFieldManager().getCustomFieldObjectByName("Adviso= ry Subject")) %>
Body can be like:
<% out= << issue.getCustomFieldValue(com.atlassian.jira.component.ComponentA= ccessor.getCustomFieldManager().getCustomFieldObjectByName("Mail Body")) %&= gt; <br><br> Best Regards, <br><br> GService Desk <br> <a href=3D"http://sd.mydomain.dk">Service Desk</a> <br> You cant reply to this email.
This script is a sample from a Validation Function
// This s= cript makes a requirement: if the Custom Field "OprStatusShow" is set to pu= blic, Incident Start and Resolved must be set. import com.opensymphony.workflow.InvalidInputException import com.atlassian.jira.project.ProjectManager import com.atlassian.jira.issue.CustomFieldManager import com.atlassian.jira.issue.fields.CustomField //Project "Support" Id =3D 10130 if (issue.getProjectObject().getId() =3D=3D 10130) { CustomFieldManager customFieldManager =3D ComponentAccessor.getCustomFieldM= anager() CustomField IncidentResolvedField =3D customFieldManager.getCustomFieldObje= ct("customfield_12224") CustomField IncidentStartField =3D customFieldManager.getCustomFieldObject(= "customfield_10091") CustomField OprStatusShowField =3D customFieldManager.getCustomFieldObject(= "customfield_11820") String IncidentResolved =3D (String)issue.getCustomFieldValue(IncidentResol= vedField) String IncidentStart =3D (String)issue.getCustomFieldValue(IncidentStartFie= ld) String OprStatusShow =3D (String)issue.getCustomFieldValue(OprStatusShowFie= ld) if (OprStatusShow =3D=3D "Yes") { =09if (IncidentStart =3D=3D null || IncidentResolved =3D=3D null) { =09=09InvalidInputException e=3D new InvalidInputException(); =09=09e.addError("Incident Start And Incident Resolved must not be empty") =09 =09throw e =09=09} =09} }
A "neat" but raw idea for a scripted field: https://answers.atlassian.com/questions/191893
https://jamieechlin.atlassia= n.net/wiki/display/GRV/Post+Functions
http://quisapps.com/confluence/di= splay/JSS/Scripting+Samples