Commit a700537c4634a1332b10c4615cd731e42b288072
Exists in
master
and in
20 other branches
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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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)')) | ... | ... |
... | ... | @@ -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 | ... | ... |
... | ... | @@ -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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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
app/models/approve_comment.rb
... | ... | @@ -8,7 +8,7 @@ class ApproveComment < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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
app/models/block.rb
... | ... | @@ -20,7 +20,7 @@ class Block < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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
app/models/invite_friend.rb
... | ... | @@ -45,7 +45,7 @@ class InviteFriend < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 => get_limit, :order => '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 < 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 < 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 < 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
app/models/rss_feed.rb
... | ... | @@ -40,7 +40,7 @@ class RssFeed < 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 < 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 < 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 < 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 | ... | ... |
... | ... | @@ -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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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