Commit 83e469707f4092af91be19e928e59e9f9a5299e6
1 parent
3bdce461
Exists in
export-comment-paragraph
Added export comments to CSV
Showing
3 changed files
with
86 additions
and
3 deletions
Show diff stats
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 < 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 < 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 < 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 | ... | ... |