diff --git a/app/models/version.rb b/app/models/version.rb index bb0e7ec42..0ea1c3c71 100644 --- a/app/models/version.rb +++ b/app/models/version.rb @@ -186,9 +186,11 @@ class Version < ActiveRecord::Base def self.fields_for_order_statement(table=nil) table ||= table_name - %w(effective_date name).map {|field| "#{table}.#{field}"} + ["(CASE WHEN #{table}.effective_date IS NULL THEN 1 ELSE 0 END)", "#{table}.effective_date", "#{table}.name", "#{table}.id"] end + scope :sorted, order(fields_for_order_statement) + # Returns the sharings that +user+ can set the version to def allowed_sharings(user = User.current) VERSION_SHARINGS.select do |s| diff --git a/test/unit/version_test.rb b/test/unit/version_test.rb index 588a699d9..8199e2542 100644 --- a/test/unit/version_test.rb +++ b/test/unit/version_test.rb @@ -107,6 +107,17 @@ class VersionTest < ActiveSupport::TestCase assert_progress_equal 25.0/100.0*100, v.closed_pourcent end + def test_should_sort_scheduled_then_unscheduled_versions + Version.delete_all + v4 = Version.create!(:project_id => 1, :name => 'v4') + v3 = Version.create!(:project_id => 1, :name => 'v2', :effective_date => '2012-07-14') + v2 = Version.create!(:project_id => 1, :name => 'v1') + v1 = Version.create!(:project_id => 1, :name => 'v3', :effective_date => '2012-08-02') + v5 = Version.create!(:project_id => 1, :name => 'v5', :effective_date => '2012-07-02') + + assert_equal [v5, v3, v1, v2, v4], Version.sorted.all + end + context "#behind_schedule?" do setup do ProjectCustomField.destroy_all # Custom values are a mess to isolate in tests