diff options
Diffstat (limited to 'app')
-rw-r--r-- | app/controllers/general_controller.rb | 66 | ||||
-rw-r--r-- | app/controllers/request_controller.rb | 40 | ||||
-rw-r--r-- | app/models/incoming_message.rb | 4 | ||||
-rw-r--r-- | app/models/info_request.rb | 28 | ||||
-rw-r--r-- | app/models/outgoing_message.rb | 4 | ||||
-rw-r--r-- | app/views/general/_public_body_query.rhtml (renamed from app/views/request/_public_body_query.rhtml) | 0 | ||||
-rw-r--r-- | app/views/general/frontpage.rhtml (renamed from app/views/request/frontpage.rhtml) | 8 | ||||
-rw-r--r-- | app/views/general/search.rhtml | 30 | ||||
-rw-r--r-- | app/views/request/_request_listing.rhtml | 25 | ||||
-rw-r--r-- | app/views/request/_request_listing_single.rhtml | 18 |
10 files changed, 162 insertions, 61 deletions
diff --git a/app/controllers/general_controller.rb b/app/controllers/general_controller.rb new file mode 100644 index 000000000..b4f7c6eac --- /dev/null +++ b/app/controllers/general_controller.rb @@ -0,0 +1,66 @@ +# app/controllers/general_controller.rb: +# For pages like front page, general search, that aren't specific to a +# particular model. +# +# Copyright (c) 2008 UK Citizens Online Democracy. All rights reserved. +# Email: francis@mysociety.org; WWW: http://www.mysociety.org/ +# +# $Id: general_controller.rb,v 1.1 2008-03-06 01:23:38 francis Exp $ + +class GeneralController < ApplicationController + + # Fancy javascript smancy for auto complete search on front page + def auto_complete_for_public_body_query + @public_bodies = public_body_query(params[:public_body][:query]) + + render :partial => "public_body_query" + end + + # Actual front page + def frontpage + # Public body search on the left + @public_bodies = [] + @query_made = false + if params[:public_body] and params[:public_body][:query] + # Try and do exact match - redirect if it is made + @public_body = PublicBody.find_by_name(params[:public_body][:query]) + if not @public_body.nil? + redirect_to new_request_to_body_url(:public_body_id => @public_body.id.to_s) + end + # Otherwise use search engine to find public body + @public_bodies = public_body_query(params[:public_body][:query]) + @query_made = true + end + + # Get all successful requests for display on the right + @info_requests = InfoRequest.find :all, :order => "created_at desc", :conditions => "prominence = 'normal' and described_state in ('successful', 'partially_successful')", :limit => 3 + end + + + # Just does a redirect from ?query= search to /query + def search_redirect + query = params[:query] + redirect_to search_url(:query => query) + end + + # Actual search + def search + query = params[:query] + @solr_object = InfoRequest.multi_solr_search(query, :models => [ OutgoingMessage, IncomingMessage ]) + @search_results = @solr_object.results + end + + private + + # Used in front page search for public body + def public_body_query(query) + # @public_bodies = PublicBody.find_by_solr(query).results + + criteria = '%' + query + '%' + @public_bodies = PublicBody.find(:all, + :conditions => ["name ilike ? or short_name ilike ?", criteria, criteria], + :order => 'name', :limit=>10) + return @public_bodies + end +end + diff --git a/app/controllers/request_controller.rb b/app/controllers/request_controller.rb index 76cf70ee1..977e4cd32 100644 --- a/app/controllers/request_controller.rb +++ b/app/controllers/request_controller.rb @@ -4,7 +4,7 @@ # Copyright (c) 2007 UK Citizens Online Democracy. All rights reserved. # Email: francis@mysociety.org; WWW: http://www.mysociety.org/ # -# $Id: request_controller.rb,v 1.64 2008-02-29 13:24:22 francis Exp $ +# $Id: request_controller.rb,v 1.65 2008-03-06 01:23:38 francis Exp $ class RequestController < ApplicationController @@ -39,31 +39,6 @@ class RequestController < ApplicationController def list @info_requests = InfoRequest.paginate :order => "created_at desc", :page => params[:page], :per_page => 25, :conditions => "prominence = 'normal'" end - - # Fancy javascript smancy for auto complete search - def auto_complete_for_public_body_query - @public_bodies = public_body_query(params[:public_body][:query]) - - render :partial => "public_body_query" - end - def frontpage - # Public body search on the left - @public_bodies = [] - @query_made = false - if params[:public_body] and params[:public_body][:query] - # Try and do exact match - redirect if it is made - @public_body = PublicBody.find_by_name(params[:public_body][:query]) - if not @public_body.nil? - redirect_to new_request_to_body_url(:public_body_id => @public_body.id.to_s) - end - # Otherwise use search engine to find public body - @public_bodies = public_body_query(params[:public_body][:query]) - @query_made = true - end - - # Get all successful requests for display on the right - @info_requests = InfoRequest.find :all, :order => "created_at desc", :conditions => "prominence = 'normal' and described_state in ('successful', 'partially_successful')", :limit => 3 - end # Page new form posts to def new @@ -284,16 +259,5 @@ class RequestController < ApplicationController render :text => @attachment.body end - private - - # Used in front page search for public body - def public_body_query(query) - # @public_bodies = PublicBody.find_by_solr(query).results - - criteria = '%' + query + '%' - @public_bodies = PublicBody.find(:all, - :conditions => ["name ilike ? or short_name ilike ?", criteria, criteria], - :order => 'name', :limit=>10) - return @public_bodies - end end + diff --git a/app/models/incoming_message.rb b/app/models/incoming_message.rb index b3560e006..02256805e 100644 --- a/app/models/incoming_message.rb +++ b/app/models/incoming_message.rb @@ -18,7 +18,7 @@ # Copyright (c) 2007 UK Citizens Online Democracy. All rights reserved. # Email: francis@mysociety.org; WWW: http://www.mysociety.org/ # -# $Id: incoming_message.rb,v 1.48 2008-02-28 14:25:51 francis Exp $ +# $Id: incoming_message.rb,v 1.49 2008-03-06 01:23:38 francis Exp $ # TODO @@ -50,6 +50,8 @@ class IncomingMessage < ActiveRecord::Base has_many :outgoing_message_followups, :class_name => OutgoingMessage + acts_as_solr :fields => [ :get_main_body_text ], :if => "$do_solr_index" + # Return the structured TMail::Mail object # Documentation at http://i.loveruby.net/en/projects/tmail/doc/ def mail diff --git a/app/models/info_request.rb b/app/models/info_request.rb index df2e32c8a..53f349535 100644 --- a/app/models/info_request.rb +++ b/app/models/info_request.rb @@ -21,7 +21,7 @@ # Copyright (c) 2007 UK Citizens Online Democracy. All rights reserved. # Email: francis@mysociety.org; WWW: http://www.mysociety.org/ # -# $Id: info_request.rb,v 1.53 2008-02-29 16:01:32 francis Exp $ +# $Id: info_request.rb,v 1.54 2008-03-06 01:23:38 francis Exp $ require 'digest/sha1' @@ -63,6 +63,28 @@ class InfoRequest < ActiveRecord::Base end end + # Full text search indexing + acts_as_solr :fields => [ :title ], :if => "$do_solr_index" + $do_solr_index = false + def self.update_solr_index + $do_solr_index = true + InfoRequest.rebuild_solr_index(0) do |ar, options| + ar.find(:all, :conditions => ["not solr_up_to_date"]) + end + OutgoingMessage.rebuild_solr_index(0) do |ar, options| + ar.find(:all, :conditions => ["not (select solr_up_to_date from info_requests where id = outgoing_messages.info_request_id)"]) + end + IncomingMessage.rebuild_solr_index(0) do |ar, options| + ar.find(:all, :conditions => ["not (select solr_up_to_date from info_requests where id = incoming_messages.info_request_id)"]) + end + InfoRequest.update_all("solr_up_to_date = 't'") + $do_solr_index = false + end + def before_update + self.solr_up_to_date = false + true + end + public # When name is changed, also change the url name def title=(title) @@ -110,7 +132,9 @@ public # Return info request corresponding to an incoming email address, or nil if # none found. Checks the hash to ensure the email came from the public body - - # only they are sent the email address with the has in it. + # only they are sent the email address with the has in it. (We don't check + # the prefix and domain, as sometimes those change, or might be elided by + # copying an email, and that doesn't matter) def self.find_by_incoming_email(incoming_email) incoming_email =~ /request-(\d+)-([a-z0-9]+)/ id = $1.to_i diff --git a/app/models/outgoing_message.rb b/app/models/outgoing_message.rb index 03b3e5fef..bbbf1c7bb 100644 --- a/app/models/outgoing_message.rb +++ b/app/models/outgoing_message.rb @@ -21,7 +21,7 @@ # Copyright (c) 2007 UK Citizens Online Democracy. All rights reserved. # Email: francis@mysociety.org; WWW: http://www.mysociety.org/ # -# $Id: outgoing_message.rb,v 1.32 2008-02-27 14:01:30 francis Exp $ +# $Id: outgoing_message.rb,v 1.33 2008-03-06 01:23:38 francis Exp $ class OutgoingMessage < ActiveRecord::Base belongs_to :info_request @@ -32,6 +32,8 @@ class OutgoingMessage < ActiveRecord::Base belongs_to :incoming_message_followup, :foreign_key => 'incoming_message_followup_id', :class_name => 'IncomingMessage' + acts_as_solr :fields => [ :body ], :if => "$do_solr_index" + # How the default letter starts and ends def get_salutation ret = "Dear " diff --git a/app/views/request/_public_body_query.rhtml b/app/views/general/_public_body_query.rhtml index 77efdfcc1..77efdfcc1 100644 --- a/app/views/request/_public_body_query.rhtml +++ b/app/views/general/_public_body_query.rhtml diff --git a/app/views/request/frontpage.rhtml b/app/views/general/frontpage.rhtml index 508f5105c..e3fb54ca8 100644 --- a/app/views/request/frontpage.rhtml +++ b/app/views/general/frontpage.rhtml @@ -58,6 +58,12 @@ <div id="find_information"> <h1>Explore information that others requested</h1> - <%= render :partial => 'request_listing', :locals => { :info_requests => @info_requests } %> + <% form_tag({:action => "search_redirect"}, {:id => "search_form"}) do %> + <p> + <%= text_field_tag 'query', params[:query], { :size => 20 } %> + <%= submit_tag "Search" %> + </p> + <% end %> + <%= render :partial => 'request/request_listing', :locals => { :info_requests => @info_requests } %> <p><a href="/list">View all information</a></p> </div> diff --git a/app/views/general/search.rhtml b/app/views/general/search.rhtml new file mode 100644 index 000000000..5d848c66a --- /dev/null +++ b/app/views/general/search.rhtml @@ -0,0 +1,30 @@ +<% @title = "Freedom of Information requests matching '" + h(params[:query]) + "'" %> + +<% form_tag({:action => "search_redirect"}, {:id => "search_form"}) do %> + <p> + <%= text_field_tag 'query', params[:query], { :size => 40 } %> + <%= submit_tag "Search" %> + </p> +<% end %> + +<h1><%=@title%></h1> + +<% if @search_results.empty? %> + None found. +<% else %> + <% for search_result in @search_results %> + <% if search_result.class.to_s == 'InfoRequest' %> + <%= render :partial => 'request/request_listing_single', :locals => { :info_request => search_result } %> + <% elsif search_result.class.to_s == 'OutgoingMessage' %> + <%= render :partial => 'request/request_listing_single', :locals => { :info_request => search_result.info_request } %> + <% elsif search_result.class.to_s == 'IncomingMessage' %> + <%= render :partial => 'request/request_listing_single', :locals => { :info_request => search_result.info_request } %> + <% else %> + <p><strong>Unknown search result type <%=search_result.class.to_s%></strong></p> + <% end %> + <% end %> +<% end %> + +<% +#= will_paginate(@info_requests) +%> diff --git a/app/views/request/_request_listing.rhtml b/app/views/request/_request_listing.rhtml index 4c31f470a..ebfbc60a4 100644 --- a/app/views/request/_request_listing.rhtml +++ b/app/views/request/_request_listing.rhtml @@ -1,19 +1,8 @@ -<% for info_request in info_requests %> - <p class="request_listing"> - <%= request_link(info_request) %> - - <br> - <%=h excerpt(info_request.initial_request_text, "", 300) %> - <br> - - <span class="request_listing_bottomline"> - <strong> - <%= info_request.display_status %> - </strong> - - Requested from <%= public_body_link(info_request.public_body) %> - by <%= user_link(info_request.user) %> - on <%= simple_date(info_request.created_at) %>. - </span> - </p> +<% if info_requests.empty? %> + None found. +<% else %> + <% for info_request in info_requests %> + <%= render :partial => 'request/request_listing_single', :locals => { :info_request => info_request } %> + <% end %> <% end %> + diff --git a/app/views/request/_request_listing_single.rhtml b/app/views/request/_request_listing_single.rhtml new file mode 100644 index 000000000..b91d9c640 --- /dev/null +++ b/app/views/request/_request_listing_single.rhtml @@ -0,0 +1,18 @@ +<p class="request_listing"> + <%= request_link(info_request) %> + + <br> + <%=h excerpt(info_request.initial_request_text, "", 300) %> + <br> + + <span class="request_listing_bottomline"> + <strong> + <%= info_request.display_status %> + </strong> + + Requested from <%= public_body_link(info_request.public_body) %> + by <%= user_link(info_request.user) %> + on <%= simple_date(info_request.created_at) %>. + </span> +</p> + |