@@ -299,29 +299,22 class ProjectsController < ApplicationController | |||
|
299 | 299 | # admin is allowed to move issues to any active (visible) project |
|
300 | 300 | @projects = Project.find(:all, :conditions => Project.visible_by(User.current), :order => 'name') |
|
301 | 301 | else |
|
302 |
User.current.memberships.each {|m| @projects << m.project if m.role.allowed_to?(: |
|
|
302 | User.current.memberships.each {|m| @projects << m.project if m.role.allowed_to?(:move_issues)} | |
|
303 | 303 | end |
|
304 | 304 | # issue can be moved to any tracker |
|
305 | 305 | @trackers = Tracker.find(:all) |
|
306 | 306 | if request.post? && params[:new_project_id] && @projects.collect(&:id).include?(params[:new_project_id].to_i) && params[:new_tracker_id] |
|
307 | 307 | new_project = Project.find_by_id(params[:new_project_id]) |
|
308 | new_tracker = Tracker.find_by_id(params[:new_tracker_id]) | |
|
309 | @issues.each do |i| | |
|
310 | if new_project && i.project_id != new_project.id | |
|
311 | # issue is moved to another project | |
|
312 | i.category = nil | |
|
313 | i.fixed_version = nil | |
|
314 | # delete issue relations | |
|
315 | i.relations_from.clear | |
|
316 | i.relations_to.clear | |
|
317 | i.project = new_project | |
|
318 | end | |
|
319 | if new_tracker | |
|
320 | i.tracker = new_tracker | |
|
321 | end | |
|
322 | i.save | |
|
308 | new_tracker = params[:new_tracker_id].blank? ? nil : Tracker.find_by_id(params[:new_tracker_id]) | |
|
309 | unsaved_issue_ids = [] | |
|
310 | @issues.each do |issue| | |
|
311 | unsaved_issue_ids << issue.id unless issue.move_to(new_project, new_tracker) | |
|
312 | end | |
|
313 | if unsaved_issue_ids.empty? | |
|
314 | flash[:notice] = l(:notice_successful_update) unless @issues.empty? | |
|
315 | else | |
|
316 | flash[:error] = l(:notice_failed_to_save_issues, unsaved_issue_ids.size, @issues.size, '#' + unsaved_issue_ids.join(', #')) | |
|
323 | 317 | end |
|
324 | flash[:notice] = l(:notice_successful_update) | |
|
325 | 318 | redirect_to :controller => 'issues', :action => 'index', :project_id => @project |
|
326 | 319 | end |
|
327 | 320 | end |
@@ -61,6 +61,32 class Issue < ActiveRecord::Base | |||
|
61 | 61 | self |
|
62 | 62 | end |
|
63 | 63 | |
|
64 | # Move an issue to a new project and tracker | |
|
65 | def move_to(new_project, new_tracker = nil) | |
|
66 | transaction do | |
|
67 | if new_project && project_id != new_project.id | |
|
68 | # delete issue relations | |
|
69 | self.relations_from.clear | |
|
70 | self.relations_to.clear | |
|
71 | # issue is moved to another project | |
|
72 | self.category = nil | |
|
73 | self.fixed_version = nil | |
|
74 | self.project = new_project | |
|
75 | end | |
|
76 | if new_tracker | |
|
77 | self.tracker = new_tracker | |
|
78 | end | |
|
79 | if save | |
|
80 | # Manually update project_id on related time entries | |
|
81 | TimeEntry.update_all("project_id = #{new_project.id}", {:issue_id => id}) | |
|
82 | else | |
|
83 | rollback_db_transaction | |
|
84 | return false | |
|
85 | end | |
|
86 | end | |
|
87 | return true | |
|
88 | end | |
|
89 | ||
|
64 | 90 | def priority_id=(pid) |
|
65 | 91 | self.priority = nil |
|
66 | 92 | write_attribute(:priority_id, pid) |
@@ -10,7 +10,7 | |||
|
10 | 10 | { :url => { :set_filter => 1 }, |
|
11 | 11 | :update => "content", |
|
12 | 12 | :with => "Form.serialize('query_form')" |
|
13 |
}, :class => 'icon icon-ed |
|
|
13 | }, :class => 'icon icon-checked' %> | |
|
14 | 14 | |
|
15 | 15 | <%= link_to_remote l(:button_clear), |
|
16 | 16 | { :url => { :set_filter => 1 }, |
|
1 | NO CONTENT: modified file, binary diff hidden |
@@ -18,7 +18,7 | |||
|
18 | 18 | require File.dirname(__FILE__) + '/../test_helper' |
|
19 | 19 | |
|
20 | 20 | class IssueTest < Test::Unit::TestCase |
|
21 | fixtures :projects, :users, :members, :trackers, :issue_statuses, :issue_categories, :enumerations, :issues, :custom_fields, :custom_values | |
|
21 | fixtures :projects, :users, :members, :trackers, :issue_statuses, :issue_categories, :enumerations, :issues, :custom_fields, :custom_values, :time_entries | |
|
22 | 22 | |
|
23 | 23 | def test_category_based_assignment |
|
24 | 24 | issue = Issue.create(:project_id => 1, :tracker_id => 1, :author_id => 3, :status_id => 1, :priority => Enumeration.get_values('IPRI').first, :subject => 'Assignment test', :description => 'Assignment test', :category_id => 1) |
@@ -59,4 +59,15 class IssueTest < Test::Unit::TestCase | |||
|
59 | 59 | assert issue2.reload.closed? |
|
60 | 60 | assert issue3.reload.closed? |
|
61 | 61 | end |
|
62 | ||
|
63 | def test_move_to_another_project | |
|
64 | issue = Issue.find(1) | |
|
65 | assert issue.move_to(Project.find(2)) | |
|
66 | issue.reload | |
|
67 | assert_equal 2, issue.project_id | |
|
68 | # Category removed | |
|
69 | assert_nil issue.category | |
|
70 | # Make sure time entries were move to the target project | |
|
71 | assert_equal 2, issue.time_entries.first.project_id | |
|
72 | end | |
|
62 | 73 | end |
General Comments 0
You need to be logged in to leave comments.
Login now