From 12d1372ae54b0bfeeef6ce868a7ad153b391706c Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Sun, 2 Dec 2018 11:13:28 +0000 Subject: [PATCH] Let admin users unarchive subprojects of archived projects (#29993). git-svn-id: http://svn.redmine.org/redmine/trunk@17681 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/models/project.rb | 12 ++++-------- app/views/admin/projects.html.erb | 2 +- test/unit/project_test.rb | 15 ++++++++++----- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/app/models/project.rb b/app/models/project.rb index a8dd05816..85d9cb43f 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -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 diff --git a/app/views/admin/projects.html.erb b/app/views/admin/projects.html.erb index 077f87c27..aa462741d 100644 --- a/app/views/admin/projects.html.erb +++ b/app/views/admin/projects.html.erb @@ -33,7 +33,7 @@ <%= format_date(project.created_on) %> <%= 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') %> diff --git a/test/unit/project_test.rb b/test/unit/project_test.rb index d86c30d13..ccbb92225 100644 --- a/test/unit/project_test.rb +++ b/test/unit/project_test.rb @@ -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 -- 2.39.5