comparison config/initializers/10-patches.rb @ 1338:25603efa57b5

Merge from live branch
author Chris Cannam
date Thu, 20 Jun 2013 13:14:14 +0100
parents 433d4f72a19b
children 261b3d9a4903
comparison
equal deleted inserted replaced
1209:1b1138f6f55e 1338:25603efa57b5
1
2 require 'active_record' 1 require 'active_record'
3 2
4 module ActiveRecord 3 module ActiveRecord
5 class Base 4 class Base
6 include Redmine::I18n 5 include Redmine::I18n
6 # Translate attribute names for validation errors display
7 def self.human_attribute_name(attr, *args)
8 attr = attr.to_s.sub(/_id$/, '')
7 9
8 # Translate attribute names for validation errors display 10 l("field_#{name.underscore.gsub('/', '_')}_#{attr}", :default => ["field_#{attr}".to_sym, attr])
9 def self.human_attribute_name(attr)
10 l("field_#{attr.to_s.gsub(/_id$/, '')}", :default => attr)
11 end 11 end
12 end 12 end
13 end
14 13
15 module ActiveRecord 14 # Undefines private Kernel#open method to allow using `open` scopes in models.
16 class Errors 15 # See Defect #11545 (http://www.redmine.org/issues/11545) for details.
17 def full_messages(options = {}) 16 class Base
18 full_messages = [] 17 class << self
19 18 undef open
20 @errors.each_key do |attr|
21 @errors[attr].each do |message|
22 next unless message
23
24 if attr == "base"
25 full_messages << message
26 elsif attr == "custom_values"
27 # Replace the generic "custom values is invalid"
28 # with the errors on custom values
29 @base.custom_values.each do |value|
30 value.errors.each do |attr, msg|
31 full_messages << value.custom_field.name + ' ' + msg
32 end
33 end
34 else
35 attr_name = @base.class.human_attribute_name(attr)
36 full_messages << attr_name + ' ' + message.to_s
37 end
38 end
39 end
40 full_messages
41 end 19 end
42 end 20 end
21 class Relation ; undef open ; end
43 end 22 end
44 23
45 module ActionView 24 module ActionView
46 module Helpers 25 module Helpers
47 module DateHelper 26 module DateHelper
59 end 38 end
60 end 39 end
61 end 40 end
62 end 41 end
63 end 42 end
43
44 class Resolver
45 def find_all(name, prefix=nil, partial=false, details={}, key=nil, locals=[])
46 cached(key, [name, prefix, partial], details, locals) do
47 if details[:formats] & [:xml, :json]
48 details = details.dup
49 details[:formats] = details[:formats].dup + [:api]
50 end
51 find_templates(name, prefix, partial, details)
52 end
53 end
54 end
64 end 55 end
65 56
66 ActionView::Base.field_error_proc = Proc.new{ |html_tag, instance| "#{html_tag}" } 57 # Do not HTML escape text templates
58 module ActionView
59 class Template
60 module Handlers
61 class ERB
62 def call(template)
63 if template.source.encoding_aware?
64 # First, convert to BINARY, so in case the encoding is
65 # wrong, we can still find an encoding tag
66 # (<%# encoding %>) inside the String using a regular
67 # expression
68 template_source = template.source.dup.force_encoding("BINARY")
67 69
68 module AsynchronousMailer 70 erb = template_source.gsub(ENCODING_TAG, '')
69 # Adds :async_smtp and :async_sendmail delivery methods 71 encoding = $2
70 # to perform email deliveries asynchronously 72
71 %w(smtp sendmail).each do |type| 73 erb.force_encoding valid_encoding(template.source.dup, encoding)
72 define_method("perform_delivery_async_#{type}") do |mail| 74
75 # Always make sure we return a String in the default_internal
76 erb.encode!
77 else
78 erb = template.source.dup
79 end
80
81 self.class.erb_implementation.new(
82 erb,
83 :trim => (self.class.erb_trim_mode == "-"),
84 :escape => template.identifier =~ /\.text/ # only escape HTML templates
85 ).src
86 end
87 end
88 end
89 end
90 end
91
92 ActionView::Base.field_error_proc = Proc.new{ |html_tag, instance| html_tag || ''.html_safe }
93
94 require 'mail'
95
96 module DeliveryMethods
97 class AsyncSMTP < ::Mail::SMTP
98 def deliver!(*args)
73 Thread.start do 99 Thread.start do
74 send "perform_delivery_#{type}", mail 100 super *args
75 end 101 end
76 end 102 end
77 end 103 end
78 104
79 # Adds a delivery method that writes emails in tmp/emails for testing purpose 105 class AsyncSendmail < ::Mail::Sendmail
80 def perform_delivery_tmp_file(mail) 106 def deliver!(*args)
81 dest_dir = File.join(Rails.root, 'tmp', 'emails') 107 Thread.start do
82 Dir.mkdir(dest_dir) unless File.directory?(dest_dir) 108 super *args
83 File.open(File.join(dest_dir, mail.message_id.gsub(/[<>]/, '') + '.eml'), 'wb') {|f| f.write(mail.encoded) } 109 end
110 end
111 end
112
113 class TmpFile
114 def initialize(*args); end
115
116 def deliver!(mail)
117 dest_dir = File.join(Rails.root, 'tmp', 'emails')
118 Dir.mkdir(dest_dir) unless File.directory?(dest_dir)
119 File.open(File.join(dest_dir, mail.message_id.gsub(/[<>]/, '') + '.eml'), 'wb') {|f| f.write(mail.encoded) }
120 end
84 end 121 end
85 end 122 end
86 123
87 ActionMailer::Base.send :include, AsynchronousMailer 124 ActionMailer::Base.add_delivery_method :async_smtp, DeliveryMethods::AsyncSMTP
125 ActionMailer::Base.add_delivery_method :async_sendmail, DeliveryMethods::AsyncSendmail
126 ActionMailer::Base.add_delivery_method :tmp_file, DeliveryMethods::TmpFile
88 127
89 module TMail 128 # Changes how sent emails are logged
90 # TMail::Unquoter.convert_to_with_fallback_on_iso_8859_1 introduced in TMail 1.2.7 129 # Rails doesn't log cc and bcc which is misleading when using bcc only (#12090)
91 # triggers a test failure in test_add_issue_with_japanese_keywords(MailHandlerTest) 130 module ActionMailer
92 class Unquoter 131 class LogSubscriber < ActiveSupport::LogSubscriber
93 class << self 132 def deliver(event)
94 alias_method :convert_to, :convert_to_without_fallback_on_iso_8859_1 133 recipients = [:to, :cc, :bcc].inject("") do |s, header|
95 end 134 r = Array.wrap(event.payload[header])
96 end 135 if r.any?
97 136 s << "\n #{header}: #{r.join(', ')}"
98 # Patch for TMail 1.2.7. See http://www.redmine.org/issues/8751 137 end
99 class Encoder 138 s
100 def puts_meta(str) 139 end
101 add_text str 140 info("\nSent email \"#{event.payload[:subject]}\" (%1.fms)#{recipients}" % event.duration)
141 debug(event.payload[:mail])
102 end 142 end
103 end 143 end
104 end 144 end
105 145
106 module ActionController 146 module ActionController
107 module MimeResponds 147 module MimeResponds
108 class Responder 148 class Collector
109 def api(&block) 149 def api(&block)
110 any(:xml, :json, &block) 150 any(:xml, :json, &block)
111 end 151 end
112 end 152 end
113 end 153 end
114 end 154 end
155
156 module ActionController
157 class Base
158 # Displays an explicit message instead of a NoMethodError exception
159 # when trying to start Redmine with an old session_store.rb
160 # TODO: remove it in a later version
161 def self.session=(*args)
162 $stderr.puts "Please remove config/initializers/session_store.rb and run `rake generate_secret_token`.\n" +
163 "Setting the session secret with ActionController.session= is no longer supported in Rails 3."
164 exit 1
165 end
166 end
167 end