Redmine: Copy issue multiple times Redmine: Copy issue multiple times sql sql

Redmine: Copy issue multiple times


I think the simplest way to do this is to start with redmine source modification.Once it works you can move on and try to extract this feature into plugin.

Note, that I am not a ruby developer, so some things below are just my guesses. But I did few small redmine modifications like this before and hope that my thoughts can be useful.

It will also be easier if you familiar with some of MVC frameworks (for any language), because they mostly have a similar structure with routes, controllers, views and models.

The Idea

The link to copy single issue looks like this: //redmine.myserver.com/projects/myapp/issues/12407/copy.

My idea is to add a num_copies parameter to this link and use it in the code to create many copies.

You need no UI for that, once implemented the feature will work like this:

  • find the issue you need
  • choose the copy action for it
  • once the form opened, manually add ?num_copies=XX parameter into the URL (//redmine.myserver.com/projects/myapp/issues/12407/copy?num_copies=50) and press 'Enter' to reload the form
  • check the details and submit the form - it will create multiple copies according to the num_copies parameter

The Implementation Plan

Now, how to do this.I am referring to the redmine mirror on github which looks fresh.

1) Find where the .../copy link is handled

When you open the form to copy the issue, you'll see form like this:

<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>

Note the form action, it points to the /issues link and it will submit the copy_from parameter (this is ID of the issue we are copying).

2) Find the code which handles the form submission

We could first go and check through the config/routes.rb, but we can just guess that we need the controllers/issues_controller.rb

Search for the place where copy_from parameter is used.

You'll see the build_new_issue_from_params method. Now search for its usages and you'll find this:

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

From how it looks, I guess that it is called before both new and create actions.Looking at new and create definitions, the new action renders the new issue form and the create action handles the form post.

3) Add the num_copies parameter to the form

Find the view file used by new issue action.Here there is a template for the new issue form, try to add num_copies parameter similar to the 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] %>

Here I am not 100% sure if it will just work if you add a similar line for `num_copies. You may also need to modify the route.

When done, you should have the new issue form like this:

<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) Handle the num_copies parameter

It should be done in the 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

Here you already have the @issue variable created in the build_new_issue_from_params method and what you need to do is to check if num_copies parameter is set and if it is set then copy / save the @issue in a loop to create additional copies.

I can't provide the exact code snippet for this, but it should not be very complex.Check this code in the bulk_update method, it looks like what you need:

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


I think this specific plugin is not high priority for Redmine community. But, you can write very easy API calling for Java, Python or other language to do what you exactly want.

Here, you can see API documentation how to list, create, update issues.Issue API documentation

PS: You can leave your request in redmine community, maybe you are lucky https://redmine.org/projects/redmine/issues