prepare promodvd order
[opensuse:software-o-o.git] / app / controllers / search_controller.rb
1 class SearchController < ApplicationController
2
3   def index
4     @exclude_debug = true
5     @include_home = 'false'
6     if params[:baseproject]
7       @baseproject = params[:baseproject]
8     end
9     if params[:q]
10       perform_search
11       set_default_message
12     end
13   end
14
15   def download
16     DownloadHistory.create :query => params[:query], :base => params[:base],
17       :file => params[:file]
18     redirect_to "http://download.opensuse.org/repositories/" + params[:file]
19   end
20
21   private
22
23   def perform_search
24     @query = params[:q]
25     @baseproject = params[:baseproject]
26     @current_page = params[:p].to_i
27     @current_page = 1 if @current_page == 0
28
29     @exclude_debug = params[:exclude_debug]
30     @include_home = params[:include_home]
31     exclude_filter = 'home:' if params[:include_home].nil?
32
33     @project = params[:project]
34
35     if @query.split(" ").select{|e| e.length < 2 }.size > 0
36       flash.now[:error] = _("Please use search strings of at least 2 characters") and return
37     end
38
39     base = @baseproject=="ALL" ? "" : @baseproject
40     begin
41       @result = Seeker.prepare_result(@query, base, @project, exclude_filter, @exclude_debug)
42       if @current_page == 1 # ignore sub pages
43         SearchHistory.create :query => @query, :base => @baseproject, :patterns => @result.pattern_count,
44           :binaries => @result.binary_count, :count => @result.length
45       end
46     rescue => e
47       search_error, code, api_exception = ActiveXML::Transport.extract_error_message e
48       if code == "413"
49         logger.debug("Too many hits, trying exact match for: #{@query}")
50         @result = Seeker.prepare_result(CGI.escape("\"#{@query}\""), base, @project, exclude_filter, @exclude_debug)
51         unless @result.blank?
52           @query = "\"#{@query}\""
53           flash.now[:note] = _("Switched to exact match due to too many hits on substring search.")
54         else
55           flash.now[:error] = _("Please be more precise in your search, search limit reached.")
56         end
57       else
58         logger.error _("Could not perform search: ") + search_error
59         flash.now[:error] = _("Could not perform search: ") + search_error
60       end
61       return
62     end
63
64     flash.now[:warn] = _("Please be more precise in your search, search limit reached.") if @result.binary_count >= 1000
65     return true
66   end
67
68
69   def set_default_message
70     if DEFAULT_SEARCHES[params[:q]]
71       flash.now[:note] = DEFAULT_SEARCHES[params[:q]]
72     end
73   end
74
75 end