forked from gitea/gitea
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: ![before](https://github.com/go-gitea/gitea/assets/50507092/1dcde39e-3e2f-4151-b2c6-4d67bf493c2f) ### After: ![after](https://github.com/go-gitea/gitea/assets/50507092/badfb81f-056d-4a2f-9838-1cba9c15768d) --------- Co-authored-by: Giteabot <teabot@gitea.io>
This commit is contained in:
parent
7f8028e5a1
commit
0e74fc4a84
|
@ -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 {
|
||||||
|
|
Loading…
Reference in New Issue