gitea源码

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. // Copyright 2024 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package issue
  4. import (
  5. "strings"
  6. "code.gitea.io/gitea/models/db"
  7. issues_model "code.gitea.io/gitea/models/issues"
  8. user_model "code.gitea.io/gitea/models/user"
  9. "code.gitea.io/gitea/modules/base"
  10. "code.gitea.io/gitea/services/context"
  11. )
  12. // PrepareFilterIssueLabels reads the "labels" query parameter, sets `ctx.Data["Labels"]` and `ctx.Data["SelectLabels"]`
  13. func PrepareFilterIssueLabels(ctx *context.Context, repoID int64, owner *user_model.User) (ret struct {
  14. AllLabels []*issues_model.Label
  15. SelectedLabelIDs []int64
  16. },
  17. ) {
  18. // 1,-2 means including label 1 and excluding label 2
  19. // 0 means issues with no label
  20. // blank means labels will not be filtered for issues
  21. selectLabels := ctx.FormString("labels")
  22. if selectLabels != "" {
  23. var err error
  24. ret.SelectedLabelIDs, err = base.StringsToInt64s(strings.Split(selectLabels, ","))
  25. if err != nil {
  26. ctx.Flash.Error(ctx.Tr("invalid_data", selectLabels), true)
  27. }
  28. }
  29. var allLabels []*issues_model.Label
  30. if repoID != 0 {
  31. repoLabels, err := issues_model.GetLabelsByRepoID(ctx, repoID, "", db.ListOptions{})
  32. if err != nil {
  33. ctx.ServerError("GetLabelsByRepoID", err)
  34. return ret
  35. }
  36. allLabels = append(allLabels, repoLabels...)
  37. }
  38. if owner != nil && owner.IsOrganization() {
  39. orgLabels, err := issues_model.GetLabelsByOrgID(ctx, owner.ID, "", db.ListOptions{})
  40. if err != nil {
  41. ctx.ServerError("GetLabelsByOrgID", err)
  42. return ret
  43. }
  44. allLabels = append(allLabels, orgLabels...)
  45. }
  46. // Get the exclusive scope for every label ID
  47. labelExclusiveScopes := make([]string, 0, len(ret.SelectedLabelIDs))
  48. for _, labelID := range ret.SelectedLabelIDs {
  49. foundExclusiveScope := false
  50. for _, label := range allLabels {
  51. if label.ID == labelID || label.ID == -labelID {
  52. labelExclusiveScopes = append(labelExclusiveScopes, label.ExclusiveScope())
  53. foundExclusiveScope = true
  54. break
  55. }
  56. }
  57. if !foundExclusiveScope {
  58. labelExclusiveScopes = append(labelExclusiveScopes, "")
  59. }
  60. }
  61. for _, l := range allLabels {
  62. l.LoadSelectedLabelsAfterClick(ret.SelectedLabelIDs, labelExclusiveScopes)
  63. }
  64. ctx.Data["Labels"] = allLabels
  65. ctx.Data["SelectLabels"] = selectLabels
  66. ret.AllLabels = allLabels
  67. return ret
  68. }