diff --git a/models/org.go b/models/org.go index c135bb9d3cc31..bbb692591f6b9 100644 --- a/models/org.go +++ b/models/org.go @@ -163,7 +163,7 @@ func FindOrgMembers(opts *FindOrgMembersOpts) (user_model.UserList, map[int64]bo idsIsPublic[ou.UID] = ou.IsPublic } - users, err := user_model.GetUsersByIDs(ids) + users, err := user_model.GetUsersByIDs(db.DefaultContext, ids) if err != nil { return nil, nil, err } diff --git a/models/repo.go b/models/repo.go index 1fc8bd207b529..13680c9ec4f62 100644 --- a/models/repo.go +++ b/models/repo.go @@ -177,9 +177,24 @@ func getRepoAssignees(ctx context.Context, repo *repo_model.Repository) (_ []*us return users, nil } +func getRepoIssueAuthors(ctx context.Context, repoID int64, lim int, keyword string) (authors []*user_model.User, err error) { + var authorIDs []int64 + if err = db.GetEngine(ctx).SQL("SELECT user.id FROM issue,user WHERE user.id = issue.poster_id AND issue.repo_id = ? AND user.name LIKE '%?%' GROUP BY user.id ORDER BY user.id", repoID, keyword). + Limit(lim, 0).Find(&authorIDs); err != nil { + return nil, err + } + return user_model.GetUsersByIDs(ctx, authorIDs) +} + +// GetRepoIssueAuthors return the first 15 users who have created an issue in this repo +// the users can be specified by a keyword +func GetRepoIssueAuthors(repo *repo_model.Repository, keyword string) ([]*user_model.User, error) { + return getRepoIssueAuthors(db.DefaultContext, repo.ID, 15, keyword) +} + // GetRepoAssignees returns all users that have write access and can be assigned to issues // of the repository, -func GetRepoAssignees(repo *repo_model.Repository) (_ []*user_model.User, err error) { +func GetRepoAssignees(repo *repo_model.Repository) ([]*user_model.User, error) { return getRepoAssignees(db.DefaultContext, repo) } diff --git a/models/user/list.go b/models/user/list.go index 13138b3e507e8..b07871e8d2dc2 100644 --- a/models/user/list.go +++ b/models/user/list.go @@ -5,6 +5,7 @@ package user import ( + "context" "fmt" "code.gitea.io/gitea/models/auth" @@ -57,12 +58,12 @@ func (users UserList) loadTwoFactorStatus(e db.Engine) (map[int64]*auth.TwoFacto } // GetUsersByIDs returns all resolved users from a list of Ids. -func GetUsersByIDs(ids []int64) (UserList, error) { +func GetUsersByIDs(ctx context.Context, ids []int64) (UserList, error) { ous := make([]*User, 0, len(ids)) if len(ids) == 0 { return ous, nil } - err := db.GetEngine(db.DefaultContext).In("id", ids). + err := db.GetEngine(ctx).In("id", ids). Asc("name"). Find(&ous) return ous, err diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 9164d5ffdceda..0fface921f208 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -1213,6 +1213,8 @@ issues.filter_milestone = Milestone issues.filter_milestone_no_select = All milestones issues.filter_assignee = Assignee issues.filter_assginee_no_select = All assignees +issues.filter_author = Author +issues.filter_author_no_select = All authors issues.filter_type = Type issues.filter_type.all_issues = All issues issues.filter_type.assigned_to_you = Assigned to you diff --git a/routers/api/v1/repo/issue_subscription.go b/routers/api/v1/repo/issue_subscription.go index 9c6b4e464711a..584e31ef2aad4 100644 --- a/routers/api/v1/repo/issue_subscription.go +++ b/routers/api/v1/repo/issue_subscription.go @@ -274,7 +274,7 @@ func GetIssueSubscribers(ctx *context.APIContext) { userIDs = append(userIDs, iw.UserID) } - users, err := user_model.GetUsersByIDs(userIDs) + users, err := user_model.GetUsersByIDs(ctx, userIDs) if err != nil { ctx.Error(http.StatusInternalServerError, "GetUsersByIDs", err) return diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go index ea16de3950b7f..8063ce3f39993 100644 --- a/routers/web/repo/issue.go +++ b/routers/web/repo/issue.go @@ -126,6 +126,7 @@ func issues(ctx *context.Context, milestoneID, projectID int64, isPullOption uti var ( assigneeID = ctx.FormInt64("assignee") posterID int64 + authorID int64 mentionedID int64 reviewRequestedID int64 forceEmpty bool @@ -135,6 +136,7 @@ func issues(ctx *context.Context, milestoneID, projectID int64, isPullOption uti switch viewType { case "created_by": posterID = ctx.User.ID + authorID = posterID case "mentioned": mentionedID = ctx.User.ID case "assigned": @@ -284,6 +286,13 @@ func issues(ctx *context.Context, milestoneID, projectID int64, isPullOption uti return } + // Get issue authors + ctx.Data["Authors"], err = models.GetRepoIssueAuthors(repo, "") + if err != nil { + ctx.ServerError("GetIssueAuthors", err) + return + } + labels, err := models.GetLabelsByRepoID(repo.ID, "", db.ListOptions{}) if err != nil { ctx.ServerError("GetLabelsByRepoID", err) @@ -353,6 +362,7 @@ func issues(ctx *context.Context, milestoneID, projectID int64, isPullOption uti ctx.Data["SortType"] = sortType ctx.Data["MilestoneID"] = milestoneID ctx.Data["AssigneeID"] = assigneeID + ctx.Data["AuthorID"] = authorID ctx.Data["IsShowClosed"] = isShowClosed ctx.Data["Keyword"] = keyword if isShowClosed { diff --git a/templates/repo/issue/list.tmpl b/templates/repo/issue/list.tmpl index 63d746f570a18..d6385d93e9d6b 100644 --- a/templates/repo/issue/list.tmpl +++ b/templates/repo/issue/list.tmpl @@ -40,9 +40,9 @@ @@ -54,9 +54,9 @@ {{svg "octicon-triangle-down" 14 "dropdown icon"}} @@ -68,15 +68,31 @@ {{svg "octicon-triangle-down" 14 "dropdown icon"}} + + + {{if .IsSigned}} @@ -103,14 +119,14 @@ {{svg "octicon-triangle-down" 14 "dropdown icon"}}