From 94d3595e311a26a49dc9fad0596e227cec43f7c5 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Sun, 20 Mar 2011 11:46:01 +0000 Subject: [PATCH] Fixed: children projects are deleted instead of being destroyed when destroying parent project (#7904). git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@5171 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/models/project.rb | 11 ++--------- test/unit/project_test.rb | 39 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 39 insertions(+), 11 deletions(-) diff --git a/app/models/project.rb b/app/models/project.rb index c736bcc3a7..05490d9f54 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -56,7 +56,7 @@ class Project < ActiveRecord::Base :join_table => "#{table_name_prefix}custom_fields_projects#{table_name_suffix}", :association_foreign_key => 'custom_field_id' - acts_as_nested_set :order => 'name' + acts_as_nested_set :order => 'name', :dependent => :destroy acts_as_attachable :view_permission => :view_files, :delete_permission => :manage_files @@ -79,7 +79,7 @@ class Project < ActiveRecord::Base # reserved words validates_exclusion_of :identifier, :in => %w( new ) - before_destroy :delete_all_members, :destroy_children + before_destroy :delete_all_members named_scope :has_module, lambda { |mod| { :conditions => ["#{Project.table_name}.id IN (SELECT em.project_id FROM #{EnabledModule.table_name} em WHERE em.name=?)", mod.to_s] } } named_scope :active, { :conditions => "#{Project.table_name}.status = #{STATUS_ACTIVE}"} @@ -627,13 +627,6 @@ class Project < ActiveRecord::Base private - # Destroys children before destroying self - def destroy_children - children.each do |child| - child.destroy - end - end - # Copies wiki from +project+ def copy_wiki(project) # Check that the source project has a wiki first diff --git a/test/unit/project_test.rb b/test/unit/project_test.rb index 936008b051..e591cf2d33 100644 --- a/test/unit/project_test.rb +++ b/test/unit/project_test.rb @@ -1,5 +1,5 @@ -# redMine - project management software -# Copyright (C) 2006-2007 Jean-Philippe Lang +# Redmine - project management software +# Copyright (C) 2006-2011 Jean-Philippe Lang # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -183,6 +183,41 @@ class ProjectTest < ActiveSupport::TestCase assert_nil Issue.first(:conditions => {:project_id => @ecookbook.id}) end + def test_destroying_root_projects_should_clear_data + Project.roots.each do |root| + root.destroy + end + + assert_equal 0, Project.count, "Projects were not deleted: #{Project.all.inspect}" + assert_equal 0, Member.count, "Members were not deleted: #{Member.all.inspect}" + assert_equal 0, MemberRole.count + assert_equal 0, Issue.count + assert_equal 0, Journal.count + assert_equal 0, JournalDetail.count + assert_equal 0, Attachment.count + assert_equal 0, EnabledModule.count + assert_equal 0, IssueCategory.count + assert_equal 0, IssueRelation.count + assert_equal 0, Board.count + assert_equal 0, Message.count + assert_equal 0, News.count + assert_equal 0, Query.count(:conditions => "project_id IS NOT NULL") + assert_equal 0, Repository.count + assert_equal 0, Changeset.count + assert_equal 0, Change.count + #assert_equal 0, Comment.count + assert_equal 0, TimeEntry.count + assert_equal 0, Version.count + assert_equal 0, Watcher.count + assert_equal 0, Wiki.count + assert_equal 0, WikiPage.count + assert_equal 0, WikiContent.count + assert_equal 0, WikiContent::Version.count + assert_equal 0, Project.connection.select_all("SELECT * FROM projects_trackers").size + assert_equal 0, Project.connection.select_all("SELECT * FROM custom_fields_projects").size + assert_equal 0, CustomValue.count(:conditions => {:customized_type => ['Project', 'Issue', 'TimeEntry', 'Version']}) + end + def test_move_an_orphan_project_to_a_root_project sub = Project.find(2) sub.set_parent! @ecookbook