Skip to content

Commit bd97736

Browse files
lunny6543
andauthored
Move project files into models/project sub package (#17704)
* Move project files into models/project sub package * Fix test * Fix test * Fix test * Fix build * Fix test * Fix template bug * Fix bug * Fix lint * Fix test * Fix import * Improve codes Co-authored-by: 6543 <[email protected]>
1 parent ea6efba commit bd97736

18 files changed

+810
-713
lines changed

models/error.go

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1063,44 +1063,6 @@ func (err ErrLabelNotExist) Error() string {
10631063
return fmt.Sprintf("label does not exist [label_id: %d]", err.LabelID)
10641064
}
10651065

1066-
// __________ __ __
1067-
// \______ \_______ ____ |__| ____ _____/ |_ ______
1068-
// | ___/\_ __ \/ _ \ | |/ __ \_/ ___\ __\/ ___/
1069-
// | | | | \( <_> ) | \ ___/\ \___| | \___ \
1070-
// |____| |__| \____/\__| |\___ >\___ >__| /____ >
1071-
// \______| \/ \/ \/
1072-
1073-
// ErrProjectNotExist represents a "ProjectNotExist" kind of error.
1074-
type ErrProjectNotExist struct {
1075-
ID int64
1076-
RepoID int64
1077-
}
1078-
1079-
// IsErrProjectNotExist checks if an error is a ErrProjectNotExist
1080-
func IsErrProjectNotExist(err error) bool {
1081-
_, ok := err.(ErrProjectNotExist)
1082-
return ok
1083-
}
1084-
1085-
func (err ErrProjectNotExist) Error() string {
1086-
return fmt.Sprintf("projects does not exist [id: %d]", err.ID)
1087-
}
1088-
1089-
// ErrProjectBoardNotExist represents a "ProjectBoardNotExist" kind of error.
1090-
type ErrProjectBoardNotExist struct {
1091-
BoardID int64
1092-
}
1093-
1094-
// IsErrProjectBoardNotExist checks if an error is a ErrProjectBoardNotExist
1095-
func IsErrProjectBoardNotExist(err error) bool {
1096-
_, ok := err.(ErrProjectBoardNotExist)
1097-
return ok
1098-
}
1099-
1100-
func (err ErrProjectBoardNotExist) Error() string {
1101-
return fmt.Sprintf("project board does not exist [id: %d]", err.BoardID)
1102-
}
1103-
11041066
// _____ .__.__ __
11051067
// / \ |__| | ____ _______/ |_ ____ ____ ____
11061068
// / \ / \| | | _/ __ \ / ___/\ __\/ _ \ / \_/ __ \

models/issue.go

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"code.gitea.io/gitea/models/issues"
2020
"code.gitea.io/gitea/models/organization"
2121
"code.gitea.io/gitea/models/perm"
22+
project_model "code.gitea.io/gitea/models/project"
2223
repo_model "code.gitea.io/gitea/models/repo"
2324
"code.gitea.io/gitea/models/unit"
2425
user_model "code.gitea.io/gitea/models/user"
@@ -45,14 +46,14 @@ type Issue struct {
4546
PosterID int64 `xorm:"INDEX"`
4647
Poster *user_model.User `xorm:"-"`
4748
OriginalAuthor string
48-
OriginalAuthorID int64 `xorm:"index"`
49-
Title string `xorm:"name"`
50-
Content string `xorm:"LONGTEXT"`
51-
RenderedContent string `xorm:"-"`
52-
Labels []*Label `xorm:"-"`
53-
MilestoneID int64 `xorm:"INDEX"`
54-
Milestone *Milestone `xorm:"-"`
55-
Project *Project `xorm:"-"`
49+
OriginalAuthorID int64 `xorm:"index"`
50+
Title string `xorm:"name"`
51+
Content string `xorm:"LONGTEXT"`
52+
RenderedContent string `xorm:"-"`
53+
Labels []*Label `xorm:"-"`
54+
MilestoneID int64 `xorm:"INDEX"`
55+
Milestone *Milestone `xorm:"-"`
56+
Project *project_model.Project `xorm:"-"`
5657
Priority int
5758
AssigneeID int64 `xorm:"-"`
5859
Assignee *user_model.User `xorm:"-"`
@@ -2135,7 +2136,7 @@ func deleteIssue(ctx context.Context, issue *Issue) error {
21352136
&IssueWatch{},
21362137
&Stopwatch{},
21372138
&TrackedTime{},
2138-
&ProjectIssue{},
2139+
&project_model.ProjectIssue{},
21392140
&repo_model.Attachment{},
21402141
&PullRequest{},
21412142
); err != nil {
@@ -2469,7 +2470,7 @@ func deleteIssuesByRepoID(sess db.Engine, repoID int64) (attachmentPaths []strin
24692470
}
24702471

24712472
if _, err = sess.In("issue_id", deleteCond).
2472-
Delete(&ProjectIssue{}); err != nil {
2473+
Delete(&project_model.ProjectIssue{}); err != nil {
24732474
return
24742475
}
24752476

models/issue_comment.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"code.gitea.io/gitea/models/db"
1818
"code.gitea.io/gitea/models/issues"
1919
"code.gitea.io/gitea/models/organization"
20+
project_model "code.gitea.io/gitea/models/project"
2021
repo_model "code.gitea.io/gitea/models/repo"
2122
user_model "code.gitea.io/gitea/models/user"
2223
"code.gitea.io/gitea/modules/git"
@@ -204,8 +205,8 @@ type Comment struct {
204205
RemovedLabels []*Label `xorm:"-"`
205206
OldProjectID int64
206207
ProjectID int64
207-
OldProject *Project `xorm:"-"`
208-
Project *Project `xorm:"-"`
208+
OldProject *project_model.Project `xorm:"-"`
209+
Project *project_model.Project `xorm:"-"`
209210
OldMilestoneID int64
210211
MilestoneID int64
211212
OldMilestone *Milestone `xorm:"-"`
@@ -469,7 +470,7 @@ func (c *Comment) LoadLabel() error {
469470
// LoadProject if comment.Type is CommentTypeProject, then load project.
470471
func (c *Comment) LoadProject() error {
471472
if c.OldProjectID > 0 {
472-
var oldProject Project
473+
var oldProject project_model.Project
473474
has, err := db.GetEngine(db.DefaultContext).ID(c.OldProjectID).Get(&oldProject)
474475
if err != nil {
475476
return err
@@ -479,7 +480,7 @@ func (c *Comment) LoadProject() error {
479480
}
480481

481482
if c.ProjectID > 0 {
482-
var project Project
483+
var project project_model.Project
483484
has, err := db.GetEngine(db.DefaultContext).ID(c.ProjectID).Get(&project)
484485
if err != nil {
485486
return err

models/issue_project.go

Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
// Copyright 2021 The Gitea Authors. All rights reserved.
2+
// Use of this source code is governed by a MIT-style
3+
// license that can be found in the LICENSE file.
4+
5+
package models
6+
7+
import (
8+
"context"
9+
"fmt"
10+
11+
"code.gitea.io/gitea/models/db"
12+
project_model "code.gitea.io/gitea/models/project"
13+
user_model "code.gitea.io/gitea/models/user"
14+
)
15+
16+
// LoadProject load the project the issue was assigned to
17+
func (i *Issue) LoadProject() (err error) {
18+
return i.loadProject(db.GetEngine(db.DefaultContext))
19+
}
20+
21+
func (i *Issue) loadProject(e db.Engine) (err error) {
22+
if i.Project == nil {
23+
var p project_model.Project
24+
if _, err = e.Table("project").
25+
Join("INNER", "project_issue", "project.id=project_issue.project_id").
26+
Where("project_issue.issue_id = ?", i.ID).
27+
Get(&p); err != nil {
28+
return err
29+
}
30+
i.Project = &p
31+
}
32+
return
33+
}
34+
35+
// ProjectID return project id if issue was assigned to one
36+
func (i *Issue) ProjectID() int64 {
37+
return i.projectID(db.GetEngine(db.DefaultContext))
38+
}
39+
40+
func (i *Issue) projectID(e db.Engine) int64 {
41+
var ip project_model.ProjectIssue
42+
has, err := e.Where("issue_id=?", i.ID).Get(&ip)
43+
if err != nil || !has {
44+
return 0
45+
}
46+
return ip.ProjectID
47+
}
48+
49+
// ProjectBoardID return project board id if issue was assigned to one
50+
func (i *Issue) ProjectBoardID() int64 {
51+
return i.projectBoardID(db.GetEngine(db.DefaultContext))
52+
}
53+
54+
func (i *Issue) projectBoardID(e db.Engine) int64 {
55+
var ip project_model.ProjectIssue
56+
has, err := e.Where("issue_id=?", i.ID).Get(&ip)
57+
if err != nil || !has {
58+
return 0
59+
}
60+
return ip.ProjectBoardID
61+
}
62+
63+
// LoadIssuesFromBoard load issues assigned to this board
64+
func LoadIssuesFromBoard(b *project_model.Board) (IssueList, error) {
65+
issueList := make([]*Issue, 0, 10)
66+
67+
if b.ID != 0 {
68+
issues, err := Issues(&IssuesOptions{
69+
ProjectBoardID: b.ID,
70+
ProjectID: b.ProjectID,
71+
})
72+
if err != nil {
73+
return nil, err
74+
}
75+
issueList = issues
76+
}
77+
78+
if b.Default {
79+
issues, err := Issues(&IssuesOptions{
80+
ProjectBoardID: -1, // Issues without ProjectBoardID
81+
ProjectID: b.ProjectID,
82+
})
83+
if err != nil {
84+
return nil, err
85+
}
86+
issueList = append(issueList, issues...)
87+
}
88+
89+
if err := IssueList(issueList).LoadComments(); err != nil {
90+
return nil, err
91+
}
92+
93+
return issueList, nil
94+
}
95+
96+
// LoadIssuesFromBoardList load issues assigned to the boards
97+
func LoadIssuesFromBoardList(bs project_model.BoardList) (map[int64]IssueList, error) {
98+
issuesMap := make(map[int64]IssueList, len(bs))
99+
for i := range bs {
100+
il, err := LoadIssuesFromBoard(bs[i])
101+
if err != nil {
102+
return nil, err
103+
}
104+
issuesMap[bs[i].ID] = il
105+
}
106+
return issuesMap, nil
107+
}
108+
109+
// ChangeProjectAssign changes the project associated with an issue
110+
func ChangeProjectAssign(issue *Issue, doer *user_model.User, newProjectID int64) error {
111+
ctx, committer, err := db.TxContext()
112+
if err != nil {
113+
return err
114+
}
115+
defer committer.Close()
116+
117+
if err := addUpdateIssueProject(ctx, issue, doer, newProjectID); err != nil {
118+
return err
119+
}
120+
121+
return committer.Commit()
122+
}
123+
124+
func addUpdateIssueProject(ctx context.Context, issue *Issue, doer *user_model.User, newProjectID int64) error {
125+
e := db.GetEngine(ctx)
126+
oldProjectID := issue.projectID(e)
127+
128+
if _, err := e.Where("project_issue.issue_id=?", issue.ID).Delete(&project_model.ProjectIssue{}); err != nil {
129+
return err
130+
}
131+
132+
if err := issue.loadRepo(ctx); err != nil {
133+
return err
134+
}
135+
136+
if oldProjectID > 0 || newProjectID > 0 {
137+
if _, err := createComment(ctx, &CreateCommentOptions{
138+
Type: CommentTypeProject,
139+
Doer: doer,
140+
Repo: issue.Repo,
141+
Issue: issue,
142+
OldProjectID: oldProjectID,
143+
ProjectID: newProjectID,
144+
}); err != nil {
145+
return err
146+
}
147+
}
148+
149+
_, err := e.Insert(&project_model.ProjectIssue{
150+
IssueID: issue.ID,
151+
ProjectID: newProjectID,
152+
})
153+
return err
154+
}
155+
156+
// MoveIssueAcrossProjectBoards move a card from one board to another
157+
func MoveIssueAcrossProjectBoards(issue *Issue, board *project_model.Board) error {
158+
ctx, committer, err := db.TxContext()
159+
if err != nil {
160+
return err
161+
}
162+
defer committer.Close()
163+
sess := db.GetEngine(ctx)
164+
165+
var pis project_model.ProjectIssue
166+
has, err := sess.Where("issue_id=?", issue.ID).Get(&pis)
167+
if err != nil {
168+
return err
169+
}
170+
171+
if !has {
172+
return fmt.Errorf("issue has to be added to a project first")
173+
}
174+
175+
pis.ProjectBoardID = board.ID
176+
if _, err := sess.ID(pis.ID).Cols("project_board_id").Update(&pis); err != nil {
177+
return err
178+
}
179+
180+
return committer.Commit()
181+
}

0 commit comments

Comments
 (0)