Commit 785b56adcdd6b0a026d4c734063d4705054b0e2f

Authored by Caio Almeida
2 parents cdd1f702 733814ea

Merge branch 'master' into field-of-interest

Showing 310 changed files with 2575 additions and 1519 deletions   Show diff stats
app/api/entities.rb
... ... @@ -93,7 +93,9 @@ module Api
93 93 class Box < Entity
94 94 root 'boxes', 'box'
95 95 expose :id, :position
96   - expose :blocks, :using => Block
  96 + expose :blocks, :using => Block do |box, options|
  97 + box.blocks.select {|block| block.visible_to_user?(options[:current_person]) }
  98 + end
97 99 end
98 100  
99 101 class Profile < Entity
... ... @@ -200,12 +202,21 @@ module Api
200 202 expose :accept_comments?, as: :accept_comments
201 203 end
202 204  
  205 + def self.permissions_for_entity(entity, current_person, *method_names)
  206 + method_names.map { |method| entity.send(method, current_person) ? method.to_s.gsub(/\?/,'') : nil }.compact
  207 + end
  208 +
203 209 class Article < ArticleBase
204 210 root 'articles', 'article'
205 211 expose :parent, :using => ArticleBase
206 212 expose :children, :using => ArticleBase do |article, options|
207 213 article.children.published.limit(V1::Articles::MAX_PER_PAGE)
208 214 end
  215 + expose :permissions do |article, options|
  216 + Entities.permissions_for_entity(article, options[:current_person],
  217 + :allow_edit?, :allow_post_content?, :allow_delete?, :allow_create?,
  218 + :allow_publish_content?)
  219 + end
209 220 end
210 221  
211 222 class User < Entity
... ...
app/api/helpers.rb
... ... @@ -121,7 +121,7 @@ module Api
121 121  
122 122 def present_article(asset)
123 123 article = find_article(asset.articles, params[:id])
124   - present_partial article, :with => Entities::Article, :params => params
  124 + present_partial article, with: Entities::Article, params: params, current_person: current_person
125 125 end
126 126  
127 127 def present_articles_for_asset(asset, method = 'articles')
... ... @@ -130,7 +130,7 @@ module Api
130 130 end
131 131  
132 132 def present_articles(articles)
133   - present_partial paginate(articles), :with => Entities::Article, :params => params
  133 + present_partial paginate(articles), :with => Entities::Article, :params => params, current_person: current_person
134 134 end
135 135  
136 136 def find_articles(asset, method = 'articles')
... ... @@ -407,9 +407,11 @@ module Api
407 407  
408 408 def parse_content_type(content_type)
409 409 return nil if content_type.blank?
410   - content_type.split(',').map do |content_type|
411   - content_type.camelcase
  410 + content_types = content_type.split(',').map do |content_type|
  411 + content_type = content_type.camelcase
  412 + content_type == 'TextArticle' ? Article.text_article_types : content_type
412 413 end
  414 + content_types.flatten.uniq
413 415 end
414 416  
415 417 def period(from_date, until_date)
... ...
app/api/v1/activities.rb
1 1 module Api
2 2 module V1
3 3 class Activities < Grape::API
4   - before { authenticate! }
5 4  
6 5 resource :profiles do
7 6  
... ... @@ -9,7 +8,7 @@ module Api
9 8 profile = Profile.find_by id: params[:id]
10 9  
11 10 not_found! if profile.blank? || profile.secret || !profile.visible
12   - forbidden! if !profile.secret && profile.visible && !profile.display_private_info_to?(current_person)
  11 + forbidden! if !profile.display_private_info_to?(current_person)
13 12  
14 13 activities = profile.activities.map(&:activity)
15 14 present activities, :with => Entities::Activity, :current_person => current_person
... ...
app/api/v1/articles.rb
... ... @@ -54,6 +54,17 @@ module Api
54 54 present_partial article, :with => Entities::Article
55 55 end
56 56  
  57 + delete ':id' do
  58 + article = environment.articles.find(params[:id])
  59 + return forbidden! unless article.allow_delete?(current_person)
  60 + begin
  61 + article.destroy
  62 + { :success => true }
  63 + rescue Exception => exception
  64 + render_api_error!(_('The article couldn\'t be removed due to some problem. Please contact the administrator.'), 400)
  65 + end
  66 + end
  67 +
57 68 desc 'Report a abuse and/or violent content in a article by id' do
58 69 detail 'Submit a abuse (in general, a content violation) report about a specific article'
59 70 params Entities::Article.documentation
... ... @@ -262,7 +273,7 @@ module Api
262 273 article = forbidden!
263 274 end
264 275  
265   - present_partial article, :with => Entities::Article
  276 + present_partial article, :with => Entities::Article, current_person: current_person
266 277 else
267 278  
268 279 present_articles_for_asset(profile)
... ...
app/api/v1/boxes.rb
... ... @@ -12,7 +12,8 @@ module Api
12 12 resource :boxes do
13 13 get do
14 14 profile = environment.send(kind.pluralize).find(params["#{kind}_id"])
15   - present profile.boxes, :with => Entities::Box
  15 + return forbidden! unless profile.display_info_to?(current_person)
  16 + present profile.boxes, with: Entities::Box, current_person: current_person
16 17 end
17 18 end
18 19 end
... ... @@ -32,7 +33,7 @@ module Api
32 33 else
33 34 env = Environment.find(params[:environment_id])
34 35 end
35   - present env.boxes, :with => Entities::Box
  36 + present env.boxes, with: Entities::Box, current_person: current_person
36 37 end
37 38 end
38 39 end
... ...
app/api/v1/comments.rb
... ... @@ -34,6 +34,7 @@ module Api
34 34 post ":id/comments" do
35 35 authenticate!
36 36 article = find_article(environment.articles, params[:id])
  37 + return forbidden! unless article.accept_comments?
37 38 options = params.select { |key,v| !['id','private_token'].include?(key) }.merge(:author => current_person, :source => article)
38 39 begin
39 40 comment = Comment.create!(options)
... ... @@ -42,6 +43,19 @@ module Api
42 43 end
43 44 present comment, :with => Entities::Comment, :current_person => current_person
44 45 end
  46 +
  47 + delete ":id/comments/:comment_id" do
  48 + article = find_article(environment.articles, params[:id])
  49 + comment = article.comments.find_by_id(params[:comment_id])
  50 + return not_found! if comment.nil?
  51 + return forbidden! unless comment.can_be_destroyed_by?(current_person)
  52 + begin
  53 + comment.destroy
  54 + present comment, with: Entities::Comment, :current_person => current_person
  55 + rescue => e
  56 + render_api_error!(e.message, 500)
  57 + end
  58 + end
45 59 end
46 60  
47 61 end
... ...
app/api/v1/profiles.rb
... ... @@ -22,6 +22,15 @@ module Api
22 22 not_found!
23 23 end
24 24 end
  25 +
  26 + desc "Update profile information"
  27 + post ':id' do
  28 + authenticate!
  29 + profile = environment.profiles.find_by(id: params[:id])
  30 + return forbidden! unless current_person.has_permission?(:edit_profile, profile)
  31 + profile.update_attributes!(params[:profile])
  32 + present profile, :with => Entities::Profile, :current_person => current_person
  33 + end
25 34  
26 35 delete ':id' do
27 36 authenticate!
... ...
app/concerns/authenticated_system.rb 0 → 100644
... ... @@ -0,0 +1,169 @@
  1 +module AuthenticatedSystem
  2 +
  3 + protected
  4 +
  5 + extend ActiveSupport::Concern
  6 +
  7 + included do
  8 + if self < ActionController::Base
  9 + around_filter :user_set_current
  10 + before_filter :override_user
  11 + before_filter :login_from_cookie
  12 + end
  13 +
  14 + # Inclusion hook to make #current_user and #logged_in?
  15 + # available as ActionView helper methods.
  16 + helper_method :current_user, :logged_in?
  17 + end
  18 +
  19 + # Returns true or false if the user is logged in.
  20 + # Preloads @current_user with the user model if they're logged in.
  21 + def logged_in?
  22 + current_user != nil
  23 + end
  24 +
  25 + # Accesses the current user from the session.
  26 + def current_user user_id = session[:user]
  27 + @current_user ||= begin
  28 + user = User.find_by id: user_id if user_id
  29 + user.session = session if user
  30 + User.current = user
  31 + user
  32 + end
  33 + end
  34 +
  35 + # Store the given user in the session.
  36 + def current_user=(new_user)
  37 + if new_user.nil?
  38 + session.delete(:user)
  39 + else
  40 + session[:user] = new_user.id
  41 + new_user.session = session
  42 + new_user.register_login
  43 + end
  44 + @current_user = User.current = new_user
  45 + end
  46 +
  47 + # See impl. from http://stackoverflow.com/a/2513456/670229
  48 + def user_set_current
  49 + User.current = current_user
  50 + yield
  51 + ensure
  52 + # to address the thread variable leak issues in Puma/Thin webserver
  53 + User.current = nil
  54 + end
  55 +
  56 + # Check if the user is authorized.
  57 + #
  58 + # Override this method in your controllers if you want to restrict access
  59 + # to only a few actions or if you want to check if the user
  60 + # has the correct rights.
  61 + #
  62 + # Example:
  63 + #
  64 + # # only allow nonbobs
  65 + # def authorize?
  66 + # current_user.login != "bob"
  67 + # end
  68 + def authorized?
  69 + true
  70 + end
  71 +
  72 + # Filter method to enforce a login requirement.
  73 + #
  74 + # To require logins for all actions, use this in your controllers:
  75 + #
  76 + # before_filter :login_required
  77 + #
  78 + # To require logins for specific actions, use this in your controllers:
  79 + #
  80 + # before_filter :login_required, :only => [ :edit, :update ]
  81 + #
  82 + # To skip this in a subclassed controller:
  83 + #
  84 + # skip_before_filter :login_required
  85 + #
  86 + def login_required
  87 + username, passwd = get_auth_data
  88 + if username && passwd
  89 + self.current_user ||= User.authenticate(username, passwd) || nil
  90 + end
  91 + if logged_in? && authorized?
  92 + true
  93 + else
  94 + if params[:require_login_popup]
  95 + render :json => { :require_login_popup => true }
  96 + else
  97 + access_denied
  98 + end
  99 + end
  100 + end
  101 +
  102 + # Redirect as appropriate when an access request fails.
  103 + #
  104 + # The default action is to redirect to the login screen.
  105 + #
  106 + # Override this method in your controllers if you want to have special
  107 + # behavior in case the user is not authorized
  108 + # to access the requested action. For example, a popup window might
  109 + # simply close itself.
  110 + def access_denied
  111 + respond_to do |accepts|
  112 + accepts.html do
  113 + if request.xhr?
  114 + render :text => _('Access denied'), :status => 401
  115 + else
  116 + store_location
  117 + redirect_to :controller => '/account', :action => 'login'
  118 + end
  119 + end
  120 + accepts.xml do
  121 + headers["Status"] = "Unauthorized"
  122 + headers["WWW-Authenticate"] = %(Basic realm="Web Password")
  123 + render :text => "Could't authenticate you", :status => '401 Unauthorized'
  124 + end
  125 + end
  126 + false
  127 + end
  128 +
  129 + # Store the URI of the current request in the session.
  130 + #
  131 + # We can return to this location by calling #redirect_back_or_default.
  132 + def store_location(location = request.url)
  133 + session[:return_to] = location
  134 + end
  135 +
  136 + # Redirect to the URI stored by the most recent store_location call or
  137 + # to the passed default.
  138 + def redirect_back_or_default(default)
  139 + if session[:return_to]
  140 + redirect_to(session.delete(:return_to))
  141 + else
  142 + redirect_to(default)
  143 + end
  144 + end
  145 +
  146 + def override_user
  147 + return if params[:override_user].blank?
  148 + return unless logged_in? and user.is_admin? environment
  149 + @current_user = nil
  150 + current_user params[:override_user]
  151 + end
  152 +
  153 + # When called with before_filter :login_from_cookie will check for an :auth_token
  154 + # cookie and log the user back in if apropriate
  155 + def login_from_cookie
  156 + return if cookies[:auth_token].blank? or logged_in?
  157 + user = User.where(remember_token: cookies[:auth_token]).first
  158 + self.current_user = user if user and user.remember_token?
  159 + end
  160 +
  161 + private
  162 + @@http_auth_headers = %w(X-HTTP_AUTHORIZATION HTTP_AUTHORIZATION Authorization)
  163 + # gets BASIC auth info
  164 + def get_auth_data
  165 + auth_key = @@http_auth_headers.detect { |h| request.env.has_key?(h) }
  166 + auth_data = request.env[auth_key].to_s.split unless auth_key.blank?
  167 + return auth_data && auth_data[0] == 'Basic' ? Base64.decode64(auth_data[1]).split(':')[0..1] : [nil, nil]
  168 + end
  169 +end
... ...
app/controllers/application_controller.rb
... ... @@ -13,6 +13,13 @@ class ApplicationController &lt; ActionController::Base
13 13 before_filter :verify_members_whitelist, :if => [:private_environment?, :user]
14 14 before_filter :redirect_to_current_user
15 15  
  16 + before_filter :set_session_theme
  17 + def set_session_theme
  18 + if params[:theme]
  19 + session[:theme] = environment.theme_ids.include?(params[:theme]) ? params[:theme] : nil
  20 + end
  21 + end
  22 +
16 23 def require_login_for_environment
17 24 login_required
18 25 end
... ...
app/controllers/my_profile/profile_themes_controller.rb
... ... @@ -63,12 +63,12 @@ class ProfileThemesController &lt; ThemesController
63 63 end
64 64  
65 65 def start_test
66   - session[:theme] = params[:id]
  66 + session[:user_theme] = params[:id]
67 67 redirect_to :controller => 'content_viewer', :profile => profile.identifier, :action => 'view_page'
68 68 end
69 69  
70 70 def stop_test
71   - session[:theme] = nil
  71 + session[:user_theme] = nil
72 72 redirect_to :action => 'index'
73 73 end
74 74  
... ...
app/controllers/public/content_viewer_controller.rb
... ... @@ -209,7 +209,7 @@ class ContentViewerController &lt; ApplicationController
209 209 end
210 210  
211 211 if @page.published && @page.uploaded_file?
212   - redirect_to @page.public_filename
  212 + redirect_to "#{Noosfero.root}#{@page.public_filename}"
213 213 else
214 214 send_data data, @page.download_headers
215 215 end
... ...
app/helpers/application_helper.rb
... ... @@ -233,13 +233,6 @@ module ApplicationHelper
233 233 link_to(content_tag('span', text), url, html_options.merge(:class => the_class, :title => text))
234 234 end
235 235  
236   - def button_bar(options = {}, &block)
237   - options[:class].nil? ?
238   - options[:class]='button-bar' :
239   - options[:class]+=' button-bar'
240   - concat(content_tag('div', capture(&block).to_s + tag('br', :style => 'clear: left;'), options))
241   - end
242   -
243 236 def render_profile_actions klass
244 237 name = klass.to_s.underscore
245 238 begin
... ... @@ -351,7 +344,7 @@ module ApplicationHelper
351 344 end
352 345  
353 346 def is_testing_theme
354   - !controller.session[:theme].nil?
  347 + !controller.session[:user_theme].nil?
355 348 end
356 349  
357 350 def theme_owner
... ... @@ -600,8 +593,8 @@ module ApplicationHelper
600 593 end
601 594  
602 595 if block
603   - field_html ||= ''
604   - field_html += capture(&block)
  596 + field_html ||= ''.html_safe
  597 + field_html = [field_html, capture(&block)].safe_join
605 598 end
606 599  
607 600 if controller.action_name == 'signup' || controller.action_name == 'new_community' || (controller.controller_name == "enterprise_registration" && controller.action_name == 'index') || (controller.controller_name == 'home' && controller.action_name == 'index' && user.nil?)
... ... @@ -610,7 +603,9 @@ module ApplicationHelper
610 603 end
611 604 else
612 605 if profile.active_fields.include?(name)
613   - result = content_tag('div', field_html + profile_field_privacy_selector(profile, name), :class => 'field-with-privacy-selector')
  606 + result = content_tag :div, class: 'field-with-privacy-selector' do
  607 + [field_html, profile_field_privacy_selector(profile, name)].safe_join
  608 + end
614 609 end
615 610 end
616 611  
... ... @@ -618,10 +613,6 @@ module ApplicationHelper
618 613 result = required(result)
619 614 end
620 615  
621   - if block
622   - concat(result)
623   - end
624   -
625 616 result
626 617 end
627 618  
... ... @@ -866,7 +857,7 @@ module ApplicationHelper
866 857 alias :browse_communities_menu :search_communities_menu
867 858  
868 859 def pagination_links(collection, options={})
869   - options = {:previous_label => content_tag(:span, '&laquo; ', :class => 'previous-arrow') + _('Previous'), :next_label => _('Next') + content_tag(:span, ' &raquo;', :class => 'next-arrow'), :inner_window => 1, :outer_window => 0 }.merge(options)
  860 + options = {:previous_label => content_tag(:span, '&laquo; '.html_safe, :class => 'previous-arrow') + _('Previous'), :next_label => _('Next') + content_tag(:span, ' &raquo;'.html_safe, :class => 'next-arrow'), :inner_window => 1, :outer_window => 0 }.merge(options)
870 861 will_paginate(collection, options)
871 862 end
872 863  
... ... @@ -988,6 +979,7 @@ module ApplicationHelper
988 979 values = {}
989 980 values.merge!(task.information[:variables]) if task.information[:variables]
990 981 values.merge!({:requestor => link_to(task.requestor.name, task.requestor.url)}) if task.requestor
  982 + values.merge!({:target => link_to(task.target.name, task.target.url)}) if (task.target && task.target.respond_to?(:url))
991 983 values.merge!({:subject => content_tag('span', task.subject, :class=>'task_target')}) if task.subject
992 984 values.merge!({:linked_subject => link_to(content_tag('span', task.linked_subject[:text], :class => 'task_target'), task.linked_subject[:url])}) if task.linked_subject
993 985 (task.information[:message] % values).html_safe
... ... @@ -1138,7 +1130,7 @@ module ApplicationHelper
1138 1130 content_tag(:div, :class => 'errorExplanation', :id => 'errorExplanation') do
1139 1131 content_tag(:h2, _('Errors while saving')) +
1140 1132 content_tag(:ul) do
1141   - safe_join(errors.map { |err| content_tag(:li, err) })
  1133 + safe_join(errors.map { |err| content_tag(:li, err.html_safe) })
1142 1134 end
1143 1135 end
1144 1136 end
... ...
app/helpers/article_helper.rb
... ... @@ -187,9 +187,9 @@ module ArticleHelper
187 187 def following_button(page, user)
188 188 if !user.blank? and user != page.author
189 189 if page.is_followed_by? user
190   - button :cancel, unfollow_button_text(page), {:controller => 'profile', :action => 'unfollow_article', :article_id => page.id, :profile => page.profile.identifier}
  190 + button :cancel, unfollow_button_text(page), {controller: :profile, profile: page.profile.identifier, action: :unfollow_article, article_id: page.id}
191 191 else
192   - button :add, follow_button_text(page), {:controller => 'profile', :action => 'follow_article', :article_id => page.id, :profile => page.profile.identifier}
  192 + button :add, follow_button_text(page), {controller: :profile, profile: page.profile.identifier, action: :follow_article, article_id: page.id}
193 193 end
194 194 end
195 195 end
... ...
app/helpers/boxes_helper.rb
... ... @@ -99,15 +99,10 @@ module BoxesHelper
99 99 end
100 100  
101 101 def render_block_content block
102   - # FIXME: this conditional should be removed after all
103   - # block footer from plugins methods get refactored into helpers and views.
104   - # They are a failsafe until all of them are done.
105   - return block.content if block.method(:content).owner != Block
106 102 render_block block
107 103 end
108 104  
109 105 def render_block_footer block
110   - return block.footer if block.method(:footer).owner != Block
111 106 render_block block, 'footers/'
112 107 end
113 108  
... ...
app/helpers/buttons_helper.rb
1 1 module ButtonsHelper
  2 +
  3 + def button_bar(options = {}, &block)
  4 + options[:class] ||= ''
  5 + options[:class] << ' button-bar'
  6 +
  7 + content_tag :div, options do
  8 + [
  9 + capture(&block).to_s,
  10 + tag(:br, style: 'clear: left;'),
  11 + ].safe_join
  12 + end
  13 + end
  14 +
2 15 def button(type, label, url, html_options = {})
3 16 html_options ||= {}
4 17 the_class = 'with-text'
... ...
app/helpers/custom_fields_helper.rb
... ... @@ -61,6 +61,6 @@ module CustomFieldsHelper
61 61  
62 62 def form_for_format(customized_type, format)
63 63 field = CustomField.new(:format => format, :customized_type => customized_type, :environment => environment)
64   - CGI::escapeHTML((render(:partial => 'features/custom_fields/form', :locals => {:field => field})))
  64 + CGI::escapeHTML((render(:partial => 'features/custom_fields/form', :locals => {:field => field}))).html_safe
65 65 end
66 66 end
... ...
app/helpers/theme_loader_helper.rb
... ... @@ -2,8 +2,8 @@ module ThemeLoaderHelper
2 2 def current_theme
3 3 @current_theme ||=
4 4 begin
5   - if session[:theme]
6   - session[:theme]
  5 + if session[:user_theme]
  6 + session[:user_theme]
7 7 else
8 8 # utility for developers: set the theme to 'random' in development mode and
9 9 # you will get a different theme every request. This is interesting for
... ... @@ -11,8 +11,8 @@ module ThemeLoaderHelper
11 11 if Rails.env.development? && environment.theme == 'random'
12 12 @random_theme ||= Dir.glob('public/designs/themes/*').map { |f| File.basename(f) }.rand
13 13 @random_theme
14   - elsif Rails.env.development? && respond_to?(:params) && params[:theme] && File.exists?(Rails.root.join('public/designs/themes', params[:theme]))
15   - params[:theme]
  14 + elsif Rails.env.development? && respond_to?(:params) && params[:user_theme] && File.exists?(Rails.root.join('public/designs/themes', params[:user_theme]))
  15 + params[:user_theme]
16 16 else
17 17 if profile && !profile.theme.nil?
18 18 profile.theme
... ... @@ -34,8 +34,10 @@ module ThemeLoaderHelper
34 34 end
35 35  
36 36 def theme_path
37   - if session[:theme]
  37 + if session[:user_theme]
38 38 '/user_themes/' + current_theme
  39 + elsif session[:theme]
  40 + '/designs/themes/' + session[:theme]
39 41 else
40 42 '/designs/themes/' + current_theme
41 43 end
... ...
app/helpers/url_helper.rb
... ... @@ -4,4 +4,12 @@ module UrlHelper
4 4 'javascript:history.back()'
5 5 end
6 6  
  7 + def default_url_options
  8 + options = {}
  9 +
  10 + options[:override_user] = params[:override_user] if params[:override_user].present?
  11 +
  12 + options
  13 + end
  14 +
7 15 end
... ...
app/helpers/users_helper.rb
1 1 module UsersHelper
2 2  
3   - FILTER_TRANSLATION = {
  3 + def filter_translation
  4 + {
4 5 'all_users' => _('All users'),
5 6 'admin_users' => _('Admin users'),
6 7 'activated_users' => _('Activated users'),
7 8 'deactivated_users' => _('Deativated users'),
8   - }
  9 + }
  10 + end
9 11  
10 12 def filter_selector(filter, float = 'right')
11   - options = options_for_select(FILTER_TRANSLATION.map {|key, name| [name, key]}, :selected => filter)
  13 + options = options_for_select(filter_translation.map {|key, name| [name, key]}, :selected => filter)
12 14 url_params = url_for(params.merge(:filter => 'FILTER'))
13 15 onchange = "document.location.href = '#{url_params}'.replace('FILTER', this.value)"
14 16 select_field = select_tag(:filter, options, :onchange => onchange)
... ... @@ -19,7 +21,7 @@ module UsersHelper
19 21 end
20 22  
21 23 def users_filter_title(filter)
22   - FILTER_TRANSLATION[filter]
  24 + filter_translation[filter]
23 25 end
24 26  
25 27 end
... ...
app/jobs/download_reported_images_job.rb 0 → 100644
... ... @@ -0,0 +1,27 @@
  1 +class DownloadReportedImagesJob < Struct.new(:abuse_report, :article)
  2 + def perform
  3 + images_paths = article.image? ? [File.join(article.profile.environment.top_url, article.public_filename(:display))] : article.body_images_paths
  4 + images_paths.each do |image_path|
  5 + image = get_image(image_path)
  6 + reported_image = ReportedImage.create!( :abuse_report => abuse_report,
  7 + :uploaded_data => image,
  8 + :filename => File.basename(image_path),
  9 + :size => image.size )
  10 + abuse_report.content = parse_content(abuse_report, image_path, reported_image)
  11 + end
  12 + abuse_report.save!
  13 + end
  14 +
  15 + def get_image(image_path)
  16 + image = ActionController::UploadedTempfile.new('reported_image')
  17 + image.write(Net::HTTP.get(URI.parse(image_path)))
  18 + image.original_path = 'tmp/' + File.basename(image_path)
  19 + image.content_type = 'image/' + File.extname(image_path).gsub('.','')
  20 + image
  21 + end
  22 +
  23 + def parse_content(report, old_path, image)
  24 + old_path = old_path.gsub(report.reporter.environment.top_url, '')
  25 + report.content.gsub(/#{old_path}/, image.public_filename)
  26 + end
  27 +end
... ...
app/jobs/get_email_contacts_job.rb 0 → 100644
... ... @@ -0,0 +1,11 @@
  1 +class GetEmailContactsJob < Struct.new(:import_from, :login, :password, :contact_list_id)
  2 + def perform
  3 + begin
  4 + Invitation.get_contacts(import_from, login, password, contact_list_id)
  5 + rescue Contacts::AuthenticationError => ex
  6 + ContactList.exists?(contact_list_id) && ContactList.find(contact_list_id).register_auth_error
  7 + rescue Exception => ex
  8 + ContactList.exists?(contact_list_id) && ContactList.find(contact_list_id).register_error
  9 + end
  10 + end
  11 +end
... ...
app/jobs/invitation_job.rb 0 → 100644
... ... @@ -0,0 +1,10 @@
  1 +class InvitationJob < Struct.new(:person_id, :contacts_to_invite, :message, :profile_id, :contact_list_id, :locale)
  2 + def perform
  3 + Noosfero.with_locale(locale) do
  4 + person = Person.find(person_id)
  5 + profile = Profile.find(profile_id)
  6 + Invitation.invite(person, contacts_to_invite, message, profile)
  7 + ContactList.exists?(contact_list_id) && ContactList.find(contact_list_id).destroy
  8 + end
  9 + end
  10 +end
... ...
app/jobs/log_memory_consumption_job.rb 0 → 100644
... ... @@ -0,0 +1,22 @@
  1 +class LogMemoryConsumptionJob < Struct.new(:last_stat)
  2 + # Number of entries do display
  3 + N = 20
  4 +
  5 + def perform
  6 + logpath = File.join(Rails.root, 'log', "#{ENV['RAILS_ENV']}_memory_consumption.log")
  7 + logger = Logger.new(logpath)
  8 + stats = Hash.new(0)
  9 + ObjectSpace.each_object {|o| stats[o.class.to_s] += 1}
  10 + i = 1
  11 +
  12 + logger << "[#{Time.now.strftime('%F %T %z')}]\n"
  13 + stats.sort {|(k1,v1),(k2,v2)| v2 <=> v1}.each do |k,v|
  14 + logger << (sprintf "%-60s %10d", k, v)
  15 + logger << (sprintf " | delta %10d", (v - last_stat[k])) if last_stat && last_stat[k]
  16 + logger << "\n"
  17 + break if i > N
  18 + i += 1
  19 + end
  20 + logger << "\n"
  21 + end
  22 +end
... ...
app/jobs/mailing_job.rb 0 → 100644
... ... @@ -0,0 +1,8 @@
  1 +class MailingJob < Struct.new(:mailing_id)
  2 + def perform
  3 + mailing = Mailing.find(mailing_id)
  4 + Noosfero.with_locale(mailing.locale) do
  5 + mailing.deliver
  6 + end
  7 + end
  8 +end
... ...
app/jobs/notify_activity_to_profiles_job.rb 0 → 100644
... ... @@ -0,0 +1,44 @@
  1 +class NotifyActivityToProfilesJob < Struct.new(:tracked_action_id)
  2 + NOTIFY_ONLY_COMMUNITY = [
  3 + 'add_member_in_community'
  4 + ]
  5 +
  6 + NOT_NOTIFY_COMMUNITY = [
  7 + 'join_community'
  8 + ]
  9 + def perform
  10 + return unless ActionTracker::Record.exists?(tracked_action_id)
  11 + tracked_action = ActionTracker::Record.find(tracked_action_id)
  12 + return unless tracked_action.user.present?
  13 + target = tracked_action.target
  14 + if target.is_a?(Community) && ( NOTIFY_ONLY_COMMUNITY.include?(tracked_action.verb) || ! target.public_profile )
  15 + ActionTrackerNotification.create(:profile_id => target.id, :action_tracker_id => tracked_action.id)
  16 + return
  17 + end
  18 +
  19 + # Notify the user
  20 + ActionTrackerNotification.create(:profile_id => tracked_action.user.id, :action_tracker_id => tracked_action.id)
  21 +
  22 + # Notify all friends
  23 + ActionTrackerNotification.connection.execute("insert into action_tracker_notifications(profile_id, action_tracker_id) select f.friend_id, #{tracked_action.id} from friendships as f where person_id=#{tracked_action.user.id} and f.friend_id not in (select atn.profile_id from action_tracker_notifications as atn where atn.action_tracker_id = #{tracked_action.id})")
  24 +
  25 + if tracked_action.user.is_a? Organization
  26 + ActionTrackerNotification.connection.execute "insert into action_tracker_notifications(profile_id, action_tracker_id) " +
  27 + "select distinct accessor_id, #{tracked_action.id} from role_assignments where resource_id = #{tracked_action.user.id} and resource_type='Profile' " +
  28 + if tracked_action.user.is_a? Enterprise then "union select distinct person_id, #{tracked_action.id} from favorite_enterprise_people where enterprise_id = #{tracked_action.user.id}" else "" end
  29 + end
  30 +
  31 + if target.is_a?(Community)
  32 + ActionTrackerNotification.create(:profile_id => target.id, :action_tracker_id => tracked_action.id) unless NOT_NOTIFY_COMMUNITY.include?(tracked_action.verb)
  33 +
  34 + ActionTrackerNotification.connection.execute("insert into action_tracker_notifications(profile_id, action_tracker_id) select distinct profiles.id, #{tracked_action.id} from role_assignments, profiles where profiles.type = 'Person' and profiles.id = role_assignments.accessor_id and profiles.id != #{tracked_action.user.id} and profiles.id not in (select atn.profile_id from action_tracker_notifications as atn where atn.action_tracker_id = #{tracked_action.id}) and role_assignments.resource_type = 'Profile' and role_assignments.resource_id = #{target.id}")
  35 + end
  36 +
  37 + if target.is_a?(Article) && target.profile.is_a?(Community)
  38 + ActionTrackerNotification.create(:profile_id => target.profile.id, :action_tracker_id => tracked_action.id) unless NOT_NOTIFY_COMMUNITY.include?(tracked_action.verb)
  39 +
  40 + ActionTrackerNotification.connection.execute("insert into action_tracker_notifications(profile_id, action_tracker_id) select distinct profiles.id, #{tracked_action.id} from role_assignments, profiles where profiles.type = 'Person' and profiles.id = role_assignments.accessor_id and profiles.id != #{tracked_action.user.id} and profiles.id not in (select atn.profile_id from action_tracker_notifications as atn where atn.action_tracker_id = #{tracked_action.id}) and role_assignments.resource_type = 'Profile' and role_assignments.resource_id = #{target.profile.id}")
  41 + end
  42 +
  43 + end
  44 +end
... ...
app/jobs/profile_suggestions_job.rb 0 → 100644
... ... @@ -0,0 +1,22 @@
  1 +class ProfileSuggestionsJob < Struct.new(:person_id)
  2 +
  3 + def self.exists?(person_id)
  4 + !find(person_id).empty?
  5 + end
  6 +
  7 + def self.find(person_id)
  8 + Delayed::Job.by_handler("--- !ruby/struct:ProfileSuggestionsJob\nperson_id: #{person_id}\n")
  9 + end
  10 +
  11 + def perform
  12 + logger = Delayed::Worker.logger
  13 + begin
  14 + person = Person.find(person_id)
  15 + ProfileSuggestion.calculate_suggestions(person)
  16 + UserMailer.profiles_suggestions_email(person).deliver if person.email_suggestions
  17 + rescue Exception => exception
  18 + logger.error("Error with suggestions for person ID %d: %s" % [person_id, exception.to_s])
  19 + end
  20 + end
  21 +
  22 +end
... ...
app/jobs/user_activation_job.rb 0 → 100644
... ... @@ -0,0 +1,6 @@
  1 +class UserActivationJob < Struct.new(:user_id)
  2 + def perform
  3 + user = User.find(user_id)
  4 + user.destroy unless user.activated? || user.person.is_template? || user.moderate_registration_pending?
  5 + end
  6 +end
... ...
app/models/add_member.rb
... ... @@ -37,6 +37,10 @@ class AddMember &lt; Task
37 37 true
38 38 end
39 39  
  40 + def reject_details
  41 + true
  42 + end
  43 +
40 44 def footer
41 45 true
42 46 end
... ... @@ -72,8 +76,9 @@ class AddMember &lt; Task
72 76 end
73 77  
74 78 def task_cancelled_message
75   - _("Your request to enter community \"%{target} with the profile \"%{requestor}\" was not accepted. Please contact any profile admin from %{url} for more information.") %
76   - {:target => self.target.name, :url => self.target.url,
77   - :requestor => self.requestor.name}
  79 + _("Your request to enter community \"%{target}\" with the profile \"%{requestor}\" was not accepted. Please contact any profile admin from %{target} for more information. The following explanation was given: \n\n\"%{explanation}\"") %
  80 + {:target => self.target.name,
  81 + :requestor => self.requestor.name,
  82 + :explanation => self.reject_explanation}
78 83 end
79 84 end
... ...
app/models/article.rb
... ... @@ -29,6 +29,8 @@ class Article &lt; ApplicationRecord
29 29 :display => %w[full]
30 30 }
31 31  
  32 + N_('article')
  33 +
32 34 def initialize(*params)
33 35 super
34 36 if params.present? && params.first.present?
... ...
app/models/block.rb
... ... @@ -181,30 +181,6 @@ class Block &lt; ApplicationRecord
181 181 "/images/block_preview.png"
182 182 end
183 183  
184   - # Returns the content to be used for this block.
185   - #
186   - # This method can return several types of objects:
187   - #
188   - # * <tt>String</tt>: if the string starts with <tt>http://</tt> or <tt>https://</tt>, then it is assumed to be address of an IFRAME. Otherwise it's is used as regular HTML.
189   - # * <tt>Hash</tt>: the hash is used to build an URL that is used as the address for a IFRAME.
190   - # * <tt>Proc</tt>: the Proc is evaluated in the scope of BoxesHelper. The
191   - # block can then use <tt>render</tt>, <tt>link_to</tt>, etc.
192   - #
193   - # The method can also return <tt>nil</tt>, which means "no content".
194   - #
195   - # See BoxesHelper#extract_block_content for implementation details.
196   - def content(args={})
197   - "This is block number %d" % self.id
198   - end
199   -
200   - # A footer to be appended to the end of the block. Returns <tt>nil</tt>.
201   - #
202   - # Override in your subclasses. You can return the same types supported by
203   - # #content.
204   - def footer
205   - nil
206   - end
207   -
208 184 # Is this block editable? (Default to <tt>true</tt>)
209 185 def editable?(user=nil)
210 186 self.edit_modes == "all"
... ...
app/models/comment_handler.rb
1   -class CommentHandler < Struct.new(:comment_id, :method)
  1 +class CommentHandler < Struct.new(:comment_id, :method, :locale)
  2 + def initialize(*args)
  3 + super
  4 + self.locale ||= FastGettext.locale
  5 + end
2 6  
3 7 def perform
  8 + saved_locale = FastGettext.locale
  9 + FastGettext.locale = locale
  10 +
4 11 comment = Comment.find(comment_id)
5 12 comment.send(method)
  13 + FastGettext.locale = saved_locale
6 14 rescue ActiveRecord::RecordNotFound
7 15 # just ignore non-existing comments
8 16 end
... ...
app/models/community.rb
... ... @@ -9,7 +9,7 @@ class Community &lt; Organization
9 9 _('Community')
10 10 end
11 11  
12   - N_('Community')
  12 + N_('community')
13 13 N_('Language')
14 14  
15 15 settings_items :language
... ...
app/models/enterprise.rb
... ... @@ -12,7 +12,7 @@ class Enterprise &lt; Organization
12 12 _('Enterprise')
13 13 end
14 14  
15   - N_('Enterprise')
  15 + N_('enterprise')
16 16  
17 17 acts_as_trackable after_add: proc{ |p, t| notify_activity t }
18 18  
... ...
app/models/environment.rb
... ... @@ -750,6 +750,10 @@ class Environment &lt; ApplicationRecord
750 750 end
751 751 end
752 752  
  753 + def theme_ids
  754 + settings[:themes] || []
  755 + end
  756 +
753 757 def themes=(values)
754 758 settings[:themes] = values
755 759 end
... ...
app/models/link_list_block.rb
... ... @@ -81,10 +81,8 @@ class LinkListBlock &lt; Block
81 81 end
82 82 end
83 83  
84   - def icons_options
85   - ICONS.map do |i|
86   - "<span title=\"#{i[1]}\" class=\"icon-#{i[0]}\" onclick=\"changeIcon(this, '#{i[0]}')\"></span>".html_safe
87   - end
  84 + def icons
  85 + ICONS
88 86 end
89 87  
90 88 end
... ...
app/models/organization.rb
... ... @@ -234,4 +234,7 @@ class Organization &lt; Profile
234 234 self.admins.where(:id => user.id).exists?
235 235 end
236 236  
  237 + def display_private_info_to?(user)
  238 + (public_profile && visible && !secret) || super
  239 + end
237 240 end
... ...
app/models/person.rb
... ... @@ -13,6 +13,8 @@ class Person &lt; Profile
13 13 _('Person')
14 14 end
15 15  
  16 + N_('person')
  17 +
16 18 acts_as_trackable :after_add => Proc.new {|p,t| notify_activity(t)}
17 19 acts_as_accessor
18 20  
... ...
app/models/person_notifier.rb
... ... @@ -82,7 +82,7 @@ class PersonNotifier
82 82 helper ActionTrackerHelper
83 83  
84 84 def session
85   - {:theme => nil}
  85 + {:user_theme => nil}
86 86 end
87 87  
88 88 def content_summary(person, notifications, tasks)
... ...
app/views/account/_login_form.html.erb
... ... @@ -11,7 +11,7 @@
11 11 <%= hidden_field_tag :terms_accepted, params[:terms_accepted] %>
12 12 <% end %>
13 13  
14   -<% button_bar do %>
  14 +<%= button_bar do %>
15 15 <%= submit_button( 'login', _('Log in') )%>
16 16 <%= modal_close_button _('Cancel') if request.xhr? %>
17 17 <% end %>
... ...
app/views/account/accept_terms.html.erb
... ... @@ -20,7 +20,7 @@
20 20 <%= hidden_field_tag :answer, params[:answer] %>
21 21  
22 22 <%= labelled_check_box(environment.terms_of_use_acceptance_text.blank? ? _('I read the terms of use and accepted them') : environment.terms_of_use_acceptance_text, :terms_accepted, '1', false, :id => 'accept-terms') %>
23   - <% button_bar do %>
  23 + <%= button_bar do %>
24 24 <%= button 'cancel', _('Cancel'), :controller => 'home', :action => 'index' %>
25 25 <%= submit_button 'forward', _('Continue'), {:disabled => true, :class => 'disabled', :id => 'submit-accept-terms'} %>
26 26 <% end %>
... ...
app/views/account/activation_question.html.erb
... ... @@ -24,7 +24,7 @@
24 24  
25 25 <div class='activation-box'>
26 26 <h2><%= _('Enterprise activation') + ' - ' + (logged_in? ? _('part 1 of 2') : _('part 1 of 3')) %></h2>
27   - <%= form_tag( {:action => 'accept_terms'}, {:method => 'get', :onsubmit => (@question == :foundation_year ? 'return check_valid_year(this)' : 'return check_valid_cnpj(this)')}) do %>
  27 + <%= form_tag( {:action => 'accept_terms'}, {:method => 'get', :onsubmit => (@question == :foundation_year ? 'return check_valid_year(this)' : 'return check_valid_cnpj(this)')}) do %>
28 28  
29 29 <p> <strong><%= _('Pay atention! You have only one chance!') %></strong> </p>
30 30  
... ... @@ -34,7 +34,7 @@
34 34  
35 35 <%= hidden_field_tag :enterprise_code, params[:enterprise_code] %>
36 36  
37   - <% button_bar do %>
  37 + <%= button_bar do %>
38 38 <%= button 'cancel', _('Cancel'), :action => 'index' %>
39 39 <%= submit_button 'forward', _('Continue') %>
40 40 <% end %>
... ...
app/views/account/forgot_password.html.erb
... ... @@ -9,7 +9,7 @@
9 9 <%= recaptcha_tags(:display => { :theme => 'clean' }, :ajax => true) %>
10 10  
11 11 <div>
12   - <% button_bar do %>
  12 + <%= button_bar do %>
13 13 <%= submit_button('send', _('Send instructions')) %>
14 14 <% end %>
15 15 </div>
... ...
app/views/account/login.html.erb
... ... @@ -22,7 +22,7 @@
22 22  
23 23 <%= safe_join(@plugins.dispatch(:login_extra_contents).collect { |content| instance_exec(&content) }, "") %>
24 24  
25   - <% button_bar do %>
  25 + <%= button_bar do %>
26 26 <%= submit_button( 'login', _('Log in') )%>
27 27 <% if is_popin %>
28 28 <%= modal_close_button(_('Cancel')) %>
... ... @@ -31,7 +31,7 @@
31 31  
32 32 <% end %>
33 33  
34   -<% button_bar do %>
  34 +<%= button_bar do %>
35 35 <% unless @plugins.dispatch(:allow_user_registration).include?(false) %>
36 36 <%= button :add, _("New user"), :controller => 'account', :action => 'signup' %>
37 37 <% end %>
... ...
app/views/account/login_block.html.erb
... ... @@ -17,7 +17,7 @@
17 17  
18 18 <%= safe_join(@plugins.dispatch(:login_extra_contents).collect { |content| instance_eval(&content) }, "") %>
19 19  
20   - <% button_bar do %>
  20 + <%= button_bar do %>
21 21 <%= submit_button( 'login', _('Log in') )%>
22 22 <% unless @plugins.dispatch(:allow_user_registration).include?(false) %>
23 23 <%= button(:add, _('New user'), { :controller => 'account', :action => 'signup' }) %>
... ...
app/views/account/logout_popup.html.erb
1 1 <h2><%= _('Are you sure you want to get out?') %></h2>
2 2 <p>
3   -<% button_bar do %>
  3 +<%= button_bar do %>
4 4 <%= button :ok, _('Yes'), { :controller => 'account', :action => 'logout' } %>
5 5 <%= modal_close_button _('No, I want to stay.') %>
6 6 <% end %>
... ...
app/views/account/new_password.html.erb
... ... @@ -10,7 +10,7 @@
10 10  
11 11 <%= labelled_form_field(_('Enter new password'), (f.password_field :password)) %>
12 12 <%= labelled_form_field(_('Confirm the new password'), (f.password_field :password_confirmation)) %>
13   - <% button_bar do %>
  13 + <%= button_bar do %>
14 14 <%= submit_button(:ok, _('Change password')) %>
15 15 <% end %>
16 16  
... ...
app/views/account/welcome.html.erb
... ... @@ -3,8 +3,8 @@
3 3  
4 4 <%= _('%s was successfuly activated. Now you may go to your control panel or to the control panel of your enterprise') % @enterprise.name %>
5 5  
6   - <% button_bar do %>
7   - <%= button 'forward', _('Go to my control panel'), :action => 'index', :controller => 'profile_editor', :profile => current_user.person.identifier %>
  6 + <%= button_bar do %>
  7 + <%= button 'forward', _('Go to my control panel'), :action => 'index', :controller => 'profile_editor', :profile => current_user.person.identifier %>
8 8 <%= button 'forward', _('Go to my enterprise control panel') % @enterprise.name, :action => 'index', :controller => 'profile_editor', :profile => @enterprise.identifier %>
9 9 <% end %>
10 10 <% end %>
... ...
app/views/admin_panel/message_for_disabled_enterprise.html.erb
... ... @@ -6,7 +6,7 @@
6 6  
7 7 <%= f.text_area :message_for_disabled_enterprise, :cols => 40, :style => 'width: 90%' %>
8 8  
9   - <% button_bar do %>
  9 + <%= button_bar do %>
10 10 <%= submit_button(:save, _('Save')) %>
11 11 <%= button(:cancel, _('Cancel'), :action => 'index') %>
12 12 <% end %>
... ...
app/views/admin_panel/set_portal_community.html.erb
... ... @@ -4,14 +4,14 @@
4 4 <%= form_tag do %>
5 5 <%= labelled_form_field(_('Portal identifier'), text_field_tag('portal_community_identifier', @portal_community.identifier, :size => 40) ) %>
6 6  
7   - <% button_bar do %>
  7 + <%= button_bar do %>
8 8 <%= submit_button 'save', _('Save'), :cancel => { :action => 'index' } %>
9 9 <% end %>
10 10 <% end %>
11 11 <% else %>
12 12 <%= _('Portal identifier: %s').html_safe % link_to(@portal_community.identifier, @portal_community.url) %>
13 13  
14   - <% button_bar do %>
  14 + <%= button_bar do %>
15 15 <%if @portal_community.environment.enabled?('use_portal_community') %>
16 16 <%= button 'cancel', _('Disable'), {:action => 'manage_portal_community', :activate => 0} %>
17 17 <% else %>
... ...
app/views/admin_panel/set_portal_folders.html.erb
... ... @@ -37,7 +37,7 @@
37 37 <%= _('The same order in which you arrange the folders here will be used for arranging the boxes in the environment initial page.') %>
38 38 </p>
39 39  
40   - <% button_bar do %>
  40 + <%= button_bar do %>
41 41 <%= submit_button 'save', _('Save'), :cancel => {:action => 'index'} %>
42 42 <% end %>
43 43 <% end %>
... ...
app/views/admin_panel/set_portal_news_amount.html.erb
... ... @@ -6,7 +6,7 @@
6 6 <%= labelled_form_field _('Number of portal news'), select(:environment, :portal_news_amount, (0..10).to_a) %>
7 7 <%= labelled_form_field _('Number of news by folder'), select(:environment, :news_amount_by_folder, (1..10).to_a) %>
8 8  
9   - <% button_bar do %>
  9 + <%= button_bar do %>
10 10 <%= submit_button(:save, _('Save')) %>
11 11 <%= button(:cancel, _('Cancel'), :action => 'index') %>
12 12 <% end %>
... ...
app/views/admin_panel/site_info.html.erb
... ... @@ -20,7 +20,7 @@
20 20 <% tabs << {:title => _('Signup introduction text'), :id => 'signup-intro',
21 21 :content => (render :partial => 'signup_intro', :locals => {:f => f})} %>
22 22 <%= render_tabs(tabs) %>
23   - <% button_bar do %>
  23 + <%= button_bar do %>
24 24 <%= submit_button(:save, _('Save'), :cancel => {:action => 'index'}) %>
25 25 <% end %>
26 26 <% end %>
... ...
app/views/box_organizer/_icon_selector.html.erb
... ... @@ -2,6 +2,8 @@
2 2 <%= hidden_field_tag 'block[links][][icon]', icon %>
3 3 <span class='icon-<%= icon %>' style='display:block; width:16px; height:16px;'></span>
4 4 <div class="icon-selector" style='display:none;'>
5   - <%= @block.icons_options.join %>
  5 + <% @block.icons.map do |i| %>
  6 + <%= content_tag('span', '', :title => i[1], :class => "icon-#{i[0]}", :onclick => "changeIcon(this, '#{i[0]}')") %>
  7 + <% end %>
6 8 </div>
7 9 </div>
... ...
app/views/box_organizer/edit.html.erb
... ... @@ -35,7 +35,7 @@
35 35 </div>
36 36 <% end %>
37 37  
38   - <% button_bar do %>
  38 + <%= button_bar do %>
39 39 <%= submit_button(:save, _('Save')) %>
40 40 <%= modal_close_button(_('Cancel')) %>
41 41 <% end %>
... ...
app/views/box_organizer/index.html.erb
... ... @@ -3,7 +3,7 @@
3 3  
4 4 <h1><%= _('Editing sideboxes')%></h1>
5 5  
6   -<% button_bar :class=>'design-menu' do %>
  6 +<%= button_bar :class=>'design-menu' do %>
7 7 <%= button(:back, _('Back to control panel'), :controller => (profile.nil? ? 'admin_panel': 'profile_editor')) %>
8 8 <% end %>
9 9  
... ...
app/views/categories/_form.html.erb
... ... @@ -28,7 +28,7 @@
28 28 <%= file_field_or_thumbnail(_('Image:'), @category.image, i) %>
29 29 <% end %>
30 30  
31   - <% button_bar do %>
  31 + <%= button_bar do %>
32 32 <%= submit_button('save', _('Save'), :cancel => {:action => 'index'}) %>
33 33 <% end%>
34 34 <% end %>
... ...
app/views/cms/_media_new_folder.html.erb
... ... @@ -9,7 +9,7 @@
9 9 <%= labelled_radio_button _('Folder'), :folder_type, 'Folder', false %>
10 10  
11 11 <%= labelled_form_field _('Name:'), text_field_tag(:new_folder, nil, 'data-url' => url_for({:action => 'new', :profile => profile.identifier})) %>
12   - <% button_bar do %>
  12 + <%= button_bar do %>
13 13 <%= submit_button(:newfolder, _('Create')) %>
14 14 <% end %>
15 15 <% end %>
... ...
app/views/cms/_text_fields.html.erb
1   -<%= labelled_form_field(_('Publish date'), date_field('article[published_at]', @article.published_at || DateTime.current, {:max_date => '+0d', :date_format => 'yy-mm-dd'}, {:id => "article_published_at"})) %>
  1 +<%= labelled_form_field(_('Publish date'), date_field('article[published_at]', @article.published_at || DateTime.current, {:max_date => '+0d', :time => true}, {:id => "article_published_at"})) %>
... ...
app/views/cms/_upload_file_form.html.erb
... ... @@ -12,7 +12,7 @@
12 12  
13 13 <%= hidden_field_tag('back_to', @back_to) %>
14 14  
15   -<% button_bar do %>
  15 +<%= button_bar do %>
16 16 <%= button_to_function :add, _('More files'), "add_new_file_fields()" %>
17 17 <% if @back_to %>
18 18 <%= submit_button :save, _('Upload'), :cancel => @back_to %>
... ...
app/views/cms/destroy.html.erb
... ... @@ -12,7 +12,7 @@
12 12 <% end %>
13 13 </strong>
14 14  
15   - <% button_bar do %>
  15 + <%= button_bar do %>
16 16 <%= submit_button :save, _('Yes, I want.') %>
17 17 <%= button :cancel, _("No, I don't want."), @article.url %>
18 18 <% end %>
... ...
app/views/cms/edit.html.erb
... ... @@ -21,7 +21,7 @@
21 21 </div>
22 22 <% end %>
23 23  
24   - <% button_bar do %>
  24 + <%= button_bar do %>
25 25 <%= submit_button :save, _('Save') %>
26 26 <%= submit_button :save, _('Save and continue'), :name => "continue" %>
27 27 <% end %>
... ... @@ -48,7 +48,7 @@
48 48 <%= options_for_article(@article, @tokenized_children) %>
49 49 </div>
50 50  
51   - <% button_bar do %>
  51 + <%= button_bar do %>
52 52 <%= submit_button :save, _('Save') %>
53 53  
54 54 <% if @back_to %>
... ...
app/views/cms/publish.html.erb
... ... @@ -25,7 +25,7 @@
25 25 <%= hidden_field_tag :back_to, @back_to %>
26 26 <%= labelled_form_field _('Title'), text_field_tag('name', @article.name) %>
27 27  
28   - <% button_bar do %>
  28 + <%= button_bar do %>
29 29 <%= submit_button 'spread', _('Spread this') %>
30 30 <% end %>
31 31 <% end %>
... ... @@ -41,7 +41,7 @@
41 41 <% search_action = url_for(:action => 'search_communities_to_publish') %>
42 42 <%= token_input_field_tag(:q, 'search-communities-to-publish', search_action, { :hint_text => _('Type in a search for your community'), :zindex => 10000, :focus => false }) %>
43 43 <%= labelled_form_field _('Title'), text_field_tag('name', @article.name) %>
44   - <% button_bar do %>
  44 + <%= button_bar do %>
45 45 <%= submit_button 'spread', _('Spread this') %>
46 46 <% end %>
47 47 <% end %>
... ... @@ -58,7 +58,7 @@
58 58 <%= hidden_field_tag :back_to, @back_to %>
59 59 <%= labelled_form_field _('Title'), text_field_tag('name', @article.name) %>
60 60  
61   - <% button_bar do %>
  61 + <%= button_bar do %>
62 62 <%= submit_button 'spread', _('Spread this') %>
63 63 <% end %>
64 64 <% end %>
... ...
app/views/cms/publish_on_portal_community.html.erb
... ... @@ -5,7 +5,7 @@
5 5 <%= hidden_field_tag :back_to, @back_to %>
6 6 <%= labelled_text_field _('Title') + ': ', :name, @article.name, :style => 'width: 100%' %>
7 7  
8   - <% button_bar do %>
  8 + <%= button_bar do %>
9 9 <%= submit_button 'spread', _('Spread this'), :cancel => @back_to %>
10 10 <% end %>
11 11 <% end %>
... ... @@ -14,7 +14,7 @@
14 14 <%= _("There is no portal community in this environment.") %>
15 15 </div>
16 16  
17   - <% button_bar do %>
  17 + <%= button_bar do %>
18 18 <%= button :back, _('Back'), :controller => 'cms' %>
19 19 <% end %>
20 20 <% end %>
... ...
app/views/cms/suggest_an_article.html.erb
... ... @@ -23,7 +23,7 @@
23 23  
24 24 <%= recaptcha_tags(:display => { :theme => 'clean' }, :ajax => true) unless logged_in? %>
25 25  
26   - <% button_bar do %>
  26 + <%= button_bar do %>
27 27 <%= submit_button :save, _('Save') %>
28 28 <%= button :cancel, _('Cancel'), @back_to %>
29 29 <% end %>
... ...
app/views/cms/view.html.erb
... ... @@ -14,7 +14,7 @@
14 14 </div>
15 15 <% end %>
16 16  
17   -<% button_bar(:style => 'margin-bottom: 1em;') do %>
  17 +<%= button_bar(:style => 'margin-bottom: 1em;') do %>
18 18 <% parent_id = ((@article && @article.allow_children?) ? @article : nil) %>
19 19  
20 20 <%= modal_button('new', _('New content'), url_for({:action => 'new', :parent_id => parent_id, :cms => true}).html_safe) %>
... ...
app/views/cms/why_categorize.html.erb
... ... @@ -4,6 +4,6 @@
4 4 <%= _('By categorizing your content, you increase the possibility that other people access it. When they are looking for, say, articles about Bahia and you categorize your article in "Regions/Bahia", then there is a good change that your article is going to be found.') %>
5 5 </p>
6 6  
7   -<% button_bar do %>
  7 +<%= button_bar do %>
8 8 <%= modal_close_button _('Close') %>
9 9 <% end %>
... ...
app/views/comment/_comment_form.html.erb
... ... @@ -8,7 +8,7 @@
8 8 <div id="recaptcha-container" style="display: none">
9 9 <h3><%= _('Please type the two words below') %></h3>
10 10 <%= recaptcha_tags(:display => { :theme => 'clean' }, :ajax => true) %>
11   - <% button_bar do %>
  11 + <%= button_bar do %>
12 12 <%= button_to_function :add, _('Confirm'), "return false", :id => "confirm-captcha" %>
13 13 <%= button_to_function :cancel, _('Cancel'), "noosfero.modal.close()" %>
14 14 <% end %>
... ... @@ -87,7 +87,7 @@ function check_captcha(button, confirm_action) {
87 87  
88 88 <%= safe_join(@plugins.dispatch(:comment_form_extra_contents, local_assigns.merge(:comment => @comment)).collect { |content| instance_exec(&content) }, "") %>
89 89  
90   - <% button_bar do %>
  90 + <%= button_bar do %>
91 91 <%= submit_button('add', _('Post comment'), :onclick => "if(check_captcha(this)) { save_comment(this) } else { check_captcha(this, save_comment)};return false;") %>
92 92 <% if !edition_mode %>
93 93 <%= button :cancel, _('Cancel'), '', :id => 'cancel-comment' %>
... ...
app/views/content_viewer/_comment_form.html.erb
... ... @@ -36,7 +36,7 @@ function submit_comment_form(button) {
36 36 <div id="recaptcha-container" style="display: none">
37 37 <h3><%= _('Please type the two words below') %></h3>
38 38 <%= recaptcha_tags(:display => { :theme => 'clean' }, :ajax => true) %>
39   - <% button_bar do %>
  39 + <%= button_bar do %>
40 40 <%= button_to_function :add, _('Confirm'), "return false", :id => "confirm-captcha" %>
41 41 <%= button_to_function :cancel, _('Cancel'), "noosfero.modal.close()" %>
42 42 <% end %>
... ... @@ -73,7 +73,7 @@ function submit_comment_form(button) {
73 73 <%= hidden_field_tag(:confirm, 'false') %>
74 74 <%= hidden_field_tag(:view, params[:view])%>
75 75  
76   - <% button_bar do %>
  76 + <%= button_bar do %>
77 77 <%= submit_button('add', _('Post comment'), :onclick => "submit_comment_form(this); return false") %>
78 78 <% if cancel_triggers_hide %>
79 79 <%= button :cancel, _('Cancel'), '', :id => 'cancel-comment' %>
... ...
app/views/content_viewer/_confirm_unfollow.html.erb
... ... @@ -5,7 +5,7 @@
5 5 <%= form_tag(@page.view_url.merge({:only_path => true}), {:method => 'post', :class => 'comment_form'}) do %>
6 6 <%= hidden_field_tag(:unfollow, 'commit') %>
7 7 <%= labelled_form_field(_('Enter your e-Mail'), text_field_tag(:email, nil, {:size => 40})) %>
8   - <% button_bar do %>
  8 + <%= button_bar do %>
9 9 <%= submit_button(:ok, _('Cancel notifications for e-mail above') ) %>
10 10 <% end %>
11 11 <% end %>
... ...
app/views/content_viewer/blog_page.html.erb
... ... @@ -4,7 +4,7 @@
4 4  
5 5 <div>
6 6 <div class='blog-description'>
7   - <%= blog.body %>
  7 + <%= (blog.body || '').html_safe %>
8 8 </div>
9 9 </div>
10 10 <hr class="pre-posts"/>
... ...
app/views/content_viewer/forum_page.html.erb
... ... @@ -16,7 +16,7 @@
16 16 <p><%= @page.terms_of_use %></p>
17 17  
18 18 <%= form_tag @page.url.merge(:terms_accepted => true) do %>
19   - <% button_bar do %>
  19 + <%= button_bar do %>
20 20 <% if user %>
21 21 <%= submit_button :save, _("Accept") %>
22 22 <% else %>
... ...
app/views/enterprise_registration/basic_information.html.erb
... ... @@ -8,7 +8,7 @@
8 8 <%= _('There are no validators to validate the registration of this new enterprise. Contact your administrator for instructions.') %>
9 9 </div>
10 10  
11   - <% button_bar do %>
  11 + <%= button_bar do %>
12 12 <%= button :back, _('Go back'), { :profile => current_user.person.identifier, :action=>"enterprises", :controller=>"profile" }%>
13 13 <% end %>
14 14 <% else %>
... ... @@ -36,7 +36,7 @@
36 36  
37 37 <%= template_options(:enterprises, 'create_enterprise')%>
38 38  
39   - <% button_bar do %>
  39 + <%= button_bar do %>
40 40 <%= submit_button('next', _('Next'), :cancel => {:profile => current_user.person.identifier, :action=>"enterprises", :controller=>"profile"}) %>
41 41 <% end %>
42 42 <% end %>
... ...
app/views/enterprise_registration/creation.html.erb
... ... @@ -4,7 +4,7 @@
4 4  
5 5 <%= render :partial => 'shared/template_welcome_page', :locals => {:template => @enterprise.template, :header => _("What can I do with a %s?")} %>
6 6  
7   -<% button_bar do %>
  7 +<%= button_bar do %>
8 8 <%= button :back, _('Back'), {:controller => 'memberships', :action => 'index', :profile => user.identifier} %>
9 9 <% end %>
10 10  
... ...
app/views/enterprise_registration/select_validator.html.erb
... ... @@ -22,7 +22,7 @@
22 22 <% end %>
23 23 </table>
24 24  
25   - <% button_bar do %>
  25 + <%= button_bar do %>
26 26 <%= submit_button 'save', _('Confirm') %>
27 27 <% end %>
28 28 <% end %>
... ...
app/views/enterprise_validation/details.html.erb
... ... @@ -15,7 +15,7 @@
15 15 <p><%= _('If this enterprise passes the criteria to be considered an solidarity enconomy enterprise, you can approve it by click the button below.') %></p>
16 16  
17 17 <%= form_tag :action => 'approve', :id => @pending.code do %>
18   - <% button_bar do %>
  18 + <%= button_bar do %>
19 19 <%= submit_button('approve', _('Approve')) %>
20 20 <% end %>
21 21 <% end %>
... ... @@ -27,7 +27,7 @@
27 27 <%= form_tag :action => 'reject', :id => @pending.code do %>
28 28 <%= labelled_form_field(_('Please provide an explanation for the rejection. This explanation will be sent to the requestor (required).'), text_area_tag('reject_explanation'))%>
29 29 <div>
30   - <% button_bar do %>
  30 + <%= button_bar do %>
31 31 <%= submit_button('reject', _('Reject')) %>
32 32 <% end %>
33 33 </div>
... ...
app/views/enterprise_validation/edit_validation_info.html.erb
... ... @@ -5,7 +5,7 @@
5 5 <%= labelled_form_for :info do |f| %>
6 6 <%= f.text_area(:validation_methodology, :cols => 50, :rows => 10) %>
7 7 <%= f.text_area(:restrictions, :cols => 50, :rows => 7) %>
8   - <% button_bar do %>
  8 + <%= button_bar do %>
9 9 <%= submit_button('save', _('Save'), :cancel => {:action => 'index'}) %>
10 10 <% end %>
11 11 <% end %>
... ...
app/views/enterprise_validation/index.html.erb
1 1 <h1><%= _('Enterprise validations') %></h1>
2 2  
3   -<% button_bar do %>
  3 +<%= button_bar do %>
4 4 <%= button(:edit, _('Edit validation info'), { :action => 'edit_validation_info' }) %>
5 5 <%= button(:back, _('Go Back'), { :controller => 'profile_editor' }) %>
6 6 <% end %>
... ...
app/views/environment_role_manager/affiliate.html.erb
... ... @@ -3,7 +3,7 @@
3 3 <%= form_tag( {:action => 'give_role'}, {:method => :post}) do %>
4 4 <%= select_tag 'role', options_for_select(@roles.map{|r|[r.name,r.id]}) %>
5 5 <%= hidden_field_tag 'person', current_user.person.id %>
6   - <% button_bar do %>
  6 + <%= button_bar do %>
7 7 <%= submit_button('affiliate', _('Affiliate', :cancel => {:action => 'index'}) %>
8 8 <% end %>
9 9 <% end %>
... ...
app/views/environment_role_manager/change_role.html.erb
... ... @@ -7,7 +7,7 @@
7 7 <% end %>
8 8 <%= hidden_field_tag 'person', @admin.id %>
9 9  
10   - <% button_bar do %>
  10 + <%= button_bar do %>
11 11 <%= submit_button('save', _('Save changes'), :cancel => {:action => 'index'}) %>
12 12 <% end %>
13 13 <% end %>
... ...
app/views/environment_role_manager/make_admin.html.erb
... ... @@ -9,7 +9,7 @@
9 9 <% @roles.each do |r| %>
10 10 <%= labelled_form_field(r.name, (check_box_tag "roles[]", r.id)) %>
11 11 <% end %>
12   - <% button_bar do %>
  12 + <%= button_bar do %>
13 13 <%= submit_button( 'save', _('Make'), :cancel => {:action => 'index'} ) %>
14 14 <% end %>
15 15 <% end %>
... ...
app/views/environment_themes/index.html.erb
... ... @@ -3,6 +3,6 @@
3 3  
4 4 <br style="clear:both" />
5 5  
6   -<% button_bar do %>
  6 +<%= button_bar do %>
7 7 <%= button(:back, _('Back'), :controller => 'admin_panel', :action => 'index') %>
8 8 <% end %>
... ...
app/views/favorite_enterprises/index.html.erb
... ... @@ -23,7 +23,7 @@
23 23 </p>
24 24 <% end %>
25 25  
26   -<% button_bar do %>
  26 +<%= button_bar do %>
27 27 <%= button(:back, _('Go back'), :controller => 'profile_editor') %>
28 28 <% end %>
29 29  
... ...
app/views/features/_manage_community_fields.html.erb
... ... @@ -55,7 +55,7 @@
55 55 </script>
56 56  
57 57 <div>
58   - <% button_bar do %>
  58 + <%= button_bar do %>
59 59 <%= submit_button('save', _('Save changes'), :id=>"save_community_fields") %>
60 60 <%= button :back, _('Back to admin panel'), :controller => 'admin_panel', :action => 'index' %>
61 61 <% end %>
... ...
app/views/features/_manage_custom_fields.html.erb
... ... @@ -22,7 +22,7 @@
22 22 </fieldset>
23 23 </div>
24 24  
25   -<% button_bar do %>
  25 +<%= button_bar do %>
26 26 <%= button(:save, _('Save'), 'javascript: void()', :onClick => "submit_custom_field_form('##{format_values_id}', '##{form_id}');") %>
27 27 <% end %>
28 28  
... ...
app/views/features/_manage_enterprise_fields.html.erb
... ... @@ -55,7 +55,7 @@
55 55 </script>
56 56  
57 57 <div>
58   - <% button_bar do %>
  58 + <%= button_bar do %>
59 59 <%= submit_button('save', _('Save changes'), :id=>"save_enterprise_fields") %>
60 60 <%= button :back, _('Back to admin panel'), :controller => 'admin_panel', :action => 'index' %>
61 61 <% end %>
... ...
app/views/features/_manage_person_fields.html.erb
... ... @@ -55,7 +55,7 @@
55 55 </script>
56 56  
57 57 <div>
58   - <% button_bar do %>
  58 + <%= button_bar do %>
59 59 <%= submit_button('save', _('Save changes'), :id=>"save_person_fields") %>
60 60 <%= button :back, _('Back to admin panel'), :controller => 'admin_panel', :action => 'index' %>
61 61 <% end %>
... ...
app/views/features/custom_fields/_form.html.erb
... ... @@ -29,7 +29,7 @@
29 29 </tr>
30 30 </thead>
31 31 <tfoot>
32   - <tr><td colspan=3><%= button(:add, _('Add option'), 'javascript: void()', :id => "btn_opt_#{id}", :onclick => "add_content('##{id} .custom-field-extras', $('#btn_opt_#{id}').attr('value'), 'EXTRAS_ID');", :value => "#{render_extras_field(id)}") %></td></tr>
  32 + <tr><td colspan=3><%= button(:add, _('Add option'), 'javascript: void()', :id => "btn_opt_#{id}", :onclick => "add_content('##{id} .custom-field-extras', $('#btn_opt_#{id}').attr('value'), 'EXTRAS_ID');", :value => "#{render_extras_field(id)}".html_safe) %></td></tr>
33 33 </tfoot>
34 34 <tbody class="custom-field-extras">
35 35 <% if !field.extras.blank?%>
... ...
app/views/features/index.html.erb
... ... @@ -69,7 +69,7 @@ Check all the features you want to enable for your environment, uncheck all the
69 69 <hr/>
70 70  
71 71 <div>
72   - <% button_bar do %>
  72 + <%= button_bar do %>
73 73 <%= submit_button('save', _('Save changes')) %>
74 74 <%= button :back, _('Back to admin panel'), :controller => 'admin_panel', :action => 'index' %>
75 75 <% end %>
... ...
app/views/friends/connections.html.erb
1 1 <h1><%= _("Connections with %s") % @suggestion.suggestion.name %></h1>
2 2  
3   -<% button_bar do %>
  3 +<%= button_bar do %>
4 4 <%= button(:back, _('Go to friends list'), :controller => 'friends') %>
5 5 <% end %>
6 6  
... ...
app/views/friends/index.html.erb
... ... @@ -12,7 +12,7 @@
12 12 </p>
13 13 <% end %>
14 14  
15   - <% button_bar do %>
  15 + <%= button_bar do %>
16 16 <%= button(:back, _('Back to control panel'), :controller => 'profile_editor') %>
17 17 <%= button(:search, _('Find people'), :controller => 'search', :action => 'assets', :asset => 'people') %>
18 18 <% unless @plugins.dispatch(:remove_invite_friends_button).include?(true) %>
... ...
app/views/friends/suggest.html.erb
1 1 <h1><%= _("Friends suggestions for %s") % profile.name %></h1>
2 2  
3   -<% button_bar do %>
  3 +<%= button_bar do %>
4 4 <%= button(:back, _('Go to friends list'), :controller => 'friends') %>
5 5 <% end %>
6 6  
... ...
app/views/invite/_select_address_book.html.erb
... ... @@ -34,7 +34,7 @@
34 34 <%= labelled_form_field(_("Password") + ":", password_field_tag(:password)) %>
35 35 </div>
36 36  
37   - <% button_bar do %>
  37 + <%= button_bar do %>
38 38 <%= submit_button(:forward, _("Next")) %>
39 39 <% end %>
40 40 <p><%= _("We won't store your password or contact anyone without your permission.") %></p>
... ...
app/views/invite/invite_friends.html.erb
... ... @@ -24,7 +24,7 @@
24 24 { :hint_text => _('Type in the person\'s %{search_fields}') % {:search_fields => @search_fields},
25 25 :focus => false }) %>
26 26  
27   - <% button_bar do %>
  27 + <%= button_bar do %>
28 28 <%= submit_button('save', _('Invite'))%>
29 29 <%= button('cancel', _('Cancel'), profile.url)%>
30 30 <% end %>
... ...
app/views/invite/select_friends.html.erb
... ... @@ -32,7 +32,7 @@
32 32  
33 33 <%= render :partial => 'invite/personalize_invitation_mail', :locals => {:mail_template => @mail_template } %>
34 34  
35   - <% button_bar do %>
  35 + <%= button_bar do %>
36 36 <%= submit_button(:ok, _("Invite!")) %>
37 37 <% end %>
38 38 <% end %>
... ...
app/views/licenses/_form.html.erb
... ... @@ -5,7 +5,7 @@
5 5 <%= required labelled_form_field(_('Name'), f.text_field(:name)) %>
6 6 <%= labelled_form_field(_('License url'), f.text_field(:url)) %>
7 7  
8   - <% button_bar do %>
  8 + <%= button_bar do %>
9 9 <%= submit_button('save', _('Save'))%>
10 10 <%= button('cancel', _('Cancel'), {:action => 'index'})%>
11 11 <% end %>
... ...
app/views/licenses/index.html.erb
... ... @@ -16,7 +16,7 @@
16 16 <% end %>
17 17 </table>
18 18  
19   -<% button_bar do %>
  19 +<%= button_bar do %>
20 20 <%= button(:add, _('Add a new license'), :action => 'create')%>
21 21 <%= button :back, _('Back to admin panel'), :controller => 'admin_panel' %>
22 22 <% end %>
... ...
app/views/mailconf/index.html.erb
... ... @@ -6,7 +6,7 @@
6 6  
7 7 <p><%= _('You already request activation of your mailbox. Please wait until an administrator approves your request.') %></p>
8 8  
9   - <% button_bar do %>
  9 + <%= button_bar do %>
10 10 <%= button :back, _('Back to control panel'), :controller => 'profile_editor' %>
11 11 <% end %>
12 12  
... ... @@ -21,10 +21,10 @@
21 21 <h2><%= _('Configuration') %></h2>
22 22 <ul>
23 23 <li>
24   - <%= link_to _('Mail configuration for POP and IMAP'), 'http://www.ynternet.org/move/infos-technique-pour-utiliser-multypass-pop3-smtp-imap-ftp-quotas...' %>
  24 + <%= link_to _('Mail configuration for POP and IMAP'), 'http://www.ynternet.org/move/infos-technique-pour-utiliser-multypass-pop3-smtp-imap-ftp-quotas...' %>
25 25 </li>
26 26 </ul>
27   - <% button_bar do %>
  27 + <%= button_bar do %>
28 28 <%= button :back, _('Back to control panel'), :controller => 'profile_editor' %>
29 29 <% end %>
30 30  
... ... @@ -33,7 +33,7 @@
33 33 <h2><%= _("Enable e-Mail account below:") %></h2>
34 34 <ul><%= safe_join(profile.email_addresses.map{|i| content_tag('li', i)}, "\n") %></ul>
35 35 <blockquote><%= _("You'll be able to access a webmail from your user menu.") %></blockquote>
36   - <% button_bar do %>
  36 + <%= button_bar do %>
37 37 <%= button(:ok, _('Enable e-Mail'), { :action => 'enable' }, :method => 'post') %>
38 38 <%= button :back, _('Back to control panel'), :controller => 'profile_editor' %>
39 39 <% end %>
... ...
app/views/maps/edit_location.html.erb
... ... @@ -11,7 +11,7 @@
11 11 <%= labelled_form_field _('City'), f.text_field(:city) %>
12 12 <%= labelled_form_field _('ZIP code'), text_field(:profile_data, :zip_code) %>
13 13 <%= labelled_form_field _('Address (street and number)'), text_field(:profile_data, :address) %>
14   - <% button_bar do %>
  14 + <%= button_bar do %>
15 15 <%= button_to_function :search, _('Locate in the map'), "addressToPoint()", :title => _("Locate the address informed above in the map below (note that you'll probably need to adjust the marker to get a precise position)") %>
16 16 <%= submit_button 'save', _('Save') %>
17 17 <%= button(:back, _('Back to control panel'), :controller => 'profile_editor') %>
... ...
app/views/memberships/connections.html.erb
1 1 <h1><%= _("Connections with %s") % @suggestion.suggestion.name %></h1>
2 2  
3   -<% button_bar do %>
  3 +<%= button_bar do %>
4 4 <%= button(:back, _('Go to groups list'), :controller => 'memberships') %>
5 5 <% end %>
6 6  
... ...
app/views/memberships/index.html.erb
... ... @@ -2,7 +2,7 @@
2 2  
3 3 <h1><%= _('Manage my groups') %></h1>
4 4  
5   -<% button_bar do %>
  5 +<%= button_bar do %>
6 6 <%= button(:add, _('Create a new community'), :controller => 'memberships', :action => 'new_community') %>
7 7 <%= button :add, _('Register a new enterprise'), :controller => 'enterprise_registration' if environment.enabled?('enterprise_registration') %>
8 8 <%= button :back, _('Go back'), :controller => 'profile_editor' %>
... ...
app/views/memberships/new_community.html.erb
... ... @@ -48,7 +48,7 @@
48 48  
49 49 <%= hidden_field_tag('back_to', @back_to) %>
50 50  
51   - <% button_bar do %>
  51 + <%= button_bar do %>
52 52 <%= submit_button(:save, _('Create')) %>
53 53 <%= button(:cancel, _('Cancel'), @back_to ) %>
54 54 <% end %>
... ...
app/views/memberships/suggest.html.erb
1 1 <h1><%= _("Communities suggestions for %s") % profile.name %></h1>
2 2  
3   -<% button_bar do %>
  3 +<%= button_bar do %>
4 4 <%= button(:back, _('Go to groups list'), :controller => 'memberships') %>
5 5 <% end %>
6 6  
... ...
app/views/memberships/welcome.html.erb
... ... @@ -4,6 +4,6 @@
4 4  
5 5 <%= render :partial => 'shared/template_welcome_page', :locals => {:template => @community.template, :header => _("What can I do with a %s?")} %>
6 6  
7   -<% button_bar do %>
  7 +<%= button_bar do %>
8 8 <%= button :back, _('Back'), @back_to %>
9 9 <% end %>
... ...
app/views/organizations/index.html.erb
... ... @@ -22,7 +22,7 @@
22 22  
23 23 <%= render :partial => 'results' %>
24 24  
25   - <% button_bar do %>
  25 + <%= button_bar do %>
26 26 <%= button :back, _('Back'), :controller => 'admin_panel' %>
27 27 <% end %>
28 28 <% end %>
... ...
app/views/plugins/index.html.erb
... ... @@ -26,7 +26,7 @@
26 26 </table>
27 27  
28 28 <div>
29   - <% button_bar do %>
  29 + <%= button_bar do %>
30 30 <%= submit_button('save', _('Save changes')) %>
31 31 <%= button :back, _('Back to admin panel'), :controller => 'admin_panel', :action => 'index' %>
32 32 <% end %>
... ...
app/views/profile/_comment.html.erb
... ... @@ -45,7 +45,7 @@
45 45 </div>
46 46  
47 47 <% if logged_in? && (user == profile || user == comment.author || user.has_permission?(:moderate_comments, profile)) %>
48   - <% button_bar(:style => 'float: right; margin-top: 0px;') do %>
  48 + <%= button_bar(:style => 'float: right; margin-top: 0px;') do %>
49 49 <%= link_to_function(_('Remove'), 'remove_item_wall(this, \'%s\', \'%s\', \'%s\'); return false ;' % [".article-comment", url_for(:profile => params[:profile], :action => :remove_comment, :comment_id => comment.id, :view => params[:view]), _('Are you sure you want to remove this comment and all its replies?')], :class => 'button icon-button icon-delete') %>
50 50 <% end %>
51 51 <% end %>
... ...
app/views/profile/_private_profile.html.erb
... ... @@ -5,7 +5,7 @@
5 5 <div class='private-profile-message'><%= @message %></div>
6 6 <div class='private-profile-description'><%= profile.description %></div>
7 7  
8   -<% button_bar do %>
  8 +<%= button_bar do %>
9 9 <% if @action == :join && logged_in? %>
10 10 <%= join_community_button({:logged => true}) %>
11 11 <% end %>
... ...
app/views/profile/_upload_image.html.erb
... ... @@ -3,7 +3,7 @@
3 3 <%= link_to(profile_image(activity.user, :minor), activity.user.url) %>
4 4 </div>
5 5 <div class='profile-activity-description'>
6   - <p class='profile-activity-text'><%= link_to activity.user.name, activity.user.url %> <%= describe activity %></p>
  6 + <p class='profile-activity-text'><%= link_to activity.user.name, activity.user.url %> <%= describe(activity).html_safe %></p>
7 7 <p class='profile-activity-time'><%= time_ago_in_words(activity.created_at) %></p>
8 8 <div class='profile-wall-actions'>
9 9 <%= link_to_function(_('Remove'), 'remove_item_wall(this, \'%s\', \'%s\', \'%s\'); return false ;' % [".profile-activity-item", url_for(:profile => params[:profile], :action => :remove_activity, :activity_id => activity.id, :view => params[:view]), _('Are you sure you want to remove this activity and all its replies?')]) if logged_in? && current_person == @profile %>
... ...
app/views/profile/communities.html.erb
... ... @@ -14,7 +14,7 @@
14 14 </div>
15 15 <% end %>
16 16  
17   -<% button_bar do %>
  17 +<%= button_bar do %>
18 18 <%= button :back, _('Go back'), { :controller => 'profile' } %>
19 19 <%= button :add, _('Create a new community'),
20 20 :controller => 'memberships', :action => 'new_community' if logged_in? && user == profile %>
... ...
app/views/profile/enterprises.html.erb
... ... @@ -8,7 +8,7 @@
8 8 <% end %>
9 9 </ul>
10 10  
11   -<% button_bar do %>
  11 +<%= button_bar do %>
12 12 <%= button :back, _('Go back'), { :controller => 'profile' } %>
13 13 <%= button :add, _('Register a new enterprise'), :controller => 'enterprise_registration' if logged_in? && environment.enabled?('enterprise_registration') %>
14 14 <% end %>
... ...
app/views/profile/fans.html.erb
... ... @@ -8,7 +8,7 @@
8 8 <% end %>
9 9 </ul>
10 10  
11   -<% button_bar do %>
  11 +<%= button_bar do %>
12 12 <%= button :back, _('Go back'), { :controller => 'profile' }%>
13 13 <% end %>
14 14  
... ...
app/views/profile/favorite_enterprises.html.erb
... ... @@ -8,7 +8,7 @@
8 8 <% end %>
9 9 </ul>
10 10  
11   -<% button_bar do %>
  11 +<%= button_bar do %>
12 12 <%= button :back, _('Go back'), { :controller => 'profile' }%>
13 13 <% end %>
14 14  
... ...
app/views/profile/friends.html.erb
... ... @@ -14,7 +14,7 @@
14 14 </div>
15 15 <% end %>
16 16  
17   -<% button_bar do %>
  17 +<%= button_bar do %>
18 18 <%= button :back, _('Go back'), { :controller => 'profile' } %>
19 19 <% if user == profile %>
20 20 <%= button :edit, _('Manage my friends'), :controller => 'friends', :action => 'index', :profile => profile.identifier %>
... ...
app/views/profile/members.html.erb
... ... @@ -36,7 +36,7 @@
36 36 </div><!-- end of class="profile-members-tabs-container" -->
37 37 <% end %>
38 38  
39   -<% button_bar do %>
  39 +<%= button_bar do %>
40 40 <%= button :back, _('Go back'), { :controller => 'profile' } %>
41 41 <% if profile.community? and user %>
42 42 <% if user.has_permission?(:invite_members, profile) %>
... ...
app/views/profile_editor/destroy_profile.html.erb
... ... @@ -3,7 +3,7 @@
3 3 <p><%= _('Are you sure you want to delete this profile?') %></p>
4 4 <p><%= _('You must be aware that all content of this profile (articles, events, files and pictures) will also be deleted.') %></p>
5 5  
6   -<% button_bar do %>
  6 +<%= button_bar do %>
7 7 <%= button(:remove, _('Yes, I am sure'), {:action => 'destroy_profile'}, :method => :post) %>
8 8 <%= button(:cancel, _('No, I gave up'), profile.url) %>
9 9 <% end %>
... ...
app/views/profile_editor/edit.html.erb
... ... @@ -67,13 +67,13 @@
67 67  
68 68 <%= select_categories(:profile_data, _('Select the categories of your interest'), 2) %>
69 69  
70   - <% button_bar do %>
  70 + <%= button_bar do %>
71 71 <%= submit_button('save', _('Save'), :cancel => {:action => 'index'}) %>
72 72 <%= button(:back, _('Back to control panel'), :controller => 'profile_editor') %>
73 73 <% end %>
74 74  
75 75 <% if user && user.has_permission?('destroy_profile', profile) %>
76   - <% button_bar(:id => 'delete-profile') do %>
  76 + <%= button_bar(:id => 'delete-profile') do %>
77 77  
78 78 <% if !environment.enabled?('forbid_destroy_profile') || user.is_admin?(environment) %>
79 79 <%= button(:remove, _('Delete profile'), {:action => :destroy_profile}) %>
... ...
app/views/profile_editor/header_footer.html.erb
... ... @@ -24,7 +24,7 @@
24 24 <%= text_area_tag(:custom_header, @header, :style => 'width: 100%; height: 150px;', :class => 'mceEditor') %>
25 25 <h2><%= _('Content for footer') %></h2>
26 26 <%= text_area_tag(:custom_footer, @footer, :style => 'width: 100%; height: 150px;', :class => 'mceEditor') %>
27   - <% button_bar do %>
  27 + <%= button_bar do %>
28 28 <%= submit_button(:save, _('Save')) %>
29 29 <%= button(:cancel, _('Cancel'), :action => 'index') %>
30 30 <% end %>
... ...
app/views/profile_editor/welcome_page.html.erb
... ... @@ -13,7 +13,7 @@
13 13 <%= _('This page will be displayed to the user after his signup with this template.') %>
14 14 </div>
15 15  
16   - <% button_bar do%>
  16 + <%= button_bar do%>
17 17 <%= submit_button('save', _('Save'), :cancel => @back_to) %>
18 18 <% end %>
19 19 <% end %>
... ...
app/views/profile_members/_index_buttons.html.erb
1   -<% button_bar do %>
  1 +<%= button_bar do %>
2 2 <%= button :back, _('Back'), :controller => 'profile_editor' %>
3 3 <%= button :add, _('Add members'), :action => 'add_members' if profile.enterprise? %>
4 4 <% if profile.community? and user.has_permission?(:invite_members, profile) %>
... ...
app/views/profile_members/_manage_roles.html.erb
... ... @@ -5,7 +5,7 @@
5 5 <%= hidden_field_tag(:last_admin, true) if from == 'last_admin'%>
6 6 <% end %>
7 7  
8   - <% button_bar(:style => 'margin-top: 30px;') do %>
  8 + <%= button_bar(:style => 'margin-top: 30px;') do %>
9 9 <%= submit_button('save', _('Save'))%>
10 10 <%= button('cancel', _('Cancel'), {:controller => 'profile_editor'})%>
11 11 <% end %>
... ...
app/views/profile_members/affiliate.html.erb
... ... @@ -3,7 +3,7 @@
3 3 <%= form_tag( {:action => 'give_role'}, {:method => :post}) do %>
4 4 <%= select_tag 'role', options_for_select(@roles.map{|r|[r.name,r.id]}) %>
5 5 <%= hidden_field_tag 'person', current_user.person.id %>
6   - <% button_bar do %>
  6 + <%= button_bar do %>
7 7 <%= submit_button('affiliate', _('Affiliate'), :cancel => {:action => 'index'}) %>
8 8 <% end %>
9 9 <% end %>
... ...
app/views/profile_members/change_role.html.erb
... ... @@ -24,7 +24,7 @@
24 24 <% end %>
25 25 <%= hidden_field_tag 'person', @member.id %>
26 26  
27   - <% button_bar do %>
  27 + <%= button_bar do %>
28 28 <%= submit_button('save', _('Save changes'), :cancel => {:action => 'index'}) %>
29 29 <% end %>
30 30 <% end %>
... ...
app/views/profile_roles/_form.html.erb
... ... @@ -16,7 +16,7 @@
16 16 </div>
17 17 <% end %>
18 18  
19   - <% button_bar do %>
  19 + <%= button_bar do %>
20 20 <%= submit_button('save', (mode == :edit) ? _('Save changes') : _('Create role'), :cancel => {:action => 'index'} ) %>
21 21 <% end %>
22 22 <% end %>
... ...
app/views/profile_roles/assign.html.erb
... ... @@ -17,7 +17,7 @@
17 17 <%=token_input_field_tag(:person_id, 'search-profile-members', {:action => 'assign_role_by_members'},
18 18 {:focus => false, :hint_text => _('Select members to assign the role')}) %>
19 19  
20   - <% button_bar do %>
  20 + <%= button_bar do %>
21 21 <%= submit_button(:forward, _("Confirm")) %>
22 22 <% end %>
23 23 </div>
... ... @@ -28,7 +28,7 @@
28 28 <% @roles_list.each do |role| %>
29 29 <%= labelled_radio_button role.name , :selected_role, role.id , false, :class => "selected_role" %> <br>
30 30 <% end %>
31   - <% button_bar do %>
  31 + <%= button_bar do %>
32 32 <%= submit_button('save',_('Confirm'), :cancel => {:action => 'index'} ) %>
33 33 <% end %>
34 34 </div>
... ...
app/views/profile_roles/destroy.html.erb
... ... @@ -4,7 +4,7 @@
4 4 <p><%= _('This role is not being currently used.')%></p>
5 5 <p><%= _('Are you sure you want to delete this role?') %></p>
6 6  
7   - <% button_bar do %>
  7 + <%= button_bar do %>
8 8 <%= button(:remove, _('Yes, I am sure'), {:action => 'remove', :id => @role.id}, :method => :post) %>
9 9 <%= button(:cancel, _('No, I gave up'), {:action => 'index'}) %>
10 10 <% end %>
... ... @@ -16,7 +16,7 @@
16 16 <%= check_box_tag("roles[]", role.id, false ,{:id => role.key}) %>
17 17 <%= content_tag(:label, role.name, { :for => role.key }) %><br/>
18 18 <% end %>
19   - <% button_bar do %>
  19 + <%= button_bar do %>
20 20 <%= submit_button('save',_('Delete role'), :cancel => {:action => 'index'} ) %>
21 21 <% end %>
22 22 <% end %>
... ...
app/views/profile_roles/index.html.erb
... ... @@ -21,7 +21,7 @@
21 21 <% end %>
22 22 </table>
23 23  
24   -<% button_bar do %>
  24 +<%= button_bar do %>
25 25 <%= button :add, _('Create a new role'), :action => 'new' %>
26 26 <%= button :back, _('Back to control panel'), :controller => 'profile_editor' %>
27 27 <% end %>
... ...
app/views/profile_roles/show.html.erb
... ... @@ -3,11 +3,11 @@
3 3 <h3> <%= _('Permissions') %> </h3>
4 4 <ul>
5 5 <% @role.permissions.each do |p| %>
6   - <li> <%= permission_name(p) %> </li>
  6 + <li> <%= permission_name(p) %> </li>
7 7 <% end %>
8 8 </ul>
9 9  
10   -<% button_bar do %>
  10 +<%= button_bar do %>
11 11 <%= button :edit, _('Edit'), :action => 'edit', :id => @role %>
12 12 <%= button :back, _('Back to roles management'), :action => 'index' %>
13 13 <% end %>
... ...
app/views/profile_themes/add_css.html.erb
... ... @@ -3,7 +3,7 @@
3 3 <%= form_tag do %>
4 4 <%= labelled_form_field(_('File name'), text_field_tag('css')) %>
5 5  
6   - <% button_bar do %>
  6 + <%= button_bar do %>
7 7 <%= submit_button(:add, _('Add')) %>
8 8 <%= modal_close_button _('Cancel') %>
9 9 <% end %>
... ...
app/views/profile_themes/add_image.html.erb
1 1 <%= form_tag({:action => 'add_image', :id => @theme.id}, :multipart => true) do %>
2 2 <%= labelled_form_field(_('Choose the image file'), file_field_tag(:image)) %>
3   - <% button_bar do %>
  3 + <%= button_bar do %>
4 4 <%= submit_button(:add, _('Add image')) %>
5 5 <% end %>
6 6 <% end %>
... ...
app/views/profile_themes/css_editor.html.erb
... ... @@ -3,7 +3,7 @@
3 3 <%= form_tag({:action => 'update_css', :id => @theme.id }, :name => 'csscode_form') do %>
4 4 <%= hidden_field_tag('css', @css) %>
5 5 <%= text_area_tag('csscode', @code, :id => "codepressWindow", :class => 'codepress css') %>
6   - <% button_bar do %>
  6 + <%= button_bar do %>
7 7 <%= submit_button(:save, _('Save')) %>
8 8 <% end %>
9 9 <% end %>
... ...
app/views/profile_themes/edit.html.erb
... ... @@ -15,7 +15,7 @@
15 15 <li><%= link_to_remote(css, :url => { :action => 'css_editor', :id => @theme.id, :css => css }, :update => { :success => 'css-code' }) %></li>
16 16 <% end %>
17 17 </ul>
18   - <% button_bar do %>
  18 + <%= button_bar do %>
19 19 <%= modal_button :add, _('New CSS'), :action => 'add_css', :id => @theme.id %>
20 20 <% end %>
21 21 </div>
... ... @@ -27,7 +27,7 @@
27 27 <li><%= image_tag("/user_themes/#{@theme.id}/images/#{image}") %></li>
28 28 <% end %>
29 29 </ul>
30   - <% button_bar do %>
  30 + <%= button_bar do %>
31 31 <%= modal_button :add, _('Add image'), :action => 'add_image', :id => @theme.id %>
32 32 <% end %>
33 33 </div>
... ...
app/views/profile_themes/index.html.erb
... ... @@ -40,7 +40,7 @@
40 40  
41 41 <br style="clear:both" />
42 42  
43   -<% button_bar do %>
  43 +<%= button_bar do %>
44 44 <% if environment.enabled?('user_themes') %>
45 45 <%= modal_button :add, _('New theme ...'), :action => 'new' %>
46 46 <% end %>
... ...
app/views/profile_themes/new.html.erb
... ... @@ -4,7 +4,7 @@
4 4  
5 5 <%= labelled_form_field(_('Name of the new theme:'), text_field_tag(:name)) %>
6 6  
7   - <% button_bar do %>
  7 + <%= button_bar do %>
8 8 <%= submit_button(:save, _('Create')) %>
9 9 <% end %>
10 10 <% end %>
... ...
app/views/region_validators/_search.html.erb
... ... @@ -5,7 +5,7 @@
5 5 <%= item.name %>
6 6 <%= form_tag :action => 'add', :id => @region do %>
7 7 <%= hidden_field_tag :validator_id, item.id %>
8   - <% button_bar do %>
  8 + <%= button_bar do %>
9 9 <%= submit_button('add', _('Add')) %>
10 10 <% end %>
11 11 <% end %>
... ...
app/views/region_validators/region.html.erb
... ... @@ -19,7 +19,7 @@
19 19  
20 20 <%= form_tag({}, { :method => 'get' }) do %>
21 21 <%= text_field_tag :search, nil, :id => 'search_validator' %>
22   - <% button_bar do %>
  22 + <%= button_bar do %>
23 23 <%= submit_button('search', _('Search')) %>
24 24 <% end %>
25 25 <% end %>
... ...
app/views/role/_form.html.erb
... ... @@ -16,7 +16,7 @@
16 16 </div>
17 17 <% end %>
18 18  
19   - <% button_bar do %>
  19 + <%= button_bar do %>
20 20 <%= submit_button('save', (mode == :edit) ? _('Save changes') : _('Create role'), :cancel => {:action => 'index'} ) %>
21 21 <% end %>
22 22 <% end %>
... ...
app/views/role/index.html.erb
... ... @@ -17,7 +17,7 @@
17 17 <% end %>
18 18 </table>
19 19  
20   -<% button_bar do %>
  20 +<%= button_bar do %>
21 21 <%= button :add, _('Create a new role'), :action => 'new' %>
22 22 <%= button :back, _('Back to admin panel'), :controller => 'admin_panel' %>
23 23 <% end %>
... ...
app/views/role/show.html.erb
... ... @@ -3,11 +3,11 @@
3 3 <h3> <%= _('Permissions') %> </h3>
4 4 <ul>
5 5 <% @role.permissions.each do |p| %>
6   - <li> <%= permission_name(p) %> </li>
  6 + <li> <%= permission_name(p) %> </li>
7 7 <% end %>
8 8 </ul>
9 9  
10   -<% button_bar do %>
  10 +<%= button_bar do %>
11 11 <%= button :edit, _('Edit'), :action => 'edit', :id => @role %>
12 12 <%= button :back, _('Back to roles management'), :action => 'index' %>
13 13 <% end %>
... ...
app/views/search/search_page.html.erb
1   -<%= render :partial => 'search_form', :locals => { :hint => _("Type words about the %s you're looking for") % @asset.to_s.singularize } %>
  1 +<%= render :partial => 'search_form', :locals => { :hint => _("Type words about the %s you're looking for") % _(@asset.to_s.singularize) } %>
2 2 <%= render :partial => 'search_content' %>
3 3  
4 4 <div style="clear: both"></div>
... ...
app/views/search/tag.html.erb
... ... @@ -2,7 +2,7 @@
2 2 <%= _('Tagged with "%s"').html_safe % content_tag('code', @tag) %>
3 3 </h2>
4 4  
5   -<% button_bar do %>
  5 +<%= button_bar do %>
6 6 <%= button('back', _('Back to tag cloud'), :action => 'tags') %>
7 7 <% end %>
8 8  
... ...
app/views/shared/_list_groups.html.erb
... ... @@ -11,7 +11,7 @@
11 11 <%= raw _('Description: %s') % group.description + '<br/>' if group.community? %>
12 12 <%= _('Members: %s') % group.members_count.to_s %> <br/>
13 13 <%= _('Created at: %s') % show_date(group.created_at) unless group.enterprise? %> <br/>
14   - <% button_bar do %>
  14 + <%= button_bar do %>
15 15 <% if user.has_permission?(:edit_profile, group) %>
16 16 <%= button 'menu-ctrl-panel', _('Control panel of this group'), group.admin_url %>
17 17 <% end %>
... ...
app/views/shared/access_denied.html.erb
... ... @@ -9,7 +9,7 @@
9 9 <p><%= _("If you are supposed to have access to this area, you'll probably want to talk to the people responsible and ask them to give you access.") %></p>
10 10 <% end %>
11 11  
12   - <% button_bar do %>
  12 + <%= button_bar do %>
13 13 <%= button :back, _('Go back'), :back %>
14 14 <%= button :home, _('Go to the site home page'), :controller => 'home' %>
15 15 <% end %>
... ...
app/views/shared/not_found.html.erb
... ... @@ -4,7 +4,7 @@
4 4 <%= _('You may have clicked an expired link or mistyped the address.') %>
5 5 <%= _('If you clicked a link that was in another site, or was given to you by someone else, it would be nice if you tell them that their link is not valid anymore.') %>
6 6 </p>
7   - <% button_bar do %>
  7 + <%= button_bar do %>
8 8 <%= button :back, _('Go back'), :back %>
9 9 <%= button :home, _('Go to the home page'), '/' %>
10 10 <% end %>
... ...
app/views/shared/theme_test_panel.html.erb
... ... @@ -5,7 +5,7 @@
5 5  
6 6 <p><small><em><%= _('You can move this window away to have a better visualization of specific parts of screen.') %></em></small></p>
7 7  
8   - <% button_bar do %>
  8 + <%= button_bar do %>
9 9 <%= button(:ok, _('Finished testing'), :controller => 'profile_themes', :profile => theme_owner, :action => 'stop_test', :id => current_theme) %>
10 10 <%= button(:edit, _('Edit theme'), :controller => 'profile_themes', :profile => theme_owner, :action => 'edit', :id => current_theme) %>
11 11 <% end %>
... ...
app/views/spam/_task.html.erb
... ... @@ -7,7 +7,7 @@
7 7  
8 8 <%= yield %> <%# ??? %>
9 9  
10   - <% button_bar do %>
  10 + <%= button_bar do %>
11 11 <%= button_to_function('new', _('Mark as NOT SPAM'), 'removeTaskBox(this, %s, "%s", "")' % [url_for(:mark_task_as_ham => task.id).to_json, "task-#{task.id}"]) %>
12 12 <%= yield :extra_buttons %>
13 13 <%= button_to_function('delete', _('Remove'), 'removeTaskBox(this, %s, "%s", %s)' % [url_for(:profile => params[:profile], :remove_task => task.id).to_json, "task-#{task.id}", _('Are you sure you want to remove this article suggestion?').to_json]) %>
... ...
app/views/spam/index.html.erb
... ... @@ -6,7 +6,7 @@
6 6  
7 7 <%= _('There are no spams to review.') if no_tabs %>
8 8  
9   -<% button_bar do %>
  9 +<%= button_bar do %>
10 10 <%= button :back, _('Back to control panel'), :controller => :profile_editor %>
11 11 <% end %>
12 12  
... ... @@ -20,7 +20,7 @@
20 20 <%= render_tabs(tabs) %>
21 21  
22 22 <% unless no_tabs %>
23   - <% button_bar do %>
  23 + <%= button_bar do %>
24 24 <%= button :back, _('Back to control panel'), :controller => :profile_editor %>
25 25 <% end %>
26 26 <% end %>
... ...
app/views/tasks/index.html.erb
... ... @@ -41,7 +41,7 @@
41 41 </p>
42 42 <% else %>
43 43 <%= form_tag tasks_url(:action => 'close') do%>
44   - <% button_bar(:class => 'task-actions') do %>
  44 + <%= button_bar(:class => 'task-actions') do %>
45 45 <%# FiXME button(:edit, _('View my requests'), :action => 'list_requested') %>
46 46 <%# FIXME button('menu-mail', _('Send request'), :action => 'new') %>
47 47 <%= submit_button :save, _("Apply!") %>
... ... @@ -71,7 +71,7 @@
71 71  
72 72 <%= pagination_links(@tasks)%>
73 73  
74   - <% button_bar(:class => 'task-actions') do %>
  74 + <%= button_bar(:class => 'task-actions') do %>
75 75 <%# FiXME button(:edit, _('View my requests'), :action => 'list_requested') %>
76 76 <%# FIXME button('menu-mail', _('Send request'), :action => 'new') %>
77 77 <%= submit_button :save, _("Apply!") %>
... ...
app/views/tasks/list_requested.html.erb
... ... @@ -13,6 +13,6 @@
13 13 <% end %>
14 14 </ul>
15 15  
16   -<% button_bar do %>
  16 +<%= button_bar do %>
17 17 <%= button :back, _('Back'), :action => 'index' %>
18 18 <% end %>
... ...
app/views/tasks/new.html.erb
... ... @@ -11,7 +11,7 @@
11 11 <%= f.text_field :title, :style => 'width:80%;' %>
12 12 <%= f.text_area :message, :style => 'height:200px; width:80%;' %>
13 13  
14   - <% button_bar do %>
  14 + <%= button_bar do %>
15 15 <%= submit_button(:ok, _('Send'), :cancel => {:action => 'index'}) %>
16 16 <% end %>
17 17 <% end %>
... ...
app/views/tasks/processed.html.erb
... ... @@ -48,7 +48,7 @@
48 48 <% end %>
49 49 </p>
50 50  
51   -<% button_bar do %>
  51 +<%= button_bar do %>
52 52 <%= button(:back, _('Back'), :action => 'index') %>
53 53 <% end %>
54 54  
... ...
app/views/tasks/ticket_details.html.erb
... ... @@ -14,6 +14,6 @@
14 14 <p><%= _('Closing statement: %s') % @ticket.closing_statment %></p>
15 15 <% end %>
16 16  
17   -<% button_bar do %>
  17 +<%= button_bar do %>
18 18 <%= button :back, _('Back'), :action => 'index' %>
19 19 <% end %>
... ...
app/views/templates/_create_template_form.html.erb
... ... @@ -11,7 +11,7 @@
11 11 <%= form_tag do %>
12 12 <%= labelled_text_field(_('Name')+': ', :name)%>
13 13  
14   - <% button_bar do %>
  14 + <%= button_bar do %>
15 15 <%= submit_button('save', _('Save'))%>
16 16 <%= button('cancel', _('Cancel'), {:action => 'index'})%>
17 17 <% end %>
... ...
app/views/templates/index.html.erb
... ... @@ -40,6 +40,6 @@
40 40 </div>
41 41 <% end %>
42 42  
43   -<% button_bar do %>
  43 +<%= button_bar do %>
44 44 <%= button :back, _('Back to admin panel'), :controller => 'admin_panel' %>
45 45 <% end %>
... ...
app/views/trusted_sites/edit.html.erb
... ... @@ -5,7 +5,7 @@
5 5 <%= text_field_tag :site, @site %>
6 6 <%= hidden_field_tag :orig_site, @site %>
7 7  
8   - <% button_bar do %>
  8 + <%= button_bar do %>
9 9 <%= submit_button('save', _('Save changes'), :cancel => {:action => 'index'} ) %>
10 10 <% end %>
11 11 <% end %>
... ...
app/views/trusted_sites/index.html.erb
... ... @@ -22,7 +22,7 @@
22 22 <% end %>
23 23 </table>
24 24  
25   -<% button_bar do %>
  25 +<%= button_bar do %>
26 26 <%= button :add, _('Add a trusted site'), :action => 'new' %>
27 27 <%= button :back, _('Back to admin panel'), :controller => 'admin_panel' %>
28 28 <% end %>
... ...
app/views/trusted_sites/new.html.erb
... ... @@ -4,7 +4,7 @@
4 4  
5 5 <%= text_field_tag :site, @site %>
6 6  
7   - <% button_bar do %>
  7 + <%= button_bar do %>
8 8 <%= submit_button('save', _('Add trusted site'), :cancel => {:action => 'index'} ) %>
9 9 <% end %>
10 10 <% end %>
... ...
app/views/users/_index_buttons.html.erb
1   -<% button_bar do %>
  1 +<%= button_bar do %>
2 2 <%= button :'text-plain', _('User list as [CSV]'), :action => 'download.csv' %>
3 3 <%= button :'text-html', _('User list as [XML]'), :action => 'download.xml' %>
4 4 <%= button :send, _('Send e-mail to users'), :action => 'send_mail' %>
... ...
config/application.rb
... ... @@ -40,7 +40,6 @@ module Noosfero
40 40 # Custom directories with classes and modules you want to be autoloadable.
41 41 config.autoload_paths << config.root.join('lib')
42 42 config.autoload_paths << config.root.join('app')
43   - config.autoload_paths << config.root.join('app/jobs')
44 43 config.autoload_paths << config.root.join('app/sweepers')
45 44 config.autoload_paths.concat Dir["#{config.root}/app/controllers/**/"]
46 45 config.autoload_paths << config.root.join('test', 'mocks', Rails.env)
... ...
features/edit_article.feature
... ... @@ -281,3 +281,16 @@ Feature: edit article
281 281 And I press "Save"
282 282 Then I should not see "Language must be choosen"
283 283 And I should be on /joaosilva/article-in-portuguese
  284 +
  285 + @selenium
  286 + Scenario: create an article with time
  287 + Given I am on joaosilva's control panel
  288 + And I follow "Manage Content"
  289 + And I follow "New content"
  290 + When I follow "Text article with visual editor"
  291 + And I fill in "Title" with "My time testing Article"
  292 + And I fill in "Publish date" with "1980-11-15 20:37"
  293 + And I press "Save"
  294 + And I go to /joaosilva/my-time-testing-article
  295 + Then I should see "November 15, 1980 20:37"
  296 +
... ...
lib/authenticated_system.rb
... ... @@ -1,160 +0,0 @@
1   -module AuthenticatedSystem
2   -
3   - protected
4   -
5   - def self.included base
6   - if base < ActionController::Base
7   - base.around_filter :user_set_current
8   - base.before_filter :login_from_cookie
9   - end
10   -
11   - # Inclusion hook to make #current_user and #logged_in?
12   - # available as ActionView helper methods.
13   - base.helper_method :current_user, :logged_in?
14   - end
15   -
16   - # Returns true or false if the user is logged in.
17   - # Preloads @current_user with the user model if they're logged in.
18   - def logged_in?
19   - current_user != nil
20   - end
21   -
22   - # Accesses the current user from the session.
23   - def current_user
24   - @current_user ||= begin
25   - id = session[:user]
26   - user = User.where(id: id).first if id
27   - user.session = session if user
28   - User.current = user
29   - user
30   - end
31   - end
32   -
33   - # Store the given user in the session.
34   - def current_user=(new_user)
35   - if new_user.nil?
36   - session.delete(:user)
37   - else
38   - session[:user] = new_user.id
39   - new_user.session = session
40   - new_user.register_login
41   - end
42   - @current_user = User.current = new_user
43   - end
44   -
45   - # See impl. from http://stackoverflow.com/a/2513456/670229
46   - def user_set_current
47   - User.current = current_user
48   - yield
49   - ensure
50   - # to address the thread variable leak issues in Puma/Thin webserver
51   - User.current = nil
52   - end
53   -
54   - # Check if the user is authorized.
55   - #
56   - # Override this method in your controllers if you want to restrict access
57   - # to only a few actions or if you want to check if the user
58   - # has the correct rights.
59   - #
60   - # Example:
61   - #
62   - # # only allow nonbobs
63   - # def authorize?
64   - # current_user.login != "bob"
65   - # end
66   - def authorized?
67   - true
68   - end
69   -
70   - # Filter method to enforce a login requirement.
71   - #
72   - # To require logins for all actions, use this in your controllers:
73   - #
74   - # before_filter :login_required
75   - #
76   - # To require logins for specific actions, use this in your controllers:
77   - #
78   - # before_filter :login_required, :only => [ :edit, :update ]
79   - #
80   - # To skip this in a subclassed controller:
81   - #
82   - # skip_before_filter :login_required
83   - #
84   - def login_required
85   - username, passwd = get_auth_data
86   - if username && passwd
87   - self.current_user ||= User.authenticate(username, passwd) || nil
88   - end
89   - if logged_in? && authorized?
90   - true
91   - else
92   - if params[:require_login_popup]
93   - render :json => { :require_login_popup => true }
94   - else
95   - access_denied
96   - end
97   - end
98   - end
99   -
100   - # Redirect as appropriate when an access request fails.
101   - #
102   - # The default action is to redirect to the login screen.
103   - #
104   - # Override this method in your controllers if you want to have special
105   - # behavior in case the user is not authorized
106   - # to access the requested action. For example, a popup window might
107   - # simply close itself.
108   - def access_denied
109   - respond_to do |accepts|
110   - accepts.html do
111   - if request.xhr?
112   - render :text => _('Access denied'), :status => 401
113   - else
114   - store_location
115   - redirect_to :controller => '/account', :action => 'login'
116   - end
117   - end
118   - accepts.xml do
119   - headers["Status"] = "Unauthorized"
120   - headers["WWW-Authenticate"] = %(Basic realm="Web Password")
121   - render :text => "Could't authenticate you", :status => '401 Unauthorized'
122   - end
123   - end
124   - false
125   - end
126   -
127   - # Store the URI of the current request in the session.
128   - #
129   - # We can return to this location by calling #redirect_back_or_default.
130   - def store_location(location = request.url)
131   - session[:return_to] = location
132   - end
133   -
134   - # Redirect to the URI stored by the most recent store_location call or
135   - # to the passed default.
136   - def redirect_back_or_default(default)
137   - if session[:return_to]
138   - redirect_to(session.delete(:return_to))
139   - else
140   - redirect_to(default)
141   - end
142   - end
143   -
144   - # When called with before_filter :login_from_cookie will check for an :auth_token
145   - # cookie and log the user back in if apropriate
146   - def login_from_cookie
147   - return if cookies[:auth_token].blank? or logged_in?
148   - user = User.where(remember_token: cookies[:auth_token]).first
149   - self.current_user = user if user and user.remember_token?
150   - end
151   -
152   - private
153   - @@http_auth_headers = %w(X-HTTP_AUTHORIZATION HTTP_AUTHORIZATION Authorization)
154   - # gets BASIC auth info
155   - def get_auth_data
156   - auth_key = @@http_auth_headers.detect { |h| request.env.has_key?(h) }
157   - auth_data = request.env[auth_key].to_s.split unless auth_key.blank?
158   - return auth_data && auth_data[0] == 'Basic' ? Base64.decode64(auth_data[1]).split(':')[0..1] : [nil, nil]
159   - end
160   -end
lib/download_reported_images_job.rb
... ... @@ -1,27 +0,0 @@
1   -class DownloadReportedImagesJob < Struct.new(:abuse_report, :article)
2   - def perform
3   - images_paths = article.image? ? [File.join(article.profile.environment.top_url, article.public_filename(:display))] : article.body_images_paths
4   - images_paths.each do |image_path|
5   - image = get_image(image_path)
6   - reported_image = ReportedImage.create!( :abuse_report => abuse_report,
7   - :uploaded_data => image,
8   - :filename => File.basename(image_path),
9   - :size => image.size )
10   - abuse_report.content = parse_content(abuse_report, image_path, reported_image)
11   - end
12   - abuse_report.save!
13   - end
14   -
15   - def get_image(image_path)
16   - image = ActionController::UploadedTempfile.new('reported_image')
17   - image.write(Net::HTTP.get(URI.parse(image_path)))
18   - image.original_path = 'tmp/' + File.basename(image_path)
19   - image.content_type = 'image/' + File.extname(image_path).gsub('.','')
20   - image
21   - end
22   -
23   - def parse_content(report, old_path, image)
24   - old_path = old_path.gsub(report.reporter.environment.top_url, '')
25   - report.content.gsub(/#{old_path}/, image.public_filename)
26   - end
27   -end
lib/extensions/active_record/reflection.rb
1   -
2 1 # on STI classes tike Article and Profile, plugins' extensions
3 2 # on associations should be reflected on descendants
4 3 module ActiveRecord
5 4 module Reflection
6   -
7   - class << self
8   -
9   - def add_reflection_with_descendants(ar, name, reflection)
10   - self.add_reflection_without_descendants ar, name, reflection
11   - ar.descendants.each do |k|
12   - k._reflections.merge!(name.to_s => reflection)
13   - end if ar.base_class == ar
  5 + def self.add_reflection(ar, name, reflection)
  6 + (ar.descendants << ar).each do |klass|
  7 + klass.clear_reflections_cache
  8 + klass._reflections = klass._reflections.merge(name.to_s => reflection)
14 9 end
15   -
16   - alias_method_chain :add_reflection, :descendants
17   -
18 10 end
19 11 end
20 12 end
... ...
lib/get_email_contacts_job.rb
... ... @@ -1,11 +0,0 @@
1   -class GetEmailContactsJob < Struct.new(:import_from, :login, :password, :contact_list_id)
2   - def perform
3   - begin
4   - Invitation.get_contacts(import_from, login, password, contact_list_id)
5   - rescue Contacts::AuthenticationError => ex
6   - ContactList.exists?(contact_list_id) && ContactList.find(contact_list_id).register_auth_error
7   - rescue Exception => ex
8   - ContactList.exists?(contact_list_id) && ContactList.find(contact_list_id).register_error
9   - end
10   - end
11   -end
lib/invitation_job.rb
... ... @@ -1,10 +0,0 @@
1   -class InvitationJob < Struct.new(:person_id, :contacts_to_invite, :message, :profile_id, :contact_list_id, :locale)
2   - def perform
3   - Noosfero.with_locale(locale) do
4   - person = Person.find(person_id)
5   - profile = Profile.find(profile_id)
6   - Invitation.invite(person, contacts_to_invite, message, profile)
7   - ContactList.exists?(contact_list_id) && ContactList.find(contact_list_id).destroy
8   - end
9   - end
10   -end
lib/log_memory_consumption_job.rb
... ... @@ -1,22 +0,0 @@
1   -class LogMemoryConsumptionJob < Struct.new(:last_stat)
2   - # Number of entries do display
3   - N = 20
4   -
5   - def perform
6   - logpath = File.join(Rails.root, 'log', "#{ENV['RAILS_ENV']}_memory_consumption.log")
7   - logger = Logger.new(logpath)
8   - stats = Hash.new(0)
9   - ObjectSpace.each_object {|o| stats[o.class.to_s] += 1}
10   - i = 1
11   -
12   - logger << "[#{Time.now.strftime('%F %T %z')}]\n"
13   - stats.sort {|(k1,v1),(k2,v2)| v2 <=> v1}.each do |k,v|
14   - logger << (sprintf "%-60s %10d", k, v)
15   - logger << (sprintf " | delta %10d", (v - last_stat[k])) if last_stat && last_stat[k]
16   - logger << "\n"
17   - break if i > N
18   - i += 1
19   - end
20   - logger << "\n"
21   - end
22   -end
lib/mailing_job.rb
... ... @@ -1,8 +0,0 @@
1   -class MailingJob < Struct.new(:mailing_id)
2   - def perform
3   - mailing = Mailing.find(mailing_id)
4   - Noosfero.with_locale(mailing.locale) do
5   - mailing.deliver
6   - end
7   - end
8   -end
lib/notify_activity_to_profiles_job.rb
... ... @@ -1,44 +0,0 @@
1   -class NotifyActivityToProfilesJob < Struct.new(:tracked_action_id)
2   - NOTIFY_ONLY_COMMUNITY = [
3   - 'add_member_in_community'
4   - ]
5   -
6   - NOT_NOTIFY_COMMUNITY = [
7   - 'join_community'
8   - ]
9   - def perform
10   - return unless ActionTracker::Record.exists?(tracked_action_id)
11   - tracked_action = ActionTracker::Record.find(tracked_action_id)
12   - return unless tracked_action.user.present?
13   - target = tracked_action.target
14   - if target.is_a?(Community) && ( NOTIFY_ONLY_COMMUNITY.include?(tracked_action.verb) || ! target.public_profile )
15   - ActionTrackerNotification.create(:profile_id => target.id, :action_tracker_id => tracked_action.id)
16   - return
17   - end
18   -
19   - # Notify the user
20   - ActionTrackerNotification.create(:profile_id => tracked_action.user.id, :action_tracker_id => tracked_action.id)
21   -
22   - # Notify all friends
23   - ActionTrackerNotification.connection.execute("insert into action_tracker_notifications(profile_id, action_tracker_id) select f.friend_id, #{tracked_action.id} from friendships as f where person_id=#{tracked_action.user.id} and f.friend_id not in (select atn.profile_id from action_tracker_notifications as atn where atn.action_tracker_id = #{tracked_action.id})")
24   -
25   - if tracked_action.user.is_a? Organization
26   - ActionTrackerNotification.connection.execute "insert into action_tracker_notifications(profile_id, action_tracker_id) " +
27   - "select distinct accessor_id, #{tracked_action.id} from role_assignments where resource_id = #{tracked_action.user.id} and resource_type='Profile' " +
28   - if tracked_action.user.is_a? Enterprise then "union select distinct person_id, #{tracked_action.id} from favorite_enterprise_people where enterprise_id = #{tracked_action.user.id}" else "" end
29   - end
30   -
31   - if target.is_a?(Community)
32   - ActionTrackerNotification.create(:profile_id => target.id, :action_tracker_id => tracked_action.id) unless NOT_NOTIFY_COMMUNITY.include?(tracked_action.verb)
33   -
34   - ActionTrackerNotification.connection.execute("insert into action_tracker_notifications(profile_id, action_tracker_id) select distinct profiles.id, #{tracked_action.id} from role_assignments, profiles where profiles.type = 'Person' and profiles.id = role_assignments.accessor_id and profiles.id != #{tracked_action.user.id} and profiles.id not in (select atn.profile_id from action_tracker_notifications as atn where atn.action_tracker_id = #{tracked_action.id}) and role_assignments.resource_type = 'Profile' and role_assignments.resource_id = #{target.id}")
35   - end
36   -
37   - if target.is_a?(Article) && target.profile.is_a?(Community)
38   - ActionTrackerNotification.create(:profile_id => target.profile.id, :action_tracker_id => tracked_action.id) unless NOT_NOTIFY_COMMUNITY.include?(tracked_action.verb)
39   -
40   - ActionTrackerNotification.connection.execute("insert into action_tracker_notifications(profile_id, action_tracker_id) select distinct profiles.id, #{tracked_action.id} from role_assignments, profiles where profiles.type = 'Person' and profiles.id = role_assignments.accessor_id and profiles.id != #{tracked_action.user.id} and profiles.id not in (select atn.profile_id from action_tracker_notifications as atn where atn.action_tracker_id = #{tracked_action.id}) and role_assignments.resource_type = 'Profile' and role_assignments.resource_id = #{target.profile.id}")
41   - end
42   -
43   - end
44   -end
lib/profile_suggestions_job.rb
... ... @@ -1,22 +0,0 @@
1   -class ProfileSuggestionsJob < Struct.new(:person_id)
2   -
3   - def self.exists?(person_id)
4   - !find(person_id).empty?
5   - end
6   -
7   - def self.find(person_id)
8   - Delayed::Job.by_handler("--- !ruby/struct:ProfileSuggestionsJob\nperson_id: #{person_id}\n")
9   - end
10   -
11   - def perform
12   - logger = Delayed::Worker.logger
13   - begin
14   - person = Person.find(person_id)
15   - ProfileSuggestion.calculate_suggestions(person)
16   - UserMailer.profiles_suggestions_email(person).deliver if person.email_suggestions
17   - rescue Exception => exception
18   - logger.error("Error with suggestions for person ID %d: %s" % [person_id, exception.to_s])
19   - end
20   - end
21   -
22   -end
lib/user_activation_job.rb
... ... @@ -1,6 +0,0 @@
1   -class UserActivationJob < Struct.new(:user_id)
2   - def perform
3   - user = User.find(user_id)
4   - user.destroy unless user.activated? || user.person.is_template? || user.moderate_registration_pending?
5   - end
6   -end
plugins/admin_notifications/controllers/admin_notifications_plugin_myprofile_controller.rb
... ... @@ -10,7 +10,7 @@ class AdminNotificationsPluginMyprofileController &lt; MyProfileController
10 10 end
11 11  
12 12 def admin_required
13   - redirect_to :root unless target.is_admin?(current_person)
  13 + redirect_to :root unless (current_person.is_admin? || target.is_admin?(current_person))
14 14 end
15 15  
16 16 end
... ...
plugins/admin_notifications/po/admin_notifications.pot 0 → 100644
... ... @@ -0,0 +1,191 @@
  1 +# SOME DESCRIPTIVE TITLE.
  2 +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
  3 +# This file is distributed under the same license as the PACKAGE package.
  4 +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
  5 +#
  6 +#, fuzzy
  7 +msgid ""
  8 +msgstr ""
  9 +"Project-Id-Version: PACKAGE VERSION\n"
  10 +"Report-Msgid-Bugs-To: \n"
  11 +"POT-Creation-Date: 2016-05-17 15:38-0300\n"
  12 +"PO-Revision-Date: 2016-05-17 15:38-0300\n"
  13 +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
  14 +"Language-Team: LANGUAGE <LL@li.org>\n"
  15 +"Language: \n"
  16 +"MIME-Version: 1.0\n"
  17 +"Content-Type: text/plain; charset=UTF-8\n"
  18 +"Content-Transfer-Encoding: 8bit\n"
  19 +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
  20 +
  21 +#: ../lib/admin_notifications_plugin.rb:8
  22 +msgid "A plugin for notifications."
  23 +msgstr ""
  24 +
  25 +#: ../lib/admin_notifications_plugin.rb:29
  26 +msgid "Notification Manager"
  27 +msgstr ""
  28 +
  29 +#: ../lib/admin_notifications_plugin.rb:35
  30 +msgid "Manage Notifications"
  31 +msgstr ""
  32 +
  33 +#: ../lib/admin_notifications_plugin/notification_manager.rb:14
  34 +msgid "Notification successfully created"
  35 +msgstr ""
  36 +
  37 +#: ../lib/admin_notifications_plugin/notification_manager.rb:17
  38 +msgid "Notification couldn't be created"
  39 +msgstr ""
  40 +
  41 +#: ../lib/admin_notifications_plugin/notification_manager.rb:26
  42 +msgid "The notification was deleted."
  43 +msgstr ""
  44 +
  45 +#: ../lib/admin_notifications_plugin/notification_manager.rb:28
  46 +msgid "Could not remove the notification"
  47 +msgstr ""
  48 +
  49 +#: ../lib/admin_notifications_plugin/notification_manager.rb:38
  50 +msgid "The notification was edited."
  51 +msgstr ""
  52 +
  53 +#: ../lib/admin_notifications_plugin/notification_manager.rb:40
  54 +msgid "Could not edit the notification."
  55 +msgstr ""
  56 +
  57 +#: ../lib/admin_notifications_plugin/notification_manager.rb:52
  58 +msgid "The status of the notification was changed."
  59 +msgstr ""
  60 +
  61 +#: ../lib/admin_notifications_plugin/notification_manager.rb:54
  62 +msgid "Could not change the status of the notification."
  63 +msgstr ""
  64 +
  65 +#: ../views/shared/_form.html.erb:5
  66 +msgid "Back"
  67 +msgstr ""
  68 +
  69 +#: ../views/shared/_form.html.erb:11
  70 +msgid "Optional Title:"
  71 +msgstr ""
  72 +
  73 +#: ../views/shared/_form.html.erb:13
  74 +msgid "Enter your message here:"
  75 +msgstr ""
  76 +
  77 +#: ../views/shared/_form.html.erb:15
  78 +msgid ""
  79 +"Obs: You can use %{name} and %{email} variables to put the user's name and ema"
  80 +"il in the message."
  81 +msgstr ""
  82 +
  83 +#: ../views/shared/_form.html.erb:18
  84 +msgid "Notifications Status"
  85 +msgstr ""
  86 +
  87 +#: ../views/shared/_form.html.erb:18
  88 +msgid "Active"
  89 +msgstr ""
  90 +
  91 +#: ../views/shared/_form.html.erb:18
  92 +msgid "Inactive"
  93 +msgstr ""
  94 +
  95 +#: ../views/shared/_form.html.erb:20
  96 +msgid "Notifications Color/Type"
  97 +msgstr ""
  98 +
  99 +#: ../views/shared/_form.html.erb:20
  100 +msgid "Blue - Information"
  101 +msgstr ""
  102 +
  103 +#: ../views/shared/_form.html.erb:20
  104 +msgid "Yellow - Warning"
  105 +msgstr ""
  106 +
  107 +#: ../views/shared/_form.html.erb:20
  108 +msgid "Green - Success"
  109 +msgstr ""
  110 +
  111 +#: ../views/shared/_form.html.erb:20
  112 +msgid "Red - Danger"
  113 +msgstr ""
  114 +
  115 +#: ../views/shared/_form.html.erb:23
  116 +msgid "Display only in the profile homepage"
  117 +msgstr ""
  118 +
  119 +#: ../views/shared/_form.html.erb:23
  120 +msgid "Display only in the homepage"
  121 +msgstr ""
  122 +
  123 +#: ../views/shared/_form.html.erb:27
  124 +msgid "Display to not logged users too"
  125 +msgstr ""
  126 +
  127 +#: ../views/shared/_form.html.erb:31
  128 +msgid "Display popup until user close the notification"
  129 +msgstr ""
  130 +
  131 +#: ../views/shared/_form.html.erb:35
  132 +msgid "Save"
  133 +msgstr ""
  134 +
  135 +#: ../views/shared/_notifications_list.html.erb:3
  136 +#: ../views/shared/_notifications_list.html.erb:16
  137 +msgid "Notifications"
  138 +msgstr ""
  139 +
  140 +#: ../views/shared/_notifications_list.html.erb:7
  141 +msgid "New Notification"
  142 +msgstr ""
  143 +
  144 +#: ../views/shared/_notifications_list.html.erb:10
  145 +msgid "Back to control panel"
  146 +msgstr ""
  147 +
  148 +#: ../views/shared/_notifications_list.html.erb:19
  149 +msgid "Actions"
  150 +msgstr ""
  151 +
  152 +#: ../views/shared/_notifications_list.html.erb:30
  153 +msgid "Deactivate"
  154 +msgstr ""
  155 +
  156 +#: ../views/shared/_notifications_list.html.erb:30
  157 +#: ../views/shared/_notifications_list.html.erb:32
  158 +msgid "Do you want to change the status of this notification?"
  159 +msgstr ""
  160 +
  161 +#: ../views/shared/_notifications_list.html.erb:32
  162 +msgid "Activate"
  163 +msgstr ""
  164 +
  165 +#: ../views/shared/_notifications_list.html.erb:34
  166 +msgid "Edit"
  167 +msgstr ""
  168 +
  169 +#: ../views/shared/_notifications_list.html.erb:35
  170 +msgid "Delete"
  171 +msgstr ""
  172 +
  173 +#: ../views/shared/_notifications_list.html.erb:35
  174 +msgid "Do you want to delete this notification?"
  175 +msgstr ""
  176 +
  177 +#: ../views/shared/show_notification.html.erb:8
  178 +msgid "There are active notifications in this environment!"
  179 +msgstr ""
  180 +
  181 +#: ../views/shared/show_notification.html.erb:9
  182 +msgid "Manage all notifications here."
  183 +msgstr ""
  184 +
  185 +#: ../views/shared/show_notification.html.erb:28
  186 +msgid "Do not show anymore"
  187 +msgstr ""
  188 +
  189 +#: ../views/shared/show_notification.html.erb:29
  190 +msgid "Hide for now"
  191 +msgstr ""
... ...
plugins/admin_notifications/po/notification.pot
... ... @@ -1,187 +0,0 @@
1   -# SOME DESCRIPTIVE TITLE.
2   -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3   -# This file is distributed under the same license as the PACKAGE package.
4   -# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5   -#
6   -#, fuzzy
7   -msgid ""
8   -msgstr ""
9   -"Project-Id-Version: PACKAGE VERSION\n"
10   -"Report-Msgid-Bugs-To: \n"
11   -"POT-Creation-Date: 2016-03-31 15:02-0300\n"
12   -"PO-Revision-Date: 2016-03-31 15:02-0300\n"
13   -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14   -"Language-Team: LANGUAGE <LL@li.org>\n"
15   -"Language: \n"
16   -"MIME-Version: 1.0\n"
17   -"Content-Type: text/plain; charset=UTF-8\n"
18   -"Content-Transfer-Encoding: 8bit\n"
19   -"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
20   -
21   -#: ../lib/notification_plugin.rb:8
22   -msgid "A plugin for notifications."
23   -msgstr ""
24   -
25   -#: ../lib/notification_plugin.rb:29
26   -msgid "Notification Manager"
27   -msgstr ""
28   -
29   -#: ../lib/notification_plugin.rb:35
30   -msgid "Manage Notifications"
31   -msgstr ""
32   -
33   -#: ../lib/notification_plugin/notification_manager.rb:14
34   -msgid "Notification successfully created"
35   -msgstr ""
36   -
37   -#: ../lib/notification_plugin/notification_manager.rb:17
38   -msgid "Notification couldn't be created"
39   -msgstr ""
40   -
41   -#: ../lib/notification_plugin/notification_manager.rb:26
42   -msgid "The notification was deleted."
43   -msgstr ""
44   -
45   -#: ../lib/notification_plugin/notification_manager.rb:28
46   -msgid "Could not remove the notification"
47   -msgstr ""
48   -
49   -#: ../lib/notification_plugin/notification_manager.rb:38
50   -msgid "The notification was edited."
51   -msgstr ""
52   -
53   -#: ../lib/notification_plugin/notification_manager.rb:40
54   -msgid "Could not edit the notification."
55   -msgstr ""
56   -
57   -#: ../lib/notification_plugin/notification_manager.rb:52
58   -msgid "The status of the notification was changed."
59   -msgstr ""
60   -
61   -#: ../lib/notification_plugin/notification_manager.rb:54
62   -msgid "Could not change the status of the notification."
63   -msgstr ""
64   -
65   -#: ../views/shared/_form.html.erb:5
66   -msgid "Back"
67   -msgstr ""
68   -
69   -#: ../views/shared/_form.html.erb:11
70   -msgid "Optional Title:"
71   -msgstr ""
72   -
73   -#: ../views/shared/_form.html.erb:13
74   -msgid "Enter your message here:"
75   -msgstr ""
76   -
77   -#: ../views/shared/_form.html.erb:15
78   -msgid ""
79   -"Obs: You can use %{name} and %{email} variables to put the user's name and ema"
80   -"il in the message."
81   -msgstr ""
82   -
83   -#: ../views/shared/_form.html.erb:18
84   -msgid "Notifications Status"
85   -msgstr ""
86   -
87   -#: ../views/shared/_form.html.erb:18
88   -msgid "Active"
89   -msgstr ""
90   -
91   -#: ../views/shared/_form.html.erb:18
92   -msgid "Inactive"
93   -msgstr ""
94   -
95   -#: ../views/shared/_form.html.erb:20
96   -msgid "Notifications Color/Type"
97   -msgstr ""
98   -
99   -#: ../views/shared/_form.html.erb:20
100   -msgid "Blue - Information"
101   -msgstr ""
102   -
103   -#: ../views/shared/_form.html.erb:20
104   -msgid "Yellow - Warning"
105   -msgstr ""
106   -
107   -#: ../views/shared/_form.html.erb:20
108   -msgid "Green - Success"
109   -msgstr ""
110   -
111   -#: ../views/shared/_form.html.erb:20
112   -msgid "Red - Danger"
113   -msgstr ""
114   -
115   -#: ../views/shared/_form.html.erb:23
116   -msgid "Display only in the homepage"
117   -msgstr ""
118   -
119   -#: ../views/shared/_form.html.erb:27
120   -msgid "Display to not logged users too"
121   -msgstr ""
122   -
123   -#: ../views/shared/_form.html.erb:31
124   -msgid "Display popup until user close the notification"
125   -msgstr ""
126   -
127   -#: ../views/shared/_form.html.erb:35
128   -msgid "Save"
129   -msgstr ""
130   -
131   -#: ../views/shared/_notifications_list.html.erb:3
132   -#: ../views/shared/_notifications_list.html.erb:16
133   -msgid "Notifications"
134   -msgstr ""
135   -
136   -#: ../views/shared/_notifications_list.html.erb:7
137   -msgid "New Notification"
138   -msgstr ""
139   -
140   -#: ../views/shared/_notifications_list.html.erb:10
141   -msgid "Back to control panel"
142   -msgstr ""
143   -
144   -#: ../views/shared/_notifications_list.html.erb:19
145   -msgid "Actions"
146   -msgstr ""
147   -
148   -#: ../views/shared/_notifications_list.html.erb:30
149   -msgid "Deactivate"
150   -msgstr ""
151   -
152   -#: ../views/shared/_notifications_list.html.erb:30
153   -#: ../views/shared/_notifications_list.html.erb:32
154   -msgid "Do you want to change the status of this notification?"
155   -msgstr ""
156   -
157   -#: ../views/shared/_notifications_list.html.erb:32
158   -msgid "Activate"
159   -msgstr ""
160   -
161   -#: ../views/shared/_notifications_list.html.erb:34
162   -msgid "Edit"
163   -msgstr ""
164   -
165   -#: ../views/shared/_notifications_list.html.erb:35
166   -msgid "Delete"
167   -msgstr ""
168   -
169   -#: ../views/shared/_notifications_list.html.erb:35
170   -msgid "Do you want to delete this notification?"
171   -msgstr ""
172   -
173   -#: ../views/shared/show_notification.html.erb:8
174   -msgid "There are active notifications in this environment!"
175   -msgstr ""
176   -
177   -#: ../views/shared/show_notification.html.erb:9
178   -msgid "Manage all notifications here."
179   -msgstr ""
180   -
181   -#: ../views/shared/show_notification.html.erb:28
182   -msgid "Do not show anymore"
183   -msgstr ""
184   -
185   -#: ../views/shared/show_notification.html.erb:29
186   -msgid "Hide for now"
187   -msgstr ""
plugins/admin_notifications/po/pt/admin_notifications.po 0 → 100644
... ... @@ -0,0 +1,147 @@
  1 +# SOME DESCRIPTIVE TITLE.
  2 +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
  3 +# This file is distributed under the same license as the PACKAGE package.
  4 +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
  5 +#
  6 +msgid ""
  7 +msgstr ""
  8 +"Project-Id-Version: PACKAGE VERSION\n"
  9 +"Report-Msgid-Bugs-To: \n"
  10 +"PO-Revision-Date: 2016-05-16 14:48-0300\n"
  11 +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
  12 +"Language-Team: LANGUAGE <LL@li.org>\n"
  13 +"Language: \n"
  14 +"MIME-Version: 1.0\n"
  15 +"Content-Type: text/plain; charset=UTF-8\n"
  16 +"Content-Transfer-Encoding: 8bit\n"
  17 +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
  18 +
  19 +msgid "A plugin for notifications."
  20 +msgstr "Plugin para notificações."
  21 +
  22 +msgid "Notification Manager"
  23 +msgstr "Gerenciador de Notificações"
  24 +
  25 +msgid "Manage Notifications"
  26 +msgstr "Gerenciar Notificações"
  27 +
  28 +msgid "Notification successfully created"
  29 +msgstr "Notificação criada com sucesso"
  30 +
  31 +msgid "Notification couldn't be created"
  32 +msgstr "Não foi possível criar notificação"
  33 +
  34 +msgid "The notification was deleted."
  35 +msgstr "A notificação foi removida."
  36 +
  37 +msgid "Could not remove the notification"
  38 +msgstr "Não foi possível remover a notificação"
  39 +
  40 +msgid "The notification was edited."
  41 +msgstr "A notificação foi editada."
  42 +
  43 +msgid "Could not edit the notification."
  44 +msgstr "Não foi possível editar a notificação."
  45 +
  46 +msgid "The status of the notification was changed."
  47 +msgstr "O status da notificação foi modificado."
  48 +
  49 +msgid "Could not change the status of the notification."
  50 +msgstr "Não foi possível alterar o status da notificação."
  51 +
  52 +msgid "Back"
  53 +msgstr "Voltar"
  54 +
  55 +msgid "Optional Title:"
  56 +msgstr "Título Opcional:"
  57 +
  58 +msgid "Enter your message here:"
  59 +msgstr "Entre com sua mensagem aqui:"
  60 +
  61 +msgid ""
  62 +"Obs: You can use %{name} and %{email} variables to put the user's name and ema"
  63 +"il in the message."
  64 +msgstr ""
  65 +"Obs: Você pode usar as variáveis %{name} e %{email} para inserir o nome e emai"
  66 +"l do usuário logado na mensagem."
  67 +
  68 +msgid "Notifications Status"
  69 +msgstr "Status da Notificação"
  70 +
  71 +msgid "Active"
  72 +msgstr "Ativa"
  73 +
  74 +msgid "Inactive"
  75 +msgstr "Inativa"
  76 +
  77 +msgid "Notifications Color/Type"
  78 +msgstr "Cor/Tipo de Notificação"
  79 +
  80 +msgid "Blue - Information"
  81 +msgstr "Azul - Informação"
  82 +
  83 +msgid "Yellow - Warning"
  84 +msgstr "Amarelo - Atenção"
  85 +
  86 +msgid "Green - Success"
  87 +msgstr "Verde - Sucesso"
  88 +
  89 +msgid "Red - Danger"
  90 +msgstr "Vermelho - Perigo"
  91 +
  92 +msgid "Display only in the profile homepage"
  93 +msgstr "Apresentar apenas na página inicial do perfil"
  94 +
  95 +msgid "Display only in the homepage"
  96 +msgstr "Apresentar apenas na página inicial"
  97 +
  98 +msgid "Display to not logged users too"
  99 +msgstr "Apresentar também para usuários não logados"
  100 +
  101 +msgid "Display popup until user close the notification"
  102 +msgstr "Apresentar popup da notificação até que o usuário a feche"
  103 +
  104 +msgid "Save"
  105 +msgstr "Salvar"
  106 +
  107 +msgid "Notifications"
  108 +msgstr "Notificações"
  109 +
  110 +msgid "New Notification"
  111 +msgstr "Nova Notificação"
  112 +
  113 +msgid "Back to control panel"
  114 +msgstr "Voltar ao painel de controle"
  115 +
  116 +msgid "Actions"
  117 +msgstr "Ações"
  118 +
  119 +msgid "Deactivate"
  120 +msgstr "Desativar"
  121 +
  122 +msgid "Do you want to change the status of this notification?"
  123 +msgstr "Você quer alterar o status dessa notificação?"
  124 +
  125 +msgid "Activate"
  126 +msgstr "Ativar"
  127 +
  128 +msgid "Edit"
  129 +msgstr "Editar"
  130 +
  131 +msgid "Delete"
  132 +msgstr "Remover"
  133 +
  134 +msgid "Do you want to delete this notification?"
  135 +msgstr "Você quer remover essa notificação?"
  136 +
  137 +msgid "There are active notifications in this environment!"
  138 +msgstr "Existem notificações ativas neste ambiente!"
  139 +
  140 +msgid "Manage all notifications here."
  141 +msgstr "Gerencie todas as notificações aqui."
  142 +
  143 +msgid "Do not show anymore"
  144 +msgstr "Não mostrar mais"
  145 +
  146 +msgid "Hide for now"
  147 +msgstr "Ocultar momentaneamente"
... ...
plugins/admin_notifications/views/shared/_form.html.erb
... ... @@ -20,7 +20,7 @@
20 20 <%= labelled_form_field(_('Notifications Color/Type'), select(:notifications, :type, options_for_select_with_title({_("Blue - Information") => "AdminNotificationsPlugin::InformationNotification", _("Yellow - Warning") => "AdminNotificationsPlugin::WarningNotification", _("Green - Success") => "AdminNotificationsPlugin::SuccessNotification", _("Red - Danger") => "AdminNotificationsPlugin::DangerNotification"}, @notification.type))) %>
21 21  
22 22 <div>
23   - <%= labelled_check_box(_("Display only in the homepage"), 'notifications[display_only_in_homepage]', '1', @notification.display_only_in_homepage?) %>
  23 + <%= labelled_check_box(profile.present? ? _("Display only in the profile homepage") : _("Display only in the homepage") , 'notifications[display_only_in_homepage]', '1', @notification.display_only_in_homepage?) %>
24 24 </div>
25 25  
26 26 <div>
... ... @@ -31,7 +31,7 @@
31 31 <%= labelled_check_box(_("Display popup until user close the notification"), 'notifications[display_popup]', '1', @notification.display_popup?) %>
32 32 </div>
33 33  
34   - <% button_bar do %>
  34 + <%= button_bar do %>
35 35 <%= submit_button 'save', _('Save'), :cancel => { :action => 'index' } %>
36 36 <% end %>
37 37  
... ...
plugins/analytics/views/analytics_plugin/_body_ending.html.slim
1 1 javascript:
2   - analytics.timeOnPage.baseUrl = #{url_for(controller: 'analytics_plugin/time_on_page').to_json}
  2 + analytics.timeOnPage.baseUrl = #{url_for(profile: profile.identifier, controller: 'analytics_plugin/time_on_page').to_json}
3 3 analytics.timeOnPage.updateInterval = #{AnalyticsPlugin::TimeOnPageUpdateIntervalMs.to_json}
4 4 analytics.requestId = #{request.env['action_dispatch.request_id'].to_json}
5 5 analytics.init()
... ...
plugins/anti_spam/views/anti_spam_plugin_admin/index.html.erb
... ... @@ -6,7 +6,7 @@
6 6  
7 7 <%= labelled_form_field _('API key'), f.text_field(:api_key, :size => 40) %>
8 8  
9   - <% button_bar do %>
  9 + <%= button_bar do %>
10 10 <%= submit_button(:save, c_('Save'), :cancel => {:controller => 'plugins', :action => 'index'}) %>
11 11 <% end %>
12 12  
... ...
plugins/classify_members/views/classify_members_plugin_admin/index.html.erb
... ... @@ -15,7 +15,7 @@
15 15 <%=_('salvador-ba: Soteropolitano')%>
16 16 </fieldset>
17 17  
18   - <% button_bar do %>
  18 + <%= button_bar do %>
19 19 <%= submit_button(:save, _('Save'), :cancel => {:controller => 'plugins', :action => 'index'}) %>
20 20 <% end %>
21 21  
... ...
plugins/comment_classification/views/comment_classification_plugin_labels/_form.html.erb
... ... @@ -7,7 +7,7 @@
7 7 <%= labelled_form_field(_('Color'), f.select(:color, @colors.map{|s|[s.capitalize,s]})) %>
8 8 <%= labelled_form_field(f.check_box(:enabled) + _('Enable this label?'),'') %>
9 9  
10   - <% button_bar do %>
  10 + <%= button_bar do %>
11 11 <%= submit_button('save', c_('Save'), :cancel => {:action => 'index'} ) %>
12 12 <% end %>
13 13 <% end %>
... ...
plugins/comment_classification/views/comment_classification_plugin_labels/index.html.erb
... ... @@ -25,7 +25,7 @@
25 25 </table>
26 26 <% end %>
27 27  
28   - <% button_bar do %>
  28 + <%= button_bar do %>
29 29 <%= button(:add, _('Add a new label'), :action => 'create')%>
30 30 <%= button :back, c_('Back to admin panel'), :controller => 'admin_panel' %>
31 31 <% end %>
... ...
plugins/comment_classification/views/comment_classification_plugin_myprofile/_status_form.html.erb
... ... @@ -6,7 +6,7 @@
6 6 <%= labelled_form_field(_('Status'), f.select(:status_id, @statuses.map{|s|[s.name,s.id]})) %>
7 7 <%= labelled_form_field(_('Reason:'), f.text_area(:reason, :rows => 5)) %>
8 8  
9   - <% button_bar do %>
  9 + <%= button_bar do %>
10 10 <%= submit_button('save', c_('Save') ) %>
11 11 <% end %>
12 12 <% end %>
... ...
plugins/comment_classification/views/comment_classification_plugin_status/_form.html.erb
... ... @@ -7,7 +7,7 @@
7 7 <%= labelled_form_field(f.check_box(:enabled) + _('Enable this status?'),'') %>
8 8 <%#= labelled_form_field(f.check_box(:enable_reason) + _('This status allows reason?'),'') %>
9 9  
10   - <% button_bar do %>
  10 + <%= button_bar do %>
11 11 <%= submit_button('save', c_('Save'), :cancel => {:action => 'index'} ) %>
12 12 <% end %>
13 13 <% end %>
... ...
plugins/comment_classification/views/comment_classification_plugin_status/index.html.erb
... ... @@ -25,7 +25,7 @@
25 25 </table>
26 26 <% end %>
27 27  
28   - <% button_bar do %>
  28 + <%= button_bar do %>
29 29 <%= button(:add, _('Add a new status'), :action => 'create')%>
30 30 <%= button :back, c_('Back to admin panel'), :controller => 'admin_panel' %>
31 31 <% end %>
... ...
plugins/comment_paragraph/lib/comment_paragraph_plugin.rb
... ... @@ -59,6 +59,12 @@ class CommentParagraphPlugin &lt; Noosfero::Plugin
59 59 [CommentParagraphPlugin::API]
60 60 end
61 61  
  62 + def self.extra_blocks
  63 + {
  64 + CommentParagraphPlugin::DiscussionBlock => {:position => ['1','2','3'] }
  65 + }
  66 + end
  67 +
62 68 def content_types
63 69 [CommentParagraphPlugin::Discussion]
64 70 end
... ...
plugins/comment_paragraph/lib/comment_paragraph_plugin/discussion_block.rb 0 → 100644
... ... @@ -0,0 +1,59 @@
  1 +class CommentParagraphPlugin::DiscussionBlock < Block
  2 +
  3 + settings_items :presentation_mode, :type => String, :default => 'title_only'
  4 + settings_items :total_items, :type => Integer, :default => 5
  5 + settings_items :discussion_status, :type => Integer
  6 +
  7 + attr_accessible :presentation_mode, :total_items, :discussion_status
  8 +
  9 + VALID_CONTENT = ['CommentParagraphPlugin::Discussion']
  10 +
  11 + STATUS_NOT_OPENED = 0
  12 + STATUS_AVAILABLE = 1
  13 + STATUS_CLOSED = 2
  14 +
  15 + def self.description
  16 + c_('Discussion Articles')
  17 + end
  18 +
  19 + def help
  20 + _("This block displays all profile's article discussion")
  21 + end
  22 +
  23 + def discussions
  24 + current_time = Time.now
  25 + discussions = holder.articles.where(type: VALID_CONTENT).order('start_date ASC, end_date DESC, created_at DESC').limit(self.total_items)
  26 + case discussion_status
  27 + when STATUS_NOT_OPENED
  28 + discussions = discussions.where("start_date > ?", current_time)
  29 + when STATUS_AVAILABLE
  30 + discussions = discussions.where("start_date is null or start_date <= ?", current_time)
  31 + discussions = discussions.where("end_date is null or end_date >= ?", current_time)
  32 + when STATUS_CLOSED
  33 + discussions = discussions.where("end_date < ?", current_time)
  34 + end
  35 + discussions
  36 + end
  37 +
  38 + def holder
  39 + return nil if self.box.nil? || self.box.owner.nil?
  40 + if self.box.owner.kind_of?(Environment)
  41 + return nil if self.box.owner.portal_community.nil?
  42 + self.box.owner.portal_community
  43 + else
  44 + self.box.owner
  45 + end
  46 + end
  47 +
  48 + def mode?(attr)
  49 + attr == self.presentation_mode
  50 + end
  51 +
  52 + def api_content
  53 + Api::Entities::ArticleBase.represent(self.discussions).as_json
  54 + end
  55 +
  56 + def display_api_content_by_default?
  57 + false
  58 + end
  59 +end
... ...
plugins/comment_paragraph/test/unit/comment_paragraph_plugin_test.rb
... ... @@ -69,7 +69,7 @@ class CommentParagraphPluginTest &lt; ActiveSupport::TestCase
69 69 article = fast_create(Article, :profile_id => profile.id)
70 70 article.expects(:comment_paragraph_plugin_enabled?).returns(true)
71 71 article.expects(:allow_edit?).with(user).returns(true)
72   - article.expects(:comment_paragraph_plugin_activated?).returns(false)
  72 + article.expects(:comment_paragraph_plugin_activated?).at_least_once.returns(false)
73 73  
74 74 assert_equal 'Activate Comments', plugin.article_extra_toolbar_buttons(article)[:title]
75 75 end
... ... @@ -79,7 +79,7 @@ class CommentParagraphPluginTest &lt; ActiveSupport::TestCase
79 79 article = fast_create(Article, :profile_id => profile.id)
80 80 article.expects(:comment_paragraph_plugin_enabled?).returns(true)
81 81 article.expects(:allow_edit?).with(user).returns(true)
82   - article.expects(:comment_paragraph_plugin_activated?).returns(true)
  82 + article.expects(:comment_paragraph_plugin_activated?).at_least_once.returns(true)
83 83  
84 84 assert_equal 'Deactivate Comments', plugin.article_extra_toolbar_buttons(article)[:title]
85 85 end
... ...
plugins/comment_paragraph/test/unit/discussion_block_test.rb 0 → 100644
... ... @@ -0,0 +1,204 @@
  1 +require_relative '../test_helper'
  2 +class DiscussionBlockTest < ActiveSupport::TestCase
  3 +
  4 + def setup
  5 + @environment = Environment.default
  6 + @environment.enable_plugin(CommentParagraphPlugin)
  7 + end
  8 +
  9 + attr_reader :environment
  10 +
  11 + should 'describe itself' do
  12 + assert_not_equal Block.description, CommentParagraphPlugin::DiscussionBlock.description
  13 + end
  14 +
  15 + should 'holder be nil if there is no box' do
  16 + b = CommentParagraphPlugin::DiscussionBlock.new
  17 + assert_nil b.holder
  18 + end
  19 +
  20 + should 'holder be nil if there is no box owner to the box' do
  21 + b = CommentParagraphPlugin::DiscussionBlock.new
  22 + box = Box.new
  23 + b.box = box
  24 + assert_nil b.holder
  25 + end
  26 +
  27 + should 'holder be nil if there is no portal community in environment' do
  28 + b = CommentParagraphPlugin::DiscussionBlock.new
  29 + environment.boxes<< Box.new
  30 + b.box = environment.boxes.last
  31 + assert_nil environment.portal_community
  32 + assert_nil b.holder
  33 + end
  34 +
  35 + should 'holder be the portal community for environments blocks' do
  36 + community = fast_create(Community)
  37 + environment.portal_community= community
  38 + environment.save!
  39 + environment.boxes<< Box.new
  40 + b = CommentParagraphPlugin::DiscussionBlock.new
  41 + b.box = environment.boxes.last
  42 + assert_equal environment.portal_community, b.holder
  43 + end
  44 +
  45 + should 'holder be the person for people blocks' do
  46 + person = fast_create(Person)
  47 + person.boxes << Box.new
  48 + b = CommentParagraphPlugin::DiscussionBlock.new
  49 + b.box = person.boxes.last
  50 + assert_equal person, b.holder
  51 + end
  52 +
  53 + should 'holder be the community for communities blocks' do
  54 + community = fast_create(Community)
  55 + community.boxes << Box.new
  56 + b = CommentParagraphPlugin::DiscussionBlock.new
  57 + b.box = community.boxes.last
  58 + assert_equal community, b.holder
  59 + end
  60 +
  61 + should 'holder be the enterprise for enterprises blocks' do
  62 + enterprise = fast_create(Enterprise)
  63 + enterprise.boxes << Box.new
  64 + b = CommentParagraphPlugin::DiscussionBlock.new
  65 + b.box = enterprise.boxes.last
  66 + assert_equal enterprise, b.holder
  67 + end
  68 +
  69 + should 'discussions return only discussion articles' do
  70 + community = fast_create(Community)
  71 + community.boxes << Box.new
  72 + b = CommentParagraphPlugin::DiscussionBlock.new
  73 + b.box = community.boxes.last
  74 + b.save
  75 + a1 = fast_create(CommentParagraphPlugin::Discussion, :profile_id => community.id)
  76 + fast_create(Event, :profile_id => community.id)
  77 + fast_create(TinyMceArticle, :profile_id => community.id)
  78 + a2 = fast_create(CommentParagraphPlugin::Discussion, :profile_id => community.id)
  79 + assert_equivalent [a1, a2], b.discussions
  80 + end
  81 +
  82 + should 'return only not opened discussions if discussion status is not opened' do
  83 + community = fast_create(Community)
  84 + community.boxes << Box.new
  85 + b = CommentParagraphPlugin::DiscussionBlock.new
  86 + b.box = community.boxes.last
  87 + b.discussion_status = CommentParagraphPlugin::DiscussionBlock::STATUS_NOT_OPENED
  88 + b.save
  89 + a1 = fast_create(CommentParagraphPlugin::Discussion, :profile_id => community.id, :start_date => DateTime.now + 1.day)
  90 + a2 = fast_create(CommentParagraphPlugin::Discussion, :profile_id => community.id, :start_date => DateTime.now )
  91 + a3 = fast_create(CommentParagraphPlugin::Discussion, :profile_id => community.id, :start_date => DateTime.now - 1.day)
  92 + a4 = fast_create(CommentParagraphPlugin::Discussion, :profile_id => community.id, :start_date => DateTime.now - 2.day, :end_date => DateTime.now - 1.day)
  93 + assert_equivalent [a1], b.discussions
  94 + end
  95 +
  96 + should 'return only available discussions if discussion status is available' do
  97 + community = fast_create(Community)
  98 + community.boxes << Box.new
  99 + b = CommentParagraphPlugin::DiscussionBlock.new
  100 + b.box = community.boxes.last
  101 + b.discussion_status = CommentParagraphPlugin::DiscussionBlock::STATUS_AVAILABLE
  102 + b.save
  103 + a1 = fast_create(CommentParagraphPlugin::Discussion, :profile_id => community.id, :start_date => DateTime.now + 1.day)
  104 + a2 = fast_create(CommentParagraphPlugin::Discussion, :profile_id => community.id, :start_date => DateTime.now )
  105 + a3 = fast_create(CommentParagraphPlugin::Discussion, :profile_id => community.id, :start_date => DateTime.now - 1.day)
  106 + a4 = fast_create(CommentParagraphPlugin::Discussion, :profile_id => community.id, :start_date => DateTime.now - 2.day, :end_date => DateTime.now - 1.day)
  107 + a5 = fast_create(CommentParagraphPlugin::Discussion, :profile_id => community.id, :end_date => DateTime.now + 1.day)
  108 + assert_equivalent [a2, a3, a5], b.discussions
  109 + end
  110 +
  111 + should 'return only closed discussions if discussion status is closed' do
  112 + community = fast_create(Community)
  113 + community.boxes << Box.new
  114 + b = CommentParagraphPlugin::DiscussionBlock.new
  115 + b.box = community.boxes.last
  116 + b.discussion_status = CommentParagraphPlugin::DiscussionBlock::STATUS_CLOSED
  117 + b.save
  118 + a1 = fast_create(CommentParagraphPlugin::Discussion, :profile_id => community.id, :start_date => DateTime.now + 1.day)
  119 + a2 = fast_create(CommentParagraphPlugin::Discussion, :profile_id => community.id, :start_date => DateTime.now )
  120 + a3 = fast_create(CommentParagraphPlugin::Discussion, :profile_id => community.id, :start_date => DateTime.now - 1.day)
  121 + a4 = fast_create(CommentParagraphPlugin::Discussion, :profile_id => community.id, :start_date => DateTime.now - 2.day, :end_date => DateTime.now - 1.day)
  122 + assert_equivalent [a4], b.discussions
  123 + end
  124 +
  125 +end
  126 +
  127 +require 'boxes_helper'
  128 +
  129 +class DiscussionBlockViewTest < ActionView::TestCase
  130 + include BoxesHelper
  131 +
  132 + should 'show the title and the child titles when the block is set to title only mode' do
  133 + profile = create_user('testuser').person
  134 +
  135 + block = CommentParagraphPlugin::DiscussionBlock.new
  136 + block.stubs(:holder).returns(profile)
  137 + block.presentation_mode = 'title_only'
  138 +
  139 + ActionView::Base.any_instance.stubs(:block_title).returns("Block Title")
  140 + ActionView::Base.any_instance.stubs(:profile).returns(profile)
  141 +
  142 + content = render_block_content(block)
  143 +
  144 + assert_match /discussion-title/, content
  145 + assert_no_match /discussion-abstract/, content
  146 + end
  147 +
  148 + should 'show the title and the child titles and abstracts when the block is set to title and abstract mode' do
  149 + profile = create_user('testuser').person
  150 +
  151 + block = CommentParagraphPlugin::DiscussionBlock.new
  152 + block.stubs(:holder).returns(profile)
  153 + block.presentation_mode = 'title_and_abstract'
  154 +
  155 + ActionView::Base.any_instance.stubs(:block_title).returns("Block Title")
  156 + ActionView::Base.any_instance.stubs(:profile).returns(profile)
  157 +
  158 + content = render_block_content(block)
  159 +
  160 + assert_match /discussion-abstract/, content
  161 + end
  162 +
  163 + should 'show the title and the child full content when the block has no mode set' do
  164 + profile = create_user('testuser').person
  165 +
  166 + block = CommentParagraphPlugin::DiscussionBlock.new
  167 + block.stubs(:holder).returns(profile)
  168 + block.presentation_mode = ''
  169 +
  170 + ActionView::Base.any_instance.stubs(:block_title).returns("Block Title")
  171 + ActionView::Base.any_instance.stubs(:profile).returns(profile)
  172 +
  173 + content = render_block_content(block)
  174 +
  175 + assert_match /discussion-full/, content
  176 + end
  177 +
  178 + should 'return discussions in api_content' do
  179 + community = fast_create(Community)
  180 + community.boxes << Box.new
  181 + b = CommentParagraphPlugin::DiscussionBlock.new
  182 + b.box = community.boxes.last
  183 + b.save
  184 + a1 = fast_create(CommentParagraphPlugin::Discussion, :profile_id => community.id)
  185 + fast_create(Event, :profile_id => community.id)
  186 + fast_create(TinyMceArticle, :profile_id => community.id)
  187 + a2 = fast_create(CommentParagraphPlugin::Discussion, :profile_id => community.id)
  188 + assert_equivalent [a2.id, a1.id], b.api_content['articles'].map {|a| a[:id]}
  189 + end
  190 +
  191 + should 'sort discussions by start_date, end_date and created_at' do
  192 + community = fast_create(Community)
  193 + community.boxes << Box.new
  194 + b = CommentParagraphPlugin::DiscussionBlock.new
  195 + b.box = community.boxes.last
  196 + b.save
  197 + a1 = fast_create(CommentParagraphPlugin::Discussion, :profile_id => community.id, start_date: Time.now)
  198 + a2 = fast_create(CommentParagraphPlugin::Discussion, :profile_id => community.id, start_date: Time.now + 1, end_date: Time.now)
  199 + a3 = fast_create(CommentParagraphPlugin::Discussion, :profile_id => community.id, start_date: Time.now + 1, end_date: Time.now + 1.day)
  200 + a4 = fast_create(CommentParagraphPlugin::Discussion, :profile_id => community.id, start_date: Time.now + 1, end_date: Time.now + 1.day)
  201 + assert_equal [a1.id, a2.id, a3.id, a4.id], b.discussions.map(&:id)
  202 + end
  203 +
  204 +end
... ...
plugins/comment_paragraph/views/blocks/discussion.html.erb 0 → 100644
... ... @@ -0,0 +1,33 @@
  1 +<div id="discussion-block">
  2 + <% children = block.discussions %>
  3 + <div class="discussion">
  4 + <%= block_title(block.title.blank? ? c_("Discussions") : block.title, block.subtitle ) %>
  5 + </div>
  6 + <% if block.mode?('title_only') %>
  7 + <div class="discussion-title">
  8 + <ul>
  9 + <% children.each do |item| %>
  10 + <li> <%= link_to(h(item.title), item.url)%></li>
  11 + <% end %>
  12 + </ul>
  13 + </div>
  14 + <% elsif block.mode?('title_and_abstract') %>
  15 + <div class="discussion-abstract">
  16 + <% children.each do |item| %>
  17 + <h2><%= link_to(item.title,item.url, :class => 'post-title')%></h2>
  18 + <span class="post-date"><%= show_date(item.published_at, true)%></span>
  19 + <div class="headline"><%=item.lead%></div>
  20 + <p class="highlighted-news-read-more"><%= link_to(_('Read more'), item.url) %></p>
  21 + <% end %>
  22 + </div>
  23 + <% else %>
  24 + <div class="discussion-full">
  25 + <% children.each do |item| %>
  26 + <h2><%= link_to(item.title,item.url, :class => 'post-title')%></h2>
  27 + <span class="post-date"><%= show_date(item.published_at, true)%></span>
  28 + <div class="headline"><%=item.body.html_safe %></div>
  29 + <p class="highlighted-news-read-more"><%= link_to(_('Read more'), item.url) %></p>
  30 + <% end %>
  31 + </div>
  32 + <% end %>
  33 +</div>
... ...
plugins/comment_paragraph/views/box_organizer/comment_paragraph_plugin/_discussion_block.html.erb 0 → 100644
... ... @@ -0,0 +1,28 @@
  1 +<%=
  2 +labelled_form_field(_('Choose which blog should be displayed'),
  3 + select_tag(
  4 + 'block[discussion_status]',
  5 + options_for_select([[_('Not Opened Discussions'), CommentParagraphPlugin::DiscussionBlock::STATUS_NOT_OPENED],[_('Available Discussions'), CommentParagraphPlugin::DiscussionBlock::STATUS_AVAILABLE], [_('Closed Discussions'), CommentParagraphPlugin::DiscussionBlock::STATUS_CLOSED]], @block.discussion_status)
  6 + )
  7 +)
  8 +%>
  9 +<%=
  10 +labelled_form_field(_('Choose how the content should be displayed'),
  11 + select_tag(
  12 + 'block[presentation_mode]',
  13 + options_for_select(
  14 + {
  15 + _("Title only") => "title_only",
  16 + _("Title and abstract") => "title_and_abstract",
  17 + _("Full content") => "full_content"
  18 + },
  19 + @block.presentation_mode
  20 + )
  21 + )
  22 +)
  23 +%>
  24 +<%= labelled_form_field(_('Choose how many items will be displayed'),
  25 + text_field_tag('block[total_items]',
  26 + @block.total_items, :size => 3, :maxlength => 5)
  27 + )
  28 +%>
... ...
plugins/comment_paragraph/views/comment_paragraph_plugin_admin/index.html.erb
... ... @@ -17,7 +17,7 @@
17 17 </div>
18 18 </div>
19 19  
20   - <% button_bar do %>
  20 + <%= button_bar do %>
21 21 <%= submit_button(:save, _('Save'), :cancel => {:controller => 'plugins', :action => 'index'}) %>
22 22 <% end %>
23 23  
... ...
plugins/comment_paragraph/views/environment_design 0 → 120000
... ... @@ -0,0 +1 @@
  1 +box_organizer
0 2 \ No newline at end of file
... ...
plugins/comment_paragraph/views/profile_design 0 → 120000
... ... @@ -0,0 +1 @@
  1 +box_organizer
0 2 \ No newline at end of file
... ...
plugins/community_track/views/community_track_plugin_public/select_community.html.erb
... ... @@ -12,7 +12,7 @@
12 12 </div>
13 13 <% end %>
14 14  
15   -<% button_bar do %>
  15 +<%= button_bar do %>
16 16 <%= button(:add, c_('Create a new community'), :controller => 'memberships', :action => 'new_community', :profile => user.identifier, :back_to => @back_to) %>
17 17 <% end %>
18 18  
... ...
plugins/custom_forms/views/custom_forms_plugin_myprofile/_form.html.erb
... ... @@ -55,7 +55,7 @@
55 55 <%= button(:add, _('Add a new select field'), '#', :onclick => "customFormsPlugin.addFields(this, 'fields', #{CGI::escapeHTML(html_for_field(f, :fields, CustomFormsPlugin::SelectField).to_json)}); return false")%>
56 56 </div>
57 57  
58   -<% button_bar do %>
  58 +<%= button_bar do %>
59 59 <%= submit_button :save, c_('Save'), :cancel => {:action => 'index'}%>
60 60 <% end %>
61 61  
... ...
plugins/custom_forms/views/custom_forms_plugin_myprofile/pending.html.erb
... ... @@ -22,6 +22,6 @@
22 22 </table>
23 23 <% end %>
24 24  
25   -<% button_bar do %>
  25 +<%= button_bar do %>
26 26 <%= button :back, _('Back to forms'), :action => 'index' %>
27 27 <% end %>
... ...
plugins/custom_forms/views/custom_forms_plugin_myprofile/show_submission.html.erb
... ... @@ -44,7 +44,7 @@
44 44 <% end %>
45 45 </table>
46 46  
47   -<% button_bar do %>
  47 +<%= button_bar do %>
48 48 <%= button :back, _('Back to submissions'), :action => 'submissions', :id => @form.id %>
49 49 <% end %>
50 50  
... ...
plugins/custom_forms/views/custom_forms_plugin_myprofile/submissions.html.erb
... ... @@ -27,7 +27,7 @@
27 27 </table>
28 28 <% end %>
29 29  
30   -<% button_bar do %>
  30 +<%= button_bar do %>
31 31 <%= button :back, _('Back to forms'), :action => 'index' %>
32 32 <% end %>
33 33  
... ...
plugins/custom_forms/views/custom_forms_plugin_profile/show.html.erb
... ... @@ -22,7 +22,7 @@
22 22  
23 23 <%= render :partial => 'shared/form_submission', :locals => {:f => f} %>
24 24  
25   - <% button_bar do %>
  25 + <%= button_bar do %>
26 26 <% if @form.expired? %>
27 27 <%= submit_button :save, c_('Save'), :disabled => '', :class => 'disabled', :cancel => {:controller => :profile, :profile => profile.identifier} %>
28 28 <% else %>
... ...
plugins/display_content/lib/display_content_block.rb
... ... @@ -118,69 +118,28 @@ class DisplayContentBlock &lt; Block
118 118 holder.articles.where(type: types, parent_id: if parent.nil? then nil else parent end)
119 119 end
120 120  
121   - def content(args={})
122   - block = self
123   -
  121 + def docs
124 122 order_string = "published_at"
125 123 order_string += " DESC" if order_by_recent
126 124  
127 125 limit_final = [limit_to_show, 0].max
128 126  
129   - docs = owner.articles.order(order_string)
  127 + documents = owner.articles.order(order_string)
130 128 .where(articles: {type: self.types})
131 129 .includes(:profile, :image, :tags)
132 130 if nodes.present?
133 131 nodes_conditions = 'articles.id IN(:nodes)'
134 132 nodes_conditions << ' OR articles.parent_id IN(:nodes) ' if display_folder_children
135   - docs = docs.where nodes_conditions, nodes: nodes
  133 + documents = documents.where nodes_conditions, nodes: nodes
136 134 end
137   - docs = docs.limit limit_final if display_folder_children
  135 + documents = documents.limit limit_final if display_folder_children
138 136  
139 137 if content_with_translations
140   - docs = docs.native_translations
141   - docs.replace docs.map{ |p| p.get_translation_to(FastGettext.locale) }.compact
  138 + documents = documents.native_translations
  139 + documents.replace documents.map{ |p| p.get_translation_to(FastGettext.locale) }.compact
142 140 end
143 141  
144   - proc do
145   - block.block_title(block.title, block.subtitle) +
146   - content_tag('ul', docs.map {|item|
147   - if !item.folder? && item.class != RssFeed
148   - content_sections = ''
149   - read_more_section = ''
150   - tags_section = ''
151   -
152   - block.sections.select { |section|
153   - case section[:value]
154   - when 'publish_date'
155   - content_sections += (block.display_section?(section) ? (content_tag('div', show_date(item.published_at, false), :class => 'published-at') ) : '')
156   - when 'title'
157   - content_sections += (block.display_section?(section) ? (content_tag('div', link_to(h(item.title), item.url), :class => 'title') ) : '')
158   - when 'abstract'
159   - content_sections += (block.display_section?(section) ? (content_tag('div', item.abstract.html_safe , :class => 'lead')) : '' )
160   - if block.display_section?(section)
161   - read_more_section = content_tag('div', link_to(_('Read more'), item.url), :class => 'read_more')
162   - end
163   - when 'body'
164   - content_sections += (block.display_section?(section) ? (content_tag('div', item.body.html_safe ,:class => 'body')) : '' )
165   - when 'image'
166   - image_section = image_tag item.image.public_filename if item.image
167   - if !image_section.blank?
168   - content_sections += (block.display_section?(section) ? (content_tag('div', link_to( image_section, item.url ) ,:class => 'image')) : '' )
169   - end
170   - when 'tags'
171   - if !item.tags.empty?
172   - tags_section = item.tags.map { |t| content_tag('span', t.name) }.join("")
173   - content_sections += (block.display_section?(section) ? (content_tag('div', tags_section, :class => 'tags')) : '')
174   - end
175   - end
176   - }
177   -
178   - content_sections += read_more_section if !read_more_section.blank?
179   -#raise sections.inspect
180   - content_tag('li', content_sections.html_safe)
181   - end
182   - }.join(" ").html_safe)
183   - end
  142 + documents
184 143 end
185 144  
186 145 def url_params
... ...
plugins/display_content/test/unit/display_content_block_test.rb
... ... @@ -347,53 +347,6 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase
347 347  
348 348 end
349 349  
350   - should 'list links for all articles title defined in nodes' do
351   - profile = create_user('testuser').person
352   - Article.delete_all
353   - a1 = fast_create(TextileArticle, :name => 'test article 1', :profile_id => profile.id)
354   - a2 = fast_create(TextileArticle, :name => 'test article 2', :profile_id => profile.id)
355   -
356   - block = DisplayContentBlock.new
357   - block.sections = [{:value => 'title', :checked => true}]
358   - block.nodes = [a1.id, a2.id]
359   - box = mock()
360   - block.stubs(:box).returns(box)
361   - box.stubs(:owner).returns(profile)
362   -
363   - assert_match /.*<a.*>#{a1.title}<\/a>/, instance_eval(&block.content)
364   - assert_match /.*<a.*>#{a2.title}<\/a>/, instance_eval(&block.content)
365   - end
366   -
367   - should 'list content for all articles lead defined in nodes' do
368   - profile = create_user('testuser').person
369   - Article.delete_all
370   - a1 = fast_create(TinyMceArticle, :name => 'test article 1', :profile_id => profile.id, :abstract => 'abstract article 1')
371   - a2 = fast_create(TinyMceArticle, :name => 'test article 2', :profile_id => profile.id, :abstract => 'abstract article 2')
372   -
373   - block = DisplayContentBlock.new
374   - block.sections = [{:value => 'abstract', :checked => true}]
375   - block.nodes = [a1.id, a2.id]
376   - box = mock()
377   - block.stubs(:box).returns(box)
378   - box.stubs(:owner).returns(profile)
379   -
380   - assert_match /<div class="lead">#{a1.lead}<\/div>/, instance_eval(&block.content)
381   - assert_match /<div class="lead">#{a2.lead}<\/div>/, instance_eval(&block.content)
382   - end
383   -
384   - should 'not crash when referenced article is removed' do
385   - profile = create_user('testuser').person
386   - a1 = fast_create(TextArticle, :name => 'test article 1', :profile_id => profile.id)
387   -
388   - block = DisplayContentBlock.new
389   - block.nodes = [a1.id]
390   - box = mock()
391   - block.stubs(:box).returns(box)
392   - box.stubs(:owner).returns(profile)
393   -
394   - Article.delete_all
395   - assert_match /<ul><\/ul>/, instance_eval(&block.content)
396   - end
397 350 include ActionView::Helpers
398 351 include Rails.application.routes.url_helpers
399 352  
... ... @@ -420,48 +373,6 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase
420 373 assert_equal params, block.url_params
421 374 end
422 375  
423   - should 'show title if defined by user' do
424   - profile = create_user('testuser').person
425   - a = fast_create(TextileArticle, :name => 'test article 1', :profile_id => profile.id)
426   -
427   - block = DisplayContentBlock.new
428   - block.nodes = [a.id]
429   - block.sections = [{:value => 'title', :checked => true}]
430   - box = mock()
431   - block.stubs(:box).returns(box)
432   - box.stubs(:owner).returns(profile)
433   -
434   - assert_match /.*<a.*>#{a.title}<\/a>/, instance_eval(&block.content)
435   - end
436   -
437   - should 'show abstract if defined by user' do
438   - profile = create_user('testuser').person
439   - a = fast_create(TextileArticle, :name => 'test article 1', :profile_id => profile.id, :abstract => 'some abstract')
440   -
441   - block = DisplayContentBlock.new
442   - block.nodes = [a.id]
443   - block.sections = [{:value => 'abstract', :checked => true}]
444   - box = mock()
445   - block.stubs(:box).returns(box)
446   - box.stubs(:owner).returns(profile)
447   -
448   - assert_match /#{a.abstract}/, instance_eval(&block.content)
449   - end
450   -
451   - should 'show body if defined by user' do
452   - profile = create_user('testuser').person
453   - a = fast_create(TextileArticle, :name => 'test article 1', :profile_id => profile.id, :body => 'some body')
454   -
455   - block = DisplayContentBlock.new
456   - block.nodes = [a.id]
457   - block.sections = [{:value => 'body', :checked => true}]
458   - box = mock()
459   - block.stubs(:box).returns(box)
460   - box.stubs(:owner).returns(profile)
461   -
462   - assert_match /#{a.body}/, instance_eval(&block.content)
463   - end
464   -
465 376 should 'display_attribute be true for title by default' do
466 377 profile = create_user('testuser').person
467 378  
... ... @@ -489,20 +400,6 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase
489 400 assert block.display_section?({:value => 'publish_date', :checked => true})
490 401 end
491 402  
492   - should 'show publishd date if defined by user' do
493   - profile = create_user('testuser').person
494   - a = fast_create(TextArticle, :name => 'test article 1', :profile_id => profile.id, :body => 'some body')
495   -
496   - block = DisplayContentBlock.new
497   - block.nodes = [a.id]
498   - block.sections = [{:value => 'publish_date', :checked => true}]
499   - box = mock()
500   - block.stubs(:box).returns(box)
501   - box.stubs(:owner).returns(profile)
502   -
503   - assert_match /#{a.published_at}/, instance_eval(&block.content)
504   - end
505   -
506 403 should 'do not save children if a folder is checked' do
507 404 profile = create_user('testuser').person
508 405 Article.delete_all
... ... @@ -648,6 +545,117 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase
648 545 assert_equal [], block.parent_nodes
649 546 end
650 547  
  548 +end
  549 +
  550 +require 'boxes_helper'
  551 +
  552 +class DisplayContentBlockViewTest < ActionView::TestCase
  553 + include BoxesHelper
  554 +
  555 + should 'list links for all articles title defined in nodes' do
  556 + profile = create_user('testuser').person
  557 + Article.delete_all
  558 + a1 = fast_create(TextileArticle, :name => 'test article 1', :profile_id => profile.id)
  559 + a2 = fast_create(TextileArticle, :name => 'test article 2', :profile_id => profile.id)
  560 +
  561 + block = DisplayContentBlock.new
  562 + block.sections = [{:value => 'title', :checked => true}]
  563 + block.nodes = [a1.id, a2.id]
  564 + box = mock()
  565 + block.stubs(:box).returns(box)
  566 + box.stubs(:owner).returns(profile)
  567 +
  568 + assert_match /.*<a.*>#{a1.title}<\/a>/, render_block_content(block)
  569 + assert_match /.*<a.*>#{a2.title}<\/a>/, render_block_content(block)
  570 + end
  571 +
  572 + should 'list content for all articles lead defined in nodes' do
  573 + profile = create_user('testuser').person
  574 + Article.delete_all
  575 + a1 = fast_create(TinyMceArticle, :name => 'test article 1', :profile_id => profile.id, :abstract => 'abstract article 1')
  576 + a2 = fast_create(TinyMceArticle, :name => 'test article 2', :profile_id => profile.id, :abstract => 'abstract article 2')
  577 +
  578 + block = DisplayContentBlock.new
  579 + block.sections = [{:value => 'abstract', :checked => true}]
  580 + block.nodes = [a1.id, a2.id]
  581 + box = mock()
  582 + block.stubs(:box).returns(box)
  583 + box.stubs(:owner).returns(profile)
  584 +
  585 + assert_match /<div class="lead">#{a1.lead}<\/div>/, render_block_content(block)
  586 + assert_match /<div class="lead">#{a2.lead}<\/div>/, render_block_content(block)
  587 + end
  588 +
  589 + should 'not crash when referenced article is removed' do
  590 + profile = create_user('testuser').person
  591 + a1 = fast_create(TextArticle, :name => 'test article 1', :profile_id => profile.id)
  592 +
  593 + block = DisplayContentBlock.new
  594 + block.nodes = [a1.id]
  595 + box = mock()
  596 + block.stubs(:box).returns(box)
  597 + box.stubs(:owner).returns(profile)
  598 +
  599 + Article.delete_all
  600 + assert_match /<ul><\/ul>/, render_block_content(block)
  601 + end
  602 +
  603 + should 'show title if defined by user' do
  604 + profile = create_user('testuser').person
  605 + a = fast_create(TextileArticle, :name => 'test article 1', :profile_id => profile.id)
  606 +
  607 + block = DisplayContentBlock.new
  608 + block.nodes = [a.id]
  609 + block.sections = [{:value => 'title', :checked => true}]
  610 + box = mock()
  611 + block.stubs(:box).returns(box)
  612 + box.stubs(:owner).returns(profile)
  613 +
  614 + assert_match /.*<a.*>#{a.title}<\/a>/, render_block_content(block)
  615 + end
  616 +
  617 + should 'show abstract if defined by user' do
  618 + profile = create_user('testuser').person
  619 + a = fast_create(TextileArticle, :name => 'test article 1', :profile_id => profile.id, :abstract => 'some abstract')
  620 +
  621 + block = DisplayContentBlock.new
  622 + block.nodes = [a.id]
  623 + block.sections = [{:value => 'abstract', :checked => true}]
  624 + box = mock()
  625 + block.stubs(:box).returns(box)
  626 + box.stubs(:owner).returns(profile)
  627 +
  628 + assert_match /#{a.abstract}/, render_block_content(block)
  629 + end
  630 +
  631 + should 'show body if defined by user' do
  632 + profile = create_user('testuser').person
  633 + a = fast_create(TextileArticle, :name => 'test article 1', :profile_id => profile.id, :body => 'some body')
  634 +
  635 + block = DisplayContentBlock.new
  636 + block.nodes = [a.id]
  637 + block.sections = [{:value => 'body', :checked => true}]
  638 + box = mock()
  639 + block.stubs(:box).returns(box)
  640 + box.stubs(:owner).returns(profile)
  641 +
  642 + assert_match /#{a.body}/, render_block_content(block)
  643 + end
  644 +
  645 + should 'show publishd date if defined by user' do
  646 + profile = create_user('testuser').person
  647 + a = fast_create(TextArticle, :name => 'test article 1', :profile_id => profile.id, :body => 'some body')
  648 +
  649 + block = DisplayContentBlock.new
  650 + block.nodes = [a.id]
  651 + block.sections = [{:value => 'publish_date', :checked => true}]
  652 + box = mock()
  653 + block.stubs(:box).returns(box)
  654 + box.stubs(:owner).returns(profile)
  655 +
  656 + assert_match /#{a.published_at}/, render_block_content(block)
  657 + end
  658 +
651 659 should 'show articles in recent order' do
652 660 profile = create_user('testuser').person
653 661 Article.delete_all
... ... @@ -663,8 +671,8 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase
663 671  
664 672 block.order_by_recent = true
665 673  
666   - a1_index = instance_eval(&block.content).index(a1.name)
667   - a2_index = instance_eval(&block.content).index(a2.name)
  674 + a1_index = render_block_content(block).index(a1.name)
  675 + a2_index = render_block_content(block).index(a2.name)
668 676  
669 677 assert a2_index < a1_index
670 678 end
... ... @@ -684,8 +692,8 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase
684 692  
685 693 block.order_by_recent = false
686 694  
687   - a1_index = instance_eval(&block.content).index(a1.name)
688   - a2_index = instance_eval(&block.content).index(a2.name)
  695 + a1_index = render_block_content(block).index(a1.name)
  696 + a2_index = render_block_content(block).index(a2.name)
689 697  
690 698 assert a1_index < a2_index
691 699 end
... ... @@ -706,7 +714,7 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase
706 714 block.order_by_recent = true
707 715 block.limit_to_show = 1
708 716  
709   - a1_index = instance_eval(&block.content).index(a1.name)
  717 + a1_index = render_block_content(block).index(a1.name)
710 718  
711 719 assert a1_index.nil?
712 720 end
... ... @@ -730,15 +738,15 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase
730 738 block.stubs(:box).returns(box)
731 739 box.stubs(:owner).returns(profile)
732 740  
733   - assert_nil instance_eval(&block.content).index(en_article.name)
734   - assert_nil instance_eval(&block.content).index(en_article2.name)
735   - assert instance_eval(&block.content).index(pt_article.name).present?
  741 + assert_nil render_block_content(block).index(en_article.name)
  742 + assert_nil render_block_content(block).index(en_article2.name)
  743 + assert render_block_content(block).index(pt_article.name).present?
736 744  
737 745 FastGettext.stubs(:locale).returns('en')
738 746  
739   - assert instance_eval(&block.content).index(en_article.name)
740   - assert instance_eval(&block.content).index(en_article2.name)
741   - assert_nil instance_eval(&block.content).index(pt_article.name)
  747 + assert render_block_content(block).index(en_article.name)
  748 + assert render_block_content(block).index(en_article2.name)
  749 + assert_nil render_block_content(block).index(pt_article.name)
742 750 end
743 751  
744 752 should 'replace article with its translation' do
... ... @@ -758,12 +766,71 @@ class DisplayContentBlockTest &lt; ActiveSupport::TestCase
758 766 block.stubs(:box).returns(box)
759 767 box.stubs(:owner).returns(profile)
760 768  
761   - assert_nil instance_eval(&block.content).index(en_article.name)
762   - assert instance_eval(&block.content).index(pt_article.name).present?
  769 + assert_nil render_block_content(block).index(en_article.name)
  770 + assert render_block_content(block).index(pt_article.name).present?
763 771  
764 772 FastGettext.stubs(:locale).returns('en')
765 773  
766   - assert instance_eval(&block.content).index(en_article.name).present?
767   - assert_nil instance_eval(&block.content).index(pt_article.name)
  774 + assert render_block_content(block).index(en_article.name).present?
  775 + assert_nil render_block_content(block).index(pt_article.name)
768 776 end
  777 +
  778 + should 'not escape abstract html of articles' do
  779 + profile = create_user('testuser').person
  780 + a1 = fast_create(TextileArticle, abstract: "<p class='test-article-abstract'>Test</p>", name: 'test article 1', profile_id: profile.id, published_at: DateTime.current)
  781 +
  782 + block = DisplayContentBlock.new
  783 + block.sections = [{:value => 'abstract', :checked => true}]
  784 + block.nodes = [a1.id]
  785 + box = mock()
  786 + block.stubs(:box).returns(box)
  787 + box.stubs(:owner).returns(profile)
  788 + assert_tag_in_string render_block_content(block), tag: 'p', attributes: { class: 'test-article-abstract' }
  789 + end
  790 +
  791 + should 'not raise if abstract of article is nil' do
  792 + profile = create_user('testuser').person
  793 + a1 = fast_create(TextileArticle, name: 'test article 1', profile_id: profile.id, published_at: DateTime.current)
  794 +
  795 + block = DisplayContentBlock.new
  796 + block.sections = [{:value => 'abstract', :checked => true}]
  797 + block.nodes = [a1.id]
  798 + box = mock()
  799 + block.stubs(:box).returns(box)
  800 + box.stubs(:owner).returns(profile)
  801 + assert_nil a1.abstract
  802 + assert_nothing_raised do
  803 + render_block_content(block)
  804 + end
  805 + end
  806 +
  807 + should 'not escape body html of articles' do
  808 + profile = create_user('testuser').person
  809 + a1 = fast_create(TextileArticle, body: "<p class='test-article-body'>Test</p>", name: 'test article 1', profile_id: profile.id, published_at: DateTime.current)
  810 +
  811 + block = DisplayContentBlock.new
  812 + block.sections = [{:value => 'body', :checked => true}]
  813 + block.nodes = [a1.id]
  814 + box = mock()
  815 + block.stubs(:box).returns(box)
  816 + box.stubs(:owner).returns(profile)
  817 + assert_tag_in_string render_block_content(block), tag: 'p', attributes: { class: 'test-article-body' }
  818 + end
  819 +
  820 + should 'not raise if body of article is nil' do
  821 + profile = create_user('testuser').person
  822 + a1 = fast_create(TextileArticle, name: 'test article 1', profile_id: profile.id, published_at: DateTime.current)
  823 +
  824 + block = DisplayContentBlock.new
  825 + block.sections = [{:value => 'abstract', :checked => true}]
  826 + block.nodes = [a1.id]
  827 + box = mock()
  828 + block.stubs(:box).returns(box)
  829 + box.stubs(:owner).returns(profile)
  830 + assert_nil a1.body
  831 + assert_nothing_raised do
  832 + render_block_content(block)
  833 + end
  834 + end
  835 +
769 836 end
... ...
plugins/display_content/views/blocks/display_content.slim 0 → 100644
... ... @@ -0,0 +1,4 @@
  1 += block.block_title(block.title, block.subtitle)
  2 +
  3 +ul
  4 + = render partial: 'blocks/display_content/document', collection: block.docs, as: :item, locals: { block: block }
... ...
plugins/display_content/views/blocks/display_content/_document.slim 0 → 100644
... ... @@ -0,0 +1,4 @@
  1 +li
  2 + - unless item.folder? || item.class == RssFeed
  3 + = render partial: 'blocks/display_content/section', collection: block.sections, locals: { block: block, item: item }
  4 + = render partial: 'blocks/display_content/read_more', locals: { item: item, abstract_section: block.sections.bsearch { |section| section[:value] == 'abstract' }, block: block }
... ...
plugins/display_content/views/blocks/display_content/_read_more.slim 0 → 100644
... ... @@ -0,0 +1,3 @@
  1 +- if !abstract_section.nil? && block.display_section?(abstract_section)
  2 + div class='read_more'
  3 + = link_to(_('Read more'), item.url)
... ...
plugins/display_content/views/blocks/display_content/_section.slim 0 → 100644
... ... @@ -0,0 +1,22 @@
  1 +- if block.display_section?(section)
  2 + - case section[:value]
  3 + - when 'publish_date'
  4 + div class='published-at'
  5 + = show_date(item.published_at, false)
  6 + - when 'title'
  7 + div class='title'
  8 + = link_to(h(item.title), item.url)
  9 + - when 'abstract'
  10 + div class='lead'
  11 + = (item.abstract || '').html_safe
  12 + - when 'body'
  13 + div class='body'
  14 + = (item.body || '').html_safe
  15 + - when 'image'
  16 + - unless item.image || item.image.public_filename
  17 + div class='image'
  18 + = link_to(image_tag(item.image.public_filename), item.url)
  19 + - when 'tags'
  20 + - unless item.tags.empty?
  21 + div class='tags'
  22 + = render partial: 'blocks/display_content/tag', collection: item.tags
... ...
plugins/display_content/views/blocks/display_content/_tag.slim 0 → 100644
... ... @@ -0,0 +1,2 @@
  1 +span
  2 + = tag.name
0 3 \ No newline at end of file
... ...
plugins/ldap/views/ldap_plugin_admin/index.html.erb
... ... @@ -73,7 +73,7 @@
73 73 </table>
74 74  
75 75 <div>
76   - <% button_bar do %>
  76 + <%= button_bar do %>
77 77 <%= submit_button('save', c_('Save changes')) %>
78 78 <%= button :back, _('Back to plugins administration panel'), :controller => 'plugins' %>
79 79 <% end %>
... ...
plugins/mark_comment_as_read/test/unit/mark_comment_as_read_test.rb
1 1 require 'test_helper'
2 2  
3   -class MarkCommentAsReadPluginTest < ActiveSupport::TestCase
4   -
5   - include ActionView::Helpers::TagHelper
6   - include NoosferoTestHelper
  3 +class MarkCommentAsReadPluginTest < ActionView::TestCase
7 4  
8 5 def setup
9 6 @plugin = MarkCommentAsReadPlugin.new
... ...
plugins/metadata/lib/metadata_plugin/base.rb
1   -
2 1 class MetadataPlugin::Base < Noosfero::Plugin
3 2  
4 3 def self.plugin_name
... ... @@ -71,6 +70,6 @@ end
71 70  
72 71 ActiveSupport.run_load_hooks :metadata_plugin, MetadataPlugin
73 72 ActiveSupport.on_load :active_record do
74   - ApplicationRecord.extend MetadataPlugin::Specs::ClassMethods
  73 + ActiveRecord::Base.extend MetadataPlugin::Specs::ClassMethods
75 74 end
76 75  
... ...
plugins/newsletter/test/integration/safe_strings_test.rb 0 → 100644
... ... @@ -0,0 +1,31 @@
  1 +require 'test_helper'
  2 +
  3 +class NewsletterPluginSafeStringsTest < ActionDispatch::IntegrationTest
  4 +
  5 + should 'not escape HTML from newsletter pending task' do
  6 + environment = Environment.default
  7 + environment.enable_plugin('newsletter')
  8 + person = create_user('john', :environment_id => environment.id, :password => 'test', :password_confirmation => 'test').person
  9 + person.user.activate
  10 + environment.add_admin(person)
  11 +
  12 + blog = fast_create(Blog, :profile_id => person.id)
  13 + post = fast_create(TextileArticle, :name => 'First post', :profile_id => person.id, :parent_id => blog.id, :body => 'Test')
  14 + newsletter = NewsletterPlugin::Newsletter.create!(:environment => environment, :person => person, :enabled => true)
  15 + newsletter.blog_ids = [blog.id]
  16 + newsletter.save!
  17 + task = NewsletterPlugin::ModerateNewsletter.create!(
  18 + :newsletter_id => newsletter.id,
  19 + :target => environment,
  20 + :post_ids => [post.id.to_s]
  21 + )
  22 +
  23 + login 'john', 'test'
  24 + get '/myprofile/john/tasks'
  25 +
  26 + assert_tag :tag => 'input',
  27 + :attributes => { :type => 'checkbox', :name => "tasks[#{task.id}][task][post_ids][]" },
  28 + :sibling => { :tag => 'span' }
  29 + end
  30 +
  31 +end
... ...
plugins/newsletter/views/newsletter_plugin/unsubscribe.html.erb
... ... @@ -6,6 +6,6 @@
6 6  
7 7 <%= _('Send an email to %s requesting your unsubscription or click on the button below.') % link_to(environment.contact_email, "mailto:#{environment.contact_email}?subject=#{_('Cancel newsletter subscription')}") %>
8 8  
9   -<% button_bar do %>
  9 +<%= button_bar do %>
10 10 <%= button :ok, _('Confirm unsubscription'), {:action => 'confirm_unsubscription'}, :method => 'post' %>
11 11 <% end %>
... ...
plugins/newsletter/views/newsletter_plugin_admin/index.html.erb
... ... @@ -85,7 +85,7 @@
85 85 :id => 'newsletter-footer-field'
86 86 ))
87 87 %>
88   - <% button_bar do %>
  88 + <%= button_bar do %>
89 89 <%= submit_button :save, _('Save') %>
90 90 <%= submit_button :save, _('Save and visualize'), :name => "visualize", :cancel => {:controller => 'plugins'} %>
91 91 <% end %>
... ...
plugins/newsletter/views/tasks/newsletter_plugin/_moderate_newsletter_accept_details.html.erb
... ... @@ -9,9 +9,9 @@
9 9 <% input_name = "tasks[#{task.id}][task][post_ids][]" %>
10 10 <% post_check_box = hidden_field_tag(input_name, '0') +check_box_tag(input_name, post.id, true) %>
11 11  
12   - <% newsletter_content.gsub!(/<span([^>]*?) id="#{post.id}"/, post_check_box + '<span\\1')%>
13   - <% newsletter_content.gsub!(/<img([^>]*?) id="#{post.id}"/, post_check_box + '<img\\1') %>
  12 + <% newsletter_content.gsub!(/<span([^>]*?) id="#{post.id}"/, post_check_box + '<span\\1'.html_safe) %>
  13 + <% newsletter_content.gsub!(/<img([^>]*?) id="#{post.id}"/, post_check_box + '<img\\1'.html_safe) %>
14 14 <% end %>
15 15  
16   - <%= newsletter_content %>
  16 + <%= newsletter_content.html_safe %>
17 17 </div>
... ...
plugins/oauth_client/views/oauth_client_plugin_admin/edit.html.erb
... ... @@ -33,7 +33,7 @@
33 33 <% end %>
34 34 </div>
35 35  
36   - <% button_bar do %>
  36 + <%= button_bar do %>
37 37 <%= submit_button(:save, _('Save'), :cancel => {:action => 'index'}) %>
38 38 <% end %>
39 39 <% end %>
... ...
plugins/organization_ratings/controllers/organization_ratings_plugin_profile_controller.rb
... ... @@ -37,20 +37,17 @@ class OrganizationRatingsPluginProfileController &lt; ProfileController
37 37 end
38 38  
39 39 def create_new_rate
40   - rating = OrganizationRating.new(params[:organization_rating])
41   - rating.person = current_user.person
42   - rating.organization = profile
43   - rating.value = params[:organization_rating_value] if params[:organization_rating_value]
  40 + @rating = OrganizationRating.new(params[:organization_rating])
  41 + @rating.person = current_user.person
  42 + @rating.organization = profile
  43 + @rating.value = params[:organization_rating_value] if params[:organization_rating_value]
44 44  
45   - if rating.save
46   - @plugins.dispatch(:organization_ratings_plugin_rating_created, rating, params)
47   - create_rating_comment(rating)
  45 + if @rating.save
  46 + @plugins.dispatch(:organization_ratings_plugin_rating_created, @rating, params)
  47 + create_rating_comment(@rating)
48 48 session[:notice] = _("%s successfully rated!") % profile.name
49   - else
50   - session[:notice] = _("Sorry, there were problems rating this profile.")
  49 + redirect_to profile.url
51 50 end
52   -
53   - redirect_to profile.url
54 51 end
55 52  
56 53 def create_rating_comment(rating)
... ...
plugins/organization_ratings/db/migrate/20160523193515_add_initial_page_to_organization_ratings_config.rb 0 → 100644
... ... @@ -0,0 +1,9 @@
  1 +class AddInitialPageToOrganizationRatingsConfig < ActiveRecord::Migration
  2 + def up
  3 + add_column :organization_ratings_configs, :ratings_on_initial_page, :integer, :default => 3
  4 + end
  5 +
  6 + def down
  7 + remove_column :organization_ratings_configs, :ratings_on_initial_page
  8 + end
  9 +end
... ...
plugins/organization_ratings/features/rate_community.feature
... ... @@ -19,7 +19,7 @@ Feature: rate_community
19 19 And I am logged in as "joaosilva"
20 20  
21 21 @selenium
22   - Scenario: display rate button inside average block
  22 + Scenario: display rate button and total ratings inside average block
23 23 Given I am on mycommunity's homepage
24 24 Then I should see "Rate this Community" within ".average-rating-block"
25 25 And I should see "Be the first to rate" within ".average-rating-block"
... ... @@ -34,3 +34,9 @@ Feature: rate_community
34 34 When I follow "Rate this Community"
35 35 Then I should see "Joao Silva" within ".star-profile-name"
36 36 And I should see Joao Silva's profile image
  37 +
  38 + Scenario: display total ratings inside average block
  39 + Given I am on mycommunity's homepage
  40 + When I follow "Rate this Community"
  41 + Then I follow "Save"
  42 + Then I should see "(1)" within ".total-ratings"
... ...
plugins/organization_ratings/lib/organization_rating.rb
... ... @@ -13,25 +13,26 @@ class OrganizationRating &lt; ApplicationRecord
13 13 validates :organization_id, :person_id,
14 14 :presence => true
15 15  
16   - def display_moderation_message person
17   - if person.present?
18   - task_active? && (person.is_admin? || person == self.person ||
  16 + def display_full_info_to? person
  17 + (person.is_admin? || person == self.person ||
19 18 self.organization.is_admin?(person))
20   - end
21 19 end
22 20  
23   - def task_active?
24   - tasks = CreateOrganizationRatingComment.where(:target_id => self.organization.id,
25   - :status => Task::Status::ACTIVE)
26   - tasks.detect {|t| t.organization_rating_id == self.id}.present?
  21 + def task_status
  22 + tasks = CreateOrganizationRatingComment.where(:target_id => self.organization.id, :requestor_id => self.person.id)
  23 + task = tasks.detect{ |t| t.organization_rating_id == self.id }
  24 + task.status if task.present?
27 25 end
28 26  
29   - def self.average_rating organization_id
30   - average = OrganizationRating.where(organization_id: organization_id).average(:value)
  27 + def self.statistics_for_profile organization
  28 + ratings = OrganizationRating.where(organization_id: organization)
  29 + average = ratings.average(:value)
  30 + total = ratings.size
31 31  
32 32 if average
33   - (average - average.truncate) >= 0.5 ? average.ceil : average.floor
  33 + average = (average - average.truncate) >= 0.5 ? average.ceil : average.floor
34 34 end
  35 + { average: average, total: total }
35 36 end
36 37  
37 38 end
... ...
plugins/organization_ratings/lib/organization_ratings_block.rb
... ... @@ -13,6 +13,10 @@ class OrganizationRatingsBlock &lt; Block
13 13 env_organization_ratings_config.per_page
14 14 end
15 15  
  16 + def ratings_on_initial_page
  17 + env_organization_ratings_config.ratings_on_initial_page
  18 + end
  19 +
16 20 def cacheable?
17 21 false
18 22 end
... ...
plugins/organization_ratings/lib/organization_ratings_config.rb
... ... @@ -4,6 +4,7 @@ class OrganizationRatingsConfig &lt; ApplicationRecord
4 4  
5 5 attr_accessible :cooldown, :default_rating, :order, :per_page
6 6 attr_accessible :vote_once, :are_moderated, :environment_id
  7 + attr_accessible :ratings_on_initial_page
7 8  
8 9 ORDER_OPTIONS = {recent: _('More Recent'), best: _('Best Ratings')}
9 10  
... ...
plugins/organization_ratings/lib/ratings_helper.rb
... ... @@ -12,4 +12,14 @@ module RatingsHelper
12 12 ratings = OrganizationRating.where(organization_id: profile_id).order("created_at DESC")
13 13 end
14 14 end
15   -end
16 15 \ No newline at end of file
  16 +
  17 + def status_message_for(person, rating)
  18 + if person.present? && rating.display_full_info_to?(person)
  19 + if(rating.task_status == Task::Status::ACTIVE)
  20 + content_tag(:p, _("Report waiting for approval"), class: "moderation-msg")
  21 + elsif(rating.task_status == Task::Status::CANCELLED)
  22 + content_tag(:p, _("Report rejected"), class: "rejected-msg")
  23 + end
  24 + end
  25 + end
  26 +end
... ...
plugins/organization_ratings/public/style.css
1 1 .star-container {
2 2 width: 100%;
3   - height: 20px;
  3 + height: 22px;
4 4 }
5 5  
6 6 .star-negative, .star-positive {
... ... @@ -80,7 +80,16 @@
80 80  
81 81 .organization-average-rating-container .star-container {
82 82 float: left;
83   - width: 120px;
  83 + display: inline-flex;
  84 + width: auto;
  85 + max-width: 190px;
  86 +
  87 +}
  88 +
  89 +.total-ratings {
  90 + font-size: 16px;
  91 + margin-left: 5px;
  92 + margin-right: 5px;
84 93 }
85 94  
86 95 .organization-average-rating-container .rate-this-organization {
... ...
plugins/organization_ratings/test/functional/organization_ratings_plugin_profile_controller_test.rb
... ... @@ -46,7 +46,7 @@ class OrganizationRatingsPluginProfileControllerTest &lt; ActionController::TestCas
46 46 test "do not create community_rating without a rate value" do
47 47 post :new_rating, profile: @community.identifier, :comments => {:body => ""}, :organization_rating_value => nil
48 48  
49   - assert_equal "Sorry, there were problems rating this profile.", session[:notice]
  49 + assert_tag :tag => 'div', :attributes => {:class => /errorExplanation/}, :content => /Value can't be blank/
50 50 end
51 51  
52 52 test "do not create two ratings on Community when vote once config is true" do
... ... @@ -188,4 +188,24 @@ class OrganizationRatingsPluginProfileControllerTest &lt; ActionController::TestCas
188 188 assert_no_tag :tag => 'p', :content => /Report waiting for approva/, :attributes => {:class =>/comment-rejected-msg/}
189 189 assert_tag :tag => 'p', :content => /comment accepted/, :attributes => {:class =>/comment-body/}
190 190 end
  191 +
  192 + test "should display ratings count in average block" do
  193 + average_block = AverageRatingBlock.new
  194 + average_block.box = @community.boxes.find_by_position(1)
  195 + average_block.save!
  196 +
  197 + OrganizationRating.stubs(:statistics_for_profile).returns({:average => 5, :total => 42})
  198 + get :new_rating, profile: @community.identifier
  199 + assert_tag :tag => 'a', :content => /\(42\)/
  200 + end
  201 +
  202 + test "should display maximum ratings count in average block" do
  203 + average_block = AverageRatingBlock.new
  204 + average_block.box = @community.boxes.find_by_position(1)
  205 + average_block.save!
  206 +
  207 + OrganizationRating.stubs(:statistics_for_profile).returns({:average => 5, :total => 999000})
  208 + get :new_rating, profile: @community.identifier
  209 + assert_tag :tag => 'a', :content => /\(10000\+\)/
  210 + end
191 211 end
... ...
plugins/organization_ratings/test/unit/organization_rating_config_test.rb
... ... @@ -29,15 +29,29 @@ class OrganizationRatingConfigTest &lt; ActiveSupport::TestCase
29 29 assert_equal "must be greater than or equal to 0", @organization_ratings_config.errors[:cooldown].first
30 30 end
31 31  
32   - # test "communities ratings per page validation" do
33   - # environment = Environment.new :communities_ratings_per_page => 4
34   - # environment.valid?
  32 + test "communities ratings per page validation" do
  33 + @organization_ratings_config.per_page = 4
35 34  
36   - # assert_equal "must be greater than or equal to 5", environment.errors[:communities_ratings_per_page].first
  35 + refute @organization_ratings_config.valid?
37 36  
38   - # environment.communities_ratings_per_page = 21
39   - # environment.valid?
  37 + assert_equal "must be greater than or equal to 5", @organization_ratings_config.errors[:per_page].first
40 38  
41   - # assert_equal "must be less than or equal to 20", environment.errors[:communities_ratings_per_page].first
42   - # end
  39 + @organization_ratings_config.per_page = 21
  40 + refute @organization_ratings_config.valid?
  41 +
  42 + assert_equal "must be less than or equal to 20", @organization_ratings_config.errors[:per_page].first
  43 + end
  44 +
  45 + should "ratings block use initial_page config" do
  46 + @organization_ratings_config.ratings_on_initial_page = 4
  47 + @organization_ratings_config.save!
  48 + block = OrganizationRatingsBlock.new
  49 + assert_equal block.ratings_on_initial_page, 4
  50 + end
  51 +
  52 + should "ratings block show 3 ratings on initial page by default" do
  53 + @organization_ratings_config.save!
  54 + block = OrganizationRatingsBlock.new
  55 + assert_equal block.ratings_on_initial_page, 3
  56 + end
43 57 end
... ...
plugins/organization_ratings/test/unit/organization_rating_test.rb
... ... @@ -35,55 +35,36 @@ class OrganizationRatingTest &lt; ActiveSupport::TestCase
35 35 assert_equal false, organization_rating2.errors[:value].include?("must be between 1 and 5")
36 36 end
37 37  
38   - test "false return when no active tasks for an Organization Rating" do
39   - assert_not @rating.task_active?
40   - end
41   -
42   - test "true return when an active task exists for an Organization Rating" do
  38 + test "return rating task status" do
43 39 CreateOrganizationRatingComment.create!(
44 40 :organization_rating_id => @rating.id,
45 41 :target => @community,
46 42 :requestor => @person)
47 43  
48   - assert_equal Task::Status::ACTIVE, CreateOrganizationRatingComment.last.status
49   - assert @rating.task_active?
  44 + assert_equal Task::Status::ACTIVE, @rating.task_status
50 45 end
51 46  
52   - test "return false when an cancelled task exists for an Organization Rating" do
  47 + test "return rating task status when task is cancelled" do
53 48 CreateOrganizationRatingComment.create!(
54 49 :organization_rating_id => @rating.id,
55 50 :target => @community,
56 51 :requestor => @person)
57 52 CreateOrganizationRatingComment.last.cancel
58   - assert_not @rating.task_active?
  53 + assert_equal Task::Status::CANCELLED, @rating.task_status
59 54 end
60 55  
61   - test "display report moderation message to community admin" do
62   - moderator = create_user('moderator')
63   - @community.add_admin(moderator.person)
64   - @rating.stubs(:task_active?).returns(true)
65   - assert @rating.display_moderation_message(@adminuser)
  56 + test "should display full info to admin" do
  57 + @person.stubs(:is_admin?).returns(true)
  58 + assert @rating.display_full_info_to?(@person)
66 59 end
67 60  
68   - test "display report moderation message to owner" do
69   - @rating.stubs(:task_active?).returns(true)
70   - assert @rating.display_moderation_message(@person)
  61 + test "should display full info to owner" do
  62 + assert @rating.display_full_info_to?(@person)
71 63 end
72 64  
73   - test "do not display report moderation message to regular user" do
  65 + test "should not display full info to regular user" do
74 66 regular_person = fast_create(Person)
75   - @rating.stubs(:task_active?).returns(true)
76   - assert_not @rating.display_moderation_message(regular_person)
77   - end
78   -
79   - test "do not display report moderation message to not logged user" do
80   - @rating.stubs(:task_active?).returns(true)
81   - assert_not @rating.display_moderation_message(nil)
82   - end
83   -
84   - test "do not display report moderation message no active task exists" do
85   - @rating.stubs(:task_active?).returns(false)
86   - assert_not @rating.display_moderation_message(@person)
  67 + assert_not @rating.display_full_info_to?(regular_person)
87 68 end
88 69  
89 70 test "Create task for create a rating comment" do
... ... @@ -109,7 +90,7 @@ class OrganizationRatingTest &lt; ActiveSupport::TestCase
109 90 assert community.tasks.include?(create_organization_rating_comment)
110 91 end
111 92  
112   - test "Should calculate community's rating average" do
  93 + test "Should calculate community's rating statistics" do
113 94 community = fast_create Community
114 95 p1 = fast_create Person, :name=>"Person 1"
115 96 p2 = fast_create Person, :name=>"Person 2"
... ... @@ -119,11 +100,13 @@ class OrganizationRatingTest &lt; ActiveSupport::TestCase
119 100 OrganizationRating.create! :value => 3, :organization => community, :person => p2
120 101 OrganizationRating.create! :value => 5, :organization => community, :person => p3
121 102  
122   - assert_equal 3, OrganizationRating.average_rating(community)
  103 + assert_equal 3, OrganizationRating.statistics_for_profile(community)[:average]
  104 + assert_equal 3, OrganizationRating.statistics_for_profile(community)[:total]
123 105  
124 106 p4 = fast_create Person, :name=>"Person 4"
125 107 OrganizationRating.create! :value => 4, :organization => community, :person => p4
126 108  
127   - assert_equal 4, OrganizationRating.average_rating(community)
  109 + assert_equal 4, OrganizationRating.statistics_for_profile(community)[:average]
  110 + assert_equal 4, OrganizationRating.statistics_for_profile(community)[:total]
128 111 end
129 112 end
... ...
plugins/organization_ratings/test/unit/ratings_helper_test.rb
... ... @@ -3,6 +3,7 @@ require &#39;ratings_helper&#39;
3 3  
4 4 class RatingsHelperTest < ActiveSupport::TestCase
5 5 include RatingsHelper
  6 + include ActionView::Helpers::TagHelper
6 7  
7 8 def setup
8 9  
... ... @@ -12,6 +13,12 @@ class RatingsHelperTest &lt; ActiveSupport::TestCase
12 13 @person = create_user('testuser').person
13 14 @community = Community.create(:name => "TestCommunity")
14 15 @organization_ratings_config = OrganizationRatingsConfig.instance
  16 + @rating = fast_create(OrganizationRating, {:value => 1,
  17 + :person_id => @person.id,
  18 + :organization_id => @community.id,
  19 + :created_at => DateTime.now,
  20 + :updated_at => DateTime.now,
  21 + })
15 22 end
16 23  
17 24 should "get the ratings of a community ordered by most recent ratings" do
... ... @@ -32,6 +39,7 @@ class RatingsHelperTest &lt; ActiveSupport::TestCase
32 39  
33 40 ratings_array << most_recent_rating
34 41 ratings_array << first_rating
  42 + ratings_array << @rating
35 43  
36 44 assert_equal @organization_ratings_config.order, "recent"
37 45 assert_equal ratings_array, get_ratings(@community.id)
... ... @@ -57,7 +65,42 @@ class RatingsHelperTest &lt; ActiveSupport::TestCase
57 65  
58 66 ratings_array << second_rating
59 67 ratings_array << first_rating
  68 + ratings_array << @rating
60 69  
61 70 assert_equal ratings_array, get_ratings(@community.id)
62 71 end
  72 +
  73 + test "display report moderation message to community admin" do
  74 + @moderator = create_user('moderator').person
  75 + @community.add_admin(@moderator)
  76 + @rating.stubs(:task_status).returns(Task::Status::ACTIVE)
  77 + assert status_message_for(@moderator, @rating).include?("Report waiting for approval")
  78 + end
  79 +
  80 + test "display report moderation message to owner" do
  81 + @rating.stubs(:task_status).returns(Task::Status::ACTIVE)
  82 + assert status_message_for(@person, @rating).include?("Report waiting for approval")
  83 + end
  84 +
  85 + test "display report rejected message to owner" do
  86 + @rating.stubs(:task_status).returns(Task::Status::CANCELLED)
  87 + assert status_message_for(@person, @rating).include?("Report rejected")
  88 + end
  89 +
  90 + test "do not display report moderation message to regular user" do
  91 + @regular_person = fast_create(Person)
  92 + @rating.stubs(:task_status).returns(Task::Status::ACTIVE)
  93 + assert_nil status_message_for(@regular_person, @rating)
  94 + end
  95 +
  96 + test "return empty status message to not logged user" do
  97 + @rating.stubs(:task_status).returns(Task::Status::ACTIVE)
  98 + assert_nil status_message_for(nil, @rating)
  99 + end
  100 +
  101 + test "do not display status message if report task is finished" do
  102 + @rating.stubs(:task_status).returns(Task::Status::FINISHED)
  103 + assert_nil status_message_for(@person, @rating)
  104 + end
  105 +
63 106 end
... ...
plugins/organization_ratings/views/blocks/average_rating.html.erb
1   -<% average_rating = OrganizationRating.average_rating block.owner.id %>
  1 +<% statistics = OrganizationRating.statistics_for_profile block.owner %>
2 2  
3 3 <div class="organization-average-rating-container">
4   - <% if average_rating %>
  4 + <% if statistics[:average] %>
5 5 <div class="star-rate-text">
6 6 <%= _("Rating: ") %>
7 7 </div>
8 8  
9 9 <div class="star-container">
10 10 <% (1..5).each do |star_number| %>
11   - <% if star_number <= average_rating %>
  11 + <% if star_number <= statistics[:average] %>
12 12 <div class="medium-star-positive"></div>
13 13 <% else %>
14 14 <div class="medium-star-negative"></div>
15 15 <% end %>
16 16 <% end %>
  17 + <div class="total-ratings">
  18 + <%= link_to url_for(:controller => 'organization_ratings_plugin_profile', :action => 'new_rating', :anchor => 'ratings-list') do %>
  19 + <% if(statistics[:total] > 10000) %>
  20 + <%= "(10000+)" %>
  21 + <% else %>
  22 + <%= "(#{statistics[:total]})" %>
  23 + <% end %>
  24 + <% end %>
  25 + </div>
17 26 </div>
18 27 <% else %>
19 28 <div class="rating-invitation">
... ... @@ -24,4 +33,4 @@
24 33 <div class="rate-this-organization">
25 34 <%= link_to _("Rate this %s") % _(block.owner.class.name), url_for(:controller => "organization_ratings_plugin_profile", :action => "new_rating", :profile => block.owner.identifier) %>
26 35 </div>
27   -</div>
28 36 \ No newline at end of file
  37 +</div>
... ...
plugins/organization_ratings/views/blocks/organization_ratings.html.erb
... ... @@ -7,14 +7,14 @@
7 7 <% else %>
8 8 <div class="ratings-list">
9 9 <% block.get_ratings(block.owner.id).each_with_index do |r, index| %>
10   - <% break if index >= block.limit_number_of_ratings %>
  10 + <% break if index >= block.ratings_on_initial_page %>
11 11 <%= render :partial => "shared/user_rating_container", :locals => {:user_rate => r} %>
12 12 <% end %>
13 13  
14 14 <%= render :partial => 'shared/make_report_block' %>
15 15  
16 16 <div class="see-more">
17   - <%= link_to _('See more'), url_for(:controller => 'organization_ratings_plugin_profile', :action => 'new_rating'), :class => 'icon-arrow-right-p' %>
  17 + <%= link_to _('See more'), url_for(:controller => 'organization_ratings_plugin_profile', :action => 'new_rating', :anchor => 'ratings-list'), :class => 'icon-arrow-right-p' %>
18 18 </div>
19 19 </div>
20 20 <% end %>
... ...
plugins/organization_ratings/views/organization_ratings_plugin_admin/index.html.erb
... ... @@ -43,9 +43,15 @@
43 43 <%= c.select :per_page, 5..20 %>
44 44 </td>
45 45 </tr>
  46 + <tr>
  47 + <td><%= _('Ratings amount on initial page') %></td>
  48 + <td>
  49 + <%= c.select :ratings_on_initial_page, 1..10 %>
  50 + </td>
  51 + </tr>
46 52 </table>
47 53 <div>
48   - <% button_bar do %>
  54 + <%= button_bar do %>
49 55 <%= submit_button('save', c_('Save changes')) %>
50 56 <%= button :back, _('Back'), :controller => 'plugins' %>
51 57 <% end %>
... ...
plugins/organization_ratings/views/organization_ratings_plugin_profile/_new_rating_fields.html.erb
1 1 <% min_rate = env_organization_ratings_config.minimum_ratings %>
2 2 <% default_rating = env_organization_ratings_config.default_rating %>
3 3  
4   -<div class="star-page-title">
5   - <%= @plugins.dispatch(:organization_ratings_title).collect { |content| instance_exec(&content) }.join("") %>
6   -</div>
7   -
8 4 <div class="star-rate-data">
9 5  
10 6 <div class="star-profile-information">
... ...
plugins/organization_ratings/views/organization_ratings_plugin_profile/new_rating.html.erb
  1 +<%= error_messages_for 'rating' %>
  2 +
1 3 <% config = env_organization_ratings_config %>
  4 +<div class="star-page-title">
  5 + <%= @plugins.dispatch(:organization_ratings_title).collect { |content| instance_exec(&content) }.join("") %>
  6 +</div>
2 7 <% if logged_in? %>
3 8 <%= render :partial => "new_rating_fields" %>
4 9 <% else %>
... ... @@ -7,7 +12,7 @@
7 12 </div>
8 13 <% end %>
9 14  
10   -<div class="ratings-list">
  15 +<div class="ratings-list" id="ratings-list">
11 16 <% @users_ratings.each do |user_rate| %>
12 17 <%= render :partial => "shared/user_rating_container", :locals => {:user_rate => user_rate} %>
13 18 <% end %>
... ... @@ -15,4 +20,4 @@
15 20  
16 21 <div id='pagination-profiles'>
17 22 <%= pagination_links @users_ratings, :param_name => 'npage' %>
18   -</div>
19 23 \ No newline at end of file
  24 +</div>
... ...
plugins/organization_ratings/views/shared/_make_report_block.html.erb
1 1 <% logged_in_image = link_to profile_image(current_user.person, :portrait), current_user.person.url if current_user %>
2 2 <% logged_in_name = link_to current_user.person.name, current_user.person.url if current_user %>
3   -<% logged_out_image = image_tag('plugins/organization_ratings/public/images/user-not-logged.png') %>
  3 +<% logged_out_image = image_tag('plugins/organization_ratings/images/user-not-logged.png') %>
4 4  
5 5 <div class="make-report-block">
6 6 <div class="star-profile-information">
... ...
plugins/organization_ratings/views/shared/_rating_button.html.erb
1   -<% button_bar do %>
  1 +<%= button_bar do %>
2 2 <% if logged_in? %>
3 3 <%= button(:new,_("Rate %s ") % _(profile.class.name),
4 4 {:controller => "organization_ratings_plugin_profile",
... ...
plugins/organization_ratings/views/shared/_user_rating_container.html.erb
  1 +<% extend RatingsHelper %>
1 2 <div class="user-rating-block">
2 3 <div class="star-profile-information">
3 4 <div class="star-profile-image">
... ... @@ -25,9 +26,7 @@
25 26 </div>
26 27  
27 28 <div class="user-testimony">
28   - <% if user_rate.display_moderation_message(user) %>
29   - <p class="moderation-msg"><%= _("Report waiting for approval") %></p>
30   - <% end %>
  29 + <%= status_message_for(user, user_rate) %>
31 30 <% if user_rate.comment.present? %>
32 31 <p class="comment-body"> <%= user_rate.comment.body %> </p>
33 32 <% end %>
... ...
plugins/piwik/views/piwik_plugin_admin/index.html.erb
... ... @@ -8,7 +8,7 @@
8 8  
9 9 <%= labelled_form_field _('Piwik site id'), f.text_field(:piwik_site_id) %>
10 10  
11   - <% button_bar do %>
  11 + <%= button_bar do %>
12 12 <%= submit_button(:save, c_('Save'), :cancel => {:controller => 'plugins', :action => 'index'}) %>
13 13 <% end %>
14 14  
... ...
plugins/products/test/unit/products_plugin/enterprise_homepage_helper_test.rb
1 1 require_relative '../../test_helper'
2 2  
3   -class EnterpriseHomepageHelperTest < ActiveSupport::TestCase
  3 +class EnterpriseHomepageHelperTest < ActionView::TestCase
4 4  
5 5 include ProductsPlugin::EnterpriseHomepageHelper
6 6  
... ... @@ -57,7 +57,4 @@ class EnterpriseHomepageHelperTest &lt; ActiveSupport::TestCase
57 57 assert_no_match /100.34/, result
58 58 end
59 59  
60   - protected
61   - include NoosferoTestHelper
62   -
63 60 end
... ...
plugins/products/test/unit/profile_test.rb
... ... @@ -22,9 +22,8 @@ class ProfileTest &lt; ActiveSupport::TestCase
22 22 end
23 23  
24 24 should 'collect the highlighted products with image' do
25   - env = Environment.default
26 25 e1 = fast_create(Enterprise)
27   - p1 = create(Product, name: 'test_prod1', product_category_id: @product_category.id, enterprise: e1)
  26 + create(Product, name: 'test_prod1', product_category_id: @product_category.id, enterprise: e1)
28 27 products = []
29 28 3.times {|n|
30 29 products.push(create(Product, name: "product #{n}", profile_id: e1.id,
... ... @@ -36,7 +35,8 @@ class ProfileTest &lt; ActiveSupport::TestCase
36 35 create(Product, name: "product 5", profile_id: e1.id, product_category_id: @product_category.id, image_builder: {
37 36 uploaded_data: fixture_file_upload('/files/rails.png', 'image/png')
38 37 })
39   - assert_equal products, e1.highlighted_products_with_image
  38 +
  39 + assert_equivalent products, e1.highlighted_products_with_image
40 40 end
41 41  
42 42 should 'have many inputs through products' do
... ...
plugins/products/views/products_plugin/page/_display_input.html.erb
1 1 <div class='input-informations input-form-closed'>
2 2 <div class='input-name'> <%= input.name %> <%= input_icon(input) %> </div>
3 3 <div class='input-details'>
4   - <% button_bar do %>
  4 + <%= button_bar do %>
5 5 <% if input.has_price_details? %>
6 6 <%= edit_button(:edit, _('Edit'), {:action => 'edit_input', :id => input}, :class => 'edit-input', :id => "edit-input-#{input.id}") %>
7 7 <% end %>
... ...
plugins/products/views/products_plugin/page/_edit_description.html.erb
... ... @@ -6,7 +6,7 @@
6 6 html: {id: 'product-description-form', method: 'post'}) do |f| %>
7 7  
8 8 <%= labelled_form_field(_('Description:'), f.text_area(:description, rows: 15, style: 'width: 90%;', class: 'mceEditor')) %>
9   - <% button_bar do %>
  9 + <%= button_bar do %>
10 10 <%= submit_button :save, _('Save') %>
11 11 <%= cancel_edit_product_link(@product, 'description') %>
12 12 <% end %>
... ...
plugins/products/views/products_plugin/page/_edit_info.html.erb
... ... @@ -54,7 +54,7 @@
54 54  
55 55 <%= hidden_field_tag 'info-bar-update-url', @product.price_composition_bar_display_url, class: 'bar-update-url' %>
56 56  
57   - <% button_bar do %>
  57 + <%= button_bar do %>
58 58 <%= submit_button :save, _('Save') %>
59 59 <%= cancel_edit_product_link(@product, 'info') %>
60 60 <% end %>
... ...
plugins/products/views/products_plugin/page/_edit_name.html.erb
... ... @@ -6,7 +6,7 @@
6 6 <%= f.text_field(:name, value: @product.name, class: 'name_edition') %>
7 7 <%= select_unit(@product) %>
8 8  
9   - <% button_bar do %>
  9 + <%= button_bar do %>
10 10 <%= submit_button :save, _('Save') %>
11 11 <%= cancel_edit_product_link(@product, 'name') %>
12 12 <% end %>
... ...
plugins/products/views/products_plugin/page/_form.html.erb
... ... @@ -11,7 +11,7 @@
11 11 <%= file_field_or_thumbnail(_('Image:'), @product.image, i) %>
12 12 <% end %>
13 13  
14   - <% button_bar do %>
  14 + <%= button_bar do %>
15 15 <%= submit_button('save', (mode == 'new' ? _('Create product') : _('Save changes')), :cancel => {:action => 'index'} ) %>
16 16 <% end %>
17 17 <% end %>
... ...
plugins/products/views/products_plugin/page/_manage_product_details.html.erb
... ... @@ -21,7 +21,7 @@
21 21 <%= hidden_field(:product, :inputs_cost) %>
22 22 <%= hidden_field(:product, :price) %>
23 23  
24   - <% button_bar do %>
  24 + <%= button_bar do %>
25 25 <%= submit_button :save, _('Save'), :disabled => '', :class => 'disabled' %>
26 26 <%= button :cancel, _('Cancel'), '#', class: 'cancel-price-details', data: {confirm: _('If you leave, you will lose all unsaved information. Are you sure you want to quit?')} %>
27 27 <%= button(:add, _('New cost'), '#', :id => 'add-new-cost') %>
... ...
plugins/products/views/products_plugin/page/index.html.erb
... ... @@ -24,7 +24,7 @@
24 24  
25 25 <%= pagination_links @products %>
26 26  
27   -<% button_bar do %>
  27 +<%= button_bar do %>
28 28 <%= button :add, _('New product or service'), :action => 'new' if @profile.create_product? %>
29 29 <%= button :back, _('Back'), { :controller => 'profile_editor', :profile => @profile.identifier, :action => 'index' } %>
30 30 <% end %>
... ...
plugins/products/views/products_plugin/page/show.html.erb
... ... @@ -68,7 +68,7 @@
68 68  
69 69 </div>
70 70  
71   -<% button_bar do %>
  71 +<%= button_bar do %>
72 72 <%= button :back, _('Back to the product listing'), controller: 'products_plugin/catalog', action: 'index' %>
73 73 <%= button :delete, _('Remove product or service'), {action: 'destroy', id: @product}, class: 'requires-permission-manage_products', style: 'display:none;' %>
74 74 <% end %>
... ...
plugins/products/views/profile_editor/_products_profile_info_contents.html.slim 0 → 100644
... ... @@ -0,0 +1,3 @@
  1 +- if profile.enterprise?
  2 + h2= _('Products/Services catalog')
  3 + = labelled_form_field(_('Number of products/services displayed per page on catalog'), text_field(:profile_data, :products_per_catalog_page, size: 3))
... ...
plugins/products/views/profile_editor/products_profile_info_contents.html.slim
... ... @@ -1,3 +0,0 @@
1   -- if profile.enterprise?
2   - h2= _('Products/Services catalog')
3   - = labelled_form_field(_('Number of products/services displayed per page on catalog'), text_field(:profile_data, :products_per_catalog_page, size: 3))
plugins/push_notification/lib/push_notification_plugin.rb
... ... @@ -39,7 +39,7 @@ class PushNotificationPlugin &lt; Noosfero::Plugin
39 39 end
40 40  
41 41 def self.api_mount_points
42   - [PushNotificationPlugin::Api]
  42 + [PushNotificationPlugin::API]
43 43 end
44 44  
45 45 def self.plugin_description
... ...
plugins/push_notification/lib/push_notification_plugin/api.rb
1   -require_dependency 'api/helpers'
2 1 require_relative 'api_entities'
3 2  
4   -class PushNotificationPlugin::Api < Grape::API
  3 +# Can't be called Api as will result in:
  4 +# warning: toplevel constant Api referenced by PushNotificationPlugin::Api
  5 +# To fix this PushNotificationPlugin should be a module
  6 +class PushNotificationPlugin::API < Grape::API
5 7  
6 8 include Api::Helpers
7 9  
... ...
plugins/push_notification/views/push_notification_plugin_admin/index.html.erb
... ... @@ -7,7 +7,7 @@
7 7 <h3><%= t('push_notification_plugin.lib.plugin.enabled_notifications')%></h3>
8 8 <%= render partial: "notification_events_form", locals:{f: f, settings: @settings} %>
9 9  
10   - <% button_bar do %>
  10 + <%= button_bar do %>
11 11 <%= submit_button(:save, c_('Save'), :cancel => {:controller => 'plugins'}) %>
12 12 <% end %>
13 13  
... ...
plugins/push_notification/views/push_notification_plugin_myprofile/index.html.erb
... ... @@ -18,7 +18,7 @@
18 18 <%= form_for(:settings, :url => {:controller => "push_notification_plugin_myprofile", :action => "update_settings"}) do |f| %>
19 19 <h1><%= t('push_notification_plugin.lib.plugin.enabled_notifications') %></h1>
20 20 <%= render partial: "notification_events_form", locals: {f: f, settings: @settings} %>
21   - <% button_bar do %>
  21 + <%= button_bar do %>
22 22 <%= submit_button(:save, _('Save')) %>
23 23 <%= button(:back, _('Back to control panel'), :controller => (profile.nil? ? 'admin_panel': 'profile_editor')) %>
24 24 <% end %>
... ...
plugins/relevant_content/lib/relevant_content_plugin/relevant_content_block.rb
... ... @@ -20,45 +20,8 @@ class RelevantContentPlugin::RelevantContentBlock &lt; Block
20 20  
21 21 attr_accessible :limit, :show_most_voted, :show_most_disliked, :show_most_liked, :show_most_commented, :show_most_read
22 22  
23   - include ActionView::Helpers
24   - include Rails.application.routes.url_helpers
25   -
26   - def content(args={})
27   -
28   - content = block_title(title, subtitle)
29   -
30   - if self.show_most_read
31   - docs = Article.most_accessed(owner, self.limit)
32   - content += subcontent(docs, _("Most read articles"), "mread") unless docs.blank?
33   - end
34   -
35   - if self.show_most_commented
36   - docs = Article.most_commented_relevant_content(owner, self.limit)
37   - content += subcontent(docs, _("Most commented articles"), "mcommented") unless docs.blank?
38   - end
39   -
40   - if owner.kind_of?(Environment)
41   - env = owner
42   - else
43   - env = owner.environment
44   - end
45   -
46   - if env.plugin_enabled?('VotePlugin')
47   - if self.show_most_liked
48   - docs = Article.more_positive_votes(owner, self.limit)
49   - content += subcontent(docs, _("Most liked articles"), "mliked") unless docs.blank?
50   - end
51   - if self.show_most_disliked
52   - docs = Article.more_negative_votes(owner, self.limit)
53   - content += subcontent(docs, _("Most disliked articles"), "mdisliked") unless docs.blank?
54   - end
55   -
56   - if self.show_most_voted
57   - docs = Article.most_voted(owner, self.limit)
58   - content += subcontent(docs, _("Most voted articles"), "mvoted") unless docs.blank?
59   - end
60   - end
61   - return content.html_safe
  23 + def env
  24 + owner.kind_of?(Environment) ? owner : owner.environment
62 25 end
63 26  
64 27 def timeout
... ... @@ -69,14 +32,4 @@ class RelevantContentPlugin::RelevantContentBlock &lt; Block
69 32 { :profile => [:article], :environment => [:article] }
70 33 end
71 34  
72   - protected
73   -
74   - def subcontent(docs, title, html_class)
75   - subcontent = safe_join([
76   - content_tag(:span, title, class: "title #{html_class}"),
77   - content_tag(:ul, safe_join(docs.map {|item| content_tag('li', link_to(h(item.title), item.url))}, "\n"))
78   - ], "\n")
79   - content_tag(:div, subcontent, :class=>"block #{html_class}")
80   - end
81   -
82 35 end
... ...
plugins/relevant_content/test/unit/relevant_content_block_test.rb
... ... @@ -42,20 +42,6 @@ class RelevantContentBlockTest &lt; ActiveSupport::TestCase
42 42 assert_equal RelevantContentPlugin::RelevantContentBlock.expire_on, {:environment=>[:article], :profile=>[:article]}
43 43 end
44 44  
45   - should 'not crash if vote plugin is not found' do
46   - box = fast_create(Box, :owner_id => @profile.id, :owner_type => 'Profile')
47   - block = RelevantContentPlugin::RelevantContentBlock.new(:box => box)
48   -
49   - Environment.any_instance.stubs(:enabled_plugins).returns(['RelevantContent'])
50   - # When the plugin is disabled from noosfero instance, its constant name is
51   - # undefined. To test this case, I have to manually undefine the constant
52   - # if necessary.
53   - Object.send(:remove_const, VotePlugin.to_s) if defined? VotePlugin
54   -
55   - assert_nothing_raised do
56   - block.content
57   - end
58   - end
59 45  
60 46 should 'check most voted articles from profile with relevant content block' do
61 47 community = fast_create(Community)
... ... @@ -77,11 +63,41 @@ class RelevantContentBlockTest &lt; ActiveSupport::TestCase
77 63 assert_equal false, data.empty?
78 64 end
79 65  
  66 +end
  67 +
  68 +require 'boxes_helper'
  69 +
  70 +class RelevantContentBlockViewTest < ActionView::TestCase
  71 + include BoxesHelper
  72 +
  73 + def setup
  74 + @profile = create_user('testinguser').person
  75 + end
  76 +
  77 + should 'not crash if vote plugin is not found' do
  78 + box = fast_create(Box, :owner_id => @profile.id, :owner_type => 'Profile')
  79 + block = RelevantContentPlugin::RelevantContentBlock.new(:box => box)
  80 +
  81 + Environment.any_instance.stubs(:enabled_plugins).returns(['RelevantContent'])
  82 + ActionView::Base.any_instance.expects(:block_title).returns("")
  83 + # When the plugin is disabled from noosfero instance, its constant name is
  84 + # undefined. To test this case, I have to manually undefine the constant
  85 + # if necessary.
  86 + Object.send(:remove_const, VotePlugin.to_s) if defined? VotePlugin
  87 +
  88 + assert_nothing_raised do
  89 + render_block_content(block)
  90 + end
  91 + end
  92 +
80 93 should 'not escape html in block content' do
81   - fast_create(Article, profile_id: profile.id, hits: 10)
82   - box = fast_create(Box, :owner_id => profile.id, :owner_type => 'Profile')
  94 + fast_create(Article, profile_id: @profile.id, hits: 10)
  95 + box = fast_create(Box, :owner_id => @profile.id, :owner_type => 'Profile')
83 96 block = RelevantContentPlugin::RelevantContentBlock.new(:box => box)
  97 +
84 98 Environment.any_instance.stubs(:enabled_plugins).returns(['RelevantContent'])
85   - assert_tag_in_string block.content, tag: 'span', attributes: { class: 'title mread' }
  99 + ActionView::Base.any_instance.expects(:block_title).returns("")
  100 +
  101 + assert_tag_in_string render_block_content(block), tag: 'span', attributes: { class: 'title mread' }
86 102 end
87 103 end
... ...
plugins/relevant_content/views/blocks/relevant_content.slim 0 → 100644
... ... @@ -0,0 +1,14 @@
  1 += block_title(block.title, block.subtitle)
  2 +
  3 +- if block.show_most_read
  4 + = render partial: 'blocks/relevant_content/subcontent', locals: {docs: Article.most_accessed(block.owner, block.limit), title: _("Most read articles"), html_class: 'mread'}
  5 +- if block.show_most_commented
  6 + = render partial: 'blocks/relevant_content/subcontent', locals: {docs: Article.most_commented_relevant_content(block.owner, block.limit), title: _("Most commented articles"), html_class: 'mcommented'}
  7 +
  8 +- if block.env.plugin_enabled?('VotePlugin')
  9 + - if block.show_most_liked
  10 + = render partial: 'blocks/relevant_content/subcontent', locals: {docs: Article.more_positive_votes(block.owner, block.limit), title: _("Most liked articles"), html_class: 'mliked'}
  11 + - if block.show_most_disliked
  12 + = render partial: 'blocks/relevant_content/subcontent', locals: {docs: Article.more_negative_votes(block.owner, block.limit), title: _("Most disliked articles"), html_class: 'mdisliked'}
  13 + - if block.show_most_voted
  14 + = render partial: 'blocks/relevant_content/subcontent', locals: {docs: Article.most_voted(block.owner, block.limit), title: _("Most voted articles"), html_class: 'mvoted'}
... ...
plugins/relevant_content/views/blocks/relevant_content/_doc.slim 0 → 100644
... ... @@ -0,0 +1,2 @@
  1 +li
  2 + = link_to(h(doc.title), doc.url)
... ...
plugins/relevant_content/views/blocks/relevant_content/_subcontent.slim 0 → 100644
... ... @@ -0,0 +1,6 @@
  1 +- unless docs.blank?
  2 + div class="block #{html_class}"
  3 + span class="title #{html_class}"
  4 + = title
  5 + ul
  6 + = render partial: 'blocks/relevant_content/doc', collection: docs
... ...
plugins/require_auth_to_comment/views/require_auth_to_comment_plugin_admin/index.html.erb
... ... @@ -13,7 +13,7 @@
13 13 </strong>
14 14 </div>
15 15  
16   - <% button_bar do %>
  16 + <%= button_bar do %>
17 17 <%= submit_button(:save, _('Save'), :cancel => {:controller => 'plugins', :action => 'index'}) %>
18 18 <% end %>
19 19  
... ...
plugins/responsive/lib/ext/application_helper.rb
... ... @@ -5,7 +5,7 @@ module ApplicationHelper
5 5 protected
6 6  
7 7 module ResponsiveMethods
8   - FORM_CONTROL_CLASS = "form-control"
  8 + FORM_CONTROL_CLASS = 'form-control'
9 9  
10 10 def button(type, label, url, html_options = {})
11 11 return super unless theme_responsive?
... ... @@ -13,15 +13,14 @@ module ApplicationHelper
13 13 option = html_options.delete(:option) || 'default'
14 14 size = html_options.delete(:size) || 'xs'
15 15 the_class = "with-text btn btn-#{size} btn-#{option} icon-#{type}"
16   - if html_options.has_key?(:class)
17   - the_class << ' ' << html_options[:class]
18   - end
19   - #button_without_text type, label, url, html_options.merge(:class => the_class)
  16 + the_class << ' ' << html_options[:class] if html_options.has_key?(:class)
  17 +
  18 + #button_without_text type, label, url, html_options.merge(class: the_class)
20 19 the_title = html_options[:title] || label
21 20 if html_options[:disabled]
22   - content_tag('a', content_tag('span', label), html_options.merge(class: the_class, title: the_title))
  21 + content_tag(:a, content_tag(:span, label), html_options.merge(class: the_class, title: the_title))
23 22 else
24   - link_to(content_tag('span', label), url, html_options.merge(class: the_class, title: the_title))
  23 + link_to(content_tag(:span, label), url, html_options.merge(class: the_class, title: the_title))
25 24 end
26 25 end
27 26  
... ... @@ -36,7 +35,7 @@ module ApplicationHelper
36 35 end
37 36 the_title = html_options[:title] || label
38 37 if html_options[:disabled]
39   - content_tag('a', '', html_options.merge(class: the_class, title: the_title))
  38 + content_tag(:a, '', html_options.merge(class: the_class, title: the_title))
40 39 else
41 40 link_to('', url, html_options.merge(class: the_class, title: the_title))
42 41 end
... ... @@ -91,7 +90,7 @@ module ApplicationHelper
91 90 if html_options.has_key?(:class)
92 91 the_class << ' ' << html_options[:class]
93 92 end
94   - content_tag('div', '', html_options.merge(class: the_class))
  93 + content_tag(:div, '', html_options.merge(class: the_class))
95 94 end
96 95  
97 96 def icon_button(type, text, url, html_options = {})
... ... @@ -104,16 +103,21 @@ module ApplicationHelper
104 103 the_class << ' ' << html_options[:class]
105 104 end
106 105  
107   - link_to(content_tag('span', text), url, html_options.merge(class: the_class, title: text))
  106 + link_to(content_tag(:span, text), url, html_options.merge(class: the_class, title: text))
108 107 end
109 108  
110   - def button_bar(options = {}, &block)
  109 + def button_bar options = {}, &block
111 110 return super unless theme_responsive?
112 111  
113   - options[:class].nil? ?
114   - options[:class]='button-bar' :
115   - options[:class]+=' button-bar'
116   - concat(content_tag('div', capture(&block).to_s + tag('br', style: 'clear: left;'), options))
  112 + options[:class] ||= ''
  113 + options[:class] << 'button-bar'
  114 +
  115 + content_tag :div, options do
  116 + [
  117 + capture(&block).to_s,
  118 + tag('br', style: 'clear: left;'),
  119 + ].safe_join
  120 + end
117 121 end
118 122  
119 123 def expirable_button(content, action, text, url, html_options = {})
... ... @@ -128,143 +132,93 @@ module ApplicationHelper
128 132 def search_contents_menu
129 133 return super unless theme_responsive?
130 134  
131   - host = environment.default_hostname
132   -
133   - output = '<li class="dropdown">'
134   - output += link_to(_('Contents'), '#', :class=>"dropdown-toggle icon-menu-articles", title: _('Contents'), :'data-toggle'=>"dropdown", :'data-hover'=>"dropdown")
135   - output += '<ul class="dropdown-menu" role="menu">'
136   -
137   - output += '<li>' + link_to(_('All contents'), {host: host, controller: "search", action: 'contents', category_path: ''}) + '</li>'
138   -
  135 + host = environment.default_hostname
139 136 links = [
140   - {s_('contents|More recent') => {:href => url_for({host: host, :controller => 'search', :action => 'contents', :filter => 'more_recent'})}},
141   - {s_('contents|More viewed') => {:href => url_for({host: host, :controller => 'search', :action => 'contents', :filter => 'more_popular'})}},
142   - {s_('contents|Most commented') => {:href => url_for({host: host, :controller => 'search', :action => 'contents', :filter => 'more_comments'})}}
  137 + [_('All contents'), {host: host, controller: :search, action: :contents, category_path: ''}],
  138 + [s_('contents|More recent'), {host: host, controller: :search, action: :contents, filter: 'more_recent'}],
  139 + [s_('contents|More viewed'), {host: host, controller: :search, action: :contents, filter: 'more_popular'}],
  140 + [s_('contents|Most commented'), {host: host, controller: :search, action: :contents, filter: 'more_comments'}],
143 141 ]
144 142 if logged_in?
145   - links.push(_('New content') => modal_options({href: url_for({controller: 'cms', action: 'new', profile: current_user.login, cms: true})}))
  143 + links.push [_('New content'), '', modal_options({href: url_for({controller: 'cms', action: 'new', profile: current_user.login, cms: true})})]
146 144 end
147 145  
148   - links.each do |link|
149   - link.each do |name, options|
150   - output += content_tag(:li,content_tag(:a,name,options))
151   - end
  146 + content_tag :li, class: 'dropdown' do
  147 + [
  148 + link_to('#', class: 'dropdown-toggle icon-menu-articles', title: _('Contents'), data: {toggle: 'dropdown', hover: 'dropdown'}) do
  149 + content_tag :span, _('Contents')
  150 + end,
  151 + content_tag(:ul, class: 'dropdown-menu', role: 'menu') do
  152 + links.map do |(name, url)|
  153 + content_tag :li do
  154 + link_to name, url
  155 + end
  156 + end.safe_join
  157 + end,
  158 + ].safe_join
152 159 end
153   -
154   - output += '</ul>'
155   - output += '</li>'
156   - output
157 160 end
158 161  
159 162 def search_people_menu
160 163 return super unless theme_responsive?
161 164  
162   - host = environment.default_hostname
163   -
164   - output = '<li class="dropdown">'
165   - output += link_to(_('People'), '#', :class=>"dropdown-toggle icon-menu-people", title: _('People'), :'data-toggle'=>"dropdown", :'data-hover'=>"dropdown")
166   - output += '<ul class="dropdown-menu" role="menu">'
167   -
168   - output += '<li>' + link_to(_('All people'), {host: host, controller: "search", action: 'people', category_path: ''}) + '</li>'
169   -
  165 + host = environment.default_hostname
170 166 links = [
171   - {s_('people|More recent') => {:href => url_for({host: host, :controller => 'search', :action => 'people', :filter => 'more_recent'})}},
172   - {s_('people|More active') => {:href => url_for({host: host, :controller => 'search', :action => 'people', :filter => 'more_active'})}},
173   - {s_('people|More popular') => {:href => url_for({host: host, :controller => 'search', :action => 'people', :filter => 'more_popular'})}}
  167 + [_('All people'), {host: host, controller: :search, action: :people, category_path: ''}],
  168 + [s_('people|More recent'), {host: host, controller: :search, action: :people, filter: 'more_recent'}],
  169 + [s_('people|More active'), {host: host, controller: :search, action: :people, filter: 'more_active'}],
  170 + [s_('people|More popular'), {host: host, controller: :search, action: :people, filter: 'more_popular'}],
174 171 ]
175 172 if logged_in?
176   - links.push(_('My friends') => {href: url_for({profile: current_user.login, controller: 'friends'})})
177   - links.push(_('Invite friends') => {href: url_for({profile: current_user.login, controller: 'invite', action: 'friends'})})
  173 + links.push [_('My friends'), {profile: current_user.login, controller: 'friends'}]
  174 + links.push [_('Invite friends'), {profile: current_user.login, controller: 'invite', action: 'friends'}]
178 175 end
179 176  
180   - links.each do |link|
181   - link.each do |name, url|
182   - output += '<li><a href="'+url[:href]+'">' + name + '</a></li>'
183   - end
  177 + content_tag :li, class: 'dropdown' do
  178 + [
  179 + link_to('#', class: "dropdown-toggle icon-menu-people", title: _('People'), data: {toggle: 'dropdown', hover: 'dropdown'}) do
  180 + content_tag :span, _('People')
  181 + end,
  182 + content_tag(:ul, class: 'dropdown-menu', role: 'menu') do
  183 + links.map do |params|
  184 + content_tag :li do
  185 + link_to *params
  186 + end
  187 + end.safe_join
  188 + end
  189 + ].safe_join
184 190 end
185   -
186   - output += '</ul>'
187   - output += '</li>'
188   - output
189 191 end
190 192  
191 193 def search_communities_menu
192 194 return super unless theme_responsive?
193 195  
194   - host = environment.default_hostname
195   -
196   - output = '<li class="dropdown">'
197   - output += link_to(_('Communities'), '#', :class=>"dropdown-toggle icon-menu-community", title: _('Communities'), :'data-toggle'=>"dropdown", :'data-hover'=>"dropdown")
198   - output += '<ul class="dropdown-menu" role="menu">'
199   -
200   - output += '<li>' + link_to(_('All communities'), {host: host, controller: "search", action: 'communities', category_path: ''}) + '</li>'
201   -
  196 + host = environment.default_hostname
202 197 links = [
203   - {s_('communities|More recent') => {:href => url_for({host: host, :controller => 'search', :action => 'communities', :filter => 'more_recent'})}},
204   - {s_('communities|More active') => {:href => url_for({host: host, :controller => 'search', :action => 'communities', :filter => 'more_active'})}},
205   - {s_('communities|More popular') => {:href => url_for({host: host, :controller => 'search', :action => 'communities', :filter => 'more_popular'})}}
  198 + [_('All communities'), {host: host, controller: :search, action: :communities, category_path: ''}],
  199 + [s_('communities|More recent'), {host: host, controller: :search, action: :communities, filter: 'more_recent'}],
  200 + [s_('communities|More active'), {host: host, controller: :search, action: :communities, filter: 'more_active'}],
  201 + [s_('communities|More popular'), {host: host, controller: :search, action: :communities, filter: 'more_popular'}],
206 202 ]
207 203 if logged_in?
208   - links.push(_('My communities') => {href: url_for({profile: current_user.login, controller: 'memberships'})})
209   - links.push(_('New community') => {href: url_for({profile: current_user.login, controller: 'memberships', action: 'new_community'})})
  204 + links.push [_('My communities'), {profile: current_user.login, controller: 'memberships'}]
  205 + links.push [_('New community'), {profile: current_user.login, controller: 'memberships', action: 'new_community'}]
210 206 end
211 207  
212   - links.each do |link|
213   - link.each do |name, url|
214   - output += '<li><a href="'+url[:href]+'">' + name + '</a></li>'
215   - end
216   - end
217   -
218   - output += '</ul>'
219   - output += '</li>'
220   - output
221   - end
222   -
223   - def usermenu_logged_in
224   - return super unless theme_responsive?
225   -
226   - output = '<li class="dropdown">'
227   -
228   - pending_tasks_count = ''
229   - count = user ? Task.to(user).pending.count : -1
230   - if count > 0
231   - pending_tasks_count = "<span class=\"badge\" onclick=\"document.location='#{url_for(user.tasks_url)}'\" title=\"#{_("Manage your pending tasks")}\">" + count.to_s + '</span>'
  208 + content_tag :li, class: 'dropdown' do
  209 + [
  210 + link_to('#', class: 'dropdown-toggle icon-menu-community', title: _('Communities'), data: {toggle: 'dropdown', hover: 'dropdown'}) do
  211 + content_tag :span, _('Communities')
  212 + end,
  213 + content_tag(:ul, class: 'dropdown-menu', role: 'menu') do
  214 + links.map do |params|
  215 + content_tag :li do
  216 + link_to *params
  217 + end
  218 + end.safe_join
  219 + end
  220 + ].safe_join
232 221 end
233   -
234   - output += link_to("<img class=\"menu-user-gravatar\" src=\"#{user.profile_custom_icon(gravatar_default)}\"><strong>#{user.identifier}</strong> #{pending_tasks_count}", '#', id: "homepage-link", title: _('Go to your homepage'), :class=>"dropdown-toggle", :'data-toggle'=>"dropdown", :'data-target'=>"", :'data-hover'=>"dropdown")
235   -
236   -
237   - output += '<ul class="dropdown-menu" role="menu">'
238   - output += '<li>' + link_to('<span class="icon-person">'+_('Profile')+'</span>', user.public_profile_url, id: "homepage-link", title: _('Go to your homepage')) + '</li>'
239   -
240   - output += '<li class="divider"></li>'
241   -
242   - #TODO
243   - #render_environment_features(:usermenu) +
244   -
245   - #admin_link
246   - admin_link_str = admin_link
247   - output += admin_link_str.present? ? '<li>' + admin_link_str + '</li>' : ''
248   -
249   - #control_panel link
250   - output += '<li>' + 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")) + '</li>'
251   -
252   - output += chat_user_status_menu('icon-menu-offline', _('Offline'))
253   -
254   - #manage_enterprises
255   - manage_enterprises_str = manage_enterprises
256   - output += manage_enterprises_str.present? ? '<li>' + manage_enterprises_str + '</li>' : ''
257   -
258   - #manage_communities
259   - manage_communities_str = manage_communities
260   - output += manage_communities_str.present? ? '<li>' + manage_communities_str + '</li>' : ''
261   -
262   - output += '<li class="divider"></li>'
263   -
264   - output += '<li>' + link_to('<i class="icon-menu-logout"></i><strong>' + _('Logout') + '</strong>', { controller: 'account', action: 'logout'} , id: "logout", title: _("Leave the system")) + '</li>'
265   -
266   - output += '</ul>'
267   - output
268 222 end
269 223  
270 224 def manage_link(list, kind, title)
... ... @@ -274,17 +228,22 @@ module ApplicationHelper
274 228 link_to_all = nil
275 229 if list.count > 5
276 230 list = list.first(5)
277   - link_to_all = link_to(content_tag('strong', _('See all')), :controller => 'memberships', :profile => user.identifier)
  231 + link_to_all = link_to(content_tag(:strong, _('See all')), controller: 'memberships', profile: user.identifier)
278 232 end
279 233 link = list.map do |element|
280   - link_to(content_tag('strong', element.short_name(25)), element.admin_url, :class => "icon-menu-"+element.class.identification.underscore, :title => _('Manage %s') % element.short_name)
  234 + link_to(content_tag(:strong, element.short_name(25)), element.admin_url, class: "icon-menu-"+element.class.identification.underscore, title: _('Manage %s') % element.short_name)
281 235 end
282 236 if link_to_all
283 237 link << link_to_all
284 238 end
285   - content_tag('li', nil, class: 'divider') +
286   - content_tag('li', title, class: 'dropdown-header') +
287   - link.map{ |l| content_tag 'li', l }.join
  239 +
  240 + [
  241 + content_tag(:li, nil, class: 'divider'),
  242 + content_tag(:li, title, class: 'dropdown-header'),
  243 + link.map do |l|
  244 + content_tag :li, l
  245 + end.safe_join
  246 + ].safe_join
288 247 end
289 248 end
290 249  
... ... @@ -301,15 +260,24 @@ module ApplicationHelper
301 260 unless html_options[:style].present? and html_options[:style] =~ /display *: *none/
302 261 menu_content << '<br/>' unless first
303 262 first = false
304   - menu_content << content_tag(:a,link_label,html_options)
  263 + menu_content << content_tag(:a, link_label,html_options)
305 264 end
306 265 end
307 266 end
308 267 end
309 268  
310 269 option = html_options.delete(:option) || 'default'
311   - size = html_options.delete(:size) || 'xs'
312   - "<button class='btn btn-#{size} btn-#{option} btn-popover-menu icon-parent-folder' data-toggle='popover' data-html='true' data-placement='top' data-trigger='focus' data-content=\""+CGI::escapeHTML(menu_content)+'" data-title="'+menu_title+'"></button>'
  270 + size = html_options.delete(:size) || 'xs'
  271 + button_tag '',
  272 + class: "btn btn-#{size} btn-#{option} btn-popover-menu icon-parent-folder",
  273 + data: {
  274 + html: 'true',
  275 + toggle: 'popover',
  276 + placement: 'top',
  277 + trigger: 'focus',
  278 + content: menu_content,
  279 + title: menu_title,
  280 + }
313 281 end
314 282  
315 283  
... ... @@ -406,12 +374,7 @@ module ApplicationHelper
406 374 end
407 375  
408 376 include ResponsiveChecks
409   - if RUBY_VERSION >= '2.0.0'
410   - prepend ResponsiveMethods
411   - else
412   - extend ActiveSupport::Concern
413   - included { include ResponsiveMethods }
414   - end
  377 + prepend ResponsiveMethods
415 378  
416 379 # TODO: apply theme_responsive? condition
417 380 class NoosferoFormBuilder
... ... @@ -440,13 +403,16 @@ module ApplicationHelper
440 403  
441 404 if options[:horizontal]
442 405 label_html = content_tag :label, gettext(text), class: 'control-label col-sm-3 col-md-2 col-lg-2', for: field_id
443   - result = content_tag :div, label_html + content_tag('div',field_html, class: 'col-sm-9 col-md-6 col-lg-6'), class: 'form-group'
  406 + content = [
  407 + label_html,
  408 + content_tag(:div, field_html.html_safe, class: 'col-sm-9 col-md-6 col-lg-6'),
  409 + ].safe_join
  410 + content_tag :div, content, class: 'form-group'
444 411 else
445 412 label_html = content_tag :label, gettext(text), class: 'control-label', for: field_id
446   - result = content_tag :div, label_html + field_html, class: 'form-group'
  413 + content = [label_html, field_html.html_safe].safe_join
  414 + content_tag :div, content, class: 'form-group'
447 415 end
448   -
449   - result
450 416 end
451 417 end
452 418  
... ...
plugins/responsive/lib/ext/boxes_helper.rb
... ... @@ -62,12 +62,7 @@ module BoxesHelper
62 62 end
63 63  
64 64 include ResponsiveChecks
65   - if RUBY_VERSION >= '2.0.0'
66   - prepend ResponsiveMethods
67   - else
68   - extend ActiveSupport::Concern
69   - included { include ResponsiveMethods }
70   - end
  65 + prepend ResponsiveMethods
71 66  
72 67 end
73 68  
... ...
plugins/responsive/lib/ext/chat_helper.rb
... ... @@ -23,12 +23,7 @@ module ChatHelper
23 23 end
24 24  
25 25 include ResponsiveChecks
26   - if RUBY_VERSION >= '2.0.0'
27   - prepend ResponsiveMethods
28   - else
29   - extend ActiveSupport::Concern
30   - included { include ResponsiveMethods }
31   - end
  26 + prepend ResponsiveMethods
32 27  
33 28 end
34 29  
... ...
plugins/responsive/lib/ext/forms_helper.rb
... ... @@ -11,8 +11,15 @@ module FormsHelper
11 11 return super unless theme_responsive?
12 12  
13 13 options[:id] ||= 'radio-' + FormsHelper.next_id_number
14   - content_tag( 'label', radio_button_tag( name, value, checked, options ) + ' ' +
15   - human_name, for: options[:id], class: 'radio-inline' )
  14 + content_tag :div, class:'radio-inline' do
  15 + content_tag :label, for: options[:id] do
  16 + [
  17 + radio_button_tag(name, value, checked, options),
  18 + ' ',
  19 + human_name,
  20 + ].safe_join
  21 + end
  22 + end
16 23 end
17 24  
18 25 # add -inline class
... ... @@ -20,8 +27,18 @@ module FormsHelper
20 27 return super unless theme_responsive?
21 28  
22 29 options[:id] ||= 'checkbox-' + FormsHelper.next_id_number
23   - hidden_field_tag(name, '0') +
24   - content_tag( 'label', check_box_tag( name, value, checked, options ) + ' ' + human_name, for: options[:id], class: 'checkbox-inline')
  30 + [
  31 + hidden_field_tag(name, '0'),
  32 + content_tag(:div, class:'checkbox-inline') do
  33 + content_tag :label, for: options[:id] do
  34 + [
  35 + check_box_tag(name, value, checked, options),
  36 + ' ',
  37 + human_name,
  38 + ].safe_join
  39 + end
  40 + end
  41 + ].safe_join
25 42 end
26 43  
27 44 def submit_button(type, label, html_options = {})
... ... @@ -43,42 +60,34 @@ module FormsHelper
43 60 html_options.delete(:cancel)
44 61 bt_submit = button_tag(label, html_options.merge(class: the_class))
45 62  
46   - bt_submit + bt_cancel
  63 + [bt_submit + bt_cancel].safe_join
47 64 end
48 65  
49   - %w[select select_tag text_field_tag number_field_tag password_field_tag].each do |method|
50   - define_method method do |*args, &block|
51   - #return super(*args, &block) unless theme_responsive?
  66 + bt_submit + bt_cancel
  67 + end
52 68  
53   - options = args.extract_options!
54   - if options['class']
55   - options['class'] = "#{options['class']} form-control"
56   - else
57   - options[:class] = "#{options[:class]} form-control"
58   - end
59   - super(*(args << options), &block)
  69 + %w[
  70 + select_tag
  71 + text_field_tag text_area_tag
  72 + number_field_tag password_field_tag url_field_tag email_field_tag
  73 + month_field_tag date_field_tag
  74 + ].each do |method|
  75 + define_method method do |name, value=nil, options={}, &block|
  76 + responsive_add_field_class! options
  77 + super(name, value, options, &block).html_safe
60 78 end
61 79 end
62 80 %w[select_month select_year].each do |method|
63 81 define_method method do |date, options={}, html_options={}|
64   - if html_options['class']
65   - html_options['class'] = "#{html_options['class']} form-control"
66   - else
67   - html_options[:class] = "#{html_options[:class]} form-control"
68   - end
69   - super date, options, html_options
  82 + responsive_add_field_class! html_options
  83 + super(date, options, html_options).html_safe
70 84 end
71 85 end
72 86  
73 87 end
74 88  
75 89 include ResponsiveChecks
76   - if RUBY_VERSION >= '2.0.0'
77   - prepend ResponsiveMethods
78   - else
79   - extend ActiveSupport::Concern
80   - included { include ResponsiveMethods }
81   - end
  90 + prepend ResponsiveMethods
82 91  
83 92 end
84 93  
... ...
plugins/responsive/lib/ext/input_helper.rb
... ... @@ -4,16 +4,15 @@ module InputHelper
4 4 protected
5 5  
6 6 def input_group_addon addon, options = {}, &block
7   - content_tag :div,
8   - content_tag(:span, addon, class: 'input-group-addon') + yield,
9   - class: 'input-group'
  7 + content_tag :div, class: 'input-group' do
  8 + [
  9 + content_tag(:span, addon, class: 'input-group-addon'),
  10 + capture(&block),
  11 + ].safe_join
  12 + end
10 13 end
11 14  
12 15 end
13 16  
14   -module ApplicationHelper
15   -
16   - include InputHelper
17   -
18   -end
  17 +ApplicationHelper.include InputHelper
19 18  
... ...
plugins/responsive/lib/responsive_plugin.rb
... ... @@ -13,7 +13,7 @@ class ResponsivePlugin &lt; Noosfero::Plugin
13 13 end
14 14  
15 15 def head_ending
16   - '<meta name="viewport" content="width=device-width, initial-scale=1">'
  16 + '<meta name="viewport" content="width=device-width, initial-scale=1">'.html_safe
17 17 end
18 18  
19 19 def body_ending
... ...
plugins/responsive/views/invite/select_friends.html.erb
... ... @@ -39,7 +39,7 @@
39 39 <%= labelled_form_field(_('Invitation text:'), text_area_tag(:mail_template, @mail_template, :cols => 72, :rows => 8)) %>
40 40 </div>
41 41  
42   - <% button_bar do %>
  42 + <%= button_bar do %>
43 43 <%= submit_button(:ok, _("Invite my friends!")) %>
44 44 <% end %>
45 45 <% end %>
... ...
plugins/responsive/views/layouts/_menu_responsive.html.erb
... ... @@ -1,71 +0,0 @@
1   -<div>
2   -<nav id="top-bar" class="navbar navbar-default" role="navigation">
3   - <div class="container">
4   - <!-- Brand and toggle get grouped for better mobile display -->
5   - <div class="navbar-header">
6   - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar-user-collapse">
7   - <span class="sr-only"><%= _('User menu') %></span>
8   - <span class="fa fa-user navbar-toggle-icon"></span>
9   - </button>
10   - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar-search-collapse">
11   - <span class="sr-only"><%= _('Search') %></span>
12   - <span class="fa fa-search navbar-toggle-icon"></span>
13   - </button>
14   - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar-navigation-collapse">
15   - <span class="sr-only"><%= _('Navigation') %></span>
16   - <span class="icon-bar"></span>
17   - <span class="icon-bar"></span>
18   - <span class="icon-bar"></span>
19   - </button>
20   -
21   - </div>
22   -
23   - <!-- Collect the nav links, forms, and other content for toggling -->
24   - <div class="collapse navbar-collapse" id="navbar-navigation-collapse">
25   - <ul class="nav navbar-nav menu-navigation">
26   - <%= theme_extra_navigation %>
27   - <li class="dropdown" id="search-dropdown-menu">
28   - <a href="#" class="dropdown-toggle icon-search" data-hover="dropdown" data-toggle="dropdown" title="<%= _('Search') %>"><span><%= _('Search') %></span></a>
29   - <ul class="dropdown-menu" role="menu">
30   - <li>
31   - <form action="/search" id="top-search" method="get" role="search">
32   - <div class="form-group col-lg-12 col-md-12 col-sm-12">
33   - <input name="query" title="<%=_('Search...')%>" placeholder="<%=_('Search...')%>" type="text" class="form-control input-sm"/>
34   - </div>
35   - </form>
36   - </li>
37   - </ul>
38   - </li>
39   - </ul>
40   - </div>
41   - <div class="collapse navbar-collapse" id="navbar-search-collapse">
42   - <form action="/search" id="top-search" class="navbar-form navbar-left" method="get" role="search">
43   - <div class="form-group">
44   - <input name="query" title="<%=_('Search...')%>" placeholder="<%=_('Search...')%>" type="text" class="form-control"/>
45   - </div>
46   - </form>
47   - </div>
48   - <div class="collapse navbar-collapse" id="navbar-user-collapse">
49   - <ul class="nav navbar-nav pull-right">
50   - <% if user.present? %>
51   - <%= usermenu_logged_in %>
52   - <% else %>
53   - <li>
54   - <%= modal_inline_link_to('<i class="icon-menu-login"></i><strong>' + _('Login') + '</strong>', login_url, '#inlineLoginBox', :id => 'link_login') %>
55   - <%= @plugins.dispatch(:alternative_authentication_link).collect { |content| instance_exec(&content) }.join("") #TODO review this
56   - %>
57   - </li>
58   - <% unless @plugins.dispatch(:allow_user_registration).include?(false) %>
59   - <li>
60   - <%= link_to('<strong>' + _('Sign up') + '</strong>', :controller => 'account', :action => 'signup')%>
61   - </li>
62   - <% end %>
63   - <% end %>
64   - </ul>
65   - </div><!-- /.navbar-collapse -->
66   - </div><!-- /.container-fluid -->
67   -</nav>
68   -</div>
69   -<div id='inlineLoginBox' style='display: none;'>
70   - <%= render :file => 'account/login', :locals => { :is_thickbox => true } %>
71   -</div>
plugins/responsive/views/layouts/_menu_responsive.html.slim 0 → 100644
... ... @@ -0,0 +1,54 @@
  1 +div
  2 + nav#top-bar.navbar.navbar-default.navbar-static-top role="navigation"
  3 + .container
  4 + /! Brand and toggle get grouped for better mobile display
  5 + .navbar-header
  6 + button.navbar-toggle data-target="#navbar-user-collapse" data-toggle="collapse" type="button"
  7 + span.sr-only= _('User menu')
  8 + span.fa.fa-user.navbar-toggle-icon
  9 +
  10 + button.navbar-toggle data-target="#navbar-search-collapse" data-toggle="collapse" type="button"
  11 + span.sr-only= _('Search')
  12 + span.fa.fa-search.navbar-toggle-icon
  13 +
  14 + button.navbar-toggle data-target="#navbar-navigation-collapse" data-toggle="collapse" type="button"
  15 + span.sr-only= _('Navigation')
  16 + span.icon-bar
  17 + span.icon-bar
  18 + span.icon-bar
  19 + a.navbar-brand href="#{environment.top_url}"
  20 + = theme_site_title
  21 + span#navbar-brand-site-title
  22 + = h @environment.name
  23 +
  24 + /! Collect the nav links, forms, and other content for toggling
  25 + #navbar-navigation-collapse.collapse.navbar-collapse
  26 + ul.nav.navbar-nav.menu-navigation
  27 + = theme_extra_navigation
  28 + li#search-dropdown-menu.dropdown
  29 + a.dropdown-toggle.icon-search data-hover="dropdown" data-toggle="dropdown" href="#" title="#{_('Search')}"
  30 + span= _('Search')
  31 + ul.dropdown-menu role="menu"
  32 + li
  33 + form#top-search action="/search" method="get" role="search"
  34 + .form-group.col-lg-12.col-md-12.col-sm-12
  35 + input.form-control.input-sm name="query" placeholder="#{_('Search...')}" title="#{_('Search...')}" type="text" /
  36 +
  37 + #navbar-search-collapse.collapse.navbar-collapse
  38 + form#top-search.navbar-form.navbar-left action="/search" method="get" role="search"
  39 + .form-group
  40 + input.form-control name="query" placeholder="#{_('Search...')}" title="#{_('Search...')}" type="text" /
  41 +
  42 + #navbar-user-collapse.collapse.navbar-collapse
  43 + ul.nav.navbar-nav.pull-right
  44 + - if user.present?
  45 + = render 'layouts/usermenu_logged_in'
  46 + - else
  47 + li
  48 + = modal_inline_link_to "<i class='icon-menu-login'></i><strong>#{_('Login')}</strong>".html_safe, login_url, '#inlineLoginBox', id: 'link_login'
  49 + = @plugins.dispatch(:alternative_authentication_link).collect{ |content| instance_exec(&content) }.safe_join
  50 + - unless @plugins.dispatch(:allow_user_registration).include? false
  51 + li= link_to content_tag(:strong, _('Sign up')), controller: :account, action: :signup
  52 +
  53 +#inlineLoginBox style="display: none;"
  54 + = render file: 'account/login', locals: {is_thickbox: true}
... ...
plugins/responsive/views/layouts/_usermenu_logged_in.html.slim 0 → 100644
... ... @@ -0,0 +1,39 @@
  1 +- pending_tasks_count = Task.to(user).pending.count if user
  2 +
  3 +li.dropdown
  4 + = link_to '#', id: "homepage-link", title: _('Go to your homepage'), class: 'dropdown-toggle', data: {toggle: 'dropdown', hover: 'dropdown'}
  5 + = image_tag user.profile_custom_icon(gravatar_default), class: 'menu-user-gravatar'
  6 + = content_tag :strong, user.identifier
  7 + - if pending_tasks_count
  8 + span class='badge' onclick="document.location='#{url_for(user.tasks_url)}'" title="#{_("Manage your pending tasks")}"
  9 + count
  10 +
  11 + ul class='dropdown-menu' role='menu'
  12 + li
  13 + = link_to user.public_profile_url, id: "homepage-link", title: _('Go to your homepage')
  14 + span class='icon-person' = _('Profile')
  15 + li.divider
  16 +
  17 + /TODO
  18 + /= render_environment_features(:usermenu)
  19 +
  20 + li = admin_link
  21 +
  22 + li
  23 + = link_to user.admin_url, class: 'ctrl-panel', title: _("Configure your personal account and content")
  24 + i class='icon-menu-ctrl-panel'
  25 + strong = _('Control panel')
  26 +
  27 + - if environment.enabled? 'xmpp_chat'
  28 + = responsive_chat_user_status_menu 'icon-menu-offline', _('Offline')
  29 +
  30 + li = manage_enterprises
  31 + li = manage_communities
  32 +
  33 + li.divider
  34 +
  35 + li
  36 + = link_to({controller: 'account', action: 'logout'}, id: "logout", title: _("Leave the system"))
  37 + i class='icon-menu-logout'
  38 + strong = _('Logout')
  39 +
... ...
plugins/responsive/views/layouts/application-responsive.html.erb
1 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2 2 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<%= html_language %>" lang="<%= html_language %>" class="<%= h html_tag_classes %>">
3 3 <head>
4   - <title><%= h page_title %></title>
  4 + <title><%= h page_title.html_safe %></title>
5 5 <%= yield(:feeds) %>
6 6 <!--<meta http-equiv="refresh" content="1"/>-->
7 7 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
... ... @@ -22,7 +22,7 @@
22 22 <%=
23 23 @plugins.dispatch(:head_ending).map do |content|
24 24 if content.respond_to?(:call) then instance_exec(&content).to_s.html_safe else content.to_s.html_safe end
25   - end.join("\n")
  25 + end.safe_join
26 26 %>
27 27  
28 28 <script type="text/javascript">
... ... @@ -68,7 +68,7 @@
68 68 <%=
69 69 @plugins.dispatch(:body_ending).map do |content|
70 70 if content.respond_to?(:call) then instance_exec(&content).html_safe else content.html_safe end
71   - end.join("\n")
  71 + end.safe_join
72 72 %>
73 73 </body>
74 74 </html>
... ...
plugins/responsive/views/manage_products/_edit_name.html.erb
... ... @@ -12,7 +12,7 @@
12 12 </div>
13 13 </div>
14 14  
15   - <% button_bar do %>
  15 + <%= button_bar do %>
16 16 <%= submit_button :save, _('Save') %>
17 17 <%= cancel_edit_product_link(@product, 'name') %>
18 18 <% end %>
... ...
plugins/send_email/views/send_email_plugin_admin/index.html.erb
... ... @@ -3,7 +3,7 @@
3 3 <%= form_for :environment, :url => {:action => 'index'}, :html => {:method => 'post'} do |f| %>
4 4 <%= labelled_form_field(_("E-Mail addresses you want to allow to send"), f.text_area(:send_email_plugin_allow_to, :rows => 8)) %>
5 5 <small><%= _('(list of email addresses separated by comma)') %></small>
6   - <% button_bar do %>
  6 + <%= button_bar do %>
7 7 <%= submit_button 'save', c_('Save'), :cancel => {:controller => 'plugins'} %>
8 8 <% end %>
9 9 <% end %>
... ...
plugins/site_tour/views/site_tour_plugin_admin/index.html.erb
... ... @@ -5,7 +5,7 @@
5 5 <%= labelled_form_field _('Tooltips (CSV format: language, group name, selector, description)'), f.text_area(:actions_csv, :style => 'width: 100%', :class => 'actions-csv') %>
6 6 <%= labelled_form_field _('Group Triggers (CSV format: group name, selector, event (e.g. mouseenter, click))'), f.text_area(:group_triggers_csv, :style => 'width: 100%', :class => 'groups-csv', :rows => 7) %>
7 7  
8   - <% button_bar do %>
  8 + <%= button_bar do %>
9 9 <%= submit_button(:save, _('Save'), :cancel => {:controller => 'plugins', :action => 'index'}) %>
10 10 <% end %>
11 11  
... ...
plugins/sniffer/views/sniffer_plugin_myprofile/edit.html.erb
... ... @@ -16,7 +16,7 @@
16 16  
17 17 </div>
18 18  
19   - <% button_bar do %>
  19 + <%= button_bar do %>
20 20 <%= submit_button(:save, _('Save')) %>
21 21 <%= button :back, _('Back to control panel'), controller: 'profile_editor' %>
22 22 <% end %>
... ...
plugins/social_share_privacy/test/unit/social_share_privacy_test.rb
1 1 require 'test_helper'
2 2  
3   -class SocialSharePrivacyPluginTest < ActiveSupport::TestCase
  3 +class SocialSharePrivacyPluginTest < ActionView::TestCase
4 4  
5 5 include NoosferoTestHelper
6 6  
... ...
plugins/social_share_privacy/views/social_share_privacy_plugin_admin/index.html.erb
... ... @@ -38,7 +38,7 @@
38 38 <%= _('The same order in which you arrange the social networks here will be used for arranging the share buttons.') %>
39 39 </p>
40 40  
41   - <% button_bar do %>
  41 + <%= button_bar do %>
42 42 <%= submit_button 'save', _('Save'), :cancel => {:controller => 'plugins', :action => 'index'} %>
43 43 <% end %>
44 44 <% end %>
... ...
plugins/spaminator/views/spaminator_plugin_admin/index.html.erb
... ... @@ -30,7 +30,7 @@
30 30 <%= button(:cancel, _('Withhold'), {:action => 'withhold'}, :title => _('Cancel next scheduled scans')) if @settings.deployed %>
31 31 <% end %>
32 32  
33   - <% button_bar do %>
  33 + <%= button_bar do %>
34 34 <%= submit_button(:save, c_('Save'), :cancel => {:controller => 'plugins', :action => 'index'}) %>
35 35 <% end %>
36 36 </div>
... ...
plugins/spaminator/views/spaminator_plugin_admin/reports.html.erb
... ... @@ -29,6 +29,6 @@
29 29  
30 30 <br style='clear: both'/>
31 31  
32   -<% button_bar do %>
  32 +<%= button_bar do %>
33 33 <%= button(:back, c_('Back'), :action => 'index') %>
34 34 <% end %>
... ...
plugins/statistics/lib/statistics_block.rb
... ... @@ -93,6 +93,7 @@ class StatisticsBlock &lt; Block
93 93 end
94 94  
95 95 def products
  96 + return [] unless environment.plugin_enabled?('ProductsPlugin')
96 97 if owner.kind_of?(Environment)
97 98 owner.products.where("profiles.enabled = true and profiles.visible = true").count
98 99 elsif owner.kind_of?(Enterprise)
... ...
plugins/statistics/test/unit/statistics_block_test.rb
... ... @@ -145,6 +145,7 @@ class StatisticsBlockTest &lt; ActiveSupport::TestCase
145 145  
146 146 b = StatisticsBlock.new
147 147 e = fast_create(Environment)
  148 + e.enable_plugin('ProductsPlugin')
148 149  
149 150 e1 = fast_create(Enterprise, :visible => true, :enabled => true, :environment_id => e.id)
150 151 e2 = fast_create(Enterprise, :visible => true, :enabled => false, :environment_id => e.id)
... ... @@ -168,6 +169,8 @@ class StatisticsBlockTest &lt; ActiveSupport::TestCase
168 169 b = StatisticsBlock.new
169 170  
170 171 e = fast_create(Enterprise)
  172 + environment = e.environment
  173 + environment.enable_plugin('ProductsPlugin')
171 174  
172 175 fast_create(Product, :profile_id => e.id)
173 176 fast_create(Product, :profile_id => e.id)
... ...
plugins/sub_organizations/views/sub_organizations_plugin_myprofile/index.html.erb
... ... @@ -10,7 +10,7 @@
10 10 <% end %>
11 11  
12 12 <%= form_tag do %>
13   - <% button_bar do %>
  13 + <%= button_bar do %>
14 14 <%= button(:add, _('Create a new sub-community'), :controller => 'memberships', :action => 'new_community', :profile => user.identifier, :sub_organizations_plugin_parent_to_be => profile.id) %>
15 15 <%= button :add, _('Register a new sub-enterprise'), :controller => 'enterprise_registration', :sub_organizations_plugin_parent_to_be => profile.id if environment.enabled?('enterprise_registration') %>
16 16 <% end %>
... ... @@ -21,7 +21,7 @@
21 21 :hint_text => _('Type in a search term for a group'),
22 22 :pre_populate => @tokenized_children}) %>
23 23  
24   - <% button_bar do %>
  24 + <%= button_bar do %>
25 25 <%= submit_button('save', c_('Save'))%>
26 26 <%= button('cancel', c_('Cancel'), {:controller => 'profile_editor'})%>
27 27 <% end %>
... ...
plugins/sub_organizations/views/sub_organizations_plugin_profile/_full_related_organizations.html.erb
... ... @@ -51,7 +51,7 @@
51 51 <%= pagination_links(organizations, {:param_name => 'npage', :page_links => true}) %>
52 52 </div>
53 53  
54   - <% button_bar(:class => "related-organizations-button-bar") do %>
  54 + <%= button_bar(:class => "related-organizations-button-bar") do %>
55 55 <%= button :back, c_('Go back'), { :controller => 'profile' } %>
56 56 <%= button :add, _("Add a new %s") % organization_type, :controller => 'sub_organizations_plugin_myprofile', :action => 'index' if logged_in? && user.has_permission?(:edit_profile, profile) && !environment.enabled?("disable_asset_#{organization_type.pluralize}") %>
57 57  
... ...
plugins/sub_organizations/views/sub_organizations_plugin_profile/_related_organizations.html.erb
... ... @@ -9,7 +9,7 @@
9 9 <% if organizations.length == 0 %>
10 10 <li><%= _("There are no sub-%s yet.") % organization_type.pluralize %></li>
11 11 <% end %>
12   - <% button_bar(:class => "related-organizations-button-bar") do %>
  12 + <%= button_bar(:class => "related-organizations-button-bar") do %>
13 13 <%= button :back, c_('Go back'), { :controller => 'profile' } %>
14 14 <%= button :add, _("Add a new %s") % organization_type, :controller => 'sub_organizations_plugin_myprofile', :action => 'index' if logged_in? && user.has_permission?(:edit_profile, profile) && !environment.enabled?("disable_asset_#{organization_type.pluralize}") %>
15 15  
... ...
plugins/suppliers/views/suppliers_plugin/manage_products/_distribution_tab.html.slim
... ... @@ -10,5 +10,5 @@
10 10 = check_box_tag "consumers[#{consumer.id}]", '1', distributed_consumers.include?(consumer.profile)
11 11 = label_tag "consumers[#{consumer.id}]", consumer.name
12 12  
13   - - button_bar do
  13 + = button_bar do
14 14 = submit_button :save, _('Save')
... ...
plugins/tolerance_time/views/tolerance_time_plugin_myprofile/index.html.erb
... ... @@ -11,13 +11,13 @@
11 11 f.text_field(:content_tolerance, :size => 2, :style => 'font-size: 14px; text-align: right') +
12 12 select_tag(:content_tolerance_unit, options_for_select(time_units, @content_default_unit) )) %>
13 13 <% end %>
14   - <%= labelled_form_field(_('Comment edition tolerance time'),
15   - f.text_field(:comment_tolerance, :size => 2, :style => 'font-size: 14px; text-align: right') +
  14 + <%= labelled_form_field(_('Comment edition tolerance time'),
  15 + f.text_field(:comment_tolerance, :size => 2, :style => 'font-size: 14px; text-align: right') +
16 16 select_tag(:comment_tolerance_unit, options_for_select(time_units, @comment_default_unit) )) %>
17 17  
18 18 <%= content_tag( 'small', _('Empty means unlimited and zero means right away.') ) %>
19 19  
20   - <% button_bar do %>
  20 + <%= button_bar do %>
21 21 <%= submit_button('save', c_('Save'))%>
22 22 <%= button('back', c_('Back'), {:controller => 'profile_editor'})%>
23 23 <% end %>
... ...
plugins/vote/views/vote_plugin_admin/index.html.erb
... ... @@ -13,7 +13,7 @@
13 13 <%= labelled_form_field _('Limit of voters to display:'), f.text_field(:voters_limit, :size => 3) %>
14 14 </strong>
15 15  
16   - <% button_bar do %>
  16 + <%= button_bar do %>
17 17 <%= submit_button(:save, c_('Save'), :cancel => {:controller => 'plugins', :action => 'index'}) %>
18 18 <% end %>
19 19  
... ...
plugins/work_assignment/views/work_assignment_plugin_myprofile/edit_visibility.html.erb
... ... @@ -12,7 +12,7 @@
12 12 <%= visibility_options(@article, @tokenized_children) %>
13 13 </div>
14 14  
15   - <% button_bar do %>
  15 + <%= button_bar do %>
16 16 <%= submit_button :save, _('Save') %>
17 17 <%= button :cancel, _('Cancel'), @back_to %>
18 18 <% end %>
... ...
test/api/activities_test.rb
... ... @@ -27,8 +27,8 @@ class ActivitiesTest &lt; ActiveSupport::TestCase
27 27 assert_equal 403, last_response.status
28 28 end
29 29  
30   - should 'not get community activities if not member' do
31   - community = fast_create(Community)
  30 + should 'not get community activities if not member and community is private' do
  31 + community = fast_create(Community, public_profile: false)
32 32 other_person = fast_create(Person)
33 33 community.add_member(other_person) # so there is an activity in community
34 34  
... ... @@ -68,6 +68,15 @@ class ActivitiesTest &lt; ActiveSupport::TestCase
68 68 assert_equivalent other_person.activities.map(&:activity).map(&:id), json["activities"].map{|c| c["id"]}
69 69 end
70 70  
  71 + should 'get activities for non logged user in a public community' do
  72 + community = fast_create(Community)
  73 + create_activity(community)
  74 + community.add_member(person)
  75 + get "/api/v1/profiles/#{community.id}/activities?#{params.to_query}"
  76 + json = JSON.parse(last_response.body)
  77 + assert_equivalent community.activities.map(&:activity).map(&:id), json["activities"].map{|c| c["id"]}
  78 + end
  79 +
71 80 def create_activity(target)
72 81 activity = ActionTracker::Record.create! :verb => :leave_scrap, :user => person, :target => target
73 82 ProfileActivity.create! profile_id: target.id, activity: activity
... ...
test/api/articles_test.rb
... ... @@ -7,6 +7,26 @@ class ArticlesTest &lt; ActiveSupport::TestCase
7 7 login_api
8 8 end
9 9  
  10 + should 'remove article' do
  11 + article = fast_create(Article, :profile_id => user.person.id, :name => "Some thing")
  12 + delete "/api/v1/articles/#{article.id}?#{params.to_query}"
  13 + json = JSON.parse(last_response.body)
  14 +
  15 + assert_not_equal 401, last_response.status
  16 + assert_equal true, json['success']
  17 +
  18 + assert !Article.exists?(article.id)
  19 + end
  20 +
  21 + should 'not remove article without permission' do
  22 + otherPerson = fast_create(Person, :name => "Other Person")
  23 + article = fast_create(Article, :profile_id => otherPerson.id, :name => "Some thing")
  24 + delete "/api/v1/articles/#{article.id}?#{params.to_query}"
  25 + json = JSON.parse(last_response.body)
  26 + assert_equal 403, last_response.status
  27 + assert Article.exists?(article.id)
  28 + end
  29 +
10 30 should 'list articles' do
11 31 article = fast_create(Article, :profile_id => user.person.id, :name => "Some thing")
12 32 get "/api/v1/articles/?#{params.to_query}"
... ... @@ -14,6 +34,17 @@ class ArticlesTest &lt; ActiveSupport::TestCase
14 34 assert_includes json["articles"].map { |a| a["id"] }, article.id
15 35 end
16 36  
  37 + should 'list all text articles' do
  38 + profile = Community.create(identifier: 'my-community', name: 'name-my-community')
  39 + a1 = fast_create(TextArticle, :profile_id => profile.id)
  40 + a2 = fast_create(TextileArticle, :profile_id => profile.id)
  41 + a3 = fast_create(TinyMceArticle, :profile_id => profile.id)
  42 + params['content_type']='TextArticle'
  43 + get "api/v1/communities/#{profile.id}/articles?#{params.to_query}"
  44 + json = JSON.parse(last_response.body)
  45 + assert_equal 3, json['articles'].count
  46 + end
  47 +
17 48 should 'get profile homepage' do
18 49 article = fast_create(Article, :profile_id => user.person.id, :name => "Some thing")
19 50 person.home_page=article
... ... @@ -104,6 +135,17 @@ class ArticlesTest &lt; ActiveSupport::TestCase
104 135 assert_equivalent [child1.id, child2.id], json["articles"].map { |a| a["id"] }
105 136 end
106 137  
  138 + should 'list all text articles of children' do
  139 + article = fast_create(Article, :profile_id => user.person.id, :name => "Some thing")
  140 + child1 = fast_create(TextArticle, :parent_id => article.id, :profile_id => user.person.id, :name => "Some thing 1")
  141 + child2 = fast_create(TextileArticle, :parent_id => article.id, :profile_id => user.person.id, :name => "Some thing 2")
  142 + child3 = fast_create(TinyMceArticle, :parent_id => article.id, :profile_id => user.person.id, :name => "Some thing 3")
  143 + get "/api/v1/articles/#{article.id}/children?#{params.to_query}"
  144 + json = JSON.parse(last_response.body)
  145 + assert_equivalent [child1.id, child2.id, child3.id], json["articles"].map { |a| a["id"] }
  146 + end
  147 +
  148 +
107 149 should 'list public article children for not logged in access' do
108 150 article = fast_create(Article, :profile_id => user.person.id, :name => "Some thing")
109 151 child1 = fast_create(Article, :parent_id => article.id, :profile_id => user.person.id, :name => "Some thing")
... ... @@ -744,4 +786,12 @@ class ArticlesTest &lt; ActiveSupport::TestCase
744 786 assert_not_includes json['article']['children'].map {|a| a['id']}, child.id
745 787 end
746 788  
  789 + should 'list article permissions when get an article' do
  790 + community = fast_create(Community)
  791 + give_permission(person, 'post_content', community)
  792 + article = fast_create(Article, :profile_id => community.id)
  793 + get "/api/v1/articles/#{article.id}?#{params.to_query}"
  794 + json = JSON.parse(last_response.body)
  795 + assert_includes json["article"]["permissions"], 'allow_post_content'
  796 + end
747 797 end
... ...
test/api/boxes_test.rb
... ... @@ -47,4 +47,46 @@ class BoxesTest &lt; ActiveSupport::TestCase
47 47 json = JSON.parse(last_response.body)
48 48 assert !json["boxes"].first["blocks"].first.key?('api_content')
49 49 end
  50 +
  51 + should 'get blocks from boxes' do
  52 + Environment.delete_all
  53 + environment = fast_create(Environment, :is_default => true)
  54 + box = fast_create(Box, :owner_id => environment.id, :owner_type => 'Environment')
  55 + block = fast_create(Block, box_id: box.id)
  56 + get "/api/v1/environments/default/boxes?#{params.to_query}"
  57 + json = JSON.parse(last_response.body)
  58 + assert_equal [block.id], json["boxes"].first["blocks"].map {|b| b['id']}
  59 + end
  60 +
  61 + should 'not list a block for not logged users' do
  62 + logout_api
  63 + profile = fast_create(Profile)
  64 + box = fast_create(Box, :owner_id => profile.id, :owner_type => Profile.name)
  65 + block = fast_create(Block, box_id: box.id)
  66 + block.display = 'never'
  67 + block.save!
  68 + get "/api/v1/profiles/#{profile.id}/boxes?#{params.to_query}"
  69 + json = JSON.parse(last_response.body)
  70 + assert_equal [], json["boxes"].first["blocks"].map {|b| b['id']}
  71 + end
  72 +
  73 + should 'list a block with logged in display_user for a logged user' do
  74 + profile = fast_create(Profile)
  75 + box = fast_create(Box, :owner_id => profile.id, :owner_type => Profile.name)
  76 + block = fast_create(Block, box_id: box.id)
  77 + block.display_user = 'logged'
  78 + block.save!
  79 + get "/api/v1/profiles/#{profile.id}/boxes?#{params.to_query}"
  80 + json = JSON.parse(last_response.body)
  81 + assert_equal [block.id], json["boxes"].first["blocks"].map {|b| b['id']}
  82 + end
  83 +
  84 + should 'not list boxes for user without permission' do
  85 + profile = fast_create(Profile, public_profile: false)
  86 + box = fast_create(Box, :owner_id => profile.id, :owner_type => Profile.name)
  87 + block = fast_create(Block, box_id: box.id)
  88 + get "/api/v1/profiles/#{profile.id}/boxes?#{params.to_query}"
  89 + json = JSON.parse(last_response.body)
  90 + assert_equal 403, last_response.status
  91 + end
50 92 end
... ...
test/api/comments_test.rb
... ... @@ -70,6 +70,16 @@ class CommentsTest &lt; ActiveSupport::TestCase
70 70 assert_equal body, json['comment']['body']
71 71 end
72 72  
  73 + should 'not create comment when an article does not accept comments' do
  74 + login_api
  75 + article = fast_create(Article, :profile_id => @local_person.id, :name => "Some thing", accept_comments: false)
  76 + body = 'My comment'
  77 + params.merge!({:body => body})
  78 + post "/api/v1/articles/#{article.id}/comments?#{params.to_query}"
  79 + json = JSON.parse(last_response.body)
  80 + assert_equal 403, last_response.status
  81 + end
  82 +
73 83 should 'logged user not comment an archived article' do
74 84 login_api
75 85 article = fast_create(Article, :profile_id => user.person.id, :name => "Some thing", :archived => true)
... ... @@ -186,4 +196,53 @@ class CommentsTest &lt; ActiveSupport::TestCase
186 196 assert_equal [comment1.id], json["comments"].map { |c| c['id'] }
187 197 end
188 198  
  199 + should 'delete comment successfully' do
  200 + login_api
  201 + article = fast_create(Article, profile_id: person.id, name: "Some thing")
  202 + comment = article.comments.create!(body: "some comment", author: person)
  203 + delete "api/v1/articles/#{article.id}/comments/#{comment.id}?#{params.to_query}"
  204 + json = JSON.parse(last_response.body)
  205 + assert_equal 200, last_response.status
  206 + assert_equal comment.id, json['comment']['id']
  207 + assert_not_includes article.comments, comment
  208 + end
  209 +
  210 + should 'not delete a comment when user is not logged' do
  211 + article = fast_create(Article, profile_id: person.id, name: "Some thing")
  212 + comment = article.comments.create!(body: "some comment", author: person)
  213 + delete "api/v1/articles/#{article.id}/comments/#{comment.id}?#{params.to_query}"
  214 + json = JSON.parse(last_response.body)
  215 + assert_equal 403, last_response.status
  216 + assert_includes article.comments, comment
  217 + end
  218 +
  219 + should 'not delete a comment when user does not have permission' do
  220 + login_api
  221 + article = fast_create(Article, profile_id: @local_person.id, name: "Some thing")
  222 + comment = article.comments.create!(body: "some comment", author: @local_person)
  223 + delete "api/v1/articles/#{article.id}/comments/#{comment.id}?#{params.to_query}"
  224 + json = JSON.parse(last_response.body)
  225 + assert_equal 403, last_response.status
  226 + assert_includes article.comments, comment
  227 + end
  228 +
  229 + should 'return not found when delete a inexistent comment' do
  230 + article = fast_create(Article, profile_id: person.id, name: "Some thing")
  231 + comment = article.comments.create!(body: "some comment", author: person)
  232 + delete "api/v1/articles/#{article.id}/comments/0?#{params.to_query}"
  233 + json = JSON.parse(last_response.body)
  234 + assert_equal 404, last_response.status
  235 + assert_includes article.comments, comment
  236 + end
  237 +
  238 + should 'return error when failed to delete comment' do
  239 + login_api
  240 + article = fast_create(Article, profile_id: person.id, name: "Some thing")
  241 + comment = article.comments.create!(body: "some comment", author: person)
  242 + Comment.any_instance.expects(:destroy).raises(StandardError)
  243 + delete "api/v1/articles/#{article.id}/comments/#{comment.id}?#{params.to_query}"
  244 + json = JSON.parse(last_response.body)
  245 + assert_equal 500, last_response.status
  246 + assert_includes article.comments, comment
  247 + end
189 248 end
... ...
test/api/helpers_test.rb
... ... @@ -99,7 +99,7 @@ class Api::HelpersTest &lt; ActiveSupport::TestCase
99 99 end
100 100  
101 101 should 'parse_content_type return all content types as an array' do
102   - assert_equivalent ['TextArticle','TinyMceArticle'], parse_content_type("TextArticle,TinyMceArticle")
  102 + assert_equivalent ['TextileArticle','TinyMceArticle'], parse_content_type("TextileArticle,TinyMceArticle")
103 103 end
104 104  
105 105 should 'find_article return article by id in list passed for user with permission' do
... ...
test/api/profiles_test.rb
... ... @@ -146,4 +146,49 @@ class ProfilesTest &lt; ActiveSupport::TestCase
146 146 refute json.has_key?('Rating')
147 147 end
148 148  
  149 + [Community, Enterprise].each do |klass|
  150 + should "update #{klass.name}" do
  151 + login_api
  152 + profile = fast_create(klass)
  153 + profile.add_admin(person)
  154 + params[:profile] = {}
  155 + params[:profile][:custom_header] = "Another Header"
  156 + post "/api/v1/profiles/#{profile.id}?#{params.to_query}"
  157 + assert_equal "Another Header", profile.reload.custom_header
  158 + end
  159 +
  160 + should "not update a #{klass.name} if user does not have permission" do
  161 + login_api
  162 + profile = fast_create(klass)
  163 + params[:profile] = {}
  164 + params[:profile][:custom_header] = "Another Header"
  165 + post "/api/v1/profiles/#{profile.id}?#{params.to_query}"
  166 + assert_equal 403, last_response.status
  167 + end
  168 +
  169 + should "not update a #{klass.name} if user is not logged in" do
  170 + profile = fast_create(klass)
  171 + params[:profile] = {}
  172 + params[:profile][:custom_header] = "Another Header"
  173 + post "/api/v1/profiles/#{profile.id}?#{params.to_query}"
  174 + assert_equal 401, last_response.status
  175 + end
  176 + end
  177 +
  178 + should 'update person' do
  179 + login_api
  180 + params[:profile] = {}
  181 + params[:profile][:custom_header] = "Another Header"
  182 + post "/api/v1/profiles/#{person.id}?#{params.to_query}"
  183 + assert_equal "Another Header", person.reload.custom_header
  184 + end
  185 +
  186 + should 'not update person information if user does not have permission' do
  187 + login_api
  188 + profile = fast_create(Person)
  189 + params[:profile] = {}
  190 + params[:profile][:custom_header] = "Another Header"
  191 + post "/api/v1/profiles/#{profile.id}?#{params.to_query}"
  192 + assert_equal 403, last_response.status
  193 + end
149 194 end
... ...
test/functional/application_controller_test.rb
... ... @@ -224,7 +224,7 @@ class ApplicationControllerTest &lt; ActionController::TestCase
224 224 end
225 225  
226 226 should 'display theme test panel when testing theme' do
227   - @request.session[:theme] = 'my-test-theme'
  227 + @request.session[:user_theme] = 'my-test-theme'
228 228 theme = mock
229 229 profile = mock
230 230 theme.expects(:owner).returns(profile).at_least_once
... ... @@ -506,6 +506,21 @@ class ApplicationControllerTest &lt; ActionController::TestCase
506 506 assert_redirected_to :controller => 'account', :action => 'login'
507 507 end
508 508  
  509 + should 'override user when current is an admin' do
  510 + user = create_user
  511 + other_user = create_user
  512 + environment = Environment.default
  513 + login_as user.login
  514 + @controller.stubs(:environment).returns(environment)
  515 +
  516 + get :index, override_user: other_user.id
  517 + assert_equal user, assigns(:current_user)
  518 +
  519 + environment.add_admin user.person
  520 + get :index, override_user: other_user.id
  521 + assert_equal other_user, assigns(:current_user)
  522 + end
  523 +
509 524 should 'do not allow member not included in whitelist to access an restricted environment' do
510 525 user = create_user
511 526 e = Environment.default
... ... @@ -576,4 +591,36 @@ class ApplicationControllerTest &lt; ActionController::TestCase
576 591 assert_redirected_to :controller => 'test', :action => 'index', :profile => profile.identifier
577 592 end
578 593  
  594 + should 'set session theme if a params theme is passed as parameter' do
  595 + current_theme = 'my-test-theme'
  596 + environment = Environment.default
  597 + Theme.stubs(:system_themes).returns([Theme.new(current_theme)])
  598 + environment.themes = [current_theme]
  599 + environment.save!
  600 + assert_nil @request.session[:theme]
  601 + get :index, :theme => current_theme
  602 + assert_equal current_theme, @request.session[:theme]
  603 + end
  604 +
  605 + should 'set session theme only in environment available themes' do
  606 + environment = Environment.default
  607 + assert_nil @request.session[:theme]
  608 + environment.stubs(:theme_ids).returns(['another_theme'])
  609 + get :index, :theme => 'my-test-theme'
  610 + assert_nil @request.session[:theme]
  611 + end
  612 +
  613 + should 'unset session theme if not environment available themes is defined' do
  614 + environment = Environment.default
  615 + current_theme = 'my-test-theme'
  616 + Theme.stubs(:system_themes).returns([Theme.new(current_theme)])
  617 + environment.themes = [current_theme]
  618 + environment.save!
  619 + get :index, :theme => current_theme
  620 + assert_equal current_theme, @request.session[:theme]
  621 +
  622 + get :index, :theme => 'another_theme'
  623 + assert_nil @request.session[:theme]
  624 + end
  625 +
579 626 end
... ...
test/functional/cms_controller_test.rb
... ... @@ -528,7 +528,7 @@ class CmsControllerTest &lt; ActionController::TestCase
528 528 post :new, :type => TextileArticle.name, :profile => profile.identifier, :article => { :name => 'adding-categories-test', :category_ids => [ c1.id, c3.id, c3.id ] }
529 529  
530 530 saved = profile.articles.find_by(name: 'adding-categories-test')
531   - assert_equal [c1, c3], saved.categories.all
  531 + assert_equivalent [c1, c3], saved.categories.all
532 532 end
533 533  
534 534 should 'filter html with white_list from tiny mce article name' do
... ...
test/functional/profile_themes_controller_test.rb
... ... @@ -231,7 +231,7 @@ class ProfileThemesControllerTest &lt; ActionController::TestCase
231 231 theme = Theme.create('theme-under-test', :owner => profile)
232 232 post :start_test, :profile => 'testinguser', :id => 'theme-under-test'
233 233  
234   - assert_equal 'theme-under-test', session[:theme]
  234 + assert_equal 'theme-under-test', session[:user_theme]
235 235 assert_redirected_to :controller => 'content_viewer', :profile => 'testinguser', :action => 'view_page'
236 236 end
237 237  
... ... @@ -239,7 +239,7 @@ class ProfileThemesControllerTest &lt; ActionController::TestCase
239 239 theme = Theme.create('theme-under-test', :owner => profile)
240 240 post :stop_test, :profile => 'testinguser', :id => 'theme-under-test'
241 241  
242   - assert_nil session[:theme]
  242 + assert_nil session[:user_theme]
243 243 assert_redirected_to :action => 'index'
244 244 end
245 245  
... ...
test/integration/blocks_test.rb
... ... @@ -1,46 +0,0 @@
1   -require_relative "../test_helper"
2   -
3   -class BlocksTest < ActionDispatch::IntegrationTest
4   -
5   - def blog_on_article_block_bootstrap
6   - profile = fast_create(Profile)
7   - blog = fast_create(Blog, :name => 'Blog', :profile_id => profile.id)
8   - fast_create(TinyMceArticle, :name => "First Post", :profile_id => profile.id, :parent_id => blog.id, :body => '<p> Wasserstoffbombe </p>')
9   - fast_create(TinyMceArticle, :name => "A Post", :profile_id => profile.id, :parent_id => blog.id, :body => '<p>Lorem ipsum dolor sit amet</p> <p>Second paragraph</p>')
10   - block = ArticleBlock.new
11   - block.article = blog
12   - profile.boxes << Box.new
13   - profile.boxes.first.blocks << block
14   - return block
15   - end
16   -
17   - should 'allow blog as article block content' do
18   - block = blog_on_article_block_bootstrap
19   - get "/profile/#{block.owner.identifier}"
20   - assert_match(/Lorem ipsum dolor sit amet/, @response.body)
21   - end
22   -
23   - should 'display short version for block posts on article block' do
24   - block = blog_on_article_block_bootstrap
25   - get "/profile/#{block.owner.identifier}"
26   - assert_no_match(/Second paragraph/, @response.body)
27   - end
28   -
29   - should 'display full version for block posts on article block' do
30   - block = blog_on_article_block_bootstrap
31   - block.visualization_format = 'full'
32   - block.save!
33   - get "/profile/#{block.owner.identifier}"
34   - assert_match(/Second paragraph/, @response.body)
35   - end
36   -
37   - should 'display configured number of blog posts on article block' do
38   - block = blog_on_article_block_bootstrap
39   - block.posts_per_page = 2
40   - block.save!
41   - get "/profile/#{block.owner.identifier}"
42   - assert_match(/Lorem ipsum dolor sit amet/, @response.body)
43   - assert_match(/Wasserstoffbombe/, @response.body)
44   - end
45   -
46   -end
test/integration/profile_blocks_test.rb 0 → 100644
... ... @@ -0,0 +1,46 @@
  1 +require_relative "../test_helper"
  2 +
  3 +class ProfileBlocksTest < ActionDispatch::IntegrationTest
  4 +
  5 + def blog_on_article_block_bootstrap
  6 + profile = fast_create(Profile)
  7 + blog = fast_create(Blog, :name => 'Blog', :profile_id => profile.id)
  8 + fast_create(TinyMceArticle, :name => "First Post", :profile_id => profile.id, :parent_id => blog.id, :body => '<p> Wasserstoffbombe </p>')
  9 + fast_create(TinyMceArticle, :name => "A Post", :profile_id => profile.id, :parent_id => blog.id, :body => '<p>Lorem ipsum dolor sit amet</p> <p>Second paragraph</p>')
  10 + block = ArticleBlock.new
  11 + block.article = blog
  12 + profile.boxes << Box.new
  13 + profile.boxes.first.blocks << block
  14 + return block
  15 + end
  16 +
  17 + should 'allow blog as article block content' do
  18 + block = blog_on_article_block_bootstrap
  19 + get "/profile/#{block.owner.identifier}"
  20 + assert_match(/Lorem ipsum dolor sit amet/, @response.body)
  21 + end
  22 +
  23 + should 'display short version for block posts on article block' do
  24 + block = blog_on_article_block_bootstrap
  25 + get "/profile/#{block.owner.identifier}"
  26 + assert_no_match(/Second paragraph/, @response.body)
  27 + end
  28 +
  29 + should 'display full version for block posts on article block' do
  30 + block = blog_on_article_block_bootstrap
  31 + block.visualization_format = 'full'
  32 + block.save!
  33 + get "/profile/#{block.owner.identifier}"
  34 + assert_match(/Second paragraph/, @response.body)
  35 + end
  36 +
  37 + should 'display configured number of blog posts on article block' do
  38 + block = blog_on_article_block_bootstrap
  39 + block.posts_per_page = 2
  40 + block.save!
  41 + get "/profile/#{block.owner.identifier}"
  42 + assert_match(/Lorem ipsum dolor sit amet/, @response.body)
  43 + assert_match(/Wasserstoffbombe/, @response.body)
  44 + end
  45 +
  46 +end
... ...
test/integration/safe_strings_test.rb
... ... @@ -163,4 +163,16 @@ class SafeStringsTest &lt; ActionDispatch::IntegrationTest
163 163 get url_for(action: :edit, controller: :profile_design, profile: person.identifier, id: block.id)
164 164 assert_select '.block-config-options .image-data-line'
165 165 end
  166 +
  167 + should 'not escape icons options editing link_list block' do
  168 + create_user('jimi', :password => 'test', :password_confirmation => 'test').activate
  169 + profile = Person['jimi']
  170 + login 'jimi', 'test'
  171 + profile.blocks.each(&:destroy)
  172 + profile.boxes.first.blocks << LinkListBlock.new
  173 + block = profile.boxes.first.blocks.first
  174 + get "/myprofile/#{profile.identifier}/profile_design/edit/#{block.id}"
  175 + assert_select '.icon-selector .icon-edit'
  176 + end
  177 +
166 178 end
... ...
test/support/noosfero_test_helper.rb
  1 +##
  2 +# DEPRECATED ActionView::TestCase already provide all needed
  3 +#
1 4 module NoosferoTestHelper
2 5  
3   - def link_to(content, url, options = {})
4   - "<a href='#{url.inspect}'>#{content}</a>"
5   - end
6   -
7   - def content_tag(tag, content, options = {})
8   - tag_attr = options.blank? ? '' : ' ' + options.collect{ |o| "#{o[0]}=\"#{o[1]}\"" }.join(' ')
9   - "<#{tag}#{tag_attr}>#{content}</#{tag}>"
10   - end
11 6  
12 7 def submit_tag(content, options = {})
13 8 content
... ... @@ -17,11 +12,6 @@ module NoosferoTestHelper
17 12 ''
18 13 end
19 14  
20   - def tag(tag, args = {})
21   - attrs = args.map{|k,v| "#{k}='#{v}'"}.join(' ')
22   - "<#{tag} #{attrs} />"
23   - end
24   -
25 15 def options_from_collection_for_select(collection, value_method, content_method)
26 16 "<option value='fake value'>fake content</option>"
27 17 end
... ...
test/unit/add_member_test.rb
... ... @@ -149,4 +149,11 @@ class AddMemberTest &lt; ActiveSupport::TestCase
149 149  
150 150 assert_no_match(/\(#{task.requestor.email}\)/, task.target_notification_description)
151 151 end
  152 +
  153 + should 'have cancel notification message with explanation' do
  154 + explanation_message = 'some explanation'
  155 + task = AddMember.new(:person => person, :organization => community,
  156 + :reject_explanation => explanation_message)
  157 + assert_match(/#{explanation_message}/, task.task_cancelled_message)
  158 + end
152 159 end
... ...
test/unit/application_helper_test.rb
... ... @@ -466,7 +466,7 @@ class ApplicationHelperTest &lt; ActionView::TestCase
466 466 should 'use theme passed via param when in development mode' do
467 467 stubs(:environment).returns(build(Environment, :theme => 'environment-theme'))
468 468 Rails.env.stubs(:development?).returns(true)
469   - self.stubs(:params).returns({:theme => 'skyblue'})
  469 + self.stubs(:params).returns({:user_theme => 'skyblue'})
470 470 assert_equal 'skyblue', current_theme
471 471 end
472 472  
... ... @@ -682,29 +682,6 @@ class ApplicationHelperTest &lt; ActionView::TestCase
682 682 assert_nil default_folder_for_image_upload(profile)
683 683 end
684 684  
685   - should 'envelop a html with button-bar div' do
686   - result = button_bar { '<b>foo</b>' }
687   - assert_equal '<div class="button-bar"><b>foo</b>'+
688   - '<br style=\'clear: left;\' /></div>', result
689   - end
690   -
691   - should 'add more classes to button-bar envelope' do
692   - result = button_bar :class=>'test' do
693   - '<b>foo</b>'
694   - end
695   - assert_equal '<div class="test button-bar"><b>foo</b>'+
696   - '<br style=\'clear: left;\' /></div>', result
697   - end
698   -
699   - should 'add more attributes to button-bar envelope' do
700   - result = button_bar :id=>'bt1' do
701   - '<b>foo</b>'
702   - end
703   - assert_tag_in_string result, :tag =>'div', :attributes => {:class => 'button-bar', :id => 'bt1'}
704   - assert_tag_in_string result, :tag =>'b', :content => 'foo', :parent => {:tag => 'div', :attributes => {:id => 'bt1'}}
705   - assert_tag_in_string result, :tag =>'br', :parent => {:tag => 'div', :attributes => {:id => 'bt1'}}
706   - end
707   -
708 685 should 'not filter html if source does not have macros' do
709 686 class Plugin1 < Noosfero::Plugin
710 687 end
... ... @@ -871,7 +848,7 @@ class ApplicationHelperTest &lt; ActionView::TestCase
871 848 html = fullscreen_buttons("#article")
872 849 assert html.include?("<script>fullscreenPageLoad('#article')</script>")
873 850 assert html.include?("class=\"button with-text icon-fullscreen\"")
874   - assert html.include?("onClick=\"toggle_fullwidth('#article')\"")
  851 + assert html.include?("onClick=\"toggle_fullwidth(&#39;#article&#39;)\"")
875 852 end
876 853  
877 854 should "return the related class string" do
... ...
test/unit/block_test.rb
... ... @@ -23,10 +23,6 @@ class BlockTest &lt; ActiveSupport::TestCase
23 23 assert_nil Block.new.owner
24 24 end
25 25  
26   - should 'provide no footer by default' do
27   - assert_nil Block.new.footer
28   - end
29   -
30 26 should 'provide an empty default title' do
31 27 assert_equal '', Block.new.default_title
32 28 end
... ...
test/unit/buttons_helper_test.rb
1   -# encoding: UTF-8
2 1 require_relative "../test_helper"
3 2  
4 3 class ButtonsHelperTest < ActionView::TestCase
  4 +
5 5 include ButtonsHelper
6 6  
7 7 should 'append with-text class and keep existing classes' do
8 8 expects(:button_without_text).with('type', 'label', 'url', { :class => 'with-text class1'})
9 9 button('type', 'label', 'url', { :class => 'class1' })
10 10 end
11   -end
12 11 \ No newline at end of file
  12 +
  13 + should 'envelop a html with button-bar div' do
  14 + result = button_bar { content_tag :b, 'foo' }
  15 + assert_equal '<div class=" button-bar"><b>foo</b>'+
  16 + '<br style="clear: left;" /></div>', result
  17 + end
  18 +
  19 + should 'add more classes to button-bar envelope' do
  20 + result = button_bar :class=>'test' do
  21 + content_tag :b, 'foo'
  22 + end
  23 + assert_equal '<div class="test button-bar"><b>foo</b>'+
  24 + '<br style="clear: left;" /></div>', result
  25 + end
  26 +
  27 + should 'add more attributes to button-bar envelope' do
  28 + result = button_bar :id=>'bt1' do
  29 + content_tag :b, 'foo'
  30 + end
  31 + assert_tag_in_string result, :tag =>'div', :attributes => {:class => ' button-bar', :id => 'bt1'}
  32 + assert_tag_in_string result, :tag =>'b', :content => 'foo', :parent => {:tag => 'div', :attributes => {:id => 'bt1'}}
  33 + assert_tag_in_string result, :tag =>'br', :parent => {:tag => 'div', :attributes => {:id => 'bt1'}}
  34 + end
  35 +
  36 +end
... ...
test/unit/comment_handler_test.rb
... ... @@ -21,4 +21,14 @@ class CommentHandlerTest &lt; ActiveSupport::TestCase
21 21 handler.perform
22 22 end
23 23  
  24 + should 'save locale from creation context and not change current locale' do
  25 + FastGettext.stubs(:locale).returns("pt")
  26 + handler = CommentHandler.new(5, :whatever_method)
  27 +
  28 + FastGettext.stubs(:locale).returns("en")
  29 + assert_equal "pt", handler.locale
  30 +
  31 + handler.perform
  32 + assert_equal "en", FastGettext.locale
  33 + end
24 34 end
... ...
test/unit/comment_helper_test.rb
1 1 require_relative "../test_helper"
2 2  
3   -class CommentHelperTest < ActiveSupport::TestCase
  3 +class CommentHelperTest < ActionView::TestCase
4 4  
5 5 include CommentHelper
6   - include ActionView::Helpers::TagHelper
7   - include NoosferoTestHelper
  6 +
  7 + helper ApplicationHelper
8 8  
9 9 def setup
10 10 @user = create_user('usertest').person
... ... @@ -12,6 +12,7 @@ class CommentHelperTest &lt; ActiveSupport::TestCase
12 12 self.stubs(:logged_in?).returns(true)
13 13 self.stubs(:report_abuse).returns('<a href="#">link</a>')
14 14 self.stubs(:expirable_comment_link).returns('<a href="#">link</a>')
  15 + self.stubs(:url_for)
15 16 @plugins = mock
16 17 @plugins.stubs(:dispatch).returns([])
17 18 end
... ... @@ -140,9 +141,5 @@ class CommentHelperTest &lt; ActiveSupport::TestCase
140 141 assert_match /plugin_action/, Nokogiri::HTML.fragment(html).css('.comments-action-bar').to_html
141 142 end
142 143  
143   - def link_to_function(content, url, options = {})
144   - link_to(content, url, options)
145   - end
146   -
147 144 end
148 145  
... ...
test/unit/content_viewer_helper_test.rb
... ... @@ -3,6 +3,8 @@ require_relative &quot;../test_helper&quot;
3 3 class ContentViewerHelperTest < ActionView::TestCase
4 4  
5 5 include ActionView::Helpers::TagHelper
  6 + include ActionView::Helpers::TextHelper
  7 +
6 8 include ContentViewerHelper
7 9 include DatesHelper
8 10 include ApplicationHelper
... ... @@ -99,14 +101,14 @@ class ContentViewerHelperTest &lt; ActionView::TestCase
99 101 end
100 102  
101 103 should 'theme provides addthis custom icon' do
102   - stubs(:session).returns({:theme => 'base'})
  104 + stubs(:session).returns({:user_theme => 'base'})
103 105 File.expects(:exists?).with(anything).returns(true)
104 106 Environment.any_instance.stubs(:default_hostname).returns('noosfero.org')
105 107 assert_match 'addthis.gif', addthis_image_tag
106 108 end
107 109  
108 110 should 'use default addthis icon if theme has no addthis.gif image' do
109   - stubs(:session).returns({:theme => 'base'})
  111 + stubs(:session).returns({:user_theme => 'base'})
110 112 File.expects(:exists?).with(anything).returns(false)
111 113 Environment.any_instance.stubs(:default_hostname).returns('noosfero.org')
112 114 assert_match 'bt-bookmark.gif', addthis_image_tag
... ... @@ -148,11 +150,4 @@ class ContentViewerHelperTest &lt; ActionView::TestCase
148 150 assert_match /February 1, 2007/, result
149 151 end
150 152  
151   - protected
152   - include NoosferoTestHelper
153   - include ActionView::Helpers::TextHelper
154   - def url_for(args = {})
155   - ['http:/', args[:host], args[:profile], args[:page]].join('/')
156   - end
157   -
158 153 end
... ...
test/unit/environment_test.rb
... ... @@ -457,6 +457,22 @@ class EnvironmentTest &lt; ActiveSupport::TestCase
457 457 assert_equal ['new-theme', 'other-theme'], Environment.default.themes.map(&:id)
458 458 end
459 459  
  460 + should 'return the theme ids' do
  461 + env = Environment.default
  462 + t1 = 'theme_1'
  463 + t2 = 'theme_2'
  464 + Theme.stubs(:system_themes).returns([Theme.new(t1), Theme.new(t2)])
  465 + env.themes = [t1, t2]
  466 + env.save!
  467 + assert_equivalent [t1, t2], Environment.default.theme_ids
  468 + end
  469 + should 'theme_ids be an empty array if there is no settings themes defined' do
  470 + env = Environment.default
  471 + env.settings[:themes] = nil
  472 + env.save!
  473 + assert Environment.default.theme_ids.empty?
  474 + end
  475 +
460 476 should 'create templates' do
461 477 e = create(Environment, :name => 'test_env')
462 478 e.reload
... ...
test/unit/events_helper_test.rb
1 1 require_relative "../test_helper"
2 2  
3   -class EventsHelperTest < ActiveSupport::TestCase
  3 +class EventsHelperTest < ActionView::TestCase
4 4  
5 5 include EventsHelper
6 6  
... ...
test/unit/forum_helper_test.rb
1 1 require_relative "../test_helper"
2 2  
3   -class ForumHelperTest < ActiveSupport::TestCase
  3 +class ForumHelperTest < ActionView::TestCase
4 4  
5 5 include BlogHelper
6 6 include ForumHelper
... ... @@ -58,7 +58,7 @@ class ForumHelperTest &lt; ActiveSupport::TestCase
58 58 assert_match result, out
59 59 assert_match 'a2', out
60 60  
61   - assert_match(/#{result} by <a href='[^']+'>a2<\/a>/, last_topic_update(some_post))
  61 + assert_match(/#{result} by <a href="[^"]+">a2<\/a>/, last_topic_update(some_post))
62 62 end
63 63  
64 64 should "return last comment author's name from unauthenticated user" do
... ...
test/unit/link_list_block_test.rb
... ... @@ -79,13 +79,6 @@ class LinkListBlockTest &lt; ActiveSupport::TestCase
79 79 assert_tag_in_string render_block_content(l), :tag => 'a', :attributes => { :href => '/prefix/bar' }
80 80 end
81 81  
82   - should 'display options for icons' do
83   - l = LinkListBlock.new
84   - l.icons_options.each do |option|
85   - assert_match(/<span title=\".+\" class=\"icon-.+\" onclick=\"changeIcon\(this, '.+'\)\"><\/span>/, option)
86   - end
87   - end
88   -
89 82 should 'link with icon' do
90 83 l = LinkListBlock.new(:links => [{:icon => 'save', :name => 'test', :address => 'test.com'}])
91 84 assert_match /a class="icon-[^"]+"/, render_block_content(l)
... ...
test/unit/organization_test.rb
... ... @@ -567,4 +567,24 @@ class OrganizationTest &lt; ActiveSupport::TestCase
567 567 assert_not_includes person_orgs, o7
568 568 assert_includes env_admin_orgs, o7
569 569 end
  570 +
  571 + should 'return true at display_private_info_to? when profile is public and user is nil' do
  572 + organization = fast_create(Organization, public_profile: true)
  573 + assert organization.display_private_info_to?(nil)
  574 + end
  575 +
  576 + should 'return false at display_private_info_to? when profile is public and secret' do
  577 + organization = fast_create(Organization, public_profile: true, secret: true)
  578 + assert !organization.display_private_info_to?(nil)
  579 + end
  580 +
  581 + should 'return false at display_private_info_to? when profile is public and not visible' do
  582 + organization = fast_create(Organization, public_profile: true, visible: false)
  583 + assert !organization.display_private_info_to?(nil)
  584 + end
  585 +
  586 + should 'return false at display_private_info_to? when profile is private and user is nil' do
  587 + organization = fast_create(Organization, public_profile: false)
  588 + assert !organization.display_private_info_to?(nil)
  589 + end
570 590 end
... ...
test/unit/theme_loader_helper_test.rb
... ... @@ -20,7 +20,7 @@ class ThemeLoaderHelperTest &lt; ActionView::TestCase
20 20 end
21 21  
22 22 should 'override theme with testing theme from session' do
23   - stubs(:session).returns(:theme => 'theme-under-test')
  23 + stubs(:session).returns(:user_theme => 'theme-under-test')
24 24 assert_equal 'theme-under-test', current_theme
25 25 end
26 26  
... ... @@ -30,7 +30,17 @@ class ThemeLoaderHelperTest &lt; ActionView::TestCase
30 30 end
31 31  
32 32 should 'point to user theme path when testing theme' do
33   - stubs(:session).returns({:theme => 'theme-under-test'})
  33 + stubs(:session).returns({:user_theme => 'theme-under-test'})
34 34 assert_equal '/user_themes/theme-under-test', theme_path
35 35 end
36   -end
37 36 \ No newline at end of file
  37 +
  38 + should 'point to session theme is defined' do
  39 + session = mock
  40 + stubs(:session).returns(session)
  41 + my_session_theme = 'session_theme'
  42 + session.stubs(:[]).with(:user_theme).returns(nil)
  43 + session.stubs(:[]).with(:theme).returns(my_session_theme)
  44 + assert_equal '/designs/themes/' + my_session_theme, theme_path
  45 + end
  46 +
  47 +end
... ...
test/unit/url_helper_test.rb 0 → 100644
... ... @@ -0,0 +1,15 @@
  1 +require 'test_helper'
  2 +
  3 +class UrlHelperTest < ActionView::TestCase
  4 +
  5 + include UrlHelper
  6 +
  7 + def setup
  8 + end
  9 +
  10 + should 'preserve override_user if present' do
  11 + params[:override_user] = 1
  12 + assert_equal default_url_options[:override_user], params[:override_user]
  13 + end
  14 +
  15 +end
... ...