Commit 553a5c2f5513bcfc1f1fe366c47e5219af21d7bf

Authored by Victor Costa
2 parents 2ba09a89 eaa94bb4

Merge branch 'staging' into login-captcha

Showing 1497 changed files with 19942 additions and 65211 deletions   Show diff stats

Too many changes.

To preserve performance only 100 of 1497 files displayed.

.gitlab-ci.yml
  1 +image: noosfero/ci
  2 +
1 3 before_script:
2   - - mkdir -p tmp/{pids,cache} log
3   - - bundle check || bundle install
4   -# workaround for plugins with Gemfile
5   - - perl -pi -e 's/--local //' script/noosfero-plugins
6   - - script/noosfero-plugins disableall
7   - - bundle exec rake makemo &>/dev/null
8   -# database
9   - - cp config/database.yml.gitlab-ci config/database.yml
10   - - createdb gitlab_ci_test || true
11   - - bundle exec rake db:schema:load &>/dev/null
12   - - bundle exec rake db:migrate &>/dev/null
  4 + - mkdir -p locale # makes quick-start skip compiling translations
  5 + - ./script/silent-quick-start
13 6  
14 7 units:
15 8 script: bundle exec rake test:units
... ...
.gitmodules
... ... @@ -34,3 +34,6 @@
34 34 [submodule "plugins/serpro_captcha"]
35 35 path = plugins/serpro_captcha
36 36 url = https://softwarepublico.gov.br/gitlab/noosfero-plugins/serpro_captcha.git
  37 +[submodule "plugins/insight"]
  38 + path = plugins/insight
  39 + url = https://softwarepublico.gov.br/gitlab/noosfero-plugins/insight.git
... ...
.ruby-version 0 → 100644
... ... @@ -0,0 +1 @@
  1 +ruby-2.2.1@noosfero
... ...
.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'
  33 +gem 'slim'
24 34  
25 35 # API dependencies
26 36 gem 'grape', '~> 0.12'
27 37 gem 'grape-entity'
  38 +gem 'grape_logging'
28 39 gem 'grape-swagger'
29 40 gem 'swagger-ui_rails'
30 41 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 42 gem 'rack-cors'
37 43 gem 'rack-contrib'
38 44 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 45  
48 46 gem 'api-pagination', '~> 4.1.1'
49 47  
50 48 # asset pipeline
51 49 gem 'uglifier', '>= 1.0.3'
52 50 gem 'sass-rails'
53   -gem 'sass', '~> 3.1.19'
  51 +
  52 +# gems to enable rails3 behaviour
  53 +gem 'protected_attributes'
  54 +gem 'rails-observers'
  55 +gem 'actionpack-page_caching'
  56 +gem 'actionpack-action_caching'
  57 +gem 'activerecord-session_store'
  58 +gem 'activerecord-deprecated_finders', require: 'active_record/deprecated_finders'
54 59  
55 60 group :production do
56 61 gem 'dalli', '~> 2.7.0'
57 62 end
58 63  
  64 +group :development, :test do
  65 + gem 'spring'
  66 +end
  67 +
59 68 group :test do
60   - gem 'rspec', '~> 2.14.0'
61   - gem 'rspec-rails', '~> 2.14.1'
  69 + gem 'rspec', '~> 3.3', require: false
  70 + gem 'rspec-rails', '~> 3.2', require: false
62 71 gem 'mocha', '~> 1.1.0', :require => false
  72 + gem 'test-unit' if RUBY_VERSION >= '2.2.0'
  73 + gem 'minitest'
  74 + gem 'minitest-reporters'
63 75 end
64 76  
65 77 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'
  78 + gem 'capybara', '~> 2.2'
  79 + gem 'launchy'
  80 + gem 'cucumber'
  81 + gem 'cucumber-rails', '~> 1.4.2', :require => false
  82 + gem 'database_cleaner', '~> 1.3'
  83 + gem 'selenium-webdriver'
71 84 end
72 85  
73 86 # Requires custom dependencies
74 87 eval(File.read('config/Gemfile'), binding) rescue nil
75 88  
  89 +vendor = Dir.glob('vendor/{,plugins/}*') - ['vendor/plugins']
  90 +vendor.each do |dir|
  91 + plugin = File.basename dir
  92 + version = if Dir.glob("#{dir}/*.gemspec").length > 0 then '> 0.0.0' else '0.0.0' end
  93 +
  94 + gem plugin, version, path: dir
  95 +end
  96 +
76 97 # include gemfiles from enabled plugins
77 98 # plugins in baseplugins/ are not included on purpose. They should not have any
78 99 # 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,157 @@ 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 + slim (3.0.6)
  364 + temple (~> 0.7.3)
  365 + tilt (>= 1.3.3, < 2.1)
  366 + spring (1.4.1)
  367 + sprockets (3.4.0)
  368 + rack (> 1, < 3)
  369 + sprockets-rails (2.3.3)
  370 + actionpack (>= 3.0)
  371 + activesupport (>= 3.0)
  372 + sprockets (>= 2.8, < 4.0)
210 373 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
  374 + temple (0.7.6)
  375 + test-unit (3.1.5)
  376 + power_assert
  377 + text (1.3.1)
216 378 thor (0.19.1)
217 379 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)
  380 + tilt (2.0.1)
  381 + tzinfo (1.2.2)
  382 + thread_safe (~> 0.1)
224 383 uglifier (2.7.2)
225 384 execjs (>= 0.3.0)
226 385 json (>= 1.8.0)
  386 + unf (0.1.4)
  387 + unf_ext
  388 + unf_ext (0.0.7.1)
227 389 unicorn (4.9.0)
228 390 kgio (~> 2.6)
229 391 rack
... ... @@ -244,48 +406,81 @@ PLATFORMS
244 406 ruby
245 407  
246 408 DEPENDENCIES
247   - RedCloth (~> 4.2.9)
248   - acts-as-taggable-on (~> 3.4.2)
  409 + RedCloth (~> 4.2)
  410 + access_control (= 0.0.0)!
  411 + action_tracker (> 0.0.0)!
  412 + action_tracker_has_comments (= 0.0.0)!
  413 + actionpack-action_caching
  414 + actionpack-page_caching
  415 + activerecord-deprecated_finders
  416 + activerecord-jdbcpostgresql-adapter
  417 + activerecord-session_store
  418 + acts-as-taggable-on (~> 3.5)
  419 + acts_as_list (= 0.0.0)!
  420 + acts_as_tree (= 0.0.0)!
  421 + acts_as_versioned (> 0.0.0)!
249 422 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)
  423 + capybara (~> 2.2)
  424 + contacts (> 0.0.0)!
  425 + cucumber
  426 + cucumber-rails (~> 1.4.2)
  427 + daemons (~> 1.1)
254 428 dalli (~> 2.7.0)
255   - database_cleaner (~> 1.2.0)
256   - eita-jrails (~> 0.9.5)
  429 + database_cleaner (~> 1.3)
  430 + delayed_job
  431 + delayed_job_active_record
  432 + diffy (~> 3.0)
  433 + eita-jrails (~> 0.10.0)
257 434 exception_notification (~> 4.0.1)
258   - execjs
259   - fast_gettext (~> 0.6.8)
260   - gettext (~> 2.2.1)
  435 + ezcrypto (= 0.0.0)!
  436 + fast_gettext (~> 0.9)
  437 + gdata (> 0.0.0)!
  438 + gettext (~> 3.1)
261 439 grape (~> 0.12)
262 440 grape-entity
263 441 grape-swagger
264   - grape_logging!
  442 + grape_logging
  443 + honeypot (= 0.0.0)!
  444 + i18n_deprecation (= 0.0.0)!
  445 + kandadaboggu-vote_fu (> 0.0.0)!
265 446 kramdown
  447 + launchy
266 448 liquid (~> 3.0.3)
267   - locale (~> 2.0.5)
268   - minitest (~> 3.2.0)
  449 + locale (~> 2.1)
  450 + minitest
  451 + minitest-reporters
269 452 mocha (~> 1.1.0)
  453 + monkey_patches (= 0.0.0)!
270 454 nokogiri (~> 1.6.0)
271   - pg (~> 0.13.2)
  455 + noosfero_caching (= 0.0.0)!
  456 + pg (~> 0.17)
  457 + pothoven-attachment_fu (~> 3.2.16)
  458 + protected_attributes
272 459 rack-contrib
273 460 rack-cors
274   - rails (~> 3.2.22)
  461 + rails (~> 4.2.4)
  462 + rails-observers
275 463 rails_autolink (~> 1.1.5)
  464 + rails_rcov (= 0.0.0)!
276 465 rake
277   - rest-client (~> 1.6.7)
278   - rmagick (~> 2.13.1)
279   - rspec (~> 2.14.0)
280   - rspec-rails (~> 2.14.1)
  466 + recaptcha (> 0.0.0)!
  467 + rest-client (~> 1.6)
  468 + rmagick (~> 2.13)
  469 + rmagick4j
  470 + rspec (~> 3.3)
  471 + rspec-rails (~> 3.2)
281 472 ruby-feedparser (~> 0.7)
282   - rubyzip
283   - sass (~> 3.1.19)
  473 + ruby_bosh (> 0.0.0)!
284 474 sass-rails
285   - selenium-webdriver (~> 2.47.0)
  475 + selenium-webdriver
  476 + slim
  477 + spring
286 478 swagger-ui_rails
287   - therubyracer
  479 + test-unit
288 480 uglifier (>= 1.0.3)
289 481 unicorn (~> 4.8)
  482 + validates_as_cnpj (= 0.0.0)!
  483 + validates_multiparameter_assignments (= 0.0.0)!
290 484 whenever
291   - will_paginate (~> 3.0.3)
  485 + will_paginate
  486 + 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
1 1 class FeaturesController < AdminController
2 2  
3 3 protect 'edit_environment_features', :environment
  4 + helper CustomFieldsHelper
4 5  
5 6 def index
6 7 @features = Environment.available_features.sort_by{|k,v|v}
... ... @@ -36,7 +37,7 @@ class FeaturesController &lt; AdminController
36 37  
37 38 post_only :update
38 39 def update
39   - if @environment.update_attributes(params[:environment])
  40 + if @environment.update(params[:environment])
40 41 session[:notice] = _('Features updated successfully.')
41 42 redirect_to :action => 'index'
42 43 else
... ... @@ -91,9 +92,37 @@ class FeaturesController &lt; AdminController
91 92 redirect_to :action => 'manage_fields'
92 93 end
93 94  
  95 + def manage_custom_fields
  96 + custom_field_list = params[:custom_fields] || {}
  97 +
  98 + custom_fields_to_destroy =
  99 + params[:customized_type].constantize.custom_fields(environment).map(&:id) - custom_field_list.keys.map(&:to_i)
  100 + CustomField.destroy(custom_fields_to_destroy)
  101 +
  102 + custom_field_list.each_pair do |id, custom_field|
  103 + field = CustomField.find_by_id(id)
  104 + if not field.blank?
  105 + params_to_update = custom_field.except(:format, :extras, :customized_type,:environment)
  106 + field.update_attributes(params_to_update)
  107 + else
  108 + if !custom_field[:extras].nil?
  109 + tmp = []
  110 + custom_field[:extras].each_pair do |k, v|
  111 + tmp << v
  112 + end
  113 + custom_field[:extras] = tmp
  114 + end
  115 + field = CustomField.new custom_field.except(:environment)
  116 + field.environment=environment
  117 + field.save if field.valid?
  118 + end
  119 + end
  120 + redirect_to :action => 'manage_fields'
  121 + end
  122 +
94 123 def search_members
95 124 arg = params[:q].downcase
96   - result = environment.people.find(:all, :conditions => ['LOWER(name) LIKE ? OR identifier LIKE ?', "%#{arg}%", "%#{arg}%"])
  125 + result = environment.people.where('LOWER(name) LIKE ? OR identifier LIKE ?', "%#{arg}%", "%#{arg}%")
97 126 render :text => prepare_to_token_input(result).to_json
98 127 end
99 128  
... ...
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/memberships_controller.rb
1 1 class MembershipsController < MyProfileController
2 2  
3 3 protect 'manage_memberships', :profile
  4 + helper CustomFieldsHelper
4 5  
5 6 def index
6 7 @roles = environment.roles.select do |role|
... ...
app/controllers/my_profile/profile_editor_controller.rb
... ... @@ -8,6 +8,7 @@ class ProfileEditorController &lt; MyProfileController
8 8 before_filter :forbid_destroy_profile, :only => [:destroy_profile]
9 9 before_filter :check_user_can_edit_header_footer, :only => [:header_footer]
10 10 helper_method :has_welcome_page
  11 + helper CustomFieldsHelper
11 12  
12 13 def index
13 14 @pending_tasks = Task.to(profile).pending.without_spam.select{|i| user.has_permission?(i.permission, profile)}
... ... @@ -30,7 +31,7 @@ class ProfileEditorController &lt; MyProfileController
30 31 Image.transaction do
31 32 begin
32 33 @plugins.dispatch(:profile_editor_transaction_extras)
33   - @profile_data.update_attributes!(params[:profile_data])
  34 + @profile_data.update!(params[:profile_data])
34 35 redirect_to :action => 'index', :profile => profile.identifier
35 36 rescue Exception => ex
36 37 profile.identifier = params[:profile] if profile.identifier.blank?
... ... @@ -86,7 +87,7 @@ class ProfileEditorController &lt; MyProfileController
86 87 if @profile.destroy
87 88 session[:notice] = _('The profile was deleted.')
88 89 if(params[:return_to])
89   - redirect_to params[:return_to]
  90 + redirect_to url_for(params[:return_to])
90 91 else
91 92 redirect_to :controller => 'home'
92 93 end
... ... @@ -100,7 +101,7 @@ class ProfileEditorController &lt; MyProfileController
100 101 @welcome_page = profile.welcome_page || TinyMceArticle.new(:name => 'Welcome Page', :profile => profile, :published => false)
101 102 if request.post?
102 103 begin
103   - @welcome_page.update_attributes!(params[:welcome_page])
  104 + @welcome_page.update!(params[:welcome_page])
104 105 profile.welcome_page = @welcome_page
105 106 profile.save!
106 107 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
... ... @@ -179,7 +178,7 @@ class TasksController &lt; MyProfileController
179 178 end
180 179  
181 180 def filter_tasks(filter, tasks)
182   - tasks = tasks.includes(:requestor, :closed_by)
  181 + tasks = tasks.eager_load(:requestor, :closed_by)
183 182 tasks = tasks.of(filter[:type].presence)
184 183 tasks = tasks.where(:status => filter[:status]) unless filter[:status].blank?
185 184 tasks = filter_by_creation_date(filter, tasks)
... ...
app/controllers/public/account_controller.rb
... ... @@ -6,6 +6,9 @@ class AccountController &lt; ApplicationController
6 6 before_filter :redirect_if_logged_in, :only => [:login, :signup]
7 7 before_filter :protect_from_bots, :only => :signup
8 8  
  9 + protect_from_forgery except: [:login]
  10 +
  11 + helper CustomFieldsHelper
9 12 # say something nice, you goof! something sweet.
10 13 def index
11 14 unless logged_in?
... ... @@ -125,9 +128,9 @@ class AccountController &lt; ApplicationController
125 128 @user.signup!
126 129 owner_role = Role.find_by_name('owner')
127 130 @user.person.affiliate(@user.person, [owner_role]) if owner_role
128   - invitation = Task.find_by_code(@invitation_code)
  131 + invitation = Task.from_code(@invitation_code).first
129 132 if invitation
130   - invitation.update_attributes!({:friend => @user.person})
  133 + invitation.update! friend: @user.person
131 134 invitation.finish
132 135 end
133 136  
... ... @@ -222,7 +225,7 @@ class AccountController &lt; ApplicationController
222 225 #
223 226 # Posts back.
224 227 def new_password
225   - @change_password = ChangePassword.find_by_code(params[:code])
  228 + @change_password = ChangePassword.from_code(params[:code]).first
226 229  
227 230 unless @change_password
228 231 render :action => 'invalid_change_password_code', :status => 403
... ... @@ -231,7 +234,7 @@ class AccountController &lt; ApplicationController
231 234  
232 235 if request.post?
233 236 begin
234   - @change_password.update_attributes!(params[:change_password])
  237 + @change_password.update!(params[:change_password])
235 238 @change_password.finish
236 239 render :action => 'new_password_ok'
237 240 rescue ActiveRecord::RecordInvalid => e
... ... @@ -415,7 +418,7 @@ class AccountController &lt; ApplicationController
415 418 end
416 419  
417 420 def load_enterprise_activation
418   - @enterprise_activation ||= EnterpriseActivation.find_by_code(params[:enterprise_code])
  421 + @enterprise_activation ||= EnterpriseActivation.from_code(params[:enterprise_code]).first
419 422 end
420 423  
421 424 def load_enterprise
... ... @@ -439,7 +442,7 @@ class AccountController &lt; ApplicationController
439 442  
440 443 def go_to_initial_page
441 444 if params[:return_to]
442   - redirect_to params[:return_to]
  445 + redirect_to url_for(params[:return_to])
443 446 elsif environment.enabled?('allow_change_of_redirection_after_login')
444 447 check_redirection_options(user, user.preferred_login_redirection, user.admin_url)
445 448 else
... ... @@ -500,7 +503,7 @@ class AccountController &lt; ApplicationController
500 503 def check_redirection
501 504 unless params[:redirection].blank?
502 505 session[:return_to] = @user.return_to
503   - @user.update_attributes(:return_to => nil)
  506 + @user.update(:return_to => nil)
504 507 end
505 508 end
506 509  
... ...
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
... ... @@ -7,6 +7,7 @@ class ProfileController &lt; PublicController
7 7  
8 8 helper TagsHelper
9 9 helper ActionTrackerHelper
  10 + helper CustomFieldsHelper
10 11  
11 12 protect 'send_mail_to_members', :profile, :only => [:send_mail]
12 13  
... ... @@ -37,7 +38,7 @@ class ProfileController &lt; PublicController
37 38  
38 39 def tag_feed
39 40 @tag = params[:id]
40   - tagged = profile.articles.paginate(:per_page => 20, :page => 1, :order => 'published_at DESC', :include => :tags, :conditions => ['tags.name LIKE ?', @tag])
  41 + tagged = profile.articles.paginate(:per_page => 20, :page => 1).order('published_at DESC').joins(:tags).where('tags.name LIKE ?', @tag)
41 42 feed_writer = FeedWriter.new
42 43 data = feed_writer.write(
43 44 tagged,
... ... @@ -228,7 +229,7 @@ class ProfileController &lt; PublicController
228 229 end
229 230  
230 231 def more_replies
231   - activity = Scrap.find(:first, :conditions => {:id => params[:activity], :receiver_id => @profile, :scrap_id => nil})
  232 + activity = Scrap.where(:id => params[:activity], :receiver_id => @profile, :scrap_id => nil).first
232 233 comments_count = activity.replies.count
233 234 comment_page = (params[:comment_page] || 1).to_i
234 235 comments_per_page = 5
... ... @@ -275,7 +276,7 @@ class ProfileController &lt; PublicController
275 276 def remove_notification
276 277 begin
277 278 raise if !can_edit_profile
278   - notification = ActionTrackerNotification.find(:first, :conditions => {:profile_id => profile.id, :action_tracker_id => params[:activity_id]})
  279 + notification = ActionTrackerNotification.where(profile_id: profile.id, action_tracker_id: params[:activity_id]).first
279 280 notification.destroy
280 281 render :text => _('Notification successfully removed.')
281 282 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/controllers/themes_controller.rb
... ... @@ -13,7 +13,7 @@ class ThemesController &lt; ApplicationController
13 13  
14 14 def index
15 15 @environment = environment
16   - @themes = (environment.themes + Theme.approved_themes(target)).sort_by { |t| t.name }
  16 + @themes = (environment.themes + Theme.approved_themes(target)).uniq.sort_by { |t| t.name }
17 17  
18 18 @current_theme = target.theme
19 19  
... ...
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/custom_fields_helper.rb 0 → 100644
... ... @@ -0,0 +1,58 @@
  1 +module CustomFieldsHelper
  2 +
  3 + def format_name(format)
  4 + names = {}
  5 + names['string'] = _('String')
  6 + names['text'] = _('Text')
  7 + names['date'] = _('Date')
  8 + names['numeric'] = _('Numeric')
  9 + names['link'] = _('Link')
  10 + names['list'] = _('List')
  11 + names['checkbox'] = _('Checkbox')
  12 + names[format]
  13 + end
  14 +
  15 + def custom_field_forms(customized_type)
  16 + forms = []
  17 + forms << [_('String'), form_for_format(customized_type,'string')]
  18 + forms << [_('Text'), form_for_format(customized_type,'text')]
  19 + forms << [_('Date'), form_for_format(customized_type,'date')]
  20 + forms << [_('Numeric'), form_for_format(customized_type,'numeric')]
  21 + forms << [_('Link'), form_for_format(customized_type,'link')]
  22 + forms << [_('List'), form_for_format(customized_type,'list')]
  23 + forms << [_('Checkbox'), form_for_format(customized_type,'checkbox')]
  24 + forms
  25 + end
  26 +
  27 + def render_extras_field(id, extra=nil, field=nil)
  28 + if extra.nil?
  29 + CGI::escapeHTML((render(:partial => 'features/custom_fields/extras_field', :locals => {:id => id, :extra => nil, :field => field})))
  30 + else
  31 + render :partial => 'features/custom_fields/extras_field', :locals => {:id => id, :extra => extra, :field => field}
  32 + end
  33 + end
  34 +
  35 + def form_for_field(field, customized_type)
  36 + render :partial => 'features/custom_fields/form', :locals => {:field => field}
  37 + end
  38 +
  39 + def display_custom_field_value(custom_field_value)
  40 + value = profile.custom_value(custom_field_value.custom_field.name)
  41 + case custom_field_value.custom_field.format
  42 + when 'text', 'list', 'numeric', 'date', 'string'
  43 + value
  44 + when 'checkbox'
  45 + value == "1" ? _('Yes') : _('No')
  46 + when 'link'
  47 + url = value[/\Ahttps?:\/\//i] ? value : "http://#{value}"
  48 + link_to(value, url, :target => '_blank')
  49 + end
  50 + end
  51 +
  52 + private
  53 +
  54 + def form_for_format(customized_type, format)
  55 + field = CustomField.new(:format => format, :customized_type => customized_type, :environment => environment)
  56 + CGI::escapeHTML((render(:partial => 'features/custom_fields/form', :locals => {:field => field})))
  57 + end
  58 +end
... ...
app/helpers/events_helper.rb
... ... @@ -24,7 +24,8 @@ module EventsHelper
24 24 end
25 25  
26 26 def populate_calendar(selected_date, events)
27   - events.reject! {|event| !event.display_to?(user)}
  27 + selected_date = selected_date.to_date
  28 + events = events.reject{ |event| !event.display_to? user }
28 29 calendar = Event.date_range(selected_date.year, selected_date.month).map do |date|
29 30 [
30 31 # 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/forms_helper.rb
... ... @@ -184,9 +184,9 @@ module FormsHelper
184 184 datepicker_options[:year_suffix] ||= ''
185 185  
186 186 element_id = html_options[:id] || 'datepicker-date'
187   - value_js_formatted = value.present? ? value.strftime('%Y-%m-%d %H:%S') : nil
188 187 value = value.strftime(format) if value.present?
189 188 method = datepicker_options[:time] ? 'datetimepicker' : 'datepicker'
  189 + current_date_or_nil = value.present? ? "new Date('#{value}')" : "null"
190 190 result = text_field_tag(name, value, html_options)
191 191 result +=
192 192 "
... ... @@ -237,7 +237,7 @@ module FormsHelper
237 237 weekHeader: #{datepicker_options[:week_header].to_json},
238 238 yearRange: #{datepicker_options[:year_range].to_json},
239 239 yearSuffix: #{datepicker_options[:year_suffix].to_json}
240   - }).datepicker('setDate', new Date('#{value_js_formatted}'))
  240 + }).datepicker('setDate', current_date_or_nil)
241 241 </script>
242 242 ".html_safe
243 243 result
... ...
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
... ... @@ -13,35 +14,38 @@ class TaskMailer &lt; ActionMailer::Base
13 14 mail(
14 15 to: task.target.notification_emails.compact,
15 16 from: self.class.generate_from(task),
16   - subject: "[%s] %s" % [task.environment.name, task.target_notification_description]
  17 + subject: "[%s] %s" % [self.environment.name, task.target_notification_description]
17 18 )
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  
24 27 mail(
25 28 to: task.friend_email,
26 29 from: self.class.generate_from(task),
27   - subject: '[%s] %s' % [ task.requestor.environment.name, task.target_notification_description ]
  30 + subject: '[%s] %s' % [ self.environment.name, task.target_notification_description ]
28 31 )
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   - @url = url_for(:host => task.requestor.environment.default_hostname, :controller => 'home')
  41 + @url = url_for(:host => self.environment.default_hostname, :controller => 'home')
38 42  
39 43 mail_with_template(
40 44 to: task.requestor.notification_emails,
41 45 from: self.class.generate_from(task),
42   - subject: '[%s] %s' % [task.requestor.environment.name, task.target_notification_description],
  46 + subject: '[%s] %s' % [self.environment.name, task.target_notification_description],
43 47 email_template: task.email_template,
44   - template_params: {:environment => task.requestor.environment, :task => task, :message => @message, :url => @url, :requestor => task.requestor}
  48 + template_params: {:environment => self.environment, :task => task, :message => @message, :url => @url, :requestor => task.requestor}
45 49 )
46 50 end
47 51  
... ...
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_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
... ... @@ -83,7 +83,7 @@ class Article &lt; ActiveRecord::Base
83 83  
84 84 has_many :comments, :class_name => 'Comment', :foreign_key => 'source_id', :dependent => :destroy, :order => 'created_at asc'
85 85  
86   - has_many :article_categorizations, :conditions => [ 'articles_categories.virtual = ?', false ]
  86 + has_many :article_categorizations, -> { where 'articles_categories.virtual = ?', false }
87 87 has_many :categories, :through => :article_categorizations
88 88  
89 89 has_many :article_categorizations_including_virtual, :class_name => 'ArticleCategorization'
... ... @@ -135,17 +135,15 @@ class Article &lt; ActiveRecord::Base
135 135  
136 136 xss_terminate :only => [ :name ], :on => 'validation', :with => 'white_list'
137 137  
138   - scope :in_category, lambda { |category|
139   - {:include => 'categories_including_virtual', :conditions => { 'categories.id' => category.id }}
  138 + scope :in_category, -> category {
  139 + includes('categories_including_virtual').where('categories.id' => category.id)
140 140 }
141 141  
142 142 include TimeScopes
143 143  
144   - scope :by_range, lambda { |range| {
145   - :conditions => [
146   - 'articles.published_at BETWEEN :start_date AND :end_date', { :start_date => range.first, :end_date => range.last }
147   - ]
148   - }}
  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 + }
149 147  
150 148 URL_FORMAT = /\A(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(([0-9]{1,5})?\/.*)?\Z/ix
151 149  
... ... @@ -269,19 +267,21 @@ class Article &lt; ActiveRecord::Base
269 267  
270 268 # retrieves all articles belonging to the given +profile+ that are not
271 269 # sub-articles of any other article.
272   - scope :top_level_for, lambda { |profile|
273   - {:conditions => [ 'parent_id is null and profile_id = ?', profile.id ]}
  270 + scope :top_level_for, -> profile {
  271 + where 'parent_id is null and profile_id = ?', profile.id
274 272 }
275 273  
276   - scope :public,
277   - :conditions => [ "articles.advertise = ? AND articles.published = ? AND profiles.visible = ? AND profiles.public_profile = ?", true, true, true, true ], :joins => [:profile]
  274 + scope :is_public, -> {
  275 + joins(:profile).
  276 + where("articles.advertise = ? AND articles.published = ? AND profiles.visible = ? AND profiles.public_profile = ?", true, true, true, true)
  277 + }
278 278  
279   - scope :more_recent,
280   - :conditions => [ "advertise = ? AND published = ? AND profiles.visible = ? AND profiles.public_profile = ? AND
281   - ((articles.type != ?) OR articles.type is NULL)",
282   - true, true, true, true, 'RssFeed'
283   - ],
284   - :order => 'articles.published_at desc, articles.id desc'
  279 + scope :more_recent, -> {
  280 + order('articles.published_at desc, articles.id desc')
  281 + .where("articles.advertise = ? AND articles.published = ? AND profiles.visible = ? AND profiles.public_profile = ? AND
  282 + ((articles.type != ?) OR articles.type is NULL)",
  283 + true, true, true, true, 'RssFeed')
  284 + }
285 285  
286 286 # retrives the most commented articles, sorted by the comment count (largest
287 287 # first)
... ... @@ -289,12 +289,14 @@ class Article &lt; ActiveRecord::Base
289 289 paginate(:order => 'comments_count DESC', :page => 1, :per_page => limit)
290 290 end
291 291  
292   - scope :more_popular, :order => 'hits DESC'
293   - scope :relevant_as_recent, :conditions => ["(articles.type != 'UploadedFile' and articles.type != 'RssFeed' and articles.type != 'Blog') OR articles.type is NULL"]
  292 + scope :more_popular, -> { order 'hits DESC' }
  293 + scope :relevant_as_recent, -> {
  294 + where "(articles.type != 'UploadedFile' and articles.type != 'RssFeed' and articles.type != 'Blog') OR articles.type is NULL"
  295 + }
294 296  
295 297 def self.recent(limit = nil, extra_conditions = {}, pagination = true)
296 298 result = scoped({:conditions => extra_conditions}).
297   - public.
  299 + is_public.
298 300 relevant_as_recent.
299 301 limit(limit).
300 302 order(['articles.published_at desc', 'articles.id desc'])
... ... @@ -419,7 +421,7 @@ class Article &lt; ActiveRecord::Base
419 421 self.translations.map(&:language)
420 422 end
421 423  
422   - scope :native_translations, :conditions => { :translation_of_id => nil }
  424 + scope :native_translations, -> { where :translation_of_id => nil }
423 425  
424 426 def translatable?
425 427 false
... ... @@ -461,7 +463,7 @@ class Article &lt; ActiveRecord::Base
461 463  
462 464 def rotate_translations
463 465 unless self.translations.empty?
464   - rotate = self.translations
  466 + rotate = self.translations.all
465 467 root = rotate.shift
466 468 root.update_attribute(:translation_of_id, nil)
467 469 root.translations = rotate
... ... @@ -474,7 +476,7 @@ class Article &lt; ActiveRecord::Base
474 476 elsif self.native_translation.language == locale
475 477 self.native_translation
476 478 else
477   - self.native_translation.translations.first(:conditions => { :language => locale })
  479 + self.native_translation.translations.where(:language => locale).first
478 480 end
479 481 end
480 482  
... ... @@ -502,19 +504,19 @@ class Article &lt; ActiveRecord::Base
502 504 ['TextArticle', 'TextileArticle', 'TinyMceArticle']
503 505 end
504 506  
505   - scope :published, :conditions => ['articles.published = ?', true]
506   - scope :folders, lambda {|profile|{:conditions => ['articles.type IN (?)', profile.folder_types] }}
507   - scope :no_folders, lambda {|profile|{:conditions => ['articles.type NOT IN (?)', profile.folder_types]}}
508   - scope :galleries, :conditions => [ "articles.type IN ('Gallery')" ]
509   - scope :images, :conditions => { :is_image => true }
510   - scope :no_images, :conditions => { :is_image => false }
511   - scope :text_articles, :conditions => [ 'articles.type IN (?)', text_article_types ]
512   - scope :files, :conditions => { :type => 'UploadedFile' }
513   - scope :with_types, lambda { |types| { :conditions => [ 'articles.type IN (?)', types ] } }
  507 + scope :published, -> { where 'articles.published = ?', true }
  508 + scope :folders, -> profile { where 'articles.type IN (?)', profile.folder_types }
  509 + scope :no_folders, -> profile { where 'articles.type NOT IN (?)', profile.folder_types }
  510 + scope :galleries, -> { where "articles.type IN ('Gallery')" }
  511 + scope :images, -> { where :is_image => true }
  512 + scope :no_images, -> { where :is_image => false }
  513 + scope :text_articles, -> { where 'articles.type IN (?)', text_article_types }
  514 + scope :files, -> { where :type => 'UploadedFile' }
  515 + scope :with_types, -> types { where 'articles.type IN (?)', types }
514 516  
515   - scope :more_popular, :order => 'hits DESC'
516   - scope :more_comments, :order => "comments_count DESC"
517   - scope :more_recent, :order => "created_at DESC"
  517 + scope :more_popular, -> { order 'hits DESC' }
  518 + scope :more_comments, -> { order "comments_count DESC" }
  519 + scope :more_recent, -> { order "created_at DESC" }
518 520  
519 521 scope :display_filter, lambda {|user, profile|
520 522 return published if (user.nil? && profile && profile.public?)
... ... @@ -636,7 +638,7 @@ class Article &lt; ActiveRecord::Base
636 638 ]
637 639  
638 640 def self.find_by_old_path(old_path)
639   - find(:first, :include => :versions, :conditions => ['article_versions.path = ?', old_path], :order => 'article_versions.id desc')
  641 + self.includes(:versions).where('article_versions.path = ?', old_path).order('article_versions.id DESC').first
640 642 end
641 643  
642 644 def hit
... ... @@ -722,11 +724,11 @@ class Article &lt; ActiveRecord::Base
722 724 end
723 725  
724 726 def get_version(version_number = nil)
725   - version_number ? versions.find(:first, :order => 'version', :offset => version_number - 1) : versions.earliest
  727 + if version_number then self.versions.order('version').offset(version_number - 1).first else self.versions.earliest end
726 728 end
727 729  
728 730 def author_by_version(version_number = nil)
729   - version_number ? profile.environment.people.find_by_id(get_version(version_number).author_id) : author
  731 + if version_number then profile.environment.people.where(id: get_version(version_number).author_id).first else author end
730 732 end
731 733  
732 734 def author_name(version_number = nil)
... ... @@ -822,7 +824,7 @@ class Article &lt; ActiveRecord::Base
822 824 end
823 825  
824 826 def activity
825   - ActionTracker::Record.find_by_target_type_and_target_id 'Article', self.id
  827 + ActionTracker::Record.where(target_type: 'Article', target_id: self.id).first
826 828 end
827 829  
828 830 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/community.rb
... ... @@ -29,7 +29,7 @@ class Community &lt; Organization
29 29 # places that call this method are safe from mass-assignment by setting the
30 30 # environment key themselves.
31 31 def self.create_after_moderation(requestor, attributes = {})
32   - environment = attributes.delete(:environment)
  32 + environment = attributes[:environment]
33 33 community = Community.new(attributes)
34 34 community.environment = environment
35 35 if community.environment.enabled?('admin_must_approve_new_communities')
... ...
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/custom_field.rb 0 → 100644
... ... @@ -0,0 +1,34 @@
  1 +class CustomField < ActiveRecord::Base
  2 + attr_accessible :name, :default_value, :format, :extras, :customized_type, :active, :required, :signup, :environment
  3 + serialize :customized_type
  4 + serialize :extras
  5 + has_many :custom_field_values, :dependent => :delete_all
  6 + belongs_to :environment
  7 +
  8 + validates_presence_of :name, :format, :customized_type, :environment
  9 + validate :related_to_other?
  10 + validate :unique?
  11 +
  12 + def unique?
  13 + if environment.custom_fields.any?{|cf| cf.name==name && cf.environment == environment && cf.customized_type==customized_type && new_record?}
  14 + errors.add(:body, N_("There is a field with the same name for this type in this environment"))
  15 + return false
  16 + end
  17 + true
  18 + end
  19 +
  20 + def related_to_other?
  21 + environment.custom_fields.any? do |cf|
  22 + if cf.name == name && cf.customized_type != customized_type
  23 + ancestor = cf.customized_type.constantize < customized_type.constantize
  24 + descendant = cf.customized_type.constantize > customized_type.constantize
  25 + if ancestor || descendant
  26 + errors.add(:body, N_("New field related to existent one with same name"))
  27 + return false
  28 + end
  29 + end
  30 + end
  31 + true
  32 + end
  33 +end
  34 +
... ...
app/models/custom_field_value.rb 0 → 100644
... ... @@ -0,0 +1,14 @@
  1 +class CustomFieldValue < ActiveRecord::Base
  2 + belongs_to :custom_field
  3 + belongs_to :customized, :polymorphic => true
  4 + attr_accessible :value, :public, :customized, :custom_field, :customized_type
  5 + validate :can_save?
  6 +
  7 + def can_save?
  8 + if value.blank? && custom_field.required
  9 + errors.add(custom_field.name, _("can't be blank"))
  10 + return false
  11 + end
  12 + return true
  13 + end
  14 +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,10 +17,14 @@ 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
  27 + has_many :custom_fields, :dependent => :destroy
24 28 has_many :email_templates, :foreign_key => :owner_id
25 29  
26 30 IDENTIFY_SCRIPTS = /(php[0-9s]?|[sp]htm[l]?|pl|py|cgi|rb)/
... ... @@ -110,7 +114,7 @@ class Environment &lt; ActiveRecord::Base
110 114 def admins
111 115 admin_role = Environment::Roles.admin(self)
112 116 return [] if admin_role.blank?
113   - Person.members_of(self).all(:conditions => ['role_assignments.role_id = ?', admin_role.id])
  117 + Person.members_of(self).where 'role_assignments.role_id = ?', admin_role.id
114 118 end
115 119  
116 120 # returns the available features for a Environment, in the form of a
... ... @@ -225,9 +229,11 @@ class Environment &lt; ActiveRecord::Base
225 229 has_many :licenses
226 230  
227 231 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'
  232 + has_many :display_categories, -> {
  233 + order('display_color').where('display_color is not null and parent_id is null')
  234 + }, class_name: 'Category'
229 235  
230   - has_many :product_categories, :conditions => { :type => 'ProductCategory'}
  236 + has_many :product_categories, -> { where type: 'ProductCategory'}
231 237 has_many :regions
232 238 has_many :states
233 239 has_many :cities
... ... @@ -349,7 +355,7 @@ class Environment &lt; ActiveRecord::Base
349 355 settings_items :signup_welcome_screen_body, :type => String
350 356  
351 357 #Captcha settings
352   - settings_items :api_captcha_settings, :type => ActiveSupport::HashWithIndifferentAccess, :default => {}
  358 + settings_items :api_captcha_settings, :default => {}
353 359  
354 360 def has_custom_welcome_screen?
355 361 settings[:signup_welcome_screen_body].present?
... ... @@ -495,8 +501,7 @@ class Environment &lt; ActiveRecord::Base
495 501 end
496 502  
497 503 def custom_person_fields
498   - self.settings[:custom_person_fields] = {} if self.settings[:custom_person_fields].nil?
499   - self.settings[:custom_person_fields]
  504 + self.settings[:custom_person_fields].nil? ? {} : self.settings[:custom_person_fields]
500 505 end
501 506  
502 507 def custom_person_fields=(values)
... ... @@ -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?
... ... @@ -92,11 +88,11 @@ class Event &lt; Article
92 88 first_day = DateTime.new(year, month, 1)
93 89 last_day = first_day + 1.month - 1.day
94 90  
95   - first_day..last_day
  91 + first_day.to_date..last_day.to_date
96 92 end
97 93  
98 94 def date_range
99   - start_date..(end_date||start_date)
  95 + start_date.to_date..(end_date||start_date).to_date
100 96 end
101 97  
102 98 def first_paragraph
... ... @@ -115,7 +111,7 @@ class Event &lt; Article
115 111 end
116 112  
117 113 def duration
118   - (((self.end_date || self.start_date) - self.start_date).to_i/60/60/24)
  114 + (((self.end_date || self.start_date) - self.start_date).to_i/60/60/24) + 1
119 115 end
120 116  
121 117 alias_method :article_lead, :lead
... ...
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?
... ... @@ -116,6 +116,7 @@ class Organization &lt; Profile
116 116 tag_list
117 117 template_id
118 118 district
  119 + address_line2
119 120 address_reference
120 121 ]
121 122  
... ... @@ -136,11 +137,11 @@ class Organization &lt; Profile
136 137 end
137 138  
138 139 N_('Display name'); N_('Description'); N_('Contact person'); N_('Contact email'); N_('Acronym'); N_('Foundation year'); N_('Legal form'); N_('Economic activity'); N_('Management information'); N_('Tag list'); N_('District'); N_('Address reference')
139   - settings_items :display_name, :description, :contact_person, :contact_email, :acronym, :foundation_year, :legal_form, :economic_activity, :management_information, :district, :address_reference
  140 + settings_items :display_name, :description, :contact_person, :contact_email, :acronym, :foundation_year, :legal_form, :economic_activity, :management_information, :district, :address_line2, :address_reference
140 141  
141 142 settings_items :zip_code, :city, :state, :country
142 143  
143   - validates_format_of :foundation_year, :with => Noosfero::Constants::INTEGER_FORMAT
  144 + validates_numericality_of :foundation_year, only_integer: true, if: -> o { o.foundation_year.present? }
144 145 validates_format_of :contact_email, :with => Noosfero::Constants::EMAIL_FORMAT, :if => (lambda { |org| !org.contact_email.blank? })
145 146 validates_as_cnpj :cnpj
146 147  
... ... @@ -194,7 +195,7 @@ class Organization &lt; Profile
194 195 end
195 196  
196 197 def already_request_membership?(person)
197   - self.tasks.pending.find_by_requestor_id(person.id, :conditions => { :type => 'AddMember' })
  198 + self.tasks.pending.where(type: 'AddMember', requestor_id: person.id).first
198 199 end
199 200  
200 201 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[
... ... @@ -205,6 +216,7 @@ class Person &lt; Profile
205 216 district
206 217 zip_code
207 218 address
  219 + address_line2
208 220 address_reference
209 221 cell_phone
210 222 comercial_phone
... ... @@ -219,7 +231,7 @@ class Person &lt; Profile
219 231 organization
220 232 organization_website
221 233 contact_phone
222   - contact_informatioin
  234 + contact_information
223 235 ]
224 236  
225 237 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'
... ... @@ -272,7 +284,7 @@ class Person &lt; Profile
272 284 settings_items :formation, :custom_formation, :custom_area_of_study
273 285  
274 286 N_('Contact information'); N_('City'); N_('State'); N_('Country'); N_('Sex'); N_('Zip code'); N_('District'); N_('Address reference')
275   - settings_items :photo, :contact_information, :sex, :city, :state, :country, :zip_code, :district, :address_reference
  287 + settings_items :photo, :contact_information, :sex, :city, :state, :country, :zip_code, :district, :address_line2, :address_reference
276 288  
277 289 extend SetProfileRegionFromCityState::ClassMethods
278 290 set_profile_region_from_city_state
... ... @@ -301,7 +313,7 @@ class Person &lt; Profile
301 313 end
302 314  
303 315 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])
  316 + if User.where('email = ? and id != ? and environment_id = ?', value, record.user.id, record.environment.id).first
305 317 record.errors.add(attr, _('{fn} is already used by other user').fix_i18n)
306 318 end
307 319 end
... ... @@ -410,7 +422,7 @@ class Person &lt; Profile
410 422 def ask_to_join?(community)
411 423 return false if !community.visible?
412 424 return false if memberships.include?(community)
413   - return false if AddMember.find(:first, :conditions => {:requestor_id => self.id, :target_id => community.id})
  425 + return false if AddMember.where(requestor_id: self.id, target_id: community.id).first
414 426 !refused_communities.include?(community)
415 427 end
416 428  
... ...
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])
... ... @@ -114,23 +114,32 @@ class Profile &lt; ActiveRecord::Base
114 114 }
115 115  
116 116 acts_as_accessible
  117 + acts_as_customizable
117 118  
118 119 include Noosfero::Plugin::HotSpot
119 120  
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 ] } }
  121 + scope :memberships_of, -> person {
  122 + select('DISTINCT profiles.*').
  123 + joins(:role_assignments).
  124 + where('role_assignments.accessor_type = ? AND role_assignments.accessor_id = ?', person.class.base_class.name, person.id)
  125 + }
121 126 #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
  127 + scope :enterprises, -> {
  128 + where((Enterprise.send(:subclasses).map(&:name) << 'Enterprise').map { |klass| "profiles.type = '#{klass}'"}.join(" OR "))
  129 + }
  130 + scope :communities, -> {
  131 + where((Community.send(:subclasses).map(&:name) << 'Community').map { |klass| "profiles.type = '#{klass}'"}.join(" OR "))
  132 + }
  133 + scope :templates, -> template_id = nil {
  134 + s = where is_template: true
  135 + s = s.where id: template_id if template_id
  136 + s
128 137 }
129 138  
130   - scope :with_templates, lambda { |templates|
131   - {:conditions => {:template_id => templates}}
  139 + scope :with_templates, -> templates {
  140 + where template_id: templates
132 141 }
133   - scope :no_templates, {:conditions => {:is_template => false}}
  142 + scope :no_templates, -> { where is_template: false }
134 143  
135 144 # Returns a scoped object to select profiles in a given location or in a radius
136 145 # distance from the given location center.
... ... @@ -195,8 +204,8 @@ class Profile &lt; ActiveRecord::Base
195 204 alias_method_chain :count, :distinct
196 205 end
197 206  
198   - def members_by_role(roles, with_entities = nil)
199   - Person.members_of(self, with_entities).by_role(roles, with_entities)
  207 + def members_by_role(roles)
  208 + Person.members_of(self).by_role(roles)
200 209 end
201 210  
202 211 acts_as_having_boxes
... ... @@ -207,10 +216,10 @@ class Profile &lt; ActiveRecord::Base
207 216 Profile.column_names.map{|n| [Profile.table_name, n].join('.')}.join(',')
208 217 end
209 218  
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 }
  219 + scope :visible, -> { where visible: true, secret: false }
  220 + scope :disabled, -> { where visible: false }
  221 + scope :is_public, -> { where visible: true, public_profile: true, secret: false }
  222 + scope :enabled, -> { where enabled: true }
214 223  
215 224 # Subclasses must override this method
216 225 scope :more_popular
... ... @@ -262,7 +271,7 @@ class Profile &lt; ActiveRecord::Base
262 271 validates_length_of :description, :maximum => 550, :allow_nil => true
263 272  
264 273 # Valid identifiers must match this format.
265   - IDENTIFIER_FORMAT = /^#{Noosfero.identifier_format}$/
  274 + IDENTIFIER_FORMAT = /\A#{Noosfero.identifier_format}\Z/
266 275  
267 276 # These names cannot be used as identifiers for Profiles
268 277 RESERVED_IDENTIFIERS = %w[
... ... @@ -314,7 +323,7 @@ class Profile &lt; ActiveRecord::Base
314 323 end
315 324 end
316 325  
317   - has_many :profile_categorizations, :conditions => [ 'categories_profiles.virtual = ?', false ]
  326 + has_many :profile_categorizations, -> { where 'categories_profiles.virtual = ?', false }
318 327 has_many :categories, :through => :profile_categorizations
319 328  
320 329 has_many :profile_categorizations_including_virtual, :class_name => 'ProfileCategorization'
... ... @@ -541,14 +550,13 @@ class Profile &lt; ActiveRecord::Base
541 550 self.articles.recent(limit, options, pagination)
542 551 end
543 552  
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)
  553 + def last_articles limit = 10
  554 + self.articles.limit(limit).where(
  555 + "advertise = ? AND published = ? AND
  556 + ((articles.type != ? and articles.type != ? and articles.type != ?) OR
  557 + articles.type is NULL)",
  558 + true, true, 'UploadedFile', 'RssFeed', 'Blog'
  559 + ).order('articles.published_at desc, articles.id desc')
552 560 end
553 561  
554 562 def to_liquid
... ... @@ -752,7 +760,7 @@ private :generate_url, :url_options
752 760 num = num + 1
753 761 new_name = original_article.name + ' ' + num.to_s
754 762 end
755   - original_article.update_attributes!(:name => new_name)
  763 + original_article.update!(:name => new_name)
756 764 end
757 765 article_copy = article.copy(:profile => self, :parent => parent, :advertise => false)
758 766 if article.profile.home_page == article
... ... @@ -942,11 +950,11 @@ private :generate_url, :url_options
942 950 self.forums.count.nonzero?
943 951 end
944 952  
945   - def admins(with_entities = nil)
  953 + def admins
946 954 return [] if environment.blank?
947 955 admin_role = Profile::Roles.admin(environment.id)
948 956 return [] if admin_role.blank?
949   - self.members_by_role(admin_role, with_entities)
  957 + self.members_by_role(admin_role)
950 958 end
951 959  
952 960 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
... ... @@ -40,7 +40,7 @@ class RssFeed &lt; Article
40 40  
41 41 # FIXME this should be validates_numericality_of, but Rails 2.0.2 does not
42 42 # support validates_numericality_of with virtual attributes
43   - validates_format_of :limit, :with => /^\d+$/, :if => :limit
  43 + validates_format_of :limit, :with => /\d+/, :if => :limit
44 44  
45 45 # determinates what to include in the feed. Possible values are +:all+
46 46 # (include everything from the profile) and :parent_and_children (include
... ... @@ -69,7 +69,7 @@ class RssFeed &lt; Article
69 69 def fetch_articles
70 70 if parent && parent.has_posts?
71 71 language = self.language.blank? ? {} : { :language => self.language }
72   - return parent.posts.find(:all, :conditions => { :published => true }.merge(language), :limit => self.limit, :order => 'id desc')
  72 + return parent.posts.where({published: true}.merge language).limit(self.limit).order('id desc')
73 73 end
74 74  
75 75 articles =
... ...
app/models/scrap.rb
... ... @@ -18,9 +18,9 @@ class Scrap &lt; ActiveRecord::Base
18 18 after_create :create_activity
19 19 after_update :update_activity
20 20  
21   - scope :all_scraps, lambda {|profile| {:conditions => ["receiver_id = ? OR sender_id = ?", profile, profile], :limit => 30}}
  21 + scope :all_scraps, -> profile { limit(30).where("receiver_id = ? OR sender_id = ?", profile, profile) }
22 22  
23   - scope :not_replies, :conditions => {:scrap_id => nil}
  23 + scope :not_replies, -> { where scrap_id: nil }
24 24  
25 25 track_actions :leave_scrap, :after_create, :keep_params => ['sender.name', 'content', 'receiver.name', 'receiver.url'], :if => Proc.new{|s| s.sender != s.receiver && s.sender != s.top_root.receiver}, :custom_target => :action_tracker_target, :custom_user => :sender
26 26  
... ...
app/models/search_term_occurrence.rb
1 1 class SearchTermOccurrence < ActiveRecord::Base
  2 +
2 3 belongs_to :search_term
3 4 validates_presence_of :search_term
4 5 attr_accessible :search_term, :created_at, :total, :indexed
5 6  
6 7 EXPIRATION_TIME = 1.year
7 8  
8   - scope :valid, :conditions => ["search_term_occurrences.created_at > ?", DateTime.now - EXPIRATION_TIME]
  9 + scope :valid, -> { where "search_term_occurrences.created_at > ?", DateTime.now - EXPIRATION_TIME }
  10 +
9 11 end
... ...
app/models/slideshow_block.rb
... ... @@ -13,7 +13,7 @@ class SlideshowBlock &lt; Block
13 13 end
14 14  
15 15 def gallery
16   - gallery_id ? Gallery.find(:first, :conditions => { :id => gallery_id }) : nil
  16 + if gallery_id then Gallery.where(id: gallery_id).first else nil end
17 17 end
18 18  
19 19 def public_filename_for(image)
... ...