diff --git a/controllers/myprofile/proposals_discussion_plugin_myprofile_controller.rb b/controllers/myprofile/proposals_discussion_plugin_myprofile_controller.rb index f02a4a5..607a51f 100644 --- a/controllers/myprofile/proposals_discussion_plugin_myprofile_controller.rb +++ b/controllers/myprofile/proposals_discussion_plugin_myprofile_controller.rb @@ -1,17 +1,25 @@ class ProposalsDiscussionPluginMyprofileController < MyProfileController before_filter :check_edit_permission_to_proposal, :only => :publish_proposal - before_filter :set_discussion, :only => [:select_topic, :new_proposal] + before_filter :set_discussion, :only => [:select_topic, :new_proposal_with_topic, :new_proposal] def select_topic end - def new_proposal - if params[:discussion].blank? || params[:discussion][:topic].blank? + def new_proposal_with_topic + if params[:parent_id].blank? session[:notice] = _('Please select a topic') render :file => 'proposals_discussion_plugin_myprofile/select_topic' else - redirect_to :controller => 'cms', :action => 'new', :type => "ProposalsDiscussionPlugin::Proposal", :parent_id => params[:discussion][:topic] + new_proposal + end + end + + def new_proposal + if @discussion.allow_create?(current_person) + redirect_to :controller => 'cms', :action => 'new', :type => "ProposalsDiscussionPlugin::Proposal", :parent_id => params[:parent_id] + else + render 'proposals_discussion_plugin_myprofile/suggest_proposal' end end @@ -32,7 +40,7 @@ class ProposalsDiscussionPluginMyprofileController < MyProfileController end def set_discussion - @discussion = profile.articles.find(params[:parent_id]) + @discussion = profile.articles.find(params[:discussion_id]) if params[:discussion_id].present? end end diff --git a/controllers/profile/proposals_discussion_plugin_profile_controller.rb b/controllers/profile/proposals_discussion_plugin_profile_controller.rb index 2357728..e8b44e7 100644 --- a/controllers/profile/proposals_discussion_plugin_profile_controller.rb +++ b/controllers/profile/proposals_discussion_plugin_profile_controller.rb @@ -10,7 +10,7 @@ class ProposalsDiscussionPluginProfileController < ProfileController def check_access_to_profile @target = profile.articles.find(params[:article_id]) - render_access_denied(_('You are not allowed to export data from this article')) unless @target.allow_create?(user) + render_access_denied(_('You are not allowed to export data from this article')) unless @target.allow_post_content?(user) end end diff --git a/lib/proposals_discussion_plugin/discussion.rb b/lib/proposals_discussion_plugin/discussion.rb index 8ab9cf4..e828a05 100644 --- a/lib/proposals_discussion_plugin/discussion.rb +++ b/lib/proposals_discussion_plugin/discussion.rb @@ -18,8 +18,9 @@ class ProposalsDiscussionPlugin::Discussion < ProposalsDiscussionPlugin::Proposa settings_items :custom_body_label, :type => :string, :default => _('Body') settings_items :allow_topics, :type => :boolean, :default => true settings_items :phase, :type => :string, :default => :proposals + settings_items :moderate_proposals, :type => :boolean, :default => false - attr_accessible :custom_body_label, :allow_topics, :phase + attr_accessible :custom_body_label, :allow_topics, :phase, :moderate_proposals AVAILABLE_PHASES = {:proposals => _('Proposals'), :vote => 'Vote', :finish => 'Announcement'} @@ -39,6 +40,10 @@ class ProposalsDiscussionPlugin::Discussion < ProposalsDiscussionPlugin::Proposa phase.to_sym == :proposals end + def allow_create?(person) + !moderate_proposals || super + end + def to_html(options = {}) discussion = self proc do diff --git a/lib/proposals_discussion_plugin/discussion_helper.rb b/lib/proposals_discussion_plugin/discussion_helper.rb index 606200a..fffeb4a 100644 --- a/lib/proposals_discussion_plugin/discussion_helper.rb +++ b/lib/proposals_discussion_plugin/discussion_helper.rb @@ -3,7 +3,7 @@ module ProposalsDiscussionPlugin::DiscussionHelper def link_to_new_proposal(discussion) return '' unless discussion.allow_new_proposals? - url = {:parent_id => discussion.id, :profile => discussion.profile.identifier} + url = {:discussion_id => discussion.id, :profile => discussion.profile.identifier} if discussion.allow_topics url.merge!(:controller => 'proposals_discussion_plugin_myprofile', :action => 'select_topic') else diff --git a/lib/proposals_discussion_plugin/topic.rb b/lib/proposals_discussion_plugin/topic.rb index fd31770..81956a1 100644 --- a/lib/proposals_discussion_plugin/topic.rb +++ b/lib/proposals_discussion_plugin/topic.rb @@ -26,7 +26,7 @@ class ProposalsDiscussionPlugin::Topic < ProposalsDiscussionPlugin::ProposalsHo end def allow_create?(user) - true + !discussion.moderate_proposals end end diff --git a/test/functional/cms_controller_test.rb b/test/functional/cms_controller_test.rb index 28ce7f6..7395fc9 100644 --- a/test/functional/cms_controller_test.rb +++ b/test/functional/cms_controller_test.rb @@ -35,4 +35,9 @@ class CmsControllerTest < ActionController::TestCase assert_tag :tag => 'select', :attributes => {:id => 'article_phase'} end + should 'display moderate proposals config option' do + get :edit, :id => discussion.id, :profile => profile.identifier + assert_select '#article_moderate_proposals' + end + end diff --git a/test/functional/proposals_discussion_plugin_myprofile_controller_test.rb b/test/functional/proposals_discussion_plugin_myprofile_controller_test.rb index d4ef2ee..b57db7b 100644 --- a/test/functional/proposals_discussion_plugin_myprofile_controller_test.rb +++ b/test/functional/proposals_discussion_plugin_myprofile_controller_test.rb @@ -14,17 +14,17 @@ class ProposalsDiscussionPluginMyprofileControllerTest < ActionController::TestC should 'list topics for selection' do 3.times {fast_create(ProposalsDiscussionPlugin::Topic, :parent_id => discussion.id, :profile_id => profile.id)} - get :select_topic, :profile => profile.identifier, :parent_id => discussion.id + get :select_topic, :profile => profile.identifier, :discussion_id => discussion.id assert_equal discussion, assigns(:discussion) assert_select 'div#topics' do assert_select 'div.content', discussion.topics.count - assert_select "input[name='discussion[topic]']", discussion.topics.count + assert_select "input[name='parent_id']", discussion.topics.count end - assert_tag :form, :attributes => {:action => "/myprofile/#{profile.identifier}/plugin/proposals_discussion/myprofile/new_proposal"} + assert_tag :form, :attributes => {:action => "/myprofile/#{profile.identifier}/plugin/proposals_discussion/myprofile/new_proposal_with_topic?discussion_id=#{discussion.id}"} end should 'new_proposal redirect to cms controller' do - get :new_proposal, :profile => profile.identifier, :discussion => {:topic => topic.id}, :parent_id => discussion.id + get :new_proposal, :profile => profile.identifier,:parent_id => topic.id, :discussion_id => discussion.id assert_redirected_to :controller => 'cms', :action => 'new', :type => "ProposalsDiscussionPlugin::Proposal", :parent_id => topic.id end @@ -41,8 +41,8 @@ class ProposalsDiscussionPluginMyprofileControllerTest < ActionController::TestC assert !proposal.reload.published end - should 'new_proposal without a topic redirect to back' do - get :new_proposal, :profile => profile.identifier, :parent_id => discussion.id + should 'new_proposal without a topic redirect to select_topic' do + get :new_proposal_with_topic, :profile => profile.identifier, :discussion_id => discussion.id assert_template 'select_topic' end diff --git a/test/functional/proposals_discussion_plugin_profile_controller_test.rb b/test/functional/proposals_discussion_plugin_profile_controller_test.rb index 110bd0e..d494038 100644 --- a/test/functional/proposals_discussion_plugin_profile_controller_test.rb +++ b/test/functional/proposals_discussion_plugin_profile_controller_test.rb @@ -6,7 +6,7 @@ class ProposalsDiscussionPluginProfileControllerTest < ActionController::TestCas @profile = fast_create(Community) @discussion = ProposalsDiscussionPlugin::Discussion.create!(:profile => @profile, :name => 'discussion',:allow_topics => true) @topic = fast_create(ProposalsDiscussionPlugin::Topic, :parent_id => @discussion.id, :profile_id => @profile.id) - @person = create_user_with_permission('testinguser', 'post_content') + @person = create_user_with_permission('testinguser', 'post_content', @profile) login_as :testinguser end @@ -30,6 +30,7 @@ class ProposalsDiscussionPluginProfileControllerTest < ActionController::TestCas end should 'deny access to export when user has no permission' do + login_as(create_user('testuser').login) get :export, :format => :csv, :article_id => discussion.id, :profile => profile.identifier assert_template 'access_denied' end diff --git a/test/unit/discussion_test.rb b/test/unit/discussion_test.rb index e392c33..83e16b6 100644 --- a/test/unit/discussion_test.rb +++ b/test/unit/discussion_test.rb @@ -49,4 +49,19 @@ class DiscussionTest < ActiveSupport::TestCase assert !discussion.allow_new_proposals? end + should 'not allow proposal creation by normal users if discussion is moderated' do + discussion.moderate_proposals = true + person = fast_create(Person) + proposal = ProposalsDiscussionPlugin::Proposal.create!(:parent => discussion, :profile => profile, :name => "proposal1", :abstract => 'abstract') + assert !discussion.allow_create?(person) + end + + should 'allow proposal creation by admin users even when discussion is moderated' do + discussion.moderate_proposals = true + person = fast_create(Person) + give_permission(person, 'post_content', profile) + proposal = ProposalsDiscussionPlugin::Proposal.create!(:parent => discussion, :profile => profile, :name => "proposal1", :abstract => 'abstract') + assert discussion.allow_create?(person) + end + end diff --git a/test/unit/topic_test.rb b/test/unit/topic_test.rb index 8b1a366..7e1b432 100644 --- a/test/unit/topic_test.rb +++ b/test/unit/topic_test.rb @@ -8,7 +8,7 @@ class TopicTest < ActiveSupport::TestCase @topic = ProposalsDiscussionPlugin::Topic.new(:name => 'test', :profile => @profile, :parent => @discussion) end - attr_reader :profile, :topic + attr_reader :profile, :topic, :discussion should 'return list of proposals' do topic.save! @@ -17,10 +17,15 @@ class TopicTest < ActiveSupport::TestCase assert_equivalent [proposal1, proposal2], topic.proposals end - should 'allow any user to create proposals in a topic' do + should 'allow any user to create proposals in a topic when discussion is not moderated' do assert topic.allow_create?(Person.new) end + should 'do not allow normal users to create proposals in a topic when discussion is moderated' do + discussion.moderate_proposals = true + assert !topic.allow_create?(Person.new) + end + should 'return list of comments' do topic.save! proposal = fast_create(ProposalsDiscussionPlugin::Proposal, :parent_id => topic.id) diff --git a/views/cms/proposals_discussion_plugin/_discussion.html.erb b/views/cms/proposals_discussion_plugin/_discussion.html.erb index 98acb58..df8aa03 100644 --- a/views/cms/proposals_discussion_plugin/_discussion.html.erb +++ b/views/cms/proposals_discussion_plugin/_discussion.html.erb @@ -11,3 +11,4 @@ <%= f.text_field(:custom_body_label) %> <%= labelled_form_field _('Current Phase'), f.select(:phase, ProposalsDiscussionPlugin::Discussion::AVAILABLE_PHASES.map{|k,v| [v,k]} ) %> <%= labelled_form_field check_box(:article, :allow_topics) + _('Allow topics'), '' %> +<%= labelled_form_field check_box(:article, :moderate_proposals) + _('Moderate proposals'), '' %> diff --git a/views/proposals_discussion_plugin_myprofile/select_topic.html.erb b/views/proposals_discussion_plugin_myprofile/select_topic.html.erb index 8eeee03..1cfa7f8 100644 --- a/views/proposals_discussion_plugin_myprofile/select_topic.html.erb +++ b/views/proposals_discussion_plugin_myprofile/select_topic.html.erb @@ -11,14 +11,14 @@