aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorfrancis <francis>2008-03-07 23:13:37 +0000
committerfrancis <francis>2008-03-07 23:13:37 +0000
commit3bce538613a76beb3487284fab710a49310715aa (patch)
treed39f16a71b0fc0c234a26806e9451300bcc381f0
parent8551df974ca6cb7721cf90a548e9acfb424da1eb (diff)
Index first message text with info requests themselves.
Fix routing for search queries with full stops in. Public body search indexing. User search indexing. Link to specific users out of ones with same name.
-rw-r--r--app/controllers/general_controller.rb16
-rw-r--r--app/helpers/link_to_helper.rb4
-rw-r--r--app/models/incoming_message.rb10
-rw-r--r--app/models/info_request.rb28
-rw-r--r--app/models/public_body.rb6
-rw-r--r--app/models/user.rb4
-rw-r--r--app/views/body/_body_listing.rhtml15
-rw-r--r--app/views/body/_body_listing_single.rhtml19
-rw-r--r--app/views/general/search.rhtml47
-rw-r--r--app/views/request/_request_listing_via_incoming.rhtml4
-rw-r--r--app/views/request/_request_listing_via_outgoing.rhtml8
-rw-r--r--app/views/user/_user_listing_single.rhtml16
-rw-r--r--app/views/user/show.rhtml25
-rw-r--r--config/routes.rb4
-rw-r--r--public/stylesheets/main.css18
-rw-r--r--todo.txt21
-rw-r--r--vendor/plugins/acts_as_solr/lib/parser_methods.rb2
17 files changed, 172 insertions, 75 deletions
diff --git a/app/controllers/general_controller.rb b/app/controllers/general_controller.rb
index 342355c75..986579874 100644
--- a/app/controllers/general_controller.rb
+++ b/app/controllers/general_controller.rb
@@ -5,7 +5,7 @@
# 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.3 2008-03-06 21:49:33 francis Exp $
+# $Id: general_controller.rb,v 1.4 2008-03-07 23:13:38 francis Exp $
class GeneralController < ApplicationController
@@ -39,20 +39,24 @@ class GeneralController < ApplicationController
# Just does a redirect from ?query= search to /query
def search_redirect
- query = params[:query]
- redirect_to search_url(:query => query)
+ @query = params[:query]
+ if @query.nil?
+ render :action => "search"
+ else
+ redirect_to search_url(:query => @query)
+ end
end
# Actual search
def search
@per_page = 20
- query = params[:query]
+ @query = params[:query].join("/")
- query_nopunc = query.gsub(/[^a-z0-9]/i, " ")
+ query_nopunc = @query.gsub(/[^a-z0-9]/i, " ")
query_nopunc = query_nopunc.gsub(/\s+/, " ")
@highlight_words = query_nopunc.split(" ")
- @solr_object = InfoRequest.multi_solr_search(query, :models => [ OutgoingMessage, IncomingMessage ],
+ @solr_object = InfoRequest.multi_solr_search(@query, :models => [ OutgoingMessage, IncomingMessage, PublicBody, User ],
:limit => @per_page, :offset => ((params[:page]||"1").to_i-1) * @per_page)
@search_results = @solr_object.results
end
diff --git a/app/helpers/link_to_helper.rb b/app/helpers/link_to_helper.rb
index 3e6ee7a40..e05aebc0b 100644
--- a/app/helpers/link_to_helper.rb
+++ b/app/helpers/link_to_helper.rb
@@ -5,7 +5,7 @@
# Copyright (c) 2007 UK Citizens Online Democracy. All rights reserved.
# Email: francis@mysociety.org; WWW: http://www.mysociety.org/
#
-# $Id: link_to_helper.rb,v 1.21 2008-03-05 22:03:15 francis Exp $
+# $Id: link_to_helper.rb,v 1.22 2008-03-07 23:13:38 francis Exp $
module LinkToHelper
@@ -47,7 +47,7 @@ module LinkToHelper
# Users
def user_url(user)
- return show_user_url(:url_name => user.url_name, :only_path => true)
+ return show_user_url(:url_name => user.url_name, :only_path => true) + "#user-" + user.id.to_s
end
def user_link(user)
link_to h(user.name), user_url(user)
diff --git a/app/models/incoming_message.rb b/app/models/incoming_message.rb
index a22385347..661b3b659 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.55 2008-03-07 10:13:57 francis Exp $
+# $Id: incoming_message.rb,v 1.56 2008-03-07 23:13:38 francis Exp $
# TODO
@@ -320,13 +320,13 @@ class IncomingMessage < ActiveRecord::Base
attachments = self.get_attachments_for_display
for attachment in attachments
if attachment.content_type == 'text/plain'
- text += attachment.body
+ text += attachment.body + "\n\n"
elsif attachment.content_type == 'application/msword'
tempfile = Tempfile.new('foipdf')
tempfile.print attachment.body
tempfile.flush
system("/usr/bin/wvText " + tempfile.path + " " + tempfile.path + ".txt")
- text += File.read(tempfile.path + ".txt")
+ text += File.read(tempfile.path + ".txt") + "\n\n"
File.unlink(tempfile.path + ".txt")
tempfile.close
elsif attachment.content_type == 'application/pdf'
@@ -334,7 +334,7 @@ class IncomingMessage < ActiveRecord::Base
tempfile.print attachment.body
tempfile.flush
IO.popen("/usr/bin/pdftotext " + tempfile.path + " -", "r") do |child|
- text += child.read()
+ text += child.read() + "\n\n"
end
tempfile.close
end
@@ -344,7 +344,7 @@ class IncomingMessage < ActiveRecord::Base
# Returns text for indexing
def get_text_for_indexing
- return get_body_for_quoting + get_attachment_text
+ return get_body_for_quoting + "\n\n" + get_attachment_text
end
# Returns the name of the person the incoming message is from, or nil if there isn't one
diff --git a/app/models/info_request.rb b/app/models/info_request.rb
index 9bff40a60..b6da611d9 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.57 2008-03-06 20:10:29 francis Exp $
+# $Id: info_request.rb,v 1.58 2008-03-07 23:13:38 francis Exp $
require 'digest/sha1'
@@ -64,7 +64,16 @@ class InfoRequest < ActiveRecord::Base
end
# Full text search indexing
- acts_as_solr :fields => [ :title ], :if => "$do_solr_index"
+ acts_as_solr :fields => [
+ :title,
+ :initial_request_text,
+ { :status => :string }
+# { :created_at => :date }
+ ], :if => "$do_solr_index"
+ def status # for name in Solr queries
+ calculate_status
+ end
+
$do_solr_index = false
def self.update_solr_index
$do_solr_index = true
@@ -79,7 +88,13 @@ class InfoRequest < ActiveRecord::Base
raise "failed to solr_save"
end
for outgoing_message in info_request.outgoing_messages
- outgoing_message.solr_save
+ # Initial request text is indexed for InfoRequest models -
+ # see :initial_request_text in acts_as_solr entry above
+ if outgoing_message.message_type != 'initial_request'
+ outgoing_message.solr_save
+ else
+ outgoing_message.solr_destroy
+ end
end
for incoming_message in info_request.incoming_messages
incoming_message.solr_save
@@ -210,6 +225,7 @@ public
end
# Work out what the situation of the request is
+ # waiting_classification
# waiting_response
# waiting_response_overdue # XXX calculated, should be cached for display?
# waiting_clarification
@@ -217,6 +233,10 @@ public
# successful
# partially_successful
def calculate_status
+ if self.awaiting_description
+ return 'waiting_classification'
+ end
+
# See if response would be overdue
date_today = Time.now.strftime("%Y-%m-%d")
date_response = date_response_required_by.strftime("%Y-%m-%d")
@@ -405,7 +425,7 @@ public
# Display version of status
def display_status
status = self.calculate_status
- if self.awaiting_description
+ if status == 'waiting_classification'
"Awaiting classification."
elsif status == 'waiting_response'
"Awaiting response."
diff --git a/app/models/public_body.rb b/app/models/public_body.rb
index c45ec75a6..82eaa5822 100644
--- a/app/models/public_body.rb
+++ b/app/models/public_body.rb
@@ -22,14 +22,12 @@
# Copyright (c) 2007 UK Citizens Online Democracy. All rights reserved.
# Email: francis@mysociety.org; WWW: http://www.mysociety.org/
#
-# $Id: public_body.rb,v 1.33 2008-03-05 18:14:03 francis Exp $
+# $Id: public_body.rb,v 1.34 2008-03-07 23:13:38 francis Exp $
require 'csv'
require 'set'
class PublicBody < ActiveRecord::Base
- #acts_as_solr :fields => [:name, :short_name]
-
validates_presence_of :name
validates_presence_of :url_name
validates_presence_of :request_email
@@ -61,6 +59,8 @@ class PublicBody < ActiveRecord::Base
acts_as_versioned
self.non_versioned_columns << 'created_at' << 'updated_at'
+ acts_as_solr :fields => [{:name => { :boost => 10.0 }}, {:short_name => { :boost => 10.0 }} ]
+
# When name or short name is changed, also change the url name
def short_name=(short_name)
write_attribute(:short_name, short_name)
diff --git a/app/models/user.rb b/app/models/user.rb
index bc1028ae1..547ae4225 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -20,7 +20,7 @@
# Copyright (c) 2007 UK Citizens Online Democracy. All rights reserved.
# Email: francis@mysociety.org; WWW: http://www.mysociety.org/
#
-# $Id: user.rb,v 1.33 2008-02-28 16:25:30 francis Exp $
+# $Id: user.rb,v 1.34 2008-03-07 23:13:38 francis Exp $
require 'digest/sha1'
@@ -39,6 +39,8 @@ class User < ActiveRecord::Base
attr_accessor :password_confirmation
validates_confirmation_of :password, :message =>"^Please enter the same password twice"
+ acts_as_solr :fields => [ {:name => { :boost => 5.0 }} ]
+
def validate
errors.add(:email, "doesn't look like a valid address") unless MySociety::Validate.is_valid_email(self.email)
end
diff --git a/app/views/body/_body_listing.rhtml b/app/views/body/_body_listing.rhtml
index 0287997c8..7d673a552 100644
--- a/app/views/body/_body_listing.rhtml
+++ b/app/views/body/_body_listing.rhtml
@@ -2,19 +2,6 @@
None found.
<% else %>
<% for public_body in public_bodies %>
- <p class="body_listing">
- <%= public_body_link(public_body) %>
-
- <br>
- <% if not public_body.short_name.empty? %>
- Also called <%=h public_body.short_name %>.
- <br>
- <% end %>
-
- <span class="request_listing_bottomline">
- <%= pluralize(public_body.info_requests.size, "request") %> made.
- Added on <%= simple_date(public_body.created_at) %>.
- </span>
- </p>
+ <%= render :partial => 'body/body_listing_single', :locals => { :public_body => public_body } %>
<% end %>
<% end %>
diff --git a/app/views/body/_body_listing_single.rhtml b/app/views/body/_body_listing_single.rhtml
new file mode 100644
index 000000000..c060ccdb3
--- /dev/null
+++ b/app/views/body/_body_listing_single.rhtml
@@ -0,0 +1,19 @@
+<% if @highlight_words.nil?
+ @highlight_words = []
+ end %>
+
+<p class="body_listing">
+ <%= link_to highlight_words(public_body.name, @highlight_words), public_body_url(public_body) %>
+
+ <br>
+ <% if not public_body.short_name.empty? %>
+ Also called <%=highlight_words(public_body.short_name, @highlight_words) %>.
+ <br>
+ <% end %>
+
+ <span class="body_listing_bottomline">
+ <%= pluralize(public_body.info_requests.size, "request") %> made.
+ Added on <%= simple_date(public_body.created_at) %>.
+ </span>
+</p>
+
diff --git a/app/views/general/search.rhtml b/app/views/general/search.rhtml
index 56d5e44b3..27f36fba8 100644
--- a/app/views/general/search.rhtml
+++ b/app/views/general/search.rhtml
@@ -1,28 +1,41 @@
-<% @title = "Freedom of Information requests matching '" + h(params[:query]) + "'" %>
+<% if @query.nil? %>
+ <% @title = "Search requests, public bodies and users" %>
+ <h1><%=@title%></h1>
+<% else %>
+ <% @title = "Search for '" + h(@query) + "'" %>
+<% end%>
<% form_tag({:action => "search_redirect"}, {:id => "search_form"}) do %>
<p>
- <%= text_field_tag 'query', params[:query], { :size => 40 } %>
+ <%= text_field_tag 'query', @query, { :size => 40 } %>
<%= submit_tag "Search" %>
</p>
<% end %>
-<h1><%=@title%></h1>
+<% if not @search_results.nil? %>
-<% 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_via_outgoing', :locals => { :info_request => search_result.info_request, :outgoing_message => search_result } %>
- <% elsif search_result.class.to_s == 'IncomingMessage' %>
- <%= render :partial => 'request/request_listing_via_incoming', :locals => { :info_request => search_result.info_request, :incoming_message => search_result } %>
- <% else %>
- <p><strong>Unknown search result type <%=search_result.class.to_s%></strong></p>
+ <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_via_outgoing', :locals => { :info_request => search_result.info_request, :outgoing_message => search_result } %>
+ <% elsif search_result.class.to_s == 'IncomingMessage' %>
+ <%= render :partial => 'request/request_listing_via_incoming', :locals => { :info_request => search_result.info_request, :incoming_message => search_result } %>
+ <% elsif search_result.class.to_s == 'PublicBody' %>
+ <%= render :partial => 'body/body_listing_single', :locals => { :public_body => search_result } %>
+ <% elsif search_result.class.to_s == 'User' %>
+ <%= render :partial => 'user/user_listing_single', :locals => { :display_user => search_result } %>
+ <% else %>
+ <p><strong>Unknown search result type <%=search_result.class.to_s%></strong></p>
+ <% end %>
<% end %>
<% end %>
-<% end %>
-<%= will_paginate WillPaginate::Collection.new(params[:page]||1, @per_page, @solr_object.total_hits) %>
+ <%= will_paginate WillPaginate::Collection.new(params[:page]||1, @per_page, @solr_object.total_hits) %>
+
+<% end %>
diff --git a/app/views/request/_request_listing_via_incoming.rhtml b/app/views/request/_request_listing_via_incoming.rhtml
index b2b3d7091..80efb1eb3 100644
--- a/app/views/request/_request_listing_via_incoming.rhtml
+++ b/app/views/request/_request_listing_via_incoming.rhtml
@@ -1,5 +1,5 @@
<p class="request_listing">
- <%= link_to "Response to '" + highlight_words(info_request.title, @highlight_words) + "'", request_url(info_request)+"#incoming-"+incoming_message.id.to_s %>
+ <%= link_to "Response to '" + h(info_request.title) + "'", request_url(info_request)+"#incoming-"+incoming_message.id.to_s %>
<br>
<%= excerpt_and_highlight(incoming_message.get_text_for_indexing, @highlight_words) %>
@@ -10,7 +10,7 @@
<%= info_request.display_status %>
</strong>
- Response from <%= public_body_link(info_request.public_body) %>
+ Response by <%= public_body_link(info_request.public_body) %>
to <%= user_link(info_request.user) %>
on <%= simple_date(incoming_message.sent_at) %>.
</span>
diff --git a/app/views/request/_request_listing_via_outgoing.rhtml b/app/views/request/_request_listing_via_outgoing.rhtml
index ce20231b6..02e236dad 100644
--- a/app/views/request/_request_listing_via_outgoing.rhtml
+++ b/app/views/request/_request_listing_via_outgoing.rhtml
@@ -1,8 +1,8 @@
<p class="request_listing">
<% if outgoing_message.message_type == 'initial_request' %>
- <%= link_to "Initial request for '" + highlight_words(info_request.title, @highlight_words) + "'", request_url(info_request)+"#outgoing-"+outgoing_message.id.to_s %>
+ <% raise "initial_request shouldn't be indexed for search, text is indexed in InfoRequest model" %>
<% elsif outgoing_message.message_type == 'followup' %>
- <%= link_to "Initial request for '" + highlight_words(info_request.title, @highlight_words) + "'", request_url(info_request)+"#outgoing-"+outgoing_message.id.to_s %>
+ <%= link_to "Follow up message for '" + h(info_request.title) + "'", request_url(info_request)+"#outgoing-"+outgoing_message.id.to_s %>
<% else %>
<% raise "unknown outgoing message type" %>
<% end %>
@@ -16,9 +16,9 @@
<%= info_request.display_status %>
</strong>
- Requested from <%= public_body_link(info_request.public_body) %>
+ Follow up sent to <%= public_body_link(info_request.public_body) %>
by <%= user_link(info_request.user) %>
- on <%= simple_date(info_request.created_at) %>.
+ on <%= simple_date(outgoing_message.created_at) %>.
</span>
</p>
diff --git a/app/views/user/_user_listing_single.rhtml b/app/views/user/_user_listing_single.rhtml
new file mode 100644
index 000000000..7df5b38ab
--- /dev/null
+++ b/app/views/user/_user_listing_single.rhtml
@@ -0,0 +1,16 @@
+<% if @highlight_words.nil?
+ @highlight_words = []
+ end %>
+
+<p class="user_listing">
+ <%= link_to highlight_words(display_user.name, @highlight_words), user_url(display_user) %>
+
+ <br>
+ <!--<br>-->
+
+ <span class="user_listing_bottomline">
+ <%= pluralize(display_user.info_requests.size, "request") %> made.
+ Joined on <%= simple_date(display_user.created_at) %>.
+ </span>
+</p>
+
diff --git a/app/views/user/show.rhtml b/app/views/user/show.rhtml
index 41e0ec645..582e79703 100644
--- a/app/views/user/show.rhtml
+++ b/app/views/user/show.rhtml
@@ -5,20 +5,21 @@
<% end%>
<% for display_user in @display_users %>
- <h1><%=@title%></h1>
- <p class="subtitle">Joined on <%= simple_date(display_user.created_at) %></p>
+ <div class="single_user" id="user-<%=display_user.id.to_s%>">
+ <h1><%=@title%></h1>
+ <p class="subtitle">Joined on <%= simple_date(display_user.created_at) %></p>
- <% if display_user.info_requests.empty? %>
- <p><%= display_user == @user ? 'You have' : 'This person has' %>
- made no Freedom of Information requests using this site.</p>
+ <% if display_user.info_requests.empty? %>
+ <p><%= display_user == @user ? 'You have' : 'This person has' %>
+ made no Freedom of Information requests using this site.</p>
- <% else %>
- <p><%= display_user == @user ? 'You have' : 'This person has' %>
- made <%=pluralize(display_user.info_requests.size, "Freedom of Information request") %>
- using this site.</p>
-
- <%= render :partial => 'request/request_listing', :locals => { :info_requests => display_user.info_requests.sort { |a,b| b.created_at <=> a.created_at } } %>
- <% end %>
+ <% else %>
+ <p><%= display_user == @user ? 'You have' : 'This person has' %>
+ made <%=pluralize(display_user.info_requests.size, "Freedom of Information request") %>
+ using this site.</p>
+ <%= render :partial => 'request/request_listing', :locals => { :info_requests => display_user.info_requests.sort { |a,b| b.created_at <=> a.created_at } } %>
+ <% end %>
+ </div>
<% end %>
diff --git a/config/routes.rb b/config/routes.rb
index b30a2f2fd..07b1c570f 100644
--- a/config/routes.rb
+++ b/config/routes.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: routes.rb,v 1.42 2008-03-06 01:23:39 francis Exp $
+# $Id: routes.rb,v 1.43 2008-03-07 23:13:39 francis Exp $
ActionController::Routing::Routes.draw do |map|
# The priority is based upon order of creation: first created -> highest priority.
@@ -18,7 +18,7 @@ ActionController::Routing::Routes.draw do |map|
general.auto_complete_for_public_body_query 'auto_complete_for_public_body_query', :action => 'auto_complete_for_public_body_query'
general.search_redirect '/search', :action => 'search_redirect'
- general.search '/search/:query', :action => 'search'
+ general.search '/search/*query', :action => 'search'
end
map.with_options :controller => 'request' do |request|
diff --git a/public/stylesheets/main.css b/public/stylesheets/main.css
index 1d27faafa..a6c768003 100644
--- a/public/stylesheets/main.css
+++ b/public/stylesheets/main.css
@@ -360,10 +360,26 @@ table#list_requests .odd {
/* /search - searching */
.highlight {
- background-color: #eeee00;
+ background-color: #dddd00;
color: #000000;
}
+.user_listing {
+}
+.user_listing_bottomline {
+ color: #7aa600;
+}
+.user_listing_bottomline a:link {
+ color: #7777cc;
+}
+.user_listing_bottomline a:visited {
+ color: #551a8b;
+}
+.user_listing_bottomline a:active {
+ color: #ff0000;
+}
+
+
/* /body - listing bodies */
.body_listing {
diff --git a/todo.txt b/todo.txt
index 6b1253d58..ec96de12d 100644
--- a/todo.txt
+++ b/todo.txt
@@ -1,6 +1,13 @@
+CVS commit message:
+Index first message text with info requests themselves.
+Fix routing for search queries with full stops in.
+Public body search indexing.
+User search indexing.
+Link to specific users out of ones with same name.
+
+
Search:
-Don't show same request so many times
Status and stuff
Date ranges
@@ -9,11 +16,23 @@ Search for public bodies
Rubbish highlighting:
http://www.whatdotheyknow.com/search/%22MS%20Office%22
+Seems to be returning text anyway, so may as well highlight
+http://localhost:8999/solr/select/?q=house&version=2.2&start=0&rows=10&indent=on
One of the PDFs on live site has:
Error: PDF version 1.6 -- xpdf supports version 1.5 (continuing anyway)
Need to upgrade to poppler-utils?
+
+Should we index by individual piece of correspondence, or by whole info requests?
+ Advantages of individual:
+ Ordinary search results link more directly to object
+ Easy to alert when a new piece of correspondence occurs
+ Advantages of whole info requests:
+ Easier to alert to new correspondence on request containing keyword
+ Shorter search results
+ Syntax of filtering requests by type is clearer
+
FOI requests to use to test it
==============================
diff --git a/vendor/plugins/acts_as_solr/lib/parser_methods.rb b/vendor/plugins/acts_as_solr/lib/parser_methods.rb
index fc92d8851..f0c6f7a9d 100644
--- a/vendor/plugins/acts_as_solr/lib/parser_methods.rb
+++ b/vendor/plugins/acts_as_solr/lib/parser_methods.rb
@@ -124,4 +124,4 @@ module ActsAsSolr #:nodoc:
end
end
-end \ No newline at end of file
+end