Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Panel
borderColorblue
titleColorwhite
titleBGColorblue
titleCustomer Requirement

I need of a method to get ApprovalMappings object and then  related approval users and approval groups to populate an User Picker(Multiple) Custom Field and a Group Picker(Multiple) Custom Field.

Solution

  • Create the Custom fields that will be populated when the workflow transition runs:

Image Added

  • Navigate on Workflow associated to the Approval Mapping
  • Click the

    Add Script Post-Function [ScriptRunner] and select Custom script post-function

Image Added

Image Added

  • Insert the Groovy Script code into the in-line editor, Save and Publish the workflow:
Code Block
import com.atlassian.activeobjects.external.ActiveObjects
import com.atlassian.crowd.embedded.api.Group
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.issue.ModifiedValue
import com.atlassian.jira.issue.issuetype.IssueType
import com.atlassian.jira.issue.util.DefaultIssueChangeHolder
import com.atlassian.jira.project.Project
import com.atlassian.jira.user.ApplicationUser
import com.atlassian.plugin.PluginAccessor

import com.opensymphony.workflow.loader.ActionDescriptor

import com.onresolve.scriptrunner.runner.customisers.WithPlugin
import com.herzum.jira.plugin.approval.manager.impl.ApprovalServiceManagerImpl
import com.herzum.jira.plugin.approval.config.ao.Approval
import com.herzum.jira.plugin.approval.config.ao.ApprovalMapping

@WithPlugin("com.herzum.jira.plugin.approval.herzum-approval-plugin")

def workflow = ComponentAccessor.workflowManager.getWorkflow(issue.projectObject.id, issue.issueType.id)
def actions = workflow.getAllActions()
def cfApprovalGroups = ComponentAccessor.getCustomFieldManager().getCustomFieldObjectsByName("Approval Groups").first()
def cfApprovalUsers = ComponentAccessor.getCustomFieldManager().getCustomFieldObjectsByName("Approval Users").first()

List<ApprovalMapping> approvalMappings = getApprovalMapping(issue.projectObject.id, issue.issueType.id)

List<String> workflowStatusesIds = []
workflow.linkedStatusObjects.each {
    workflowStatusesIds.add(it.id)
}

List<ApprovalMapping> toRemove = []
approvalMappings.each {
	if (!workflowStatusesIds.contains(it.destinationStatusId) || it.isDelete) {
		toRemove.add(it)
	}
}
approvalMappings.removeAll(toRemove)

String strApprovalGroups = ""
String strApprovalUsers = ""

for (ApprovalMapping approvalMapping: approvalMappings) {
    Long mappedProjectId = approvalMapping.projectId
    Long mappedIssueTypeId = Long.valueOf(approvalMapping.issueTypeId)
    Long mappedTransitionId = Long.valueOf(approvalMapping.transitionId)
    ActionDescriptor mappedAction = getActionById(actions, mappedTransitionId)
    
    if (approvalMapping.sourceStatusId.equals(issue.status.id.toString())) {
        String mappedProjectName = ComponentAccessor.projectManager.getProjectObj(mappedProjectId).name
        String mappedIssueTypeName = getIssueTypeById(ComponentAccessor.projectManager.getProjectObj(mappedProjectId), mappedIssueTypeId).name
        Approval[] approvals = approvalMapping.approvals

        for (Approval approval : approvals) {
            if (!approval.groups.isEmpty()) {
                strApprovalGroups += ", " + approval.groups.replaceAll("&", ", ")
            }
            if (!approval.users.isEmpty()) {
                strApprovalUsers += ", " + approval.users.replaceAll("&", ", ")
            }
        }

        if (!strApprovalGroups.isEmpty() && strApprovalGroups.startsWith(", ")) {
            strApprovalGroups = strApprovalGroups.substring(2)
        }

        if (!strApprovalUsers.isEmpty() && strApprovalGroups.startsWith(", ")) {
            strApprovalUsers = strApprovalUsers.substring(2)
        }

        List<Group> approvalGroups = (List<Group>) issue.getCustomFieldValue(cfApprovalGroups)
        List<ApplicationUser> approvalUsers = (List<ApplicationUser>) issue.getCustomFieldValue(cfApprovalUsers)

        if (approvalGroups == null) {
            approvalGroups = []
        }
        
        if (approvalUsers == null) {
            approvalUsers = []
        }
        
        if (!strApprovalGroups.isEmpty()) {
            // removed space becouse it caused Custom field population failure
            strApprovalGroups.split(",").each {
                approvalGroups.add(ComponentAccessor.groupManager.getGroup(it.toString()))
            }
        }

        if (!strApprovalUsers.isEmpty()) {
            strApprovalUsers.split(", ").each {
                approvalUsers.add(ComponentAccessor.userManager.getUserByName(it.toString()))
            }
        }
        
        cfApprovalGroups.updateValue(null, issue, new ModifiedValue(issue.getCustomFieldValue(cfApprovalGroups), approvalGroups), new DefaultIssueChangeHolder())
        cfApprovalUsers.updateValue(null, issue, new ModifiedValue(issue.getCustomFieldValue(cfApprovalUsers), approvalUsers), new DefaultIssueChangeHolder())
    }
}

public List getApprovalMapping(Long projectId, String issueTypeId) {
    def approvalServiceManager = ComponentAccessor.getOSGiComponentInstanceOfType(ApprovalServiceManagerImpl.class);     
    ApprovalMapping[] approvals = (ApprovalMapping[])  approvalServiceManager.getApprovalMappings().findAll {
        it.projectId == projectId && it.issueTypeId.equals(issueTypeId)
    }.toArray()
    if (approvals.length > 0)
        return new ArrayList(Arrays.asList(approvals)); 
    return new LinkedList();
}

public IssueType getIssueTypeById(Project project, Long issueTypeId) {
    return project.issueTypes.find { it.id.toString().equals(issueTypeId.toString()) }
}

public IssueType getIssueTypeByName(Project project, String issueTypeName) {
    return project.issueTypes.find { it.name.equals(issueTypeName) }
}

public ActionDescriptor getActionById(Collection<ActionDescriptor> actions, Long id) {
    return actions.find { it.id.toString().equals(id.toString()) }
}

How it works

Assuming the following Requested Approvals:

Image Added

On transitioning the issue, the Approval Groups and Approval Users Custom fields are populated automatically with the Users and the Groups configured as requested Approvals:

Image Added

In this section

Info
iconfalse

Table of Contents

Related Documentation

Here you can find some links to our customer documentation relating to the configuration screens and other items described in this page:

Still need help?

We would love to help.