]> source.dussan.org Git - redmine.git/commitdiff
Versions can now be created with no date.
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 20 May 2007 17:46:02 +0000 (17:46 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 20 May 2007 17:46:02 +0000 (17:46 +0000)
Versions with no date appear at the end of the roadmap, sorted by name.

git-svn-id: http://redmine.rubyforge.org/svn/trunk@536 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/controllers/projects_controller.rb
app/models/query.rb
app/models/version.rb
app/views/projects/changelog.rhtml
app/views/projects/roadmap.rhtml
app/views/projects/settings.rhtml
app/views/versions/_form.rhtml
db/migrate/048_allow_null_version_effective_date.rb [new file with mode: 0644]
test/fixtures/versions.yml
test/functional/projects_controller_test.rb

index e901964955e4501e532f05d2cbdade317cbe392d..debb0a00a9697b623cbba330697ff16f1eb0bac3 100644 (file)
@@ -426,35 +426,25 @@ class ProjectsController < ApplicationController
       Mailer.deliver_attachments_add(@attachments) if !@attachments.empty? and Permission.find_by_controller_and_action(params[:controller], params[:action]).mail_enabled?
       redirect_to :controller => 'projects', :action => 'list_files', :id => @project
     end
-    @versions = @project.versions
+    @versions = @project.versions.sort
   end
   
   def list_files
-    @versions = @project.versions
+    @versions = @project.versions.sort
   end
   
   # Show changelog for @project
   def changelog
     @trackers = Tracker.find(:all, :conditions => ["is_in_chlog=?", true], :order => 'position')
-    retrieve_selected_tracker_ids(@trackers)
-    
-    @fixed_issues = @project.issues.find(:all, 
-      :include => [ :fixed_version, :status, :tracker ], 
-      :conditions => [ "#{IssueStatus.table_name}.is_closed=? and #{Issue.table_name}.tracker_id in (#{@selected_tracker_ids.join(',')}) and #{Issue.table_name}.fixed_version_id is not null", true],
-      :order => "#{Version.table_name}.effective_date DESC, #{Issue.table_name}.id DESC"
-    ) unless @selected_tracker_ids.empty?
-    @fixed_issues ||= []
+    retrieve_selected_tracker_ids(@trackers)    
+    @versions = @project.versions.sort
   end
 
   def roadmap
     @trackers = Tracker.find(:all, :conditions => ["is_in_roadmap=?", true], :order => 'position')
-    retrieve_selected_tracker_ids(@trackers)    
-    conditions = ("1" == params[:completed] ? nil : [ "#{Version.table_name}.effective_date > ?", Date.today])
-    
-    @versions = @project.versions.find(:all,
-      :conditions => conditions,
-      :order => "#{Version.table_name}.effective_date ASC"
-    )
+    retrieve_selected_tracker_ids(@trackers)
+    conditions = ("1" == params[:completed] ? nil : [ "#{Version.table_name}.effective_date > ? OR #{Version.table_name}.effective_date IS NULL", Date.today])
+    @versions = @project.versions.find(:all, :conditions => conditions).sort
   end
   
   def activity
index 026e79ea922b10368cabdc1d2981836f8e0aa256..47468ba12602c629c160e72ef5b8f8023f077d08 100644 (file)
@@ -94,7 +94,7 @@ class Query < ActiveRecord::Base
       @available_filters["assigned_to_id"] = { :type => :list_optional, :order => 4, :values => user_values }  
       @available_filters["author_id"] = { :type => :list, :order => 5, :values => user_values }  
       @available_filters["category_id"] = { :type => :list_optional, :order => 6, :values => @project.issue_categories.collect{|s| [s.name, s.id.to_s] } }
-      @available_filters["fixed_version_id"] = { :type => :list_optional, :order => 7, :values => @project.versions.collect{|s| [s.name, s.id.to_s] } }
+      @available_filters["fixed_version_id"] = { :type => :list_optional, :order => 7, :values => @project.versions.sort.collect{|s| [s.name, s.id.to_s] } }
       unless @project.children.empty?
         @available_filters["subproject_id"] = { :type => :list_one_or_more, :order => 13, :values => @project.children.collect{|s| [s.name, s.id.to_s] } }
       end
index 463ca3354f871c934c670f6a3bde684e6df259ae..a4e93118e46452d1f1e97d256cdd1c804f0cc427 100644 (file)
@@ -23,7 +23,7 @@ class Version < ActiveRecord::Base
 
   validates_presence_of :name
   validates_uniqueness_of :name, :scope => [:project_id]
-  validates_format_of :effective_date, :with => /^\d{4}-\d{2}-\d{2}$/, :message => :activerecord_error_not_a_date
+  validates_format_of :effective_date, :with => /^\d{4}-\d{2}-\d{2}$/, :message => :activerecord_error_not_a_date, :allow_nil => true
   
   def start_date
     effective_date
@@ -37,6 +37,16 @@ class Version < ActiveRecord::Base
     effective_date && effective_date <= Date.today
   end
   
+  # Versions are sorted by effective_date 
+  # Those with no effective_date are at the end, sorted by name
+  def <=>(version)
+    if self.effective_date
+      version.effective_date ? (self.effective_date <=> version.effective_date) : -1
+    else
+      version.effective_date ? 1 : (self.name <=> version.name)
+    end
+  end
+  
 private
   def check_integrity
     raise "Can't delete version" if self.fixed_issues.find(:first)
index f42f32c42da8b61d6093b1ac460d5e5411a6c5fb..c76159471c573f5bce8e68ee4ac0fbfbabe1cd3d 100644 (file)
 <% end %>
 </div>
 
-<% if @fixed_issues.empty? %><p><i><%= l(:label_no_data) %></i></p><% end %>
+<% if @versions.empty? %><p><i><%= l(:label_no_data) %></i></p><% end %>
 
-<% ver_id = nil
-   @fixed_issues.each do |issue| %>   
-    <% unless ver_id == issue.fixed_version_id %>
-    <% if ver_id %></ul><% end %>
-    <h3 class="icon22 icon22-package"><%= issue.fixed_version.name %></h3>
-    <p><%= format_date(issue.fixed_version.effective_date) %><br />
-    <%=h issue.fixed_version.description %></p>
+<% @versions.each do |version| %>   
+    <a name="<%= version.name %>"><h3 class="icon22 icon22-package"><%= version.name %></h3></a>
+    <% if version.completed? %>
+      <p><%= format_date(version.effective_date) %></p>
+    <% elsif version.effective_date %>
+      <p><strong><%=l(:label_roadmap_due_in)%> <%= distance_of_time_in_words Time.now, version.effective_date %> (<%= format_date(version.effective_date) %>)</strong></p>
+    <% end %>
+    <p><%=h version.description %></p>
+    <% issues = version.fixed_issues.find(:all,
+                                 :include => [:status, :tracker],
+                                 :conditions => ["#{IssueStatus.table_name}.is_closed=? AND #{Issue.table_name}.tracker_id in (#{@selected_tracker_ids.join(',')})", true],
+                                 :order => "#{Tracker.table_name}.position")
+    %>
+    <% if !issues.empty? %>
     <ul>
-    <% ver_id = issue.fixed_version_id
-    end %>
-    <li><%= link_to_issue issue %>: <%=h issue.subject %></li>
+      <% issues.each do |issue| %>
+        <li><%= link_to_issue(issue) %>: <%=h issue.subject %></li>
+      <% end %>
+    </ul>
+    <% end %>
 <% end %>
index ab591a830c7b08a57a2212f0d50ae17fa3d51e48..81ea703c6e1e91e75482cb333903763e06320217 100644 (file)
@@ -18,7 +18,7 @@
     <a name="<%= version.name %>"><h3 class="icon22 icon22-package"><%= version.name %></h3></a>
     <% if version.completed? %>
       <p><%= format_date(version.effective_date) %></p>
-    <% else %>
+    <% elsif version.effective_date %>
       <p><strong><%=l(:label_roadmap_due_in)%> <%= distance_of_time_in_words Time.now, version.effective_date %> (<%= format_date(version.effective_date) %>)</strong></p>
     <% end %>
     <p><%=h version.description %></p>
index 81150dd54cd344d88204775caa0618d1a9b9c9db..bd73076cc8ffeb7496ccc83d2576d5b9267326ba 100644 (file)
@@ -27,7 +27,7 @@
 <table class="list">
        <thead><th><%= l(:label_version) %></th><th><%= l(:field_effective_date) %></th><th><%= l(:field_description) %></th><th style="width:15%"></th><th style="width:15%"></th></thead>
        <tbody>
-<% for version in @project.versions %>
+<% for version in @project.versions.sort %>
     <tr class="<%= cycle 'odd', 'even' %>">
     <td><%=h version.name %></td>
     <td align="center"><%= format_date(version.effective_date) %></td>
index 3d6c9c208d296d58079cc1e1407dad8575caa5ec..8dca13e362f90da64e8bbb186c9232affba75e58 100644 (file)
@@ -4,7 +4,7 @@
 <!--[form:version]-->
 <p><%= f.text_field :name, :size => 20, :required => true %></p>
 <p><%= f.text_field :description, :size => 60 %></p>
-<p><%= f.text_field :effective_date, :size => 10, :required => true %><%= calendar_for('version_effective_date') %></p>
+<p><%= f.text_field :effective_date, :size => 10 %><%= calendar_for('version_effective_date') %></p>
 <!--[eoform:version]-->
 </div>
 
diff --git a/db/migrate/048_allow_null_version_effective_date.rb b/db/migrate/048_allow_null_version_effective_date.rb
new file mode 100644 (file)
index 0000000..4b46bfe
--- /dev/null
@@ -0,0 +1,9 @@
+class AllowNullVersionEffectiveDate < ActiveRecord::Migration
+  def self.up
+    change_column :versions, :effective_date, :date, :default => nil
+  end
+
+  def self.down
+    raise IrreversibleMigration
+  end
+end
index 89a738abdc04e91ee58db81fef221ea56b266276..bf08660d50712123cca754e6f24b3fb3470ea743 100644 (file)
@@ -15,3 +15,12 @@ versions_002:
   id: 2\r
   description: Stable release\r
   effective_date: 2006-07-19\r
+versions_003: \r
+  created_on: 2006-07-19 21:00:33 +02:00\r
+  name: "2.0"\r
+  project_id: 1\r
+  updated_on: 2006-07-19 21:00:33 +02:00\r
+  id: 3\r
+  description: Future version\r
+  effective_date: \r
+  
\ No newline at end of file
index 6e76be2d16d6cdfa816cceea0bb7a32a16af52be..69d5ed9122071e93f98a5a6e2b585d86649270d9 100644 (file)
@@ -109,7 +109,7 @@ class ProjectsControllerTest < Test::Unit::TestCase
     get :changelog, :id => 1\r
     assert_response :success\r
     assert_template 'changelog'\r
-    assert_not_nil assigns(:fixed_issues)\r
+    assert_not_nil assigns(:versions)\r
   end
   
   def test_roadmap