From 3701fcec84eb8ebcdac55b13f879a670a14199ec Mon Sep 17 00:00:00 2001 From: Danny Ward <71604164+dannyward630@users.noreply.github.com> Date: Mon, 19 Oct 2026 21:13:17 -0400 Subject: [PATCH] fix(issues): use unified user display name pattern for more places (#39852) * Fix #39761 --------- Co-authored-by: wxiaoguang --- models/issues/reaction.go | 2 +- models/user/user.go | 9 +++++++++ models/user/user_test.go | 17 ++++++----------- services/issue/reaction_test.go | 2 +- templates/mail/repo/issue/assigned.tmpl | 4 ++-- templates/mail/repo/issue/default.tmpl | 22 +++++++++++----------- templates/shared/user/name.tmpl | 2 +- 7 files changed, 31 insertions(+), 27 deletions(-) diff --git a/models/issues/reaction.go b/models/issues/reaction.go index 0043379d6d8..70e0d18ba9c 100644 --- a/models/issues/reaction.go +++ b/models/issues/reaction.go @@ -350,7 +350,7 @@ func (list ReactionList) GetFirstUsers() string { if buffer.Len() > 0 { buffer.WriteString(", ") } - buffer.WriteString(reaction.User.Name) + buffer.WriteString(reaction.User.DisplayNameWithFullName()) if rem--; rem == 0 { break } diff --git a/models/user/user.go b/models/user/user.go index 0349a469f91..8ba76136005 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -465,6 +465,7 @@ func (u *User) EmailTo() string { } // TODO: DefaultShowFullName causes messy logic, there are already too many methods to display a user's "display name", need to refactor them +// Search this TODO to see more details // * user.Name / user.FullName: directly used in templates // * user.DisplayName(): always show FullName if it's not empty, otherwise show Name // * user.GetDisplayName(): show FullName if it's not empty and DefaultShowFullName is set, otherwise show Name @@ -491,6 +492,14 @@ func (u *User) GetDisplayName() string { return u.Name } +// DisplayNameWithFullName returns the username, full name is included if it is not empty +func (u *User) DisplayNameWithFullName() string { + if fullName := strings.TrimSpace(u.FullName); fullName != "" { + return fmt.Sprintf("%s (%s)", u.Name, fullName) + } + return u.Name +} + // ShortName ellipses username to length (still used by many templates), it calls GetDisplayName and respects DEFAULT_SHOW_FULL_NAME func (u *User) ShortName(length int) string { return util.EllipsisDisplayString(u.GetDisplayName(), length) diff --git a/models/user/user_test.go b/models/user/user_test.go index 50a2eb70b4e..17ba7c339f5 100644 --- a/models/user/user_test.go +++ b/models/user/user_test.go @@ -295,18 +295,13 @@ func TestNewGitSig(t *testing.T) { } func TestDisplayName(t *testing.T) { - users := make([]*user_model.User, 0, 20) - err := db.GetEngine(t.Context()).Find(&users) - assert.NoError(t, err) + u := &user_model.User{Name: "name"} + assert.Equal(t, "name", u.DisplayName()) + assert.Equal(t, "name", u.DisplayNameWithFullName()) - for _, user := range users { - displayName := user.DisplayName() - assert.Equal(t, strings.TrimSpace(displayName), displayName) - if len(strings.TrimSpace(user.FullName)) == 0 { - assert.Equal(t, user.Name, displayName) - } - assert.NotEmpty(t, strings.TrimSpace(displayName)) - } + u = &user_model.User{Name: "name", FullName: "Full Name"} + assert.Equal(t, "Full Name", u.DisplayName()) + assert.Equal(t, "name (Full Name)", u.DisplayNameWithFullName()) } func TestCreateUserEmailAlreadyUsed(t *testing.T) { diff --git a/services/issue/reaction_test.go b/services/issue/reaction_test.go index 62bb9e691d0..7cf5d155461 100644 --- a/services/issue/reaction_test.go +++ b/services/issue/reaction_test.go @@ -101,7 +101,7 @@ func TestIssueReactionCount(t *testing.T) { reactions := reactionsList.GroupByType() assert.Len(t, reactions["heart"], 4) assert.Equal(t, 2, reactions["heart"].GetMoreUserCount()) - assert.Equal(t, user1.Name+", "+user2.Name, reactions["heart"].GetFirstUsers()) + assert.Equal(t, "user1 (User One), user2 (< Ur Tw ><)", reactions["heart"].GetFirstUsers()) assert.True(t, reactions["heart"].HasUser(1)) assert.False(t, reactions["heart"].HasUser(5)) assert.False(t, reactions["heart"].HasUser(0)) diff --git a/templates/mail/repo/issue/assigned.tmpl b/templates/mail/repo/issue/assigned.tmpl index 950d7b5cc49..49ee871c925 100644 --- a/templates/mail/repo/issue/assigned.tmpl +++ b/templates/mail/repo/issue/assigned.tmpl @@ -9,9 +9,9 @@

{{if .IsPull}} - {{.locale.Tr "mail.issue_assigned.pull" .Doer.Name $link $repo_url}} + {{.locale.Tr "mail.issue_assigned.pull" .Doer.DisplayNameWithFullName $link $repo_url}} {{else}} - {{.locale.Tr "mail.issue_assigned.issue" .Doer.Name $link $repo_url}} + {{.locale.Tr "mail.issue_assigned.issue" .Doer.DisplayNameWithFullName $link $repo_url}} {{end}}

{{if .CanReply}}

{{.locale.Tr "mail.reply_directly"}}.

{{end}} diff --git a/templates/mail/repo/issue/default.tmpl b/templates/mail/repo/issue/default.tmpl index 917740b83a7..b306868bca6 100644 --- a/templates/mail/repo/issue/default.tmpl +++ b/templates/mail/repo/issue/default.tmpl @@ -17,34 +17,34 @@ {{$newShortSha := ShortSha .Comment.NewCommit}} {{$newCommitLink := HTMLFormat "%[2]s" $newCommitUrl $newShortSha}} - {{.locale.Tr "mail.issue.action.force_push" .Doer.Name .Comment.Issue.PullRequest.HeadBranch $oldCommitLink $newCommitLink}} + {{.locale.Tr "mail.issue.action.force_push" .Doer.DisplayNameWithFullName .Comment.Issue.PullRequest.HeadBranch $oldCommitLink $newCommitLink}} {{else}} - {{.locale.TrN (len .Comment.Commits) "mail.issue.action.push_1" "mail.issue.action.push_n" .Doer.Name .Comment.Issue.PullRequest.HeadBranch (len .Comment.Commits)}} + {{.locale.TrN (len .Comment.Commits) "mail.issue.action.push_1" "mail.issue.action.push_n" .Doer.DisplayNameWithFullName .Comment.Issue.PullRequest.HeadBranch (len .Comment.Commits)}} {{end}}

{{end}}

{{if eq .ActionName "close"}} - {{.locale.Tr "mail.issue.action.close" .Doer.Name .Issue.Index}} + {{.locale.Tr "mail.issue.action.close" .Doer.DisplayNameWithFullName .Issue.Index}} {{else if eq .ActionName "reopen"}} - {{.locale.Tr "mail.issue.action.reopen" .Doer.Name .Issue.Index}} + {{.locale.Tr "mail.issue.action.reopen" .Doer.DisplayNameWithFullName .Issue.Index}} {{else if eq .ActionName "merge"}} - {{.locale.Tr "mail.issue.action.merge" .Doer.Name .Issue.Index .Issue.PullRequest.BaseBranch}} + {{.locale.Tr "mail.issue.action.merge" .Doer.DisplayNameWithFullName .Issue.Index .Issue.PullRequest.BaseBranch}} {{else if eq .ActionName "approve"}} - {{.locale.Tr "mail.issue.action.approve" .Doer.Name}} + {{.locale.Tr "mail.issue.action.approve" .Doer.DisplayNameWithFullName}} {{else if eq .ActionName "reject"}} - {{.locale.Tr "mail.issue.action.reject" .Doer.Name}} + {{.locale.Tr "mail.issue.action.reject" .Doer.DisplayNameWithFullName}} {{else if eq .ActionName "review"}} - {{.locale.Tr "mail.issue.action.review" .Doer.Name}} + {{.locale.Tr "mail.issue.action.review" .Doer.DisplayNameWithFullName}} {{else if eq .ActionName "review_dismissed"}} - {{.locale.Tr "mail.issue.action.review_dismissed" .Doer.Name .Comment.Review.Reviewer.Name}} + {{.locale.Tr "mail.issue.action.review_dismissed" .Doer.DisplayNameWithFullName .Comment.Review.Reviewer.DisplayNameWithFullName}} {{else if eq .ActionName "ready_for_review"}} - {{.locale.Tr "mail.issue.action.ready_for_review" .Doer.Name}} + {{.locale.Tr "mail.issue.action.ready_for_review" .Doer.DisplayNameWithFullName}} {{end}} {{- if eq .Body ""}} {{if eq .ActionName "new"}} - {{.locale.Tr "mail.issue.action.new" .Doer.Name .Issue.Index}} + {{.locale.Tr "mail.issue.action.new" .Doer.DisplayNameWithFullName .Issue.Index}} {{end}} {{else}} {{.Body}} diff --git a/templates/shared/user/name.tmpl b/templates/shared/user/name.tmpl index 0bebd4e744e..a4744a6bdb6 100644 --- a/templates/shared/user/name.tmpl +++ b/templates/shared/user/name.tmpl @@ -1 +1 @@ -{{.Name}}{{if .FullName}} ({{.FullName}}){{end}}{{template "shared/user/user_type_label" .}} +{{.DisplayNameWithFullName}}{{template "shared/user/user_type_label" .}}