Commit 83e469707f4092af91be19e928e59e9f9a5299e6

Authored by Carlos Purificação
1 parent 3bdce461

Added export comments to CSV

plugins/comment_paragraph/controllers/profile/comment_paragraph_plugin_profile_controller.rb
  1 +require 'csv'
1 2 class CommentParagraphPluginProfileController < ProfileController
2 3 append_view_path File.join(File.dirname(__FILE__) + '/../../views')
3 4  
... ... @@ -11,4 +12,68 @@ class CommentParagraphPluginProfileController &lt; ProfileController
11 12 render :partial => 'comment/comment.html.erb', :collection => @comments
12 13 end
13 14  
  15 + def export_comments
  16 + article_id = params[:id]
  17 + article = profile.articles.find(article_id)
  18 + doc = Nokogiri::HTML(article.body)
  19 + comments = article.comments
  20 + commentsMap = comments.group_by { |cmt| cmt.paragraph_uuid }
  21 + @export = []
  22 + doc.css("[data-macro-paragraph_uuid]").map do |paragraph|
  23 + uuid = paragraph.attributes['data-macro-paragraph_uuid'].value
  24 + comments_for_paragraph = commentsMap[uuid]
  25 + if comments_for_paragraph
  26 + # Put comments for the paragraph
  27 + comments_for_paragraph.each do | cmt |
  28 + element = Hash.new
  29 + paragraph_text = paragraph.present? ? paragraph.text : nil
  30 + element["paragraph_text"] = paragraph_text
  31 + element["comment_id"] = cmt.id
  32 + element["comment_content"] = cmt.body
  33 + element["comment_author_name"] = cmt.author_name
  34 + element["comment_author_email"] = cmt.author_email
  35 + @export << element
  36 + end
  37 + else
  38 + # There are no comments for this paragraph
  39 + element = Hash.new
  40 + paragraph_text = paragraph.present? ? paragraph.text : nil
  41 + element["paragraph_text"] = paragraph_text
  42 + @export << element
  43 + end
  44 + end
  45 + # Now we need to put all other comments that are not attached to a paragraph
  46 + comments_without_paragrah = commentsMap[nil]
  47 + if (comments_without_paragrah)
  48 + comments_without_paragrah.each do | cmt |
  49 + element = Hash.new
  50 + element["paragraph_text"] = ""
  51 + element["comment_id"] = cmt.id
  52 + element["comment_content"] = cmt.body
  53 + element["comment_author_name"] = cmt.author_name
  54 + element["comment_author_email"] = cmt.author_email
  55 + @export << element
  56 + end
  57 + end
  58 + if (@export.first)
  59 + column_names = @export.first.keys
  60 + header = "Comments for article[#{article_id}]: #{article.path}\n\n"
  61 + s=CSV.generate do |csv|
  62 + csv << column_names
  63 + @export.each do |x|
  64 + csv << x.values
  65 + end
  66 + end
  67 + result = header + s
  68 + else
  69 + result = "No comments for article[#{article_id}]: #{article.path}\n\n"
  70 + end
  71 + fname = "comments_for_article#{article_id}_#{DateTime.now.to_i}.csv"
  72 + send_data result,
  73 + :type => 'text/csv; charset=UTF-8; header=present',
  74 + :disposition => "attachment; filename=#{fname}"
  75 + end
  76 +
  77 +
  78 +
14 79 end
... ...
plugins/comment_paragraph/lib/comment_paragraph_plugin.rb
... ... @@ -47,12 +47,18 @@ class CommentParagraphPlugin &lt; Noosfero::Plugin
47 47 def article_extra_toolbar_buttons(article)
48 48 user = context.send :user
49 49 return [] if !article.comment_paragraph_plugin_enabled? || !article.allow_edit?(user)
50   - {
  50 + [
  51 + {
51 52 :title => article.comment_paragraph_plugin_activated? ? _('Deactivate Comments') : _('Activate Comments'),
52 53 :url => {:controller => 'comment_paragraph_plugin_myprofile', :profile => article.profile.identifier, :action => 'toggle_activation', :id => article.id},
53 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 62 end
57 63  
58 64 end
... ...
plugins/comment_paragraph/test/functional/comment_paragraph_plugin_profile_controller_test.rb
... ... @@ -39,4 +39,16 @@ class CommentParagraphPluginProfileControllerTest &lt; ActionController::TestCase
39 39 assert_match /d comment/, @response.body
40 40 end
41 41  
  42 + should 'export comments as CSV' do
  43 + 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 + 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 + assert_equal "Comments for article[#{article.id}]: #{article.path}", @response.body.split("\n")[0]
  48 + end
  49 +
  50 + should 'not export any comments as CSV' do
  51 + xhr :get, :export_comments, :profile => @profile.identifier, :id => article.id
  52 + assert_equal "No comments for article[#{article.id}]: #{article.path}", @response.body.split("\n")[0]
  53 + end
42 54 end
... ...