Commit fb090c196185743a6f8b1dc9fdd0a6c02c07060b

Authored by Victor Costa
2 parents 56a0d4fa db82bf4c

Merge branch 'master' into rails3

AUTHORS
... ... @@ -6,6 +6,7 @@ noosfero, that's not a problem).
6 6 Developers
7 7 ==========
8 8  
  9 +Ábner Silva de Oliveira <abner.oliveira@serpro.gov.br>
9 10 Alan Freihof Tygel <alantygel@gmail.com>
10 11 alcampelo <alcampelo@alcampelo.(none)>
11 12 Alessandro Palmeira <alessandro.palmeira@gmail.com>
... ... @@ -43,6 +44,7 @@ Ana Losnak &lt;analosnak@gmail.com&gt;
43 44 Antonio Terceiro + Carlos Morais <terceiro@colivre.coop.br>
44 45 Antonio Terceiro + Paulo Meirelles <terceiro@colivre.coop.br>
45 46 Antonio Terceiro <terceiro@colivre.coop.br>
  47 +Arthur Del Esposte <arthurmde@gmail.com>
46 48 Arthur Del Esposte <arthurmde@yahoo.com.br>
47 49 Aurelio A. Heckert <aurelio@colivre.coop.br>
48 50 Braulio Bhavamitra <brauliobo@gmail.com>
... ... @@ -71,12 +73,14 @@ Caio Salgado + Renan Teruo &lt;caio.salgado@gmail.com&gt;
71 73 Caio Salgado + Renan Teruo + Jefferson Fernandes <jeffs.fernandes@gmail.com>
72 74 Caio Salgado + Renan Teruo <renanteruoc@gmail.com>
73 75 Caio SBA <caio@colivre.coop.br>
  76 +Caio Tiago Oliveira <caiotiago@colivre.coop.br>
74 77 Carlos Andre de Souza <carlos.andre.souza@msn.com>
75 78 Carlos Morais <carlos88morais@gmail.com>
76 79 Carlos Morais + Diego Araújo <diegoamc90@gmail.com>
77 80 Carlos Morais + Eduardo Morais <carlos88morais@gmail.com>
78 81 Carlos Morais + Paulo Meirelles <carlos88morais@gmail.com>
79 82 Carlos Morais + Pedro Leal <carlos88morais@gmail.com>
  83 +Daniela Feitosa <dani@dohko.(none)>
80 84 Daniel Alves + Diego Araújo <danpaulalves@gmail.com>
81 85 Daniel Alves + Diego Araújo <diegoamc90@gmail.com>
82 86 Daniel Alves + Diego Araújo + Guilherme Rojas <danpaulalves@gmail.com>
... ... @@ -117,6 +121,8 @@ Diego Martinez &lt;diegoamc90@gmail.com&gt;
117 121 Diego Martinez <diego@diego-K55A.(none)>
118 122 Diego + Renan <renanteruoc@gmail.com>
119 123 Eduardo Tourinho Edington <eduardo.edington@serpro.gov.br>
  124 +Evandro Jr <evandrojr@gmail.com>
  125 +Evandro Junior <evandrojr@gmail.com>
120 126 Fabio Teixeira <fabio1079@gmail.com>
121 127 Fernanda Lopes <nanda.listas+psl@gmail.com>
122 128 Francisco Marcelo A. Lima Júnior <francisco.lima-junior@serpro.gov.br>
... ... @@ -132,6 +138,7 @@ Italo Valcy &lt;italo@dcc.ufba.br&gt;
132 138 Jefferson Fernandes + Diego Araujo + Rafael Manzo <jeffs.fernandes@gmail.com>
133 139 Jefferson Fernandes + Joao M. M. da Silva <jeffs.fernandes@gmail.com>
134 140 Jefferson Fernandes + Joao M. M. Silva <jeffs.fernandes@gmail.com>
  141 +João da Silva + Eduardo Morais + Rafael Manzo <rr.manzo@gmail.com>
135 142 João da Silva <jaodsilv@linux.ime.usp.br>
136 143 João Marco Maciel da Silva + Rafael Manzo + Renan Teruo <jaodsilv@linux.ime.usp.br>
137 144 João M. M. da Silva + Alessandro Palmeira + Diego Araújo + Caio Salgado <jaodsilv@linux.ime.usp.br>
... ... @@ -166,6 +173,7 @@ Junior Silva &lt;junior@bajor.localhost.localdomain&gt;
166 173 Junior Silva <juniorsilva1001@gmail.com>
167 174 Junior Silva <juniorsilva7@juniorsilva-Aspire-5750Z.(none)>
168 175 Junior Silva <juniorsilva@colivre.coop.br>
  176 +juniorsilva <juniorsilva@QonoS.localhost.localdomain>
169 177 Keilla Menezes <keilla@colivre.coop.br>
170 178 Larissa Reis <larissa@colivre.coop.br>
171 179 Larissa Reis <reiss.larissa@gmail.com>
... ... @@ -176,7 +184,9 @@ Leandro Nunes dos Santos &lt;leandro.santos@serpro.gov.br&gt;
176 184 LinguÁgil 2010 <linguagil.bahia@gmail.com>
177 185 Lucas Melo <lucas@colivre.coop.br>
178 186 Lucas Melo <lucaspradomelo@gmail.com>
  187 +Luciano <lucianopcbr@gmail.com>
179 188 Luis David Aguilar Carlos <ludwig9003@gmail.com>
  189 +Luiz Fernando de Freitas Matos <luiz@luizff.matos@gmail.com>
180 190 Marcos Ramos <ms.ramos@outlook.com>
181 191 Martín Olivera <molivera@solar.org.ar>
182 192 Moises Machado <moises@colivre.coop.br>
... ...
app/controllers/public/content_viewer_controller.rb
... ... @@ -8,49 +8,31 @@ class ContentViewerController &lt; ApplicationController
8 8 helper TagsHelper
9 9  
10 10 def view_page
11   - path = params[:page]
12   - path = path.join('/') if path.kind_of?(Array)
13   - path = "#{path}.#{params[:format]}" if params[:format]
  11 + path = get_path(params[:page], params[:format])
  12 +
14 13 @version = params[:version].to_i
15 14  
16 15 if path.blank?
17   - @page = profile.home_page
18   - if @page.nil?
19   - redirect_to :controller => 'profile', :action => 'index', :profile => profile.identifier
20   - return
21   - end
  16 + @page = profile.home_page
  17 + return if redirected_to_profile_index
22 18 else
23 19 @page = profile.articles.find_by_path(path)
24   - unless @page
25   - page_from_old_path = profile.articles.find_by_old_path(path)
26   - if page_from_old_path
27   - redirect_to profile.url.merge(:page => page_from_old_path.explode_path)
28   - return
29   - end
30   - end
  20 + return if redirected_page_from_old_path(path)
31 21 end
32 22  
33 23 return unless allow_access_to_page(path)
34 24  
35 25 if @version > 0
36 26 return render_access_denied unless @page.display_versions?
37   - @versioned_article = @page.versions.find_by_version(@version)
38   - if @versioned_article && @page.versions.latest.version != @versioned_article.version
39   - render :template => 'content_viewer/versioned_article.html.erb'
40   - return
41   - end
  27 + return if rendered_versioned_article
42 28 end
43 29  
44 30 redirect_to_translation and return if @page.profile.redirect_l10n
45 31  
46   - if request.post?
47   - if @page.forum? && @page.has_terms_of_use && params[:terms_accepted] == "true"
48   - @page.add_agreed_user(user)
49   - end
50   - elsif !@page.parent.nil? && @page.parent.forum?
51   - unless @page.parent.agrees_with_terms?(user)
52   - redirect_to @page.parent.url
53   - end
  32 + if request.post? && @page.forum?
  33 + process_forum_terms_of_use(user, params[:terms_accepted])
  34 + elsif is_a_forum_topic?(@page)
  35 + redirect_to @page.parent.url unless @page.parent.agrees_with_terms?(user)
54 36 end
55 37  
56 38 # At this point the page will be showed
... ... @@ -58,64 +40,22 @@ class ContentViewerController &lt; ApplicationController
58 40  
59 41 @page = FilePresenter.for @page
60 42  
61   - if @page.download? params[:view]
62   - headers['Content-Type'] = @page.mime_type
63   - headers.merge! @page.download_headers
64   - data = @page.data
65   -
66   - # TODO test the condition
67   - if data.nil?
68   - raise "No data for file"
69   - end
70   -
71   - render :text => data, :layout => false
72   - return
73   - end
  43 + return if rendered_file_download(params[:view])
74 44  
75 45 @form_div = params[:form]
76 46  
77 47 #FIXME see a better way to do this. It's not need to pass this variable anymore
78 48 @comment = Comment.new
79 49  
80   - if @page.has_posts?
81   - posts = if params[:year] and params[:month]
82   - filter_date = DateTime.parse("#{params[:year]}-#{params[:month]}-01")
83   - @page.posts.by_range(filter_date..filter_date.at_end_of_month)
84   - else
85   - @page.posts
86   - end
87   -
88   - #FIXME Need to run this before the pagination because this version of
89   - # will_paginate returns a will_paginate collection instead of a
90   - # relation.
91   - blog_with_translation = @page.blog? && @page.display_posts_in_current_language?
92   - posts = posts.native_translations if blog_with_translation
93   -
94   - @posts = posts.paginate({ :page => params[:npage], :per_page => @page.posts_per_page }.merge(Article.display_filter(user, profile))).to_a
95   -
96   - if blog_with_translation
97   - @posts.replace @posts.map{ |p| p.get_translation_to(FastGettext.locale) }.compact
98   - end
99   - end
  50 + process_page_posts(params)
100 51  
101 52 if @page.folder? && @page.gallery?
102   - @images = @page.images.select{ |a| a.display_to? user }
103   - @images = @images.paginate(:per_page => per_page, :page => params[:npage]) unless params[:slideshow]
  53 + @images = get_images(@page, params[:npage], params[:slideshow])
104 54 end
105 55  
106   - @unfollow_form = params[:unfollow] && params[:unfollow] == 'true'
107   - if params[:unfollow] && params[:unfollow] == 'commit' && request.post?
108   - @page.followers -= [params[:email]]
109   - if @page.save
110   - session[:notice] = _("Notification of new comments to '%s' was successfully canceled") % params[:email]
111   - end
112   - end
  56 + process_page_followers(params)
113 57  
114   - @comments = @page.comments.without_spam
115   - @comments = @plugins.filter(:unavailable_comments, @comments)
116   - @comments_count = @comments.count
117   - @comments = @comments.without_reply.paginate(:per_page => per_page, :page => params[:comment_page] )
118   - @comment_order = params[:comment_order].nil? ? 'oldest' : params[:comment_order]
  58 + process_comments(params)
119 59  
120 60 if request.xhr? and params[:comment_order]
121 61 if @comment_order == 'newest'
... ... @@ -203,4 +143,127 @@ class ContentViewerController &lt; ApplicationController
203 143 user_agent.match(/crawler/) ||
204 144 user_agent.match(/\(.*https?:\/\/.*\)/)
205 145 end
  146 +
  147 + def get_path(page, format = nil)
  148 + path = page
  149 + path = path.join('/') if path.kind_of?(Array)
  150 + path = "#{path}.#{format}" if format
  151 +
  152 + return path
  153 + end
  154 +
  155 + def redirected_to_profile_index
  156 + if @page.nil?
  157 + redirect_to :controller => 'profile', :action => 'index', :profile => profile.identifier
  158 + return true
  159 + end
  160 +
  161 + return false
  162 + end
  163 +
  164 + def redirected_page_from_old_path(path)
  165 + unless @page
  166 + page_from_old_path = profile.articles.find_by_old_path(path)
  167 + if page_from_old_path
  168 + redirect_to profile.url.merge(:page => page_from_old_path.explode_path)
  169 + return true
  170 + end
  171 + end
  172 +
  173 + return false
  174 + end
  175 +
  176 + def process_forum_terms_of_use(user, terms_accepted = nil)
  177 + if @page.forum? && @page.has_terms_of_use && terms_accepted == "true"
  178 + @page.add_agreed_user(user)
  179 + end
  180 + end
  181 +
  182 + def is_a_forum_topic? (page)
  183 + return (!@page.parent.nil? && @page.parent.forum?)
  184 + end
  185 +
  186 + def rendered_versioned_article
  187 + @versioned_article = @page.versions.find_by_version(@version)
  188 + if @versioned_article && @page.versions.latest.version != @versioned_article.version
  189 + render :template => 'content_viewer/versioned_article.html.erb'
  190 + return true
  191 + end
  192 +
  193 + return false
  194 + end
  195 +
  196 + def rendered_file_download(view = nil)
  197 + if @page.download? view
  198 + headers['Content-Type'] = @page.mime_type
  199 + headers.merge! @page.download_headers
  200 + data = @page.data
  201 +
  202 + # TODO test the condition
  203 + if data.nil?
  204 + raise "No data for file"
  205 + end
  206 +
  207 + render :text => data, :layout => false
  208 + return true
  209 + end
  210 +
  211 + return false
  212 + end
  213 +
  214 + def process_page_posts(params)
  215 + if @page.has_posts?
  216 + posts = get_posts(params[:year], params[:month])
  217 +
  218 + #FIXME Need to run this before the pagination because this version of
  219 + # will_paginate returns a will_paginate collection instead of a
  220 + # relation.
  221 + posts = posts.native_translations if blog_with_translation?(@page)
  222 +
  223 + @posts = posts.paginate({ :page => params[:npage], :per_page => @page.posts_per_page }.merge(Article.display_filter(user, profile))).to_a
  224 +
  225 + if blog_with_translation?(@page)
  226 + @posts.replace @posts.map{ |p| p.get_translation_to(FastGettext.locale) }.compact
  227 + end
  228 + end
  229 + end
  230 +
  231 + def get_posts(year = nil, month = nil)
  232 + if year && month
  233 + filter_date = DateTime.parse("#{year}-#{month}-01")
  234 + return @page.posts.by_range(filter_date..filter_date.at_end_of_month)
  235 + else
  236 + return @page.posts
  237 + end
  238 + end
  239 +
  240 + def blog_with_translation?(page)
  241 + return (page.blog? && page.display_posts_in_current_language?)
  242 + end
  243 +
  244 + def get_images(page, npage, slideshow)
  245 + images = page.images.select{ |a| a.display_to? user }
  246 + images = images.paginate(:per_page => per_page, :page => npage) unless slideshow
  247 +
  248 + return images
  249 + end
  250 +
  251 + def process_page_followers(params)
  252 + @unfollow_form = params[:unfollow] == 'true'
  253 + if params[:unfollow] == 'commit' && request.post?
  254 + @page.followers -= [params[:email]]
  255 + if @page.save
  256 + session[:notice] = _("Notification of new comments to '%s' was successfully canceled") % params[:email]
  257 + end
  258 + end
  259 + end
  260 +
  261 + def process_comments(params)
  262 + @comments = @page.comments.without_spam
  263 + @comments = @plugins.filter(:unavailable_comments, @comments)
  264 + @comments_count = @comments.count
  265 + @comments = @comments.without_reply.paginate(:per_page => per_page, :page => params[:comment_page] )
  266 + @comment_order = params[:comment_order].nil? ? 'oldest' : params[:comment_order]
  267 + end
  268 +
206 269 end
... ...
app/helpers/application_helper.rb
... ... @@ -1002,17 +1002,26 @@ module ApplicationHelper
1002 1002 def display_category_menu(block, categories, root = true)
1003 1003 categories = categories.sort{|x,y| x.name <=> y.name}
1004 1004 return "" if categories.blank?
1005   - content_tag(:ul,
  1005 + content_tag(:ul) do
1006 1006 categories.map do |category|
1007 1007 category_path = category.kind_of?(ProductCategory) ? {:controller => 'search', :action => 'assets', :asset => 'products', :product_category => category.id} : { :controller => 'search', :action => 'category_index', :category_path => category.explode_path }
1008   - category.display_in_menu? ?
1009   - content_tag(:li,
1010   - ( !category.is_leaf_displayable_in_menu? ? content_tag(:a, collapsed_item_icon, :href => "#", :id => "block_#{block.id}_category_#{category.id}", :class => 'category-link-expand ' + (root ? 'category-root' : 'category-no-root'), :onclick => "expandCategory(#{block.id}, #{category.id}); return false", :style => 'display: none') : leaf_item_icon) +
1011   - link_to(content_tag(:span, category.name, :class => 'category-name'), category_path, :class => ("category-leaf" if category.is_leaf_displayable_in_menu?)) +
1012   - content_tag(:div, display_category_menu(block, category.children, false), :id => "block_#{block.id}_category_content_#{category.id}", :class => 'child-category')
1013   - ) : ''
1014   - end
1015   - ) +
  1008 + if category.display_in_menu?
  1009 + content_tag(:li) do
  1010 + if !category.is_leaf_displayable_in_menu?
  1011 + content_tag(:a, collapsed_item_icon, :href => "#", :id => "block_#{block.id}_category_#{category.id}", :class => "category-link-expand " + (root ? "category-root" : "category-no-root"), :onclick => "expandCategory(#{block.id}, #{category.id}); return false", :style => "display: none")
  1012 + else
  1013 + leaf_item_icon
  1014 + end +
  1015 + link_to(content_tag(:span, category.name, :class => "category-name"), category_path, :class => ("category-leaf" if category.is_leaf_displayable_in_menu?)) +
  1016 + content_tag(:div, :id => "block_#{block.id}_category_content_#{category.id}", :class => 'child-category') do
  1017 + display_category_menu(block, category.children, false)
  1018 + end
  1019 + end
  1020 + else
  1021 + ""
  1022 + end
  1023 + end.join.html_safe
  1024 + end +
1016 1025 content_tag(:p) +
1017 1026 (root ? javascript_tag("
1018 1027 jQuery('.child-category').hide();
... ... @@ -1104,14 +1113,18 @@ module ApplicationHelper
1104 1113 end
1105 1114  
1106 1115 def manage_enterprises
1107   - return unless user && user.environment.enabled?(:display_my_enterprises_on_user_menu)
1108   - manage_link(user.enterprises, :enterprises)
  1116 + return '' unless user && user.environment.enabled?(:display_my_enterprises_on_user_menu)
  1117 + manage_link(user.enterprises, :enterprises).to_s
1109 1118 end
1110 1119  
1111 1120 def manage_communities
1112   - return unless user && user.environment.enabled?(:display_my_communities_on_user_menu)
  1121 + return '' unless user && user.environment.enabled?(:display_my_communities_on_user_menu)
1113 1122 administered_communities = user.communities.more_popular.select {|c| c.admins.include? user}
1114   - manage_link(administered_communities, :communities)
  1123 + manage_link(administered_communities, :communities).to_s
  1124 + end
  1125 +
  1126 + def admin_link
  1127 + user.is_admin?(environment) ? link_to('<i class="icon-menu-admin"></i><strong>' + _('Administration') + '</strong>', environment.admin_url, :title => _("Configure the environment"), :class => 'admin-link') : ''
1115 1128 end
1116 1129  
1117 1130 def usermenu_logged_in
... ... @@ -1123,9 +1136,9 @@ module ApplicationHelper
1123 1136  
1124 1137 (_("<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'))) +
1125 1138 render_environment_features(:usermenu) +
1126   - link_to('<i class="icon-menu-admin"></i><strong>' + _('Administration') + '</strong>', @environment.admin_url, :title => _("Configure the environment"), :class => 'admin-link') +
1127   - manage_enterprises.to_s +
1128   - manage_communities.to_s +
  1139 + admin_link +
  1140 + manage_enterprises +
  1141 + manage_communities +
1129 1142 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")) +
1130 1143 pending_tasks_count +
1131 1144 link_to('<i class="icon-menu-logout"></i><strong>' + _('Logout') + '</strong>', { :controller => 'account', :action => 'logout'} , :id => "logout", :title => _("Leave the system"))
... ...
app/mailers/user_mailer.rb
... ... @@ -15,10 +15,12 @@ class UserMailer &lt; ActionMailer::Base
15 15 end
16 16  
17 17 def activation_code(user)
18   - @recipient = user.name,
  18 + @recipient = user.name
19 19 @activation_code = user.activation_code
20 20 @environment = user.environment.name
21 21 @url = user.environment.top_url
  22 + @redirection = (true if user.return_to)
  23 + @join = (user.community_to_join if user.community_to_join)
22 24  
23 25 mail(
24 26 from: "#{user.environment.name} <#{user.environment.contact_email}>",
... ...
app/models/image.rb
... ... @@ -25,4 +25,7 @@ class Image &lt; ActiveRecord::Base
25 25  
26 26 attr_accessible :uploaded_data
27 27  
  28 + def current_data
  29 + File.file?(full_filename) ? File.read(full_filename) : nil
  30 + end
28 31 end
... ...
app/models/user.rb
... ... @@ -66,45 +66,6 @@ class User &lt; ActiveRecord::Base
66 66 # virtual attribute used to stash which community to join on signup or login
67 67 attr_accessor :community_to_join
68 68  
69   - class Mailer < ActionMailer::Base
70   - def activation_email_notify(user)
71   - user_email = "#{user.login}@#{user.email_domain}"
72   - recipients user_email
73   - from "#{user.environment.name} <#{user.environment.noreply_email}>"
74   - subject _("[%{environment}] Welcome to %{environment} mail!") % { :environment => user.environment.name }
75   - body :name => user.name,
76   - :email => user_email,
77   - :webmail => MailConf.webmail_url(user.login, user.email_domain),
78   - :environment => user.environment.name,
79   - :url => url_for(:host => user.environment.default_hostname, :controller => 'home')
80   - end
81   -
82   - def activation_code(user)
83   - recipients user.email
84   -
85   - from "#{user.environment.name} <#{user.environment.noreply_email}>"
86   - subject _("[%s] Activate your account") % [user.environment.name]
87   - body :recipient => user.name,
88   - :activation_code => user.activation_code,
89   - :environment => user.environment.name,
90   - :url => user.environment.top_url,
91   - :redirection => (true if user.return_to),
92   - :join => (user.community_to_join if user.community_to_join)
93   - end
94   -
95   - def signup_welcome_email(user)
96   - email_body = user.environment.signup_welcome_text_body.gsub('{user_name}', user.name)
97   - email_subject = user.environment.signup_welcome_text_subject
98   -
99   - content_type 'text/html'
100   - recipients user.email
101   -
102   - from "#{user.environment.name} <#{user.environment.noreply_email}>"
103   - subject email_subject.blank? ? _("Welcome to environment %s") % [user.environment.name] : email_subject
104   - body email_body
105   - end
106   - end
107   -
108 69 def signup!
109 70 User.transaction do
110 71 self.save!
... ...
app/views/user/mailer/activation_email_notify.html.erb
... ... @@ -1,12 +0,0 @@
1   -<%= _('Hello %s,') % @name %>
2   -
3   -<%= _('Your email %s was just activated.') % [@email] %>
4   -
5   -<%= _('You can access your e-mail from anywhere, using the following address:') %>
6   -<%= @webmail %>
7   -
8   -<%= _('Greetings,') %>
9   -
10   ---
11   -<%= _('%s team.') % @environment %>
12   -<%= @url %>
app/views/user/mailer/signup_welcome_email.html.erb
... ... @@ -1,9 +0,0 @@
1   -<!DOCTYPE html>
2   -<html>
3   - <head>
4   - <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
5   - </head>
6   - <body>
7   - <p><%= word_wrap @body %></p>
8   - </body>
9   -</html>
app/views/user_mailer/activation_code.html.erb 0 → 100644
... ... @@ -0,0 +1,9 @@
  1 +<%= _('Hi, %{recipient}!') % { :recipient => @recipient } %>
  2 +
  3 +<%= word_wrap(_('Welcome to %{environment}! To activate your account, follow the link: %{activation_url}') % { :environment => @environment, :activation_url => @url + url_for(:controller => :account, :action => :activate, :activation_code => @activation_code, :redirection => @redirection, :join => @join) }) %>
  4 +
  5 +<%= _("Greetings,") %>
  6 +
  7 +--
  8 +<%= _('%s team.') % @environment %>
  9 +<%= url_for @url %>
... ...
app/views/user_mailer/activation_email_notify.html.erb 0 → 100644
... ... @@ -0,0 +1,12 @@
  1 +<%= _('Hello %s,') % @name %>
  2 +
  3 +<%= _('Your email %s was just activated.') % [@email] %>
  4 +
  5 +<%= _('You can access your e-mail from anywhere, using the following address:') %>
  6 +<%= @webmail %>
  7 +
  8 +<%= _('Greetings,') %>
  9 +
  10 +--
  11 +<%= _('%s team.') % @environment %>
  12 +<%= @url %>
... ...
app/views/user_mailer/signup_welcome_email.html.erb 0 → 100644
... ... @@ -0,0 +1,9 @@
  1 +<!DOCTYPE html>
  2 +<html>
  3 + <head>
  4 + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  5 + </head>
  6 + <body>
  7 + <p><%= word_wrap @body %></p>
  8 + </body>
  9 +</html>
... ...
db/schema.rb
... ... @@ -11,7 +11,7 @@
11 11 #
12 12 # It's strongly recommended to check this file into your version control system.
13 13  
14   -ActiveRecord::Schema.define(:version => 20140415125414) do
  14 +ActiveRecord::Schema.define(:version => 20140605222753) do
15 15  
16 16 create_table "abuse_reports", :force => true do |t|
17 17 t.integer "reporter_id"
... ...
debian/changelog
  1 +noosfero (0.99.0~rc20140618202455) wheezy-test; urgency=low
  2 +
  3 + * Another rc with rails3
  4 +
  5 + -- Rodrigo Souto <rodrigo@colivre.coop.br> Wed, 18 Jun 2014 20:25:01 +0000
  6 +
1 7 noosfero (0.47.1) unstable; urgency=low
2 8  
3 9 * Bugfix release
... ...
features/clickable_images.feature
... ... @@ -14,6 +14,7 @@ Feature: clickable images
14 14 | owner | name | image | dimensions |
15 15 | booking | small | rails.png | 20x20 |
16 16 When I go to /booking/small
  17 + And display ".zoomify-image"
17 18 Then I should see "Zoom in"
18 19  
19 20 @selenium
... ... @@ -22,6 +23,7 @@ Feature: clickable images
22 23 | owner | name | image | dimensions |
23 24 | booking | real | rails.png | 50x64 |
24 25 When I go to /booking/real
  26 + And display ".zoomify-image"
25 27 Then "Zoom in" should not be visible within "a#zoomify-image"
26 28  
27 29 @selenium
... ... @@ -30,6 +32,7 @@ Feature: clickable images
30 32 | owner | name | image |
31 33 | booking | not set | rails.png |
32 34 When I go to /booking/not-set
  35 + And display ".zoomify-image"
33 36 Then "Zoom in" should not be visible within "a#zoomify-image"
34 37  
35 38 @selenium-fixme
... ...
lib/noosfero.rb
... ... @@ -3,7 +3,7 @@
3 3 require 'fast_gettext'
4 4 module Noosfero
5 5 PROJECT = 'noosfero'
6   - VERSION = '0.47.1'
  6 + VERSION = '0.99.0~rc20140618202455'
7 7  
8 8 def self.pattern_for_controllers_in_directory(dir)
9 9 disjunction = controllers_in_directory(dir).join('|')
... ...
lib/noosfero/plugin.rb
... ... @@ -395,7 +395,7 @@ class Noosfero::Plugin
395 395 end
396 396  
397 397 # -> Adds fields to the signup form
398   - # returns = lambda block that creates html code
  398 + # returns = proc that creates html code
399 399 def signup_extra_contents
400 400 nil
401 401 end
... ... @@ -470,7 +470,7 @@ class Noosfero::Plugin
470 470 end
471 471  
472 472 # -> Adds fields to the login form
473   - # returns = lambda block that creates html code
  473 + # returns = proc that creates html code
474 474 def login_extra_contents
475 475 nil
476 476 end
... ...
plugins/stoa/install.rb
1 1 require 'fileutils'
2 2  
3   -config_path = File.join('plugins', 'stoa', 'config.yml')
4   -config_template = File.join('plugins', 'stoa', 'config.yml.dist')
  3 +config_path = File.join(File.dirname(__FILE__), 'config.yml')
  4 +config_template = File.join(File.dirname(__FILE__), 'config.yml.dist')
5 5 FileUtils.cp(config_template, config_path) if !File.exist?(config_path)
... ...
plugins/stoa/lib/ext/person.rb
1 1 require_dependency 'person'
2 2  
3 3 class Person
  4 + attr_accessible :usp_id, :invitation_code
  5 +
4 6 validates_uniqueness_of :usp_id, :allow_nil => true
5 7 settings_items :invitation_code
6 8 validate :usp_id_or_invitation, :if => lambda { |person| person.environment && person.environment.plugin_enabled?(StoaPlugin)}
... ...
plugins/stoa/lib/stoa_plugin.rb
... ... @@ -2,8 +2,6 @@ require_dependency &#39;person&#39;
2 2  
3 3 class StoaPlugin < Noosfero::Plugin
4 4  
5   - Person.human_names[:usp_id] = _('USP number')
6   -
7 5 def self.plugin_name
8 6 "Stoa"
9 7 end
... ... @@ -17,7 +15,7 @@ class StoaPlugin &lt; Noosfero::Plugin
17 15 end
18 16  
19 17 def signup_extra_contents
20   - lambda {
  18 + proc {
21 19 content_tag(:div, labelled_form_field(_('USP number'), text_field(:profile_data, :usp_id, :id => 'usp_id_field')) +
22 20 content_tag(:small, _('The usp id grants you special powers in the network. Don\'t forget to fill it with a valid number if you have one.'), :id => 'usp-id-balloon') +
23 21 content_tag('p', _("Either this usp number is being used by another user or is not valid"), :id => 'usp-id-invalid') +
... ... @@ -45,7 +43,7 @@ class StoaPlugin &lt; Noosfero::Plugin
45 43 end
46 44  
47 45 def login_extra_contents
48   - lambda {
  46 + proc {
49 47 content_tag('div', labelled_form_field(_('USP number / Username'), text_field_tag('usp_id_login', '', :id => 'stoa_field_login')) +
50 48 labelled_form_field(_('Password'), password_field_tag('password', '', :id => 'stoa_field_password')), :id => 'stoa-login-fields')
51 49 }
... ... @@ -62,14 +60,13 @@ class StoaPlugin &lt; Noosfero::Plugin
62 60 end
63 61  
64 62 def account_controller_filters
65   - environment = context.environment
66   - block = lambda do
  63 + block = lambda do |context|
67 64 params[:profile_data] ||= {}
68 65 params[:profile_data][:invitation_code] = params[:invitation_code]
69 66 invitation = Task.pending.find(:first, :conditions => {:code => params[:invitation_code]})
70 67 if request.post?
71 68 if !invitation && !StoaPlugin::UspUser.matches?(params[:profile_data][:usp_id], params[:confirmation_field], params[params[:confirmation_field]])
72   - @person = Person.new(:environment => environment)
  69 + @person = Person.new(:environment => context.environment)
73 70 @person.errors.add(:usp_id, _(' validation failed'))
74 71 render :action => :signup
75 72 end
... ... @@ -83,7 +80,7 @@ class StoaPlugin &lt; Noosfero::Plugin
83 80 end
84 81  
85 82 def profile_editor_controller_filters
86   - block = lambda do
  83 + block = proc do
87 84 if request.post?
88 85 if !params[:profile_data][:usp_id].blank? && !StoaPlugin::UspUser.matches?(params[:profile_data][:usp_id], params[:confirmation_field], params[params[:confirmation_field]])
89 86 @profile_data = profile
... ... @@ -106,7 +103,7 @@ class StoaPlugin &lt; Noosfero::Plugin
106 103 def invite_controller_filters
107 104 [{ :type => 'before_filter',
108 105 :method_name => 'check_usp_id_existence',
109   - :block => lambda {render_access_denied if !user || user.usp_id.blank?} }]
  106 + :block => proc {render_access_denied if !user || user.usp_id.blank?} }]
110 107 end
111 108  
112 109 def control_panel_buttons
... ...
plugins/stoa/lib/stoa_plugin/person_api.rb
... ... @@ -28,7 +28,7 @@ class StoaPlugin::PersonApi &lt; Noosfero::FieldsDecorator
28 28 end
29 29  
30 30 def tags
31   - articles.published.tag_counts({:order => 'tags.count desc', :limit => 10}).inject({}) do |memo,tag|
  31 + articles.published.tag_counts({:order => 'count desc', :limit => 10}).inject({}) do |memo,tag|
32 32 memo[tag.name] = tag.count
33 33 memo
34 34 end
... ...
plugins/stoa/lib/stoa_plugin/usp_user.rb
... ... @@ -3,7 +3,7 @@ class StoaPlugin::UspUser &lt; ActiveRecord::Base
3 3 establish_connection(:stoa)
4 4 set_table_name('pessoa')
5 5  
6   - SALT=YAML::load(File.open(StoaPlugin.root_path + '/config.yml'))['salt']
  6 + SALT=YAML::load(File.open(StoaPlugin.root_path + 'config.yml'))['salt']
7 7  
8 8 alias_attribute :cpf, :numcpf
9 9 alias_attribute :birth_date, :dtanas
... ...
plugins/stoa/test/functional/account_controller_test.rb
... ... @@ -6,32 +6,29 @@ class AccountController; def rescue_action(e) raise e end; end
6 6  
7 7 class AccountControllerTest < ActionController::TestCase
8 8  
9   - SALT=YAML::load(File.open(StoaPlugin.root_path + '/config.yml'))['salt']
  9 + SALT=YAML::load(File.open(StoaPlugin.root_path + 'config.yml'))['salt']
  10 +
  11 + @db = Tempfile.new('stoa-test')
  12 + configs = ActiveRecord::Base.configurations['stoa'] = {:adapter => 'sqlite3', :database => @db.path}
  13 + ActiveRecord::Base.establish_connection(:stoa)
  14 + ActiveRecord::Schema.verbose = false
  15 + ActiveRecord::Schema.create_table "pessoa" do |t|
  16 + t.integer "codpes"
  17 + t.text "numcpf"
  18 + t.date "dtanas"
  19 + end
  20 + ActiveRecord::Base.establish_connection(:test)
10 21  
11 22 def setup
12 23 @controller = AccountController.new
13 24 @request = ActionController::TestRequest.new
14 25 @response = ActionController::TestResponse.new
15   - @db = Tempfile.new('stoa-test')
16   - configs = ActiveRecord::Base.configurations['stoa'] = {:adapter => 'sqlite3', :database => @db.path}
17   - ActiveRecord::Base.establish_connection(:stoa)
18   - ActiveRecord::Schema.verbose = false
19   - ActiveRecord::Schema.create_table "pessoa" do |t|
20   - t.integer "codpes"
21   - t.text "numcpf"
22   - t.date "dtanas"
23   - end
24   - ActiveRecord::Base.establish_connection(:test)
25   - StoaPlugin::UspUser.create!(:codpes => 12345678, :cpf => Digest::MD5.hexdigest(SALT+'12345678'), :birth_date => '1970-01-30')
  26 + StoaPlugin::UspUser.create!({:codpes => 12345678, :cpf => Digest::MD5.hexdigest(SALT+'12345678'), :birth_date => '1970-01-30'}, :without_protection => true)
26 27 Environment.default.enable_plugin(StoaPlugin.name)
27 28 @user = create_user('joao-stoa', {:password => 'pass', :password_confirmation => 'pass'},:usp_id=>'87654321')
28 29 @user.activate
29 30 end
30 31  
31   - def teardown
32   - @db.unlink
33   - end
34   -
35 32 should 'fail if confirmation value doesn\'t match' do
36 33 #StoaPlugin::UspUser.stubs(:matches?).returns(false)
37 34 post :signup, :profile_data => {:usp_id => '12345678'}, :confirmation_field => 'cpf', :cpf => '00000000'
... ... @@ -41,10 +38,10 @@ class AccountControllerTest &lt; ActionController::TestCase
41 38 should 'pass if confirmation value matches' do
42 39 #StoaPlugin::UspUser.stubs(:matches?).returns(true)
43 40 post :signup, :profile_data => {:usp_id => '12345678'}, :confirmation_field => 'cpf', :cpf => '12345678'
44   - assert_nil assigns(:person).errors[:usp_id]
  41 + assert !assigns(:person).errors.include?(:usp_id)
45 42 end
46 43  
47   - should 'inlude invitation_code param in the persons attributes' do
  44 + should 'include invitation_code param in the persons attributes' do
48 45 get :signup, :invitation_code => 12345678
49 46 assert assigns(:person).invitation_code == '12345678'
50 47 end
... ...
plugins/stoa/test/functional/profile_editor_controller_test.rb
... ... @@ -6,7 +6,7 @@ class ProfileEditorController; def rescue_action(e) raise e end; end
6 6  
7 7 class StoaPluginProfileEditorControllerTest < ActionController::TestCase
8 8  
9   - SALT=YAML::load(File.open(StoaPlugin.root_path + '/config.yml'))['salt']
  9 + SALT=YAML::load(File.open(StoaPlugin.root_path + 'config.yml'))['salt']
10 10  
11 11 def setup
12 12 @controller = ProfileEditorController.new
... ... @@ -45,7 +45,7 @@ class StoaPluginProfileEditorControllerTest &lt; ActionController::TestCase
45 45 should 'display error if usp_id does not match with supplied confirmation' do
46 46 StoaPlugin::UspUser.stubs(:matches?).returns(false)
47 47 post :edit, :profile => person.identifier, :profile_data => {:usp_id => 12345678}, :confirmation_field => 'cpf', :cpf => 99999999
48   - assert assigns(:profile_data).errors.invalid?(:usp_id)
  48 + assert assigns(:profile_data).errors.include?(:usp_id)
49 49 end
50 50  
51 51 should 'save usp_id if everyhtings is ok' do
... ...
plugins/stoa/test/functional/stoa_plugin_controller_test.rb
... ... @@ -6,7 +6,7 @@ class StoaPluginController; def rescue_action(e) raise e end; end
6 6  
7 7 class StoaPluginControllerTest < ActionController::TestCase
8 8  
9   - SALT=YAML::load(File.open(StoaPlugin.root_path + '/config.yml'))['salt']
  9 + SALT=YAML::load(File.open(StoaPlugin.root_path + 'config.yml'))['salt']
10 10  
11 11 def setup
12 12 @controller = StoaPluginController.new
... ... @@ -18,6 +18,7 @@ class StoaPluginControllerTest &lt; ActionController::TestCase
18 18 env.enable('skip_new_user_email_confirmation')
19 19 env.save!
20 20 @user = create_user_full('real_user', {:password => '123456', :password_confirmation => '123456'}, {:usp_id => 9999999})
  21 + @user.activate
21 22 end
22 23  
23 24 attr_accessor :user
... ...
plugins/stoa/test/unit/person_test.rb
... ... @@ -15,7 +15,7 @@ class StoaPlugin::Person &lt; ActiveSupport::TestCase
15 15 another_person = Person.new(:usp_id => usp_id)
16 16 another_person.valid?
17 17  
18   - assert another_person.errors.invalid?(:usp_id)
  18 + assert another_person.errors.include?(:usp_id)
19 19 end
20 20  
21 21 should 'not allow usp_id as an empty string' do
... ... @@ -28,17 +28,17 @@ class StoaPlugin::Person &lt; ActiveSupport::TestCase
28 28 should 'allow nil usp_id only if person has an invitation_code or is a template' do
29 29 person = Person.new(:environment => environment)
30 30 person.valid?
31   - assert person.errors.invalid?(:usp_id)
  31 + assert person.errors.include?(:usp_id)
32 32  
33 33 Task.create!(:code => 12345678)
34 34 person.invitation_code = 12345678
35 35 person.valid?
36   - assert !person.errors.invalid?(:usp_id)
  36 + assert !person.errors.include?(:usp_id)
37 37  
38 38 person.invitation_code = nil
39 39 person.is_template = true
40 40 person.valid?
41   - assert !person.errors.invalid?(:usp_id)
  41 + assert !person.errors.include?(:usp_id)
42 42 end
43 43  
44 44 should 'allow multiple nil usp_id' do
... ... @@ -47,7 +47,7 @@ class StoaPlugin::Person &lt; ActiveSupport::TestCase
47 47 person = Person.new(:invitation_code => 87654321)
48 48 person.valid?
49 49  
50   - assert !person.errors.invalid?(:usp_id)
  50 + assert !person.errors.include?(:usp_id)
51 51 end
52 52  
53 53 should 'not allow person to be saved with a finished invitation that is not his own' do
... ... @@ -56,7 +56,7 @@ class StoaPlugin::Person &lt; ActiveSupport::TestCase
56 56 person = Person.new(:environment => environment, :invitation_code => 87654321)
57 57 person.valid?
58 58  
59   - assert person.errors.invalid?(:usp_id)
  59 + assert person.errors.include?(:usp_id)
60 60 end
61 61  
62 62 should 'allow person to be saved with a finished invitation if it is his own' do
... ... @@ -68,7 +68,7 @@ class StoaPlugin::Person &lt; ActiveSupport::TestCase
68 68 t.finish
69 69  
70 70 person.valid?
71   - assert !person.errors.invalid?(:usp_id)
  71 + assert !person.errors.include?(:usp_id)
72 72 end
73 73  
74 74  
... ...
plugins/stoa/test/unit/usp_user_test.rb
... ... @@ -2,24 +2,21 @@ require File.dirname(__FILE__) + &#39;/../../../../test/test_helper&#39;
2 2  
3 3 class StoaPlugin::UspUserTest < ActiveSupport::TestCase
4 4  
5   - SALT=YAML::load(File.open(StoaPlugin.root_path + '/config.yml'))['salt']
6   -
7   - def setup
8   - @db = Tempfile.new('stoa-test')
9   - configs = ActiveRecord::Base.configurations['stoa'] = {:adapter => 'sqlite3', :database => @db.path}
10   - ActiveRecord::Base.establish_connection(:stoa)
11   - ActiveRecord::Schema.verbose = false
12   - ActiveRecord::Schema.create_table "pessoa" do |t|
13   - t.integer "codpes"
14   - t.text "numcpf"
15   - t.date "dtanas"
16   - end
17   - ActiveRecord::Base.establish_connection(:test)
18   - StoaPlugin::UspUser.create!(:codpes => 123456, :cpf => Digest::MD5.hexdigest(SALT+'12345678'), :birth_date => '1970-01-30')
  5 + SALT=YAML::load(File.open(StoaPlugin.root_path + 'config.yml'))['salt']
  6 +
  7 + @db = Tempfile.new('stoa-test')
  8 + configs = ActiveRecord::Base.configurations['stoa'] = {:adapter => 'sqlite3', :database => @db.path}
  9 + ActiveRecord::Base.establish_connection(:stoa)
  10 + ActiveRecord::Schema.verbose = false
  11 + ActiveRecord::Schema.create_table "pessoa" do |t|
  12 + t.integer "codpes"
  13 + t.text "numcpf"
  14 + t.date "dtanas"
19 15 end
  16 + ActiveRecord::Base.establish_connection(:test)
20 17  
21   - def teardown
22   - @db.unlink
  18 + def setup
  19 + StoaPlugin::UspUser.create({:codpes => 123456, :cpf => Digest::MD5.hexdigest(SALT+'12345678'), :birth_date => '1970-01-30'}, :without_protection => true)
23 20 end
24 21  
25 22 should 'check existence of usp_id' do
... ... @@ -48,4 +45,3 @@ class StoaPlugin::UspUserTest &lt; ActiveSupport::TestCase
48 45 assert !StoaPlugin::UspUser.matches?(123456, nil, '00012345678')
49 46 end
50 47 end
51   -
... ...
test/unit/application_helper_test.rb
... ... @@ -606,6 +606,22 @@ class ApplicationHelperTest &lt; ActionView::TestCase
606 606 assert_equal 'Open chat', render_environment_features(:usermenu)
607 607 end
608 608  
  609 + should 'not inlude administration link if user is not an environment administrator' do
  610 + user = mock()
  611 + stubs(:environment).returns(Environment.default)
  612 + user.stubs(:is_admin?).with(environment).returns(false)
  613 + stubs(:user).returns(user)
  614 + assert admin_link.blank?
  615 + end
  616 +
  617 + should 'inlude administration link if user is an environment administrator' do
  618 + user = mock()
  619 + stubs(:environment).returns(Environment.default)
  620 + user.stubs(:is_admin?).with(environment).returns(true)
  621 + stubs(:user).returns(user)
  622 + assert admin_link.present?
  623 + end
  624 +
609 625 should 'not return mime type of profile icon if not requested' do
610 626 stubs(:profile).returns(Person.new)
611 627 stubs(:current_theme).returns('default')
... ...