@@ -29,11 +29,11 class MailHandler < ActionMailer::Base | |||
|
29 | 29 | |
|
30 | 30 | options[:issue] ||= {} |
|
31 | 31 | |
|
32 | options[:allow_override] ||= [] | |
|
32 | 33 | if options[:allow_override].is_a?(String) |
|
33 |
options[:allow_override] = options[:allow_override].split(',') |
|
|
34 | options[:allow_override] = options[:allow_override].split(',') | |
|
34 | 35 | end |
|
35 | options[:allow_override] ||= [] | |
|
36 | options[:allow_override].map!(&:downcase) | |
|
36 | options[:allow_override].map! {|s| s.strip.downcase.gsub(/\s+/, '_')} | |
|
37 | 37 | # Project needs to be overridable if not specified |
|
38 | 38 | options[:allow_override] << 'project' unless options[:issue].has_key?(:project) |
|
39 | 39 | |
@@ -327,8 +327,11 class MailHandler < ActionMailer::Base | |||
|
327 | 327 | @keywords[attr] |
|
328 | 328 | else |
|
329 | 329 | @keywords[attr] = begin |
|
330 | if (options[:override] || handler_options[:allow_override].include?(attr.to_s.downcase)) && | |
|
331 | (v = extract_keyword!(cleaned_up_text_body, attr, options[:format])) | |
|
330 | override = options.key?(:override) ? | |
|
331 | options[:override] : | |
|
332 | (handler_options[:allow_override] & [attr.to_s.downcase.gsub(/\s+/, '_'), 'all']).present? | |
|
333 | ||
|
334 | if override && (v = extract_keyword!(cleaned_up_text_body, attr, options[:format])) | |
|
332 | 335 | v |
|
333 | 336 | elsif !handler_options[:issue][attr].blank? |
|
334 | 337 | handler_options[:issue][attr] |
@@ -21,37 +21,7 namespace :redmine do | |||
|
21 | 21 | desc <<-END_DESC |
|
22 | 22 | Read an email from standard input. |
|
23 | 23 | |
|
24 | General options: | |
|
25 | unknown_user=ACTION how to handle emails from an unknown user | |
|
26 | ACTION can be one of the following values: | |
|
27 | ignore: email is ignored (default) | |
|
28 | accept: accept as anonymous user | |
|
29 | create: create a user account | |
|
30 | no_permission_check=1 disable permission checking when receiving | |
|
31 | the email | |
|
32 | no_account_notice=1 disable new user account notification | |
|
33 | default_group=foo,bar adds created user to foo and bar groups | |
|
34 | ||
|
35 | Issue attributes control options: | |
|
36 | project=PROJECT identifier of the target project | |
|
37 | status=STATUS name of the target status | |
|
38 | tracker=TRACKER name of the target tracker | |
|
39 | category=CATEGORY name of the target category | |
|
40 | priority=PRIORITY name of the target priority | |
|
41 | allow_override=ATTRS allow email content to override attributes | |
|
42 | specified by previous options | |
|
43 | ATTRS is a comma separated list of attributes | |
|
44 | ||
|
45 | Examples: | |
|
46 | # No project specified. Emails MUST contain the 'Project' keyword: | |
|
47 | rake redmine:email:read RAILS_ENV="production" < raw_email | |
|
48 | ||
|
49 | # Fixed project and default tracker specified, but emails can override | |
|
50 | # both tracker and priority attributes: | |
|
51 | rake redmine:email:read RAILS_ENV="production" \\ | |
|
52 | project=foo \\ | |
|
53 | tracker=bug \\ | |
|
54 | allow_override=tracker,priority < raw_email | |
|
24 | See redmine:email:receive_imap for more options and examples. | |
|
55 | 25 | END_DESC |
|
56 | 26 | |
|
57 | 27 | task :read => :environment do |
@@ -63,7 +33,21 END_DESC | |||
|
63 | 33 | desc <<-END_DESC |
|
64 | 34 | Read emails from an IMAP server. |
|
65 | 35 | |
|
66 | General options: | |
|
36 | Available IMAP options: | |
|
37 | host=HOST IMAP server host (default: 127.0.0.1) | |
|
38 | port=PORT IMAP server port (default: 143) | |
|
39 | ssl=SSL Use SSL/TLS? (default: false) | |
|
40 | starttls=STARTTLS Use STARTTLS? (default: false) | |
|
41 | username=USERNAME IMAP account | |
|
42 | password=PASSWORD IMAP password | |
|
43 | folder=FOLDER IMAP folder to read (default: INBOX) | |
|
44 | ||
|
45 | Processed emails control options: | |
|
46 | move_on_success=MAILBOX move emails that were successfully received | |
|
47 | to MAILBOX instead of deleting them | |
|
48 | move_on_failure=MAILBOX move emails that were ignored to MAILBOX | |
|
49 | ||
|
50 | User and permissions options: | |
|
67 | 51 | unknown_user=ACTION how to handle emails from an unknown user |
|
68 | 52 | ACTION can be one of the following values: |
|
69 | 53 | ignore: email is ignored (default) |
@@ -74,15 +58,6 General options: | |||
|
74 | 58 | no_account_notice=1 disable new user account notification |
|
75 | 59 | default_group=foo,bar adds created user to foo and bar groups |
|
76 | 60 | |
|
77 | Available IMAP options: | |
|
78 | host=HOST IMAP server host (default: 127.0.0.1) | |
|
79 | port=PORT IMAP server port (default: 143) | |
|
80 | ssl=SSL Use SSL/TLS? (default: false) | |
|
81 | starttls=STARTTLS Use STARTTLS? (default: false) | |
|
82 | username=USERNAME IMAP account | |
|
83 | password=PASSWORD IMAP password | |
|
84 | folder=FOLDER IMAP folder to read (default: INBOX) | |
|
85 | ||
|
86 | 61 | Issue attributes control options: |
|
87 | 62 | project=PROJECT identifier of the target project |
|
88 | 63 | status=STATUS name of the target status |
@@ -90,14 +65,23 Issue attributes control options: | |||
|
90 | 65 | category=CATEGORY name of the target category |
|
91 | 66 | priority=PRIORITY name of the target priority |
|
92 | 67 | private create new issues as private |
|
93 |
allow_override=ATTRS allow email content to |
|
|
94 | specified by previous options | |
|
68 | allow_override=ATTRS allow email content to set attributes values | |
|
95 | 69 | ATTRS is a comma separated list of attributes |
|
70 | or 'all' to allow all attributes to be overridable | |
|
71 | (see below for details) | |
|
96 | 72 | |
|
97 | Processed emails control options: | |
|
98 | move_on_success=MAILBOX move emails that were successfully received | |
|
99 | to MAILBOX instead of deleting them | |
|
100 | move_on_failure=MAILBOX move emails that were ignored to MAILBOX | |
|
73 | Overrides: | |
|
74 | ATTRS is a comma separated list of attributes among: | |
|
75 | * project, tracker, status, priority, category, assigned_to, fixed_version, | |
|
76 | start_date, due_date, estimated_hours, done_ratio | |
|
77 | * custom fields names with underscores instead of spaces (case insensitive) | |
|
78 | ||
|
79 | Example: allow_override=project,priority,my_custom_field | |
|
80 | ||
|
81 | If the project option is not set, project is overridable by default for | |
|
82 | emails that create new issues. | |
|
83 | ||
|
84 | You can use allow_override=all to allow all attributes to be overridable. | |
|
101 | 85 | |
|
102 | 86 | Examples: |
|
103 | 87 | # No project specified. Emails MUST contain the 'Project' keyword: |
@@ -40,10 +40,9 class MailHandlerTest < ActiveSupport::TestCase | |||
|
40 | 40 | Setting.clear_cache |
|
41 | 41 | end |
|
42 | 42 | |
|
43 | def test_add_issue | |
|
43 | def test_add_issue_with_specific_overrides | |
|
44 | 44 | ActionMailer::Base.deliveries.clear |
|
45 | 45 | lft1 = new_issue_lft |
|
46 | # This email contains: 'Project: onlinestore' | |
|
47 | 46 | issue = submit_email('ticket_on_given_project.eml', |
|
48 | 47 | :allow_override => ['status', 'start_date', 'due_date', 'assigned_to', 'fixed_version', 'estimated_hours', 'done_ratio'] |
|
49 | 48 | ) |
@@ -74,6 +73,46 class MailHandlerTest < ActiveSupport::TestCase | |||
|
74 | 73 | assert mail.subject.include?('New ticket on a given project') |
|
75 | 74 | end |
|
76 | 75 | |
|
76 | def test_add_issue_with_all_overrides | |
|
77 | ActionMailer::Base.deliveries.clear | |
|
78 | lft1 = new_issue_lft | |
|
79 | issue = submit_email('ticket_on_given_project.eml', :allow_override => 'all') | |
|
80 | assert issue.is_a?(Issue) | |
|
81 | assert !issue.new_record? | |
|
82 | issue.reload | |
|
83 | assert_equal Project.find(2), issue.project | |
|
84 | assert_equal issue.project.trackers.first, issue.tracker | |
|
85 | assert_equal IssueStatus.find_by_name('Resolved'), issue.status | |
|
86 | assert issue.description.include?('Lorem ipsum dolor sit amet, consectetuer adipiscing elit.') | |
|
87 | assert_equal '2010-01-01', issue.start_date.to_s | |
|
88 | assert_equal '2010-12-31', issue.due_date.to_s | |
|
89 | assert_equal User.find_by_login('jsmith'), issue.assigned_to | |
|
90 | assert_equal Version.find_by_name('Alpha'), issue.fixed_version | |
|
91 | assert_equal 2.5, issue.estimated_hours | |
|
92 | assert_equal 30, issue.done_ratio | |
|
93 | end | |
|
94 | ||
|
95 | def test_add_issue_without_overrides_should_ignore_attributes | |
|
96 | WorkflowRule.delete_all | |
|
97 | issue = submit_email('ticket_on_given_project.eml') | |
|
98 | assert issue.is_a?(Issue) | |
|
99 | assert !issue.new_record? | |
|
100 | issue.reload | |
|
101 | assert_equal Project.find(2), issue.project | |
|
102 | assert_equal 'New ticket on a given project', issue.subject | |
|
103 | assert issue.description.include?('Lorem ipsum dolor sit amet, consectetuer adipiscing elit.') | |
|
104 | assert_equal User.find_by_login('jsmith'), issue.author | |
|
105 | ||
|
106 | assert_equal issue.project.trackers.first, issue.tracker | |
|
107 | assert_equal 'New', issue.status.name | |
|
108 | assert_not_equal '2010-01-01', issue.start_date.to_s | |
|
109 | assert_nil issue.due_date | |
|
110 | assert_nil issue.assigned_to | |
|
111 | assert_nil issue.fixed_version | |
|
112 | assert_nil issue.estimated_hours | |
|
113 | assert_equal 0, issue.done_ratio | |
|
114 | end | |
|
115 | ||
|
77 | 116 | def test_add_issue_with_default_tracker |
|
78 | 117 | # This email contains: 'Project: onlinestore' |
|
79 | 118 | issue = submit_email( |
@@ -86,9 +125,9 class MailHandlerTest < ActiveSupport::TestCase | |||
|
86 | 125 | assert_equal 'Support request', issue.tracker.name |
|
87 | 126 | end |
|
88 | 127 | |
|
89 | def test_add_issue_with_status | |
|
128 | def test_add_issue_with_status_override | |
|
90 | 129 | # This email contains: 'Project: onlinestore' and 'Status: Resolved' |
|
91 | issue = submit_email('ticket_on_given_project.eml') | |
|
130 | issue = submit_email('ticket_on_given_project.eml', :allow_override => ['status']) | |
|
92 | 131 | assert issue.is_a?(Issue) |
|
93 | 132 | assert !issue.new_record? |
|
94 | 133 | issue.reload |
@@ -185,7 +224,7 class MailHandlerTest < ActiveSupport::TestCase | |||
|
185 | 224 | |
|
186 | 225 | def test_add_issue_with_custom_fields |
|
187 | 226 | issue = submit_email('ticket_with_custom_fields.eml', |
|
188 |
:issue => {:project => 'onlinestore'}, :allow_override => ['database', 'Searchable |
|
|
227 | :issue => {:project => 'onlinestore'}, :allow_override => ['database', 'Searchable_field'] | |
|
189 | 228 | ) |
|
190 | 229 | assert issue.is_a?(Issue) |
|
191 | 230 | assert !issue.new_record? |
General Comments 0
You need to be logged in to leave comments.
Login now