mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 00:20:25 +08:00 
			
		
		
		
	@@ -1491,6 +1491,7 @@ type UserIssueStatsOptions struct {
 | 
				
			|||||||
	IsPull      bool
 | 
						IsPull      bool
 | 
				
			||||||
	IsClosed    bool
 | 
						IsClosed    bool
 | 
				
			||||||
	IssueIDs    []int64
 | 
						IssueIDs    []int64
 | 
				
			||||||
 | 
						LabelIDs    []int64
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GetUserIssueStats returns issue statistic information for dashboard by given conditions.
 | 
					// GetUserIssueStats returns issue statistic information for dashboard by given conditions.
 | 
				
			||||||
@@ -1507,29 +1508,38 @@ func GetUserIssueStats(opts UserIssueStatsOptions) (*IssueStats, error) {
 | 
				
			|||||||
		cond = cond.And(builder.In("issue.id", opts.IssueIDs))
 | 
							cond = cond.And(builder.In("issue.id", opts.IssueIDs))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sess := func(cond builder.Cond) *xorm.Session {
 | 
				
			||||||
 | 
							s := x.Where(cond)
 | 
				
			||||||
 | 
							if len(opts.LabelIDs) > 0 {
 | 
				
			||||||
 | 
								s.Join("INNER", "issue_label", "issue_label.issue_id = issue.id").
 | 
				
			||||||
 | 
									In("issue_label.label_id", opts.LabelIDs)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return s
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	switch opts.FilterMode {
 | 
						switch opts.FilterMode {
 | 
				
			||||||
	case FilterModeAll:
 | 
						case FilterModeAll:
 | 
				
			||||||
		stats.OpenCount, err = x.Where(cond).And("issue.is_closed = ?", false).
 | 
							stats.OpenCount, err = sess(cond).And("issue.is_closed = ?", false).
 | 
				
			||||||
			And(builder.In("issue.repo_id", opts.UserRepoIDs)).
 | 
								And(builder.In("issue.repo_id", opts.UserRepoIDs)).
 | 
				
			||||||
			Count(new(Issue))
 | 
								Count(new(Issue))
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, err
 | 
								return nil, err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		stats.ClosedCount, err = x.Where(cond).And("issue.is_closed = ?", true).
 | 
							stats.ClosedCount, err = sess(cond).And("issue.is_closed = ?", true).
 | 
				
			||||||
			And(builder.In("issue.repo_id", opts.UserRepoIDs)).
 | 
								And(builder.In("issue.repo_id", opts.UserRepoIDs)).
 | 
				
			||||||
			Count(new(Issue))
 | 
								Count(new(Issue))
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, err
 | 
								return nil, err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	case FilterModeAssign:
 | 
						case FilterModeAssign:
 | 
				
			||||||
		stats.OpenCount, err = x.Where(cond).And("issue.is_closed = ?", false).
 | 
							stats.OpenCount, err = sess(cond).And("issue.is_closed = ?", false).
 | 
				
			||||||
			Join("INNER", "issue_assignees", "issue.id = issue_assignees.issue_id").
 | 
								Join("INNER", "issue_assignees", "issue.id = issue_assignees.issue_id").
 | 
				
			||||||
			And("issue_assignees.assignee_id = ?", opts.UserID).
 | 
								And("issue_assignees.assignee_id = ?", opts.UserID).
 | 
				
			||||||
			Count(new(Issue))
 | 
								Count(new(Issue))
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, err
 | 
								return nil, err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		stats.ClosedCount, err = x.Where(cond).And("issue.is_closed = ?", true).
 | 
							stats.ClosedCount, err = sess(cond).And("issue.is_closed = ?", true).
 | 
				
			||||||
			Join("INNER", "issue_assignees", "issue.id = issue_assignees.issue_id").
 | 
								Join("INNER", "issue_assignees", "issue.id = issue_assignees.issue_id").
 | 
				
			||||||
			And("issue_assignees.assignee_id = ?", opts.UserID).
 | 
								And("issue_assignees.assignee_id = ?", opts.UserID).
 | 
				
			||||||
			Count(new(Issue))
 | 
								Count(new(Issue))
 | 
				
			||||||
@@ -1537,27 +1547,27 @@ func GetUserIssueStats(opts UserIssueStatsOptions) (*IssueStats, error) {
 | 
				
			|||||||
			return nil, err
 | 
								return nil, err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	case FilterModeCreate:
 | 
						case FilterModeCreate:
 | 
				
			||||||
		stats.OpenCount, err = x.Where(cond).And("issue.is_closed = ?", false).
 | 
							stats.OpenCount, err = sess(cond).And("issue.is_closed = ?", false).
 | 
				
			||||||
			And("issue.poster_id = ?", opts.UserID).
 | 
								And("issue.poster_id = ?", opts.UserID).
 | 
				
			||||||
			Count(new(Issue))
 | 
								Count(new(Issue))
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, err
 | 
								return nil, err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		stats.ClosedCount, err = x.Where(cond).And("issue.is_closed = ?", true).
 | 
							stats.ClosedCount, err = sess(cond).And("issue.is_closed = ?", true).
 | 
				
			||||||
			And("issue.poster_id = ?", opts.UserID).
 | 
								And("issue.poster_id = ?", opts.UserID).
 | 
				
			||||||
			Count(new(Issue))
 | 
								Count(new(Issue))
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, err
 | 
								return nil, err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	case FilterModeMention:
 | 
						case FilterModeMention:
 | 
				
			||||||
		stats.OpenCount, err = x.Where(cond).And("issue.is_closed = ?", false).
 | 
							stats.OpenCount, err = sess(cond).And("issue.is_closed = ?", false).
 | 
				
			||||||
			Join("INNER", "issue_user", "issue.id = issue_user.issue_id and issue_user.is_mentioned = ?", true).
 | 
								Join("INNER", "issue_user", "issue.id = issue_user.issue_id and issue_user.is_mentioned = ?", true).
 | 
				
			||||||
			And("issue_user.uid = ?", opts.UserID).
 | 
								And("issue_user.uid = ?", opts.UserID).
 | 
				
			||||||
			Count(new(Issue))
 | 
								Count(new(Issue))
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, err
 | 
								return nil, err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		stats.ClosedCount, err = x.Where(cond).And("issue.is_closed = ?", true).
 | 
							stats.ClosedCount, err = sess(cond).And("issue.is_closed = ?", true).
 | 
				
			||||||
			Join("INNER", "issue_user", "issue.id = issue_user.issue_id and issue_user.is_mentioned = ?", true).
 | 
								Join("INNER", "issue_user", "issue.id = issue_user.issue_id and issue_user.is_mentioned = ?", true).
 | 
				
			||||||
			And("issue_user.uid = ?", opts.UserID).
 | 
								And("issue_user.uid = ?", opts.UserID).
 | 
				
			||||||
			Count(new(Issue))
 | 
								Count(new(Issue))
 | 
				
			||||||
@@ -1567,7 +1577,7 @@ func GetUserIssueStats(opts UserIssueStatsOptions) (*IssueStats, error) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cond = cond.And(builder.Eq{"issue.is_closed": opts.IsClosed})
 | 
						cond = cond.And(builder.Eq{"issue.is_closed": opts.IsClosed})
 | 
				
			||||||
	stats.AssignCount, err = x.Where(cond).
 | 
						stats.AssignCount, err = sess(cond).
 | 
				
			||||||
		Join("INNER", "issue_assignees", "issue.id = issue_assignees.issue_id").
 | 
							Join("INNER", "issue_assignees", "issue.id = issue_assignees.issue_id").
 | 
				
			||||||
		And("issue_assignees.assignee_id = ?", opts.UserID).
 | 
							And("issue_assignees.assignee_id = ?", opts.UserID).
 | 
				
			||||||
		Count(new(Issue))
 | 
							Count(new(Issue))
 | 
				
			||||||
@@ -1575,14 +1585,14 @@ func GetUserIssueStats(opts UserIssueStatsOptions) (*IssueStats, error) {
 | 
				
			|||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	stats.CreateCount, err = x.Where(cond).
 | 
						stats.CreateCount, err = sess(cond).
 | 
				
			||||||
		And("poster_id = ?", opts.UserID).
 | 
							And("poster_id = ?", opts.UserID).
 | 
				
			||||||
		Count(new(Issue))
 | 
							Count(new(Issue))
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	stats.MentionCount, err = x.Where(cond).
 | 
						stats.MentionCount, err = sess(cond).
 | 
				
			||||||
		Join("INNER", "issue_user", "issue.id = issue_user.issue_id and issue_user.is_mentioned = ?", true).
 | 
							Join("INNER", "issue_user", "issue.id = issue_user.issue_id and issue_user.is_mentioned = ?", true).
 | 
				
			||||||
		And("issue_user.uid = ?", opts.UserID).
 | 
							And("issue_user.uid = ?", opts.UserID).
 | 
				
			||||||
		Count(new(Issue))
 | 
							Count(new(Issue))
 | 
				
			||||||
@@ -1590,7 +1600,7 @@ func GetUserIssueStats(opts UserIssueStatsOptions) (*IssueStats, error) {
 | 
				
			|||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	stats.YourRepositoriesCount, err = x.Where(cond).
 | 
						stats.YourRepositoriesCount, err = sess(cond).
 | 
				
			||||||
		And(builder.In("issue.repo_id", opts.UserRepoIDs)).
 | 
							And(builder.In("issue.repo_id", opts.UserRepoIDs)).
 | 
				
			||||||
		Count(new(Issue))
 | 
							Count(new(Issue))
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -567,6 +567,7 @@ func Issues(ctx *context.Context) {
 | 
				
			|||||||
		FilterMode:  filterMode,
 | 
							FilterMode:  filterMode,
 | 
				
			||||||
		IsPull:      isPullList,
 | 
							IsPull:      isPullList,
 | 
				
			||||||
		IsClosed:    isShowClosed,
 | 
							IsClosed:    isShowClosed,
 | 
				
			||||||
 | 
							LabelIDs:    opts.LabelIDs,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if len(repoIDs) > 0 {
 | 
						if len(repoIDs) > 0 {
 | 
				
			||||||
		userIssueStatsOpts.UserRepoIDs = repoIDs
 | 
							userIssueStatsOpts.UserRepoIDs = repoIDs
 | 
				
			||||||
@@ -586,6 +587,7 @@ func Issues(ctx *context.Context) {
 | 
				
			|||||||
			IsPull:      isPullList,
 | 
								IsPull:      isPullList,
 | 
				
			||||||
			IsClosed:    isShowClosed,
 | 
								IsClosed:    isShowClosed,
 | 
				
			||||||
			IssueIDs:    issueIDsFromSearch,
 | 
								IssueIDs:    issueIDsFromSearch,
 | 
				
			||||||
 | 
								LabelIDs:    opts.LabelIDs,
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if len(repoIDs) > 0 {
 | 
							if len(repoIDs) > 0 {
 | 
				
			||||||
			statsOpts.RepoIDs = repoIDs
 | 
								statsOpts.RepoIDs = repoIDs
 | 
				
			||||||
@@ -608,6 +610,7 @@ func Issues(ctx *context.Context) {
 | 
				
			|||||||
			IsPull:      isPullList,
 | 
								IsPull:      isPullList,
 | 
				
			||||||
			IsClosed:    isShowClosed,
 | 
								IsClosed:    isShowClosed,
 | 
				
			||||||
			IssueIDs:    issueIDsFromSearch,
 | 
								IssueIDs:    issueIDsFromSearch,
 | 
				
			||||||
 | 
								LabelIDs:    opts.LabelIDs,
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			ctx.ServerError("GetUserIssueStats All", err)
 | 
								ctx.ServerError("GetUserIssueStats All", err)
 | 
				
			||||||
@@ -659,6 +662,7 @@ func Issues(ctx *context.Context) {
 | 
				
			|||||||
	ctx.Data["RepoIDs"] = repoIDs
 | 
						ctx.Data["RepoIDs"] = repoIDs
 | 
				
			||||||
	ctx.Data["IsShowClosed"] = isShowClosed
 | 
						ctx.Data["IsShowClosed"] = isShowClosed
 | 
				
			||||||
	ctx.Data["TotalIssueCount"] = totalIssues
 | 
						ctx.Data["TotalIssueCount"] = totalIssues
 | 
				
			||||||
 | 
						ctx.Data["SelectLabels"] = selectLabels
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if isShowClosed {
 | 
						if isShowClosed {
 | 
				
			||||||
		ctx.Data["State"] = "closed"
 | 
							ctx.Data["State"] = "closed"
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user