<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>db/migrate/20091108092559_add_versions_status.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -143,6 +143,14 @@ class Issue &lt; ActiveRecord::Base
     if start_date &amp;&amp; soonest_start &amp;&amp; start_date &lt; soonest_start
       errors.add :start_date, :invalid
     end
+    
+    if fixed_version
+      if !assignable_versions.include?(fixed_version)
+        errors.add :fixed_version_id, :inclusion
+      elsif reopened? &amp;&amp; fixed_version.closed?
+        errors.add_to_base I18n.t(:error_can_not_reopen_issue_on_closed_version)
+      end
+    end
   end
   
   def validate_on_create
@@ -193,6 +201,18 @@ class Issue &lt; ActiveRecord::Base
     self.status.is_closed?
   end
   
+  # Return true if the issue is being reopened
+  def reopened?
+    if !new_record? &amp;&amp; status_id_changed?
+      status_was = IssueStatus.find_by_id(status_id_was)
+      status_new = IssueStatus.find_by_id(status_id)
+      if status_was &amp;&amp; status_new &amp;&amp; status_was.is_closed? &amp;&amp; !status_new.is_closed?
+        return true
+      end
+    end
+    false
+  end
+  
   # Returns true if the issue is overdue
   def overdue?
     !due_date.nil? &amp;&amp; (due_date &lt; Date.today) &amp;&amp; !status.is_closed?
@@ -203,6 +223,11 @@ class Issue &lt; ActiveRecord::Base
     project.assignable_users
   end
   
+  # Versions that the issue can be assigned to
+  def assignable_versions
+    @assignable_versions ||= (project.versions.open + [Version.find_by_id(fixed_version_id_was)]).compact.uniq.sort
+  end
+  
   # Returns true if this issue is blocked by another issue that is still open
   def blocked?
     !relations_to.detect {|ir| ir.relation_type == 'blocks' &amp;&amp; !ir.issue_from.closed?}.nil?</diff>
      <filename>app/models/issue.rb</filename>
    </modified>
    <modified>
      <diff>@@ -22,11 +22,16 @@ class Version &lt; ActiveRecord::Base
   acts_as_attachable :view_permission =&gt; :view_files,
                      :delete_permission =&gt; :manage_files
 
+  VERSION_STATUSES = %w(open locked closed)
+  
   validates_presence_of :name
   validates_uniqueness_of :name, :scope =&gt; [:project_id]
   validates_length_of :name, :maximum =&gt; 60
   validates_format_of :effective_date, :with =&gt; /^\d{4}-\d{2}-\d{2}$/, :message =&gt; :not_a_date, :allow_nil =&gt; true
-  
+  validates_inclusion_of :status, :in =&gt; VERSION_STATUSES
+
+  named_scope :open, :conditions =&gt; {:status =&gt; 'open'}
+    
   def start_date
     effective_date
   end
@@ -45,6 +50,10 @@ class Version &lt; ActiveRecord::Base
     @spent_hours ||= TimeEntry.sum(:hours, :include =&gt; :issue, :conditions =&gt; [&quot;#{Issue.table_name}.fixed_version_id = ?&quot;, id]).to_f
   end
   
+  def closed?
+    status == 'closed'
+  end
+  
   # Returns true if the version is completed: due date reached and no open issues
   def completed?
     effective_date &amp;&amp; (effective_date &lt;= Date.today) &amp;&amp; (open_issues_count == 0)</diff>
      <filename>app/models/version.rb</filename>
    </modified>
    <modified>
      <diff>@@ -32,9 +32,9 @@
                      {:controller =&gt; 'projects', :action =&gt; 'add_issue_category', :id =&gt; @project},
                      :class =&gt; 'small', :tabindex =&gt; 199) if authorize_for('projects', 'add_issue_category') %&gt;&lt;/p&gt;
 &lt;% end %&gt;
-&lt;%= content_tag('p', f.select(:fixed_version_id, 
-                              (@project.versions.sort.collect {|v| [v.name, v.id]}),
-                              { :include_blank =&gt; true })) unless @project.versions.empty? %&gt;
+&lt;% unless @issue.assignable_versions.empty? %&gt;
+&lt;p&gt;&lt;%= f.select :fixed_version_id, (@issue.assignable_versions.collect {|v| [v.name, v.id]}), :include_blank =&gt; true %&gt;&lt;/p&gt;
+&lt;% end %&gt;
 &lt;/div&gt;
 
 &lt;div class=&quot;splitcontentright&quot;&gt;</diff>
      <filename>app/views/issues/_form.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -5,8 +5,8 @@
 &lt;/div&gt;
 &lt;div class=&quot;splitcontentright&quot;&gt;
 &lt;p&gt;&lt;%= f.select :done_ratio, ((0..10).to_a.collect {|r| [&quot;#{r*10} %&quot;, r*10] }) %&gt;&lt;/p&gt;
-&lt;%= content_tag('p', f.select(:fixed_version_id, 
-                          (@project.versions.sort.collect {|v| [v.name, v.id]}),
-                          { :include_blank =&gt; true })) unless @project.versions.empty? %&gt;
+&lt;% unless @issue.assignable_versions.empty? %&gt;
+&lt;p&gt;&lt;%= f.select :fixed_version_id, (@issue.assignable_versions.collect {|v| [v.name, v.id]}), :include_blank =&gt; true %&gt;&lt;/p&gt;
+&lt;% end %&gt;
 &lt;/div&gt;
 &lt;/div&gt;</diff>
      <filename>app/views/issues/_form_update.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -27,7 +27,7 @@
 &lt;label&gt;&lt;%= l(:field_fixed_version) %&gt;: 
 &lt;%= select_tag('fixed_version_id', content_tag('option', l(:label_no_change_option), :value =&gt; '') +
                                    content_tag('option', l(:label_none), :value =&gt; 'none') +
-                                   options_from_collection_for_select(@project.versions.sort, :id, :name)) %&gt;&lt;/label&gt;
+                                   options_from_collection_for_select(@project.versions.open.sort, :id, :name)) %&gt;&lt;/label&gt;
 &lt;/p&gt;
 
 &lt;p&gt;</diff>
      <filename>app/views/issues/bulk_edit.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -27,11 +27,11 @@
 		&lt;% end -%&gt;
 		&lt;/ul&gt;
 	&lt;/li&gt;
-	&lt;% unless @project.nil? || @project.versions.empty? -%&gt;
+	&lt;% unless @project.nil? || @project.versions.open.empty? -%&gt;
 	&lt;li class=&quot;folder&quot;&gt;			
 		&lt;a href=&quot;#&quot; class=&quot;submenu&quot;&gt;&lt;%= l(:field_fixed_version) %&gt;&lt;/a&gt;
 		&lt;ul&gt;
-		&lt;% @project.versions.sort.each do |v| -%&gt;
+		&lt;% @project.versions.open.sort.each do |v| -%&gt;
 		    &lt;li&gt;&lt;%= context_menu_link v.name, {:controller =&gt; 'issues', :action =&gt; 'bulk_edit', :ids =&gt; @issues.collect(&amp;:id), 'fixed_version_id' =&gt; v, :back_to =&gt; @back}, :method =&gt; :post,
 		                              :selected =&gt; (@issue &amp;&amp; v == @issue.fixed_version), :disabled =&gt; !@can[:update] %&gt;&lt;/li&gt;
 		&lt;% end -%&gt;</diff>
      <filename>app/views/issues/context_menu.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -1,22 +1,25 @@
 &lt;% if @project.versions.any? %&gt;
-&lt;table class=&quot;list&quot;&gt;
+&lt;table class=&quot;list versions&quot;&gt;
 	&lt;thead&gt;
     &lt;th&gt;&lt;%= l(:label_version) %&gt;&lt;/th&gt;
     &lt;th&gt;&lt;%= l(:field_effective_date) %&gt;&lt;/th&gt;
     &lt;th&gt;&lt;%= l(:field_description) %&gt;&lt;/th&gt;
+    &lt;th&gt;&lt;%= l(:field_status) %&gt;&lt;/th&gt;
     &lt;th&gt;&lt;%= l(:label_wiki_page) unless @project.wiki.nil? %&gt;&lt;/th&gt;
     &lt;th style=&quot;width:15%&quot;&gt;&lt;/th&gt;
-    &lt;th style=&quot;width:15%&quot;&gt;&lt;/th&gt;
     &lt;/thead&gt;
 	&lt;tbody&gt;
 &lt;% for version in @project.versions.sort %&gt;
-    &lt;tr class=&quot;&lt;%= cycle 'odd', 'even' %&gt;&quot;&gt;
+    &lt;tr class=&quot;version &lt;%= cycle 'odd', 'even' %&gt; &lt;%=h version.status %&gt;&quot;&gt;
     &lt;td&gt;&lt;%= link_to h(version.name), :controller =&gt; 'versions', :action =&gt; 'show', :id =&gt; version %&gt;&lt;/td&gt;
     &lt;td align=&quot;center&quot;&gt;&lt;%= format_date(version.effective_date) %&gt;&lt;/td&gt;
     &lt;td&gt;&lt;%=h version.description %&gt;&lt;/td&gt;
+    &lt;td&gt;&lt;%= l(&quot;version_status_#{version.status}&quot;) %&gt;&lt;/td&gt;
     &lt;td&gt;&lt;%= link_to(h(version.wiki_page_title), :controller =&gt; 'wiki', :page =&gt; Wiki.titleize(version.wiki_page_title)) unless version.wiki_page_title.blank? || @project.wiki.nil? %&gt;&lt;/td&gt;
-    &lt;td align=&quot;center&quot;&gt;&lt;%= link_to_if_authorized l(:button_edit), { :controller =&gt; 'versions', :action =&gt; 'edit', :id =&gt; version }, :class =&gt; 'icon icon-edit' %&gt;&lt;/td&gt;
-    &lt;td align=&quot;center&quot;&gt;&lt;%= link_to_if_authorized l(:button_delete), {:controller =&gt; 'versions', :action =&gt; 'destroy', :id =&gt; version}, :confirm =&gt; l(:text_are_you_sure), :method =&gt; :post, :class =&gt; 'icon icon-del' %&gt;&lt;/td&gt;
+    &lt;td class=&quot;buttons&quot;&gt;
+    	&lt;%= link_to_if_authorized l(:button_edit),   {:controller =&gt; 'versions', :action =&gt; 'edit', :id =&gt; version }, :class =&gt; 'icon icon-edit' %&gt;
+    	&lt;%= link_to_if_authorized l(:button_delete), {:controller =&gt; 'versions', :action =&gt; 'destroy', :id =&gt; version}, :confirm =&gt; l(:text_are_you_sure), :method =&gt; :post, :class =&gt; 'icon icon-del' %&gt;
+   	&lt;/td&gt;
     &lt;/tr&gt;
 &lt;% end; reset_cycle %&gt;
     &lt;/tbody&gt;</diff>
      <filename>app/views/projects/settings/_versions.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -3,6 +3,7 @@
 &lt;div class=&quot;box&quot;&gt;
 &lt;p&gt;&lt;%= f.text_field :name, :size =&gt; 60, :required =&gt; true %&gt;&lt;/p&gt;
 &lt;p&gt;&lt;%= f.text_field :description, :size =&gt; 60 %&gt;&lt;/p&gt;
+&lt;p&gt;&lt;%= f.select :status, Version::VERSION_STATUSES.collect {|s| [l(&quot;version_status_#{s}&quot;), s]} %&gt;&lt;/p&gt;
 &lt;p&gt;&lt;%= f.text_field :wiki_page_title, :label =&gt; :label_wiki_page, :size =&gt; 60, :disabled =&gt; @project.wiki.nil? %&gt;&lt;/p&gt;
 &lt;p&gt;&lt;%= f.text_field :effective_date, :size =&gt; 10 %&gt;&lt;%= calendar_for('version_effective_date') %&gt;&lt;/p&gt;
 &lt;/div&gt;</diff>
      <filename>app/views/versions/_form.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -827,3 +827,7 @@ bg:
   field_active: Active
   enumeration_system_activity: System Activity
   permission_delete_issue_watchers: Delete watchers
+  version_status_closed: closed
+  version_status_locked: locked
+  version_status_open: open
+  error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened</diff>
      <filename>config/locales/bg.yml</filename>
    </modified>
    <modified>
      <diff>@@ -851,3 +851,7 @@ bs:
   field_active: Active
   enumeration_system_activity: System Activity
   permission_delete_issue_watchers: Delete watchers
+  version_status_closed: closed
+  version_status_locked: locked
+  version_status_open: open
+  error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened</diff>
      <filename>config/locales/bs.yml</filename>
    </modified>
    <modified>
      <diff>@@ -830,3 +830,7 @@ ca:
   field_active: Active
   enumeration_system_activity: System Activity
   permission_delete_issue_watchers: Delete watchers
+  version_status_closed: closed
+  version_status_locked: locked
+  version_status_open: open
+  error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened</diff>
      <filename>config/locales/ca.yml</filename>
    </modified>
    <modified>
      <diff>@@ -833,3 +833,7 @@ cs:
   field_active: Active
   enumeration_system_activity: System Activity
   permission_delete_issue_watchers: Delete watchers
+  version_status_closed: closed
+  version_status_locked: locked
+  version_status_open: open
+  error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened</diff>
      <filename>config/locales/cs.yml</filename>
    </modified>
    <modified>
      <diff>@@ -853,3 +853,7 @@ da:
   field_active: Active
   enumeration_system_activity: System Activity
   permission_delete_issue_watchers: Delete watchers
+  version_status_closed: closed
+  version_status_locked: locked
+  version_status_open: open
+  error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened</diff>
      <filename>config/locales/da.yml</filename>
    </modified>
    <modified>
      <diff>@@ -853,3 +853,7 @@ de:
   field_active: Active
   enumeration_system_activity: System Activity
   permission_delete_issue_watchers: Delete watchers
+  version_status_closed: closed
+  version_status_locked: locked
+  version_status_open: open
+  error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened</diff>
      <filename>config/locales/de.yml</filename>
    </modified>
    <modified>
      <diff>@@ -833,3 +833,7 @@ el:
   field_active: Active
   enumeration_system_activity: System Activity
   permission_delete_issue_watchers: Delete watchers
+  version_status_closed: closed
+  version_status_locked: locked
+  version_status_open: open
+  error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened</diff>
      <filename>config/locales/el.yml</filename>
    </modified>
    <modified>
      <diff>@@ -155,6 +155,7 @@ en:
   error_issue_not_found_in_project: 'The issue was not found or does not belong to this project'
   error_no_tracker_in_project: 'No tracker is associated to this project. Please check the Project settings.'
   error_no_default_issue_status: 'No default issue status is defined. Please check your configuration (Go to &quot;Administration -&gt; Issue statuses&quot;).'
+  error_can_not_reopen_issue_on_closed_version: 'An issue assigned to a closed version can not be reopened'
   
   warning_attachments_not_saved: &quot;{{count}} file(s) could not be saved.&quot;
   
@@ -749,6 +750,10 @@ en:
   status_active: active
   status_registered: registered
   status_locked: locked
+  
+  version_status_open: open
+  version_status_locked: locked
+  version_status_closed: closed
 
   field_active: Active
   </diff>
      <filename>config/locales/en.yml</filename>
    </modified>
    <modified>
      <diff>@@ -874,3 +874,7 @@ es:
   field_active: Active
   enumeration_system_activity: System Activity
   permission_delete_issue_watchers: Delete watchers
+  version_status_closed: closed
+  version_status_locked: locked
+  version_status_open: open
+  error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened</diff>
      <filename>config/locales/es.yml</filename>
    </modified>
    <modified>
      <diff>@@ -863,3 +863,7 @@ fi:
   field_active: Active
   enumeration_system_activity: System Activity
   permission_delete_issue_watchers: Delete watchers
+  version_status_closed: closed
+  version_status_locked: locked
+  version_status_open: open
+  error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened</diff>
      <filename>config/locales/fi.yml</filename>
    </modified>
    <modified>
      <diff>@@ -177,6 +177,7 @@ fr:
   error_scm_command_failed: &quot;Une erreur s'est produite lors de l'acc&#232;s au d&#233;p&#244;t: {{value}}&quot;
   error_scm_annotate: &quot;L'entr&#233;e n'existe pas ou ne peut pas &#234;tre annot&#233;e.&quot;
   error_issue_not_found_in_project: &quot;La demande n'existe pas ou n'appartient pas &#224; ce projet&quot;
+  error_can_not_reopen_issue_on_closed_version: 'Une demande assign&#233;e &#224; une version ferm&#233;e ne peut pas &#234;tre r&#233;ouverte'
   
   warning_attachments_not_saved: &quot;{{count}} fichier(s) n'ont pas pu &#234;tre sauvegard&#233;s.&quot;
   
@@ -767,6 +768,10 @@ fr:
   status_registered: enregistr&#233;
   status_locked: v&#233;rouill&#233;
   
+  version_status_open: ouvert
+  version_status_locked: v&#233;rouill&#233;
+  version_status_closed: ferm&#233;
+  
   text_select_mail_notifications: Actions pour lesquelles une notification par e-mail est envoy&#233;e
   text_regexp_info: ex. ^[A-Z0-9]+$
   text_min_max_length_info: 0 pour aucune restriction</diff>
      <filename>config/locales/fr.yml</filename>
    </modified>
    <modified>
      <diff>@@ -853,3 +853,7 @@ gl:
   field_active: Active
   enumeration_system_activity: System Activity
   permission_delete_issue_watchers: Delete watchers
+  version_status_closed: closed
+  version_status_locked: locked
+  version_status_open: open
+  error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened</diff>
      <filename>config/locales/gl.yml</filename>
    </modified>
    <modified>
      <diff>@@ -837,3 +837,7 @@ he:
   field_active: Active
   enumeration_system_activity: System Activity
   permission_delete_issue_watchers: Delete watchers
+  version_status_closed: closed
+  version_status_locked: locked
+  version_status_open: open
+  error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened</diff>
      <filename>config/locales/he.yml</filename>
    </modified>
    <modified>
      <diff>@@ -858,3 +858,7 @@
   field_active: Active
   enumeration_system_activity: System Activity
   permission_delete_issue_watchers: Delete watchers
+  version_status_closed: closed
+  version_status_locked: locked
+  version_status_open: open
+  error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened</diff>
      <filename>config/locales/hu.yml</filename>
    </modified>
    <modified>
      <diff>@@ -840,3 +840,7 @@ it:
   field_active: Active
   enumeration_system_activity: System Activity
   permission_delete_issue_watchers: Delete watchers
+  version_status_closed: closed
+  version_status_locked: locked
+  version_status_open: open
+  error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened</diff>
      <filename>config/locales/it.yml</filename>
    </modified>
    <modified>
      <diff>@@ -862,3 +862,7 @@ ja:
   field_active: Active
   enumeration_system_activity: System Activity
   permission_delete_issue_watchers: Delete watchers
+  version_status_closed: closed
+  version_status_locked: locked
+  version_status_open: open
+  error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened</diff>
      <filename>config/locales/ja.yml</filename>
    </modified>
    <modified>
      <diff>@@ -893,3 +893,7 @@ ko:
   field_active: Active
   enumeration_system_activity: System Activity
   permission_delete_issue_watchers: Delete watchers
+  version_status_closed: closed
+  version_status_locked: locked
+  version_status_open: open
+  error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened</diff>
      <filename>config/locales/ko.yml</filename>
    </modified>
    <modified>
      <diff>@@ -863,3 +863,7 @@ lt:
   field_active: Active
   enumeration_system_activity: System Activity
   permission_delete_issue_watchers: Delete watchers
+  version_status_closed: closed
+  version_status_locked: locked
+  version_status_open: open
+  error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened</diff>
      <filename>config/locales/lt.yml</filename>
    </modified>
    <modified>
      <diff>@@ -815,3 +815,7 @@ nl:
   field_active: Active
   enumeration_system_activity: System Activity
   permission_delete_issue_watchers: Delete watchers
+  version_status_closed: closed
+  version_status_locked: locked
+  version_status_open: open
+  error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened</diff>
      <filename>config/locales/nl.yml</filename>
    </modified>
    <modified>
      <diff>@@ -828,3 +828,7 @@
   field_active: Active
   enumeration_system_activity: System Activity
   permission_delete_issue_watchers: Delete watchers
+  version_status_closed: closed
+  version_status_locked: locked
+  version_status_open: open
+  error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened</diff>
      <filename>config/locales/no.yml</filename>
    </modified>
    <modified>
      <diff>@@ -856,3 +856,7 @@ pl:
   field_active: Aktywne
   enumeration_system_activity: Aktywno&#347;&#263; Systemowa
   permission_delete_issue_watchers: Delete watchers
+  version_status_closed: closed
+  version_status_locked: locked
+  version_status_open: open
+  error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened</diff>
      <filename>config/locales/pl.yml</filename>
    </modified>
    <modified>
      <diff>@@ -859,3 +859,7 @@ pt-BR:
   field_active: Ativo
   enumeration_system_activity: Atividade do sistema
   permission_delete_issue_watchers: Deletar observadores
+  version_status_closed: closed
+  version_status_locked: locked
+  version_status_open: open
+  error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened</diff>
      <filename>config/locales/pt-BR.yml</filename>
    </modified>
    <modified>
      <diff>@@ -845,3 +845,7 @@ pt:
   field_active: Active
   enumeration_system_activity: System Activity
   permission_delete_issue_watchers: Delete watchers
+  version_status_closed: closed
+  version_status_locked: locked
+  version_status_open: open
+  error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened</diff>
      <filename>config/locales/pt.yml</filename>
    </modified>
    <modified>
      <diff>@@ -830,3 +830,7 @@ ro:
   field_active: Active
   enumeration_system_activity: System Activity
   permission_delete_issue_watchers: Delete watchers
+  version_status_closed: closed
+  version_status_locked: locked
+  version_status_open: open
+  error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened</diff>
      <filename>config/locales/ro.yml</filename>
    </modified>
    <modified>
      <diff>@@ -941,3 +941,7 @@ ru:
   field_active: Active
   enumeration_system_activity: System Activity
   permission_delete_issue_watchers: Delete watchers
+  version_status_closed: closed
+  version_status_locked: locked
+  version_status_open: open
+  error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened</diff>
      <filename>config/locales/ru.yml</filename>
    </modified>
    <modified>
      <diff>@@ -832,3 +832,7 @@ sk:
   field_active: Active
   enumeration_system_activity: System Activity
   permission_delete_issue_watchers: Delete watchers
+  version_status_closed: closed
+  version_status_locked: locked
+  version_status_open: open
+  error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened</diff>
      <filename>config/locales/sk.yml</filename>
    </modified>
    <modified>
      <diff>@@ -829,3 +829,7 @@ sl:
   field_active: Active
   enumeration_system_activity: System Activity
   permission_delete_issue_watchers: Delete watchers
+  version_status_closed: closed
+  version_status_locked: locked
+  version_status_open: open
+  error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened</diff>
      <filename>config/locales/sl.yml</filename>
    </modified>
    <modified>
      <diff>@@ -848,3 +848,7 @@
   field_active: Active
   enumeration_system_activity: System Activity
   permission_delete_issue_watchers: Delete watchers
+  version_status_closed: closed
+  version_status_locked: locked
+  version_status_open: open
+  error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened</diff>
      <filename>config/locales/sr.yml</filename>
    </modified>
    <modified>
      <diff>@@ -881,3 +881,7 @@ sv:
   enumeration_doc_categories: Dokumentkategorier
   enumeration_activities: Aktiviteter (tidsuppf&#246;ljning)
   enumeration_system_activity: Systemaktivitet
+  version_status_closed: closed
+  version_status_locked: locked
+  version_status_open: open
+  error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened</diff>
      <filename>config/locales/sv.yml</filename>
    </modified>
    <modified>
      <diff>@@ -830,3 +830,7 @@ th:
   field_active: Active
   enumeration_system_activity: System Activity
   permission_delete_issue_watchers: Delete watchers
+  version_status_closed: closed
+  version_status_locked: locked
+  version_status_open: open
+  error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened</diff>
      <filename>config/locales/th.yml</filename>
    </modified>
    <modified>
      <diff>@@ -860,3 +860,7 @@ tr:
   field_active: Active
   enumeration_system_activity: System Activity
   permission_delete_issue_watchers: Delete watchers
+  version_status_closed: closed
+  version_status_locked: locked
+  version_status_open: open
+  error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened</diff>
      <filename>config/locales/tr.yml</filename>
    </modified>
    <modified>
      <diff>@@ -829,3 +829,7 @@ uk:
   field_active: Active
   enumeration_system_activity: System Activity
   permission_delete_issue_watchers: Delete watchers
+  version_status_closed: closed
+  version_status_locked: locked
+  version_status_open: open
+  error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened</diff>
      <filename>config/locales/uk.yml</filename>
    </modified>
    <modified>
      <diff>@@ -892,3 +892,7 @@ vi:
   field_active: Active
   enumeration_system_activity: System Activity
   permission_delete_issue_watchers: Delete watchers
+  version_status_closed: closed
+  version_status_locked: locked
+  version_status_open: open
+  error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened</diff>
      <filename>config/locales/vi.yml</filename>
    </modified>
    <modified>
      <diff>@@ -923,3 +923,7 @@
   enumeration_doc_categories: &#25991;&#20214;&#20998;&#39006;
   enumeration_activities: &#27963;&#21205; (&#26178;&#38291;&#36861;&#36452;)
   enumeration_system_activity: &#31995;&#32113;&#27963;&#21205;
+  version_status_closed: closed
+  version_status_locked: locked
+  version_status_open: open
+  error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened</diff>
      <filename>config/locales/zh-TW.yml</filename>
    </modified>
    <modified>
      <diff>@@ -855,3 +855,7 @@ zh:
   field_active: Active
   enumeration_system_activity: System Activity
   permission_delete_issue_watchers: Delete watchers
+  version_status_closed: closed
+  version_status_locked: locked
+  version_status_open: open
+  error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened</diff>
      <filename>config/locales/zh.yml</filename>
    </modified>
    <modified>
      <diff>@@ -124,6 +124,8 @@ tr.message td.last_message { font-size: 80%; }
 tr.message.locked td.subject a { background-image: url(../images/locked.png); }
 tr.message.sticky td.subject a { background-image: url(../images/sticky.png); font-weight: bold; }
 
+tr.version.closed, tr.version.closed a { color: #999; }
+
 tr.user td { width:13%; }
 tr.user td.email { width:18%; }
 tr.user td { white-space: nowrap; }</diff>
      <filename>public/stylesheets/application.css</filename>
    </modified>
    <modified>
      <diff>@@ -157,3 +157,35 @@ issues_010:
   status_id: 1
   start_date: &lt;%= Date.today.to_s(:db) %&gt;
   due_date: &lt;%= 1.days.from_now.to_date.to_s(:db) %&gt;
+issues_011: 
+  created_on: &lt;%= 3.days.ago.to_date.to_s(:db) %&gt;
+  project_id: 1
+  updated_on: &lt;%= 1.day.ago.to_date.to_s(:db) %&gt;
+  priority_id: 5
+  subject: Closed issue on a closed version
+  id: 11
+  fixed_version_id: 1 
+  category_id: 1
+  description:
+  tracker_id: 1
+  assigned_to_id: 
+  author_id: 2
+  status_id: 5
+  start_date: &lt;%= 1.day.ago.to_date.to_s(:db) %&gt;
+  due_date:
+issues_012: 
+  created_on: &lt;%= 3.days.ago.to_date.to_s(:db) %&gt;
+  project_id: 1
+  updated_on: &lt;%= 1.day.ago.to_date.to_s(:db) %&gt;
+  priority_id: 5
+  subject: Closed issue on a locked version
+  id: 12
+  fixed_version_id: 2 
+  category_id: 1
+  description:
+  tracker_id: 1
+  assigned_to_id: 
+  author_id: 2
+  status_id: 5
+  start_date: &lt;%= 1.day.ago.to_date.to_s(:db) %&gt;
+  due_date:</diff>
      <filename>test/fixtures/issues.yml</filename>
    </modified>
    <modified>
      <diff>@@ -7,6 +7,7 @@ versions_001:
   id: 1
   description: Beta
   effective_date: 2006-07-01
+  status: closed
 versions_002: 
   created_on: 2006-07-19 21:00:33 +02:00
   name: &quot;1.0&quot;
@@ -15,6 +16,7 @@ versions_002:
   id: 2
   description: Stable release
   effective_date: &lt;%= 20.day.from_now.to_date.to_s(:db) %&gt;
+  status: locked
 versions_003: 
   created_on: 2006-07-19 21:00:33 +02:00
   name: &quot;2.0&quot;
@@ -23,4 +25,5 @@ versions_003:
   id: 3
   description: Future version
   effective_date: 
+  status: open
   
\ No newline at end of file</diff>
      <filename>test/fixtures/versions.yml</filename>
    </modified>
    <modified>
      <diff>@@ -20,6 +20,7 @@ require File.dirname(__FILE__) + '/../test_helper'
 class IssueTest &lt; ActiveSupport::TestCase
   fixtures :projects, :users, :members, :member_roles,
            :trackers, :projects_trackers,
+           :versions,
            :issue_statuses, :issue_categories, :issue_relations, :workflows, 
            :enumerations,
            :issues,
@@ -184,6 +185,56 @@ class IssueTest &lt; ActiveSupport::TestCase
     assert !issue1.reload.closed?
   end
   
+  def test_assignable_versions
+    issue = Issue.new(:project_id =&gt; 1, :tracker_id =&gt; 1, :author_id =&gt; 1, :status_id =&gt; 1, :fixed_version_id =&gt; 1, :subject =&gt; 'New issue')
+    assert_equal ['open'], issue.assignable_versions.collect(&amp;:status).uniq
+  end
+  
+  def test_should_not_be_able_to_assign_a_new_issue_to_a_closed_version
+    issue = Issue.new(:project_id =&gt; 1, :tracker_id =&gt; 1, :author_id =&gt; 1, :status_id =&gt; 1, :fixed_version_id =&gt; 1, :subject =&gt; 'New issue')
+    assert !issue.save
+    assert_not_nil issue.errors.on(:fixed_version_id)
+  end
+  
+  def test_should_not_be_able_to_assign_a_new_issue_to_a_locked_version
+    issue = Issue.new(:project_id =&gt; 1, :tracker_id =&gt; 1, :author_id =&gt; 1, :status_id =&gt; 1, :fixed_version_id =&gt; 2, :subject =&gt; 'New issue')
+    assert !issue.save
+    assert_not_nil issue.errors.on(:fixed_version_id)
+  end
+  
+  def test_should_be_able_to_assign_a_new_issue_to_an_open_version
+    issue = Issue.new(:project_id =&gt; 1, :tracker_id =&gt; 1, :author_id =&gt; 1, :status_id =&gt; 1, :fixed_version_id =&gt; 3, :subject =&gt; 'New issue')
+    assert issue.save
+  end
+  
+  def test_should_be_able_to_update_an_issue_assigned_to_a_closed_version
+    issue = Issue.find(11)
+    assert_equal 'closed', issue.fixed_version.status
+    issue.subject = 'Subject changed'
+    assert issue.save
+  end
+  
+  def test_should_not_be_able_to_reopen_an_issue_assigned_to_a_closed_version
+    issue = Issue.find(11)
+    issue.status_id = 1
+    assert !issue.save
+    assert_not_nil issue.errors.on_base
+  end
+  
+  def test_should_be_able_to_reopen_and_reassign_an_issue_assigned_to_a_closed_version
+    issue = Issue.find(11)
+    issue.status_id = 1
+    issue.fixed_version_id = 3
+    assert issue.save
+  end
+  
+  def test_should_be_able_to_reopen_an_issue_assigned_to_a_locked_version
+    issue = Issue.find(12)
+    assert_equal 'locked', issue.fixed_version.status
+    issue.status_id = 1
+    assert issue.save
+  end
+  
   def test_move_to_another_project_with_same_category
     issue = Issue.find(1)
     assert issue.move_to(Project.find(2))</diff>
      <filename>test/unit/issue_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -26,6 +26,7 @@ class VersionTest &lt; ActiveSupport::TestCase
   def test_create
     v = Version.new(:project =&gt; Project.find(1), :name =&gt; '1.1', :effective_date =&gt; '2011-03-25')
     assert v.save
+    assert_equal 'open', v.status
   end
   
   def test_invalid_effective_date_validation</diff>
      <filename>test/unit/version_test.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>7c14c6d42e469f1cd81b08c059a9717566fe4e1f</id>
    </parent>
  </parents>
  <author>
    <name>Jean-Philippe Lang</name>
    <email>jp_lang@yahoo.fr</email>
  </author>
  <url>http://github.com/edavis10/redmine/commit/d201c54455fd15d0069de5a60bc99a57cc380ba3</url>
  <id>d201c54455fd15d0069de5a60bc99a57cc380ba3</id>
  <committed-date>2009-11-08T05:03:41-08:00</committed-date>
  <authored-date>2009-11-08T05:03:41-08:00</authored-date>
  <message>Adds version status to limit issue assignments (#1245).

Available version statuses are:
* open: no restriction
* locked: can not assign new issues to the version
* closed: can not assign new issues and can not reopen assigned issues

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