Commit 35a1c4f5ccda3045955337407afe0bef3a94e5cd
1 parent
89736c33
Exists in
staging
and in
26 other branches
ActionItem234: users can publish theirs artcles to its communities
git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@2452 3f533792-8f58-4932-b0fe-aaf55b0a4547
Showing
8 changed files
with
140 additions
and
14 deletions
Show diff stats
app/controllers/my_profile/cms_controller.rb
| @@ -130,6 +130,23 @@ class CmsController < MyProfileController | @@ -130,6 +130,23 @@ class CmsController < MyProfileController | ||
| 130 | render :partial => 'shared/select_categories', :locals => {:object_name => 'article', :multiple => true}, :layout => false | 130 | render :partial => 'shared/select_categories', :locals => {:object_name => 'article', :multiple => true}, :layout => false |
| 131 | end | 131 | end |
| 132 | 132 | ||
| 133 | + def publish | ||
| 134 | + @article = profile.articles.find(params[:id]) | ||
| 135 | + @groups = profile.memberships - [profile] | ||
| 136 | + @marked_groups = [] | ||
| 137 | + groups_ids = profile.memberships.map{|m|m.id.to_s} | ||
| 138 | + @marked_groups = params[:marked_groups].map do |item| | ||
| 139 | + if groups_ids.include?(item[:group_id]) | ||
| 140 | + item.merge :group => Profile.find(item.delete(:group_id)) | ||
| 141 | + end | ||
| 142 | + end.compact unless params[:marked_groups].nil? | ||
| 143 | + if request.post? | ||
| 144 | + @marked_groups.each do |item| | ||
| 145 | + PublishedArticle.create!(:reference_article => @article, :profile => item[:group], :name => item[:name]) | ||
| 146 | + end | ||
| 147 | + end | ||
| 148 | + end | ||
| 149 | + | ||
| 133 | protected | 150 | protected |
| 134 | 151 | ||
| 135 | def redirect_back | 152 | def redirect_back |
| @@ -0,0 +1,20 @@ | @@ -0,0 +1,20 @@ | ||
| 1 | +class PublishedArticle < Article | ||
| 2 | + belongs_to :reference_article, :class_name => "Article" | ||
| 3 | + | ||
| 4 | + def self.short_description | ||
| 5 | + _('Reference to other article') | ||
| 6 | + end | ||
| 7 | + | ||
| 8 | + def self.description | ||
| 9 | + _('A reference to another article published in another profile') | ||
| 10 | + end | ||
| 11 | + | ||
| 12 | + def body | ||
| 13 | + reference_article.body | ||
| 14 | + end | ||
| 15 | + | ||
| 16 | + before_validation_on_create :update_name | ||
| 17 | + def update_name | ||
| 18 | + self.name ||= self.reference_article.name | ||
| 19 | + end | ||
| 20 | +end |
app/views/content_viewer/view_page.rhtml
| @@ -35,6 +35,9 @@ | @@ -35,6 +35,9 @@ | ||
| 35 | <%= link_to content_tag( 'span', _('Edit') ), | 35 | <%= link_to content_tag( 'span', _('Edit') ), |
| 36 | { :controller => 'cms', :action => 'edit', :id => @page }, | 36 | { :controller => 'cms', :action => 'edit', :id => @page }, |
| 37 | :class => 'button with-text icon-edit' %> | 37 | :class => 'button with-text icon-edit' %> |
| 38 | + <%= link_to content_tag( 'span', _('Publish') ), | ||
| 39 | + { :controller => 'cms', :action => 'publish', :id => @page }, | ||
| 40 | + :class => 'button with-text icon-edit' %> | ||
| 38 | <%= lightbox_button(:new, _('New publication'), :controller => 'cms', :action => 'new', :parent_id => (@page.folder? ? @page : nil)) %> | 41 | <%= lightbox_button(:new, _('New publication'), :controller => 'cms', :action => 'new', :parent_id => (@page.folder? ? @page : nil)) %> |
| 39 | </div> | 42 | </div> |
| 40 | <% end %> | 43 | <% end %> |
| @@ -0,0 +1,11 @@ | @@ -0,0 +1,11 @@ | ||
| 1 | +class AddReferenceArticle < ActiveRecord::Migration | ||
| 2 | + def self.up | ||
| 3 | + add_column :articles, :reference_article_id, :integer | ||
| 4 | + add_column :article_versions, :reference_article_id, :integer | ||
| 5 | + end | ||
| 6 | + | ||
| 7 | + def self.down | ||
| 8 | + remove_column :articles, :reference_article_id | ||
| 9 | + remove_column :article_versions, :reference_article_id | ||
| 10 | + end | ||
| 11 | +end |
db/schema.rb
| @@ -9,14 +9,14 @@ | @@ -9,14 +9,14 @@ | ||
| 9 | # | 9 | # |
| 10 | # It's strongly recommended to check this file into your version control system. | 10 | # It's strongly recommended to check this file into your version control system. |
| 11 | 11 | ||
| 12 | -ActiveRecord::Schema.define(:version => 53) do | 12 | +ActiveRecord::Schema.define(:version => 54) do |
| 13 | 13 | ||
| 14 | create_table "article_versions", :force => true do |t| | 14 | create_table "article_versions", :force => true do |t| |
| 15 | t.integer "article_id" | 15 | t.integer "article_id" |
| 16 | t.integer "version" | 16 | t.integer "version" |
| 17 | t.string "name" | 17 | t.string "name" |
| 18 | t.string "slug" | 18 | t.string "slug" |
| 19 | - t.text "path", :default => "" | 19 | + t.text "path", :default => "" |
| 20 | t.integer "parent_id" | 20 | t.integer "parent_id" |
| 21 | t.text "body" | 21 | t.text "body" |
| 22 | t.text "abstract" | 22 | t.text "abstract" |
| @@ -31,19 +31,20 @@ ActiveRecord::Schema.define(:version => 53) do | @@ -31,19 +31,20 @@ ActiveRecord::Schema.define(:version => 53) do | ||
| 31 | t.integer "width" | 31 | t.integer "width" |
| 32 | t.string "versioned_type" | 32 | t.string "versioned_type" |
| 33 | t.integer "comments_count" | 33 | t.integer "comments_count" |
| 34 | - t.boolean "advertise", :default => true | ||
| 35 | - t.boolean "published", :default => true | 34 | + t.boolean "advertise", :default => true |
| 35 | + t.boolean "published", :default => true | ||
| 36 | t.date "start_date" | 36 | t.date "start_date" |
| 37 | t.date "end_date" | 37 | t.date "end_date" |
| 38 | - t.integer "children_count", :default => 0 | ||
| 39 | - t.boolean "public_article", :default => true | ||
| 40 | - t.boolean "accept_comments", :default => true | 38 | + t.integer "children_count", :default => 0 |
| 39 | + t.boolean "public_article", :default => true | ||
| 40 | + t.boolean "accept_comments", :default => true | ||
| 41 | + t.integer "reference_article_id" | ||
| 41 | end | 42 | end |
| 42 | 43 | ||
| 43 | create_table "articles", :force => true do |t| | 44 | create_table "articles", :force => true do |t| |
| 44 | t.string "name" | 45 | t.string "name" |
| 45 | t.string "slug" | 46 | t.string "slug" |
| 46 | - t.text "path", :default => "" | 47 | + t.text "path", :default => "" |
| 47 | t.integer "parent_id" | 48 | t.integer "parent_id" |
| 48 | t.text "body" | 49 | t.text "body" |
| 49 | t.text "abstract" | 50 | t.text "abstract" |
| @@ -59,14 +60,15 @@ ActiveRecord::Schema.define(:version => 53) do | @@ -59,14 +60,15 @@ ActiveRecord::Schema.define(:version => 53) do | ||
| 59 | t.string "filename" | 60 | t.string "filename" |
| 60 | t.integer "height" | 61 | t.integer "height" |
| 61 | t.integer "width" | 62 | t.integer "width" |
| 62 | - t.integer "comments_count", :default => 0 | ||
| 63 | - t.boolean "advertise", :default => true | ||
| 64 | - t.boolean "published", :default => true | 63 | + t.integer "comments_count", :default => 0 |
| 64 | + t.boolean "advertise", :default => true | ||
| 65 | + t.boolean "published", :default => true | ||
| 65 | t.date "start_date" | 66 | t.date "start_date" |
| 66 | t.date "end_date" | 67 | t.date "end_date" |
| 67 | - t.integer "children_count", :default => 0 | ||
| 68 | - t.boolean "public_article", :default => true | ||
| 69 | - t.boolean "accept_comments", :default => true | 68 | + t.integer "children_count", :default => 0 |
| 69 | + t.boolean "public_article", :default => true | ||
| 70 | + t.boolean "accept_comments", :default => true | ||
| 71 | + t.integer "reference_article_id" | ||
| 70 | end | 72 | end |
| 71 | 73 | ||
| 72 | create_table "articles_categories", :id => false, :force => true do |t| | 74 | create_table "articles_categories", :id => false, :force => true do |t| |
test/functional/cms_controller_test.rb
| @@ -554,4 +554,26 @@ class CmsControllerTest < Test::Unit::TestCase | @@ -554,4 +554,26 @@ class CmsControllerTest < Test::Unit::TestCase | ||
| 554 | assert !folder.children[0].public? | 554 | assert !folder.children[0].public? |
| 555 | end | 555 | end |
| 556 | 556 | ||
| 557 | + should 'load communities for that the user belongs' do | ||
| 558 | + c = Community.create!(:name => 'test comm', :identifier => 'test_comm') | ||
| 559 | + c.affiliate(profile, Profile::Roles.all_roles) | ||
| 560 | + a = profile.articles.create!(:name => 'something intresting', :body => 'ruby on rails') | ||
| 561 | + | ||
| 562 | + get :publish, :profile => profile.identifier, :id => a.id | ||
| 563 | + | ||
| 564 | + assert_equal [c], assigns(:groups) | ||
| 565 | + assert_template 'publish' | ||
| 566 | + end | ||
| 567 | + | ||
| 568 | + should 'publish the article in the selected community' do | ||
| 569 | + c = Community.create!(:name => 'test comm', :identifier => 'test_comm') | ||
| 570 | + c.affiliate(profile, Profile::Roles.all_roles) | ||
| 571 | + a = profile.articles.create!(:name => 'something intresting', :body => 'ruby on rails') | ||
| 572 | + | ||
| 573 | + assert_difference PublishedArticle, :count do | ||
| 574 | + post :publish, :profile => profile.identifier, :id => a.id, :marked_groups => [{:name => 'bli', :group_id => c.id.to_s}] | ||
| 575 | + assert_equal [{'group' => c, 'name' => 'bli'}], assigns(:marked_groups) | ||
| 576 | + end | ||
| 577 | + end | ||
| 578 | + | ||
| 557 | end | 579 | end |
test/functional/content_viewer_controller_test.rb
| @@ -404,4 +404,13 @@ class ContentViewerControllerTest < Test::Unit::TestCase | @@ -404,4 +404,13 @@ class ContentViewerControllerTest < Test::Unit::TestCase | ||
| 404 | end | 404 | end |
| 405 | end | 405 | end |
| 406 | 406 | ||
| 407 | + should 'show link to publication on view' do | ||
| 408 | + page = profile.articles.create!(:name => 'myarticle', :body => 'the body of the text') | ||
| 409 | + login_as(profile.identifier) | ||
| 410 | + | ||
| 411 | + get :view_page, :profile => profile.identifier, :page => ['myarticle'] | ||
| 412 | + | ||
| 413 | + assert_tag :tag => 'a', :attributes => {:href => ('/myprofile/' + profile.identifier + '/cms/publish/' + page.id.to_s)} | ||
| 414 | + end | ||
| 415 | + | ||
| 407 | end | 416 | end |
| @@ -0,0 +1,42 @@ | @@ -0,0 +1,42 @@ | ||
| 1 | +require File.dirname(__FILE__) + '/../test_helper' | ||
| 2 | + | ||
| 3 | +class PublishedArticleTest < ActiveSupport::TestCase | ||
| 4 | + | ||
| 5 | + def setup | ||
| 6 | + @profile = create_user('test_user').person | ||
| 7 | + @article = @profile.articles.create!(:name => 'test_article', :body => 'some trivial body') | ||
| 8 | + end | ||
| 9 | + | ||
| 10 | + | ||
| 11 | + should 'have a reference article and profile' do | ||
| 12 | + prof = Community.create!(:name => 'test_comm', :identifier => 'test_comm') | ||
| 13 | + p = PublishedArticle.create(:reference_article => @article, :profile => prof) | ||
| 14 | + | ||
| 15 | + assert p | ||
| 16 | + assert_equal prof, p.profile | ||
| 17 | + assert_equal @article, p.reference_article | ||
| 18 | + end | ||
| 19 | + | ||
| 20 | + should 'have same content as reference article' do | ||
| 21 | + prof = Community.create!(:name => 'test_comm', :identifier => 'test_comm') | ||
| 22 | + p = PublishedArticle.create(:reference_article => @article, :profile => prof) | ||
| 23 | + | ||
| 24 | + assert_equal @article.body, p.body | ||
| 25 | + end | ||
| 26 | + | ||
| 27 | + should 'have a different name than reference article' do | ||
| 28 | + prof = Community.create!(:name => 'test_comm', :identifier => 'test_comm') | ||
| 29 | + p = PublishedArticle.create(:reference_article => @article, :profile => prof, :name => 'other title') | ||
| 30 | + | ||
| 31 | + assert_equal 'other title', p.name | ||
| 32 | + assert_not_equal @article.name, p.name | ||
| 33 | + | ||
| 34 | + end | ||
| 35 | + | ||
| 36 | + should 'use name of reference article a default name' do | ||
| 37 | + prof = Community.create!(:name => 'test_comm', :identifier => 'test_comm') | ||
| 38 | + p = PublishedArticle.create!(:reference_article => @article, :profile => prof) | ||
| 39 | + | ||
| 40 | + assert_equal @article.name, p.name | ||
| 41 | + end | ||
| 42 | +end |