Good day! I have a script on a "Resolve" transition. When the transition is in progress, the related requests are closed and should send email notifications to the authors of the close. The letter comes, but it is marked with null. Tell me where the problem might be? The problem appeared after updating jira.
Sample script:
import com.atlassian.jira.component.ComponentAccessorimport com.atlassian.jira.issue.Issueimport com.atlassian.jira.issue.MutableIssueimport com.atlassian.jira.event.type.EventDispatchOptionimport com.atlassian.jira.bc.project.component.ProjectComponentimport com.atlassian.jira.issue.customfields.option.Optionimport com.atlassian.jira.issue.util.DefaultIssueChangeHolderimport com.atlassian.jira.issue.ModifiedValueimport com.atlassian.jira.util.ImportUtilsimport com.atlassian.jira.issue.index.IssueIndexingServiceimport com.atlassian.jira.workflow.TransitionOptions;import com.atlassian.jira.workflow.TransitionOptions.Builder;import com.atlassian.jira.bc.issue.IssueService;import com.atlassian.jira.issue.IssueInputParameters;import com.atlassian.jira.issue.comments.MutableComment;import com.atlassian.jira.issue.CustomFieldManager;import com.atlassian.jira.issue.link.IssueLink;import com.atlassian.jira.issue.link.IssueLinkManager;import com.atlassian.jira.issue.Issue;import com.atlassian.jira.issue.IssueInputParameters;import com.atlassian.jira.issue.IssueManager;import com.atlassian.jira.user.util.UserManager;import com.atlassian.jira.user.ApplicationUser;
final linkTypeName = "Массовость"final transitionId = 251 // переход Закрытие инцидента (251) из WF Инцидентаint actionId = 591; // ОТПРАВКА ПИСЬМА(из массового) // тестово отключен в пользу "transitionId = 251"
def userManager = ComponentAccessor.getUserManager()def issueLinkManager = ComponentAccessor.getIssueLinkManager()def issueManager = ComponentAccessor.getIssueManager()def customFieldManager = ComponentAccessor.getCustomFieldManager()def issueService = ComponentAccessor.getIssueService()def commentManager = ComponentAccessor.getCommentManager()def issueIndexingService = ComponentAccessor.getComponent(IssueIndexingService)
// def issue = (MutableIssue) issueManager.getIssueObject("HELPDESK-492249")
def jirarobot = userManager.getUserByName("jirarobot")
if (issue.getCustomFieldValue(customFieldManager.getCustomFieldObject(13192L)).toString() == "Да") { // "Массовый инцидент"
// "Заполнить категорию у связанных?" / customfield_20281 // class com.atlassian.jira.issue.customfields.option.LazyLoadedOption def fillLinkedIssuesFieldValue = issue.getCustomFieldValue(customFieldManager.getCustomFieldObject(20281L)) as Option
// "Категория инцидента" def incidentCategoryField = customFieldManager.getCustomFieldObject(13183L) def incidentCategoryFieldValue = issue.getCustomFieldValue(incidentCategoryField)
// "Категория обслуживания" def serviceCategoryField = customFieldManager.getCustomFieldObject(13184L)
// "Сообщение" def messageField = customFieldManager.getCustomFieldObject(13191L) String comment = issue.getCustomFieldValue(messageField)
def inwardLinks = issueLinkManager.getInwardLinks(issue.id) ArrayList<Issue> linkedIssues = new ArrayList<Issue>()
if (inwardLinks[0] != null) { inwardLinks?.each { inwardLink -> if (inwardLink.issueLinkType.name == linkTypeName) { linkedIssues.add(inwardLink.getSourceObject()) } } }
linkedIssues?.each { linkedIssue -> def issueInputParameters = issueService.newIssueInputParameters() def transitionValidationResult = issueService.validateTransition(jirarobot, linkedIssue.id, transitionId, issueInputParameters)
if (transitionValidationResult.isValid()) { ((MutableIssue)linkedIssue).setCustomFieldValue(messageField, comment) // 1) Here doesn't work //if (linkedIssue.getIssueTypeId().equals("10818")) ((MutableIssue) linkedIssue).setIssueTypeId("10602") commentManager.create(linkedIssue, jirarobot, comment, false) issueManager.updateIssue(jirarobot, (MutableIssue) linkedIssue, EventDispatchOption.DO_NOT_DISPATCH, false) issueService.transition(jirarobot, transitionValidationResult) }
// 1) Works correct! // Если "Запрос на обслуживание", то меняем тип на "Инцидент" и обнуляем поле "Категория обслуживания" if (linkedIssue.getIssueTypeId().equals("10818")) { ((MutableIssue) linkedIssue).setIssueTypeId("10602") ((MutableIssue) linkedIssue).setCustomFieldValue(serviceCategoryField, null) }
// ----- Заполнение поля "Категория инцидента" ----- // 19354 - "Да" if (fillLinkedIssuesFieldValue != null && fillLinkedIssuesFieldValue.getOptionId() == 19354L) { ((MutableIssue) linkedIssue).setCustomFieldValue(incidentCategoryField, incidentCategoryFieldValue) } // ----- Заполнение полей 19584 - Предварительная оценка сложности, 19585 - Итоговая оценка сложности" ----- def preDiffRating = ComponentAccessor.getCustomFieldManager().getCustomFieldObject(19584) if (!preDiffRating.getValue(linkedIssue)){ def preFieldConfig = preDiffRating.getRelevantConfig(linkedIssue) def preFieldConfigValue = ComponentAccessor.optionsManager.getOptions(preFieldConfig)?.find {it.toString() == "0"} preDiffRating.updateValue(null, linkedIssue, new ModifiedValue("", (Object) preFieldConfigValue), new DefaultIssueChangeHolder()) } def postDiffRating = ComponentAccessor.getCustomFieldManager().getCustomFieldObject(19585) if (!postDiffRating.getValue(linkedIssue)){ def postFieldConfig = postDiffRating.getRelevantConfig(linkedIssue) def postFieldConfigValue = ComponentAccessor.optionsManager.getOptions(postFieldConfig)?.find {it.toString() == "0"} postDiffRating.updateValue(null, linkedIssue, new ModifiedValue("", (Object) postFieldConfigValue), new DefaultIssueChangeHolder()) }
issueManager.updateIssue(jirarobot, (MutableIssue) linkedIssue, EventDispatchOption.DO_NOT_DISPATCH, false)
// Индексация boolean wasIndexing = ImportUtils.isIndexIssues() ImportUtils.setIndexIssues(true) issueIndexingService.reIndex(issueManager.getIssueObject(linkedIssue.id)) ImportUtils.setIndexIssues(wasIndexing) } // IT-69956 TransitionOptions transitionOptions = new TransitionOptions.Builder().skipConditions().skipValidators().skipPermissions().build(); linkedIssues.each { CustomFieldManager cfm = ComponentAccessor.getCustomFieldManager(); IssueLinkManager ilm = ComponentAccessor.getIssueLinkManager(); IssueManager im = ComponentAccessor.getIssueManager(); IssueService is = ComponentAccessor.getIssueService(); UserManager um = ComponentAccessor.getUserManager(); MutableIssue targetIssue = (MutableIssue) it; ApplicationUser user = um.getUserByName("jirarobot");//ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser()
IssueInputParameters iip = is.newIssueInputParameters(); iip.addCustomFieldValue(17781L, null); // Отправить файл(ы)
// EmailTo String reporterEmail = targetIssue.getReporter().getEmailAddress(); String emailTo = targetIssue.getCustomFieldValue(cfm.getCustomFieldObject("customfield_13180")); // E-mail if (emailTo != null && !emailTo.isEmpty() && reporterEmail != null && !reporterEmail.isEmpty()) { if (!emailTo.contains(reporterEmail)) { iip.addCustomFieldValue(13180L, reporterEmail + "," + emailTo); // E-mail } } else if ((emailTo != null && !emailTo.isEmpty()) || (reporterEmail != null && !reporterEmail.isEmpty())) { if ((emailTo != null && !emailTo.isEmpty()) && (reporterEmail == null || reporterEmail.isEmpty())) { iip.addCustomFieldValue(13180L, emailTo); // E-mail } else { iip.addCustomFieldValue(13180L, reporterEmail); // E-mail } } else { iip.addCustomFieldValue(13180L, targetIssue.getAssignee().getEmailAddress()); // E-mail }
// EmailCc String emailCc = targetIssue.getCustomFieldValue(cfm.getCustomFieldObject("customfield_13480")); // Копия if (emailCc != null && !emailCc.isEmpty()) { iip.addCustomFieldValue(13480L, emailCc); // Копия }
// EmailSubject iip.addCustomFieldValue(13286L, targetIssue.getSummary()); // Тема письма
// SendFiles iip.addCustomFieldValue(17781L, null); // Отправить файл(ы)
IssueService.TransitionValidationResult transitionValidationResult = is.validateTransition(user, targetIssue.getId(), transitionId, iip, transitionOptions);
if (transitionValidationResult.isValid()) { is.transition(user, transitionValidationResult); log.info("GLOBAL INCIDENT linked issue " + targetIssue.getKey() + " transition must be GOOD"); } else { log.warn("GLOBAL INCIDENT linked issue " + targetIssue.getKey() + " transition is BAD"); }
im.updateIssue(user, targetIssue, EventDispatchOption.DO_NOT_DISPATCH, false); }
// 2) Adding new components from global incident to sub-tasked incidents ArrayList<ProjectComponent> globalComponents = new ArrayList<>() globalComponents.addAll(issue.getComponents())
if (globalComponents.size() > 0) { linkedIssues?.each { linkedIssue -> ArrayList<ProjectComponent> localComponents = new ArrayList<>() localComponents.addAll(linkedIssue.getComponents()) // берем компоненты подзапроса localComponents.removeAll(globalComponents) // из них удаляем те, что есть в массовом localComponents.addAll(globalComponents) // добавляем все из массового
((MutableIssue)linkedIssue).setComponent(localComponents) issueManager.updateIssue(jirarobot, (MutableIssue) linkedIssue, EventDispatchOption.DO_NOT_DISPATCH, false) } }}
Hey there,
I've had more than one issues with emails in postfunction scripts and such.Therefore, my advice:
Dont use it.
Create an event, fire that in the transition you want to notify users about, and then setup the notification scheme accordingly. Its cleaner and works better, usually.
regards
Online forums and learning are now in one easy-to-use experience.
By continuing, you accept the updated Community Terms of Use and acknowledge the Privacy Policy. Your public name, photo, and achievements may be publicly visible and available in search engines.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.