Browse Source

Add mail notify for new collaborator

Unknown 11 years ago
parent
commit
02687cbdf3

+ 1 - 1
README.md

@@ -71,7 +71,7 @@ There are 4 ways to install Gogs:
 
 ## Contributors
 
-This project was launched by [Unknwon](https://github.com/Unknwon) and [lunny](https://github.com/lunny); [fuxiaohei](https://github.com/fuxiaohei), [slene](https://github.com/slene) and [codeskyblue](https://github.com/codeskyblue) joined the team soon after. See [contributors page](https://github.com/gogits/gogs/graphs/contributors) for full list of contributors.
+The [core team](http://gogs.io/team) of this project. See [contributors page](https://github.com/gogits/gogs/graphs/contributors) for full list of contributors.
 
 [![Clone in Koding](http://learn.koding.com/btn/clone_d.png)][koding]
 [koding]: https://koding.com/Teamwork?import=https://github.com/gogits/gogs/archive/master.zip&c=git1

+ 1 - 1
README_ZH.md

@@ -63,7 +63,7 @@ Gogs 完全使用 Go 语言来实现对 Git 数据的操作,实现 **零** 依
 
 ## 贡献成员
 
-本项目最初由 [Unknown](https://github.com/Unknwon) 和 [lunny](https://github.com/lunny) 发起,随后 [fuxiaohei](https://github.com/fuxiaohei)、[slene](https://github.com/slene) 以及 [codeskyblue](https://github.com/codeskyblue) 加入到开发团队。您可以通过查看 [贡献者页面](https://github.com/gogits/gogs/graphs/contributors) 获取完整的贡献者列表。
+本项目的 [开发团队](http://gogs.io/team)。您可以通过查看 [贡献者页面](https://github.com/gogits/gogs/graphs/contributors) 获取完整的贡献者列表。
 
 [![Clone in Koding](http://learn.koding.com/btn/clone_d.png)][koding]
 [koding]: https://koding.com/Teamwork?import=https://github.com/gogits/gogs/archive/master.zip&c=git1

+ 39 - 7
modules/mailer/mail.go

@@ -8,6 +8,7 @@ import (
 	"encoding/hex"
 	"errors"
 	"fmt"
+	"path"
 
 	"github.com/gogits/gogs/models"
 	"github.com/gogits/gogs/modules/base"
@@ -135,7 +136,7 @@ func SendIssueNotifyMail(user, owner *models.User, repo *models.Repository, issu
 		return tos, nil
 	}
 
-	subject := fmt.Sprintf("[%s] %s", repo.Name, issue.Name)
+	subject := fmt.Sprintf("[%s] %s(#%d)", repo.Name, issue.Name, issue.Index)
 	content := fmt.Sprintf("%s<br>-<br> <a href=\"%s%s/%s/issues/%d\">View it on Gogs</a>.",
 		base.RenderSpecialLink([]byte(issue.Content), owner.Name+"/"+repo.Name),
 		base.AppUrl, owner.Name, repo.Name, issue.Index)
@@ -146,17 +147,48 @@ func SendIssueNotifyMail(user, owner *models.User, repo *models.Repository, issu
 }
 
 // SendIssueMentionMail sends mail notification for who are mentioned in issue.
-func SendIssueMentionMail(user, owner *models.User, repo *models.Repository, issue *models.Issue, tos []string) error {
+func SendIssueMentionMail(r *middleware.Render, user, owner *models.User,
+	repo *models.Repository, issue *models.Issue, tos []string) error {
+
 	if len(tos) == 0 {
 		return nil
 	}
 
-	issueLink := fmt.Sprintf("%s%s/%s/issues/%d", base.AppUrl, owner.Name, repo.Name, issue.Index)
-	body := fmt.Sprintf(`%s mentioned you.`, user.Name)
-	subject := fmt.Sprintf("[%s] %s", repo.Name, issue.Name)
-	content := fmt.Sprintf("%s<br>-<br> <a href=\"%s\">View it on Gogs</a>.", body, issueLink)
-	msg := NewMailMessageFrom(tos, user.Name, subject, content)
+	subject := fmt.Sprintf("[%s] %s(#%d)", repo.Name, issue.Name, issue.Index)
+
+	data := GetMailTmplData(nil)
+	data["IssueLink"] = fmt.Sprintf("%s/%s/issues/%d", owner.Name, repo.Name, issue.Index)
+	data["Subject"] = subject
+
+	body, err := r.HTMLString("mail/notify/mention", data)
+	if err != nil {
+		return fmt.Errorf("mail.SendIssueMentionMail(fail to render): %v", err)
+	}
+
+	msg := NewMailMessageFrom(tos, user.Name, subject, body)
 	msg.Info = fmt.Sprintf("Subject: %s, send issue mention emails", subject)
 	SendAsync(&msg)
 	return nil
 }
+
+// SendCollaboratorMail sends mail notification to new collaborator.
+func SendCollaboratorMail(r *middleware.Render, user, owner *models.User,
+	repo *models.Repository) error {
+
+	subject := fmt.Sprintf("%s added you to %s", owner.Name, repo.Name)
+
+	data := GetMailTmplData(nil)
+	data["RepoLink"] = path.Join(owner.Name, repo.Name)
+	data["Subject"] = subject
+
+	body, err := r.HTMLString("mail/notify/collaborator", data)
+	if err != nil {
+		return fmt.Errorf("mail.SendCollaboratorMail(fail to render): %v", err)
+	}
+
+	msg := NewMailMessage([]string{user.Email}, subject, body)
+	msg.Info = fmt.Sprintf("UID: %d, send register mail", user.Id)
+
+	SendAsync(&msg)
+	return nil
+}

+ 2 - 2
routers/repo/issue.go

@@ -132,8 +132,8 @@ func CreateIssuePost(ctx *middleware.Context, params martini.Params, form auth.C
 
 			newTos = append(newTos, m[1:])
 		}
-		if err = mailer.SendIssueMentionMail(ctx.User, ctx.Repo.Owner, ctx.Repo.Repository,
-			issue, models.GetUserEmailsByNames(newTos)); err != nil {
+		if err = mailer.SendIssueMentionMail(ctx.Render, ctx.User, ctx.Repo.Owner,
+			ctx.Repo.Repository, issue, models.GetUserEmailsByNames(newTos)); err != nil {
 			ctx.Handle(500, "issue.CreateIssue(SendIssueMentionMail)", err)
 			return
 		}

+ 16 - 7
routers/repo/setting.go

@@ -13,6 +13,7 @@ import (
 	"github.com/gogits/gogs/models"
 	"github.com/gogits/gogs/modules/base"
 	"github.com/gogits/gogs/modules/log"
+	"github.com/gogits/gogs/modules/mailer"
 	"github.com/gogits/gogs/modules/middleware"
 )
 
@@ -185,22 +186,30 @@ func CollaborationPost(ctx *middleware.Context) {
 		return
 	}
 
-	isExist, err := models.IsUserExist(name)
+	u, err := models.GetUserByName(name)
 	if err != nil {
-		ctx.Handle(500, "repo.CollaborationPost(IsUserExist)", err)
-		return
-	} else if !isExist {
-		ctx.Flash.Error("Given user does not exist.")
-		ctx.Redirect(ctx.Req.RequestURI)
+		if err == models.ErrUserNotExist {
+			ctx.Flash.Error("Given user does not exist.")
+			ctx.Redirect(ctx.Req.RequestURI)
+		} else {
+			ctx.Handle(500, "repo.CollaborationPost(GetUserByName)", err)
+		}
 		return
 	}
 
-	if err := models.AddAccess(&models.Access{UserName: name, RepoName: repoLink,
+	if err = models.AddAccess(&models.Access{UserName: name, RepoName: repoLink,
 		Mode: models.AU_WRITABLE}); err != nil {
 		ctx.Handle(500, "repo.CollaborationPost(AddAccess)", err)
 		return
 	}
 
+	if base.Service.NotifyMail {
+		if err = mailer.SendCollaboratorMail(ctx.Render, u, ctx.User, ctx.Repo.Repository); err != nil {
+			ctx.Handle(500, "repo.CollaborationPost(SendCollaboratorMail)", err)
+			return
+		}
+	}
+
 	ctx.Flash.Success("New collaborator has been added.")
 	ctx.Redirect(ctx.Req.RequestURI)
 }

+ 18 - 0
templates/mail/notify/collaborator.tmpl

@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <title>{{.Subject}}</title>
+</head>
+
+<body>
+    <p>You can now push to this repository.</p>
+    <p>
+        ---
+        <br>
+        View it on Gogs: 
+        <br>
+        <a href="{{.AppUrl}}{{.RepoLink}}">{{.AppUrl}}{{.RepoLink}}</a>
+    </p>
+</body>
+</html>

+ 16 - 0
templates/mail/notify/mention.tmpl

@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <title>{{.Subject}}</title>
+</head>
+
+<body>
+    <p>{{.ActUserName}} mentioned you.</p>
+    <p>
+        ---
+        <br>
+        <a href="{{.AppUrl}}{{.IssueLink}}">View it on Gogs</a>.
+    </p>
+</body>
+</html>