Commit 72a1c96d0f7bb0345cc7f06e89942cf4b58de9f6
Exists in
master
and in
29 other branches
Merge branch 'stable' into postgres-tests
Showing
19 changed files
with
151 additions
and
52 deletions
Show diff stats
app/models/profile.rb
@@ -298,7 +298,7 @@ class Profile < ActiveRecord::Base | @@ -298,7 +298,7 @@ class Profile < ActiveRecord::Base | ||
298 | validate :valid_template | 298 | validate :valid_template |
299 | 299 | ||
300 | def valid_template | 300 | def valid_template |
301 | - if template_id.present? and !template.is_template | 301 | + if template_id.present? && template && !template.is_template |
302 | errors.add(:template, _('is not a template.')) | 302 | errors.add(:template, _('is not a template.')) |
303 | end | 303 | end |
304 | end | 304 | end |
app/views/blocks/location.html.erb
1 | <% if profile.lat %> | 1 | <% if profile.lat %> |
2 | <%= block_title block.title %> | 2 | <%= block_title block.title %> |
3 | <div class='the-localization-map'> | 3 | <div class='the-localization-map'> |
4 | - <img src="http://maps.google.com/maps/api/staticmap?center=<%=profile.lat%>,<%=profile.lng%>&zoom=<%=block.zoom%>&size=190x250&maptype=<%=block.map_type%>&markers=<%=profile.lat%>,<%=profile.lng%>&sensor=false"/> | 4 | + <img src="https://maps.google.com/maps/api/staticmap?center=<%=profile.lat%>,<%=profile.lng%>&zoom=<%=block.zoom%>&size=190x250&maptype=<%=block.map_type%>&markers=<%=profile.lat%>,<%=profile.lng%>&sensor=false"/> |
5 | </div> | 5 | </div> |
6 | </div> | 6 | </div> |
7 | <% else %> | 7 | <% else %> |
app/views/maps/edit_location.rhtml
@@ -29,5 +29,5 @@ | @@ -29,5 +29,5 @@ | ||
29 | 29 | ||
30 | <% end %> | 30 | <% end %> |
31 | 31 | ||
32 | -<%= content_tag('script', '', :src => "http://maps.googleapis.com/maps/api/js?sensor=false", :type => 'text/javascript') %> | 32 | +<%= content_tag('script', '', :src => "https://maps.googleapis.com/maps/api/js?sensor=false", :type => 'text/javascript') %> |
33 | <%= content_tag('script', '', :src => url_for(:controller => :maps, :action => :google_map), :type => 'text/javascript') %> | 33 | <%= content_tag('script', '', :src => url_for(:controller => :maps, :action => :google_map), :type => 'text/javascript') %> |
db/schema.rb
@@ -221,7 +221,6 @@ ActiveRecord::Schema.define(:version => 20130711213046) do | @@ -221,7 +221,6 @@ ActiveRecord::Schema.define(:version => 20130711213046) do | ||
221 | t.string "source_type" | 221 | t.string "source_type" |
222 | t.string "user_agent" | 222 | t.string "user_agent" |
223 | t.string "referrer" | 223 | t.string "referrer" |
224 | - t.integer "group_id" | ||
225 | end | 224 | end |
226 | 225 | ||
227 | add_index "comments", ["source_id", "spam"], :name => "index_comments_on_source_id_and_spam" | 226 | add_index "comments", ["source_id", "spam"], :name => "index_comments_on_source_id_and_spam" |
debian/changelog
lib/feed_updater.rb
@@ -19,6 +19,18 @@ end | @@ -19,6 +19,18 @@ end | ||
19 | # stops the process. | 19 | # stops the process. |
20 | class FeedUpdater | 20 | class FeedUpdater |
21 | 21 | ||
22 | + class ExceptionNotification < ActionMailer::Base | ||
23 | + def mail error | ||
24 | + environment = Environment.default | ||
25 | + | ||
26 | + recipients NOOSFERO_CONF['exception_recipients'] | ||
27 | + from environment.contact_email | ||
28 | + reply_to environment.contact_email | ||
29 | + subject "[#{environment.name}] Feed-updater: #{error.message}" | ||
30 | + body render(:text => error.backtrace.join("\n")) | ||
31 | + end | ||
32 | + end | ||
33 | + | ||
22 | # indicates how much time one feed will be left without updates | 34 | # indicates how much time one feed will be left without updates |
23 | # (ActiveSupport::Duration). Default: <tt>4.hours</tt> | 35 | # (ActiveSupport::Duration). Default: <tt>4.hours</tt> |
24 | cattr_accessor :update_interval | 36 | cattr_accessor :update_interval |
@@ -79,6 +91,8 @@ class FeedUpdater | @@ -79,6 +91,8 @@ class FeedUpdater | ||
79 | feed_handler.process(container) | 91 | feed_handler.process(container) |
80 | end | 92 | end |
81 | end | 93 | end |
94 | + rescue Exception => e | ||
95 | + FeedUpdater::ExceptionNotification.deliver_mail e if NOOSFERO_CONF['exception_recipients'].present? | ||
82 | end | 96 | end |
83 | end | 97 | end |
84 | 98 |
lib/noosfero.rb
@@ -3,7 +3,7 @@ require 'fast_gettext' | @@ -3,7 +3,7 @@ require 'fast_gettext' | ||
3 | 3 | ||
4 | module Noosfero | 4 | module Noosfero |
5 | PROJECT = 'noosfero' | 5 | PROJECT = 'noosfero' |
6 | - VERSION = '0.44.2' | 6 | + VERSION = '0.44.3' |
7 | 7 | ||
8 | def self.pattern_for_controllers_in_directory(dir) | 8 | def self.pattern_for_controllers_in_directory(dir) |
9 | disjunction = controllers_in_directory(dir).join('|') | 9 | disjunction = controllers_in_directory(dir).join('|') |
plugins/solr/lib/solr_plugin/search_helper.rb
@@ -34,10 +34,6 @@ module SolrPlugin::SearchHelper | @@ -34,10 +34,6 @@ module SolrPlugin::SearchHelper | ||
34 | ], | 34 | ], |
35 | } | 35 | } |
36 | 36 | ||
37 | -# def asset_class(asset) | ||
38 | -# asset.to_s.singularize.camelize.constantize | ||
39 | -# end | ||
40 | - | ||
41 | def class_asset(klass) | 37 | def class_asset(klass) |
42 | klass.name.underscore.pluralize.to_sym | 38 | klass.name.underscore.pluralize.to_sym |
43 | end | 39 | end |
@@ -111,6 +107,8 @@ module SolrPlugin::SearchHelper | @@ -111,6 +107,8 @@ module SolrPlugin::SearchHelper | ||
111 | 107 | ||
112 | def asset_class(asset) | 108 | def asset_class(asset) |
113 | asset.to_s.singularize.camelize.constantize | 109 | asset.to_s.singularize.camelize.constantize |
110 | + rescue | ||
111 | + asset.to_s.singularize.camelize.gsub('Plugin', 'Plugin::').constantize | ||
114 | end | 112 | end |
115 | 113 | ||
116 | def set_facets_variables | 114 | def set_facets_variables |
plugins/solr/vendor/plugins/acts_as_solr_reloaded/lib/acts_as_solr/class_methods.rb
@@ -208,7 +208,7 @@ module ActsAsSolr #:nodoc: | @@ -208,7 +208,7 @@ module ActsAsSolr #:nodoc: | ||
208 | # using eager loading for indexed associations. | 208 | # using eager loading for indexed associations. |
209 | def rebuild_solr_index(batch_size=300, options = {}, &finder) | 209 | def rebuild_solr_index(batch_size=300, options = {}, &finder) |
210 | finder ||= lambda do |ar, sql_options| | 210 | finder ||= lambda do |ar, sql_options| |
211 | - ar.all sql_options.merge!({:order => self.primary_key, :include => configuration[:solr_includes].keys}) | 211 | + ar.all sql_options.merge!({:order => self.primary_key}) |
212 | end | 212 | end |
213 | start_time = Time.now | 213 | start_time = Time.now |
214 | options[:offset] ||= 0 | 214 | options[:offset] ||= 0 |
plugins/solr/vendor/plugins/acts_as_solr_reloaded/lib/acts_as_solr/instance_methods.rb
1 | module ActsAsSolr #:nodoc: | 1 | module ActsAsSolr #:nodoc: |
2 | - | 2 | + |
3 | module InstanceMethods | 3 | module InstanceMethods |
4 | 4 | ||
5 | # Solr id is <class.name>:<id> to be unique across all models | 5 | # Solr id is <class.name>:<id> to be unique across all models |
@@ -10,7 +10,7 @@ module ActsAsSolr #:nodoc: | @@ -10,7 +10,7 @@ module ActsAsSolr #:nodoc: | ||
10 | # saves to the Solr index | 10 | # saves to the Solr index |
11 | def solr_save | 11 | def solr_save |
12 | return true if indexing_disabled? | 12 | return true if indexing_disabled? |
13 | - if evaluate_condition(:if, self) | 13 | + if evaluate_condition(:if, self) |
14 | debug "solr_save: #{self.class.name} : #{record_id(self)}" | 14 | debug "solr_save: #{self.class.name} : #{record_id(self)}" |
15 | solr_add to_solr_doc | 15 | solr_add to_solr_doc |
16 | solr_commit if configuration[:auto_commit] | 16 | solr_commit if configuration[:auto_commit] |
@@ -38,9 +38,9 @@ module ActsAsSolr #:nodoc: | @@ -38,9 +38,9 @@ module ActsAsSolr #:nodoc: | ||
38 | debug "to_solr_doc: creating doc for class: #{self.class.name}, id: #{record_id(self)}" | 38 | debug "to_solr_doc: creating doc for class: #{self.class.name}, id: #{record_id(self)}" |
39 | doc = Solr::Document.new | 39 | doc = Solr::Document.new |
40 | doc.boost = validate_boost(configuration[:boost]) if configuration[:boost] | 40 | doc.boost = validate_boost(configuration[:boost]) if configuration[:boost] |
41 | - | 41 | + |
42 | doc << {:id => solr_id, | 42 | doc << {:id => solr_id, |
43 | - solr_configuration[:type_field] => self.class.name, | 43 | + solr_configuration[:type_field] => Solr::Util.query_parser_escape(self.class.name), |
44 | solr_configuration[:primary_key_field] => record_id(self).to_s} | 44 | solr_configuration[:primary_key_field] => record_id(self).to_s} |
45 | 45 | ||
46 | # iterate through the fields and add them to the document, | 46 | # iterate through the fields and add them to the document, |
@@ -50,7 +50,7 @@ module ActsAsSolr #:nodoc: | @@ -50,7 +50,7 @@ module ActsAsSolr #:nodoc: | ||
50 | field_boost = options[:boost] || solr_configuration[:default_boost] | 50 | field_boost = options[:boost] || solr_configuration[:default_boost] |
51 | field_type = get_solr_field_type(options[:type]) | 51 | field_type = get_solr_field_type(options[:type]) |
52 | solr_name = options[:as] || field_name | 52 | solr_name = options[:as] || field_name |
53 | - | 53 | + |
54 | value = self.send("#{field_name}_for_solr") rescue nil | 54 | value = self.send("#{field_name}_for_solr") rescue nil |
55 | next if value.nil? | 55 | next if value.nil? |
56 | 56 | ||
@@ -63,18 +63,18 @@ module ActsAsSolr #:nodoc: | @@ -63,18 +63,18 @@ module ActsAsSolr #:nodoc: | ||
63 | field.boost = processed_boost | 63 | field.boost = processed_boost |
64 | doc << field | 64 | doc << field |
65 | end | 65 | end |
66 | - | 66 | + |
67 | add_dynamic_attributes(doc) | 67 | add_dynamic_attributes(doc) |
68 | add_includes(doc) | 68 | add_includes(doc) |
69 | add_tags(doc) | 69 | add_tags(doc) |
70 | add_space(doc) | 70 | add_space(doc) |
71 | - | 71 | + |
72 | debug doc.to_json | 72 | debug doc.to_json |
73 | doc | 73 | doc |
74 | end | 74 | end |
75 | 75 | ||
76 | private | 76 | private |
77 | - | 77 | + |
78 | def debug(text) | 78 | def debug(text) |
79 | logger.debug text rescue nil | 79 | logger.debug text rescue nil |
80 | end | 80 | end |
@@ -85,14 +85,14 @@ module ActsAsSolr #:nodoc: | @@ -85,14 +85,14 @@ module ActsAsSolr #:nodoc: | ||
85 | doc << Solr::Field.new(:name => "lng_f", :value => local.longitude) | 85 | doc << Solr::Field.new(:name => "lng_f", :value => local.longitude) |
86 | end | 86 | end |
87 | end | 87 | end |
88 | - | 88 | + |
89 | def add_tags(doc) | 89 | def add_tags(doc) |
90 | taggings.each do |tagging| | 90 | taggings.each do |tagging| |
91 | doc << Solr::Field.new(:name => "tag_facet", :value => tagging.tag.name) | 91 | doc << Solr::Field.new(:name => "tag_facet", :value => tagging.tag.name) |
92 | doc << Solr::Field.new(:name => "tag_t", :value => tagging.tag.name) | 92 | doc << Solr::Field.new(:name => "tag_t", :value => tagging.tag.name) |
93 | end if configuration[:taggable] | 93 | end if configuration[:taggable] |
94 | end | 94 | end |
95 | - | 95 | + |
96 | def add_dynamic_attributes(doc) | 96 | def add_dynamic_attributes(doc) |
97 | dynamic_attributes.each do |attribute| | 97 | dynamic_attributes.each do |attribute| |
98 | value = ERB::Util.html_escape(attribute.value) | 98 | value = ERB::Util.html_escape(attribute.value) |
@@ -130,7 +130,7 @@ module ActsAsSolr #:nodoc: | @@ -130,7 +130,7 @@ module ActsAsSolr #:nodoc: | ||
130 | end | 130 | end |
131 | end | 131 | end |
132 | end | 132 | end |
133 | - | 133 | + |
134 | def include_value(record, options) | 134 | def include_value(record, options) |
135 | if options[:using].is_a? Proc | 135 | if options[:using].is_a? Proc |
136 | options[:using].call(record) | 136 | options[:using].call(record) |
@@ -159,14 +159,14 @@ module ActsAsSolr #:nodoc: | @@ -159,14 +159,14 @@ module ActsAsSolr #:nodoc: | ||
159 | self.send(boost) | 159 | self.send(boost) |
160 | end | 160 | end |
161 | end | 161 | end |
162 | - | 162 | + |
163 | boost_value || solr_configuration[:default_boost] | 163 | boost_value || solr_configuration[:default_boost] |
164 | end | 164 | end |
165 | - | 165 | + |
166 | def condition_block?(condition) | 166 | def condition_block?(condition) |
167 | condition.respond_to?("call") && (condition.arity == 1 || condition.arity == -1) | 167 | condition.respond_to?("call") && (condition.arity == 1 || condition.arity == -1) |
168 | end | 168 | end |
169 | - | 169 | + |
170 | def evaluate_condition(which_condition, field) | 170 | def evaluate_condition(which_condition, field) |
171 | condition = configuration[which_condition] | 171 | condition = configuration[which_condition] |
172 | case condition | 172 | case condition |
plugins/solr/vendor/plugins/acts_as_solr_reloaded/lib/acts_as_solr/parser_methods.rb
@@ -127,7 +127,7 @@ module ActsAsSolr #:nodoc: | @@ -127,7 +127,7 @@ module ActsAsSolr #:nodoc: | ||
127 | classes = [self] + (self.subclasses || []) + (options[:models] || []) | 127 | classes = [self] + (self.subclasses || []) + (options[:models] || []) |
128 | classes.map do |klass| | 128 | classes.map do |klass| |
129 | next if klass.name.empty? | 129 | next if klass.name.empty? |
130 | - "#{solr_configuration[:type_field]}:\"#{klass.name}\"" | 130 | + "#{solr_configuration[:type_field]}:\"#{Solr::Util.query_parser_escape klass.name}\"" |
131 | end.compact.join(' OR ') | 131 | end.compact.join(' OR ') |
132 | end | 132 | end |
133 | 133 |
plugins/solr/vendor/plugins/acts_as_solr_reloaded/lib/solr/request/select.rb
@@ -12,22 +12,22 @@ | @@ -12,22 +12,22 @@ | ||
12 | 12 | ||
13 | # "Abstract" base class, only useful with subclasses that add parameters | 13 | # "Abstract" base class, only useful with subclasses that add parameters |
14 | class Solr::Request::Select < Solr::Request::Base | 14 | class Solr::Request::Select < Solr::Request::Base |
15 | - | 15 | + |
16 | attr_reader :query_type | 16 | attr_reader :query_type |
17 | - | 17 | + |
18 | def initialize(qt=nil, params={}) | 18 | def initialize(qt=nil, params={}) |
19 | @query_type = qt | 19 | @query_type = qt |
20 | @select_params = params | 20 | @select_params = params |
21 | end | 21 | end |
22 | - | 22 | + |
23 | def response_format | 23 | def response_format |
24 | :ruby | 24 | :ruby |
25 | end | 25 | end |
26 | - | 26 | + |
27 | def handler | 27 | def handler |
28 | 'select' | 28 | 'select' |
29 | end | 29 | end |
30 | - | 30 | + |
31 | def content_type | 31 | def content_type |
32 | 'application/x-www-form-urlencoded; charset=utf-8' | 32 | 'application/x-www-form-urlencoded; charset=utf-8' |
33 | end | 33 | end |
@@ -35,7 +35,7 @@ class Solr::Request::Select < Solr::Request::Base | @@ -35,7 +35,7 @@ class Solr::Request::Select < Solr::Request::Base | ||
35 | def to_hash | 35 | def to_hash |
36 | return {:qt => query_type, :wt => 'ruby', 'json.nl' => 'arrarr'}.merge(@select_params) | 36 | return {:qt => query_type, :wt => 'ruby', 'json.nl' => 'arrarr'}.merge(@select_params) |
37 | end | 37 | end |
38 | - | 38 | + |
39 | def to_s | 39 | def to_s |
40 | raw_params = self.to_hash | 40 | raw_params = self.to_hash |
41 | 41 | ||
@@ -50,5 +50,5 @@ class Solr::Request::Select < Solr::Request::Base | @@ -50,5 +50,5 @@ class Solr::Request::Select < Solr::Request::Base | ||
50 | 50 | ||
51 | http_params.join("&") | 51 | http_params.join("&") |
52 | end | 52 | end |
53 | - | 53 | + |
54 | end | 54 | end |
plugins/solr/vendor/plugins/acts_as_solr_reloaded/lib/tasks/solr.rake
1 | namespace :solr do | 1 | namespace :solr do |
2 | 2 | ||
3 | - APACHE_MIRROR = ENV['APACHE_MIRROR'] || "http://ftp.unicamp.br/pub/apache" | 3 | + APACHE_MIRROR = ENV['APACHE_MIRROR'] || "https://archive.apache.org/dist" |
4 | SOLR_VERSION = '3.6.2' | 4 | SOLR_VERSION = '3.6.2' |
5 | SOLR_FILENAME = "apache-solr-#{SOLR_VERSION}.tgz" | 5 | SOLR_FILENAME = "apache-solr-#{SOLR_VERSION}.tgz" |
6 | SOLR_MD5SUM = 'e9c51f51265b070062a9d8ed50b84647' | 6 | SOLR_MD5SUM = 'e9c51f51265b070062a9d8ed50b84647' |
@@ -177,7 +177,7 @@ namespace :solr do | @@ -177,7 +177,7 @@ namespace :solr do | ||
177 | models.each do |model| | 177 | models.each do |model| |
178 | if clear_first | 178 | if clear_first |
179 | puts "Clearing index for #{model}..." | 179 | puts "Clearing index for #{model}..." |
180 | - ActsAsSolr::Post.execute(Solr::Request::Delete.new(:query => "#{model.solr_configuration[:type_field]}:#{Solr::Util.query_parser_escape(model.name)}")) | 180 | + ActsAsSolr::Post.execute(Solr::Request::Delete.new(:query => "#{model.solr_configuration[:type_field]}:#{model.name.gsub ':', "\\:"}")) |
181 | ActsAsSolr::Post.execute(Solr::Request::Commit.new) | 181 | ActsAsSolr::Post.execute(Solr::Request::Commit.new) |
182 | end | 182 | end |
183 | 183 |
public/500.html
@@ -55,13 +55,13 @@ | @@ -55,13 +55,13 @@ | ||
55 | 55 | ||
56 | 56 | ||
57 | <div id='es' style='display: none' class='message'> | 57 | <div id='es' style='display: none' class='message'> |
58 | - <h1>Temporary system problem</h1> | 58 | + <h1>Problema temporal del sistema</h1> |
59 | <p> | 59 | <p> |
60 | - Our technical team is working on it, please try again later. Sorry for the inconvenience. | 60 | + Nuestro equipo técnico está trabajando en ello, por favor, inténtalo de nuevo más tarde. Disculpa las molestias. |
61 | </p> | 61 | </p> |
62 | <ul> | 62 | <ul> |
63 | - <li><a href='javascript: history.back()'>Go back</a></li> | ||
64 | - <li><a href='/'>Go to the site home page</a></li> | 63 | + <li><a href='javascript: history.back()'>Regresar</a></li> |
64 | + <li><a href='/'>Ir a la página de inicio del sitio</a></li> | ||
65 | </ul> | 65 | </ul> |
66 | </div> | 66 | </div> |
67 | 67 | ||
@@ -90,6 +90,18 @@ | @@ -90,6 +90,18 @@ | ||
90 | </div> | 90 | </div> |
91 | 91 | ||
92 | 92 | ||
93 | + <div id='it' style='display: none' class='message'> | ||
94 | + <h1>Temporary system problem</h1> | ||
95 | + <p> | ||
96 | + Our technical team is working on it, please try again later. Sorry for the inconvenience. | ||
97 | + </p> | ||
98 | + <ul> | ||
99 | + <li><a href='javascript: history.back()'>Go back</a></li> | ||
100 | + <li><a href='/'>Go to the site home page</a></li> | ||
101 | + </ul> | ||
102 | + </div> | ||
103 | + | ||
104 | + | ||
93 | <div id='pt' style='display: none' class='message'> | 105 | <div id='pt' style='display: none' class='message'> |
94 | <h1>Problema temporário no sistema</h1> | 106 | <h1>Problema temporário no sistema</h1> |
95 | <p> | 107 | <p> |
@@ -127,6 +139,8 @@ | @@ -127,6 +139,8 @@ | ||
127 | 139 | ||
128 | <a href="javascript: display_error_message('hy')">հայերեն լեզու</a> | 140 | <a href="javascript: display_error_message('hy')">հայերեն լեզու</a> |
129 | 141 | ||
142 | + <a href="javascript: display_error_message('it')">Italiano</a> | ||
143 | + | ||
130 | <a href="javascript: display_error_message('pt')">Português</a> | 144 | <a href="javascript: display_error_message('pt')">Português</a> |
131 | 145 | ||
132 | <a href="javascript: display_error_message('ru')">русский язык</a> | 146 | <a href="javascript: display_error_message('ru')">русский язык</a> |
public/503.html
@@ -43,9 +43,9 @@ | @@ -43,9 +43,9 @@ | ||
43 | 43 | ||
44 | 44 | ||
45 | <div id='es' style='display: none' class='message'> | 45 | <div id='es' style='display: none' class='message'> |
46 | - <h1>System maintainance</h1> | 46 | + <h1>Mantenimeinto del sistema</h1> |
47 | <p> | 47 | <p> |
48 | - This system is under maintainance. It should be back in a few moments. | 48 | + Este sistema está en mantenimiento. Debería regresar en unos momentos. |
49 | </p> | 49 | </p> |
50 | </div> | 50 | </div> |
51 | 51 | ||
@@ -66,6 +66,14 @@ | @@ -66,6 +66,14 @@ | ||
66 | </div> | 66 | </div> |
67 | 67 | ||
68 | 68 | ||
69 | + <div id='it' style='display: none' class='message'> | ||
70 | + <h1>System maintainance</h1> | ||
71 | + <p> | ||
72 | + This system is under maintainance. It should be back in a few moments. | ||
73 | + </p> | ||
74 | + </div> | ||
75 | + | ||
76 | + | ||
69 | <div id='pt' style='display: none' class='message'> | 77 | <div id='pt' style='display: none' class='message'> |
70 | <h1>Manutenção do sistema</h1> | 78 | <h1>Manutenção do sistema</h1> |
71 | <p> | 79 | <p> |
@@ -95,6 +103,8 @@ | @@ -95,6 +103,8 @@ | ||
95 | 103 | ||
96 | <a href="javascript: display_error_message('hy')">հայերեն լեզու</a> | 104 | <a href="javascript: display_error_message('hy')">հայերեն լեզու</a> |
97 | 105 | ||
106 | + <a href="javascript: display_error_message('it')">Italiano</a> | ||
107 | + | ||
98 | <a href="javascript: display_error_message('pt')">Português</a> | 108 | <a href="javascript: display_error_message('pt')">Português</a> |
99 | 109 | ||
100 | <a href="javascript: display_error_message('ru')">русский язык</a> | 110 | <a href="javascript: display_error_message('ru')">русский язык</a> |
test/unit/location_block_test.rb
@@ -29,11 +29,11 @@ class LocationBlockTest < ActiveSupport::TestCase | @@ -29,11 +29,11 @@ class LocationBlockTest < ActiveSupport::TestCase | ||
29 | assert_equal '', LocationBlock.new.title | 29 | assert_equal '', LocationBlock.new.title |
30 | end | 30 | end |
31 | 31 | ||
32 | - should 'use google maps api v3' do | 32 | + should 'use google maps api v3 with ssl' do |
33 | @block.owner.lat = '-12.34'; @block.owner.save! | 33 | @block.owner.lat = '-12.34'; @block.owner.save! |
34 | content = extract_block_content(@block.content) | 34 | content = extract_block_content(@block.content) |
35 | 35 | ||
36 | - assert_match 'http://maps.google.com/maps/api/staticmap', content | 36 | + assert_match 'https://maps.google.com/maps/api/staticmap', content |
37 | assert_no_match /key=/, content | 37 | assert_no_match /key=/, content |
38 | end | 38 | end |
39 | 39 |
test/unit/profile_test.rb
@@ -1379,6 +1379,16 @@ class ProfileTest < ActiveSupport::TestCase | @@ -1379,6 +1379,16 @@ class ProfileTest < ActiveSupport::TestCase | ||
1379 | assert_not_includes Profile.templates(Environment.default), profile | 1379 | assert_not_includes Profile.templates(Environment.default), profile |
1380 | end | 1380 | end |
1381 | 1381 | ||
1382 | + should 'not crash on a profile update with a destroyed template' do | ||
1383 | + template = fast_create(Profile, :is_template => true) | ||
1384 | + profile = fast_create(Profile, :template_id => template.id) | ||
1385 | + template.destroy | ||
1386 | + | ||
1387 | + assert_nothing_raised do | ||
1388 | + Profile.find(profile.id).save! | ||
1389 | + end | ||
1390 | + end | ||
1391 | + | ||
1382 | should 'provide URL to leave' do | 1392 | should 'provide URL to leave' do |
1383 | profile = build(Profile, :identifier => 'testprofile') | 1393 | profile = build(Profile, :identifier => 'testprofile') |
1384 | assert_equal({ :profile => 'testprofile', :controller => 'profile', :action => 'leave', :reload => false}, profile.leave_url) | 1394 | assert_equal({ :profile => 'testprofile', :controller => 'profile', :action => 'leave', :reload => false}, profile.leave_url) |
vendor/plugins/delayed_job/lib/delayed/worker.rb
@@ -10,12 +10,12 @@ module Delayed | @@ -10,12 +10,12 @@ module Delayed | ||
10 | self.max_attempts = 25 | 10 | self.max_attempts = 25 |
11 | self.max_run_time = 4.hours | 11 | self.max_run_time = 4.hours |
12 | self.default_priority = 0 | 12 | self.default_priority = 0 |
13 | - | 13 | + |
14 | # By default failed jobs are destroyed after too many attempts. If you want to keep them around | 14 | # By default failed jobs are destroyed after too many attempts. If you want to keep them around |
15 | # (perhaps to inspect the reason for the failure), set this to false. | 15 | # (perhaps to inspect the reason for the failure), set this to false. |
16 | cattr_accessor :destroy_failed_jobs | 16 | cattr_accessor :destroy_failed_jobs |
17 | self.destroy_failed_jobs = true | 17 | self.destroy_failed_jobs = true |
18 | - | 18 | + |
19 | self.logger = if defined?(Merb::Logger) | 19 | self.logger = if defined?(Merb::Logger) |
20 | Merb.logger | 20 | Merb.logger |
21 | elsif defined?(RAILS_DEFAULT_LOGGER) | 21 | elsif defined?(RAILS_DEFAULT_LOGGER) |
@@ -24,9 +24,9 @@ module Delayed | @@ -24,9 +24,9 @@ module Delayed | ||
24 | 24 | ||
25 | # name_prefix is ignored if name is set directly | 25 | # name_prefix is ignored if name is set directly |
26 | attr_accessor :name_prefix | 26 | attr_accessor :name_prefix |
27 | - | 27 | + |
28 | cattr_reader :backend | 28 | cattr_reader :backend |
29 | - | 29 | + |
30 | def self.backend=(backend) | 30 | def self.backend=(backend) |
31 | if backend.is_a? Symbol | 31 | if backend.is_a? Symbol |
32 | require "delayed/backend/#{backend}" | 32 | require "delayed/backend/#{backend}" |
@@ -35,7 +35,7 @@ module Delayed | @@ -35,7 +35,7 @@ module Delayed | ||
35 | @@backend = backend | 35 | @@backend = backend |
36 | silence_warnings { ::Delayed.const_set(:Job, backend) } | 36 | silence_warnings { ::Delayed.const_set(:Job, backend) } |
37 | end | 37 | end |
38 | - | 38 | + |
39 | def self.guess_backend | 39 | def self.guess_backend |
40 | self.backend ||= if defined?(ActiveRecord) | 40 | self.backend ||= if defined?(ActiveRecord) |
41 | :active_record | 41 | :active_record |
@@ -97,7 +97,7 @@ module Delayed | @@ -97,7 +97,7 @@ module Delayed | ||
97 | ensure | 97 | ensure |
98 | Delayed::Job.clear_locks!(name) | 98 | Delayed::Job.clear_locks!(name) |
99 | end | 99 | end |
100 | - | 100 | + |
101 | # Do num jobs and return stats on success/failure. | 101 | # Do num jobs and return stats on success/failure. |
102 | # Exit early if interrupted. | 102 | # Exit early if interrupted. |
103 | def work_off(num = 100) | 103 | def work_off(num = 100) |
@@ -117,7 +117,7 @@ module Delayed | @@ -117,7 +117,7 @@ module Delayed | ||
117 | 117 | ||
118 | return [success, failure] | 118 | return [success, failure] |
119 | end | 119 | end |
120 | - | 120 | + |
121 | def run(job) | 121 | def run(job) |
122 | runtime = Benchmark.realtime do | 122 | runtime = Benchmark.realtime do |
123 | Timeout.timeout(self.class.max_run_time.to_i) { job.invoke_job } | 123 | Timeout.timeout(self.class.max_run_time.to_i) { job.invoke_job } |
@@ -129,7 +129,7 @@ module Delayed | @@ -129,7 +129,7 @@ module Delayed | ||
129 | handle_failed_job(job, e) | 129 | handle_failed_job(job, e) |
130 | return false # work failed | 130 | return false # work failed |
131 | end | 131 | end |
132 | - | 132 | + |
133 | # Reschedule the job in the future (when a job fails). | 133 | # Reschedule the job in the future (when a job fails). |
134 | # Uses an exponential scale depending on the number of failed attempts. | 134 | # Uses an exponential scale depending on the number of failed attempts. |
135 | def reschedule(job, time = nil) | 135 | def reschedule(job, time = nil) |
@@ -162,13 +162,13 @@ module Delayed | @@ -162,13 +162,13 @@ module Delayed | ||
162 | end | 162 | end |
163 | 163 | ||
164 | protected | 164 | protected |
165 | - | 165 | + |
166 | def handle_failed_job(job, error) | 166 | def handle_failed_job(job, error) |
167 | job.last_error = error.message + "\n" + error.backtrace.join("\n") | 167 | job.last_error = error.message + "\n" + error.backtrace.join("\n") |
168 | say "#{job.name} failed with #{error.class.name}: #{error.message} - #{job.attempts} failed attempts", Logger::ERROR | 168 | say "#{job.name} failed with #{error.class.name}: #{error.message} - #{job.attempts} failed attempts", Logger::ERROR |
169 | reschedule(job) | 169 | reschedule(job) |
170 | end | 170 | end |
171 | - | 171 | + |
172 | # Run the next job we can get an exclusive lock on. | 172 | # Run the next job we can get an exclusive lock on. |
173 | # If no jobs are left we return nil | 173 | # If no jobs are left we return nil |
174 | def reserve_and_run_one_job | 174 | def reserve_and_run_one_job |
vendor/plugins/monkey_patches/rescue_delayed_job_crashes/init.rb
0 → 100644
@@ -0,0 +1,48 @@ | @@ -0,0 +1,48 @@ | ||
1 | +Delayed::Worker.module_eval do | ||
2 | + # based on https://groups.google.com/forum/#!topic/delayed_job/ZGMUFFppNgs | ||
3 | + class Delayed::Worker::ExceptionNotification < ActionMailer::Base | ||
4 | + def mail error | ||
5 | + environment = Environment.default | ||
6 | + | ||
7 | + recipients NOOSFERO_CONF['exception_recipients'] | ||
8 | + from environment.contact_email | ||
9 | + reply_to environment.contact_email | ||
10 | + subject "[#{environment.name}] DelayedJob: #{error.message}" | ||
11 | + body render(:text => error.backtrace.join("\n")) | ||
12 | + end | ||
13 | + end | ||
14 | + | ||
15 | + def handle_failed_job_with_notification(job, error) | ||
16 | + Delayed::Worker::ExceptionNotification.deliver_mail error if NOOSFERO_CONF['exception_recipients'].present? | ||
17 | + handle_failed_job_without_notification job, error | ||
18 | + end | ||
19 | + alias_method_chain :handle_failed_job, :notification | ||
20 | + | ||
21 | + def handle_failed_job_with_rescue(job, error) | ||
22 | + handle_failed_job_without_rescue(job, error) | ||
23 | + rescue => e # don't crash here | ||
24 | + end | ||
25 | + alias_method_chain :handle_failed_job, :rescue | ||
26 | + | ||
27 | + protected | ||
28 | + | ||
29 | + # This code must be replicated because there is no other way to pass the job | ||
30 | + # through and use alias_method_chain as we used on the previous method | ||
31 | + def reserve_and_run_one_job | ||
32 | + # We get up to 5 jobs from the db. In case we cannot get exclusive access to a job we try the next. | ||
33 | + # this leads to a more even distribution of jobs across the worker processes | ||
34 | + job = Delayed::Job.find_available(name, 5, self.class.max_run_time).detect do |job| | ||
35 | + if job.lock_exclusively!(self.class.max_run_time, name) | ||
36 | + say "acquired lock on #{job.name}" | ||
37 | + true | ||
38 | + else | ||
39 | + say "failed to acquire exclusive lock for #{job.name}", Logger::WARN | ||
40 | + false | ||
41 | + end | ||
42 | + end | ||
43 | + | ||
44 | + run(job) if job | ||
45 | + rescue => e | ||
46 | + handle_failed_job(job, e) | ||
47 | + end | ||
48 | +end |