PageRenderTime 36ms CodeModel.GetById 9ms RepoModel.GetById 0ms app.codeStats 0ms

/src/main/resources/com/onresolve/jira/groovy/canned/workflow/conditions/AllSubtasksResolvedCondition.groovy

https://bitbucket.org/sorin/jira-plugin-intellij
Groovy | 137 lines | 108 code | 19 blank | 10 comment | 21 complexity | 43dffde5dc4ae7a1715bbab7cd8d520d MD5 | raw file
  1. package com.onresolve.jira.groovy.canned.workflow.conditions
  2. import com.onresolve.jira.groovy.canned.CannedScript
  3. import com.atlassian.jira.util.ErrorCollection
  4. import com.atlassian.jira.ComponentManager
  5. import com.atlassian.jira.issue.Issue
  6. import org.apache.log4j.Category
  7. import com.onresolve.jira.groovy.canned.utils.CannedScriptUtils
  8. import com.atlassian.jira.util.SimpleErrorCollection
  9. class AllSubtasksResolvedCondition implements CannedScript {
  10. Category log = Category.getInstance(this.class)
  11. ComponentManager componentManager = ComponentManager.getInstance()
  12. public static final String FIELD_REQUIRED_RESOLUTION_ID = "RESOLUTION_FIELD_NAME"
  13. // Note: this parameter not exposed through the GUI, it changes the meaning of "no open subtasks"
  14. // to "no open subtasks in issuetype [N, M] (list of string IDs)"
  15. public static final String FIELD_SUBTASK_TYPE = "FIELD_SUBTASK_TYPE"
  16. List getCategories() {
  17. ["Condition"]
  18. }
  19. String getName() {
  20. "All sub-tasks must be resolved";
  21. }
  22. public String getHelpUrl() {
  23. "https://studio.plugins.atlassian.com/wiki/display/GRV/Built-In+Scripts#Built-InScripts-Allsubtasksmustberesolved"
  24. }
  25. String getDescription() {
  26. """Does not allow the action unless all sub-tasks have a <i>resolution</i> set. You can choose <i>any</i>
  27. resolution, a named one, or same as parent task.""";
  28. }
  29. def Map getResolutionOptions() {
  30. Map<String, String> options = new LinkedHashMap()
  31. options.put('','Any')
  32. options.put('PARENT','Same as parent')
  33. options.putAll(CannedScriptUtils.getResolutionOptions(false))
  34. options
  35. }
  36. List getParameters(Map params) {
  37. [
  38. [
  39. Name:FIELD_REQUIRED_RESOLUTION_ID,
  40. Label:"Resolution",
  41. Type: "list",
  42. Description:"Resolution to use",
  43. Values: getResolutionOptions(),
  44. ],
  45. ]
  46. }
  47. ErrorCollection doValidate(Map params, boolean forPreview) {
  48. // check that the resolution ID is valid / still valid
  49. def constantsManager = componentManager.getConstantsManager()
  50. String requiredResolutionId = getRequiredResolutionId(params)
  51. if (!requiredResolutionId || requiredResolutionId == 'PARENT') {
  52. return null
  53. }
  54. if (!constantsManager.getResolutionObjects()*.id.contains(requiredResolutionId)) {
  55. SimpleErrorCollection errors = new SimpleErrorCollection()
  56. errors.addError (FIELD_REQUIRED_RESOLUTION_ID, "$requiredResolutionId is not a valid resolution ID")
  57. return errors
  58. }
  59. null
  60. }
  61. Map doScript(Map params) {
  62. def passesCondition = true
  63. String requiredResolutionId = getRequiredResolutionId(params)
  64. List subTaskIssueTypes = params[FIELD_SUBTASK_TYPE] as List
  65. Issue myIssue = params['issue'] as Issue
  66. def subTaskManager = componentManager.getSubTaskManager();
  67. Collection subTasks = myIssue.getSubTaskObjects()
  68. if (subTaskManager.subTasksEnabled && !subTasks.empty) {
  69. passesCondition = subTasks.every {
  70. if (subTaskIssueTypes && ! subTaskIssueTypes.contains(it.issueTypeObject.id)) {
  71. return true
  72. }
  73. // it is a GV
  74. if (requiredResolutionId) {
  75. if (requiredResolutionId == "PARENT") {
  76. myIssue.getResolution() && (it.resolutionId == myIssue.resolutionId)
  77. }
  78. else {
  79. it.resolutionId == requiredResolutionId
  80. }
  81. }
  82. else {
  83. it.resolution // as Boolean
  84. }
  85. }
  86. }
  87. // log.debug("Returning: " + passesCondition)
  88. params['passesCondition'] = passesCondition
  89. params
  90. }
  91. String getDescription(Map params, boolean forPreview) {
  92. String s
  93. String requiredResolutionId = getRequiredResolutionId(params)
  94. if (requiredResolutionId) {
  95. if (requiredResolutionId == "PARENT") {
  96. s = "the <i>parent</i>"
  97. }
  98. else {
  99. s = "the <i>" + componentManager.getConstantsManager().getResolutionObject(requiredResolutionId).getName() + "</i>"
  100. }
  101. }
  102. else {
  103. s = "<i>any</i>"
  104. }
  105. """Does not allow the action unless all sub-tasks have $s <i>resolution</i> set. """;
  106. }
  107. /**
  108. * This is to handle the fact that the internal string for resolution was changed at some point
  109. * @param params
  110. * @return
  111. */
  112. private String getRequiredResolutionId(Map params) {
  113. params[FIELD_REQUIRED_RESOLUTION_ID] ?: params['Resolution'] as String
  114. }
  115. public Boolean isFinalParamsPage(Map params) {
  116. true
  117. }
  118. }