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:
parent
af3c91d02a
commit
1ccdf38fdd
@ -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]
|
||||||
|
|||||||
@ -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:
|
||||||
|
|||||||
@ -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?
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user