summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean-Philippe Lang <jp_lang@yahoo.fr>2018-12-02 11:13:28 +0000
committerJean-Philippe Lang <jp_lang@yahoo.fr>2018-12-02 11:13:28 +0000
commit12d1372ae54b0bfeeef6ce868a7ad153b391706c (patch)
tree196239c815f5c9e518b59bdd91c58651adaf0e14
parent3c423df203476429a3875f18d307992c3f9693bc (diff)
downloadredmine-12d1372ae54b0bfeeef6ce868a7ad153b391706c.tar.gz
redmine-12d1372ae54b0bfeeef6ce868a7ad153b391706c.zip
Let admin users unarchive subprojects of archived projects (#29993).
git-svn-id: http://svn.redmine.org/redmine/trunk@17681 e93f8b46-1217-0410-a6f0-8f06a7374b81
-rw-r--r--app/models/project.rb12
-rw-r--r--app/views/admin/projects.html.erb2
-rw-r--r--test/unit/project_test.rb15
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 @@
<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>
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