Изменить значение настраиваемого поля в Redmine Hook

Эта проблема:

Мои проблемы в настоящее время имеют 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 - это значение поля FieldA, 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

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

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

1 ответ

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

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

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

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

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

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

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

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@mail.com'

Получить: 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

Другие вопросы по тегам