diff options
author | Go MAEDA <maeda@farend.jp> | 2021-04-21 07:01:02 +0000 |
---|---|---|
committer | Go MAEDA <maeda@farend.jp> | 2021-04-21 07:01:02 +0000 |
commit | 7ab1a667a9226c3453166bcdad7edb906ea410df (patch) | |
tree | 654fe0eb561956bbfb16a3934c67e1ede9f90d61 | |
parent | 2be94d1ea1c3cd24e1d59248c7f7916f5d7bc476 (diff) | |
download | redmine-7ab1a667a9226c3453166bcdad7edb906ea410df.tar.gz redmine-7ab1a667a9226c3453166bcdad7edb906ea410df.zip |
Filter issues by notes (#5893).
Patch by Yuichi HARADA.
git-svn-id: http://svn.redmine.org/redmine/trunk@20955 e93f8b46-1217-0410-a6f0-8f06a7374b81
-rw-r--r-- | app/models/issue_query.rb | 9 | ||||
-rw-r--r-- | test/unit/query_test.rb | 41 |
2 files changed, 50 insertions, 0 deletions
diff --git a/app/models/issue_query.rb b/app/models/issue_query.rb index a2e821f9f..1ed7056d2 100644 --- a/app/models/issue_query.rb +++ b/app/models/issue_query.rb @@ -176,6 +176,7 @@ class IssueQuery < Query ) if project add_available_filter "subject", :type => :text add_available_filter "description", :type => :text + add_available_filter "notes", :type => :text add_available_filter "created_on", :type => :date_past add_available_filter "updated_on", :type => :date_past add_available_filter "closed_on", :type => :date_past @@ -447,6 +448,14 @@ class IssueQuery < Query raise StatementInvalid.new(e.message) end + def sql_for_notes_field(field, operator, value) + subquery = "SELECT 1 FROM #{Journal.table_name}" + + " WHERE #{Journal.table_name}.journalized_type='Issue' AND #{Journal.table_name}.journalized_id=#{Issue.table_name}.id" + + " AND (#{sql_for_field field, operator.sub(/^!/, ''), value, Journal.table_name, 'notes'})" + + " AND (#{Journal.visible_notes_condition(User.current, :skip_pre_condition => true)})" + "#{/^!/.match?(operator) ? "NOT EXISTS" : "EXISTS"} (#{subquery})" + end + def sql_for_updated_by_field(field, operator, value) neg = (operator == '!' ? 'NOT' : '') subquery = "SELECT 1 FROM #{Journal.table_name}" + diff --git a/test/unit/query_test.rb b/test/unit/query_test.rb index 75efaae8a..118cb3dc1 100644 --- a/test/unit/query_test.rb +++ b/test/unit/query_test.rb @@ -803,6 +803,47 @@ class QueryTest < ActiveSupport::TestCase end end + def test_filter_notes + user = User.generate! + Journal.create!(:user_id => user.id, :journalized => Issue.find(2), :notes => 'Notes.') + Journal.create!(:user_id => user.id, :journalized => Issue.find(3), :notes => 'Notes.') + + issue_journals = Issue.find(1).journals.sort + assert_equal ['Journal notes', 'Some notes with Redmine links: #2, r2.'], issue_journals.map(&:notes) + assert_equal [false, false], issue_journals.map(&:private_notes) + + query = IssueQuery.new(:name => '_') + filter_name = 'notes' + assert_include filter_name, query.available_filters.keys + + { + '~' => [1, 2, 3], + '!~' => Issue.ids.sort - [1, 2, 3], + '^' => [2, 3], + '$' => [1], + }.each do |operator, expected| + query.filters = {filter_name => {:operator => operator, :values => ['Notes']}} + assert_equal expected, find_issues_with_query(query).map(&:id).sort + end + end + + def test_filter_notes_should_ignore_private_notes_that_are_not_visible + user = User.generate! + Journal.create!(:user_id => user.id, :journalized => Issue.find(2), :notes => 'Notes.', :private_notes => true) + Journal.create!(:user_id => user.id, :journalized => Issue.find(3), :notes => 'Notes.') + + issue_journals = Issue.find(1).journals.sort + assert_equal ['Journal notes', 'Some notes with Redmine links: #2, r2.'], issue_journals.map(&:notes) + assert_equal [false, false], issue_journals.map(&:private_notes) + + query = IssueQuery.new(:name => '_') + filter_name = 'notes' + assert_include filter_name, query.available_filters.keys + + query.filters = {filter_name => {:operator => '~', :values => ['Notes']}} + assert_equal [1, 3], find_issues_with_query(query).map(&:id).sort + end + def test_filter_updated_by user = User.generate! Journal.create!(:user_id => user.id, :journalized => Issue.find(2), :notes => 'Notes') |