diff --git a/app/models/issue_query.rb b/app/models/issue_query.rb index 5ff0e5530..92da7ec2f 100644 --- a/app/models/issue_query.rb +++ b/app/models/issue_query.rb @@ -201,6 +201,10 @@ class IssueQuery < Query "attachment", :type => :text, :name => l(:label_attachment) ) + add_available_filter( + "attachment_description", + :type => :text, :name => l(:label_attachment_description) + ) if User.current.logged? add_available_filter( "watcher_id", @@ -588,6 +592,23 @@ class IssueQuery < Query end end + def sql_for_attachment_description_field(field, operator, value) + cond_description = "a.description IS NOT NULL AND a.description <> ''" + c = + case operator + when '*', '!*' + (operator == '*' ? cond_description : "NOT (#{cond_description})") + when '~', '!~' + (operator == '~' ? '' : "#{cond_description} AND ") + + sql_contains('a.description', value.first, :match => (operator == '~')) + when '^', '$' + sql_contains('a.description', value.first, (operator == '^' ? :starts_with : :ends_with) => true) + else + '1=0' + end + "EXISTS (SELECT 1 FROM #{Attachment.table_name} a WHERE a.container_type = 'Issue' AND a.container_id = #{Issue.table_name}.id AND #{c})" + end + def sql_for_parent_id_field(field, operator, value) case operator when "=" diff --git a/config/locales/en.yml b/config/locales/en.yml index 9d779a2fe..cf91a0447 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -698,6 +698,7 @@ en: label_attachment_delete: Delete file label_attachment_plural: Files label_file_added: File added + label_attachment_description: File description label_report: Report label_report_plural: Reports label_news: News diff --git a/test/fixtures/attachments.yml b/test/fixtures/attachments.yml index ff126a8c6..3805df02e 100644 --- a/test/fixtures/attachments.yml +++ b/test/fixtures/attachments.yml @@ -197,7 +197,7 @@ attachments_015: filename: private.diff author_id: 2 content_type: text/x-diff - description: attachement of a private issue + description: attachment of a private issue attachments_016: content_type: image/png downloads: 0 diff --git a/test/unit/query_test.rb b/test/unit/query_test.rb index 75efaae8a..fc73f0154 100644 --- a/test/unit/query_test.rb +++ b/test/unit/query_test.rb @@ -1486,6 +1486,48 @@ class QueryTest < ActiveSupport::TestCase assert_equal [3, 4], issues.collect(&:id).sort end + def test_filter_on_attachment_description_when_any + query = IssueQuery.new(:name => '_') + query.filters = {"attachment_description" => {:operator => '*', :values => ['']}} + issues = find_issues_with_query(query) + assert_equal [2, 3, 14], issues.collect(&:id).sort + end + + def test_filter_on_attachment_description_when_none + query = IssueQuery.new(:name => '_') + query.filters = {"attachment_description" => {:operator => '!*', :values => ['']}} + issues = find_issues_with_query(query) + assert_equal [2, 3, 4, 14], issues.collect(&:id).sort + end + + def test_filter_on_attachment_description_when_contains + query = IssueQuery.new(:name => '_') + query.filters = {"attachment_description" => {:operator => '~', :values => ['attachment']}} + issues = find_issues_with_query(query) + assert_equal [3, 14], issues.collect(&:id).sort + end + + def test_filter_on_attachment_description_when_does_not_contain + query = IssueQuery.new(:name => '_') + query.filters = {"attachment_description" => {:operator => '!~', :values => ['attachment']}} + issues = find_issues_with_query(query) + assert_equal [2], issues.collect(&:id).sort + end + + def test_filter_on_attachment_description_when_starts_with + query = IssueQuery.new(:name => '_') + query.filters = {"attachment_description" => {:operator => '^', :values => ['attachment']}} + issues = find_issues_with_query(query) + assert_equal [14], issues.collect(&:id).sort + end + + def test_filter_on_attachment_description_when_ends_with + query = IssueQuery.new(:name => '_') + query.filters = {"attachment_description" => {:operator => '$', :values => ['attachment']}} + issues = find_issues_with_query(query) + assert_equal [3], issues.collect(&:id).sort + end + def test_filter_on_subject_when_starts_with query = IssueQuery.new(:name => '_') query.filters = {'subject' => {:operator => '^', :values => ['issue']}}