Commit 924c784defe626ce71cfb5eda73d9e923023d448

Authored by Victor Costa
2 parents 28720598 d1347c27

Merge branch 'export-comment-paragraph-rails3' into staging

plugins/comment_paragraph/controllers/profile/comment_paragraph_plugin_profile_controller.rb
  1 +require 'csv'
1 class CommentParagraphPluginProfileController < ProfileController 2 class CommentParagraphPluginProfileController < ProfileController
2 append_view_path File.join(File.dirname(__FILE__) + '/../../views') 3 append_view_path File.join(File.dirname(__FILE__) + '/../../views')
3 4
@@ -11,4 +12,16 @@ class CommentParagraphPluginProfileController &lt; ProfileController @@ -11,4 +12,16 @@ class CommentParagraphPluginProfileController &lt; ProfileController
11 render :partial => 'comment/comment.html.erb', :collection => @comments 12 render :partial => 'comment/comment.html.erb', :collection => @comments
12 end 13 end
13 14
  15 + include CommentParagraphPlugin::CommentsReport
  16 +
  17 + def export_comments
  18 + article_id = params[:id]
  19 + article = profile.articles.find(article_id)
  20 + result = export_comments_csv(article)
  21 + filename = "comments_for_article#{article_id}_#{DateTime.now.to_i}.csv"
  22 + send_data result,
  23 + :type => 'text/csv; charset=UTF-8; header=present',
  24 + :disposition => "attachment; filename=#{filename}"
  25 + end
  26 +
14 end 27 end
plugins/comment_paragraph/lib/comment_paragraph_plugin.rb
@@ -47,12 +47,18 @@ class CommentParagraphPlugin &lt; Noosfero::Plugin @@ -47,12 +47,18 @@ class CommentParagraphPlugin &lt; Noosfero::Plugin
47 def article_extra_toolbar_buttons(article) 47 def article_extra_toolbar_buttons(article)
48 user = context.send :user 48 user = context.send :user
49 return [] if !article.comment_paragraph_plugin_enabled? || !article.allow_edit?(user) 49 return [] if !article.comment_paragraph_plugin_enabled? || !article.allow_edit?(user)
50 - { 50 + [
  51 + {
51 :title => article.comment_paragraph_plugin_activated? ? _('Deactivate Comments') : _('Activate Comments'), 52 :title => article.comment_paragraph_plugin_activated? ? _('Deactivate Comments') : _('Activate Comments'),
52 :url => {:controller => 'comment_paragraph_plugin_myprofile', :profile => article.profile.identifier, :action => 'toggle_activation', :id => article.id}, 53 :url => {:controller => 'comment_paragraph_plugin_myprofile', :profile => article.profile.identifier, :action => 'toggle_activation', :id => article.id},
53 :icon => :toggle_comment_paragraph 54 :icon => :toggle_comment_paragraph
54 - }  
55 - 55 + },
  56 + {
  57 + :title => _('Export Comments'),
  58 + :url => {:controller => 'comment_paragraph_plugin_profile', :profile => article.profile.identifier, :action => 'export_comments', :id => article.id},
  59 + :icon => :toggle_comment_paragraph
  60 + }
  61 + ]
56 end 62 end
57 63
58 end 64 end
plugins/comment_paragraph/lib/comment_paragraph_plugin/comments_report.rb 0 → 100644
@@ -0,0 +1,51 @@ @@ -0,0 +1,51 @@
  1 +module CommentParagraphPlugin::CommentsReport
  2 +
  3 + #FIXME make this test
  4 + def export_comments_csv(article)
  5 + comments_map = article.comments.group_by { |comment| comment.paragraph_uuid }
  6 + @export = []
  7 + doc = Nokogiri::HTML(article.body)
  8 + paragraph_id = 1
  9 + doc.css("[data-macro-paragraph_uuid]").map do |paragraph|
  10 + uuid = paragraph.attributes['data-macro-paragraph_uuid'].value
  11 + comments_for_paragraph = comments_map[uuid]
  12 + if comments_for_paragraph
  13 + # Put comments for the paragraph
  14 + comments_for_paragraph.each do | comment |
  15 + @export << create_comment_element(comment, paragraph, paragraph_id)
  16 + end
  17 + else # There are no comments for this paragraph
  18 + @export << { paragraph_id: paragraph_id, paragraph_text: paragraph }
  19 + end
  20 + paragraph_id += 1
  21 + end
  22 + # Now we need to put all other comments that are not attached to a paragraph
  23 + comments_without_paragrah = comments_map[nil] || []
  24 + comments_without_paragrah.each do | comment |
  25 + @export << create_comment_element(comment, nil, nil)
  26 + end
  27 + return _("No comments for article[%{id}]: %{path}\n\n") % {:id => article.id, :path => article.path} if @export.empty?
  28 +
  29 + column_names = @export.first.keys
  30 + CSV.generate do |csv|
  31 + csv << column_names
  32 + @export.each { |x| csv << x.values }
  33 + end
  34 + end
  35 +
  36 + private
  37 +
  38 + def create_comment_element(comment, paragraph, paragraph_id)
  39 + {
  40 + paragraph_id: paragraph_id,
  41 + paragraph_text: paragraph.present? ? paragraph.text : nil,
  42 + comment_id: comment.id,
  43 + comment_reply_to: comment.reply_of_id,
  44 + comment_title: comment.title,
  45 + comment_content: comment.body,
  46 + comment_author_name: comment.author_name,
  47 + comment_author_email: comment.author_email
  48 + }
  49 + end
  50 +
  51 +end
plugins/comment_paragraph/test/functional/comment_paragraph_plugin_profile_controller_test.rb
@@ -39,4 +39,18 @@ class CommentParagraphPluginProfileControllerTest &lt; ActionController::TestCase @@ -39,4 +39,18 @@ class CommentParagraphPluginProfileControllerTest &lt; ActionController::TestCase
39 assert_match /d comment/, @response.body 39 assert_match /d comment/, @response.body
40 end 40 end
41 41
  42 + should 'export comments as CSV' do
  43 + comment1 = fast_create(Comment, :created_at => Time.now - 1.days, :source_id => article, :author_id => profile, :title => 'a comment', :body => 'a comment', :paragraph_uuid => nil)
  44 + comment2 = fast_create(Comment, :created_at => Time.now - 2.days, :source_id => article, :author_id => profile, :title => 'b comment', :body => 'b comment', :paragraph_uuid => nil)
  45 + xhr :get, :export_comments, :profile => @profile.identifier, :id => article.id
  46 + assert_equal 'text/csv; charset=UTF-8; header=present', @response.content_type
  47 + lines = @response.body.split("\n")
  48 + assert_equal "paragraph_text,comment_id,comment_title,comment_content,comment_author_name,comment_author_email", lines.first
  49 + assert_equal ",#{comment2.id},b comment,b comment,#{comment2.author_name},#{comment2.author_email}", lines.second
  50 + end
  51 +
  52 + should 'not export any comments as CSV' do
  53 + xhr :get, :export_comments, :profile => @profile.identifier, :id => article.id
  54 + assert_equal "No comments for article[#{article.id}]: #{article.path}", @response.body.split("\n")[0]
  55 + end
42 end 56 end
plugins/comment_paragraph/test/unit/comment_paragraph_plugin_test.rb
@@ -71,7 +71,7 @@ class CommentParagraphPluginTest &lt; ActiveSupport::TestCase @@ -71,7 +71,7 @@ class CommentParagraphPluginTest &lt; ActiveSupport::TestCase
71 article.expects(:allow_edit?).with(user).returns(true) 71 article.expects(:allow_edit?).with(user).returns(true)
72 article.expects(:comment_paragraph_plugin_activated?).returns(false) 72 article.expects(:comment_paragraph_plugin_activated?).returns(false)
73 73
74 - assert_equal 'Activate Comments', plugin.article_extra_toolbar_buttons(article)[:title] 74 + assert_equal 'Activate Comments', plugin.article_extra_toolbar_buttons(article).first[:title]
75 end 75 end
76 76
77 should 'display Deactivate Comments title if comment paragraph plugin is deactivated' do 77 should 'display Deactivate Comments title if comment paragraph plugin is deactivated' do
@@ -81,7 +81,17 @@ class CommentParagraphPluginTest &lt; ActiveSupport::TestCase @@ -81,7 +81,17 @@ class CommentParagraphPluginTest &lt; ActiveSupport::TestCase
81 article.expects(:allow_edit?).with(user).returns(true) 81 article.expects(:allow_edit?).with(user).returns(true)
82 article.expects(:comment_paragraph_plugin_activated?).returns(true) 82 article.expects(:comment_paragraph_plugin_activated?).returns(true)
83 83
84 - assert_equal 'Deactivate Comments', plugin.article_extra_toolbar_buttons(article)[:title] 84 + assert_equal 'Deactivate Comments', plugin.article_extra_toolbar_buttons(article).first[:title]
  85 + end
  86 +
  87 + should 'display export comments button when comment paragraph plugin is activated' do
  88 + profile = fast_create(Profile)
  89 + article = fast_create(Article, :profile_id => profile.id)
  90 + article.expects(:comment_paragraph_plugin_enabled?).returns(true)
  91 + article.expects(:allow_edit?).with(user).returns(true)
  92 + article.expects(:comment_paragraph_plugin_activated?).returns(false)
  93 +
  94 + assert_equal 'Export Comments', plugin.article_extra_toolbar_buttons(article).last[:title]
85 end 95 end
86 96
87 end 97 end