mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Fix project filter bugs (#26490)
related: #26012 ### Bugs 1. missing project filter on the issue page.1e76a824bc/modules/indexer/issues/dboptions.go (L11-L15)3. incorrect SQL condition: some issue does not belong to a project but exists on the project_issue table.f5dbac9d36/models/issues/issue_search.go (L233)### Before:  ### After:  --------- Co-authored-by: Giteabot <teabot@gitea.io>
This commit is contained in:
		@@ -168,6 +168,18 @@ func applyMilestoneCondition(sess *xorm.Session, opts *IssuesOptions) *xorm.Sess
 | 
				
			|||||||
	return sess
 | 
						return sess
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func applyProjectCondition(sess *xorm.Session, opts *IssuesOptions) *xorm.Session {
 | 
				
			||||||
 | 
						if opts.ProjectID > 0 { // specific project
 | 
				
			||||||
 | 
							sess.Join("INNER", "project_issue", "issue.id = project_issue.issue_id").
 | 
				
			||||||
 | 
								And("project_issue.project_id=?", opts.ProjectID)
 | 
				
			||||||
 | 
						} else if opts.ProjectID == db.NoConditionID { // show those that are in no project
 | 
				
			||||||
 | 
							sess.And(builder.NotIn("issue.id", builder.Select("issue_id").From("project_issue").And(builder.Neq{"project_id": 0})))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// opts.ProjectID == 0 means all projects,
 | 
				
			||||||
 | 
						// do not need to apply any condition
 | 
				
			||||||
 | 
						return sess
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func applyRepoConditions(sess *xorm.Session, opts *IssuesOptions) *xorm.Session {
 | 
					func applyRepoConditions(sess *xorm.Session, opts *IssuesOptions) *xorm.Session {
 | 
				
			||||||
	if len(opts.RepoIDs) == 1 {
 | 
						if len(opts.RepoIDs) == 1 {
 | 
				
			||||||
		opts.RepoCond = builder.Eq{"issue.repo_id": opts.RepoIDs[0]}
 | 
							opts.RepoCond = builder.Eq{"issue.repo_id": opts.RepoIDs[0]}
 | 
				
			||||||
@@ -226,12 +238,7 @@ func applyConditions(sess *xorm.Session, opts *IssuesOptions) *xorm.Session {
 | 
				
			|||||||
		sess.And(builder.Lte{"issue.updated_unix": opts.UpdatedBeforeUnix})
 | 
							sess.And(builder.Lte{"issue.updated_unix": opts.UpdatedBeforeUnix})
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if opts.ProjectID > 0 {
 | 
						applyProjectCondition(sess, opts)
 | 
				
			||||||
		sess.Join("INNER", "project_issue", "issue.id = project_issue.issue_id").
 | 
					 | 
				
			||||||
			And("project_issue.project_id=?", opts.ProjectID)
 | 
					 | 
				
			||||||
	} else if opts.ProjectID == db.NoConditionID { // show those that are in no project
 | 
					 | 
				
			||||||
		sess.And(builder.NotIn("issue.id", builder.Select("issue_id").From("project_issue")))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if opts.ProjectBoardID != 0 {
 | 
						if opts.ProjectBoardID != 0 {
 | 
				
			||||||
		if opts.ProjectBoardID > 0 {
 | 
							if opts.ProjectBoardID > 0 {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -133,10 +133,7 @@ func getIssueStatsChunk(opts *IssuesOptions, issueIDs []int64) (*IssueStats, err
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		applyMilestoneCondition(sess, opts)
 | 
							applyMilestoneCondition(sess, opts)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if opts.ProjectID > 0 {
 | 
							applyProjectCondition(sess, opts)
 | 
				
			||||||
			sess.Join("INNER", "project_issue", "issue.id = project_issue.issue_id").
 | 
					 | 
				
			||||||
				And("project_issue.project_id=?", opts.ProjectID)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if opts.AssigneeID > 0 {
 | 
							if opts.AssigneeID > 0 {
 | 
				
			||||||
			applyAssigneeCondition(sess, opts.AssigneeID)
 | 
								applyAssigneeCondition(sess, opts.AssigneeID)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,6 +17,10 @@ func ToSearchOptions(keyword string, opts *issues_model.IssuesOptions) *SearchOp
 | 
				
			|||||||
		IsClosed:  opts.IsClosed,
 | 
							IsClosed:  opts.IsClosed,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if opts.ProjectID != 0 {
 | 
				
			||||||
 | 
							searchOpt.ProjectID = &opts.ProjectID
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if len(opts.LabelIDs) == 1 && opts.LabelIDs[0] == 0 {
 | 
						if len(opts.LabelIDs) == 1 && opts.LabelIDs[0] == 0 {
 | 
				
			||||||
		searchOpt.NoLabelOnly = true
 | 
							searchOpt.NoLabelOnly = true
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user