Redmine:多次复制问题

Redmine: Copy issue multiple times

复制一个问题及其子问题是一项本机内置功能,因此工作正常。

但是有没有办法多次执行此操作? 就像将一个问题(包括它的子问题)重新创建二十次或五十次?

编辑 2

这个新功能应该可以通过 Redmine 界面访问并且与任何浏览器兼容。

无论是全新的插件、内置复制功能的扩展、对 PHP-script 的调用还是其他任何东西,都无关紧要。 由于兼容性(网络、浏览器等),我想完全服务器端修改是唯一的方法。

必须更改默认插件(在投票 tutorial 中创建)或核心元素的哪些部分?

哪里可以找到原生问题复制功能的代码?

或者 - 如果这一切都太复杂 - 我将如何编写我的插件以指向直接操作 SQL 数据库的 PHP 文件?

编辑:

澄清一下:就像普通的复制功能一样(在上下文菜单或右上角link,我不在乎)我想复制一个问题及其子问题n次. 要让用户设置金额n,可以输入任何用户号码,如文本框、弹出窗口等。

我认为这个特定的插件对于 Redmine 社区来说不是高优先级。 但是,您可以编写非常简单的 API 调用 Java、Python 或其他语言来完成您真正想要的。

在这里,您可以查看 API 文档,了解如何列出、创建和更新问题。 Issue API documentation

PS: 可以在redmine社区留言, 也许你很幸运https://redmine.org/projects/redmine/issues

我觉得最简单的方法就是从修改redmine源开始。 一旦成功,您就可以继续并尝试将此功能提取到插件中。

请注意,我不是 ruby 开发人员,因此以下内容只是我的猜测。但是我之前做过一些像这样的小redmine修改,希望我的想法有用。

如果您熟悉一些 MVC 框架(适用于任何语言),这也会更容易,因为它们大多具有与路由、控制器、视图和模型相似的结构。

想法

复制单期的link是这样的://redmine.myserver.com/projects/myapp/issues/12407/copy.

我的想法是给这个link加上一个num_copies参数,然后在代码中使用它来创建很多副本。

你不需要 UI,一旦实现该功能将像这样工作:

  • 找到你需要的问题
  • 为其选择 copy 操作
  • 表单打开后,手动将 ?num_copies=XX 参数添加到 URL (//redmine.myserver.com/projects/myapp/issues/12407/copy?num_copies=50) 并按 'Enter' 重新加载表单
  • 检查详细信息并提交表格 - 它会根据 num_copies 参数创建多个副本

实施计划

现在,如何做到这一点。 我指的是看起来新鲜的redmine mirror on github

1) 找到 .../copy link 被处理的地方

当您打开表单复制问题时,您会看到这样的表单:

<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 link 并且它将提交 copy_from 参数(这是我们正在复制的问题的 ID)。

2) 找到处理表单提交的代码

我们可以先去检查 config/routes.rb,但我们只能猜测我们需要 controllers/issues_controller.rb

搜索copy_from参数为used的地方。

您将看到 build_new_issue_from_params 方法。 现在搜索它的用法,你会发现 this:

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

从外观上看,我猜它是在 newcreate 操作之前调用的。 查看新建和创建定义,new 操作呈现新问题表单,create 操作处理表单 post.

3) 将num_copies参数添加到表单

找到 view file used by new issue action。 这里有一个新问题表单的模板,尝试添加类似于 copy_from:

num_copies 参数
<%= 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参数

应该在create action:

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

这里您已经在 build_new_issue_from_params 方法中创建了 @issue 变量,您需要做的是检查是否设置了 num_copies 参数,如果设置了则复制/ 将 @issue 保存在循环中以创建其他副本。

我无法为此提供确切的代码片段,但它应该不会很复杂。 查看bulk_update方法中的this代码,看起来像你需要的:

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