Commit 858648c1ccfefe0e6c441b312777a4df48c02a9b
Exists in
staging
and in
1 other branch
Merge branch 'master' into staging
Showing
60 changed files
with
486 additions
and
130 deletions
Show diff stats
app/api/entities.rb
| ... | ... | @@ -121,6 +121,10 @@ module Api |
| 121 | 121 | expose :type |
| 122 | 122 | expose :custom_header |
| 123 | 123 | expose :custom_footer |
| 124 | + expose :permissions do |profile, options| | |
| 125 | + Entities.permissions_for_entity(profile, options[:current_person], | |
| 126 | + :allow_post_content?, :allow_edit?, :allow_destroy?) | |
| 127 | + end | |
| 124 | 128 | end |
| 125 | 129 | |
| 126 | 130 | class UserBasic < Entity |
| ... | ... | @@ -202,12 +206,21 @@ module Api |
| 202 | 206 | expose :accept_comments?, as: :accept_comments |
| 203 | 207 | end |
| 204 | 208 | |
| 209 | + def self.permissions_for_entity(entity, current_person, *method_names) | |
| 210 | + method_names.map { |method| entity.send(method, current_person) ? method.to_s.gsub(/\?/,'') : nil }.compact | |
| 211 | + end | |
| 212 | + | |
| 205 | 213 | class Article < ArticleBase |
| 206 | 214 | root 'articles', 'article' |
| 207 | 215 | expose :parent, :using => ArticleBase |
| 208 | 216 | expose :children, :using => ArticleBase do |article, options| |
| 209 | 217 | article.children.published.limit(V1::Articles::MAX_PER_PAGE) |
| 210 | 218 | end |
| 219 | + expose :permissions do |article, options| | |
| 220 | + Entities.permissions_for_entity(article, options[:current_person], | |
| 221 | + :allow_edit?, :allow_post_content?, :allow_delete?, :allow_create?, | |
| 222 | + :allow_publish_content?) | |
| 223 | + end | |
| 211 | 224 | end |
| 212 | 225 | |
| 213 | 226 | class User < Entity | ... | ... |
app/api/helpers.rb
| ... | ... | @@ -132,7 +132,7 @@ module Api |
| 132 | 132 | |
| 133 | 133 | def present_article(asset) |
| 134 | 134 | article = find_article(asset.articles, params[:id]) |
| 135 | - present_partial article, :with => Entities::Article, :params => params | |
| 135 | + present_partial article, with: Entities::Article, params: params, current_person: current_person | |
| 136 | 136 | end |
| 137 | 137 | |
| 138 | 138 | def present_articles_for_asset(asset, method = 'articles') |
| ... | ... | @@ -141,7 +141,7 @@ module Api |
| 141 | 141 | end |
| 142 | 142 | |
| 143 | 143 | def present_articles(articles) |
| 144 | - present_partial paginate(articles), :with => Entities::Article, :params => params | |
| 144 | + present_partial paginate(articles), :with => Entities::Article, :params => params, current_person: current_person | |
| 145 | 145 | end |
| 146 | 146 | |
| 147 | 147 | def find_articles(asset, method = 'articles') | ... | ... |
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
| ... | ... | @@ -288,7 +288,7 @@ module Api |
| 288 | 288 | article = forbidden! |
| 289 | 289 | end |
| 290 | 290 | |
| 291 | - present_partial article, :with => Entities::Article | |
| 291 | + present_partial article, :with => Entities::Article, current_person: current_person | |
| 292 | 292 | else |
| 293 | 293 | |
| 294 | 294 | present_articles_for_asset(profile) | ... | ... |
app/api/v1/profiles.rb
| ... | ... | @@ -27,7 +27,7 @@ module Api |
| 27 | 27 | post ':id' do |
| 28 | 28 | authenticate! |
| 29 | 29 | profile = environment.profiles.find_by(id: params[:id]) |
| 30 | - return forbidden! unless current_person.has_permission?(:edit_profile, profile) | |
| 30 | + return forbidden! unless profile.allow_edit?(current_person) | |
| 31 | 31 | profile.update_attributes!(params[:profile]) |
| 32 | 32 | present profile, :with => Entities::Profile, :current_person => current_person |
| 33 | 33 | end |
| ... | ... | @@ -39,7 +39,7 @@ module Api |
| 39 | 39 | |
| 40 | 40 | not_found! if profile.blank? |
| 41 | 41 | |
| 42 | - if current_person.has_permission?(:destroy_profile, profile) | |
| 42 | + if profile.allow_destroy?(current_person) | |
| 43 | 43 | profile.destroy |
| 44 | 44 | else |
| 45 | 45 | forbidden! | ... | ... |
app/concerns/authenticated_system.rb
| ... | ... | @@ -2,15 +2,18 @@ module AuthenticatedSystem |
| 2 | 2 | |
| 3 | 3 | protected |
| 4 | 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 | |
| 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 | |
| 9 | 12 | end |
| 10 | 13 | |
| 11 | 14 | # Inclusion hook to make #current_user and #logged_in? |
| 12 | 15 | # available as ActionView helper methods. |
| 13 | - base.helper_method :current_user, :logged_in? | |
| 16 | + helper_method :current_user, :logged_in? | |
| 14 | 17 | end |
| 15 | 18 | |
| 16 | 19 | # Returns true or false if the user is logged in. |
| ... | ... | @@ -20,10 +23,9 @@ module AuthenticatedSystem |
| 20 | 23 | end |
| 21 | 24 | |
| 22 | 25 | # Accesses the current user from the session. |
| 23 | - def current_user | |
| 26 | + def current_user user_id = session[:user] | |
| 24 | 27 | @current_user ||= begin |
| 25 | - id = session[:user] | |
| 26 | - user = User.where(id: id).first if id | |
| 28 | + user = User.find_by id: user_id if user_id | |
| 27 | 29 | user.session = session if user |
| 28 | 30 | User.current = user |
| 29 | 31 | user |
| ... | ... | @@ -141,6 +143,13 @@ module AuthenticatedSystem |
| 141 | 143 | end |
| 142 | 144 | end |
| 143 | 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 | + | |
| 144 | 153 | # When called with before_filter :login_from_cookie will check for an :auth_token |
| 145 | 154 | # cookie and log the user back in if apropriate |
| 146 | 155 | def login_from_cookie | ... | ... |
app/helpers/application_helper.rb
| ... | ... | @@ -725,11 +725,11 @@ module ApplicationHelper |
| 725 | 725 | def display_short_format(article, options={}) |
| 726 | 726 | options[:comments_link] ||= true |
| 727 | 727 | options[:read_more_link] ||= true |
| 728 | + lead_links = (options[:comments_link] ? link_to_comments(article) : '') + (options[:read_more_link] ? reference_to_article( _('Read more'), article) : '') | |
| 728 | 729 | html = content_tag('div', |
| 729 | 730 | article.lead + |
| 730 | 731 | content_tag('div', |
| 731 | - (options[:comments_link] ? link_to_comments(article) : '') + | |
| 732 | - (options[:read_more_link] ? reference_to_article( _('Read more'), article) : ''), | |
| 732 | + lead_links.html_safe, | |
| 733 | 733 | :class => 'read-more' |
| 734 | 734 | ), |
| 735 | 735 | :class => 'short-post' |
| ... | ... | @@ -1132,7 +1132,7 @@ module ApplicationHelper |
| 1132 | 1132 | content_tag(:div, :class => 'errorExplanation', :id => 'errorExplanation') do |
| 1133 | 1133 | content_tag(:h2, _('Errors while saving')) + |
| 1134 | 1134 | content_tag(:ul) do |
| 1135 | - safe_join(errors.map { |err| content_tag(:li, err) }) | |
| 1135 | + safe_join(errors.map { |err| content_tag(:li, err.html_safe) }) | |
| 1136 | 1136 | end |
| 1137 | 1137 | end |
| 1138 | 1138 | end | ... | ... |
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/url_helper.rb
app/models/article.rb
| ... | ... | @@ -567,7 +567,7 @@ class Article < ApplicationRecord |
| 567 | 567 | |
| 568 | 568 | def allow_post_content?(user = nil) |
| 569 | 569 | return true if allow_edit_topic?(user) |
| 570 | - user && (user.has_permission?('post_content', profile) || allow_publish_content?(user) && (user == author)) | |
| 570 | + user && (profile.allow_post_content?(user) || allow_publish_content?(user) && (user == author)) | |
| 571 | 571 | end |
| 572 | 572 | |
| 573 | 573 | def allow_publish_content?(user = nil) | ... | ... |
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/organization.rb
app/models/profile.rb
| ... | ... | @@ -1189,4 +1189,15 @@ private :generate_url, :url_options |
| 1189 | 1189 | false |
| 1190 | 1190 | end |
| 1191 | 1191 | |
| 1192 | + def allow_post_content?(person = nil) | |
| 1193 | + person.kind_of?(Profile) && person.has_permission?('post_content', self) | |
| 1194 | + end | |
| 1195 | + | |
| 1196 | + def allow_edit?(person = nil) | |
| 1197 | + person.kind_of?(Profile) && person.has_permission?('edit_profile', self) | |
| 1198 | + end | |
| 1199 | + | |
| 1200 | + def allow_destroy?(person = nil) | |
| 1201 | + person.kind_of?(Profile) && person.has_permission?('destroy_profile', self) | |
| 1202 | + end | |
| 1192 | 1203 | end | ... | ... |
app/models/user.rb
app/views/blocks/profile_info.html.erb
| ... | ... | @@ -30,7 +30,7 @@ |
| 30 | 30 | [ [ profile.city, 'locality' ], |
| 31 | 31 | [ profile.state, 'region' ], |
| 32 | 32 | [ profile.country_name, 'country-name' ] |
| 33 | - ].map{ |s,c| s =~ /^\s*$/ ? nil : content_tag( 'span', s, :class => c ) }.compact.join ' - ' | |
| 33 | + ].map{ |s,c| s =~ /^\s*$/ ? nil : content_tag( 'span', s, :class => c ) }.compact.safe_join ' - ' | |
| 34 | 34 | %> |
| 35 | 35 | </div> |
| 36 | 36 | <% 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?%> | ... | ... |
config/initializers/00_dependencies.rb
config/initializers/active_record_extensions.rb
lib/noosfero/plugin.rb
plugins/analytics/lib/analytics_plugin/base.rb
| ... | ... | @@ -42,7 +42,7 @@ class AnalyticsPlugin::Base < Noosfero::Plugin |
| 42 | 42 | { |
| 43 | 43 | title: I18n.t('analytics_plugin.lib.plugin.panel_button'), |
| 44 | 44 | icon: 'analytics-access', |
| 45 | - url: {controller: 'analytics_plugin/stats', action: :index} | |
| 45 | + url: {controller: 'analytics_plugin/stats', profile: profile.identifier, action: :index} | |
| 46 | 46 | } |
| 47 | 47 | end |
| 48 | 48 | ... | ... |
plugins/custom_forms/lib/custom_forms_plugin.rb
| ... | ... | @@ -13,7 +13,7 @@ class CustomFormsPlugin < Noosfero::Plugin |
| 13 | 13 | end |
| 14 | 14 | |
| 15 | 15 | def control_panel_buttons |
| 16 | - {:title => _('Manage Forms'), :icon => 'custom-forms', :url => {:controller => 'custom_forms_plugin_myprofile'}} | |
| 16 | + {title: _('Manage Forms'), icon: 'custom-forms', url: {profile: profile.identifier, controller: 'custom_forms_plugin_myprofile'}} | |
| 17 | 17 | end |
| 18 | 18 | |
| 19 | 19 | end | ... | ... |
plugins/display_content/test/unit/display_content_block_test.rb
| ... | ... | @@ -656,6 +656,23 @@ class DisplayContentBlockViewTest < ActionView::TestCase |
| 656 | 656 | assert_match /#{a.published_at}/, render_block_content(block) |
| 657 | 657 | end |
| 658 | 658 | |
| 659 | + should 'show image if defined by user' do | |
| 660 | + profile = create_user('testuser').person | |
| 661 | + a = create(TinyMceArticle, :name => 'test article 1', :profile_id => profile.id, :image_builder => { :uploaded_data => fixture_file_upload('/files/rails.png', 'image/png')}) | |
| 662 | + a.save! | |
| 663 | + | |
| 664 | + process_delayed_job_queue | |
| 665 | + | |
| 666 | + block = DisplayContentBlock.new | |
| 667 | + block.nodes = [a.id] | |
| 668 | + block.sections = [{:value => 'image', :checked => true}] | |
| 669 | + box = mock() | |
| 670 | + block.stubs(:box).returns(box) | |
| 671 | + box.stubs(:owner).returns(profile) | |
| 672 | + | |
| 673 | + assert_tag_in_string render_block_content(block), :tag => 'div', :attributes => {:class => 'image'} | |
| 674 | + end | |
| 675 | + | |
| 659 | 676 | should 'show articles in recent order' do |
| 660 | 677 | profile = create_user('testuser').person |
| 661 | 678 | Article.delete_all | ... | ... |
plugins/display_content/views/blocks/display_content/_section.slim
| ... | ... | @@ -13,7 +13,7 @@ |
| 13 | 13 | div class='body' |
| 14 | 14 | = (item.body || '').html_safe |
| 15 | 15 | - when 'image' |
| 16 | - - unless item.image || item.image.public_filename | |
| 16 | + - if item.image && item.image.public_filename | |
| 17 | 17 | div class='image' |
| 18 | 18 | = link_to(image_tag(item.image.public_filename), item.url) |
| 19 | 19 | - when 'tags' | ... | ... |
plugins/organization_ratings/controllers/organization_ratings_plugin_profile_controller.rb
| ... | ... | @@ -37,20 +37,17 @@ class OrganizationRatingsPluginProfileController < 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/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 < 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/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 < 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 < 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_test.rb
| ... | ... | @@ -35,55 +35,36 @@ class OrganizationRatingTest < 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 < 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 < 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 'ratings_helper' |
| 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 < 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 < 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 < 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
| ... | ... | @@ -14,7 +14,7 @@ |
| 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_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/_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 %> | ... | ... |
| ... | ... | @@ -0,0 +1,18 @@ |
| 1 | +Feature: person tags | |
| 2 | + | |
| 3 | +Background: | |
| 4 | + Given the following users | |
| 5 | + | login | | |
| 6 | + | joao | | |
| 7 | + And I am logged in as "joao" | |
| 8 | + And "PersonTags" plugin is enabled | |
| 9 | + | |
| 10 | +Scenario: add tags to person | |
| 11 | + Given I am on joao's control panel | |
| 12 | + And I follow "Edit Profile" | |
| 13 | + When I fill in "profile_data_interest_list" with "linux,debian" | |
| 14 | + And I press "Save" | |
| 15 | + And I go to joao's control panel | |
| 16 | + And I follow "Edit Profile" | |
| 17 | + Then the "profile_data_interest_list" field should contain "linux" | |
| 18 | + And the "profile_data_interest_list" field should contain "debian" | ... | ... |
| ... | ... | @@ -0,0 +1,22 @@ |
| 1 | +class PersonTagsPlugin < Noosfero::Plugin | |
| 2 | + | |
| 3 | + include ActionView::Helpers::TagHelper | |
| 4 | + include ActionView::Helpers::FormTagHelper | |
| 5 | + include FormsHelper | |
| 6 | + | |
| 7 | + def self.plugin_name | |
| 8 | + "PersonTagsPlugin" | |
| 9 | + end | |
| 10 | + | |
| 11 | + def self.plugin_description | |
| 12 | + _("People can define tags that describe their interests.") | |
| 13 | + end | |
| 14 | + | |
| 15 | + def profile_editor_extras | |
| 16 | + expanded_template('profile-editor-extras.html.erb').html_safe | |
| 17 | + end | |
| 18 | + | |
| 19 | + def self.api_mount_points | |
| 20 | + [PersonTagsPlugin::API] | |
| 21 | + end | |
| 22 | +end | ... | ... |
| ... | ... | @@ -0,0 +1 @@ |
| 1 | +require_relative '../../../test/test_helper' | ... | ... |
| ... | ... | @@ -0,0 +1,27 @@ |
| 1 | +require_relative '../test_helper' | |
| 2 | +require_relative '../../../../test/api/test_helper' | |
| 3 | + | |
| 4 | +class APITest < ActiveSupport::TestCase | |
| 5 | + | |
| 6 | + def setup | |
| 7 | + create_and_activate_user | |
| 8 | + environment.enable_plugin(PersonTagsPlugin) | |
| 9 | + end | |
| 10 | + | |
| 11 | + should 'return tags for a person' do | |
| 12 | + person = create_user('person').person | |
| 13 | + person.interest_list.add('linux') | |
| 14 | + person.save! | |
| 15 | + person.reload | |
| 16 | + get "/api/v1/people/#{person.id}/tags?#{params.to_query}" | |
| 17 | + json = JSON.parse(last_response.body) | |
| 18 | + assert_equal ['linux'], json | |
| 19 | + end | |
| 20 | + | |
| 21 | + should 'return empty list if person has no tags' do | |
| 22 | + person = create_user('person').person | |
| 23 | + get "/api/v1/people/#{person.id}/tags?#{params.to_query}" | |
| 24 | + json = JSON.parse(last_response.body) | |
| 25 | + assert_equal [], json | |
| 26 | + end | |
| 27 | +end | ... | ... |
| ... | ... | @@ -0,0 +1,16 @@ |
| 1 | +require 'test_helper' | |
| 2 | + | |
| 3 | +class PersonTagsPluginTest < ActiveSupport::TestCase | |
| 4 | + | |
| 5 | + def setup | |
| 6 | + @environment = Environment.default | |
| 7 | + @environment.enable_plugin(PersonTagsPlugin) | |
| 8 | + end | |
| 9 | + | |
| 10 | + should 'have interests' do | |
| 11 | + person = create_user('person').person | |
| 12 | + assert_equal [], person.interests | |
| 13 | + person.interest_list.add('linux') | |
| 14 | + assert_equal ['linux'], person.interest_list | |
| 15 | + end | |
| 16 | +end | ... | ... |
plugins/person_tags/views/profile-editor-extras.html.erb
0 → 100644
| ... | ... | @@ -0,0 +1,8 @@ |
| 1 | +<h2><%= _('Select your fields of interest') %></h2> | |
| 2 | +<%= text_field_tag('profile_data[interest_list]', context.profile.interest_list.join(','), size: 64) %> | |
| 3 | +<br /> | |
| 4 | +<%= content_tag( 'small', _('Separate tags with commas') ) %> | |
| 5 | + | |
| 6 | +<script> | |
| 7 | + jQuery('#profile_data_interest_list').inputosaurus(); | |
| 8 | +</script> | ... | ... |
plugins/require_auth_to_comment/lib/require_auth_to_comment_plugin.rb
| ... | ... | @@ -38,7 +38,7 @@ class RequireAuthToCommentPlugin < Noosfero::Plugin |
| 38 | 38 | end |
| 39 | 39 | |
| 40 | 40 | def body_beginning |
| 41 | - "<meta name='profile.allow_unauthenticated_comments'/>" if allowed_by_profile | |
| 41 | + tag :meta, name: 'profile.allow_unauthenticated_comments' if allowed_by_profile | |
| 42 | 42 | end |
| 43 | 43 | |
| 44 | 44 | protected | ... | ... |
plugins/responsive/views/layouts/_usermenu_logged_in.html.slim
| ... | ... | @@ -5,8 +5,8 @@ li.dropdown |
| 5 | 5 | = image_tag user.profile_custom_icon(gravatar_default), class: 'menu-user-gravatar' |
| 6 | 6 | = content_tag :strong, user.identifier |
| 7 | 7 | - if pending_tasks_count |
| 8 | - span class='badge' onclick="document.location='#{url_for(user.tasks_url)}'" title="#{_("Manage your pending tasks")}" | |
| 9 | - count | |
| 8 | + span class='badge' onclick="document.location='#{url_for user.tasks_url}'" title="#{_("Manage your pending tasks")}" | |
| 9 | + = pending_tasks_count | |
| 10 | 10 | |
| 11 | 11 | ul class='dropdown-menu' role='menu' |
| 12 | 12 | li | ... | ... |
plugins/responsive/views/layouts/application-responsive.html.erb
| ... | ... | @@ -36,7 +36,7 @@ |
| 36 | 36 | <%= |
| 37 | 37 | @plugins.dispatch(:body_beginning).map do |content| |
| 38 | 38 | if content.respond_to?(:call) then instance_exec(&content).to_s.html_safe else content.to_s.html_safe end |
| 39 | - end.join("\n") | |
| 39 | + end.safe_join | |
| 40 | 40 | %> |
| 41 | 41 | <div id="global-header"> |
| 42 | 42 | <%= global_header %> | ... | ... |
plugins/sub_organizations/lib/sub_organizations_plugin.rb
| ... | ... | @@ -20,7 +20,7 @@ class SubOrganizationsPlugin < Noosfero::Plugin |
| 20 | 20 | |
| 21 | 21 | def control_panel_buttons |
| 22 | 22 | if context.profile.organization? && Organization.parents(context.profile).blank? |
| 23 | - { :title => _('Manage sub-groups'), :icon => 'groups', :url => {:controller => 'sub_organizations_plugin_myprofile'} } | |
| 23 | + { title: _('Manage sub-groups'), icon: 'groups', url: {profile: profile.identifier, controller: :sub_organizations_plugin_myprofile} } | |
| 24 | 24 | end |
| 25 | 25 | end |
| 26 | 26 | ... | ... |
public/designs/themes/base-responsive/style.scss
| ... | ... | @@ -2042,16 +2042,6 @@ table.cms-articles .article-name { |
| 2042 | 2042 | font-weight: bold; |
| 2043 | 2043 | } |
| 2044 | 2044 | |
| 2045 | -#theme-footer #language-chooser { | |
| 2046 | - text-align: left; | |
| 2047 | -} | |
| 2048 | - | |
| 2049 | -/* armengue */ | |
| 2050 | -/* didn't find why .no-boxes has bigger width than its parent */ | |
| 2051 | -.no-boxes { | |
| 2052 | - width: 96%; | |
| 2053 | -} | |
| 2054 | - | |
| 2055 | 2045 | @media screen and (min-width:1200px) { |
| 2056 | 2046 | #top-bar a.icon-help { |
| 2057 | 2047 | font-size: 0; | ... | ... |
test/api/activities_test.rb
| ... | ... | @@ -27,8 +27,8 @@ class ActivitiesTest < 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 < 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
| ... | ... | @@ -810,4 +810,12 @@ class ArticlesTest < ActiveSupport::TestCase |
| 810 | 810 | assert_equal json["articles"].map { |a| a["id"] }, [article2.id] |
| 811 | 811 | end |
| 812 | 812 | |
| 813 | + should 'list article permissions when get an article' do | |
| 814 | + community = fast_create(Community) | |
| 815 | + give_permission(person, 'post_content', community) | |
| 816 | + article = fast_create(Article, :profile_id => community.id) | |
| 817 | + get "/api/v1/articles/#{article.id}?#{params.to_query}" | |
| 818 | + json = JSON.parse(last_response.body) | |
| 819 | + assert_includes json["article"]["permissions"], 'allow_post_content' | |
| 820 | + end | |
| 813 | 821 | end | ... | ... |
test/api/profiles_test.rb
| ... | ... | @@ -191,4 +191,13 @@ class ProfilesTest < ActiveSupport::TestCase |
| 191 | 191 | post "/api/v1/profiles/#{profile.id}?#{params.to_query}" |
| 192 | 192 | assert_equal 403, last_response.status |
| 193 | 193 | end |
| 194 | + | |
| 195 | + should 'list profile permissions when get an article' do | |
| 196 | + login_api | |
| 197 | + profile = fast_create(Profile) | |
| 198 | + give_permission(person, 'post_content', profile) | |
| 199 | + get "/api/v1/profiles/#{profile.id}?#{params.to_query}" | |
| 200 | + json = JSON.parse(last_response.body) | |
| 201 | + assert_includes json["permissions"], 'allow_post_content' | |
| 202 | + end | |
| 194 | 203 | end | ... | ... |
test/functional/application_controller_test.rb
| ... | ... | @@ -506,6 +506,21 @@ class ApplicationControllerTest < 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 | ... | ... |
test/integration/safe_strings_test.rb
| ... | ... | @@ -175,4 +175,15 @@ class SafeStringsTest < ActionDispatch::IntegrationTest |
| 175 | 175 | assert_select '.icon-selector .icon-edit' |
| 176 | 176 | end |
| 177 | 177 | |
| 178 | + should 'not escape read more link to article on display short format' do | |
| 179 | + profile = fast_create Profile | |
| 180 | + blog = fast_create Blog, :name => 'Blog', :profile_id => profile.id | |
| 181 | + fast_create(TinyMceArticle, :name => "Post Test", :profile_id => profile.id, :parent_id => blog.id, :accept_comments => false, :body => '<p>Lorem ipsum dolor sit amet</p>') | |
| 182 | + blog.update_attribute(:visualization_format, 'short') | |
| 183 | + | |
| 184 | + get "/#{profile.identifier}/blog" | |
| 185 | + assert_tag :tag => 'div', :attributes => {:class => 'read-more'}, :child => {:tag => 'a', :content => 'Read more'} | |
| 186 | + end | |
| 187 | + | |
| 188 | + | |
| 178 | 189 | end | ... | ... |
test/test_helper.rb
| ... | ... | @@ -8,7 +8,7 @@ require 'rails/test_help' |
| 8 | 8 | |
| 9 | 9 | require 'mocha' |
| 10 | 10 | require 'mocha/mini_test' |
| 11 | - | |
| 11 | +require "minitest/spec" | |
| 12 | 12 | require "minitest/reporters" |
| 13 | 13 | Minitest::Reporters.use! Minitest::Reporters::ProgressReporter.new, ENV, Minitest.backtrace_filter |
| 14 | 14 | |
| ... | ... | @@ -52,19 +52,13 @@ class ActiveSupport::TestCase |
| 52 | 52 | # then set this back to true. |
| 53 | 53 | self.use_instantiated_fixtures = false |
| 54 | 54 | |
| 55 | - # Add more helper methods to be used by all tests here... | |
| 55 | + extend Test::Should | |
| 56 | 56 | |
| 57 | - # for fixture_file_upload | |
| 58 | 57 | include ActionDispatch::TestProcess |
| 59 | - | |
| 60 | 58 | include Noosfero::Factory |
| 61 | - | |
| 62 | 59 | include AuthenticatedTestHelper |
| 63 | - | |
| 64 | 60 | include PerformanceHelper |
| 65 | 61 | |
| 66 | - extend Test::Should | |
| 67 | - | |
| 68 | 62 | fixtures :environments, :roles |
| 69 | 63 | |
| 70 | 64 | def self.all_fixtures | ... | ... |
test/unit/comment_handler_test.rb
| ... | ... | @@ -21,4 +21,14 @@ class CommentHandlerTest < 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/organization_test.rb
| ... | ... | @@ -567,4 +567,24 @@ class OrganizationTest < 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/profile_test.rb
| ... | ... | @@ -2204,4 +2204,24 @@ class ProfileTest < ActiveSupport::TestCase |
| 2204 | 2204 | assert_not_includes profiles, p3 |
| 2205 | 2205 | assert_not_includes profiles, p4 |
| 2206 | 2206 | end |
| 2207 | + | |
| 2208 | + ['post_content', 'edit_profile', 'destroy_profile'].each do |permission| | |
| 2209 | + should "return true in #{permission} when user has this permission" do | |
| 2210 | + profile = fast_create(Profile) | |
| 2211 | + person = fast_create(Person) | |
| 2212 | + give_permission(person, permission, profile) | |
| 2213 | + assert profile.send("allow_#{permission.gsub(/_profile/,'')}?", person) | |
| 2214 | + end | |
| 2215 | + | |
| 2216 | + should "return false in #{permission} when user doesn't have this permission" do | |
| 2217 | + profile = fast_create(Profile) | |
| 2218 | + person = fast_create(Person) | |
| 2219 | + assert !profile.send("allow_#{permission.gsub(/_profile/,'')}?", person) | |
| 2220 | + end | |
| 2221 | + | |
| 2222 | + should "return false in #{permission} when user is nil" do | |
| 2223 | + profile = fast_create(Profile) | |
| 2224 | + assert !profile.send("allow_#{permission.gsub(/_profile/,'')}?", nil) | |
| 2225 | + end | |
| 2226 | + end | |
| 2207 | 2227 | end | ... | ... |
| ... | ... | @@ -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 | ... | ... |