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 | 1 | class ProposalsDiscussionPluginMyprofileController < MyProfileController |
2 | 2 | |
3 | 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 | 6 | def select_topic |
7 | 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 | 11 | session[:notice] = _('Please select a topic') |
12 | 12 | render :file => 'proposals_discussion_plugin_myprofile/select_topic' |
13 | 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 | 23 | end |
16 | 24 | end |
17 | 25 | |
... | ... | @@ -32,7 +40,7 @@ class ProposalsDiscussionPluginMyprofileController < MyProfileController |
32 | 40 | end |
33 | 41 | |
34 | 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 | 44 | end |
37 | 45 | |
38 | 46 | end | ... | ... |
controllers/profile/proposals_discussion_plugin_profile_controller.rb
... | ... | @@ -10,7 +10,7 @@ class ProposalsDiscussionPluginProfileController < ProfileController |
10 | 10 | |
11 | 11 | def check_access_to_profile |
12 | 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 | 14 | end |
15 | 15 | |
16 | 16 | end | ... | ... |
lib/proposals_discussion_plugin/discussion.rb
... | ... | @@ -18,8 +18,9 @@ class ProposalsDiscussionPlugin::Discussion < ProposalsDiscussionPlugin::Proposa |
18 | 18 | settings_items :custom_body_label, :type => :string, :default => _('Body') |
19 | 19 | settings_items :allow_topics, :type => :boolean, :default => true |
20 | 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 | 25 | AVAILABLE_PHASES = {:proposals => _('Proposals'), :vote => 'Vote', :finish => 'Announcement'} |
25 | 26 | |
... | ... | @@ -39,6 +40,10 @@ class ProposalsDiscussionPlugin::Discussion < ProposalsDiscussionPlugin::Proposa |
39 | 40 | phase.to_sym == :proposals |
40 | 41 | end |
41 | 42 | |
43 | + def allow_create?(person) | |
44 | + !moderate_proposals || super | |
45 | + end | |
46 | + | |
42 | 47 | def to_html(options = {}) |
43 | 48 | discussion = self |
44 | 49 | proc do | ... | ... |
lib/proposals_discussion_plugin/discussion_helper.rb
... | ... | @@ -3,7 +3,7 @@ module ProposalsDiscussionPlugin::DiscussionHelper |
3 | 3 | def link_to_new_proposal(discussion) |
4 | 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 | 7 | if discussion.allow_topics |
8 | 8 | url.merge!(:controller => 'proposals_discussion_plugin_myprofile', :action => 'select_topic') |
9 | 9 | else | ... | ... |
lib/proposals_discussion_plugin/topic.rb
test/functional/cms_controller_test.rb
... | ... | @@ -35,4 +35,9 @@ class CmsControllerTest < ActionController::TestCase |
35 | 35 | assert_tag :tag => 'select', :attributes => {:id => 'article_phase'} |
36 | 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 | 43 | end | ... | ... |
test/functional/proposals_discussion_plugin_myprofile_controller_test.rb
... | ... | @@ -14,17 +14,17 @@ class ProposalsDiscussionPluginMyprofileControllerTest < ActionController::TestC |
14 | 14 | |
15 | 15 | should 'list topics for selection' do |
16 | 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 | 18 | assert_equal discussion, assigns(:discussion) |
19 | 19 | assert_select 'div#topics' do |
20 | 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 | 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 | 24 | end |
25 | 25 | |
26 | 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 | 28 | assert_redirected_to :controller => 'cms', :action => 'new', :type => "ProposalsDiscussionPlugin::Proposal", :parent_id => topic.id |
29 | 29 | end |
30 | 30 | |
... | ... | @@ -41,8 +41,8 @@ class ProposalsDiscussionPluginMyprofileControllerTest < ActionController::TestC |
41 | 41 | assert !proposal.reload.published |
42 | 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 | 46 | assert_template 'select_topic' |
47 | 47 | end |
48 | 48 | ... | ... |
test/functional/proposals_discussion_plugin_profile_controller_test.rb
... | ... | @@ -6,7 +6,7 @@ class ProposalsDiscussionPluginProfileControllerTest < ActionController::TestCas |
6 | 6 | @profile = fast_create(Community) |
7 | 7 | @discussion = ProposalsDiscussionPlugin::Discussion.create!(:profile => @profile, :name => 'discussion',:allow_topics => true) |
8 | 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 | 10 | login_as :testinguser |
11 | 11 | end |
12 | 12 | |
... | ... | @@ -30,6 +30,7 @@ class ProposalsDiscussionPluginProfileControllerTest < ActionController::TestCas |
30 | 30 | end |
31 | 31 | |
32 | 32 | should 'deny access to export when user has no permission' do |
33 | + login_as(create_user('testuser').login) | |
33 | 34 | get :export, :format => :csv, :article_id => discussion.id, :profile => profile.identifier |
34 | 35 | assert_template 'access_denied' |
35 | 36 | end | ... | ... |
test/unit/discussion_test.rb
... | ... | @@ -49,4 +49,19 @@ class DiscussionTest < ActiveSupport::TestCase |
49 | 49 | assert !discussion.allow_new_proposals? |
50 | 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 | 67 | end | ... | ... |
test/unit/topic_test.rb
... | ... | @@ -8,7 +8,7 @@ class TopicTest < ActiveSupport::TestCase |
8 | 8 | @topic = ProposalsDiscussionPlugin::Topic.new(:name => 'test', :profile => @profile, :parent => @discussion) |
9 | 9 | end |
10 | 10 | |
11 | - attr_reader :profile, :topic | |
11 | + attr_reader :profile, :topic, :discussion | |
12 | 12 | |
13 | 13 | should 'return list of proposals' do |
14 | 14 | topic.save! |
... | ... | @@ -17,10 +17,15 @@ class TopicTest < ActiveSupport::TestCase |
17 | 17 | assert_equivalent [proposal1, proposal2], topic.proposals |
18 | 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 | 21 | assert topic.allow_create?(Person.new) |
22 | 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 | 29 | should 'return list of comments' do |
25 | 30 | topic.save! |
26 | 31 | proposal = fast_create(ProposalsDiscussionPlugin::Proposal, :parent_id => topic.id) | ... | ... |
views/cms/proposals_discussion_plugin/_discussion.html.erb
... | ... | @@ -11,3 +11,4 @@ |
11 | 11 | <%= f.text_field(:custom_body_label) %> |
12 | 12 | <%= labelled_form_field _('Current Phase'), f.select(:phase, ProposalsDiscussionPlugin::Discussion::AVAILABLE_PHASES.map{|k,v| [v,k]} ) %> |
13 | 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 | 11 | |
12 | 12 | <div class="proposals-discussion-plugin select-topic"> |
13 | 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 | 16 | <h3><%= _('Select topic') %></h3> |
17 | 17 | <div id="topics"> |
18 | 18 | |
19 | 19 | <% @discussion.topics.each do |topic| %> |
20 | 20 | <h4> |
21 | - <%= radio_button_tag('discussion[topic]', topic.id) %> | |
21 | + <%= radio_button_tag('parent_id', topic.id) %> | |
22 | 22 | <%= topic.title %> |
23 | 23 | </h4> |
24 | 24 | <div class="content"> |
... | ... | @@ -29,8 +29,6 @@ |
29 | 29 | <div class="clear"></div> |
30 | 30 | </div> |
31 | 31 | |
32 | - <%= hidden_field_tag :parent_id, @discussion.id %> | |
33 | - | |
34 | 32 | <div class="actions"> |
35 | 33 | <%= submit_button(:next, _('Next')) %> |
36 | 34 | <%= button :cancel, _('Cancel'), @discussion.view_url %> | ... | ... |