Commit f201ef8a9990e4993c71cce0942a5e9d5628d27c

Authored by Joenio Costa
2 parents 82e6a923 3b5767b1

Merge branch 'master' into AI3120-display_content_fix

Showing 2972 changed files with 192095 additions and 46912 deletions   Show diff stats

Too many changes.

To preserve performance only 100 of 2972 files displayed.

@@ -162,6 +162,7 @@ João M. M. Silva + Rafael Manzo <jaodsilv@linux.ime.usp.br> @@ -162,6 +162,7 @@ João M. M. Silva + Rafael Manzo <jaodsilv@linux.ime.usp.br>
162 João M. M. Silva + Renan Teruo <jaodsilv@linux.ime.usp.br> 162 João M. M. Silva + Renan Teruo <jaodsilv@linux.ime.usp.br>
163 Joenio Costa <joenio@colivre.coop.br> 163 Joenio Costa <joenio@colivre.coop.br>
164 Josef Spillner <josef.spillner@tu-dresden.de> 164 Josef Spillner <josef.spillner@tu-dresden.de>
  165 +Junior Silva <junior@bajor.localhost.localdomain>
165 Junior Silva <juniorsilva1001@gmail.com> 166 Junior Silva <juniorsilva1001@gmail.com>
166 Junior Silva <juniorsilva7@juniorsilva-Aspire-5750Z.(none)> 167 Junior Silva <juniorsilva7@juniorsilva-Aspire-5750Z.(none)>
167 Junior Silva <juniorsilva@colivre.coop.br> 168 Junior Silva <juniorsilva@colivre.coop.br>
1 source "https://rubygems.org" 1 source "https://rubygems.org"
  2 +gem 'rails'
  3 +gem 'fast_gettext'
  4 +gem 'acts-as-taggable-on'
  5 +gem 'prototype-rails'
  6 +gem 'prototype_legacy_helper', '0.0.0', :path => 'vendor/prototype_legacy_helper'
  7 +gem 'rails_autolink'
  8 +gem 'pg'
  9 +gem 'rmagick'
  10 +gem 'RedCloth'
  11 +gem 'will_paginate'
  12 +gem 'ruby-feedparser'
  13 +gem 'daemons'
  14 +gem 'thin'
  15 +gem 'hpricot'
  16 +gem 'nokogiri'
  17 +gem 'rake', :require => false
2 18
3 -gem 'exception_notification', '1.0.20090728'  
4 -gem 'system_timer' 19 +# FIXME list here all actual dependencies (i.e. the ones in debian/control),
  20 +# with their GEM names (not the Debian package names)
  21 +
  22 +group :production do
  23 + gem 'dalli'
  24 +end
5 25
6 group :test do 26 group :test do
7 - gem 'rspec', '1.2.9'  
8 - gem 'rspec-rails', '1.2.9' 27 + gem 'rspec'
  28 + gem 'rspec-rails'
9 end 29 end
10 30
11 group :cucumber do 31 group :cucumber do
12 - gem 'rake', '0.8.7'  
13 - gem 'cucumber-rails', '0.3.2'  
14 - gem 'capybara', '1.1.1'  
15 - gem 'cucumber', '1.1.0' 32 + gem 'rake'
  33 + gem 'cucumber-rails', :require => false
  34 + gem 'capybara'
  35 + gem 'cucumber'
16 gem 'database_cleaner' 36 gem 'database_cleaner'
  37 + gem 'selenium-webdriver'
17 end 38 end
18 39
19 -def program(name)  
20 - unless system("which #{name} > /dev/null")  
21 - puts "W: Program #{name} is needed, but was not found in your PATH"  
22 - end 40 +# include plugin gemfiles
  41 +Dir.glob(File.join('config', 'plugins', '*')).each do |plugin|
  42 + plugin_gemfile = File.join(plugin, 'Gemfile')
  43 + eval File.read(plugin_gemfile) if File.exists?(plugin_gemfile)
23 end 44 end
24 -  
25 -program 'java'  
26 -program 'firefox'  
  1 +PATH
  2 + remote: vendor/prototype_legacy_helper
  3 + specs:
  4 + prototype_legacy_helper (0.0.0)
  5 +
1 GEM 6 GEM
2 remote: https://rubygems.org/ 7 remote: https://rubygems.org/
3 specs: 8 specs:
4 - builder (3.1.4)  
5 - capybara (1.1.1) 9 + RedCloth (4.2.9)
  10 + actionmailer (3.2.6)
  11 + actionpack (= 3.2.6)
  12 + mail (~> 2.4.4)
  13 + actionpack (3.2.6)
  14 + activemodel (= 3.2.6)
  15 + activesupport (= 3.2.6)
  16 + builder (~> 3.0.0)
  17 + erubis (~> 2.7.0)
  18 + journey (~> 1.0.1)
  19 + rack (~> 1.4.0)
  20 + rack-cache (~> 1.2)
  21 + rack-test (~> 0.6.1)
  22 + sprockets (~> 2.1.3)
  23 + activemodel (3.2.6)
  24 + activesupport (= 3.2.6)
  25 + builder (~> 3.0.0)
  26 + activerecord (3.2.6)
  27 + activemodel (= 3.2.6)
  28 + activesupport (= 3.2.6)
  29 + arel (~> 3.0.2)
  30 + tzinfo (~> 0.3.29)
  31 + activeresource (3.2.6)
  32 + activemodel (= 3.2.6)
  33 + activesupport (= 3.2.6)
  34 + activesupport (3.2.6)
  35 + i18n (~> 0.6)
  36 + multi_json (~> 1.0)
  37 + acts-as-taggable-on (3.0.2)
  38 + rails (>= 3, < 5)
  39 + arel (3.0.2)
  40 + builder (3.0.0)
  41 + capybara (2.1.0)
6 mime-types (>= 1.16) 42 mime-types (>= 1.16)
7 nokogiri (>= 1.3.3) 43 nokogiri (>= 1.3.3)
8 rack (>= 1.0.0) 44 rack (>= 1.0.0)
9 rack-test (>= 0.5.4) 45 rack-test (>= 0.5.4)
10 - selenium-webdriver (~> 2.0)  
11 - xpath (~> 0.1.4)  
12 - childprocess (0.3.6)  
13 - ffi (~> 1.0, >= 1.0.6)  
14 - cucumber (1.1.0) 46 + xpath (~> 2.0)
  47 + childprocess (0.3.3)
  48 + ffi (~> 1.0.6)
  49 + cucumber (1.0.6)
15 builder (>= 2.1.2) 50 builder (>= 2.1.2)
16 diff-lcs (>= 1.1.2) 51 diff-lcs (>= 1.1.2)
17 - gherkin (~> 2.5.0) 52 + gherkin (~> 2.4.18)
18 json (>= 1.4.6) 53 json (>= 1.4.6)
19 term-ansicolor (>= 1.0.6) 54 term-ansicolor (>= 1.0.6)
20 - cucumber-rails (0.3.2)  
21 - cucumber (>= 0.8.0)  
22 - database_cleaner (0.9.1) 55 + cucumber-rails (1.0.6)
  56 + capybara (>= 1.1.1)
  57 + cucumber (>= 1.0.6)
  58 + nokogiri (>= 1.5.0)
  59 + daemons (1.1.5)
  60 + dalli (2.7.0)
  61 + database_cleaner (1.2.0)
23 diff-lcs (1.1.3) 62 diff-lcs (1.1.3)
24 - exception_notification (1.0.20090728)  
25 - ffi (1.2.0)  
26 - gherkin (2.5.4) 63 + erubis (2.7.0)
  64 + eventmachine (0.12.11)
  65 + fast_gettext (0.6.8)
  66 + ffi (1.0.11)
  67 + gherkin (2.4.21)
27 json (>= 1.4.6) 68 json (>= 1.4.6)
28 - json (1.7.5)  
29 - libwebsocket (0.1.6.1)  
30 - websocket 69 + hike (1.2.1)
  70 + hpricot (0.8.6)
  71 + i18n (0.6.0)
  72 + journey (1.0.3)
  73 + json (1.7.3)
  74 + mail (2.4.4)
  75 + i18n (>= 0.4.0)
  76 + mime-types (~> 1.16)
  77 + treetop (~> 1.4.8)
31 mime-types (1.19) 78 mime-types (1.19)
32 - multi_json (1.3.7) 79 + multi_json (1.3.6)
33 nokogiri (1.5.5) 80 nokogiri (1.5.5)
34 - rack (1.1.0)  
35 - rack-test (0.6.2) 81 + pg (0.13.2)
  82 + polyglot (0.3.3)
  83 + prototype-rails (3.2.1)
  84 + rails (~> 3.2)
  85 + rack (1.4.1)
  86 + rack-cache (1.2)
  87 + rack (>= 0.4)
  88 + rack-ssl (1.3.2)
  89 + rack
  90 + rack-test (0.6.1)
36 rack (>= 1.0) 91 rack (>= 1.0)
37 - rake (0.8.7)  
38 - rspec (1.2.9)  
39 - rspec-rails (1.2.9)  
40 - rack (>= 1.0.0)  
41 - rspec (>= 1.2.9)  
42 - rubyzip (0.9.9)  
43 - selenium-webdriver (2.26.0) 92 + rails (3.2.6)
  93 + actionmailer (= 3.2.6)
  94 + actionpack (= 3.2.6)
  95 + activerecord (= 3.2.6)
  96 + activeresource (= 3.2.6)
  97 + activesupport (= 3.2.6)
  98 + bundler (~> 1.0)
  99 + railties (= 3.2.6)
  100 + rails_autolink (1.1.5)
  101 + rails (> 3.1)
  102 + railties (3.2.6)
  103 + actionpack (= 3.2.6)
  104 + activesupport (= 3.2.6)
  105 + rack-ssl (~> 1.3.2)
  106 + rake (>= 0.8.7)
  107 + rdoc (~> 3.4)
  108 + thor (>= 0.14.6, < 2.0)
  109 + rake (0.9.2.2)
  110 + rdoc (3.9.4)
  111 + rmagick (2.13.1)
  112 + rspec (2.10.0)
  113 + rspec-core (~> 2.10.0)
  114 + rspec-expectations (~> 2.10.0)
  115 + rspec-mocks (~> 2.10.0)
  116 + rspec-core (2.10.1)
  117 + rspec-expectations (2.10.0)
  118 + diff-lcs (~> 1.1.3)
  119 + rspec-mocks (2.10.1)
  120 + rspec-rails (2.10.1)
  121 + actionpack (>= 3.0)
  122 + activesupport (>= 3.0)
  123 + railties (>= 3.0)
  124 + rspec (~> 2.10.0)
  125 + ruby-feedparser (0.7)
  126 + rubyzip (1.1.2)
  127 + selenium-webdriver (2.39.0)
44 childprocess (>= 0.2.5) 128 childprocess (>= 0.2.5)
45 - libwebsocket (~> 0.1.3)  
46 multi_json (~> 1.0) 129 multi_json (~> 1.0)
47 - rubyzip  
48 - system_timer (1.2.4) 130 + rubyzip (~> 1.0)
  131 + websocket (~> 1.0.4)
  132 + sprockets (2.1.3)
  133 + hike (~> 1.2)
  134 + multi_json (~> 1.0)
  135 + rack (~> 1.0)
  136 + tilt (~> 1.1, != 1.3.0)
49 term-ansicolor (1.0.7) 137 term-ansicolor (1.0.7)
50 - websocket (1.0.4)  
51 - xpath (0.1.4) 138 + thin (1.3.1)
  139 + daemons (>= 1.0.9)
  140 + eventmachine (>= 0.12.6)
  141 + rack (>= 1.0.0)
  142 + thor (0.15.3)
  143 + tilt (1.3.3)
  144 + treetop (1.4.10)
  145 + polyglot
  146 + polyglot (>= 0.3.1)
  147 + tzinfo (0.3.33)
  148 + websocket (1.0.7)
  149 + will_paginate (3.0.3)
  150 + xpath (2.0.0)
52 nokogiri (~> 1.3) 151 nokogiri (~> 1.3)
53 152
54 PLATFORMS 153 PLATFORMS
55 ruby 154 ruby
56 155
57 DEPENDENCIES 156 DEPENDENCIES
58 - capybara (= 1.1.1)  
59 - cucumber (= 1.1.0)  
60 - cucumber-rails (= 0.3.2) 157 + RedCloth
  158 + acts-as-taggable-on
  159 + capybara
  160 + cucumber
  161 + cucumber-rails
  162 + daemons
  163 + dalli
61 database_cleaner 164 database_cleaner
62 - exception_notification (= 1.0.20090728)  
63 - rake (= 0.8.7)  
64 - rspec (= 1.2.9)  
65 - rspec-rails (= 1.2.9)  
66 - system_timer 165 + fast_gettext
  166 + hpricot
  167 + nokogiri
  168 + pg
  169 + prototype-rails
  170 + prototype_legacy_helper (= 0.0.0)!
  171 + rails
  172 + rails_autolink
  173 + rake
  174 + rmagick
  175 + rspec
  176 + rspec-rails
  177 + ruby-feedparser
  178 + selenium-webdriver
  179 + thin
  180 + will_paginate
@@ -110,7 +110,7 @@ Setup Noosfero log and tmp directories: @@ -110,7 +110,7 @@ Setup Noosfero log and tmp directories:
110 # cd /var/lib/noosfero/current 110 # cd /var/lib/noosfero/current
111 # ./etc/init.d/noosfero setup 111 # ./etc/init.d/noosfero setup
112 112
113 -Now it's time to setup the database. In this example we are using PostgreSQL, so if you are planning to use a different database this steps won't apply. 113 +Now it's time to setup the database. In this example we are using PostgreSQL, so if you are planning to use a different database this steps won't apply. Pay special attention to the default collation defined on your setup by the environment variable LC_COLLATE because it might interfere in some sorting operations on your database. For more information checkout `man locale`.
114 114
115 # apt-get install postgresql libpgsql-ruby 115 # apt-get install postgresql libpgsql-ruby
116 # su postgres -c 'createuser noosfero -S -d -R' 116 # su postgres -c 'createuser noosfero -S -d -R'
MIGRATION_ISSUES 0 → 100644
@@ -0,0 +1,41 @@ @@ -0,0 +1,41 @@
  1 +* ruby-get-text incmopatible with rails3. Maybe we can use it's gem
  2 +
  3 +* all js code is inside miscellaneous.js. Would be nice to refactor this
  4 +
  5 +* rails 2 uses prototype instead of jquery
  6 +
  7 +* config/environment.rb maybe still have some code that should be on the initializers
  8 +
  9 +* initializers session_store.rb inflections.rb... don't exist
  10 +
  11 +* rails gems version have to be forced on Gemfile or it will use incompatible pre3vious versions (3.1.3)
  12 +
  13 +* Sweepers are now natively supported on Rails 3. Would be nice to refactor it
  14 +
  15 +* On Rails 3 it is no more possible to add allowed tags to avoid scape. The html_safe initializer is an option.
  16 +
  17 +* error when call sqlite_extensiosn
  18 +
  19 +* error related to action_tracker
  20 +
  21 +* check FIXME's in script/quick-start
  22 +
  23 +* check FIXME's in Gemfile
  24 +
  25 +* Check the FIXME in config/routes.rb
  26 +
  27 +* rewrite conditional routing. See FIXME in lib/route_if.rb and re-implement using the Rails 3 mechanism - http://guides.rubyonrails.org/routing.html#advanced-constraints
  28 +
  29 +* check FIXME's in config/environment.rb
  30 +
  31 +* xss_terminate sucks. We should replace it with the builtin mechanism in Rails 3
  32 +
  33 +* instance_eval on Ruby 1.9 yields self, so lambdas that are passed to instance_eval and do not accept exactly 1 argument will blow up. See http://www.ruby-forum.com/topic/213313 ... search for instance_eval and fix where necessary. In special, most of the blocks still need fixing.
  34 +
  35 +* all instances of <% *_form_for ... %> must be changed to <%= instead of <%
  36 +
  37 +* all ActiveRecord models have to declare explicitly which attributes must be allowed for mass assignment with attr_accessible.
  38 +
  39 +* check if we need to update config/locales/*
  40 +
  41 +* check observe_field and labelled_form_for in app/helpers/application_helper.rb
  1 +[![Code Climate](https://codeclimate.com/github/Noosfero/noosfero.png)](https://codeclimate.com/github/Noosfero/noosfero)
  2 +
1 Noosfero - a web-based social platform 3 Noosfero - a web-based social platform
2 ====================================== 4 ======================================
3 5
@@ -30,4 +32,4 @@ Authorship and copyright information is available in the files listed below. @@ -30,4 +32,4 @@ Authorship and copyright information is available in the files listed below.
30 -------------------- ----------------------------------------- 32 -------------------- -----------------------------------------
31 AUTHORS.md list of authors (updated at each release) 33 AUTHORS.md list of authors (updated at each release)
32 COPYRIGHT Copyright statement for the project 34 COPYRIGHT Copyright statement for the project
33 - COPYING Full text of the project license 35 - COPYING Full text of the project license
  36 + COPYING Full text of the project license
34 \ No newline at end of file 37 \ No newline at end of file
  1 +#!/usr/bin/env rake
1 # Add your own tasks in files placed in lib/tasks ending in .rake, 2 # Add your own tasks in files placed in lib/tasks ending in .rake,
2 # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. 3 # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3 4
4 -require(File.join(File.dirname(__FILE__), 'config', 'boot')) 5 +require File.expand_path('../config/application', __FILE__)
5 6
6 -require 'rake'  
7 -require 'rake/testtask'  
8 -require 'rake/rdoctask'  
9 -  
10 -# rails tasks  
11 -require 'tasks/rails'  
12 -  
13 -# plugins' tasks  
14 -plugins_tasks = Dir.glob("config/plugins/*/{tasks,lib/tasks,rails/tasks}/**/*.rake").sort +  
15 - Dir.glob("config/plugins/*/vendor/plugins/*/{tasks,lib/tasks,rails/tasks}/**/*.rake").sort  
16 -plugins_tasks.each{ |ext| load ext } 7 +Noosfero::Application.load_tasks
Vagrantfile 0 → 100644
@@ -0,0 +1,11 @@ @@ -0,0 +1,11 @@
  1 +# -*- mode: ruby -*-
  2 +# vi: set ft=ruby :
  3 +
  4 +VAGRANTFILE_API_VERSION = "2"
  5 +Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  6 + config.vm.box = "debian-wheezy"
  7 + config.vm.network :forwarded_port, host: 3000, guest: 3000
  8 + config.vm.provision :shell do |shell|
  9 + shell.inline = 'su vagrant -c /vagrant/script/vagrant'
  10 + end
  11 +end
app/controllers/admin/admin_panel_controller.rb
@@ -7,6 +7,7 @@ class AdminPanelController &lt; AdminController @@ -7,6 +7,7 @@ class AdminPanelController &lt; AdminController
7 end 7 end
8 8
9 def site_info 9 def site_info
  10 + @no_design_blocks = true
10 if request.post? 11 if request.post?
11 if params[:environment][:languages] 12 if params[:environment][:languages]
12 params[:environment][:languages] = params[:environment][:languages].map {|lang, value| lang if value=='true'}.compact 13 params[:environment][:languages] = params[:environment][:languages].map {|lang, value| lang if value=='true'}.compact
@@ -42,7 +43,7 @@ class AdminPanelController &lt; AdminController @@ -42,7 +43,7 @@ class AdminPanelController &lt; AdminController
42 end 43 end
43 redirect_to :action => 'set_portal_folders' 44 redirect_to :action => 'set_portal_folders'
44 else 45 else
45 - session[:notice] = __('Community not found. You must insert the identifier of a community from this environment') 46 + session[:notice] = _('Community not found. You must insert the identifier of a community from this environment')
46 end 47 end
47 end 48 end
48 end 49 end
app/controllers/admin/environment_design_controller.rb
@@ -5,7 +5,7 @@ class EnvironmentDesignController &lt; BoxOrganizerController @@ -5,7 +5,7 @@ class EnvironmentDesignController &lt; BoxOrganizerController
5 def available_blocks 5 def available_blocks
6 # TODO EnvironmentStatisticsBlock is DEPRECATED and will be removed from 6 # TODO EnvironmentStatisticsBlock is DEPRECATED and will be removed from
7 # the Noosfero core soon, see ActionItem3045 7 # the Noosfero core soon, see ActionItem3045
8 - @available_blocks ||= [ ArticleBlock, LoginBlock, EnvironmentStatisticsBlock, RecentDocumentsBlock, EnterprisesBlock, CommunitiesBlock, PeopleBlock, SellersSearchBlock, LinkListBlock, FeedReaderBlock, SlideshowBlock, HighlightsBlock, FeaturedProductsBlock, CategoriesBlock, RawHTMLBlock, TagsBlock ] 8 + @available_blocks ||= [ ArticleBlock, LoginBlock, EnvironmentStatisticsBlock, RecentDocumentsBlock, EnterprisesBlock, CommunitiesBlock, SellersSearchBlock, LinkListBlock, FeedReaderBlock, SlideshowBlock, HighlightsBlock, FeaturedProductsBlock, CategoriesBlock, RawHTMLBlock, TagsBlock ]
9 @available_blocks += plugins.dispatch(:extra_blocks, :type => Environment) 9 @available_blocks += plugins.dispatch(:extra_blocks, :type => Environment)
10 end 10 end
11 11
app/controllers/admin/environment_role_manager_controller.rb
1 class EnvironmentRoleManagerController < AdminController 1 class EnvironmentRoleManagerController < AdminController
2 protect 'manage_environment_roles', :environment 2 protect 'manage_environment_roles', :environment
3 - 3 +
4 def index 4 def index
5 @admins = Person.find(:all, :conditions => ['role_assignments.resource_type = ?', 'Environment'], :include => :role_assignments ) 5 @admins = Person.find(:all, :conditions => ['role_assignments.resource_type = ?', 'Environment'], :include => :role_assignments )
6 end 6 end
@@ -8,7 +8,7 @@ class EnvironmentRoleManagerController &lt; AdminController @@ -8,7 +8,7 @@ class EnvironmentRoleManagerController &lt; AdminController
8 def change_roles 8 def change_roles
9 @admin = Person.find(params[:id]) 9 @admin = Person.find(params[:id])
10 @roles = Role.find(:all).select{ |r| r.has_kind?(:environment) } 10 @roles = Role.find(:all).select{ |r| r.has_kind?(:environment) }
11 - end 11 + end
12 12
13 def update_roles 13 def update_roles
14 @roles = params[:roles] ? Role.find(params[:roles]) : [] 14 @roles = params[:roles] ? Role.find(params[:roles]) : []
@@ -20,7 +20,7 @@ class EnvironmentRoleManagerController &lt; AdminController @@ -20,7 +20,7 @@ class EnvironmentRoleManagerController &lt; AdminController
20 end 20 end
21 redirect_to :action => :index 21 redirect_to :action => :index
22 end 22 end
23 - 23 +
24 def change_role 24 def change_role
25 @roles = Role.find(:all).select{ |r| r.has_kind?(:environment) } 25 @roles = Role.find(:all).select{ |r| r.has_kind?(:environment) }
26 @admin = Person.find(params[:id]) 26 @admin = Person.find(params[:id])
app/controllers/admin/features_controller.rb
@@ -34,9 +34,9 @@ class FeaturesController &lt; AdminController @@ -34,9 +34,9 @@ class FeaturesController &lt; AdminController
34 def manage_enterprise_fields 34 def manage_enterprise_fields
35 environment.custom_enterprise_fields = params[:enterprise_fields] 35 environment.custom_enterprise_fields = params[:enterprise_fields]
36 if environment.save! 36 if environment.save!
37 - session[:notice] = __('Enterprise fields updated successfully.') 37 + session[:notice] = _('Enterprise fields updated successfully.')
38 else 38 else
39 - flash[:error] = __('Enterprise fields not updated successfully.') 39 + flash[:error] = _('Enterprise fields not updated successfully.')
40 end 40 end
41 redirect_to :action => 'manage_fields' 41 redirect_to :action => 'manage_fields'
42 end 42 end
app/controllers/admin/users_controller.rb
@@ -79,7 +79,7 @@ class UsersController &lt; AdminController @@ -79,7 +79,7 @@ class UsersController &lt; AdminController
79 users = User.connection.execute(command) 79 users = User.connection.execute(command)
80 csv_content = "name;email\n" 80 csv_content = "name;email\n"
81 users.each { |u| 81 users.each { |u|
82 - CSV.generate_row([u['name'], u['email']], 2, csv_content, fs=';') 82 + csv_content << CSV.generate_line([u['name'], u['email']], {:col_sep => ';'})
83 } 83 }
84 render :text => csv_content, :content_type => 'text/csv', :layout => false 84 render :text => csv_content, :content_type => 'text/csv', :layout => false
85 end 85 end
app/controllers/application_controller.rb
  1 +require 'noosfero/multi_tenancy'
  2 +
1 class ApplicationController < ActionController::Base 3 class ApplicationController < ActionController::Base
  4 + protect_from_forgery
2 5
3 before_filter :setup_multitenancy 6 before_filter :setup_multitenancy
4 before_filter :detect_stuff_by_domain 7 before_filter :detect_stuff_by_domain
5 - before_filter :init_noosfero_plugins_controller_filters 8 + before_filter :init_noosfero_plugins
6 before_filter :allow_cross_domain_access 9 before_filter :allow_cross_domain_access
7 10
  11 + after_filter :set_csrf_cookie
  12 +
  13 + def set_csrf_cookie
  14 + cookies['_noosfero_.XSRF-TOKEN'] = form_authenticity_token if protect_against_forgery? && logged_in?
  15 + end
  16 +
8 def allow_cross_domain_access 17 def allow_cross_domain_access
9 origin = request.headers['Origin'] 18 origin = request.headers['Origin']
10 return if origin.blank? 19 return if origin.blank?
@@ -21,7 +30,8 @@ class ApplicationController &lt; ActionController::Base @@ -21,7 +30,8 @@ class ApplicationController &lt; ActionController::Base
21 include ApplicationHelper 30 include ApplicationHelper
22 layout :get_layout 31 layout :get_layout
23 def get_layout 32 def get_layout
24 - return nil if request.format == :js 33 + return nil if request.format == :js or request.xhr?
  34 +
25 theme_layout = theme_option(:layout) 35 theme_layout = theme_option(:layout)
26 if theme_layout 36 if theme_layout
27 theme_view_file('layouts/'+theme_layout) || theme_layout 37 theme_view_file('layouts/'+theme_layout) || theme_layout
@@ -30,11 +40,9 @@ class ApplicationController &lt; ActionController::Base @@ -30,11 +40,9 @@ class ApplicationController &lt; ActionController::Base
30 end 40 end
31 end 41 end
32 42
33 - filter_parameter_logging :password  
34 -  
35 def log_processing 43 def log_processing
36 super 44 super
37 - return unless ENV['RAILS_ENV'] == 'production' 45 + return unless Rails.env == 'production'
38 if logger && logger.info? 46 if logger && logger.info?
39 logger.info(" HTTP Referer: #{request.referer}") 47 logger.info(" HTTP Referer: #{request.referer}")
40 logger.info(" User Agent: #{request.user_agent}") 48 logger.info(" User Agent: #{request.user_agent}")
@@ -65,6 +73,7 @@ class ApplicationController &lt; ActionController::Base @@ -65,6 +73,7 @@ class ApplicationController &lt; ActionController::Base
65 FastGettext.default_locale = environment.default_locale 73 FastGettext.default_locale = environment.default_locale
66 FastGettext.locale = (params[:lang] || session[:lang] || environment.default_locale || request.env['HTTP_ACCEPT_LANGUAGE'] || 'en') 74 FastGettext.locale = (params[:lang] || session[:lang] || environment.default_locale || request.env['HTTP_ACCEPT_LANGUAGE'] || 'en')
67 I18n.locale = FastGettext.locale 75 I18n.locale = FastGettext.locale
  76 + I18n.default_locale = FastGettext.default_locale
68 if params[:lang] 77 if params[:lang]
69 session[:lang] = params[:lang] 78 session[:lang] = params[:lang]
70 end 79 end
@@ -74,18 +83,24 @@ class ApplicationController &lt; ActionController::Base @@ -74,18 +83,24 @@ class ApplicationController &lt; ActionController::Base
74 83
75 attr_reader :environment 84 attr_reader :environment
76 85
77 - before_filter :load_terminology  
78 -  
79 # declares that the given <tt>actions</tt> cannot be accessed by other HTTP 86 # declares that the given <tt>actions</tt> cannot be accessed by other HTTP
80 # method besides POST. 87 # method besides POST.
81 def self.post_only(actions, redirect = { :action => 'index'}) 88 def self.post_only(actions, redirect = { :action => 'index'})
82 - verify :method => :post, :only => actions, :redirect_to => redirect 89 + before_filter(:only => actions) do |controller|
  90 + if !controller.request.post?
  91 + controller.redirect_to redirect
  92 + end
  93 + end
83 end 94 end
84 95
85 helper_method :current_person, :current_person 96 helper_method :current_person, :current_person
86 97
87 protected 98 protected
88 99
  100 + def verified_request?
  101 + super || form_authenticity_token == request.headers['X-XSRF-TOKEN']
  102 + end
  103 +
89 def setup_multitenancy 104 def setup_multitenancy
90 Noosfero::MultiTenancy.setup!(request.host) 105 Noosfero::MultiTenancy.setup!(request.host)
91 end 106 end
@@ -111,7 +126,10 @@ class ApplicationController &lt; ActionController::Base @@ -111,7 +126,10 @@ class ApplicationController &lt; ActionController::Base
111 @environment = Environment.default 126 @environment = Environment.default
112 if @environment.nil? && Rails.env.development? 127 if @environment.nil? && Rails.env.development?
113 # This should only happen in development ... 128 # This should only happen in development ...
114 - @environment = Environment.create!(:name => "Noosfero", :is_default => true) 129 + @environment = Environment.new
  130 + @environment.name = "Noosfero"
  131 + @environment.is_default = true
  132 + @environment.save!
115 end 133 end
116 else 134 else
117 @environment = @domain.environment 135 @environment = @domain.environment
@@ -127,36 +145,15 @@ class ApplicationController &lt; ActionController::Base @@ -127,36 +145,15 @@ class ApplicationController &lt; ActionController::Base
127 145
128 include Noosfero::Plugin::HotSpot 146 include Noosfero::Plugin::HotSpot
129 147
130 - # This is a generic method that initialize any possible filter defined by a  
131 - # plugin to the current controller being initialized.  
132 - def init_noosfero_plugins_controller_filters  
133 - plugins.each do |plugin|  
134 - filters = plugin.send(self.class.name.underscore + '_filters')  
135 - filters = [filters] if !filters.kind_of?(Array)  
136 - controller_filters = self.class.filter_chain.map {|c| c.method }  
137 - filters.each do |plugin_filter|  
138 - filter_method = plugin.class.name.underscore.gsub('/','_') + '_' + plugin_filter[:method_name]  
139 - unless controller_filters.include?(filter_method)  
140 - self.class.send(plugin_filter[:type], filter_method, (plugin_filter[:options] || {}))  
141 - self.class.send(:define_method, filter_method) do  
142 - instance_eval(&plugin_filter[:block]) if environment.plugin_enabled?(plugin.class)  
143 - end  
144 - end  
145 - end  
146 - end  
147 - end  
148 -  
149 - def load_terminology  
150 - # cache terminology for performance  
151 - @@terminology_cache ||= {}  
152 - @@terminology_cache[environment.id] ||= environment.terminology  
153 - Noosfero.terminology = @@terminology_cache[environment.id] 148 + # FIXME this filter just loads @plugins to children controllers and helpers
  149 + def init_noosfero_plugins
  150 + plugins
154 end 151 end
155 152
156 def render_not_found(path = nil) 153 def render_not_found(path = nil)
157 @no_design_blocks = true 154 @no_design_blocks = true
158 @path ||= request.path 155 @path ||= request.path
159 - render :template => 'shared/not_found.rhtml', :status => 404, :layout => get_layout 156 + render :template => 'shared/not_found.html.erb', :status => 404, :layout => get_layout
160 end 157 end
161 alias :render_404 :render_not_found 158 alias :render_404 :render_not_found
162 159
@@ -164,12 +161,12 @@ class ApplicationController &lt; ActionController::Base @@ -164,12 +161,12 @@ class ApplicationController &lt; ActionController::Base
164 @no_design_blocks = true 161 @no_design_blocks = true
165 @message = message 162 @message = message
166 @title = title 163 @title = title
167 - render :template => 'shared/access_denied.rhtml', :status => 403 164 + render :template => 'shared/access_denied.html.erb', :status => 403
168 end 165 end
169 166
170 def load_category 167 def load_category
171 unless params[:category_path].blank? 168 unless params[:category_path].blank?
172 - path = params[:category_path].join('/') 169 + path = params[:category_path]
173 @category = environment.categories.find_by_path(path) 170 @category = environment.categories.find_by_path(path)
174 if @category.nil? 171 if @category.nil?
175 render_not_found(path) 172 render_not_found(path)
app/controllers/embed_controller.rb
@@ -4,10 +4,10 @@ class EmbedController &lt; ApplicationController @@ -4,10 +4,10 @@ class EmbedController &lt; ApplicationController
4 def block 4 def block
5 @block = Block.find(params[:id]) 5 @block = Block.find(params[:id])
6 if !@block.embedable? || !@block.visible? 6 if !@block.embedable? || !@block.visible?
7 - render 'unavailable.rhtml', :status => 403 7 + render 'unavailable', :status => 403
8 end 8 end
9 rescue ActiveRecord::RecordNotFound 9 rescue ActiveRecord::RecordNotFound
10 - render 'not_found.rhtml', :status => 404 10 + render 'not_found', :status => 404
11 end 11 end
12 12
13 end 13 end
app/controllers/my_profile/cms_controller.rb
@@ -53,8 +53,7 @@ class CmsController &lt; MyProfileController @@ -53,8 +53,7 @@ class CmsController &lt; MyProfileController
53 conditions = ['type != ?', 'RssFeed'] 53 conditions = ['type != ?', 'RssFeed']
54 end 54 end
55 55
56 - @articles = @article.children.paginate(  
57 - :order => "case when type = 'Folder' then 0 when type ='Blog' then 1 else 2 end, updated_at DESC", 56 + @articles = @article.children.reorder("case when type = 'Folder' then 0 when type ='Blog' then 1 else 2 end, updated_at DESC, name").paginate(
58 :conditions => conditions, 57 :conditions => conditions,
59 :per_page => per_page, 58 :per_page => per_page,
60 :page => params[:npage] 59 :page => params[:npage]
@@ -145,6 +144,7 @@ class CmsController &lt; MyProfileController @@ -145,6 +144,7 @@ class CmsController &lt; MyProfileController
145 144
146 @article.profile = profile 145 @article.profile = profile
147 @article.last_changed_by = user 146 @article.last_changed_by = user
  147 + @article.created_by = user
148 148
149 translations if @article.translatable? 149 translations if @article.translatable?
150 150
@@ -188,7 +188,7 @@ class CmsController &lt; MyProfileController @@ -188,7 +188,7 @@ class CmsController &lt; MyProfileController
188 end 188 end
189 if request.post? && params[:uploaded_files] 189 if request.post? && params[:uploaded_files]
190 params[:uploaded_files].each do |file| 190 params[:uploaded_files].each do |file|
191 - @uploaded_files << UploadedFile.create(:uploaded_data => file, :profile => profile, :parent => @parent, :last_changed_by => user) unless file == '' 191 + @uploaded_files << UploadedFile.create({:uploaded_data => file, :profile => profile, :parent => @parent, :last_changed_by => user}, :without_protection => true) unless file == ''
192 end 192 end
193 @errors = @uploaded_files.select { |f| f.errors.any? } 193 @errors = @uploaded_files.select { |f| f.errors.any? }
194 if @errors.any? 194 if @errors.any?
@@ -210,7 +210,7 @@ class CmsController &lt; MyProfileController @@ -210,7 +210,7 @@ class CmsController &lt; MyProfileController
210 if request.post? 210 if request.post?
211 @article.destroy 211 @article.destroy
212 session[:notice] = _("\"#{@article.name}\" was removed.") 212 session[:notice] = _("\"#{@article.name}\" was removed.")
213 - referer = ActionController::Routing::Routes.recognize_path URI.parse(request.referer).path rescue nil 213 + referer = Rails.application.routes.recognize_path URI.parse(request.referer).path rescue nil
214 if referer and referer[:controller] == 'cms' and referer[:action] != 'edit' 214 if referer and referer[:controller] == 'cms' and referer[:action] != 'edit'
215 redirect_to referer 215 redirect_to referer
216 elsif @article.parent 216 elsif @article.parent
@@ -232,7 +232,7 @@ class CmsController &lt; MyProfileController @@ -232,7 +232,7 @@ class CmsController &lt; MyProfileController
232 @current_category = Category.find(params[:category_id]) 232 @current_category = Category.find(params[:category_id])
233 @categories = @current_category.children 233 @categories = @current_category.children
234 end 234 end
235 - render :partial => 'shared/select_categories', :locals => {:object_name => 'article', :multiple => true}, :layout => false 235 + render :template => 'shared/update_categories', :locals => { :category => @current_category }
236 end 236 end
237 237
238 def publish 238 def publish
@@ -253,7 +253,7 @@ class CmsController &lt; MyProfileController @@ -253,7 +253,7 @@ class CmsController &lt; MyProfileController
253 begin 253 begin
254 task.finish unless item[:group].moderated_articles? 254 task.finish unless item[:group].moderated_articles?
255 rescue Exception => ex 255 rescue Exception => ex
256 - @failed[ex.clean_message] ? @failed[ex.clean_message] << item[:group].name : @failed[ex.clean_message] = [item[:group].name] 256 + @failed[ex.message] ? @failed[ex.message] << item[:group].name : @failed[ex.message] = [item[:group].name]
257 end 257 end
258 end 258 end
259 if @failed.blank? 259 if @failed.blank?
app/controllers/my_profile/manage_products_controller.rb
@@ -48,6 +48,7 @@ class ManageProductsController &lt; ApplicationController @@ -48,6 +48,7 @@ class ManageProductsController &lt; ApplicationController
48 end 48 end
49 49
50 def new 50 def new
  51 + @no_design_blocks = true
51 @category = params[:selected_category_id] ? Category.find(params[:selected_category_id]) : nil 52 @category = params[:selected_category_id] ? Category.find(params[:selected_category_id]) : nil
52 @product = @profile.products.build(:product_category => @category) 53 @product = @profile.products.build(:product_category => @category)
53 @categories = ProductCategory.top_level_for(environment) 54 @categories = ProductCategory.top_level_for(environment)
@@ -85,7 +86,7 @@ class ManageProductsController &lt; ApplicationController @@ -85,7 +86,7 @@ class ManageProductsController &lt; ApplicationController
85 @edit = true 86 @edit = true
86 @level = @category.level 87 @level = @category.level
87 if request.post? 88 if request.post?
88 - if @product.update_attributes(:product_category_id => params[:selected_category_id]) 89 + if @product.update_attributes({:product_category_id => params[:selected_category_id]}, :without_protection => true)
89 render :partial => 'shared/redirect_via_javascript', 90 render :partial => 'shared/redirect_via_javascript',
90 :locals => { :url => url_for(:controller => 'manage_products', :action => 'show', :id => @product) } 91 :locals => { :url => url_for(:controller => 'manage_products', :action => 'show', :id => @product) }
91 else 92 else
@@ -207,7 +208,7 @@ class ManageProductsController &lt; ApplicationController @@ -207,7 +208,7 @@ class ManageProductsController &lt; ApplicationController
207 }.to_json 208 }.to_json
208 else 209 else
209 render :text => {:ok => false, 210 render :text => {:ok => false,
210 - :error_msg => _(cost.errors['name']) % {:fn => _('Name')} 211 + :error_msg => _(cost.errors['name'].join('\n')) % {:fn => _('Name')}
211 }.to_json 212 }.to_json
212 end 213 end
213 end 214 end
app/controllers/my_profile/memberships_controller.rb
@@ -20,7 +20,7 @@ class MembershipsController &lt; MyProfileController @@ -20,7 +20,7 @@ class MembershipsController &lt; MyProfileController
20 @community.environment = environment 20 @community.environment = environment
21 @back_to = params[:back_to] || url_for(:action => 'index') 21 @back_to = params[:back_to] || url_for(:action => 'index')
22 if request.post? && @community.valid? 22 if request.post? && @community.valid?
23 - @community = Community.create_after_moderation(user, {:environment => environment}.merge(params[:community])) 23 + @community = Community.create_after_moderation(user, params[:community].merge({:environment => environment}))
24 redirect_to @back_to 24 redirect_to @back_to
25 return 25 return
26 end 26 end
app/controllers/my_profile/profile_design_controller.rb
@@ -9,14 +9,8 @@ class ProfileDesignController &lt; BoxOrganizerController @@ -9,14 +9,8 @@ class ProfileDesignController &lt; BoxOrganizerController
9 9
10 blocks += plugins.dispatch(:extra_blocks) 10 blocks += plugins.dispatch(:extra_blocks)
11 11
12 - # blocks exclusive for organizations  
13 - if profile.has_members?  
14 - blocks << MembersBlock  
15 - end  
16 -  
17 # blocks exclusive to people 12 # blocks exclusive to people
18 if profile.person? 13 if profile.person?
19 - blocks << FriendsBlock  
20 blocks << FavoriteEnterprisesBlock 14 blocks << FavoriteEnterprisesBlock
21 blocks << CommunitiesBlock 15 blocks << CommunitiesBlock
22 blocks << EnterprisesBlock 16 blocks << EnterprisesBlock
app/controllers/my_profile/profile_editor_controller.rb
@@ -15,20 +15,14 @@ class ProfileEditorController &lt; MyProfileController @@ -15,20 +15,14 @@ class ProfileEditorController &lt; MyProfileController
15 @possible_domains = profile.possible_domains 15 @possible_domains = profile.possible_domains
16 if request.post? 16 if request.post?
17 params[:profile_data][:fields_privacy] ||= {} if profile.person? && params[:profile_data].is_a?(Hash) 17 params[:profile_data][:fields_privacy] ||= {} if profile.person? && params[:profile_data].is_a?(Hash)
18 - begin  
19 - Profile.transaction do  
20 - Image.transaction do  
21 - if profile.update_attributes!(params[:profile_data])  
22 - redirect_to :action => 'index', :profile => profile.identifier  
23 - end 18 + Profile.transaction do
  19 + Image.transaction do
  20 + if @profile_data.update_attributes(params[:profile_data])
  21 + redirect_to :action => 'index', :profile => profile.identifier
  22 + else
  23 + profile.identifier = params[:profile] if profile.identifier.blank?
24 end 24 end
25 - end  
26 - rescue Exception => ex  
27 - if profile.identifier.blank?  
28 - profile.identifier = params[:profile]  
29 - end  
30 - session[:notice] = _('Cannot update profile')  
31 - logger.error ex.to_s 25 + end
32 end 26 end
33 end 27 end
34 end 28 end
@@ -60,7 +54,7 @@ class ProfileEditorController &lt; MyProfileController @@ -60,7 +54,7 @@ class ProfileEditorController &lt; MyProfileController
60 @current_category = Category.find(params[:category_id]) 54 @current_category = Category.find(params[:category_id])
61 @categories = @current_category.children 55 @categories = @current_category.children
62 end 56 end
63 - render :partial => 'shared/select_categories', :locals => {:object_name => 'profile_data', :multiple => true}, :layout => false 57 + render :template => 'shared/update_categories', :locals => { :category => @current_category }
64 end 58 end
65 59
66 def header_footer 60 def header_footer
app/controllers/my_profile/tasks_controller.rb
@@ -27,7 +27,7 @@ class TasksController &lt; MyProfileController @@ -27,7 +27,7 @@ class TasksController &lt; MyProfileController
27 task.send(decision) 27 task.send(decision)
28 rescue Exception => ex 28 rescue Exception => ex
29 message = "#{task.title} (#{task.requestor ? task.requestor.name : task.author_name})" 29 message = "#{task.title} (#{task.requestor ? task.requestor.name : task.author_name})"
30 - failed[ex.clean_message] ? failed[ex.clean_message] << message : failed[ex.clean_message] = [message] 30 + failed[ex.message] ? failed[ex.message] << message : failed[ex.message] = [message]
31 end 31 end
32 end 32 end
33 end 33 end
app/controllers/public/account_controller.rb
@@ -17,6 +17,8 @@ class AccountController &lt; ApplicationController @@ -17,6 +17,8 @@ class AccountController &lt; ApplicationController
17 @user = User.find_by_activation_code(params[:activation_code]) if params[:activation_code] 17 @user = User.find_by_activation_code(params[:activation_code]) if params[:activation_code]
18 if @user and @user.activate 18 if @user and @user.activate
19 @message = _("Your account has been activated, now you can log in!") 19 @message = _("Your account has been activated, now you can log in!")
  20 + check_redirection
  21 + session[:join] = params[:join] unless params[:join].blank?
20 render :action => 'login', :userlogin => @user.login 22 render :action => 'login', :userlogin => @user.login
21 else 23 else
22 session[:notice] = _("It looks like you're trying to activate an account. Perhaps have already activated this account?") 24 session[:notice] = _("It looks like you're trying to activate an account. Perhaps have already activated this account?")
@@ -35,6 +37,7 @@ class AccountController &lt; ApplicationController @@ -35,6 +37,7 @@ class AccountController &lt; ApplicationController
35 self.current_user ||= User.authenticate(params[:user][:login], params[:user][:password], environment) if params[:user] 37 self.current_user ||= User.authenticate(params[:user][:login], params[:user][:password], environment) if params[:user]
36 38
37 if logged_in? 39 if logged_in?
  40 + check_join_in_community(self.current_user)
38 if params[:remember_me] == "1" 41 if params[:remember_me] == "1"
39 self.current_user.remember_me 42 self.current_user.remember_me
40 cookies[:auth_token] = { :value => self.current_user.remember_token , :expires => self.current_user.remember_token_expires_at } 43 cookies[:auth_token] = { :value => self.current_user.remember_token , :expires => self.current_user.remember_token_expires_at }
@@ -91,6 +94,7 @@ class AccountController &lt; ApplicationController @@ -91,6 +94,7 @@ class AccountController &lt; ApplicationController
91 if session[:may_be_a_bot] 94 if session[:may_be_a_bot]
92 return false unless verify_recaptcha :model=>@user, :message=>_('Captcha (the human test)') 95 return false unless verify_recaptcha :model=>@user, :message=>_('Captcha (the human test)')
93 end 96 end
  97 + @user.community_to_join = session[:join]
94 @user.signup! 98 @user.signup!
95 owner_role = Role.find_by_name('owner') 99 owner_role = Role.find_by_name('owner')
96 @user.person.affiliate(@user.person, [owner_role]) if owner_role 100 @user.person.affiliate(@user.person, [owner_role]) if owner_role
@@ -101,6 +105,7 @@ class AccountController &lt; ApplicationController @@ -101,6 +105,7 @@ class AccountController &lt; ApplicationController
101 end 105 end
102 if @user.activated? 106 if @user.activated?
103 self.current_user = @user 107 self.current_user = @user
  108 + check_join_in_community(@user)
104 go_to_signup_initial_page 109 go_to_signup_initial_page
105 else 110 else
106 @register_pending = true 111 @register_pending = true
@@ -135,12 +140,8 @@ class AccountController &lt; ApplicationController @@ -135,12 +140,8 @@ class AccountController &lt; ApplicationController
135 params[:new_password_confirmation]) 140 params[:new_password_confirmation])
136 session[:notice] = _('Your password has been changed successfully!') 141 session[:notice] = _('Your password has been changed successfully!')
137 redirect_to :action => 'index' 142 redirect_to :action => 'index'
138 - rescue User::IncorrectPassword => e  
139 - session[:notice] = _('The supplied current password is incorrect.')  
140 - render :action => 'change_password' 143 + rescue Exception
141 end 144 end
142 - else  
143 - render :action => 'change_password'  
144 end 145 end
145 end 146 end
146 147
@@ -166,12 +167,12 @@ class AccountController &lt; ApplicationController @@ -166,12 +167,12 @@ class AccountController &lt; ApplicationController
166 render :action => 'password_recovery_sent' 167 render :action => 'password_recovery_sent'
167 rescue ActiveRecord::RecordNotFound 168 rescue ActiveRecord::RecordNotFound
168 if params[:value].blank? 169 if params[:value].blank?
169 - @change_password.errors.add_to_base(_('Can not recover user password with blank value.')) 170 + @change_password.errors[:base] << _('Can not recover user password with blank value.')
170 else 171 else
171 - @change_password.errors.add_to_base(_('Could not find any user with %s equal to "%s".') % [fields_label, params[:value]]) 172 + @change_password.errors[:base] << _('Could not find any user with %s equal to "%s".') % [fields_label, params[:value]]
172 end 173 end
173 rescue ActiveRecord::RecordInvald 174 rescue ActiveRecord::RecordInvald
174 - @change_password.errors.add_to_base(_('Could not perform password recovery for the user.')) 175 + @change_password.errors[:base] << _('Could not perform password recovery for the user.')
175 end 176 end
176 end 177 end
177 end 178 end
@@ -392,12 +393,6 @@ class AccountController &lt; ApplicationController @@ -392,12 +393,6 @@ class AccountController &lt; ApplicationController
392 end 393 end
393 394
394 def go_to_initial_page 395 def go_to_initial_page
395 - if params[:redirection]  
396 - session[:return_to] = @user.return_to  
397 - @user.return_to = nil  
398 - @user.save  
399 - end  
400 -  
401 if params[:return_to] 396 if params[:return_to]
402 redirect_to params[:return_to] 397 redirect_to params[:return_to]
403 elsif environment.enabled?('allow_change_of_redirection_after_login') 398 elsif environment.enabled?('allow_change_of_redirection_after_login')
@@ -448,4 +443,19 @@ class AccountController &lt; ApplicationController @@ -448,4 +443,19 @@ class AccountController &lt; ApplicationController
448 redirect_back_or_default(default) 443 redirect_back_or_default(default)
449 end 444 end
450 end 445 end
  446 +
  447 + def check_redirection
  448 + unless params[:redirection].blank?
  449 + session[:return_to] = @user.return_to
  450 + @user.update_attributes(:return_to => nil)
  451 + end
  452 + end
  453 +
  454 + def check_join_in_community(user)
  455 + profile_to_join = session[:join]
  456 + unless profile_to_join.blank?
  457 + environment.profiles.find_by_identifier(profile_to_join).add_member(user.person)
  458 + session.delete(:join)
  459 + end
  460 + end
451 end 461 end
app/controllers/public/chat_controller.rb
@@ -19,7 +19,7 @@ class ChatController &lt; PublicController @@ -19,7 +19,7 @@ class ChatController &lt; PublicController
19 def avatar 19 def avatar
20 profile = environment.profiles.find_by_identifier(params[:id]) 20 profile = environment.profiles.find_by_identifier(params[:id])
21 filename, mimetype = profile_icon(profile, :minor, true) 21 filename, mimetype = profile_icon(profile, :minor, true)
22 - data = File.read(File.join(RAILS_ROOT, 'public', filename)) 22 + data = File.read(File.join(Rails.root, 'public', filename))
23 render :text => data, :layout => false, :content_type => mimetype 23 render :text => data, :layout => false, :content_type => mimetype
24 expires_in 24.hours 24 expires_in 24.hours
25 end 25 end
app/controllers/public/content_viewer_controller.rb
  1 +require 'diffy'
  2 +
1 class ContentViewerController < ApplicationController 3 class ContentViewerController < ApplicationController
2 4
3 needs_profile 5 needs_profile
@@ -6,7 +8,9 @@ class ContentViewerController &lt; ApplicationController @@ -6,7 +8,9 @@ class ContentViewerController &lt; ApplicationController
6 helper TagsHelper 8 helper TagsHelper
7 9
8 def view_page 10 def view_page
9 - path = params[:page].join('/') 11 + path = params[:page]
  12 + path = path.join('/') if path.kind_of?(Array)
  13 + path = "#{path}.#{params[:format]}" if params[:format]
10 @version = params[:version].to_i 14 @version = params[:version].to_i
11 15
12 if path.blank? 16 if path.blank?
@@ -32,12 +36,12 @@ class ContentViewerController &lt; ApplicationController @@ -32,12 +36,12 @@ class ContentViewerController &lt; ApplicationController
32 return render_access_denied unless @page.display_versions? 36 return render_access_denied unless @page.display_versions?
33 @versioned_article = @page.versions.find_by_version(@version) 37 @versioned_article = @page.versions.find_by_version(@version)
34 if @versioned_article && @page.versions.latest.version != @versioned_article.version 38 if @versioned_article && @page.versions.latest.version != @versioned_article.version
35 - render :template => 'content_viewer/versioned_article.rhtml' 39 + render :template => 'content_viewer/versioned_article.html.erb'
36 return 40 return
37 end 41 end
38 end 42 end
39 43
40 - redirect_to_translation if @page.profile.redirect_l10n 44 + redirect_to_translation and return if @page.profile.redirect_l10n
41 45
42 if request.post? 46 if request.post?
43 if @page.forum? && @page.has_terms_of_use && params[:terms_accepted] == "true" 47 if @page.forum? && @page.has_terms_of_use && params[:terms_accepted] == "true"
@@ -87,7 +91,7 @@ class ContentViewerController &lt; ApplicationController @@ -87,7 +91,7 @@ class ContentViewerController &lt; ApplicationController
87 blog_with_translation = @page.blog? && @page.display_posts_in_current_language? 91 blog_with_translation = @page.blog? && @page.display_posts_in_current_language?
88 posts = posts.native_translations if blog_with_translation 92 posts = posts.native_translations if blog_with_translation
89 93
90 - @posts = posts.paginate({ :page => params[:npage], :per_page => @page.posts_per_page }.merge(Article.display_filter(user, profile))) 94 + @posts = posts.paginate({ :page => params[:npage], :per_page => @page.posts_per_page }.merge(Article.display_filter(user, profile))).to_a
91 95
92 if blog_with_translation 96 if blog_with_translation
93 @posts.replace @posts.map{ |p| p.get_translation_to(FastGettext.locale) }.compact 97 @posts.replace @posts.map{ |p| p.get_translation_to(FastGettext.locale) }.compact
@@ -123,12 +127,20 @@ class ContentViewerController &lt; ApplicationController @@ -123,12 +127,20 @@ class ContentViewerController &lt; ApplicationController
123 127
124 if params[:slideshow] 128 if params[:slideshow]
125 render :action => 'slideshow', :layout => 'slideshow' 129 render :action => 'slideshow', :layout => 'slideshow'
  130 + return
126 end 131 end
  132 + render :view_page, :formats => [:html]
127 end 133 end
128 134
129 - def article_versions 135 + def versions_diff
130 path = params[:page].join('/') 136 path = params[:page].join('/')
131 @page = profile.articles.find_by_path(path) 137 @page = profile.articles.find_by_path(path)
  138 + @v1, @v2 = @page.versions.find_by_version(params[:v1]), @page.versions.find_by_version(params[:v2])
  139 + end
  140 +
  141 + def article_versions
  142 + path = params[:page]
  143 + @page = profile.articles.find_by_path(path)
132 return unless allow_access_to_page(path) 144 return unless allow_access_to_page(path)
133 145
134 render_access_denied unless @page.display_versions? 146 render_access_denied unless @page.display_versions?
@@ -173,7 +185,7 @@ class ContentViewerController &lt; ApplicationController @@ -173,7 +185,7 @@ class ContentViewerController &lt; ApplicationController
173 elsif !@page.display_to?(user) 185 elsif !@page.display_to?(user)
174 if !profile.public? 186 if !profile.public?
175 private_profile_partial_parameters 187 private_profile_partial_parameters
176 - render :template => 'profile/_private_profile.rhtml', :status => 403 188 + render :template => 'profile/_private_profile', :status => 403
177 allowed = false 189 allowed = false
178 else #if !profile.visible? 190 else #if !profile.visible?
179 render_access_denied 191 render_access_denied
@@ -191,5 +203,4 @@ class ContentViewerController &lt; ApplicationController @@ -191,5 +203,4 @@ class ContentViewerController &lt; ApplicationController
191 user_agent.match(/crawler/) || 203 user_agent.match(/crawler/) ||
192 user_agent.match(/\(.*https?:\/\/.*\)/) 204 user_agent.match(/\(.*https?:\/\/.*\)/)
193 end 205 end
194 -  
195 end 206 end
app/controllers/public/profile_controller.rb
@@ -3,7 +3,7 @@ class ProfileController &lt; PublicController @@ -3,7 +3,7 @@ class ProfileController &lt; PublicController
3 needs_profile 3 needs_profile
4 before_filter :check_access_to_profile, :except => [:join, :join_not_logged, :index, :add] 4 before_filter :check_access_to_profile, :except => [:join, :join_not_logged, :index, :add]
5 before_filter :store_location, :only => [:join, :join_not_logged, :report_abuse, :send_mail] 5 before_filter :store_location, :only => [:join, :join_not_logged, :report_abuse, :send_mail]
6 - before_filter :login_required, :only => [:add, :join, :join_not_logged, :leave, :unblock, :leave_scrap, :remove_scrap, :remove_activity, :view_more_activities, :view_more_network_activities, :report_abuse, :register_report, :leave_comment_on_activity, :send_mail] 6 + before_filter :login_required, :only => [:add, :join, :leave, :unblock, :leave_scrap, :remove_scrap, :remove_activity, :view_more_activities, :view_more_network_activities, :report_abuse, :register_report, :leave_comment_on_activity, :send_mail]
7 7
8 helper TagsHelper 8 helper TagsHelper
9 9
@@ -32,7 +32,7 @@ class ProfileController &lt; PublicController @@ -32,7 +32,7 @@ class ProfileController &lt; PublicController
32 @tag = params[:id] 32 @tag = params[:id]
33 @tag_cache_key = "tag_#{CGI.escape(@tag.to_s)}_#{profile.id.to_s}_page_#{params[:npage]}" 33 @tag_cache_key = "tag_#{CGI.escape(@tag.to_s)}_#{profile.id.to_s}_page_#{params[:npage]}"
34 if is_cache_expired?(@tag_cache_key) 34 if is_cache_expired?(@tag_cache_key)
35 - @tagged = profile.find_tagged_with(@tag).paginate(:per_page => 20, :page => params[:npage]) 35 + @tagged = profile.tagged_with(@tag).paginate(:per_page => 20, :page => params[:npage])
36 end 36 end
37 end 37 end
38 38
@@ -97,21 +97,12 @@ class ProfileController &lt; PublicController @@ -97,21 +97,12 @@ class ProfileController &lt; PublicController
97 end 97 end
98 98
99 def join_not_logged 99 def join_not_logged
100 - if request.post?  
101 - profile.add_member(user)  
102 - session[:notice] = _('%s administrator still needs to accept you as member.') % profile.name if profile.closed?  
103 - redirect_to_previous_location 100 + session[:join] = profile.identifier
  101 +
  102 + if user
  103 + redirect_to :controller => 'profile', :action => 'join'
104 else 104 else
105 - if user.memberships.include?(profile)  
106 - session[:notice] = _('You are already a member of %s.') % profile.name  
107 - redirect_to profile.url  
108 - return  
109 - end  
110 - if request.xhr?  
111 - render :layout => false  
112 - else  
113 - redirect_to profile.url  
114 - end 105 + redirect_to :controller => '/account', :action => 'login'
115 end 106 end
116 end 107 end
117 108
@@ -167,7 +158,7 @@ class ProfileController &lt; PublicController @@ -167,7 +158,7 @@ class ProfileController &lt; PublicController
167 session[:notice] = _("You have unblocked %s successfully. ") % profile.name 158 session[:notice] = _("You have unblocked %s successfully. ") % profile.name
168 redirect_to :controller => 'profile', :action => 'index' 159 redirect_to :controller => 'profile', :action => 'index'
169 else 160 else
170 - message = __('You are not allowed to unblock enterprises in this environment.') 161 + message = _('You are not allowed to unblock enterprises in this environment.')
171 render_access_denied(message) 162 render_access_denied(message)
172 end 163 end
173 end 164 end
@@ -219,7 +210,7 @@ class ProfileController &lt; PublicController @@ -219,7 +210,7 @@ class ProfileController &lt; PublicController
219 210
220 render :update do |page| 211 render :update do |page|
221 page.insert_html :bottom, 'profile-wall-activities-comments-'+params[:activity], 212 page.insert_html :bottom, 'profile-wall-activities-comments-'+params[:activity],
222 - :partial => 'comment', :collection => activity.comments.paginate(:per_page => comments_per_page, :page => comment_page) 213 + :partial => 'comment', :collection => activity.comments.flatten.paginate(:per_page => comments_per_page, :page => comment_page)
223 214
224 if no_more_pages 215 if no_more_pages
225 page.remove 'profile-wall-activities-comments-more-'+params[:activity] 216 page.remove 'profile-wall-activities-comments-more-'+params[:activity]
app/controllers/public/search_controller.rb
@@ -29,7 +29,7 @@ class SearchController &lt; PublicController @@ -29,7 +29,7 @@ class SearchController &lt; PublicController
29 @asset = key 29 @asset = key
30 send(key) 30 send(key)
31 @order << key 31 @order << key
32 - @names[key] = getterm(description) 32 + @names[key] = _(description)
33 end 33 end
34 @asset = nil 34 @asset = nil
35 35
@@ -80,7 +80,7 @@ class SearchController &lt; PublicController @@ -80,7 +80,7 @@ class SearchController &lt; PublicController
80 end 80 end
81 81
82 def enterprises 82 def enterprises
83 - @scope = visible_profiles(Enterprise, [{:products => :product_category}]) 83 + @scope = visible_profiles(Enterprise)
84 full_text_search 84 full_text_search
85 end 85 end
86 86
@@ -133,7 +133,7 @@ class SearchController &lt; PublicController @@ -133,7 +133,7 @@ class SearchController &lt; PublicController
133 @tag = params[:tag] 133 @tag = params[:tag]
134 @tag_cache_key = "tag_#{CGI.escape(@tag.to_s)}_env_#{environment.id.to_s}_page_#{params[:npage]}" 134 @tag_cache_key = "tag_#{CGI.escape(@tag.to_s)}_env_#{environment.id.to_s}_page_#{params[:npage]}"
135 if is_cache_expired?(@tag_cache_key) 135 if is_cache_expired?(@tag_cache_key)
136 - @searches[@asset] = {:results => environment.articles.find_tagged_with(@tag).paginate(paginate_options)} 136 + @searches[@asset] = {:results => environment.articles.tagged_with(@tag).paginate(paginate_options)}
137 end 137 end
138 end 138 end
139 139
@@ -159,7 +159,7 @@ class SearchController &lt; PublicController @@ -159,7 +159,7 @@ class SearchController &lt; PublicController
159 if params[:category_path].blank? 159 if params[:category_path].blank?
160 render_not_found if params[:action] == 'category_index' 160 render_not_found if params[:action] == 'category_index'
161 else 161 else
162 - path = params[:category_path].join('/') 162 + path = params[:category_path]
163 @category = environment.categories.find_by_path(path) 163 @category = environment.categories.find_by_path(path)
164 if @category.nil? 164 if @category.nil?
165 render_not_found(path) 165 render_not_found(path)
app/helpers/account_helper.rb
@@ -15,12 +15,17 @@ module AccountHelper @@ -15,12 +15,17 @@ module AccountHelper
15 15
16 def suggestion_based_on_username(requested_username='') 16 def suggestion_based_on_username(requested_username='')
17 return "" if requested_username.empty? 17 return "" if requested_username.empty?
  18 +
  19 + requested_username = requested_username.downcase.tr("^#{Profile::IDENTIFIER_FORMAT}", '')
18 usernames = [] 20 usernames = []
  21 + tries = 0
19 3.times do 22 3.times do
20 begin 23 begin
21 valid_name = requested_username + rand(1000).to_s 24 valid_name = requested_username + rand(1000).to_s
22 - end while (usernames.include?(valid_name) || !Person.is_available?(valid_name, environment))  
23 - usernames << valid_name 25 + tries += 1
  26 + invalid = usernames.include?(valid_name) || !Person.is_available?(valid_name, environment)
  27 + end while tries <= 10 && invalid
  28 + usernames << valid_name unless invalid
24 end 29 end
25 usernames 30 usernames
26 end 31 end
app/helpers/application_helper.rb
  1 +# encoding: UTF-8
  2 +
1 require 'redcloth' 3 require 'redcloth'
2 4
3 # Methods added to this helper will be available to all templates in the 5 # Methods added to this helper will be available to all templates in the
@@ -175,7 +177,7 @@ module ApplicationHelper @@ -175,7 +177,7 @@ module ApplicationHelper
175 # should be a current profile (i.e. while viewing some profile's pages, or the 177 # should be a current profile (i.e. while viewing some profile's pages, or the
176 # profile info, etc), because if there is no profile an exception is thrown. 178 # profile info, etc), because if there is no profile an exception is thrown.
177 def profile 179 def profile
178 - @controller.send(:profile) 180 + controller.send(:profile)
179 end 181 end
180 182
181 def category_color 183 def category_color
@@ -277,10 +279,9 @@ module ApplicationHelper @@ -277,10 +279,9 @@ module ApplicationHelper
277 options[:class].nil? ? 279 options[:class].nil? ?
278 options[:class]='button-bar' : 280 options[:class]='button-bar' :
279 options[:class]+=' button-bar' 281 options[:class]+=' button-bar'
280 - concat(content_tag('div', capture(&block) + tag('br', :style => 'clear: left;'), options)) 282 + concat(content_tag('div', capture(&block).to_s + tag('br', :style => 'clear: left;'), options))
281 end 283 end
282 284
283 - VIEW_EXTENSIONS = %w[.rhtml .html.erb]  
284 285
285 def partial_for_class_in_view_path(klass, view_path, prefix = nil, suffix = nil) 286 def partial_for_class_in_view_path(klass, view_path, prefix = nil, suffix = nil)
286 return nil if klass.nil? 287 return nil if klass.nil?
@@ -294,10 +295,8 @@ module ApplicationHelper @@ -294,10 +295,8 @@ module ApplicationHelper
294 search_name = "_" + search_name 295 search_name = "_" + search_name
295 end 296 end
296 297
297 - VIEW_EXTENSIONS.each do |ext|  
298 - path = defined?(params) && params[:controller] ? File.join(view_path, params[:controller], search_name+ext) : File.join(view_path, search_name+ext)  
299 - return name if File.exists?(File.join(path))  
300 - end 298 + path = defined?(params) && params[:controller] ? File.join(view_path, params[:controller], search_name + '.html.erb') : File.join(view_path, search_name + '.html.erb')
  299 + return name if File.exists?(File.join(path))
301 300
302 partial_for_class_in_view_path(klass.superclass, view_path, prefix, suffix) 301 partial_for_class_in_view_path(klass.superclass, view_path, prefix, suffix)
303 end 302 end
@@ -305,7 +304,7 @@ module ApplicationHelper @@ -305,7 +304,7 @@ module ApplicationHelper
305 def partial_for_class(klass, prefix=nil, suffix=nil) 304 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? 305 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 306 name = klass.name.underscore
308 - @controller.view_paths.each do |view_path| 307 + controller.view_paths.reverse_each do |view_path|
309 partial = partial_for_class_in_view_path(klass, view_path, prefix, suffix) 308 partial = partial_for_class_in_view_path(klass, view_path, prefix, suffix)
310 return partial if partial 309 return partial if partial
311 end 310 end
@@ -317,15 +316,13 @@ module ApplicationHelper @@ -317,15 +316,13 @@ module ApplicationHelper
317 raise ArgumentError, 'No profile actions view for this class.' if klass.nil? 316 raise ArgumentError, 'No profile actions view for this class.' if klass.nil?
318 317
319 name = klass.name.underscore 318 name = klass.name.underscore
320 - VIEW_EXTENSIONS.each do |ext|  
321 - return "blocks/profile_info_actions/"+name+ext if File.exists?(File.join(RAILS_ROOT, 'app', 'views', 'blocks', 'profile_info_actions', name+ext))  
322 - end 319 + return "blocks/profile_info_actions/" + name + '.html.erb' if File.exists?(Rails.root.join('app', 'views', 'blocks', 'profile_info_actions', name + '.html.erb'))
323 320
324 view_for_profile_actions(klass.superclass) 321 view_for_profile_actions(klass.superclass)
325 end 322 end
326 323
327 def user 324 def user
328 - @controller.send(:user) 325 + controller.send(:user)
329 end 326 end
330 327
331 # DEPRECATED. Do not use this. 328 # DEPRECATED. Do not use this.
@@ -337,7 +334,7 @@ module ApplicationHelper @@ -337,7 +334,7 @@ module ApplicationHelper
337 "\n" + 334 "\n" +
338 sources.flatten.map do |source| 335 sources.flatten.map do |source|
339 filename = filename_for_stylesheet(source.to_s, themed_source) 336 filename = filename_for_stylesheet(source.to_s, themed_source)
340 - if File.exists?(File.join(RAILS_ROOT, 'public', filename)) 337 + if File.exists?(Rails.root.join('public', filename[1..-1]))
341 "@import url(#{filename});\n" 338 "@import url(#{filename});\n"
342 else 339 else
343 "/* Not included: url(#{filename}) */\n" 340 "/* Not included: url(#{filename}) */\n"
@@ -378,10 +375,10 @@ module ApplicationHelper @@ -378,10 +375,10 @@ module ApplicationHelper
378 # utility for developers: set the theme to 'random' in development mode and 375 # utility for developers: set the theme to 'random' in development mode and
379 # you will get a different theme every request. This is interesting for 376 # you will get a different theme every request. This is interesting for
380 # testing 377 # testing
381 - if ENV['RAILS_ENV'] == 'development' && environment.theme == 'random' 378 + if Rails.env.development? && environment.theme == 'random'
382 @random_theme ||= Dir.glob('public/designs/themes/*').map { |f| File.basename(f) }.rand 379 @random_theme ||= Dir.glob('public/designs/themes/*').map { |f| File.basename(f) }.rand
383 @random_theme 380 @random_theme
384 - elsif ENV['RAILS_ENV'] == 'development' && respond_to?(:params) && params[:theme] && File.exists?(File.join(Rails.root, 'public/designs/themes', params[:theme])) 381 + elsif Rails.env.development? && respond_to?(:params) && params[:theme] && File.exists?(Rails.root.join('public/designs/themes', params[:theme]))
385 params[:theme] 382 params[:theme]
386 else 383 else
387 if profile && !profile.theme.nil? 384 if profile && !profile.theme.nil?
@@ -404,10 +401,10 @@ module ApplicationHelper @@ -404,10 +401,10 @@ module ApplicationHelper
404 end 401 end
405 402
406 def theme_view_file(template) 403 def theme_view_file(template)
407 - ['.rhtml', '.html.erb'].each do |ext|  
408 - file = (RAILS_ROOT + '/public' + theme_path + '/' + template + ext)  
409 - return file if File.exists?(file)  
410 - end 404 + # Since we cannot control what people are doing in external themes, we
  405 + # will keep looking for the deprecated .rhtml extension here.
  406 + file = Rails.root.join('public', theme_path[1..-1], template + '.html.erb')
  407 + return file if File.exists?(file)
411 nil 408 nil
412 end 409 end
413 410
@@ -423,7 +420,7 @@ module ApplicationHelper @@ -423,7 +420,7 @@ module ApplicationHelper
423 420
424 def theme_favicon 421 def theme_favicon
425 return '/designs/themes/' + current_theme + '/favicon.ico' if profile.nil? || profile.theme.nil? 422 return '/designs/themes/' + current_theme + '/favicon.ico' if profile.nil? || profile.theme.nil?
426 - if File.exists?(File.join(RAILS_ROOT, 'public', theme_path, 'favicon.ico')) 423 + if File.exists?(Rails.root.join('public', theme_path, 'favicon.ico'))
427 '/designs/themes/' + profile.theme + '/favicon.ico' 424 '/designs/themes/' + profile.theme + '/favicon.ico'
428 else 425 else
429 favicon = profile.articles.find_by_path('favicon.ico') 426 favicon = profile.articles.find_by_path('favicon.ico')
@@ -452,7 +449,7 @@ module ApplicationHelper @@ -452,7 +449,7 @@ module ApplicationHelper
452 end 449 end
453 450
454 def is_testing_theme 451 def is_testing_theme
455 - !@controller.session[:theme].nil? 452 + !controller.session[:theme].nil?
456 end 453 end
457 454
458 def theme_owner 455 def theme_owner
@@ -493,7 +490,7 @@ module ApplicationHelper @@ -493,7 +490,7 @@ module ApplicationHelper
493 end 490 end
494 491
495 def default_or_themed_icon(icon) 492 def default_or_themed_icon(icon)
496 - if File.exists?(File.join(Rails.root, 'public', theme_path, icon)) 493 + if File.exists?(Rails.root.join('public', theme_path, icon))
497 theme_path + icon 494 theme_path + icon
498 else 495 else
499 icon 496 icon
@@ -514,24 +511,25 @@ module ApplicationHelper @@ -514,24 +511,25 @@ module ApplicationHelper
514 511
515 def profile_cat_icons( profile ) 512 def profile_cat_icons( profile )
516 if profile.class == Enterprise 513 if profile.class == Enterprise
517 - icons = profile.product_categories.map{ |c| c.size > 1 ? c[1] : nil }.  
518 - compact.uniq.map do |c|  
519 - cat_name = c.gsub( /[-_\s,.;'"]+/, '_' )  
520 - cat_icon = "/images/icons-cat/#{cat_name}.png"  
521 - if ! File.exists? RAILS_ROOT.to_s() + '/public/' + cat_icon  
522 - cat_icon = '/images/icons-cat/undefined.png'  
523 - end  
524 - content_tag('span',  
525 - content_tag( 'span', c ),  
526 - :title => c,  
527 - :class => 'product-cat-icon cat_icon_' + cat_name,  
528 - :style => "background-image:url(#{cat_icon})"  
529 - )  
530 - end.join("\n").html_safe  
531 - content_tag('div',  
532 - content_tag( 'span', _('Principal Product Categories'), :class => 'header' ) +"\n"+ icons,  
533 - :class => 'product-category-icons' 514 + icons = profile.product_categories.unique_by_level(2).limit(3).map do |c|
  515 + filtered_category = c.filtered_category.blank? ? c.path.split('/').last : c.filtered_category
  516 + category_title = filtered_category.split(/[-_\s,.;'"]+/).map(&:capitalize).join(' ')
  517 + category_name = category_title.gsub(' ', '_' )
  518 + category_icon = "/images/icons-cat/#{category_name}.png"
  519 + if ! File.exists?(Rails.root.join('public', category_icon))
  520 + category_icon = '/images/icons-cat/undefined.png'
  521 + end
  522 + content_tag('span',
  523 + content_tag( 'span', category_title ),
  524 + :title => category_title,
  525 + :class => 'product-cat-icon cat_icon_' + category_name,
  526 + :style => "background-image:url(#{category_icon})"
534 ) 527 )
  528 + end.join("\n").html_safe
  529 + content_tag('div',
  530 + content_tag( 'span', _('Principal Product Categories'), :class => 'header' ) +"\n"+ icons,
  531 + :class => 'product-category-icons'
  532 + )
535 else 533 else
536 '' 534 ''
537 end 535 end
@@ -573,7 +571,7 @@ module ApplicationHelper @@ -573,7 +571,7 @@ module ApplicationHelper
573 # #profile_image) and its name below it. 571 # #profile_image) and its name below it.
574 def profile_image_link( profile, size=:portrait, tag='li', extra_info = nil ) 572 def profile_image_link( profile, size=:portrait, tag='li', extra_info = nil )
575 if content = @plugins.dispatch_first(:profile_image_link, profile, size, tag, extra_info) 573 if content = @plugins.dispatch_first(:profile_image_link, profile, size, tag, extra_info)
576 - return instance_eval(&content) 574 + return instance_exec(&content)
577 end 575 end
578 name = profile.short_name 576 name = profile.short_name
579 if profile.person? 577 if profile.person?
@@ -591,7 +589,7 @@ module ApplicationHelper @@ -591,7 +589,7 @@ module ApplicationHelper
591 extra_info = extra_info.nil? ? '' : content_tag( 'span', extra_info, :class => 'extra_info' ) 589 extra_info = extra_info.nil? ? '' : content_tag( 'span', extra_info, :class => 'extra_info' )
592 links = links_for_balloon(profile) 590 links = links_for_balloon(profile)
593 content_tag('div', content_tag(tag, 591 content_tag('div', content_tag(tag,
594 - (environment.enabled?(:show_balloon_with_profile_links_when_clicked) ? link_to( content_tag( 'span', _('Profile links')), '#', :onclick => "toggleSubmenu(this, '#{profile.short_name}', #{links.to_json}); return false", :class => "menu-submenu-trigger #{trigger_class}", :url => url) : "") + 592 + (environment.enabled?(:show_balloon_with_profile_links_when_clicked) ? link_to( content_tag( 'span', _('Profile links')), '#', :onclick => "toggleSubmenu(this, '#{profile.short_name}', #{CGI::escapeHTML(links.to_json)}); return false", :class => "menu-submenu-trigger #{trigger_class}", :url => url) : "") +
595 link_to( 593 link_to(
596 content_tag( 'span', profile_image( profile, size ), :class => 'profile-image' ) + 594 content_tag( 'span', profile_image( profile, size ), :class => 'profile-image' ) +
597 content_tag( 'span', h(name), :class => ( profile.class == Person ? 'fn' : 'org' ) ) + 595 content_tag( 'span', h(name), :class => ( profile.class == Person ? 'fn' : 'org' ) ) +
@@ -623,7 +621,7 @@ module ApplicationHelper @@ -623,7 +621,7 @@ module ApplicationHelper
623 end 621 end
624 622
625 def theme_option(opt = nil) 623 def theme_option(opt = nil)
626 - conf = RAILS_ROOT.to_s() + 624 + conf = Rails.root.to_s() +
627 '/public' + theme_path + 625 '/public' + theme_path +
628 '/theme.yml' 626 '/theme.yml'
629 if File.exists?(conf) 627 if File.exists?(conf)
@@ -650,7 +648,7 @@ module ApplicationHelper @@ -650,7 +648,7 @@ module ApplicationHelper
650 lightbox_link_to '<span class="icon-menu-search"></span>'+ _('Search'), { 648 lightbox_link_to '<span class="icon-menu-search"></span>'+ _('Search'), {
651 :controller => 'search', 649 :controller => 'search',
652 :action => 'popup', 650 :action => 'popup',
653 - :category_path => (@category ? @category.explode_path : []) }, 651 + :category_path => (@category ? @category.explode_path : nil)},
654 :id => 'open_search' 652 :id => 'open_search'
655 end 653 end
656 end 654 end
@@ -662,7 +660,7 @@ module ApplicationHelper @@ -662,7 +660,7 @@ module ApplicationHelper
662 option.each do |file| 660 option.each do |file|
663 file = theme_path + 661 file = theme_path +
664 '/javascript/'+ file +'.js' 662 '/javascript/'+ file +'.js'
665 - if File.exists? RAILS_ROOT.to_s() +'/public'+ file 663 + if File.exists? Rails.root.to_s() +'/public'+ file
666 html << javascript_src_tag( file, {} ) 664 html << javascript_src_tag( file, {} )
667 else 665 else
668 html << '<!-- Not included: '+ file +' -->' 666 html << '<!-- Not included: '+ file +' -->'
@@ -673,7 +671,7 @@ module ApplicationHelper @@ -673,7 +671,7 @@ module ApplicationHelper
673 671
674 def theme_javascript_ng 672 def theme_javascript_ng
675 script = File.join(theme_path, 'theme.js') 673 script = File.join(theme_path, 'theme.js')
676 - if File.exists?(File.join(Rails.root, 'public', script)) 674 + if File.exists?(Rails.root.join('public', script))
677 javascript_include_tag script 675 javascript_include_tag script
678 else 676 else
679 nil 677 nil
@@ -736,6 +734,10 @@ module ApplicationHelper @@ -736,6 +734,10 @@ module ApplicationHelper
736 (field_helpers - %w(hidden_field)).each do |selector| 734 (field_helpers - %w(hidden_field)).each do |selector|
737 src = <<-END_SRC 735 src = <<-END_SRC
738 def #{selector}(field, *args, &proc) 736 def #{selector}(field, *args, &proc)
  737 + begin
  738 + object ||= @template.instance_variable_get("@"+object_name.to_s)
  739 + rescue
  740 + end
739 text = object.class.respond_to?(:human_attribute_name) && object.class.human_attribute_name(field.to_s) || field.to_s.humanize 741 text = object.class.respond_to?(:human_attribute_name) && object.class.human_attribute_name(field.to_s) || field.to_s.humanize
740 NoosferoFormBuilder::output_field(text, super) 742 NoosferoFormBuilder::output_field(text, super)
741 end 743 end
@@ -767,7 +769,7 @@ module ApplicationHelper @@ -767,7 +769,7 @@ module ApplicationHelper
767 end 769 end
768 } 770 }
769 html += "<br />\n".html_safe if line_size == 0 || ( values.size % line_size ) > 0 771 html += "<br />\n".html_safe if line_size == 0 || ( values.size % line_size ) > 0
770 - column = object.class.columns_hash[method.to_s] 772 + column = object.class.columns_hash[method.to_s] if object
771 text = 773 text =
772 ( column ? 774 ( column ?
773 column.human_name : 775 column.human_name :
@@ -803,9 +805,8 @@ module ApplicationHelper @@ -803,9 +805,8 @@ module ApplicationHelper
803 fields_for(name, object, { :builder => NoosferoFormBuilder }.merge(options), &proc) 805 fields_for(name, object, { :builder => NoosferoFormBuilder }.merge(options), &proc)
804 end 806 end
805 807
806 - def labelled_form_for(name, object = nil, options = {}, &proc)  
807 - object ||= instance_variable_get("@#{name}")  
808 - form_for(name, object, { :builder => NoosferoFormBuilder }.merge(options), &proc) 808 + def labelled_form_for(name, options = {}, &proc)
  809 + form_for(name, { :builder => NoosferoFormBuilder }.merge(options), &proc)
809 end 810 end
810 811
811 def optional_field(profile, name, field_html = nil, only_required = false, &block) 812 def optional_field(profile, name, field_html = nil, only_required = false, &block)
@@ -862,6 +863,7 @@ module ApplicationHelper @@ -862,6 +863,7 @@ module ApplicationHelper
862 article_helper = ActionView::Base.new 863 article_helper = ActionView::Base.new
863 article_helper.controller = controller 864 article_helper.controller = controller
864 article_helper.extend ArticleHelper 865 article_helper.extend ArticleHelper
  866 + article_helper.extend Rails.application.routes.url_helpers
865 begin 867 begin
866 class_name = article.class.name + 'Helper' 868 class_name = article.class.name + 'Helper'
867 klass = class_name.constantize 869 klass = class_name.constantize
@@ -887,19 +889,31 @@ module ApplicationHelper @@ -887,19 +889,31 @@ module ApplicationHelper
887 end 889 end
888 end 890 end
889 891
  892 + def icon_theme_stylesheet_path
  893 + icon_themes = []
  894 + theme_icon_themes = theme_option(:icon_theme) || []
  895 + for icon_theme in theme_icon_themes do
  896 + theme_path = "/designs/icons/#{icon_theme}/style.css"
  897 + if File.exists?(Rails.root.join('public', theme_path[1..-1]))
  898 + icon_themes << theme_path
  899 + end
  900 + end
  901 + icon_themes
  902 + end
  903 +
890 def page_title 904 def page_title
891 (@page ? @page.title + ' - ' : '') + 905 (@page ? @page.title + ' - ' : '') +
892 (@topic ? @topic.title + ' - ' : '') + 906 (@topic ? @topic.title + ' - ' : '') +
893 (@section ? @section.title + ' - ' : '') + 907 (@section ? @section.title + ' - ' : '') +
894 (@toc ? _('Online Manual') + ' - ' : '') + 908 (@toc ? _('Online Manual') + ' - ' : '') +
895 - (@controller.controller_name == 'chat' ? _('Chat') + ' - ' : '') + 909 + (controller.controller_name == 'chat' ? _('Chat') + ' - ' : '') +
896 (profile ? profile.short_name : environment.name) + 910 (profile ? profile.short_name : environment.name) +
897 (@category ? " - #{@category.full_name}" : '') 911 (@category ? " - #{@category.full_name}" : '')
898 end 912 end
899 913
900 # DEPRECATED. Do not use this. 914 # DEPRECATED. Do not use this.
901 def import_controller_stylesheets(options = {}) 915 def import_controller_stylesheets(options = {})
902 - stylesheet_import( "controller_"+ @controller.controller_name(), options ) 916 + stylesheet_import( "controller_"+ controller.controller_name(), options )
903 end 917 end
904 918
905 def link_to_email(email) 919 def link_to_email(email)
@@ -913,7 +927,7 @@ module ApplicationHelper @@ -913,7 +927,7 @@ module ApplicationHelper
913 def article_to_html(article, options = {}) 927 def article_to_html(article, options = {})
914 options.merge!(:page => params[:npage]) 928 options.merge!(:page => params[:npage])
915 content = article.to_html(options) 929 content = article.to_html(options)
916 - content = content.kind_of?(Proc) ? self.instance_eval(&content).html_safe : content.html_safe 930 + content = content.kind_of?(Proc) ? self.instance_exec(&content).html_safe : content.html_safe
917 filter_html(content, article) 931 filter_html(content, article)
918 end 932 end
919 933
@@ -947,14 +961,6 @@ module ApplicationHelper @@ -947,14 +961,6 @@ module ApplicationHelper
947 html 961 html
948 end 962 end
949 963
950 - def colorpicker_field(object_name, method, options = {})  
951 - text_field(object_name, method, options.merge(:class => 'colorpicker_field'))  
952 - end  
953 -  
954 - def colorpicker_field_tag(name, value = nil, options = {})  
955 - text_field_tag(name, value, options.merge(:class => 'colorpicker_field'))  
956 - end  
957 -  
958 def ui_icon(icon_class, extra_class = '') 964 def ui_icon(icon_class, extra_class = '')
959 "<span class='ui-icon #{icon_class} #{extra_class}' style='float:left; margin-right:7px;'></span>".html_safe 965 "<span class='ui-icon #{icon_class} #{extra_class}' style='float:left; margin-right:7px;'></span>".html_safe
960 end 966 end
@@ -968,7 +974,7 @@ module ApplicationHelper @@ -968,7 +974,7 @@ module ApplicationHelper
968 end 974 end
969 975
970 def jquery_theme 976 def jquery_theme
971 - theme_option(:jquery_theme) || 'smoothness_mod' 977 + theme_option(:jquery_theme) || 'smoothness'
972 end 978 end
973 979
974 def ui_error(message) 980 def ui_error(message)
@@ -1027,8 +1033,8 @@ module ApplicationHelper @@ -1027,8 +1033,8 @@ module ApplicationHelper
1027 links.push(_('New content') => colorbox_options({:href => url_for({:controller => 'cms', :action => 'new', :profile => current_user.login, :cms => true})})) 1033 links.push(_('New content') => colorbox_options({:href => url_for({:controller => 'cms', :action => 'new', :profile => current_user.login, :cms => true})}))
1028 end 1034 end
1029 1035
1030 - link_to(content_tag(:span, _('Contents'), :class => 'icon-menu-articles'), {:controller => "search", :action => 'contents', :category_path => ''}, :id => 'submenu-contents') +  
1031 - link_to(content_tag(:span, _('Contents menu')), '#', :onclick => "toggleSubmenu(this,'',#{links.to_json}); return false", :class => 'menu-submenu-trigger up', :id => 'submenu-contents-trigger') 1036 + link_to(content_tag(:span, _('Contents'), :class => 'icon-menu-articles'), {:controller => "search", :action => 'contents', :category_path => nil}, :id => 'submenu-contents') +
  1037 + link_to(content_tag(:span, _('Contents menu')), '#', :onclick => "toggleSubmenu(this,'',#{j links.to_json}); return false", :class => 'menu-submenu-trigger up', :id => 'submenu-contents-trigger')
1032 end 1038 end
1033 alias :browse_contents_menu :search_contents_menu 1039 alias :browse_contents_menu :search_contents_menu
1034 1040
@@ -1044,7 +1050,7 @@ module ApplicationHelper @@ -1044,7 +1050,7 @@ module ApplicationHelper
1044 end 1050 end
1045 1051
1046 link_to(content_tag(:span, _('People'), :class => 'icon-menu-people'), {:controller => "search", :action => 'people', :category_path => ''}, :id => 'submenu-people') + 1052 link_to(content_tag(:span, _('People'), :class => 'icon-menu-people'), {:controller => "search", :action => 'people', :category_path => ''}, :id => 'submenu-people') +
1047 - link_to(content_tag(:span, _('People menu')), '#', :onclick => "toggleSubmenu(this,'',#{links.to_json}); return false", :class => 'menu-submenu-trigger up', :id => 'submenu-people-trigger') 1053 + link_to(content_tag(:span, _('People menu')), '#', :onclick => "toggleSubmenu(this,'',#{j links.to_json}); return false", :class => 'menu-submenu-trigger up', :id => 'submenu-people-trigger')
1048 end 1054 end
1049 alias :browse_people_menu :search_people_menu 1055 alias :browse_people_menu :search_people_menu
1050 1056
@@ -1060,7 +1066,7 @@ module ApplicationHelper @@ -1060,7 +1066,7 @@ module ApplicationHelper
1060 end 1066 end
1061 1067
1062 link_to(content_tag(:span, _('Communities'), :class => 'icon-menu-community'), {:controller => "search", :action => 'communities'}, :id => 'submenu-communities') + 1068 link_to(content_tag(:span, _('Communities'), :class => 'icon-menu-community'), {:controller => "search", :action => 'communities'}, :id => 'submenu-communities') +
1063 - link_to(content_tag(:span, _('Communities menu')), '#', :onclick => "toggleSubmenu(this,'',#{links.to_json}); return false", :class => 'menu-submenu-trigger up', :id => 'submenu-communities-trigger') 1069 + link_to(content_tag(:span, _('Communities menu')), '#', :onclick => "toggleSubmenu(this,'',#{j links.to_json}); return false", :class => 'menu-submenu-trigger up', :id => 'submenu-communities-trigger')
1064 end 1070 end
1065 alias :browse_communities_menu :search_communities_menu 1071 alias :browse_communities_menu :search_communities_menu
1066 1072
@@ -1072,7 +1078,7 @@ module ApplicationHelper @@ -1072,7 +1078,7 @@ module ApplicationHelper
1072 def render_environment_features(folder) 1078 def render_environment_features(folder)
1073 result = '' 1079 result = ''
1074 environment.enabled_features.keys.each do |feature| 1080 environment.enabled_features.keys.each do |feature|
1075 - file = File.join(@controller.view_paths.last, 'shared', folder.to_s, "#{feature}.rhtml") 1081 + file = Rails.root.join('app/views/shared', folder.to_s, "#{feature}.html.erb")
1076 if File.exists?(file) 1082 if File.exists?(file)
1077 result << render(:file => file, :use_full_path => false) 1083 result << render(:file => file, :use_full_path => false)
1078 end 1084 end
@@ -1085,10 +1091,10 @@ module ApplicationHelper @@ -1085,10 +1091,10 @@ module ApplicationHelper
1085 link_to_all = nil 1091 link_to_all = nil
1086 if list.count > 5 1092 if list.count > 5
1087 list = list.first(5) 1093 list = list.first(5)
1088 - link_to_all = link_to(content_tag('strong', _('See all')), :controller => 'memberships', :profile => current_user.login) 1094 + link_to_all = link_to(content_tag('strong', _('See all')), :controller => 'memberships', :profile => user.identifier)
1089 end 1095 end
1090 link = list.map do |element| 1096 link = list.map do |element|
1091 - link_to(content_tag('strong', [_('<span>Manage</span> %s') % element.short_name(25)]), @environment.top_url + "/myprofile/#{element.identifier}", :class => "icon-menu-"+element.class.identification.underscore, :title => [_('Manage %s') % element.short_name]) 1097 + link_to(content_tag('strong', _('<span>Manage</span> %s') % element.short_name(25)), element.admin_url, :class => "icon-menu-"+element.class.identification.underscore, :title => _('Manage %s') % element.short_name)
1092 end 1098 end
1093 if link_to_all 1099 if link_to_all
1094 link << link_to_all 1100 link << link_to_all
@@ -1112,15 +1118,15 @@ module ApplicationHelper @@ -1112,15 +1118,15 @@ module ApplicationHelper
1112 pending_tasks_count = '' 1118 pending_tasks_count = ''
1113 count = user ? Task.to(user).pending.count : -1 1119 count = user ? Task.to(user).pending.count : -1
1114 if count > 0 1120 if count > 0
1115 - pending_tasks_count = link_to(count.to_s, @environment.top_url + '/myprofile/{login}/tasks', :id => 'pending-tasks-count', :title => _("Manage your pending tasks")) 1121 + pending_tasks_count = link_to(count.to_s, user.tasks_url, :id => 'pending-tasks-count', :title => _("Manage your pending tasks"))
1116 end 1122 end
1117 1123
1118 - (_("<span class='welcome'>Welcome,</span> %s") % link_to('<i style="background-image:url({avatar})"></i><strong>{login}</strong>', @environment.top_url + '/{login}', :id => "homepage-link", :title => _('Go to your homepage'))) + 1124 + (_("<span class='welcome'>Welcome,</span> %s") % link_to("<i style='background-image:url(#{user.profile_custom_icon(gravatar_default)})'></i><strong>#{user.identifier}</strong>", user.public_profile_url, :id => "homepage-link", :title => _('Go to your homepage'))) +
1119 render_environment_features(:usermenu) + 1125 render_environment_features(:usermenu) +
1120 - link_to('<i class="icon-menu-admin"></i><strong>' + _('Administration') + '</strong>', @environment.top_url + '/admin', :title => _("Configure the environment"), :class => 'admin-link', :style => 'display: none') + 1126 + link_to('<i class="icon-menu-admin"></i><strong>' + _('Administration') + '</strong>', @environment.admin_url, :title => _("Configure the environment"), :class => 'admin-link') +
1121 manage_enterprises.to_s + 1127 manage_enterprises.to_s +
1122 manage_communities.to_s + 1128 manage_communities.to_s +
1123 - link_to('<i class="icon-menu-ctrl-panel"></i><strong>' + _('Control panel') + '</strong>', @environment.top_url + '/myprofile/{login}', :class => 'ctrl-panel', :title => _("Configure your personal account and content")) + 1129 + link_to('<i class="icon-menu-ctrl-panel"></i><strong>' + _('Control panel') + '</strong>', user.admin_url, :class => 'ctrl-panel', :title => _("Configure your personal account and content")) +
1124 pending_tasks_count + 1130 pending_tasks_count +
1125 link_to('<i class="icon-menu-logout"></i><strong>' + _('Logout') + '</strong>', { :controller => 'account', :action => 'logout'} , :id => "logout", :title => _("Leave the system")) 1131 link_to('<i class="icon-menu-logout"></i><strong>' + _('Logout') + '</strong>', { :controller => 'account', :action => 'logout'} , :id => "logout", :title => _("Leave the system"))
1126 end 1132 end
@@ -1130,7 +1136,7 @@ module ApplicationHelper @@ -1130,7 +1136,7 @@ module ApplicationHelper
1130 text_area(object_name, method, { :id => text_area_id, :onkeyup => "limited_text_area('#{text_area_id}', #{limit})" }.merge(options)), 1136 text_area(object_name, method, { :id => text_area_id, :onkeyup => "limited_text_area('#{text_area_id}', #{limit})" }.merge(options)),
1131 content_tag(:p, content_tag(:span, limit) + ' ' + _(' characters left'), :id => text_area_id + '_left'), 1137 content_tag(:p, content_tag(:span, limit) + ' ' + _(' characters left'), :id => text_area_id + '_left'),
1132 content_tag(:p, _('Limit of characters reached'), :id => text_area_id + '_limit', :style => 'display: none') 1138 content_tag(:p, _('Limit of characters reached'), :id => text_area_id + '_limit', :style => 'display: none')
1133 - ], :class => 'limited-text-area') 1139 + ].join, :class => 'limited-text-area')
1134 end 1140 end
1135 1141
1136 def expandable_text_area(object_name, method, text_area_id, options = {}) 1142 def expandable_text_area(object_name, method, text_area_id, options = {})
@@ -1148,6 +1154,7 @@ module ApplicationHelper @@ -1148,6 +1154,7 @@ module ApplicationHelper
1148 #FIXME Use time_ago_in_words instead of this method if you're using Rails 2.2+ 1154 #FIXME Use time_ago_in_words instead of this method if you're using Rails 2.2+
1149 def time_ago_as_sentence(from_time, include_seconds = false) 1155 def time_ago_as_sentence(from_time, include_seconds = false)
1150 to_time = Time.now 1156 to_time = Time.now
  1157 + from_time = Time.parse(from_time.to_s)
1151 from_time = from_time.to_time if from_time.respond_to?(:to_time) 1158 from_time = from_time.to_time if from_time.respond_to?(:to_time)
1152 to_time = to_time.to_time if to_time.respond_to?(:to_time) 1159 to_time = to_time.to_time if to_time.respond_to?(:to_time)
1153 distance_in_minutes = (((to_time - from_time).abs)/60).round 1160 distance_in_minutes = (((to_time - from_time).abs)/60).round
@@ -1328,6 +1335,25 @@ module ApplicationHelper @@ -1328,6 +1335,25 @@ module ApplicationHelper
1328 expirable_content_reference content, action, text, url, options 1335 expirable_content_reference content, action, text, url, options
1329 end 1336 end
1330 1337
  1338 + def error_messages_for(*args)
  1339 + options = args.pop if args.last.is_a?(Hash)
  1340 + errors = []
  1341 + args.each do |name|
  1342 + object = instance_variable_get("@#{name}")
  1343 + object.errors.full_messages.each do |msg|
  1344 + errors << msg
  1345 + end if object
  1346 + end
  1347 + return '' if errors.empty?
  1348 +
  1349 + content_tag(:div, :class => 'errorExplanation', :id => 'errorExplanation') do
  1350 + content_tag(:h2, _('Errors while saving')) +
  1351 + content_tag(:ul) do
  1352 + errors.map { |err| content_tag(:li, err) }.join
  1353 + end
  1354 + end
  1355 + end
  1356 +
1331 def private_profile_partial_parameters 1357 def private_profile_partial_parameters
1332 if profile.person? 1358 if profile.person?
1333 @action = :add_friend 1359 @action = :add_friend
@@ -1357,7 +1383,7 @@ module ApplicationHelper @@ -1357,7 +1383,7 @@ module ApplicationHelper
1357 doc.search('.macro').each do |macro| 1383 doc.search('.macro').each do |macro|
1358 macro_name = macro['data-macro'] 1384 macro_name = macro['data-macro']
1359 result = @plugins.parse_macro(macro_name, macro, source) 1385 result = @plugins.parse_macro(macro_name, macro, source)
1360 - macro.inner_html = result.kind_of?(Proc) ? self.instance_eval(&result) : result 1386 + macro.inner_html = result.kind_of?(Proc) ? self.instance_exec(&result) : result
1361 end 1387 end
1362 doc.html 1388 doc.html
1363 end 1389 end
app/helpers/article_helper.rb
1 module ArticleHelper 1 module ArticleHelper
2 2
  3 + include PrototypeHelper
3 include TokenHelper 4 include TokenHelper
4 5
5 def custom_options_for_article(article, tokenized_children) 6 def custom_options_for_article(article, tokenized_children)
app/helpers/assets_helper.rb
@@ -7,9 +7,9 @@ module AssetsHelper @@ -7,9 +7,9 @@ module AssetsHelper
7 [ options.merge(:asset => 'articles'), "icon-menu-articles", _('Articles') ], 7 [ options.merge(:asset => 'articles'), "icon-menu-articles", _('Articles') ],
8 [ options.merge(:asset => 'people'), "icon-menu-people", _('People') ], 8 [ options.merge(:asset => 'people'), "icon-menu-people", _('People') ],
9 [ options.merge(:asset => 'products'), "icon-menu-product", _('Products') ], 9 [ options.merge(:asset => 'products'), "icon-menu-product", _('Products') ],
10 - [ options.merge(:asset => 'enterprises'), "icon-menu-enterprise", __('Enterprises') ],  
11 - [ options.merge(:asset => 'communities'), "icon-menu-community", __('Communities') ],  
12 - [ options.merge(:asset => 'events'), "icon-event", __('Events') ], 10 + [ options.merge(:asset => 'enterprises'), "icon-menu-enterprise", _('Enterprises') ],
  11 + [ options.merge(:asset => 'communities'), "icon-menu-community", _('Communities') ],
  12 + [ options.merge(:asset => 'events'), "icon-event", _('Events') ],
13 13
14 ].select do |target, css_class, name| 14 ].select do |target, css_class, name|
15 !environment.enabled?('disable_asset_' + target[:asset]) 15 !environment.enabled?('disable_asset_' + target[:asset])
app/helpers/boxes_helper.rb
1 module BoxesHelper 1 module BoxesHelper
2 2
3 def insert_boxes(content) 3 def insert_boxes(content)
4 - if @controller.send(:boxes_editor?) && @controller.send(:uses_design_blocks?)  
5 - content + display_boxes_editor(@controller.boxes_holder) 4 + if controller.send(:boxes_editor?) && controller.send(:uses_design_blocks?)
  5 + content + display_boxes_editor(controller.boxes_holder)
6 else 6 else
7 - maybe_display_custom_element(@controller.boxes_holder, :custom_header_expanded, :id => 'profile-header') +  
8 - if @controller.send(:uses_design_blocks?)  
9 - display_boxes(@controller.boxes_holder, content) 7 + maybe_display_custom_element(controller.boxes_holder, :custom_header_expanded, :id => 'profile-header') +
  8 + if controller.send(:uses_design_blocks?)
  9 + display_boxes(controller.boxes_holder, content)
10 else 10 else
11 content_tag('div', 11 content_tag('div',
12 content_tag('div', 12 content_tag('div',
@@ -16,7 +16,7 @@ module BoxesHelper @@ -16,7 +16,7 @@ module BoxesHelper
16 :class => 'no-boxes' 16 :class => 'no-boxes'
17 ) 17 )
18 end + 18 end +
19 - maybe_display_custom_element(@controller.boxes_holder, :custom_footer_expanded, :id => 'profile-footer') 19 + maybe_display_custom_element(controller.boxes_holder, :custom_footer_expanded, :id => 'profile-footer')
20 end 20 end
21 end 21 end
22 22
@@ -221,7 +221,7 @@ module BoxesHelper @@ -221,7 +221,7 @@ module BoxesHelper
221 221
222 if block.embedable? 222 if block.embedable?
223 embed_code = block.embed_code 223 embed_code = block.embed_code
224 - embed_code = instance_eval(&embed_code) if embed_code.respond_to?(:call) 224 + embed_code = instance_exec(&embed_code) if embed_code.respond_to?(:call)
225 html = content_tag('div', 225 html = content_tag('div',
226 content_tag('h2', _('Embed block code')) + 226 content_tag('h2', _('Embed block code')) +
227 content_tag('div', _('Below, you''ll see a field containing embed code for the block. Just copy the code and paste it into your website or blogging software.'), :style => 'margin-bottom: 1em;') + 227 content_tag('div', _('Below, you''ll see a field containing embed code for the block. Just copy the code and paste it into your website or blogging software.'), :style => 'margin-bottom: 1em;') +
@@ -234,7 +234,7 @@ module BoxesHelper @@ -234,7 +234,7 @@ module BoxesHelper
234 end 234 end
235 235
236 def current_blocks 236 def current_blocks
237 - @controller.boxes_holder.boxes.map(&:blocks).inject([]){|ac, a| ac + a} 237 + controller.boxes_holder.boxes.map(&:blocks).inject([]){|ac, a| ac + a}
238 end 238 end
239 239
240 # DEPRECATED. Do not use this. 240 # DEPRECATED. Do not use this.
app/helpers/catalog_helper.rb
@@ -9,11 +9,9 @@ module CatalogHelper @@ -9,11 +9,9 @@ module CatalogHelper
9 @categories = ProductCategory.on_level(params[:level]).order(:name) 9 @categories = ProductCategory.on_level(params[:level]).order(:name)
10 end 10 end
11 11
12 - @products = profile.products.from_category(@category).paginate(  
13 - :order => 'available desc, highlighted desc, name asc',  
14 - :per_page => @profile.products_per_catalog_page,  
15 - :page => options[:page]  
16 - ) 12 + @products = profile.products.from_category(@category).
  13 + reorder('available desc, highlighted desc, name asc').
  14 + paginate(:per_page => @profile.products_per_catalog_page, :page => options[:page])
17 end 15 end
18 16
19 def breadcrumb(category) 17 def breadcrumb(category)
@@ -41,7 +39,7 @@ module CatalogHelper @@ -41,7 +39,7 @@ module CatalogHelper
41 cat_link = category_link sub_category 39 cat_link = category_link sub_category
42 sub_categories << content_tag('li', cat_link) unless cat_link.nil? 40 sub_categories << content_tag('li', cat_link) unless cat_link.nil?
43 end 41 end
44 - content_tag('ul', sub_categories) if sub_categories.size > 0 42 + content_tag('ul', sub_categories.join) if sub_categories.size > 0
45 end 43 end
46 44
47 end 45 end
app/helpers/categories_helper.rb
@@ -50,10 +50,17 @@ module CategoriesHelper @@ -50,10 +50,17 @@ module CategoriesHelper
50 50
51 #FIXME make this test 51 #FIXME make this test
52 def selected_category_link(cat) 52 def selected_category_link(cat)
53 - content_tag('div', button_to_function_without_text(:remove, _('Remove'), nil) {|page| page["selected-category-#{cat.id}"].remove} +  
54 - link_to_function(cat.full_name(' &rarr; '), nil, :id => "remove-selected-category-#{cat.id}-button", :class => 'select-subcategory-link') {|page| page["selected-category-#{cat.id}"].remove}, 53 + js_remove = "jQuery('#selected-category-#{cat.id}').remove();"
  54 + content_tag('div', button_to_function_without_text(:remove, _('Remove'), js_remove) +
  55 + link_to_function(cat.full_name(' &rarr; '), js_remove, :id => "remove-selected-category-#{cat.id}-button", :class => 'select-subcategory-link'),
55 :class => 'selected-category' 56 :class => 'selected-category'
56 ) 57 )
57 end 58 end
58 59
  60 + def update_categories_link(body, category_id=nil, html_options={})
  61 + link_to body,
  62 + { :action => "update_categories", :category_id => category_id, :id => @object },
  63 + {:id => category_id ? "select-category-#{category_id}-link" : nil, :remote => true, :class => 'select-subcategory-link'}.merge(html_options)
  64 + end
  65 +
59 end 66 end
app/helpers/cms_helper.rb
@@ -11,7 +11,7 @@ module CmsHelper @@ -11,7 +11,7 @@ module CmsHelper
11 11
12 def add_upload_file_field(name, locals) 12 def add_upload_file_field(name, locals)
13 button_to_function :add, name, nil do |page| 13 button_to_function :add, name, nil do |page|
14 - page.insert_html :bottom, :uploaded_files, :partial => 'upload_file', :locals => locals, :object => UploadedFile.new 14 + page.insert_html :bottom, :uploaded_files, CGI::escapeHTML(render(:partial => 'upload_file', :locals => locals, :object => UploadedFile.new))
15 end 15 end
16 end 16 end
17 17
app/helpers/comment_helper.rb
@@ -23,7 +23,7 @@ module CommentHelper @@ -23,7 +23,7 @@ module CommentHelper
23 23
24 def comment_extra_contents(comment) 24 def comment_extra_contents(comment)
25 @plugins.dispatch(:comment_extra_contents, comment).collect do |extra_content| 25 @plugins.dispatch(:comment_extra_contents, comment).collect do |extra_content|
26 - extra_content.kind_of?(Proc) ? self.instance_eval(&extra_content) : extra_content 26 + extra_content.kind_of?(Proc) ? self.instance_exec(&extra_content) : extra_content
27 end.join('\n') 27 end.join('\n')
28 end 28 end
29 29
@@ -41,7 +41,7 @@ module CommentHelper @@ -41,7 +41,7 @@ module CommentHelper
41 def links_for_comment_actions(comment) 41 def links_for_comment_actions(comment)
42 actions = [link_for_report_abuse(comment), link_for_spam(comment), link_for_edit(comment), link_for_remove(comment)] 42 actions = [link_for_report_abuse(comment), link_for_spam(comment), link_for_edit(comment), link_for_remove(comment)]
43 @plugins.dispatch(:comment_actions, comment).collect do |action| 43 @plugins.dispatch(:comment_actions, comment).collect do |action|
44 - actions << (action.kind_of?(Proc) ? self.instance_eval(&action) : action) 44 + actions << (action.kind_of?(Proc) ? self.instance_exec(&action) : action)
45 end 45 end
46 actions.flatten.compact 46 actions.flatten.compact
47 end 47 end
@@ -56,9 +56,9 @@ module CommentHelper @@ -56,9 +56,9 @@ module CommentHelper
56 def link_for_spam(comment) 56 def link_for_spam(comment)
57 if comment.can_be_marked_as_spam_by?(user) 57 if comment.can_be_marked_as_spam_by?(user)
58 if comment.spam? 58 if comment.spam?
59 - {:link => link_to_function(_('Mark as NOT SPAM'), 'remove_comment(this, %s); return false;' % url_for(:profile => profile.identifier, :mark_comment_as_ham => comment.id).to_json, :class => 'comment-footer comment-footer-link comment-footer-hide')} 59 + {:link => link_to_function(_('Mark as NOT SPAM'), 'remove_comment(this, \'%s\'); return false;' % url_for(:profile => profile.identifier, :mark_comment_as_ham => comment.id), :class => 'comment-footer comment-footer-link comment-footer-hide')}
60 else 60 else
61 - {:link => link_to_function(_('Mark as SPAM'), 'remove_comment(this, %s, %s); return false;' % [url_for(:profile => profile.identifier, :controller => 'comment', :action => :mark_as_spam, :id => comment.id).to_json, _('Are you sure you want to mark this comment as SPAM?').to_json], :class => 'comment-footer comment-footer-link comment-footer-hide')} 61 + {:link => link_to_function(_('Mark as SPAM'), 'remove_comment(this, \'%s\', \'%s\'); return false;' % [url_for(:profile => profile.identifier, :controller => 'comment', :action => :mark_as_spam, :id => comment.id), _('Are you sure you want to mark this comment as SPAM?')], :class => 'comment-footer comment-footer-link comment-footer-hide')}
62 end 62 end
63 end 63 end
64 end 64 end
@@ -71,7 +71,7 @@ module CommentHelper @@ -71,7 +71,7 @@ module CommentHelper
71 71
72 def link_for_remove(comment) 72 def link_for_remove(comment)
73 if comment.can_be_destroyed_by?(user) 73 if comment.can_be_destroyed_by?(user)
74 - {:link => link_to_function(_('Remove'), 'remove_comment(this, %s, %s); return false ;' % [url_for(:profile => profile.identifier, :controller => 'comment', :action => :destroy, :id => comment.id).to_json, _('Are you sure you want to remove this comment and all its replies?').to_json], :class => 'comment-footer comment-footer-link comment-footer-hide remove-children')} 74 + {:link => link_to_function(_('Remove'), 'remove_comment(this, \'%s\', \'%s\'); return false ;' % [url_for(:profile => profile.identifier, :controller => 'comment', :action => :destroy, :id => comment.id), _('Are you sure you want to remove this comment and all its replies?')], :class => 'comment-footer comment-footer-link comment-footer-hide remove-children')}
75 end 75 end
76 end 76 end
77 77
app/helpers/content_viewer_helper.rb
@@ -26,7 +26,7 @@ module ContentViewerHelper @@ -26,7 +26,7 @@ module ContentViewerHelper
26 end 26 end
27 title << content_tag('span', 27 title << content_tag('span',
28 content_tag('span', show_date(article.published_at), :class => 'date') + 28 content_tag('span', show_date(article.published_at), :class => 'date') +
29 - content_tag('span', [_(", by %s") % link_to(article.author_name, article.author_url)], :class => 'author') + 29 + content_tag('span', _(", by %s") % link_to(article.author_name, article.author_url), :class => 'author') +
30 content_tag('span', comments, :class => 'comments'), 30 content_tag('span', comments, :class => 'comments'),
31 :class => 'created-at' 31 :class => 'created-at'
32 ) 32 )
@@ -52,7 +52,7 @@ module ContentViewerHelper @@ -52,7 +52,7 @@ module ContentViewerHelper
52 end 52 end
53 53
54 def addthis_image_tag 54 def addthis_image_tag
55 - if File.exists?(File.join(Rails.root, 'public', theme_path, 'images', 'addthis.gif')) 55 + if File.exists?(Rails.root.join('public', theme_path, 'images', 'addthis.gif'))
56 image_tag(File.join(theme_path, 'images', 'addthis.gif'), :border => 0, :alt => '') 56 image_tag(File.join(theme_path, 'images', 'addthis.gif'), :border => 0, :alt => '')
57 else 57 else
58 image_tag("/images/bt-bookmark.gif", :width => 53, :height => 16, :border => 0, :alt => '') 58 image_tag("/images/bt-bookmark.gif", :width => 53, :height => 16, :border => 0, :alt => '')
app/helpers/countries_helper.rb
1 -class CountriesHelper 1 +# encoding: UTF-8
2 2
3 - include Singleton 3 +module CountriesHelper
  4 +
  5 + class Object
  6 + include ::CountriesHelper
  7 + include Singleton
  8 + end
4 9
5 # a dump of iso_3166.xml from Debian source package iso-codes 10 # a dump of iso_3166.xml from Debian source package iso-codes
6 COUNTRIES = [ 11 COUNTRIES = [
@@ -262,7 +267,7 @@ class CountriesHelper @@ -262,7 +267,7 @@ class CountriesHelper
262 end 267 end
263 268
264 def countries 269 def countries
265 - self.class.countries.map {|item| [gettext(item[0]), item[1] ]}.sort_by { |entry| entry.first.transliterate } 270 + CountriesHelper.countries.map {|item| [gettext(item[0]), item[1] ]}.sort_by { |entry| entry.first.transliterate }
266 end 271 end
267 272
268 def lookup(code) 273 def lookup(code)
app/helpers/folder_helper.rb
  1 +require 'short_filename'
  2 +
1 module FolderHelper 3 module FolderHelper
2 4
3 include ShortFilename 5 include ShortFilename
app/helpers/forms_helper.rb
1 module FormsHelper 1 module FormsHelper
2 -  
3 - def generate_form( name, obj, fields={} )  
4 - labelled_form_for name, obj do |f|  
5 - f.text_field(:name)  
6 - end  
7 - end  
8 -  
9 def labelled_radio_button( human_name, name, value, checked = false, options = {} ) 2 def labelled_radio_button( human_name, name, value, checked = false, options = {} )
10 options[:id] ||= 'radio-' + FormsHelper.next_id_number 3 options[:id] ||= 'radio-' + FormsHelper.next_id_number
11 radio_button_tag( name, value, checked, options ) + 4 radio_button_tag( name, value, checked, options ) +
@@ -41,6 +34,7 @@ module FormsHelper @@ -41,6 +34,7 @@ module FormsHelper
41 the_class << ' ' << html_options[:class] 34 the_class << ' ' << html_options[:class]
42 end 35 end
43 36
  37 + html_options.delete(:cancel)
44 bt_submit = submit_tag(label, html_options.merge(:class => the_class)) 38 bt_submit = submit_tag(label, html_options.merge(:class => the_class))
45 39
46 bt_submit + bt_cancel 40 bt_submit + bt_cancel
app/helpers/forum_helper.rb
@@ -36,7 +36,7 @@ module ForumHelper @@ -36,7 +36,7 @@ module ForumHelper
36 :id => "post-#{art.id}" 36 :id => "post-#{art.id}"
37 ) 37 )
38 } 38 }
39 - content_tag('table', content) + (pagination or '') 39 + content_tag('table', content.join) + (pagination or '')
40 end 40 end
41 41
42 def last_topic_update(article) 42 def last_topic_update(article)
app/helpers/language_helper.rb
@@ -22,7 +22,7 @@ module LanguageHelper @@ -22,7 +22,7 @@ module LanguageHelper
22 if options[:element] == 'dropdown' 22 if options[:element] == 'dropdown'
23 select_tag('lang', 23 select_tag('lang',
24 options_for_select(locales.map{|code,name| [name, code]}, current), 24 options_for_select(locales.map{|code,name| [name, code]}, current),
25 - :onchange => "document.location.href= #{url_for(params.merge(:lang => 'LANGUAGE')).inspect}.replace(/LANGUAGE/, this.value) ;", 25 + :onchange => "document.location.href= #{url_for(params.merge(:lang => 'LANGUAGE'))}.replace(/LANGUAGE/, this.value) ;",
26 :help => _('The language you choose here is the language used for options, buttons, etc. It does not affect the language of the content created by other users.') 26 :help => _('The language you choose here is the language used for options, buttons, etc. It does not affect the language of the content created by other users.')
27 ) 27 )
28 else 28 else
app/helpers/layout_helper.rb
@@ -2,14 +2,14 @@ module LayoutHelper @@ -2,14 +2,14 @@ module LayoutHelper
2 2
3 def body_classes 3 def body_classes
4 # Identify the current controller and action for the CSS: 4 # Identify the current controller and action for the CSS:
5 - " controller-#{@controller.controller_name}" +  
6 - " action-#{@controller.controller_name}-#{@controller.action_name}" +  
7 - " template-#{profile.nil? ? "default" : profile.layout_template}" + 5 + " controller-#{controller.controller_name}" +
  6 + " action-#{controller.controller_name}-#{controller.action_name}" +
  7 + " template-#{@layout_template || if profile.blank? then 'default' else profile.layout_template end}" +
8 (!profile.nil? && profile.is_on_homepage?(request.path,@page) ? " profile-homepage" : "") 8 (!profile.nil? && profile.is_on_homepage?(request.path,@page) ? " profile-homepage" : "")
9 end 9 end
10 10
11 def noosfero_javascript 11 def noosfero_javascript
12 - plugins_javascripts = @plugins.map { |plugin| plugin.js_files.map { |js| plugin.class.public_path(js) } }.flatten 12 + plugins_javascripts = @plugins.map { |plugin| [plugin.js_files].flatten.map { |js| plugin.class.public_path(js) } }.flatten
13 13
14 output = '' 14 output = ''
15 output += render :file => 'layouts/_javascript' 15 output += render :file => 'layouts/_javascript'
@@ -26,14 +26,13 @@ module LayoutHelper @@ -26,14 +26,13 @@ module LayoutHelper
26 'search', 26 'search',
27 'thickbox', 27 'thickbox',
28 'lightbox', 28 'lightbox',
29 - 'colorpicker',  
30 'colorbox', 29 'colorbox',
31 pngfix_stylesheet_path, 30 pngfix_stylesheet_path,
32 ] + tokeninput_stylesheets 31 ] + tokeninput_stylesheets
33 plugins_stylesheets = @plugins.select(&:stylesheet?).map { |plugin| plugin.class.public_path('style.css') } 32 plugins_stylesheets = @plugins.select(&:stylesheet?).map { |plugin| plugin.class.public_path('style.css') }
34 33
35 output = '' 34 output = ''
36 - output += stylesheet_link_tag standard_stylesheets, :cache => 'cache' 35 + output += stylesheet_link_tag standard_stylesheets, :cache => 'cache/application'
37 output += stylesheet_link_tag template_stylesheet_path 36 output += stylesheet_link_tag template_stylesheet_path
38 output += stylesheet_link_tag icon_theme_stylesheet_path 37 output += stylesheet_link_tag icon_theme_stylesheet_path
39 output += stylesheet_link_tag jquery_ui_theme_stylesheet_path 38 output += stylesheet_link_tag jquery_ui_theme_stylesheet_path
@@ -69,7 +68,7 @@ module LayoutHelper @@ -69,7 +68,7 @@ module LayoutHelper
69 theme_icon_themes = theme_option(:icon_theme) || [] 68 theme_icon_themes = theme_option(:icon_theme) || []
70 for icon_theme in theme_icon_themes do 69 for icon_theme in theme_icon_themes do
71 theme_path = "/designs/icons/#{icon_theme}/style.css" 70 theme_path = "/designs/icons/#{icon_theme}/style.css"
72 - if File.exists?(File.join(RAILS_ROOT, 'public', theme_path)) 71 + if File.exists?(Rails.root.join('public', theme_path))
73 icon_themes << theme_path 72 icon_themes << theme_path
74 end 73 end
75 end 74 end
@@ -77,7 +76,7 @@ module LayoutHelper @@ -77,7 +76,7 @@ module LayoutHelper
77 end 76 end
78 77
79 def jquery_ui_theme_stylesheet_path 78 def jquery_ui_theme_stylesheet_path
80 - 'jquery.ui/' + jquery_theme + '/jquery-ui-1.8.2.custom' 79 + "https://code.jquery.com/ui/1.10.4/themes/#{jquery_theme}/jquery-ui.css"
81 end 80 end
82 81
83 def theme_stylesheet_path 82 def theme_stylesheet_path
@@ -86,7 +85,7 @@ module LayoutHelper @@ -86,7 +85,7 @@ module LayoutHelper
86 85
87 def addthis_javascript 86 def addthis_javascript
88 if NOOSFERO_CONF['addthis_enabled'] 87 if NOOSFERO_CONF['addthis_enabled']
89 - '<script src="http://s7.addthis.com/js/152/addthis_widget.js"></script>' 88 + '<script src="https://s7.addthis.com/js/152/addthis_widget.js"></script>'
90 end 89 end
91 end 90 end
92 91
app/helpers/macros_helper.rb
@@ -39,7 +39,7 @@ module MacrosHelper @@ -39,7 +39,7 @@ module MacrosHelper
39 plugins_javascripts = [] 39 plugins_javascripts = []
40 @plugins.dispatch(:macros).map do |macro| 40 @plugins.dispatch(:macros).map do |macro|
41 if macro.configuration[:js_files] 41 if macro.configuration[:js_files]
42 - macro.configuration[:js_files].map { |js| plugins_javascripts << macro.plugin.public_path(js) } 42 + [macro.configuration[:js_files]].flatten.map { |js| plugins_javascripts << macro.plugin.public_path(js) }
43 end 43 end
44 end 44 end
45 javascript_include_tag(plugins_javascripts, :cache => 'cache/plugins-' + Digest::MD5.hexdigest(plugins_javascripts.to_s)) unless plugins_javascripts.empty? 45 javascript_include_tag(plugins_javascripts, :cache => 'cache/plugins-' + Digest::MD5.hexdigest(plugins_javascripts.to_s)) unless plugins_javascripts.empty?
@@ -49,7 +49,7 @@ module MacrosHelper @@ -49,7 +49,7 @@ module MacrosHelper
49 plugins_css = [] 49 plugins_css = []
50 @plugins.dispatch(:macros).map do |macro| 50 @plugins.dispatch(:macros).map do |macro|
51 if macro.configuration[:css_files] 51 if macro.configuration[:css_files]
52 - macro.configuration[:css_files].map { |css| plugins_css << macro.plugin.public_path(css) } 52 + [macro.configuration[:css_files]].flatten.map { |css| plugins_css << macro.plugin.public_path(css) }
53 end 53 end
54 end 54 end
55 plugins_css.join(',') 55 plugins_css.join(',')
app/helpers/manage_products_helper.rb
  1 +# encoding: UTF-8
  2 +
1 module ManageProductsHelper 3 module ManageProductsHelper
2 4
3 def remote_function_to_update_categories_selection(container_id, options = {}) 5 def remote_function_to_update_categories_selection(container_id, options = {})
@@ -26,27 +28,10 @@ module ManageProductsHelper @@ -26,27 +28,10 @@ module ManageProductsHelper
26 def hierarchy_category_navigation(current_category, options = {}) 28 def hierarchy_category_navigation(current_category, options = {})
27 hierarchy = [] 29 hierarchy = []
28 if current_category 30 if current_category
29 - count_chars = 0  
30 - unless options[:hide_current_category]  
31 - hierarchy << current_category.name  
32 - count_chars += current_category.name.length  
33 - end 31 + hierarchy << current_category.name unless options[:hide_current_category]
34 ancestors = current_category.ancestors 32 ancestors = current_category.ancestors
35 - toplevel = ancestors.pop  
36 - if toplevel  
37 - count_chars += toplevel.name.length  
38 - end  
39 ancestors.each do |category| 33 ancestors.each do |category|
40 - if count_chars > 55  
41 - hierarchy << hierarchy_category_item(category, options[:make_links], '( … )')  
42 - break  
43 - else  
44 - hierarchy << hierarchy_category_item(category, options[:make_links])  
45 - end  
46 - count_chars += category.name.length  
47 - end  
48 - if toplevel  
49 - hierarchy << hierarchy_category_item(toplevel, options[:make_links]) 34 + hierarchy << hierarchy_category_item(category, options[:make_links])
50 end 35 end
51 end 36 end
52 hierarchy.reverse.join(options[:separator] || ' &rarr; ') 37 hierarchy.reverse.join(options[:separator] || ' &rarr; ')
@@ -55,7 +40,7 @@ module ManageProductsHelper @@ -55,7 +40,7 @@ module ManageProductsHelper
55 def options_for_select_categories(categories, selected = nil) 40 def options_for_select_categories(categories, selected = nil)
56 categories.sort_by{|cat| cat.name.transliterate}.map do |category| 41 categories.sort_by{|cat| cat.name.transliterate}.map do |category|
57 selected_attribute = selected.nil? ? '' : (category == selected ? "selected='selected'" : '') 42 selected_attribute = selected.nil? ? '' : (category == selected ? "selected='selected'" : '')
58 - "<option value='#{category.id}' title='#{category.name}' #{selected_attribute}>#{truncate(category.name, :length => 33) + (category.leaf? ? '': ' &raquo;')}</option>" 43 + "<option value='#{category.id}' title='#{category.name}' #{selected_attribute}>#{category.name + (category.leaf? ? '': ' &raquo;')}</option>"
59 end.join("\n") 44 end.join("\n")
60 end 45 end
61 46
@@ -161,7 +146,7 @@ module ManageProductsHelper @@ -161,7 +146,7 @@ module ManageProductsHelper
161 def cancel_edit_product_link(product, field, html_options = {}) 146 def cancel_edit_product_link(product, field, html_options = {})
162 return '' unless (user && user.has_permission?('manage_products', profile)) 147 return '' unless (user && user.has_permission?('manage_products', profile))
163 button_to_function(:cancel, _('Cancel'), nil, html_options) do |page| 148 button_to_function(:cancel, _('Cancel'), nil, html_options) do |page|
164 - page.replace_html "product-#{field}", :partial => "display_#{field}", :locals => {:product => product} 149 + page.replace_html "product-#{field}", CGI::escapeHTML(render :partial => "display_#{field}", :locals => {:product => product})
165 end 150 end
166 end 151 end
167 152
app/helpers/profile_editor_helper.rb
@@ -101,7 +101,7 @@ module ProfileEditorHelper @@ -101,7 +101,7 @@ module ProfileEditorHelper
101 end 101 end
102 102
103 def country_helper 103 def country_helper
104 - @country_helper ||= CountriesHelper.instance 104 + @country_helper ||= CountriesHelper::Object.instance
105 end 105 end
106 106
107 def select_country(title, object, method, html_options = {}, options = {}) 107 def select_country(title, object, method, html_options = {}, options = {})
@@ -129,7 +129,7 @@ module ProfileEditorHelper @@ -129,7 +129,7 @@ module ProfileEditorHelper
129 else 129 else
130 domains = environment.domains 130 domains = environment.domains
131 end 131 end
132 - labelled_form_field(__('Preferred domain name:'), select(object, :preferred_domain_id, domains.map {|item| [item.name, item.id]}, :prompt => '&lt;' + _('Select domain') + '&gt;')) 132 + labelled_form_field(_('Preferred domain name:'), select(object, :preferred_domain_id, domains.map {|item| [item.name, item.id]}, :prompt => '&lt;' + _('Select domain') + '&gt;'))
133 end 133 end
134 134
135 def control_panel(&block) 135 def control_panel(&block)
app/helpers/sweeper_helper.rb
@@ -18,9 +18,7 @@ module SweeperHelper @@ -18,9 +18,7 @@ module SweeperHelper
18 expire_timeout_fragment(profile.manage_friends_cache_key(:npage => i.to_s)) 18 expire_timeout_fragment(profile.manage_friends_cache_key(:npage => i.to_s))
19 end 19 end
20 20
21 - # friends blocks  
22 - blocks = profile.blocks.select{|b| b.kind_of?(FriendsBlock)}  
23 - BlockSweeper.expire_blocks(blocks) 21 + expire_blocks_cache(profile, [:profile])
24 end 22 end
25 23
26 def expire_communities(profile) 24 def expire_communities(profile)
app/helpers/tags_helper.rb
  1 +# encoding: UTF-8
  2 +
1 module TagsHelper 3 module TagsHelper
2 4
3 module Cloud 5 module Cloud
@@ -7,7 +9,7 @@ module TagsHelper @@ -7,7 +9,7 @@ module TagsHelper
7 9
8 # <tt>tags</tt> must be a hash where the keys are tag names and the values 10 # <tt>tags</tt> must be a hash where the keys are tag names and the values
9 # the count of elements tagged with the tag, as returned by 11 # the count of elements tagged with the tag, as returned by
10 - # Profile#find_tagged_with. If not tags were returned, just returns 12 + # Profile#tagged_with. If not tags were returned, just returns
11 # _('No tags yet.') 13 # _('No tags yet.')
12 # 14 #
13 # <tagname_option> must be a symbol representing the key to be inserted in 15 # <tagname_option> must be a symbol representing the key to be inserted in
@@ -39,15 +41,11 @@ module TagsHelper @@ -39,15 +41,11 @@ module TagsHelper
39 max = tags.values.max.to_f 41 max = tags.values.max.to_f
40 min = tags.values.min.to_f 42 min = tags.values.min.to_f
41 43
42 - # Uses iconv to translate utf8 strings to ascii.  
43 - # If can't translate a character, ignore it.  
44 - require 'iconv'  
45 - utf8_to_ascii = Iconv.new("ASCII//TRANSLIT//IGNORE","UTF8")  
46 # Sorts first based on translated strings and then, if they are equal, based on the original form. 44 # Sorts first based on translated strings and then, if they are equal, based on the original form.
47 # This way variant characters falls on the same level as their base characters and don't end up 45 # This way variant characters falls on the same level as their base characters and don't end up
48 # at the end of the tag list. 46 # at the end of the tag list.
49 # Example: AA ÁA AB Z instead of AA AB Z ÁA 47 # Example: AA ÁA AB Z instead of AA AB Z ÁA
50 - tags.collect{ |k,v| [utf8_to_ascii.iconv(k).downcase, [k,v]] }.sort.collect { |ascii, t| t }.map do |tag,count| 48 + tags.collect{ |k,v| [ActiveSupport::Inflector.transliterate(k).downcase, [k,v]] }.sort.collect { |ascii, t| t }.map do |tag,count|
51 if ( max == min ) 49 if ( max == min )
52 v = 0.5 50 v = 0.5
53 else 51 else
app/helpers/users_helper.rb
@@ -18,7 +18,7 @@ module UsersHelper @@ -18,7 +18,7 @@ module UsersHelper
18 ) 18 )
19 end 19 end
20 20
21 - def filter_title(filter) 21 + def users_filter_title(filter)
22 FILTER_TRANSLATION[filter] 22 FILTER_TRANSLATION[filter]
23 end 23 end
24 24
app/mailers/.gitkeep 0 → 100644
app/mailers/comment_notifier.rb 0 → 100644
@@ -0,0 +1,40 @@ @@ -0,0 +1,40 @@
  1 +class Comment::Notifier < ActionMailer::Base
  2 + def notification(comment)
  3 + profile = comment.article.profile
  4 + @recipient = profile.nickname || profile.name
  5 + @sender = comment.author_name
  6 + @sender_link = comment.author_link
  7 + @article_title = comment.article.name
  8 + @comment_url = comment.url
  9 + @comment_title = comment.title
  10 + @comment_body = comment.body
  11 + @environment = profile.environment.name
  12 + @url = profile.environment.top_url
  13 +
  14 + mail(
  15 + to: comment.notification_emails,
  16 + from: "#{profile.environment.name} <#{profile.environment.noreply_email}>",
  17 + subject: _("[%s] you got a new comment!") % [profile.environment.name]
  18 + )
  19 + end
  20 +
  21 + def mail_to_followers(comment, emails)
  22 + profile = comment.article.profile
  23 + @recipient = profile.nickname || profile.name
  24 + @sender = comment.author_name
  25 + @sender_link = comment.author_link
  26 + @article_title = comment.article.name
  27 + @comment_url = comment.url
  28 + @unsubscribe_url = comment.article.view_url.merge({:unfollow => true})
  29 + @comment_title = comment.title
  30 + @comment_body = comment.body
  31 + @environment = profile.environment.name
  32 + @url = profile.environment.top_url
  33 +
  34 + mail(
  35 + bcc: emails,
  36 + from: "#{profile.environment.name} <#{profile.environment.noreply_email}>",
  37 + subject: _("[%s] %s commented on a content of %s") % [profile.environment.name, comment.author_name, profile.short_name]
  38 + )
  39 + end
  40 +end
app/mailers/contact.rb 0 → 100644
@@ -0,0 +1,64 @@ @@ -0,0 +1,64 @@
  1 +class Contact
  2 +
  3 + include ActiveModel::Validations
  4 +
  5 + def initialize(attributes = nil)
  6 + if attributes
  7 + attributes.each do |attr,value|
  8 + self.send("#{attr}=", value)
  9 + end
  10 + end
  11 + end
  12 +
  13 + attr_accessor :name
  14 + attr_accessor :subject
  15 + attr_accessor :message
  16 + attr_accessor :email
  17 + attr_accessor :state
  18 + attr_accessor :city
  19 + attr_accessor :receive_a_copy
  20 + attr_accessor :dest
  21 + attr_accessor :sender
  22 +
  23 + N_('Subject'); N_('Message'); N_('City and state'); N_('e-Mail'); N_('Name')
  24 +
  25 + validates_presence_of :subject, :email, :message, :name
  26 + validates_format_of :email, :with => Noosfero::Constants::EMAIL_FORMAT, :if => (lambda {|o| !o.email.blank?})
  27 +
  28 + def deliver
  29 + return false unless self.valid?
  30 + Contact::Sender.notification(self).deliver
  31 + end
  32 +
  33 + class Sender < ActionMailer::Base
  34 + def notification(contact)
  35 + @name = contact.name
  36 + @email = contact.email
  37 + @city = contact.city
  38 + @state = contact.state
  39 + @message = contact.message
  40 + @environment = contact.dest.environment.name
  41 + @url = url_for(:host => contact.dest.environment.default_hostname, :controller => 'home')
  42 + @target = contact.dest.name
  43 +
  44 + options = {
  45 + content_type: 'text/html',
  46 + to: contact.dest.notification_emails,
  47 + reply_to: contact.email,
  48 + subject: "[#{contact.dest.short_name(30)}] " + contact.subject,
  49 + from: "#{contact.name} <#{contact.dest.environment.noreply_email}>"
  50 + }
  51 +
  52 + if contact.sender
  53 + options.merge!('X-Noosfero-Sender' => contact.sender.identifier)
  54 + end
  55 +
  56 + if contact.receive_a_copy
  57 + options.merge!(cc: "#{contact.name} <#{contact.email}>")
  58 + end
  59 +
  60 + mail(options)
  61 + end
  62 + end
  63 +
  64 +end
app/mailers/environment_mailing.rb 0 → 100644
@@ -0,0 +1,25 @@ @@ -0,0 +1,25 @@
  1 +class EnvironmentMailing < Mailing
  2 +
  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 })
  5 + end
  6 +
  7 + def each_recipient
  8 + offset = 0
  9 + limit = 100
  10 + while !(people = recipients(offset, limit)).empty?
  11 + people.each do |person|
  12 + yield person
  13 + end
  14 + offset = offset + limit
  15 + end
  16 + end
  17 +
  18 + def signature_message
  19 + _('Sent by %s.') % source.name
  20 + end
  21 +
  22 + def url
  23 + source.top_url
  24 + end
  25 +end
app/mailers/mailing.rb 0 → 100644
@@ -0,0 +1,65 @@ @@ -0,0 +1,65 @@
  1 +require 'mailing_job'
  2 +
  3 +class Mailing < ActiveRecord::Base
  4 +
  5 + attr_accessible :subject, :body
  6 + validates_presence_of :source_id, :subject, :body
  7 + belongs_to :source, :foreign_key => :source_id, :polymorphic => true
  8 + belongs_to :person
  9 +
  10 + has_many :mailing_sents
  11 +
  12 + xss_terminate :only => [ :subject, :body ], :with => 'white_list', :on => 'validation'
  13 +
  14 + after_create do |mailing|
  15 + mailing.schedule
  16 + end
  17 +
  18 + def schedule
  19 + Delayed::Job.enqueue MailingJob.new(self.id)
  20 + end
  21 +
  22 + def generate_from
  23 + "#{source.name} <#{if source.is_a? Environment then source.noreply_email else source.contact_email end}>"
  24 + end
  25 +
  26 + def generate_subject
  27 + '[%s] %s' % [source.name, subject]
  28 + end
  29 +
  30 + def signature_message
  31 + _('Sent by Noosfero.')
  32 + end
  33 +
  34 + def url
  35 + ''
  36 + end
  37 +
  38 + def deliver
  39 + each_recipient do |recipient|
  40 + begin
  41 + Mailing::Sender.notification(self, recipient.email).deliver
  42 + self.mailing_sents.create(:person => recipient)
  43 + rescue Exception
  44 + # FIXME should not discard errors silently. An idea is to collect all
  45 + # errors and generate a task (notification) for the +source+
  46 + # (environment/organization) listing these errors.
  47 + end
  48 + end
  49 + end
  50 +
  51 + class Sender < ActionMailer::Base
  52 + def notification(mailing, recipient)
  53 + @message = mailing.body
  54 + @signature_message = mailing.signature_message
  55 + @url = mailing.url
  56 + mail(
  57 + :content_type => 'text/html',
  58 + :to => recipient,
  59 + :from => mailing.generate_from,
  60 + :reply_to => mailing.person.email,
  61 + :subject => mailing.generate_subject
  62 + )
  63 + end
  64 + end
  65 +end
app/mailers/organization_mailing.rb 0 → 100644
@@ -0,0 +1,30 @@ @@ -0,0 +1,30 @@
  1 +class OrganizationMailing < Mailing
  2 +
  3 + def generate_from
  4 + "#{person.name} <#{source.environment.noreply_email}>"
  5 + end
  6 +
  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 })
  9 + end
  10 +
  11 + def each_recipient
  12 + offset = 0
  13 + limit = 50
  14 + while !(people = recipients(offset, limit)).empty?
  15 + people.each do |person|
  16 + yield person
  17 + end
  18 + offset = offset + limit
  19 + end
  20 + end
  21 +
  22 + def signature_message
  23 + _('Sent by community %s.') % source.name
  24 + end
  25 +
  26 + include Rails.application.routes.url_helpers
  27 + def url
  28 + url_for(source.url)
  29 + end
  30 +end
app/mailers/pending_task_notifier.rb 0 → 100644
@@ -0,0 +1,19 @@ @@ -0,0 +1,19 @@
  1 +class PendingTaskNotifier < ActionMailer::Base
  2 +
  3 + def notification(person)
  4 + @person = person
  5 + @tasks = person.tasks.pending
  6 + @organizations_with_pending_tasks = person.organizations_with_pending_tasks
  7 + @environment = person.environment.name
  8 + @url = url_for(:host => person.environment.default_hostname, :controller => 'home')
  9 + @default_hostname = person.environment.default_hostname
  10 + @url_for_pending_tasks = url_for(:host => person.environment.default_hostname, :controller => 'tasks', :profile => person.identifier)
  11 +
  12 + mail(
  13 + to: person.email,
  14 + from: "#{person.environment.name} <#{person.environment.noreply_email}>",
  15 + subject: _("[%s] Pending tasks") % person.environment.name
  16 + )
  17 + end
  18 +
  19 +end
app/mailers/scrap_notifier.rb 0 → 100644
@@ -0,0 +1,17 @@ @@ -0,0 +1,17 @@
  1 +class Scrap::Notifier < ActionMailer::Base
  2 + def notification(scrap)
  3 + sender, receiver = scrap.sender, scrap.receiver
  4 + @recipient = receiver.name
  5 + @sender = sender.name
  6 + @sender_link = sender.url
  7 + @scrap_content = scrap.content
  8 + @wall_url = scrap.scrap_wall_url
  9 + @environment = sender.environment.name
  10 + @url = sender.environment.top_url
  11 + mail(
  12 + to: receiver.email,
  13 + from: "#{sender.environment.name} <#{sender.environment.noreply_email}>",
  14 + subject: _("[%s] You received a scrap!") % [sender.environment.name]
  15 + )
  16 + end
  17 +end
app/mailers/task_mailer.rb 0 → 100644
@@ -0,0 +1,62 @@ @@ -0,0 +1,62 @@
  1 +class TaskMailer < ActionMailer::Base
  2 +
  3 + def target_notification(task, message)
  4 + @message = extract_message(message)
  5 + @target = task.target.name
  6 + @environment = task.environment.name
  7 + @url = generate_environment_url(task, :controller => 'home')
  8 + url_for_tasks_list = task.target.kind_of?(Environment) ? '' : url_for(task.target.tasks_url)
  9 + @tasks_url = url_for_tasks_list
  10 +
  11 + mail(
  12 + to: task.target.notification_emails.compact,
  13 + from: self.class.generate_from(task),
  14 + subject: "[%s] %s" % [task.environment.name, task.target_notification_description]
  15 + )
  16 + end
  17 +
  18 + def invitation_notification(task)
  19 + msg = task.expanded_message
  20 + @message = msg.gsub /<url>/, generate_environment_url(task, :controller => 'account', :action => 'signup', :invitation_code => task.code)
  21 +
  22 + mail(
  23 + to: task.friend_email,
  24 + from: self.class.generate_from(task),
  25 + subject: '[%s] %s' % [ task.requestor.environment.name, task.target_notification_description ]
  26 + )
  27 + end
  28 +
  29 + def generic_message(name, task)
  30 + return if !task.respond_to?("#{name}_message")
  31 +
  32 + @message = extract_message(task.send("#{name}_message"))
  33 + @requestor = task.requestor.name
  34 + @environment = task.requestor.environment.name
  35 + @url = url_for(:host => task.requestor.environment.default_hostname, :controller => 'home')
  36 +
  37 + mail(
  38 + to: task.requestor.notification_emails,
  39 + from: self.class.generate_from(task),
  40 + subject: '[%s] %s' % [task.requestor.environment.name, task.target_notification_description]
  41 + )
  42 + end
  43 +
  44 + protected
  45 +
  46 + def extract_message(message)
  47 + if message.kind_of?(Proc)
  48 + self.instance_exec(&message)
  49 + else
  50 + message.to_s
  51 + end
  52 + end
  53 +
  54 + def self.generate_from(task)
  55 + "#{task.environment.name} <#{task.environment.noreply_email}>"
  56 + end
  57 +
  58 + def generate_environment_url(task, url = {})
  59 + url_for(Noosfero.url_options.merge(:host => task.environment.default_hostname).merge(url))
  60 + end
  61 +
  62 +end
app/mailers/user_mailer.rb 0 → 100644
@@ -0,0 +1,47 @@ @@ -0,0 +1,47 @@
  1 +class UserMailer < ActionMailer::Base
  2 + def activation_email_notify(user)
  3 + user_email = "#{user.login}@#{user.email_domain}"
  4 + @name = user.name
  5 + @email = user_email
  6 + @webmail = MailConf.webmail_url(user.login, user.email_domain)
  7 + @environment = user.environment.name
  8 + @url = url_for(:host => user.environment.default_hostname, :controller => 'home')
  9 +
  10 + mail(
  11 + to: user_email,
  12 + from: "#{user.environment.name} <#{user.environment.contact_email}>",
  13 + subject: _("[%{environment}] Welcome to %{environment} mail!") % { :environment => user.environment.name }
  14 + )
  15 + end
  16 +
  17 + def activation_code(user)
  18 + @recipient = user.name,
  19 + @activation_code = user.activation_code
  20 + @environment = user.environment.name
  21 + @url = user.environment.top_url
  22 +
  23 + mail(
  24 + from: "#{user.environment.name} <#{user.environment.contact_email}>",
  25 + to: user.email,
  26 + subject: _("[%s] Activate your account") % [user.environment.name],
  27 + )
  28 + end
  29 +
  30 + def signup_welcome_email(user)
  31 + @body = user.environment.signup_welcome_text_body.gsub('{user_name}', user.name)
  32 + email_subject = user.environment.signup_welcome_text_subject
  33 + mail(
  34 + content_type: 'text/html',
  35 + to: user.email,
  36 + from: "#{user.environment.name} <#{user.environment.contact_email}>",
  37 + subject: email_subject.blank? ? _("Welcome to environment %s") % [user.environment.name] : email_subject,
  38 + body: @body
  39 + )
  40 + end
  41 +
  42 + class Job < Struct.new(:user, :method)
  43 + def perform
  44 + UserMailer.send(method, user).deliver
  45 + end
  46 + end
  47 +end
app/models/abuse_report.rb
1 class AbuseReport < ActiveRecord::Base 1 class AbuseReport < ActiveRecord::Base
2 2
  3 + attr_accessible :content, :reason
  4 +
3 belongs_to :reporter, :class_name => 'Person' 5 belongs_to :reporter, :class_name => 'Person'
4 belongs_to :abuse_complaint 6 belongs_to :abuse_complaint
5 has_many :reported_images, :dependent => :destroy 7 has_many :reported_images, :dependent => :destroy
app/models/action_tracker_notification.rb
@@ -8,6 +8,8 @@ class ActionTrackerNotification &lt; ActiveRecord::Base @@ -8,6 +8,8 @@ class ActionTrackerNotification &lt; ActiveRecord::Base
8 validates_presence_of :profile_id, :action_tracker_id 8 validates_presence_of :profile_id, :action_tracker_id
9 validates_uniqueness_of :action_tracker_id, :scope => :profile_id 9 validates_uniqueness_of :action_tracker_id, :scope => :profile_id
10 10
  11 + attr_accessible :profile_id, :action_tracker_id
  12 +
11 end 13 end
12 14
13 ActionTracker::Record.has_many :action_tracker_notifications, :class_name => 'ActionTrackerNotification', :foreign_key => 'action_tracker_id', :dependent => :destroy 15 ActionTracker::Record.has_many :action_tracker_notifications, :class_name => 'ActionTrackerNotification', :foreign_key => 'action_tracker_id', :dependent => :destroy
app/models/approve_article.rb
@@ -48,7 +48,7 @@ class ApproveArticle &lt; Task @@ -48,7 +48,7 @@ class ApproveArticle &lt; Task
48 end 48 end
49 49
50 def perform 50 def perform
51 - article.copy!(:name => name, :abstract => abstract, :body => body, :profile => target, :reference_article => article, :parent => article_parent, :highlighted => highlighted, :source => article.source, :last_changed_by_id => article.author_id) 51 + article.copy!(:name => name, :abstract => abstract, :body => body, :profile => target, :reference_article => article, :parent => article_parent, :highlighted => highlighted, :source => article.source, :last_changed_by_id => article.last_changed_by_id, :created_by_id => article.created_by_id)
52 end 52 end
53 53
54 def title 54 def title
app/models/approve_comment.rb
@@ -6,7 +6,11 @@ class ApproveComment &lt; Task @@ -6,7 +6,11 @@ class ApproveComment &lt; Task
6 validates_presence_of :comment_attributes 6 validates_presence_of :comment_attributes
7 7
8 def comment 8 def comment
9 - @comment ||= Comment.new(ActiveSupport::JSON.decode(self.comment_attributes)) unless self.comment_attributes.nil? 9 + unless @comment || self.comment_attributes.nil?
  10 + @comment = Comment.new
  11 + @comment.assign_attributes(ActiveSupport::JSON.decode(self.comment_attributes), :without_protection => true)
  12 + end
  13 + @comment
10 end 14 end
11 15
12 def requestor_name 16 def requestor_name
app/models/article.rb
@@ -2,6 +2,8 @@ require &#39;hpricot&#39; @@ -2,6 +2,8 @@ require &#39;hpricot&#39;
2 2
3 class Article < ActiveRecord::Base 3 class Article < ActiveRecord::Base
4 4
  5 + attr_accessible :name, :body, :abstract, :profile, :tag_list, :parent, :allow_members_to_edit, :translation_of_id, :language, :license_id, :parent_id, :display_posts_in_current_language, :category_ids, :posts_per_page, :moderate_comments, :accept_comments, :feed, :published, :source, :highlighted, :notify_comments, :display_hits, :slug, :external_feed_builder, :display_versions
  6 +
5 acts_as_having_image 7 acts_as_having_image
6 8
7 SEARCHABLE_FIELDS = { 9 SEARCHABLE_FIELDS = {
@@ -38,12 +40,6 @@ class Article &lt; ActiveRecord::Base @@ -38,12 +40,6 @@ class Article &lt; ActiveRecord::Base
38 # xss_terminate plugin can't sanitize array fields 40 # xss_terminate plugin can't sanitize array fields
39 before_save :sanitize_tag_list 41 before_save :sanitize_tag_list
40 42
41 - before_create do |article|  
42 - if article.last_changed_by_id  
43 - article.author_name = Person.find(article.last_changed_by_id).name  
44 - end  
45 - end  
46 -  
47 belongs_to :profile 43 belongs_to :profile
48 validates_presence_of :profile_id, :name 44 validates_presence_of :profile_id, :name
49 validates_presence_of :slug, :path, :if => lambda { |article| !article.name.blank? } 45 validates_presence_of :slug, :path, :if => lambda { |article| !article.name.blank? }
@@ -53,6 +49,7 @@ class Article &lt; ActiveRecord::Base @@ -53,6 +49,7 @@ class Article &lt; ActiveRecord::Base
53 validates_uniqueness_of :slug, :scope => ['profile_id', 'parent_id'], :message => N_('The title (article name) is already being used by another article, please use another title.'), :if => lambda { |article| !article.slug.blank? } 49 validates_uniqueness_of :slug, :scope => ['profile_id', 'parent_id'], :message => N_('The title (article name) is already being used by another article, please use another title.'), :if => lambda { |article| !article.slug.blank? }
54 50
55 belongs_to :last_changed_by, :class_name => 'Person', :foreign_key => 'last_changed_by_id' 51 belongs_to :last_changed_by, :class_name => 'Person', :foreign_key => 'last_changed_by_id'
  52 + belongs_to :created_by, :class_name => 'Person', :foreign_key => 'created_by_id'
56 53
57 has_many :comments, :class_name => 'Comment', :foreign_key => 'source_id', :dependent => :destroy, :order => 'created_at asc' 54 has_many :comments, :class_name => 'Comment', :foreign_key => 'source_id', :dependent => :destroy, :order => 'created_at asc'
58 55
@@ -87,6 +84,11 @@ class Article &lt; ActiveRecord::Base @@ -87,6 +84,11 @@ class Article &lt; ActiveRecord::Base
87 article.parent = article.profile.blog 84 article.parent = article.profile.blog
88 end 85 end
89 end 86 end
  87 +
  88 + if article.created_by
  89 + article.author_name = article.created_by.name
  90 + end
  91 +
90 end 92 end
91 93
92 after_destroy :destroy_activity 94 after_destroy :destroy_activity
@@ -96,11 +98,11 @@ class Article &lt; ActiveRecord::Base @@ -96,11 +98,11 @@ class Article &lt; ActiveRecord::Base
96 98
97 xss_terminate :only => [ :name ], :on => 'validation', :with => 'white_list' 99 xss_terminate :only => [ :name ], :on => 'validation', :with => 'white_list'
98 100
99 - named_scope :in_category, lambda { |category| 101 + scope :in_category, lambda { |category|
100 {:include => 'categories_including_virtual', :conditions => { 'categories.id' => category.id }} 102 {:include => 'categories_including_virtual', :conditions => { 'categories.id' => category.id }}
101 } 103 }
102 104
103 - named_scope :by_range, lambda { |range| { 105 + scope :by_range, lambda { |range| {
104 :conditions => [ 106 :conditions => [
105 'published_at BETWEEN :start_date AND :end_date', { :start_date => range.first, :end_date => range.last } 107 'published_at BETWEEN :start_date AND :end_date', { :start_date => range.first, :end_date => range.last }
106 ] 108 ]
@@ -148,7 +150,7 @@ class Article &lt; ActiveRecord::Base @@ -148,7 +150,7 @@ class Article &lt; ActiveRecord::Base
148 self.profile 150 self.profile
149 end 151 end
150 152
151 - def self.human_attribute_name(attrib) 153 + def self.human_attribute_name(attrib, options = {})
152 case attrib.to_sym 154 case attrib.to_sym
153 when :name 155 when :name
154 _('Title') 156 _('Title')
@@ -219,14 +221,19 @@ class Article &lt; ActiveRecord::Base @@ -219,14 +221,19 @@ class Article &lt; ActiveRecord::Base
219 221
220 # retrieves all articles belonging to the given +profile+ that are not 222 # retrieves all articles belonging to the given +profile+ that are not
221 # sub-articles of any other article. 223 # sub-articles of any other article.
222 - named_scope :top_level_for, lambda { |profile| 224 + scope :top_level_for, lambda { |profile|
223 {:conditions => [ 'parent_id is null and profile_id = ?', profile.id ]} 225 {:conditions => [ 'parent_id is null and profile_id = ?', profile.id ]}
224 } 226 }
225 227
226 - named_scope :join_profile, :joins => [:profile] 228 + scope :public,
  229 + :conditions => [ "advertise = ? AND published = ? AND profiles.visible = ? AND profiles.public_profile = ?", true, true, true, true ], :joins => [:profile]
227 230
228 - named_scope :public,  
229 - :conditions => [ "advertise = ? AND published = ? AND profiles.visible = ? AND profiles.public_profile = ?", true, true, true, true ] 231 + scope :more_recent,
  232 + :conditions => [ "advertise = ? AND published = ? AND profiles.visible = ? AND profiles.public_profile = ? AND
  233 + ((articles.type != ?) OR articles.type is NULL)",
  234 + true, true, true, true, 'RssFeed'
  235 + ],
  236 + :order => 'articles.published_at desc, articles.id desc'
230 237
231 # retrives the most commented articles, sorted by the comment count (largest 238 # retrives the most commented articles, sorted by the comment count (largest
232 # first) 239 # first)
@@ -234,7 +241,8 @@ class Article &lt; ActiveRecord::Base @@ -234,7 +241,8 @@ class Article &lt; ActiveRecord::Base
234 paginate(:order => 'comments_count DESC', :page => 1, :per_page => limit) 241 paginate(:order => 'comments_count DESC', :page => 1, :per_page => limit)
235 end 242 end
236 243
237 - named_scope :relevant_as_recent, :conditions => ["(articles.type != 'UploadedFile' and articles.type != 'RssFeed' and articles.type != 'Blog') OR articles.type is NULL"] 244 + scope :more_popular, :order => 'hits DESC'
  245 + scope :relevant_as_recent, :conditions => ["(articles.type != 'UploadedFile' and articles.type != 'RssFeed' and articles.type != 'Blog') OR articles.type is NULL"]
238 246
239 def self.recent(limit = nil, extra_conditions = {}, pagination = true) 247 def self.recent(limit = nil, extra_conditions = {}, pagination = true)
240 result = scoped({:conditions => extra_conditions}). 248 result = scoped({:conditions => extra_conditions}).
@@ -243,13 +251,6 @@ class Article &lt; ActiveRecord::Base @@ -243,13 +251,6 @@ class Article &lt; ActiveRecord::Base
243 limit(limit). 251 limit(limit).
244 order(['articles.published_at desc', 'articles.id desc']) 252 order(['articles.published_at desc', 'articles.id desc'])
245 253
246 - if !( scoped_methods && scoped_methods.last &&  
247 - scoped_methods.last[:find] &&  
248 - scoped_methods.last[:find][:joins] &&  
249 - scoped_methods.last[:find][:joins].index('profiles') )  
250 - result = result.includes(:profile)  
251 - end  
252 -  
253 pagination ? result.paginate({:page => 1, :per_page => limit}) : result 254 pagination ? result.paginate({:page => 1, :per_page => limit}) : result
254 end 255 end
255 256
@@ -261,16 +262,18 @@ class Article &lt; ActiveRecord::Base @@ -261,16 +262,18 @@ class Article &lt; ActiveRecord::Base
261 # (To override short format representation, override the lead method) 262 # (To override short format representation, override the lead method)
262 def to_html(options = {}) 263 def to_html(options = {})
263 if options[:format] == 'short' 264 if options[:format] == 'short'
264 - display_short_format(self) 265 + article = self
  266 + proc do
  267 + display_short_format(article)
  268 + end
265 else 269 else
266 body || '' 270 body || ''
267 end 271 end
268 end 272 end
269 273
270 - include ApplicationHelper  
271 def reported_version(options = {}) 274 def reported_version(options = {})
272 article = self 275 article = self
273 - search_path = File.join(Rails.root, 'app', 'views', 'shared', 'reported_versions') 276 + search_path = Rails.root.join('app', 'views', 'shared', 'reported_versions')
274 partial_path = File.join('shared', 'reported_versions', partial_for_class_in_view_path(article.class, search_path)) 277 partial_path = File.join('shared', 'reported_versions', partial_for_class_in_view_path(article.class, search_path))
275 lambda { render_to_string(:partial => partial_path, :locals => {:article => article}) } 278 lambda { render_to_string(:partial => partial_path, :locals => {:article => article}) }
276 end 279 end
@@ -371,7 +374,7 @@ class Article &lt; ActiveRecord::Base @@ -371,7 +374,7 @@ class Article &lt; ActiveRecord::Base
371 {} 374 {}
372 end 375 end
373 376
374 - named_scope :native_translations, :conditions => { :translation_of_id => nil } 377 + scope :native_translations, :conditions => { :translation_of_id => nil }
375 378
376 def translatable? 379 def translatable?
377 false 380 false
@@ -407,7 +410,7 @@ class Article &lt; ActiveRecord::Base @@ -407,7 +410,7 @@ class Article &lt; ActiveRecord::Base
407 410
408 def native_translation_must_have_language 411 def native_translation_must_have_language
409 unless self.translation_of.nil? 412 unless self.translation_of.nil?
410 - errors.add_to_base(N_('A language must be choosen for the native article')) if self.translation_of.language.blank? 413 + errors.add(:base, N_('A language must be choosen for the native article')) if self.translation_of.language.blank?
411 end 414 end
412 end 415 end
413 416
@@ -449,17 +452,17 @@ class Article &lt; ActiveRecord::Base @@ -449,17 +452,17 @@ class Article &lt; ActiveRecord::Base
449 ['TextArticle', 'TextileArticle', 'TinyMceArticle'] 452 ['TextArticle', 'TextileArticle', 'TinyMceArticle']
450 end 453 end
451 454
452 - named_scope :published, :conditions => { :published => true }  
453 - named_scope :folders, lambda {|profile|{:conditions => { :type => profile.folder_types} }}  
454 - named_scope :no_folders, lambda {|profile|{:conditions => ['type NOT IN (?)', profile.folder_types]}}  
455 - named_scope :galleries, :conditions => { :type => 'Gallery' }  
456 - named_scope :images, :conditions => { :is_image => true }  
457 - named_scope :text_articles, :conditions => [ 'articles.type IN (?)', text_article_types ]  
458 - named_scope :with_types, lambda { |types| { :conditions => [ 'articles.type IN (?)', types ] } } 455 + scope :published, :conditions => { :published => true }
  456 + scope :folders, lambda {|profile|{:conditions => { :type => profile.folder_types} }}
  457 + scope :no_folders, lambda {|profile|{:conditions => ['type NOT IN (?)', profile.folder_types]}}
  458 + scope :galleries, :conditions => { :type => 'Gallery' }
  459 + scope :images, :conditions => { :is_image => true }
  460 + scope :text_articles, :conditions => [ 'articles.type IN (?)', text_article_types ]
  461 + scope :with_types, lambda { |types| { :conditions => [ 'articles.type IN (?)', types ] } }
459 462
460 - named_scope :more_popular, :order => 'hits DESC'  
461 - named_scope :more_comments, :order => "comments_count DESC"  
462 - named_scope :more_recent, :order => "created_at DESC" 463 + scope :more_popular, :order => 'hits DESC'
  464 + scope :more_comments, :order => "comments_count DESC"
  465 + scope :more_recent, :order => "created_at DESC"
463 466
464 def self.display_filter(user, profile) 467 def self.display_filter(user, profile)
465 return {:conditions => ['published = ?', true]} if !user 468 return {:conditions => ['published = ?', true]} if !user
@@ -531,13 +534,23 @@ class Article &lt; ActiveRecord::Base @@ -531,13 +534,23 @@ class Article &lt; ActiveRecord::Base
531 def copy(options = {}) 534 def copy(options = {})
532 attrs = attributes.reject! { |key, value| ATTRIBUTES_NOT_COPIED.include?(key.to_sym) } 535 attrs = attributes.reject! { |key, value| ATTRIBUTES_NOT_COPIED.include?(key.to_sym) }
533 attrs.merge!(options) 536 attrs.merge!(options)
534 - self.class.create(attrs) 537 + object = self.class.new
  538 + attrs.each do |key, value|
  539 + object.send(key.to_s+'=', value)
  540 + end
  541 + object.save
  542 + object
535 end 543 end
536 544
537 def copy!(options = {}) 545 def copy!(options = {})
538 attrs = attributes.reject! { |key, value| ATTRIBUTES_NOT_COPIED.include?(key.to_sym) } 546 attrs = attributes.reject! { |key, value| ATTRIBUTES_NOT_COPIED.include?(key.to_sym) }
539 attrs.merge!(options) 547 attrs.merge!(options)
540 - self.class.create!(attrs) 548 + object = self.class.new
  549 + attrs.each do |key, value|
  550 + object.send(key.to_s+'=', value)
  551 + end
  552 + object.save!
  553 + object
541 end 554 end
542 555
543 ATTRIBUTES_NOT_COPIED = [ 556 ATTRIBUTES_NOT_COPIED = [
@@ -617,30 +630,28 @@ class Article &lt; ActiveRecord::Base @@ -617,30 +630,28 @@ class Article &lt; ActiveRecord::Base
617 630
618 def author(version_number = nil) 631 def author(version_number = nil)
619 if version_number 632 if version_number
620 - version = versions.find_by_version(version_number) 633 + version = self.versions.find_by_version(version_number)
621 author_id = version.last_changed_by_id if version 634 author_id = version.last_changed_by_id if version
622 - Person.exists?(author_id) ? Person.find(author_id) : nil  
623 else 635 else
624 - if versions.empty?  
625 - last_changed_by  
626 - else  
627 - author_id = versions.first.last_changed_by_id  
628 - Person.exists?(author_id) ? Person.find(author_id) : nil  
629 - end 636 + author_id = self.created_by_id
630 end 637 end
  638 +
  639 + environment.people.find_by_id(author_id)
631 end 640 end
632 641
633 def author_name(version_number = nil) 642 def author_name(version_number = nil)
634 - person = version_number ? author(version_number) : author 643 + person = author(version_number)
635 person ? person.name : (setting[:author_name] || _('Unknown')) 644 person ? person.name : (setting[:author_name] || _('Unknown'))
636 end 645 end
637 646
638 - def author_url  
639 - author ? author.url : nil 647 + def author_url(version_number = nil)
  648 + person = author(version_number)
  649 + person ? person.url : nil
640 end 650 end
641 651
642 - def author_id  
643 - author ? author.id : nil 652 + def author_id(version_number = nil)
  653 + person = author(version_number)
  654 + person ? person.id : nil
644 end 655 end
645 656
646 def version_license(version_number = nil) 657 def version_license(version_number = nil)
@@ -734,7 +745,7 @@ class Article &lt; ActiveRecord::Base @@ -734,7 +745,7 @@ class Article &lt; ActiveRecord::Base
734 745
735 def sanitize_tag_list 746 def sanitize_tag_list
736 sanitizer = HTML::FullSanitizer.new 747 sanitizer = HTML::FullSanitizer.new
737 - self.tag_list.names.map!{|i| strip_tag_name sanitizer.sanitize(i) } 748 + self.tag_list.map!{|i| strip_tag_name sanitizer.sanitize(i) }
738 end 749 end
739 750
740 def strip_tag_name(tag_name) 751 def strip_tag_name(tag_name)
app/models/article_block.rb
1 class ArticleBlock < Block 1 class ArticleBlock < Block
2 2
  3 + attr_accessible :article_id
  4 +
3 def self.description 5 def self.description
4 _('Display one of your contents') 6 _('Display one of your contents')
5 end 7 end
@@ -10,7 +12,7 @@ class ArticleBlock &lt; Block @@ -10,7 +12,7 @@ class ArticleBlock &lt; Block
10 12
11 def content(args={}) 13 def content(args={})
12 block = self 14 block = self
13 - lambda do 15 + proc do
14 block_title(block.title) + 16 block_title(block.title) +
15 (block.article ? article_to_html(FilePresenter.for(block.article), 17 (block.article ? article_to_html(FilePresenter.for(block.article),
16 :gallery_view => false, 18 :gallery_view => false,
app/models/block.rb
1 class Block < ActiveRecord::Base 1 class Block < ActiveRecord::Base
2 2
  3 + attr_accessible :title, :display, :limit, :box_id, :posts_per_page, :visualization_format, :language, :display_user, :box
  4 +
3 # to be able to generate HTML 5 # to be able to generate HTML
4 include ActionView::Helpers::UrlHelper 6 include ActionView::Helpers::UrlHelper
5 include ActionView::Helpers::TagHelper 7 include ActionView::Helpers::TagHelper
@@ -14,7 +16,7 @@ class Block &lt; ActiveRecord::Base @@ -14,7 +16,7 @@ class Block &lt; ActiveRecord::Base
14 16
15 acts_as_having_settings 17 acts_as_having_settings
16 18
17 - named_scope :enabled, :conditions => { :enabled => true } 19 + scope :enabled, :conditions => { :enabled => true }
18 20
19 def embedable? 21 def embedable?
20 false 22 false
@@ -22,7 +24,7 @@ class Block &lt; ActiveRecord::Base @@ -22,7 +24,7 @@ class Block &lt; ActiveRecord::Base
22 24
23 def embed_code 25 def embed_code
24 me = self 26 me = self
25 - lambda do 27 + proc do
26 content_tag('iframe', '', 28 content_tag('iframe', '',
27 :src => url_for(:controller => 'embed', :action => 'block', :id => me.id, :only_path => false), 29 :src => url_for(:controller => 'embed', :action => 'block', :id => me.id, :only_path => false),
28 :frameborder => 0, 30 :frameborder => 0,
@@ -196,10 +198,10 @@ class Block &lt; ActiveRecord::Base @@ -196,10 +198,10 @@ class Block &lt; ActiveRecord::Base
196 end 198 end
197 199
198 DISPLAY_OPTIONS = { 200 DISPLAY_OPTIONS = {
199 - 'always' => __('In all pages'),  
200 - 'home_page_only' => __('Only in the homepage'),  
201 - 'except_home_page' => __('In all pages, except in the homepage'),  
202 - 'never' => __('Don\'t display'), 201 + 'always' => _('In all pages'),
  202 + 'home_page_only' => _('Only in the homepage'),
  203 + 'except_home_page' => _('In all pages, except in the homepage'),
  204 + 'never' => _('Don\'t display'),
203 } 205 }
204 206
205 def display_options_available 207 def display_options_available
@@ -212,14 +214,14 @@ class Block &lt; ActiveRecord::Base @@ -212,14 +214,14 @@ class Block &lt; ActiveRecord::Base
212 214
213 def display_user_options 215 def display_user_options
214 @display_user_options ||= { 216 @display_user_options ||= {
215 - 'all' => __('All users'),  
216 - 'logged' => __('Logged'),  
217 - 'not_logged' => __('Not logged'), 217 + 'all' => _('All users'),
  218 + 'logged' => _('Logged'),
  219 + 'not_logged' => _('Not logged'),
218 } 220 }
219 end 221 end
220 222
221 def duplicate 223 def duplicate
222 - duplicated_block = self.clone 224 + duplicated_block = self.dup
223 duplicated_block.display = 'never' 225 duplicated_block.display = 'never'
224 duplicated_block.created_at = nil 226 duplicated_block.created_at = nil
225 duplicated_block.updated_at = nil 227 duplicated_block.updated_at = nil
app/models/blog.rb
1 class Blog < Folder 1 class Blog < Folder
2 2
  3 + attr_accessible :visualization_format
  4 +
3 acts_as_having_posts 5 acts_as_having_posts
4 include PostsLimit 6 include PostsLimit
5 7
@@ -26,7 +28,7 @@ class Blog &lt; Folder @@ -26,7 +28,7 @@ class Blog &lt; Folder
26 include ActionView::Helpers::TagHelper 28 include ActionView::Helpers::TagHelper
27 def to_html(options = {}) 29 def to_html(options = {})
28 me = self 30 me = self
29 - lambda do 31 + proc do
30 render :file => 'content_viewer/blog_page', :locals => { :blog=>me, :inside_block=>options[:inside_block] } 32 render :file => 'content_viewer/blog_page', :locals => { :blog=>me, :inside_block=>options[:inside_block] }
31 end 33 end
32 end 34 end
@@ -46,12 +48,14 @@ class Blog &lt; Folder @@ -46,12 +48,14 @@ class Blog &lt; Folder
46 self.external_feed_data = efeed 48 self.external_feed_data = efeed
47 end 49 end
48 50
49 - def validate 51 + validate :prepare_external_feed
  52 +
  53 + def prepare_external_feed
50 unless self.external_feed_data.nil? 54 unless self.external_feed_data.nil?
51 if self.external_feed(true) && self.external_feed.id == self.external_feed_data[:id].to_i 55 if self.external_feed(true) && self.external_feed.id == self.external_feed_data[:id].to_i
52 self.external_feed.attributes = self.external_feed_data 56 self.external_feed.attributes = self.external_feed_data
53 else 57 else
54 - self.build_external_feed(self.external_feed_data) 58 + self.build_external_feed(self.external_feed_data, :without_protection => true)
55 end 59 end
56 self.external_feed.valid? 60 self.external_feed.valid?
57 self.external_feed.errors.delete(:blog_id) # dont validate here relation: external_feed <-> blog 61 self.external_feed.errors.delete(:blog_id) # dont validate here relation: external_feed <-> blog
app/models/blog_archives_block.rb
@@ -2,7 +2,8 @@ class BlogArchivesBlock &lt; Block @@ -2,7 +2,8 @@ class BlogArchivesBlock &lt; Block
2 2
3 include ActionView::Helpers::TagHelper 3 include ActionView::Helpers::TagHelper
4 include ActionView::Helpers::UrlHelper 4 include ActionView::Helpers::UrlHelper
5 - include ActionController::UrlWriter 5 + include ActionView::Helpers
  6 + include Rails.application.routes.url_helpers
6 include ActionView::Helpers::AssetTagHelper 7 include ActionView::Helpers::AssetTagHelper
7 include DatesHelper 8 include DatesHelper
8 9
@@ -31,10 +32,10 @@ class BlogArchivesBlock &lt; Block @@ -31,10 +32,10 @@ class BlogArchivesBlock &lt; Block
31 return nil unless owner_blog 32 return nil unless owner_blog
32 results = '' 33 results = ''
33 posts = visible_posts(args[:person]) 34 posts = visible_posts(args[:person])
34 - posts.count(:all, :group => 'EXTRACT(YEAR FROM published_at)').sort_by {|year, count| -year.to_i}.each do |year, count| 35 + posts.except(:order).count(:all, :group => 'EXTRACT(YEAR FROM published_at)').sort_by {|year, count| -year.to_i}.each do |year, count|
35 results << content_tag('li', content_tag('strong', "#{year} (#{count})")) 36 results << content_tag('li', content_tag('strong', "#{year} (#{count})"))
36 results << "<ul class='#{year}-archive'>" 37 results << "<ul class='#{year}-archive'>"
37 - posts.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| 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|
38 month_name = gettext(MONTHS[month.to_i - 1]) 39 month_name = gettext(MONTHS[month.to_i - 1])
39 results << content_tag('li', link_to("#{month_name} (#{count})", owner_blog.url.merge(:year => year, :month => month))) 40 results << content_tag('li', link_to("#{month_name} (#{count})", owner_blog.url.merge(:year => year, :month => month)))
40 end 41 end
app/models/box.rb
@@ -3,9 +3,11 @@ class Box &lt; ActiveRecord::Base @@ -3,9 +3,11 @@ class Box &lt; ActiveRecord::Base
3 acts_as_list :scope => 'owner_id = #{owner_id} and owner_type = \'#{owner_type}\'' 3 acts_as_list :scope => 'owner_id = #{owner_id} and owner_type = \'#{owner_type}\''
4 has_many :blocks, :dependent => :destroy, :order => 'position' 4 has_many :blocks, :dependent => :destroy, :order => 'position'
5 5
  6 + attr_accessible :owner
  7 +
6 include Noosfero::Plugin::HotSpot 8 include Noosfero::Plugin::HotSpot
7 9
8 - named_scope :with_position, :conditions => ['boxes.position > 0'] 10 + scope :with_position, :conditions => ['boxes.position > 0']
9 11
10 def environment 12 def environment
11 owner ? (owner.kind_of?(Environment) ? owner : owner.environment) : nil 13 owner ? (owner.kind_of?(Environment) ? owner : owner.environment) : nil
@@ -32,14 +34,11 @@ class Box &lt; ActiveRecord::Base @@ -32,14 +34,11 @@ class Box &lt; ActiveRecord::Base
32 FansBlock, 34 FansBlock,
33 FavoriteEnterprisesBlock, 35 FavoriteEnterprisesBlock,
34 FeedReaderBlock, 36 FeedReaderBlock,
35 - FriendsBlock,  
36 HighlightsBlock, 37 HighlightsBlock,
37 LinkListBlock, 38 LinkListBlock,
38 LoginBlock, 39 LoginBlock,
39 MainBlock, 40 MainBlock,
40 - MembersBlock,  
41 MyNetworkBlock, 41 MyNetworkBlock,
42 - PeopleBlock,  
43 ProfileImageBlock, 42 ProfileImageBlock,
44 RawHTMLBlock, 43 RawHTMLBlock,
45 RecentDocumentsBlock, 44 RecentDocumentsBlock,
@@ -61,14 +60,11 @@ class Box &lt; ActiveRecord::Base @@ -61,14 +60,11 @@ class Box &lt; ActiveRecord::Base
61 FavoriteEnterprisesBlock, 60 FavoriteEnterprisesBlock,
62 FeaturedProductsBlock, 61 FeaturedProductsBlock,
63 FeedReaderBlock, 62 FeedReaderBlock,
64 - FriendsBlock,  
65 HighlightsBlock, 63 HighlightsBlock,
66 LinkListBlock, 64 LinkListBlock,
67 LocationBlock, 65 LocationBlock,
68 LoginBlock, 66 LoginBlock,
69 - MembersBlock,  
70 MyNetworkBlock, 67 MyNetworkBlock,
71 - PeopleBlock,  
72 ProductsBlock, 68 ProductsBlock,
73 ProductCategoriesBlock, 69 ProductCategoriesBlock,
74 ProfileImageBlock, 70 ProfileImageBlock,
app/models/categories_block.rb
@@ -8,6 +8,8 @@ class CategoriesBlock &lt; Block @@ -8,6 +8,8 @@ class CategoriesBlock &lt; Block
8 8
9 settings_items :category_types, :type => Array, :default => [] 9 settings_items :category_types, :type => Array, :default => []
10 10
  11 + attr_accessible :category_types
  12 +
11 def self.description 13 def self.description
12 _("Categories Menu") 14 _("Categories Menu")
13 end 15 end
@@ -30,7 +32,7 @@ class CategoriesBlock &lt; Block @@ -30,7 +32,7 @@ class CategoriesBlock &lt; Block
30 32
31 def content(args={}) 33 def content(args={})
32 block = self 34 block = self
33 - lambda do 35 + proc do
34 render :file => 'blocks/categories', :locals => { :block => block } 36 render :file => 'blocks/categories', :locals => { :block => block }
35 end 37 end
36 end 38 end
app/models/category.rb
1 class Category < ActiveRecord::Base 1 class Category < ActiveRecord::Base
2 2
  3 + attr_accessible :name, :parent_id, :display_color, :display_in_menu, :image_builder, :environment, :parent
  4 +
3 SEARCHABLE_FIELDS = { 5 SEARCHABLE_FIELDS = {
4 :name => 10, 6 :name => 10,
5 :acronym => 5, 7 :acronym => 5,
@@ -16,11 +18,11 @@ class Category &lt; ActiveRecord::Base @@ -16,11 +18,11 @@ class Category &lt; ActiveRecord::Base
16 validates_uniqueness_of :display_color, :scope => :environment_id, :if => (lambda { |cat| ! cat.display_color.nil? }), :message => N_('{fn} was already assigned to another category.').fix_i18n 18 validates_uniqueness_of :display_color, :scope => :environment_id, :if => (lambda { |cat| ! cat.display_color.nil? }), :message => N_('{fn} was already assigned to another category.').fix_i18n
17 19
18 # Finds all top level categories for a given environment. 20 # Finds all top level categories for a given environment.
19 - named_scope :top_level_for, lambda { |environment| 21 + scope :top_level_for, lambda { |environment|
20 {:conditions => ['parent_id is null and environment_id = ?', environment.id ]} 22 {:conditions => ['parent_id is null and environment_id = ?', environment.id ]}
21 } 23 }
22 24
23 - named_scope :on_level, lambda { |parent| {:conditions => {:parent_id => parent}} } 25 + scope :on_level, lambda { |parent| {:conditions => {:parent_id => parent}} }
24 26
25 acts_as_filesystem 27 acts_as_filesystem
26 28
@@ -40,7 +42,7 @@ class Category &lt; ActiveRecord::Base @@ -40,7 +42,7 @@ class Category &lt; ActiveRecord::Base
40 42
41 acts_as_having_image 43 acts_as_having_image
42 44
43 - named_scope :from_types, lambda { |types| 45 + scope :from_types, lambda { |types|
44 types.select{ |t| t.blank? }.empty? ? 46 types.select{ |t| t.blank? }.empty? ?
45 { :conditions => { :type => types } } : 47 { :conditions => { :type => types } } :
46 { :conditions => [ "type IN (?) OR type IS NULL", types.reject{ |t| t.blank? } ] } 48 { :conditions => [ "type IN (?) OR type IS NULL", types.reject{ |t| t.blank? } ] }
@@ -67,7 +69,7 @@ class Category &lt; ActiveRecord::Base @@ -67,7 +69,7 @@ class Category &lt; ActiveRecord::Base
67 end 69 end
68 70
69 def recent_comments(limit = 10) 71 def recent_comments(limit = 10)
70 - comments.paginate(:all, :order => 'created_at DESC, comments.id DESC', :page => 1, :per_page => limit) 72 + comments.paginate(:order => 'created_at DESC, comments.id DESC', :page => 1, :per_page => limit)
71 end 73 end
72 74
73 def most_commented_articles(limit = 10) 75 def most_commented_articles(limit = 10)
app/models/certifier.rb
1 class Certifier < ActiveRecord::Base 1 class Certifier < ActiveRecord::Base
2 2
  3 + attr_accessible :name, :environment
  4 +
3 SEARCHABLE_FIELDS = { 5 SEARCHABLE_FIELDS = {
4 :name => 10, 6 :name => 10,
5 :description => 3, 7 :description => 3,
app/models/change_password.rb
@@ -2,7 +2,7 @@ class ChangePassword &lt; Task @@ -2,7 +2,7 @@ class ChangePassword &lt; Task
2 2
3 attr_accessor :password, :password_confirmation 3 attr_accessor :password, :password_confirmation
4 4
5 - def self.human_attribute_name(attrib) 5 + def self.human_attribute_name(attrib, options = {})
6 case attrib.to_sym 6 case attrib.to_sym
7 when :password 7 when :password
8 _('Password') 8 _('Password')
@@ -58,13 +58,13 @@ class ChangePassword &lt; Task @@ -58,13 +58,13 @@ class ChangePassword &lt; Task
58 _('Your password was changed successfully.') 58 _('Your password was changed successfully.')
59 end 59 end
60 60
61 - include ActionController::UrlWriter 61 + include Rails.application.routes.url_helpers
62 def task_created_message 62 def task_created_message
63 hostname = self.requestor.environment.default_hostname 63 hostname = self.requestor.environment.default_hostname
64 code = self.code 64 code = self.code
65 url = url_for(:host => hostname, :controller => 'account', :action => 'new_password', :code => code) 65 url = url_for(:host => hostname, :controller => 'account', :action => 'new_password', :code => code)
66 66
67 - lambda do 67 + proc do
68 _("In order to change your password, please visit the following address:\n\n%s\n\nIf you did not required any change to your password just desconsider this email.") % url 68 _("In order to change your password, please visit the following address:\n\n%s\n\nIf you did not required any change to your password just desconsider this email.") % url
69 end 69 end
70 end 70 end
app/models/city.rb
1 class City < Region 1 class City < Region
  2 + attr_accessible :name, :parent_id
2 end 3 end
app/models/comment.rb
@@ -6,6 +6,8 @@ class Comment &lt; ActiveRecord::Base @@ -6,6 +6,8 @@ class Comment &lt; ActiveRecord::Base
6 :body => 2, 6 :body => 2,
7 } 7 }
8 8
  9 + attr_accessible :body, :author, :name, :email, :title, :reply_of_id, :source
  10 +
9 validates_presence_of :body 11 validates_presence_of :body
10 12
11 belongs_to :source, :counter_cache => true, :polymorphic => true 13 belongs_to :source, :counter_cache => true, :polymorphic => true
@@ -16,7 +18,7 @@ class Comment &lt; ActiveRecord::Base @@ -16,7 +18,7 @@ class Comment &lt; ActiveRecord::Base
16 has_many :children, :class_name => 'Comment', :foreign_key => 'reply_of_id', :dependent => :destroy 18 has_many :children, :class_name => 'Comment', :foreign_key => 'reply_of_id', :dependent => :destroy
17 belongs_to :reply_of, :class_name => 'Comment', :foreign_key => 'reply_of_id' 19 belongs_to :reply_of, :class_name => 'Comment', :foreign_key => 'reply_of_id'
18 20
19 - named_scope :without_reply, :conditions => ['reply_of_id IS NULL'] 21 + scope :without_reply, :conditions => ['reply_of_id IS NULL']
20 22
21 # unauthenticated authors: 23 # unauthenticated authors:
22 validates_presence_of :name, :if => (lambda { |record| !record.email.blank? }) 24 validates_presence_of :name, :if => (lambda { |record| !record.email.blank? })
@@ -127,11 +129,11 @@ class Comment &lt; ActiveRecord::Base @@ -127,11 +129,11 @@ class Comment &lt; ActiveRecord::Base
127 def notify_by_mail 129 def notify_by_mail
128 if source.kind_of?(Article) && article.notify_comments? 130 if source.kind_of?(Article) && article.notify_comments?
129 if !notification_emails.empty? 131 if !notification_emails.empty?
130 - Comment::Notifier.deliver_mail(self) 132 + Comment::Notifier.notification(self).deliver
131 end 133 end
132 emails = article.followers - [author_email] 134 emails = article.followers - [author_email]
133 if !emails.empty? 135 if !emails.empty?
134 - Comment::Notifier.deliver_mail_to_followers(self, emails) 136 + Comment::Notifier.mail_to_followers(self, emails).deliver
135 end 137 end
136 end 138 end
137 end 139 end
@@ -168,40 +170,6 @@ class Comment &lt; ActiveRecord::Base @@ -168,40 +170,6 @@ class Comment &lt; ActiveRecord::Base
168 body || '' 170 body || ''
169 end 171 end
170 172
171 - class Notifier < ActionMailer::Base  
172 - def mail(comment)  
173 - profile = comment.article.profile  
174 - recipients comment.notification_emails  
175 - from "#{profile.environment.name} <#{profile.environment.noreply_email}>"  
176 - subject _("[%s] you got a new comment!") % [profile.environment.name]  
177 - body :recipient => profile.nickname || profile.name,  
178 - :sender => comment.author_name,  
179 - :sender_link => comment.author_link,  
180 - :article_title => comment.article.name,  
181 - :comment_url => comment.url,  
182 - :comment_title => comment.title,  
183 - :comment_body => comment.body,  
184 - :environment => profile.environment.name,  
185 - :url => profile.environment.top_url  
186 - end  
187 - def mail_to_followers(comment, emails)  
188 - profile = comment.article.profile  
189 - bcc emails  
190 - from "#{profile.environment.name} <#{profile.environment.noreply_email}>"  
191 - subject _("[%s] %s commented on a content of %s") % [profile.environment.name, comment.author_name, profile.short_name]  
192 - body :recipient => profile.nickname || profile.name,  
193 - :sender => comment.author_name,  
194 - :sender_link => comment.author_link,  
195 - :article_title => comment.article.name,  
196 - :comment_url => comment.url,  
197 - :unsubscribe_url => comment.article.view_url.merge({:unfollow => true}),  
198 - :comment_title => comment.title,  
199 - :comment_body => comment.body,  
200 - :environment => profile.environment.name,  
201 - :url => profile.environment.top_url  
202 - end  
203 - end  
204 -  
205 def rejected? 173 def rejected?
206 @rejected 174 @rejected
207 end 175 end
app/models/communities_block.rb
1 class CommunitiesBlock < ProfileListBlock 1 class CommunitiesBlock < ProfileListBlock
2 2
  3 + attr_accessible :accessor_id, :accessor_type, :role_id, :resource_id, :resource_type
  4 +
3 def self.description 5 def self.description
4 - __('Communities') 6 + _('Communities')
5 end 7 end
6 8
7 def default_title 9 def default_title
8 - n__('{#} community', '{#} communities', profile_count) 10 + n_('{#} community', '{#} communities', profile_count)
9 end 11 end
10 12
11 def help 13 def help
12 - __('This block displays the communities in which the user is a member.') 14 + _('This block displays the communities in which the user is a member.')
13 end 15 end
14 16
15 def footer 17 def footer
16 owner = self.owner 18 owner = self.owner
17 case owner 19 case owner
18 when Profile 20 when Profile
19 - lambda do 21 + lambda do |context|
20 link_to s_('communities|View all'), :profile => owner.identifier, :controller => 'profile', :action => 'communities' 22 link_to s_('communities|View all'), :profile => owner.identifier, :controller => 'profile', :action => 'communities'
21 end 23 end
22 when Environment 24 when Environment
23 - lambda do 25 + lambda do |context|
24 link_to s_('communities|View all'), :controller => 'search', :action => 'communities' 26 link_to s_('communities|View all'), :controller => 'search', :action => 'communities'
25 end 27 end
26 else 28 else
app/models/community.rb
1 class Community < Organization 1 class Community < Organization
2 2
  3 + attr_accessible :accessor_id, :accessor_type, :role_id, :resource_id, :resource_type
  4 + after_destroy :check_invite_member_for_destroy
  5 +
3 def self.type_name 6 def self.type_name
4 _('Community') 7 _('Community')
5 end 8 end
@@ -8,7 +11,6 @@ class Community &lt; Organization @@ -8,7 +11,6 @@ class Community &lt; Organization
8 N_('Language') 11 N_('Language')
9 12
10 settings_items :language 13 settings_items :language
11 - settings_items :zip_code, :city, :state, :country  
12 14
13 extend SetProfileRegionFromCityState::ClassMethods 15 extend SetProfileRegionFromCityState::ClassMethods
14 set_profile_region_from_city_state 16 set_profile_region_from_city_state
@@ -17,12 +19,22 @@ class Community &lt; Organization @@ -17,12 +19,22 @@ class Community &lt; Organization
17 community.moderated_articles = true if community.environment.enabled?('organizations_are_moderated_by_default') 19 community.moderated_articles = true if community.environment.enabled?('organizations_are_moderated_by_default')
18 end 20 end
19 21
  22 + def check_invite_member_for_destroy
  23 + InviteMember.pending.select { |task| task.community_id == self.id }.map(&:destroy)
  24 + end
  25 +
  26 + # Since it's not a good idea to add the environment as accessible through
  27 + # mass-assignment, we set it manually here. Note that this requires that the
  28 + # places that call this method are safe from mass-assignment by setting the
  29 + # environment key themselves.
20 def self.create_after_moderation(requestor, attributes = {}) 30 def self.create_after_moderation(requestor, attributes = {})
  31 + environment = attributes.delete(:environment)
21 community = Community.new(attributes) 32 community = Community.new(attributes)
  33 + community.environment = environment
22 if community.environment.enabled?('admin_must_approve_new_communities') 34 if community.environment.enabled?('admin_must_approve_new_communities')
23 - CreateCommunity.create(attributes.merge(:requestor => requestor)) 35 + CreateCommunity.create!(attributes.merge(:requestor => requestor, :environment => environment))
24 else 36 else
25 - community = Community.create(attributes) 37 + community.save!
26 community.add_admin(requestor) 38 community.add_admin(requestor)
27 end 39 end
28 community 40 community
@@ -38,8 +50,9 @@ class Community &lt; Organization @@ -38,8 +50,9 @@ class Community &lt; Organization
38 super + FIELDS 50 super + FIELDS
39 end 51 end
40 52
41 - def validate  
42 - super 53 + validate :presence_of_required_fieds
  54 +
  55 + def presence_of_required_fieds
43 self.required_fields.each do |field| 56 self.required_fields.each do |field|
44 if self.send(field).blank? 57 if self.send(field).blank?
45 self.errors.add_on_blank(field) 58 self.errors.add_on_blank(field)
@@ -72,10 +85,6 @@ class Community &lt; Organization @@ -72,10 +85,6 @@ class Community &lt; Organization
72 recent_documents(limit, ["articles.type != ? AND articles.highlighted = ?", 'Folder', highlight]) 85 recent_documents(limit, ["articles.type != ? AND articles.highlighted = ?", 'Folder', highlight])
73 end 86 end
74 87
75 - def blocks_to_expire_cache  
76 - [MembersBlock]  
77 - end  
78 -  
79 def each_member(offset=0) 88 def each_member(offset=0)
80 while member = self.members.first(:order => :id, :offset => offset) 89 while member = self.members.first(:order => :id, :offset => offset)
81 yield member 90 yield member
@@ -84,7 +93,7 @@ class Community &lt; Organization @@ -84,7 +93,7 @@ class Community &lt; Organization
84 end 93 end
85 94
86 def control_panel_settings_button 95 def control_panel_settings_button
87 - {:title => __('Community Info and settings'), :icon => 'edit-profile-group'} 96 + {:title => _('Community Info and settings'), :icon => 'edit-profile-group'}
88 end 97 end
89 98
90 def activities 99 def activities
app/models/contact.rb
@@ -1,49 +0,0 @@ @@ -1,49 +0,0 @@
1 -class Contact < ActiveRecord::Base #WithoutTable  
2 - tableless :columns => [  
3 - [:name, :string],  
4 - [:subject, :string],  
5 - [:message, :string],  
6 - [:email, :string],  
7 - [:state, :string],  
8 - [:city, :string],  
9 - [:receive_a_copy, :boolean]  
10 - ]  
11 - attr_accessor :dest  
12 - attr_accessor :sender  
13 -  
14 - N_('Subject'); N_('Message'); N_('City and state'); N_('e-Mail'); N_('Name')  
15 -  
16 - validates_presence_of :subject, :email, :message, :name  
17 - validates_format_of :email, :with => Noosfero::Constants::EMAIL_FORMAT, :if => (lambda {|o| !o.email.blank?})  
18 -  
19 - def deliver  
20 - return false unless self.valid?  
21 - Contact::Sender.deliver_mail(self)  
22 - end  
23 -  
24 - class Sender < ActionMailer::Base  
25 - def mail(contact)  
26 - content_type 'text/html'  
27 - emails = contact.dest.notification_emails  
28 - recipients emails  
29 - from "#{contact.name} <#{contact.dest.environment.noreply_email}>"  
30 - reply_to contact.email  
31 - if contact.sender  
32 - headers 'X-Noosfero-Sender' => contact.sender.identifier  
33 - end  
34 - if contact.receive_a_copy  
35 - cc "#{contact.name} <#{contact.email}>"  
36 - end  
37 - subject "[#{contact.dest.short_name(30)}] " + contact.subject  
38 - body :name => contact.name,  
39 - :email => contact.email,  
40 - :city => contact.city,  
41 - :state => contact.state,  
42 - :message => contact.message,  
43 - :environment => contact.dest.environment.name,  
44 - :url => url_for(:host => contact.dest.environment.default_hostname, :controller => 'home'),  
45 - :target => contact.dest.name  
46 - end  
47 - end  
48 -  
49 -end  
app/models/contact_list.rb
@@ -16,12 +16,16 @@ class ContactList &lt; ActiveRecord::Base @@ -16,12 +16,16 @@ class ContactList &lt; ActiveRecord::Base
16 16
17 def register_auth_error 17 def register_auth_error
18 msg = _('There was an error while authenticating. Did you enter correct login and password?') 18 msg = _('There was an error while authenticating. Did you enter correct login and password?')
19 - self.update_attributes(:fetched => true, :error_fetching => msg) 19 + self.fetched = true
  20 + self.error_fetching = msg
  21 + self.save!
20 end 22 end
21 23
22 def register_error 24 def register_error
23 msg = _('There was an error while looking for your contact list. Please, try again') 25 msg = _('There was an error while looking for your contact list. Please, try again')
24 - self.update_attributes(:fetched => true, :error_fetching => msg) 26 + self.fetched = true
  27 + self.error_fetching = msg
  28 + self.save!
25 end 29 end
26 30
27 end 31 end
app/models/create_enterprise.rb
@@ -36,14 +36,18 @@ class CreateEnterprise &lt; Task @@ -36,14 +36,18 @@ class CreateEnterprise &lt; Task
36 validates_presence_of :reject_explanation, :if => (lambda { |record| record.status == Task::Status::CANCELLED } ) 36 validates_presence_of :reject_explanation, :if => (lambda { |record| record.status == Task::Status::CANCELLED } )
37 xss_terminate :only => [ :acronym, :address, :contact_person, :contact_phone, :economic_activity, :legal_form, :management_information, :name ], :on => 'validation' 37 xss_terminate :only => [ :acronym, :address, :contact_person, :contact_phone, :economic_activity, :legal_form, :management_information, :name ], :on => 'validation'
38 38
39 - def validate 39 + validate :validator_correct_region
  40 + validate :not_used_identifier
40 41
  42 + def validator_correct_region
41 if self.region && self.target 43 if self.region && self.target
42 unless self.region.validators.include?(self.target) || self.target_type == "Environment" 44 unless self.region.validators.include?(self.target) || self.target_type == "Environment"
43 self.errors.add(:target, _('{fn} is not a validator for the chosen region').fix_i18n) 45 self.errors.add(:target, _('{fn} is not a validator for the chosen region').fix_i18n)
44 end 46 end
45 end 47 end
  48 + end
46 49
  50 + def not_used_identifier
47 if self.status != Task::Status::CANCELLED && self.identifier && Profile.exists?(:identifier => self.identifier) 51 if self.status != Task::Status::CANCELLED && self.identifier && Profile.exists?(:identifier => self.identifier)
48 self.errors.add(:identifier, _('{fn} is already being as identifier by another enterprise, organization or person.').fix_i18n) 52 self.errors.add(:identifier, _('{fn} is already being as identifier by another enterprise, organization or person.').fix_i18n)
49 end 53 end
@@ -165,18 +169,18 @@ class CreateEnterprise &lt; Task @@ -165,18 +169,18 @@ class CreateEnterprise &lt; Task
165 end 169 end
166 170
167 def task_finished_message 171 def task_finished_message
168 - __('Your request for registering the enterprise "%{enterprise}" was approved. You can access %{environment} now and provide start providing all relevant information your new enterprise.') % { :enterprise => self.name, :environment => self.environment } 172 + _('Your request for registering the enterprise "%{enterprise}" was approved. You can access %{environment} now and provide start providing all relevant information your new enterprise.') % { :enterprise => self.name, :environment => self.environment }
169 end 173 end
170 174
171 def task_cancelled_message 175 def task_cancelled_message
172 - __("Your request for registering the enterprise %{enterprise} at %{environment} was NOT approved by the validator organization. The following explanation was given: \n\n%{explanation}") % { :enterprise => self.name, :environment => self.environment, :explanation => self.reject_explanation } 176 + _("Your request for registering the enterprise %{enterprise} at %{environment} was NOT approved by the validator organization. The following explanation was given: \n\n%{explanation}") % { :enterprise => self.name, :environment => self.environment, :explanation => self.reject_explanation }
173 end 177 end
174 178
175 def target_notification_message 179 def target_notification_message
176 msg = "" 180 msg = ""
177 - msg << __("Enterprise \"%{enterprise}\" just requested to enter %{environment}. You have to approve or reject it through the \"Pending Validations\" section in your control panel.\n") % { :enterprise => self.name, :environment => self.environment } 181 + msg << _("Enterprise \"%{enterprise}\" just requested to enter %{environment}. You have to approve or reject it through the \"Pending Validations\" section in your control panel.\n") % { :enterprise => self.name, :environment => self.environment }
178 msg << "\n" 182 msg << "\n"
179 - msg << __("The data provided by the enterprise was the following:\n") << "\n" 183 + msg << _("The data provided by the enterprise was the following:\n") << "\n"
180 184
181 185
182 msg << (_("Name: %s") % self.name) << "\n" 186 msg << (_("Name: %s") % self.name) << "\n"
@@ -186,12 +190,12 @@ class CreateEnterprise &lt; Task @@ -186,12 +190,12 @@ class CreateEnterprise &lt; Task
186 msg << (_("Foundation Year: %d") % self.foundation_year) << "\n" unless self.foundation_year.blank? 190 msg << (_("Foundation Year: %d") % self.foundation_year) << "\n" unless self.foundation_year.blank?
187 msg << (_("Economic activity: %s") % self.economic_activity) << "\n" 191 msg << (_("Economic activity: %s") % self.economic_activity) << "\n"
188 192
189 - msg << __("Information about enterprise's management:\n") << self.management_information.to_s << "\n" 193 + msg << _("Information about enterprise's management:\n") << self.management_information.to_s << "\n"
190 194
191 msg << (_("Contact phone: %s") % self.contact_phone) << "\n" 195 msg << (_("Contact phone: %s") % self.contact_phone) << "\n"
192 msg << (_("Contact person: %s") % self.contact_person) << "\n" 196 msg << (_("Contact person: %s") % self.contact_person) << "\n"
193 197
194 - msg << __('CreateEnterprise|Identifier') 198 + msg << _('CreateEnterprise|Identifier')
195 199
196 msg 200 msg
197 end 201 end
app/models/disabled_enterprise_message_block.rb
1 class DisabledEnterpriseMessageBlock < Block 1 class DisabledEnterpriseMessageBlock < Block
2 2
3 def self.description 3 def self.description
4 - __('"Disabled enterprise" message') 4 + _('"Disabled enterprise" message')
5 end 5 end
6 6
7 def help 7 def help
8 - __('Shows a message for disabled enterprises.') 8 + _('Shows a message for disabled enterprises.')
9 end 9 end
10 10
11 def default_title 11 def default_title
@@ -14,7 +14,7 @@ class DisabledEnterpriseMessageBlock &lt; Block @@ -14,7 +14,7 @@ class DisabledEnterpriseMessageBlock &lt; Block
14 14
15 def content(args={}) 15 def content(args={})
16 message = self.owner.environment.message_for_disabled_enterprise || '' 16 message = self.owner.environment.message_for_disabled_enterprise || ''
17 - lambda do 17 + lambda do |_|
18 render :file => 'blocks/disabled_enterprise_message', :locals => {:message => message} 18 render :file => 'blocks/disabled_enterprise_message', :locals => {:message => message}
19 end 19 end
20 end 20 end
app/models/doc_item.rb
@@ -31,7 +31,7 @@ class DocItem @@ -31,7 +31,7 @@ class DocItem
31 search_path.unshift("/designs/themes/#{theme}#{translation}") # higher priority 31 search_path.unshift("/designs/themes/#{theme}#{translation}") # higher priority
32 search_path.push("/designs/themes/#{theme}#{image}") # lower priority 32 search_path.push("/designs/themes/#{theme}#{image}") # lower priority
33 end 33 end
34 - search_path.find {|file| File.exist?("#{RAILS_ROOT}/public#{file}") } 34 + search_path.find {|file| File.exist?(Rails.root.join('public', file[1..-1])) }
35 end 35 end
36 36
37 end 37 end
app/models/doc_section.rb
1 class DocSection < DocItem 1 class DocSection < DocItem
2 2
3 def self.root_dir 3 def self.root_dir
4 - @root_dir ||= File.join(RAILS_ROOT, 'doc', 'noosfero') 4 + @root_dir ||= Rails.root.join('doc', 'noosfero')
5 end 5 end
6 6
7 def items 7 def items
app/models/domain.rb
  1 +require 'noosfero/multi_tenancy'
  2 +
1 class Domain < ActiveRecord::Base 3 class Domain < ActiveRecord::Base
2 4
  5 + attr_accessible :name, :owner
  6 +
3 # relationships 7 # relationships
4 ############### 8 ###############
5 9
@@ -15,7 +19,9 @@ class Domain &lt; ActiveRecord::Base @@ -15,7 +19,9 @@ class Domain &lt; ActiveRecord::Base
15 # checks validations that could not be expressed using Rails' predefined 19 # checks validations that could not be expressed using Rails' predefined
16 # validations. In particular: 20 # validations. In particular:
17 # * <tt>name</tt> must not start with 'www.' 21 # * <tt>name</tt> must not start with 'www.'
18 - def validate 22 + validate :no_www
  23 +
  24 + def no_www
19 if self.name =~ /^www\./ 25 if self.name =~ /^www\./
20 self.errors.add(:name, _('{fn} must not start with www.').fix_i18n) 26 self.errors.add(:name, _('{fn} must not start with www.').fix_i18n)
21 end 27 end
app/models/email_activation.rb
1 class EmailActivation < Task 1 class EmailActivation < Task
2 2
3 validates_presence_of :requestor_id, :target_id 3 validates_presence_of :requestor_id, :target_id
  4 + validate :already_requested, :on => :create
4 5
5 alias :environment :target 6 alias :environment :target
6 alias :person :requestor 7 alias :person :requestor
7 8
8 - def validate_on_create 9 + def already_requested
9 if !self.requestor.nil? && self.requestor.user.email_activation_pending? 10 if !self.requestor.nil? && self.requestor.user.email_activation_pending?
10 - self.errors.add_to_base(_('You have already requested activation of your mailbox.')) 11 + self.errors.add(:base, _('You have already requested activation of your mailbox.'))
11 end 12 end
12 end 13 end
13 14
@@ -33,7 +34,7 @@ class EmailActivation &lt; Task @@ -33,7 +34,7 @@ class EmailActivation &lt; Task
33 34
34 # :nodoc: 35 # :nodoc:
35 def after_finish 36 def after_finish
36 - User::Mailer.deliver_activation_email_notify(person.user) 37 + UserMailer.activation_email_notify(person.user).deliver
37 end 38 end
38 39
39 def sends_email? 40 def sends_email?
app/models/enterprise.rb
@@ -17,12 +17,12 @@ class Enterprise &lt; Organization @@ -17,12 +17,12 @@ class Enterprise &lt; Organization
17 has_and_belongs_to_many :fans, :class_name => 'Person', :join_table => 'favorite_enteprises_people' 17 has_and_belongs_to_many :fans, :class_name => 'Person', :join_table => 'favorite_enteprises_people'
18 18
19 def product_categories 19 def product_categories
20 - products.includes(:product_category).map{|p| p.category_full_name}.compact 20 + ProductCategory.by_enterprise(self)
21 end 21 end
22 22
23 N_('Organization website'); N_('Historic and current context'); N_('Activities short description'); N_('City'); N_('State'); N_('Country'); N_('ZIP code') 23 N_('Organization website'); N_('Historic and current context'); N_('Activities short description'); N_('City'); N_('State'); N_('Country'); N_('ZIP code')
24 24
25 - settings_items :organization_website, :historic_and_current_context, :activities_short_description, :zip_code, :city, :state, :country 25 + settings_items :organization_website, :historic_and_current_context, :activities_short_description
26 settings_items :products_per_catalog_page, :type => :integer, :default => 6 26 settings_items :products_per_catalog_page, :type => :integer, :default => 6
27 27
28 extend SetProfileRegionFromCityState::ClassMethods 28 extend SetProfileRegionFromCityState::ClassMethods
@@ -54,8 +54,9 @@ class Enterprise &lt; Organization @@ -54,8 +54,9 @@ class Enterprise &lt; Organization
54 super + FIELDS 54 super + FIELDS
55 end 55 end
56 56
57 - def validate  
58 - super 57 + validate :presence_of_required_fieds
  58 +
  59 + def presence_of_required_fieds
59 self.required_fields.each do |field| 60 self.required_fields.each do |field|
60 if self.send(field).blank? 61 if self.send(field).blank?
61 self.errors.add_on_blank(field) 62 self.errors.add_on_blank(field)
@@ -97,14 +98,18 @@ class Enterprise &lt; Organization @@ -97,14 +98,18 @@ class Enterprise &lt; Organization
97 save 98 save
98 end 99 end
99 100
  101 + def activation_task
  102 + self.tasks.where(:type => 'EnterpriseActivation').first
  103 + end
  104 +
100 def enable(owner) 105 def enable(owner)
101 return if enabled 106 return if enabled
102 - affiliate(owner, Profile::Roles.all_roles(environment.id))  
103 - update_attribute(:enabled,true)  
104 - if environment.replace_enterprise_template_when_enable  
105 - apply_template(template)  
106 - end  
107 - save_without_validation! 107 + # must be set first for the following to work
  108 + self.enabled = true
  109 + self.affiliate owner, Profile::Roles.all_roles(self.environment.id) if owner
  110 + self.apply_template template if self.environment.replace_enterprise_template_when_enable
  111 + self.activation_task.update_attribute :status, Task::Status::FINISHED rescue nil
  112 + self.save(:validate => false)
108 end 113 end
109 114
110 def question 115 def question
@@ -168,7 +173,7 @@ class Enterprise &lt; Organization @@ -168,7 +173,7 @@ class Enterprise &lt; Organization
168 alias_method_chain :template, :inactive_enterprise 173 alias_method_chain :template, :inactive_enterprise
169 174
170 def control_panel_settings_button 175 def control_panel_settings_button
171 - {:title => __('Enterprise Info and settings'), :icon => 'edit-profile-enterprise'} 176 + {:title => _('Enterprise Info and settings'), :icon => 'edit-profile-enterprise'}
172 end 177 end
173 178
174 settings_items :enable_contact_us, :type => :boolean, :default => true 179 settings_items :enable_contact_us, :type => :boolean, :default => true
@@ -178,7 +183,7 @@ class Enterprise &lt; Organization @@ -178,7 +183,7 @@ class Enterprise &lt; Organization
178 end 183 end
179 184
180 def control_panel_settings_button 185 def control_panel_settings_button
181 - {:title => __('Enterprise Info and settings'), :icon => 'edit-profile-enterprise'} 186 + {:title => _('Enterprise Info and settings'), :icon => 'edit-profile-enterprise'}
182 end 187 end
183 188
184 def create_product? 189 def create_product?
app/models/enterprise_activation.rb
1 class EnterpriseActivation < Task 1 class EnterpriseActivation < Task
2 2
3 - class RequestorRequired < Exception; end 3 + alias :person :requestor
  4 + alias :person= :requestor=
4 5
5 - settings_items :enterprise_id, :integer 6 + alias :enterprise :target
  7 + alias :enterprise= :target=
6 8
7 - validates_presence_of :enterprise_id  
8 -  
9 - def enterprise  
10 - Enterprise.find(enterprise_id)  
11 - end  
12 -  
13 - def enterprise=(ent)  
14 - self.enterprise_id = ent.id  
15 - end 9 + validates_presence_of :enterprise
16 10
17 def perform 11 def perform
18 - raise EnterpriseActivation::RequestorRequired if requestor.nil?  
19 - self.enterprise.enable(requestor) 12 + self.enterprise.enable self.requestor
20 end 13 end
21 14
22 def title 15 def title
@@ -28,15 +21,27 @@ class EnterpriseActivation &lt; Task @@ -28,15 +21,27 @@ class EnterpriseActivation &lt; Task
28 end 21 end
29 22
30 def information 23 def information
31 - {:message => _('%{requestor} wants to activate enterprise %{linked_subject}.')} 24 + if self.requestor
  25 + {:message => _('%{requestor} wants to activate enterprise %{linked_subject}.')}
  26 + else
  27 + {:message => _('Pending activation of enterprise %{linked_subject}.')}
  28 + end
32 end 29 end
33 30
34 def icon 31 def icon
35 - {:type => :profile_image, :profile => requestor, :url => requestor.url} 32 + if self.requestor
  33 + {:type => :profile_image, :profile => self.requestor, :url => self.requestor.url}
  34 + else
  35 + {:type => :profile_image, :profile => self.enterprise, :url => self.enterprise.url}
  36 + end
36 end 37 end
37 38
38 def target_notification_description 39 def target_notification_description
39 - _('%{requestor} wants to activate enterprise %{enterprise}.') % {:requestor => requestor.name, :enterprise => enterprise.name} 40 + if self.requestor
  41 + _('%{requestor} wants to activate enterprise %{enterprise}.') % {:requestor => self.requestor.name, :enterprise => self.enterprise.name}
  42 + else
  43 + _('Pending activation of enterprise %{enterprise}.') % {:enterprise => self.enterprise.name}
  44 + end
40 end 45 end
41 46
42 end 47 end
app/models/enterprise_homepage.rb
@@ -5,7 +5,7 @@ class EnterpriseHomepage &lt; Article @@ -5,7 +5,7 @@ class EnterpriseHomepage &lt; Article
5 end 5 end
6 6
7 def self.short_description 7 def self.short_description
8 - __('Enterprise homepage') 8 + _('Enterprise homepage')
9 end 9 end
10 10
11 def self.description 11 def self.description
@@ -18,7 +18,7 @@ class EnterpriseHomepage &lt; Article @@ -18,7 +18,7 @@ class EnterpriseHomepage &lt; Article
18 18
19 def to_html(options = {}) 19 def to_html(options = {})
20 enterprise_homepage = self 20 enterprise_homepage = self
21 - lambda do 21 + proc do
22 extend EnterpriseHomepageHelper 22 extend EnterpriseHomepageHelper
23 extend CatalogHelper 23 extend CatalogHelper
24 catalog_load_index :page => 1, :show_categories => false 24 catalog_load_index :page => 1, :show_categories => false
@@ -26,6 +26,11 @@ class EnterpriseHomepage &lt; Article @@ -26,6 +26,11 @@ class EnterpriseHomepage &lt; Article
26 end 26 end
27 end 27 end
28 28
  29 + # disable cache because of products
  30 + def cache_key params = {}, the_profile = nil, language = 'en'
  31 + rand
  32 + end
  33 +
29 def can_display_hits? 34 def can_display_hits?
30 false 35 false
31 end 36 end
app/models/enterprises_block.rb
1 class EnterprisesBlock < ProfileListBlock 1 class EnterprisesBlock < ProfileListBlock
2 2
3 def default_title 3 def default_title
4 - n__('{#} enterprise', '{#} enterprises', profile_count) 4 + n_('{#} enterprise', '{#} enterprises', profile_count)
5 end 5 end
6 6
7 def help 7 def help
8 - __('This block displays the enterprises where this user works.') 8 + _('This block displays the enterprises where this user works.')
9 end 9 end
10 10
11 def self.description 11 def self.description
12 - __('Enterprises') 12 + _('Enterprises')
13 end 13 end
14 14
15 def footer 15 def footer
16 owner = self.owner 16 owner = self.owner
17 case owner 17 case owner
18 when Profile 18 when Profile
19 - lambda do 19 + proc do
20 link_to s_('enterprises|View all'), :profile => owner.identifier, :controller => 'profile', :action => 'enterprises' 20 link_to s_('enterprises|View all'), :profile => owner.identifier, :controller => 'profile', :action => 'enterprises'
21 end 21 end
22 when Environment 22 when Environment
23 - lambda do 23 + proc do
24 link_to s_('enterprises|View all'), :controller => 'search', :action => 'assets', :asset => 'enterprises' 24 link_to s_('enterprises|View all'), :controller => 'search', :action => 'assets', :asset => 'enterprises'
25 end 25 end
26 else 26 else
app/models/environment.rb
@@ -3,6 +3,8 @@ @@ -3,6 +3,8 @@
3 # domains. 3 # domains.
4 class Environment < ActiveRecord::Base 4 class Environment < ActiveRecord::Base
5 5
  6 + attr_accessible :name, :is_default, :signup_welcome_text_subject, :signup_welcome_text_body, :terms_of_use, :message_for_disabled_enterprise, :news_amount_by_folder, :default_language, :languages, :description, :organization_approval_method, :enabled_plugins, :enabled_features, :redirection_after_login, :redirection_after_signup, :contact_email, :theme, :reports_lower_bound, :noreply_email, :signup_welcome_screen_body
  7 +
6 has_many :users 8 has_many :users
7 9
8 self.partial_updates = false 10 self.partial_updates = false
@@ -91,9 +93,9 @@ class Environment &lt; ActiveRecord::Base @@ -91,9 +93,9 @@ class Environment &lt; ActiveRecord::Base
91 def self.available_features 93 def self.available_features
92 { 94 {
93 'disable_asset_articles' => _('Disable search for articles '), 95 'disable_asset_articles' => _('Disable search for articles '),
94 - 'disable_asset_enterprises' => __('Disable search for enterprises'), 96 + 'disable_asset_enterprises' => _('Disable search for enterprises'),
95 'disable_asset_people' => _('Disable search for people'), 97 'disable_asset_people' => _('Disable search for people'),
96 - 'disable_asset_communities' => __('Disable search for communities'), 98 + 'disable_asset_communities' => _('Disable search for communities'),
97 'disable_asset_products' => _('Disable search for products'), 99 'disable_asset_products' => _('Disable search for products'),
98 'disable_asset_events' => _('Disable search for events'), 100 'disable_asset_events' => _('Disable search for events'),
99 'disable_categories' => _('Disable categories'), 101 'disable_categories' => _('Disable categories'),
@@ -104,11 +106,11 @@ class Environment &lt; ActiveRecord::Base @@ -104,11 +106,11 @@ class Environment &lt; ActiveRecord::Base
104 'disable_contact_person' => _('Disable contact for people'), 106 'disable_contact_person' => _('Disable contact for people'),
105 'disable_contact_community' => _('Disable contact for groups/communities'), 107 'disable_contact_community' => _('Disable contact for groups/communities'),
106 108
107 - 'products_for_enterprises' => __('Enable products for enterprises'),  
108 - 'enterprise_registration' => __('Enterprise registration'),  
109 - 'enterprise_activation' => __('Enable activation of enterprises'),  
110 - 'enterprises_are_disabled_when_created' => __('Enterprises are disabled when created'),  
111 - 'enterprises_are_validated_when_created' => __('Enterprises are validated when created'), 109 + 'products_for_enterprises' => _('Enable products for enterprises'),
  110 + 'enterprise_registration' => _('Enterprise registration'),
  111 + 'enterprise_activation' => _('Enable activation of enterprises'),
  112 + 'enterprises_are_disabled_when_created' => _('Enterprises are disabled when created'),
  113 + 'enterprises_are_validated_when_created' => _('Enterprises are validated when created'),
112 114
113 'media_panel' => _('Media panel in WYSIWYG editor'), 115 'media_panel' => _('Media panel in WYSIWYG editor'),
114 'select_preferred_domain' => _('Select preferred domains per profile'), 116 'select_preferred_domain' => _('Select preferred domains per profile'),
@@ -180,7 +182,6 @@ class Environment &lt; ActiveRecord::Base @@ -180,7 +182,6 @@ class Environment &lt; ActiveRecord::Base
180 182
181 # "right" area 183 # "right" area
182 env.boxes[2].blocks << CommunitiesBlock.new(:limit => 6) 184 env.boxes[2].blocks << CommunitiesBlock.new(:limit => 6)
183 - env.boxes[2].blocks << PeopleBlock.new(:limit => 6)  
184 end 185 end
185 186
186 # One Environment can be reached by many domains 187 # One Environment can be reached by many domains
@@ -199,6 +200,8 @@ class Environment &lt; ActiveRecord::Base @@ -199,6 +200,8 @@ class Environment &lt; ActiveRecord::Base
199 200
200 has_many :product_categories, :conditions => { :type => 'ProductCategory'} 201 has_many :product_categories, :conditions => { :type => 'ProductCategory'}
201 has_many :regions 202 has_many :regions
  203 + has_many :states
  204 + has_many :cities
202 205
203 has_many :roles, :dependent => :destroy 206 has_many :roles, :dependent => :destroy
204 207
@@ -294,6 +297,12 @@ class Environment &lt; ActiveRecord::Base @@ -294,6 +297,12 @@ class Environment &lt; ActiveRecord::Base
294 settings_items :access_control_allow_origin, :type => Array, :default => [] 297 settings_items :access_control_allow_origin, :type => Array, :default => []
295 settings_items :access_control_allow_methods, :type => String 298 settings_items :access_control_allow_methods, :type => String
296 299
  300 + settings_items :signup_welcome_screen_body, :type => String
  301 +
  302 + def has_custom_welcome_screen?
  303 + settings[:signup_welcome_screen_body].present?
  304 + end
  305 +
297 def news_amount_by_folder=(amount) 306 def news_amount_by_folder=(amount)
298 settings[:news_amount_by_folder] = amount.to_i 307 settings[:news_amount_by_folder] = amount.to_i
299 end 308 end
@@ -352,19 +361,22 @@ class Environment &lt; ActiveRecord::Base @@ -352,19 +361,22 @@ class Environment &lt; ActiveRecord::Base
352 features.delete_if{ |k, v| !self.enabled?(k) } 361 features.delete_if{ |k, v| !self.enabled?(k) }
353 end 362 end
354 363
  364 + DEFAULT_FEATURES = %w(
  365 + disable_asset_products
  366 + disable_gender_icon
  367 + products_for_enterprises
  368 + disable_select_city_for_contact
  369 + enterprise_registration
  370 + media_panel
  371 + organizations_are_moderated_by_default
  372 + show_balloon_with_profile_links_when_clicked
  373 + show_zoom_button_on_article_images
  374 + use_portal_community
  375 + )
  376 +
355 before_create :enable_default_features 377 before_create :enable_default_features
356 def enable_default_features 378 def enable_default_features
357 - %w(  
358 - disable_asset_products  
359 - disable_gender_icon  
360 - products_for_enterprises  
361 - disable_select_city_for_contact  
362 - enterprise_registration  
363 - media_panel  
364 - organizations_are_moderated_by_default  
365 - show_balloon_with_profile_links_when_clicked  
366 - use_portal_community  
367 - ).each do |feature| 379 + DEFAULT_FEATURES.each do |feature|
368 enable(feature, false) 380 enable(feature, false)
369 end 381 end
370 end 382 end
@@ -408,22 +420,6 @@ class Environment &lt; ActiveRecord::Base @@ -408,22 +420,6 @@ class Environment &lt; ActiveRecord::Base
408 self.settings[:organization_approval_method] = actual_value 420 self.settings[:organization_approval_method] = actual_value
409 end 421 end
410 422
411 - def terminology  
412 - if self.settings[:terminology]  
413 - self.settings[:terminology].constantize.instance  
414 - else  
415 - Noosfero.terminology  
416 - end  
417 - end  
418 -  
419 - def terminology=(value)  
420 - if value  
421 - self.settings[:terminology] = value.class.name  
422 - else  
423 - self.settings[:terminology] = nil  
424 - end  
425 - end  
426 -  
427 def custom_person_fields 423 def custom_person_fields
428 self.settings[:custom_person_fields].nil? ? {} : self.settings[:custom_person_fields] 424 self.settings[:custom_person_fields].nil? ? {} : self.settings[:custom_person_fields]
429 end 425 end
@@ -614,7 +610,10 @@ class Environment &lt; ActiveRecord::Base @@ -614,7 +610,10 @@ class Environment &lt; ActiveRecord::Base
614 validates_numericality_of :reports_lower_bound, :allow_nil => false, :only_integer => true, :greater_than_or_equal_to => 0 610 validates_numericality_of :reports_lower_bound, :allow_nil => false, :only_integer => true, :greater_than_or_equal_to => 0
615 611
616 include WhiteListFilter 612 include WhiteListFilter
617 - filter_iframes :message_for_disabled_enterprise, :whitelist => lambda { trusted_sites_for_iframe } 613 + filter_iframes :message_for_disabled_enterprise
  614 + def iframe_whitelist
  615 + trusted_sites_for_iframe
  616 + end
618 617
619 # ################################################# 618 # #################################################
620 # Business logic in general 619 # Business logic in general
@@ -643,6 +642,10 @@ class Environment &lt; ActiveRecord::Base @@ -643,6 +642,10 @@ class Environment &lt; ActiveRecord::Base
643 domain 642 domain
644 end 643 end
645 644
  645 + def admin_url
  646 + { :controller => 'admin_panel', :action => 'index' }
  647 + end
  648 +
646 def top_url 649 def top_url
647 url = 'http://' 650 url = 'http://'
648 url << (Noosfero.url_options.key?(:host) ? Noosfero.url_options[:host] : default_hostname) 651 url << (Noosfero.url_options.key?(:host) ? Noosfero.url_options[:host] : default_hostname)
@@ -664,9 +667,7 @@ class Environment &lt; ActiveRecord::Base @@ -664,9 +667,7 @@ class Environment &lt; ActiveRecord::Base
664 has_many :tags, :through => :articles 667 has_many :tags, :through => :articles
665 668
666 def tag_counts 669 def tag_counts
667 - options = Article.find_options_for_tag_counts.merge(:conditions => ['profiles.environment_id = ?', self.id])  
668 - options[:joins] = options[:joins] + ' LEFT OUTER JOIN profiles on profiles.id = articles.profile_id'  
669 - Tag.find(:all, options).inject({}) do |memo,tag| 670 + articles.tag_counts.inject({}) do |memo,tag|
670 memo[tag.name] = tag.count 671 memo[tag.name] = tag.count
671 memo 672 memo
672 end 673 end
@@ -799,31 +800,68 @@ class Environment &lt; ActiveRecord::Base @@ -799,31 +800,68 @@ class Environment &lt; ActiveRecord::Base
799 after_create :create_templates 800 after_create :create_templates
800 801
801 def create_templates 802 def create_templates
802 - pre = self.name.to_slug + '_'  
803 - ent_id = Enterprise.create!(:name => 'Enterprise template', :identifier => pre + 'enterprise_template', :environment => self, :visible => false, :is_template => true).id  
804 - inactive_enterprise_tmpl = Enterprise.create!(:name => 'Inactive Enterprise template', :identifier => pre + 'inactive_enterprise_template', :environment => self, :visible => false, :is_template => true)  
805 - com_id = Community.create!(:name => 'Community template', :identifier => pre + 'community_template', :environment => self, :visible => false, :is_template => true).id 803 + prefix = self.name.to_slug + '_'
  804 +
  805 + enterprise_template = Enterprise.new(
  806 + :name => 'Enterprise template',
  807 + :identifier => prefix + 'enterprise_template'
  808 + )
  809 +
  810 + inactive_enterprise_template = Enterprise.new(
  811 + :name => 'Inactive Enterprise template',
  812 + :identifier => prefix + 'inactive_enterprise_template'
  813 + )
  814 +
  815 + community_template = Community.new(
  816 + :name => 'Community template',
  817 + :identifier => prefix + 'community_template'
  818 + )
  819 +
  820 + [
  821 + enterprise_template,
  822 + inactive_enterprise_template,
  823 + community_template
  824 + ].each do |profile|
  825 + profile.is_template = true
  826 + profile.visible = false
  827 + profile.environment = self
  828 + profile.save!
  829 + end
  830 +
806 pass = Digest::MD5.hexdigest rand.to_s 831 pass = Digest::MD5.hexdigest rand.to_s
807 - user = User.create!(:login => (pre + 'person_template'), :email => (pre + 'template@template.noo'), :password => pass, :password_confirmation => pass, :environment => self).person  
808 - user.update_attributes(:visible => false, :name => "Person template", :is_template => true)  
809 - usr_id = user.id  
810 - self.settings[:enterprise_template_id] = ent_id  
811 - self.inactive_enterprise_template = inactive_enterprise_tmpl  
812 - self.settings[:community_template_id] = com_id  
813 - self.settings[:person_template_id] = usr_id 832 + user = User.new(:login => (prefix + 'person_template'), :email => (prefix + 'template@template.noo'), :password => pass, :password_confirmation => pass)
  833 + user.environment = self
  834 + user.save!
  835 +
  836 + person_template = user.person
  837 + person_template.name = "Person template"
  838 + person_template.is_template = true
  839 + person_template.visible = false
  840 + person_template.save!
  841 +
  842 + self.enterprise_template = enterprise_template
  843 + self.inactive_enterprise_template = inactive_enterprise_template
  844 + self.community_template = community_template
  845 + self.person_template = person_template
814 self.save! 846 self.save!
815 end 847 end
816 848
817 after_create :create_default_licenses 849 after_create :create_default_licenses
818 def create_default_licenses 850 def create_default_licenses
819 - License.create!(:name => 'CC (by)', :url => 'http://creativecommons.org/licenses/by/3.0/legalcode', :environment => self)  
820 - License.create!(:name => 'CC (by-nd)', :url => 'http://creativecommons.org/licenses/by-nd/3.0/legalcode', :environment => self)  
821 - License.create!(:name => 'CC (by-sa)', :url => 'http://creativecommons.org/licenses/by-sa/3.0/legalcode', :environment => self)  
822 - License.create!(:name => 'CC (by-nc)', :url => 'http://creativecommons.org/licenses/by-nc/3.0/legalcode', :environment => self)  
823 - License.create!(:name => 'CC (by-nc-nd)', :url => 'http://creativecommons.org/licenses/by-nc-nd/3.0/legalcode', :environment => self)  
824 - License.create!(:name => 'CC (by-nc-sa)', :url => 'http://creativecommons.org/licenses/by-nc-sa/3.0/legalcode', :environment => self)  
825 - License.create!(:name => 'Free Art', :url => 'http://artlibre.org/licence/lal/en', :environment => self)  
826 - License.create!(:name => 'GNU FDL', :url => 'http://www.gnu.org/licenses/fdl-1.3.txt', :environment => self) 851 + [
  852 + { :name => 'CC (by)', :url => 'http://creativecommons.org/licenses/by/3.0/legalcode'},
  853 + { :name => 'CC (by-nd)', :url => 'http://creativecommons.org/licenses/by-nd/3.0/legalcode'},
  854 + { :name => 'CC (by-sa)', :url => 'http://creativecommons.org/licenses/by-sa/3.0/legalcode'},
  855 + { :name => 'CC (by-nc)', :url => 'http://creativecommons.org/licenses/by-nc/3.0/legalcode'},
  856 + { :name => 'CC (by-nc-nd)', :url => 'http://creativecommons.org/licenses/by-nc-nd/3.0/legalcode'},
  857 + { :name => 'CC (by-nc-sa)', :url => 'http://creativecommons.org/licenses/by-nc-sa/3.0/legalcode'},
  858 + { :name => 'Free Art', :url => 'http://artlibre.org/licence/lal/en'},
  859 + { :name => 'GNU FDL', :url => 'http://www.gnu.org/licenses/fdl-1.3.txt'},
  860 + ].each do |data|
  861 + license = License.new(data)
  862 + license.environment = self
  863 + license.save!
  864 + end
827 end 865 end
828 866
829 def highlighted_products_with_image(options = {}) 867 def highlighted_products_with_image(options = {})
app/models/environment_mailing.rb
@@ -1,25 +0,0 @@ @@ -1,25 +0,0 @@
1 -class EnvironmentMailing < Mailing  
2 -  
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 })  
5 - end  
6 -  
7 - def each_recipient  
8 - offset = 0  
9 - limit = 100  
10 - while !(people = recipients(offset, limit)).empty?  
11 - people.each do |person|  
12 - yield person  
13 - end  
14 - offset = offset + limit  
15 - end  
16 - end  
17 -  
18 - def signature_message  
19 - _('Sent by %s.') % source.name  
20 - end  
21 -  
22 - def url  
23 - source.top_url  
24 - end  
25 -end  
app/models/environment_statistics_block.rb
@@ -23,9 +23,9 @@ class EnvironmentStatisticsBlock &lt; Block @@ -23,9 +23,9 @@ class EnvironmentStatisticsBlock &lt; Block
23 info = [] 23 info = []
24 info << (n_('One user', '%{num} users', users) % { :num => users }) 24 info << (n_('One user', '%{num} users', users) % { :num => users })
25 unless owner.enabled?('disable_asset_enterprises') 25 unless owner.enabled?('disable_asset_enterprises')
26 - info << (n__('One enterprise', '%{num} enterprises', enterprises) % { :num => enterprises }) 26 + info << (n_('One enterprise', '%{num} enterprises', enterprises) % { :num => enterprises })
27 end 27 end
28 - info << (n__('One community', '%{num} communities', communities) % { :num => communities }) 28 + info << (n_('One community', '%{num} communities', communities) % { :num => communities })
29 29
30 block_title(title) + content_tag('ul', info.map {|item| content_tag('li', item) }.join("\n")) 30 block_title(title) + content_tag('ul', info.map {|item| content_tag('li', item) }.join("\n"))
31 end 31 end
app/models/event.rb
  1 +require 'noosfero/translatable_content'
  2 +require 'builder'
  3 +
1 class Event < Article 4 class Event < Article
2 5
  6 + attr_accessible :start_date, :end_date, :link, :address
  7 +
3 def self.type_name 8 def self.type_name
4 _('Event') 9 _('Event')
5 end 10 end
@@ -29,27 +34,30 @@ class Event &lt; Article @@ -29,27 +34,30 @@ class Event &lt; Article
29 end 34 end
30 end 35 end
31 36
32 - named_scope :by_day, lambda { |date| 37 + scope :by_day, lambda { |date|
33 { :conditions => ['start_date = :date AND end_date IS NULL OR (start_date <= :date AND end_date >= :date)', {:date => date}], 38 { :conditions => ['start_date = :date AND end_date IS NULL OR (start_date <= :date AND end_date >= :date)', {:date => date}],
34 :order => 'start_date ASC' 39 :order => 'start_date ASC'
35 } 40 }
36 } 41 }
37 42
38 - named_scope :next_events_from_month, lambda { |date| 43 + scope :next_events_from_month, lambda { |date|
39 date_temp = date.strftime("%Y-%m-%d") 44 date_temp = date.strftime("%Y-%m-%d")
40 { :conditions => ["start_date >= ?","#{date_temp}"], 45 { :conditions => ["start_date >= ?","#{date_temp}"],
41 :order => 'start_date ASC' 46 :order => 'start_date ASC'
42 } 47 }
43 } 48 }
44 49
45 - named_scope :by_month, lambda { |date| 50 + scope :by_month, lambda { |date|
46 { :conditions => ["EXTRACT(YEAR FROM start_date) = ? AND EXTRACT(MONTH FROM start_date) = ?",date.year,date.month], 51 { :conditions => ["EXTRACT(YEAR FROM start_date) = ? AND EXTRACT(MONTH FROM start_date) = ?",date.year,date.month],
47 :order => 'start_date ASC' 52 :order => 'start_date ASC'
48 } 53 }
49 } 54 }
50 55
51 include WhiteListFilter 56 include WhiteListFilter
52 - filter_iframes :body, :link, :address, :whitelist => lambda { profile && profile.environment && profile.environment.trusted_sites_for_iframe } 57 + filter_iframes :body, :link, :address
  58 + def iframe_whitelist
  59 + profile && profile.environment && profile.environment.trusted_sites_for_iframe
  60 + end
53 61
54 def self.description 62 def self.description
55 _('A calendar event.') 63 _('A calendar event.')
@@ -63,7 +71,7 @@ class Event &lt; Article @@ -63,7 +71,7 @@ class Event &lt; Article
63 'event' 71 'event'
64 end 72 end
65 73
66 - named_scope :by_range, lambda { |range| { 74 + scope :by_range, lambda { |range| {
67 :conditions => [ 75 :conditions => [
68 'start_date BETWEEN :start_day AND :end_day OR end_date BETWEEN :start_day AND :end_day', 76 'start_date BETWEEN :start_day AND :end_day OR end_date BETWEEN :start_day AND :end_day',
69 { :start_day => range.first, :end_day => range.last } 77 { :start_day => range.first, :end_day => range.last }
@@ -93,29 +101,27 @@ class Event &lt; Article @@ -93,29 +101,27 @@ class Event &lt; Article
93 # FIXME this shouldn't be needed 101 # FIXME this shouldn't be needed
94 include ActionView::Helpers::TagHelper 102 include ActionView::Helpers::TagHelper
95 include ActionView::Helpers::UrlHelper 103 include ActionView::Helpers::UrlHelper
96 - include ActionController::UrlWriter  
97 include DatesHelper 104 include DatesHelper
98 105
99 def to_html(options = {}) 106 def to_html(options = {})
100 107
101 result = '' 108 result = ''
102 - html = Builder::XmlMarkup.new(:target => result) 109 + html = ::Builder::XmlMarkup.new(:target => result)
103 110
104 html.div(:class => 'event-info' ) { 111 html.div(:class => 'event-info' ) {
105 -  
106 html.ul(:class => 'event-data' ) { 112 html.ul(:class => 'event-data' ) {
107 html.li(:class => 'event-dates' ) { 113 html.li(:class => 'event-dates' ) {
108 html.span _('When:') 114 html.span _('When:')
109 html.text! show_period(start_date, end_date) 115 html.text! show_period(start_date, end_date)
110 - } 116 + } if start_date.present? || end_date.present?
111 html.li { 117 html.li {
112 html.span _('URL:') 118 html.span _('URL:')
113 html.a(self.link || "", 'href' => self.link || "") 119 html.a(self.link || "", 'href' => self.link || "")
114 - } 120 + } if self.link.present?
115 html.li { 121 html.li {
116 html.span _('Address:') 122 html.span _('Address:')
117 html.text! self.address || "" 123 html.text! self.address || ""
118 - } 124 + } if self.address.present?
119 } 125 }
120 126
121 # TODO: some good soul, please clean this ugly hack: 127 # TODO: some good soul, please clean this ugly hack:
app/models/external_feed.rb
@@ -5,11 +5,13 @@ class ExternalFeed &lt; ActiveRecord::Base @@ -5,11 +5,13 @@ class ExternalFeed &lt; ActiveRecord::Base
5 validates_presence_of :address, :if => lambda {|efeed| efeed.enabled} 5 validates_presence_of :address, :if => lambda {|efeed| efeed.enabled}
6 validates_uniqueness_of :blog_id 6 validates_uniqueness_of :blog_id
7 7
8 - named_scope :enabled, :conditions => { :enabled => true }  
9 - named_scope :expired, lambda { 8 + scope :enabled, :conditions => { :enabled => true }
  9 + scope :expired, lambda {
10 { :conditions => ['(fetched_at is NULL) OR (fetched_at < ?)', Time.now - FeedUpdater.update_interval] } 10 { :conditions => ['(fetched_at is NULL) OR (fetched_at < ?)', Time.now - FeedUpdater.update_interval] }
11 } 11 }
12 12
  13 + attr_accessible :address, :enabled
  14 +
13 def add_item(title, link, date, content) 15 def add_item(title, link, date, content)
14 doc = Hpricot(content) 16 doc = Hpricot(content)
15 doc.search('*').each do |p| 17 doc.search('*').each do |p|
@@ -20,7 +22,14 @@ class ExternalFeed &lt; ActiveRecord::Base @@ -20,7 +22,14 @@ class ExternalFeed &lt; ActiveRecord::Base
20 end 22 end
21 content = doc.to_s 23 content = doc.to_s
22 24
23 - article = TinyMceArticle.new(:name => title, :profile => blog.profile, :body => content, :published_at => date, :source => link, :profile => blog.profile, :parent => blog) 25 + article = TinyMceArticle.new
  26 + article.name = title
  27 + article.profile = blog.profile
  28 + article.body = content
  29 + article.published_at = date
  30 + article.source = link
  31 + article.profile = blog.profile
  32 + article.parent = blog
24 unless blog.children.exists?(:slug => article.slug) 33 unless blog.children.exists?(:slug => article.slug)
25 article.save! 34 article.save!
26 article.delay.create_activity 35 article.delay.create_activity
app/models/fans_block.rb
@@ -5,7 +5,7 @@ class FansBlock &lt; ProfileListBlock @@ -5,7 +5,7 @@ class FansBlock &lt; ProfileListBlock
5 end 5 end
6 6
7 def default_title 7 def default_title
8 - n__('{#} fan', '{#} fans', profile_count) 8 + n_('{#} fan', '{#} fans', profile_count)
9 end 9 end
10 10
11 def help 11 def help
@@ -14,7 +14,7 @@ class FansBlock &lt; ProfileListBlock @@ -14,7 +14,7 @@ class FansBlock &lt; ProfileListBlock
14 14
15 def footer 15 def footer
16 profile = self.owner 16 profile = self.owner
17 - lambda do 17 + proc do
18 link_to _('View all'), :profile => profile.identifier, :controller => 18 link_to _('View all'), :profile => profile.identifier, :controller =>
19 'profile', :action => 'fans' 19 'profile', :action => 'fans'
20 end 20 end
app/models/favorite_enterprises_block.rb
1 class FavoriteEnterprisesBlock < ProfileListBlock 1 class FavoriteEnterprisesBlock < ProfileListBlock
2 2
3 def default_title 3 def default_title
4 - __('Favorite Enterprises') 4 + _('Favorite Enterprises')
5 end 5 end
6 6
7 def help 7 def help
8 - __('This block lists your favorite enterprises.') 8 + _('This block lists your favorite enterprises.')
9 end 9 end
10 10
11 def self.description 11 def self.description
12 - __('Favorite Enterprises') 12 + _('Favorite Enterprises')
13 end 13 end
14 14
15 def footer 15 def footer
16 owner = self.owner 16 owner = self.owner
17 return '' unless owner.kind_of?(Person) 17 return '' unless owner.kind_of?(Person)
18 - lambda do  
19 - link_to __('View all'), :profile => owner.identifier, :controller => 'profile', :action => 'favorite_enterprises' 18 + proc do
  19 + link_to _('View all'), :profile => owner.identifier, :controller => 'profile', :action => 'favorite_enterprises'
20 end 20 end
21 end 21 end
22 22
app/models/featured_products_block.rb
@@ -28,7 +28,7 @@ class FeaturedProductsBlock &lt; Block @@ -28,7 +28,7 @@ class FeaturedProductsBlock &lt; Block
28 28
29 def content(args={}) 29 def content(args={})
30 block = self 30 block = self
31 - lambda do 31 + proc do
32 render :file => 'blocks/featured_products', :locals => { :block => block } 32 render :file => 'blocks/featured_products', :locals => { :block => block }
33 end 33 end
34 end 34 end
app/models/feed_reader_block.rb
1 class FeedReaderBlock < Block 1 class FeedReaderBlock < Block
2 2
3 - def initialize(attributes = nil) 3 + attr_accessible :address, :update_errors
  4 +
  5 + def initialize(attributes = nil, options = {})
4 data = attributes || {} 6 data = attributes || {}
5 - super({ :enabled => !data[:address].blank? }.merge(data)) 7 + super(data)
  8 + self.enabled= !data[:address].blank?
6 end 9 end
7 10
8 include DatesHelper 11 include DatesHelper
@@ -24,7 +27,7 @@ class FeedReaderBlock &lt; Block @@ -24,7 +27,7 @@ class FeedReaderBlock &lt; Block
24 settings_items :update_errors, :type => :integer, :default => 0 27 settings_items :update_errors, :type => :integer, :default => 0
25 settings_items :error_message, :type => :string 28 settings_items :error_message, :type => :string
26 29
27 - named_scope :expired, lambda { 30 + scope :expired, lambda {
28 { :conditions => [ '(fetched_at is NULL) OR (fetched_at < ?)', Time.now - FeedUpdater.update_interval] } 31 { :conditions => [ '(fetched_at is NULL) OR (fetched_at < ?)', Time.now - FeedUpdater.update_interval] }
29 } 32 }
30 33
app/models/folder.rb
@@ -15,7 +15,10 @@ class Folder &lt; Article @@ -15,7 +15,10 @@ class Folder &lt; Article
15 xss_terminate :only => [ :body ], :with => 'white_list', :on => 'validation' 15 xss_terminate :only => [ :body ], :with => 'white_list', :on => 'validation'
16 16
17 include WhiteListFilter 17 include WhiteListFilter
18 - filter_iframes :body, :whitelist => lambda { profile && profile.environment && profile.environment.trusted_sites_for_iframe } 18 + filter_iframes :body
  19 + def iframe_whitelist
  20 + profile && profile.environment && profile.environment.trusted_sites_for_iframe
  21 + end
19 22
20 def self.short_description 23 def self.short_description
21 _('Folder') 24 _('Folder')
@@ -32,7 +35,7 @@ class Folder &lt; Article @@ -32,7 +35,7 @@ class Folder &lt; Article
32 include ActionView::Helpers::TagHelper 35 include ActionView::Helpers::TagHelper
33 def to_html(options = {}) 36 def to_html(options = {})
34 folder = self 37 folder = self
35 - lambda do 38 + proc do
36 render :file => 'content_viewer/folder', :locals => {:folder => folder} 39 render :file => 'content_viewer/folder', :locals => {:folder => folder}
37 end 40 end
38 end 41 end
app/models/forum.rb
@@ -3,6 +3,8 @@ class Forum &lt; Folder @@ -3,6 +3,8 @@ class Forum &lt; Folder
3 acts_as_having_posts :order => 'updated_at DESC' 3 acts_as_having_posts :order => 'updated_at DESC'
4 include PostsLimit 4 include PostsLimit
5 5
  6 + attr_accessible :has_terms_of_use, :terms_of_use
  7 +
6 settings_items :terms_of_use, :type => :string, :default => "" 8 settings_items :terms_of_use, :type => :string, :default => ""
7 settings_items :has_terms_of_use, :type => :boolean, :default => false 9 settings_items :has_terms_of_use, :type => :boolean, :default => false
8 settings_items :allows_members_to_create_topics, :type => :boolean, :default => false 10 settings_items :allows_members_to_create_topics, :type => :boolean, :default => false
@@ -33,7 +35,7 @@ class Forum &lt; Folder @@ -33,7 +35,7 @@ class Forum &lt; Folder
33 35
34 include ActionView::Helpers::TagHelper 36 include ActionView::Helpers::TagHelper
35 def to_html(options = {}) 37 def to_html(options = {})
36 - lambda do 38 + proc do
37 render :file => 'content_viewer/forum_page' 39 render :file => 'content_viewer/forum_page'
38 end 40 end
39 end 41 end
app/models/friends_block.rb
@@ -1,26 +0,0 @@ @@ -1,26 +0,0 @@
1 -class FriendsBlock < ProfileListBlock  
2 -  
3 - def self.description  
4 - __('Friends')  
5 - end  
6 -  
7 - def default_title  
8 - n__('{#} friend', '{#} friends', profile_count)  
9 - end  
10 -  
11 - def help  
12 - _('This block displays your friends.')  
13 - end  
14 -  
15 - def footer  
16 - owner_id = owner.identifier  
17 - lambda do  
18 - link_to s_('friends|View all'), :profile => owner_id, :controller => 'profile', :action => 'friends'  
19 - end  
20 - end  
21 -  
22 - def profiles  
23 - owner.friends  
24 - end  
25 -  
26 -end