[Git][noosfero/noosfero][master] 2 commits: newsletter: imported CSV can use semicolon as delimiter

Antonio Terceiro gitlab at gitlab.com
Fri Oct 2 09:50:10 BRT 2015


Antonio Terceiro pushed to branch master at Noosfero / noosfero


Commits:
df2897b2 by Larissa Reis at 2015-09-30T19:58:53Z
newsletter: imported CSV can use semicolon as delimiter

  Windows systems with pt_br have problem in exporting CSV with comma as
  delimiter through Excel, so to improve compatibility I decided to loop
  through delimiter types when parsing and importing recipients.

  Since I try different types of delimiter and stick with the first one
  that gives me a valid content, it's always possible (albeit unlikely)
  the file can be parsed incorrectly.

- - - - -
e51ebfd7 by Antonio Terceiro at 2015-10-02T12:49:45Z
Merge branch 'newsletter-emails-import' into 'master'

Fixes compatibility in newsletter plugin with CSV exported by Excel

Allow different types of delimiter used for the CSV file with additional emails imported by newsletter plugin. This change is meant to improve compatibility for users under Windows in pt br and Excel, which only exports semicolon delimited CSV.

See merge request !683
- - - - -


2 changed files:

- plugins/newsletter/lib/newsletter_plugin/newsletter.rb
- plugins/newsletter/test/unit/newsletter_plugin_newsletter_test.rb


Changes:

=====================================
plugins/newsletter/lib/newsletter_plugin/newsletter.rb
=====================================
--- a/plugins/newsletter/lib/newsletter_plugin/newsletter.rb
+++ b/plugins/newsletter/lib/newsletter_plugin/newsletter.rb
@@ -154,11 +154,14 @@ class NewsletterPlugin::Newsletter < Noosfero::Plugin::ActiveRecord
     headers ||= false
 
     if File.extname(file.original_filename) == '.csv'
-      parsed_recipients = []
-      CSV.foreach(file.path, headers: headers) do |row|
-        parsed_recipients << {name: row[name_column.to_i - 1], email: row[email_column.to_i - 1]}
+      [",", ";", "\t"].each do |sep|
+        parsed_recipients = []
+        CSV.foreach(file.path, { headers: headers, col_sep: sep }) do |row|
+          parsed_recipients << {name: row[name_column.to_i - 1], email: row[email_column.to_i - 1]}
+        end
+        self.additional_recipients = parsed_recipients
+        break if self.valid? || !self.errors.include?(:additional_recipients)
       end
-      self.additional_recipients = parsed_recipients
     else
       #FIXME find a better way to deal with errors
       self.errors.add(:additional_recipients, _("have unknown file type: %s" % file.original_filename))


=====================================
plugins/newsletter/test/unit/newsletter_plugin_newsletter_test.rb
=====================================
--- a/plugins/newsletter/test/unit/newsletter_plugin_newsletter_test.rb
+++ b/plugins/newsletter/test/unit/newsletter_plugin_newsletter_test.rb
@@ -29,7 +29,7 @@ class NewsletterPluginNewsletterTest < ActiveSupport::TestCase
         :person => fast_create(Person))
       enabled_newsletters << newsletter.id if enabled
     end
-    assert_equal enabled_newsletters, NewsletterPlugin::Newsletter.enabled.map(&:id)
+    assert_equivalent enabled_newsletters, NewsletterPlugin::Newsletter.enabled.map(&:id)
   end
 
   should 'people of newsletters are the same environment members' do
@@ -214,6 +214,35 @@ EOS
     assert_equivalent ["Coop1", "Coop2", "Coop3"], newsletter.additional_recipients.map { |recipient| recipient[:name] }
   end
 
+  should 'provide flexibility for CSV file when parsing additional recipients' do
+    content_semicolon = <<-EOS
+Coop1;name1 at example.com
+Coop2;name2 at example.com
+Coop3;name3 at example.com
+EOS
+
+    content_tab = <<-EOS
+Coop1\tname1 at example.com
+Coop2\tname2 at example.com
+Coop3\tname3 at example.com
+EOS
+    [content_semicolon, content_tab].each do |content|
+      file = Tempfile.new(['recipients', '.csv'])
+      file.write(content)
+      file.rewind
+
+      environment = fast_create Environment
+      newsletter = NewsletterPlugin::Newsletter.create!(:environment => environment, :person => fast_create(Person))
+      newsletter.import_recipients(Rack::Test::UploadedFile.new(file, 'text/csv'))
+
+      file.close
+      file.unlink
+
+      assert_equivalent ["name1 at example.com", "name2 at example.com", "name3 at example.com"], newsletter.additional_recipients.map { |recipient| recipient[:email] }
+      assert_equivalent ["Coop1", "Coop2", "Coop3"], newsletter.additional_recipients.map { |recipient| recipient[:name] }
+    end
+  end
+
   should 'retrieve blogs related to newsletter' do
     environment = fast_create Environment
     community = fast_create(Community, :environment_id => environment.id)



View it on GitLab: https://gitlab.com/noosfero/noosfero/compare/9ac9e0abdcbf464a103d7c7e7a90bc87c24b49da...e51ebfd730a320854f9fd6813035b0847e21ab73
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listas.softwarelivre.org/pipermail/noosfero-dev/attachments/20151002/4e1208b5/attachment.html>


More information about the Noosfero-dev mailing list