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]
从外观上看,我猜它是在 new
和 create
操作之前调用的。
查看新建和创建定义,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])
)
复制一个问题及其子问题是一项本机内置功能,因此工作正常。
但是有没有办法多次执行此操作? 就像将一个问题(包括它的子问题)重新创建二十次或五十次?
编辑 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]
从外观上看,我猜它是在 new
和 create
操作之前调用的。
查看新建和创建定义,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])
)