====== 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") }