Сохранение в custom field Redmine ФИО текущего пользователя

Для упрощения фильтрации по задачам полезно иметь поля заполненные ФИО сотрудников отработавших каждый из этапов. Например, кто дизайнил, кто верстал, кто тестировал, кто согласовывал и т.п.

В варианте настройки Redmine «out of the box» информацию о тех, кто отрабатывал каждый этап можно извлечь только из истории, соответственно, быстро отфильтровать не получится.

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

Задание

  1. В Issue добавить custom field с типом user.
  2. Название поля «Протестировано» — в него прописывается значение пользователя, который закончил тестирование.
  3. В это поле значение пользователя должно прописываться автоматически:
    1. Только из под пользователя с ролью Тестировщик.
    2. На финальном статусе тестирования, когда тестировщик переводит статус в «Проверка верстки».
  4. Поле должно быть read-only.

Решение

После непродолжительных поисков нашел плагин Computed Custom Field (вычисляемые поля) с возможностью вставки скриптов на Ruby on Rails. На этом языке не пишу, поэтому скрипт подбирал методом научного тыка. Спасибо разработчику (русскоговорящий), оперативно отвечавшему на вопросы.

Для сравнения ролей, статусов используется соответствующие ID, а не символические .

Первый момент, как получить ID роли, статуса. В интерфейсе программы его не получить, поэтому используется следующий lifehack:

  1. Нужно зайти в роль или статус.
  2. В URL будет ID соотвествующей роли или статуса.

Например, скрипт для проверки роли и возвращения ID пользователя из под которого запущен Redmine:

# In my case Tester role ID is 4
if User.current.roles_for_project(project).map(&:id).include? 4
     User.current.id
end

Чтобы добавить проверку на статус, скрипт:

# ID для статуса "Проверка верстки" - 10
# ID custom field для текущего поля - 23 
if self.status_id == 10
   User.current.id
else
   cfs[23]
end

23 — id custom field «Протестировано». Соотвественно, cfs[23] вернет текщее значение поля.

Соответственно, если статус «Проверка верстки», то в поле прописывается значение id для текущего пользователя. Если-же поле другое, то поле перезаписывается текущим значением. Если убрать else, то поле сотрется.

Соответственно, если нужно, чтобы поле изменилось только когда пользователь с ролью тестировщик проставил статус «Проверка верстки» и сохранил, то код будет такой:

# ID для роли "Тестировщик" - 4
# ID для статуса "Проверка верстки" - 10
# ID custom field для текущего поля - 23 
if (User.current.roles_for_project(project).map(&:id).include? 4) &&
   (self.status_id == 10)
   User.current.id
else
   cfs[23]
end

Когда тип кастомного поля указан как вычисляемое — оно только в режиме read only.

Перекрестные поля

В некоторых случаях нужно сделать так, чтобы при изменении одного из полей менялось значение другого. Например, у тестировщиков в чеклисте есть два блока тестирования: тестирование кастомов и сервиса. Нужно в табличку по задаче в поле «Протестировал кастом» и «Протестировал сервис» прописывать ФИО тех, кто тестировал. Поскольку статусов отдельно для тестирования кастома и отдельно сервиса не заводили, чтобы не увеличивать количество статусов, было добавлено два чекбокса.

Когда тестировщик завершает тестировать кастом, он проставляет чекбокс «Кастом проверен». И аналогично после завершения тестирования сервиса он проставляет чекбокс «Сервис проверен».

Создано два вычисляемых поля с типом User (Пользователь). В них добавлен скрипт:

# ID для роли "Тестировщик" - 6
# ID для поля "Кастом проверен" - 30 
# ID для статуса "Финально проверено (new)" - 26. Статус в примере не проверяем, достаточно проверки роли.
# ID custom field для текущего поля - 31 
if (User.current.roles_for_project(project).map(&:id).include? 6) && (cfs[30] == true)
#&&   (self.status_id == 26)
   User.current.id
else
   cfs[31]
end

При сохранении формы задачи происходит проверка состояния флага «Кастом проверен». Если он выставлен и текущий пользователь в роли «Тестировщик», тогда в вычисляемое поле «Кастом проверен» записывается ID текущего пользователя.

Spread the love
Запись опубликована в рубрике IT tools, IT опыт, IT рецепты, IT решения для бизнеса с метками . Добавьте в закладки постоянную ссылку.