Mercurial > hg > soundsoftware-site
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 |