Commit 099313773408999b45f37f7e9af66d99a52dfade
Exists in
master
and in
29 other branches
Merge commit 'refs/merge-requests/167' of git://gitorious.org/noosfero/noosfero …
…into merge-requests/167
Showing
21 changed files
with
225 additions
and
126 deletions
Show diff stats
app/controllers/my_profile/cms_controller.rb
| @@ -15,42 +15,21 @@ class CmsController < MyProfileController | @@ -15,42 +15,21 @@ class CmsController < MyProfileController | ||
| 15 | end | 15 | end |
| 16 | 16 | ||
| 17 | before_filter :login_required, :except => [:suggest_an_article] | 17 | before_filter :login_required, :except => [:suggest_an_article] |
| 18 | + | ||
| 18 | protect_if :except => [:suggest_an_article, :set_home_page, :edit, :destroy, :publish] do |c, user, profile| | 19 | protect_if :except => [:suggest_an_article, :set_home_page, :edit, :destroy, :publish] do |c, user, profile| |
| 19 | user && (user.has_permission?('post_content', profile) || user.has_permission?('publish_content', profile)) | 20 | user && (user.has_permission?('post_content', profile) || user.has_permission?('publish_content', profile)) |
| 20 | end | 21 | end |
| 21 | 22 | ||
| 22 | - protect_if :only => [:edit, :destroy, :publish] do |c, user, profile| | 23 | + protect_if :only => [:destroy, :publish] do |c, user, profile| |
| 23 | profile.articles.find(c.params[:id]).allow_post_content?(user) | 24 | profile.articles.find(c.params[:id]).allow_post_content?(user) |
| 24 | end | 25 | end |
| 25 | 26 | ||
| 26 | - def boxes_holder | ||
| 27 | - profile | ||
| 28 | - end | ||
| 29 | - | ||
| 30 | - include CmsHelper | ||
| 31 | - | ||
| 32 | - def available_article_types | ||
| 33 | - articles = [ | ||
| 34 | - TinyMceArticle, | ||
| 35 | - TextileArticle, | ||
| 36 | - Event | ||
| 37 | - ] | ||
| 38 | - articles += special_article_types if params && params[:cms] | ||
| 39 | - parent_id = params ? params[:parent_id] : nil | ||
| 40 | - if profile.enterprise? | ||
| 41 | - articles << EnterpriseHomepage | ||
| 42 | - end | ||
| 43 | - if @parent && @parent.blog? | ||
| 44 | - articles -= Article.folder_types.map(&:constantize) | ||
| 45 | - end | ||
| 46 | - if user.is_admin?(profile.environment) | ||
| 47 | - articles << RawHTMLArticle | ||
| 48 | - end | ||
| 49 | - articles | 27 | + protect_if :only => :edit do |c,user,profile| |
| 28 | + profile.articles.find(c.params[:id]).allow_edit?(user) | ||
| 50 | end | 29 | end |
| 51 | 30 | ||
| 52 | - def special_article_types | ||
| 53 | - [Folder, Blog, UploadedFile, Forum, Gallery, RssFeed] + @plugins.dispatch(:content_types) | 31 | + def boxes_holder |
| 32 | + profile | ||
| 54 | end | 33 | end |
| 55 | 34 | ||
| 56 | def view | 35 | def view |
| @@ -303,6 +282,33 @@ class CmsController < MyProfileController | @@ -303,6 +282,33 @@ class CmsController < MyProfileController | ||
| 303 | 282 | ||
| 304 | protected | 283 | protected |
| 305 | 284 | ||
| 285 | + include CmsHelper | ||
| 286 | + | ||
| 287 | + def available_article_types | ||
| 288 | + articles = [ | ||
| 289 | + TinyMceArticle, | ||
| 290 | + TextileArticle, | ||
| 291 | + Event | ||
| 292 | + ] | ||
| 293 | + articles += special_article_types if params && params[:cms] | ||
| 294 | + parent_id = params ? params[:parent_id] : nil | ||
| 295 | + if profile.enterprise? | ||
| 296 | + articles << EnterpriseHomepage | ||
| 297 | + end | ||
| 298 | + if @parent && @parent.blog? | ||
| 299 | + articles -= Article.folder_types.map(&:constantize) | ||
| 300 | + end | ||
| 301 | + if user.is_admin?(profile.environment) | ||
| 302 | + articles << RawHTMLArticle | ||
| 303 | + end | ||
| 304 | + articles | ||
| 305 | + end | ||
| 306 | + | ||
| 307 | + def special_article_types | ||
| 308 | + [Folder, Blog, UploadedFile, Forum, Gallery, RssFeed] + @plugins.dispatch(:content_types) | ||
| 309 | + end | ||
| 310 | + | ||
| 311 | + | ||
| 306 | def record_coming | 312 | def record_coming |
| 307 | if request.post? | 313 | if request.post? |
| 308 | @back_to = params[:back_to] | 314 | @back_to = params[:back_to] |
app/controllers/public/account_controller.rb
| @@ -78,7 +78,12 @@ class AccountController < ApplicationController | @@ -78,7 +78,12 @@ class AccountController < ApplicationController | ||
| 78 | invitation.update_attributes!({:friend => @user.person}) | 78 | invitation.update_attributes!({:friend => @user.person}) |
| 79 | invitation.finish | 79 | invitation.finish |
| 80 | end | 80 | end |
| 81 | - @register_pending = true | 81 | + if @user.activated? |
| 82 | + self.current_user = @user | ||
| 83 | + redirect_to '/' | ||
| 84 | + else | ||
| 85 | + @register_pending = true | ||
| 86 | + end | ||
| 82 | end | 87 | end |
| 83 | rescue ActiveRecord::RecordInvalid | 88 | rescue ActiveRecord::RecordInvalid |
| 84 | @person.valid? | 89 | @person.valid? |
app/helpers/article_helper.rb
| @@ -8,19 +8,32 @@ module ArticleHelper | @@ -8,19 +8,32 @@ module ArticleHelper | ||
| 8 | 'div', | 8 | 'div', |
| 9 | check_box(:article, :published) + | 9 | check_box(:article, :published) + |
| 10 | content_tag('label', _('This article must be published (visible to other people)'), :for => 'article_published') | 10 | content_tag('label', _('This article must be published (visible to other people)'), :for => 'article_published') |
| 11 | - ) + (article.parent && article.parent.forum? && controller.action_name == 'new' ? | 11 | + ) + |
| 12 | + | ||
| 13 | + (article.profile.has_members? ? | ||
| 14 | + content_tag( | ||
| 15 | + 'div', | ||
| 16 | + check_box(:article, :allow_members_to_edit) + | ||
| 17 | + content_tag('label', _('Allow all members to edit this article'), :for => 'article_allow_members_to_edit') | ||
| 18 | + ) : | ||
| 19 | + '') + | ||
| 20 | + | ||
| 21 | + (article.parent && article.parent.forum? && controller.action_name == 'new' ? | ||
| 12 | hidden_field_tag('article[accept_comments]', 1) : | 22 | hidden_field_tag('article[accept_comments]', 1) : |
| 13 | content_tag( | 23 | content_tag( |
| 14 | 'div', | 24 | 'div', |
| 15 | check_box(:article, :accept_comments) + | 25 | check_box(:article, :accept_comments) + |
| 16 | content_tag('label', (article.parent && article.parent.forum? ? _('This topic is opened for replies') : _('I want to receive comments about this article')), :for => 'article_accept_comments') | 26 | content_tag('label', (article.parent && article.parent.forum? ? _('This topic is opened for replies') : _('I want to receive comments about this article')), :for => 'article_accept_comments') |
| 17 | )) + | 27 | )) + |
| 28 | + | ||
| 18 | content_tag( | 29 | content_tag( |
| 19 | 'div', | 30 | 'div', |
| 20 | check_box(:article, :notify_comments) + | 31 | check_box(:article, :notify_comments) + |
| 21 | content_tag('label', _('I want to receive a notification of each comment written by e-mail'), :for => 'article_notify_comments') + | 32 | content_tag('label', _('I want to receive a notification of each comment written by e-mail'), :for => 'article_notify_comments') + |
| 22 | observe_field(:article_accept_comments, :function => "$('article_notify_comments').disabled = ! $('article_accept_comments').checked") | 33 | observe_field(:article_accept_comments, :function => "$('article_notify_comments').disabled = ! $('article_accept_comments').checked") |
| 23 | - ) + (article.can_display_hits? ? | 34 | + ) + |
| 35 | + | ||
| 36 | + (article.can_display_hits? ? | ||
| 24 | content_tag( | 37 | content_tag( |
| 25 | 'div', | 38 | 'div', |
| 26 | check_box(:article, :display_hits) + | 39 | check_box(:article, :display_hits) + |
app/models/article.rb
| @@ -26,6 +26,7 @@ class Article < ActiveRecord::Base | @@ -26,6 +26,7 @@ class Article < ActiveRecord::Base | ||
| 26 | 26 | ||
| 27 | settings_items :display_hits, :type => :boolean, :default => true | 27 | settings_items :display_hits, :type => :boolean, :default => true |
| 28 | settings_items :author_name, :type => :string, :default => "" | 28 | settings_items :author_name, :type => :string, :default => "" |
| 29 | + settings_items :allow_members_to_edit, :type => :boolean, :default => false | ||
| 29 | 30 | ||
| 30 | belongs_to :reference_article, :class_name => "Article", :foreign_key => 'reference_article_id' | 31 | belongs_to :reference_article, :class_name => "Article", :foreign_key => 'reference_article_id' |
| 31 | 32 | ||
| @@ -408,6 +409,17 @@ class Article < ActiveRecord::Base | @@ -408,6 +409,17 @@ class Article < ActiveRecord::Base | ||
| 408 | user && user.has_permission?('view_private_content', profile) | 409 | user && user.has_permission?('view_private_content', profile) |
| 409 | end | 410 | end |
| 410 | 411 | ||
| 412 | + alias :allow_delete? :allow_post_content? | ||
| 413 | + alias :allow_spread? :allow_post_content? | ||
| 414 | + | ||
| 415 | + def allow_create?(user) | ||
| 416 | + allow_post_content?(user) || allow_publish_content?(user) | ||
| 417 | + end | ||
| 418 | + | ||
| 419 | + def allow_edit?(user) | ||
| 420 | + allow_post_content?(user) || user && allow_members_to_edit && user.is_member_of?(profile) | ||
| 421 | + end | ||
| 422 | + | ||
| 411 | def comments_updated | 423 | def comments_updated |
| 412 | ferret_update | 424 | ferret_update |
| 413 | end | 425 | end |
app/models/environment.rb
| @@ -94,7 +94,6 @@ class Environment < ActiveRecord::Base | @@ -94,7 +94,6 @@ class Environment < ActiveRecord::Base | ||
| 94 | 'disable_asset_events' => _('Disable search for events'), | 94 | 'disable_asset_events' => _('Disable search for events'), |
| 95 | 'disable_products_for_enterprises' => __('Disable products for enterprises'), | 95 | 'disable_products_for_enterprises' => __('Disable products for enterprises'), |
| 96 | 'disable_categories' => _('Disable categories'), | 96 | 'disable_categories' => _('Disable categories'), |
| 97 | - 'disable_cms' => _('Disable CMS'), | ||
| 98 | 'disable_header_and_footer' => _('Disable header/footer editing by users'), | 97 | 'disable_header_and_footer' => _('Disable header/footer editing by users'), |
| 99 | 'disable_gender_icon' => _('Disable gender icon'), | 98 | 'disable_gender_icon' => _('Disable gender icon'), |
| 100 | 'disable_categories_menu' => _('Disable the categories menu'), | 99 | 'disable_categories_menu' => _('Disable the categories menu'), |
| @@ -122,6 +121,7 @@ class Environment < ActiveRecord::Base | @@ -122,6 +121,7 @@ class Environment < ActiveRecord::Base | ||
| 122 | 'xmpp_chat' => _('XMPP/Jabber based chat'), | 121 | 'xmpp_chat' => _('XMPP/Jabber based chat'), |
| 123 | 'show_zoom_button_on_article_images' => _('Show a zoom link on all article images'), | 122 | 'show_zoom_button_on_article_images' => _('Show a zoom link on all article images'), |
| 124 | 'captcha_for_logged_users' => _('Ask captcha when a logged user comments too'), | 123 | 'captcha_for_logged_users' => _('Ask captcha when a logged user comments too'), |
| 124 | + 'skip_new_user_email_confirmation' => _('Skip e-mail confirmation for new users') | ||
| 125 | } | 125 | } |
| 126 | end | 126 | end |
| 127 | 127 |
app/models/user.rb
| @@ -35,6 +35,9 @@ class User < ActiveRecord::Base | @@ -35,6 +35,9 @@ class User < ActiveRecord::Base | ||
| 35 | user.person.name ||= user.login | 35 | user.person.name ||= user.login |
| 36 | user.person.visible = false unless user.activated? | 36 | user.person.visible = false unless user.activated? |
| 37 | user.person.save! | 37 | user.person.save! |
| 38 | + if user.environment && user.environment.enabled?('skip_new_user_email_confirmation') | ||
| 39 | + user.activate | ||
| 40 | + end | ||
| 38 | end | 41 | end |
| 39 | after_create :deliver_activation_code | 42 | after_create :deliver_activation_code |
| 40 | after_create :delay_activation_check | 43 | after_create :delay_activation_check |
app/views/cms/_tiny_mce_article.rhtml
| @@ -3,13 +3,7 @@ | @@ -3,13 +3,7 @@ | ||
| 3 | <%= render :file => 'shared/tiny_mce' %> | 3 | <%= render :file => 'shared/tiny_mce' %> |
| 4 | 4 | ||
| 5 | <div> | 5 | <div> |
| 6 | - <% if profile.enterprise? && environment.enabled?('disable_cms') && !@article.name.blank? %> | ||
| 7 | - <div> | ||
| 8 | - <%= _('Title') %>: <%= @article.name %> | ||
| 9 | - </div> | ||
| 10 | - <% else %> | ||
| 11 | - <%= required labelled_form_field(_('Title'), text_field(:article, 'name', :size => '64')) %> | ||
| 12 | - <% end %> | 6 | + <%= required labelled_form_field(_('Title'), text_field(:article, 'name', :size => '64')) %> |
| 13 | 7 | ||
| 14 | <%= render :partial => 'translatable' %> | 8 | <%= render :partial => 'translatable' %> |
| 15 | <%= render :partial => 'shared/lead_and_body', :locals => {:tiny_mce => true} %> | 9 | <%= render :partial => 'shared/lead_and_body', :locals => {:tiny_mce => true} %> |
app/views/content_viewer/_article_toolbar.rhtml
| 1 | -<div<%= " class='logged-in'" if user %>> | 1 | +<div<%= user && " class='logged-in'" %>> |
| 2 | <div id="article-actions"> | 2 | <div id="article-actions"> |
| 3 | - <% if @page.allow_post_content?(user) || @page.allow_publish_content?(user) %> | ||
| 4 | - <% if @page.allow_post_content?(user) %> | ||
| 5 | - <%= link_to content_tag( 'span', label_for_edit_article(@page) ), | ||
| 6 | - profile.admin_url.merge({ :controller => 'cms', :action => 'edit', :id => @page.id }), | ||
| 7 | - :class => 'button with-text icon-edit' %> | ||
| 8 | - <% if !(profile.kind_of?(Enterprise) && environment.enabled?('disable_cms')) %> | ||
| 9 | - <% if @page != profile.home_page && !@page.has_posts? %> | ||
| 10 | - <%= link_to content_tag( 'span', _('Delete') ), | ||
| 11 | - profile.admin_url.merge({ :controller => 'cms', :action => 'destroy', :id => @page}), | ||
| 12 | - :method => :post, | ||
| 13 | - :class => 'button with-text icon-delete', | ||
| 14 | - :confirm => delete_article_message(@page) %> | ||
| 15 | - <% end %> | ||
| 16 | - <% if !environment.enabled?('disable_cms') && !@page.folder? %> | ||
| 17 | - <% if profile.kind_of?(Person) %> | ||
| 18 | - <%= link_to content_tag( 'span', _('Spread this') ), | ||
| 19 | - profile.admin_url.merge({ :controller => 'cms', :action => 'publish', :id => @page }), | ||
| 20 | - :class => 'button with-text icon-spread' %> | ||
| 21 | - <% elsif profile.kind_of?(Community) && environment.portal_community %> | ||
| 22 | - <%= link_to content_tag( 'span', _('Spread this') ), | ||
| 23 | - profile.admin_url.merge({ :controller => 'cms', :action => 'publish_on_portal_community', :id => @page }), | ||
| 24 | - :class => 'button with-text icon-spread' %> | ||
| 25 | - <% end %> | ||
| 26 | - <% end %> | ||
| 27 | - <% end %> | ||
| 28 | - <% end %> | ||
| 29 | - <% if !(profile.kind_of?(Enterprise) && environment.enabled?('disable_cms')) %> | ||
| 30 | - <% if !@page.gallery? %> | ||
| 31 | - <%= link_to _('Add translation'), | ||
| 32 | - profile.admin_url.merge(:controller => 'cms', :action => 'new', | ||
| 33 | - :parent_id => (@page.folder? ? @page : (@page.parent.nil? ? nil : @page.parent)), | ||
| 34 | - :type => @page.type, :article => { :translation_of_id => @page.native_translation.id }), | ||
| 35 | - :class => 'button with-text icon-locale' if @page.translatable? && !@page.native_translation.language.blank? %> | ||
| 36 | - <%= lightbox_remote_button(:new, label_for_new_article(@page), profile.admin_url.merge(:controller => 'cms', :action => 'new', :parent_id => (@page.folder? ? @page : (@page.parent.nil? ? nil : @page.parent)))) %> | ||
| 37 | - <% end %> | ||
| 38 | - <% end %> | ||
| 39 | - <% if @page.accept_uploads? %> | ||
| 40 | - <%= button('upload-file', _('Upload files'), profile.admin_url.merge(:controller => 'cms', :action => 'upload_files', :parent_id => (@page.folder? ? @page : @page.parent))) %> | 3 | + |
| 4 | + <% if @page.allow_edit?(user) %> | ||
| 5 | + <%= link_to content_tag( 'span', label_for_edit_article(@page) ), | ||
| 6 | + profile.admin_url.merge({ :controller => 'cms', :action => 'edit', :id => @page.id }), | ||
| 7 | + :class => 'button with-text icon-edit' %> | ||
| 8 | + <% end %> | ||
| 9 | + | ||
| 10 | + <% if @page != profile.home_page && !@page.has_posts? && @page.allow_delete?(user) %> | ||
| 11 | + <%= link_to content_tag( 'span', _('Delete') ), | ||
| 12 | + profile.admin_url.merge({ :controller => 'cms', :action => 'destroy', :id => @page}), | ||
| 13 | + :method => :post, | ||
| 14 | + :class => 'button with-text icon-delete', | ||
| 15 | + :confirm => delete_article_message(@page) %> | ||
| 16 | + <% end %> | ||
| 17 | + | ||
| 18 | + <% if !@page.folder? && @page.allow_spread?(user) %> | ||
| 19 | + <% if profile.kind_of?(Person) %> | ||
| 20 | + <%= link_to content_tag( 'span', _('Spread this') ), | ||
| 21 | + profile.admin_url.merge({ :controller => 'cms', :action => 'publish', :id => @page }), | ||
| 22 | + :class => 'button with-text icon-spread' %> | ||
| 23 | + <% elsif profile.kind_of?(Community) && environment.portal_community %> | ||
| 24 | + <%= link_to content_tag( 'span', _('Spread this') ), | ||
| 25 | + profile.admin_url.merge({ :controller => 'cms', :action => 'publish_on_portal_community', :id => @page }), | ||
| 26 | + :class => 'button with-text icon-spread' %> | ||
| 41 | <% end %> | 27 | <% end %> |
| 28 | + <% end %> | ||
| 29 | + | ||
| 30 | + <% if !@page.gallery? && @page.allow_create?(user) %> | ||
| 31 | + <%= link_to _('Add translation'), | ||
| 32 | + profile.admin_url.merge(:controller => 'cms', :action => 'new', | ||
| 33 | + :parent_id => (@page.folder? ? @page : (@page.parent.nil? ? nil : @page.parent)), | ||
| 34 | + :type => @page.type, :article => { :translation_of_id => @page.native_translation.id }), | ||
| 35 | + :class => @page.translatable? && !@page.native_translation.language.blank? && 'button with-text icon-locale' %> | ||
| 36 | + <%= lightbox_remote_button(:new, label_for_new_article(@page), profile.admin_url.merge(:controller => 'cms', :action => 'new', :parent_id => (@page.folder? ? @page : (@page.parent.nil? ? nil : @page.parent)))) %> | ||
| 37 | + <% end %> | ||
| 38 | + | ||
| 39 | + <% if @page.accept_uploads? && @page.allow_create?(user) %> | ||
| 40 | + <%= button('upload-file', _('Upload files'), profile.admin_url.merge(:controller => 'cms', :action => 'upload_files', :parent_id => (@page.folder? ? @page : @page.parent))) %> | ||
| 41 | + <% end %> | ||
| 42 | 42 | ||
| 43 | - <% elsif profile.community? && (@page.blog? || @page.parent && @page.parent.blog?) %> | 43 | + <% if !@page.allow_create?(user) && profile.community? && (@page.blog? || @page.parent && @page.parent.blog?) %> |
| 44 | <%= link_to content_tag( 'span', _('Suggest an article') ), profile.admin_url.merge({ :controller => 'cms', :action => 'suggest_an_article'}), :id => 'suggest-article-link', :class => 'button with-text icon-new' %> | 44 | <%= link_to content_tag( 'span', _('Suggest an article') ), profile.admin_url.merge({ :controller => 'cms', :action => 'suggest_an_article'}), :id => 'suggest-article-link', :class => 'button with-text icon-new' %> |
| 45 | <% end %> | 45 | <% end %> |
| 46 | 46 |
app/views/profile_editor/index.rhtml
| @@ -26,7 +26,7 @@ | @@ -26,7 +26,7 @@ | ||
| 26 | 26 | ||
| 27 | <%= control_panel_button(_('Edit Header and Footer'), 'header-and-footer', :controller => 'profile_editor', :action => 'header_footer') unless profile.enterprise? && environment.enabled?('disable_header_and_footer') && !user.is_admin?(environment) %> | 27 | <%= control_panel_button(_('Edit Header and Footer'), 'header-and-footer', :controller => 'profile_editor', :action => 'header_footer') unless profile.enterprise? && environment.enabled?('disable_header_and_footer') && !user.is_admin?(environment) %> |
| 28 | 28 | ||
| 29 | - <%= control_panel_button(_('Manage Content'), 'cms', :controller => 'cms') if !environment.enabled?('disable_cms') || profile.community? %> | 29 | + <%= control_panel_button(_('Manage Content'), 'cms', :controller => 'cms') %> |
| 30 | 30 | ||
| 31 | <% unless profile.enterprise? %> | 31 | <% unless profile.enterprise? %> |
| 32 | <%= case profile.blogs.count | 32 | <%= case profile.blogs.count |
features/delete_profile.feature
| @@ -98,13 +98,6 @@ Feature: delete profile | @@ -98,13 +98,6 @@ Feature: delete profile | ||
| 98 | And I go to /myprofile/sample-enterprise/profile_editor/destroy_profile | 98 | And I go to /myprofile/sample-enterprise/profile_editor/destroy_profile |
| 99 | Then I should see "Access denied" | 99 | Then I should see "Access denied" |
| 100 | 100 | ||
| 101 | - Scenario: community regular member cannot see link to delete profile | ||
| 102 | - Given "Joao Silva" is a member of "Sample Community" | ||
| 103 | - And I am logged in as "joaosilva" | ||
| 104 | - And I am on Sample Community's control panel | ||
| 105 | - When I follow "Community Info and settings" | ||
| 106 | - Then I should not see "Delete profile" | ||
| 107 | - | ||
| 108 | Scenario: environment admin deletes profile | 101 | Scenario: environment admin deletes profile |
| 109 | Given I am logged in as admin | 102 | Given I am logged in as admin |
| 110 | And I am on Joao Silva's control panel | 103 | And I am on Joao Silva's control panel |
lib/noosfero/i18n.rb
| @@ -12,7 +12,6 @@ repos = [] | @@ -12,7 +12,6 @@ repos = [] | ||
| 12 | if File.exists?(locale_dir) | 12 | if File.exists?(locale_dir) |
| 13 | repos << FastGettext::TranslationRepository.build('noosfero', :type => 'mo', :path => locale_dir) | 13 | repos << FastGettext::TranslationRepository.build('noosfero', :type => 'mo', :path => locale_dir) |
| 14 | repos << FastGettext::TranslationRepository.build('iso_3166', :type => 'mo', :path => locale_dir) | 14 | repos << FastGettext::TranslationRepository.build('iso_3166', :type => 'mo', :path => locale_dir) |
| 15 | - repos << FastGettext::TranslationRepository.build('rails', :type => 'mo', :path => locale_dir) | ||
| 16 | end | 15 | end |
| 17 | 16 | ||
| 18 | FastGettext.add_text_domain 'noosferofull', :type => :chain, :chain => repos | 17 | FastGettext.add_text_domain 'noosferofull', :type => :chain, :chain => repos |
lib/tasks/gettext.rake
| @@ -26,7 +26,7 @@ task :symlinkmo do | @@ -26,7 +26,7 @@ task :symlinkmo do | ||
| 26 | lang = File.basename(dir) | 26 | lang = File.basename(dir) |
| 27 | orig_lang = langmap[lang] || lang | 27 | orig_lang = langmap[lang] || lang |
| 28 | mkdir_p("#{Rails.root}/locale/#{lang}/LC_MESSAGES") | 28 | mkdir_p("#{Rails.root}/locale/#{lang}/LC_MESSAGES") |
| 29 | - ['iso_3166', 'rails'].each do |domain| | 29 | + ['iso_3166'].each do |domain| |
| 30 | origin = "/usr/share/locale/#{orig_lang}/LC_MESSAGES/#{domain}.mo" | 30 | origin = "/usr/share/locale/#{orig_lang}/LC_MESSAGES/#{domain}.mo" |
| 31 | target = "#{Rails.root}/locale/#{lang}/LC_MESSAGES/#{domain}.mo" | 31 | target = "#{Rails.root}/locale/#{lang}/LC_MESSAGES/#{domain}.mo" |
| 32 | if !File.symlink?(target) | 32 | if !File.symlink?(target) |
script/quick-start-debian
| @@ -22,7 +22,7 @@ run sudo apt-get -y install $runtime_dependencies | @@ -22,7 +22,7 @@ run sudo apt-get -y install $runtime_dependencies | ||
| 22 | 22 | ||
| 23 | # needed for development | 23 | # needed for development |
| 24 | run sudo apt-get -y install libtidy-ruby libhpricot-ruby libmocha-ruby imagemagick po4a xvfb libxml2-dev libxslt-dev | 24 | run sudo apt-get -y install libtidy-ruby libhpricot-ruby libmocha-ruby imagemagick po4a xvfb libxml2-dev libxslt-dev |
| 25 | -run gem install bundler | 25 | +gem which bundler >/dev/null 2>&1 || run gem install bundler |
| 26 | run bundle install | 26 | run bundle install |
| 27 | 27 | ||
| 28 | # create the database with sample data | 28 | # create the database with sample data |
| @@ -34,7 +34,10 @@ run rake db:test:prepare | @@ -34,7 +34,10 @@ run rake db:test:prepare | ||
| 34 | # compile translations | 34 | # compile translations |
| 35 | run rake noosfero:translations:compile | 35 | run rake noosfero:translations:compile |
| 36 | 36 | ||
| 37 | -# start server | 37 | +# create needed directory |
| 38 | +mkdir -p tmp/pids | ||
| 39 | + | ||
| 40 | +# you can now start the server | ||
| 38 | say "I: Congratulations, you are ready to run Noosfero." | 41 | say "I: Congratulations, you are ready to run Noosfero." |
| 39 | -say "I: To execute Noosfero server, run \`/script/server-say "I: To execute Noosfero server, run \`/script/server and browse to http://localhost:3000" | 42 | +say "I: To execute Noosfero in development mode, run \`/script/development+say "I: To execute Noosfero in development mode, run \`/script/development and browse to http://localhost:3000" |
| 40 | say "I: To execute Noosfero tests, run \`rake\`." | 43 | say "I: To execute Noosfero tests, run \`rake\`." |
test/factories.rb
| @@ -71,7 +71,8 @@ module Noosfero::Factory | @@ -71,7 +71,8 @@ module Noosfero::Factory | ||
| 71 | # testing that passes through the actual user creation process. | 71 | # testing that passes through the actual user creation process. |
| 72 | # | 72 | # |
| 73 | # Be aware that this is slow, though. | 73 | # Be aware that this is slow, though. |
| 74 | - def create_user_full(name, options = {}, person_options = {}) | 74 | + def create_user_full(name = nil, options = {}, person_options = {}) |
| 75 | + name ||= 'user' + factory_num_seq.to_s | ||
| 75 | data = { | 76 | data = { |
| 76 | :login => name, | 77 | :login => name, |
| 77 | :email => name + '@noosfero.org', | 78 | :email => name + '@noosfero.org', |
| @@ -90,7 +91,8 @@ module Noosfero::Factory | @@ -90,7 +91,8 @@ module Noosfero::Factory | ||
| 90 | 91 | ||
| 91 | # This method knows way too much about the model. But since creating an | 92 | # This method knows way too much about the model. But since creating an |
| 92 | # actual user is really expensive, for tests we need a fast alternative. | 93 | # actual user is really expensive, for tests we need a fast alternative. |
| 93 | - def create_user(name, options = {}, person_options = {}) | 94 | + def create_user(name = nil, options = {}, person_options = {}) |
| 95 | + name ||= 'user' + factory_num_seq.to_s | ||
| 94 | environment_id = options.delete(:environment_id) || (options.delete(:environment) || Environment.default).id | 96 | environment_id = options.delete(:environment_id) || (options.delete(:environment) || Environment.default).id |
| 95 | 97 | ||
| 96 | password = options.delete(:password) | 98 | password = options.delete(:password) |
test/fixtures/roles.yml
| @@ -58,9 +58,7 @@ profile_member: | @@ -58,9 +58,7 @@ profile_member: | ||
| 58 | name: 'Profile Member' | 58 | name: 'Profile Member' |
| 59 | system: true | 59 | system: true |
| 60 | permissions: | 60 | permissions: |
| 61 | - - edit_profile | ||
| 62 | - - post_content | ||
| 63 | - - manage_products | 61 | + - invite_members |
| 64 | profile_moderator: | 62 | profile_moderator: |
| 65 | id: 7 | 63 | id: 7 |
| 66 | environment_id: 1 | 64 | environment_id: 1 |
test/functional/account_controller_test.rb
| @@ -737,6 +737,16 @@ class AccountControllerTest < ActionController::TestCase | @@ -737,6 +737,16 @@ class AccountControllerTest < ActionController::TestCase | ||
| 737 | end | 737 | end |
| 738 | end | 738 | end |
| 739 | 739 | ||
| 740 | + should 'login after signup when no e-mail confirmation is required' do | ||
| 741 | + e = Environment.default | ||
| 742 | + e.enable('skip_new_user_email_confirmation') | ||
| 743 | + e.save! | ||
| 744 | + | ||
| 745 | + new_user | ||
| 746 | + assert_response :redirect | ||
| 747 | + assert_not_nil assigns(:current_user) | ||
| 748 | + end | ||
| 749 | + | ||
| 740 | protected | 750 | protected |
| 741 | def new_user(options = {}, extra_options ={}) | 751 | def new_user(options = {}, extra_options ={}) |
| 742 | data = {:profile_data => person_data} | 752 | data = {:profile_data => person_data} |
test/functional/cms_controller_test.rb
| @@ -15,7 +15,6 @@ class CmsControllerTest < ActionController::TestCase | @@ -15,7 +15,6 @@ class CmsControllerTest < ActionController::TestCase | ||
| 15 | 15 | ||
| 16 | @profile = create_user_with_permission('testinguser', 'post_content') | 16 | @profile = create_user_with_permission('testinguser', 'post_content') |
| 17 | login_as :testinguser | 17 | login_as :testinguser |
| 18 | - @controller.stubs(:user).returns(@profile) | ||
| 19 | end | 18 | end |
| 20 | 19 | ||
| 21 | attr_reader :profile | 20 | attr_reader :profile |
| @@ -601,12 +600,14 @@ class CmsControllerTest < ActionController::TestCase | @@ -601,12 +600,14 @@ class CmsControllerTest < ActionController::TestCase | ||
| 601 | 600 | ||
| 602 | should 'not make enterprise homepage available to person' do | 601 | should 'not make enterprise homepage available to person' do |
| 603 | @controller.stubs(:profile).returns(profile) | 602 | @controller.stubs(:profile).returns(profile) |
| 604 | - assert_not_includes @controller.available_article_types, EnterpriseHomepage | 603 | + @controller.stubs(:user).returns(profile) |
| 604 | + assert_not_includes available_article_types, EnterpriseHomepage | ||
| 605 | end | 605 | end |
| 606 | 606 | ||
| 607 | should 'make enterprise homepage available to enterprises' do | 607 | should 'make enterprise homepage available to enterprises' do |
| 608 | @controller.stubs(:profile).returns(fast_create(Enterprise, :name => 'test_ent', :identifier => 'test_ent')) | 608 | @controller.stubs(:profile).returns(fast_create(Enterprise, :name => 'test_ent', :identifier => 'test_ent')) |
| 609 | - assert_includes @controller.available_article_types, EnterpriseHomepage | 609 | + @controller.stubs(:user).returns(profile) |
| 610 | + assert_includes available_article_types, EnterpriseHomepage | ||
| 610 | end | 611 | end |
| 611 | 612 | ||
| 612 | should 'update categories' do | 613 | should 'update categories' do |
| @@ -838,18 +839,20 @@ class CmsControllerTest < ActionController::TestCase | @@ -838,18 +839,20 @@ class CmsControllerTest < ActionController::TestCase | ||
| 838 | 839 | ||
| 839 | should 'not offer folder to blog articles' do | 840 | should 'not offer folder to blog articles' do |
| 840 | @controller.stubs(:profile).returns(fast_create(Enterprise, :name => 'test_ent', :identifier => 'test_ent')) | 841 | @controller.stubs(:profile).returns(fast_create(Enterprise, :name => 'test_ent', :identifier => 'test_ent')) |
| 842 | + @controller.stubs(:user).returns(profile) | ||
| 841 | blog = Blog.create!(:name => 'Blog for test', :profile => profile) | 843 | blog = Blog.create!(:name => 'Blog for test', :profile => profile) |
| 842 | @controller.stubs(:params).returns({ :parent_id => blog.id }) | 844 | @controller.stubs(:params).returns({ :parent_id => blog.id }) |
| 843 | 845 | ||
| 844 | - assert_not_includes @controller.available_article_types, Folder | 846 | + assert_not_includes available_article_types, Folder |
| 845 | end | 847 | end |
| 846 | 848 | ||
| 847 | should 'not offer rssfeed to blog articles' do | 849 | should 'not offer rssfeed to blog articles' do |
| 848 | @controller.stubs(:profile).returns(fast_create(Enterprise, :name => 'test_ent', :identifier => 'test_ent')) | 850 | @controller.stubs(:profile).returns(fast_create(Enterprise, :name => 'test_ent', :identifier => 'test_ent')) |
| 851 | + @controller.stubs(:user).returns(profile) | ||
| 849 | blog = Blog.create!(:name => 'Blog for test', :profile => profile) | 852 | blog = Blog.create!(:name => 'Blog for test', :profile => profile) |
| 850 | @controller.stubs(:params).returns({ :parent_id => blog.id }) | 853 | @controller.stubs(:params).returns({ :parent_id => blog.id }) |
| 851 | 854 | ||
| 852 | - assert_not_includes @controller.available_article_types, RssFeed | 855 | + assert_not_includes available_article_types, RssFeed |
| 853 | end | 856 | end |
| 854 | 857 | ||
| 855 | should 'update blog posts_per_page setting' do | 858 | should 'update blog posts_per_page setting' do |
| @@ -1140,6 +1143,21 @@ class CmsControllerTest < ActionController::TestCase | @@ -1140,6 +1143,21 @@ class CmsControllerTest < ActionController::TestCase | ||
| 1140 | assert_template 'edit' | 1143 | assert_template 'edit' |
| 1141 | end | 1144 | end |
| 1142 | 1145 | ||
| 1146 | + should 'allow community members to edit articles that allow it' do | ||
| 1147 | + community = fast_create(Community) | ||
| 1148 | + admin = create_user('community-admin').person | ||
| 1149 | + member = create_user.person | ||
| 1150 | + | ||
| 1151 | + community.add_admin(admin) | ||
| 1152 | + community.add_member(member) | ||
| 1153 | + | ||
| 1154 | + article = community.articles.create!(:name => 'test_article', :allow_members_to_edit => true) | ||
| 1155 | + | ||
| 1156 | + login_as member.identifier | ||
| 1157 | + get :edit, :profile => community.identifier, :id => article.id | ||
| 1158 | + assert_response :success | ||
| 1159 | + end | ||
| 1160 | + | ||
| 1143 | should 'create thumbnails for images with delayed_job' do | 1161 | should 'create thumbnails for images with delayed_job' do |
| 1144 | post :upload_files, :profile => profile.identifier, :uploaded_files => [fixture_file_upload('/files/rails.png', 'image/png'), fixture_file_upload('/files/test.txt', 'text/plain')] | 1162 | post :upload_files, :profile => profile.identifier, :uploaded_files => [fixture_file_upload('/files/rails.png', 'image/png'), fixture_file_upload('/files/test.txt', 'text/plain')] |
| 1145 | file_1 = profile.articles.find_by_path('rails.png') | 1163 | file_1 = profile.articles.find_by_path('rails.png') |
| @@ -1203,18 +1221,20 @@ class CmsControllerTest < ActionController::TestCase | @@ -1203,18 +1221,20 @@ class CmsControllerTest < ActionController::TestCase | ||
| 1203 | 1221 | ||
| 1204 | should 'not offer folder to forum articles' do | 1222 | should 'not offer folder to forum articles' do |
| 1205 | @controller.stubs(:profile).returns(fast_create(Enterprise, :name => 'test_ent', :identifier => 'test_ent')) | 1223 | @controller.stubs(:profile).returns(fast_create(Enterprise, :name => 'test_ent', :identifier => 'test_ent')) |
| 1224 | + @controller.stubs(:user).returns(profile) | ||
| 1206 | forum = Forum.create!(:name => 'Forum for test', :profile => profile) | 1225 | forum = Forum.create!(:name => 'Forum for test', :profile => profile) |
| 1207 | @controller.stubs(:params).returns({ :parent_id => forum.id }) | 1226 | @controller.stubs(:params).returns({ :parent_id => forum.id }) |
| 1208 | 1227 | ||
| 1209 | - assert_not_includes @controller.available_article_types, Folder | 1228 | + assert_not_includes available_article_types, Folder |
| 1210 | end | 1229 | end |
| 1211 | 1230 | ||
| 1212 | should 'not offer rssfeed to forum articles' do | 1231 | should 'not offer rssfeed to forum articles' do |
| 1213 | @controller.stubs(:profile).returns(fast_create(Enterprise, :name => 'test_ent', :identifier => 'test_ent')) | 1232 | @controller.stubs(:profile).returns(fast_create(Enterprise, :name => 'test_ent', :identifier => 'test_ent')) |
| 1233 | + @controller.stubs(:user).returns(profile) | ||
| 1214 | forum = Forum.create!(:name => 'Forum for test', :profile => profile) | 1234 | forum = Forum.create!(:name => 'Forum for test', :profile => profile) |
| 1215 | @controller.stubs(:params).returns({ :parent_id => forum.id }) | 1235 | @controller.stubs(:params).returns({ :parent_id => forum.id }) |
| 1216 | 1236 | ||
| 1217 | - assert_not_includes @controller.available_article_types, RssFeed | 1237 | + assert_not_includes available_article_types, RssFeed |
| 1218 | end | 1238 | end |
| 1219 | 1239 | ||
| 1220 | should 'update forum posts_per_page setting' do | 1240 | should 'update forum posts_per_page setting' do |
| @@ -1499,20 +1519,12 @@ class CmsControllerTest < ActionController::TestCase | @@ -1499,20 +1519,12 @@ class CmsControllerTest < ActionController::TestCase | ||
| 1499 | assert_nil data[1]['error'] | 1519 | assert_nil data[1]['error'] |
| 1500 | end | 1520 | end |
| 1501 | 1521 | ||
| 1502 | - protected | ||
| 1503 | - | ||
| 1504 | - # FIXME this is to avoid adding an extra dependency for a proper JSON parser. | ||
| 1505 | - # For now we are assuming that the JSON is close enough to Ruby and just | ||
| 1506 | - # making some adjustments. | ||
| 1507 | - def parse_json_response | ||
| 1508 | - eval(@response.body.gsub('":', '"=>').gsub('null', 'nil')) | ||
| 1509 | - end | ||
| 1510 | - | ||
| 1511 | should 'make RawHTMLArticle available only to environment admins' do | 1522 | should 'make RawHTMLArticle available only to environment admins' do |
| 1512 | @controller.stubs(:profile).returns(profile) | 1523 | @controller.stubs(:profile).returns(profile) |
| 1513 | - assert_not_includes @controller.available_article_types, RawHTMLArticle | 1524 | + @controller.stubs(:user).returns(profile) |
| 1525 | + assert_not_includes available_article_types, RawHTMLArticle | ||
| 1514 | profile.environment.add_admin(profile) | 1526 | profile.environment.add_admin(profile) |
| 1515 | - assert_includes @controller.available_article_types, RawHTMLArticle | 1527 | + assert_includes available_article_types, RawHTMLArticle |
| 1516 | end | 1528 | end |
| 1517 | 1529 | ||
| 1518 | should 'include new contents special types from plugins' do | 1530 | should 'include new contents special types from plugins' do |
| @@ -1526,8 +1538,25 @@ class CmsControllerTest < ActionController::TestCase | @@ -1526,8 +1538,25 @@ class CmsControllerTest < ActionController::TestCase | ||
| 1526 | 1538 | ||
| 1527 | get :index, :profile => profile.identifier | 1539 | get :index, :profile => profile.identifier |
| 1528 | 1540 | ||
| 1529 | - assert_includes @controller.special_article_types, Integer | ||
| 1530 | - assert_includes @controller.special_article_types, Float | 1541 | + assert_includes special_article_types, Integer |
| 1542 | + assert_includes special_article_types, Float | ||
| 1543 | + end | ||
| 1544 | + | ||
| 1545 | + protected | ||
| 1546 | + | ||
| 1547 | + # FIXME this is to avoid adding an extra dependency for a proper JSON parser. | ||
| 1548 | + # For now we are assuming that the JSON is close enough to Ruby and just | ||
| 1549 | + # making some adjustments. | ||
| 1550 | + def parse_json_response | ||
| 1551 | + eval(@response.body.gsub('":', '"=>').gsub('null', 'nil')) | ||
| 1552 | + end | ||
| 1553 | + | ||
| 1554 | + def available_article_types | ||
| 1555 | + @controller.send(:available_article_types) | ||
| 1556 | + end | ||
| 1557 | + | ||
| 1558 | + def special_article_types | ||
| 1559 | + @controller.send(:special_article_types) | ||
| 1531 | end | 1560 | end |
| 1532 | 1561 | ||
| 1533 | end | 1562 | end |
test/functional/profile_editor_controller_test.rb
| @@ -601,15 +601,6 @@ class ProfileEditorControllerTest < ActionController::TestCase | @@ -601,15 +601,6 @@ class ProfileEditorControllerTest < ActionController::TestCase | ||
| 601 | assert_tag :tag => 'a', :attributes => { :href => '/myprofile/default_user/cms' } | 601 | assert_tag :tag => 'a', :attributes => { :href => '/myprofile/default_user/cms' } |
| 602 | end | 602 | end |
| 603 | 603 | ||
| 604 | - should 'not display link to CMS if disabled' do | ||
| 605 | - env = Environment.default | ||
| 606 | - env.enable('disable_cms') | ||
| 607 | - env.save! | ||
| 608 | - get :index, :profile => profile.identifier | ||
| 609 | - | ||
| 610 | - assert_no_tag :tag => 'a', :attributes => { :href => '/myprofile/default_user/cms' } | ||
| 611 | - end | ||
| 612 | - | ||
| 613 | should 'offer to create blog in control panel' do | 604 | should 'offer to create blog in control panel' do |
| 614 | get :index, :profile => profile.identifier | 605 | get :index, :profile => profile.identifier |
| 615 | assert_tag :tag => 'a', :attributes => { :href => "/myprofile/default_user/cms/new?type=Blog" } | 606 | assert_tag :tag => 'a', :attributes => { :href => "/myprofile/default_user/cms/new?type=Blog" } |
test/unit/article_test.rb
| @@ -1638,4 +1638,37 @@ class ArticleTest < ActiveSupport::TestCase | @@ -1638,4 +1638,37 @@ class ArticleTest < ActiveSupport::TestCase | ||
| 1638 | assert_equal [c1,c2,c5], Article.text_articles | 1638 | assert_equal [c1,c2,c5], Article.text_articles |
| 1639 | end | 1639 | end |
| 1640 | 1640 | ||
| 1641 | + should 'not allow all community members to edit by default' do | ||
| 1642 | + community = fast_create(Community) | ||
| 1643 | + admin = create_user('community-admin').person | ||
| 1644 | + member = create_user.person | ||
| 1645 | + | ||
| 1646 | + community.add_admin(admin) | ||
| 1647 | + community.add_member(member) | ||
| 1648 | + a = Article.new(:profile => community) | ||
| 1649 | + | ||
| 1650 | + assert_equal false, a.allow_members_to_edit | ||
| 1651 | + assert_equal false, a.allow_edit?(member) | ||
| 1652 | + end | ||
| 1653 | + | ||
| 1654 | + should 'be able to allow all members of a community to edit' do | ||
| 1655 | + community = fast_create(Community) | ||
| 1656 | + admin = create_user('community-admin').person | ||
| 1657 | + member = create_user.person | ||
| 1658 | + | ||
| 1659 | + community.add_admin(admin) | ||
| 1660 | + community.add_member(member) | ||
| 1661 | + a = Article.new(:profile => community) | ||
| 1662 | + | ||
| 1663 | + a.allow_members_to_edit = true | ||
| 1664 | + | ||
| 1665 | + assert_equal true, a.allow_edit?(member) | ||
| 1666 | + end | ||
| 1667 | + | ||
| 1668 | + should 'not crash on allow_edit without a current user' do | ||
| 1669 | + a = build(Article) | ||
| 1670 | + a.allow_members_to_edit = true | ||
| 1671 | + assert !a.allow_edit?(nil) | ||
| 1672 | + end | ||
| 1673 | + | ||
| 1641 | end | 1674 | end |
test/unit/cms_helper_test.rb
| @@ -8,7 +8,7 @@ class CmsHelperTest < ActiveSupport::TestCase | @@ -8,7 +8,7 @@ class CmsHelperTest < ActiveSupport::TestCase | ||
| 8 | 8 | ||
| 9 | should 'show default options for article' do | 9 | should 'show default options for article' do |
| 10 | CmsHelperTest.any_instance.stubs(:controller).returns(ActionController::Base.new) | 10 | CmsHelperTest.any_instance.stubs(:controller).returns(ActionController::Base.new) |
| 11 | - result = options_for_article(RssFeed.new) | 11 | + result = options_for_article(RssFeed.new(:profile => Profile.new)) |
| 12 | assert_match /id="article_published" name="article\[published\]" type="checkbox" value="1"/, result | 12 | assert_match /id="article_published" name="article\[published\]" type="checkbox" value="1"/, result |
| 13 | assert_match /id="article_accept_comments" name="article\[accept_comments\]" type="checkbox" value="1"/, result | 13 | assert_match /id="article_accept_comments" name="article\[accept_comments\]" type="checkbox" value="1"/, result |
| 14 | end | 14 | end |
test/unit/user_test.rb
| @@ -478,6 +478,14 @@ class UserTest < ActiveSupport::TestCase | @@ -478,6 +478,14 @@ class UserTest < ActiveSupport::TestCase | ||
| 478 | end | 478 | end |
| 479 | end | 479 | end |
| 480 | 480 | ||
| 481 | + should 'activate right after creation when confirmation is not required' do | ||
| 482 | + e = Environment.default | ||
| 483 | + e.enable('skip_new_user_email_confirmation') | ||
| 484 | + e.save! | ||
| 485 | + | ||
| 486 | + assert new_user.activated? | ||
| 487 | + end | ||
| 488 | + | ||
| 481 | protected | 489 | protected |
| 482 | def new_user(options = {}) | 490 | def new_user(options = {}) |
| 483 | user = User.new({ :login => 'quire', :email => 'quire@example.com', :password => 'quire', :password_confirmation => 'quire' }.merge(options)) | 491 | user = User.new({ :login => 'quire', :email => 'quire@example.com', :password => 'quire', :password_confirmation => 'quire' }.merge(options)) |