<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -17,7 +17,9 @@
 
 class VersionsController &lt; ApplicationController
   menu_item :roadmap
-  before_filter :find_project, :authorize
+  before_filter :find_version, :except =&gt; :close_completed
+  before_filter :find_project, :only =&gt; :close_completed
+  before_filter :authorize
 
   def show
   end
@@ -28,6 +30,13 @@ class VersionsController &lt; ApplicationController
       redirect_to :controller =&gt; 'projects', :action =&gt; 'settings', :tab =&gt; 'versions', :id =&gt; @project
     end
   end
+  
+  def close_completed
+    if request.post?
+      @project.close_completed_versions
+    end
+    redirect_to :controller =&gt; 'projects', :action =&gt; 'settings', :tab =&gt; 'versions', :id =&gt; @project
+  end
 
   def destroy
     @version.destroy
@@ -45,10 +54,16 @@ class VersionsController &lt; ApplicationController
   end
 
 private
-  def find_project
+  def find_version
     @version = Version.find(params[:id])
     @project = @version.project
   rescue ActiveRecord::RecordNotFound
     render_404
-  end  
+  end
+  
+  def find_project
+    @project = Project.find(params[:project_id])
+  rescue ActiveRecord::RecordNotFound
+    render_404
+  end
 end</diff>
      <filename>app/controllers/versions_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -304,6 +304,17 @@ class Project &lt; ActiveRecord::Base
                          :order =&gt; &quot;#{Tracker.table_name}.position&quot;)
   end
   
+  # Closes open and locked project versions that are completed
+  def close_completed_versions
+    Version.transaction do
+      versions.find(:all, :conditions =&gt; {:status =&gt; %w(open locked)}).each do |version|
+        if version.completed?
+          version.update_attribute(:status, 'closed')
+        end
+      end
+    end
+  end
+  
   # Returns a hash of project users grouped by role
   def users_by_role
     members.find(:all, :include =&gt; [:user, :roles]).inject({}) do |h, m|</diff>
      <filename>app/models/project.rb</filename>
    </modified>
    <modified>
      <diff>@@ -28,4 +28,10 @@
 &lt;p class=&quot;nodata&quot;&gt;&lt;%= l(:label_no_data) %&gt;&lt;/p&gt;
 &lt;% end %&gt;
 
+&lt;div class=&quot;contextual&quot;&gt;
+&lt;% if @project.versions.any? %&gt;
+	&lt;%= link_to 'Close completed versions', {:controller =&gt; 'versions', :action =&gt; 'close_completed', :project_id =&gt; @project}, :method =&gt; :post %&gt;
+&lt;% end %&gt;
+&lt;/div&gt;
+
 &lt;p&gt;&lt;%= link_to_if_authorized l(:label_version_new), :controller =&gt; 'projects', :action =&gt; 'add_version', :id =&gt; @project %&gt;&lt;/p&gt;</diff>
      <filename>app/views/projects/settings/_versions.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -208,6 +208,12 @@ ActionController::Routing::Routes.draw do |map|
     end
   end
   
+  map.with_options :controller =&gt; 'versions' do |versions|
+    versions.with_options :conditions =&gt; {:method =&gt; :post} do |version_actions|
+      version_actions.connect 'projects/:project_id/versions/close_completed', :action =&gt; 'close_completed'
+    end
+  end
+  
   map.with_options :controller =&gt; 'repositories' do |repositories|
     repositories.with_options :conditions =&gt; {:method =&gt; :get} do |repository_views|
       repository_views.connect 'projects/:id/repository', :action =&gt; 'show'</diff>
      <filename>config/routes.rb</filename>
    </modified>
    <modified>
      <diff>@@ -31,7 +31,7 @@ Redmine::AccessControl.map do |map|
   map.permission :edit_project, {:projects =&gt; [:settings, :edit]}, :require =&gt; :member
   map.permission :select_project_modules, {:projects =&gt; :modules}, :require =&gt; :member
   map.permission :manage_members, {:projects =&gt; :settings, :members =&gt; [:new, :edit, :destroy, :autocomplete_for_member]}, :require =&gt; :member
-  map.permission :manage_versions, {:projects =&gt; [:settings, :add_version], :versions =&gt; [:edit, :destroy]}, :require =&gt; :member
+  map.permission :manage_versions, {:projects =&gt; [:settings, :add_version], :versions =&gt; [:edit, :close_completed, :destroy]}, :require =&gt; :member
   
   map.project_module :issue_tracking do |map|
     # Issue categories</diff>
      <filename>lib/redmine.rb</filename>
    </modified>
    <modified>
      <diff>@@ -47,6 +47,14 @@ class VersionsControllerTest &lt; ActionController::TestCase
     assert_template 'edit'
   end
   
+  def test_close_completed
+    Version.update_all(&quot;status = 'open'&quot;)
+    @request.session[:user_id] = 2
+    post :close_completed, :project_id =&gt; 'ecookbook'
+    assert_redirected_to :controller =&gt; 'projects', :action =&gt; 'settings', :tab =&gt; 'versions', :id =&gt; 'ecookbook'
+    assert_not_nil Version.find_by_status('closed')
+  end
+  
   def test_post_edit
     @request.session[:user_id] = 2
     post :edit, :id =&gt; 2, </diff>
      <filename>test/functional/versions_controller_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -374,6 +374,17 @@ class ProjectTest &lt; ActiveSupport::TestCase
 
     assert project.activities(true).include?(overridden_activity), &quot;Inactive Project specific Activity not found&quot;
   end
+  
+  def test_close_completed_versions
+    Version.update_all(&quot;status = 'open'&quot;)
+    project = Project.find(1)
+    assert_not_nil project.versions.detect {|v| v.completed? &amp;&amp; v.status == 'open'}
+    assert_not_nil project.versions.detect {|v| !v.completed? &amp;&amp; v.status == 'open'}
+    project.close_completed_versions
+    project.reload
+    assert_nil project.versions.detect {|v| v.completed? &amp;&amp; v.status != 'closed'}
+    assert_not_nil project.versions.detect {|v| !v.completed? &amp;&amp; v.status == 'open'}
+  end
 
   context &quot;Project#copy&quot; do
     setup do</diff>
      <filename>test/unit/project_test.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>cc684803bac964114319a39d52fd12fc84864a02</id>
    </parent>
  </parents>
  <author>
    <name>Jean-Philippe Lang</name>
    <email>jp_lang@yahoo.fr</email>
  </author>
  <url>http://github.com/edavis10/redmine/commit/8f40750ad7f7ad512fd816757f072c42fae20e66</url>
  <id>8f40750ad7f7ad512fd816757f072c42fae20e66</id>
  <committed-date>2009-11-09T10:53:12-08:00</committed-date>
  <authored-date>2009-11-09T10:53:12-08:00</authored-date>
  <message>Adds a link to automatically close completed versions in project settings (#1245).

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3023 e93f8b46-1217-0410-a6f0-8f06a7374b81</message>
  <tree>175905e0aaa657f33542ead952f80e6abe68a26e</tree>
  <committer>
    <name>Jean-Philippe Lang</name>
    <email>jp_lang@yahoo.fr</email>
  </committer>
</commit>
