====== Scripted Validators ======
Following scripts can be used for scripted validators within the workflow
=== Verify project name ===
issue.projectObject.name == "My First Project Name"
=== Require Value in FIELD2 if FIELD1 = 'Yes' ===
if ( cfValues['FIELD1']?.value == 'Yes') {
if ( cfValues['FIELD2'] ) {
return true
}
else return false
}
else return true
=== Require Value in DATEFIELD2 greater than "NOW" if FIELD1 is set ===
Date today123 = new Date()
if ( cfValues['FIELD1'] ) {
if ( cfValues['DATEFIELD2'].getTime() > today123.getTime() ) {
return true
}
else return false
}
else return true
=== Check if field equals some string ===
def selectedSegment = cfValues['Segment']
def selectedSegmentString = selectedSegment.toString()
if ( selectedSegmentString.equals("Some String") ){
// do something here
}
=== Verify if custom field value is 5 characters long ===
import com.atlassian.jira.component.ComponentAccessor;
import com.atlassian.jira.issue.CustomFieldManager;
import com.atlassian.jira.issue.IssueManager;
def customfield_ID = "customfield_11700"
def issueManager = ComponentAccessor.getIssueManager()
def customFieldManager = ComponentAccessor.getCustomFieldManager()
def cField = customFieldManager.getCustomFieldObject(customfield_ID)
def cFieldValue = issue.getCustomFieldValue(cField).toString()
if (cFieldValue.size() != 5){
return false
}
else{
return true
}
=== Verify if any other tickets have the same dates as requested ===
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.search.SearchProvider
import com.atlassian.jira.jql.parser.JqlQueryParser
import com.atlassian.jira.web.bean.PagerFilter
import com.atlassian.jira.datetime.DateTimeFormatUtils
import org.apache.commons.lang.time.DateUtils
import java.text.SimpleDateFormat
import java.util.Date.*
import java.lang.String.*
//logging
import org.apache.log4j.Logger
import org.apache.log4j.Level
def log = Logger.getLogger("com.acme.CreateSubtask")
log.setLevel(Level.DEBUG)
// this function returns list of issues for JQL
def findIssues(String jqlQuery) {
def issueManager = ComponentAccessor.issueManager
def user = ComponentAccessor.jiraAuthenticationContext.user
def jqlQueryParser = ComponentAccessor.getComponent(JqlQueryParser.class)
def searchProvider = ComponentAccessor.getComponent(SearchProvider.class)
def query = jqlQueryParser.parseQuery(jqlQuery)
def results = searchProvider.search(query, user, PagerFilter.unlimitedFilter)
results.issues.collect { issue -> issueManager.getIssueObject(issue.id) }
}
def customFieldManager = ComponentAccessor.getCustomFieldManager()
def isd = cfValues['OD Start Date']
def ied = cfValues['OD End Date']
def ie = cfValues['OD Environment']
def inputStartDate
def inputEndDate
def inputEnvironment = ie.toString()
def issues
if (! isd || ! ied){
log.debug("Input Start date or Input End Date not available")
}else{
inputStartDate = isd.format("YYYY-MM-dd").toString()
inputEndDate = ied.format("YYYY-MM-dd").toString()
issues = findIssues('project = ODRSRV AND "OD Environment" = '+ inputEnvironment +' AND (("OD Start Date" <= '+ inputStartDate +' AND "OD End Date" >= '+ inputEndDate +') OR ("OD Start Date" <= '+ inputEndDate +' AND "OD Start Date" >= '+ inputStartDate +') OR ("OD Start Date" >= '+ inputStartDate +' AND "OD End Date" <= '+ inputEndDate +') OR ("OD Start Date" <= '+ inputStartDate +' AND "OD End Date" >= '+ inputEndDate +'))' )
}
log.debug("inputStartdate: "+inputStartDate)
log.debug("inputEndDate: "+inputEndDate)
log.debug("inputEnvironment: "+inputEnvironment)
log.debug("issues: "+issues+" for "+inputEnvironment)
if ( ! issues){
return true
log.debug("Issues is " + issues)
}else{
return false
log.debug("Issues is " + issues)
}
=== Validate user changed the OD Environment field if it was "None" previously ===
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.Issue
import org.apache.log4j.Logger
import org.apache.log4j.Level
def log = Logger.getLogger("com.acme.CreateSubtask")
log.setLevel(Level.DEBUG)
Issue issue = issue
def customFieldManager = ComponentAccessor.getCustomFieldManager()
def issueManager = ComponentAccessor.getIssueManager()
def customField = customFieldManager.getCustomFieldObjectByName("OD Environment")
def originalIssue = issueManager.getIssueObject(issue.id)
def originalValue = originalIssue.getCustomFieldValue(customField).toString()
def newValue = issue.getCustomFieldValue(customField).toString()
log.debug("originalIssue ${originalValue}")
log.debug("newIssue ${newValue}")
if (originalValue.equals("null") ){
if ( newValue != originalValue ) {
log.debug("true -> User changed the field")
return true
}else{
log.debug("false -> User must changed field")
return false
}
}else{
log.debug("true -> OD Environment is not null ${originalValue}")
return true
}
=== Validate if user is allowed to change the OD Environment field ===
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.Issue
import org.apache.log4j.Logger
import org.apache.log4j.Level
def log = Logger.getLogger("com.acme.CreateSubtask")
log.setLevel(Level.DEBUG)
Issue issue = issue
def customFieldManager = ComponentAccessor.getCustomFieldManager()
def issueManager = ComponentAccessor.getIssueManager()
def customField = customFieldManager.getCustomFieldObjectByName("OD Environment")
def originalIssue = issueManager.getIssueObject(issue.id)
def originalValue = originalIssue.getCustomFieldValue(customField).toString()
def newValue = issue.getCustomFieldValue(customField).toString()
log.debug("originalIssue ${originalValue}")
log.debug("newIssue ${newValue}")
if ( newValue != originalValue ) {
if (! originalValue.equals("null") ){
log.debug("false -> Changing from not None")
return false
}else{
log.debug("true -> changing from none")
return true
}
}else{
log.debug("true -> not changing")
return true
}
=== Allow only specific users in project ABC or users in a group "JIRAGROUP" to create issues validator ===
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.Issue
def groupManager = ComponentAccessor.getGroupManager()
(issue.projectObject.key == 'ABC' && issue.issueType.name == 'Bug' && currentUser.name in ["XYZ", "TEST"] ) || groupManager.isUserInGroup(currentUser, "JIRAGROUP")
=== Only allow users in group "users" to execute this action ===
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.Issue
def groupManager = ComponentAccessor.getGroupManager()
groupManager.isUserInGroup(currentUser, "users")
=== Check if user is in group "users" or project role "Developers" to execute this action ===
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.security.roles.ProjectRoleManager
def projectManager = ComponentAccessor.projectManager
def projectRoleManager = ComponentAccessor.getComponent(ProjectRoleManager)
def role = projectRoleManager.getProjectRole("Developers")
def groupManager = ComponentAccessor.getGroupManager()
if (groupManager.isUserInGroup(currentUser, "users") || projectRoleManager.isUserInProjectRole(currentUser, role, issue.getProjectObject())){
return true
}
=== Check if cascading child drop down is set to "None" ===
The following script was found on Atlassian community here: [[https://community.atlassian.com/t5/Jira-questions/How-to-check-the-second-value-of-a-cascading-select-list-in-a/qaq-p/759808|How to check the second value of a cascading select list in a custom field]]
Use the **Custom Validator** for this script-runner script.
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.MutableIssue
import com.opensymphony.workflow.InvalidInputException
def issue = issue as MutableIssue
def cf = ComponentAccessor.customFieldManager.getCustomFieldObjectByName("CascadingSelect")
def cfValue = issue.getCustomFieldValue(cf) as HashMap
def parentOption = cfValue.values().getAt(0)?.value
def childOption = cfValue.values().getAt(1)?.value
if (!childOption) {
throw new InvalidInputException("Child option is Null")
}