Пример валидации пользовательского поля с помощью JIRA Scripting Suite (Jython)

Стандартного функционала Jira для конфигурирования нового рабочего процесса для проекта не всегда достаточно. Это особенно актуально, когда требуются специфические проверки данных, автоматизация или интеграция с внешними системами. Часть проблем решается специализированными плагинами, доступными в Atlassian Market, но особую гибкость дают плагины, позволяющие создавать пользовательские сценарии.

JIRA Scripting Suite существует довольно давно, но по нему довольно мало информации в Сети. Особенно в русскоязычном сегменте. Плагин позволяет создавать Jython-сценарии для рабочих процессов, валидаторов и пост-функций.

Основные возможности

  • Позволяет создавать инлайн-сценарии или указывать ссылку на Python-файл. Можно использовать единственный файл сценария в разных местах рабочего процесса или создать собственную библиотеку полезных функций.

  • Предоставляет возможность писать валидаторы, срабатывающие при попытке перевести задачу в другой статус. При этом обеспечивается проверка на стороне сервера, можно использовать стандартные уведомления об ошибках.

  • Можно создавать пост-функции, которые выполняются после перевода задачи в другой статус. С их помощью возможно предварительно корректировать значения нужных полей.

  • Плагин имеет встроенный редактор с подсветкой синтаксиса и поддержкой форматирования в браузере.

  • Для подключения сценариев не требуется перезапускать JIRA.

  • Весь API JIRA можно вызывать из сценария. Все необходимые переменные доступны из контекста.

  • Поддерживается юникод.

Пример валидации пользовательского поля

Рассмотрим простой пример валидации. Предположим, требуется проверить, соответствует ли значение некоторого пользовательского поля определенному условию.

Переменные, доступные в контексте валидации:

Переменная Описание
result Результат валидации; булево значение, по умолчанию True
invalid_fields объект PyDictionary(), по умолчанию пустое отображение
description объект PyUnicode(), по умолчанию пустая строка юникода
originalIssue исходный (неизмененный) объект Issue
issue измененный объект Issue
log org.apache.log4j.Logger
transientVars отображение, содержащее все контекстные данные, переданные валидатору

Используя API JIRA, обратимся к пользовательскому полю «Стоимость» (по названию) и проверим, соответствует ли его значение условию >=0. Если условие не выполняется, добавим сообщение об ошибке.

from com.atlassian.jira.issue import CustomFieldManager
from com.atlassian.jira.issue.fields import CustomField
from com.atlassian.jira.component import ComponentAccessor

customFieldManager = ComponentAccessor.getCustomFieldManager()
customField = customFieldManager.getCustomFieldObjectByName(u"Стоимость")
cost = issue.getCustomFieldValue(customField)


if cost <= 0:
    result = False
    description = u'Исправьте ошибки в полях, связанных с взаиморасчетами.'
    invalid_fields['Стоимость'] = u'Некорректно определена стоимость задачи.'

Я использую ComponentAccessor для получения значения пользовательского поля. Это необходимость, начиная с 7-й версии Jira. В Jira 6 можно было использовать ComponentManager (см. примеры в официальной документации к плагину).