Изменить значение пользовательского поля в хуке Redmine

Проблема:

Мои задачи в настоящее время имеют 3 настраиваемых поля, скажем, FieldA (список выбора), FieldB (не имеет значения) и FieldC (текст).

Что должно произойти, так это то, что при сохранении FieldC принимает значение <FieldA>-<date in Ymd>-<number from database>

В качестве примера предположим, что FieldA имеет значение «Test», и сегодня 8 января 2015 года. Тогда FieldC должен быть Test-20150108-001, где 001 происходит из пользовательской таблицы в базе данных, это уникально для каждого значения FieldA. , и сбрасывается каждый год.

Что я сделал на данный момент:

Я использовал сценарий командной строки для создания плагина через

 ruby script/rails generate redmine_plugin subticket

И модель через

ruby script/rails generate redmine_plugin_model subticket subticket_ids fa:string lastnum:integer year:integer

(где fa — значение поля A, lastnum — последнее число, использованное для этого значения, а year — текущий год, для которого применяется lastnum).

Затем я приступил к init.rb, чтобы добавить прослушиватель хуков, чтобы реализовать хуки предварительного сохранения:

 require_dependency 'subticket_hooks'

И создал файл lib/subticket_hooks.rb со следующим содержимым:

class SubticketHooksListener < Redmine::Hook::ViewListener
  def controller_issues_edit_before_save(context={})
    issue = context[:issue]

  end
end

Однако я не могу найти никакой документации о том, как получить доступ/записать значение настраиваемого поля здесь. Все еще работаю над тем, чтобы модель работала, но я предполагаю, что документация достаточно ясна для меня, чтобы поэкспериментировать (конечно, любая информация приветствуется!)

Обратите внимание, что это далеко за пределами моих возможностей, поскольку мой основной опыт написан на совершенно другом языке - не торопитесь!


person Nick Andriopoulos    schedule 08.01.2015    source источник
comment
Достигли ли вы какого-либо прогресса?   -  person fjuan    schedule 21.01.2015


Ответы (3)


у меня была такая же задача

Мое решение: каждый настраиваемый объект redmine имеет поле custom_field_values, это значение представляет собой массив CustomFieldValue. CustomFieldValue содержит текущее значение, описание настраиваемого поля и настраиваемый объект.

Нужные значения я считываю и изменяю путем сортировки. Возможно, это не лучший вариант, но я не так давно познакомился с языком ruby.

Метод чтения значений пользовательских полей:

def object_custom_field_value(object, field_name)
  object.custom_field_values.each do |field|
    if field.custom_field.name == field_name
      return field.value
    end
  end
end

И для изменения:

def object_custom_field_set_value(object, field_name, value)
  object.custom_field_values.each do |field|
    if field.custom_field.name == field_name
      field.value = value
    end
  end
end

Надеюсь это поможет!

person General Failure    schedule 24.06.2015

Получить: object.custom_field_value(field.id)

Обновление: object.custom_field_values = {field.id => val}. Не забудьте сохранить: object.save_custom_field_values. Однако это не работает для создания стоимости, поэтому проверьте через object.custom_value_for(field.id).id?

Создать/обновить: легко. Просто добавьте строку object.custom_vield_values перед кодом обновления. Он возвращает список значений и запускает создание пустого значения. Пример

u = User.find(1)
cf = CustomField.where('name', 'mobile phone').first
u.custom_field_values # returns values, triggers creation
u.custom_field_values = {cf.id = "+123456789"} # set value
u.save_custom_field_values # save

Документы: rubydoc

person Norman Edance    schedule 17.06.2019

Обновление настраиваемого поля проекта с именем «Электронная почта»:

project = Project.find(1)
cv = CustomValue.where(customized_type: "Project", customized_id: project.id).includes(:custom_field).where(custom_fields: {type: 'ProjectCustomField', name: 'Email'}).first

cv.update value: '[email protected]'
person prograils    schedule 19.03.2020