redmine_sortByCf_changeset_r2257.diff

Jm Delehaye, 2009-05-26 18:55

Download (3.55 KB)

View differences:

test/unit/query_test.rb (revision 2257)
175 175
    assert q.has_column?(c)
176 176
  end
177 177
  
178
  def test_sort_by_string_custom_field_asc
179
    q = Query.new
180
    c = q.available_columns.find {|col| col.is_a?(QueryCustomFieldColumn) && col.custom_field.field_format == 'string' }
181
    assert c
182
    assert c.sortable
183
    issues = Issue.find :all,
184
                        :include => [ :assigned_to, :status, :tracker, :project, :priority ], 
185
                        :conditions => q.statement,
186
                        :order => "#{c.sortable} ASC"
187
    values = issues.collect {|i| i.custom_value_for(c.custom_field).to_s}
188
    assert_equal values.sort, values
189
  end
190
  
191
  def test_sort_by_string_custom_field_desc
192
    q = Query.new
193
    c = q.available_columns.find {|col| col.is_a?(QueryCustomFieldColumn) && col.custom_field.field_format == 'string' }
194
    assert c
195
    assert c.sortable
196
    issues = Issue.find :all,
197
                        :include => [ :assigned_to, :status, :tracker, :project, :priority ], 
198
                        :conditions => q.statement,
199
                        :order => "#{c.sortable} DESC"
200
    values = issues.collect {|i| i.custom_value_for(c.custom_field).to_s}
201
    assert_equal values.sort.reverse, values
202
  end
203
  
178 204
  def test_label_for
179 205
    q = Query.new
180 206
    assert_equal 'assigned_to', q.label_for('assigned_to_id')
app/models/query.rb (revision 2257)
35 35

  
36 36
  def initialize(custom_field)
37 37
    self.name = "cf_#{custom_field.id}".to_sym
38
    self.sortable = false
38
    self.sortable = custom_field.order_statement || false
39 39
    @cf = custom_field
40 40
  end
41 41
  
app/models/custom_field.rb (revision 2257)
59 59
    v.custom_field.is_required = false
60 60
    errors.add(:default_value, :activerecord_error_invalid) unless v.valid?
61 61
  end
62
  
63
  # Returns a ORDER BY clause that can used to sort customized
64
  # objects by their value of the custom field.
65
  # Returns false, if the custom field can not be used for sorting.
66
  def order_statement
67
    case field_format
68
      when 'string', 'list', 'date', 'bool'
69
        # COALESCE is here to make sure that blank and NULL values are sorted equally
70
        "COALESCE((SELECT cv_sort.value FROM #{CustomValue.table_name} cv_sort" + 
71
          " WHERE cv_sort.customized_type='#{self.class.customized_class.name}'" +
72
          " AND cv_sort.customized_id=#{self.class.customized_class.table_name}.id" +
73
          " AND cv_sort.custom_field_id=#{id} LIMIT 1), '')"
74
      else
75
        nil
76
    end
77
  end
62 78

  
63 79
  def <=>(field)
64 80
    position <=> field.position
65 81
  end
66 82
  
83
  def self.customized_class
84
    self.name =~ /^(.+)CustomField$/
85
    begin; $1.constantize; rescue nil; end
86
  end
87
  
67 88
  # to move in project_custom_field
68 89
  def self.for_all
69 90
    find(:all, :conditions => ["is_for_all=?", true], :order => 'position')
app/models/custom_value.rb (revision 2257)
30 30
    self.value == '1'
31 31
  end
32 32
  
33
  def to_s
34
    value.to_s
35
  end
36
  
33 37
protected
34 38
  def validate
35 39
    if value.blank?