1
0
mirror of https://github.com/meineerde/redmine.git synced 2025-12-19 15:01:14 +00:00

Mail Handler: add support for allow_override=all (#20543).

git-svn-id: http://svn.redmine.org/redmine/trunk@14681 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
Jean-Philippe Lang 2015-10-17 09:08:18 +00:00
parent af3c91d02a
commit 1ccdf38fdd
3 changed files with 84 additions and 58 deletions

View File

@ -29,11 +29,11 @@ class MailHandler < ActionMailer::Base
options[:issue] ||= {} options[:issue] ||= {}
if options[:allow_override].is_a?(String)
options[:allow_override] = options[:allow_override].split(',').collect(&:strip)
end
options[:allow_override] ||= [] options[:allow_override] ||= []
options[:allow_override].map!(&:downcase) if options[:allow_override].is_a?(String)
options[:allow_override] = options[:allow_override].split(',')
end
options[:allow_override].map! {|s| s.strip.downcase.gsub(/\s+/, '_')}
# Project needs to be overridable if not specified # Project needs to be overridable if not specified
options[:allow_override] << 'project' unless options[:issue].has_key?(:project) options[:allow_override] << 'project' unless options[:issue].has_key?(:project)
@ -327,8 +327,11 @@ class MailHandler < ActionMailer::Base
@keywords[attr] @keywords[attr]
else else
@keywords[attr] = begin @keywords[attr] = begin
if (options[:override] || handler_options[:allow_override].include?(attr.to_s.downcase)) && override = options.key?(:override) ?
(v = extract_keyword!(cleaned_up_text_body, attr, options[:format])) options[:override] :
(handler_options[:allow_override] & [attr.to_s.downcase.gsub(/\s+/, '_'), 'all']).present?
if override && (v = extract_keyword!(cleaned_up_text_body, attr, options[:format]))
v v
elsif !handler_options[:issue][attr].blank? elsif !handler_options[:issue][attr].blank?
handler_options[:issue][attr] handler_options[:issue][attr]

View File

@ -21,37 +21,7 @@ namespace :redmine do
desc <<-END_DESC desc <<-END_DESC
Read an email from standard input. Read an email from standard input.
General options: See redmine:email:receive_imap for more options and examples.
unknown_user=ACTION how to handle emails from an unknown user
ACTION can be one of the following values:
ignore: email is ignored (default)
accept: accept as anonymous user
create: create a user account
no_permission_check=1 disable permission checking when receiving
the email
no_account_notice=1 disable new user account notification
default_group=foo,bar adds created user to foo and bar groups
Issue attributes control options:
project=PROJECT identifier of the target project
status=STATUS name of the target status
tracker=TRACKER name of the target tracker
category=CATEGORY name of the target category
priority=PRIORITY name of the target priority
allow_override=ATTRS allow email content to override attributes
specified by previous options
ATTRS is a comma separated list of attributes
Examples:
# No project specified. Emails MUST contain the 'Project' keyword:
rake redmine:email:read RAILS_ENV="production" < raw_email
# Fixed project and default tracker specified, but emails can override
# both tracker and priority attributes:
rake redmine:email:read RAILS_ENV="production" \\
project=foo \\
tracker=bug \\
allow_override=tracker,priority < raw_email
END_DESC END_DESC
task :read => :environment do task :read => :environment do
@ -63,7 +33,21 @@ END_DESC
desc <<-END_DESC desc <<-END_DESC
Read emails from an IMAP server. Read emails from an IMAP server.
General options: Available IMAP options:
host=HOST IMAP server host (default: 127.0.0.1)
port=PORT IMAP server port (default: 143)
ssl=SSL Use SSL/TLS? (default: false)
starttls=STARTTLS Use STARTTLS? (default: false)
username=USERNAME IMAP account
password=PASSWORD IMAP password
folder=FOLDER IMAP folder to read (default: INBOX)
Processed emails control options:
move_on_success=MAILBOX move emails that were successfully received
to MAILBOX instead of deleting them
move_on_failure=MAILBOX move emails that were ignored to MAILBOX
User and permissions options:
unknown_user=ACTION how to handle emails from an unknown user unknown_user=ACTION how to handle emails from an unknown user
ACTION can be one of the following values: ACTION can be one of the following values:
ignore: email is ignored (default) ignore: email is ignored (default)
@ -74,15 +58,6 @@ General options:
no_account_notice=1 disable new user account notification no_account_notice=1 disable new user account notification
default_group=foo,bar adds created user to foo and bar groups default_group=foo,bar adds created user to foo and bar groups
Available IMAP options:
host=HOST IMAP server host (default: 127.0.0.1)
port=PORT IMAP server port (default: 143)
ssl=SSL Use SSL/TLS? (default: false)
starttls=STARTTLS Use STARTTLS? (default: false)
username=USERNAME IMAP account
password=PASSWORD IMAP password
folder=FOLDER IMAP folder to read (default: INBOX)
Issue attributes control options: Issue attributes control options:
project=PROJECT identifier of the target project project=PROJECT identifier of the target project
status=STATUS name of the target status status=STATUS name of the target status
@ -90,14 +65,23 @@ Issue attributes control options:
category=CATEGORY name of the target category category=CATEGORY name of the target category
priority=PRIORITY name of the target priority priority=PRIORITY name of the target priority
private create new issues as private private create new issues as private
allow_override=ATTRS allow email content to override attributes allow_override=ATTRS allow email content to set attributes values
specified by previous options
ATTRS is a comma separated list of attributes ATTRS is a comma separated list of attributes
or 'all' to allow all attributes to be overridable
(see below for details)
Processed emails control options: Overrides:
move_on_success=MAILBOX move emails that were successfully received ATTRS is a comma separated list of attributes among:
to MAILBOX instead of deleting them * project, tracker, status, priority, category, assigned_to, fixed_version,
move_on_failure=MAILBOX move emails that were ignored to MAILBOX start_date, due_date, estimated_hours, done_ratio
* custom fields names with underscores instead of spaces (case insensitive)
Example: allow_override=project,priority,my_custom_field
If the project option is not set, project is overridable by default for
emails that create new issues.
You can use allow_override=all to allow all attributes to be overridable.
Examples: Examples:
# No project specified. Emails MUST contain the 'Project' keyword: # No project specified. Emails MUST contain the 'Project' keyword:

View File

@ -40,10 +40,9 @@ class MailHandlerTest < ActiveSupport::TestCase
Setting.clear_cache Setting.clear_cache
end end
def test_add_issue def test_add_issue_with_specific_overrides
ActionMailer::Base.deliveries.clear ActionMailer::Base.deliveries.clear
lft1 = new_issue_lft lft1 = new_issue_lft
# This email contains: 'Project: onlinestore'
issue = submit_email('ticket_on_given_project.eml', issue = submit_email('ticket_on_given_project.eml',
:allow_override => ['status', 'start_date', 'due_date', 'assigned_to', 'fixed_version', 'estimated_hours', 'done_ratio'] :allow_override => ['status', 'start_date', 'due_date', 'assigned_to', 'fixed_version', 'estimated_hours', 'done_ratio']
) )
@ -74,6 +73,46 @@ class MailHandlerTest < ActiveSupport::TestCase
assert mail.subject.include?('New ticket on a given project') assert mail.subject.include?('New ticket on a given project')
end end
def test_add_issue_with_all_overrides
ActionMailer::Base.deliveries.clear
lft1 = new_issue_lft
issue = submit_email('ticket_on_given_project.eml', :allow_override => 'all')
assert issue.is_a?(Issue)
assert !issue.new_record?
issue.reload
assert_equal Project.find(2), issue.project
assert_equal issue.project.trackers.first, issue.tracker
assert_equal IssueStatus.find_by_name('Resolved'), issue.status
assert issue.description.include?('Lorem ipsum dolor sit amet, consectetuer adipiscing elit.')
assert_equal '2010-01-01', issue.start_date.to_s
assert_equal '2010-12-31', issue.due_date.to_s
assert_equal User.find_by_login('jsmith'), issue.assigned_to
assert_equal Version.find_by_name('Alpha'), issue.fixed_version
assert_equal 2.5, issue.estimated_hours
assert_equal 30, issue.done_ratio
end
def test_add_issue_without_overrides_should_ignore_attributes
WorkflowRule.delete_all
issue = submit_email('ticket_on_given_project.eml')
assert issue.is_a?(Issue)
assert !issue.new_record?
issue.reload
assert_equal Project.find(2), issue.project
assert_equal 'New ticket on a given project', issue.subject
assert issue.description.include?('Lorem ipsum dolor sit amet, consectetuer adipiscing elit.')
assert_equal User.find_by_login('jsmith'), issue.author
assert_equal issue.project.trackers.first, issue.tracker
assert_equal 'New', issue.status.name
assert_not_equal '2010-01-01', issue.start_date.to_s
assert_nil issue.due_date
assert_nil issue.assigned_to
assert_nil issue.fixed_version
assert_nil issue.estimated_hours
assert_equal 0, issue.done_ratio
end
def test_add_issue_with_default_tracker def test_add_issue_with_default_tracker
# This email contains: 'Project: onlinestore' # This email contains: 'Project: onlinestore'
issue = submit_email( issue = submit_email(
@ -86,9 +125,9 @@ class MailHandlerTest < ActiveSupport::TestCase
assert_equal 'Support request', issue.tracker.name assert_equal 'Support request', issue.tracker.name
end end
def test_add_issue_with_status def test_add_issue_with_status_override
# This email contains: 'Project: onlinestore' and 'Status: Resolved' # This email contains: 'Project: onlinestore' and 'Status: Resolved'
issue = submit_email('ticket_on_given_project.eml') issue = submit_email('ticket_on_given_project.eml', :allow_override => ['status'])
assert issue.is_a?(Issue) assert issue.is_a?(Issue)
assert !issue.new_record? assert !issue.new_record?
issue.reload issue.reload
@ -185,7 +224,7 @@ class MailHandlerTest < ActiveSupport::TestCase
def test_add_issue_with_custom_fields def test_add_issue_with_custom_fields
issue = submit_email('ticket_with_custom_fields.eml', issue = submit_email('ticket_with_custom_fields.eml',
:issue => {:project => 'onlinestore'}, :allow_override => ['database', 'Searchable field'] :issue => {:project => 'onlinestore'}, :allow_override => ['database', 'Searchable_field']
) )
assert issue.is_a?(Issue) assert issue.is_a?(Issue)
assert !issue.new_record? assert !issue.new_record?