From 136cf239bfa0230d33d741aa4b31c0291f20fe10 Mon Sep 17 00:00:00 2001 From: Louise Crow Date: Wed, 31 Jul 2013 15:34:12 +0100 Subject: Re-annotate models with database fields --- app/models/info_request.rb | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) (limited to 'app/models/info_request.rb') diff --git a/app/models/info_request.rb b/app/models/info_request.rb index 8f15a4ea4..c9bcc9bab 100644 --- a/app/models/info_request.rb +++ b/app/models/info_request.rb @@ -1,26 +1,25 @@ # == Schema Information -# Schema version: 20120919140404 # # Table name: info_requests # -# id :integer not null, primary key -# title :text not null +# id :integer not null, primary key +# title :text not null # user_id :integer -# public_body_id :integer not null -# created_at :datetime not null -# updated_at :datetime not null -# described_state :string(255) not null -# awaiting_description :boolean default(FALSE), not null -# prominence :string(255) default("normal"), not null -# url_title :text not null -# law_used :string(255) default("foi"), not null -# allow_new_responses_from :string(255) default("anybody"), not null -# handle_rejected_responses :string(255) default("bounce"), not null -# idhash :string(255) not null +# public_body_id :integer not null +# created_at :datetime not null +# updated_at :datetime not null +# described_state :string(255) not null +# awaiting_description :boolean default(FALSE), not null +# prominence :string(255) default("normal"), not null +# url_title :text not null +# law_used :string(255) default("foi"), not null +# allow_new_responses_from :string(255) default("anybody"), not null +# handle_rejected_responses :string(255) default("bounce"), not null +# idhash :string(255) not null # external_user_name :string(255) # external_url :string(255) -# attention_requested :boolean default(FALSE) -# comments_allowed :boolean default(TRUE), not null +# attention_requested :boolean default(FALSE) +# comments_allowed :boolean default(TRUE), not null # require 'digest/sha1' -- cgit v1.2.3 From 49c346c1eecc4b785bf341e2746b7b458319d7bb Mon Sep 17 00:00:00 2001 From: Louise Crow Date: Wed, 31 Jul 2013 18:35:44 +0100 Subject: Rename method to make it a bit more generic A super user will be able to see all hidden things, not just requests. --- app/models/info_request.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'app/models/info_request.rb') diff --git a/app/models/info_request.rb b/app/models/info_request.rb index c9bcc9bab..ad210c6fc 100644 --- a/app/models/info_request.rb +++ b/app/models/info_request.rb @@ -1019,7 +1019,7 @@ public def user_can_view?(user) if self.prominence == 'hidden' - return User.view_hidden_requests?(user) + return User.view_hidden?(user) end if self.prominence == 'requester_only' return self.is_owning_user?(user) @@ -1106,10 +1106,10 @@ public begin if self.described_state.nil? self.described_state = 'waiting_response' - end + end rescue ActiveModel::MissingAttributeError # this should only happen on Model.exists?() call. It can be safely ignored. - # See http://www.tatvartha.com/2011/03/activerecordmissingattributeerror-missing-attribute-a-bug-or-a-features/ + # See http://www.tatvartha.com/2011/03/activerecordmissingattributeerror-missing-attribute-a-bug-or-a-features/ end # FOI or EIR? if !self.public_body.nil? && self.public_body.eir_only? -- cgit v1.2.3 From b8965db2ed79e5b79e77716371de02a0297d425e Mon Sep 17 00:00:00 2001 From: Louise Crow Date: Wed, 31 Jul 2013 18:47:03 +0100 Subject: Refactor common logic about prominence and access. Move it into the Ability module. --- app/models/info_request.rb | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) (limited to 'app/models/info_request.rb') diff --git a/app/models/info_request.rb b/app/models/info_request.rb index ad210c6fc..8c8a23066 100644 --- a/app/models/info_request.rb +++ b/app/models/info_request.rb @@ -1018,13 +1018,7 @@ public end def user_can_view?(user) - if self.prominence == 'hidden' - return User.view_hidden?(user) - end - if self.prominence == 'requester_only' - return self.is_owning_user?(user) - end - return true + Ability.can_view_with_prominence?(self.prominence, self, user) end # Is this request visible to everyone? -- cgit v1.2.3 From 41427a5857c008f09c62cc53ddbd80de36e4e3c2 Mon Sep 17 00:00:00 2001 From: Louise Crow Date: Mon, 19 Aug 2013 16:35:02 +0100 Subject: Extract calculation of last update hash --- app/models/info_request.rb | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'app/models/info_request.rb') diff --git a/app/models/info_request.rb b/app/models/info_request.rb index 8c8a23066..cc3b58d2b 100644 --- a/app/models/info_request.rb +++ b/app/models/info_request.rb @@ -805,6 +805,10 @@ public end end + def last_update_hash + Digest::SHA1.hexdigest(info_request_events.last.created_at.to_i.to_s + updated_at.to_i.to_s) + end + # Get previous email sent to def get_previous_email_sent_to(info_request_event) last_email = nil -- cgit v1.2.3 From d3df251a8033b92ad89725a2a3fea91acdd7843d Mon Sep 17 00:00:00 2001 From: Louise Crow Date: Thu, 22 Aug 2013 16:23:59 +0100 Subject: Move some download methods to InfoRequest. Use send_file to send zips. Also adds 'all_can_view_all_correspondence?' - is this request completely cachable, or do we need to cache different versions for different levels of privilege? --- app/models/info_request.rb | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'app/models/info_request.rb') diff --git a/app/models/info_request.rb b/app/models/info_request.rb index cc3b58d2b..32e651ff9 100644 --- a/app/models/info_request.rb +++ b/app/models/info_request.rb @@ -958,6 +958,36 @@ public find(:all, params) end + def InfoRequest.download_zip_dir() + File.join(Rails.root, "cache", "zips", "#{Rails.env}") + end + + def request_dirs + first_three_digits = id.to_s()[0..2] + File.join(first_three_digits.to_s, id.to_s) + end + + def download_zip_dir + File.join(InfoRequest.download_zip_dir, "download", request_dirs) + end + + def make_zip_cache_path(user) + cache_file_dir = File.join(InfoRequest.download_zip_dir(), + "download", + request_dirs, + last_update_hash) + cache_file_suffix = if all_can_view_all_correspondence? + "" + elsif Ability.can_view_with_prominence?('hidden', self, user) + "_hidden" + elsif Ability.can_view_with_prominence?('requester_only', self, user) + "_requester_only" + else + "" + end + File.join(cache_file_dir, "#{url_title}#{cache_file_suffix}.zip") + end + def is_old_unclassified? !is_external? && awaiting_description && url_title != 'holding_pen' && get_last_response_event && Time.now > get_last_response_event.created_at + OLD_AGE_IN_DAYS @@ -1031,6 +1061,10 @@ public return false end + def all_can_view_all_correspondence? + all_can_view? && incoming_messages.all?{ |message| message.all_can_view? } + end + def indexed_by_search? if self.prominence == 'backpage' || self.prominence == 'hidden' || self.prominence == 'requester_only' return false -- cgit v1.2.3 From d9c88eba4fe22688ef4f1503caa2deb74b1dc9e5 Mon Sep 17 00:00:00 2001 From: Louise Crow Date: Tue, 27 Aug 2013 14:31:56 +0100 Subject: Hide hidden outgoing messages in download. --- app/models/info_request.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'app/models/info_request.rb') diff --git a/app/models/info_request.rb b/app/models/info_request.rb index 32e651ff9..fe0c94056 100644 --- a/app/models/info_request.rb +++ b/app/models/info_request.rb @@ -1062,7 +1062,9 @@ public end def all_can_view_all_correspondence? - all_can_view? && incoming_messages.all?{ |message| message.all_can_view? } + all_can_view? && + incoming_messages.all?{ |message| message.all_can_view? } && + outgoing_messages.all?{ |message| message.all_can_view? } end def indexed_by_search? -- cgit v1.2.3 From bc743d9fc8c8f740f37b91cbe374c6ae20b10619 Mon Sep 17 00:00:00 2001 From: Louise Crow Date: Tue, 27 Aug 2013 16:13:02 +0100 Subject: Add public criteria for message event access methods get_last_response_event and get_last_outgoing_event are used in various places to determine which events to link to, use in queries etc. Restrict them to refer to the last publicly visible event of the relevant type, and rename them to make that clear. --- app/models/info_request.rb | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) (limited to 'app/models/info_request.rb') diff --git a/app/models/info_request.rb b/app/models/info_request.rb index fe0c94056..847a57ef4 100644 --- a/app/models/info_request.rb +++ b/app/models/info_request.rb @@ -733,28 +733,30 @@ public self.info_request_events.create!(:event_type => type, :params => params) end - def response_events - self.info_request_events.select{|e| e.response?} + def public_response_events + self.info_request_events.select{|e| e.response? && e.incoming_message.all_can_view? } end - # The last response is the default one people might want to reply to - def get_last_response_event_id - get_last_response_event.id if get_last_response_event + # The last public response is the default one people might want to reply to + def get_last_public_response_event_id + get_last_public_response_event.id if get_last_public_response_event end - def get_last_response_event - response_events.last + + def get_last_public_response_event + public_response_events.last end - def get_last_response - get_last_response_event.incoming_message if get_last_response_event + + def get_last_public_response + get_last_public_response_event.incoming_message if get_last_public_response_event end - def outgoing_events - info_request_events.select{|e| e.outgoing? } + def public_outgoing_events + info_request_events.select{|e| e.outgoing? && e.outgoing_message.all_can_view? } end - # The last outgoing message - def get_last_outgoing_event - outgoing_events.last + # The last public outgoing message + def get_last_public_outgoing_event + public_outgoing_events.last end # Text from the the initial request, for use in summary display @@ -989,8 +991,8 @@ public end def is_old_unclassified? - !is_external? && awaiting_description && url_title != 'holding_pen' && get_last_response_event && - Time.now > get_last_response_event.created_at + OLD_AGE_IN_DAYS + !is_external? && awaiting_description && url_title != 'holding_pen' && get_last_public_response_event && + Time.now > get_last_public_response_event.created_at + OLD_AGE_IN_DAYS end # List of incoming messages to followup, by unique email -- cgit v1.2.3 From 939f08a5396b65778748417c26b54c214fe35883 Mon Sep 17 00:00:00 2001 From: Louise Crow Date: Tue, 27 Aug 2013 17:04:23 +0100 Subject: Only include public messages in who_can_followup_to --- app/models/info_request.rb | 2 ++ 1 file changed, 2 insertions(+) (limited to 'app/models/info_request.rb') diff --git a/app/models/info_request.rb b/app/models/info_request.rb index 847a57ef4..e9deb7b05 100644 --- a/app/models/info_request.rb +++ b/app/models/info_request.rb @@ -1005,6 +1005,8 @@ public end incoming_message.safe_mail_from + next if ! incoming_message.all_can_view? + email = OutgoingMailer.email_for_followup(self, incoming_message) name = OutgoingMailer.name_for_followup(self, incoming_message) -- cgit v1.2.3 From eb16ca53ae1b1cfa5f23bb56d10e9eecc50b00e6 Mon Sep 17 00:00:00 2001 From: Louise Crow Date: Wed, 28 Aug 2013 09:37:58 +0100 Subject: Exclude hidden responses when calculating old_unclassified Make old_unclassified_params method consistent with last_public_response_event and associated methods. --- app/models/info_request.rb | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) (limited to 'app/models/info_request.rb') diff --git a/app/models/info_request.rb b/app/models/info_request.rb index e9deb7b05..44593295d 100644 --- a/app/models/info_request.rb +++ b/app/models/info_request.rb @@ -905,19 +905,29 @@ public end # Used to find when event last changed - def InfoRequest.last_event_time_clause(event_type=nil) + def InfoRequest.last_event_time_clause(event_type=nil, join_table=nil, join_clause=nil) event_type_clause = '' event_type_clause = " AND info_request_events.event_type = '#{event_type}'" if event_type - "(SELECT created_at - FROM info_request_events + tables = ['info_request_events'] + tables << join_table if join_table + join_clause = "AND #{join_clause}" if join_clause + "(SELECT info_request_events.created_at + FROM #{tables.join(', ')} WHERE info_request_events.info_request_id = info_requests.id #{event_type_clause} + #{join_clause} ORDER BY created_at desc LIMIT 1)" end + def InfoRequest.last_public_response_clause() + join_clause = "incoming_messages.id = info_request_events.incoming_message_id + AND incoming_messages.prominence = 'normal'" + last_event_time_clause('response', 'incoming_messages', join_clause) + end + def InfoRequest.old_unclassified_params(extra_params, include_last_response_time=false) - last_response_created_at = last_event_time_clause('response') + last_response_created_at = last_public_response_clause() age = extra_params[:age_in_days] ? extra_params[:age_in_days].days : OLD_AGE_IN_DAYS params = { :conditions => ["awaiting_description = ? AND #{last_response_created_at} < ? -- cgit v1.2.3