@@ -0,0 +1,9 | |||
|
1 | class AddVersionsStatus < ActiveRecord::Migration | |
|
2 | def self.up | |
|
3 | add_column :versions, :status, :string, :default => 'open' | |
|
4 | end | |
|
5 | ||
|
6 | def self.down | |
|
7 | remove_column :versions, :status | |
|
8 | end | |
|
9 | end |
@@ -143,6 +143,14 class Issue < ActiveRecord::Base | |||
|
143 | 143 | if start_date && soonest_start && start_date < soonest_start |
|
144 | 144 | errors.add :start_date, :invalid |
|
145 | 145 | end |
|
146 | ||
|
147 | if fixed_version | |
|
148 | if !assignable_versions.include?(fixed_version) | |
|
149 | errors.add :fixed_version_id, :inclusion | |
|
150 | elsif reopened? && fixed_version.closed? | |
|
151 | errors.add_to_base I18n.t(:error_can_not_reopen_issue_on_closed_version) | |
|
152 | end | |
|
153 | end | |
|
146 | 154 | end |
|
147 | 155 | |
|
148 | 156 | def validate_on_create |
@@ -193,6 +201,18 class Issue < ActiveRecord::Base | |||
|
193 | 201 | self.status.is_closed? |
|
194 | 202 | end |
|
195 | 203 | |
|
204 | # Return true if the issue is being reopened | |
|
205 | def reopened? | |
|
206 | if !new_record? && status_id_changed? | |
|
207 | status_was = IssueStatus.find_by_id(status_id_was) | |
|
208 | status_new = IssueStatus.find_by_id(status_id) | |
|
209 | if status_was && status_new && status_was.is_closed? && !status_new.is_closed? | |
|
210 | return true | |
|
211 | end | |
|
212 | end | |
|
213 | false | |
|
214 | end | |
|
215 | ||
|
196 | 216 | # Returns true if the issue is overdue |
|
197 | 217 | def overdue? |
|
198 | 218 | !due_date.nil? && (due_date < Date.today) && !status.is_closed? |
@@ -203,6 +223,11 class Issue < ActiveRecord::Base | |||
|
203 | 223 | project.assignable_users |
|
204 | 224 | end |
|
205 | 225 | |
|
226 | # Versions that the issue can be assigned to | |
|
227 | def assignable_versions | |
|
228 | @assignable_versions ||= (project.versions.open + [Version.find_by_id(fixed_version_id_was)]).compact.uniq.sort | |
|
229 | end | |
|
230 | ||
|
206 | 231 | # Returns true if this issue is blocked by another issue that is still open |
|
207 | 232 | def blocked? |
|
208 | 233 | !relations_to.detect {|ir| ir.relation_type == 'blocks' && !ir.issue_from.closed?}.nil? |
@@ -22,11 +22,16 class Version < ActiveRecord::Base | |||
|
22 | 22 | acts_as_attachable :view_permission => :view_files, |
|
23 | 23 | :delete_permission => :manage_files |
|
24 | 24 | |
|
25 | VERSION_STATUSES = %w(open locked closed) | |
|
26 | ||
|
25 | 27 | validates_presence_of :name |
|
26 | 28 | validates_uniqueness_of :name, :scope => [:project_id] |
|
27 | 29 | validates_length_of :name, :maximum => 60 |
|
28 | 30 | validates_format_of :effective_date, :with => /^\d{4}-\d{2}-\d{2}$/, :message => :not_a_date, :allow_nil => true |
|
29 | ||
|
31 | validates_inclusion_of :status, :in => VERSION_STATUSES | |
|
32 | ||
|
33 | named_scope :open, :conditions => {:status => 'open'} | |
|
34 | ||
|
30 | 35 | def start_date |
|
31 | 36 | effective_date |
|
32 | 37 | end |
@@ -45,6 +50,10 class Version < ActiveRecord::Base | |||
|
45 | 50 | @spent_hours ||= TimeEntry.sum(:hours, :include => :issue, :conditions => ["#{Issue.table_name}.fixed_version_id = ?", id]).to_f |
|
46 | 51 | end |
|
47 | 52 | |
|
53 | def closed? | |
|
54 | status == 'closed' | |
|
55 | end | |
|
56 | ||
|
48 | 57 | # Returns true if the version is completed: due date reached and no open issues |
|
49 | 58 | def completed? |
|
50 | 59 | effective_date && (effective_date <= Date.today) && (open_issues_count == 0) |
@@ -32,9 +32,9 | |||
|
32 | 32 | {:controller => 'projects', :action => 'add_issue_category', :id => @project}, |
|
33 | 33 | :class => 'small', :tabindex => 199) if authorize_for('projects', 'add_issue_category') %></p> |
|
34 | 34 | <% end %> |
|
35 | <%= content_tag('p', f.select(:fixed_version_id, | |
|
36 | (@project.versions.sort.collect {|v| [v.name, v.id]}), | |
|
37 | { :include_blank => true })) unless @project.versions.empty? %> | |
|
35 | <% unless @issue.assignable_versions.empty? %> | |
|
36 | <p><%= f.select :fixed_version_id, (@issue.assignable_versions.collect {|v| [v.name, v.id]}), :include_blank => true %></p> | |
|
37 | <% end %> | |
|
38 | 38 | </div> |
|
39 | 39 | |
|
40 | 40 | <div class="splitcontentright"> |
@@ -5,8 +5,8 | |||
|
5 | 5 | </div> |
|
6 | 6 | <div class="splitcontentright"> |
|
7 | 7 | <p><%= f.select :done_ratio, ((0..10).to_a.collect {|r| ["#{r*10} %", r*10] }) %></p> |
|
8 | <%= content_tag('p', f.select(:fixed_version_id, | |
|
9 | (@project.versions.sort.collect {|v| [v.name, v.id]}), | |
|
10 | { :include_blank => true })) unless @project.versions.empty? %> | |
|
8 | <% unless @issue.assignable_versions.empty? %> | |
|
9 | <p><%= f.select :fixed_version_id, (@issue.assignable_versions.collect {|v| [v.name, v.id]}), :include_blank => true %></p> | |
|
10 | <% end %> | |
|
11 | 11 | </div> |
|
12 | 12 | </div> |
@@ -27,7 +27,7 | |||
|
27 | 27 | <label><%= l(:field_fixed_version) %>: |
|
28 | 28 | <%= select_tag('fixed_version_id', content_tag('option', l(:label_no_change_option), :value => '') + |
|
29 | 29 | content_tag('option', l(:label_none), :value => 'none') + |
|
30 | options_from_collection_for_select(@project.versions.sort, :id, :name)) %></label> | |
|
30 | options_from_collection_for_select(@project.versions.open.sort, :id, :name)) %></label> | |
|
31 | 31 | </p> |
|
32 | 32 | |
|
33 | 33 | <p> |
@@ -27,11 +27,11 | |||
|
27 | 27 | <% end -%> |
|
28 | 28 | </ul> |
|
29 | 29 | </li> |
|
30 | <% unless @project.nil? || @project.versions.empty? -%> | |
|
30 | <% unless @project.nil? || @project.versions.open.empty? -%> | |
|
31 | 31 | <li class="folder"> |
|
32 | 32 | <a href="#" class="submenu"><%= l(:field_fixed_version) %></a> |
|
33 | 33 | <ul> |
|
34 | <% @project.versions.sort.each do |v| -%> | |
|
34 | <% @project.versions.open.sort.each do |v| -%> | |
|
35 | 35 | <li><%= context_menu_link v.name, {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id), 'fixed_version_id' => v, :back_to => @back}, :method => :post, |
|
36 | 36 | :selected => (@issue && v == @issue.fixed_version), :disabled => !@can[:update] %></li> |
|
37 | 37 | <% end -%> |
@@ -1,22 +1,25 | |||
|
1 | 1 | <% if @project.versions.any? %> |
|
2 | <table class="list"> | |
|
2 | <table class="list versions"> | |
|
3 | 3 | <thead> |
|
4 | 4 | <th><%= l(:label_version) %></th> |
|
5 | 5 | <th><%= l(:field_effective_date) %></th> |
|
6 | 6 | <th><%= l(:field_description) %></th> |
|
7 | <th><%= l(:field_status) %></th> | |
|
7 | 8 | <th><%= l(:label_wiki_page) unless @project.wiki.nil? %></th> |
|
8 | 9 | <th style="width:15%"></th> |
|
9 | <th style="width:15%"></th> | |
|
10 | 10 | </thead> |
|
11 | 11 | <tbody> |
|
12 | 12 | <% for version in @project.versions.sort %> |
|
13 | <tr class="<%= cycle 'odd', 'even' %>"> | |
|
13 | <tr class="version <%= cycle 'odd', 'even' %> <%=h version.status %>"> | |
|
14 | 14 | <td><%= link_to h(version.name), :controller => 'versions', :action => 'show', :id => version %></td> |
|
15 | 15 | <td align="center"><%= format_date(version.effective_date) %></td> |
|
16 | 16 | <td><%=h version.description %></td> |
|
17 | <td><%= l("version_status_#{version.status}") %></td> | |
|
17 | 18 | <td><%= link_to(h(version.wiki_page_title), :controller => 'wiki', :page => Wiki.titleize(version.wiki_page_title)) unless version.wiki_page_title.blank? || @project.wiki.nil? %></td> |
|
18 | <td align="center"><%= link_to_if_authorized l(:button_edit), { :controller => 'versions', :action => 'edit', :id => version }, :class => 'icon icon-edit' %></td> | |
|
19 |
|
|
|
19 | <td class="buttons"> | |
|
20 | <%= link_to_if_authorized l(:button_edit), {:controller => 'versions', :action => 'edit', :id => version }, :class => 'icon icon-edit' %> | |
|
21 | <%= link_to_if_authorized l(:button_delete), {:controller => 'versions', :action => 'destroy', :id => version}, :confirm => l(:text_are_you_sure), :method => :post, :class => 'icon icon-del' %> | |
|
22 | </td> | |
|
20 | 23 | </tr> |
|
21 | 24 | <% end; reset_cycle %> |
|
22 | 25 | </tbody> |
@@ -3,6 +3,7 | |||
|
3 | 3 | <div class="box"> |
|
4 | 4 | <p><%= f.text_field :name, :size => 60, :required => true %></p> |
|
5 | 5 | <p><%= f.text_field :description, :size => 60 %></p> |
|
6 | <p><%= f.select :status, Version::VERSION_STATUSES.collect {|s| [l("version_status_#{s}"), s]} %></p> | |
|
6 | 7 | <p><%= f.text_field :wiki_page_title, :label => :label_wiki_page, :size => 60, :disabled => @project.wiki.nil? %></p> |
|
7 | 8 | <p><%= f.text_field :effective_date, :size => 10 %><%= calendar_for('version_effective_date') %></p> |
|
8 | 9 | </div> |
@@ -827,3 +827,7 bg: | |||
|
827 | 827 | field_active: Active |
|
828 | 828 | enumeration_system_activity: System Activity |
|
829 | 829 | permission_delete_issue_watchers: Delete watchers |
|
830 | version_status_closed: closed | |
|
831 | version_status_locked: locked | |
|
832 | version_status_open: open | |
|
833 | error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened |
@@ -851,3 +851,7 bs: | |||
|
851 | 851 | field_active: Active |
|
852 | 852 | enumeration_system_activity: System Activity |
|
853 | 853 | permission_delete_issue_watchers: Delete watchers |
|
854 | version_status_closed: closed | |
|
855 | version_status_locked: locked | |
|
856 | version_status_open: open | |
|
857 | error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened |
@@ -830,3 +830,7 ca: | |||
|
830 | 830 | field_active: Active |
|
831 | 831 | enumeration_system_activity: System Activity |
|
832 | 832 | permission_delete_issue_watchers: Delete watchers |
|
833 | version_status_closed: closed | |
|
834 | version_status_locked: locked | |
|
835 | version_status_open: open | |
|
836 | error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened |
@@ -833,3 +833,7 cs: | |||
|
833 | 833 | field_active: Active |
|
834 | 834 | enumeration_system_activity: System Activity |
|
835 | 835 | permission_delete_issue_watchers: Delete watchers |
|
836 | version_status_closed: closed | |
|
837 | version_status_locked: locked | |
|
838 | version_status_open: open | |
|
839 | error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened |
@@ -853,3 +853,7 da: | |||
|
853 | 853 | field_active: Active |
|
854 | 854 | enumeration_system_activity: System Activity |
|
855 | 855 | permission_delete_issue_watchers: Delete watchers |
|
856 | version_status_closed: closed | |
|
857 | version_status_locked: locked | |
|
858 | version_status_open: open | |
|
859 | error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened |
@@ -853,3 +853,7 de: | |||
|
853 | 853 | field_active: Active |
|
854 | 854 | enumeration_system_activity: System Activity |
|
855 | 855 | permission_delete_issue_watchers: Delete watchers |
|
856 | version_status_closed: closed | |
|
857 | version_status_locked: locked | |
|
858 | version_status_open: open | |
|
859 | error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened |
@@ -833,3 +833,7 el: | |||
|
833 | 833 | field_active: Active |
|
834 | 834 | enumeration_system_activity: System Activity |
|
835 | 835 | permission_delete_issue_watchers: Delete watchers |
|
836 | version_status_closed: closed | |
|
837 | version_status_locked: locked | |
|
838 | version_status_open: open | |
|
839 | error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened |
@@ -155,6 +155,7 en: | |||
|
155 | 155 | error_issue_not_found_in_project: 'The issue was not found or does not belong to this project' |
|
156 | 156 | error_no_tracker_in_project: 'No tracker is associated to this project. Please check the Project settings.' |
|
157 | 157 | error_no_default_issue_status: 'No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses").' |
|
158 | error_can_not_reopen_issue_on_closed_version: 'An issue assigned to a closed version can not be reopened' | |
|
158 | 159 | |
|
159 | 160 | warning_attachments_not_saved: "{{count}} file(s) could not be saved." |
|
160 | 161 | |
@@ -749,6 +750,10 en: | |||
|
749 | 750 | status_active: active |
|
750 | 751 | status_registered: registered |
|
751 | 752 | status_locked: locked |
|
753 | ||
|
754 | version_status_open: open | |
|
755 | version_status_locked: locked | |
|
756 | version_status_closed: closed | |
|
752 | 757 | |
|
753 | 758 | field_active: Active |
|
754 | 759 |
@@ -874,3 +874,7 es: | |||
|
874 | 874 | field_active: Active |
|
875 | 875 | enumeration_system_activity: System Activity |
|
876 | 876 | permission_delete_issue_watchers: Delete watchers |
|
877 | version_status_closed: closed | |
|
878 | version_status_locked: locked | |
|
879 | version_status_open: open | |
|
880 | error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened |
@@ -863,3 +863,7 fi: | |||
|
863 | 863 | field_active: Active |
|
864 | 864 | enumeration_system_activity: System Activity |
|
865 | 865 | permission_delete_issue_watchers: Delete watchers |
|
866 | version_status_closed: closed | |
|
867 | version_status_locked: locked | |
|
868 | version_status_open: open | |
|
869 | error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened |
@@ -177,6 +177,7 fr: | |||
|
177 | 177 | error_scm_command_failed: "Une erreur s'est produite lors de l'accès au dépôt: {{value}}" |
|
178 | 178 | error_scm_annotate: "L'entrΓ©e n'existe pas ou ne peut pas Γͺtre annotΓ©e." |
|
179 | 179 | error_issue_not_found_in_project: "La demande n'existe pas ou n'appartient pas Γ ce projet" |
|
180 | error_can_not_reopen_issue_on_closed_version: 'Une demande assignΓ©e Γ une version fermΓ©e ne peut pas Γͺtre rΓ©ouverte' | |
|
180 | 181 | |
|
181 | 182 | warning_attachments_not_saved: "{{count}} fichier(s) n'ont pas pu Γͺtre sauvegardΓ©s." |
|
182 | 183 | |
@@ -767,6 +768,10 fr: | |||
|
767 | 768 | status_registered: enregistrΓ© |
|
768 | 769 | status_locked: vΓ©rouillΓ© |
|
769 | 770 | |
|
771 | version_status_open: ouvert | |
|
772 | version_status_locked: vΓ©rouillΓ© | |
|
773 | version_status_closed: fermΓ© | |
|
774 | ||
|
770 | 775 | text_select_mail_notifications: Actions pour lesquelles une notification par e-mail est envoyΓ©e |
|
771 | 776 | text_regexp_info: ex. ^[A-Z0-9]+$ |
|
772 | 777 | text_min_max_length_info: 0 pour aucune restriction |
@@ -853,3 +853,7 gl: | |||
|
853 | 853 | field_active: Active |
|
854 | 854 | enumeration_system_activity: System Activity |
|
855 | 855 | permission_delete_issue_watchers: Delete watchers |
|
856 | version_status_closed: closed | |
|
857 | version_status_locked: locked | |
|
858 | version_status_open: open | |
|
859 | error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened |
@@ -837,3 +837,7 he: | |||
|
837 | 837 | field_active: Active |
|
838 | 838 | enumeration_system_activity: System Activity |
|
839 | 839 | permission_delete_issue_watchers: Delete watchers |
|
840 | version_status_closed: closed | |
|
841 | version_status_locked: locked | |
|
842 | version_status_open: open | |
|
843 | error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened |
@@ -858,3 +858,7 | |||
|
858 | 858 | field_active: Active |
|
859 | 859 | enumeration_system_activity: System Activity |
|
860 | 860 | permission_delete_issue_watchers: Delete watchers |
|
861 | version_status_closed: closed | |
|
862 | version_status_locked: locked | |
|
863 | version_status_open: open | |
|
864 | error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened |
@@ -840,3 +840,7 it: | |||
|
840 | 840 | field_active: Active |
|
841 | 841 | enumeration_system_activity: System Activity |
|
842 | 842 | permission_delete_issue_watchers: Delete watchers |
|
843 | version_status_closed: closed | |
|
844 | version_status_locked: locked | |
|
845 | version_status_open: open | |
|
846 | error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened |
@@ -862,3 +862,7 ja: | |||
|
862 | 862 | field_active: Active |
|
863 | 863 | enumeration_system_activity: System Activity |
|
864 | 864 | permission_delete_issue_watchers: Delete watchers |
|
865 | version_status_closed: closed | |
|
866 | version_status_locked: locked | |
|
867 | version_status_open: open | |
|
868 | error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened |
@@ -893,3 +893,7 ko: | |||
|
893 | 893 | field_active: Active |
|
894 | 894 | enumeration_system_activity: System Activity |
|
895 | 895 | permission_delete_issue_watchers: Delete watchers |
|
896 | version_status_closed: closed | |
|
897 | version_status_locked: locked | |
|
898 | version_status_open: open | |
|
899 | error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened |
@@ -863,3 +863,7 lt: | |||
|
863 | 863 | field_active: Active |
|
864 | 864 | enumeration_system_activity: System Activity |
|
865 | 865 | permission_delete_issue_watchers: Delete watchers |
|
866 | version_status_closed: closed | |
|
867 | version_status_locked: locked | |
|
868 | version_status_open: open | |
|
869 | error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened |
@@ -815,3 +815,7 nl: | |||
|
815 | 815 | field_active: Active |
|
816 | 816 | enumeration_system_activity: System Activity |
|
817 | 817 | permission_delete_issue_watchers: Delete watchers |
|
818 | version_status_closed: closed | |
|
819 | version_status_locked: locked | |
|
820 | version_status_open: open | |
|
821 | error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened |
@@ -828,3 +828,7 | |||
|
828 | 828 | field_active: Active |
|
829 | 829 | enumeration_system_activity: System Activity |
|
830 | 830 | permission_delete_issue_watchers: Delete watchers |
|
831 | version_status_closed: closed | |
|
832 | version_status_locked: locked | |
|
833 | version_status_open: open | |
|
834 | error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened |
@@ -856,3 +856,7 pl: | |||
|
856 | 856 | field_active: Aktywne |
|
857 | 857 | enumeration_system_activity: AktywnoΕΔ Systemowa |
|
858 | 858 | permission_delete_issue_watchers: Delete watchers |
|
859 | version_status_closed: closed | |
|
860 | version_status_locked: locked | |
|
861 | version_status_open: open | |
|
862 | error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened |
@@ -859,3 +859,7 pt-BR: | |||
|
859 | 859 | field_active: Ativo |
|
860 | 860 | enumeration_system_activity: Atividade do sistema |
|
861 | 861 | permission_delete_issue_watchers: Deletar observadores |
|
862 | version_status_closed: closed | |
|
863 | version_status_locked: locked | |
|
864 | version_status_open: open | |
|
865 | error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened |
@@ -845,3 +845,7 pt: | |||
|
845 | 845 | field_active: Active |
|
846 | 846 | enumeration_system_activity: System Activity |
|
847 | 847 | permission_delete_issue_watchers: Delete watchers |
|
848 | version_status_closed: closed | |
|
849 | version_status_locked: locked | |
|
850 | version_status_open: open | |
|
851 | error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened |
@@ -830,3 +830,7 ro: | |||
|
830 | 830 | field_active: Active |
|
831 | 831 | enumeration_system_activity: System Activity |
|
832 | 832 | permission_delete_issue_watchers: Delete watchers |
|
833 | version_status_closed: closed | |
|
834 | version_status_locked: locked | |
|
835 | version_status_open: open | |
|
836 | error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened |
@@ -941,3 +941,7 ru: | |||
|
941 | 941 | field_active: Active |
|
942 | 942 | enumeration_system_activity: System Activity |
|
943 | 943 | permission_delete_issue_watchers: Delete watchers |
|
944 | version_status_closed: closed | |
|
945 | version_status_locked: locked | |
|
946 | version_status_open: open | |
|
947 | error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened |
@@ -832,3 +832,7 sk: | |||
|
832 | 832 | field_active: Active |
|
833 | 833 | enumeration_system_activity: System Activity |
|
834 | 834 | permission_delete_issue_watchers: Delete watchers |
|
835 | version_status_closed: closed | |
|
836 | version_status_locked: locked | |
|
837 | version_status_open: open | |
|
838 | error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened |
@@ -829,3 +829,7 sl: | |||
|
829 | 829 | field_active: Active |
|
830 | 830 | enumeration_system_activity: System Activity |
|
831 | 831 | permission_delete_issue_watchers: Delete watchers |
|
832 | version_status_closed: closed | |
|
833 | version_status_locked: locked | |
|
834 | version_status_open: open | |
|
835 | error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened |
@@ -848,3 +848,7 | |||
|
848 | 848 | field_active: Active |
|
849 | 849 | enumeration_system_activity: System Activity |
|
850 | 850 | permission_delete_issue_watchers: Delete watchers |
|
851 | version_status_closed: closed | |
|
852 | version_status_locked: locked | |
|
853 | version_status_open: open | |
|
854 | error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened |
@@ -881,3 +881,7 sv: | |||
|
881 | 881 | enumeration_doc_categories: Dokumentkategorier |
|
882 | 882 | enumeration_activities: Aktiviteter (tidsuppfΓΆljning) |
|
883 | 883 | enumeration_system_activity: Systemaktivitet |
|
884 | version_status_closed: closed | |
|
885 | version_status_locked: locked | |
|
886 | version_status_open: open | |
|
887 | error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened |
@@ -830,3 +830,7 th: | |||
|
830 | 830 | field_active: Active |
|
831 | 831 | enumeration_system_activity: System Activity |
|
832 | 832 | permission_delete_issue_watchers: Delete watchers |
|
833 | version_status_closed: closed | |
|
834 | version_status_locked: locked | |
|
835 | version_status_open: open | |
|
836 | error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened |
@@ -860,3 +860,7 tr: | |||
|
860 | 860 | field_active: Active |
|
861 | 861 | enumeration_system_activity: System Activity |
|
862 | 862 | permission_delete_issue_watchers: Delete watchers |
|
863 | version_status_closed: closed | |
|
864 | version_status_locked: locked | |
|
865 | version_status_open: open | |
|
866 | error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened |
@@ -829,3 +829,7 uk: | |||
|
829 | 829 | field_active: Active |
|
830 | 830 | enumeration_system_activity: System Activity |
|
831 | 831 | permission_delete_issue_watchers: Delete watchers |
|
832 | version_status_closed: closed | |
|
833 | version_status_locked: locked | |
|
834 | version_status_open: open | |
|
835 | error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened |
@@ -892,3 +892,7 vi: | |||
|
892 | 892 | field_active: Active |
|
893 | 893 | enumeration_system_activity: System Activity |
|
894 | 894 | permission_delete_issue_watchers: Delete watchers |
|
895 | version_status_closed: closed | |
|
896 | version_status_locked: locked | |
|
897 | version_status_open: open | |
|
898 | error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened |
@@ -923,3 +923,7 | |||
|
923 | 923 | enumeration_doc_categories: ζδ»Άει‘ |
|
924 | 924 | enumeration_activities: ζ΄»ε (ζιθΏ½θΉ€) |
|
925 | 925 | enumeration_system_activity: η³»η΅±ζ΄»ε |
|
926 | version_status_closed: closed | |
|
927 | version_status_locked: locked | |
|
928 | version_status_open: open | |
|
929 | error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened |
@@ -855,3 +855,7 zh: | |||
|
855 | 855 | field_active: Active |
|
856 | 856 | enumeration_system_activity: System Activity |
|
857 | 857 | permission_delete_issue_watchers: Delete watchers |
|
858 | version_status_closed: closed | |
|
859 | version_status_locked: locked | |
|
860 | version_status_open: open | |
|
861 | error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened |
@@ -124,6 +124,8 tr.message td.last_message { font-size: 80%; } | |||
|
124 | 124 | tr.message.locked td.subject a { background-image: url(../images/locked.png); } |
|
125 | 125 | tr.message.sticky td.subject a { background-image: url(../images/sticky.png); font-weight: bold; } |
|
126 | 126 | |
|
127 | tr.version.closed, tr.version.closed a { color: #999; } | |
|
128 | ||
|
127 | 129 | tr.user td { width:13%; } |
|
128 | 130 | tr.user td.email { width:18%; } |
|
129 | 131 | tr.user td { white-space: nowrap; } |
@@ -157,3 +157,35 issues_010: | |||
|
157 | 157 | status_id: 1 |
|
158 | 158 | start_date: <%= Date.today.to_s(:db) %> |
|
159 | 159 | due_date: <%= 1.days.from_now.to_date.to_s(:db) %> |
|
160 | issues_011: | |
|
161 | created_on: <%= 3.days.ago.to_date.to_s(:db) %> | |
|
162 | project_id: 1 | |
|
163 | updated_on: <%= 1.day.ago.to_date.to_s(:db) %> | |
|
164 | priority_id: 5 | |
|
165 | subject: Closed issue on a closed version | |
|
166 | id: 11 | |
|
167 | fixed_version_id: 1 | |
|
168 | category_id: 1 | |
|
169 | description: | |
|
170 | tracker_id: 1 | |
|
171 | assigned_to_id: | |
|
172 | author_id: 2 | |
|
173 | status_id: 5 | |
|
174 | start_date: <%= 1.day.ago.to_date.to_s(:db) %> | |
|
175 | due_date: | |
|
176 | issues_012: | |
|
177 | created_on: <%= 3.days.ago.to_date.to_s(:db) %> | |
|
178 | project_id: 1 | |
|
179 | updated_on: <%= 1.day.ago.to_date.to_s(:db) %> | |
|
180 | priority_id: 5 | |
|
181 | subject: Closed issue on a locked version | |
|
182 | id: 12 | |
|
183 | fixed_version_id: 2 | |
|
184 | category_id: 1 | |
|
185 | description: | |
|
186 | tracker_id: 1 | |
|
187 | assigned_to_id: | |
|
188 | author_id: 2 | |
|
189 | status_id: 5 | |
|
190 | start_date: <%= 1.day.ago.to_date.to_s(:db) %> | |
|
191 | due_date: |
@@ -7,6 +7,7 versions_001: | |||
|
7 | 7 | id: 1 |
|
8 | 8 | description: Beta |
|
9 | 9 | effective_date: 2006-07-01 |
|
10 | status: closed | |
|
10 | 11 | versions_002: |
|
11 | 12 | created_on: 2006-07-19 21:00:33 +02:00 |
|
12 | 13 | name: "1.0" |
@@ -15,6 +16,7 versions_002: | |||
|
15 | 16 | id: 2 |
|
16 | 17 | description: Stable release |
|
17 | 18 | effective_date: <%= 20.day.from_now.to_date.to_s(:db) %> |
|
19 | status: locked | |
|
18 | 20 | versions_003: |
|
19 | 21 | created_on: 2006-07-19 21:00:33 +02:00 |
|
20 | 22 | name: "2.0" |
@@ -23,4 +25,5 versions_003: | |||
|
23 | 25 | id: 3 |
|
24 | 26 | description: Future version |
|
25 | 27 | effective_date: |
|
28 | status: open | |
|
26 | 29 | No newline at end of file |
@@ -20,6 +20,7 require File.dirname(__FILE__) + '/../test_helper' | |||
|
20 | 20 | class IssueTest < ActiveSupport::TestCase |
|
21 | 21 | fixtures :projects, :users, :members, :member_roles, |
|
22 | 22 | :trackers, :projects_trackers, |
|
23 | :versions, | |
|
23 | 24 | :issue_statuses, :issue_categories, :issue_relations, :workflows, |
|
24 | 25 | :enumerations, |
|
25 | 26 | :issues, |
@@ -184,6 +185,56 class IssueTest < ActiveSupport::TestCase | |||
|
184 | 185 | assert !issue1.reload.closed? |
|
185 | 186 | end |
|
186 | 187 | |
|
188 | def test_assignable_versions | |
|
189 | issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 1, :status_id => 1, :fixed_version_id => 1, :subject => 'New issue') | |
|
190 | assert_equal ['open'], issue.assignable_versions.collect(&:status).uniq | |
|
191 | end | |
|
192 | ||
|
193 | def test_should_not_be_able_to_assign_a_new_issue_to_a_closed_version | |
|
194 | issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 1, :status_id => 1, :fixed_version_id => 1, :subject => 'New issue') | |
|
195 | assert !issue.save | |
|
196 | assert_not_nil issue.errors.on(:fixed_version_id) | |
|
197 | end | |
|
198 | ||
|
199 | def test_should_not_be_able_to_assign_a_new_issue_to_a_locked_version | |
|
200 | issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 1, :status_id => 1, :fixed_version_id => 2, :subject => 'New issue') | |
|
201 | assert !issue.save | |
|
202 | assert_not_nil issue.errors.on(:fixed_version_id) | |
|
203 | end | |
|
204 | ||
|
205 | def test_should_be_able_to_assign_a_new_issue_to_an_open_version | |
|
206 | issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 1, :status_id => 1, :fixed_version_id => 3, :subject => 'New issue') | |
|
207 | assert issue.save | |
|
208 | end | |
|
209 | ||
|
210 | def test_should_be_able_to_update_an_issue_assigned_to_a_closed_version | |
|
211 | issue = Issue.find(11) | |
|
212 | assert_equal 'closed', issue.fixed_version.status | |
|
213 | issue.subject = 'Subject changed' | |
|
214 | assert issue.save | |
|
215 | end | |
|
216 | ||
|
217 | def test_should_not_be_able_to_reopen_an_issue_assigned_to_a_closed_version | |
|
218 | issue = Issue.find(11) | |
|
219 | issue.status_id = 1 | |
|
220 | assert !issue.save | |
|
221 | assert_not_nil issue.errors.on_base | |
|
222 | end | |
|
223 | ||
|
224 | def test_should_be_able_to_reopen_and_reassign_an_issue_assigned_to_a_closed_version | |
|
225 | issue = Issue.find(11) | |
|
226 | issue.status_id = 1 | |
|
227 | issue.fixed_version_id = 3 | |
|
228 | assert issue.save | |
|
229 | end | |
|
230 | ||
|
231 | def test_should_be_able_to_reopen_an_issue_assigned_to_a_locked_version | |
|
232 | issue = Issue.find(12) | |
|
233 | assert_equal 'locked', issue.fixed_version.status | |
|
234 | issue.status_id = 1 | |
|
235 | assert issue.save | |
|
236 | end | |
|
237 | ||
|
187 | 238 | def test_move_to_another_project_with_same_category |
|
188 | 239 | issue = Issue.find(1) |
|
189 | 240 | assert issue.move_to(Project.find(2)) |
General Comments 0
You need to be logged in to leave comments.
Login now