aboutsummaryrefslogtreecommitdiffstats
path: root/app/models
diff options
context:
space:
mode:
Diffstat (limited to 'app/models')
-rw-r--r--app/models/censor_rule.rb15
-rw-r--r--app/models/comment.rb17
-rw-r--r--app/models/foi_attachment.rb4
-rw-r--r--app/models/holiday.rb3
-rw-r--r--app/models/incoming_message.rb36
-rw-r--r--app/models/info_request.rb151
-rw-r--r--app/models/info_request_event.rb44
-rw-r--r--app/models/mail_server_log.rb11
-rw-r--r--app/models/mail_server_log_done.rb11
-rw-r--r--app/models/outgoing_message.rb32
-rw-r--r--app/models/post_redirect.rb15
-rw-r--r--app/models/profile_photo.rb7
-rw-r--r--app/models/public_body.rb36
-rw-r--r--app/models/purge_request.rb9
-rw-r--r--app/models/raw_email.rb3
-rw-r--r--app/models/request_classification.rb3
-rw-r--r--app/models/track_thing.rb11
-rw-r--r--app/models/track_things_sent_email.rb5
-rw-r--r--app/models/user.rb39
-rw-r--r--app/models/user_info_request_sent_alert.rb9
20 files changed, 260 insertions, 201 deletions
diff --git a/app/models/censor_rule.rb b/app/models/censor_rule.rb
index f0d06e088..3c5c77563 100644
--- a/app/models/censor_rule.rb
+++ b/app/models/censor_rule.rb
@@ -1,18 +1,17 @@
# == Schema Information
-# Schema version: 20120919140404
#
# Table name: censor_rules
#
-# id :integer not null, primary key
+# id :integer not null, primary key
# info_request_id :integer
# user_id :integer
# public_body_id :integer
-# text :text not null
-# replacement :text not null
-# last_edit_editor :string(255) not null
-# last_edit_comment :text not null
-# created_at :datetime not null
-# updated_at :datetime not null
+# text :text not null
+# replacement :text not null
+# last_edit_editor :string(255) not null
+# last_edit_comment :text not null
+# created_at :datetime not null
+# updated_at :datetime not null
# regexp :boolean
#
diff --git a/app/models/comment.rb b/app/models/comment.rb
index 9527030a9..75d37e04f 100644
--- a/app/models/comment.rb
+++ b/app/models/comment.rb
@@ -1,17 +1,16 @@
# == Schema Information
-# Schema version: 114
#
# Table name: comments
#
-# id :integer not null, primary key
-# user_id :integer not null
-# comment_type :string(255) default("internal_error"), not null
+# id :integer not null, primary key
+# user_id :integer not null
+# comment_type :string(255) default("internal_error"), not null
# info_request_id :integer
-# body :text not null
-# visible :boolean default(TRUE), not null
-# created_at :datetime not null
-# updated_at :datetime not null
-# locale :text default(""), not null
+# body :text not null
+# visible :boolean default(TRUE), not null
+# created_at :datetime not null
+# updated_at :datetime not null
+# locale :text default(""), not null
#
# models/comments.rb:
diff --git a/app/models/foi_attachment.rb b/app/models/foi_attachment.rb
index 0340f2b83..914420a2b 100644
--- a/app/models/foi_attachment.rb
+++ b/app/models/foi_attachment.rb
@@ -1,11 +1,9 @@
# encoding: UTF-8
-
# == Schema Information
-# Schema version: 114
#
# Table name: foi_attachments
#
-# id :integer not null, primary key
+# id :integer not null, primary key
# content_type :text
# filename :text
# charset :text
diff --git a/app/models/holiday.rb b/app/models/holiday.rb
index 98f73e963..3076cc0fd 100644
--- a/app/models/holiday.rb
+++ b/app/models/holiday.rb
@@ -1,9 +1,8 @@
# == Schema Information
-# Schema version: 114
#
# Table name: holidays
#
-# id :integer not null, primary key
+# id :integer not null, primary key
# day :date
# description :text
#
diff --git a/app/models/incoming_message.rb b/app/models/incoming_message.rb
index ae3c3b407..8b2aa87e7 100644
--- a/app/models/incoming_message.rb
+++ b/app/models/incoming_message.rb
@@ -1,15 +1,13 @@
# coding: utf-8
-
# == Schema Information
-# Schema version: 114
#
# Table name: incoming_messages
#
-# id :integer not null, primary key
-# info_request_id :integer not null
-# created_at :datetime not null
-# updated_at :datetime not null
-# raw_email_id :integer not null
+# id :integer not null, primary key
+# info_request_id :integer not null
+# created_at :datetime not null
+# updated_at :datetime not null
+# raw_email_id :integer not null
# cached_attachment_text_clipped :text
# cached_main_body_text_folded :text
# cached_main_body_text_unfolded :text
@@ -19,6 +17,9 @@
# last_parsed :datetime
# mail_from :text
# sent_at :datetime
+# prominence :string(255) default("normal"), not null
+# prominence_reason :text
+#
# models/incoming_message.rb:
# An (email) message from really anybody to be logged with a request. e.g. A
@@ -37,6 +38,7 @@ require 'zip/zip'
require 'iconv' unless RUBY_VERSION >= '1.9'
class IncomingMessage < ActiveRecord::Base
+ extend MessageProminence
belongs_to :info_request
validates_presence_of :info_request
@@ -48,6 +50,8 @@ class IncomingMessage < ActiveRecord::Base
belongs_to :raw_email
+ has_prominence
+
# See binary_mask_stuff function below. It just test for inclusion
# in this hash, not the value of the right hand side.
DoNotBinaryMask = {
@@ -59,6 +63,12 @@ class IncomingMessage < ActiveRecord::Base
'application/zip' => 1,
}
+ # Given that there are in theory many info request events, a convenience method for
+ # getting the response event
+ def response_event
+ self.info_request_events.detect{ |e| e.event_type == 'response' }
+ end
+
# Return a cached structured mail object
def mail(force = nil)
if (!force.nil? || @mail.nil?) && !self.raw_email.nil?
@@ -151,14 +161,17 @@ class IncomingMessage < ActiveRecord::Base
parse_raw_email!
super
end
+
def subject
parse_raw_email!
super
end
+
def mail_from
parse_raw_email!
super
end
+
def safe_mail_from
if !self.mail_from.nil?
mail_from = self.mail_from.dup
@@ -166,6 +179,15 @@ class IncomingMessage < ActiveRecord::Base
return mail_from
end
end
+
+ def specific_from_name?
+ !safe_mail_from.nil? && safe_mail_from.strip != info_request.public_body.name.strip
+ end
+
+ def from_public_body?
+ safe_mail_from.nil? || (mail_from_domain == info_request.public_body.request_email_domain)
+ end
+
def mail_from_domain
parse_raw_email!
super
diff --git a/app/models/info_request.rb b/app/models/info_request.rb
index c0b8e2fca..aaced91a2 100644
--- a/app/models/info_request.rb
+++ b/app/models/info_request.rb
@@ -1,26 +1,26 @@
+# encoding: utf-8
# == 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'
@@ -31,7 +31,10 @@ class InfoRequest < ActiveRecord::Base
strip_attributes!
validates_presence_of :title, :message => N_("Please enter a summary of your request")
- validates_format_of :title, :with => /[a-zA-Z]/, :message => N_("Please write a summary with some text in it"), :if => Proc.new { |info_request| !info_request.title.nil? && !info_request.title.empty? }
+ # TODO: When we no longer support Ruby 1.8, this can be done with /[[:alpha:]]/
+ validates_format_of :title, :with => /[ёЁа-яА-Яa-zA-Zà-üÀ-Ü]/iu,
+ :message => N_("Please write a summary with some text in it"),
+ :if => Proc.new { |info_request| !info_request.title.nil? && !info_request.title.empty? }
belongs_to :user
validate :must_be_internal_or_external
@@ -764,28 +767,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
@@ -836,6 +841,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
@@ -930,19 +939,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} < ?
@@ -958,11 +977,21 @@ public
def InfoRequest.count_old_unclassified(extra_params={})
params = old_unclassified_params(extra_params)
+ if extra_params[:conditions]
+ condition_string = extra_params[:conditions].shift
+ params[:conditions][0] += " AND #{condition_string}"
+ params[:conditions] += extra_params[:conditions]
+ end
count(:all, params)
end
- def InfoRequest.get_random_old_unclassified(limit)
+ def InfoRequest.get_random_old_unclassified(limit, extra_params)
params = old_unclassified_params({})
+ if extra_params[:conditions]
+ condition_string = extra_params[:conditions].shift
+ params[:conditions][0] += " AND #{condition_string}"
+ params[:conditions] += extra_params[:conditions]
+ end
params[:limit] = limit
params[:order] = "random()"
find(:all, params)
@@ -985,9 +1014,39 @@ 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
+ !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
@@ -1000,6 +1059,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)
@@ -1049,13 +1110,7 @@ public
end
def user_can_view?(user)
- if self.prominence == 'hidden'
- return User.view_hidden_requests?(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?
@@ -1064,6 +1119,12 @@ public
return false
end
+ def all_can_view_all_correspondence?
+ all_can_view? &&
+ incoming_messages.all?{ |message| message.all_can_view? } &&
+ outgoing_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
diff --git a/app/models/info_request_event.rb b/app/models/info_request_event.rb
index 0967e3940..67cdda1b4 100644
--- a/app/models/info_request_event.rb
+++ b/app/models/info_request_event.rb
@@ -1,20 +1,18 @@
# == Schema Information
-# Schema version: 114
#
# Table name: info_request_events
#
-# id :integer not null, primary key
-# info_request_id :integer not null
-# event_type :text not null
-# params_yaml :text not null
-# created_at :datetime not null
+# id :integer not null, primary key
+# info_request_id :integer not null
+# event_type :text not null
+# params_yaml :text not null
+# created_at :datetime not null
# described_state :string(255)
# calculated_state :string(255)
# last_described_at :datetime
# incoming_message_id :integer
# outgoing_message_id :integer
# comment_id :integer
-# prominence :string(255) default("normal"), not null
#
# models/info_request_event.rb:
@@ -48,10 +46,10 @@ class InfoRequestEvent < ActiveRecord::Base
'destroy_incoming', # deleted an incoming message (in admin interface)
'destroy_outgoing', # deleted an outgoing message (in admin interface)
'redeliver_incoming', # redelivered an incoming message elsewhere (in admin interface)
+ 'edit_incoming', # incoming message edited (in admin interface)
'move_request', # changed user or public body (in admin interface)
'hide', # hid a request (in admin interface)
'manual', # you did something in the db by hand
-
'response',
'comment',
'status_update'
@@ -63,35 +61,12 @@ class InfoRequestEvent < ActiveRecord::Base
# user described state (also update in info_request)
validate :must_be_valid_state
- # whether event is publicly visible
- validates_inclusion_of :prominence, :in => [
- 'normal',
- 'hidden',
- 'requester_only'
- ]
-
def must_be_valid_state
if !described_state.nil? and !InfoRequest.enumerate_states.include?(described_state)
errors.add(described_state, "is not a valid state")
end
end
- def user_can_view?(user)
- unless info_request.user_can_view?(user)
- raise "internal error, called user_can_view? on event when there is not permission to view entire request"
- end
-
- case prominence
- when 'hidden'
- User.view_hidden_requests?(user)
- when 'requester_only'
- info_request.is_owning_user?(user)
- else
- true
- end
- end
-
-
# Full text search indexing
acts_as_xapian :texts => [ :search_text_main, :title ],
:values => [
@@ -260,6 +235,12 @@ class InfoRequestEvent < ActiveRecord::Base
if !self.info_request.indexed_by_search?
return false
end
+ if self.event_type == 'response' && !self.incoming_message.indexed_by_search?
+ return false
+ end
+ if ['sent', 'followup_sent'].include?(self.event_type) && !self.outgoing_message.indexed_by_search?
+ return false
+ end
if self.event_type == 'comment' && !self.comment.visible
return false
end
@@ -268,6 +249,7 @@ class InfoRequestEvent < ActiveRecord::Base
return false
end
end
+
def variety
self.event_type
end
diff --git a/app/models/mail_server_log.rb b/app/models/mail_server_log.rb
index 7f61377ce..0e5b60ff1 100644
--- a/app/models/mail_server_log.rb
+++ b/app/models/mail_server_log.rb
@@ -1,15 +1,14 @@
# == Schema Information
-# Schema version: 20121010214348
#
# Table name: mail_server_logs
#
-# id :integer not null, primary key
+# id :integer not null, primary key
# mail_server_log_done_id :integer
# info_request_id :integer
-# order :integer not null
-# line :text not null
-# created_at :datetime not null
-# updated_at :datetime not null
+# order :integer not null
+# line :text not null
+# created_at :datetime not null
+# updated_at :datetime not null
#
# We load log file lines for requests in here, for display in the admin interface.
diff --git a/app/models/mail_server_log_done.rb b/app/models/mail_server_log_done.rb
index 0e7e9eec3..222b072c5 100644
--- a/app/models/mail_server_log_done.rb
+++ b/app/models/mail_server_log_done.rb
@@ -1,13 +1,12 @@
# == Schema Information
-# Schema version: 20121010214348
#
# Table name: mail_server_log_dones
#
-# id :integer not null, primary key
-# filename :text not null
-# last_stat :datetime not null
-# created_at :datetime not null
-# updated_at :datetime not null
+# id :integer not null, primary key
+# filename :text not null
+# last_stat :datetime not null
+# created_at :datetime not null
+# updated_at :datetime not null
#
# Stores that a particular mail server log file has been loaded in, see mail_server_log.rb
diff --git a/app/models/outgoing_message.rb b/app/models/outgoing_message.rb
index aedfb9cad..e2ee696c5 100644
--- a/app/models/outgoing_message.rb
+++ b/app/models/outgoing_message.rb
@@ -1,18 +1,17 @@
# == Schema Information
-# Schema version: 114
#
# Table name: outgoing_messages
#
-# id :integer not null, primary key
-# info_request_id :integer not null
-# body :text not null
-# status :string(255) not null
-# message_type :string(255) not null
-# created_at :datetime not null
-# updated_at :datetime not null
+# id :integer not null, primary key
+# info_request_id :integer not null
+# body :text not null
+# status :string(255) not null
+# message_type :string(255) not null
+# created_at :datetime not null
+# updated_at :datetime not null
# last_sent_at :datetime
# incoming_message_followup_id :integer
-# what_doing :string(255) not null
+# what_doing :string(255) not null
#
# models/outgoing_message.rb:
@@ -23,6 +22,7 @@
# Email: hello@mysociety.org; WWW: http://www.mysociety.org/
class OutgoingMessage < ActiveRecord::Base
+ extend MessageProminence
include Rails.application.routes.url_helpers
include LinkToHelper
self.default_url_options[:host] = AlaveteliConfiguration::domain
@@ -33,6 +33,8 @@ class OutgoingMessage < ActiveRecord::Base
strip_attributes!
+ has_prominence
+
belongs_to :info_request
validates_presence_of :info_request
@@ -209,11 +211,11 @@ class OutgoingMessage < ActiveRecord::Base
end
# Returns text for indexing / text display
- def get_text_for_indexing
+ def get_text_for_indexing(strip_salutation=true)
text = self.body.strip
# Remove salutation
- text.sub!(/Dear .+,/, "")
+ text.sub!(/Dear .+,/, "") if strip_salutation
# Remove email addresses from display/index etc.
self.remove_privacy_sensitive_things!(text)
@@ -233,6 +235,12 @@ class OutgoingMessage < ActiveRecord::Base
return text.html_safe
end
+ # Return body for display as text
+ def get_body_for_text_display
+ get_text_for_indexing(strip_salutation=false)
+ end
+
+
def fully_destroy
ActiveRecord::Base.transaction do
info_request_event = InfoRequestEvent.find_by_outgoing_message_id(self.id)
@@ -263,7 +271,7 @@ class OutgoingMessage < ActiveRecord::Base
end
def format_of_body
- if self.body.empty? || self.body =~ /\A#{get_salutation}\s+#{get_signoff}/ || self.body =~ /#{get_internal_review_insert_here_note}/
+ if self.body.empty? || self.body =~ /\A#{Regexp.escape(get_salutation)}\s+#{Regexp.escape(get_signoff)}/ || self.body =~ /#{Regexp.escape(get_internal_review_insert_here_note)}/
if self.message_type == 'followup'
if self.what_doing == 'internal_review'
errors.add(:body, _("Please give details explaining why you want a review"))
diff --git a/app/models/post_redirect.rb b/app/models/post_redirect.rb
index 409069cb6..5da3d2742 100644
--- a/app/models/post_redirect.rb
+++ b/app/models/post_redirect.rb
@@ -1,18 +1,17 @@
# == Schema Information
-# Schema version: 114
#
# Table name: post_redirects
#
-# id :integer not null, primary key
-# token :text not null
-# uri :text not null
+# id :integer not null, primary key
+# token :text not null
+# uri :text not null
# post_params_yaml :text
-# created_at :datetime not null
-# updated_at :datetime not null
-# email_token :text not null
+# created_at :datetime not null
+# updated_at :datetime not null
+# email_token :text not null
# reason_params_yaml :text
# user_id :integer
-# circumstance :text default("normal"), not null
+# circumstance :text default("normal"), not null
#
# models/post_redirect.rb:
diff --git a/app/models/profile_photo.rb b/app/models/profile_photo.rb
index 5d542daf1..322ebe53c 100644
--- a/app/models/profile_photo.rb
+++ b/app/models/profile_photo.rb
@@ -1,12 +1,11 @@
# == Schema Information
-# Schema version: 114
#
# Table name: profile_photos
#
-# id :integer not null, primary key
-# data :binary not null
+# id :integer not null, primary key
+# data :binary not null
# user_id :integer
-# draft :boolean default(FALSE), not null
+# draft :boolean default(FALSE), not null
#
# models/profile_photo.rb:
diff --git a/app/models/public_body.rb b/app/models/public_body.rb
index 3154be632..828e8c94a 100644
--- a/app/models/public_body.rb
+++ b/app/models/public_body.rb
@@ -1,27 +1,27 @@
+# -*- coding: utf-8 -*-
# == Schema Information
-# Schema version: 20120919140404
#
# Table name: public_bodies
#
-# id :integer not null, primary key
-# name :text not null
-# short_name :text not null
-# request_email :text not null
-# version :integer not null
-# last_edit_editor :string(255) not null
-# last_edit_comment :text not null
-# created_at :datetime not null
-# updated_at :datetime not null
-# url_name :text not null
-# home_page :text default(""), not null
-# notes :text default(""), not null
-# first_letter :string(255) not null
-# publication_scheme :text default(""), not null
-# api_key :string(255) not null
-# info_requests_count :integer default(0), not null
+# id :integer not null, primary key
+# name :text not null
+# short_name :text not null
+# request_email :text not null
+# version :integer not null
+# last_edit_editor :string(255) not null
+# last_edit_comment :text not null
+# created_at :datetime not null
+# updated_at :datetime not null
+# url_name :text not null
+# home_page :text default(""), not null
+# notes :text default(""), not null
+# first_letter :string(255) not null
+# publication_scheme :text default(""), not null
+# api_key :string(255) not null
+# info_requests_count :integer default(0), not null
+# disclosure_log :text default(""), not null
#
-# -*- coding: utf-8 -*-
require 'csv'
require 'securerandom'
require 'set'
diff --git a/app/models/purge_request.rb b/app/models/purge_request.rb
index e48f3cc6f..4e6267bd2 100644
--- a/app/models/purge_request.rb
+++ b/app/models/purge_request.rb
@@ -1,13 +1,12 @@
# == Schema Information
-# Schema version: 114
#
# Table name: purge_requests
#
-# id :integer not null, primary key
+# id :integer not null, primary key
# url :string(255)
-# created_at :datetime not null
-# model :string(255) not null
-# model_id :integer not null
+# created_at :datetime not null
+# model :string(255) not null
+# model_id :integer not null
#
# models/purge_request.rb:
diff --git a/app/models/raw_email.rb b/app/models/raw_email.rb
index 6bf01bc74..21a53f493 100644
--- a/app/models/raw_email.rb
+++ b/app/models/raw_email.rb
@@ -1,9 +1,8 @@
# == Schema Information
-# Schema version: 114
#
# Table name: raw_emails
#
-# id :integer not null, primary key
+# id :integer not null, primary key
#
# models/raw_email.rb:
diff --git a/app/models/request_classification.rb b/app/models/request_classification.rb
index f5a1b4bee..6873d468b 100644
--- a/app/models/request_classification.rb
+++ b/app/models/request_classification.rb
@@ -1,9 +1,8 @@
# == Schema Information
-# Schema version: 20120919140404
#
# Table name: request_classifications
#
-# id :integer not null, primary key
+# id :integer not null, primary key
# user_id :integer
# info_request_event_id :integer
# created_at :datetime
diff --git a/app/models/track_thing.rb b/app/models/track_thing.rb
index 66b8a5c47..d5e1cdb75 100644
--- a/app/models/track_thing.rb
+++ b/app/models/track_thing.rb
@@ -1,16 +1,15 @@
# == Schema Information
-# Schema version: 114
#
# Table name: track_things
#
-# id :integer not null, primary key
-# tracking_user_id :integer not null
-# track_query :string(255) not null
+# id :integer not null, primary key
+# tracking_user_id :integer not null
+# track_query :string(255) not null
# info_request_id :integer
# tracked_user_id :integer
# public_body_id :integer
-# track_medium :string(255) not null
-# track_type :string(255) default("internal_error"), not null
+# track_medium :string(255) not null
+# track_type :string(255) default("internal_error"), not null
# created_at :datetime
# updated_at :datetime
#
diff --git a/app/models/track_things_sent_email.rb b/app/models/track_things_sent_email.rb
index a9ea2520e..072d3bdea 100644
--- a/app/models/track_things_sent_email.rb
+++ b/app/models/track_things_sent_email.rb
@@ -1,10 +1,9 @@
# == Schema Information
-# Schema version: 114
#
# Table name: track_things_sent_emails
#
-# id :integer not null, primary key
-# track_thing_id :integer not null
+# id :integer not null, primary key
+# track_thing_id :integer not null
# info_request_event_id :integer
# user_id :integer
# public_body_id :integer
diff --git a/app/models/user.rb b/app/models/user.rb
index 9da4ad743..d7c1c854e 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -1,26 +1,27 @@
# == Schema Information
-# Schema version: 20120919140404
#
# Table name: users
#
-# id :integer not null, primary key
-# email :string(255) not null
-# name :string(255) not null
-# hashed_password :string(255) not null
-# salt :string(255) not null
-# created_at :datetime not null
-# updated_at :datetime not null
-# email_confirmed :boolean default(FALSE), not null
-# url_name :text not null
-# last_daily_track_email :datetime default(Sat Jan 01 00:00:00 UTC 2000)
-# admin_level :string(255) default("none"), not null
-# ban_text :text default(""), not null
-# about_me :text default(""), not null
+# id :integer not null, primary key
+# email :string(255) not null
+# name :string(255) not null
+# hashed_password :string(255) not null
+# salt :string(255) not null
+# created_at :datetime not null
+# updated_at :datetime not null
+# email_confirmed :boolean default(FALSE), not null
+# url_name :text not null
+# last_daily_track_email :datetime default(2000-01-01 00:00:00 UTC)
+# admin_level :string(255) default("none"), not null
+# ban_text :text default(""), not null
+# about_me :text default(""), not null
# locale :string(255)
# email_bounced_at :datetime
-# email_bounce_message :text default(""), not null
-# no_limit :boolean default(FALSE), not null
-# receive_email_alerts :boolean default(TRUE), not null
+# email_bounce_message :text default(""), not null
+# no_limit :boolean default(FALSE), not null
+# receive_email_alerts :boolean default(TRUE), not null
+# address :string(255)
+# dob :date
#
require 'digest/sha1'
@@ -243,8 +244,8 @@ class User < ActiveRecord::Base
!user.nil? && user.owns_every_request?
end
- # Can the user see every request, even hidden ones?
- def User.view_hidden_requests?(user)
+ # Can the user see every request, response, and outgoing message, even hidden ones?
+ def User.view_hidden?(user)
!user.nil? && user.super?
end
diff --git a/app/models/user_info_request_sent_alert.rb b/app/models/user_info_request_sent_alert.rb
index 449a4c237..098b773f8 100644
--- a/app/models/user_info_request_sent_alert.rb
+++ b/app/models/user_info_request_sent_alert.rb
@@ -1,12 +1,11 @@
# == Schema Information
-# Schema version: 114
#
# Table name: user_info_request_sent_alerts
#
-# id :integer not null, primary key
-# user_id :integer not null
-# info_request_id :integer not null
-# alert_type :string(255) not null
+# id :integer not null, primary key
+# user_id :integer not null
+# info_request_id :integer not null
+# alert_type :string(255) not null
# info_request_event_id :integer
#