diff options
author | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2009-12-02 18:57:17 +0000 |
---|---|---|
committer | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2009-12-02 18:57:17 +0000 |
commit | 346c569f98f53f266f6ab6dffe02cc27a21c33e4 (patch) | |
tree | 4c61adb9eb9150b1af69abfa1d04652bc5a5df18 | |
parent | 8b8c24e61f37cee0904ad8d44184da58a2f8ca43 (diff) | |
download | redmine-346c569f98f53f266f6ab6dffe02cc27a21c33e4.tar.gz redmine-346c569f98f53f266f6ab6dffe02cc27a21c33e4.zip |
Fixed: "None" category issue count is empty while grouping by category (#4308).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3112 e93f8b46-1217-0410-a6f0-8f06a7374b81
-rw-r--r-- | app/helpers/queries_helper.rb | 64 | ||||
-rw-r--r-- | app/models/custom_field.rb | 19 | ||||
-rw-r--r-- | app/models/query.rb | 21 | ||||
-rw-r--r-- | app/views/issues/_list.rhtml | 4 | ||||
-rw-r--r-- | test/fixtures/custom_fields.yml | 14 | ||||
-rw-r--r-- | test/fixtures/custom_values.yml | 6 | ||||
-rw-r--r-- | test/functional/issues_controller_test.rb | 10 | ||||
-rw-r--r-- | test/unit/query_test.rb | 26 |
8 files changed, 115 insertions, 49 deletions
diff --git a/app/helpers/queries_helper.rb b/app/helpers/queries_helper.rb index 518226c8f..ecfac55ad 100644 --- a/app/helpers/queries_helper.rb +++ b/app/helpers/queries_helper.rb @@ -27,44 +27,38 @@ module QueriesHelper content_tag('th', column.caption) end - def column_value(column, issue) - if column.is_a?(QueryCustomFieldColumn) - cv = issue.custom_values.detect {|v| v.custom_field_id == column.custom_field.id} - show_value(cv) - else - value = issue.send(column.name) - end - end - def column_content(column, issue) - if column.is_a?(QueryCustomFieldColumn) - cv = issue.custom_values.detect {|v| v.custom_field_id == column.custom_field.id} - show_value(cv) - else - value = issue.send(column.name) - if value.is_a?(Date) - format_date(value) - elsif value.is_a?(Time) - format_time(value) + value = column.value(issue) + + case value.class.name + when 'String' + if column.name == :subject + link_to(h(value), :controller => 'issues', :action => 'show', :id => issue) + else + h(value) + end + when 'Time' + format_time(value) + when 'Date' + format_date(value) + when 'Fixnum', 'Float' + if column.name == :done_ratio + progress_bar(value, :width => '80px') else - case column.name - when :subject - h((!@project.nil? && @project != issue.project) ? "#{issue.project.name} - " : '') + - link_to(h(value), :controller => 'issues', :action => 'show', :id => issue) - when :project - link_to(h(value), :controller => 'projects', :action => 'show', :id => value) - when :assigned_to - link_to_user value - when :author - link_to_user value - when :done_ratio - progress_bar(value, :width => '80px') - when :fixed_version - link_to(h(value), { :controller => 'versions', :action => 'show', :id => issue.fixed_version_id }) - else - h(value) - end + value.to_s end + when 'User' + link_to_user value + when 'Project' + link_to(h(value), :controller => 'projects', :action => 'show', :id => value) + when 'Version' + link_to(h(value), :controller => 'versions', :action => 'show', :id => value) + when 'TrueClass' + l(:general_text_Yes) + when 'FalseClass' + l(:general_text_No) + else + h(value) end end end diff --git a/app/models/custom_field.rb b/app/models/custom_field.rb index 5160fcf8a..c7031afea 100644 --- a/app/models/custom_field.rb +++ b/app/models/custom_field.rb @@ -67,6 +67,25 @@ class CustomField < ActiveRecord::Base end end + def cast_value(value) + casted = nil + unless value.blank? + case field_format + when 'string', 'text', 'list' + casted = value + when 'date' + casted = begin; value.to_date; rescue; nil end + when 'bool' + casted = (value == '1' ? true : false) + when 'int' + casted = value.to_i + when 'float' + casted = value.to_f + end + end + casted + end + # Returns a ORDER BY clause that can used to sort customized # objects by their value of the custom field. # Returns false, if the custom field can not be used for sorting. diff --git a/app/models/query.rb b/app/models/query.rb index c691736e9..f7aeb0ea0 100644 --- a/app/models/query.rb +++ b/app/models/query.rb @@ -37,6 +37,10 @@ class QueryColumn def sortable? !sortable.nil? end + + def value(issue) + issue.send name + end end class QueryCustomFieldColumn < QueryColumn @@ -58,6 +62,11 @@ class QueryCustomFieldColumn < QueryColumn def custom_field @cf end + + def value(issue) + cv = issue.custom_values.detect {|v| v.custom_field_id == @cf.id} + cv && @cf.cast_value(cv.value) + end end class Query < ActiveRecord::Base @@ -407,16 +416,20 @@ class Query < ActiveRecord::Base # Returns the issue count by group or nil if query is not grouped def issue_count_by_group + r = nil if grouped? begin # Rails will raise an (unexpected) RecordNotFound if there's only a nil group value - Issue.count(:group => group_by_statement, :include => [:status, :project], :conditions => statement) + r = Issue.count(:group => group_by_statement, :include => [:status, :project], :conditions => statement) rescue ActiveRecord::RecordNotFound - {nil => issue_count} + r = {nil => issue_count} + end + c = group_by_column + if c.is_a?(QueryCustomFieldColumn) + r = r.keys.inject({}) {|h, k| h[c.custom_field.cast_value(k)] = r[k]; h} end - else - nil end + r rescue ::ActiveRecord::StatementInvalid => e raise StatementInvalid.new(e.message) end diff --git a/app/views/issues/_list.rhtml b/app/views/issues/_list.rhtml index f51a70883..a7a7b0622 100644 --- a/app/views/issues/_list.rhtml +++ b/app/views/issues/_list.rhtml @@ -13,12 +13,12 @@ <% previous_group = false %> <tbody> <% issues.each do |issue| -%> - <% if @query.grouped? && (group = column_value(@query.group_by_column, issue) || '') != previous_group %> + <% if @query.grouped? && (group = @query.group_by_column.value(issue)) != previous_group %> <% reset_cycle %> <tr class="group open"> <td colspan="<%= query.columns.size + 2 %>"> <span class="expander" onclick="toggleRowGroup(this); return false;"> </span> - <%= group.blank? ? 'None' : group %> <span class="count">(<%= @issue_count_by_group[group] %>)</span> + <%= group.blank? ? 'None' : column_content(@query.group_by_column, issue) %> <span class="count">(<%= @issue_count_by_group[group] %>)</span> </td> </tr> <% previous_group = group %> diff --git a/test/fixtures/custom_fields.yml b/test/fixtures/custom_fields.yml index dcbef29d6..70577176e 100644 --- a/test/fixtures/custom_fields.yml +++ b/test/fixtures/custom_fields.yml @@ -101,3 +101,17 @@ custom_fields_007: field_format: bool default_value: "" editable: true +custom_fields_008: + name: Custom date + min_length: 0 + regexp: "" + is_for_all: true + is_filter: false + type: IssueCustomField + max_length: 0 + possible_values: "" + id: 8 + is_required: false + field_format: date + default_value: "" + editable: true diff --git a/test/fixtures/custom_values.yml b/test/fixtures/custom_values.yml index 7c4ce4794..76ce067a7 100644 --- a/test/fixtures/custom_values.yml +++ b/test/fixtures/custom_values.yml @@ -95,3 +95,9 @@ custom_values_016: customized_id: 11 id: 16 value: '1' +custom_values_017: + customized_type: Issue + custom_field_id: 8 + customized_id: 1 + id: 17 + value: '2009-12-01' diff --git a/test/functional/issues_controller_test.rb b/test/functional/issues_controller_test.rb index 4c6b25358..93e29957e 100644 --- a/test/functional/issues_controller_test.rb +++ b/test/functional/issues_controller_test.rb @@ -177,10 +177,7 @@ class IssuesControllerTest < ActionController::TestCase assert_response :success assert_template 'index.rhtml' assert_not_nil assigns(:issues) - count_by_group = assigns(:issue_count_by_group) - assert_kind_of Hash, count_by_group - assert_kind_of Tracker, count_by_group.keys.first - assert_not_nil count_by_group[Tracker.find(1)] + assert_not_nil assigns(:issue_count_by_group) end def test_index_with_query_grouped_by_list_custom_field @@ -188,10 +185,7 @@ class IssuesControllerTest < ActionController::TestCase assert_response :success assert_template 'index.rhtml' assert_not_nil assigns(:issues) - count_by_group = assigns(:issue_count_by_group) - assert_kind_of Hash, count_by_group - assert_kind_of String, count_by_group.keys.first - assert_not_nil count_by_group['MySQL'] + assert_not_nil assigns(:issue_count_by_group) end def test_index_sort_by_field_not_included_in_columns diff --git a/test/unit/query_test.rb b/test/unit/query_test.rb index f405833d4..31d3cd1dd 100644 --- a/test/unit/query_test.rb +++ b/test/unit/query_test.rb @@ -276,6 +276,32 @@ class QueryTest < ActiveSupport::TestCase end end + def test_issue_count_by_association_group + q = Query.new(:name => '_', :group_by => 'assigned_to') + count_by_group = q.issue_count_by_group + assert_kind_of Hash, count_by_group + assert_equal %w(NilClass User), count_by_group.keys.collect {|k| k.class.name}.uniq.sort + assert_equal %w(Fixnum), count_by_group.values.collect {|k| k.class.name}.uniq + assert count_by_group.has_key?(User.find(3)) + end + + def test_issue_count_by_list_custom_field_group + q = Query.new(:name => '_', :group_by => 'cf_1') + count_by_group = q.issue_count_by_group + assert_kind_of Hash, count_by_group + assert_equal %w(NilClass String), count_by_group.keys.collect {|k| k.class.name}.uniq.sort + assert_equal %w(Fixnum), count_by_group.values.collect {|k| k.class.name}.uniq + assert count_by_group.has_key?('MySQL') + end + + def test_issue_count_by_date_custom_field_group + q = Query.new(:name => '_', :group_by => 'cf_8') + count_by_group = q.issue_count_by_group + assert_kind_of Hash, count_by_group + assert_equal %w(Date NilClass), count_by_group.keys.collect {|k| k.class.name}.uniq.sort + assert_equal %w(Fixnum), count_by_group.values.collect {|k| k.class.name}.uniq + end + def test_label_for q = Query.new assert_equal 'assigned_to', q.label_for('assigned_to_id') |