]> source.dussan.org Git - redmine.git/commitdiff
Ability to sort the issue list by text, int and float custom fields (#1139).
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 11 Jan 2009 18:38:07 +0000 (18:38 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 11 Jan 2009 18:38:07 +0000 (18:38 +0000)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2258 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/models/custom_field.rb
test/fixtures/custom_fields.yml
test/fixtures/custom_fields_trackers.yml
test/fixtures/custom_values.yml
test/unit/query_test.rb

index 344f277e4f1bfb7554f8c5d4785cd5fd8b9a0436..79d12376af76c2d87772e555041966f2f874a9be 100644 (file)
@@ -65,12 +65,20 @@ class CustomField < ActiveRecord::Base
   # Returns false, if the custom field can not be used for sorting.
   def order_statement
     case field_format
-      when 'string', 'list', 'date', 'bool'
+      when 'string', 'text', 'list', 'date', 'bool'
         # COALESCE is here to make sure that blank and NULL values are sorted equally
         "COALESCE((SELECT cv_sort.value FROM #{CustomValue.table_name} cv_sort" + 
           " WHERE cv_sort.customized_type='#{self.class.customized_class.name}'" +
           " AND cv_sort.customized_id=#{self.class.customized_class.table_name}.id" +
           " AND cv_sort.custom_field_id=#{id} LIMIT 1), '')"
+      when 'int', 'float'
+        # Make the database cast values into numeric
+        # Postgresql will raise an error if a value can not be casted!
+        # CustomValue validations should ensure that it doesn't occur
+        "(SELECT CAST(cv_sort.value AS decimal(60,3)) FROM #{CustomValue.table_name} cv_sort" + 
+          " WHERE cv_sort.customized_type='#{self.class.customized_class.name}'" +
+          " AND cv_sort.customized_id=#{self.class.customized_class.table_name}.id" +
+          " AND cv_sort.custom_field_id=#{id} AND cv_sort.value <> '' AND cv_sort.value IS NOT NULL LIMIT 1)"
       else
         nil
     end
index 1005edae4792e918e2ae2ea5118f5fb10aa614fe..b7718b1690425e9dba239a501a49832c85b43762 100644 (file)
@@ -69,4 +69,16 @@ custom_fields_005:
   is_required: false\r
   field_format: float\r
   default_value: ""\r
+custom_fields_006: \r
+  name: Float field\r
+  min_length: 0\r
+  regexp: ""\r
+  is_for_all: true\r
+  type: IssueCustomField\r
+  max_length: 0\r
+  possible_values: ""\r
+  id: 6\r
+  is_required: false\r
+  field_format: float\r
+  default_value: ""\r
   
\ No newline at end of file
index cb06d2fcfecec97bf53b555ea410bc5e485f4030..bfbe0d24cbdc71f658f9e333ee3222fc530fb9b6 100644 (file)
@@ -8,3 +8,12 @@ custom_fields_trackers_002:
 custom_fields_trackers_003: \r
   custom_field_id: 2\r
   tracker_id: 3\r
+custom_fields_trackers_004: \r
+  custom_field_id: 6\r
+  tracker_id: 1\r
+custom_fields_trackers_005: \r
+  custom_field_id: 6\r
+  tracker_id: 2\r
+custom_fields_trackers_006: \r
+  custom_field_id: 6\r
+  tracker_id: 3\r
index 5721428891444f881cd15ba30b7142adc5a81830..0e2b454abf724f3fc9500e3371cfc9f745486254 100644 (file)
@@ -3,54 +3,84 @@ custom_values_006:
   customized_type: Issue\r
   custom_field_id: 2\r
   customized_id: 3\r
-  id: 9\r
+  id: 6\r
   value: "125"\r
 custom_values_007: \r
   customized_type: Project\r
   custom_field_id: 3\r
   customized_id: 1\r
-  id: 10\r
+  id: 7\r
   value: Stable\r
 custom_values_001: \r
   customized_type: User\r
   custom_field_id: 4\r
   customized_id: 3\r
-  id: 2\r
+  id: 1\r
   value: ""\r
 custom_values_002: \r
   customized_type: User\r
   custom_field_id: 4\r
   customized_id: 4\r
-  id: 3\r
+  id: 2\r
   value: 01 23 45 67 89\r
 custom_values_003: \r
   customized_type: User\r
   custom_field_id: 4\r
   customized_id: 2\r
-  id: 4\r
+  id: 3\r
   value: ""\r
 custom_values_004: \r
   customized_type: Issue\r
   custom_field_id: 2\r
   customized_id: 1\r
-  id: 7\r
+  id: 4\r
   value: "125"\r
 custom_values_005: \r
   customized_type: Issue\r
   custom_field_id: 2\r
   customized_id: 2\r
-  id: 8\r
+  id: 5\r
   value: ""\r
 custom_values_008: \r
   customized_type: Issue\r
   custom_field_id: 1\r
   customized_id: 3\r
-  id: 11\r
+  id: 8\r
   value: "MySQL"\r
 custom_values_009: \r
   customized_type: Issue\r
   custom_field_id: 2\r
   customized_id: 3\r
-  id: 12\r
+  id: 9\r
   value: "this is a stringforcustomfield search"\r
+custom_values_010: \r
+  customized_type: Issue\r
+  custom_field_id: 6\r
+  customized_id: 1\r
+  id: 10\r
+  value: "2.1"\r
+custom_values_011: \r
+  customized_type: Issue\r
+  custom_field_id: 6\r
+  customized_id: 2\r
+  id: 11\r
+  value: "2.05"\r
+custom_values_012: \r
+  customized_type: Issue\r
+  custom_field_id: 6\r
+  customized_id: 3\r
+  id: 12\r
+  value: "11.65"\r
+custom_values_013: \r
+  customized_type: Issue\r
+  custom_field_id: 6\r
+  customized_id: 7\r
+  id: 13\r
+  value: ""\r
+custom_values_014: \r
+  customized_type: Issue\r
+  custom_field_id: 6\r
+  customized_id: 5\r
+  id: 14\r
+  value: "-7.6"\r
   
\ No newline at end of file
index f4b25e51b72070bf5f988e2585092170898eb510..3bdc4a7a2f630ab53a535a3dd2f5a919385473f4 100644 (file)
@@ -185,6 +185,7 @@ class QueryTest < Test::Unit::TestCase
                         :conditions => q.statement,
                         :order => "#{c.sortable} ASC"
     values = issues.collect {|i| i.custom_value_for(c.custom_field).to_s}
+    assert !values.empty?
     assert_equal values.sort, values
   end
   
@@ -198,9 +199,24 @@ class QueryTest < Test::Unit::TestCase
                         :conditions => q.statement,
                         :order => "#{c.sortable} DESC"
     values = issues.collect {|i| i.custom_value_for(c.custom_field).to_s}
+    assert !values.empty?
     assert_equal values.sort.reverse, values
   end
   
+  def test_sort_by_float_custom_field_asc
+    q = Query.new
+    c = q.available_columns.find {|col| col.is_a?(QueryCustomFieldColumn) && col.custom_field.field_format == 'float' }
+    assert c
+    assert c.sortable
+    issues = Issue.find :all,
+                        :include => [ :assigned_to, :status, :tracker, :project, :priority ], 
+                        :conditions => q.statement,
+                        :order => "#{c.sortable} ASC"
+    values = issues.collect {|i| begin; Kernel.Float(i.custom_value_for(c.custom_field).to_s); rescue; nil; end}.compact
+    assert !values.empty?
+    assert_equal values.sort, values
+  end
+  
   def test_label_for
     q = Query.new
     assert_equal 'assigned_to', q.label_for('assigned_to_id')