@keywords[attr]
else
@keywords[attr] = begin
- if (options[:override] || @@handler_options[:allow_override].include?(attr.to_s)) && (v = extract_keyword!(plain_text_body, attr))
+ if (options[:override] || @@handler_options[:allow_override].include?(attr.to_s)) && (v = extract_keyword!(plain_text_body, attr, options[:format]))
v
elsif !@@handler_options[:issue][attr].blank?
@@handler_options[:issue][attr]
# Destructively extracts the value for +attr+ in +text+
# Returns nil if no matching keyword found
- def extract_keyword!(text, attr)
+ def extract_keyword!(text, attr, format=nil)
keys = [attr.to_s.humanize]
if attr.is_a?(Symbol)
keys << l("field_#{attr}", :default => '', :locale => user.language) if user
end
keys.reject! {|k| k.blank?}
keys.collect! {|k| Regexp.escape(k)}
- text.gsub!(/^(#{keys.join('|')})[ \t]*:[ \t]*(.+)\s*$/i, '')
+ format ||= '.+'
+ text.gsub!(/^(#{keys.join('|')})[ \t]*:[ \t]*(#{format})\s*$/i, '')
$2 && $2.strip
end
'category_id' => (k = get_keyword(:category)) && issue.project.issue_categories.find_by_name(k).try(:id),
'assigned_to_id' => (k = get_keyword(:assigned_to, :override => true)) && find_user_from_keyword(k).try(:id),
'fixed_version_id' => (k = get_keyword(:fixed_version, :override => true)) && issue.project.shared_versions.find_by_name(k).try(:id),
- 'start_date' => get_keyword(:start_date, :override => true),
- 'due_date' => get_keyword(:due_date, :override => true),
+ 'start_date' => get_keyword(:start_date, :override => true, :format => '\d{4}-\d{2}-\d{2}'),
+ 'due_date' => get_keyword(:due_date, :override => true, :format => '\d{4}-\d{2}-\d{2}'),
'estimated_hours' => get_keyword(:estimated_hours, :override => true),
- 'done_ratio' => get_keyword(:done_ratio, :override => true),
+ 'done_ratio' => get_keyword(:done_ratio, :override => true, :format => '(\d|10)?0')
}.delete_if {|k, v| v.blank? }
end
--- /dev/null
+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
+Project: onlinestore\r
+Tracker: Feature request\r
+category: Stock management\r
+priority: foo\r
+done ratio: x\r
+start date: some day \r
+due date: never\r
assert_equal false, submit_email('ticket_without_from_header.eml')
end
+ def test_add_issue_with_invalid_attributes
+ issue = submit_email('ticket_with_invalid_attributes.eml', :allow_override => 'tracker,category,priority')
+ assert issue.is_a?(Issue)
+ assert !issue.new_record?
+ issue.reload
+ assert_nil issue.start_date
+ assert_nil issue.due_date
+ assert_equal 0, issue.done_ratio
+ assert_equal 'Normal', issue.priority.to_s
+ assert issue.description.include?('Lorem ipsum dolor sit amet, consectetuer adipiscing elit.')
+ 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')