code.gitea.io/gitea@v1.21.7/routers/web/repo/issue_timetrack.go (about)

     1  // Copyright 2017 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package repo
     5  
     6  import (
     7  	"net/http"
     8  	"time"
     9  
    10  	"code.gitea.io/gitea/models/db"
    11  	issues_model "code.gitea.io/gitea/models/issues"
    12  	"code.gitea.io/gitea/modules/context"
    13  	"code.gitea.io/gitea/modules/util"
    14  	"code.gitea.io/gitea/modules/web"
    15  	"code.gitea.io/gitea/services/forms"
    16  )
    17  
    18  // AddTimeManually tracks time manually
    19  func AddTimeManually(c *context.Context) {
    20  	form := web.GetForm(c).(*forms.AddTimeManuallyForm)
    21  	issue := GetActionIssue(c)
    22  	if c.Written() {
    23  		return
    24  	}
    25  	if !c.Repo.CanUseTimetracker(issue, c.Doer) {
    26  		c.NotFound("CanUseTimetracker", nil)
    27  		return
    28  	}
    29  	url := issue.Link()
    30  
    31  	if c.HasError() {
    32  		c.Flash.Error(c.GetErrMsg())
    33  		c.Redirect(url)
    34  		return
    35  	}
    36  
    37  	total := time.Duration(form.Hours)*time.Hour + time.Duration(form.Minutes)*time.Minute
    38  
    39  	if total <= 0 {
    40  		c.Flash.Error(c.Tr("repo.issues.add_time_sum_to_small"))
    41  		c.Redirect(url, http.StatusSeeOther)
    42  		return
    43  	}
    44  
    45  	if _, err := issues_model.AddTime(c, c.Doer, issue, int64(total.Seconds()), time.Now()); err != nil {
    46  		c.ServerError("AddTime", err)
    47  		return
    48  	}
    49  
    50  	c.Redirect(url, http.StatusSeeOther)
    51  }
    52  
    53  // DeleteTime deletes tracked time
    54  func DeleteTime(c *context.Context) {
    55  	issue := GetActionIssue(c)
    56  	if c.Written() {
    57  		return
    58  	}
    59  	if !c.Repo.CanUseTimetracker(issue, c.Doer) {
    60  		c.NotFound("CanUseTimetracker", nil)
    61  		return
    62  	}
    63  
    64  	t, err := issues_model.GetTrackedTimeByID(c.ParamsInt64(":timeid"))
    65  	if err != nil {
    66  		if db.IsErrNotExist(err) {
    67  			c.NotFound("time not found", err)
    68  			return
    69  		}
    70  		c.Error(http.StatusInternalServerError, "GetTrackedTimeByID", err.Error())
    71  		return
    72  	}
    73  
    74  	// only OP or admin may delete
    75  	if !c.IsSigned || (!c.IsUserSiteAdmin() && c.Doer.ID != t.UserID) {
    76  		c.Error(http.StatusForbidden, "not allowed")
    77  		return
    78  	}
    79  
    80  	if err = issues_model.DeleteTime(t); err != nil {
    81  		c.ServerError("DeleteTime", err)
    82  		return
    83  	}
    84  
    85  	c.Flash.Success(c.Tr("repo.issues.del_time_history", util.SecToTime(t.Time)))
    86  	c.Redirect(issue.Link())
    87  }