Commit 94481abd1c82ed355b2483dbac62cbcd07c249ec
1 parent
35a1c4f5
Exists in
master
and in
29 other branches
ActionItem234: Initial implementation of article moderation
git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@2453 3f533792-8f58-4932-b0fe-aaf55b0a4547
Showing
8 changed files
with
114 additions
and
3 deletions
Show diff stats
app/controllers/my_profile/cms_controller.rb
| @@ -142,7 +142,8 @@ class CmsController < MyProfileController | @@ -142,7 +142,8 @@ class CmsController < MyProfileController | ||
| 142 | end.compact unless params[:marked_groups].nil? | 142 | end.compact unless params[:marked_groups].nil? |
| 143 | if request.post? | 143 | if request.post? |
| 144 | @marked_groups.each do |item| | 144 | @marked_groups.each do |item| |
| 145 | - PublishedArticle.create!(:reference_article => @article, :profile => item[:group], :name => item[:name]) | 145 | + task = ApproveArticle.create!(:article => @article, :name => item[:name], :target => item[:group], :requestor => profile) |
| 146 | + task.finish unless item[:group].moderated_articles? | ||
| 146 | end | 147 | end |
| 147 | end | 148 | end |
| 148 | end | 149 | end |
| @@ -0,0 +1,31 @@ | @@ -0,0 +1,31 @@ | ||
| 1 | +class ApproveArticle < Task | ||
| 2 | + serialize :data, Hash | ||
| 3 | + | ||
| 4 | + def data | ||
| 5 | + self[:data] ||= {} | ||
| 6 | + end | ||
| 7 | + | ||
| 8 | + def article | ||
| 9 | + Article.find_by_id data[:article_id] | ||
| 10 | + end | ||
| 11 | + | ||
| 12 | + def article= value | ||
| 13 | + data[:article_id] = value.id | ||
| 14 | + end | ||
| 15 | + | ||
| 16 | + def name | ||
| 17 | + data[:name] | ||
| 18 | + end | ||
| 19 | + | ||
| 20 | + def name= value | ||
| 21 | + data[:name] = value | ||
| 22 | + end | ||
| 23 | + | ||
| 24 | + def perform | ||
| 25 | + PublishedArticle.create(:name => name, :profile => target, :reference_article => article) | ||
| 26 | + end | ||
| 27 | + | ||
| 28 | + def sends_email? | ||
| 29 | + true | ||
| 30 | + end | ||
| 31 | +end |
app/models/organization.rb
| @@ -6,6 +6,11 @@ class Organization < Profile | @@ -6,6 +6,11 @@ class Organization < Profile | ||
| 6 | closed | 6 | closed |
| 7 | end | 7 | end |
| 8 | 8 | ||
| 9 | + settings_items :moderated_articles, :type => :boolean, :default => false | ||
| 10 | + def moderated_articles? | ||
| 11 | + moderated_articles | ||
| 12 | + end | ||
| 13 | + | ||
| 9 | has_one :validation_info | 14 | has_one :validation_info |
| 10 | 15 | ||
| 11 | has_many :validations, :class_name => 'CreateEnterprise', :foreign_key => :target_id | 16 | has_many :validations, :class_name => 'CreateEnterprise', :foreign_key => :target_id |
| @@ -0,0 +1,14 @@ | @@ -0,0 +1,14 @@ | ||
| 1 | +<h1><%= _('Select the groups where you want to publish your article') %></h1> | ||
| 2 | + | ||
| 3 | +<% form_tag do%> | ||
| 4 | + <% @groups.each do |group| %> | ||
| 5 | + <%= labelled_check_box group.name, 'marked_groups[][group_id]', group.id, @marked_groups.include?(group) %><br /> | ||
| 6 | + <%= labelled_text_field _('Title') + ': ', 'marked_groups[][name]', @article.name %> | ||
| 7 | + <hr /> | ||
| 8 | + <% end %> | ||
| 9 | + | ||
| 10 | + <% button_bar do %> | ||
| 11 | + <%= submit_button 'menu-community', _('Publish') %> | ||
| 12 | + <% end %> | ||
| 13 | +<% end %> | ||
| 14 | + |
app/views/profile_editor/_organization.rhtml
| @@ -28,3 +28,20 @@ | @@ -28,3 +28,20 @@ | ||
| 28 | <%= _('<strong>After</strong> joining this group (a moderator can always desactivate access for users later).') %> | 28 | <%= _('<strong>After</strong> joining this group (a moderator can always desactivate access for users later).') %> |
| 29 | </div> | 29 | </div> |
| 30 | </div> | 30 | </div> |
| 31 | + | ||
| 32 | + <br> | ||
| 33 | + <div style='margin-bottom: 1em'> | ||
| 34 | + <%= _('New articles must be approved:')%> | ||
| 35 | + </div> | ||
| 36 | + <div style='margin-bottom: 0.5em'> | ||
| 37 | + <%= radio_button 'profile_data', 'moderated_articles', 'true', :style => 'float: left' %> | ||
| 38 | + <div style='margin-left: 30px'> | ||
| 39 | + <%= _('<strong>Before</strong> being published in this group (a moderator has to accept the article in pending request before the article be listed as a article of this group.') %> | ||
| 40 | + </div> | ||
| 41 | + </div> | ||
| 42 | + <div> | ||
| 43 | + <%= radio_button 'profile_data', 'moderated_articles', 'false', :style => 'float: left' %> | ||
| 44 | + <div style='margin-left: 30px'> | ||
| 45 | + <%= _('<strong>After</strong> being published in this group (a moderator can always remove publicated articles later).') %> | ||
| 46 | + </div> | ||
| 47 | + </div> |
test/functional/cms_controller_test.rb
| @@ -565,8 +565,8 @@ class CmsControllerTest < Test::Unit::TestCase | @@ -565,8 +565,8 @@ class CmsControllerTest < Test::Unit::TestCase | ||
| 565 | assert_template 'publish' | 565 | assert_template 'publish' |
| 566 | end | 566 | end |
| 567 | 567 | ||
| 568 | - should 'publish the article in the selected community' do | ||
| 569 | - c = Community.create!(:name => 'test comm', :identifier => 'test_comm') | 568 | + should 'publish the article in the selected community if community is not moderated' do |
| 569 | + c = Community.create!(:name => 'test comm', :identifier => 'test_comm', :moderated_articles => false) | ||
| 570 | c.affiliate(profile, Profile::Roles.all_roles) | 570 | c.affiliate(profile, Profile::Roles.all_roles) |
| 571 | a = profile.articles.create!(:name => 'something intresting', :body => 'ruby on rails') | 571 | a = profile.articles.create!(:name => 'something intresting', :body => 'ruby on rails') |
| 572 | 572 | ||
| @@ -575,5 +575,20 @@ class CmsControllerTest < Test::Unit::TestCase | @@ -575,5 +575,20 @@ class CmsControllerTest < Test::Unit::TestCase | ||
| 575 | assert_equal [{'group' => c, 'name' => 'bli'}], assigns(:marked_groups) | 575 | assert_equal [{'group' => c, 'name' => 'bli'}], assigns(:marked_groups) |
| 576 | end | 576 | end |
| 577 | end | 577 | end |
| 578 | + | ||
| 579 | + should 'create a task for article approval if community is moderated' do | ||
| 580 | + c = Community.create!(:name => 'test comm', :identifier => 'test_comm', :moderated_articles => true) | ||
| 581 | + c.affiliate(profile, Profile::Roles.all_roles) | ||
| 582 | + a = profile.articles.create!(:name => 'something intresting', :body => 'ruby on rails') | ||
| 583 | + | ||
| 584 | + assert_no_difference PublishedArticle, :count do | ||
| 585 | + assert_difference ApproveArticle, :count do | ||
| 586 | + assert_difference c.tasks, :count do | ||
| 587 | + post :publish, :profile => profile.identifier, :id => a.id, :marked_groups => [{:name => 'bli', :group_id => c.id.to_s}] | ||
| 588 | + assert_equal [{'group' => c, 'name' => 'bli'}], assigns(:marked_groups) | ||
| 589 | + end | ||
| 590 | + end | ||
| 591 | + end | ||
| 592 | + end | ||
| 578 | 593 | ||
| 579 | end | 594 | end |
| @@ -0,0 +1,26 @@ | @@ -0,0 +1,26 @@ | ||
| 1 | +require File.dirname(__FILE__) + '/../test_helper' | ||
| 2 | + | ||
| 3 | +class ApproveArticleTest < ActiveSupport::TestCase | ||
| 4 | + | ||
| 5 | + should 'have name, reference article and profile' do | ||
| 6 | + profile = create_user('test_user').person | ||
| 7 | + article = profile.articles.create!(:name => 'test article') | ||
| 8 | + | ||
| 9 | + a = ApproveArticle.create!(:name => 'test name', :article => article, :target => profile) | ||
| 10 | + | ||
| 11 | + assert_equal 'test name', a.name | ||
| 12 | + assert_equal article, a.article | ||
| 13 | + assert_equal profile, a.target | ||
| 14 | + end | ||
| 15 | + | ||
| 16 | + should 'create published article when finished' do | ||
| 17 | + profile = create_user('test_user').person | ||
| 18 | + article = profile.articles.create!(:name => 'test article') | ||
| 19 | + a = ApproveArticle.create!(:name => 'test name', :article => article, :target => profile) | ||
| 20 | + | ||
| 21 | + assert_difference PublishedArticle, :count do | ||
| 22 | + a.finish | ||
| 23 | + end | ||
| 24 | + | ||
| 25 | + end | ||
| 26 | +end |