diff --git a/app/models/issue.rb b/app/models/issue.rb index f727853e2..1a5b4e19e 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -1188,6 +1188,10 @@ class Issue < ActiveRecord::Base @watchers_count ||= self.watchers.count(:id) end + def notes_count + @notes_count ||= self.journals.where.not(notes: '').count(:id) + end + # Preloads relations for a collection of issues def self.load_relations(issues) if issues.any? diff --git a/app/models/issue_query.rb b/app/models/issue_query.rb index c64eaef57..0ebc04db4 100644 --- a/app/models/issue_query.rb +++ b/app/models/issue_query.rb @@ -54,6 +54,15 @@ class IssueQuery < Query " AND #{Watcher.table_name}.watchable_id = #{Issue.table_name}.id), 0)" end, :default_order => 'desc'), + QueryColumn.new( + :notes_count, + :sortable => + lambda do + "COALESCE((SELECT COUNT(user_id) FROM #{Journal.table_name}" \ + " WHERE #{Journal.table_name}.notes <> ''" \ + " AND #{Journal.table_name}.journalized_id = #{Issue.table_name}.id), 0)" + end, + :default_order => 'desc'), QueryColumn.new(:start_date, :sortable => "#{Issue.table_name}.start_date", :groupable => true), QueryColumn.new(:due_date, :sortable => "#{Issue.table_name}.due_date", :groupable => true), QueryColumn.new(:estimated_hours, :sortable => "#{Issue.table_name}.estimated_hours", diff --git a/config/locales/en.yml b/config/locales/en.yml index a20874799..88b03db65 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -370,6 +370,7 @@ en: field_editable: Editable field_watcher: Watcher field_watchers_count: Watchers count + field_notes_count: Notes count field_content: Content field_group_by: Group results by field_sharing: Sharing diff --git a/config/locales/ja.yml b/config/locales/ja.yml index e4ac5f1de..c0dcc8c86 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -329,6 +329,7 @@ ja: field_editable: 編集可能 field_watcher: ウォッチャー field_watchers_count: ウォッチ数 + field_notes_count: コメント数 field_content: 内容 field_group_by: グループ条件 field_sharing: 共有 diff --git a/test/functional/issues_controller_test.rb b/test/functional/issues_controller_test.rb index 86f450821..cbcdf3b92 100644 --- a/test/functional/issues_controller_test.rb +++ b/test/functional/issues_controller_test.rb @@ -1388,6 +1388,18 @@ class IssuesControllerTest < Redmine::ControllerTest assert_equal [2, 1, 0], issues_in_list.map {|issue| issue.watchers_count}.first(3) end + def test_index_sort_by_notes_count + user = User.find(2) + Journal.delete_all + 2.times.each do + Journal.generate!(journalized: Issue.find(1), user: user, notes: 'Some notes') + end + Journal.generate!(journalized: Issue.find(2), user: user, notes: 'Some notes') + get(:index, :params => {:sort => 'notes_count:desc'}) + assert_response :success + assert_equal [2, 1, 0], issues_in_list.map {|issue| issue.notes_count}.first(3) + end + def test_index_sort_by_user_custom_field cf = IssueCustomField. create!( diff --git a/test/unit/issue_test.rb b/test/unit/issue_test.rb index 50c6586c2..d9eacc508 100644 --- a/test/unit/issue_test.rb +++ b/test/unit/issue_test.rb @@ -3532,4 +3532,12 @@ class IssueTest < ActiveSupport::TestCase end assert_equal 2, issue.watchers_count end + + def test_notes_count + issue = Issue.generate! + User.find([2, 3]).each do |user| + Journal.generate!(journalized: issue, user: user, notes: 'Some notes') + end + assert_equal 2, issue.notes_count + end end