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 | 15 | end |
16 | 16 | |
17 | 17 | before_filter :login_required, :except => [:suggest_an_article] |
18 | + | |
18 | 19 | protect_if :except => [:suggest_an_article, :set_home_page, :edit, :destroy, :publish] do |c, user, profile| |
19 | 20 | user && (user.has_permission?('post_content', profile) || user.has_permission?('publish_content', profile)) |
20 | 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 | 24 | profile.articles.find(c.params[:id]).allow_post_content?(user) |
24 | 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 | 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 | 33 | end |
55 | 34 | |
56 | 35 | def view |
... | ... | @@ -303,6 +282,33 @@ class CmsController < MyProfileController |
303 | 282 | |
304 | 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 | 312 | def record_coming |
307 | 313 | if request.post? |
308 | 314 | @back_to = params[:back_to] | ... | ... |
app/controllers/public/account_controller.rb
... | ... | @@ -78,7 +78,12 @@ class AccountController < ApplicationController |
78 | 78 | invitation.update_attributes!({:friend => @user.person}) |
79 | 79 | invitation.finish |
80 | 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 | 87 | end |
83 | 88 | rescue ActiveRecord::RecordInvalid |
84 | 89 | @person.valid? | ... | ... |
app/helpers/article_helper.rb
... | ... | @@ -8,19 +8,32 @@ module ArticleHelper |
8 | 8 | 'div', |
9 | 9 | check_box(:article, :published) + |
10 | 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 | 22 | hidden_field_tag('article[accept_comments]', 1) : |
13 | 23 | content_tag( |
14 | 24 | 'div', |
15 | 25 | check_box(:article, :accept_comments) + |
16 | 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 | 29 | content_tag( |
19 | 30 | 'div', |
20 | 31 | check_box(:article, :notify_comments) + |
21 | 32 | content_tag('label', _('I want to receive a notification of each comment written by e-mail'), :for => 'article_notify_comments') + |
22 | 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 | 37 | content_tag( |
25 | 38 | 'div', |
26 | 39 | check_box(:article, :display_hits) + | ... | ... |
app/models/article.rb
... | ... | @@ -26,6 +26,7 @@ class Article < ActiveRecord::Base |
26 | 26 | |
27 | 27 | settings_items :display_hits, :type => :boolean, :default => true |
28 | 28 | settings_items :author_name, :type => :string, :default => "" |
29 | + settings_items :allow_members_to_edit, :type => :boolean, :default => false | |
29 | 30 | |
30 | 31 | belongs_to :reference_article, :class_name => "Article", :foreign_key => 'reference_article_id' |
31 | 32 | |
... | ... | @@ -408,6 +409,17 @@ class Article < ActiveRecord::Base |
408 | 409 | user && user.has_permission?('view_private_content', profile) |
409 | 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 | 423 | def comments_updated |
412 | 424 | ferret_update |
413 | 425 | end | ... | ... |
app/models/environment.rb
... | ... | @@ -94,7 +94,6 @@ class Environment < ActiveRecord::Base |
94 | 94 | 'disable_asset_events' => _('Disable search for events'), |
95 | 95 | 'disable_products_for_enterprises' => __('Disable products for enterprises'), |
96 | 96 | 'disable_categories' => _('Disable categories'), |
97 | - 'disable_cms' => _('Disable CMS'), | |
98 | 97 | 'disable_header_and_footer' => _('Disable header/footer editing by users'), |
99 | 98 | 'disable_gender_icon' => _('Disable gender icon'), |
100 | 99 | 'disable_categories_menu' => _('Disable the categories menu'), |
... | ... | @@ -122,6 +121,7 @@ class Environment < ActiveRecord::Base |
122 | 121 | 'xmpp_chat' => _('XMPP/Jabber based chat'), |
123 | 122 | 'show_zoom_button_on_article_images' => _('Show a zoom link on all article images'), |
124 | 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 | 126 | end |
127 | 127 | ... | ... |
app/models/user.rb
... | ... | @@ -35,6 +35,9 @@ class User < ActiveRecord::Base |
35 | 35 | user.person.name ||= user.login |
36 | 36 | user.person.visible = false unless user.activated? |
37 | 37 | user.person.save! |
38 | + if user.environment && user.environment.enabled?('skip_new_user_email_confirmation') | |
39 | + user.activate | |
40 | + end | |
38 | 41 | end |
39 | 42 | after_create :deliver_activation_code |
40 | 43 | after_create :delay_activation_check | ... | ... |
app/views/cms/_tiny_mce_article.rhtml
... | ... | @@ -3,13 +3,7 @@ |
3 | 3 | <%= render :file => 'shared/tiny_mce' %> |
4 | 4 | |
5 | 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 | 8 | <%= render :partial => 'translatable' %> |
15 | 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 | 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 | 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 | 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 | 45 | <% end %> |
46 | 46 | ... | ... |
app/views/profile_editor/index.rhtml
... | ... | @@ -26,7 +26,7 @@ |
26 | 26 | |
27 | 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 | 31 | <% unless profile.enterprise? %> |
32 | 32 | <%= case profile.blogs.count | ... | ... |
features/delete_profile.feature
... | ... | @@ -98,13 +98,6 @@ Feature: delete profile |
98 | 98 | And I go to /myprofile/sample-enterprise/profile_editor/destroy_profile |
99 | 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 | 101 | Scenario: environment admin deletes profile |
109 | 102 | Given I am logged in as admin |
110 | 103 | And I am on Joao Silva's control panel | ... | ... |
lib/noosfero/i18n.rb
... | ... | @@ -12,7 +12,6 @@ repos = [] |
12 | 12 | if File.exists?(locale_dir) |
13 | 13 | repos << FastGettext::TranslationRepository.build('noosfero', :type => 'mo', :path => locale_dir) |
14 | 14 | repos << FastGettext::TranslationRepository.build('iso_3166', :type => 'mo', :path => locale_dir) |
15 | - repos << FastGettext::TranslationRepository.build('rails', :type => 'mo', :path => locale_dir) | |
16 | 15 | end |
17 | 16 | |
18 | 17 | FastGettext.add_text_domain 'noosferofull', :type => :chain, :chain => repos | ... | ... |
lib/tasks/gettext.rake
... | ... | @@ -26,7 +26,7 @@ task :symlinkmo do |
26 | 26 | lang = File.basename(dir) |
27 | 27 | orig_lang = langmap[lang] || lang |
28 | 28 | mkdir_p("#{Rails.root}/locale/#{lang}/LC_MESSAGES") |
29 | - ['iso_3166', 'rails'].each do |domain| | |
29 | + ['iso_3166'].each do |domain| | |
30 | 30 | origin = "/usr/share/locale/#{orig_lang}/LC_MESSAGES/#{domain}.mo" |
31 | 31 | target = "#{Rails.root}/locale/#{lang}/LC_MESSAGES/#{domain}.mo" |
32 | 32 | if !File.symlink?(target) | ... | ... |
script/quick-start-debian
... | ... | @@ -22,7 +22,7 @@ run sudo apt-get -y install $runtime_dependencies |
22 | 22 | |
23 | 23 | # needed for development |
24 | 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 | 26 | run bundle install |
27 | 27 | |
28 | 28 | # create the database with sample data |
... | ... | @@ -34,7 +34,10 @@ run rake db:test:prepare |
34 | 34 | # compile translations |
35 | 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 | 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 | 43 | say "I: To execute Noosfero tests, run \`rake\`." | ... | ... |
test/factories.rb
... | ... | @@ -71,7 +71,8 @@ module Noosfero::Factory |
71 | 71 | # testing that passes through the actual user creation process. |
72 | 72 | # |
73 | 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 | 76 | data = { |
76 | 77 | :login => name, |
77 | 78 | :email => name + '@noosfero.org', |
... | ... | @@ -90,7 +91,8 @@ module Noosfero::Factory |
90 | 91 | |
91 | 92 | # This method knows way too much about the model. But since creating an |
92 | 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 | 96 | environment_id = options.delete(:environment_id) || (options.delete(:environment) || Environment.default).id |
95 | 97 | |
96 | 98 | password = options.delete(:password) | ... | ... |
test/fixtures/roles.yml
test/functional/account_controller_test.rb
... | ... | @@ -737,6 +737,16 @@ class AccountControllerTest < ActionController::TestCase |
737 | 737 | end |
738 | 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 | 750 | protected |
741 | 751 | def new_user(options = {}, extra_options ={}) |
742 | 752 | data = {:profile_data => person_data} | ... | ... |
test/functional/cms_controller_test.rb
... | ... | @@ -15,7 +15,6 @@ class CmsControllerTest < ActionController::TestCase |
15 | 15 | |
16 | 16 | @profile = create_user_with_permission('testinguser', 'post_content') |
17 | 17 | login_as :testinguser |
18 | - @controller.stubs(:user).returns(@profile) | |
19 | 18 | end |
20 | 19 | |
21 | 20 | attr_reader :profile |
... | ... | @@ -601,12 +600,14 @@ class CmsControllerTest < ActionController::TestCase |
601 | 600 | |
602 | 601 | should 'not make enterprise homepage available to person' do |
603 | 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 | 605 | end |
606 | 606 | |
607 | 607 | should 'make enterprise homepage available to enterprises' do |
608 | 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 | 611 | end |
611 | 612 | |
612 | 613 | should 'update categories' do |
... | ... | @@ -838,18 +839,20 @@ class CmsControllerTest < ActionController::TestCase |
838 | 839 | |
839 | 840 | should 'not offer folder to blog articles' do |
840 | 841 | @controller.stubs(:profile).returns(fast_create(Enterprise, :name => 'test_ent', :identifier => 'test_ent')) |
842 | + @controller.stubs(:user).returns(profile) | |
841 | 843 | blog = Blog.create!(:name => 'Blog for test', :profile => profile) |
842 | 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 | 847 | end |
846 | 848 | |
847 | 849 | should 'not offer rssfeed to blog articles' do |
848 | 850 | @controller.stubs(:profile).returns(fast_create(Enterprise, :name => 'test_ent', :identifier => 'test_ent')) |
851 | + @controller.stubs(:user).returns(profile) | |
849 | 852 | blog = Blog.create!(:name => 'Blog for test', :profile => profile) |
850 | 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 | 856 | end |
854 | 857 | |
855 | 858 | should 'update blog posts_per_page setting' do |
... | ... | @@ -1140,6 +1143,21 @@ class CmsControllerTest < ActionController::TestCase |
1140 | 1143 | assert_template 'edit' |
1141 | 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 | 1161 | should 'create thumbnails for images with delayed_job' do |
1144 | 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 | 1163 | file_1 = profile.articles.find_by_path('rails.png') |
... | ... | @@ -1203,18 +1221,20 @@ class CmsControllerTest < ActionController::TestCase |
1203 | 1221 | |
1204 | 1222 | should 'not offer folder to forum articles' do |
1205 | 1223 | @controller.stubs(:profile).returns(fast_create(Enterprise, :name => 'test_ent', :identifier => 'test_ent')) |
1224 | + @controller.stubs(:user).returns(profile) | |
1206 | 1225 | forum = Forum.create!(:name => 'Forum for test', :profile => profile) |
1207 | 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 | 1229 | end |
1211 | 1230 | |
1212 | 1231 | should 'not offer rssfeed to forum articles' do |
1213 | 1232 | @controller.stubs(:profile).returns(fast_create(Enterprise, :name => 'test_ent', :identifier => 'test_ent')) |
1233 | + @controller.stubs(:user).returns(profile) | |
1214 | 1234 | forum = Forum.create!(:name => 'Forum for test', :profile => profile) |
1215 | 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 | 1238 | end |
1219 | 1239 | |
1220 | 1240 | should 'update forum posts_per_page setting' do |
... | ... | @@ -1499,20 +1519,12 @@ class CmsControllerTest < ActionController::TestCase |
1499 | 1519 | assert_nil data[1]['error'] |
1500 | 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 | 1522 | should 'make RawHTMLArticle available only to environment admins' do |
1512 | 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 | 1526 | profile.environment.add_admin(profile) |
1515 | - assert_includes @controller.available_article_types, RawHTMLArticle | |
1527 | + assert_includes available_article_types, RawHTMLArticle | |
1516 | 1528 | end |
1517 | 1529 | |
1518 | 1530 | should 'include new contents special types from plugins' do |
... | ... | @@ -1526,8 +1538,25 @@ class CmsControllerTest < ActionController::TestCase |
1526 | 1538 | |
1527 | 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 | 1560 | end |
1532 | 1561 | |
1533 | 1562 | end | ... | ... |
test/functional/profile_editor_controller_test.rb
... | ... | @@ -601,15 +601,6 @@ class ProfileEditorControllerTest < ActionController::TestCase |
601 | 601 | assert_tag :tag => 'a', :attributes => { :href => '/myprofile/default_user/cms' } |
602 | 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 | 604 | should 'offer to create blog in control panel' do |
614 | 605 | get :index, :profile => profile.identifier |
615 | 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 | 1638 | assert_equal [c1,c2,c5], Article.text_articles |
1639 | 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 | 1674 | end | ... | ... |
test/unit/cms_helper_test.rb
... | ... | @@ -8,7 +8,7 @@ class CmsHelperTest < ActiveSupport::TestCase |
8 | 8 | |
9 | 9 | should 'show default options for article' do |
10 | 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 | 12 | assert_match /id="article_published" name="article\[published\]" type="checkbox" value="1"/, result |
13 | 13 | assert_match /id="article_accept_comments" name="article\[accept_comments\]" type="checkbox" value="1"/, result |
14 | 14 | end | ... | ... |
test/unit/user_test.rb
... | ... | @@ -478,6 +478,14 @@ class UserTest < ActiveSupport::TestCase |
478 | 478 | end |
479 | 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 | 489 | protected |
482 | 490 | def new_user(options = {}) |
483 | 491 | user = User.new({ :login => 'quire', :email => 'quire@example.com', :password => 'quire', :password_confirmation => 'quire' }.merge(options)) | ... | ... |