summaryrefslogtreecommitdiffstats
path: root/models/project_board.go
diff options
context:
space:
mode:
authorLanre Adelowo <yo@lanre.wtf>2020-08-17 04:07:38 +0100
committerGitHub <noreply@github.com>2020-08-16 23:07:38 -0400
commit4027c5dd7c11c1256094e202be591ec1b86a011e (patch)
tree49e361a50395f0496c49d52bfd571ee47c1ebf44 /models/project_board.go
parentd285b5d35a44bf9fde0682532aeef9550f78cf83 (diff)
downloadgitea-4027c5dd7c11c1256094e202be591ec1b86a011e.tar.gz
gitea-4027c5dd7c11c1256094e202be591ec1b86a011e.zip
Kanban board (#8346)
Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: jaqra <48099350+jaqra@users.noreply.github.com> Co-authored-by: Kerry <flatline-studios@users.noreply.github.com> Co-authored-by: Jaqra <jaqra@hotmail.com> Co-authored-by: Kyle Evans <kevans91@users.noreply.github.com> Co-authored-by: Tsakiridis Ilias <TsakiDev@users.noreply.github.com> Co-authored-by: Ilias Tsakiridis <ilias.tsakiridis@outlook.com> Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com> Co-authored-by: silverwind <me@silverwind.io> Co-authored-by: zeripath <art27@cantab.net> Co-authored-by: techknowlogick <techknowlogick@gitea.io>
Diffstat (limited to 'models/project_board.go')
-rw-r--r--models/project_board.go220
1 files changed, 220 insertions, 0 deletions
diff --git a/models/project_board.go b/models/project_board.go
new file mode 100644
index 0000000000..260fc8304b
--- /dev/null
+++ b/models/project_board.go
@@ -0,0 +1,220 @@
+// Copyright 2020 The Gitea Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package models
+
+import (
+ "code.gitea.io/gitea/modules/setting"
+ "code.gitea.io/gitea/modules/timeutil"
+
+ "xorm.io/xorm"
+)
+
+type (
+ // ProjectBoardType is used to represent a project board type
+ ProjectBoardType uint8
+
+ // ProjectBoardList is a list of all project boards in a repository
+ ProjectBoardList []*ProjectBoard
+)
+
+const (
+ // ProjectBoardTypeNone is a project board type that has no predefined columns
+ ProjectBoardTypeNone ProjectBoardType = iota
+
+ // ProjectBoardTypeBasicKanban is a project board type that has basic predefined columns
+ ProjectBoardTypeBasicKanban
+
+ // ProjectBoardTypeBugTriage is a project board type that has predefined columns suited to hunting down bugs
+ ProjectBoardTypeBugTriage
+)
+
+// ProjectBoard is used to represent boards on a project
+type ProjectBoard struct {
+ ID int64 `xorm:"pk autoincr"`
+ Title string
+ Default bool `xorm:"NOT NULL DEFAULT false"` // issues not assigned to a specific board will be assigned to this board
+
+ ProjectID int64 `xorm:"INDEX NOT NULL"`
+ CreatorID int64 `xorm:"NOT NULL"`
+
+ CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
+ UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"`
+
+ Issues []*Issue `xorm:"-"`
+}
+
+// IsProjectBoardTypeValid checks if the project board type is valid
+func IsProjectBoardTypeValid(p ProjectBoardType) bool {
+ switch p {
+ case ProjectBoardTypeNone, ProjectBoardTypeBasicKanban, ProjectBoardTypeBugTriage:
+ return true
+ default:
+ return false
+ }
+}
+
+func createBoardsForProjectsType(sess *xorm.Session, project *Project) error {
+
+ var items []string
+
+ switch project.BoardType {
+
+ case ProjectBoardTypeBugTriage:
+ items = setting.Project.ProjectBoardBugTriageType
+
+ case ProjectBoardTypeBasicKanban:
+ items = setting.Project.ProjectBoardBasicKanbanType
+
+ case ProjectBoardTypeNone:
+ fallthrough
+ default:
+ return nil
+ }
+
+ if len(items) == 0 {
+ return nil
+ }
+
+ var boards = make([]ProjectBoard, 0, len(items))
+
+ for _, v := range items {
+ boards = append(boards, ProjectBoard{
+ CreatedUnix: timeutil.TimeStampNow(),
+ CreatorID: project.CreatorID,
+ Title: v,
+ ProjectID: project.ID,
+ })
+ }
+
+ _, err := sess.Insert(boards)
+ return err
+}
+
+// NewProjectBoard adds a new project board to a given project
+func NewProjectBoard(board *ProjectBoard) error {
+ _, err := x.Insert(board)
+ return err
+}
+
+// DeleteProjectBoardByID removes all issues references to the project board.
+func DeleteProjectBoardByID(boardID int64) error {
+ sess := x.NewSession()
+ defer sess.Close()
+ if err := sess.Begin(); err != nil {
+ return err
+ }
+
+ if err := deleteProjectBoardByID(sess, boardID); err != nil {
+ return err
+ }
+
+ return sess.Commit()
+}
+
+func deleteProjectBoardByID(e Engine, boardID int64) error {
+ board, err := getProjectBoard(e, boardID)
+ if err != nil {
+ if IsErrProjectBoardNotExist(err) {
+ return nil
+ }
+
+ return err
+ }
+
+ if err = board.removeIssues(e); err != nil {
+ return err
+ }
+
+ if _, err := e.ID(board.ID).Delete(board); err != nil {
+ return err
+ }
+ return nil
+}
+
+func deleteProjectBoardByProjectID(e Engine, projectID int64) error {
+ _, err := e.Where("project_id=?", projectID).Delete(&ProjectBoard{})
+ return err
+}
+
+// GetProjectBoard fetches the current board of a project
+func GetProjectBoard(boardID int64) (*ProjectBoard, error) {
+ return getProjectBoard(x, boardID)
+}
+
+func getProjectBoard(e Engine, boardID int64) (*ProjectBoard, error) {
+ board := new(ProjectBoard)
+
+ has, err := e.ID(boardID).Get(board)
+ if err != nil {
+ return nil, err
+ } else if !has {
+ return nil, ErrProjectBoardNotExist{BoardID: boardID}
+ }
+
+ return board, nil
+}
+
+// UpdateProjectBoard updates the title of a project board
+func UpdateProjectBoard(board *ProjectBoard) error {
+ return updateProjectBoard(x, board)
+}
+
+func updateProjectBoard(e Engine, board *ProjectBoard) error {
+ _, err := e.ID(board.ID).Cols(
+ "title",
+ "default",
+ ).Update(board)
+ return err
+}
+
+// GetProjectBoards fetches all boards related to a project
+func GetProjectBoards(projectID int64) ([]*ProjectBoard, error) {
+
+ var boards = make([]*ProjectBoard, 0, 5)
+
+ sess := x.Where("project_id=?", projectID)
+ return boards, sess.Find(&boards)
+}
+
+// GetUncategorizedBoard represents a board for issues not assigned to one
+func GetUncategorizedBoard(projectID int64) (*ProjectBoard, error) {
+ return &ProjectBoard{
+ ProjectID: projectID,
+ Title: "Uncategorized",
+ Default: true,
+ }, nil
+}
+
+// LoadIssues load issues assigned to this board
+func (b *ProjectBoard) LoadIssues() (IssueList, error) {
+ var boardID int64
+ if !b.Default {
+ boardID = b.ID
+
+ } else {
+ // Issues without ProjectBoardID
+ boardID = -1
+ }
+ issues, err := Issues(&IssuesOptions{
+ ProjectBoardID: boardID,
+ ProjectID: b.ProjectID,
+ })
+ b.Issues = issues
+ return issues, err
+}
+
+// LoadIssues load issues assigned to the boards
+func (bs ProjectBoardList) LoadIssues() (IssueList, error) {
+ issues := make(IssueList, 0, len(bs)*10)
+ for i := range bs {
+ il, err := bs[i].LoadIssues()
+ if err != nil {
+ return nil, err
+ }
+ bs[i].Issues = il
+ issues = append(issues, il...)
+ }
+ return issues, nil
+}