]> source.dussan.org Git - redmine.git/commitdiff
Let admin users unarchive subprojects of archived projects (#29993).
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 2 Dec 2018 11:13:28 +0000 (11:13 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 2 Dec 2018 11:13:28 +0000 (11:13 +0000)
git-svn-id: http://svn.redmine.org/redmine/trunk@17681 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/models/project.rb
app/views/admin/projects.html.erb
test/unit/project_test.rb

index a8dd058163928482843d04c4054ffaf7f7718b8d..85d9cb43f717205b9cdba279d76b8f85ba21a56e 100644 (file)
@@ -393,15 +393,11 @@ class Project < ActiveRecord::Base
     true
   end
 
-  # Unarchives the project
-  # All its ancestors must be active
+  # Unarchives the project and its archived ancestors
   def unarchive
-    return false if ancestors.detect {|a| a.archived?}
-    new_status = STATUS_ACTIVE
-    if parent
-      new_status = parent.status
-    end
-    update_attribute :status, new_status
+    new_status = ancestors.any?(&:closed?) ? STATUS_CLOSED : STATUS_ACTIVE
+    self_and_ancestors.status(STATUS_ARCHIVED).update_all :status => new_status
+    reload
   end
 
   def close
index 077f87c27f990139ff06dfeb153bd2471f7bed32..aa462741d4ac397e2003f64c51b351de18a01e48 100644 (file)
@@ -33,7 +33,7 @@
   <td><%= format_date(project.created_on) %></td>
   <td class="buttons">
     <%= link_to(l(:button_archive), archive_project_path(project, :status => params[:status]), :data => {:confirm => l(:text_are_you_sure)}, :method => :post, :class => 'icon icon-lock') unless project.archived? %>
-    <%= link_to(l(:button_unarchive), unarchive_project_path(project, :status => params[:status]), :method => :post, :class => 'icon icon-unlock') if project.archived? && (project.parent.nil? || !project.parent.archived?) %>
+    <%= link_to(l(:button_unarchive), unarchive_project_path(project, :status => params[:status]), :method => :post, :class => 'icon icon-unlock') if project.archived? %>
     <%= link_to(l(:button_copy), copy_project_path(project), :class => 'icon icon-copy') %>
     <%= link_to(l(:button_delete), project_path(project), :method => :delete, :class => 'icon icon-del') %>
   </td>
index d86c30d139e3a4b83dc46afbb5c89b8969874258..ccbb92225acf2b06a061cd2bf22b5082cec19e5f 100644 (file)
@@ -192,18 +192,23 @@ class ProjectTest < ActiveSupport::TestCase
   def test_unarchive
     user = @ecookbook.members.first.user
     @ecookbook.archive
-    # A subproject of an archived project can not be unarchived
-    assert !@ecookbook_sub1.unarchive
 
     # Unarchive project
     assert @ecookbook.unarchive
-    @ecookbook.reload
     assert @ecookbook.active?
     assert !@ecookbook.archived?
     assert user.projects.include?(@ecookbook)
-    # Subproject can now be unarchived
+  end
+
+  def test_unarchive_child_project_should_unarchive_ancestors
+    @ecookbook.archive
     @ecookbook_sub1.reload
-    assert @ecookbook_sub1.unarchive
+    assert_equal Project::STATUS_ARCHIVED, @ecookbook_sub1.status
+
+    @ecookbook_sub1.unarchive
+    assert_equal Project::STATUS_ACTIVE, @ecookbook_sub1.status
+    @ecookbook.reload
+    assert_equal Project::STATUS_ACTIVE, @ecookbook.status
   end
 
   def test_unarchive_a_child_of_a_closed_project_should_set_status_to_closed