summaryrefslogtreecommitdiffstats
path: root/modules/notification
diff options
context:
space:
mode:
author赵智超 <1012112796@qq.com>2020-04-07 00:33:34 +0800
committerGitHub <noreply@github.com>2020-04-06 19:33:34 +0300
commitef89e75d0eb232e98ca7a7ef278b8681c7f4fe50 (patch)
treec7b17df4d92441f2ce8420dbf8aa79aee47a3c13 /modules/notification
parent88c14326b1a5d9216d5f6905dcbe44e43efdb5b3 (diff)
downloadgitea-ef89e75d0eb232e98ca7a7ef278b8681c7f4fe50.tar.gz
gitea-ef89e75d0eb232e98ca7a7ef278b8681c7f4fe50.zip
add request review from specific reviewers feature in pull request (#10756)
* add request review feature in pull request add a way to notify specific reviewers to review like github , by add or delet a special type review . The acton is is similar to Assign , so many code reuse the function and items of Assignee, but the meaning and result is different. The Permission style is is similar to github, that only writer can add a review request from Reviewers, but the poster can recall and remove a review request after a reviwer has revied even if he don't have Write Premission. only manager , the poster and reviewer of a request review can remove it. The reviewers can be requested to review contain all readers for private repo , for public, contain all writers and watchers. The offical Review Request will block merge if Reject can block it. an other change: add ui otify for Assignees. Co-authored-by: guillep2k <18600385+guillep2k@users.noreply.github.com> Co-authored-by: Lauris BH <lauris@nix.lv> Signed-off-by: a1012112796 <1012112796@qq.com> * new change * add placeholder string * do some changes follow #10238 to add review requests num on lists also change icon for review requests to eye Co-authored-by: Lauris BH <lauris@nix.lv>
Diffstat (limited to 'modules/notification')
-rw-r--r--modules/notification/base/notifier.go1
-rw-r--r--modules/notification/base/null.go4
-rw-r--r--modules/notification/mail/mail.go7
-rw-r--r--modules/notification/notification.go7
-rw-r--r--modules/notification/ui/ui.go35
5 files changed, 53 insertions, 1 deletions
diff --git a/modules/notification/base/notifier.go b/modules/notification/base/notifier.go
index 1c607ded3b..43b68b603c 100644
--- a/modules/notification/base/notifier.go
+++ b/modules/notification/base/notifier.go
@@ -24,6 +24,7 @@ type Notifier interface {
NotifyIssueChangeStatus(*models.User, *models.Issue, *models.Comment, bool)
NotifyIssueChangeMilestone(doer *models.User, issue *models.Issue, oldMilestoneID int64)
NotifyIssueChangeAssignee(doer *models.User, issue *models.Issue, assignee *models.User, removed bool, comment *models.Comment)
+ NotifyPullRewiewRequest(doer *models.User, issue *models.Issue, reviewer *models.User, isRequest bool, comment *models.Comment)
NotifyIssueChangeContent(doer *models.User, issue *models.Issue, oldContent string)
NotifyIssueClearLabels(doer *models.User, issue *models.Issue)
NotifyIssueChangeTitle(doer *models.User, issue *models.Issue, oldTitle string)
diff --git a/modules/notification/base/null.go b/modules/notification/base/null.go
index f6c423b469..4b5efd80bb 100644
--- a/modules/notification/base/null.go
+++ b/modules/notification/base/null.go
@@ -86,6 +86,10 @@ func (*NullNotifier) NotifyIssueChangeContent(doer *models.User, issue *models.I
func (*NullNotifier) NotifyIssueChangeAssignee(doer *models.User, issue *models.Issue, assignee *models.User, removed bool, comment *models.Comment) {
}
+// NotifyPullRewiewRequest places a place holder function
+func (*NullNotifier) NotifyPullRewiewRequest(doer *models.User, issue *models.Issue, reviewer *models.User, isRequest bool, comment *models.Comment) {
+}
+
// NotifyIssueClearLabels places a place holder function
func (*NullNotifier) NotifyIssueClearLabels(doer *models.User, issue *models.Issue) {
}
diff --git a/modules/notification/mail/mail.go b/modules/notification/mail/mail.go
index ec7d9d617e..b5c2db3831 100644
--- a/modules/notification/mail/mail.go
+++ b/modules/notification/mail/mail.go
@@ -100,6 +100,13 @@ func (m *mailNotifier) NotifyIssueChangeAssignee(doer *models.User, issue *model
}
}
+func (m *mailNotifier) NotifyPullRewiewRequest(doer *models.User, issue *models.Issue, reviewer *models.User, isRequest bool, comment *models.Comment) {
+ if isRequest && doer.ID != reviewer.ID && reviewer.EmailNotifications() == models.EmailNotificationsEnabled {
+ ct := fmt.Sprintf("Requested to review #%d.", issue.Index)
+ mailer.SendIssueAssignedMail(issue, doer, ct, comment, []string{reviewer.Email})
+ }
+}
+
func (m *mailNotifier) NotifyMergePullRequest(pr *models.PullRequest, doer *models.User) {
if err := pr.LoadIssue(); err != nil {
log.Error("pr.LoadIssue: %v", err)
diff --git a/modules/notification/notification.go b/modules/notification/notification.go
index 8c5d7d6035..95117c1f3e 100644
--- a/modules/notification/notification.go
+++ b/modules/notification/notification.go
@@ -150,6 +150,13 @@ func NotifyIssueChangeAssignee(doer *models.User, issue *models.Issue, assignee
}
}
+// NotifyPullRewiewRequest notifies Request Review change
+func NotifyPullRewiewRequest(doer *models.User, issue *models.Issue, reviewer *models.User, isRequest bool, comment *models.Comment) {
+ for _, notifier := range notifiers {
+ notifier.NotifyPullRewiewRequest(doer, issue, reviewer, isRequest, comment)
+ }
+}
+
// NotifyIssueClearLabels notifies clear labels to notifiers
func NotifyIssueClearLabels(doer *models.User, issue *models.Issue) {
for _, notifier := range notifiers {
diff --git a/modules/notification/ui/ui.go b/modules/notification/ui/ui.go
index 525753425a..6ce14a90cc 100644
--- a/modules/notification/ui/ui.go
+++ b/modules/notification/ui/ui.go
@@ -22,6 +22,7 @@ type (
IssueID int64
CommentID int64
NotificationAuthorID int64
+ ReceiverID int64 // 0 -- ALL Watcher
}
)
@@ -39,7 +40,7 @@ func NewNotifier() base.Notifier {
func (ns *notificationService) handle(data ...queue.Data) {
for _, datum := range data {
opts := datum.(issueNotificationOpts)
- if err := models.CreateOrUpdateIssueNotifications(opts.IssueID, opts.CommentID, opts.NotificationAuthorID); err != nil {
+ if err := models.CreateOrUpdateIssueNotifications(opts.IssueID, opts.CommentID, opts.NotificationAuthorID, opts.ReceiverID); err != nil {
log.Error("Was unable to create issue notification: %v", err)
}
}
@@ -103,3 +104,35 @@ func (ns *notificationService) NotifyPullRequestReview(pr *models.PullRequest, r
}
_ = ns.issueQueue.Push(opts)
}
+
+func (ns *notificationService) NotifyIssueChangeAssignee(doer *models.User, issue *models.Issue, assignee *models.User, removed bool, comment *models.Comment) {
+ if !removed {
+ var opts = issueNotificationOpts{
+ IssueID: issue.ID,
+ NotificationAuthorID: doer.ID,
+ ReceiverID: assignee.ID,
+ }
+
+ if comment != nil {
+ opts.CommentID = comment.ID
+ }
+
+ _ = ns.issueQueue.Push(opts)
+ }
+}
+
+func (ns *notificationService) NotifyPullRewiewRequest(doer *models.User, issue *models.Issue, reviewer *models.User, isRequest bool, comment *models.Comment) {
+ if isRequest {
+ var opts = issueNotificationOpts{
+ IssueID: issue.ID,
+ NotificationAuthorID: doer.ID,
+ ReceiverID: reviewer.ID,
+ }
+
+ if comment != nil {
+ opts.CommentID = comment.ID
+ }
+
+ _ = ns.issueQueue.Push(opts)
+ }
+}