diff --git a/lib/RT/Record/Role/Roles.pm b/lib/RT/Record/Role/Roles.pm index b973eb21b19..1db783dee89 100644 --- a/lib/RT/Record/Role/Roles.pm +++ b/lib/RT/Record/Role/Roles.pm @@ -621,19 +621,27 @@ sub _ResolveRoles { $self->loc("Couldn't load principal: [_1]", $msg); } } else { - my @addresses = RT::EmailParser->ParseEmailAddress( $value ); - for my $address ( @addresses ) { - my $user = RT::User->new( RT->SystemUser ); - my ($id, $msg) = $user->LoadOrCreateByEmail( $address ); - if ( $id ) { - # Load it back as us, not as the system - # user, to be completely safe. - $user = RT::User->new( $self->CurrentUser ); - $user->Load( $id ); - push @{ $roles->{$role} }, $user->PrincipalObj; - } else { - push @errors, - $self->loc("Couldn't load or create user: [_1]", $msg); + # Try loading by id, name, then email. If all fail, catch that below + my $user = RT::User->new( $self->CurrentUser ); + $user->Load( $value ); + + if ($user->id) { + push @{ $roles->{$role} }, $user->PrincipalObj; + } else { + my @addresses = RT::EmailParser->ParseEmailAddress( $value ); + for my $address ( @addresses ) { + $user = RT::User->new( RT->SystemUser ); + my ($id, $msg) = $user->LoadOrCreateByEmail( $address ); + if ( $id ) { + # Load it back as us, not as the system + # user, to be completely safe. + $user = RT::User->new( $self->CurrentUser ); + $user->Load( $id ); + push @{ $roles->{$role} }, $user->PrincipalObj; + } else { + push @errors, + $self->loc("Couldn't load or create user: [_1]", $msg); + } } } } diff --git a/t/assets/api.t b/t/assets/api.t index df64eab48fd..a27bb24de3e 100644 --- a/t/assets/api.t +++ b/t/assets/api.t @@ -175,5 +175,28 @@ diag "Custom Field handling"; } +note "Create/update with Roles using names"; +{ + my $root = RT::User->new( RT->SystemUser ); + $root->Load("root"); + ok $root->id, "Found root"; + + my $bps = RT::Test->load_or_create_user( Name => "BPS" ); + ok $bps->id, "Created BPS user"; + + my $asset = RT::Asset->new( RT->SystemUser ); + my ($id, $msg) = $asset->Create( + Name => 'RT server 2', + HeldBy => 'root', + Owner => 'BPS', + Contact => 'BPS', + Catalog => $catalog->id, + ); + ok $id, "Created: $msg"; + is $asset->HeldBy->UserMembersObj->First->Name, "root", "root is Holder"; + is $asset->Owner->Name, "BPS", "BPS is Owner"; + is $asset->Contacts->UserMembersObj->First->Name, "BPS", "BPS is Contact"; +} + done_testing;