Redmine:多次复制问题

Jay*_*667 29 ruby sql ruby-on-rails redmine

复制一个问题及其子问题是一个本机内置功能,因此工作得很好.

但有多种方法可以多次这样做?就像重新创造一个问题(包括它的孩子)二十或五十次?

编辑2

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

它是一个全新的插件,内置复制功能的扩展,对一个PHP-script或其他任何东西的调用并不重要.由于兼容性(网络,浏览器等),我想完全服务器端修改是唯一的方法.

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

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

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

编辑:

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

Bor*_*rov 2

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

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

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

想法

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

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

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

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

实施计划

现在,如何做到这一点。我指的是github上的redmine镜像,它看起来很新鲜。

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>
Run Code Online (Sandbox Code Playgroud)

请注意表单操作,它指向/issues链接并将提交copy_from参数(这是我们正在复制的问题的 ID)。

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

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

搜索使用copy_from参数的地方。

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

before_filter :build_new_issue_from_params, :only => [:new, :create]
Run Code Online (Sandbox Code Playgroud)

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

num_copies3)在表单中添加参数

找到新问题操作使用的视图文件。这里有一个新问题表单的模板,尝试添加类似于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] %>
Run Code Online (Sandbox Code Playgroud)

在这里,我不能 100% 确定如果您为 `num_copies 添加类似的行,它是否会起作用。您可能还需要修改路线

完成后,您应该会得到如下所示的新问题表单:

<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>
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

在这里,您已经@issuebuild_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])
)
Run Code Online (Sandbox Code Playgroud)