Commit b51a1f3a702db848836999ad00dfc5a0e8eddee6
1 parent
094382c6
Exists in
master
and in
9 other branches
Allow proposals to be moderated
Showing
12 changed files
with
60 additions
and
22 deletions
Show diff stats
controllers/myprofile/proposals_discussion_plugin_myprofile_controller.rb
| 1 | class ProposalsDiscussionPluginMyprofileController < MyProfileController | 1 | class ProposalsDiscussionPluginMyprofileController < MyProfileController |
| 2 | 2 | ||
| 3 | before_filter :check_edit_permission_to_proposal, :only => :publish_proposal | 3 | before_filter :check_edit_permission_to_proposal, :only => :publish_proposal |
| 4 | - before_filter :set_discussion, :only => [:select_topic, :new_proposal] | 4 | + before_filter :set_discussion, :only => [:select_topic, :new_proposal_with_topic, :new_proposal] |
| 5 | 5 | ||
| 6 | def select_topic | 6 | def select_topic |
| 7 | end | 7 | end |
| 8 | 8 | ||
| 9 | - def new_proposal | ||
| 10 | - if params[:discussion].blank? || params[:discussion][:topic].blank? | 9 | + def new_proposal_with_topic |
| 10 | + if params[:parent_id].blank? | ||
| 11 | session[:notice] = _('Please select a topic') | 11 | session[:notice] = _('Please select a topic') |
| 12 | render :file => 'proposals_discussion_plugin_myprofile/select_topic' | 12 | render :file => 'proposals_discussion_plugin_myprofile/select_topic' |
| 13 | else | 13 | else |
| 14 | - redirect_to :controller => 'cms', :action => 'new', :type => "ProposalsDiscussionPlugin::Proposal", :parent_id => params[:discussion][:topic] | 14 | + new_proposal |
| 15 | + end | ||
| 16 | + end | ||
| 17 | + | ||
| 18 | + def new_proposal | ||
| 19 | + if @discussion.allow_create?(current_person) | ||
| 20 | + redirect_to :controller => 'cms', :action => 'new', :type => "ProposalsDiscussionPlugin::Proposal", :parent_id => params[:parent_id] | ||
| 21 | + else | ||
| 22 | + render 'proposals_discussion_plugin_myprofile/suggest_proposal' | ||
| 15 | end | 23 | end |
| 16 | end | 24 | end |
| 17 | 25 | ||
| @@ -32,7 +40,7 @@ class ProposalsDiscussionPluginMyprofileController < MyProfileController | @@ -32,7 +40,7 @@ class ProposalsDiscussionPluginMyprofileController < MyProfileController | ||
| 32 | end | 40 | end |
| 33 | 41 | ||
| 34 | def set_discussion | 42 | def set_discussion |
| 35 | - @discussion = profile.articles.find(params[:parent_id]) | 43 | + @discussion = profile.articles.find(params[:discussion_id]) if params[:discussion_id].present? |
| 36 | end | 44 | end |
| 37 | 45 | ||
| 38 | end | 46 | end |
controllers/profile/proposals_discussion_plugin_profile_controller.rb
| @@ -10,7 +10,7 @@ class ProposalsDiscussionPluginProfileController < ProfileController | @@ -10,7 +10,7 @@ class ProposalsDiscussionPluginProfileController < ProfileController | ||
| 10 | 10 | ||
| 11 | def check_access_to_profile | 11 | def check_access_to_profile |
| 12 | @target = profile.articles.find(params[:article_id]) | 12 | @target = profile.articles.find(params[:article_id]) |
| 13 | - render_access_denied(_('You are not allowed to export data from this article')) unless @target.allow_create?(user) | 13 | + render_access_denied(_('You are not allowed to export data from this article')) unless @target.allow_post_content?(user) |
| 14 | end | 14 | end |
| 15 | 15 | ||
| 16 | end | 16 | end |
lib/proposals_discussion_plugin/discussion.rb
| @@ -18,8 +18,9 @@ class ProposalsDiscussionPlugin::Discussion < ProposalsDiscussionPlugin::Proposa | @@ -18,8 +18,9 @@ class ProposalsDiscussionPlugin::Discussion < ProposalsDiscussionPlugin::Proposa | ||
| 18 | settings_items :custom_body_label, :type => :string, :default => _('Body') | 18 | settings_items :custom_body_label, :type => :string, :default => _('Body') |
| 19 | settings_items :allow_topics, :type => :boolean, :default => true | 19 | settings_items :allow_topics, :type => :boolean, :default => true |
| 20 | settings_items :phase, :type => :string, :default => :proposals | 20 | settings_items :phase, :type => :string, :default => :proposals |
| 21 | + settings_items :moderate_proposals, :type => :boolean, :default => false | ||
| 21 | 22 | ||
| 22 | - attr_accessible :custom_body_label, :allow_topics, :phase | 23 | + attr_accessible :custom_body_label, :allow_topics, :phase, :moderate_proposals |
| 23 | 24 | ||
| 24 | AVAILABLE_PHASES = {:proposals => _('Proposals'), :vote => 'Vote', :finish => 'Announcement'} | 25 | AVAILABLE_PHASES = {:proposals => _('Proposals'), :vote => 'Vote', :finish => 'Announcement'} |
| 25 | 26 | ||
| @@ -39,6 +40,10 @@ class ProposalsDiscussionPlugin::Discussion < ProposalsDiscussionPlugin::Proposa | @@ -39,6 +40,10 @@ class ProposalsDiscussionPlugin::Discussion < ProposalsDiscussionPlugin::Proposa | ||
| 39 | phase.to_sym == :proposals | 40 | phase.to_sym == :proposals |
| 40 | end | 41 | end |
| 41 | 42 | ||
| 43 | + def allow_create?(person) | ||
| 44 | + !moderate_proposals || super | ||
| 45 | + end | ||
| 46 | + | ||
| 42 | def to_html(options = {}) | 47 | def to_html(options = {}) |
| 43 | discussion = self | 48 | discussion = self |
| 44 | proc do | 49 | proc do |
lib/proposals_discussion_plugin/discussion_helper.rb
| @@ -3,7 +3,7 @@ module ProposalsDiscussionPlugin::DiscussionHelper | @@ -3,7 +3,7 @@ module ProposalsDiscussionPlugin::DiscussionHelper | ||
| 3 | def link_to_new_proposal(discussion) | 3 | def link_to_new_proposal(discussion) |
| 4 | return '' unless discussion.allow_new_proposals? | 4 | return '' unless discussion.allow_new_proposals? |
| 5 | 5 | ||
| 6 | - url = {:parent_id => discussion.id, :profile => discussion.profile.identifier} | 6 | + url = {:discussion_id => discussion.id, :profile => discussion.profile.identifier} |
| 7 | if discussion.allow_topics | 7 | if discussion.allow_topics |
| 8 | url.merge!(:controller => 'proposals_discussion_plugin_myprofile', :action => 'select_topic') | 8 | url.merge!(:controller => 'proposals_discussion_plugin_myprofile', :action => 'select_topic') |
| 9 | else | 9 | else |
lib/proposals_discussion_plugin/topic.rb
| @@ -26,7 +26,7 @@ class ProposalsDiscussionPlugin::Topic < ProposalsDiscussionPlugin::ProposalsHo | @@ -26,7 +26,7 @@ class ProposalsDiscussionPlugin::Topic < ProposalsDiscussionPlugin::ProposalsHo | ||
| 26 | end | 26 | end |
| 27 | 27 | ||
| 28 | def allow_create?(user) | 28 | def allow_create?(user) |
| 29 | - true | 29 | + !discussion.moderate_proposals |
| 30 | end | 30 | end |
| 31 | 31 | ||
| 32 | end | 32 | end |
test/functional/cms_controller_test.rb
| @@ -35,4 +35,9 @@ class CmsControllerTest < ActionController::TestCase | @@ -35,4 +35,9 @@ class CmsControllerTest < ActionController::TestCase | ||
| 35 | assert_tag :tag => 'select', :attributes => {:id => 'article_phase'} | 35 | assert_tag :tag => 'select', :attributes => {:id => 'article_phase'} |
| 36 | end | 36 | end |
| 37 | 37 | ||
| 38 | + should 'display moderate proposals config option' do | ||
| 39 | + get :edit, :id => discussion.id, :profile => profile.identifier | ||
| 40 | + assert_select '#article_moderate_proposals' | ||
| 41 | + end | ||
| 42 | + | ||
| 38 | end | 43 | end |
test/functional/proposals_discussion_plugin_myprofile_controller_test.rb
| @@ -14,17 +14,17 @@ class ProposalsDiscussionPluginMyprofileControllerTest < ActionController::TestC | @@ -14,17 +14,17 @@ class ProposalsDiscussionPluginMyprofileControllerTest < ActionController::TestC | ||
| 14 | 14 | ||
| 15 | should 'list topics for selection' do | 15 | should 'list topics for selection' do |
| 16 | 3.times {fast_create(ProposalsDiscussionPlugin::Topic, :parent_id => discussion.id, :profile_id => profile.id)} | 16 | 3.times {fast_create(ProposalsDiscussionPlugin::Topic, :parent_id => discussion.id, :profile_id => profile.id)} |
| 17 | - get :select_topic, :profile => profile.identifier, :parent_id => discussion.id | 17 | + get :select_topic, :profile => profile.identifier, :discussion_id => discussion.id |
| 18 | assert_equal discussion, assigns(:discussion) | 18 | assert_equal discussion, assigns(:discussion) |
| 19 | assert_select 'div#topics' do | 19 | assert_select 'div#topics' do |
| 20 | assert_select 'div.content', discussion.topics.count | 20 | assert_select 'div.content', discussion.topics.count |
| 21 | - assert_select "input[name='discussion[topic]']", discussion.topics.count | 21 | + assert_select "input[name='parent_id']", discussion.topics.count |
| 22 | end | 22 | end |
| 23 | - assert_tag :form, :attributes => {:action => "/myprofile/#{profile.identifier}/plugin/proposals_discussion/myprofile/new_proposal"} | 23 | + assert_tag :form, :attributes => {:action => "/myprofile/#{profile.identifier}/plugin/proposals_discussion/myprofile/new_proposal_with_topic?discussion_id=#{discussion.id}"} |
| 24 | end | 24 | end |
| 25 | 25 | ||
| 26 | should 'new_proposal redirect to cms controller' do | 26 | should 'new_proposal redirect to cms controller' do |
| 27 | - get :new_proposal, :profile => profile.identifier, :discussion => {:topic => topic.id}, :parent_id => discussion.id | 27 | + get :new_proposal, :profile => profile.identifier,:parent_id => topic.id, :discussion_id => discussion.id |
| 28 | assert_redirected_to :controller => 'cms', :action => 'new', :type => "ProposalsDiscussionPlugin::Proposal", :parent_id => topic.id | 28 | assert_redirected_to :controller => 'cms', :action => 'new', :type => "ProposalsDiscussionPlugin::Proposal", :parent_id => topic.id |
| 29 | end | 29 | end |
| 30 | 30 | ||
| @@ -41,8 +41,8 @@ class ProposalsDiscussionPluginMyprofileControllerTest < ActionController::TestC | @@ -41,8 +41,8 @@ class ProposalsDiscussionPluginMyprofileControllerTest < ActionController::TestC | ||
| 41 | assert !proposal.reload.published | 41 | assert !proposal.reload.published |
| 42 | end | 42 | end |
| 43 | 43 | ||
| 44 | - should 'new_proposal without a topic redirect to back' do | ||
| 45 | - get :new_proposal, :profile => profile.identifier, :parent_id => discussion.id | 44 | + should 'new_proposal without a topic redirect to select_topic' do |
| 45 | + get :new_proposal_with_topic, :profile => profile.identifier, :discussion_id => discussion.id | ||
| 46 | assert_template 'select_topic' | 46 | assert_template 'select_topic' |
| 47 | end | 47 | end |
| 48 | 48 |
test/functional/proposals_discussion_plugin_profile_controller_test.rb
| @@ -6,7 +6,7 @@ class ProposalsDiscussionPluginProfileControllerTest < ActionController::TestCas | @@ -6,7 +6,7 @@ class ProposalsDiscussionPluginProfileControllerTest < ActionController::TestCas | ||
| 6 | @profile = fast_create(Community) | 6 | @profile = fast_create(Community) |
| 7 | @discussion = ProposalsDiscussionPlugin::Discussion.create!(:profile => @profile, :name => 'discussion',:allow_topics => true) | 7 | @discussion = ProposalsDiscussionPlugin::Discussion.create!(:profile => @profile, :name => 'discussion',:allow_topics => true) |
| 8 | @topic = fast_create(ProposalsDiscussionPlugin::Topic, :parent_id => @discussion.id, :profile_id => @profile.id) | 8 | @topic = fast_create(ProposalsDiscussionPlugin::Topic, :parent_id => @discussion.id, :profile_id => @profile.id) |
| 9 | - @person = create_user_with_permission('testinguser', 'post_content') | 9 | + @person = create_user_with_permission('testinguser', 'post_content', @profile) |
| 10 | login_as :testinguser | 10 | login_as :testinguser |
| 11 | end | 11 | end |
| 12 | 12 | ||
| @@ -30,6 +30,7 @@ class ProposalsDiscussionPluginProfileControllerTest < ActionController::TestCas | @@ -30,6 +30,7 @@ class ProposalsDiscussionPluginProfileControllerTest < ActionController::TestCas | ||
| 30 | end | 30 | end |
| 31 | 31 | ||
| 32 | should 'deny access to export when user has no permission' do | 32 | should 'deny access to export when user has no permission' do |
| 33 | + login_as(create_user('testuser').login) | ||
| 33 | get :export, :format => :csv, :article_id => discussion.id, :profile => profile.identifier | 34 | get :export, :format => :csv, :article_id => discussion.id, :profile => profile.identifier |
| 34 | assert_template 'access_denied' | 35 | assert_template 'access_denied' |
| 35 | end | 36 | end |
test/unit/discussion_test.rb
| @@ -49,4 +49,19 @@ class DiscussionTest < ActiveSupport::TestCase | @@ -49,4 +49,19 @@ class DiscussionTest < ActiveSupport::TestCase | ||
| 49 | assert !discussion.allow_new_proposals? | 49 | assert !discussion.allow_new_proposals? |
| 50 | end | 50 | end |
| 51 | 51 | ||
| 52 | + should 'not allow proposal creation by normal users if discussion is moderated' do | ||
| 53 | + discussion.moderate_proposals = true | ||
| 54 | + person = fast_create(Person) | ||
| 55 | + proposal = ProposalsDiscussionPlugin::Proposal.create!(:parent => discussion, :profile => profile, :name => "proposal1", :abstract => 'abstract') | ||
| 56 | + assert !discussion.allow_create?(person) | ||
| 57 | + end | ||
| 58 | + | ||
| 59 | + should 'allow proposal creation by admin users even when discussion is moderated' do | ||
| 60 | + discussion.moderate_proposals = true | ||
| 61 | + person = fast_create(Person) | ||
| 62 | + give_permission(person, 'post_content', profile) | ||
| 63 | + proposal = ProposalsDiscussionPlugin::Proposal.create!(:parent => discussion, :profile => profile, :name => "proposal1", :abstract => 'abstract') | ||
| 64 | + assert discussion.allow_create?(person) | ||
| 65 | + end | ||
| 66 | + | ||
| 52 | end | 67 | end |
test/unit/topic_test.rb
| @@ -8,7 +8,7 @@ class TopicTest < ActiveSupport::TestCase | @@ -8,7 +8,7 @@ class TopicTest < ActiveSupport::TestCase | ||
| 8 | @topic = ProposalsDiscussionPlugin::Topic.new(:name => 'test', :profile => @profile, :parent => @discussion) | 8 | @topic = ProposalsDiscussionPlugin::Topic.new(:name => 'test', :profile => @profile, :parent => @discussion) |
| 9 | end | 9 | end |
| 10 | 10 | ||
| 11 | - attr_reader :profile, :topic | 11 | + attr_reader :profile, :topic, :discussion |
| 12 | 12 | ||
| 13 | should 'return list of proposals' do | 13 | should 'return list of proposals' do |
| 14 | topic.save! | 14 | topic.save! |
| @@ -17,10 +17,15 @@ class TopicTest < ActiveSupport::TestCase | @@ -17,10 +17,15 @@ class TopicTest < ActiveSupport::TestCase | ||
| 17 | assert_equivalent [proposal1, proposal2], topic.proposals | 17 | assert_equivalent [proposal1, proposal2], topic.proposals |
| 18 | end | 18 | end |
| 19 | 19 | ||
| 20 | - should 'allow any user to create proposals in a topic' do | 20 | + should 'allow any user to create proposals in a topic when discussion is not moderated' do |
| 21 | assert topic.allow_create?(Person.new) | 21 | assert topic.allow_create?(Person.new) |
| 22 | end | 22 | end |
| 23 | 23 | ||
| 24 | + should 'do not allow normal users to create proposals in a topic when discussion is moderated' do | ||
| 25 | + discussion.moderate_proposals = true | ||
| 26 | + assert !topic.allow_create?(Person.new) | ||
| 27 | + end | ||
| 28 | + | ||
| 24 | should 'return list of comments' do | 29 | should 'return list of comments' do |
| 25 | topic.save! | 30 | topic.save! |
| 26 | proposal = fast_create(ProposalsDiscussionPlugin::Proposal, :parent_id => topic.id) | 31 | proposal = fast_create(ProposalsDiscussionPlugin::Proposal, :parent_id => topic.id) |
views/cms/proposals_discussion_plugin/_discussion.html.erb
| @@ -11,3 +11,4 @@ | @@ -11,3 +11,4 @@ | ||
| 11 | <%= f.text_field(:custom_body_label) %> | 11 | <%= f.text_field(:custom_body_label) %> |
| 12 | <%= labelled_form_field _('Current Phase'), f.select(:phase, ProposalsDiscussionPlugin::Discussion::AVAILABLE_PHASES.map{|k,v| [v,k]} ) %> | 12 | <%= labelled_form_field _('Current Phase'), f.select(:phase, ProposalsDiscussionPlugin::Discussion::AVAILABLE_PHASES.map{|k,v| [v,k]} ) %> |
| 13 | <%= labelled_form_field check_box(:article, :allow_topics) + _('Allow topics'), '' %> | 13 | <%= labelled_form_field check_box(:article, :allow_topics) + _('Allow topics'), '' %> |
| 14 | +<%= labelled_form_field check_box(:article, :moderate_proposals) + _('Moderate proposals'), '' %> |
views/proposals_discussion_plugin_myprofile/select_topic.html.erb
| @@ -11,14 +11,14 @@ | @@ -11,14 +11,14 @@ | ||
| 11 | 11 | ||
| 12 | <div class="proposals-discussion-plugin select-topic"> | 12 | <div class="proposals-discussion-plugin select-topic"> |
| 13 | <h1><%= @discussion.title %></h1> | 13 | <h1><%= @discussion.title %></h1> |
| 14 | - <%= form_for :discussion, :url => {:controller => 'proposals_discussion_plugin_myprofile', :action => 'new_proposal'} do %> | 14 | + <%= form_for :discussion, :url => {:controller => 'proposals_discussion_plugin_myprofile', :action => 'new_proposal_with_topic', :discussion_id => @discussion.id } do %> |
| 15 | 15 | ||
| 16 | <h3><%= _('Select topic') %></h3> | 16 | <h3><%= _('Select topic') %></h3> |
| 17 | <div id="topics"> | 17 | <div id="topics"> |
| 18 | 18 | ||
| 19 | <% @discussion.topics.each do |topic| %> | 19 | <% @discussion.topics.each do |topic| %> |
| 20 | <h4> | 20 | <h4> |
| 21 | - <%= radio_button_tag('discussion[topic]', topic.id) %> | 21 | + <%= radio_button_tag('parent_id', topic.id) %> |
| 22 | <%= topic.title %> | 22 | <%= topic.title %> |
| 23 | </h4> | 23 | </h4> |
| 24 | <div class="content"> | 24 | <div class="content"> |
| @@ -29,8 +29,6 @@ | @@ -29,8 +29,6 @@ | ||
| 29 | <div class="clear"></div> | 29 | <div class="clear"></div> |
| 30 | </div> | 30 | </div> |
| 31 | 31 | ||
| 32 | - <%= hidden_field_tag :parent_id, @discussion.id %> | ||
| 33 | - | ||
| 34 | <div class="actions"> | 32 | <div class="actions"> |
| 35 | <%= submit_button(:next, _('Next')) %> | 33 | <%= submit_button(:next, _('Next')) %> |
| 36 | <%= button :cancel, _('Cancel'), @discussion.view_url %> | 34 | <%= button :cancel, _('Cancel'), @discussion.view_url %> |