git-svn-id: http://svn.redmine.org/redmine/trunk@13858 e93f8b46-1217-0410-a6f0-8f06a7374b81tags/3.0.0
@@ -24,6 +24,7 @@ class SearchController < ApplicationController | |||
@all_words = params[:all_words] ? params[:all_words].present? : true | |||
@titles_only = params[:titles_only] ? params[:titles_only].present? : false | |||
@search_attachments = params[:attachments].presence || '0' | |||
@open_issues = params[:open_issues] ? params[:open_issues].present? : false | |||
# quick jump to an issue | |||
if (m = @question.match(/^#?(\d+)$/)) && (issue = Issue.visible.find_by_id(m[1].to_i)) | |||
@@ -56,7 +57,7 @@ class SearchController < ApplicationController | |||
fetcher = Redmine::Search::Fetcher.new( | |||
@question, User.current, @scope, projects_to_search, | |||
:all_words => @all_words, :titles_only => @titles_only, :attachments => @search_attachments, | |||
:all_words => @all_words, :titles_only => @titles_only, :attachments => @search_attachments, :open_issues => @open_issues, | |||
:cache => params[:page].present? | |||
) | |||
@@ -47,7 +47,8 @@ class Issue < ActiveRecord::Base | |||
acts_as_customizable | |||
acts_as_watchable | |||
acts_as_searchable :columns => ['subject', "#{table_name}.description"], | |||
:preload => [:project, :status, :tracker] | |||
:preload => [:project, :status, :tracker], | |||
:scope => lambda {|options| options[:open_issues] ? self.open : self.all} | |||
acts_as_event :title => Proc.new {|o| "#{o.tracker.name} ##{o.id} (#{o.status}): #{o.subject}"}, | |||
:url => Proc.new {|o| {:controller => 'issues', :action => 'show', :id => o.id}}, |
@@ -20,6 +20,7 @@ | |||
<fieldset class="collapsible collapsed"> | |||
<legend onclick="toggleFieldset(this);"><%= l(:label_options) %></legend> | |||
<div id="options-content" style="display:none;"> | |||
<p><label><%= check_box_tag 'open_issues', 1, @open_issues %> <%= l(:label_search_open_issues_only) %></label></p> | |||
<p> | |||
<label><%= radio_button_tag 'attachments', '0', @search_attachments == '0' %> <%= l(:label_search_attachments_no) %></label> | |||
<label><%= radio_button_tag 'attachments', '1', @search_attachments == '1' %> <%= l(:label_search_attachments_yes) %></label> |
@@ -930,6 +930,7 @@ en: | |||
label_search_attachments_yes: Search attachment filenames and descriptions | |||
label_search_attachments_no: Do not search attachments | |||
label_search_attachments_only: Search attachments only | |||
label_search_open_issues_only: Open issues only | |||
button_login: Login | |||
button_submit: Submit |
@@ -950,6 +950,7 @@ fr: | |||
label_search_attachments_yes: Rechercher les noms et descriptions de fichiers | |||
label_search_attachments_no: Ne pas rechercher les fichiers | |||
label_search_attachments_only: Rechercher les fichiers uniquement | |||
label_search_open_issues_only: Demandes ouvertes uniquement | |||
button_login: Connexion | |||
button_submit: Soumettre |
@@ -89,7 +89,7 @@ module Redmine | |||
unless options[:attachments] == 'only' | |||
r = fetch_ranks_and_ids( | |||
search_scope(user, projects). | |||
search_scope(user, projects, options). | |||
where(search_tokens_condition(columns, tokens, options[:all_words])), | |||
options[:limit] | |||
) | |||
@@ -109,7 +109,7 @@ module Redmine | |||
visibility = clauses.join(' OR ') | |||
r |= fetch_ranks_and_ids( | |||
search_scope(user, projects). | |||
search_scope(user, projects, options). | |||
joins(:custom_values). | |||
where(visibility). | |||
where(search_tokens_condition(["#{CustomValue.table_name}.value"], tokens, options[:all_words])), | |||
@@ -121,7 +121,7 @@ module Redmine | |||
if !options[:titles_only] && searchable_options[:search_journals] | |||
r |= fetch_ranks_and_ids( | |||
search_scope(user, projects). | |||
search_scope(user, projects, options). | |||
joins(:journals). | |||
where("#{Journal.table_name}.private_notes = ? OR (#{Project.allowed_to_condition(user, :view_private_notes)})", false). | |||
where(search_tokens_condition(["#{Journal.table_name}.notes"], tokens, options[:all_words])), | |||
@@ -133,7 +133,7 @@ module Redmine | |||
if searchable_options[:search_attachments] && (options[:titles_only] ? options[:attachments] == 'only' : options[:attachments] != '0') | |||
r |= fetch_ranks_and_ids( | |||
search_scope(user, projects). | |||
search_scope(user, projects, options). | |||
joins(:attachments). | |||
where(search_tokens_condition(["#{Attachment.table_name}.filename", "#{Attachment.table_name}.description"], tokens, options[:all_words])), | |||
options[:limit] | |||
@@ -180,7 +180,7 @@ module Redmine | |||
private :fetch_ranks_and_ids | |||
# Returns the search scope for user and projects | |||
def search_scope(user, projects) | |||
def search_scope(user, projects, options={}) | |||
if projects.is_a?(Array) && projects.empty? | |||
# no results | |||
return none | |||
@@ -188,7 +188,7 @@ module Redmine | |||
scope = (searchable_options[:scope] || self) | |||
if scope.is_a? Proc | |||
scope = scope.call | |||
scope = scope.call(options) | |||
end | |||
if respond_to?(:visible) && !searchable_options.has_key?(:permission) |
@@ -209,6 +209,15 @@ class SearchControllerTest < ActionController::TestCase | |||
assert_equal 2, results.size | |||
end | |||
def test_search_open_issues | |||
Issue.generate! :subject => 'search_open' | |||
Issue.generate! :subject => 'search_open', :status_id => 5 | |||
get :index, :id => 1, :q => 'search_open', :open_issues => '1' | |||
results = assigns(:results) | |||
assert_equal 1, results.size | |||
end | |||
def test_search_all_words | |||
# 'all words' is on by default | |||
get :index, :id => 1, :q => 'recipe updating saving', :all_words => '1' |