Redmine:多次复制问题

时间:2015-07-27 16:27:17

标签: sql ruby-on-rails ruby redmine

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

但有没有办法多次这样做? 就像重新创造一个问题(包括其子女)二十或五十次一样?

修改2

此新功能应可通过Redmine界面访问,并与任何浏览器兼容。

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

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

在哪里可以找到本机问题复制功能的代码?

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

修改

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

2 个答案:

答案 0 :(得分:1)

我认为最简单的方法是从redmine源代码修改开始。 一旦它工作,您可以继续并尝试将此功能提取到插件中。

请注意,我不是一个红宝石开发者,所以下面的一些事情只是我的猜测。但是之前我做了很少的小红族修改,希望我的想法很有用。

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

想法

复制单个问题的链接如下所示://redmine.myserver.com/projects/myapp/issues/12407/copy

我的想法是在此链接中添加num_copies参数,并在代码中使用它来创建多个副本。

您不需要UI,一旦实现,该功能将如下工作:

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

实施计划

现在,该怎么做。 我指的是看起来很新鲜的redmine mirror on 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参数(这是我们正在复制的问题的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操作会处理表单帖子。

3)将num_copies参数添加到表单

找到view file使用的new issue action。 这里有一个新问题表单的模板,尝试添加类似于copy_fromnum_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] %>

如果你为`num_copies添加一个类似的行,我不能100%确定它是否会起作用。您可能还需要修改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

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

我无法为此提供确切的代码段,但它不应该非常复杂。 检查bulk_update方法中的this代码,它看起来就像您需要的那样:

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

答案 1 :(得分:0)

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

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

PS:您可以将您的请求留在redmine社区, 也许你很幸运https://redmine.org/projects/redmine/issues