Commit a700537c4634a1332b10c4615cd731e42b288072

Authored by Antonio Terceiro
2 parents d877a56d f9a04729

Merge branch 'rails4'

Noosfero now uses Rails 4.2, and requires Debian Jessie.
Showing 1143 changed files with 15359 additions and 31589 deletions   Show diff stats

Too many changes.

To preserve performance only 100 of 1143 files displayed.

.travis.yml
... ... @@ -8,8 +8,7 @@ notifications:
8 8  
9 9 language: ruby
10 10 rvm:
11   -# for 2.2 support we need to upgrade the pg gem
12   - - 2.1.6
  11 + - 2.2.3
13 12  
14 13 sudo: false
15 14 addons:
... ... @@ -26,19 +25,16 @@ addons:
26 25 - libsqlite3-dev
27 26 - libxslt1-dev
28 27  
29   -before_install:
30   - - gem env
31   -
32 28 # workaround for https://github.com/travis-ci/travis-ci/issues/4536
33 29 before_install:
34   - - export GEM_HOME=$PWD/vendor/bundle/ruby/2.1.0
  30 + - export GEM_HOME=$PWD/vendor/bundle/ruby/2.2.0
35 31 - gem install bundler
36 32 cache: bundler
37 33  
38 34 before_script:
39 35 - mkdir -p tmp/{pids,cache} log
40 36 - script/noosfero-plugins disableall
41   - - bundle exec rake makemo &>/dev/null
  37 + #- bundle exec rake makemo &>/dev/null
42 38 # database
43 39 - cp config/database.yml.travis config/database.yml
44 40 - psql -c 'create database myapp_test;' -U postgres
... ... @@ -49,7 +45,7 @@ env:
49 45 - TASK=test:units
50 46 - TASK=test:functionals
51 47 - TASK=test:integration
52   - - TASK=cucumber
  48 + - TASK=cucumber LANG=en
53 49 - TASK=selenium
54 50 - TASK=test:noosfero_plugins BUNDLE_OPTS=install
55 51  
... ...
Gemfile
1 1 source "https://rubygems.org"
2   -gem 'rails', '~> 3.2.22'
3   -gem 'minitest', '~> 3.2.0'
4   -gem 'fast_gettext', '~> 0.6.8'
5   -gem 'acts-as-taggable-on', '~> 3.4.2'
  2 +gem 'rails', '~> 4.2.4'
  3 +gem 'fast_gettext', '~> 0.9'
  4 +gem 'acts-as-taggable-on', '~> 3.5'
6 5 gem 'rails_autolink', '~> 1.1.5'
7   -gem 'pg', '~> 0.13.2'
8   -gem 'rmagick', '~> 2.13.1'
9   -gem 'RedCloth', '~> 4.2.9'
10   -gem 'will_paginate', '~> 3.0.3'
  6 +gem 'pg', '~> 0.17'
  7 +gem 'rmagick', '~> 2.13'
  8 +gem 'RedCloth', '~> 4.2'
11 9 gem 'ruby-feedparser', '~> 0.7'
12   -gem 'daemons', '~> 1.1.5'
  10 +gem 'daemons', '~> 1.1'
13 11 gem 'unicorn', '~> 4.8'
14   -gem 'nokogiri', '~> 1.5.5'
  12 +gem 'nokogiri', '~> 1.6.0'
  13 +gem 'will_paginate'
  14 +gem 'pothoven-attachment_fu', '~> 3.2.16'
  15 +gem 'delayed_job'
  16 +gem 'delayed_job_active_record'
15 17 gem 'rake', :require => false
16   -gem 'rest-client', '~> 1.6.7'
  18 +gem 'rest-client', '~> 1.6'
17 19 gem 'exception_notification', '~> 4.0.1'
18   -gem 'gettext', '~> 2.2.1', :require => false
19   -gem 'locale', '~> 2.0.5'
  20 +gem 'gettext', '~> 3.1', :require => false
  21 +gem 'locale', '~> 2.1'
20 22 gem 'whenever', :require => false
21   -gem 'eita-jrails', '~> 0.9.5', require: 'jrails'
  23 +gem 'eita-jrails', '~> 0.10.0', require: 'jrails'
  24 +gem 'diffy', '~> 3.0'
22 25  
23 26 # API dependencies
24 27 gem 'grape', '~> 0.12'
... ... @@ -30,30 +33,55 @@ gem 'rack-contrib'
30 33 # asset pipeline
31 34 gem 'uglifier', '>= 1.0.3'
32 35 gem 'sass-rails'
33   -gem 'sass', '~> 3.1.19'
  36 +
  37 +# gems to enable rails3 behaviour
  38 +gem 'protected_attributes'
  39 +gem 'rails-observers'
  40 +gem 'actionpack-page_caching'
  41 +gem 'actionpack-action_caching'
  42 +gem 'activerecord-session_store'
  43 +gem 'activerecord-deprecated_finders', require: 'active_record/deprecated_finders'
34 44  
35 45 group :production do
36 46 gem 'dalli', '~> 2.7.0'
37 47 end
38 48  
  49 +group :development do
  50 +end
  51 +
  52 +group :development, :test do
  53 + gem 'spring'
  54 +end
  55 +
39 56 group :test do
40   - gem 'rspec', '~> 2.14.0'
41   - gem 'rspec-rails', '~> 2.14.1'
  57 + gem 'rspec', '~> 3.3'
  58 + gem 'rspec-rails', '~> 3.2'
42 59 gem 'mocha', '~> 1.1.0', :require => false
43 60 gem 'test-unit' if RUBY_VERSION >= '2.2.0'
  61 + gem 'minitest'
  62 + gem 'minitest-reporters'
44 63 end
45 64  
46 65 group :cucumber do
47   - gem 'cucumber-rails', '~> 1.0.6', :require => false
48   - gem 'capybara', '~> 2.1.0'
49   - gem 'cucumber', '~> 1.0.6'
50   - gem 'database_cleaner', '~> 1.2.0'
51   - gem 'selenium-webdriver', '~> 2.47.0'
  66 + gem 'capybara', '~> 2.2'
  67 + gem 'launchy'
  68 + gem 'cucumber'
  69 + gem 'cucumber-rails', '~> 1.4.2', :require => false
  70 + gem 'database_cleaner', '~> 1.3'
  71 + gem 'selenium-webdriver'
52 72 end
53 73  
54 74 # Requires custom dependencies
55 75 eval(File.read('config/Gemfile'), binding) rescue nil
56 76  
  77 +vendor = Dir.glob('vendor/{,plugins/}*') - ['vendor/plugins']
  78 +vendor.each do |dir|
  79 + plugin = File.basename dir
  80 + version = if Dir.glob("#{dir}/*.gemspec").length > 0 then '> 0.0.0' else '0.0.0' end
  81 +
  82 + gem plugin, version, path: dir
  83 +end
  84 +
57 85 # include gemfiles from enabled plugins
58 86 # plugins in baseplugins/ are not included on purpose. They should not have any
59 87 # dependencies.
... ...
Vagrantfile
... ... @@ -3,7 +3,7 @@
3 3  
4 4 VAGRANTFILE_API_VERSION = "2"
5 5 Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
6   - config.vm.box = ENV.fetch('VAGRANT_BOX', "debian-wheezy")
  6 + config.vm.box = ENV.fetch('VAGRANT_BOX', "debian/jessie64")
7 7 config.vm.network :forwarded_port, host: 3000, guest: 3000
8 8 config.vm.provision :shell do |shell|
9 9 shell.inline = 'su vagrant -c /vagrant/script/vagrant'
... ...
app/controllers/admin/admin_panel_controller.rb
... ... @@ -12,7 +12,7 @@ class AdminPanelController < AdminController
12 12 if params[:environment][:languages]
13 13 params[:environment][:languages] = params[:environment][:languages].map {|lang, value| lang if value=='true'}.compact
14 14 end
15   - if @environment.update_attributes(params[:environment])
  15 + if @environment.update(params[:environment])
16 16 session[:notice] = _('Environment settings updated')
17 17 redirect_to :action => 'index'
18 18 end
... ... @@ -54,7 +54,7 @@ class AdminPanelController < AdminController
54 54  
55 55 if request.post?
56 56 env = environment
57   - folders = params[:folders].map{|fid| Folder.find(:first, :conditions => {:profile_id => env.portal_community, :id => fid})} if params[:folders]
  57 + folders = env.portal_community.folders.where(id: params[:folders]).order(params[:folders].reverse.map{ |f| "id=#{f}" }) if params[:folders]
58 58 env.portal_folders = folders
59 59 if env.save
60 60 session[:notice] = _('Saved the portal folders')
... ... @@ -65,7 +65,7 @@ class AdminPanelController < AdminController
65 65  
66 66 def set_portal_news_amount
67 67 if request.post?
68   - if @environment.update_attributes(params[:environment])
  68 + if @environment.update(params[:environment])
69 69 session[:notice] = _('Saved the number of news on folders')
70 70 redirect_to :action => 'index'
71 71 end
... ...
app/controllers/admin/categories_controller.rb
1 1 class CategoriesController < AdminController
2 2  
3 3 protect 'manage_environment_categories', :environment
4   -
  4 +
5 5 helper :categories
6 6  
7 7 def index
8   - @categories = environment.categories.find(:all, :conditions => "parent_id is null AND type is null")
9   - @regions = environment.regions.find(:all, :conditions => {:parent_id => nil})
10   - @product_categories = environment.product_categories.find(:all, :conditions => {:parent_id => nil})
  8 + @categories = environment.categories.where("parent_id is null AND type is null")
  9 + @regions = environment.regions.where(:parent_id => nil)
  10 + @product_categories = environment.product_categories.where(:parent_id => nil)
11 11 end
12 12  
13 13 def get_children
... ... @@ -43,7 +43,7 @@ class CategoriesController &lt; AdminController
43 43 begin
44 44 @category = environment.categories.find(params[:id])
45 45 if request.post?
46   - @category.update_attributes!(params[:category])
  46 + @category.update!(params[:category])
47 47 @saved = true
48 48 session[:notice] = _("Category %s saved." % @category.name)
49 49 redirect_to :action => 'index'
... ...
app/controllers/admin/environment_role_manager_controller.rb
... ... @@ -2,7 +2,7 @@ class EnvironmentRoleManagerController &lt; AdminController
2 2 protect 'manage_environment_roles', :environment
3 3  
4 4 def index
5   - @admins = Person.find(:all, :conditions => ['role_assignments.resource_type = ?', 'Environment'], :include => :role_assignments )
  5 + @admins = Person.where('role_assignments.resource_type = ?', 'Environment').includes(:role_assignments)
6 6 end
7 7  
8 8 def change_roles
... ...
app/controllers/admin/features_controller.rb
1 1 class FeaturesController < AdminController
2 2 protect 'edit_environment_features', :environment
3   -
  3 +
4 4 def index
5 5 @features = Environment.available_features.sort_by{|k,v|v}
6 6 end
7 7  
8 8 post_only :update
9 9 def update
10   - if @environment.update_attributes(params[:environment])
  10 + if @environment.update(params[:environment])
11 11 session[:notice] = _('Features updated successfully.')
12 12 redirect_to :action => 'index'
13 13 else
... ... @@ -53,7 +53,7 @@ class FeaturesController &lt; AdminController
53 53  
54 54 def search_members
55 55 arg = params[:q].downcase
56   - result = environment.people.find(:all, :conditions => ['LOWER(name) LIKE ? OR identifier LIKE ?', "%#{arg}%", "%#{arg}%"])
  56 + result = environment.people.where('LOWER(name) LIKE ? OR identifier LIKE ?', "%#{arg}%", "%#{arg}%")
57 57 render :text => prepare_to_token_input(result).to_json
58 58 end
59 59  
... ...
app/controllers/admin/licenses_controller.rb
... ... @@ -23,7 +23,7 @@ class LicensesController &lt; AdminController
23 23 @license = environment.licenses.find(params[:license_id])
24 24 if request.post?
25 25 begin
26   - @license.update_attributes!(params[:license])
  26 + @license.update!(params[:license])
27 27 session[:notice] = _('License updated')
28 28 redirect_to :action => 'index'
29 29 rescue
... ...
app/controllers/admin/plugins_controller.rb
... ... @@ -8,7 +8,7 @@ class PluginsController &lt; AdminController
8 8 post_only :update
9 9 def update
10 10 params[:environment][:enabled_plugins].delete('')
11   - if @environment.update_attributes(params[:environment])
  11 + if @environment.update(params[:environment])
12 12 session[:notice] = _('Plugins updated successfully.')
13 13 else
14 14 session[:error] = _('Plugins were not updated successfully.')
... ...
app/controllers/admin/role_controller.rb
... ... @@ -29,7 +29,7 @@ class RoleController &lt; AdminController
29 29  
30 30 def update
31 31 @role = environment.roles.find(params[:id])
32   - if @role.update_attributes(params[:role])
  32 + if @role.update(params[:role])
33 33 redirect_to :action => 'show', :id => @role
34 34 else
35 35 session[:notice] = _('Failed to edit role')
... ...
app/controllers/admin/users_controller.rb
... ... @@ -63,7 +63,7 @@ class UsersController &lt; AdminController
63 63 respond_to do |format|
64 64 format.html
65 65 format.xml do
66   - users = User.find(:all, :conditions => {:environment_id => environment.id}, :include => [:person])
  66 + users = User.where(:environment_id => environment.id).includes(:person)
67 67 send_data users.to_xml(
68 68 :skip_types => true,
69 69 :only => %w[email login created_at updated_at],
... ...
app/controllers/application.rb
... ... @@ -1 +0,0 @@
1   -require 'application_controller'
app/controllers/application_controller.rb
... ... @@ -8,7 +8,7 @@ class ApplicationController &lt; ActionController::Base
8 8 before_filter :init_noosfero_plugins
9 9 before_filter :allow_cross_domain_access
10 10  
11   - before_filter :login_from_cookie
  11 + include AuthenticatedSystem
12 12 before_filter :require_login_for_environment, :if => :private_environment?
13 13  
14 14 before_filter :verify_members_whitelist, :if => [:private_environment?, :user]
... ... @@ -45,7 +45,7 @@ class ApplicationController &lt; ActionController::Base
45 45 include ApplicationHelper
46 46 layout :get_layout
47 47 def get_layout
48   - return nil if request.format == :js or request.xhr?
  48 + return false if request.format == :js or request.xhr?
49 49  
50 50 theme_layout = theme_option(:layout)
51 51 if theme_layout
... ... @@ -69,15 +69,12 @@ class ApplicationController &lt; ActionController::Base
69 69 helper :language
70 70  
71 71 include DesignHelper
72   -
73   - # Be sure to include AuthenticationSystem in Application Controller instead
74   - include AuthenticatedSystem
75 72 include PermissionCheck
76 73  
77 74 before_filter :set_locale
78 75 def set_locale
79 76 FastGettext.available_locales = environment.available_locales
80   - FastGettext.default_locale = environment.default_locale
  77 + FastGettext.default_locale = environment.default_locale || 'en'
81 78 FastGettext.locale = (params[:lang] || session[:lang] || environment.default_locale || request.env['HTTP_ACCEPT_LANGUAGE'] || 'en')
82 79 I18n.locale = FastGettext.locale.to_s.gsub '_', '-'
83 80 I18n.default_locale = FastGettext.default_locale.to_s.gsub '_', '-'
... ... @@ -148,7 +145,7 @@ class ApplicationController &lt; ActionController::Base
148 145 # Check if the requested profile belongs to another domain
149 146 if @profile && !params[:profile].blank? && params[:profile] != @profile.identifier
150 147 @profile = @environment.profiles.find_by_identifier params[:profile]
151   - redirect_to params.merge(:host => @profile.default_hostname)
  148 + redirect_to url_for(params.merge host: @profile.default_hostname)
152 149 end
153 150 end
154 151 end
... ... @@ -163,7 +160,8 @@ class ApplicationController &lt; ActionController::Base
163 160 def render_not_found(path = nil)
164 161 @no_design_blocks = true
165 162 @path ||= request.path
166   - render :template => 'shared/not_found.html.erb', :status => 404, :layout => get_layout
  163 + # force html template even if the browser asked for a image
  164 + render template: 'shared/not_found', status: 404, layout: get_layout, formats: [:html]
167 165 end
168 166 alias :render_404 :render_not_found
169 167  
... ... @@ -171,7 +169,8 @@ class ApplicationController &lt; ActionController::Base
171 169 @no_design_blocks = true
172 170 @message = message
173 171 @title = title
174   - render :template => 'shared/access_denied.html.erb', :status => 403
  172 + # force html template even if the browser asked for a image
  173 + render template: 'shared/access_denied', status: 403, formats: [:html]
175 174 end
176 175  
177 176 def load_category
... ... @@ -204,7 +203,7 @@ class ApplicationController &lt; ActionController::Base
204 203 def redirect_to_current_user
205 204 if params[:profile] == '~'
206 205 if logged_in?
207   - redirect_to params.merge(:profile => user.identifier)
  206 + redirect_to url_for(params.merge profile: user.identifier)
208 207 else
209 208 render_not_found
210 209 end
... ...
app/controllers/box_organizer_controller.rb
... ... @@ -84,9 +84,9 @@ class BoxOrganizerController &lt; ApplicationController
84 84 if request.xhr? and params[:query]
85 85 search = params[:query]
86 86 path_list = if boxes_holder.is_a?(Environment) && boxes_holder.enabled?('use_portal_community') && boxes_holder.portal_community
87   - boxes_holder.portal_community.articles.find(:all, :conditions=>"name ILIKE '%#{search}%' or path ILIKE '%#{search}%'", :limit=>20).map { |content| "/{portal}/"+content.path }
  87 + boxes_holder.portal_community.articles.where("name ILIKE ? OR path ILIKE ?", "%#{search}%", "%#{search}%").limit(20).map { |content| "/{portal}/"+content.path }
88 88 elsif boxes_holder.is_a?(Profile)
89   - boxes_holder.articles.find(:all, :conditions=>"name ILIKE '%#{search}%' or path ILIKE '%#{search}%'", :limit=>20).map { |content| "/{profile}/"+content.path }
  89 + boxes_holder.articles.where("name ILIKE ? OR path ILIKE ?", "%#{search}%", "%#{search}%").limit(20).map { |content| "/{profile}/"+content.path }
90 90 else
91 91 []
92 92 end
... ... @@ -98,7 +98,7 @@ class BoxOrganizerController &lt; ApplicationController
98 98  
99 99 def save
100 100 @block = boxes_holder.blocks.find(params[:id])
101   - @block.update_attributes(params[:block])
  101 + @block.update(params[:block])
102 102 redirect_to :action => 'index'
103 103 end
104 104  
... ...
app/controllers/my_profile/cms_controller.rb
... ... @@ -6,7 +6,7 @@ class CmsController &lt; MyProfileController
6 6  
7 7 def search_tags
8 8 arg = params[:term].downcase
9   - result = ActsAsTaggableOn::Tag.where('name ILIKE ?', "%#{arg}%").limit(10)
  9 + result = Tag.where('name ILIKE ?', "%#{arg}%").limit(10)
10 10 render :text => prepare_to_token_input_by_label(result).to_json, :content_type => 'application/json'
11 11 end
12 12  
... ... @@ -50,16 +50,9 @@ class CmsController &lt; MyProfileController
50 50  
51 51 def view
52 52 @article = profile.articles.find(params[:id])
53   - conditions = []
54   - if @article.has_posts?
55   - conditions = ['type != ?', 'RssFeed']
56   - end
57   -
58   - @articles = @article.children.reorder("case when type = 'Folder' then 0 when type ='Blog' then 1 else 2 end, updated_at DESC, name").paginate(
59   - :conditions => conditions,
60   - :per_page => per_page,
61   - :page => params[:npage]
62   - )
  53 + @articles = @article.children.reorder("case when type = 'Folder' then 0 when type ='Blog' then 1 else 2 end, updated_at DESC, name")
  54 + @articles = @articles.where "type <> ?", 'RssFeed' if @article.has_posts?
  55 + @articles = @articles.paginate per_page: per_page, page: params[:npage]
63 56 end
64 57  
65 58 def index
... ... @@ -99,7 +92,7 @@ class CmsController &lt; MyProfileController
99 92 @article.image.save!
100 93 end
101 94 @article.last_changed_by = user
102   - if @article.update_attributes(params[:article])
  95 + if @article.update(params[:article])
103 96 if !continue
104 97 if @article.content_type.nil? || @article.image?
105 98 success_redirect
... ... @@ -230,7 +223,7 @@ class CmsController &lt; MyProfileController
230 223 else
231 224 session[:notice] = _('File(s) successfully uploaded')
232 225 if @back_to
233   - redirect_to @back_to
  226 + redirect_to url_for(@back_to)
234 227 elsif @parent
235 228 redirect_to :action => 'view', :id => @parent.id
236 229 else
... ... @@ -381,7 +374,7 @@ class CmsController &lt; MyProfileController
381 374  
382 375 def search_article_privacy_exceptions
383 376 arg = params[:q].downcase
384   - result = profile.members.find(:all, :conditions => ['LOWER(name) LIKE ?', "%#{arg}%"])
  377 + result = profile.members.where('LOWER(name) LIKE ?', "%#{arg}%")
385 378 render :text => prepare_to_token_input(result).to_json
386 379 end
387 380  
... ...
app/controllers/my_profile/enterprise_validation_controller.rb
... ... @@ -54,7 +54,7 @@ class EnterpriseValidationController &lt; MyProfileController
54 54 def edit_validation_info
55 55 @info = profile.validation_info
56 56 if request.post?
57   - if @info.update_attributes(params[:info])
  57 + if @info.update(params[:info])
58 58 redirect_to :action => 'index'
59 59 end
60 60 end
... ...
app/controllers/my_profile/manage_products_controller.rb
... ... @@ -69,7 +69,7 @@ class ManageProductsController &lt; ApplicationController
69 69 field = params[:field]
70 70 if request.post?
71 71 begin
72   - @product.update_attributes!(params[:product])
  72 + @product.update!(params[:product])
73 73 render :partial => "display_#{field}", :locals => {:product => @product}
74 74 rescue Exception => e
75 75 render :partial => "edit_#{field}", :locals => {:product => @product, :errors => true}
... ... @@ -86,7 +86,7 @@ class ManageProductsController &lt; ApplicationController
86 86 @edit = true
87 87 @level = @category.level
88 88 if request.post?
89   - if @product.update_attributes({:product_category_id => params[:selected_category_id]}, :without_protection => true)
  89 + if @product.update({:product_category_id => params[:selected_category_id]}, :without_protection => true)
90 90 render :partial => 'shared/redirect_via_javascript',
91 91 :locals => { :url => url_for(:controller => 'manage_products', :action => 'show', :id => @product) }
92 92 else
... ... @@ -115,7 +115,7 @@ class ManageProductsController &lt; ApplicationController
115 115 @categories = ProductCategory.top_level_for(environment)
116 116 @level = 0
117 117 if request.post?
118   - if @input.update_attributes(:product_category_id => params[:selected_category_id])
  118 + if @input.update(:product_category_id => params[:selected_category_id])
119 119 @inputs = @product.inputs
120 120 render :partial => 'display_inputs'
121 121 else
... ... @@ -172,7 +172,7 @@ class ManageProductsController &lt; ApplicationController
172 172 @input = @profile.inputs.find_by_id(params[:id])
173 173 if @input
174 174 if request.post?
175   - if @input.update_attributes(params[:input])
  175 + if @input.update(params[:input])
176 176 render :partial => 'display_input', :locals => {:input => @input}
177 177 else
178 178 render :partial => 'edit_input'
... ...
app/controllers/my_profile/maps_controller.rb
... ... @@ -15,7 +15,7 @@ class MapsController &lt; MyProfileController
15 15 end
16 16  
17 17 Profile.transaction do
18   - if profile.update_attributes!(params[:profile_data])
  18 + if profile.update!(params[:profile_data])
19 19 BlockSweeper.expire_blocks profile.blocks.select{ |b| b.class == LocationBlock }
20 20 session[:notice] = _('Address was updated successfully!')
21 21 redirect_to :action => 'edit_location'
... ...
app/controllers/my_profile/profile_editor_controller.rb
... ... @@ -27,7 +27,7 @@ class ProfileEditorController &lt; MyProfileController
27 27 Image.transaction do
28 28 begin
29 29 @plugins.dispatch(:profile_editor_transaction_extras)
30   - @profile_data.update_attributes!(params[:profile_data])
  30 + @profile_data.update!(params[:profile_data])
31 31 redirect_to :action => 'index', :profile => profile.identifier
32 32 rescue Exception => ex
33 33 profile.identifier = params[:profile] if profile.identifier.blank?
... ... @@ -83,7 +83,7 @@ class ProfileEditorController &lt; MyProfileController
83 83 if @profile.destroy
84 84 session[:notice] = _('The profile was deleted.')
85 85 if(params[:return_to])
86   - redirect_to params[:return_to]
  86 + redirect_to url_for(params[:return_to])
87 87 else
88 88 redirect_to :controller => 'home'
89 89 end
... ... @@ -97,7 +97,7 @@ class ProfileEditorController &lt; MyProfileController
97 97 @welcome_page = profile.welcome_page || TinyMceArticle.new(:name => 'Welcome Page', :profile => profile, :published => false)
98 98 if request.post?
99 99 begin
100   - @welcome_page.update_attributes!(params[:welcome_page])
  100 + @welcome_page.update!(params[:welcome_page])
101 101 profile.welcome_page = @welcome_page
102 102 profile.save!
103 103 session[:notice] = _('Welcome page saved successfully.')
... ...
app/controllers/my_profile/profile_members_controller.rb
... ... @@ -47,7 +47,7 @@ class ProfileMembersController &lt; MyProfileController
47 47 end
48 48  
49 49 def remove_role
50   - @association = RoleAssignment.find(:all, :conditions => {:id => params[:id], :target_id => profile.id})
  50 + @association = RoleAssignment.where(:id => params[:id], :target_id => profile.id)
51 51 if @association.destroy
52 52 session[:notice] = 'Member succefully unassociated'
53 53 else
... ... @@ -120,7 +120,7 @@ class ProfileMembersController &lt; MyProfileController
120 120  
121 121 def search_user
122 122 role = Role.find(params[:role])
123   - render :text => environment.people.find(:all, :conditions => ['LOWER(name) LIKE ? OR LOWER(identifier) LIKE ?', "%#{params['q_'+role.key]}%", "%#{params['q_'+role.key]}%"]).
  123 + render :text => environment.people.where('LOWER(name) LIKE ? OR LOWER(identifier) LIKE ?', "%#{params['q_'+role.key]}%", "%#{params['q_'+role.key]}%").
124 124 select { |person| !profile.members_by_role(role).include?(person) }.
125 125 map {|person| {:id => person.id, :name => person.name} }.
126 126 to_json
... ...
app/controllers/my_profile/profile_roles_controller.rb
... ... @@ -58,7 +58,7 @@ class ProfileRolesController &lt; MyProfileController
58 58  
59 59 def update
60 60 @role = environment.roles.find(params[:id])
61   - if @role.update_attributes(params[:role])
  61 + if @role.update(params[:role])
62 62 redirect_to :action => 'show', :id => @role
63 63 else
64 64 session[:notice] = _('Failed to edit role')
... ...
app/controllers/my_profile/tasks_controller.rb
... ... @@ -48,7 +48,7 @@ class TasksController &lt; MyProfileController
48 48 if request.post? && VALID_DECISIONS.include?(decision) && id && decision != 'skip'
49 49 task = profile.find_in_all_tasks(id)
50 50 begin
51   - task.update_attributes(value[:task])
  51 + task.update(value[:task])
52 52 task.send(decision, current_person)
53 53 rescue Exception => ex
54 54 message = "#{task.title} (#{task.requestor ? task.requestor.name : task.author_name})"
... ... @@ -86,7 +86,7 @@ class TasksController &lt; MyProfileController
86 86 end
87 87  
88 88 def ticket_details
89   - @ticket = Ticket.find(:first, :conditions => ['(requestor_id = ? or target_id = ?) and id = ?', profile.id, profile.id, params[:id]])
  89 + @ticket = Ticket.where('(requestor_id = ? or target_id = ?) and id = ?', profile.id, profile.id, params[:id]).first
90 90 end
91 91  
92 92 end
... ...
app/controllers/public/account_controller.rb
... ... @@ -117,9 +117,9 @@ class AccountController &lt; ApplicationController
117 117 @user.signup!
118 118 owner_role = Role.find_by_name('owner')
119 119 @user.person.affiliate(@user.person, [owner_role]) if owner_role
120   - invitation = Task.find_by_code(@invitation_code)
  120 + invitation = Task.from_code(@invitation_code).first
121 121 if invitation
122   - invitation.update_attributes!({:friend => @user.person})
  122 + invitation.update! friend: @user.person
123 123 invitation.finish
124 124 end
125 125  
... ... @@ -209,7 +209,7 @@ class AccountController &lt; ApplicationController
209 209 #
210 210 # Posts back.
211 211 def new_password
212   - @change_password = ChangePassword.find_by_code(params[:code])
  212 + @change_password = ChangePassword.from_code(params[:code]).first
213 213  
214 214 unless @change_password
215 215 render :action => 'invalid_change_password_code', :status => 403
... ... @@ -218,7 +218,7 @@ class AccountController &lt; ApplicationController
218 218  
219 219 if request.post?
220 220 begin
221   - @change_password.update_attributes!(params[:change_password])
  221 + @change_password.update!(params[:change_password])
222 222 @change_password.finish
223 223 render :action => 'new_password_ok'
224 224 rescue ActiveRecord::RecordInvalid => e
... ... @@ -402,7 +402,7 @@ class AccountController &lt; ApplicationController
402 402 end
403 403  
404 404 def load_enterprise_activation
405   - @enterprise_activation ||= EnterpriseActivation.find_by_code(params[:enterprise_code])
  405 + @enterprise_activation ||= EnterpriseActivation.from_code(params[:enterprise_code]).first
406 406 end
407 407  
408 408 def load_enterprise
... ... @@ -426,7 +426,7 @@ class AccountController &lt; ApplicationController
426 426  
427 427 def go_to_initial_page
428 428 if params[:return_to]
429   - redirect_to params[:return_to]
  429 + redirect_to url_for(params[:return_to])
430 430 elsif environment.enabled?('allow_change_of_redirection_after_login')
431 431 check_redirection_options(user, user.preferred_login_redirection, user.admin_url)
432 432 else
... ... @@ -487,7 +487,7 @@ class AccountController &lt; ApplicationController
487 487 def check_redirection
488 488 unless params[:redirection].blank?
489 489 session[:return_to] = @user.return_to
490   - @user.update_attributes(:return_to => nil)
  490 + @user.update(:return_to => nil)
491 491 end
492 492 end
493 493  
... ...
app/controllers/public/chat_controller.rb
... ... @@ -67,7 +67,7 @@ class ChatController &lt; PublicController
67 67  
68 68 def update_presence_status
69 69 if request.xhr?
70   - current_user.update_attributes({:chat_status_at => DateTime.now}.merge(params[:status] || {}))
  70 + current_user.update({:chat_status_at => DateTime.now}.merge(params[:status] || {}))
71 71 end
72 72 render :nothing => true
73 73 end
... ...
app/controllers/public/comment_controller.rb
... ... @@ -78,7 +78,7 @@ class CommentController &lt; ApplicationController
78 78 respond_to do |format|
79 79 format.js do
80 80 comment_to_render = @comment.comment_root
81   - render :json => {
  81 + render :json => {
82 82 :render_target => comment_to_render.anchor,
83 83 :html => render_to_string(:partial => 'comment', :locals => {:comment => comment_to_render, :display_link => true}),
84 84 :msg => _('Comment successfully created.')
... ... @@ -114,7 +114,7 @@ class CommentController &lt; ApplicationController
114 114 end
115 115  
116 116 def update
117   - if @comment.update_attributes(params[:comment])
  117 + if @comment.update(params[:comment])
118 118 @plugins.dispatch(:process_extra_comment_params, [@comment,params])
119 119  
120 120 respond_to do |format|
... ...
app/controllers/public/enterprise_registration_controller.rb
... ... @@ -4,7 +4,7 @@ class EnterpriseRegistrationController &lt; ApplicationController
4 4 before_filter :login_required
5 5  
6 6 # Just go to the first step.
7   - #
  7 + #
8 8 # FIXME: shouldn't this action present some sort of welcome message and point
9 9 # to the first step explicitly?
10 10 def index
... ... @@ -15,7 +15,7 @@ class EnterpriseRegistrationController &lt; ApplicationController
15 15 @create_enterprise.target = Profile.find(params[:create_enterprise][:target_id])
16 16 end
17 17 elsif @validation == :admin || @validation == :none
18   - @create_enterprise.target = environment
  18 + @create_enterprise.target = environment
19 19 end
20 20 @create_enterprise.requestor = user
21 21 the_action =
... ... @@ -40,7 +40,7 @@ class EnterpriseRegistrationController &lt; ApplicationController
40 40  
41 41 protected
42 42  
43   - # Fill in the form and select your Region.
  43 + # Fill in the form and select your Region.
44 44 #
45 45 # Posts back.
46 46 def basic_information
... ...
app/controllers/public/profile_controller.rb
... ... @@ -37,7 +37,7 @@ class ProfileController &lt; PublicController
37 37  
38 38 def tag_feed
39 39 @tag = params[:id]
40   - tagged = profile.articles.paginate(:per_page => 20, :page => 1, :order => 'published_at DESC', :include => :tags, :conditions => ['tags.name LIKE ?', @tag])
  40 + tagged = profile.articles.paginate(:per_page => 20, :page => 1).order('published_at DESC').joins(:tags).where('tags.name LIKE ?', @tag)
41 41 feed_writer = FeedWriter.new
42 42 data = feed_writer.write(
43 43 tagged,
... ... @@ -205,7 +205,7 @@ class ProfileController &lt; PublicController
205 205  
206 206 def more_comments
207 207 profile_filter = @profile.person? ? {:user_id => @profile} : {:target_id => @profile}
208   - activity = ActionTracker::Record.find(:first, :conditions => {:id => params[:activity]}.merge(profile_filter))
  208 + activity = ActionTracker::Record.where({:id => params[:activity]}.merge profile_filter).first
209 209 comments_count = activity.comments.count
210 210 comment_page = (params[:comment_page] || 1).to_i
211 211 comments_per_page = 5
... ... @@ -225,7 +225,7 @@ class ProfileController &lt; PublicController
225 225 end
226 226  
227 227 def more_replies
228   - activity = Scrap.find(:first, :conditions => {:id => params[:activity], :receiver_id => @profile, :scrap_id => nil})
  228 + activity = Scrap.where(:id => params[:activity], :receiver_id => @profile, :scrap_id => nil).first
229 229 comments_count = activity.replies.count
230 230 comment_page = (params[:comment_page] || 1).to_i
231 231 comments_per_page = 5
... ... @@ -272,7 +272,7 @@ class ProfileController &lt; PublicController
272 272 def remove_notification
273 273 begin
274 274 raise if !can_edit_profile
275   - notification = ActionTrackerNotification.find(:first, :conditions => {:profile_id => profile.id, :action_tracker_id => params[:activity_id]})
  275 + notification = ActionTrackerNotification.where(profile_id: profile.id, action_tracker_id: params[:activity_id]).first
276 276 notification.destroy
277 277 render :text => _('Notification successfully removed.')
278 278 rescue
... ...
app/controllers/public/search_controller.rb
... ... @@ -14,7 +14,7 @@ class SearchController &lt; PublicController
14 14 # Backwards compatibility with old URLs
15 15 def redirect_asset_param
16 16 return unless params.has_key?(:asset)
17   - redirect_to params.merge(:action => params.delete(:asset))
  17 + redirect_to url_for(params.merge action: params.delete(:asset))
18 18 end
19 19  
20 20 no_design_blocks
... ... @@ -62,12 +62,12 @@ class SearchController &lt; PublicController
62 62 end
63 63  
64 64 def articles
65   - @scope = @environment.articles.public
  65 + @scope = @environment.articles.is_public
66 66 full_text_search
67 67 end
68 68  
69 69 def contents
70   - redirect_to params.merge(:action => :articles)
  70 + redirect_to url_for(params.merge action: :articles)
71 71 end
72 72  
73 73 def people
... ... @@ -122,7 +122,7 @@ class SearchController &lt; PublicController
122 122 # keep old URLs workings
123 123 def assets
124 124 params[:action] = params[:asset].is_a?(Array) ? :index : params.delete(:asset)
125   - redirect_to params
  125 + redirect_to url_for(params)
126 126 end
127 127  
128 128 def tags
... ...
app/helpers/application_helper.rb
... ... @@ -8,6 +8,10 @@ module ApplicationHelper
8 8  
9 9 include PermissionNameHelper
10 10  
  11 + include UrlHelper
  12 +
  13 + include PartialsHelper
  14 +
11 15 include ModalHelper
12 16  
13 17 include BoxesHelper
... ... @@ -281,36 +285,6 @@ module ApplicationHelper
281 285 concat(content_tag('div', capture(&block).to_s + tag('br', :style => 'clear: left;'), options))
282 286 end
283 287  
284   -
285   - def partial_for_class_in_view_path(klass, view_path, prefix = nil, suffix = nil)
286   - return nil if klass.nil?
287   - name = [prefix, klass.name.underscore, suffix].compact.map(&:to_s).join('_')
288   -
289   - search_name = String.new(name)
290   - if search_name.include?("/")
291   - search_name.gsub!(/(\/)([^\/]*)$/,'\1_\2')
292   - name = File.join(params[:controller], name) if defined?(params) && params[:controller]
293   - else
294   - search_name = "_" + search_name
295   - end
296   -
297   - path = defined?(params) && params[:controller] ? File.join(view_path, params[:controller], search_name + '.html.erb') : File.join(view_path, search_name + '.html.erb')
298   - return name if File.exists?(File.join(path))
299   -
300   - partial_for_class_in_view_path(klass.superclass, view_path, prefix, suffix)
301   - end
302   -
303   - def partial_for_class(klass, prefix=nil, suffix=nil)
304   - raise ArgumentError, 'No partial for object. Is there a partial for any class in the inheritance hierarchy?' if klass.nil?
305   - name = klass.name.underscore
306   - controller.view_paths.each do |view_path|
307   - partial = partial_for_class_in_view_path(klass, view_path, prefix, suffix)
308   - return partial if partial
309   - end
310   -
311   - raise ArgumentError, 'No partial for object. Is there a partial for any class in the inheritance hierarchy?'
312   - end
313   -
314 288 def render_profile_actions klass
315 289 name = klass.to_s.underscore
316 290 begin
... ... @@ -907,8 +881,14 @@ module ApplicationHelper
907 881 end
908 882 alias :top_url :base_url
909 883  
  884 + class View < ActionView::Base
  885 + def url_for *args
  886 + self.controller.url_for *args
  887 + end
  888 + end
  889 +
910 890 def helper_for_article(article)
911   - article_helper = ActionView::Base.new
  891 + article_helper = View.new
912 892 article_helper.controller = controller
913 893 article_helper.extend ArticleHelper
914 894 article_helper.extend Rails.application.routes.url_helpers
... ...
app/helpers/block_helper.rb
... ... @@ -19,7 +19,7 @@ module BlockHelper
19 19 content_tag('span', _('Title')) +
20 20 text_field_tag('block[images][][title]', image[:title], :class => 'highlight-title', :size => 45)
21 21 }</label></td>
22   - <td>#{button_without_text(:delete, _('Remove'), '#', class: 'delete-highlight', :confirm=>_('Are you sure you want to remove this highlight'))}</td>
  22 + <td>#{button_without_text(:delete, _('Remove'), '#', class: 'delete-highlight', data: {confirm: _('Are you sure you want to remove this highlight')})}</td>
23 23 </tr>
24 24 "
25 25 end
... ...
app/helpers/boxes_helper.rb
... ... @@ -236,7 +236,7 @@ module BoxesHelper
236 236 end
237 237  
238 238 if movable?(block) && !block.main?
239   - buttons << icon_button(:delete, _('Remove block'), { :action => 'remove', :id => block.id }, { :method => 'post', :confirm => _('Are you sure you want to remove this block?')})
  239 + buttons << icon_button(:delete, _('Remove block'), { action: 'remove', id: block.id }, method: 'post', data: {confirm: _('Are you sure you want to remove this block?')})
240 240 buttons << icon_button(:clone, _('Clone'), { :action => 'clone_block', :id => block.id }, { :method => 'post' })
241 241 end
242 242  
... ...
app/helpers/cms_helper.rb
... ... @@ -34,7 +34,7 @@ module CmsHelper
34 34 end
35 35  
36 36 def display_delete_button(article)
37   - expirable_button article, :delete, _('Delete'), { :action => 'destroy', :id => article.id }, :method => :post, :confirm => delete_article_message(article)
  37 + expirable_button article, :delete, _('Delete'), { :action => 'destroy', :id => article.id }, :method => :post, 'data-confirm' => delete_article_message(article)
38 38 end
39 39  
40 40 def expirable_button(content, action, title, url, options = {})
... ... @@ -42,7 +42,7 @@ module CmsHelper
42 42 if reason.present?
43 43 options[:class] = (options[:class] || '') + ' disabled'
44 44 options[:disabled] = 'disabled'
45   - options.delete(:confirm)
  45 + options.delete('data-confirm')
46 46 options.delete(:method)
47 47 title = reason
48 48 end
... ...
app/helpers/events_helper.rb
... ... @@ -24,7 +24,7 @@ module EventsHelper
24 24 end
25 25  
26 26 def populate_calendar(selected_date, events)
27   - events.reject! {|event| !event.display_to?(user)}
  27 + events = events.reject{ |event| !event.display_to? user }
28 28 calendar = Event.date_range(selected_date.year, selected_date.month).map do |date|
29 29 [
30 30 # the day itself
... ...
app/helpers/folder_helper.rb
... ... @@ -5,13 +5,11 @@ module FolderHelper
5 5 def list_contents(configure={})
6 6 configure[:recursive] ||= false
7 7 configure[:list_type] ||= :folder
8   - if !configure[:contents].blank?
9   - configure[:contents] = configure[:contents].paginate(
10   - :order => "name ASC",
11   - :per_page => 30,
12   - :page => params[:npage]
13   - )
14   -
  8 + contents = configure[:contents]
  9 + contents = contents.order('name ASC') unless contents.is_a? Array
  10 + contents = contents.paginate per_page: 30, page: params[:npage]
  11 + configure[:contents] = contents
  12 + if contents.present?
15 13 render :file => 'shared/content_list', :locals => configure
16 14 else
17 15 content_tag('em', _('(empty folder)'))
... ...
app/helpers/partials_helper.rb 0 → 100644
... ... @@ -0,0 +1,43 @@
  1 +module PartialsHelper
  2 +
  3 + def partial_for_class_in_view_path(klass, view_path, prefix = nil, suffix = nil)
  4 + return nil if klass.nil?
  5 + name = [prefix, klass.name.underscore, suffix].compact.map(&:to_s).join('_')
  6 +
  7 + search_name = String.new(name)
  8 + if search_name.include?("/")
  9 + search_name.gsub!(/(\/)([^\/]*)$/,'\1_\2')
  10 + name = File.join(params[:controller], name) if defined?(params) && params[:controller]
  11 + else
  12 + search_name = "_" + search_name
  13 + end
  14 +
  15 + path = defined?(params) && params[:controller] ? File.join(view_path, params[:controller], search_name + '.html.erb') : File.join(view_path, search_name + '.html.erb')
  16 + return name if File.exists?(File.join(path))
  17 +
  18 + partial_for_class_in_view_path(klass.superclass, view_path, prefix, suffix)
  19 + end
  20 +
  21 + def partial_for_class(klass, prefix=nil, suffix=nil)
  22 + raise ArgumentError, 'No partial for object. Is there a partial for any class in the inheritance hierarchy?' if klass.nil?
  23 + name = klass.name.underscore
  24 + controller.view_paths.each do |view_path|
  25 + partial = partial_for_class_in_view_path(klass, view_path, prefix, suffix)
  26 + return partial if partial
  27 + end
  28 +
  29 + raise ArgumentError, 'No partial for object. Is there a partial for any class in the inheritance hierarchy?'
  30 + end
  31 +
  32 + def render_partial_for_class klass, *args
  33 + raise ArgumentError, 'No partial for object. Is there a partial for any class in the inheritance hierarchy?' if klass.nil?
  34 + begin
  35 + partial = klass.name.underscore
  36 + partial = "#{params[:controller]}/#{partial}" if params[:controller] and partial.index '/'
  37 + return render partial, *args
  38 + rescue ActionView::MissingTemplate
  39 + return render_partial_for_class klass.superclass, *args
  40 + end
  41 + end
  42 +
  43 +end
... ...
app/helpers/url_helper.rb 0 → 100644
... ... @@ -0,0 +1,7 @@
  1 +module UrlHelper
  2 +
  3 + def back_url
  4 + 'javascript:history.back()'
  5 + end
  6 +
  7 +end
... ...
app/mailers/application_mailer.rb 0 → 100644
... ... @@ -0,0 +1,18 @@
  1 +require_relative '../helpers/application_helper'
  2 +
  3 +class ApplicationMailer < ActionMailer::Base
  4 +
  5 + include AuthenticatedSystem
  6 +
  7 + helper ApplicationHelper
  8 +
  9 + attr_accessor :environment
  10 +
  11 + def default_url_options options = nil
  12 + options ||= {}
  13 + options[:host] = environment.default_hostname if environment
  14 + options
  15 + end
  16 +
  17 +end
  18 +
... ...
app/mailers/comment_notifier.rb
1   -class CommentNotifier < ActionMailer::Base
  1 +class CommentNotifier < ApplicationMailer
  2 +
2 3 def notification(comment)
3 4 profile = comment.article.profile
  5 + self.environment = profile.environment
4 6 @recipient = profile.nickname || profile.name
5 7 @sender = comment.author_name
6 8 @sender_link = comment.author_link
... ... @@ -8,7 +10,6 @@ class CommentNotifier &lt; ActionMailer::Base
8 10 @comment_url = comment.url
9 11 @comment_title = comment.title
10 12 @comment_body = comment.body
11   - @environment = profile.environment.name
12 13 @url = profile.environment.top_url
13 14  
14 15 mail(
... ... @@ -20,6 +21,8 @@ class CommentNotifier &lt; ActionMailer::Base
20 21  
21 22 def mail_to_followers(comment, emails)
22 23 profile = comment.article.profile
  24 + self.environment = profile.environment
  25 +
23 26 @recipient = profile.nickname || profile.name
24 27 @sender = comment.author_name
25 28 @sender_link = comment.author_link
... ... @@ -28,7 +31,6 @@ class CommentNotifier &lt; ActionMailer::Base
28 31 @unsubscribe_url = comment.article.view_url.merge({:unfollow => true})
29 32 @comment_title = comment.title
30 33 @comment_body = comment.body
31   - @environment = profile.environment.name
32 34 @url = profile.environment.top_url
33 35  
34 36 mail(
... ...
app/mailers/contact.rb
... ... @@ -30,14 +30,16 @@ class Contact
30 30 Contact::Sender.notification(self).deliver
31 31 end
32 32  
33   - class Sender < ActionMailer::Base
  33 + class Sender < ApplicationMailer
  34 +
34 35 def notification(contact)
  36 + self.environment = contact.dest.environment
  37 +
35 38 @name = contact.name
36 39 @email = contact.email
37 40 @city = contact.city
38 41 @state = contact.state
39 42 @message = contact.message
40   - @environment = contact.dest.environment.name
41 43 @url = url_for(:host => contact.dest.environment.default_hostname, :controller => 'home')
42 44 @target = contact.dest.name
43 45  
... ...
app/mailers/environment_mailing.rb
1 1 class EnvironmentMailing < Mailing
2 2  
3 3 def recipients(offset=0, limit=100)
4   - source.people.all(:order => :id, :offset => offset, :limit => limit, :joins => "LEFT OUTER JOIN mailing_sents m ON (m.mailing_id = #{id} AND m.person_id = profiles.id)", :conditions => { "m.person_id" => nil })
  4 + source.people.order(:id).offset(offset).limit(limit)
  5 + .joins("LEFT OUTER JOIN mailing_sents m ON (m.mailing_id = #{id} AND m.person_id = profiles.id)")
  6 + .where("m.person_id" => nil)
5 7 end
6 8  
7 9 def each_recipient
... ...
app/mailers/mailing.rb
... ... @@ -46,7 +46,8 @@ class Mailing &lt; ActiveRecord::Base
46 46 end
47 47 end
48 48  
49   - class Sender < ActionMailer::Base
  49 + class Sender < ApplicationMailer
  50 +
50 51 def notification(mailing, recipient)
51 52 @message = mailing.body
52 53 @signature_message = mailing.signature_message
... ...
app/mailers/organization_mailing.rb
... ... @@ -5,7 +5,9 @@ class OrganizationMailing &lt; Mailing
5 5 end
6 6  
7 7 def recipients(offset=0, limit=100)
8   - source.members.all(:order => :id, :offset => offset, :limit => limit, :joins => "LEFT OUTER JOIN mailing_sents m ON (m.mailing_id = #{id} AND m.person_id = profiles.id)", :conditions => { "m.person_id" => nil })
  8 + source.members.order(:id).offset(offset).limit(limit)
  9 + .joins("LEFT OUTER JOIN mailing_sents m ON (m.mailing_id = #{id} AND m.person_id = profiles.id)")
  10 + .where("m.person_id" => nil)
9 11 end
10 12  
11 13 def each_recipient
... ...
app/mailers/pending_task_notifier.rb
1   -class PendingTaskNotifier < ActionMailer::Base
  1 +class PendingTaskNotifier < ApplicationMailer
2 2  
3 3 def notification(person)
  4 + self.environment = person.environment
  5 +
4 6 @person = person
5 7 @tasks = person.tasks.pending
6 8 @organizations_with_pending_tasks = person.organizations_with_pending_tasks
7   - @environment = person.environment.name
8 9 @url = url_for(:host => person.environment.default_hostname, :controller => 'home')
9 10 @default_hostname = person.environment.default_hostname
10 11 @url_for_pending_tasks = url_for(:host => person.environment.default_hostname, :controller => 'tasks', :profile => person.identifier)
... ...
app/mailers/scrap_notifier.rb
1   -class ScrapNotifier < ActionMailer::Base
  1 +class ScrapNotifier < ApplicationMailer
  2 +
2 3 def notification(scrap)
3 4 sender, receiver = scrap.sender, scrap.receiver
  5 + self.environment = sender.environment
4 6 # for tests
5 7 return unless receiver.email
6 8  
... ... @@ -9,7 +11,6 @@ class ScrapNotifier &lt; ActionMailer::Base
9 11 @sender_link = sender.url
10 12 @scrap_content = scrap.content
11 13 @wall_url = scrap.scrap_wall_url
12   - @environment = sender.environment.name
13 14 @url = sender.environment.top_url
14 15 mail(
15 16 to: receiver.email,
... ...
app/mailers/task_mailer.rb
1   -class TaskMailer < ActionMailer::Base
  1 +class TaskMailer < ApplicationMailer
2 2  
3 3 def target_notification(task, message)
  4 + self.environment = task.environment
  5 +
4 6 @message = extract_message(message)
5 7 @target = task.target.name
6   - @environment = task.environment.name
7 8 @url = generate_environment_url(task, :controller => 'home')
8 9 url_for_tasks_list = task.target.kind_of?(Environment) ? '' : url_for(task.target.tasks_url.merge(:script_name => Noosfero.root('/')))
9 10 @tasks_url = url_for_tasks_list
... ... @@ -16,6 +17,8 @@ class TaskMailer &lt; ActionMailer::Base
16 17 end
17 18  
18 19 def invitation_notification(task)
  20 + self.environment = task.requestor.environment
  21 +
19 22 msg = task.expanded_message
20 23 @message = msg.gsub /<url>/, generate_environment_url(task, :controller => 'account', :action => 'signup', :invitation_code => task.code)
21 24  
... ... @@ -27,11 +30,12 @@ class TaskMailer &lt; ActionMailer::Base
27 30 end
28 31  
29 32 def generic_message(name, task)
  33 + self.environment = task.requestor.environment
  34 +
30 35 return if !task.respond_to?("#{name}_message")
31 36  
32 37 @message = extract_message(task.send("#{name}_message"))
33 38 @requestor = task.requestor.name
34   - @environment = task.requestor.environment.name
35 39 @url = url_for(:host => task.requestor.environment.default_hostname, :controller => 'home')
36 40  
37 41 mail(
... ...
app/mailers/user_mailer.rb
1   -class UserMailer < ActionMailer::Base
  1 +class UserMailer < ApplicationMailer
  2 +
2 3 def activation_email_notify(user)
  4 + self.environment = user.environment
  5 +
3 6 user_email = "#{user.login}@#{user.email_domain}"
4 7 @name = user.name
5 8 @email = user_email
6 9 @webmail = MailConf.webmail_url(user.login, user.email_domain)
7   - @environment = user.environment.name
8 10 @url = url_for(:host => user.environment.default_hostname, :controller => 'home')
9 11  
10 12 mail(
... ... @@ -15,9 +17,10 @@ class UserMailer &lt; ActionMailer::Base
15 17 end
16 18  
17 19 def activation_code(user)
  20 + self.environment = user.environment
  21 +
18 22 @recipient = user.name
19 23 @activation_code = user.activation_code
20   - @environment = user.environment.name
21 24 @url = user.environment.top_url
22 25 @redirection = (true if user.return_to)
23 26 @join = (user.community_to_join if user.community_to_join)
... ... @@ -30,6 +33,8 @@ class UserMailer &lt; ActionMailer::Base
30 33 end
31 34  
32 35 def signup_welcome_email(user)
  36 + self.environment = user.environment
  37 +
33 38 @body = user.environment.signup_welcome_text_body.gsub('{user_name}', user.name)
34 39 email_subject = user.environment.signup_welcome_text_subject
35 40 mail(
... ... @@ -42,8 +47,9 @@ class UserMailer &lt; ActionMailer::Base
42 47 end
43 48  
44 49 def profiles_suggestions_email(user)
  50 + self.environment = user.environment
  51 +
45 52 @recipient = user.name
46   - @environment = user.environment.name
47 53 @url = user.environment.top_url
48 54 @people_suggestions_url = user.people_suggestions_url
49 55 @people_suggestions = user.suggested_people.sample(3)
... ...
app/models/add_member.rb
... ... @@ -11,7 +11,7 @@ class AddMember &lt; Task
11 11 alias :organization :target
12 12 alias :organization= :target=
13 13  
14   - settings_items :roles
  14 + settings_items :roles, type: Array
15 15  
16 16 after_create do |task|
17 17 remove_from_suggestion_list(task)
... ...
app/models/approve_comment.rb
... ... @@ -8,7 +8,7 @@ class ApproveComment &lt; Task
8 8 def comment
9 9 unless @comment || self.comment_attributes.nil?
10 10 @comment = Comment.new
11   - @comment.assign_attributes(ActiveSupport::JSON.decode(self.comment_attributes), :without_protection => true)
  11 + @comment.assign_attributes(ActiveSupport::JSON.decode(self.comment_attributes.to_s), :without_protection => true)
12 12 end
13 13 @comment
14 14 end
... ...
app/models/article.rb
... ... @@ -79,7 +79,7 @@ class Article &lt; ActiveRecord::Base
79 79  
80 80 has_many :comments, :class_name => 'Comment', :foreign_key => 'source_id', :dependent => :destroy, :order => 'created_at asc'
81 81  
82   - has_many :article_categorizations, :conditions => [ 'articles_categories.virtual = ?', false ]
  82 + has_many :article_categorizations, -> { where 'articles_categories.virtual = ?', false }
83 83 has_many :categories, :through => :article_categorizations
84 84  
85 85 has_many :article_categorizations_including_virtual, :class_name => 'ArticleCategorization'
... ... @@ -131,17 +131,15 @@ class Article &lt; ActiveRecord::Base
131 131  
132 132 xss_terminate :only => [ :name ], :on => 'validation', :with => 'white_list'
133 133  
134   - scope :in_category, lambda { |category|
135   - {:include => 'categories_including_virtual', :conditions => { 'categories.id' => category.id }}
  134 + scope :in_category, -> category {
  135 + includes('categories_including_virtual').where('categories.id' => category.id)
136 136 }
137 137  
138 138 include TimeScopes
139 139  
140   - scope :by_range, lambda { |range| {
141   - :conditions => [
142   - 'articles.published_at BETWEEN :start_date AND :end_date', { :start_date => range.first, :end_date => range.last }
143   - ]
144   - }}
  140 + scope :by_range, -> range {
  141 + where 'articles.published_at BETWEEN :start_date AND :end_date', { start_date: range.first, end_date: range.last }
  142 + }
145 143  
146 144 URL_FORMAT = /\A(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(([0-9]{1,5})?\/.*)?\Z/ix
147 145  
... ... @@ -263,19 +261,21 @@ class Article &lt; ActiveRecord::Base
263 261  
264 262 # retrieves all articles belonging to the given +profile+ that are not
265 263 # sub-articles of any other article.
266   - scope :top_level_for, lambda { |profile|
267   - {:conditions => [ 'parent_id is null and profile_id = ?', profile.id ]}
  264 + scope :top_level_for, -> profile {
  265 + where 'parent_id is null and profile_id = ?', profile.id
268 266 }
269 267  
270   - scope :public,
271   - :conditions => [ "advertise = ? AND published = ? AND profiles.visible = ? AND profiles.public_profile = ?", true, true, true, true ], :joins => [:profile]
  268 + scope :is_public, -> {
  269 + joins(:profile).
  270 + where("articles.advertise = ? AND articles.published = ? AND profiles.visible = ? AND profiles.public_profile = ?", true, true, true, true)
  271 + }
272 272  
273   - scope :more_recent,
274   - :conditions => [ "advertise = ? AND published = ? AND profiles.visible = ? AND profiles.public_profile = ? AND
275   - ((articles.type != ?) OR articles.type is NULL)",
276   - true, true, true, true, 'RssFeed'
277   - ],
278   - :order => 'articles.published_at desc, articles.id desc'
  273 + scope :more_recent, -> {
  274 + order('articles.published_at desc, articles.id desc')
  275 + .where("articles.advertise = ? AND articles.published = ? AND profiles.visible = ? AND profiles.public_profile = ? AND
  276 + ((articles.type != ?) OR articles.type is NULL)",
  277 + true, true, true, true, 'RssFeed')
  278 + }
279 279  
280 280 # retrives the most commented articles, sorted by the comment count (largest
281 281 # first)
... ... @@ -283,12 +283,14 @@ class Article &lt; ActiveRecord::Base
283 283 paginate(:order => 'comments_count DESC', :page => 1, :per_page => limit)
284 284 end
285 285  
286   - scope :more_popular, :order => 'hits DESC'
287   - scope :relevant_as_recent, :conditions => ["(articles.type != 'UploadedFile' and articles.type != 'RssFeed' and articles.type != 'Blog') OR articles.type is NULL"]
  286 + scope :more_popular, -> { order 'hits DESC' }
  287 + scope :relevant_as_recent, -> {
  288 + where "(articles.type != 'UploadedFile' and articles.type != 'RssFeed' and articles.type != 'Blog') OR articles.type is NULL"
  289 + }
288 290  
289 291 def self.recent(limit = nil, extra_conditions = {}, pagination = true)
290 292 result = scoped({:conditions => extra_conditions}).
291   - public.
  293 + is_public.
292 294 relevant_as_recent.
293 295 limit(limit).
294 296 order(['articles.published_at desc', 'articles.id desc'])
... ... @@ -413,7 +415,7 @@ class Article &lt; ActiveRecord::Base
413 415 self.translations.map(&:language)
414 416 end
415 417  
416   - scope :native_translations, :conditions => { :translation_of_id => nil }
  418 + scope :native_translations, -> { where :translation_of_id => nil }
417 419  
418 420 def translatable?
419 421 false
... ... @@ -455,7 +457,7 @@ class Article &lt; ActiveRecord::Base
455 457  
456 458 def rotate_translations
457 459 unless self.translations.empty?
458   - rotate = self.translations
  460 + rotate = self.translations.all
459 461 root = rotate.shift
460 462 root.update_attribute(:translation_of_id, nil)
461 463 root.translations = rotate
... ... @@ -468,7 +470,7 @@ class Article &lt; ActiveRecord::Base
468 470 elsif self.native_translation.language == locale
469 471 self.native_translation
470 472 else
471   - self.native_translation.translations.first(:conditions => { :language => locale })
  473 + self.native_translation.translations.where(:language => locale).first
472 474 end
473 475 end
474 476  
... ... @@ -492,19 +494,19 @@ class Article &lt; ActiveRecord::Base
492 494 ['TextArticle', 'TextileArticle', 'TinyMceArticle']
493 495 end
494 496  
495   - scope :published, :conditions => ['articles.published = ?', true]
496   - scope :folders, lambda {|profile|{:conditions => ['articles.type IN (?)', profile.folder_types] }}
497   - scope :no_folders, lambda {|profile|{:conditions => ['articles.type NOT IN (?)', profile.folder_types]}}
498   - scope :galleries, :conditions => [ "articles.type IN ('Gallery')" ]
499   - scope :images, :conditions => { :is_image => true }
500   - scope :no_images, :conditions => { :is_image => false }
501   - scope :text_articles, :conditions => [ 'articles.type IN (?)', text_article_types ]
502   - scope :files, :conditions => { :type => 'UploadedFile' }
503   - scope :with_types, lambda { |types| { :conditions => [ 'articles.type IN (?)', types ] } }
  497 + scope :published, -> { where 'articles.published = ?', true }
  498 + scope :folders, -> profile { where 'articles.type IN (?)', profile.folder_types }
  499 + scope :no_folders, -> profile { where 'articles.type NOT IN (?)', profile.folder_types }
  500 + scope :galleries, -> { where "articles.type IN ('Gallery')" }
  501 + scope :images, -> { where :is_image => true }
  502 + scope :no_images, -> { where :is_image => false }
  503 + scope :text_articles, -> { where 'articles.type IN (?)', text_article_types }
  504 + scope :files, -> { where :type => 'UploadedFile' }
  505 + scope :with_types, -> types { where 'articles.type IN (?)', types }
504 506  
505   - scope :more_popular, :order => 'hits DESC'
506   - scope :more_comments, :order => "comments_count DESC"
507   - scope :more_recent, :order => "created_at DESC"
  507 + scope :more_popular, -> { order 'hits DESC' }
  508 + scope :more_comments, -> { order "comments_count DESC" }
  509 + scope :more_recent, -> { order "created_at DESC" }
508 510  
509 511 scope :display_filter, lambda {|user, profile|
510 512 return published if (user.nil? && profile && profile.public?)
... ... @@ -626,7 +628,7 @@ class Article &lt; ActiveRecord::Base
626 628 ]
627 629  
628 630 def self.find_by_old_path(old_path)
629   - find(:first, :include => :versions, :conditions => ['article_versions.path = ?', old_path], :order => 'article_versions.id desc')
  631 + self.includes(:versions).where('article_versions.path = ?', old_path).order('article_versions.id DESC').first
630 632 end
631 633  
632 634 def hit
... ... @@ -704,11 +706,11 @@ class Article &lt; ActiveRecord::Base
704 706 end
705 707  
706 708 def get_version(version_number = nil)
707   - version_number ? versions.find(:first, :order => 'version', :offset => version_number - 1) : versions.earliest
  709 + if version_number then self.versions.order('version').offset(version_number - 1).first else self.versions.earliest end
708 710 end
709 711  
710 712 def author_by_version(version_number = nil)
711   - version_number ? profile.environment.people.find_by_id(get_version(version_number).author_id) : author
  713 + if version_number then profile.environment.people.where(id: get_version(version_number).author_id).first else author end
712 714 end
713 715  
714 716 def author_name(version_number = nil)
... ... @@ -804,7 +806,7 @@ class Article &lt; ActiveRecord::Base
804 806 end
805 807  
806 808 def activity
807   - ActionTracker::Record.find_by_target_type_and_target_id 'Article', self.id
  809 + ActionTracker::Record.where(target_type: 'Article', target_id: self.id).first
808 810 end
809 811  
810 812 def create_activity
... ...
app/models/article_categorization.rb
1 1 class ArticleCategorization < ActiveRecord::Base
2   - set_table_name :articles_categories
  2 + self.table_name = :articles_categories
  3 +
3 4 belongs_to :article
4 5 belongs_to :category
5 6  
... ...
app/models/block.rb
... ... @@ -20,7 +20,7 @@ class Block &lt; ActiveRecord::Base
20 20  
21 21 acts_as_having_settings
22 22  
23   - scope :enabled, :conditions => { :enabled => true }
  23 + scope :enabled, -> { where :enabled => true }
24 24  
25 25 after_save do |block|
26 26 if block.owner.kind_of?(Profile) && block.owner.is_template? && block.mirror?
... ...
app/models/blog_archives_block.rb
... ... @@ -15,7 +15,7 @@ class BlogArchivesBlock &lt; Block
15 15 _('Blog posts')
16 16 end
17 17  
18   - settings_items :blog_id, Integer
  18 + settings_items :blog_id, type: Integer
19 19  
20 20 def blog
21 21 blog_id && owner.blogs.exists?(blog_id) ? owner.blogs.find(blog_id) : owner.blog
... ... @@ -33,10 +33,10 @@ class BlogArchivesBlock &lt; Block
33 33 results = ''
34 34 posts = visible_posts(args[:person])
35 35 posts.except(:order).count(:all, :group => 'EXTRACT(YEAR FROM published_at)').sort_by {|year, count| -year.to_i}.each do |year, count|
36   - results << content_tag('li', content_tag('strong', "#{year} (#{count})"))
37   - results << "<ul class='#{year}-archive'>"
38   - posts.except(:order).count(:all, :conditions => ['EXTRACT(YEAR FROM published_at)=?', year], :group => 'EXTRACT(MONTH FROM published_at)').sort_by {|month, count| -month.to_i}.each do |month, count|
39   - results << content_tag('li', link_to("#{month_name(month.to_i)} (#{count})", owner_blog.url.merge(:year => year, :month => month)))
  36 + results << content_tag('li', content_tag('strong', "#{year.to_i} (#{count})"))
  37 + results << "<ul class='#{year.to_i}-archive'>"
  38 + posts.except(:order).where('EXTRACT(YEAR FROM published_at)=?', year.to_i).group('EXTRACT(MONTH FROM published_at)').count.sort_by {|month, count| -month.to_i}.each do |month, count|
  39 + results << content_tag('li', link_to("#{month_name(month.to_i)} (#{count})", owner_blog.url.merge(year: year.to_i, month: month.to_i)))
40 40 end
41 41 results << "</ul>"
42 42 end
... ...
app/models/box.rb
... ... @@ -7,7 +7,7 @@ class Box &lt; ActiveRecord::Base
7 7  
8 8 include Noosfero::Plugin::HotSpot
9 9  
10   - scope :with_position, :conditions => ['boxes.position > 0']
  10 + scope :with_position, -> { where 'boxes.position > 0' }
11 11  
12 12 def environment
13 13 owner ? (owner.kind_of?(Environment) ? owner : owner.environment) : nil
... ...
app/models/categorization.rb
1 1 module Categorization
2 2  
3 3 def add_category_to_object(category, object)
4   - if !find(:first, :conditions => {object_id_column => object, :category_id => category} )
  4 + if !self.where(object_id_column => object, :category_id => category).first
5 5 connection.execute("insert into #{table_name} (category_id, #{object_id_column}) values(#{category.id}, #{object.id})")
6 6  
7 7 c = category.parent
8   - while !c.nil? && !self.find(:first, :conditions => {object_id_column => object, :category_id => c})
  8 + while !c.nil? && !self.where(object_id_column => object, :category_id => c).first
9 9 connection.execute("insert into #{table_name} (category_id, #{object_id_column}, virtual) values(#{c.id}, #{object.id}, 1>0)")
10 10 c = c.parent
11 11 end
... ...
app/models/category.rb
... ... @@ -14,12 +14,12 @@ class Category &lt; ActiveRecord::Base
14 14 validates_uniqueness_of :slug,:scope => [ :environment_id, :parent_id ], :message => N_('{fn} is already being used by another category.').fix_i18n
15 15 belongs_to :environment
16 16  
17   - # Finds all top level categories for a given environment.
18   - scope :top_level_for, lambda { |environment|
19   - {:conditions => ['parent_id is null and environment_id = ?', environment.id ]}
  17 + # Finds all top level categories for a given environment.
  18 + scope :top_level_for, -> environment {
  19 + where 'parent_id is null and environment_id = ?', environment.id
20 20 }
21 21  
22   - scope :on_level, lambda { |parent| {:conditions => {:parent_id => parent}} }
  22 + scope :on_level, -> parent { where :parent_id => parent }
23 23  
24 24 acts_as_filesystem
25 25  
... ... @@ -46,26 +46,26 @@ class Category &lt; ActiveRecord::Base
46 46 display_color = nil if display_color.blank?
47 47 end
48 48  
49   - scope :from_types, lambda { |types|
50   - types.select{ |t| t.blank? }.empty? ?
51   - { :conditions => { :type => types } } :
52   - { :conditions => [ "type IN (?) OR type IS NULL", types.reject{ |t| t.blank? } ] }
  49 + scope :from_types, -> types {
  50 + if types.select{ |t| t.blank? }.empty? then
  51 + where(type: types) else
  52 + where("type IN (?) OR type IS NULL", types.reject{ |t| t.blank? }) end
53 53 }
54 54  
55 55 def recent_people(limit = 10)
56   - self.people.paginate(:order => 'created_at DESC, id DESC', :page => 1, :per_page => limit)
  56 + self.people.reorder('created_at DESC, id DESC').paginate(page: 1, per_page: limit)
57 57 end
58 58  
59 59 def recent_enterprises(limit = 10)
60   - self.enterprises.paginate(:order => 'created_at DESC, id DESC', :page => 1, :per_page => limit)
  60 + self.enterprises.reorder('created_at DESC, id DESC').paginate(page: 1, per_page: limit)
61 61 end
62 62  
63 63 def recent_communities(limit = 10)
64   - self.communities.paginate(:order => 'created_at DESC, id DESC', :page => 1, :per_page => limit)
  64 + self.communities.reorder('created_at DESC, id DESC').paginate(page: 1, per_page: limit)
65 65 end
66 66  
67 67 def recent_products(limit = 10)
68   - self.products.paginate(:order => 'created_at DESC, id DESC', :page => 1, :per_page => limit)
  68 + self.products.reorder('created_at DESC, id DESC').paginate(page: 1, per_page: limit)
69 69 end
70 70  
71 71 def recent_articles(limit = 10)
... ... @@ -73,7 +73,7 @@ class Category &lt; ActiveRecord::Base
73 73 end
74 74  
75 75 def recent_comments(limit = 10)
76   - comments.paginate(:order => 'created_at DESC, comments.id DESC', :page => 1, :per_page => limit)
  76 + self.comments.reorder('created_at DESC, comments.id DESC').paginate(page: 1, per_page: limit)
77 77 end
78 78  
79 79 def most_commented_articles(limit = 10)
... ... @@ -81,7 +81,7 @@ class Category &lt; ActiveRecord::Base
81 81 end
82 82  
83 83 def upcoming_events(limit = 10)
84   - self.events.paginate(:conditions => [ 'start_date >= ?', DateTime.now.beginning_of_day ], :order => 'start_date', :page => 1, :per_page => limit)
  84 + self.events.where('start_date >= ?', DateTime.now.beginning_of_day).order('start_date').paginate(page: 1, per_page: limit)
85 85 end
86 86  
87 87 def display_in_menu?
... ... @@ -90,11 +90,11 @@ class Category &lt; ActiveRecord::Base
90 90  
91 91 def children_for_menu
92 92 results = []
93   - pending = children.find(:all, :conditions => { :display_in_menu => true})
94   - while !pending.empty?
  93 + pending = children.where(display_in_menu: true).all
  94 + while pending.present?
95 95 cat = pending.shift
96 96 results << cat
97   - pending += cat.children.find(:all, :conditions => { :display_in_menu => true} )
  97 + pending += cat.children.where :display_in_menu => true
98 98 end
99 99  
100 100 results
... ... @@ -102,7 +102,7 @@ class Category &lt; ActiveRecord::Base
102 102  
103 103 def is_leaf_displayable_in_menu?
104 104 return false if self.display_in_menu == false
105   - self.children.find(:all, :conditions => {:display_in_menu => true}).empty?
  105 + self.children.where(:display_in_menu => true).empty?
106 106 end
107 107  
108 108 def with_color
... ...
app/models/certifier.rb
... ... @@ -20,7 +20,7 @@ class Certifier &lt; ActiveRecord::Base
20 20 validates_presence_of :name
21 21  
22 22 def destroy
23   - product_qualifiers.each { |pq| pq.update_attributes! :certifier => nil }
  23 + product_qualifiers.each { |pq| pq.update! :certifier => nil }
24 24 super
25 25 end
26 26  
... ...
app/models/comment.rb
... ... @@ -18,7 +18,7 @@ class Comment &lt; ActiveRecord::Base
18 18 has_many :children, :class_name => 'Comment', :foreign_key => 'reply_of_id', :dependent => :destroy
19 19 belongs_to :reply_of, :class_name => 'Comment', :foreign_key => 'reply_of_id'
20 20  
21   - scope :without_reply, :conditions => ['reply_of_id IS NULL']
  21 + scope :without_reply, -> { where 'reply_of_id IS NULL' }
22 22  
23 23 include TimeScopes
24 24  
... ...
app/models/create_community.rb
... ... @@ -34,7 +34,7 @@ class CreateCommunity &lt; Task
34 34 ! DATA_FIELDS.include?(key.to_s)
35 35 end
36 36  
37   - community.update_attributes(community_data)
  37 + community.update(community_data)
38 38 community.image = image if image
39 39 community.environment = self.environment
40 40 community.save!
... ...
app/models/create_enterprise.rb
... ... @@ -16,13 +16,13 @@ class CreateEnterprise &lt; Task
16 16 settings_items field.to_sym
17 17 end
18 18  
19   - # checks for virtual attributes
  19 + # checks for virtual attributes
20 20 validates_presence_of :name, :identifier
21 21  
22 22 #checks if the validation method is region to validates
23 23 validates_presence_of :region_id, :if => lambda { |obj| obj.environment.organization_approval_method == :region }
24 24  
25   - validates_format_of :foundation_year, :with => /^\d*$/
  25 + validates_numericality_of :foundation_year, only_integer: true, if: -> o { o.foundation_year.present? }
26 26  
27 27 # checks for actual attributes
28 28 validates_presence_of :requestor_id, :target_id
... ... @@ -129,7 +129,7 @@ class CreateEnterprise &lt; Task
129 129 finish
130 130 end
131 131  
132   - # tells if this request was appoved
  132 + # tells if this request was appoved
133 133 def approved?
134 134 self.status == Task::Status::FINISHED
135 135 end
... ...
app/models/domain.rb
... ... @@ -14,7 +14,7 @@ class Domain &lt; ActiveRecord::Base
14 14  
15 15 # <tt>name</tt> must be sequences of alphanumeric characters (a to z,
16 16 # 0 to 9), plus '_' or '-', separated by dots. Letters must be lowercase.
17   - validates_format_of :name, :with => /^([a-z0-9_-]+\.)+[a-z0-9_-]+$/, :message => N_('{fn} must be composed of sequences of lowercase letters (a to z), numbers (0 to 9), "_" and "-", separated by dots.').fix_i18n
  17 + validates_format_of :name, with: /\A([a-z0-9_-]+\.)+[a-z0-9_-]+\z/, message: N_('{fn} must be composed of sequences of lowercase letters (a to z), numbers (0 to 9), "_" and "-", separated by dots.').fix_i18n
18 18  
19 19 # checks validations that could not be expressed using Rails' predefined
20 20 # validations. In particular:
... ... @@ -37,7 +37,7 @@ class Domain &lt; ActiveRecord::Base
37 37 # "www.", but it will be removed before searching. So searching for
38 38 # 'www.example.net' is exactly the same as searching for just 'example.net'
39 39 def self.find_by_name(name)
40   - self.find(:first, :conditions => [ 'name = ?', self.extract_domain_name(name) ])
  40 + self.where('name = ?', self.extract_domain_name(name)).first
41 41 end
42 42  
43 43 # turns the argument (expected to be a String) into a domain name that is
... ...
app/models/enterprise.rb
... ... @@ -71,7 +71,7 @@ class Enterprise &lt; Organization
71 71 end
72 72  
73 73 def highlighted_products_with_image(options = {})
74   - Product.find(:all, {:conditions => {:highlighted => true}, :joins => :image}.merge(options))
  74 + Product.where(:highlighted => true).joins(:image)
75 75 end
76 76  
77 77 def required_fields
... ...
app/models/environment.rb
... ... @@ -17,7 +17,10 @@ class Environment &lt; ActiveRecord::Base
17 17  
18 18 has_many :users
19 19  
20   - self.partial_updates = false
  20 + # allow roles use
  21 + def self.dangerous_attribute_method? name
  22 + false
  23 + end
21 24  
22 25 has_many :tasks, :dependent => :destroy, :as => 'target'
23 26 has_many :search_terms, :as => :context
... ... @@ -108,7 +111,7 @@ class Environment &lt; ActiveRecord::Base
108 111 def admins
109 112 admin_role = Environment::Roles.admin(self)
110 113 return [] if admin_role.blank?
111   - Person.members_of(self).all(:conditions => ['role_assignments.role_id = ?', admin_role.id])
  114 + Person.members_of(self).where 'role_assignments.role_id = ?', admin_role.id
112 115 end
113 116  
114 117 # returns the available features for a Environment, in the form of a
... ... @@ -223,9 +226,11 @@ class Environment &lt; ActiveRecord::Base
223 226 has_many :licenses
224 227  
225 228 has_many :categories
226   - has_many :display_categories, :class_name => 'Category', :conditions => 'display_color is not null and parent_id is null', :order => 'display_color'
  229 + has_many :display_categories, -> {
  230 + order('display_color').where('display_color is not null and parent_id is null')
  231 + }, class_name: 'Category'
227 232  
228   - has_many :product_categories, :conditions => { :type => 'ProductCategory'}
  233 + has_many :product_categories, -> { where type: 'ProductCategory'}
229 234 has_many :regions
230 235 has_many :states
231 236 has_many :cities
... ... @@ -690,7 +695,7 @@ class Environment &lt; ActiveRecord::Base
690 695  
691 696 # the default Environment.
692 697 def self.default
693   - self.find(:first, :conditions => [ 'is_default = ?', true ] )
  698 + self.where('is_default = ?', true).first
694 699 end
695 700  
696 701 # returns an array with the top level categories for this environment.
... ... @@ -871,7 +876,7 @@ class Environment &lt; ActiveRecord::Base
871 876 end
872 877  
873 878 def portal_folders
874   - (settings[:portal_folders] || []).map{|fid| portal_community.articles.find(:first, :conditions => { :id => fid }) }.compact
  879 + (settings[:portal_folders] || []).map{|fid| portal_community.articles.where(id: fid).first }.compact
875 880 end
876 881  
877 882 def portal_folders=(folders)
... ... @@ -958,7 +963,7 @@ class Environment &lt; ActiveRecord::Base
958 963 end
959 964  
960 965 def highlighted_products_with_image(options = {})
961   - Product.find(:all, {:conditions => {:highlighted => true, :profile_id => self.enterprises.find(:all, :select => :id) }, :joins => :image}.merge(options))
  966 + self.products.where(highlighted: true).joins(:image).order('created_at ASC')
962 967 end
963 968  
964 969 settings_items :home_cache_in_minutes, :type => :integer, :default => 5
... ...
app/models/event.rb
... ... @@ -12,14 +12,14 @@ class Event &lt; Article
12 12 settings_items :address, :type => :string
13 13  
14 14 def link=(value)
15   - self.setting[:link] = maybe_add_http(value)
  15 + self.setting[:link] = maybe_add_http(URI.escape value.to_s)
16 16 end
17 17  
18 18 def link
19 19 maybe_add_http(self.setting[:link])
20 20 end
21 21  
22   - xss_terminate :only => [ :name, :body, :link, :address ], :with => 'white_list', :on => 'validation'
  22 + xss_terminate :only => [ :name, :body, :address ], :with => 'white_list', :on => 'validation'
23 23  
24 24 def initialize(*args)
25 25 super(*args)
... ... @@ -34,23 +34,21 @@ class Event &lt; Article
34 34 end
35 35 end
36 36  
37   - scope :by_day, lambda { |date|
38   - { :conditions => [' start_date >= :start_date AND start_date <= :end_date AND end_date IS NULL OR (start_date <= :end_date AND end_date >= :start_date)', {:start_date => date.beginning_of_day, :end_date => date.end_of_day}],
39   - :order => 'start_date ASC'
40   - }
  37 + scope :by_day, -> date {
  38 + where('start_date >= :start_date AND start_date <= :end_date AND end_date IS NULL OR (start_date <= :end_date AND end_date >= :start_date)',
  39 + start_date: date.beginning_of_day, end_date: date.end_of_day).
  40 + order('start_date ASC')
41 41 }
42 42  
43   - scope :next_events_from_month, lambda { |date|
  43 + scope :next_events_from_month, -> date {
44 44 date_temp = date.strftime("%Y-%m-%d")
45   - { :conditions => ["start_date >= ?","#{date_temp}"],
46   - :order => 'start_date ASC'
47   - }
  45 + order('start_date ASC')
  46 + .where("start_date >= ?","#{date_temp}")
48 47 }
49 48  
50   - scope :by_month, lambda { |date|
51   - { :conditions => ["EXTRACT(YEAR FROM start_date) = ? AND EXTRACT(MONTH FROM start_date) = ?",date.year,date.month],
52   - :order => 'start_date ASC'
53   - }
  49 + scope :by_month, -> date {
  50 + order('start_date ASC')
  51 + .where("EXTRACT(YEAR FROM start_date) = ? AND EXTRACT(MONTH FROM start_date) = ?", date.year, date.month)
54 52 }
55 53  
56 54 include WhiteListFilter
... ... @@ -71,12 +69,10 @@ class Event &lt; Article
71 69 'event'
72 70 end
73 71  
74   - scope :by_range, lambda { |range| {
75   - :conditions => [
76   - 'start_date BETWEEN :start_day AND :end_day OR end_date BETWEEN :start_day AND :end_day',
77   - { :start_day => range.first, :end_day => range.last }
78   - ]
79   - }}
  72 + scope :by_range, -> range {
  73 + where('start_date BETWEEN :start_day AND :end_day OR end_date BETWEEN :start_day AND :end_day',
  74 + {:start_day => range.first, :end_day => range.last})
  75 + }
80 76  
81 77 def self.date_range(year, month)
82 78 if year.nil? || month.nil?
... ...
app/models/external_feed.rb
... ... @@ -5,9 +5,9 @@ class ExternalFeed &lt; ActiveRecord::Base
5 5 validates_presence_of :address, :if => lambda {|efeed| efeed.enabled}
6 6 validates_uniqueness_of :blog_id
7 7  
8   - scope :enabled, :conditions => { :enabled => true }
9   - scope :expired, lambda {
10   - { :conditions => ['(fetched_at is NULL) OR (fetched_at < ?)', Time.now - FeedUpdater.update_interval] }
  8 + scope :enabled, -> { where enabled: true }
  9 + scope :expired, -> {
  10 + where '(fetched_at is NULL) OR (fetched_at < ?)', Time.now - FeedUpdater.update_interval
11 11 }
12 12  
13 13 attr_accessible :address, :enabled, :only_once
... ...
app/models/featured_products_block.rb
... ... @@ -11,7 +11,7 @@ class FeaturedProductsBlock &lt; Block
11 11 if block.owner.kind_of?(Environment) && block.product_ids.blank?
12 12 total = block.owner.products.count
13 13 offset = rand([(total - block.groups_of * 3) + 1, 1].max)
14   - block.product_ids = block.owner.highlighted_products_with_image(:offset => offset, :limit => block.groups_of * 3).map(&:id)
  14 + block.product_ids = block.owner.highlighted_products_with_image.offset(offset).limit(block.groups_of * 3).map(&:id)
15 15 end
16 16 block.groups_of = block.groups_of.to_i
17 17 end
... ...
app/models/feed_reader_block.rb
... ... @@ -27,8 +27,8 @@ class FeedReaderBlock &lt; Block
27 27 settings_items :update_errors, :type => :integer, :default => 0
28 28 settings_items :error_message, :type => :string
29 29  
30   - scope :expired, lambda {
31   - { :conditions => [ '(fetched_at is NULL) OR (fetched_at < ?)', Time.now - FeedUpdater.update_interval] }
  30 + scope :expired, -> {
  31 + where '(fetched_at is NULL) OR (fetched_at < ?)', Time.now - FeedUpdater.update_interval
32 32 }
33 33  
34 34 before_create do |block|
... ...
app/models/folder.rb
... ... @@ -56,10 +56,11 @@ class Folder &lt; Article
56 56 profile.recent_documents(limit, ["articles.type != ? AND articles.highlighted = ? AND articles.parent_id = ?", 'Folder', highlight, id])
57 57 end
58 58  
59   - has_many :images, :class_name => 'Article',
60   - :foreign_key => 'parent_id',
61   - :order => 'articles.type, articles.name',
62   - :conditions => ["articles.type = 'UploadedFile' and articles.content_type in (?) or articles.type in ('Folder','Gallery')", UploadedFile.content_types]
  59 + has_many :images, -> {
  60 + order('articles.type, articles.name').
  61 + where("articles.type = 'UploadedFile' and articles.content_type in (?) or articles.type in ('Folder','Gallery')", UploadedFile.content_types)
  62 + }, class_name: 'Article', foreign_key: 'parent_id'
  63 +
63 64  
64 65 def accept_uploads?
65 66 !self.has_posts? || self.gallery?
... ...
app/models/image.rb
1 1 class Image < ActiveRecord::Base
2 2  
  3 + attr_accessible :uploaded_data, :label, :remove_image
  4 + attr_accessor :remove_image
  5 +
3 6 def self.max_size
4 7 Image.attachment_options[:max_size]
5 8 end
6 9  
7 10 sanitize_filename
8 11  
9   - has_attachment :content_type => :image,
10   - :storage => :file_system,
  12 + has_attachment :content_type => :image,
  13 + :storage => :file_system,
11 14 :path_prefix => 'public/image_uploads',
12 15 :resize_to => '800x600>',
13 16 :thumbnails => { :big => '150x150',
... ... @@ -15,7 +18,8 @@ class Image &lt; ActiveRecord::Base
15 18 :portrait => '64x64',
16 19 :minor => '50x50>',
17 20 :icon => '20x20!' },
18   - :max_size => 5.megabytes # remember to update validate message below
  21 + :max_size => 5.megabytes, # remember to update validate message below
  22 + processor: 'Rmagick'
19 23  
20 24 validates_attachment :size => N_("{fn} of uploaded file was larger than the maximum size of 5.0 MB").fix_i18n
21 25  
... ... @@ -23,10 +27,8 @@ class Image &lt; ActiveRecord::Base
23 27  
24 28 postgresql_attachment_fu
25 29  
26   - attr_accessible :uploaded_data, :label, :remove_image
27   - attr_accessor :remove_image
28   -
29 30 def current_data
30 31 File.file?(full_filename) ? File.read(full_filename) : nil
31 32 end
  33 +
32 34 end
... ...
app/models/input.rb
... ... @@ -13,7 +13,7 @@ class Input &lt; ActiveRecord::Base
13 13  
14 14 belongs_to :unit
15 15  
16   - scope :relevant_to_price, :conditions => { :relevant_to_price => true }
  16 + scope :relevant_to_price, -> { where relevant_to_price: true }
17 17  
18 18 include FloatHelper
19 19  
... ...
app/models/invite_friend.rb
... ... @@ -45,7 +45,7 @@ class InviteFriend &lt; Invitation
45 45 private
46 46 def check_for_invitation_existence
47 47 if friend
48   - friend.tasks.pending.of("InviteFriend").find(:all, :conditions => {:requestor_id => person.id, :target_id => friend.id}).blank?
  48 + friend.tasks.pending.of("InviteFriend").where(requestor_id: person.id, target_id: friend.id).blank?
49 49 end
50 50 end
51 51  
... ...
app/models/invite_member.rb
... ... @@ -65,7 +65,7 @@ class InviteMember &lt; Invitation
65 65 private
66 66 def check_for_invitation_existence
67 67 if friend
68   - friend.tasks.pending.of("InviteMember").find(:all, :conditions => {:requestor_id => person.id}).select { |t| t.data[:community_id] == community_id }.blank?
  68 + friend.tasks.pending.of("InviteMember").where(requestor_id: person.id).select{ |t| t.data[:community_id] == community_id }.blank?
69 69 end
70 70 end
71 71  
... ...
app/models/link_list_block.rb
... ... @@ -41,7 +41,7 @@ class LinkListBlock &lt; Block
41 41 [N_('New window'), '_new'],
42 42 ]
43 43  
44   - settings_items :links, Array, :default => []
  44 + settings_items :links, type: Array, :default => []
45 45  
46 46 before_save do |block|
47 47 block.links = block.links.delete_if {|i| i[:name].blank? and i[:address].blank?}
... ...
app/models/organization.rb
... ... @@ -84,7 +84,7 @@ class Organization &lt; Profile
84 84 end
85 85  
86 86 def find_pending_validation(code)
87   - validations.pending.find(:first, :conditions => {:code => code})
  87 + validations.pending.where(code: code).first
88 88 end
89 89  
90 90 def processed_validations
... ... @@ -92,7 +92,7 @@ class Organization &lt; Profile
92 92 end
93 93  
94 94 def find_processed_validation(code)
95   - validations.finished.find(:first, :conditions => {:code => code})
  95 + validations.finished.where(code: code).first
96 96 end
97 97  
98 98 def is_validation_entity?
... ... @@ -140,7 +140,7 @@ class Organization &lt; Profile
140 140  
141 141 settings_items :zip_code, :city, :state, :country
142 142  
143   - validates_format_of :foundation_year, :with => Noosfero::Constants::INTEGER_FORMAT
  143 + validates_numericality_of :foundation_year, only_integer: true, if: -> o { o.foundation_year.present? }
144 144 validates_format_of :contact_email, :with => Noosfero::Constants::EMAIL_FORMAT, :if => (lambda { |org| !org.contact_email.blank? })
145 145 validates_as_cnpj :cnpj
146 146  
... ... @@ -190,7 +190,7 @@ class Organization &lt; Profile
190 190 end
191 191  
192 192 def already_request_membership?(person)
193   - self.tasks.pending.find_by_requestor_id(person.id, :conditions => { :type => 'AddMember' })
  193 + self.tasks.pending.where(type: 'AddMember', requestor_id: person.id).first
194 194 end
195 195  
196 196 def jid(options = {})
... ...
app/models/person.rb
... ... @@ -16,27 +16,26 @@ class Person &lt; Profile
16 16 acts_as_trackable :after_add => Proc.new {|p,t| notify_activity(t)}
17 17 acts_as_accessor
18 18  
19   - scope :members_of, lambda { |resources|
20   - resources = [resources] if !resources.kind_of?(Array)
  19 + scope :members_of, -> resources {
  20 + resources = Array(resources)
21 21 conditions = resources.map {|resource| "role_assignments.resource_type = '#{resource.class.base_class.name}' AND role_assignments.resource_id = #{resource.id || -1}"}.join(' OR ')
22   - { :select => 'DISTINCT profiles.*', :joins => :role_assignments, :conditions => [conditions] }
  22 + select('DISTINCT profiles.*').joins(:role_assignments).where([conditions])
23 23 }
24 24  
25   - scope :not_members_of, lambda { |resources|
26   - resources = [resources] if !resources.kind_of?(Array)
  25 + scope :not_members_of, -> resources {
  26 + resources = Array(resources)
27 27 conditions = resources.map {|resource| "role_assignments.resource_type = '#{resource.class.base_class.name}' AND role_assignments.resource_id = #{resource.id || -1}"}.join(' OR ')
28   - { :select => 'DISTINCT profiles.*', :conditions => ['"profiles"."id" NOT IN (SELECT DISTINCT profiles.id FROM "profiles" INNER JOIN "role_assignments" ON "role_assignments"."accessor_id" = "profiles"."id" AND "role_assignments"."accessor_type" = (\'Profile\') WHERE "profiles"."type" IN (\'Person\') AND (%s))' % conditions] }
  28 + select('DISTINCT profiles.*').where('"profiles"."id" NOT IN (SELECT DISTINCT profiles.id FROM "profiles" INNER JOIN "role_assignments" ON "role_assignments"."accessor_id" = "profiles"."id" AND "role_assignments"."accessor_type" = (\'Profile\') WHERE "profiles"."type" IN (\'Person\') AND (%s))' % conditions)
29 29 }
30 30  
31   - scope :by_role, lambda { |roles|
32   - roles = [roles] unless roles.kind_of?(Array)
33   - { :select => 'DISTINCT profiles.*', :joins => :role_assignments, :conditions => ['role_assignments.role_id IN (?)',
34   -roles] }
  31 + scope :by_role, -> roles {
  32 + roles = Array(roles)
  33 + select('DISTINCT profiles.*').joins(:role_assignments).where('role_assignments.role_id IN (?)', roles)
35 34 }
36 35  
37   - scope :not_friends_of, lambda { |resources|
  36 + scope :not_friends_of, -> resources {
38 37 resources = Array(resources)
39   - { :select => 'DISTINCT profiles.*', :conditions => ['"profiles"."id" NOT IN (SELECT DISTINCT profiles.id FROM "profiles" INNER JOIN "friendships" ON "friendships"."person_id" = "profiles"."id" WHERE "friendships"."friend_id" IN (%s))' % resources.map(&:id)] }
  38 + select('DISTINCT profiles.*').where('"profiles"."id" NOT IN (SELECT DISTINCT profiles.id FROM "profiles" INNER JOIN "friendships" ON "friendships"."person_id" = "profiles"."id" WHERE "friendships"."friend_id" IN (%s))' % resources.map(&:id))
40 39 }
41 40  
42 41 scope :visible_for_person, lambda { |person|
... ... @@ -68,6 +67,9 @@ roles] }
68 67 end
69 68 alias_method_chain :has_permission?, :plugins
70 69  
  70 + # for eager loading
  71 + has_many :memberships, through: :role_assignments, source: :resource, source_type: 'Profile'
  72 +
71 73 def memberships
72 74 scopes = []
73 75 plugins_scopes = plugins.dispatch_scopes(:person_memberships, self)
... ... @@ -84,7 +86,9 @@ roles] }
84 86 has_many :friendships, :dependent => :destroy
85 87 has_many :friends, :class_name => 'Person', :through => :friendships
86 88  
87   - scope :online, lambda { { :include => :user, :conditions => ["users.chat_status != '' AND users.chat_status_at >= ?", DateTime.now - User.expires_chat_status_every.minutes] } }
  89 + scope :online, -> {
  90 + joins(:user).where("users.chat_status != '' AND users.chat_status_at >= ?", DateTime.now - User.expires_chat_status_every.minutes)
  91 + }
88 92  
89 93 has_many :requested_tasks, :class_name => 'Task', :foreign_key => :requestor_id, :dependent => :destroy
90 94  
... ... @@ -100,21 +104,31 @@ roles] }
100 104 has_and_belongs_to_many :acepted_forums, :class_name => 'Forum', :join_table => 'terms_forum_people'
101 105 has_and_belongs_to_many :articles_with_access, :class_name => 'Article', :join_table => 'article_privacy_exceptions'
102 106  
103   - has_many :suggested_profiles, :class_name => 'ProfileSuggestion', :foreign_key => :person_id, :order => 'score DESC', :dependent => :destroy
104   - has_many :suggested_people, :through => :suggested_profiles, :source => :suggestion, :conditions => ['profile_suggestions.suggestion_type = ? AND profile_suggestions.enabled = ?', 'Person', true]
105   - has_many :suggested_communities, :through => :suggested_profiles, :source => :suggestion, :conditions => ['profile_suggestions.suggestion_type = ? AND profile_suggestions.enabled = ?', 'Community', true]
  107 + has_many :suggested_profiles, class_name: 'ProfileSuggestion', foreign_key: :person_id, order: 'score DESC', dependent: :destroy
  108 + has_many :suggested_people, -> {
  109 + where 'profile_suggestions.suggestion_type = ? AND profile_suggestions.enabled = ?', 'Person', true
  110 + }, through: :suggested_profiles, source: :suggestion
  111 + has_many :suggested_communities, -> {
  112 + where 'profile_suggestions.suggestion_type = ? AND profile_suggestions.enabled = ?', 'Community', true
  113 + }, through: :suggested_profiles, source: :suggestion
106 114  
107   - scope :more_popular, :order => 'friends_count DESC'
  115 + scope :more_popular, -> { order 'friends_count DESC' }
108 116  
109   - scope :abusers, :joins => :abuse_complaints, :conditions => ['tasks.status = 3'], :select => 'DISTINCT profiles.*'
110   - scope :non_abusers, :joins => "LEFT JOIN tasks ON profiles.id = tasks.requestor_id AND tasks.type='AbuseComplaint'", :conditions => ["tasks.status != 3 OR tasks.id is NULL"], :select => "DISTINCT profiles.*"
  117 + scope :abusers, -> {
  118 + joins(:abuse_complaints).where('tasks.status = 3').select('DISTINCT profiles.*')
  119 + }
  120 + scope :non_abusers, -> {
  121 + select("DISTINCT profiles.*").
  122 + joins("LEFT JOIN tasks ON profiles.id = tasks.requestor_id AND tasks.type='AbuseComplaint'").
  123 + where("tasks.status != 3 OR tasks.id is NULL")
  124 + }
111 125  
112   - scope :admins, :joins => [:role_assignments => :role], :conditions => ['roles.key = ?', 'environment_administrator' ]
113   - scope :activated, :joins => :user, :conditions => ['users.activation_code IS NULL AND users.activated_at IS NOT NULL']
114   - scope :deactivated, :joins => :user, :conditions => ['NOT (users.activation_code IS NULL AND users.activated_at IS NOT NULL)']
  126 + scope :admins, -> { joins(:role_assignments => :role).where('roles.key = ?', 'environment_administrator') }
  127 + scope :activated, -> { joins(:user).where('users.activation_code IS NULL AND users.activated_at IS NOT NULL') }
  128 + scope :deactivated, -> { joins(:user).where('NOT (users.activation_code IS NULL AND users.activated_at IS NOT NULL)') }
115 129  
116 130 after_destroy do |person|
117   - Friendship.find(:all, :conditions => { :friend_id => person.id}).each { |friendship| friendship.destroy }
  131 + Friendship.where(friend_id: person.id).each{ |friendship| friendship.destroy }
118 132 end
119 133  
120 134 belongs_to :user, :dependent => :delete
... ... @@ -177,7 +191,7 @@ roles] }
177 191 end
178 192  
179 193 def remove_friend(friend)
180   - Friendship.find(:first, :conditions => {:friend_id => friend, :person_id => id}).destroy
  194 + Friendship.where(friend_id: friend, person_id: id).first.destroy
181 195 end
182 196  
183 197 FIELDS = %w[
... ... @@ -288,7 +302,7 @@ roles] }
288 302 end
289 303  
290 304 validates_each :email, :on => :update do |record,attr,value|
291   - if User.find(:first, :conditions => ['email = ? and id != ? and environment_id = ?', value, record.user.id, record.environment.id])
  305 + if User.where('email = ? and id != ? and environment_id = ?', value, record.user.id, record.environment.id).first
292 306 record.errors.add(attr, _('{fn} is already used by other user').fix_i18n)
293 307 end
294 308 end
... ... @@ -397,7 +411,7 @@ roles] }
397 411 def ask_to_join?(community)
398 412 return false if !community.visible?
399 413 return false if memberships.include?(community)
400   - return false if AddMember.find(:first, :conditions => {:requestor_id => self.id, :target_id => community.id})
  414 + return false if AddMember.where(requestor_id: self.id, target_id: community.id).first
401 415 !refused_communities.include?(community)
402 416 end
403 417  
... ...
app/models/person_notifier.rb
  1 +# FIXME needed by test/units/application_helper.rb
  2 +require_dependency 'application_helper'
  3 +
1 4 class PersonNotifier
2 5  
3 6 def initialize(person)
... ... @@ -28,7 +31,7 @@ class PersonNotifier
28 31  
29 32 def notify
30 33 if @person.notification_time && @person.notification_time > 0
31   - notifications = @person.tracked_notifications.find(:all, :conditions => ["created_at > ?", notify_from])
  34 + notifications = @person.tracked_notifications.where("created_at > ?", notify_from)
32 35 tasks = Task.to(@person).without_spam.pending.where("created_at > ?", notify_from).order_by('created_at', 'asc')
33 36  
34 37 Noosfero.with_locale @person.environment.default_language do
... ... @@ -74,9 +77,8 @@ class PersonNotifier
74 77  
75 78 end
76 79  
77   - class Mailer < ActionMailer::Base
  80 + class Mailer < ApplicationMailer
78 81  
79   - helper ApplicationHelper
80 82 helper ActionTrackerHelper
81 83  
82 84 def session
... ... @@ -85,8 +87,8 @@ class PersonNotifier
85 87  
86 88 def content_summary(person, notifications, tasks)
87 89 if person.environment
88   - ActionMailer::Base.asset_host = person.environment.top_url
89   - ActionMailer::Base.default_url_options[:host] = person.environment.default_hostname
  90 + ApplicationMailer.asset_host = person.environment.top_url
  91 + ApplicationMailer.default_url_options[:host] = person.environment.default_hostname
90 92 end
91 93  
92 94 @current_theme = 'default'
... ... @@ -94,7 +96,7 @@ class PersonNotifier
94 96 @recipient = @profile.nickname || @profile.name
95 97 @notifications = notifications
96 98 @tasks = tasks
97   - @environment = @profile.environment.name
  99 + @environment = @profile.environment
98 100 @url = @profile.environment.top_url
99 101 mail(
100 102 content_type: "text/html",
... ...
app/models/product.rb
... ... @@ -52,8 +52,8 @@ class Product &lt; ActiveRecord::Base
52 52  
53 53 scope :more_recent, :order => "created_at DESC"
54 54  
55   - scope :from_category, lambda { |category|
56   - {:joins => :product_category, :conditions => ['categories.path LIKE ?', "%#{category.slug}%"]} if category
  55 + scope :from_category, -> category {
  56 + joins(:product_category).where('categories.path LIKE ?', "%#{category.slug}%") if category
57 57 }
58 58  
59 59 scope :visible_for_person, lambda { |person|
... ...
app/models/product_category.rb
... ... @@ -6,19 +6,19 @@ class ProductCategory &lt; Category
6 6 attr_accessible :name, :parent, :environment
7 7  
8 8 scope :unique, :select => 'DISTINCT ON (path) categories.*'
9   - scope :by_enterprise, lambda { |enterprise| {
10   - :joins => :products,
11   - :conditions => ['products.profile_id = ?', enterprise.id]
12   - }}
13   - scope :by_environment, lambda { |environment| {
14   - :conditions => ['environment_id = ?', environment.id]
15   - }}
16   - scope :unique_by_level, lambda { |level| {
17   - :select => "DISTINCT ON (filtered_category) split_part(path, '/', #{level}) AS filtered_category, categories.*"
18   - }}
  9 + scope :by_enterprise, -> enterprise {
  10 + joins(:products).
  11 + where('products.profile_id = ?', enterprise.id)
  12 + }
  13 + scope :by_environment, -> environment {
  14 + where 'environment_id = ?', environment.id
  15 + }
  16 + scope :unique_by_level, -> level {
  17 + select "DISTINCT ON (filtered_category) split_part(path, '/', #{level}) AS filtered_category, categories.*"
  18 + }
19 19  
20 20 def all_products
21   - Product.find(:all, :conditions => { :product_category_id => (all_children << self).map(&:id) })
  21 + Product.where(product_category_id: (all_children << self).map(&:id))
22 22 end
23 23  
24 24 def self.menu_categories(top_category, env)
... ...
app/models/products_block.rb
... ... @@ -39,7 +39,7 @@ class ProductsBlock &lt; Block
39 39 link_to(_('View all products'), owner.public_profile_url.merge(:controller => 'catalog', :action => 'index'))
40 40 end
41 41  
42   - settings_items :product_ids, Array
  42 + settings_items :product_ids, type: Array
43 43 def product_ids=(array)
44 44 self.settings[:product_ids] = array
45 45 if self.settings[:product_ids]
... ...
app/models/profile.rb
... ... @@ -50,7 +50,7 @@ class Profile &lt; ActiveRecord::Base
50 50 all_roles(env_id).select{ |r| r.key.match(/^profile_/) unless r.key.blank? || !r.profile_id.nil?}
51 51 end
52 52 def self.all_roles(env_id)
53   - Role.all :conditions => { :environment_id => env_id }
  53 + Role.where(environment_id: env_id)
54 54 end
55 55 def self.method_missing(m, *args, &block)
56 56 role = find_role(m, args[0])
... ... @@ -87,20 +87,28 @@ class Profile &lt; ActiveRecord::Base
87 87  
88 88 include Noosfero::Plugin::HotSpot
89 89  
90   - scope :memberships_of, lambda { |person| { :select => 'DISTINCT profiles.*', :joins => :role_assignments, :conditions => ['role_assignments.accessor_type = ? AND role_assignments.accessor_id = ?', person.class.base_class.name, person.id ] } }
  90 + scope :memberships_of, -> person {
  91 + select('DISTINCT profiles.*').
  92 + joins(:role_assignments).
  93 + where('role_assignments.accessor_type = ? AND role_assignments.accessor_id = ?', person.class.base_class.name, person.id)
  94 + }
91 95 #FIXME: these will work only if the subclass is already loaded
92   - scope :enterprises, lambda { {:conditions => (Enterprise.send(:subclasses).map(&:name) << 'Enterprise').map { |klass| "profiles.type = '#{klass}'"}.join(" OR ")} }
93   - scope :communities, lambda { {:conditions => (Community.send(:subclasses).map(&:name) << 'Community').map { |klass| "profiles.type = '#{klass}'"}.join(" OR ")} }
94   - scope :templates, lambda { |template_id = nil|
95   - conditions = {:conditions => {:is_template => true}}
96   - conditions[:conditions].merge!({:id => template_id}) unless template_id.nil?
97   - conditions
  96 + scope :enterprises, -> {
  97 + where((Enterprise.send(:subclasses).map(&:name) << 'Enterprise').map { |klass| "profiles.type = '#{klass}'"}.join(" OR "))
  98 + }
  99 + scope :communities, -> {
  100 + where((Community.send(:subclasses).map(&:name) << 'Community').map { |klass| "profiles.type = '#{klass}'"}.join(" OR "))
  101 + }
  102 + scope :templates, -> template_id = nil {
  103 + s = where is_template: true
  104 + s = s.where id: template_id if template_id
  105 + s
98 106 }
99 107  
100   - scope :with_templates, lambda { |templates|
101   - {:conditions => {:template_id => templates}}
  108 + scope :with_templates, -> templates {
  109 + where template_id: templates
102 110 }
103   - scope :no_templates, {:conditions => {:is_template => false}}
  111 + scope :no_templates, -> { where is_template: false }
104 112  
105 113 # Returns a scoped object to select profiles in a given location or in a radius
106 114 # distance from the given location center.
... ... @@ -177,10 +185,10 @@ class Profile &lt; ActiveRecord::Base
177 185 Profile.column_names.map{|n| [Profile.table_name, n].join('.')}.join(',')
178 186 end
179 187  
180   - scope :visible, :conditions => { :visible => true, :secret => false }
181   - scope :disabled, :conditions => { :visible => false }
182   - scope :public, :conditions => { :visible => true, :public_profile => true, :secret => false }
183   - scope :enabled, :conditions => { :enabled => true }
  188 + scope :visible, -> { where visible: true, secret: false }
  189 + scope :disabled, -> { where visible: false }
  190 + scope :is_public, -> { where visible: true, public_profile: true, secret: false }
  191 + scope :enabled, -> { where enabled: true }
184 192  
185 193 # Subclasses must override this method
186 194 scope :more_popular
... ... @@ -229,7 +237,7 @@ class Profile &lt; ActiveRecord::Base
229 237 validates_length_of :description, :maximum => 550, :allow_nil => true
230 238  
231 239 # Valid identifiers must match this format.
232   - IDENTIFIER_FORMAT = /^#{Noosfero.identifier_format}$/
  240 + IDENTIFIER_FORMAT = /\A#{Noosfero.identifier_format}\Z/
233 241  
234 242 # These names cannot be used as identifiers for Profiles
235 243 RESERVED_IDENTIFIERS = %w[
... ... @@ -281,7 +289,7 @@ class Profile &lt; ActiveRecord::Base
281 289 end
282 290 end
283 291  
284   - has_many :profile_categorizations, :conditions => [ 'categories_profiles.virtual = ?', false ]
  292 + has_many :profile_categorizations, -> { where 'categories_profiles.virtual = ?', false }
285 293 has_many :categories, :through => :profile_categorizations
286 294  
287 295 has_many :profile_categorizations_including_virtual, :class_name => 'ProfileCategorization'
... ... @@ -508,14 +516,13 @@ class Profile &lt; ActiveRecord::Base
508 516 self.articles.recent(limit, options, pagination)
509 517 end
510 518  
511   - def last_articles(limit = 10, options = {})
512   - options = { :limit => limit,
513   - :conditions => ["advertise = ? AND published = ? AND
514   - ((articles.type != ? and articles.type != ? and articles.type != ?) OR
515   - articles.type is NULL)",
516   - true, true, 'UploadedFile', 'RssFeed', 'Blog'],
517   - :order => 'articles.published_at desc, articles.id desc' }.merge(options)
518   - self.articles.find(:all, options)
  519 + def last_articles limit = 10
  520 + self.articles.limit(limit).where(
  521 + "advertise = ? AND published = ? AND
  522 + ((articles.type != ? and articles.type != ? and articles.type != ?) OR
  523 + articles.type is NULL)",
  524 + true, true, 'UploadedFile', 'RssFeed', 'Blog'
  525 + ).order('articles.published_at desc, articles.id desc')
519 526 end
520 527  
521 528 class << self
... ... @@ -713,7 +720,7 @@ private :generate_url, :url_options
713 720 num = num + 1
714 721 new_name = original_article.name + ' ' + num.to_s
715 722 end
716   - original_article.update_attributes!(:name => new_name)
  723 + original_article.update!(:name => new_name)
717 724 end
718 725 article_copy = article.copy(:profile => self, :parent => parent, :advertise => false)
719 726 if article.profile.home_page == article
... ...
app/models/profile_activity.rb
... ... @@ -25,8 +25,8 @@ class ProfileActivity &lt; ActiveRecord::Base
25 25 protected
26 26  
27 27 def copy_timestamps
28   - self.created_at = self.activity.created_at
29   - self.updated_at = self.activity.updated_at
  28 + self.created_at = self.activity.created_at if self.activity.created_at
  29 + self.updated_at = self.activity.updated_at if self.activity.updated_at
30 30 end
31 31  
32 32 end
... ...
app/models/profile_categorization.rb
1 1 class ProfileCategorization < ActiveRecord::Base
2   - set_table_name :categories_profiles
  2 + self.table_name = :categories_profiles
3 3 belongs_to :profile
4 4 belongs_to :category
5 5  
... ... @@ -13,7 +13,7 @@ class ProfileCategorization &lt; ActiveRecord::Base
13 13 end
14 14  
15 15 def self.remove_region(profile)
16   - region = profile.categories.find(:first, :conditions => { :type => [Region, State, City].map(&:name) })
  16 + region = profile.categories.where(type: [Region, State, City].map(&:name)).first
17 17 if region
18 18 ids = region.hierarchy.map(&:id)
19 19 self.delete_all(:profile_id => profile.id, :category_id => ids)
... ...
app/models/profile_list_block.rb
... ... @@ -16,7 +16,7 @@ class ProfileListBlock &lt; Block
16 16  
17 17 def profile_list
18 18 result = nil
19   - public_profiles = profiles.public.includes([:image,:domains,:preferred_domain,:environment])
  19 + public_profiles = profiles.is_public.includes([:image,:domains,:preferred_domain,:environment])
20 20 if !prioritize_profiles_with_image
21 21 result = public_profiles.all(:limit => get_limit, :order => 'profiles.updated_at DESC').sort_by{ rand }
22 22 elsif profiles.visible.with_image.count >= get_limit
... ... @@ -28,7 +28,7 @@ result = public_profiles.all(:limit =&gt; get_limit, :order =&gt; &#39;profiles.updated_at
28 28 end
29 29  
30 30 def profile_count
31   - profiles.public.length
  31 + profiles.is_public.length
32 32 end
33 33  
34 34 # the title of the block. Probably will be overriden in subclasses.
... ...
app/models/profile_suggestion.rb
... ... @@ -26,9 +26,9 @@ class ProfileSuggestion &lt; ActiveRecord::Base
26 26 end
27 27  
28 28 validates_uniqueness_of :suggestion_id, :scope => [ :person_id ]
29   - scope :of_person, :conditions => { :suggestion_type => 'Person' }
30   - scope :of_community, :conditions => { :suggestion_type => 'Community' }
31   - scope :enabled, :conditions => { :enabled => true }
  29 + scope :of_person, -> { where suggestion_type: 'Person' }
  30 + scope :of_community, -> { where suggestion_type: 'Community' }
  31 + scope :enabled, -> { where enabled: true }
32 32  
33 33 # {:category_type => ['category-icon', 'category-label']}
34 34 CATEGORIES = {
... ... @@ -55,13 +55,13 @@ class ProfileSuggestion &lt; ActiveRecord::Base
55 55 :threshold => 2, :weight => 1, :connection => 'Profile'
56 56 },
57 57 :people_with_common_tags => {
58   - :threshold => 2, :weight => 1, :connection => 'ActsAsTaggableOn::Tag'
  58 + :threshold => 2, :weight => 1, :connection => 'Tag'
59 59 },
60 60 :communities_with_common_friends => {
61 61 :threshold => 2, :weight => 1, :connection => 'Profile'
62 62 },
63 63 :communities_with_common_tags => {
64   - :threshold => 2, :weight => 1, :connection => 'ActsAsTaggableOn::Tag'
  64 + :threshold => 2, :weight => 1, :connection => 'Tag'
65 65 }
66 66 }
67 67  
... ... @@ -127,17 +127,15 @@ class ProfileSuggestion &lt; ActiveRecord::Base
127 127 rescue NoMethodError
128 128 next
129 129 end
130   - connections = suggested_profile.send("#{rule}_connections")
131   - if connections.present?
132   - connections = connections[1..-2].split(',')
133   - else
134   - connections = []
135   - end
136   - suggestion.send("#{rule}=", value)
  130 +
  131 + connections = suggested_profile.send("#{rule}_connections") || []
  132 + connections = connections[1..-2] if connections.present?
137 133 connections.each do |connection_id|
138 134 next if SuggestionConnection.where(:suggestion_id => suggestion.id, :connection_id => connection_id, :connection_type => options[:connection]).present?
139   - SuggestionConnection.create!(:suggestion => suggestion, :connection_id => connection_id, :connection_type => options[:connection])
  135 + SuggestionConnection.create!(:suggestion => suggestion, :connection_id => connection_id, :connection_type => options[:connection])
140 136 end
  137 +
  138 + suggestion.send("#{rule}=", value)
141 139 suggestion.score += value * options[:weight]
142 140 end
143 141 suggestion.save!
... ...
app/models/reported_image.rb
... ... @@ -5,6 +5,7 @@ class ReportedImage &lt; ActiveRecord::Base
5 5  
6 6 has_attachment :content_type => :image,
7 7 :storage => :file_system,
8   - :max_size => 5.megabytes
  8 + :max_size => 5.megabytes,
  9 + processor: 'Rmagick'
9 10  
10 11 end
... ...
app/models/rss_feed.rb
... ... @@ -40,7 +40,7 @@ class RssFeed &lt; Article
40 40  
41 41 # FIXME this should be validates_numericality_of, but Rails 2.0.2 does not
42 42 # support validates_numericality_of with virtual attributes
43   - validates_format_of :limit, :with => /^\d+$/, :if => :limit
  43 + validates_format_of :limit, :with => /\d+/, :if => :limit
44 44  
45 45 # determinates what to include in the feed. Possible values are +:all+
46 46 # (include everything from the profile) and :parent_and_children (include
... ... @@ -69,7 +69,7 @@ class RssFeed &lt; Article
69 69 def fetch_articles
70 70 if parent && parent.has_posts?
71 71 language = self.language.blank? ? {} : { :language => self.language }
72   - return parent.posts.find(:all, :conditions => { :published => true }.merge(language), :limit => self.limit, :order => 'id desc')
  72 + return parent.posts.where({published: true}.merge language).limit(self.limit).order('id desc')
73 73 end
74 74  
75 75 articles =
... ...
app/models/scrap.rb
... ... @@ -18,9 +18,9 @@ class Scrap &lt; ActiveRecord::Base
18 18 after_create :create_activity
19 19 after_update :update_activity
20 20  
21   - scope :all_scraps, lambda {|profile| {:conditions => ["receiver_id = ? OR sender_id = ?", profile, profile], :limit => 30}}
  21 + scope :all_scraps, -> profile { limit(30).where("receiver_id = ? OR sender_id = ?", profile, profile) }
22 22  
23   - scope :not_replies, :conditions => {:scrap_id => nil}
  23 + scope :not_replies, -> { where scrap_id: nil }
24 24  
25 25 track_actions :leave_scrap, :after_create, :keep_params => ['sender.name', 'content', 'receiver.name', 'receiver.url'], :if => Proc.new{|s| s.sender != s.receiver && s.sender != s.top_root.receiver}, :custom_target => :action_tracker_target, :custom_user => :sender
26 26  
... ...
app/models/search_term_occurrence.rb
1 1 class SearchTermOccurrence < ActiveRecord::Base
  2 +
2 3 belongs_to :search_term
3 4 validates_presence_of :search_term
4 5 attr_accessible :search_term, :created_at, :total, :indexed
5 6  
6 7 EXPIRATION_TIME = 1.year
7 8  
8   - scope :valid, :conditions => ["search_term_occurrences.created_at > ?", DateTime.now - EXPIRATION_TIME]
  9 + scope :valid, -> { where "search_term_occurrences.created_at > ?", DateTime.now - EXPIRATION_TIME }
  10 +
9 11 end
... ...
app/models/slideshow_block.rb
... ... @@ -13,7 +13,7 @@ class SlideshowBlock &lt; Block
13 13 end
14 14  
15 15 def gallery
16   - gallery_id ? Gallery.find(:first, :conditions => { :id => gallery_id }) : nil
  16 + if gallery_id then Gallery.where(id: gallery_id).first else nil end
17 17 end
18 18  
19 19 def public_filename_for(image)
... ...
app/models/suggestion_connection.rb
1 1 class SuggestionConnection < ActiveRecord::Base
2   - attr_accessible :suggestion, :connection_type, :connection_id
  2 + attr_accessible :suggestion, :suggestion_id, :connection_type, :connection_id
3 3  
4 4 belongs_to :suggestion, :class_name => 'ProfileSuggestion', :foreign_key => 'suggestion_id'
5 5 belongs_to :connection, :polymorphic => true
... ...
app/models/tag.rb 0 → 100644
... ... @@ -0,0 +1,34 @@
  1 +Tag = ActsAsTaggableOn::Tag
  2 +class Tag
  3 +
  4 + attr_accessible :name, :parent_id, :pending
  5 +
  6 + has_many :children, class_name: 'Tag', foreign_key: 'parent_id', dependent: :destroy
  7 +
  8 + @@original_find = self.method(:find)
  9 + # Rename the find method to find_with_pendings that includes all tags in the search regardless if its pending or not
  10 + def self.find_with_pendings(*args)
  11 + @@original_find.call(*args)
  12 + end
  13 +
  14 + # Redefine the find method to exclude the pending tags from the search not allowing to tag something with an unapproved tag
  15 + def self.find(*args)
  16 + self.where(pending: false).find_with_pendings(*args)
  17 + end
  18 +
  19 + # Return all the tags that were suggested but not yet approved
  20 + def self.find_pendings
  21 + self.where(pending: true)
  22 + end
  23 +
  24 + # All the tags that can be a new parent for this tag, that is all but itself and its descendents to avoid loops
  25 + def parent_candidates
  26 + ActsAsTaggableOn::Tag.all - descendents - [self]
  27 + end
  28 +
  29 + # All tags that have this tag as its one of its ancestors
  30 + def descendents
  31 + children.to_a.sum([], &:descendents) + children
  32 + end
  33 +
  34 +end
... ...
app/models/task.rb
... ... @@ -50,7 +50,7 @@ class Task &lt; ActiveRecord::Base
50 50 before_validation(:on => :create) do |task|
51 51 if task.code.nil?
52 52 task.code = Task.generate_code(task.code_length)
53   - while (Task.find_by_code(task.code))
  53 + while Task.from_code(task.code).first
54 54 task.code = Task.generate_code(task.code_length)
55 55 end
56 56 end
... ... @@ -259,27 +259,28 @@ class Task &lt; ActiveRecord::Base
259 259 end
260 260 end
261 261  
262   - scope :pending, :conditions => { :status => Task::Status::ACTIVE }
263   - scope :hidden, :conditions => { :status => Task::Status::HIDDEN }
264   - scope :finished, :conditions => { :status => Task::Status::FINISHED }
265   - scope :canceled, :conditions => { :status => Task::Status::CANCELLED }
266   - scope :closed, :conditions => { :status => [Task::Status::CANCELLED, Task::Status::FINISHED] }
267   - scope :opened, :conditions => { :status => [Task::Status::ACTIVE, Task::Status::HIDDEN] }
268   - scope :of, lambda { |type| conditions = type ? "type LIKE '#{type}'" : "1=1"; {:conditions => [conditions]} }
269   - scope :order_by, lambda { |attribute, ord| {:order => "#{attribute} #{ord}"} }
270   - scope :like, lambda { |field, value| where("LOWER(#{field}) LIKE ?", "%#{value.downcase}%") if value}
271   - scope :pending_all, lambda { |profile, filter_type, filter_text|
  262 + scope :pending, -> { where status: Task::Status::ACTIVE }
  263 + scope :hidden, -> { where status: Task::Status::HIDDEN }
  264 + scope :finished, -> { where status: Task::Status::FINISHED }
  265 + scope :canceled, -> { where status: Task::Status::CANCELLED }
  266 + scope :closed, -> { where status: [Task::Status::CANCELLED, Task::Status::FINISHED] }
  267 + scope :opened, -> { where status: [Task::Status::ACTIVE, Task::Status::HIDDEN] }
  268 + scope :of, -> type { where "type LIKE ?", type if type }
  269 + scope :order_by, -> attribute, ord { order "#{attribute} #{ord}" }
  270 + scope :like, -> field, value { where "LOWER(#{field}) LIKE ?", "%#{value.downcase}%" if value }
  271 + scope :pending_all, -> profile, filter_type, filter_text {
272 272 self.to(profile).without_spam.pending.of(filter_type).like('data', filter_text)
273 273 }
274 274  
275 275 scope :to, lambda { |profile|
276 276 environment_condition = nil
277 277 if profile.person?
278   - envs_ids = Environment.find(:all).select{ |env| profile.is_admin?(env) }.map { |env| "target_id = #{env.id}"}.join(' OR ')
  278 + envs_ids = Environment.all.select{ |env| profile.is_admin?(env) }.map{ |env| "target_id = #{env.id}"}.join(' OR ')
279 279 environment_condition = envs_ids.blank? ? nil : "(target_type = 'Environment' AND (#{envs_ids}))"
280 280 end
281 281 profile_condition = "(target_type = 'Profile' AND target_id = #{profile.id})"
282   - { :conditions => [environment_condition, profile_condition].compact.join(' OR ') }
  282 +
  283 + where [environment_condition, profile_condition].compact.join(' OR ')
283 284 }
284 285  
285 286 def self.pending_types_for(profile)
... ... @@ -337,6 +338,12 @@ class Task &lt; ActiveRecord::Base
337 338 end
338 339 end
339 340  
  341 + # finds a task by its (generated) code. Only returns a task with the
  342 + # specified code AND with status = Task::Status::ACTIVE.
  343 + #
  344 + # Can be used in subclasses to find only their instances.
  345 + scope :from_code, -> code { where code: code, status: Task::Status::ACTIVE }
  346 +
340 347 class << self
341 348  
342 349 # generates a random code string consisting of length characters (or 36 by
... ... @@ -350,14 +357,6 @@ class Task &lt; ActiveRecord::Base
350 357 code
351 358 end
352 359  
353   - # finds a task by its (generated) code. Only returns a task with the
354   - # specified code AND with status = Task::Status::ACTIVE.
355   - #
356   - # Can be used in subclasses to find only their instances.
357   - def find_by_code(code)
358   - self.find(:first, :conditions => { :code => code, :status => Task::Status::ACTIVE })
359   - end
360   -
361 360 def per_page
362 361 15
363 362 end
... ...
app/models/thumbnail.rb
1 1 class Thumbnail < ActiveRecord::Base
  2 +
  3 + attr_accessible :uploaded_data
  4 + # mass assigned by attachment_fu
  5 + attr_accessible :content_type, :filename, :thumbnail_resize_options, :thumbnail, :parent_id
  6 +
2 7 has_attachment :storage => :file_system,
3   - :content_type => :image, :max_size => 5.megabytes
  8 + :content_type => :image, :max_size => 5.megabytes, processor: 'Rmagick'
4 9 validates_as_attachment
5 10  
6 11 sanitize_filename
7 12  
8 13 postgresql_attachment_fu
9 14  
10   - attr_accessible :uploaded_data
11 15 end
... ...
app/models/tiny_mce_article.rb
... ... @@ -9,7 +9,7 @@ class TinyMceArticle &lt; TextArticle
9 9 def self.description
10 10 _('Not accessible for visually impaired users.')
11 11 end
12   -
  12 +
13 13 xss_terminate :only => [ ]
14 14  
15 15 xss_terminate :only => [ :name, :abstract, :body ], :with => 'white_list', :on => 'validation'
... ...
app/models/uploaded_file.rb
... ... @@ -63,7 +63,8 @@ class UploadedFile &lt; Article
63 63 has_attachment :storage => :file_system,
64 64 :thumbnails => { :icon => [24,24], :bigicon => [50,50], :thumb => '130x130>', :slideshow => '320x240>', :display => '640X480>' },
65 65 :thumbnail_class => Thumbnail,
66   - :max_size => self.max_size
  66 + :max_size => self.max_size,
  67 + processor: 'Rmagick'
67 68  
68 69 validates_attachment :size => N_("{fn} of uploaded file was larger than the maximum size of %{size}").sub('%{size}', self.max_size.to_humanreadable).fix_i18n
69 70  
... ...
app/models/user.rb
... ... @@ -102,7 +102,8 @@ class User &lt; ActiveRecord::Base
102 102 end
103 103 end
104 104  
105   - has_one :person, :dependent => :destroy
  105 + # set autosave to false as we do manually when needed and Person syncs with us
  106 + has_one :person, dependent: :destroy, autosave: false
106 107 belongs_to :environment
107 108  
108 109 has_many :sessions, dependent: :destroy
... ... @@ -356,12 +357,12 @@ class User &lt; ActiveRecord::Base
356 357 end
357 358  
358 359 def name
359   - name = (self[:name] || login)
  360 + name = (@name || login)
360 361 person.nil? ? name : (person.name || name)
361 362 end
362 363  
363 364 def name= name
364   - self[:name] = name
  365 + @name = name
365 366 end
366 367  
367 368 def enable_email!
... ...
app/views/categories/_category.html.erb
... ... @@ -15,7 +15,7 @@
15 15 <div>
16 16 <%= link_to _('Add subcategory'), :action => 'new', :parent_id => category %>
17 17 <%= link_to _('Edit'), :action => 'edit', :id => category %>
18   - <%= link_to _('Remove'), { :action => 'remove', :id => category, }, :method => 'post', :confirm => (category.children.empty? ? (_('Are you sure you want to remove "%s"?') % category.name) : (_('Are you sure you want to remove "%s" and all its subcategories?') % category.name) ) %>
  18 + <%= link_to _('Remove'), { action: 'remove', id: category, }, method: 'post', data: {confirm: if category.children.empty? then _('Are you sure you want to remove "%s"?') % category.name else _('Are you sure you want to remove "%s" and all its subcategories?') % category.name end} %>
19 19 </div>
20 20 </div>
21 21  
... ...
app/views/cms/edit.html.erb
... ... @@ -9,7 +9,7 @@
9 9  
10 10 <%= hidden_field_tag('success_back_to', @success_back_to) %>
11 11  
12   - <%= render :partial => partial_for_class(@article.class), :locals => { :f => f } %>
  12 + <%= render_partial_for_class @article.class, f: f %>
13 13  
14 14 <% if environment.is_portal_community?(profile) %>
15 15 <div>
... ... @@ -58,7 +58,7 @@
58 58  
59 59 <% unless @article.new_record? %>
60 60 <%= button :delete, _('Delete'), {:controller => :cms, :action => :destroy, :id => @article},
61   - :method => :post, :confirm => delete_article_message(@article) %>
  61 + :method => :post, data: {confirm: delete_article_message(@article)} %>
62 62 <% end %>
63 63 <% end %>
64 64 <% end %>
... ...
app/views/comment/_comment_form.html.erb
... ... @@ -55,7 +55,7 @@ function check_captcha(button, confirm_action) {
55 55 <div class="post_comment_box <%= ((defined? show_form) && show_form) ? 'opened' : 'closed' %>">
56 56  
57 57 <%= link_to(_('Post a comment'), '#', :class => 'display-comment-form') if display_link && @comment.reply_of_id.blank? %>
58   -<%= remote_form_for(:comment, @comment, :url => {:profile => profile.identifier, :controller => 'comment', :action => (edition_mode ? 'update' : 'create'), :id => (edition_mode ? @comment.id : @page.id)}, :html => { :class => 'comment_form' } ) do |f| %>
  58 +<%= remote_form_for(@comment, :url => {:profile => profile.identifier, :controller => 'comment', :action => (edition_mode ? 'update' : 'create'), :id => (edition_mode ? @comment.id : @page.id)}, :html => { :class => 'comment_form' } ) do |f| %>
59 59  
60 60 <%= required_fields_message %>
61 61  
... ...
app/views/comment_notifier/mail_to_followers.html.erb
... ... @@ -18,5 +18,5 @@
18 18 <%= _("Greetings,") %>
19 19  
20 20 --
21   -<%= _('%s team.') % @environment %>
  21 +<%= _('%s team.') % @environment.name %>
22 22 <%= url_for @url %>
... ...
app/views/comment_notifier/notification.text.erb
... ... @@ -15,5 +15,5 @@
15 15 <%= _("Greetings,") %>
16 16  
17 17 --
18   -<%= _('%s team.') % @environment %>
  18 +<%= _('%s team.') % @environment.name %>
19 19 <%= url_for @url %>
... ...