mirror of
https://github.com/meineerde/redmine.git
synced 2025-12-19 15:01:14 +00:00
Allow to set multiple values in emails for list custom fields (#16549).
git-svn-id: http://svn.redmine.org/redmine/trunk@16380 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
parent
a63908c5ed
commit
f338fe9075
@ -167,12 +167,13 @@ module Redmine
|
|||||||
def value_from_keyword(custom_field, keyword, object)
|
def value_from_keyword(custom_field, keyword, object)
|
||||||
possible_values_options = possible_values_options(custom_field, object)
|
possible_values_options = possible_values_options(custom_field, object)
|
||||||
if possible_values_options.present?
|
if possible_values_options.present?
|
||||||
keyword = keyword.to_s
|
parse_keyword(custom_field, keyword) do |k|
|
||||||
if v = possible_values_options.detect {|text, id| keyword.casecmp(text) == 0}
|
if v = possible_values_options.detect {|text, id| k.casecmp(text) == 0}
|
||||||
if v.is_a?(Array)
|
if v.is_a?(Array)
|
||||||
v.last
|
v.last
|
||||||
else
|
else
|
||||||
v
|
v
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
@ -180,6 +181,31 @@ module Redmine
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def parse_keyword(custom_field, keyword, &block)
|
||||||
|
separator = Regexp.escape ","
|
||||||
|
keyword = keyword.to_s
|
||||||
|
|
||||||
|
if custom_field.multiple?
|
||||||
|
values = []
|
||||||
|
while keyword.length > 0
|
||||||
|
k = keyword.dup
|
||||||
|
loop do
|
||||||
|
if value = yield(k.strip)
|
||||||
|
values << value
|
||||||
|
break
|
||||||
|
elsif k.slice!(/#{separator}([^#{separator}]*)\Z/).nil?
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
keyword.slice!(/\A#{Regexp.escape k}#{separator}?/)
|
||||||
|
end
|
||||||
|
values
|
||||||
|
else
|
||||||
|
yield keyword.strip
|
||||||
|
end
|
||||||
|
end
|
||||||
|
protected :parse_keyword
|
||||||
|
|
||||||
# Returns the validation errors for custom_field
|
# Returns the validation errors for custom_field
|
||||||
# Should return an empty array if custom_field is valid
|
# Should return an empty array if custom_field is valid
|
||||||
def validate_custom_field(custom_field)
|
def validate_custom_field(custom_field)
|
||||||
@ -766,8 +792,9 @@ module Redmine
|
|||||||
end
|
end
|
||||||
|
|
||||||
def value_from_keyword(custom_field, keyword, object)
|
def value_from_keyword(custom_field, keyword, object)
|
||||||
value = custom_field.enumerations.where("LOWER(name) LIKE LOWER(?)", keyword).first
|
parse_keyword(custom_field, keyword) do |k|
|
||||||
value ? value.id : nil
|
custom_field.enumerations.where("LOWER(name) LIKE LOWER(?)", k).first.try(:id)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -800,8 +827,9 @@ module Redmine
|
|||||||
|
|
||||||
def value_from_keyword(custom_field, keyword, object)
|
def value_from_keyword(custom_field, keyword, object)
|
||||||
users = possible_values_records(custom_field, object).to_a
|
users = possible_values_records(custom_field, object).to_a
|
||||||
user = Principal.detect_by_keyword(users, keyword)
|
parse_keyword(custom_field, keyword) do |k|
|
||||||
user ? user.id : nil
|
Principal.detect_by_keyword(users, k).try(:id)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def before_custom_field_save(custom_field)
|
def before_custom_field_save(custom_field)
|
||||||
|
|||||||
@ -40,3 +40,4 @@ pulvinar dui, a gravida orci mi eget odio. Nunc a lacus.
|
|||||||
category: Stock management
|
category: Stock management
|
||||||
searchable field: Value for a custom field
|
searchable field: Value for a custom field
|
||||||
Database: postgresql
|
Database: postgresql
|
||||||
|
OS: Mac OS X ,windows
|
||||||
|
|||||||
@ -87,5 +87,14 @@ class Redmine::EnumerationFieldFormatTest < ActionView::TestCase
|
|||||||
|
|
||||||
def test_value_from_keyword_should_return_enumeration_id
|
def test_value_from_keyword_should_return_enumeration_id
|
||||||
assert_equal @foo.id, @field.value_from_keyword('foo', nil)
|
assert_equal @foo.id, @field.value_from_keyword('foo', nil)
|
||||||
|
assert_nil @field.value_from_keyword('baz', nil)
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_value_from_keyword_for_multiple_custom_field_should_return_enumeration_ids
|
||||||
|
@field.multiple = true
|
||||||
|
@field.save!
|
||||||
|
assert_equal [@foo.id, @bar.id], @field.value_from_keyword('foo, bar', nil)
|
||||||
|
assert_equal [@foo.id], @field.value_from_keyword('foo, baz', nil)
|
||||||
|
assert_equal [], @field.value_from_keyword('baz', nil)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -165,4 +165,24 @@ class Redmine::ListFieldFormatTest < ActionView::TestCase
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_value_from_keyword_should_return_value
|
||||||
|
field = GroupCustomField.create!(:name => 'List', :field_format => 'list', :possible_values => ['Foo', 'Bar', 'Baz,qux'])
|
||||||
|
|
||||||
|
assert_equal 'Foo', field.value_from_keyword('foo', nil)
|
||||||
|
assert_equal 'Baz,qux', field.value_from_keyword('baz,qux', nil)
|
||||||
|
assert_nil field.value_from_keyword('invalid', nil)
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_value_from_keyword_for_multiple_custom_field_should_return_values
|
||||||
|
field = GroupCustomField.create!(:name => 'List', :field_format => 'list', :possible_values => ['Foo', 'Bar', 'Baz,qux'], :multiple => true)
|
||||||
|
|
||||||
|
assert_equal ['Foo','Bar'], field.value_from_keyword('foo,bar', nil)
|
||||||
|
assert_equal ['Baz,qux'], field.value_from_keyword('baz,qux', nil)
|
||||||
|
assert_equal ['Baz,qux', 'Foo'], field.value_from_keyword('baz,qux,foo', nil)
|
||||||
|
assert_equal ['Foo'], field.value_from_keyword('foo,invalid', nil)
|
||||||
|
assert_equal ['Foo'], field.value_from_keyword(',foo,', nil)
|
||||||
|
assert_equal ['Foo'], field.value_from_keyword(',foo, ,,', nil)
|
||||||
|
assert_equal [], field.value_from_keyword('invalid', nil)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -58,4 +58,22 @@ class Redmine::UserFieldFormatTest < ActionView::TestCase
|
|||||||
|
|
||||||
assert_equal ['Dave Lopper'], field.possible_values_options(project).map(&:first)
|
assert_equal ['Dave Lopper'], field.possible_values_options(project).map(&:first)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_value_from_keyword_should_return_user_id
|
||||||
|
field = IssueCustomField.new(:field_format => 'user')
|
||||||
|
project = Project.find(1)
|
||||||
|
|
||||||
|
assert_equal 2, field.value_from_keyword('jsmith', project)
|
||||||
|
assert_equal 3, field.value_from_keyword('Dave Lopper', project)
|
||||||
|
assert_nil field.value_from_keyword('Unknown User', project)
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_value_from_keyword_for_multiple_custom_field_should_return_enumeration_ids
|
||||||
|
field = IssueCustomField.new(:field_format => 'user', :multiple => true)
|
||||||
|
project = Project.find(1)
|
||||||
|
|
||||||
|
assert_equal [2, 3], field.value_from_keyword('jsmith, Dave Lopper', project)
|
||||||
|
assert_equal [2], field.value_from_keyword('jsmith', project)
|
||||||
|
assert_equal [], field.value_from_keyword('Unknown User', project)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -232,8 +232,10 @@ class MailHandlerTest < ActiveSupport::TestCase
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_add_issue_with_custom_fields
|
def test_add_issue_with_custom_fields
|
||||||
|
mutiple = IssueCustomField.generate!(:field_format => 'list', :name => 'OS', :multiple => true, :possible_values => ['Linux', 'Windows', 'Mac OS X'])
|
||||||
|
|
||||||
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', 'OS']
|
||||||
)
|
)
|
||||||
assert issue.is_a?(Issue)
|
assert issue.is_a?(Issue)
|
||||||
assert !issue.new_record?
|
assert !issue.new_record?
|
||||||
@ -241,6 +243,7 @@ class MailHandlerTest < ActiveSupport::TestCase
|
|||||||
assert_equal 'New ticket with custom field values', issue.subject
|
assert_equal 'New ticket with custom field values', issue.subject
|
||||||
assert_equal 'PostgreSQL', issue.custom_field_value(1)
|
assert_equal 'PostgreSQL', issue.custom_field_value(1)
|
||||||
assert_equal 'Value for a custom field', issue.custom_field_value(2)
|
assert_equal 'Value for a custom field', issue.custom_field_value(2)
|
||||||
|
assert_equal ['Mac OS X', 'Windows'], issue.custom_field_value(mutiple.id).sort
|
||||||
assert !issue.description.match(/^searchable field:/i)
|
assert !issue.description.match(/^searchable field:/i)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user