move_as_copy.patch
app/models/issue.rb (working copy) | ||
---|---|---|
98 | 98 |
end |
99 | 99 |
return true |
100 | 100 |
end |
101 |
|
|
101 |
# Move an issue to a new project and tracker |
|
102 |
def move_to_return_issue(new_project, new_tracker = nil,is_copy = nill) |
|
103 |
transaction do |
|
104 |
if new_project && project_id != new_project.id |
|
105 |
# delete issue relations |
|
106 |
unless Setting.cross_project_issue_relations? |
|
107 |
self.relations_from.clear |
|
108 |
self.relations_to.clear |
|
109 |
end |
|
110 |
# issue is moved to another project |
|
111 |
# reassign to the category with same name if any |
|
112 |
new_category = category.nil? ? nil : new_project.issue_categories.find_by_name(category.name) |
|
113 |
self.category = new_category |
|
114 |
self.fixed_version = nil |
|
115 |
self.project = new_project |
|
116 |
end |
|
117 |
if new_tracker |
|
118 |
self.tracker = new_tracker |
|
119 |
end |
|
120 |
if(is_copy) |
|
121 |
new_issue=self.clone |
|
122 |
new_issue.id=nil |
|
123 |
if new_issue.save |
|
124 |
# Manually update project_id on related time entries |
|
125 |
TimeEntry.update_all("project_id = #{new_project.id}", {:issue_id => id}) |
|
126 |
return new_issue |
|
127 |
else |
|
128 |
rollback_db_transaction |
|
129 |
end |
|
130 |
else |
|
131 |
if save |
|
132 |
# Manually update project_id on related time entries |
|
133 |
TimeEntry.update_all("project_id = #{new_project.id}", {:issue_id => id}) |
|
134 |
else |
|
135 |
rollback_db_transaction |
|
136 |
end |
|
137 |
end |
|
138 |
|
|
139 |
end |
|
140 |
return self |
|
141 |
end |
|
142 | 102 |
def priority_id=(pid) |
143 | 103 |
self.priority = nil |
144 | 104 |
write_attribute(:priority_id, pid) |
app/controllers/issues_controller.rb (working copy) | ||
---|---|---|
269 | 269 |
@trackers = @target_project.trackers |
270 | 270 |
if request.post? |
271 | 271 |
new_tracker = params[:new_tracker_id].blank? ? nil : @target_project.trackers.find_by_id(params[:new_tracker_id]) |
272 |
unsaved_issue_ids = [] |
|
273 |
@issues.each do |issue| |
|
274 |
issue.init_journal(User.current) |
|
275 |
unsaved_issue_ids << issue.id unless issue.move_to(@target_project, new_tracker) |
|
276 |
end |
|
277 |
if unsaved_issue_ids.empty? |
|
278 |
flash[:notice] = l(:notice_successful_update) unless @issues.empty? |
|
272 |
is_copy=params["is_copy"] |
|
273 |
if(@issues.size>1) |
|
274 |
unsaved_issue_ids = [] |
|
275 |
@issues.each do |issue| |
|
276 |
issue.init_journal(User.current) |
|
277 |
unsaved_issue_ids << issue.id unless issue.move_to(@target_project, new_tracker,is_copy) |
|
278 |
end |
|
279 |
if unsaved_issue_ids.empty? |
|
280 |
flash[:notice] = l(:notice_successful_update) unless @issues.empty? |
|
281 |
else |
|
282 |
flash[:error] = l(:notice_failed_to_save_issues, unsaved_issue_ids.size, @issues.size, '#' + unsaved_issue_ids.join(', #')) |
|
283 |
end |
|
284 |
redirect_to :controller => 'issues', :action => 'index', :project_id => @target_project |
|
285 | 279 |
else |
280 |
flash[:error] = l(:notice_failed_to_save_issues, unsaved_issue_ids.size, @issues.size, '#' + unsaved_issue_ids.join(', #')) |
|
286 |
issue=@issues[0].move_to_return_issue(@target_project, new_tracker,is_copy) |
|
287 |
redirect_to :controller => 'issues', :action => 'show', :id => issue |
|
288 | 281 |
end |
282 |
redirect_to :controller => 'issues', :action => 'index', :project_id => @project |
|
289 | 283 |
return |
290 | 284 |
end |
291 | 285 |
render :layout => false if request.xhr? |
app/views/issues/move.rhtml (working copy) | ||
---|---|---|
16 | 16 |
|
17 | 17 |
<p><label for="new_tracker_id"><%=l(:field_tracker)%> :</label> |
18 | 18 |
<%= select_tag "new_tracker_id", "<option value=\"\">#{l(:label_no_change_option)}</option>" + options_from_collection_for_select(@trackers, "id", "name") %></p> |
19 |
<p><label for="is_copy">Move a Copy? </label> |
|
20 |
<%=check_box_tag("is_copy", '1', 0, :id => "is_copy") + hidden_field_tag("is_copy", '0')%> |
|
21 |
</p> |
|
22 | 19 |
</div> |
23 | 20 |
|
24 | 21 |
<%= submit_tag l(:button_move) %> |