Подтвердить что ты не робот

Redmine: многократная копия

Копирование одной проблемы и ее дочерних проблем является встроенной функцией, и, следовательно, она работает нормально.

Но есть ли способ сделать это несколько раз? Как повторное создание одной проблемы (включая ее детей) двадцать или пятьдесят раз?

Изменить 2

Эта новая функциональность должна быть доступна через интерфейс Redmine и совместима с любым браузером.

Не имеет значения, является ли это полностью новым плагином, расширением встроенной функции копирования, вызовом PHP-script или чем-либо еще. Из-за совместимости (сети, браузеры и т.д.), Я предполагаю, что полностью серверная модификация - единственный способ пойти сюда.

Какие части плагина по умолчанию (созданные в голосовании tutorial) или ключевой элемент необходимо изменить?

Где я могу найти код для собственной функции копирования проблемы?

Или - если все это слишком сложно - как я могу написать свой плагин, чтобы указать на файл PHP, который напрямую управляет базой данных SQL?

Edit

Чтобы уточнить: так же, как и обычная функция копирования (либо в контекстном меню, либо в правом верхнем звене, мне все равно). Я хочу копировать одну проблему и ее подвопросы n раз. Чтобы пользователь установил величину n, любой входной номер пользователя может быть достаточным, например текстовое поле, всплывающее окно и т.д.

4b9b3361

Ответ 1

Я думаю, что самый простой способ сделать это - начать с изменения версии redmine. Как только он работает, вы можете продолжить работу и попытаться извлечь эту функцию в плагин.

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

Это также будет проще, если вы знакомы с некоторыми из MVC-фреймворков (для любого языка), потому что они в основном имеют сходную структуру с маршрутами, контроллерами, представлениями и моделями.

Идея

Ссылка на копию отдельной проблемы выглядит следующим образом: //redmine.myserver.com/projects/myapp/issues/12407/copy.

Моя идея - добавить параметр num_copies к этой ссылке и использовать его в коде для создания множества копий.

Для этого вам не нужен интерфейс, после реализации функция будет работать следующим образом:

  • найдите нужный вам вопрос.
  • выберите для него действие copy
  • после открытия формы вручную добавьте параметр ?num_copies=XX в URL (//redmine.myserver.com/projects/myapp/issues/12407/copy?num_copies=50) и нажмите 'Enter', чтобы перезагрузить форму
  • проверьте детали и отправьте форму - она ​​создаст несколько копий в соответствии с параметром num_copies

План внедрения

Теперь, как это сделать. Я имею в виду redmine mirror на github, который выглядит свежим.

1) Найдите, где выполняется ссылка .../copy

Когда вы откроете форму для копирования проблемы, вы увидите следующую форму:

<form action="/projects/myapp/issues" class="new_issue" id="issue-form" method="post">
  <input id="copy_from" name="copy_from" type="hidden" value="12407">
  <div class="box tabular">
    <div id="all_attributes">
      ...
</form>

Обратите внимание на действие формы, оно указывает на ссылку /issues и отправит параметр copy_from (это идентификатор проблемы, которую мы копируем).

2) Найдите код, который обрабатывает отправку формы

Мы могли сначала пройти и проверить через config/routes.rb, но мы можем просто предположить, что нам нужен controllers/issues_controller.rb

Найдите место, где copy_from параметр используется.

Вы увидите метод build_new_issue_from_params. Теперь найдите его использование, и вы найдете this:

before_filter :build_new_issue_from_params, :only => [:new, :create]

Как он выглядит, я думаю, что он вызывается перед действиями new и create. Рассматривая новые и создавая определения, действие new отображает новую форму вопроса, а действие create обрабатывает сообщение формы.

3) Добавьте параметр num_copies в форму

Найдите файл просмотра, который используется действие новой проблемы, Здесь есть шаблон для новой формы выпуска, попробуйте добавить параметр num_copies, похожий на copy_from:

<%= title l(:label_issue_new) %>    
<%= call_hook(:view_issues_new_top, {:issue => @issue}) %>    
...
  <%= error_messages_for 'issue' %>
  <%= hidden_field_tag 'copy_from', params[:copy_from] if params[:copy_from] %>

Здесь я не уверен на 100%, если он будет работать, если вы добавите аналогичную строку для `num_copies. Вам также может потребоваться изменить route.

Когда закончите, у вас должна появиться новая проблема:

<form action="/projects/myapp/issues" class="new_issue" id="issue-form" method="post">
  <input id="copy_from" name="copy_from" type="hidden" value="12407">
  <input id="copy_from" name="num_copies" type="hidden" value="50">
  <div class="box tabular">
    <div id="all_attributes">
      ...
</form>

4) Обращайтесь с параметром num_copies

Это должно быть сделано в создать действие:

def create
  ...
  call_hook(:controller_issues_new_before_save, { :params => params, :issue => @issue })
  @issue.save_attachments(params[:attachments] || (params[:issue] && params[:issue][:uploads]))
  if @issue.save
      ...
end

Здесь у вас уже есть переменная @issue, созданная в методе build_new_issue_from_params, и вам нужно проверить, установлен ли параметр num_copies, и если он установлен, то скопируйте/сохраните @issue в для создания дополнительных копий.

Я не могу предоставить для этого точный фрагмент кода, но он не должен быть очень сложным. Проверьте этот код в методе bulk_update, он выглядит так, как вам нужно:

issue = orig_issue.copy({},
  :attachments => copy_attachments,
  :subtasks => copy_subtasks,
  :link => link_copy?(params[:link_copy])
)

Ответ 2

Я думаю, что этот конкретный плагин не является высокоприоритетным для сообщества Redmine. Но вы можете написать очень простой API для Java, Python или другого языка, чтобы делать то, что вы точно хотите.

Здесь вы можете увидеть документацию API, как перечислить, создать, обновить проблемы. Документация по выпуску API

PS: Вы можете оставить свой запрос в сообществе redmine, возможно, вам повезло https://redmine.org/projects/redmine/issues