diff options
| author | Seb Bacon <seb.bacon@gmail.com> | 2011-08-24 11:50:10 +0100 | 
|---|---|---|
| committer | Seb Bacon <seb.bacon@gmail.com> | 2011-08-24 11:50:10 +0100 | 
| commit | 6675866787bf2c9cb095b8154fbdae33a1fb71c4 (patch) | |
| tree | c4cf9cc17bce2006e6e0e06f8945be783ae3d976 | |
| parent | b9c7136580e65be4f0eb5c7ebbeaf42aeb888d1f (diff) | |
First stab at filtering on the "View requests" page
| -rw-r--r-- | app/controllers/application_controller.rb | 55 | ||||
| -rw-r--r-- | app/controllers/request_controller.rb | 26 | ||||
| -rw-r--r-- | app/models/info_request.rb | 3 | ||||
| -rw-r--r-- | app/models/info_request_event.rb | 18 | ||||
| -rw-r--r-- | app/views/request/list.rhtml | 45 | ||||
| -rw-r--r-- | config/routes.rb | 3 | 
6 files changed, 118 insertions, 32 deletions
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 0df3e22da..e16f9f5bb 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -349,6 +349,61 @@ class ApplicationController < ActionController::Base          session[:last_body_id] = public_body.id      end +    def alter_query_from_params(query) +        # various forms are used to customise queries and hide +        # xapian's complexity.  This parses the form fields and turns +        # them into a xapian query string +        query = "" if query.nil? +        sortby = "newest" +        if params[:request_variety] && !(query =~ /variety:/)  +            sortby = "described" +            varieties = [] +            if params[:request_variety].include? "sent" +                varieties << ['variety:sent', 'variety:followup_sent'] +            end +            if params[:request_variety].include? "response" +                varieties << ['variety:response'] +            end +            if params[:request_variety].include? "comment" +                varieties << ['variety:comment'] +            end +            query += " (#{varieties.join(' OR ')})"             +        end +        case params[:request_status] +        when "recent", "all" +            if !(query =~ /variety:/) +                query += " (variety:sent)" +            end +        when "successful" +            query += ' (latest_status:successful OR latest_status:partially_successful)' +            sortby = "described" +        when  "unsuccessful" +            query += '  (latest_status:rejected OR latest_status:not_held)' +            sortby = "described" +        when "awaiting" +            if query.empty? +                query += 'variety:sent ' +            end +            query += ' NOT (latest_status:successful OR latest_status:partially_successful OR latest_status:rejected OR latest_status:not_held OR latest_status:gone_postal)' +            sortby = "described" +        when "internal_review" +            query += ' (latest_status:internal_review)' +            sortby = "described" +        end + +        if !params[:request_date_after].nil? && params[:request_date_before].nil? +            params[:request_date_before] = Date.now.strftime("%d/%m/%Y") +            query += " #{params[:request_date_after]}..#{params[:request_date_before]}" +        elsif params[:request_date_after].nil? && !params[:request_date_before].nil? +            params[:request_date_after] = "01/01/2008" +        end +        if params[:request_date_after] +            query = "#{params[:request_date_after]}..#{params[:request_date_before]} " + query +        end +        return query, sortby + +    end +      # URL generating functions are needed by all controllers (for redirects),      # views (for links) and mailers (for use in emails), so include them into      # all of all. diff --git a/app/controllers/request_controller.rb b/app/controllers/request_controller.rb index c1a13273a..731348fbf 100644 --- a/app/controllers/request_controller.rb +++ b/app/controllers/request_controller.rb @@ -129,25 +129,12 @@ class RequestController < ApplicationController      def list          medium_cache          @view = params[:view] - -        if @view.nil? -            redirect_to request_list_url(:view => 'successful') -            return -        end - -        if @view == 'recent' -            @title = _("Recently sent Freedom of Information requests") -            query = "variety:sent"; -            sortby = "newest" -            @track_thing = TrackThing.create_track_for_all_new_requests -        elsif @view == 'successful' -            @title = _("Recently successful responses") -            query = 'variety:response (status:successful OR status:partially_successful)' -            sortby = "described" -            @track_thing = TrackThing.create_track_for_all_successful_requests -        else -            raise "unknown request list view " + @view.to_s +        if !@view.nil? +            params[:request_status] = @view          end +        params[:request_status] = "recent" if params[:query].nil? && params[:request_status].nil?  +        query, sortby = alter_query_from_params(params[:query]) +        @title = "Some title"          @page = get_search_page_from_params if !@page # used in cache case, as perform_search sets @page as side effect          behavior_cache :tag => [@view, @page] do @@ -158,7 +145,8 @@ class RequestController < ApplicationController          @title = @title + " (page " + @page.to_s + ")" if (@page > 1) -        @feed_autodetect = [ { :url => do_track_url(@track_thing, 'feed'), :title => @track_thing.params[:title_in_rss], :has_json => true } ] +        # XXX need to reinstate the following; @track_thing had previously been set to "TrackThing.create_track_for_all_new_requests" and "TrackThing.create_track_for_all_successful_requests" +        # @feed_autodetect = [ { :url => do_track_url(@track_thing, 'feed'), :title => @track_thing.params[:title_in_rss], :has_json => true } ]          # Don't let robots go more than 20 pages in          if @page > 20 diff --git a/app/models/info_request.rb b/app/models/info_request.rb index c667e1499..9b0f1047b 100644 --- a/app/models/info_request.rb +++ b/app/models/info_request.rb @@ -451,7 +451,7 @@ public              self.log_event("response", params)              self.save!          end - +        self.info_request_events.each { |event| event.xapian_mark_needs_index } # for the "waiting_classification" index          RequestMailer.deliver_new_response(self, incoming_message)      end @@ -564,6 +564,7 @@ public      def calculate_event_states          curr_state = nil          for event in self.info_request_events.reverse +            event.xapian_mark_needs_index  # we need to reindex all events in order to update their latest_* terms              if curr_state.nil?                   if !event.described_state.nil?                      curr_state = event.described_state diff --git a/app/models/info_request_event.rb b/app/models/info_request_event.rb index d79647c98..d8ab0e446 100644 --- a/app/models/info_request_event.rb +++ b/app/models/info_request_event.rb @@ -103,7 +103,7 @@ class InfoRequestEvent < ActiveRecord::Base                       [ :created_at_numeric, 1, "created_at", :number ], # for sorting                       [ :described_at_numeric, 2, "described_at", :number ], # XXX using :number for lack of :datetime support in Xapian values                       [ :request, 3, "request_collapse", :string ], -                     [ :request_title_collapse, 4, "request_title_collapse", :string ] +                     [ :request_title_collapse, 4, "request_title_collapse", :string ],                     ],          :terms => [ [ :calculated_state, 'S', "status" ],                  [ :requested_by, 'B', "requested_by" ], @@ -111,6 +111,9 @@ class InfoRequestEvent < ActiveRecord::Base                  [ :commented_by, 'C', "commented_by" ],                  [ :request, 'R', "request" ],                  [ :variety, 'V', "variety" ], +                [ :latest_variety, 'K', "latest_variety" ], +                [ :latest_status, 'L', "latest_status" ], +                [ :waiting_classification, 'W', "waiting_classification" ],                  [ :filetype, 'T', "filetype" ],                  [ :tags, 'U', "tag" ]           ], @@ -138,6 +141,19 @@ class InfoRequestEvent < ActiveRecord::Base      def request          self.info_request.url_title      end + +    def latest_variety +        self.info_request.get_last_event.variety +    end + +    def latest_status +        self.info_request.get_last_event.calculated_state +    end + +    def waiting_classification +        self.info_request.awaiting_description == true ? "yes" : "no" +    end +      def request_title_collapse          url_title = self.info_request.url_title          # remove numeric section from the end, use this to group lots diff --git a/app/views/request/list.rhtml b/app/views/request/list.rhtml index 04dc0d010..50e98f6e1 100644 --- a/app/views/request/list.rhtml +++ b/app/views/request/list.rhtml @@ -1,15 +1,38 @@ -<div id="list_sidebar"> -<h1><%= _('Show only...')%></h1> -<ul> -<% for view, description, target in [  -    ['successful', _('Successful responses'), request_list_successful_url(:view => 'successful')], -    ['recent', _('Recently sent requests'), request_list_recent_url(:view => 'recent')] -] %> -<li>   -    <%= link_to_unless (@view == view), description, target %>  -</li> +<div id="list-filter"> +<% form_tag({}, :method => "get") do %> + <%= label_tag(:query, "Search for:") %> + <%= text_field_tag(:query, params[:query]) %> <br/> + <% [["sent", "messages from users"],  +    ["response", "messages from authorities"], +    ["comment", "comments"]].each_with_index do |item, index| +    variety, title = item %> +  +  <%= check_box_tag "request_variety[]", variety, params[:request_variety].nil? ? true : params[:request_variety].include?(variety), :id => "request_variety_#{index}" %> +  <%= label_tag("request_variety_#{index}", title) %> <br /> + <% end %> + + <ul class="request-selector"> +   <% for status in ["all", "successful", "unsuccessful", "awaiting"] %> +  <li> +  <% if params[:view] != status %> +   <%= link_to "#{status} requests", url_for(:controller => "request", :action => "list", :view => status) + "?#{request.query_string}"  %>  +  <% else %> +    <%= status %> requests +  <% end %> +  </li> +  <% end %> + </ul> + + <div class="filter-item last"> +   between dates: +   <input type="text" name="request_date_after" /> from<br> +   <input type="text" name="request_date_before" /> to<br> + </div> + + + + <%= submit_tag("Search") %>  <% end %> -</ul>  </div>  <h1><%=@title%></h1> diff --git a/config/routes.rb b/config/routes.rb index c16c10eb9..fbccddba7 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -32,7 +32,10 @@ ActionController::Routing::Routes.draw do |map|      map.with_options :controller => 'request' do |request|          request.request_list_recent   '/list/recent',        :action => 'list', :view => 'recent' +        request.request_list_all   '/list/all',        :action => 'list', :view => 'all'          request.request_list_successful   '/list/successful',        :action => 'list', :view => 'successful' +        request.request_list_unsuccessful   '/list/unsuccessful',        :action => 'list', :view => 'unsuccessful' +        request.request_list_awaiting   '/list/awaiting',        :action => 'list', :view => 'awaiting'          request.request_list   '/list',        :action => 'list'          request.new_request    '/new',         :action => 'new'  | 
