mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 21:28:11 +09: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 | ||||
| } | ||||
|  | ||||
| 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 { | ||||
| 	if len(opts.RepoIDs) == 1 { | ||||
| 		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}) | ||||
| 	} | ||||
|  | ||||
| 	if opts.ProjectID > 0 { | ||||
| 		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"))) | ||||
| 	} | ||||
| 	applyProjectCondition(sess, opts) | ||||
|  | ||||
| 	if opts.ProjectBoardID != 0 { | ||||
| 		if opts.ProjectBoardID > 0 { | ||||
|   | ||||
| @@ -133,10 +133,7 @@ func getIssueStatsChunk(opts *IssuesOptions, issueIDs []int64) (*IssueStats, err | ||||
|  | ||||
| 		applyMilestoneCondition(sess, opts) | ||||
|  | ||||
| 		if opts.ProjectID > 0 { | ||||
| 			sess.Join("INNER", "project_issue", "issue.id = project_issue.issue_id"). | ||||
| 				And("project_issue.project_id=?", opts.ProjectID) | ||||
| 		} | ||||
| 		applyProjectCondition(sess, opts) | ||||
|  | ||||
| 		if opts.AssigneeID > 0 { | ||||
| 			applyAssigneeCondition(sess, opts.AssigneeID) | ||||
|   | ||||
| @@ -17,6 +17,10 @@ func ToSearchOptions(keyword string, opts *issues_model.IssuesOptions) *SearchOp | ||||
| 		IsClosed:  opts.IsClosed, | ||||
| 	} | ||||
|  | ||||
| 	if opts.ProjectID != 0 { | ||||
| 		searchOpt.ProjectID = &opts.ProjectID | ||||
| 	} | ||||
|  | ||||
| 	if len(opts.LabelIDs) == 1 && opts.LabelIDs[0] == 0 { | ||||
| 		searchOpt.NoLabelOnly = true | ||||
| 	} else { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user