]> source.dussan.org Git - redmine.git/commitdiff
Makes MailHandler accept localized keywords for default or user language (#6112).
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Fri, 12 Nov 2010 12:29:35 +0000 (12:29 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Fri, 12 Nov 2010 12:29:35 +0000 (12:29 +0000)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4395 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/models/mail_handler.rb
test/fixtures/mail_handler/ticket_with_localized_attributes.eml [new file with mode: 0644]
test/unit/mail_handler_test.rb

index 5688711d4779f276be9c91714b6dcfa73d3a114f..588dba81a1819c157d0acf23c90c2ba67aef8dc6 100644 (file)
@@ -17,6 +17,7 @@
 
 class MailHandler < ActionMailer::Base
   include ActionView::Helpers::SanitizeHelper
+  include Redmine::I18n
 
   class UnauthorizedAction < StandardError; end
   class MissingInformation < StandardError; end
@@ -217,14 +218,28 @@ class MailHandler < ActionMailer::Base
       @keywords[attr]
     else
       @keywords[attr] = begin
-        if (options[:override] || @@handler_options[:allow_override].include?(attr.to_s)) && plain_text_body.gsub!(/^#{attr.to_s.humanize}[ \t]*:[ \t]*(.+)\s*$/i, '')
-          $1.strip
+        if (options[:override] || @@handler_options[:allow_override].include?(attr.to_s)) && (v = extract_keyword!(plain_text_body, attr))
+          v
         elsif !@@handler_options[:issue][attr].blank?
           @@handler_options[:issue][attr]
         end
       end
     end
   end
+  
+  # Destructively extracts the value for +attr+ in +text+
+  # Returns nil if no matching keyword found
+  def extract_keyword!(text, attr)
+    keys = [attr.to_s.humanize]
+    if attr.is_a?(Symbol)
+      keys << l("field_#{attr}", :default => '', :locale =>  user.language) if user
+      keys << l("field_#{attr}", :default => '', :locale =>  Setting.default_language)
+    end
+    keys.reject! {|k| k.blank?}
+    keys.collect! {|k| Regexp.escape(k)}
+    text.gsub!(/^(#{keys.join('|')})[ \t]*:[ \t]*(.+)\s*$/i, '')
+    $2 && $2.strip
+  end
 
   def target_project
     # TODO: other ways to specify project:
diff --git a/test/fixtures/mail_handler/ticket_with_localized_attributes.eml b/test/fixtures/mail_handler/ticket_with_localized_attributes.eml
new file mode 100644 (file)
index 0000000..64fabee
--- /dev/null
@@ -0,0 +1,43 @@
+Return-Path: <jsmith@somenet.foo>\r
+Received: from osiris ([127.0.0.1])\r
+       by OSIRIS\r
+       with hMailServer ; Sun, 22 Jun 2008 12:28:07 +0200\r
+Message-ID: <000501c8d452$a95cd7e0$0a00a8c0@osiris>\r
+From: "John Smith" <jsmith@somenet.foo>\r
+To: <redmine@somenet.foo>\r
+Subject: New ticket on a given project\r
+Date: Sun, 22 Jun 2008 12:28:07 +0200\r
+MIME-Version: 1.0\r
+Content-Type: text/plain;\r
+       format=flowed;\r
+       charset="iso-8859-1";\r
+       reply-type=original\r
+Content-Transfer-Encoding: 7bit\r
+X-Priority: 3\r
+X-MSMail-Priority: Normal\r
+X-Mailer: Microsoft Outlook Express 6.00.2900.2869\r
+X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2869\r
+\r
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas imperdiet \r
+turpis et odio. Integer eget pede vel dolor euismod varius. Phasellus \r
+blandit eleifend augue. Nulla facilisi. Duis id diam. Class aptent taciti \r
+sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. In \r
+in urna sed tellus aliquet lobortis. Morbi scelerisque tortor in dolor. Cras \r
+sagittis odio eu lacus. Aliquam sem tortor, consequat sit amet, vestibulum \r
+id, iaculis at, lectus. Fusce tortor libero, congue ut, euismod nec, luctus \r
+eget, eros. Pellentesque tortor enim, feugiat in, dignissim eget, tristique \r
+sed, mauris. Pellentesque habitant morbi tristique senectus et netus et \r
+malesuada fames ac turpis egestas. Quisque sit amet libero. In hac habitasse \r
+platea dictumst.\r
+\r
+Nulla et nunc. Duis pede. Donec et ipsum. Nam ut dui tincidunt neque \r
+sollicitudin iaculis. Duis vitae dolor. Vestibulum eget massa. Sed lorem. \r
+Nullam volutpat cursus erat. Cras felis dolor, lacinia quis, rutrum et, \r
+dictum et, ligula. Sed erat nibh, gravida in, accumsan non, placerat sed, \r
+massa. Sed sodales, ante fermentum ultricies sollicitudin, massa leo \r
+pulvinar dui, a gravida orci mi eget odio. Nunc a lacus.\r
+\r
+Projet: onlinestore\r
+Tracker: Feature request\r
+catégorie: Stock management\r
+priorité: Urgent\r
index ac8e1043362d2031173dd493d9b3ca6538b58cd7..74a06f61c341d6b3598f890c52f521ce81b6acc6 100644 (file)
@@ -228,6 +228,21 @@ class MailHandlerTest < ActiveSupport::TestCase
     Role.anonymous.add_permission!(:add_issues)
     assert_equal false, submit_email('ticket_without_from_header.eml')
   end
+
+  def test_add_issue_with_localized_attributes
+    User.find_by_mail('jsmith@somenet.foo').update_attribute 'language', 'fr'
+    issue = submit_email('ticket_with_localized_attributes.eml', :allow_override => 'tracker,category,priority')
+    assert issue.is_a?(Issue)
+    assert !issue.new_record?
+    issue.reload
+    assert_equal 'New ticket on a given project', issue.subject
+    assert_equal User.find_by_login('jsmith'), issue.author
+    assert_equal Project.find(2), issue.project
+    assert_equal 'Feature request', issue.tracker.to_s
+    assert_equal 'Stock management', issue.category.to_s
+    assert_equal 'Urgent', issue.priority.to_s
+    assert issue.description.include?('Lorem ipsum dolor sit amet, consectetuer adipiscing elit.')
+  end
   
   def test_add_issue_with_japanese_keywords
     tracker = Tracker.create!(:name => '開発')