aboutsummaryrefslogtreecommitdiffstats
path: root/app/models
diff options
context:
space:
mode:
Diffstat (limited to 'app/models')
-rw-r--r--app/models/censor_rule.rb5
-rw-r--r--app/models/incoming_message.rb2
-rw-r--r--app/models/info_request.rb34
-rw-r--r--app/models/outgoing_message.rb47
4 files changed, 66 insertions, 22 deletions
diff --git a/app/models/censor_rule.rb b/app/models/censor_rule.rb
index 3b7aaf7fa..0ef5d18bd 100644
--- a/app/models/censor_rule.rb
+++ b/app/models/censor_rule.rb
@@ -43,6 +43,11 @@ class CensorRule < ActiveRecord::Base
:user_id => nil,
:public_body_id => nil } }
+ def apply_to_text(text_to_censor)
+ return nil if text_to_censor.nil?
+ text_to_censor.gsub(to_replace, replacement)
+ end
+
def apply_to_text!(text_to_censor)
return nil if text_to_censor.nil?
text_to_censor.gsub!(to_replace, replacement)
diff --git a/app/models/incoming_message.rb b/app/models/incoming_message.rb
index cc8088352..a74056b5d 100644
--- a/app/models/incoming_message.rb
+++ b/app/models/incoming_message.rb
@@ -654,7 +654,7 @@ class IncomingMessage < ActiveRecord::Base
# Save clipped version for snippets
if self.cached_attachment_text_clipped.nil?
- self.cached_attachment_text_clipped = text[0..MAX_ATTACHMENT_TEXT_CLIPPED]
+ self.cached_attachment_text_clipped = text.mb_chars[0..MAX_ATTACHMENT_TEXT_CLIPPED]
self.save!
end
diff --git a/app/models/info_request.rb b/app/models/info_request.rb
index 275c39746..65099b1c4 100644
--- a/app/models/info_request.rb
+++ b/app/models/info_request.rb
@@ -428,6 +428,7 @@ public
# A new incoming email to this request
def receive(email, raw_email_data, override_stop_new_responses = false, rejected_reason = "")
+ # Is this request allowing responses?
if !override_stop_new_responses
allow = nil
reason = nil
@@ -458,9 +459,15 @@ public
raise "Unknown allow_new_responses_from '" + self.allow_new_responses_from + "'"
end
+ # If its not allowing responses, handle the message
if !allow
if self.handle_rejected_responses == 'bounce'
- RequestMailer.stopped_responses(self, email, raw_email_data).deliver if !is_external?
+ if MailHandler.get_from_address(email).nil?
+ # do nothing – can't bounce the mail as there's no
+ # address to send it to
+ else
+ RequestMailer.stopped_responses(self, email, raw_email_data).deliver if !is_external?
+ end
elsif self.handle_rejected_responses == 'holding_pen'
InfoRequest.holding_pen_request.receive(email, raw_email_data, false, reason)
elsif self.handle_rejected_responses == 'blackhole'
@@ -777,7 +784,14 @@ public
end
def public_response_events
- self.info_request_events.select{|e| e.response? && e.incoming_message.all_can_view? }
+ condition = <<-SQL
+ info_request_events.event_type = ?
+ AND incoming_messages.prominence = ?
+ SQL
+
+ info_request_events.
+ joins(:incoming_message).
+ where(condition, 'response', 'normal')
end
# The last public response is the default one people might want to reply to
@@ -804,8 +818,9 @@ public
# Text from the the initial request, for use in summary display
def initial_request_text
- return '' if outgoing_messages.empty? # mainly for use with incomplete fixtures
- outgoing_messages.first.get_text_for_indexing
+ return '' if outgoing_messages.empty?
+ body_opts = { :censor_rules => applicable_censor_rules }
+ outgoing_messages.first.try(:get_text_for_indexing, true, body_opts) or ''
end
# Returns index of last event which is described or nil if none described.
@@ -925,7 +940,7 @@ public
# Called by incoming_email - and used to be called to generate separate
# envelope from address until we abandoned it.
def magic_email(prefix_part)
- raise "id required to make magic" if not self.id
+ raise "id required to create a magic email" if not self.id
return InfoRequest.magic_email_for_id(prefix_part, self.id)
end
@@ -1383,6 +1398,15 @@ public
end
end
+ # The DateTime of the last InfoRequestEvent belonging to the InfoRequest
+ # Only available if the last_event_time attribute has been set. This is
+ # currentlt only set through .find_in_state
+ #
+ # Returns a DateTime
+ def last_event_time
+ attributes['last_event_time'].try(:to_datetime)
+ end
+
private
def set_defaults
diff --git a/app/models/outgoing_message.rb b/app/models/outgoing_message.rb
index ab26fb89a..7bb8ce8be 100644
--- a/app/models/outgoing_message.rb
+++ b/app/models/outgoing_message.rb
@@ -141,22 +141,28 @@ class OutgoingMessage < ActiveRecord::Base
end
end
- def body
- ret = read_attribute(:body)
- if ret.nil?
- return ret
+ # Public: The body text of the OutgoingMessage. The text is cleaned and
+ # CensorRules are applied.
+ #
+ # options - Hash of options
+ # :censor_rules - Array of CensorRules to apply. Defaults to the
+ # applicable_censor_rules of the associated
+ # InfoRequest. (optional)
+ #
+ # Returns a String
+ def body(options = {})
+ text = raw_body.dup
+ return text if text.nil?
+
+ text = clean_text(text)
+
+ # Use the given censor_rules; otherwise fetch them from the associated
+ # info_request
+ censor_rules = options.fetch(:censor_rules) do
+ info_request.try(:applicable_censor_rules) or []
end
- ret = ret.dup
- ret.strip!
- ret.gsub!(/(?:\n\s*){2,}/, "\n\n") # remove excess linebreaks that unnecessarily space it out
-
- # Remove things from censor rules
- unless info_request.nil?
- self.info_request.apply_censor_rules_to_text!(ret)
- end
-
- ret
+ censor_rules.reduce(text) { |text, rule| rule.apply_to_text(text) }
end
def raw_body
@@ -228,8 +234,12 @@ class OutgoingMessage < ActiveRecord::Base
end
# Returns text for indexing / text display
- def get_text_for_indexing(strip_salutation = true)
- text = body.strip
+ def get_text_for_indexing(strip_salutation = true, opts = {})
+ if opts.empty?
+ text = body.strip
+ else
+ text = body(opts).strip
+ end
# Remove salutation
text.sub!(/Dear .+,/, "") if strip_salutation
@@ -333,6 +343,11 @@ class OutgoingMessage < ActiveRecord::Base
errors.add(:what_doing_dummy, _('Please choose what sort of reply you are making.'))
end
end
+
+ # remove excess linebreaks that unnecessarily space it out
+ def clean_text(text)
+ text.strip.gsub(/(?:\n\s*){2,}/, "\n\n")
+ end
end