Commit 92fbfd944ae0d9f1f97a8d7ca7debcf293171a18

Authored by Victor Costa
2 parents 30cd68bf 10e08553

Merge branch 'master_rails4' into staging

Conflicts:
	Gemfile
	Rakefile
	app/controllers/box_organizer_controller.rb
	app/controllers/my_profile/tasks_controller.rb
	app/controllers/public/profile_controller.rb
	app/mailers/user_mailer.rb
	app/models/article.rb
	app/models/person.rb
	app/models/product_category.rb
	app/models/task.rb
	config/application.rb
	config/routes.rb
	lib/acts_as_having_settings.rb
	lib/noosfero/api/entities.rb
	lib/noosfero/api/helpers.rb
	lib/noosfero/api/session.rb
	lib/noosfero/api/v1/articles.rb
	lib/noosfero/api/v1/contacts.rb
	lib/noosfero/api/v1/search.rb
	lib/noosfero/api/v1/users.rb
	test/functional/tasks_controller_test.rb
	test/unit/api/articles_test.rb
	test/unit/api/helpers_test.rb
	test/unit/api/people_test.rb
	test/unit/api/search_test.rb
	test/unit/api/session_test.rb
	test/unit/api/users_test.rb
	test/unit/person_notifier_test.rb
	test/unit/task_test.rb
	vendor/plugins/access_control/lib/acts_as_accessible.rb
Showing 1494 changed files with 29787 additions and 74185 deletions   Show diff stats

Too many changes.

To preserve performance only 100 of 1494 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 +
  3 +platform :ruby do
  4 + gem 'pg', '~> 0.17'
  5 + gem 'rmagick', '~> 2.13'
  6 +end
  7 +platform :jruby do
  8 + gem 'activerecord-jdbcpostgresql-adapter'
  9 + gem 'rmagick4j'
  10 +end
  11 +
  12 +gem 'rails', '~> 4.2.4'
  13 +gem 'fast_gettext', '~> 0.9'
  14 +gem 'acts-as-taggable-on', '~> 3.5'
6 15 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'
  16 +gem 'RedCloth', '~> 4.2'
11 17 gem 'ruby-feedparser', '~> 0.7'
12   -gem 'daemons', '~> 1.1.5'
13   -#gem 'thin', '~> 1.3.1'
14   -gem 'nokogiri', '~> 1.6.0'
  18 +gem 'daemons', '~> 1.1'
15 19 gem 'unicorn', '~> 4.8'
16   -#gem 'nokogiri', '~> 1.5.5'
  20 +gem 'nokogiri', '~> 1.6.0'
  21 +gem 'will_paginate'
  22 +gem 'pothoven-attachment_fu', '~> 3.2.16'
  23 +gem 'delayed_job'
  24 +gem 'delayed_job_active_record'
17 25 gem 'rake', :require => false
18   -gem 'rest-client', '~> 1.6.7'
  26 +gem 'rest-client', '~> 1.6'
19 27 gem 'exception_notification', '~> 4.0.1'
20   -gem 'gettext', '~> 2.2.1', :require => false
21   -gem 'locale', '~> 2.0.5'
  28 +gem 'gettext', '~> 3.1', :require => false
  29 +gem 'locale', '~> 2.1'
22 30 gem 'whenever', :require => false
23   -gem 'eita-jrails', '~> 0.9.5', require: 'jrails'
  31 +gem 'eita-jrails', '~> 0.10.0', require: 'jrails'
  32 +gem 'diffy', '~> 3.0'
24 33  
25 34 # API dependencies
26 35 gem 'grape', '~> 0.12'
27 36 gem 'grape-entity'
  37 +gem 'grape_logging'
28 38 gem 'grape-swagger'
29 39 gem 'swagger-ui_rails'
30 40 gem 'kramdown'
31   -
32   -#FIXME Get the Grape Loggin from master yo solve this issue https://github.com/intridea/grape/issues/1059
33   -#We have to remove this commit referenve code when update the next release of grape_logging. Actualy we are using (1.1.2)
34   -gem 'grape_logging', :git => 'https://github.com/aceunreal/grape_logging.git', :ref => 'f1755ae'
35   -#gem 'grape_logging'
36 41 gem 'rack-cors'
37 42 gem 'rack-contrib'
38 43 gem 'liquid', '~> 3.0.3'
39   -#gem 'grape-swagger-rails'
40   -gem 'rubyzip'
41   -
42   -gem 'execjs'
43   -gem 'therubyracer'
44   -
45   -# FIXME list here all actual dependencies (i.e. the ones in debian/control),
46   -# with their GEM names (not the Debian package names)
47 44  
48 45 gem 'api-pagination', '~> 4.1.1'
49 46  
50 47 # asset pipeline
51 48 gem 'uglifier', '>= 1.0.3'
52 49 gem 'sass-rails'
53   -gem 'sass', '~> 3.1.19'
  50 +
  51 +# gems to enable rails3 behaviour
  52 +gem 'protected_attributes'
  53 +gem 'rails-observers'
  54 +gem 'actionpack-page_caching'
  55 +gem 'actionpack-action_caching'
  56 +gem 'activerecord-session_store'
  57 +gem 'activerecord-deprecated_finders', require: 'active_record/deprecated_finders'
54 58  
55 59 group :production do
56 60 gem 'dalli', '~> 2.7.0'
57 61 end
58 62  
  63 +group :development do
  64 +end
  65 +
  66 +group :development, :test do
  67 + gem 'spring'
  68 +end
  69 +
59 70 group :test do
60   - gem 'rspec', '~> 2.14.0'
61   - gem 'rspec-rails', '~> 2.14.1'
  71 + gem 'rspec', '~> 3.3', require: false
  72 + gem 'rspec-rails', '~> 3.2', require: false
62 73 gem 'mocha', '~> 1.1.0', :require => false
  74 + gem 'test-unit' if RUBY_VERSION >= '2.2.0'
  75 + gem 'minitest'
  76 + gem 'minitest-reporters'
63 77 end
64 78  
65 79 group :cucumber do
66   - gem 'cucumber-rails', '~> 1.0.6', :require => false
67   - gem 'capybara', '~> 2.1.0'
68   - gem 'cucumber', '~> 1.0.6'
69   - gem 'database_cleaner', '~> 1.2.0'
70   - gem 'selenium-webdriver', '~> 2.47.0'
  80 + gem 'capybara', '~> 2.2'
  81 + gem 'launchy'
  82 + gem 'cucumber'
  83 + gem 'cucumber-rails', '~> 1.4.2', :require => false
  84 + gem 'database_cleaner', '~> 1.3'
  85 + gem 'selenium-webdriver'
71 86 end
72 87  
73 88 # Requires custom dependencies
74 89 eval(File.read('config/Gemfile'), binding) rescue nil
75 90  
  91 +vendor = Dir.glob('vendor/{,plugins/}*') - ['vendor/plugins']
  92 +vendor.each do |dir|
  93 + plugin = File.basename dir
  94 + version = if Dir.glob("#{dir}/*.gemspec").length > 0 then '> 0.0.0' else '0.0.0' end
  95 +
  96 + gem plugin, version, path: dir
  97 +end
  98 +
76 99 # include gemfiles from enabled plugins
77 100 # plugins in baseplugins/ are not included on purpose. They should not have any
78 101 # dependencies.
... ...
Gemfile.lock
1   -GIT
2   - remote: https://github.com/aceunreal/grape_logging.git
3   - revision: f1755ae4e1d897a65b20218d40681f59a9630f1b
4   - ref: f1755ae
  1 +PATH
  2 + remote: vendor/contacts
5 3 specs:
6   - grape_logging (1.1.2)
7   - grape
  4 + contacts (1.2.0)
  5 + gdata (>= 1.1.1)
  6 + json (>= 1.1.1)
  7 +
  8 +PATH
  9 + remote: vendor/ezcrypto
  10 + specs:
  11 + ezcrypto (0.0.0)
  12 +
  13 +PATH
  14 + remote: vendor/gdata
  15 + specs:
  16 + gdata (1.1.1)
  17 +
  18 +PATH
  19 + remote: vendor/plugins/access_control
  20 + specs:
  21 + access_control (0.0.0)
  22 +
  23 +PATH
  24 + remote: vendor/plugins/action_tracker
  25 + specs:
  26 + action_tracker (0.0.1)
  27 +
  28 +PATH
  29 + remote: vendor/plugins/action_tracker_has_comments
  30 + specs:
  31 + action_tracker_has_comments (0.0.0)
  32 +
  33 +PATH
  34 + remote: vendor/plugins/acts_as_list
  35 + specs:
  36 + acts_as_list (0.0.0)
  37 +
  38 +PATH
  39 + remote: vendor/plugins/acts_as_tree
  40 + specs:
  41 + acts_as_tree (0.0.0)
  42 +
  43 +PATH
  44 + remote: vendor/plugins/acts_as_versioned
  45 + specs:
  46 + acts_as_versioned (3.2.1)
  47 + activerecord
  48 +
  49 +PATH
  50 + remote: vendor/plugins/honeypot
  51 + specs:
  52 + honeypot (0.0.0)
  53 +
  54 +PATH
  55 + remote: vendor/plugins/i18n_deprecation
  56 + specs:
  57 + i18n_deprecation (0.0.0)
  58 +
  59 +PATH
  60 + remote: vendor/plugins/kandadaboggu-vote_fu
  61 + specs:
  62 + kandadaboggu-vote_fu (0.0.15)
  63 +
  64 +PATH
  65 + remote: vendor/plugins/monkey_patches
  66 + specs:
  67 + monkey_patches (0.0.0)
  68 +
  69 +PATH
  70 + remote: vendor/plugins/noosfero_caching
  71 + specs:
  72 + noosfero_caching (0.0.0)
  73 +
  74 +PATH
  75 + remote: vendor/plugins/rails_rcov
  76 + specs:
  77 + rails_rcov (0.0.0)
  78 +
  79 +PATH
  80 + remote: vendor/plugins/recaptcha
  81 + specs:
  82 + recaptcha (0.3.2)
  83 + i18n
  84 +
  85 +PATH
  86 + remote: vendor/plugins/ruby_bosh
  87 + specs:
  88 + ruby_bosh (0.5.4)
  89 + builder
  90 + rest-client
  91 +
  92 +PATH
  93 + remote: vendor/plugins/validates_as_cnpj
  94 + specs:
  95 + validates_as_cnpj (0.0.0)
  96 +
  97 +PATH
  98 + remote: vendor/plugins/validates_multiparameter_assignments
  99 + specs:
  100 + validates_multiparameter_assignments (0.0.0)
  101 +
  102 +PATH
  103 + remote: vendor/plugins/xss_terminate
  104 + specs:
  105 + xss_terminate (0.0.0)
8 106  
9 107 GEM
10 108 remote: https://rubygems.org/
11 109 specs:
12 110 RedCloth (4.2.9)
13   - actionmailer (3.2.22)
14   - actionpack (= 3.2.22)
15   - mail (~> 2.5.4)
16   - actionpack (3.2.22)
17   - activemodel (= 3.2.22)
18   - activesupport (= 3.2.22)
19   - builder (~> 3.0.0)
  111 + actionmailer (4.2.5)
  112 + actionpack (= 4.2.5)
  113 + actionview (= 4.2.5)
  114 + activejob (= 4.2.5)
  115 + mail (~> 2.5, >= 2.5.4)
  116 + rails-dom-testing (~> 1.0, >= 1.0.5)
  117 + actionpack (4.2.5)
  118 + actionview (= 4.2.5)
  119 + activesupport (= 4.2.5)
  120 + rack (~> 1.6)
  121 + rack-test (~> 0.6.2)
  122 + rails-dom-testing (~> 1.0, >= 1.0.5)
  123 + rails-html-sanitizer (~> 1.0, >= 1.0.2)
  124 + actionpack-action_caching (1.1.1)
  125 + actionpack (>= 4.0.0, < 5.0)
  126 + actionpack-page_caching (1.0.2)
  127 + actionpack (>= 4.0.0, < 5)
  128 + actionview (4.2.5)
  129 + activesupport (= 4.2.5)
  130 + builder (~> 3.1)
20 131 erubis (~> 2.7.0)
21   - journey (~> 1.0.4)
22   - rack (~> 1.4.5)
23   - rack-cache (~> 1.2)
24   - rack-test (~> 0.6.1)
25   - sprockets (~> 2.2.1)
26   - activemodel (3.2.22)
27   - activesupport (= 3.2.22)
28   - builder (~> 3.0.0)
29   - activerecord (3.2.22)
30   - activemodel (= 3.2.22)
31   - activesupport (= 3.2.22)
32   - arel (~> 3.0.2)
33   - tzinfo (~> 0.3.29)
34   - activeresource (3.2.22)
35   - activemodel (= 3.2.22)
36   - activesupport (= 3.2.22)
37   - activesupport (3.2.22)
38   - i18n (~> 0.6, >= 0.6.4)
39   - multi_json (~> 1.0)
40   - acts-as-taggable-on (3.4.4)
  132 + rails-dom-testing (~> 1.0, >= 1.0.5)
  133 + rails-html-sanitizer (~> 1.0, >= 1.0.2)
  134 + activejob (4.2.5)
  135 + activesupport (= 4.2.5)
  136 + globalid (>= 0.3.0)
  137 + activemodel (4.2.5)
  138 + activesupport (= 4.2.5)
  139 + builder (~> 3.1)
  140 + activerecord (4.2.5)
  141 + activemodel (= 4.2.5)
  142 + activesupport (= 4.2.5)
  143 + arel (~> 6.0)
  144 + activerecord-deprecated_finders (1.0.4)
  145 + activerecord-session_store (0.1.2)
  146 + actionpack (>= 4.0.0, < 5)
  147 + activerecord (>= 4.0.0, < 5)
  148 + railties (>= 4.0.0, < 5)
  149 + activesupport (4.2.5)
  150 + i18n (~> 0.7)
  151 + json (~> 1.7, >= 1.7.7)
  152 + minitest (~> 5.1)
  153 + thread_safe (~> 0.3, >= 0.3.4)
  154 + tzinfo (~> 1.1)
  155 + acts-as-taggable-on (3.5.0)
41 156 activerecord (>= 3.2, < 5)
  157 + addressable (2.3.8)
  158 + ansi (1.5.0)
42 159 api-pagination (4.1.1)
43   - arel (3.0.3)
  160 + arel (6.0.3)
44 161 axiom-types (0.1.1)
45 162 descendants_tracker (~> 0.0.4)
46 163 ice_nine (~> 0.11.0)
47 164 thread_safe (~> 0.3, >= 0.3.1)
48   - builder (3.0.4)
49   - capybara (2.1.0)
  165 + builder (3.2.2)
  166 + capybara (2.5.0)
50 167 mime-types (>= 1.16)
51 168 nokogiri (>= 1.3.3)
52 169 rack (>= 1.0.0)
53 170 rack-test (>= 0.5.4)
54 171 xpath (~> 2.0)
55   - childprocess (0.5.6)
  172 + childprocess (0.5.8)
56 173 ffi (~> 1.0, >= 1.0.11)
57 174 chronic (0.10.2)
58 175 coercible (1.0.0)
59 176 descendants_tracker (~> 0.0.1)
60   - cucumber (1.0.6)
  177 + cucumber (1.3.20)
61 178 builder (>= 2.1.2)
62   - diff-lcs (>= 1.1.2)
63   - gherkin (~> 2.4.18)
64   - json (>= 1.4.6)
65   - term-ansicolor (>= 1.0.6)
66   - cucumber-rails (1.0.6)
67   - capybara (>= 1.1.1)
68   - cucumber (>= 1.0.6)
69   - nokogiri (>= 1.5.0)
70   - daemons (1.1.9)
  179 + diff-lcs (>= 1.1.3)
  180 + gherkin (~> 2.12)
  181 + multi_json (>= 1.7.5, < 2.0)
  182 + multi_test (>= 0.1.2)
  183 + cucumber-rails (1.4.2)
  184 + capybara (>= 1.1.2, < 3)
  185 + cucumber (>= 1.3.8, < 2)
  186 + mime-types (>= 1.16, < 3)
  187 + nokogiri (~> 1.5)
  188 + rails (>= 3, < 5)
  189 + daemons (1.2.3)
71 190 dalli (2.7.4)
72   - database_cleaner (1.2.0)
  191 + database_cleaner (1.5.1)
  192 + delayed_job (4.1.1)
  193 + activesupport (>= 3.0, < 5.0)
  194 + delayed_job_active_record (4.1.0)
  195 + activerecord (>= 3.0, < 5)
  196 + delayed_job (>= 3.0, < 5)
73 197 descendants_tracker (0.0.4)
74 198 thread_safe (~> 0.3, >= 0.3.1)
75 199 diff-lcs (1.2.5)
76   - eita-jrails (0.9.8)
  200 + diffy (3.0.7)
  201 + domain_name (0.5.25)
  202 + unf (>= 0.0.5, < 1.0.0)
  203 + eita-jrails (0.10.0)
77 204 actionpack (>= 3.1.0)
78 205 activesupport (>= 3.0.0)
79 206 equalizer (0.0.11)
... ... @@ -82,13 +209,16 @@ GEM
82 209 actionmailer (>= 3.0.4)
83 210 activesupport (>= 3.0.4)
84 211 execjs (2.6.0)
85   - fast_gettext (0.6.12)
  212 + fast_gettext (0.9.2)
86 213 ffi (1.9.10)
87   - gettext (2.2.1)
88   - locale
89   - gherkin (2.4.21)
90   - json (>= 1.4.6)
  214 + gettext (3.1.7)
  215 + locale (>= 2.0.5)
  216 + text (>= 1.3.0)
  217 + gherkin (2.12.2)
  218 + multi_json (~> 1.3)
91 219 git-version-bump (0.15.1)
  220 + globalid (0.3.6)
  221 + activesupport (>= 4.1.0)
92 222 grape (0.13.0)
93 223 activesupport
94 224 builder
... ... @@ -105,125 +235,153 @@ GEM
105 235 grape-swagger (0.10.2)
106 236 grape (>= 0.8.0)
107 237 grape-entity
108   - hashie (3.4.2)
109   - hike (1.2.3)
  238 + grape_logging (1.1.2)
  239 + grape
  240 + hashie (3.4.3)
  241 + http-cookie (1.0.2)
  242 + domain_name (~> 0.5)
110 243 i18n (0.7.0)
111 244 ice_nine (0.11.1)
112   - journey (1.0.4)
113 245 json (1.8.3)
114 246 kgio (2.10.0)
115 247 kramdown (1.9.0)
116   - libv8 (3.16.14.11)
  248 + launchy (2.4.3)
  249 + addressable (~> 2.3)
117 250 liquid (3.0.6)
118   - locale (2.0.9)
  251 + locale (2.1.2)
  252 + loofah (2.0.3)
  253 + nokogiri (>= 1.5.9)
119 254 magic (0.2.9)
120 255 ffi (>= 0.6.3)
121   - mail (2.5.4)
122   - mime-types (~> 1.16)
123   - treetop (~> 1.4.8)
  256 + mail (2.6.3)
  257 + mime-types (>= 1.16, < 3)
124 258 metaclass (0.0.4)
125   - mime-types (1.25.1)
  259 + mime-types (2.6.2)
126 260 mini_portile (0.6.2)
127   - minitest (3.2.0)
  261 + minitest (5.8.2)
  262 + minitest-reporters (1.1.5)
  263 + ansi
  264 + builder
  265 + minitest (>= 5.0)
  266 + ruby-progressbar
128 267 mocha (1.1.0)
129 268 metaclass (~> 0.0.1)
130 269 multi_json (1.11.2)
  270 + multi_test (0.1.2)
131 271 multi_xml (0.5.5)
  272 + netrc (0.11.0)
132 273 nokogiri (1.6.6.2)
133 274 mini_portile (~> 0.6.0)
134   - pg (0.13.2)
135   - polyglot (0.3.5)
136   - rack (1.4.7)
  275 + pg (0.18.4)
  276 + pothoven-attachment_fu (3.2.16)
  277 + power_assert (0.2.6)
  278 + protected_attributes (1.1.3)
  279 + activemodel (>= 4.0.1, < 5.0)
  280 + rack (1.6.4)
137 281 rack-accept (0.4.5)
138 282 rack (>= 0.4)
139   - rack-cache (1.5.0)
140   - rack (>= 0.4)
141 283 rack-contrib (1.4.0)
142 284 git-version-bump (~> 0.15)
143 285 rack (~> 1.4)
144 286 rack-cors (0.4.0)
145 287 rack-mount (0.8.3)
146 288 rack (>= 1.0.0)
147   - rack-ssl (1.3.4)
148   - rack
149 289 rack-test (0.6.3)
150 290 rack (>= 1.0)
151   - rails (3.2.22)
152   - actionmailer (= 3.2.22)
153   - actionpack (= 3.2.22)
154   - activerecord (= 3.2.22)
155   - activeresource (= 3.2.22)
156   - activesupport (= 3.2.22)
157   - bundler (~> 1.0)
158   - railties (= 3.2.22)
  291 + rails (4.2.5)
  292 + actionmailer (= 4.2.5)
  293 + actionpack (= 4.2.5)
  294 + actionview (= 4.2.5)
  295 + activejob (= 4.2.5)
  296 + activemodel (= 4.2.5)
  297 + activerecord (= 4.2.5)
  298 + activesupport (= 4.2.5)
  299 + bundler (>= 1.3.0, < 2.0)
  300 + railties (= 4.2.5)
  301 + sprockets-rails
  302 + rails-deprecated_sanitizer (1.0.3)
  303 + activesupport (>= 4.2.0.alpha)
  304 + rails-dom-testing (1.0.7)
  305 + activesupport (>= 4.2.0.beta, < 5.0)
  306 + nokogiri (~> 1.6.0)
  307 + rails-deprecated_sanitizer (>= 1.0.1)
  308 + rails-html-sanitizer (1.0.2)
  309 + loofah (~> 2.0)
  310 + rails-observers (0.1.2)
  311 + activemodel (~> 4.0)
159 312 rails_autolink (1.1.6)
160 313 rails (> 3.1)
161   - railties (3.2.22)
162   - actionpack (= 3.2.22)
163   - activesupport (= 3.2.22)
164   - rack-ssl (~> 1.3.2)
  314 + railties (4.2.5)
  315 + actionpack (= 4.2.5)
  316 + activesupport (= 4.2.5)
165 317 rake (>= 0.8.7)
166   - rdoc (~> 3.4)
167   - thor (>= 0.14.6, < 2.0)
  318 + thor (>= 0.18.1, < 2.0)
168 319 raindrops (0.15.0)
169 320 rake (10.4.2)
170   - rdoc (3.12.2)
171   - json (~> 1.4)
172   - ref (2.0.0)
173   - rest-client (1.6.9)
174   - mime-types (~> 1.16)
175   - rmagick (2.13.4)
176   - rspec (2.14.1)
177   - rspec-core (~> 2.14.0)
178   - rspec-expectations (~> 2.14.0)
179   - rspec-mocks (~> 2.14.0)
180   - rspec-core (2.14.8)
181   - rspec-expectations (2.14.5)
182   - diff-lcs (>= 1.1.3, < 2.0)
183   - rspec-mocks (2.14.6)
184   - rspec-rails (2.14.2)
185   - actionpack (>= 3.0)
186   - activemodel (>= 3.0)
187   - activesupport (>= 3.0)
188   - railties (>= 3.0)
189   - rspec-core (~> 2.14.0)
190   - rspec-expectations (~> 2.14.0)
191   - rspec-mocks (~> 2.14.0)
  321 + rest-client (1.8.0)
  322 + http-cookie (>= 1.0.2, < 2.0)
  323 + mime-types (>= 1.16, < 3.0)
  324 + netrc (~> 0.7)
  325 + rmagick (2.15.4)
  326 + rspec (3.4.0)
  327 + rspec-core (~> 3.4.0)
  328 + rspec-expectations (~> 3.4.0)
  329 + rspec-mocks (~> 3.4.0)
  330 + rspec-core (3.4.0)
  331 + rspec-support (~> 3.4.0)
  332 + rspec-expectations (3.4.0)
  333 + diff-lcs (>= 1.2.0, < 2.0)
  334 + rspec-support (~> 3.4.0)
  335 + rspec-mocks (3.4.0)
  336 + diff-lcs (>= 1.2.0, < 2.0)
  337 + rspec-support (~> 3.4.0)
  338 + rspec-rails (3.4.0)
  339 + actionpack (>= 3.0, < 4.3)
  340 + activesupport (>= 3.0, < 4.3)
  341 + railties (>= 3.0, < 4.3)
  342 + rspec-core (~> 3.4.0)
  343 + rspec-expectations (~> 3.4.0)
  344 + rspec-mocks (~> 3.4.0)
  345 + rspec-support (~> 3.4.0)
  346 + rspec-support (3.4.0)
192 347 ruby-feedparser (0.9.3)
193 348 magic
  349 + ruby-progressbar (1.7.5)
194 350 rubyzip (1.1.7)
195   - sass (3.1.21)
196   - sass-rails (3.2.6)
197   - railties (~> 3.2.0)
198   - sass (>= 3.1.10)
199   - tilt (~> 1.3)
200   - selenium-webdriver (2.47.1)
  351 + sass (3.4.19)
  352 + sass-rails (5.0.4)
  353 + railties (>= 4.0.0, < 5.0)
  354 + sass (~> 3.1)
  355 + sprockets (>= 2.8, < 4.0)
  356 + sprockets-rails (>= 2.0, < 4.0)
  357 + tilt (>= 1.1, < 3)
  358 + selenium-webdriver (2.48.1)
201 359 childprocess (~> 0.5)
202 360 multi_json (~> 1.0)
203 361 rubyzip (~> 1.0)
204 362 websocket (~> 1.0)
205   - sprockets (2.2.3)
206   - hike (~> 1.2)
207   - multi_json (~> 1.0)
208   - rack (~> 1.0)
209   - tilt (~> 1.1, != 1.3.0)
  363 + spring (1.4.1)
  364 + sprockets (3.4.0)
  365 + rack (> 1, < 3)
  366 + sprockets-rails (2.3.3)
  367 + actionpack (>= 3.0)
  368 + activesupport (>= 3.0)
  369 + sprockets (>= 2.8, < 4.0)
210 370 swagger-ui_rails (0.1.7)
211   - term-ansicolor (1.3.2)
212   - tins (~> 1.0)
213   - therubyracer (0.12.2)
214   - libv8 (~> 3.16.14.0)
215   - ref
  371 + test-unit (3.1.5)
  372 + power_assert
  373 + text (1.3.1)
216 374 thor (0.19.1)
217 375 thread_safe (0.3.5)
218   - tilt (1.4.1)
219   - tins (1.6.0)
220   - treetop (1.4.15)
221   - polyglot
222   - polyglot (>= 0.3.1)
223   - tzinfo (0.3.45)
  376 + tilt (2.0.1)
  377 + tzinfo (1.2.2)
  378 + thread_safe (~> 0.1)
224 379 uglifier (2.7.2)
225 380 execjs (>= 0.3.0)
226 381 json (>= 1.8.0)
  382 + unf (0.1.4)
  383 + unf_ext
  384 + unf_ext (0.0.7.1)
227 385 unicorn (4.9.0)
228 386 kgio (~> 2.6)
229 387 rack
... ... @@ -244,48 +402,80 @@ PLATFORMS
244 402 ruby
245 403  
246 404 DEPENDENCIES
247   - RedCloth (~> 4.2.9)
248   - acts-as-taggable-on (~> 3.4.2)
  405 + RedCloth (~> 4.2)
  406 + access_control (= 0.0.0)!
  407 + action_tracker (> 0.0.0)!
  408 + action_tracker_has_comments (= 0.0.0)!
  409 + actionpack-action_caching
  410 + actionpack-page_caching
  411 + activerecord-deprecated_finders
  412 + activerecord-jdbcpostgresql-adapter
  413 + activerecord-session_store
  414 + acts-as-taggable-on (~> 3.5)
  415 + acts_as_list (= 0.0.0)!
  416 + acts_as_tree (= 0.0.0)!
  417 + acts_as_versioned (> 0.0.0)!
249 418 api-pagination (~> 4.1.1)
250   - capybara (~> 2.1.0)
251   - cucumber (~> 1.0.6)
252   - cucumber-rails (~> 1.0.6)
253   - daemons (~> 1.1.5)
  419 + capybara (~> 2.2)
  420 + contacts (> 0.0.0)!
  421 + cucumber
  422 + cucumber-rails (~> 1.4.2)
  423 + daemons (~> 1.1)
254 424 dalli (~> 2.7.0)
255   - database_cleaner (~> 1.2.0)
256   - eita-jrails (~> 0.9.5)
  425 + database_cleaner (~> 1.3)
  426 + delayed_job
  427 + delayed_job_active_record
  428 + diffy (~> 3.0)
  429 + eita-jrails (~> 0.10.0)
257 430 exception_notification (~> 4.0.1)
258   - execjs
259   - fast_gettext (~> 0.6.8)
260   - gettext (~> 2.2.1)
  431 + ezcrypto (= 0.0.0)!
  432 + fast_gettext (~> 0.9)
  433 + gdata (> 0.0.0)!
  434 + gettext (~> 3.1)
261 435 grape (~> 0.12)
262 436 grape-entity
263 437 grape-swagger
264   - grape_logging!
  438 + grape_logging
  439 + honeypot (= 0.0.0)!
  440 + i18n_deprecation (= 0.0.0)!
  441 + kandadaboggu-vote_fu (> 0.0.0)!
265 442 kramdown
  443 + launchy
266 444 liquid (~> 3.0.3)
267   - locale (~> 2.0.5)
268   - minitest (~> 3.2.0)
  445 + locale (~> 2.1)
  446 + minitest
  447 + minitest-reporters
269 448 mocha (~> 1.1.0)
  449 + monkey_patches (= 0.0.0)!
270 450 nokogiri (~> 1.6.0)
271   - pg (~> 0.13.2)
  451 + noosfero_caching (= 0.0.0)!
  452 + pg (~> 0.17)
  453 + pothoven-attachment_fu (~> 3.2.16)
  454 + protected_attributes
272 455 rack-contrib
273 456 rack-cors
274   - rails (~> 3.2.22)
  457 + rails (~> 4.2.4)
  458 + rails-observers
275 459 rails_autolink (~> 1.1.5)
  460 + rails_rcov (= 0.0.0)!
276 461 rake
277   - rest-client (~> 1.6.7)
278   - rmagick (~> 2.13.1)
279   - rspec (~> 2.14.0)
280   - rspec-rails (~> 2.14.1)
  462 + recaptcha (> 0.0.0)!
  463 + rest-client (~> 1.6)
  464 + rmagick (~> 2.13)
  465 + rmagick4j
  466 + rspec (~> 3.3)
  467 + rspec-rails (~> 3.2)
281 468 ruby-feedparser (~> 0.7)
282   - rubyzip
283   - sass (~> 3.1.19)
  469 + ruby_bosh (> 0.0.0)!
284 470 sass-rails
285   - selenium-webdriver (~> 2.47.0)
  471 + selenium-webdriver
  472 + spring
286 473 swagger-ui_rails
287   - therubyracer
  474 + test-unit
288 475 uglifier (>= 1.0.3)
289 476 unicorn (~> 4.8)
  477 + validates_as_cnpj (= 0.0.0)!
  478 + validates_multiparameter_assignments (= 0.0.0)!
290 479 whenever
291   - will_paginate (~> 3.0.3)
  480 + will_paginate
  481 + xss_terminate (= 0.0.0)!
... ...
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 &lt; 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 &lt; 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 &lt; AdminController
65 65  
66 66 def set_portal_news_amount
67 67 if request.post?
68   - if @environment.update_attributes(params[:environment])
  68 + if @environment.update(params[:environment])
69 69 session[:notice] = _('Saved the number of news on folders')
70 70 redirect_to :action => 'index'
71 71 end
... ...
app/controllers/admin/categories_controller.rb
1 1 class CategoriesController < AdminController
2 2  
3 3 protect 'manage_environment_categories', :environment
4   -
  4 +
5 5 helper :categories
6 6  
7 7 def index
8   - @categories = environment.categories.find(:all, :conditions => "parent_id is null AND type is null")
9   - @regions = environment.regions.find(:all, :conditions => {:parent_id => nil})
10   - @product_categories = environment.product_categories.find(:all, :conditions => {:parent_id => nil})
  8 + @categories = environment.categories.where("parent_id is null AND type is null")
  9 + @regions = environment.regions.where(:parent_id => nil)
  10 + @product_categories = environment.product_categories.where(:parent_id => nil)
11 11 end
12 12  
13 13 def get_children
... ... @@ -43,7 +43,7 @@ class CategoriesController &lt; AdminController
43 43 begin
44 44 @category = environment.categories.find(params[:id])
45 45 if request.post?
46   - @category.update_attributes!(params[:category])
  46 + @category.update!(params[:category])
47 47 @saved = true
48 48 session[:notice] = _("Category %s saved." % @category.name)
49 49 redirect_to :action => 'index'
... ...
app/controllers/admin/environment_role_manager_controller.rb
... ... @@ -2,7 +2,7 @@ class EnvironmentRoleManagerController &lt; AdminController
2 2 protect 'manage_environment_roles', :environment
3 3  
4 4 def index
5   - @admins = Person.find(:all, :conditions => ['role_assignments.resource_type = ?', 'Environment'], :include => :role_assignments )
  5 + @admins = Person.where('role_assignments.resource_type = ?', 'Environment').includes(:role_assignments)
6 6 end
7 7  
8 8 def change_roles
... ...
app/controllers/admin/features_controller.rb
... ... @@ -36,7 +36,7 @@ class FeaturesController &lt; AdminController
36 36  
37 37 post_only :update
38 38 def update
39   - if @environment.update_attributes(params[:environment])
  39 + if @environment.update(params[:environment])
40 40 session[:notice] = _('Features updated successfully.')
41 41 redirect_to :action => 'index'
42 42 else
... ... @@ -93,7 +93,7 @@ class FeaturesController &lt; AdminController
93 93  
94 94 def search_members
95 95 arg = params[:q].downcase
96   - result = environment.people.find(:all, :conditions => ['LOWER(name) LIKE ? OR identifier LIKE ?', "%#{arg}%", "%#{arg}%"])
  96 + result = environment.people.where('LOWER(name) LIKE ? OR identifier LIKE ?', "%#{arg}%", "%#{arg}%")
97 97 render :text => prepare_to_token_input(result).to_json
98 98 end
99 99  
... ...
app/controllers/admin/licenses_controller.rb
... ... @@ -23,7 +23,7 @@ class LicensesController &lt; AdminController
23 23 @license = environment.licenses.find(params[:license_id])
24 24 if request.post?
25 25 begin
26   - @license.update_attributes!(params[:license])
  26 + @license.update!(params[:license])
27 27 session[:notice] = _('License updated')
28 28 redirect_to :action => 'index'
29 29 rescue
... ...
app/controllers/admin/plugins_controller.rb
... ... @@ -8,7 +8,7 @@ class PluginsController &lt; AdminController
8 8 post_only :update
9 9 def update
10 10 params[:environment][:enabled_plugins].delete('')
11   - if @environment.update_attributes(params[:environment])
  11 + if @environment.update(params[:environment])
12 12 session[:notice] = _('Plugins updated successfully.')
13 13 else
14 14 session[:error] = _('Plugins were not updated successfully.')
... ...
app/controllers/admin/role_controller.rb
... ... @@ -29,7 +29,7 @@ class RoleController &lt; AdminController
29 29  
30 30 def update
31 31 @role = environment.roles.find(params[:id])
32   - if @role.update_attributes(params[:role])
  32 + if @role.update(params[:role])
33 33 redirect_to :action => 'show', :id => @role
34 34 else
35 35 session[:notice] = _('Failed to edit role')
... ...
app/controllers/admin/users_controller.rb
... ... @@ -63,7 +63,7 @@ class UsersController &lt; AdminController
63 63 respond_to do |format|
64 64 format.html
65 65 format.xml do
66   - users = User.find(:all, :conditions => {:environment_id => environment.id}, :include => [:person])
  66 + users = User.where(:environment_id => environment.id).includes(:person)
67 67 send_data users.to_xml(
68 68 :skip_types => true,
69 69 :only => %w[email login created_at updated_at],
... ...
app/controllers/application.rb
... ... @@ -1 +0,0 @@
1   -require 'application_controller'
app/controllers/application_controller.rb
... ... @@ -8,7 +8,7 @@ class ApplicationController &lt; ActionController::Base
8 8 before_filter :init_noosfero_plugins
9 9 before_filter :allow_cross_domain_access
10 10  
11   - before_filter :login_from_cookie
  11 + include AuthenticatedSystem
12 12 before_filter :require_login_for_environment, :if => :private_environment?
13 13  
14 14 before_filter :verify_members_whitelist, :if => [:private_environment?, :user]
... ... @@ -50,7 +50,7 @@ class ApplicationController &lt; ActionController::Base
50 50 include ApplicationHelper
51 51 layout :get_layout
52 52 def get_layout
53   - return nil if request.format == :js or request.xhr?
  53 + return false if request.format == :js or request.xhr?
54 54  
55 55 theme_layout = theme_option(:layout)
56 56 if theme_layout
... ... @@ -74,15 +74,12 @@ class ApplicationController &lt; ActionController::Base
74 74 helper :language
75 75  
76 76 include DesignHelper
77   -
78   - # Be sure to include AuthenticationSystem in Application Controller instead
79   - include AuthenticatedSystem
80 77 include PermissionCheck
81 78  
82 79 before_filter :set_locale
83 80 def set_locale
84 81 FastGettext.available_locales = environment.available_locales
85   - FastGettext.default_locale = environment.default_locale
  82 + FastGettext.default_locale = environment.default_locale || 'en'
86 83 FastGettext.locale = (params[:lang] || session[:lang] || environment.default_locale || request.env['HTTP_ACCEPT_LANGUAGE'] || 'en')
87 84 I18n.locale = FastGettext.locale.to_s.gsub '_', '-'
88 85 I18n.default_locale = FastGettext.default_locale.to_s.gsub '_', '-'
... ... @@ -153,7 +150,7 @@ class ApplicationController &lt; ActionController::Base
153 150 # Check if the requested profile belongs to another domain
154 151 if @profile && !params[:profile].blank? && params[:profile] != @profile.identifier
155 152 @profile = @environment.profiles.find_by_identifier params[:profile]
156   - redirect_to params.merge(:host => @profile.default_hostname)
  153 + redirect_to url_for(params.merge host: @profile.default_hostname)
157 154 end
158 155 end
159 156 end
... ... @@ -168,7 +165,8 @@ class ApplicationController &lt; ActionController::Base
168 165 def render_not_found(path = nil)
169 166 @no_design_blocks = true
170 167 @path ||= request.path
171   - render :template => 'shared/not_found.html.erb', :status => 404, :layout => get_layout
  168 + # force html template even if the browser asked for a image
  169 + render template: 'shared/not_found', status: 404, layout: get_layout, formats: [:html]
172 170 end
173 171 alias :render_404 :render_not_found
174 172  
... ... @@ -176,7 +174,8 @@ class ApplicationController &lt; ActionController::Base
176 174 @no_design_blocks = true
177 175 @message = message
178 176 @title = title
179   - render :template => 'shared/access_denied.html.erb', :status => 403
  177 + # force html template even if the browser asked for a image
  178 + render template: 'shared/access_denied', status: 403, formats: [:html]
180 179 end
181 180  
182 181 def load_category
... ... @@ -190,13 +189,7 @@ class ApplicationController &lt; ActionController::Base
190 189 end
191 190  
192 191 include SearchTermHelper
193   -
194   - def find_by_contents(asset, context, scope, query, paginate_options={:page => 1}, options={})
195   - scope = scope.with_templates(options[:template_id]) unless options[:template_id].blank?
196   - search = plugins.dispatch_first(:find_by_contents, asset, scope, query, paginate_options, options)
197   - register_search_term(query, scope.count, search[:results].count, context, asset)
198   - search
199   - end
  192 + include FindByContents
200 193  
201 194 def find_suggestions(query, context, asset, options={})
202 195 plugins.dispatch_first(:find_suggestions, query, context, asset, options)
... ... @@ -209,7 +202,7 @@ class ApplicationController &lt; ActionController::Base
209 202 def redirect_to_current_user
210 203 if params[:profile] == '~'
211 204 if logged_in?
212   - redirect_to params.merge(:profile => user.identifier)
  205 + redirect_to url_for(params.merge profile: user.identifier)
213 206 else
214 207 render_not_found
215 208 end
... ...
app/controllers/box_organizer_controller.rb
... ... @@ -69,9 +69,9 @@ class BoxOrganizerController &lt; ApplicationController
69 69 if request.xhr? and params[:query]
70 70 search = params[:query]
71 71 path_list = if boxes_holder.is_a?(Environment) && boxes_holder.enabled?('use_portal_community') && boxes_holder.portal_community
72   - boxes_holder.portal_community.articles.find(:all, :conditions=>"name ILIKE '%#{search}%' or path ILIKE '%#{search}%'", :limit=>20).map { |content| "/{portal}/"+content.path }
  72 + boxes_holder.portal_community.articles.where("name ILIKE ? OR path ILIKE ?", "%#{search}%", "%#{search}%").limit(20).map { |content| "/{portal}/"+content.path }
73 73 elsif boxes_holder.is_a?(Profile)
74   - boxes_holder.articles.find(:all, :conditions=>"name ILIKE '%#{search}%' or path ILIKE '%#{search}%'", :limit=>20).map { |content| "/{profile}/"+content.path }
  74 + boxes_holder.articles.where("name ILIKE ? OR path ILIKE ?", "%#{search}%", "%#{search}%").limit(20).map { |content| "/{profile}/"+content.path }
75 75 else
76 76 []
77 77 end
... ... @@ -86,7 +86,7 @@ class BoxOrganizerController &lt; ApplicationController
86 86 if @block.kind_of?(RawHTMLBlock) && !user.is_admin?(environment)
87 87 render_access_denied
88 88 else
89   - @block.update_attributes(params[:block])
  89 + @block.update(params[:block])
90 90 redirect_to :action => 'index'
91 91 end
92 92 end
... ...
app/controllers/my_profile/cms_controller.rb
... ... @@ -6,7 +6,7 @@ class CmsController &lt; MyProfileController
6 6  
7 7 def search_tags
8 8 arg = params[:term].downcase
9   - result = ActsAsTaggableOn::Tag.where('name ILIKE ?', "%#{arg}%").limit(10)
  9 + result = Tag.where('name ILIKE ?', "%#{arg}%").limit(10)
10 10 render :text => prepare_to_token_input_by_label(result).to_json, :content_type => 'application/json'
11 11 end
12 12  
... ... @@ -50,16 +50,9 @@ class CmsController &lt; MyProfileController
50 50  
51 51 def view
52 52 @article = profile.articles.find(params[:id])
53   - conditions = []
54   - if @article.has_posts?
55   - conditions = ['type != ?', 'RssFeed']
56   - end
57   -
58   - @articles = @article.children.reorder("case when type = 'Folder' then 0 when type ='Blog' then 1 else 2 end, updated_at DESC, name").paginate(
59   - :conditions => conditions,
60   - :per_page => per_page,
61   - :page => params[:npage]
62   - )
  53 + @articles = @article.children.reorder("case when type = 'Folder' then 0 when type ='Blog' then 1 else 2 end, updated_at DESC, name")
  54 + @articles = @articles.where "type <> ?", 'RssFeed' if @article.has_posts?
  55 + @articles = @articles.paginate per_page: per_page, page: params[:npage]
63 56 end
64 57  
65 58 def index
... ... @@ -99,7 +92,7 @@ class CmsController &lt; MyProfileController
99 92 @article.image.save!
100 93 end
101 94 @article.last_changed_by = user
102   - if @article.update_attributes(params[:article])
  95 + if @article.update(params[:article])
103 96 if !continue
104 97 if @article.content_type.nil? || @article.image?
105 98 success_redirect
... ... @@ -230,7 +223,7 @@ class CmsController &lt; MyProfileController
230 223 else
231 224 session[:notice] = _('File(s) successfully uploaded')
232 225 if @back_to
233   - redirect_to @back_to
  226 + redirect_to url_for(@back_to)
234 227 elsif @parent
235 228 redirect_to :action => 'view', :id => @parent.id
236 229 else
... ... @@ -381,7 +374,7 @@ class CmsController &lt; MyProfileController
381 374  
382 375 def search_article_privacy_exceptions
383 376 arg = params[:q].downcase
384   - result = profile.members.find(:all, :conditions => ['LOWER(name) LIKE ?', "%#{arg}%"])
  377 + result = profile.members.where('LOWER(name) LIKE ?', "%#{arg}%")
385 378 render :text => prepare_to_token_input(result).to_json
386 379 end
387 380  
... ...
app/controllers/my_profile/enterprise_validation_controller.rb
... ... @@ -54,7 +54,7 @@ class EnterpriseValidationController &lt; MyProfileController
54 54 def edit_validation_info
55 55 @info = profile.validation_info
56 56 if request.post?
57   - if @info.update_attributes(params[:info])
  57 + if @info.update(params[:info])
58 58 redirect_to :action => 'index'
59 59 end
60 60 end
... ...
app/controllers/my_profile/manage_products_controller.rb
... ... @@ -69,7 +69,7 @@ class ManageProductsController &lt; ApplicationController
69 69 field = params[:field]
70 70 if request.post?
71 71 begin
72   - @product.update_attributes!(params[:product])
  72 + @product.update!(params[:product])
73 73 render :partial => "display_#{field}", :locals => {:product => @product}
74 74 rescue Exception => e
75 75 render :partial => "edit_#{field}", :locals => {:product => @product, :errors => true}
... ... @@ -86,7 +86,7 @@ class ManageProductsController &lt; ApplicationController
86 86 @edit = true
87 87 @level = @category.level
88 88 if request.post?
89   - if @product.update_attributes({:product_category_id => params[:selected_category_id]}, :without_protection => true)
  89 + if @product.update({:product_category_id => params[:selected_category_id]}, :without_protection => true)
90 90 render :partial => 'shared/redirect_via_javascript',
91 91 :locals => { :url => url_for(:controller => 'manage_products', :action => 'show', :id => @product) }
92 92 else
... ... @@ -115,7 +115,7 @@ class ManageProductsController &lt; ApplicationController
115 115 @categories = ProductCategory.top_level_for(environment)
116 116 @level = 0
117 117 if request.post?
118   - if @input.update_attributes(:product_category_id => params[:selected_category_id])
  118 + if @input.update(:product_category_id => params[:selected_category_id])
119 119 @inputs = @product.inputs
120 120 render :partial => 'display_inputs'
121 121 else
... ... @@ -172,7 +172,7 @@ class ManageProductsController &lt; ApplicationController
172 172 @input = @profile.inputs.find_by_id(params[:id])
173 173 if @input
174 174 if request.post?
175   - if @input.update_attributes(params[:input])
  175 + if @input.update(params[:input])
176 176 render :partial => 'display_input', :locals => {:input => @input}
177 177 else
178 178 render :partial => 'edit_input'
... ...
app/controllers/my_profile/maps_controller.rb
... ... @@ -15,7 +15,7 @@ class MapsController &lt; MyProfileController
15 15 end
16 16  
17 17 Profile.transaction do
18   - if profile.update_attributes!(params[:profile_data])
  18 + if profile.update!(params[:profile_data])
19 19 BlockSweeper.expire_blocks profile.blocks.select{ |b| b.class == LocationBlock }
20 20 session[:notice] = _('Address was updated successfully!')
21 21 redirect_to :action => 'edit_location'
... ...
app/controllers/my_profile/profile_editor_controller.rb
... ... @@ -30,7 +30,7 @@ class ProfileEditorController &lt; MyProfileController
30 30 Image.transaction do
31 31 begin
32 32 @plugins.dispatch(:profile_editor_transaction_extras)
33   - @profile_data.update_attributes!(params[:profile_data])
  33 + @profile_data.update!(params[:profile_data])
34 34 redirect_to :action => 'index', :profile => profile.identifier
35 35 rescue Exception => ex
36 36 profile.identifier = params[:profile] if profile.identifier.blank?
... ... @@ -86,7 +86,7 @@ class ProfileEditorController &lt; MyProfileController
86 86 if @profile.destroy
87 87 session[:notice] = _('The profile was deleted.')
88 88 if(params[:return_to])
89   - redirect_to params[:return_to]
  89 + redirect_to url_for(params[:return_to])
90 90 else
91 91 redirect_to :controller => 'home'
92 92 end
... ... @@ -100,7 +100,7 @@ class ProfileEditorController &lt; MyProfileController
100 100 @welcome_page = profile.welcome_page || TinyMceArticle.new(:name => 'Welcome Page', :profile => profile, :published => false)
101 101 if request.post?
102 102 begin
103   - @welcome_page.update_attributes!(params[:welcome_page])
  103 + @welcome_page.update!(params[:welcome_page])
104 104 profile.welcome_page = @welcome_page
105 105 profile.save!
106 106 session[:notice] = _('Welcome page saved successfully.')
... ...
app/controllers/my_profile/profile_members_controller.rb
... ... @@ -47,7 +47,7 @@ class ProfileMembersController &lt; MyProfileController
47 47 end
48 48  
49 49 def remove_role
50   - @association = RoleAssignment.find(:all, :conditions => {:id => params[:id], :target_id => profile.id})
  50 + @association = RoleAssignment.where(:id => params[:id], :target_id => profile.id)
51 51 if @association.destroy
52 52 session[:notice] = 'Member succefully unassociated'
53 53 else
... ... @@ -120,7 +120,7 @@ class ProfileMembersController &lt; MyProfileController
120 120  
121 121 def search_user
122 122 role = Role.find(params[:role])
123   - render :text => environment.people.find(:all, :conditions => ['LOWER(name) LIKE ? OR LOWER(identifier) LIKE ?', "%#{params['q_'+role.key]}%", "%#{params['q_'+role.key]}%"]).
  123 + render :text => environment.people.where('LOWER(name) LIKE ? OR LOWER(identifier) LIKE ?', "%#{params['q_'+role.key]}%", "%#{params['q_'+role.key]}%").
124 124 select { |person| !profile.members_by_role(role).include?(person) }.
125 125 map {|person| {:id => person.id, :name => person.name} }.
126 126 to_json
... ...
app/controllers/my_profile/profile_roles_controller.rb
... ... @@ -58,7 +58,7 @@ class ProfileRolesController &lt; MyProfileController
58 58  
59 59 def update
60 60 @role = environment.roles.find(params[:id])
61   - if @role.update_attributes(params[:role])
  61 + if @role.update(params[:role])
62 62 redirect_to :action => 'show', :id => @role
63 63 else
64 64 session[:notice] = _('Failed to edit role')
... ...
app/controllers/my_profile/tasks_controller.rb
... ... @@ -71,7 +71,7 @@ class TasksController &lt; MyProfileController
71 71 if VALID_DECISIONS.include?(decision) && id && decision != 'skip'
72 72 task ||= profile.find_in_all_tasks(id)
73 73 begin
74   - task.update_attributes(value[:task])
  74 + task.update(value[:task])
75 75 task.send(decision, current_person)
76 76 rescue Exception => ex
77 77 message = "#{task.title} (#{task.requestor ? task.requestor.name : task.author_name})"
... ... @@ -85,7 +85,6 @@ class TasksController &lt; MyProfileController
85 85 end
86 86  
87 87 url = { :action => 'index' }
88   -
89 88 if failed.blank?
90 89 session[:notice] = _("All decisions were applied successfully.")
91 90 else
... ... @@ -113,7 +112,7 @@ class TasksController &lt; MyProfileController
113 112 end
114 113  
115 114 def ticket_details
116   - @ticket = Ticket.find(:first, :conditions => ['(requestor_id = ? or target_id = ?) and id = ?', profile.id, profile.id, params[:id]])
  115 + @ticket = Ticket.where('(requestor_id = ? or target_id = ?) and id = ?', profile.id, profile.id, params[:id]).first
117 116 end
118 117  
119 118 def search_tasks
... ...
app/controllers/public/account_controller.rb
... ... @@ -125,9 +125,9 @@ class AccountController &lt; ApplicationController
125 125 @user.signup!
126 126 owner_role = Role.find_by_name('owner')
127 127 @user.person.affiliate(@user.person, [owner_role]) if owner_role
128   - invitation = Task.find_by_code(@invitation_code)
  128 + invitation = Task.from_code(@invitation_code).first
129 129 if invitation
130   - invitation.update_attributes!({:friend => @user.person})
  130 + invitation.update! friend: @user.person
131 131 invitation.finish
132 132 end
133 133  
... ... @@ -222,7 +222,7 @@ class AccountController &lt; ApplicationController
222 222 #
223 223 # Posts back.
224 224 def new_password
225   - @change_password = ChangePassword.find_by_code(params[:code])
  225 + @change_password = ChangePassword.from_code(params[:code]).first
226 226  
227 227 unless @change_password
228 228 render :action => 'invalid_change_password_code', :status => 403
... ... @@ -231,7 +231,7 @@ class AccountController &lt; ApplicationController
231 231  
232 232 if request.post?
233 233 begin
234   - @change_password.update_attributes!(params[:change_password])
  234 + @change_password.update!(params[:change_password])
235 235 @change_password.finish
236 236 render :action => 'new_password_ok'
237 237 rescue ActiveRecord::RecordInvalid => e
... ... @@ -415,7 +415,7 @@ class AccountController &lt; ApplicationController
415 415 end
416 416  
417 417 def load_enterprise_activation
418   - @enterprise_activation ||= EnterpriseActivation.find_by_code(params[:enterprise_code])
  418 + @enterprise_activation ||= EnterpriseActivation.from_code(params[:enterprise_code]).first
419 419 end
420 420  
421 421 def load_enterprise
... ... @@ -439,7 +439,7 @@ class AccountController &lt; ApplicationController
439 439  
440 440 def go_to_initial_page
441 441 if params[:return_to]
442   - redirect_to params[:return_to]
  442 + redirect_to url_for(params[:return_to])
443 443 elsif environment.enabled?('allow_change_of_redirection_after_login')
444 444 check_redirection_options(user, user.preferred_login_redirection, user.admin_url)
445 445 else
... ... @@ -500,7 +500,7 @@ class AccountController &lt; ApplicationController
500 500 def check_redirection
501 501 unless params[:redirection].blank?
502 502 session[:return_to] = @user.return_to
503   - @user.update_attributes(:return_to => nil)
  503 + @user.update(:return_to => nil)
504 504 end
505 505 end
506 506  
... ...
app/controllers/public/chat_controller.rb
... ... @@ -67,7 +67,7 @@ class ChatController &lt; PublicController
67 67  
68 68 def update_presence_status
69 69 if request.xhr?
70   - current_user.update_attributes({:chat_status_at => DateTime.now}.merge(params[:status] || {}))
  70 + current_user.update({:chat_status_at => DateTime.now}.merge(params[:status] || {}))
71 71 end
72 72 render :nothing => true
73 73 end
... ...
app/controllers/public/comment_controller.rb
... ... @@ -78,7 +78,7 @@ class CommentController &lt; ApplicationController
78 78 respond_to do |format|
79 79 format.js do
80 80 comment_to_render = @comment.comment_root
81   - render :json => {
  81 + render :json => {
82 82 :render_target => comment_to_render.anchor,
83 83 :html => render_to_string(:partial => 'comment', :locals => {:comment => comment_to_render, :display_link => true}),
84 84 :msg => _('Comment successfully created.')
... ... @@ -114,7 +114,7 @@ class CommentController &lt; ApplicationController
114 114 end
115 115  
116 116 def update
117   - if @comment.update_attributes(params[:comment])
  117 + if @comment.update(params[:comment])
118 118 @plugins.dispatch(:process_extra_comment_params, [@comment,params])
119 119  
120 120 respond_to do |format|
... ...
app/controllers/public/enterprise_registration_controller.rb
... ... @@ -4,7 +4,7 @@ class EnterpriseRegistrationController &lt; ApplicationController
4 4 before_filter :login_required
5 5  
6 6 # Just go to the first step.
7   - #
  7 + #
8 8 # FIXME: shouldn't this action present some sort of welcome message and point
9 9 # to the first step explicitly?
10 10 def index
... ... @@ -15,7 +15,7 @@ class EnterpriseRegistrationController &lt; ApplicationController
15 15 @create_enterprise.target = Profile.find(params[:create_enterprise][:target_id])
16 16 end
17 17 elsif @validation == :admin || @validation == :none
18   - @create_enterprise.target = environment
  18 + @create_enterprise.target = environment
19 19 end
20 20 @create_enterprise.requestor = user
21 21 the_action =
... ... @@ -40,7 +40,7 @@ class EnterpriseRegistrationController &lt; ApplicationController
40 40  
41 41 protected
42 42  
43   - # Fill in the form and select your Region.
  43 + # Fill in the form and select your Region.
44 44 #
45 45 # Posts back.
46 46 def basic_information
... ...
app/controllers/public/profile_controller.rb
... ... @@ -37,7 +37,7 @@ class ProfileController &lt; PublicController
37 37  
38 38 def tag_feed
39 39 @tag = params[:id]
40   - tagged = profile.articles.paginate(:per_page => 20, :page => 1, :order => 'published_at DESC', :include => :tags, :conditions => ['tags.name LIKE ?', @tag])
  40 + tagged = profile.articles.paginate(:per_page => 20, :page => 1).order('published_at DESC').joins(:tags).where('tags.name LIKE ?', @tag)
41 41 feed_writer = FeedWriter.new
42 42 data = feed_writer.write(
43 43 tagged,
... ... @@ -228,7 +228,7 @@ class ProfileController &lt; PublicController
228 228 end
229 229  
230 230 def more_replies
231   - activity = Scrap.find(:first, :conditions => {:id => params[:activity], :receiver_id => @profile, :scrap_id => nil})
  231 + activity = Scrap.where(:id => params[:activity], :receiver_id => @profile, :scrap_id => nil).first
232 232 comments_count = activity.replies.count
233 233 comment_page = (params[:comment_page] || 1).to_i
234 234 comments_per_page = 5
... ... @@ -275,7 +275,7 @@ class ProfileController &lt; PublicController
275 275 def remove_notification
276 276 begin
277 277 raise if !can_edit_profile
278   - notification = ActionTrackerNotification.find(:first, :conditions => {:profile_id => profile.id, :action_tracker_id => params[:activity_id]})
  278 + notification = ActionTrackerNotification.where(profile_id: profile.id, action_tracker_id: params[:activity_id]).first
279 279 notification.destroy
280 280 render :text => _('Notification successfully removed.')
281 281 rescue
... ...
app/controllers/public/search_controller.rb
... ... @@ -17,7 +17,7 @@ class SearchController &lt; PublicController
17 17 # Backwards compatibility with old URLs
18 18 def redirect_asset_param
19 19 return unless params.has_key?(:asset)
20   - redirect_to params.merge(:action => params.delete(:asset))
  20 + redirect_to url_for(params.merge action: params.delete(:asset))
21 21 end
22 22  
23 23 no_design_blocks
... ... @@ -65,12 +65,12 @@ class SearchController &lt; PublicController
65 65 end
66 66  
67 67 def articles
68   - @scope = @environment.articles.public
  68 + @scope = @environment.articles.is_public
69 69 full_text_search
70 70 end
71 71  
72 72 def contents
73   - redirect_to params.merge(:action => :articles)
  73 + redirect_to url_for(params.merge action: :articles)
74 74 end
75 75  
76 76 def people
... ... @@ -125,7 +125,7 @@ class SearchController &lt; PublicController
125 125 # keep old URLs workings
126 126 def assets
127 127 params[:action] = params[:asset].is_a?(Array) ? :index : params.delete(:asset)
128   - redirect_to params
  128 + redirect_to url_for(params)
129 129 end
130 130  
131 131 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
... ... @@ -283,36 +287,6 @@ module ApplicationHelper
283 287 concat(content_tag('div', capture(&block).to_s + tag('br', :style => 'clear: left;'), options))
284 288 end
285 289  
286   -
287   - def partial_for_class_in_view_path(klass, view_path, prefix = nil, suffix = nil)
288   - return nil if klass.nil?
289   - name = [prefix, klass.name.underscore, suffix].compact.map(&:to_s).join('_')
290   -
291   - search_name = String.new(name)
292   - if search_name.include?("/")
293   - search_name.gsub!(/(\/)([^\/]*)$/,'\1_\2')
294   - name = File.join(params[:controller], name) if defined?(params) && params[:controller]
295   - else
296   - search_name = "_" + search_name
297   - end
298   -
299   - path = defined?(params) && params[:controller] ? File.join(view_path, params[:controller], search_name + '.html.erb') : File.join(view_path, search_name + '.html.erb')
300   - return name if File.exists?(File.join(path))
301   -
302   - partial_for_class_in_view_path(klass.superclass, view_path, prefix, suffix)
303   - end
304   -
305   - def partial_for_class(klass, prefix=nil, suffix=nil)
306   - raise ArgumentError, 'No partial for object. Is there a partial for any class in the inheritance hierarchy?' if klass.nil?
307   - name = klass.name.underscore
308   - controller.view_paths.each do |view_path|
309   - partial = partial_for_class_in_view_path(klass, view_path, prefix, suffix)
310   - return partial if partial
311   - end
312   -
313   - raise ArgumentError, 'No partial for object. Is there a partial for any class in the inheritance hierarchy?'
314   - end
315   -
316 290 def render_profile_actions klass
317 291 name = klass.to_s.underscore
318 292 begin
... ... @@ -909,8 +883,14 @@ module ApplicationHelper
909 883 end
910 884 alias :top_url :base_url
911 885  
  886 + class View < ActionView::Base
  887 + def url_for *args
  888 + self.controller.url_for *args
  889 + end
  890 + end
  891 +
912 892 def helper_for_article(article)
913   - article_helper = ActionView::Base.new
  893 + article_helper = View.new
914 894 article_helper.controller = controller
915 895 article_helper.extend ArticleHelper
916 896 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
... ... @@ -255,7 +255,7 @@ module BoxesHelper
255 255 end
256 256  
257 257 if movable?(block) && !block.main?
258   - buttons << icon_button(:delete, _('Remove block'), { :action => 'remove', :id => block.id }, { :method => 'post', :confirm => _('Are you sure you want to remove this block?')})
  258 + buttons << icon_button(:delete, _('Remove block'), { action: 'remove', id: block.id }, method: 'post', data: {confirm: _('Are you sure you want to remove this block?')})
259 259 buttons << icon_button(:clone, _('Clone'), { :action => 'clone_block', :id => block.id }, { :method => 'post' })
260 260 end
261 261  
... ...
app/helpers/cms_helper.rb
... ... @@ -34,7 +34,7 @@ module CmsHelper
34 34 end
35 35  
36 36 def display_delete_button(article)
37   - expirable_button article, :delete, _('Delete'), { :action => 'destroy', :id => article.id }, :method => :post, :confirm => delete_article_message(article)
  37 + expirable_button article, :delete, _('Delete'), { :action => 'destroy', :id => article.id }, :method => :post, 'data-confirm' => delete_article_message(article)
38 38 end
39 39  
40 40 def expirable_button(content, action, title, url, options = {})
... ... @@ -42,7 +42,7 @@ module CmsHelper
42 42 if reason.present?
43 43 options[:class] = (options[:class] || '') + ' disabled'
44 44 options[:disabled] = 'disabled'
45   - options.delete(:confirm)
  45 + options.delete('data-confirm')
46 46 options.delete(:method)
47 47 title = reason
48 48 end
... ...
app/helpers/events_helper.rb
... ... @@ -24,7 +24,7 @@ module EventsHelper
24 24 end
25 25  
26 26 def populate_calendar(selected_date, events)
27   - events.reject! {|event| !event.display_to?(user)}
  27 + events = events.reject{ |event| !event.display_to? user }
28 28 calendar = Event.date_range(selected_date.year, selected_date.month).map do |date|
29 29 [
30 30 # the day itself
... ...
app/helpers/folder_helper.rb
... ... @@ -5,13 +5,11 @@ module FolderHelper
5 5 def list_contents(configure={})
6 6 configure[:recursive] ||= false
7 7 configure[:list_type] ||= :folder
8   - if !configure[:contents].blank?
9   - configure[:contents] = configure[:contents].paginate(
10   - :order => "name ASC",
11   - :per_page => 30,
12   - :page => params[:npage]
13   - )
14   -
  8 + contents = configure[:contents]
  9 + contents = contents.order('name ASC') unless contents.is_a? Array
  10 + contents = contents.paginate per_page: 30, page: params[:npage]
  11 + configure[:contents] = contents
  12 + if contents.present?
15 13 render :file => 'shared/content_list', :locals => configure
16 14 else
17 15 content_tag('em', _('(empty folder)'))
... ...
app/helpers/partials_helper.rb 0 → 100644
... ... @@ -0,0 +1,43 @@
  1 +module PartialsHelper
  2 +
  3 + def partial_for_class_in_view_path(klass, view_path, prefix = nil, suffix = nil)
  4 + return nil if klass.nil?
  5 + name = [prefix, klass.name.underscore, suffix].compact.map(&:to_s).join('_')
  6 +
  7 + search_name = String.new(name)
  8 + if search_name.include?("/")
  9 + search_name.gsub!(/(\/)([^\/]*)$/,'\1_\2')
  10 + name = File.join(params[:controller], name) if defined?(params) && params[:controller]
  11 + else
  12 + search_name = "_" + search_name
  13 + end
  14 +
  15 + path = defined?(params) && params[:controller] ? File.join(view_path, params[:controller], search_name + '.html.erb') : File.join(view_path, search_name + '.html.erb')
  16 + return name if File.exists?(File.join(path))
  17 +
  18 + partial_for_class_in_view_path(klass.superclass, view_path, prefix, suffix)
  19 + end
  20 +
  21 + def partial_for_class(klass, prefix=nil, suffix=nil)
  22 + raise ArgumentError, 'No partial for object. Is there a partial for any class in the inheritance hierarchy?' if klass.nil?
  23 + name = klass.name.underscore
  24 + controller.view_paths.each do |view_path|
  25 + partial = partial_for_class_in_view_path(klass, view_path, prefix, suffix)
  26 + return partial if partial
  27 + end
  28 +
  29 + raise ArgumentError, 'No partial for object. Is there a partial for any class in the inheritance hierarchy?'
  30 + end
  31 +
  32 + def render_partial_for_class klass, *args
  33 + raise ArgumentError, 'No partial for object. Is there a partial for any class in the inheritance hierarchy?' if klass.nil?
  34 + begin
  35 + partial = klass.name.underscore
  36 + partial = "#{params[:controller]}/#{partial}" if params[:controller] and partial.index '/'
  37 + return render partial, *args
  38 + rescue ActionView::MissingTemplate
  39 + return render_partial_for_class klass.superclass, *args
  40 + end
  41 + end
  42 +
  43 +end
... ...
app/helpers/tinymce_helper.rb
... ... @@ -20,18 +20,9 @@ module TinymceHelper
20 20 :image_advtab => true,
21 21 :language => tinymce_language
22 22  
23   - options[:toolbar1] = "fullscreen | insertfile undo redo | copy paste | bold italic underline | styleselect fontsizeselect | forecolor backcolor | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image"
24   - if options[:mode] == 'simple'
25   - options[:menubar] = false
26   - else
27   - options[:menubar] = 'edit insert view tools'
28   - options[:toolbar2] = 'print preview code media | table'
29   -
30   - options[:toolbar2] += ' | macros'
31   - macros_with_buttons.each do |macro|
32   - options[:toolbar2] += " #{macro.identifier}"
33   - end
34   - end
  23 + options[:toolbar1] = toolbar1(options[:mode])
  24 + options[:menubar] = menubar(options[:mode])
  25 + options[:toolbar2] = toolbar2(options[:mode])
35 26  
36 27 options[:macros_setup] = macros_with_buttons.map do |macro|
37 28 <<-EOS
... ... @@ -49,4 +40,29 @@ module TinymceHelper
49 40 "noosfero.tinymce.init(#{options.to_json})"
50 41 end
51 42  
  43 + def menubar mode
  44 + if mode =='restricted' || mode == 'simple'
  45 + return false
  46 + end
  47 + return 'edit insert view tools'
  48 + end
  49 +
  50 + def toolbar1 mode
  51 + if mode == 'restricted'
  52 + return "bold italic underline | link"
  53 + end
  54 + return "fullscreen | insertfile undo redo | copy paste | bold italic underline | styleselect fontsizeselect | forecolor backcolor | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image"
  55 + end
  56 +
  57 + def toolbar2 mode
  58 + if mode.blank?
  59 + toolbar2 = 'print preview code media | table'
  60 + toolbar2 += ' | macros'
  61 + macros_with_buttons.each do |macro|
  62 + toolbar2 += " #{macro.identifier}"
  63 + end
  64 + return toolbar2
  65 + end
  66 + end
  67 +
52 68 end
... ...
app/helpers/url_helper.rb 0 → 100644
... ... @@ -0,0 +1,7 @@
  1 +module UrlHelper
  2 +
  3 + def back_url
  4 + 'javascript:history.back()'
  5 + end
  6 +
  7 +end
... ...
app/mailers/application_mailer.rb 0 → 100644
... ... @@ -0,0 +1,18 @@
  1 +require_relative '../helpers/application_helper'
  2 +
  3 +class ApplicationMailer < ActionMailer::Base
  4 +
  5 + include AuthenticatedSystem
  6 +
  7 + helper ApplicationHelper
  8 +
  9 + attr_accessor :environment
  10 +
  11 + def default_url_options options = nil
  12 + options ||= {}
  13 + options[:host] = environment.default_hostname if environment
  14 + options
  15 + end
  16 +
  17 +end
  18 +
... ...
app/mailers/comment_notifier.rb
1   -class CommentNotifier < ActionMailer::Base
  1 +class CommentNotifier < ApplicationMailer
  2 +
2 3 def notification(comment)
3 4 profile = comment.article.profile
  5 + self.environment = profile.environment
4 6 @recipient = profile.nickname || profile.name
5 7 @sender = comment.author_name
6 8 @sender_link = comment.author_link
... ... @@ -8,7 +10,6 @@ class CommentNotifier &lt; ActionMailer::Base
8 10 @comment_url = comment.url
9 11 @comment_title = comment.title
10 12 @comment_body = comment.body
11   - @environment = profile.environment.name
12 13 @url = profile.environment.top_url
13 14  
14 15 mail(
... ... @@ -20,6 +21,8 @@ class CommentNotifier &lt; ActionMailer::Base
20 21  
21 22 def mail_to_followers(comment, emails)
22 23 profile = comment.article.profile
  24 + self.environment = profile.environment
  25 +
23 26 @recipient = profile.nickname || profile.name
24 27 @sender = comment.author_name
25 28 @sender_link = comment.author_link
... ... @@ -28,7 +31,6 @@ class CommentNotifier &lt; ActionMailer::Base
28 31 @unsubscribe_url = comment.article.view_url.merge({:unfollow => true})
29 32 @comment_title = comment.title
30 33 @comment_body = comment.body
31   - @environment = profile.environment.name
32 34 @url = profile.environment.top_url
33 35  
34 36 mail(
... ...
app/mailers/contact.rb
... ... @@ -30,14 +30,16 @@ class Contact
30 30 Contact::Sender.notification(self).deliver
31 31 end
32 32  
33   - class Sender < ActionMailer::Base
  33 + class Sender < ApplicationMailer
  34 +
34 35 def notification(contact)
  36 + self.environment = contact.dest.environment
  37 +
35 38 @name = contact.name
36 39 @email = contact.email
37 40 @city = contact.city
38 41 @state = contact.state
39 42 @message = contact.message
40   - @environment = contact.dest.environment.name
41 43 @url = url_for(:host => contact.dest.environment.default_hostname, :controller => 'home')
42 44 @target = contact.dest.name
43 45  
... ...
app/mailers/environment_mailing.rb
1 1 class EnvironmentMailing < Mailing
2 2  
3 3 def recipients(offset=0, limit=100)
4   - source.people.all(:order => :id, :offset => offset, :limit => limit, :joins => "LEFT OUTER JOIN mailing_sents m ON (m.mailing_id = #{id} AND m.person_id = profiles.id)", :conditions => { "m.person_id" => nil })
  4 + source.people.order(:id).offset(offset).limit(limit)
  5 + .joins("LEFT OUTER JOIN mailing_sents m ON (m.mailing_id = #{id} AND m.person_id = profiles.id)")
  6 + .where("m.person_id" => nil)
5 7 end
6 8  
7 9 def each_recipient
... ...
app/mailers/mailing.rb
... ... @@ -46,7 +46,8 @@ class Mailing &lt; ActiveRecord::Base
46 46 end
47 47 end
48 48  
49   - class Sender < ActionMailer::Base
  49 + class Sender < ApplicationMailer
  50 +
50 51 def notification(mailing, recipient)
51 52 @message = mailing.body
52 53 @signature_message = mailing.signature_message
... ...
app/mailers/organization_mailing.rb
... ... @@ -5,7 +5,9 @@ class OrganizationMailing &lt; Mailing
5 5 end
6 6  
7 7 def recipients(offset=0, limit=100)
8   - source.members.all(:order => :id, :offset => offset, :limit => limit, :joins => "LEFT OUTER JOIN mailing_sents m ON (m.mailing_id = #{id} AND m.person_id = profiles.id)", :conditions => { "m.person_id" => nil })
  8 + source.members.order(:id).offset(offset).limit(limit)
  9 + .joins("LEFT OUTER JOIN mailing_sents m ON (m.mailing_id = #{id} AND m.person_id = profiles.id)")
  10 + .where("m.person_id" => nil)
9 11 end
10 12  
11 13 def each_recipient
... ...
app/mailers/pending_task_notifier.rb
1   -class PendingTaskNotifier < ActionMailer::Base
  1 +class PendingTaskNotifier < ApplicationMailer
2 2  
3 3 def notification(person)
  4 + self.environment = person.environment
  5 +
4 6 @person = person
5 7 @tasks = person.tasks.pending
6 8 @organizations_with_pending_tasks = person.organizations_with_pending_tasks
7   - @environment = person.environment.name
8 9 @url = url_for(:host => person.environment.default_hostname, :controller => 'home')
9 10 @default_hostname = person.environment.default_hostname
10 11 @url_for_pending_tasks = url_for(:host => person.environment.default_hostname, :controller => 'tasks', :profile => person.identifier)
... ...
app/mailers/scrap_notifier.rb
1   -class ScrapNotifier < ActionMailer::Base
  1 +class ScrapNotifier < ApplicationMailer
  2 +
2 3 def notification(scrap)
3 4 sender, receiver = scrap.sender, scrap.receiver
  5 + self.environment = sender.environment
4 6 # for tests
5 7 return unless receiver.email
6 8  
... ... @@ -9,7 +11,6 @@ class ScrapNotifier &lt; ActionMailer::Base
9 11 @sender_link = sender.url
10 12 @scrap_content = scrap.content
11 13 @wall_url = scrap.scrap_wall_url
12   - @environment = sender.environment.name
13 14 @url = sender.environment.top_url
14 15 mail(
15 16 to: receiver.email,
... ...
app/mailers/task_mailer.rb
1   -class TaskMailer < ActionMailer::Base
  1 +class TaskMailer < ApplicationMailer
2 2  
3 3 include EmailTemplateHelper
4 4  
5 5 def target_notification(task, message)
  6 + self.environment = task.environment
  7 +
6 8 @message = extract_message(message)
7 9 @target = task.target.name
8   - @environment = task.environment.name
9 10 @url = generate_environment_url(task, :controller => 'home')
10 11 url_for_tasks_list = task.target.kind_of?(Environment) ? '' : url_for(task.target.tasks_url.merge(:script_name => Noosfero.root('/')))
11 12 @tasks_url = url_for_tasks_list
... ... @@ -18,6 +19,8 @@ class TaskMailer &lt; ActionMailer::Base
18 19 end
19 20  
20 21 def invitation_notification(task)
  22 + self.environment = task.requestor.environment
  23 +
21 24 msg = task.expanded_message
22 25 @message = msg.gsub /<url>/, generate_environment_url(task, :controller => 'account', :action => 'signup', :invitation_code => task.code)
23 26  
... ... @@ -29,11 +32,12 @@ class TaskMailer &lt; ActionMailer::Base
29 32 end
30 33  
31 34 def generic_message(name, task)
  35 + self.environment = task.requestor.environment
  36 +
32 37 return if !task.respond_to?("#{name}_message")
33 38  
34 39 @message = extract_message(task.send("#{name}_message"))
35 40 @requestor = task.requestor.name
36   - @environment = task.requestor.environment.name
37 41 @url = url_for(:host => task.requestor.environment.default_hostname, :controller => 'home')
38 42  
39 43 mail_with_template(
... ...
app/mailers/user_mailer.rb
1   -class UserMailer < ActionMailer::Base
  1 +class UserMailer < ApplicationMailer
2 2  
3 3 include EmailTemplateHelper
4 4  
5 5 def activation_email_notify(user)
  6 + self.environment = user.environment
  7 +
6 8 user_email = "#{user.login}@#{user.email_domain}"
7 9 @name = user.name
8 10 @email = user_email
9 11 @webmail = MailConf.webmail_url(user.login, user.email_domain)
10   - @environment = user.environment.name
11 12 @url = url_for(:host => user.environment.default_hostname, :controller => 'home')
12 13  
13 14 mail(
... ... @@ -18,9 +19,10 @@ class UserMailer &lt; ActionMailer::Base
18 19 end
19 20  
20 21 def activation_code(user)
  22 + self.environment = user.environment
  23 +
21 24 @recipient = user.name
22 25 @activation_code = user.activation_code
23   - @environment = user.environment.name
24 26 @url = user.environment.top_url
25 27 @redirection = (true if user.return_to)
26 28 @join = (user.community_to_join if user.community_to_join)
... ... @@ -35,6 +37,8 @@ class UserMailer &lt; ActionMailer::Base
35 37 end
36 38  
37 39 def signup_welcome_email(user)
  40 + self.environment = user.environment
  41 +
38 42 @body = user.environment.signup_welcome_text_body.gsub('{user_name}', user.name)
39 43 email_subject = user.environment.signup_welcome_text_subject
40 44 mail(
... ... @@ -47,8 +51,9 @@ class UserMailer &lt; ActionMailer::Base
47 51 end
48 52  
49 53 def profiles_suggestions_email(user)
  54 + self.environment = user.environment
  55 +
50 56 @recipient = user.name
51   - @environment = user.environment.name
52 57 @url = user.environment.top_url
53 58 @people_suggestions_url = user.people_suggestions_url
54 59 @people_suggestions = user.suggested_people.sample(3)
... ...
app/models/add_member.rb
... ... @@ -11,7 +11,7 @@ class AddMember &lt; Task
11 11 alias :organization :target
12 12 alias :organization= :target=
13 13  
14   - settings_items :roles
  14 + settings_items :roles, type: Array
15 15  
16 16 after_create do |task|
17 17 remove_from_suggestion_list(task)
... ...
app/models/approve_article.rb
... ... @@ -138,9 +138,4 @@ class ApproveArticle &lt; Task
138 138 message
139 139 end
140 140  
141   - def request_is_member_of_target
142   - unless requestor.is_member_of?(target)
143   - errors.add(:approve_article, N_('Requestor must be a member of target.'))
144   - end
145   - end
146 141 end
... ...
app/models/approve_comment.rb
... ... @@ -8,7 +8,7 @@ class ApproveComment &lt; Task
8 8 def comment
9 9 unless @comment || self.comment_attributes.nil?
10 10 @comment = Comment.new
11   - @comment.assign_attributes(ActiveSupport::JSON.decode(self.comment_attributes), :without_protection => true)
  11 + @comment.assign_attributes(ActiveSupport::JSON.decode(self.comment_attributes.to_s), :without_protection => true)
12 12 end
13 13 @comment
14 14 end
... ...
app/models/article.rb
  1 +
1 2 class Article < ActiveRecord::Base
2 3  
3 4 attr_accessible :name, :body, :abstract, :profile, :tag_list, :parent,
... ... @@ -28,9 +29,14 @@ class Article &lt; ActiveRecord::Base
28 29 def initialize(*params)
29 30 super
30 31  
31   - if !params.blank? && params.first.has_key?(:profile) && !params.first[:profile].blank?
32   - profile = params.first[:profile]
33   - self.published = false unless profile.public?
  32 + if !params.blank?
  33 + if params.first.has_key?(:profile) && !params.first[:profile].blank?
  34 + profile = params.first[:profile]
  35 + self.published = false unless profile.public_profile
  36 + end
  37 +
  38 + self.published = params.first["published"] if params.first.has_key?("published")
  39 + self.published = params.first[:published] if params.first.has_key?(:published)
34 40 end
35 41  
36 42 end
... ... @@ -77,7 +83,7 @@ class Article &lt; ActiveRecord::Base
77 83  
78 84 has_many :comments, :class_name => 'Comment', :foreign_key => 'source_id', :dependent => :destroy, :order => 'created_at asc'
79 85  
80   - has_many :article_categorizations, :conditions => [ 'articles_categories.virtual = ?', false ]
  86 + has_many :article_categorizations, -> { where 'articles_categories.virtual = ?', false }
81 87 has_many :categories, :through => :article_categorizations
82 88  
83 89 has_many :article_categorizations_including_virtual, :class_name => 'ArticleCategorization'
... ... @@ -129,17 +135,15 @@ class Article &lt; ActiveRecord::Base
129 135  
130 136 xss_terminate :only => [ :name ], :on => 'validation', :with => 'white_list'
131 137  
132   - scope :in_category, lambda { |category|
133   - {:include => 'categories_including_virtual', :conditions => { 'categories.id' => category.id }}
  138 + scope :in_category, -> category {
  139 + includes('categories_including_virtual').where('categories.id' => category.id)
134 140 }
135 141  
136 142 include TimeScopes
137 143  
138   - scope :by_range, lambda { |range| {
139   - :conditions => [
140   - 'articles.published_at BETWEEN :start_date AND :end_date', { :start_date => range.first, :end_date => range.last }
141   - ]
142   - }}
  144 + scope :by_range, -> range {
  145 + where 'articles.published_at BETWEEN :start_date AND :end_date', { start_date: range.first, end_date: range.last }
  146 + }
143 147  
144 148 URL_FORMAT = /\A(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(([0-9]{1,5})?\/.*)?\Z/ix
145 149  
... ... @@ -261,19 +265,21 @@ class Article &lt; ActiveRecord::Base
261 265  
262 266 # retrieves all articles belonging to the given +profile+ that are not
263 267 # sub-articles of any other article.
264   - scope :top_level_for, lambda { |profile|
265   - {:conditions => [ 'parent_id is null and profile_id = ?', profile.id ]}
  268 + scope :top_level_for, -> profile {
  269 + where 'parent_id is null and profile_id = ?', profile.id
266 270 }
267 271  
268   - scope :public,
269   - :conditions => [ "articles.advertise = ? AND articles.published = ? AND profiles.visible = ? AND profiles.public_profile = ?", true, true, true, true ], :joins => [:profile]
  272 + scope :is_public, -> {
  273 + joins(:profile).
  274 + where("articles.advertise = ? AND articles.published = ? AND profiles.visible = ? AND profiles.public_profile = ?", true, true, true, true)
  275 + }
270 276  
271   - scope :more_recent,
272   - :conditions => [ "advertise = ? AND published = ? AND profiles.visible = ? AND profiles.public_profile = ? AND
273   - ((articles.type != ?) OR articles.type is NULL)",
274   - true, true, true, true, 'RssFeed'
275   - ],
276   - :order => 'articles.published_at desc, articles.id desc'
  277 + scope :more_recent, -> {
  278 + order('articles.published_at desc, articles.id desc')
  279 + .where("articles.advertise = ? AND articles.published = ? AND profiles.visible = ? AND profiles.public_profile = ? AND
  280 + ((articles.type != ?) OR articles.type is NULL)",
  281 + true, true, true, true, 'RssFeed')
  282 + }
277 283  
278 284 # retrives the most commented articles, sorted by the comment count (largest
279 285 # first)
... ... @@ -281,12 +287,14 @@ class Article &lt; ActiveRecord::Base
281 287 paginate(:order => 'comments_count DESC', :page => 1, :per_page => limit)
282 288 end
283 289  
284   - scope :more_popular, :order => 'hits DESC'
285   - scope :relevant_as_recent, :conditions => ["(articles.type != 'UploadedFile' and articles.type != 'RssFeed' and articles.type != 'Blog') OR articles.type is NULL"]
  290 + scope :more_popular, -> { order 'hits DESC' }
  291 + scope :relevant_as_recent, -> {
  292 + where "(articles.type != 'UploadedFile' and articles.type != 'RssFeed' and articles.type != 'Blog') OR articles.type is NULL"
  293 + }
286 294  
287 295 def self.recent(limit = nil, extra_conditions = {}, pagination = true)
288 296 result = scoped({:conditions => extra_conditions}).
289   - public.
  297 + is_public.
290 298 relevant_as_recent.
291 299 limit(limit).
292 300 order(['articles.published_at desc', 'articles.id desc'])
... ... @@ -411,7 +419,7 @@ class Article &lt; ActiveRecord::Base
411 419 self.translations.map(&:language)
412 420 end
413 421  
414   - scope :native_translations, :conditions => { :translation_of_id => nil }
  422 + scope :native_translations, -> { where :translation_of_id => nil }
415 423  
416 424 def translatable?
417 425 false
... ... @@ -453,7 +461,7 @@ class Article &lt; ActiveRecord::Base
453 461  
454 462 def rotate_translations
455 463 unless self.translations.empty?
456   - rotate = self.translations
  464 + rotate = self.translations.all
457 465 root = rotate.shift
458 466 root.update_attribute(:translation_of_id, nil)
459 467 root.translations = rotate
... ... @@ -466,7 +474,7 @@ class Article &lt; ActiveRecord::Base
466 474 elsif self.native_translation.language == locale
467 475 self.native_translation
468 476 else
469   - self.native_translation.translations.first(:conditions => { :language => locale })
  477 + self.native_translation.translations.where(:language => locale).first
470 478 end
471 479 end
472 480  
... ... @@ -490,19 +498,19 @@ class Article &lt; ActiveRecord::Base
490 498 ['TextArticle', 'TextileArticle', 'TinyMceArticle']
491 499 end
492 500  
493   - scope :published, :conditions => ['articles.published = ?', true]
494   - scope :folders, lambda {|profile|{:conditions => ['articles.type IN (?)', profile.folder_types] }}
495   - scope :no_folders, lambda {|profile|{:conditions => ['articles.type NOT IN (?)', profile.folder_types]}}
496   - scope :galleries, :conditions => [ "articles.type IN ('Gallery')" ]
497   - scope :images, :conditions => { :is_image => true }
498   - scope :no_images, :conditions => { :is_image => false }
499   - scope :text_articles, :conditions => [ 'articles.type IN (?)', text_article_types ]
500   - scope :files, :conditions => { :type => 'UploadedFile' }
501   - scope :with_types, lambda { |types| { :conditions => [ 'articles.type IN (?)', types ] } }
  501 + scope :published, -> { where 'articles.published = ?', true }
  502 + scope :folders, -> profile { where 'articles.type IN (?)', profile.folder_types }
  503 + scope :no_folders, -> profile { where 'articles.type NOT IN (?)', profile.folder_types }
  504 + scope :galleries, -> { where "articles.type IN ('Gallery')" }
  505 + scope :images, -> { where :is_image => true }
  506 + scope :no_images, -> { where :is_image => false }
  507 + scope :text_articles, -> { where 'articles.type IN (?)', text_article_types }
  508 + scope :files, -> { where :type => 'UploadedFile' }
  509 + scope :with_types, -> types { where 'articles.type IN (?)', types }
502 510  
503   - scope :more_popular, :order => 'hits DESC'
504   - scope :more_comments, :order => "comments_count DESC"
505   - scope :more_recent, :order => "created_at DESC"
  511 + scope :more_popular, -> { order 'hits DESC' }
  512 + scope :more_comments, -> { order "comments_count DESC" }
  513 + scope :more_recent, -> { order "created_at DESC" }
506 514  
507 515 scope :display_filter, lambda {|user, profile|
508 516 return published if (user.nil? && profile && profile.public?)
... ... @@ -624,7 +632,7 @@ class Article &lt; ActiveRecord::Base
624 632 ]
625 633  
626 634 def self.find_by_old_path(old_path)
627   - find(:first, :include => :versions, :conditions => ['article_versions.path = ?', old_path], :order => 'article_versions.id desc')
  635 + self.includes(:versions).where('article_versions.path = ?', old_path).order('article_versions.id DESC').first
628 636 end
629 637  
630 638 def hit
... ... @@ -702,11 +710,11 @@ class Article &lt; ActiveRecord::Base
702 710 end
703 711  
704 712 def get_version(version_number = nil)
705   - version_number ? versions.find(:first, :order => 'version', :offset => version_number - 1) : versions.earliest
  713 + if version_number then self.versions.order('version').offset(version_number - 1).first else self.versions.earliest end
706 714 end
707 715  
708 716 def author_by_version(version_number = nil)
709   - version_number ? profile.environment.people.find_by_id(get_version(version_number).author_id) : author
  717 + if version_number then profile.environment.people.where(id: get_version(version_number).author_id).first else author end
710 718 end
711 719  
712 720 def author_name(version_number = nil)
... ... @@ -802,7 +810,7 @@ class Article &lt; ActiveRecord::Base
802 810 end
803 811  
804 812 def activity
805   - ActionTracker::Record.find_by_target_type_and_target_id 'Article', self.id
  813 + ActionTracker::Record.where(target_type: 'Article', target_id: self.id).first
806 814 end
807 815  
808 816 def create_activity
... ...
app/models/article_categorization.rb
1 1 class ArticleCategorization < ActiveRecord::Base
2   - set_table_name :articles_categories
  2 + self.table_name = :articles_categories
  3 +
3 4 belongs_to :article
4 5 belongs_to :category
5 6  
... ...
app/models/block.rb
... ... @@ -20,7 +20,7 @@ class Block &lt; ActiveRecord::Base
20 20  
21 21 acts_as_having_settings
22 22  
23   - scope :enabled, :conditions => { :enabled => true }
  23 + scope :enabled, -> { where :enabled => true }
24 24  
25 25 after_save do |block|
26 26 if block.owner.kind_of?(Profile) && block.owner.is_template? && block.mirror?
... ...
app/models/blog_archives_block.rb
... ... @@ -15,7 +15,7 @@ class BlogArchivesBlock &lt; Block
15 15 _('Blog posts')
16 16 end
17 17  
18   - settings_items :blog_id, Integer
  18 + settings_items :blog_id, type: Integer
19 19  
20 20 def blog
21 21 blog_id && owner.blogs.exists?(blog_id) ? owner.blogs.find(blog_id) : owner.blog
... ... @@ -33,10 +33,10 @@ class BlogArchivesBlock &lt; Block
33 33 results = ''
34 34 posts = visible_posts(args[:person])
35 35 posts.except(:order).count(:all, :group => 'EXTRACT(YEAR FROM published_at)').sort_by {|year, count| -year.to_i}.each do |year, count|
36   - results << content_tag('li', content_tag('strong', "#{year} (#{count})"))
37   - results << "<ul class='#{year}-archive'>"
38   - posts.except(:order).count(:all, :conditions => ['EXTRACT(YEAR FROM published_at)=?', year], :group => 'EXTRACT(MONTH FROM published_at)').sort_by {|month, count| -month.to_i}.each do |month, count|
39   - results << content_tag('li', link_to("#{month_name(month.to_i)} (#{count})", owner_blog.url.merge(:year => year, :month => month)))
  36 + results << content_tag('li', content_tag('strong', "#{year.to_i} (#{count})"))
  37 + results << "<ul class='#{year.to_i}-archive'>"
  38 + posts.except(:order).where('EXTRACT(YEAR FROM published_at)=?', year.to_i).group('EXTRACT(MONTH FROM published_at)').count.sort_by {|month, count| -month.to_i}.each do |month, count|
  39 + results << content_tag('li', link_to("#{month_name(month.to_i)} (#{count})", owner_blog.url.merge(year: year.to_i, month: month.to_i)))
40 40 end
41 41 results << "</ul>"
42 42 end
... ...
app/models/box.rb
... ... @@ -7,7 +7,7 @@ class Box &lt; ActiveRecord::Base
7 7  
8 8 include Noosfero::Plugin::HotSpot
9 9  
10   - scope :with_position, :conditions => ['boxes.position > 0']
  10 + scope :with_position, -> { where 'boxes.position > 0' }
11 11  
12 12 def environment
13 13 owner ? (owner.kind_of?(Environment) ? owner : owner.environment) : nil
... ...
app/models/categorization.rb
1 1 module Categorization
2 2  
3 3 def add_category_to_object(category, object)
4   - if !find(:first, :conditions => {object_id_column => object, :category_id => category} )
  4 + if !self.where(object_id_column => object, :category_id => category).first
5 5 connection.execute("insert into #{table_name} (category_id, #{object_id_column}) values(#{category.id}, #{object.id})")
6 6  
7 7 c = category.parent
8   - while !c.nil? && !self.find(:first, :conditions => {object_id_column => object, :category_id => c})
  8 + while !c.nil? && !self.where(object_id_column => object, :category_id => c).first
9 9 connection.execute("insert into #{table_name} (category_id, #{object_id_column}, virtual) values(#{c.id}, #{object.id}, 1>0)")
10 10 c = c.parent
11 11 end
... ...
app/models/category.rb
... ... @@ -14,12 +14,12 @@ class Category &lt; ActiveRecord::Base
14 14 validates_uniqueness_of :slug,:scope => [ :environment_id, :parent_id ], :message => N_('{fn} is already being used by another category.').fix_i18n
15 15 belongs_to :environment
16 16  
17   - # Finds all top level categories for a given environment.
18   - scope :top_level_for, lambda { |environment|
19   - {:conditions => ['parent_id is null and environment_id = ?', environment.id ]}
  17 + # Finds all top level categories for a given environment.
  18 + scope :top_level_for, -> environment {
  19 + where 'parent_id is null and environment_id = ?', environment.id
20 20 }
21 21  
22   - scope :on_level, lambda { |parent| {:conditions => {:parent_id => parent}} }
  22 + scope :on_level, -> parent { where :parent_id => parent }
23 23  
24 24 acts_as_filesystem
25 25  
... ... @@ -46,26 +46,26 @@ class Category &lt; ActiveRecord::Base
46 46 display_color = nil if display_color.blank?
47 47 end
48 48  
49   - scope :from_types, lambda { |types|
50   - types.select{ |t| t.blank? }.empty? ?
51   - { :conditions => { :type => types } } :
52   - { :conditions => [ "type IN (?) OR type IS NULL", types.reject{ |t| t.blank? } ] }
  49 + scope :from_types, -> types {
  50 + if types.select{ |t| t.blank? }.empty? then
  51 + where(type: types) else
  52 + where("type IN (?) OR type IS NULL", types.reject{ |t| t.blank? }) end
53 53 }
54 54  
55 55 def recent_people(limit = 10)
56   - self.people.paginate(:order => 'created_at DESC, id DESC', :page => 1, :per_page => limit)
  56 + self.people.reorder('created_at DESC, id DESC').paginate(page: 1, per_page: limit)
57 57 end
58 58  
59 59 def recent_enterprises(limit = 10)
60   - self.enterprises.paginate(:order => 'created_at DESC, id DESC', :page => 1, :per_page => limit)
  60 + self.enterprises.reorder('created_at DESC, id DESC').paginate(page: 1, per_page: limit)
61 61 end
62 62  
63 63 def recent_communities(limit = 10)
64   - self.communities.paginate(:order => 'created_at DESC, id DESC', :page => 1, :per_page => limit)
  64 + self.communities.reorder('created_at DESC, id DESC').paginate(page: 1, per_page: limit)
65 65 end
66 66  
67 67 def recent_products(limit = 10)
68   - self.products.paginate(:order => 'created_at DESC, id DESC', :page => 1, :per_page => limit)
  68 + self.products.reorder('created_at DESC, id DESC').paginate(page: 1, per_page: limit)
69 69 end
70 70  
71 71 def recent_articles(limit = 10)
... ... @@ -73,7 +73,7 @@ class Category &lt; ActiveRecord::Base
73 73 end
74 74  
75 75 def recent_comments(limit = 10)
76   - comments.paginate(:order => 'created_at DESC, comments.id DESC', :page => 1, :per_page => limit)
  76 + self.comments.reorder('created_at DESC, comments.id DESC').paginate(page: 1, per_page: limit)
77 77 end
78 78  
79 79 def most_commented_articles(limit = 10)
... ... @@ -81,7 +81,7 @@ class Category &lt; ActiveRecord::Base
81 81 end
82 82  
83 83 def upcoming_events(limit = 10)
84   - self.events.paginate(:conditions => [ 'start_date >= ?', DateTime.now.beginning_of_day ], :order => 'start_date', :page => 1, :per_page => limit)
  84 + self.events.where('start_date >= ?', DateTime.now.beginning_of_day).order('start_date').paginate(page: 1, per_page: limit)
85 85 end
86 86  
87 87 def display_in_menu?
... ... @@ -90,11 +90,11 @@ class Category &lt; ActiveRecord::Base
90 90  
91 91 def children_for_menu
92 92 results = []
93   - pending = children.find(:all, :conditions => { :display_in_menu => true})
94   - while !pending.empty?
  93 + pending = children.where(display_in_menu: true).all
  94 + while pending.present?
95 95 cat = pending.shift
96 96 results << cat
97   - pending += cat.children.find(:all, :conditions => { :display_in_menu => true} )
  97 + pending += cat.children.where :display_in_menu => true
98 98 end
99 99  
100 100 results
... ... @@ -102,7 +102,7 @@ class Category &lt; ActiveRecord::Base
102 102  
103 103 def is_leaf_displayable_in_menu?
104 104 return false if self.display_in_menu == false
105   - self.children.find(:all, :conditions => {:display_in_menu => true}).empty?
  105 + self.children.where(:display_in_menu => true).empty?
106 106 end
107 107  
108 108 def with_color
... ...
app/models/certifier.rb
... ... @@ -20,7 +20,7 @@ class Certifier &lt; ActiveRecord::Base
20 20 validates_presence_of :name
21 21  
22 22 def destroy
23   - product_qualifiers.each { |pq| pq.update_attributes! :certifier => nil }
  23 + product_qualifiers.each { |pq| pq.update! :certifier => nil }
24 24 super
25 25 end
26 26  
... ...
app/models/comment.rb
... ... @@ -18,7 +18,7 @@ class Comment &lt; ActiveRecord::Base
18 18 has_many :children, :class_name => 'Comment', :foreign_key => 'reply_of_id', :dependent => :destroy
19 19 belongs_to :reply_of, :class_name => 'Comment', :foreign_key => 'reply_of_id'
20 20  
21   - scope :without_reply, :conditions => ['reply_of_id IS NULL']
  21 + scope :without_reply, -> { where 'reply_of_id IS NULL' }
22 22  
23 23 include TimeScopes
24 24  
... ...
app/models/create_community.rb
... ... @@ -34,7 +34,7 @@ class CreateCommunity &lt; Task
34 34 ! DATA_FIELDS.include?(key.to_s)
35 35 end
36 36  
37   - community.update_attributes(community_data)
  37 + community.update(community_data)
38 38 community.image = image if image
39 39 community.environment = self.environment
40 40 community.save!
... ...
app/models/create_enterprise.rb
... ... @@ -16,13 +16,13 @@ class CreateEnterprise &lt; Task
16 16 settings_items field.to_sym
17 17 end
18 18  
19   - # checks for virtual attributes
  19 + # checks for virtual attributes
20 20 validates_presence_of :name, :identifier
21 21  
22 22 #checks if the validation method is region to validates
23 23 validates_presence_of :region_id, :if => lambda { |obj| obj.environment.organization_approval_method == :region }
24 24  
25   - validates_format_of :foundation_year, :with => /^\d*$/
  25 + validates_numericality_of :foundation_year, only_integer: true, if: -> o { o.foundation_year.present? }
26 26  
27 27 # checks for actual attributes
28 28 validates_presence_of :requestor_id, :target_id
... ... @@ -129,7 +129,7 @@ class CreateEnterprise &lt; Task
129 129 finish
130 130 end
131 131  
132   - # tells if this request was appoved
  132 + # tells if this request was appoved
133 133 def approved?
134 134 self.status == Task::Status::FINISHED
135 135 end
... ...
app/models/domain.rb
... ... @@ -14,7 +14,7 @@ class Domain &lt; ActiveRecord::Base
14 14  
15 15 # <tt>name</tt> must be sequences of alphanumeric characters (a to z,
16 16 # 0 to 9), plus '_' or '-', separated by dots. Letters must be lowercase.
17   - validates_format_of :name, :with => /^([a-z0-9_-]+\.)+[a-z0-9_-]+$/, :message => N_('{fn} must be composed of sequences of lowercase letters (a to z), numbers (0 to 9), "_" and "-", separated by dots.').fix_i18n
  17 + validates_format_of :name, with: /\A([a-z0-9_-]+\.)+[a-z0-9_-]+\z/, message: N_('{fn} must be composed of sequences of lowercase letters (a to z), numbers (0 to 9), "_" and "-", separated by dots.').fix_i18n
18 18  
19 19 # checks validations that could not be expressed using Rails' predefined
20 20 # validations. In particular:
... ... @@ -37,7 +37,7 @@ class Domain &lt; ActiveRecord::Base
37 37 # "www.", but it will be removed before searching. So searching for
38 38 # 'www.example.net' is exactly the same as searching for just 'example.net'
39 39 def self.find_by_name(name)
40   - self.find(:first, :conditions => [ 'name = ?', self.extract_domain_name(name) ])
  40 + self.where('name = ?', self.extract_domain_name(name)).first
41 41 end
42 42  
43 43 # turns the argument (expected to be a String) into a domain name that is
... ...
app/models/enterprise.rb
... ... @@ -71,7 +71,7 @@ class Enterprise &lt; Organization
71 71 end
72 72  
73 73 def highlighted_products_with_image(options = {})
74   - Product.find(:all, {:conditions => {:highlighted => true}, :joins => :image}.merge(options))
  74 + Product.where(:highlighted => true).joins(:image)
75 75 end
76 76  
77 77 def required_fields
... ...
app/models/environment.rb
... ... @@ -17,7 +17,10 @@ class Environment &lt; ActiveRecord::Base
17 17  
18 18 has_many :users
19 19  
20   - self.partial_updates = false
  20 + # allow roles use
  21 + def self.dangerous_attribute_method? name
  22 + false
  23 + end
21 24  
22 25 has_many :tasks, :dependent => :destroy, :as => 'target'
23 26 has_many :search_terms, :as => :context
... ... @@ -110,7 +113,7 @@ class Environment &lt; ActiveRecord::Base
110 113 def admins
111 114 admin_role = Environment::Roles.admin(self)
112 115 return [] if admin_role.blank?
113   - Person.members_of(self).all(:conditions => ['role_assignments.role_id = ?', admin_role.id])
  116 + Person.members_of(self).where 'role_assignments.role_id = ?', admin_role.id
114 117 end
115 118  
116 119 # returns the available features for a Environment, in the form of a
... ... @@ -225,9 +228,11 @@ class Environment &lt; ActiveRecord::Base
225 228 has_many :licenses
226 229  
227 230 has_many :categories
228   - has_many :display_categories, :class_name => 'Category', :conditions => 'display_color is not null and parent_id is null', :order => 'display_color'
  231 + has_many :display_categories, -> {
  232 + order('display_color').where('display_color is not null and parent_id is null')
  233 + }, class_name: 'Category'
229 234  
230   - has_many :product_categories, :conditions => { :type => 'ProductCategory'}
  235 + has_many :product_categories, -> { where type: 'ProductCategory'}
231 236 has_many :regions
232 237 has_many :states
233 238 has_many :cities
... ... @@ -349,7 +354,7 @@ class Environment &lt; ActiveRecord::Base
349 354 settings_items :signup_welcome_screen_body, :type => String
350 355  
351 356 #Captcha settings
352   - settings_items :api_captcha_settings, :type => ActiveSupport::HashWithIndifferentAccess, :default => {}
  357 + settings_items :api_captcha_settings, :default => {}
353 358  
354 359 def has_custom_welcome_screen?
355 360 settings[:signup_welcome_screen_body].present?
... ... @@ -696,7 +701,7 @@ class Environment &lt; ActiveRecord::Base
696 701  
697 702 # the default Environment.
698 703 def self.default
699   - self.find(:first, :conditions => [ 'is_default = ?', true ] )
  704 + self.where('is_default = ?', true).first
700 705 end
701 706  
702 707 # returns an array with the top level categories for this environment.
... ... @@ -877,7 +882,7 @@ class Environment &lt; ActiveRecord::Base
877 882 end
878 883  
879 884 def portal_folders
880   - (settings[:portal_folders] || []).map{|fid| portal_community.articles.find(:first, :conditions => { :id => fid }) }.compact
  885 + (settings[:portal_folders] || []).map{|fid| portal_community.articles.where(id: fid).first }.compact
881 886 end
882 887  
883 888 def portal_folders=(folders)
... ... @@ -964,7 +969,7 @@ class Environment &lt; ActiveRecord::Base
964 969 end
965 970  
966 971 def highlighted_products_with_image(options = {})
967   - Product.find(:all, {:conditions => {:highlighted => true, :profile_id => self.enterprises.find(:all, :select => :id) }, :joins => :image}.merge(options))
  972 + self.products.where(highlighted: true).joins(:image).order('created_at ASC')
968 973 end
969 974  
970 975 settings_items :home_cache_in_minutes, :type => :integer, :default => 5
... ...
app/models/event.rb
... ... @@ -13,14 +13,14 @@ class Event &lt; Article
13 13 settings_items :presenter, :type => :string
14 14  
15 15 def link=(value)
16   - self.setting[:link] = maybe_add_http(value)
  16 + self.setting[:link] = maybe_add_http(URI.escape value.to_s)
17 17 end
18 18  
19 19 def link
20 20 maybe_add_http(self.setting[:link])
21 21 end
22 22  
23   - xss_terminate :only => [ :name, :body, :link, :address ], :with => 'white_list', :on => 'validation'
  23 + xss_terminate :only => [ :name, :body, :address ], :with => 'white_list', :on => 'validation'
24 24  
25 25 def initialize(*args)
26 26 super(*args)
... ... @@ -35,23 +35,21 @@ class Event &lt; Article
35 35 end
36 36 end
37 37  
38   - scope :by_day, lambda { |date|
39   - { :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}],
40   - :order => 'start_date ASC'
41   - }
  38 + scope :by_day, -> date {
  39 + 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)',
  40 + start_date: date.beginning_of_day, end_date: date.end_of_day).
  41 + order('start_date ASC')
42 42 }
43 43  
44   - scope :next_events_from_month, lambda { |date|
  44 + scope :next_events_from_month, -> date {
45 45 date_temp = date.strftime("%Y-%m-%d")
46   - { :conditions => ["start_date >= ?","#{date_temp}"],
47   - :order => 'start_date ASC'
48   - }
  46 + order('start_date ASC')
  47 + .where("start_date >= ?","#{date_temp}")
49 48 }
50 49  
51   - scope :by_month, lambda { |date|
52   - { :conditions => ["EXTRACT(YEAR FROM start_date) = ? AND EXTRACT(MONTH FROM start_date) = ?",date.year,date.month],
53   - :order => 'start_date ASC'
54   - }
  50 + scope :by_month, -> date {
  51 + order('start_date ASC')
  52 + .where("EXTRACT(YEAR FROM start_date) = ? AND EXTRACT(MONTH FROM start_date) = ?", date.year, date.month)
55 53 }
56 54  
57 55 include WhiteListFilter
... ... @@ -72,12 +70,10 @@ class Event &lt; Article
72 70 'event'
73 71 end
74 72  
75   - scope :by_range, lambda { |range| {
76   - :conditions => [
77   - 'start_date BETWEEN :start_day AND :end_day OR end_date BETWEEN :start_day AND :end_day',
78   - { :start_day => range.first, :end_day => range.last }
79   - ]
80   - }}
  73 + scope :by_range, -> range {
  74 + where('start_date BETWEEN :start_day AND :end_day OR end_date BETWEEN :start_day AND :end_day',
  75 + {:start_day => range.first, :end_day => range.last})
  76 + }
81 77  
82 78 def self.date_range(year, month)
83 79 if year.nil? || month.nil?
... ...
app/models/external_feed.rb
... ... @@ -5,9 +5,9 @@ class ExternalFeed &lt; ActiveRecord::Base
5 5 validates_presence_of :address, :if => lambda {|efeed| efeed.enabled}
6 6 validates_uniqueness_of :blog_id
7 7  
8   - scope :enabled, :conditions => { :enabled => true }
9   - scope :expired, lambda {
10   - { :conditions => ['(fetched_at is NULL) OR (fetched_at < ?)', Time.now - FeedUpdater.update_interval] }
  8 + scope :enabled, -> { where enabled: true }
  9 + scope :expired, -> {
  10 + where '(fetched_at is NULL) OR (fetched_at < ?)', Time.now - FeedUpdater.update_interval
11 11 }
12 12  
13 13 attr_accessible :address, :enabled, :only_once
... ...
app/models/featured_products_block.rb
... ... @@ -11,7 +11,7 @@ class FeaturedProductsBlock &lt; Block
11 11 if block.owner.kind_of?(Environment) && block.product_ids.blank?
12 12 total = block.owner.products.count
13 13 offset = rand([(total - block.groups_of * 3) + 1, 1].max)
14   - block.product_ids = block.owner.highlighted_products_with_image(:offset => offset, :limit => block.groups_of * 3).map(&:id)
  14 + block.product_ids = block.owner.highlighted_products_with_image.offset(offset).limit(block.groups_of * 3).map(&:id)
15 15 end
16 16 block.groups_of = block.groups_of.to_i
17 17 end
... ...
app/models/feed_reader_block.rb
... ... @@ -27,8 +27,8 @@ class FeedReaderBlock &lt; Block
27 27 settings_items :update_errors, :type => :integer, :default => 0
28 28 settings_items :error_message, :type => :string
29 29  
30   - scope :expired, lambda {
31   - { :conditions => [ '(fetched_at is NULL) OR (fetched_at < ?)', Time.now - FeedUpdater.update_interval] }
  30 + scope :expired, -> {
  31 + where '(fetched_at is NULL) OR (fetched_at < ?)', Time.now - FeedUpdater.update_interval
32 32 }
33 33  
34 34 before_create do |block|
... ...
app/models/folder.rb
... ... @@ -56,10 +56,11 @@ class Folder &lt; Article
56 56 profile.recent_documents(limit, ["articles.type != ? AND articles.highlighted = ? AND articles.parent_id = ?", 'Folder', highlight, id])
57 57 end
58 58  
59   - has_many :images, :class_name => 'Article',
60   - :foreign_key => 'parent_id',
61   - :order => 'articles.type, articles.name',
62   - :conditions => ["articles.type = 'UploadedFile' and articles.content_type in (?) or articles.type in ('Folder','Gallery')", UploadedFile.content_types]
  59 + has_many :images, -> {
  60 + order('articles.type, articles.name').
  61 + where("articles.type = 'UploadedFile' and articles.content_type in (?) or articles.type in ('Folder','Gallery')", UploadedFile.content_types)
  62 + }, class_name: 'Article', foreign_key: 'parent_id'
  63 +
63 64  
64 65 def accept_uploads?
65 66 !self.has_posts? || self.gallery?
... ...
app/models/image.rb
1 1 class Image < ActiveRecord::Base
2 2  
  3 + attr_accessible :uploaded_data, :label, :remove_image
  4 + attr_accessor :remove_image
  5 +
3 6 def self.max_size
4 7 Image.attachment_options[:max_size]
5 8 end
6 9  
7 10 sanitize_filename
8 11  
9   - has_attachment :content_type => :image,
10   - :storage => :file_system,
  12 + has_attachment :content_type => :image,
  13 + :storage => :file_system,
11 14 :path_prefix => 'public/image_uploads',
12 15 :resize_to => '800x600>',
13 16 :thumbnails => { :big => '150x150',
... ... @@ -15,7 +18,8 @@ class Image &lt; ActiveRecord::Base
15 18 :portrait => '64x64',
16 19 :minor => '50x50>',
17 20 :icon => '20x20!' },
18   - :max_size => 5.megabytes # remember to update validate message below
  21 + :max_size => 5.megabytes, # remember to update validate message below
  22 + processor: 'Rmagick'
19 23  
20 24 validates_attachment :size => N_("{fn} of uploaded file was larger than the maximum size of 5.0 MB").fix_i18n
21 25  
... ... @@ -23,10 +27,8 @@ class Image &lt; ActiveRecord::Base
23 27  
24 28 postgresql_attachment_fu
25 29  
26   - attr_accessible :uploaded_data, :label, :remove_image
27   - attr_accessor :remove_image
28   -
29 30 def current_data
30 31 File.file?(full_filename) ? File.read(full_filename) : nil
31 32 end
  33 +
32 34 end
... ...
app/models/input.rb
... ... @@ -13,7 +13,7 @@ class Input &lt; ActiveRecord::Base
13 13  
14 14 belongs_to :unit
15 15  
16   - scope :relevant_to_price, :conditions => { :relevant_to_price => true }
  16 + scope :relevant_to_price, -> { where relevant_to_price: true }
17 17  
18 18 include FloatHelper
19 19  
... ...
app/models/invite_friend.rb
... ... @@ -45,7 +45,7 @@ class InviteFriend &lt; Invitation
45 45 private
46 46 def check_for_invitation_existence
47 47 if friend
48   - friend.tasks.pending.of("InviteFriend").find(:all, :conditions => {:requestor_id => person.id, :target_id => friend.id}).blank?
  48 + friend.tasks.pending.of("InviteFriend").where(requestor_id: person.id, target_id: friend.id).blank?
49 49 end
50 50 end
51 51  
... ...
app/models/invite_member.rb
... ... @@ -65,7 +65,7 @@ class InviteMember &lt; Invitation
65 65 private
66 66 def check_for_invitation_existence
67 67 if friend
68   - friend.tasks.pending.of("InviteMember").find(:all, :conditions => {:requestor_id => person.id}).select { |t| t.data[:community_id] == community_id }.blank?
  68 + friend.tasks.pending.of("InviteMember").where(requestor_id: person.id).select{ |t| t.data[:community_id] == community_id }.blank?
69 69 end
70 70 end
71 71  
... ...
app/models/link_list_block.rb
... ... @@ -41,7 +41,7 @@ class LinkListBlock &lt; Block
41 41 [N_('New window'), '_new'],
42 42 ]
43 43  
44   - settings_items :links, Array, :default => []
  44 + settings_items :links, type: Array, :default => []
45 45  
46 46 before_save do |block|
47 47 block.links = block.links.delete_if {|i| i[:name].blank? and i[:address].blank?}
... ...
app/models/organization.rb
... ... @@ -84,7 +84,7 @@ class Organization &lt; Profile
84 84 end
85 85  
86 86 def find_pending_validation(code)
87   - validations.pending.find(:first, :conditions => {:code => code})
  87 + validations.pending.where(code: code).first
88 88 end
89 89  
90 90 def processed_validations
... ... @@ -92,7 +92,7 @@ class Organization &lt; Profile
92 92 end
93 93  
94 94 def find_processed_validation(code)
95   - validations.finished.find(:first, :conditions => {:code => code})
  95 + validations.finished.where(code: code).first
96 96 end
97 97  
98 98 def is_validation_entity?
... ... @@ -140,7 +140,7 @@ class Organization &lt; Profile
140 140  
141 141 settings_items :zip_code, :city, :state, :country
142 142  
143   - validates_format_of :foundation_year, :with => Noosfero::Constants::INTEGER_FORMAT
  143 + validates_numericality_of :foundation_year, only_integer: true, if: -> o { o.foundation_year.present? }
144 144 validates_format_of :contact_email, :with => Noosfero::Constants::EMAIL_FORMAT, :if => (lambda { |org| !org.contact_email.blank? })
145 145 validates_as_cnpj :cnpj
146 146  
... ... @@ -194,7 +194,7 @@ class Organization &lt; Profile
194 194 end
195 195  
196 196 def already_request_membership?(person)
197   - self.tasks.pending.find_by_requestor_id(person.id, :conditions => { :type => 'AddMember' })
  197 + self.tasks.pending.where(type: 'AddMember', requestor_id: person.id).first
198 198 end
199 199  
200 200 def jid(options = {})
... ...
app/models/person.rb
... ... @@ -19,45 +19,41 @@ class Person &lt; Profile
19 19 acts_as_trackable :after_add => Proc.new {|p,t| notify_activity(t)}
20 20 acts_as_accessor
21 21  
22   -
23   - scope :members_of, lambda { |resources, extra_joins = nil|
24   - resources = [resources] if !resources.kind_of?(Array)
  22 + scope :members_of, -> resources {
  23 + resources = Array(resources)
25 24 conditions = resources.map {|resource| "role_assignments.resource_type = '#{resource.class.base_class.name}' AND role_assignments.resource_id = #{resource.id || -1}"}.join(' OR ')
26   - joins = [:role_assignments]
27   - joins += extra_joins if extra_joins.is_a? Array
28   - { :select => 'DISTINCT profiles.*', :joins => joins, :conditions => [conditions] }
  25 + select('DISTINCT profiles.*').joins(:role_assignments).where([conditions])
29 26 }
30 27  
31   - scope :not_members_of, lambda { |resources|
32   - resources = [resources] if !resources.kind_of?(Array)
  28 + scope :not_members_of, -> resources {
  29 + resources = Array(resources)
33 30 conditions = resources.map {|resource| "role_assignments.resource_type = '#{resource.class.base_class.name}' AND role_assignments.resource_id = #{resource.id || -1}"}.join(' OR ')
34   - { :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] }
  31 + 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)
35 32 }
36 33  
37   - scope :by_role, lambda { |roles, extra_joins = nil|
38   - roles = [roles] unless roles.kind_of?(Array)
39   - joins = [:role_assignments]
40   - joins += extra_joins if extra_joins.is_a? Array
41   - { :select => 'DISTINCT profiles.*', :joins => joins, :conditions => ['role_assignments.role_id IN (?)',roles] }
  34 + scope :by_role, -> roles {
  35 + roles = Array(roles)
  36 + select('DISTINCT profiles.*').joins(:role_assignments).where('role_assignments.role_id IN (?)', roles)
42 37 }
43 38  
44   - scope :not_friends_of, lambda { |resources|
  39 + scope :not_friends_of, -> resources {
45 40 resources = Array(resources)
46   - { :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)] }
  41 + 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))
47 42 }
48 43  
49 44 scope :visible_for_person, lambda { |person|
50   - joins('LEFT JOIN "role_assignments" ON
51   - "role_assignments"."resource_id" = "profiles"."environment_id" AND
52   - "role_assignments"."resource_type" = \'Environment\'')
53   - .joins('LEFT JOIN "roles" ON "role_assignments"."role_id" = "roles"."id"')
54   - .joins('LEFT JOIN "friendships" ON "friendships"."friend_id" = "profiles"."id"')
55   - .where(
56   - ['( roles.key = ? AND role_assignments.accessor_type = ? AND role_assignments.accessor_id = ? ) OR (
57   - ( ( friendships.person_id = ? ) OR (profiles.public_profile = ?)) AND (profiles.visible = ?) )', 'environment_administrator', Profile.name, person.id, person.id, true, true]
58   - ).uniq
  45 + joins('LEFT JOIN "role_assignments" ON
  46 + "role_assignments"."resource_id" = "profiles"."environment_id" AND
  47 + "role_assignments"."resource_type" = \'Environment\'')
  48 + .joins('LEFT JOIN "roles" ON "role_assignments"."role_id" = "roles"."id"')
  49 + .joins('LEFT JOIN "friendships" ON "friendships"."friend_id" = "profiles"."id"')
  50 + .where(
  51 + ['( roles.key = ? AND role_assignments.accessor_type = ? AND role_assignments.accessor_id = ? ) OR (
  52 + ( ( friendships.person_id = ? ) OR (profiles.public_profile = ?)) AND (profiles.visible = ?) )', 'environment_administrator', Profile.name, person.id, person.id, true, true]
  53 + ).uniq
59 54 }
60 55  
  56 +
61 57 def has_permission_with_admin?(permission, resource)
62 58 return true if resource.blank? || resource.admins.include?(self)
63 59 return true if resource.kind_of?(Profile) && resource.environment.admins.include?(self)
... ... @@ -74,6 +70,9 @@ class Person &lt; Profile
74 70 end
75 71 alias_method_chain :has_permission?, :plugins
76 72  
  73 + # for eager loading
  74 + has_many :memberships, through: :role_assignments, source: :resource, source_type: 'Profile'
  75 +
77 76 def memberships
78 77 scopes = []
79 78 plugins_scopes = plugins.dispatch_scopes(:person_memberships, self)
... ... @@ -95,7 +94,9 @@ class Person &lt; Profile
95 94 has_many :friendships, :dependent => :destroy
96 95 has_many :friends, :class_name => 'Person', :through => :friendships
97 96  
98   - scope :online, lambda { { :include => :user, :conditions => ["users.chat_status != '' AND users.chat_status_at >= ?", DateTime.now - User.expires_chat_status_every.minutes] } }
  97 + scope :online, -> {
  98 + joins(:user).where("users.chat_status != '' AND users.chat_status_at >= ?", DateTime.now - User.expires_chat_status_every.minutes)
  99 + }
99 100  
100 101 has_many :requested_tasks, :class_name => 'Task', :foreign_key => :requestor_id, :dependent => :destroy
101 102  
... ... @@ -111,21 +112,31 @@ class Person &lt; Profile
111 112 has_and_belongs_to_many :acepted_forums, :class_name => 'Forum', :join_table => 'terms_forum_people'
112 113 has_and_belongs_to_many :articles_with_access, :class_name => 'Article', :join_table => 'article_privacy_exceptions'
113 114  
114   - has_many :suggested_profiles, :class_name => 'ProfileSuggestion', :foreign_key => :person_id, :order => 'score DESC', :dependent => :destroy
115   - has_many :suggested_people, :through => :suggested_profiles, :source => :suggestion, :conditions => ['profile_suggestions.suggestion_type = ? AND profile_suggestions.enabled = ?', 'Person', true]
116   - has_many :suggested_communities, :through => :suggested_profiles, :source => :suggestion, :conditions => ['profile_suggestions.suggestion_type = ? AND profile_suggestions.enabled = ?', 'Community', true]
  115 + has_many :suggested_profiles, class_name: 'ProfileSuggestion', foreign_key: :person_id, order: 'score DESC', dependent: :destroy
  116 + has_many :suggested_people, -> {
  117 + where 'profile_suggestions.suggestion_type = ? AND profile_suggestions.enabled = ?', 'Person', true
  118 + }, through: :suggested_profiles, source: :suggestion
  119 + has_many :suggested_communities, -> {
  120 + where 'profile_suggestions.suggestion_type = ? AND profile_suggestions.enabled = ?', 'Community', true
  121 + }, through: :suggested_profiles, source: :suggestion
117 122  
118   - scope :more_popular, :order => 'friends_count DESC'
  123 + scope :more_popular, -> { order 'friends_count DESC' }
119 124  
120   - scope :abusers, :joins => :abuse_complaints, :conditions => ['tasks.status = 3'], :select => 'DISTINCT profiles.*'
121   - 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.*"
  125 + scope :abusers, -> {
  126 + joins(:abuse_complaints).where('tasks.status = 3').select('DISTINCT profiles.*')
  127 + }
  128 + scope :non_abusers, -> {
  129 + select("DISTINCT profiles.*").
  130 + joins("LEFT JOIN tasks ON profiles.id = tasks.requestor_id AND tasks.type='AbuseComplaint'").
  131 + where("tasks.status != 3 OR tasks.id is NULL")
  132 + }
122 133  
123   - scope :admins, :joins => [:role_assignments => :role], :conditions => ['roles.key = ?', 'environment_administrator' ]
124   - scope :activated, :joins => :user, :conditions => ['users.activation_code IS NULL AND users.activated_at IS NOT NULL']
125   - scope :deactivated, :joins => :user, :conditions => ['NOT (users.activation_code IS NULL AND users.activated_at IS NOT NULL)']
  134 + scope :admins, -> { joins(:role_assignments => :role).where('roles.key = ?', 'environment_administrator') }
  135 + scope :activated, -> { joins(:user).where('users.activation_code IS NULL AND users.activated_at IS NOT NULL') }
  136 + scope :deactivated, -> { joins(:user).where('NOT (users.activation_code IS NULL AND users.activated_at IS NOT NULL)') }
126 137  
127 138 after_destroy do |person|
128   - Friendship.find(:all, :conditions => { :friend_id => person.id}).each { |friendship| friendship.destroy }
  139 + Friendship.where(friend_id: person.id).each{ |friendship| friendship.destroy }
129 140 end
130 141  
131 142 belongs_to :user, :dependent => :delete
... ... @@ -188,7 +199,7 @@ class Person &lt; Profile
188 199 end
189 200  
190 201 def remove_friend(friend)
191   - Friendship.find(:first, :conditions => {:friend_id => friend, :person_id => id}).destroy
  202 + Friendship.where(friend_id: friend, person_id: id).first.destroy
192 203 end
193 204  
194 205 FIELDS = %w[
... ... @@ -219,7 +230,7 @@ class Person &lt; Profile
219 230 organization
220 231 organization_website
221 232 contact_phone
222   - contact_informatioin
  233 + contact_information
223 234 ]
224 235  
225 236 xss_terminate :only => [ :custom_footer, :custom_header, :description, :nickname, :sex, :nationality, :country, :district, :zip_code, :address, :address_reference, :cell_phone, :comercial_phone, :personal_website, :jabber_id, :schooling, :formation, :custom_formation, :area_of_study, :custom_area_of_study, :professional_activity, :organization, :organization_website, :contact_phone, :contact_information ], :with => 'white_list'
... ... @@ -301,7 +312,7 @@ class Person &lt; Profile
301 312 end
302 313  
303 314 validates_each :email, :on => :update do |record,attr,value|
304   - if User.find(:first, :conditions => ['email = ? and id != ? and environment_id = ?', value, record.user.id, record.environment.id])
  315 + if User.where('email = ? and id != ? and environment_id = ?', value, record.user.id, record.environment.id).first
305 316 record.errors.add(attr, _('{fn} is already used by other user').fix_i18n)
306 317 end
307 318 end
... ... @@ -410,7 +421,7 @@ class Person &lt; Profile
410 421 def ask_to_join?(community)
411 422 return false if !community.visible?
412 423 return false if memberships.include?(community)
413   - return false if AddMember.find(:first, :conditions => {:requestor_id => self.id, :target_id => community.id})
  424 + return false if AddMember.where(requestor_id: self.id, target_id: community.id).first
414 425 !refused_communities.include?(community)
415 426 end
416 427  
... ...
app/models/person_notifier.rb
  1 +# FIXME needed by test/units/application_helper.rb
  2 +require_dependency 'application_helper'
  3 +
1 4 class PersonNotifier
2 5  
3 6 def initialize(person)
... ... @@ -28,7 +31,7 @@ class PersonNotifier
28 31  
29 32 def notify
30 33 if @person.notification_time && @person.notification_time > 0
31   - notifications = @person.tracked_notifications.find(:all, :conditions => ["created_at > ?", notify_from])
  34 + notifications = @person.tracked_notifications.where("created_at > ?", notify_from)
32 35 tasks = Task.to(@person).without_spam.pending.where("created_at > ?", notify_from).order_by('created_at', 'asc')
33 36  
34 37 Noosfero.with_locale @person.environment.default_language do
... ... @@ -74,9 +77,8 @@ class PersonNotifier
74 77  
75 78 end
76 79  
77   - class Mailer < ActionMailer::Base
  80 + class Mailer < ApplicationMailer
78 81  
79   - helper ApplicationHelper
80 82 helper ActionTrackerHelper
81 83  
82 84 def session
... ... @@ -85,8 +87,8 @@ class PersonNotifier
85 87  
86 88 def content_summary(person, notifications, tasks)
87 89 if person.environment
88   - ActionMailer::Base.asset_host = person.environment.top_url
89   - ActionMailer::Base.default_url_options[:host] = person.environment.default_hostname
  90 + ApplicationMailer.asset_host = person.environment.top_url
  91 + ApplicationMailer.default_url_options[:host] = person.environment.default_hostname
90 92 end
91 93  
92 94 @current_theme = 'default'
... ... @@ -94,7 +96,7 @@ class PersonNotifier
94 96 @recipient = @profile.nickname || @profile.name
95 97 @notifications = notifications
96 98 @tasks = tasks
97   - @environment = @profile.environment.name
  99 + @environment = @profile.environment
98 100 @url = @profile.environment.top_url
99 101 mail(
100 102 content_type: "text/html",
... ...
app/models/product.rb
... ... @@ -52,8 +52,8 @@ class Product &lt; ActiveRecord::Base
52 52  
53 53 scope :more_recent, :order => "created_at DESC"
54 54  
55   - scope :from_category, lambda { |category|
56   - {:joins => :product_category, :conditions => ['categories.path LIKE ?', "%#{category.slug}%"]} if category
  55 + scope :from_category, -> category {
  56 + joins(:product_category).where('categories.path LIKE ?', "%#{category.slug}%") if category
57 57 }
58 58  
59 59 scope :visible_for_person, lambda { |person|
... ...
app/models/product_category.rb
... ... @@ -6,22 +6,19 @@ class ProductCategory &lt; Category
6 6 attr_accessible :name, :parent, :environment
7 7  
8 8 scope :unique, :select => 'DISTINCT ON (path) categories.*'
9   - scope :by_enterprise, lambda { |enterprise| {
10   - :joins => :products,
11   - :conditions => ['products.profile_id = ?', enterprise.id]
12   - }}
13   - scope :by_environment, lambda { |environment| {
14   - :conditions => ['environment_id = ?', environment.id]
15   - }}
16   -
17   - # updated scope method to avoid sql injection vunerabillity (http://brakemanscanner.org/docs/warning_types/sql_injection/)
18   - # explicited to_i on level argument
19   - scope :unique_by_level, lambda { |level| {
20   - :select => "DISTINCT ON (filtered_category) split_part(path, '/', #{level.to_i}) AS filtered_category, categories.*"
21   - }}
  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 + }
22 19  
23 20 def all_products
24   - Product.find(:all, :conditions => { :product_category_id => (all_children << self).map(&:id) })
  21 + Product.where(product_category_id: (all_children << self).map(&:id))
25 22 end
26 23  
27 24 def self.menu_categories(top_category, env)
... ...
app/models/products_block.rb
... ... @@ -39,7 +39,7 @@ class ProductsBlock &lt; Block
39 39 link_to(_('View all products'), owner.public_profile_url.merge(:controller => 'catalog', :action => 'index'))
40 40 end
41 41  
42   - settings_items :product_ids, Array
  42 + settings_items :product_ids, type: Array
43 43 def product_ids=(array)
44 44 self.settings[:product_ids] = array
45 45 if self.settings[:product_ids]
... ...
app/models/profile.rb
... ... @@ -79,7 +79,7 @@ class Profile &lt; ActiveRecord::Base
79 79 all_roles(env_id).select{ |r| r.key.match(/^profile_/) unless r.key.blank? || !r.profile_id.nil?}
80 80 end
81 81 def self.all_roles(env_id)
82   - Role.all :conditions => { :environment_id => env_id }
  82 + Role.where(environment_id: env_id)
83 83 end
84 84 def self.method_missing(m, *args, &block)
85 85 role = find_role(m, args[0])
... ... @@ -117,20 +117,28 @@ class Profile &lt; ActiveRecord::Base
117 117  
118 118 include Noosfero::Plugin::HotSpot
119 119  
120   - 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 ] } }
  120 + scope :memberships_of, -> person {
  121 + select('DISTINCT profiles.*').
  122 + joins(:role_assignments).
  123 + where('role_assignments.accessor_type = ? AND role_assignments.accessor_id = ?', person.class.base_class.name, person.id)
  124 + }
121 125 #FIXME: these will work only if the subclass is already loaded
122   - scope :enterprises, lambda { {:conditions => (Enterprise.send(:subclasses).map(&:name) << 'Enterprise').map { |klass| "profiles.type = '#{klass}'"}.join(" OR ")} }
123   - scope :communities, lambda { {:conditions => (Community.send(:subclasses).map(&:name) << 'Community').map { |klass| "profiles.type = '#{klass}'"}.join(" OR ")} }
124   - scope :templates, lambda { |template_id = nil|
125   - conditions = {:conditions => {:is_template => true}}
126   - conditions[:conditions].merge!({:id => template_id}) unless template_id.nil?
127   - conditions
  126 + scope :enterprises, -> {
  127 + where((Enterprise.send(:subclasses).map(&:name) << 'Enterprise').map { |klass| "profiles.type = '#{klass}'"}.join(" OR "))
  128 + }
  129 + scope :communities, -> {
  130 + where((Community.send(:subclasses).map(&:name) << 'Community').map { |klass| "profiles.type = '#{klass}'"}.join(" OR "))
  131 + }
  132 + scope :templates, -> template_id = nil {
  133 + s = where is_template: true
  134 + s = s.where id: template_id if template_id
  135 + s
128 136 }
129 137  
130   - scope :with_templates, lambda { |templates|
131   - {:conditions => {:template_id => templates}}
  138 + scope :with_templates, -> templates {
  139 + where template_id: templates
132 140 }
133   - scope :no_templates, {:conditions => {:is_template => false}}
  141 + scope :no_templates, -> { where is_template: false }
134 142  
135 143 # Returns a scoped object to select profiles in a given location or in a radius
136 144 # distance from the given location center.
... ... @@ -195,8 +203,8 @@ class Profile &lt; ActiveRecord::Base
195 203 alias_method_chain :count, :distinct
196 204 end
197 205  
198   - def members_by_role(roles, with_entities = nil)
199   - Person.members_of(self, with_entities).by_role(roles, with_entities)
  206 + def members_by_role(roles)
  207 + Person.members_of(self).by_role(roles)
200 208 end
201 209  
202 210 acts_as_having_boxes
... ... @@ -207,10 +215,10 @@ class Profile &lt; ActiveRecord::Base
207 215 Profile.column_names.map{|n| [Profile.table_name, n].join('.')}.join(',')
208 216 end
209 217  
210   - scope :visible, :conditions => { :visible => true, :secret => false }
211   - scope :disabled, :conditions => { :visible => false }
212   - scope :public, :conditions => { :visible => true, :public_profile => true, :secret => false }
213   - scope :enabled, :conditions => { :enabled => true }
  218 + scope :visible, -> { where visible: true, secret: false }
  219 + scope :disabled, -> { where visible: false }
  220 + scope :is_public, -> { where visible: true, public_profile: true, secret: false }
  221 + scope :enabled, -> { where enabled: true }
214 222  
215 223 # Subclasses must override this method
216 224 scope :more_popular
... ... @@ -262,7 +270,7 @@ class Profile &lt; ActiveRecord::Base
262 270 validates_length_of :description, :maximum => 550, :allow_nil => true
263 271  
264 272 # Valid identifiers must match this format.
265   - IDENTIFIER_FORMAT = /^#{Noosfero.identifier_format}$/
  273 + IDENTIFIER_FORMAT = /\A#{Noosfero.identifier_format}\Z/
266 274  
267 275 # These names cannot be used as identifiers for Profiles
268 276 RESERVED_IDENTIFIERS = %w[
... ... @@ -314,7 +322,7 @@ class Profile &lt; ActiveRecord::Base
314 322 end
315 323 end
316 324  
317   - has_many :profile_categorizations, :conditions => [ 'categories_profiles.virtual = ?', false ]
  325 + has_many :profile_categorizations, -> { where 'categories_profiles.virtual = ?', false }
318 326 has_many :categories, :through => :profile_categorizations
319 327  
320 328 has_many :profile_categorizations_including_virtual, :class_name => 'ProfileCategorization'
... ... @@ -541,14 +549,13 @@ class Profile &lt; ActiveRecord::Base
541 549 self.articles.recent(limit, options, pagination)
542 550 end
543 551  
544   - def last_articles(limit = 10, options = {})
545   - options = { :limit => limit,
546   - :conditions => ["advertise = ? AND published = ? AND
547   - ((articles.type != ? and articles.type != ? and articles.type != ?) OR
548   - articles.type is NULL)",
549   - true, true, 'UploadedFile', 'RssFeed', 'Blog'],
550   - :order => 'articles.published_at desc, articles.id desc' }.merge(options)
551   - self.articles.find(:all, options)
  552 + def last_articles limit = 10
  553 + self.articles.limit(limit).where(
  554 + "advertise = ? AND published = ? AND
  555 + ((articles.type != ? and articles.type != ? and articles.type != ?) OR
  556 + articles.type is NULL)",
  557 + true, true, 'UploadedFile', 'RssFeed', 'Blog'
  558 + ).order('articles.published_at desc, articles.id desc')
552 559 end
553 560  
554 561 def to_liquid
... ... @@ -752,7 +759,7 @@ private :generate_url, :url_options
752 759 num = num + 1
753 760 new_name = original_article.name + ' ' + num.to_s
754 761 end
755   - original_article.update_attributes!(:name => new_name)
  762 + original_article.update!(:name => new_name)
756 763 end
757 764 article_copy = article.copy(:profile => self, :parent => parent, :advertise => false)
758 765 if article.profile.home_page == article
... ... @@ -942,11 +949,11 @@ private :generate_url, :url_options
942 949 self.forums.count.nonzero?
943 950 end
944 951  
945   - def admins(with_entities = nil)
  952 + def admins
946 953 return [] if environment.blank?
947 954 admin_role = Profile::Roles.admin(environment.id)
948 955 return [] if admin_role.blank?
949   - self.members_by_role(admin_role, with_entities)
  956 + self.members_by_role(admin_role)
950 957 end
951 958  
952 959 def enable_contact?
... ...
app/models/profile_activity.rb
... ... @@ -25,8 +25,8 @@ class ProfileActivity &lt; ActiveRecord::Base
25 25 protected
26 26  
27 27 def copy_timestamps
28   - self.created_at = self.activity.created_at
29   - self.updated_at = self.activity.updated_at
  28 + self.created_at = self.activity.created_at if self.activity.created_at
  29 + self.updated_at = self.activity.updated_at if self.activity.updated_at
30 30 end
31 31  
32 32 end
... ...
app/models/profile_categorization.rb
1 1 class ProfileCategorization < ActiveRecord::Base
2   - set_table_name :categories_profiles
  2 + self.table_name = :categories_profiles
3 3 belongs_to :profile
4 4 belongs_to :category
5 5  
... ... @@ -13,7 +13,7 @@ class ProfileCategorization &lt; ActiveRecord::Base
13 13 end
14 14  
15 15 def self.remove_region(profile)
16   - region = profile.categories.find(:first, :conditions => { :type => [Region, State, City].map(&:name) })
  16 + region = profile.categories.where(type: [Region, State, City].map(&:name)).first
17 17 if region
18 18 ids = region.hierarchy.map(&:id)
19 19 self.delete_all(:profile_id => profile.id, :category_id => ids)
... ...
app/models/profile_list_block.rb
... ... @@ -16,7 +16,7 @@ class ProfileListBlock &lt; Block
16 16  
17 17 def profile_list
18 18 result = nil
19   - public_profiles = profiles.public.includes([:image,:domains,:preferred_domain,:environment])
  19 + public_profiles = profiles.is_public.includes([:image,:domains,:preferred_domain,:environment])
20 20 if !prioritize_profiles_with_image
21 21 result = public_profiles.all(:limit => get_limit, :order => 'profiles.updated_at DESC').sort_by{ rand }
22 22 elsif profiles.visible.with_image.count >= get_limit
... ... @@ -28,7 +28,7 @@ result = public_profiles.all(:limit =&gt; get_limit, :order =&gt; &#39;profiles.updated_at
28 28 end
29 29  
30 30 def profile_count
31   - profiles.public.length
  31 + profiles.is_public.length
32 32 end
33 33  
34 34 # the title of the block. Probably will be overriden in subclasses.
... ...
app/models/profile_suggestion.rb
... ... @@ -26,9 +26,9 @@ class ProfileSuggestion &lt; ActiveRecord::Base
26 26 end
27 27  
28 28 validates_uniqueness_of :suggestion_id, :scope => [ :person_id ]
29   - scope :of_person, :conditions => { :suggestion_type => 'Person' }
30   - scope :of_community, :conditions => { :suggestion_type => 'Community' }
31   - scope :enabled, :conditions => { :enabled => true }
  29 + scope :of_person, -> { where suggestion_type: 'Person' }
  30 + scope :of_community, -> { where suggestion_type: 'Community' }
  31 + scope :enabled, -> { where enabled: true }
32 32  
33 33 # {:category_type => ['category-icon', 'category-label']}
34 34 CATEGORIES = {
... ... @@ -55,13 +55,13 @@ class ProfileSuggestion &lt; ActiveRecord::Base
55 55 :threshold => 2, :weight => 1, :connection => 'Profile'
56 56 },
57 57 :people_with_common_tags => {
58   - :threshold => 2, :weight => 1, :connection => 'ActsAsTaggableOn::Tag'
  58 + :threshold => 2, :weight => 1, :connection => 'Tag'
59 59 },
60 60 :communities_with_common_friends => {
61 61 :threshold => 2, :weight => 1, :connection => 'Profile'
62 62 },
63 63 :communities_with_common_tags => {
64   - :threshold => 2, :weight => 1, :connection => 'ActsAsTaggableOn::Tag'
  64 + :threshold => 2, :weight => 1, :connection => 'Tag'
65 65 }
66 66 }
67 67  
... ... @@ -127,17 +127,15 @@ class ProfileSuggestion &lt; ActiveRecord::Base
127 127 rescue NoMethodError
128 128 next
129 129 end
130   - connections = suggested_profile.send("#{rule}_connections")
131   - if connections.present?
132   - connections = connections[1..-2].split(',')
133   - else
134   - connections = []
135   - end
136   - suggestion.send("#{rule}=", value)
  130 +
  131 + connections = suggested_profile.send("#{rule}_connections") || []
  132 + connections = connections[1..-2] if connections.present?
137 133 connections.each do |connection_id|
138 134 next if SuggestionConnection.where(:suggestion_id => suggestion.id, :connection_id => connection_id, :connection_type => options[:connection]).present?
139   - SuggestionConnection.create!(:suggestion => suggestion, :connection_id => connection_id, :connection_type => options[:connection])
  135 + SuggestionConnection.create!(:suggestion => suggestion, :connection_id => connection_id, :connection_type => options[:connection])
140 136 end
  137 +
  138 + suggestion.send("#{rule}=", value)
141 139 suggestion.score += value * options[:weight]
142 140 end
143 141 suggestion.save!
... ...
app/models/reported_image.rb
... ... @@ -5,6 +5,7 @@ class ReportedImage &lt; ActiveRecord::Base
5 5  
6 6 has_attachment :content_type => :image,
7 7 :storage => :file_system,
8   - :max_size => 5.megabytes
  8 + :max_size => 5.megabytes,
  9 + processor: 'Rmagick'
9 10  
10 11 end
... ...
app/models/rss_feed.rb
... ... @@ -14,7 +14,7 @@ class RssFeed &lt; Article
14 14  
15 15 # store setting in body
16 16 serialize :body, Hash
17   -
  17 +
18 18 def body
19 19 self[:body] ||= {}
20 20 end
... ... @@ -40,7 +40,7 @@ class RssFeed &lt; Article
40 40  
41 41 # FIXME this should be validates_numericality_of, but Rails 2.0.2 does not
42 42 # support validates_numericality_of with virtual attributes
43   - validates_format_of :limit, :with => /^\d+$/, :if => :limit
  43 + validates_format_of :limit, :with => /\d+/, :if => :limit
44 44  
45 45 # determinates what to include in the feed. Possible values are +:all+
46 46 # (include everything from the profile) and :parent_and_children (include
... ... @@ -69,7 +69,7 @@ class RssFeed &lt; Article
69 69 def fetch_articles
70 70 if parent && parent.has_posts?
71 71 language = self.language.blank? ? {} : { :language => self.language }
72   - return parent.posts.find(:all, :conditions => { :published => true }.merge(language), :limit => self.limit, :order => 'id desc')
  72 + return parent.posts.where({published: true}.merge language).limit(self.limit).order('id desc')
73 73 end
74 74  
75 75 articles =
... ... @@ -89,6 +89,14 @@ class RssFeed &lt; Article
89 89 )
90 90 end
91 91  
  92 + def published?
  93 + if self.parent
  94 + self.parent.published?
  95 + else
  96 + self.published
  97 + end
  98 + end
  99 +
92 100 def self.short_description
93 101 _('RSS Feed')
94 102 end
... ...
app/models/scrap.rb
... ... @@ -18,9 +18,9 @@ class Scrap &lt; ActiveRecord::Base
18 18 after_create :create_activity
19 19 after_update :update_activity
20 20  
21   - scope :all_scraps, lambda {|profile| {:conditions => ["receiver_id = ? OR sender_id = ?", profile, profile], :limit => 30}}
  21 + scope :all_scraps, -> profile { limit(30).where("receiver_id = ? OR sender_id = ?", profile, profile) }
22 22  
23   - scope :not_replies, :conditions => {:scrap_id => nil}
  23 + scope :not_replies, -> { where scrap_id: nil }
24 24  
25 25 track_actions :leave_scrap, :after_create, :keep_params => ['sender.name', 'content', 'receiver.name', 'receiver.url'], :if => Proc.new{|s| s.sender != s.receiver && s.sender != s.top_root.receiver}, :custom_target => :action_tracker_target, :custom_user => :sender
26 26  
... ...
app/models/search_term_occurrence.rb
1 1 class SearchTermOccurrence < ActiveRecord::Base
  2 +
2 3 belongs_to :search_term
3 4 validates_presence_of :search_term
4 5 attr_accessible :search_term, :created_at, :total, :indexed
5 6  
6 7 EXPIRATION_TIME = 1.year
7 8  
8   - scope :valid, :conditions => ["search_term_occurrences.created_at > ?", DateTime.now - EXPIRATION_TIME]
  9 + scope :valid, -> { where "search_term_occurrences.created_at > ?", DateTime.now - EXPIRATION_TIME }
  10 +
9 11 end
... ...
app/models/slideshow_block.rb
... ... @@ -13,7 +13,7 @@ class SlideshowBlock &lt; Block
13 13 end
14 14  
15 15 def gallery
16   - gallery_id ? Gallery.find(:first, :conditions => { :id => gallery_id }) : nil
  16 + if gallery_id then Gallery.where(id: gallery_id).first else nil end
17 17 end
18 18  
19 19 def public_filename_for(image)
... ...
app/models/suggestion_connection.rb
1 1 class SuggestionConnection < ActiveRecord::Base
2   - attr_accessible :suggestion, :connection_type, :connection_id
  2 + attr_accessible :suggestion, :suggestion_id, :connection_type, :connection_id
3 3  
4 4 belongs_to :suggestion, :class_name => 'ProfileSuggestion', :foreign_key => 'suggestion_id'
5 5 belongs_to :connection, :polymorphic => true
... ...
app/models/tag.rb 0 → 100644
... ... @@ -0,0 +1,34 @@
  1 +Tag = ActsAsTaggableOn::Tag
  2 +class Tag
  3 +
  4 + attr_accessible :name, :parent_id, :pending
  5 +
  6 + has_many :children, class_name: 'Tag', foreign_key: 'parent_id', dependent: :destroy
  7 +
  8 + @@original_find = self.method(:find)
  9 + # Rename the find method to find_with_pendings that includes all tags in the search regardless if its pending or not
  10 + def self.find_with_pendings(*args)
  11 + @@original_find.call(*args)
  12 + end
  13 +
  14 + # Redefine the find method to exclude the pending tags from the search not allowing to tag something with an unapproved tag
  15 + def self.find(*args)
  16 + self.where(pending: false).find_with_pendings(*args)
  17 + end
  18 +
  19 + # Return all the tags that were suggested but not yet approved
  20 + def self.find_pendings
  21 + self.where(pending: true)
  22 + end
  23 +
  24 + # All the tags that can be a new parent for this tag, that is all but itself and its descendents to avoid loops
  25 + def parent_candidates
  26 + ActsAsTaggableOn::Tag.all - descendents - [self]
  27 + end
  28 +
  29 + # All tags that have this tag as its one of its ancestors
  30 + def descendents
  31 + children.to_a.sum([], &:descendents) + children
  32 + end
  33 +
  34 +end
... ...
app/models/task.rb
... ... @@ -53,7 +53,7 @@ class Task &lt; ActiveRecord::Base
53 53 before_validation(:on => :create) do |task|
54 54 if task.code.nil?
55 55 task.code = Task.generate_code(task.code_length)
56   - while (Task.find_by_code(task.code))
  56 + while Task.from_code(task.code).first
57 57 task.code = Task.generate_code(task.code_length)
58 58 end
59 59 end
... ... @@ -74,7 +74,7 @@ class Task &lt; ActiveRecord::Base
74 74 TaskMailer.target_notification(task, target_msg).deliver
75 75 end
76 76 end
77   - rescue Exception => ex
  77 + rescue NotImplementedError => ex
78 78 Rails.logger.info ex.to_s
79 79 end
80 80 end
... ... @@ -310,58 +310,29 @@ class Task &lt; ActiveRecord::Base
310 310 })
311 311 end
312 312  
313   - scope :pending, :conditions => { :status => Task::Status::ACTIVE }
314   - scope :hidden, :conditions => { :status => Task::Status::HIDDEN }
315   - scope :finished, :conditions => { :status => Task::Status::FINISHED }
316   - scope :canceled, :conditions => { :status => Task::Status::CANCELLED }
317   - scope :closed, :conditions => { :status => [Task::Status::CANCELLED, Task::Status::FINISHED] }
318   - scope :opened, :conditions => { :status => [Task::Status::ACTIVE, Task::Status::HIDDEN] }
319   -
320   - # # updated scope method to avoid sql injection vunerabillity (http://brakemanscanner.org/docs/warning_types/sql_injection/)
321   - # def self.of type
322   - # if type
323   - # where "type LIKE ?", type
324   - # else
325   - # all
326   - # end
327   - # end
328   - #
329   - # # updated scope method to avoid sql injection vunerabillity (http://brakemanscanner.org/docs/warning_types/sql_injection/)
330   - # def self.order_by attribute_name, sort_order
331   - # if Task.column_names.include? attribute_name
332   - # # TODO future versions of rails accepts a hash as param to order method
333   - # # which helps to prevent sql injection in an shorter way
334   - # sort_order_filtered = ("ASC".eql? "#{sort_order}".upcase) ? 'asc' : 'desc'
335   - # sort_expression = Task.column_names.collect {|column_name| "#{column_name} #{sort_order_filtered}" if column_name.eql? attribute_name}
336   - # order(sort_expression.join) unless sort_expression.join.empty?
337   - # end
338   - # end
339   - #
340   - # # updated scope method to avoid sql injection vunerabillity (http://brakemanscanner.org/docs/warning_types/sql_injection/)
341   - # def self.like field, value
342   - # if value and Tasks.column_names.include? field
343   - # where("LOWER(?) LIKE ?", "#{field}", "%#{value.downcase}%")
344   - # end
345   - # end
346   -
347   - scope :of, lambda { |type| conditions = type ? "tasks.type LIKE '#{type}'" : "1=1"; {:conditions => [conditions]} }
348   - scope :order_by, lambda { |attribute, ord| {:order => "#{attribute} #{ord}"} }
349   - scope :like, lambda { |field, value| where("LOWER(#{field}) LIKE ?", "%#{value.downcase}%") if value}
350   -
351   - scope :pending_all, lambda { |profile, filter_type, filter_text|
  313 + scope :pending, -> { where status: Task::Status::ACTIVE }
  314 + scope :hidden, -> { where status: Task::Status::HIDDEN }
  315 + scope :finished, -> { where status: Task::Status::FINISHED }
  316 + scope :canceled, -> { where status: Task::Status::CANCELLED }
  317 + scope :closed, -> { where status: [Task::Status::CANCELLED, Task::Status::FINISHED] }
  318 + scope :opened, -> { where status: [Task::Status::ACTIVE, Task::Status::HIDDEN] }
  319 + scope :of, -> type { where "type LIKE ?", type if type }
  320 + scope :order_by, -> attribute, ord { order "#{attribute} #{ord}" }
  321 + scope :like, -> field, value { where "LOWER(#{field}) LIKE ?", "%#{value.downcase}%" if value }
  322 + scope :pending_all, -> profile, filter_type, filter_text {
352 323 self.to(profile).without_spam.pending.of(filter_type).like('data', filter_text)
353 324 }
354 325  
355 326 scope :to, lambda { |profile|
356 327 environment_condition = nil
357 328 if profile.person?
358   - envs_ids = Environment.find(:all).select{ |env| profile.is_admin?(env) }.map { |env| "target_id = #{env.id}"}.join(' OR ')
  329 + envs_ids = Environment.all.select{ |env| profile.is_admin?(env) }.map{ |env| "target_id = #{env.id}"}.join(' OR ')
359 330 environment_condition = envs_ids.blank? ? nil : "(target_type = 'Environment' AND (#{envs_ids}))"
360 331 end
361 332 profile_condition = "(target_type = 'Profile' AND target_id = #{profile.id})"
362   - { :conditions => [environment_condition, profile_condition].compact.join(' OR ') }
363   - }
364 333  
  334 + where [environment_condition, profile_condition].compact.join(' OR ')
  335 + }
365 336  
366 337 def self.pending_types_for(profile)
367 338 Task.to(profile).pending.select('distinct type').map { |t| [t.class.name, t.title] }
... ... @@ -422,6 +393,12 @@ class Task &lt; ActiveRecord::Base
422 393 end
423 394 end
424 395  
  396 + # finds a task by its (generated) code. Only returns a task with the
  397 + # specified code AND with status = Task::Status::ACTIVE.
  398 + #
  399 + # Can be used in subclasses to find only their instances.
  400 + scope :from_code, -> code { where code: code, status: Task::Status::ACTIVE }
  401 +
425 402 class << self
426 403  
427 404 # generates a random code string consisting of length characters (or 36 by
... ...
app/models/thumbnail.rb
1 1 class Thumbnail < ActiveRecord::Base
  2 +
  3 + attr_accessible :uploaded_data
  4 + # mass assigned by attachment_fu
  5 + attr_accessible :content_type, :filename, :thumbnail_resize_options, :thumbnail, :parent_id
  6 +
2 7 has_attachment :storage => :file_system,
3   - :content_type => :image, :max_size => 5.megabytes
  8 + :content_type => :image, :max_size => 5.megabytes, processor: 'Rmagick'
4 9 validates_as_attachment
5 10  
6 11 sanitize_filename
7 12  
8 13 postgresql_attachment_fu
9 14  
10   - attr_accessible :uploaded_data
11 15 end
... ...
app/models/tiny_mce_article.rb
... ... @@ -9,7 +9,7 @@ class TinyMceArticle &lt; TextArticle
9 9 def self.description
10 10 _('Not accessible for visually impaired users.')
11 11 end
12   -
  12 +
13 13 xss_terminate :only => [ ]
14 14  
15 15 xss_terminate :only => [ :name, :abstract, :body ], :with => 'white_list', :on => 'validation'
... ...
app/models/uploaded_file.rb
... ... @@ -63,7 +63,8 @@ class UploadedFile &lt; Article
63 63 has_attachment :storage => :file_system,
64 64 :thumbnails => { :icon => [24,24], :bigicon => [50,50], :thumb => '130x130>', :slideshow => '320x240>', :display => '640X480>' },
65 65 :thumbnail_class => Thumbnail,
66   - :max_size => self.max_size
  66 + :max_size => self.max_size,
  67 + processor: 'Rmagick'
67 68  
68 69 validates_attachment :size => N_("{fn} of uploaded file was larger than the maximum size of %{size}").sub('%{size}', self.max_size.to_humanreadable).fix_i18n
69 70  
... ...
app/models/user.rb
... ... @@ -102,7 +102,8 @@ class User &lt; ActiveRecord::Base
102 102 end
103 103 end
104 104  
105   - has_one :person, :dependent => :destroy
  105 + # set autosave to false as we do manually when needed and Person syncs with us
  106 + has_one :person, dependent: :destroy, autosave: false
106 107 belongs_to :environment
107 108  
108 109 has_many :sessions, dependent: :destroy
... ... @@ -358,12 +359,12 @@ class User &lt; ActiveRecord::Base
358 359 end
359 360  
360 361 def name
361   - name = (self[:name] || login)
  362 + name = (@name || login)
362 363 person.nil? ? name : (person.name || name)
363 364 end
364 365  
365 366 def name= name
366   - self[:name] = name
  367 + @name = name
367 368 end
368 369  
369 370 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 %>
... ...