parent
							
								
									6558990e3a
								
							
						
					
					
						commit
						8829174574
					
				@ -1,193 +0,0 @@ | 
				
			|||||||
// Copyright 2014 The Gogs 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 admin | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import ( | 
					 | 
				
			||||||
	"strings" | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"github.com/Unknwon/com" | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"github.com/gogits/gogs/models" | 
					 | 
				
			||||||
	"github.com/gogits/gogs/modules/auth" | 
					 | 
				
			||||||
	"github.com/gogits/gogs/modules/base" | 
					 | 
				
			||||||
	"github.com/gogits/gogs/modules/log" | 
					 | 
				
			||||||
	"github.com/gogits/gogs/modules/middleware" | 
					 | 
				
			||||||
) | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const ( | 
					 | 
				
			||||||
	USER_NEW  base.TplName = "admin/user/new" | 
					 | 
				
			||||||
	USER_EDIT base.TplName = "admin/user/edit" | 
					 | 
				
			||||||
) | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func NewUser(ctx *middleware.Context) { | 
					 | 
				
			||||||
	ctx.Data["Title"] = "New Account" | 
					 | 
				
			||||||
	ctx.Data["PageIsUsers"] = true | 
					 | 
				
			||||||
	auths, err := models.GetAuths() | 
					 | 
				
			||||||
	if err != nil { | 
					 | 
				
			||||||
		ctx.Handle(500, "admin.user.NewUser(GetAuths)", err) | 
					 | 
				
			||||||
		return | 
					 | 
				
			||||||
	} | 
					 | 
				
			||||||
	ctx.Data["LoginSources"] = auths | 
					 | 
				
			||||||
	ctx.HTML(200, USER_NEW) | 
					 | 
				
			||||||
} | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func NewUserPost(ctx *middleware.Context, form auth.RegisterForm) { | 
					 | 
				
			||||||
	ctx.Data["Title"] = "New Account" | 
					 | 
				
			||||||
	ctx.Data["PageIsUsers"] = true | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if ctx.HasError() { | 
					 | 
				
			||||||
		ctx.HTML(200, USER_NEW) | 
					 | 
				
			||||||
		return | 
					 | 
				
			||||||
	} | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if form.Password != form.Retype { | 
					 | 
				
			||||||
		ctx.Data["Err_Password"] = true | 
					 | 
				
			||||||
		ctx.Data["Err_RetypePasswd"] = true | 
					 | 
				
			||||||
		ctx.RenderWithErr("Password and re-type password are not same.", "admin/users/new", &form) | 
					 | 
				
			||||||
		return | 
					 | 
				
			||||||
	} | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	u := &models.User{ | 
					 | 
				
			||||||
		Name:      form.UserName, | 
					 | 
				
			||||||
		Email:     form.Email, | 
					 | 
				
			||||||
		Passwd:    form.Password, | 
					 | 
				
			||||||
		IsActive:  true, | 
					 | 
				
			||||||
		LoginType: models.PLAIN, | 
					 | 
				
			||||||
	} | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if len(form.LoginType) > 0 { | 
					 | 
				
			||||||
		// NOTE: need rewrite.
 | 
					 | 
				
			||||||
		fields := strings.Split(form.LoginType, "-") | 
					 | 
				
			||||||
		tp, _ := com.StrTo(fields[0]).Int() | 
					 | 
				
			||||||
		u.LoginType = models.LoginType(tp) | 
					 | 
				
			||||||
		u.LoginSource, _ = com.StrTo(fields[1]).Int64() | 
					 | 
				
			||||||
		u.LoginName = form.LoginName | 
					 | 
				
			||||||
	} | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if err := models.CreateUser(u); err != nil { | 
					 | 
				
			||||||
		switch err { | 
					 | 
				
			||||||
		case models.ErrUserAlreadyExist: | 
					 | 
				
			||||||
			ctx.RenderWithErr("Username has been already taken", USER_NEW, &form) | 
					 | 
				
			||||||
		case models.ErrEmailAlreadyUsed: | 
					 | 
				
			||||||
			ctx.RenderWithErr("E-mail address has been already used", USER_NEW, &form) | 
					 | 
				
			||||||
		case models.ErrUserNameIllegal: | 
					 | 
				
			||||||
			ctx.RenderWithErr(models.ErrRepoNameIllegal.Error(), USER_NEW, &form) | 
					 | 
				
			||||||
		default: | 
					 | 
				
			||||||
			ctx.Handle(500, "admin.user.NewUser(CreateUser)", err) | 
					 | 
				
			||||||
		} | 
					 | 
				
			||||||
		return | 
					 | 
				
			||||||
	} | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	log.Trace("%s User created by admin(%s): %s", ctx.Req.RequestURI, | 
					 | 
				
			||||||
		ctx.User.LowerName, strings.ToLower(form.UserName)) | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ctx.Redirect("/admin/users") | 
					 | 
				
			||||||
} | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func EditUser(ctx *middleware.Context) { | 
					 | 
				
			||||||
	ctx.Data["Title"] = "Edit Account" | 
					 | 
				
			||||||
	ctx.Data["PageIsUsers"] = true | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	uid, err := com.StrTo(ctx.Params(":userid")).Int() | 
					 | 
				
			||||||
	if err != nil { | 
					 | 
				
			||||||
		ctx.Handle(404, "admin.user.EditUser", err) | 
					 | 
				
			||||||
		return | 
					 | 
				
			||||||
	} | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	u, err := models.GetUserById(int64(uid)) | 
					 | 
				
			||||||
	if err != nil { | 
					 | 
				
			||||||
		ctx.Handle(500, "admin.user.EditUser(GetUserById)", err) | 
					 | 
				
			||||||
		return | 
					 | 
				
			||||||
	} | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ctx.Data["User"] = u | 
					 | 
				
			||||||
	auths, err := models.GetAuths() | 
					 | 
				
			||||||
	if err != nil { | 
					 | 
				
			||||||
		ctx.Handle(500, "admin.user.NewUser(GetAuths)", err) | 
					 | 
				
			||||||
		return | 
					 | 
				
			||||||
	} | 
					 | 
				
			||||||
	ctx.Data["LoginSources"] = auths | 
					 | 
				
			||||||
	ctx.HTML(200, USER_EDIT) | 
					 | 
				
			||||||
} | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func EditUserPost(ctx *middleware.Context, form auth.AdminEditUserForm) { | 
					 | 
				
			||||||
	ctx.Data["Title"] = "Edit Account" | 
					 | 
				
			||||||
	ctx.Data["PageIsUsers"] = true | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	uid, err := com.StrTo(ctx.Params(":userid")).Int() | 
					 | 
				
			||||||
	if err != nil { | 
					 | 
				
			||||||
		ctx.Handle(404, "admin.user.EditUserPost", err) | 
					 | 
				
			||||||
		return | 
					 | 
				
			||||||
	} | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	u, err := models.GetUserById(int64(uid)) | 
					 | 
				
			||||||
	if err != nil { | 
					 | 
				
			||||||
		ctx.Handle(500, "admin.user.EditUserPost(GetUserById)", err) | 
					 | 
				
			||||||
		return | 
					 | 
				
			||||||
	} | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if ctx.HasError() { | 
					 | 
				
			||||||
		ctx.HTML(200, USER_EDIT) | 
					 | 
				
			||||||
		return | 
					 | 
				
			||||||
	} | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if form.Passwd != "" { | 
					 | 
				
			||||||
		u.Passwd = form.Passwd | 
					 | 
				
			||||||
		u.Rands = models.GetUserSalt() | 
					 | 
				
			||||||
		u.Salt = models.GetUserSalt() | 
					 | 
				
			||||||
		u.EncodePasswd() | 
					 | 
				
			||||||
	} | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	u.Email = form.Email | 
					 | 
				
			||||||
	u.Website = form.Website | 
					 | 
				
			||||||
	u.Location = form.Location | 
					 | 
				
			||||||
	u.Avatar = base.EncodeMd5(form.Avatar) | 
					 | 
				
			||||||
	u.AvatarEmail = form.Avatar | 
					 | 
				
			||||||
	u.IsActive = form.Active | 
					 | 
				
			||||||
	u.IsAdmin = form.Admin | 
					 | 
				
			||||||
	if err := models.UpdateUser(u); err != nil { | 
					 | 
				
			||||||
		ctx.Handle(500, "admin.user.EditUserPost(UpdateUser)", err) | 
					 | 
				
			||||||
		return | 
					 | 
				
			||||||
	} | 
					 | 
				
			||||||
	log.Trace("%s User profile updated by admin(%s): %s", ctx.Req.RequestURI, | 
					 | 
				
			||||||
		ctx.User.LowerName, ctx.User.LowerName) | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ctx.Data["User"] = u | 
					 | 
				
			||||||
	ctx.Flash.Success("Account profile has been successfully updated.") | 
					 | 
				
			||||||
	ctx.Redirect("/admin/users/" + ctx.Params(":userid")) | 
					 | 
				
			||||||
} | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func DeleteUser(ctx *middleware.Context) { | 
					 | 
				
			||||||
	ctx.Data["Title"] = "Delete Account" | 
					 | 
				
			||||||
	ctx.Data["PageIsUsers"] = true | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	//log.Info("delete")
 | 
					 | 
				
			||||||
	uid, err := com.StrTo(ctx.Params(":userid")).Int() | 
					 | 
				
			||||||
	if err != nil { | 
					 | 
				
			||||||
		ctx.Handle(404, "admin.user.DeleteUser", err) | 
					 | 
				
			||||||
		return | 
					 | 
				
			||||||
	} | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	u, err := models.GetUserById(int64(uid)) | 
					 | 
				
			||||||
	if err != nil { | 
					 | 
				
			||||||
		ctx.Handle(500, "admin.user.DeleteUser(GetUserById)", err) | 
					 | 
				
			||||||
		return | 
					 | 
				
			||||||
	} | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if err = models.DeleteUser(u); err != nil { | 
					 | 
				
			||||||
		switch err { | 
					 | 
				
			||||||
		case models.ErrUserOwnRepos: | 
					 | 
				
			||||||
			ctx.Flash.Error("This account still has ownership of repository, owner has to delete or transfer them first.") | 
					 | 
				
			||||||
			ctx.Redirect("/admin/users/" + ctx.Params(":userid")) | 
					 | 
				
			||||||
		default: | 
					 | 
				
			||||||
			ctx.Handle(500, "admin.user.DeleteUser", err) | 
					 | 
				
			||||||
		} | 
					 | 
				
			||||||
		return | 
					 | 
				
			||||||
	} | 
					 | 
				
			||||||
	log.Trace("%s User deleted by admin(%s): %s", ctx.Req.RequestURI, | 
					 | 
				
			||||||
		ctx.User.LowerName, ctx.User.LowerName) | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ctx.Redirect("/admin/users") | 
					 | 
				
			||||||
} | 
					 | 
				
			||||||
@ -0,0 +1,224 @@ | 
				
			|||||||
 | 
					// Copyright 2014 The Gogs 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 admin | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import ( | 
				
			||||||
 | 
						"strings" | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/Unknwon/com" | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/gogits/gogs/models" | 
				
			||||||
 | 
						"github.com/gogits/gogs/modules/auth" | 
				
			||||||
 | 
						"github.com/gogits/gogs/modules/base" | 
				
			||||||
 | 
						"github.com/gogits/gogs/modules/log" | 
				
			||||||
 | 
						"github.com/gogits/gogs/modules/middleware" | 
				
			||||||
 | 
					) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const ( | 
				
			||||||
 | 
						USERS     base.TplName = "admin/user/list" | 
				
			||||||
 | 
						USER_NEW  base.TplName = "admin/user/new" | 
				
			||||||
 | 
						USER_EDIT base.TplName = "admin/user/edit" | 
				
			||||||
 | 
					) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Users(ctx *middleware.Context) { | 
				
			||||||
 | 
						ctx.Data["Title"] = ctx.Tr("admin.users") | 
				
			||||||
 | 
						ctx.Data["PageIsAdmin"] = true | 
				
			||||||
 | 
						ctx.Data["PageIsAdminUsers"] = true | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						p := com.StrTo(ctx.Query("p")).MustInt() | 
				
			||||||
 | 
						if p < 1 { | 
				
			||||||
 | 
							p = 1 | 
				
			||||||
 | 
						} | 
				
			||||||
 | 
						pageNum := 50 | 
				
			||||||
 | 
						count := models.CountUsers() | 
				
			||||||
 | 
						curCount := int64((p-1)*pageNum + pageNum) | 
				
			||||||
 | 
						if curCount > count { | 
				
			||||||
 | 
							p = int(count) / pageNum | 
				
			||||||
 | 
						} else if count > curCount { | 
				
			||||||
 | 
							ctx.Data["NextPageNum"] = p + 1 | 
				
			||||||
 | 
						} | 
				
			||||||
 | 
						if p > 1 { | 
				
			||||||
 | 
							ctx.Data["LastPageNum"] = p - 1 | 
				
			||||||
 | 
						} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var err error | 
				
			||||||
 | 
						ctx.Data["Users"], err = models.GetUsers(pageNum, (p-1)*pageNum) | 
				
			||||||
 | 
						if err != nil { | 
				
			||||||
 | 
							ctx.Handle(500, "admin.Users(GetUsers)", err) | 
				
			||||||
 | 
							return | 
				
			||||||
 | 
						} | 
				
			||||||
 | 
						ctx.HTML(200, USERS) | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewUser(ctx *middleware.Context) { | 
				
			||||||
 | 
						ctx.Data["Title"] = ctx.Tr("admin.users.new_account") | 
				
			||||||
 | 
						ctx.Data["PageIsAdmin"] = true | 
				
			||||||
 | 
						ctx.Data["PageIsAdminUsers"] = true | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						auths, err := models.GetAuths() | 
				
			||||||
 | 
						if err != nil { | 
				
			||||||
 | 
							ctx.Handle(500, "GetAuths", err) | 
				
			||||||
 | 
							return | 
				
			||||||
 | 
						} | 
				
			||||||
 | 
						ctx.Data["LoginSources"] = auths | 
				
			||||||
 | 
						ctx.HTML(200, USER_NEW) | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewUserPost(ctx *middleware.Context, form auth.RegisterForm) { | 
				
			||||||
 | 
						ctx.Data["Title"] = ctx.Tr("admin.users.new_account") | 
				
			||||||
 | 
						ctx.Data["PageIsAdmin"] = true | 
				
			||||||
 | 
						ctx.Data["PageIsAdminUsers"] = true | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ctx.HasError() { | 
				
			||||||
 | 
							ctx.HTML(200, USER_NEW) | 
				
			||||||
 | 
							return | 
				
			||||||
 | 
						} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if form.Password != form.Retype { | 
				
			||||||
 | 
							ctx.Data["Err_Password"] = true | 
				
			||||||
 | 
							ctx.RenderWithErr(ctx.Tr("form.password_not_match"), USER_NEW, &form) | 
				
			||||||
 | 
							return | 
				
			||||||
 | 
						} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						u := &models.User{ | 
				
			||||||
 | 
							Name:      form.UserName, | 
				
			||||||
 | 
							Email:     form.Email, | 
				
			||||||
 | 
							Passwd:    form.Password, | 
				
			||||||
 | 
							IsActive:  true, | 
				
			||||||
 | 
							LoginType: models.PLAIN, | 
				
			||||||
 | 
						} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if len(form.LoginType) > 0 { | 
				
			||||||
 | 
							// NOTE: need rewrite.
 | 
				
			||||||
 | 
							fields := strings.Split(form.LoginType, "-") | 
				
			||||||
 | 
							tp, _ := com.StrTo(fields[0]).Int() | 
				
			||||||
 | 
							u.LoginType = models.LoginType(tp) | 
				
			||||||
 | 
							u.LoginSource, _ = com.StrTo(fields[1]).Int64() | 
				
			||||||
 | 
							u.LoginName = form.LoginName | 
				
			||||||
 | 
						} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err := models.CreateUser(u); err != nil { | 
				
			||||||
 | 
							switch err { | 
				
			||||||
 | 
							case models.ErrUserAlreadyExist: | 
				
			||||||
 | 
								ctx.Data["Err_UserName"] = true | 
				
			||||||
 | 
								ctx.RenderWithErr(ctx.Tr("form.username_been_taken"), USER_NEW, &form) | 
				
			||||||
 | 
							case models.ErrEmailAlreadyUsed: | 
				
			||||||
 | 
								ctx.Data["Err_Email"] = true | 
				
			||||||
 | 
								ctx.RenderWithErr(ctx.Tr("form.email_been_used"), USER_NEW, &form) | 
				
			||||||
 | 
							case models.ErrUserNameIllegal: | 
				
			||||||
 | 
								ctx.Data["Err_UserName"] = true | 
				
			||||||
 | 
								ctx.RenderWithErr(ctx.Tr("form.illegal_username"), USER_NEW, &form) | 
				
			||||||
 | 
							default: | 
				
			||||||
 | 
								ctx.Handle(500, "CreateUser", err) | 
				
			||||||
 | 
							} | 
				
			||||||
 | 
							return | 
				
			||||||
 | 
						} | 
				
			||||||
 | 
						log.Trace("Account created by admin(%s): %s", ctx.User.Name, u.Name) | 
				
			||||||
 | 
						ctx.Redirect("/admin/users") | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func EditUser(ctx *middleware.Context) { | 
				
			||||||
 | 
						ctx.Data["Title"] = ctx.Tr("admin.users.edit_account") | 
				
			||||||
 | 
						ctx.Data["PageIsAdmin"] = true | 
				
			||||||
 | 
						ctx.Data["PageIsAdminUsers"] = true | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						uid := com.StrTo(ctx.Params(":userid")).MustInt64() | 
				
			||||||
 | 
						if uid == 0 { | 
				
			||||||
 | 
							ctx.Handle(404, "EditUser", nil) | 
				
			||||||
 | 
							return | 
				
			||||||
 | 
						} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						u, err := models.GetUserById(uid) | 
				
			||||||
 | 
						if err != nil { | 
				
			||||||
 | 
							ctx.Handle(500, "GetUserById", err) | 
				
			||||||
 | 
							return | 
				
			||||||
 | 
						} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ctx.Data["User"] = u | 
				
			||||||
 | 
						auths, err := models.GetAuths() | 
				
			||||||
 | 
						if err != nil { | 
				
			||||||
 | 
							ctx.Handle(500, "GetAuths", err) | 
				
			||||||
 | 
							return | 
				
			||||||
 | 
						} | 
				
			||||||
 | 
						ctx.Data["LoginSources"] = auths | 
				
			||||||
 | 
						ctx.HTML(200, USER_EDIT) | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func EditUserPost(ctx *middleware.Context, form auth.AdminEditUserForm) { | 
				
			||||||
 | 
						ctx.Data["Title"] = ctx.Tr("admin.users.edit_account") | 
				
			||||||
 | 
						ctx.Data["PageIsAdmin"] = true | 
				
			||||||
 | 
						ctx.Data["PageIsAdminUsers"] = true | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						uid := com.StrTo(ctx.Params(":userid")).MustInt64() | 
				
			||||||
 | 
						if uid == 0 { | 
				
			||||||
 | 
							ctx.Handle(404, "EditUser", nil) | 
				
			||||||
 | 
							return | 
				
			||||||
 | 
						} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						u, err := models.GetUserById(uid) | 
				
			||||||
 | 
						if err != nil { | 
				
			||||||
 | 
							ctx.Handle(500, "GetUserById", err) | 
				
			||||||
 | 
							return | 
				
			||||||
 | 
						} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ctx.HasError() { | 
				
			||||||
 | 
							ctx.HTML(200, USER_EDIT) | 
				
			||||||
 | 
							return | 
				
			||||||
 | 
						} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// NOTE: need password length check?
 | 
				
			||||||
 | 
						if len(form.Passwd) > 0 { | 
				
			||||||
 | 
							u.Passwd = form.Passwd | 
				
			||||||
 | 
							u.Salt = models.GetUserSalt() | 
				
			||||||
 | 
							u.EncodePasswd() | 
				
			||||||
 | 
						} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						u.Email = form.Email | 
				
			||||||
 | 
						u.Website = form.Website | 
				
			||||||
 | 
						u.Location = form.Location | 
				
			||||||
 | 
						if len(form.Avatar) == 0 { | 
				
			||||||
 | 
							form.Avatar = form.Email | 
				
			||||||
 | 
						} | 
				
			||||||
 | 
						u.Avatar = base.EncodeMd5(form.Avatar) | 
				
			||||||
 | 
						u.AvatarEmail = form.Avatar | 
				
			||||||
 | 
						u.IsActive = form.Active | 
				
			||||||
 | 
						u.IsAdmin = form.Admin | 
				
			||||||
 | 
						if err := models.UpdateUser(u); err != nil { | 
				
			||||||
 | 
							ctx.Handle(500, "UpdateUser", err) | 
				
			||||||
 | 
							return | 
				
			||||||
 | 
						} | 
				
			||||||
 | 
						log.Trace("Account profile updated by admin(%s): %s", ctx.User.Name, u.Name) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ctx.Data["User"] = u | 
				
			||||||
 | 
						ctx.Flash.Success(ctx.Tr("admin.users.update_profile_success")) | 
				
			||||||
 | 
						ctx.Redirect("/admin/users/" + ctx.Params(":userid")) | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func DeleteUser(ctx *middleware.Context) { | 
				
			||||||
 | 
						uid := com.StrTo(ctx.Params(":userid")).MustInt64() | 
				
			||||||
 | 
						if uid == 0 { | 
				
			||||||
 | 
							ctx.Handle(404, "DeleteUser", nil) | 
				
			||||||
 | 
							return | 
				
			||||||
 | 
						} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						u, err := models.GetUserById(uid) | 
				
			||||||
 | 
						if err != nil { | 
				
			||||||
 | 
							ctx.Handle(500, "GetUserById", err) | 
				
			||||||
 | 
							return | 
				
			||||||
 | 
						} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err = models.DeleteUser(u); err != nil { | 
				
			||||||
 | 
							switch err { | 
				
			||||||
 | 
							case models.ErrUserOwnRepos: | 
				
			||||||
 | 
								ctx.Flash.Error(ctx.Tr("admin.users.still_own_repo")) | 
				
			||||||
 | 
								ctx.Redirect("/admin/users/" + ctx.Params(":userid")) | 
				
			||||||
 | 
							default: | 
				
			||||||
 | 
								ctx.Handle(500, "DeleteUser", err) | 
				
			||||||
 | 
							} | 
				
			||||||
 | 
							return | 
				
			||||||
 | 
						} | 
				
			||||||
 | 
						log.Trace("Account deleted by admin(%s): %s", ctx.User.Name, u.Name) | 
				
			||||||
 | 
						ctx.Redirect("/admin/users") | 
				
			||||||
 | 
					} | 
				
			||||||
@ -1 +1 @@ | 
				
			|||||||
0.4.7.0827 Alpha | 
					0.4.7.0829 Alpha | 
				
			||||||
@ -1,110 +1,78 @@ | 
				
			|||||||
{{template "base/head" .}} | 
					{{template "ng/base/head" .}} | 
				
			||||||
{{template "base/navbar" .}} | 
					{{template "ng/base/header" .}} | 
				
			||||||
<div id="body" class="container" data-page="admin"> | 
					<div id="admin-wrapper"> | 
				
			||||||
 | 
					    <div id="setting-wrapper" class="main-wrapper"> | 
				
			||||||
 | 
					        <div id="admin-setting" class="container clear"> | 
				
			||||||
            {{template "admin/nav" .}} | 
					            {{template "admin/nav" .}} | 
				
			||||||
    <div id="admin-container" class="col-md-9"> | 
					            <div class="grid-4-5 left"> | 
				
			||||||
        <div class="panel panel-default"> | 
					                <div class="setting-content"> | 
				
			||||||
            <div class="panel-heading"> | 
					                    {{template "ng/base/alert" .}} | 
				
			||||||
                Edit Account | 
					                    <div id="setting-content"> | 
				
			||||||
            </div> | 
					                        <div class="panel panel-radius"> | 
				
			||||||
 | 
					                            <div class="panel-header"> | 
				
			||||||
            <div class="panel-body"> | 
					                                <strong>{{.i18n.Tr "admin.users.edit_account"}}</strong> | 
				
			||||||
            	<br/> | 
					                            </div> | 
				
			||||||
				<form action="/admin/users/{{.User.Id}}" method="post" class="form-horizontal"> | 
					                            <form class="form form-align panel-body" id="user-profile-form" action="/admin/users/{{.User.Id}}" method="post" data-delete-url="/admin/users/{{.User.Id}}/delete"> | 
				
			||||||
					            {{.CsrfTokenHtml}} | 
										            {{.CsrfTokenHtml}} | 
				
			||||||
				    {{template "base/alert" .}} | 
					                                <div class="field"> | 
				
			||||||
					<div class="form-group"> | 
					                                    <label class="req">{{.i18n.Tr "admin.users.auth_source"}}</label> | 
				
			||||||
					    <label class="col-md-3 control-label">Auth Source: </label> | 
					                                    <select id="login-type" name="logintype"> | 
				
			||||||
					    <div class="col-md-7"> | 
					                                        <option value="0-0">{{.i18n.Tr "admin.users.local"}}</option> | 
				
			||||||
						    <select name="logintype" class="form-control"> | 
					 | 
				
			||||||
							    <option value="0-0">Local</option> | 
					 | 
				
			||||||
									    {{$tp := .User.LoginSource}} | 
														    {{$tp := .User.LoginSource}} | 
				
			||||||
									    {{range $key, $val := .LoginSources}} | 
														    {{range $key, $val := .LoginSources}} | 
				
			||||||
					  					<option value="{{$val.Type}}-{{$val.Id}}"{{if eq $val.Id $tp}} selected{{end}}>{{$val.Name}}</option> | 
										  					<option value="{{$val.Type}}-{{$val.Id}}"{{if eq $val.Id $tp}} selected{{end}}>{{$val.Name}}</option> | 
				
			||||||
					  					{{end}} | 
										  					{{end}} | 
				
			||||||
                                    </select> | 
					                                    </select> | 
				
			||||||
                                </div> | 
					                                </div> | 
				
			||||||
 | 
					                                <div class="field"> | 
				
			||||||
 | 
					                                    <label for="loginname">{{.i18n.Tr "admin.users.auth_login_name"}}</label> | 
				
			||||||
 | 
					                                    <input class="ipt ipt-large ipt-radius {{if .Err_LoginName}}ipt-error{{end}}" id="loginname" name="loginname" value="{{.User.LoginName}}" /> | 
				
			||||||
                                </div> | 
					                                </div> | 
				
			||||||
 | 
					                                <div class="field"> | 
				
			||||||
					<div class="form-group"> | 
					                                    <label>{{.i18n.Tr "username"}}</label> | 
				
			||||||
					    <label class="col-md-3 control-label">Auth Login Name: </label> | 
					                                    <label>{{.User.Name}}</label> | 
				
			||||||
					    <div class="col-md-7"> | 
					 | 
				
			||||||
							<input name="loginname" class="form-control" placeholder="Type auth login's username" value="{{.User.LoginName}}"> | 
					 | 
				
			||||||
                                </div> | 
					                                </div> | 
				
			||||||
 | 
					                                <div class="field"> | 
				
			||||||
 | 
					                                    <label class="req" for="email">{{.i18n.Tr "email"}}</label> | 
				
			||||||
 | 
					                                    <input class="ipt ipt-large ipt-radius {{if .Err_Email}}ipt-error{{end}}" id="email" name="email" type="email" value="{{.User.Email}}" required/> | 
				
			||||||
                                </div> | 
					                                </div> | 
				
			||||||
 | 
					                                <div class="field pwd"> | 
				
			||||||
					<div class="form-group"> | 
					                                    <label for="password">{{.i18n.Tr "password"}}</label> | 
				
			||||||
						<label class="col-md-3 control-label">Username: </label> | 
					                                    <input class="ipt ipt-large ipt-radius {{if .Err_Password}}ipt-error{{end}}" id="password" name="password" type="password" /> | 
				
			||||||
						<label class="control-label">{{.User.Name}}</label> | 
					 | 
				
			||||||
                                </div> | 
					                                </div> | 
				
			||||||
 | 
						                            <div class="field"> | 
				
			||||||
					<div class="form-group {{if .Err_Email}}has-error has-feedback{{end}}"> | 
						                                <label for="website">{{.i18n.Tr "settings.website"}}</label> | 
				
			||||||
						<label class="col-md-3 control-label">Email<strong class="text-danger">*</strong></label> | 
						                                <input class="ipt ipt-large ipt-radius {{if .Err_Website}}ipt-error{{end}}" id="website" name="website" type="url" value="{{.User.Website}}" /> | 
				
			||||||
						<div class="col-md-7"> | 
					 | 
				
			||||||
							<input name="email" class="form-control" placeholder="Type account's e-mail address" value="{{.User.Email}}" required="required"> | 
					 | 
				
			||||||
	                            </div> | 
						                            </div> | 
				
			||||||
 | 
						                            <div class="field"> | 
				
			||||||
 | 
						                                <label for="location">{{.i18n.Tr "settings.location"}}</label> | 
				
			||||||
 | 
						                                <input class="ipt ipt-large ipt-radius {{if .Err_Location}}ipt-error{{end}}" id="location" name="location" type="text" value="{{.User.Location}}" /> | 
				
			||||||
	                            </div> | 
						                            </div> | 
				
			||||||
 | 
						                            <div class="field"> | 
				
			||||||
					<div class="form-group"> | 
						                                <label for="gravatar-email">Gravatar {{.i18n.Tr "email"}}</label> | 
				
			||||||
						<label class="col-md-3 control-label">Password</label> | 
						                                <input class="ipt ipt-large ipt-radius {{if .Err_Avatar}}ipt-error{{end}}" id="gravatar-email" name="avatar" type="text" value="{{.User.AvatarEmail}}" /> | 
				
			||||||
						<div class="col-md-7"> | 
					 | 
				
			||||||
							<input name="passwd" type="password" class="form-control" placeholder="Type account's new password or leave unfilled"> | 
					 | 
				
			||||||
	                            </div> | 
						                            </div> | 
				
			||||||
					</div> | 
						                            <div class="field"> | 
				
			||||||
 | 
						                                <label></label> | 
				
			||||||
	                <div class="form-group"> | 
					 | 
				
			||||||
	                    <label class="col-md-3 control-label">Website</label> | 
					 | 
				
			||||||
	                    <div class="col-md-7"> | 
					 | 
				
			||||||
	                        <input name="website" class="form-control" placeholder="Type account's website URL" value="{{.User.Website}}"> | 
					 | 
				
			||||||
	                    </div> | 
					 | 
				
			||||||
	                </div> | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	                <div class="form-group"> | 
					 | 
				
			||||||
	                    <label class="col-md-3 control-label">Location</label> | 
					 | 
				
			||||||
	                    <div class="col-md-7"> | 
					 | 
				
			||||||
	                        <input name="location" class="form-control" placeholder="Type account's current location" value="{{.User.Location}}"> | 
					 | 
				
			||||||
	                    </div> | 
					 | 
				
			||||||
	                </div> | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	                <div class="form-group {{if .Err_Avatar}}has-error has-feedback{{end}}"> | 
					 | 
				
			||||||
	                    <label class="col-md-3 control-label">Gravatar Email<strong class="text-danger">*</strong></label> | 
					 | 
				
			||||||
	                    <div class="col-md-7"> | 
					 | 
				
			||||||
	                        <input name="avatar" class="form-control" placeholder="Type account's Gravatar e-mail address" required="required" value="{{.User.AvatarEmail}}"> | 
					 | 
				
			||||||
	                    </div> | 
					 | 
				
			||||||
	                </div> | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	                <div class="form-group"> | 
					 | 
				
			||||||
			            <div class="col-md-7 col-md-offset-3"> | 
					 | 
				
			||||||
			                <div class="checkbox"> | 
					 | 
				
			||||||
			                    <label> | 
					 | 
				
			||||||
			                        <input type="checkbox" name="active" {{if .User.IsActive}}checked{{end}}> | 
								                        <input type="checkbox" name="active" {{if .User.IsActive}}checked{{end}}> | 
				
			||||||
			                        <strong>This account is activated</strong> | 
								                        <strong>{{.i18n.Tr "admin.users.is_activated"}}</strong> | 
				
			||||||
			                    </label> | 
								                        <br> | 
				
			||||||
			                </div> | 
						                                <label></label> | 
				
			||||||
			            </div> | 
					 | 
				
			||||||
	                </div> | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	                <div class="form-group"> | 
					 | 
				
			||||||
			            <div class="col-md-7 col-md-offset-3"> | 
					 | 
				
			||||||
			                <div class="checkbox"> | 
					 | 
				
			||||||
			                    <label> | 
					 | 
				
			||||||
			                        <input type="checkbox" name="admin" {{if .User.IsAdmin}}checked{{end}}> | 
								                        <input type="checkbox" name="admin" {{if .User.IsAdmin}}checked{{end}}> | 
				
			||||||
			                        <strong>This account has administrator permissions</strong> | 
								                        <strong>{{.i18n.Tr "admin.users.is_admin"}}</strong> | 
				
			||||||
			                    </label> | 
					 | 
				
			||||||
	                            </div> | 
						                            </div> | 
				
			||||||
 | 
										            <div class="field"> | 
				
			||||||
 | 
										                <label></label> | 
				
			||||||
 | 
					                                	<button class="btn btn-green btn-large btn-radius">{{.i18n.Tr "admin.users.update_profile"}}</button> | 
				
			||||||
 | 
										                      | 
				
			||||||
 | 
										                <button class="btn btn-large btn-red btn-radius" id="user-delete">{{.i18n.Tr "admin.users.delete_account"}}</button> | 
				
			||||||
					            </div> | 
										            </div> | 
				
			||||||
 | 
												</form> | 
				
			||||||
            			</div> | 
					            			</div> | 
				
			||||||
					<hr/> | 
					 | 
				
			||||||
					<div class="form-group"> | 
					 | 
				
			||||||
					    <div class="col-md-offset-3 col-md-6"> | 
					 | 
				
			||||||
					    	<button type="submit" class="btn btn-lg btn-primary btn-block">Update account profile</button> | 
					 | 
				
			||||||
					    	<a type="button" href="/admin/users/{{.User.Id}}/delete" class="btn btn-lg btn-danger btn-block">Delete this account</a> | 
					 | 
				
			||||||
        			</div> | 
					        			</div> | 
				
			||||||
				</div> | 
									</div> | 
				
			||||||
				</form> | 
					 | 
				
			||||||
			</div> | 
								</div> | 
				
			||||||
		</div> | 
							</div> | 
				
			||||||
 | 
					 | 
				
			||||||
	</div> | 
						</div> | 
				
			||||||
</div> | 
					</div> | 
				
			||||||
{{template "base/footer" .}} | 
					{{template "ng/base/footer" .}} | 
				
			||||||
 | 
				
			|||||||
@ -0,0 +1,62 @@ | 
				
			|||||||
 | 
					{{template "ng/base/head" .}} | 
				
			||||||
 | 
					{{template "ng/base/header" .}} | 
				
			||||||
 | 
					<div id="admin-wrapper"> | 
				
			||||||
 | 
					    <div id="setting-wrapper" class="main-wrapper"> | 
				
			||||||
 | 
					        <div id="admin-setting" class="container clear"> | 
				
			||||||
 | 
					            {{template "admin/nav" .}} | 
				
			||||||
 | 
					            <div class="grid-4-5 left"> | 
				
			||||||
 | 
					                <div class="setting-content"> | 
				
			||||||
 | 
					                    {{template "ng/base/alert" .}} | 
				
			||||||
 | 
					                    <div id="setting-content"> | 
				
			||||||
 | 
					                        <div class="panel panel-radius"> | 
				
			||||||
 | 
					                            <div class="panel-header"> | 
				
			||||||
 | 
					                                <strong>{{.i18n.Tr "admin.users.user_manage_panel"}}</strong> | 
				
			||||||
 | 
					                            </div> | 
				
			||||||
 | 
					                            <div class="panel-body admin-panel"> | 
				
			||||||
 | 
													<a class="btn-blue btn-medium btn-link btn-radius" href="/admin/users/new">{{.i18n.Tr "admin.users.new_account"}}</a> | 
				
			||||||
 | 
					                                <div class="admin-table"> | 
				
			||||||
 | 
										                <table class="table table-striped"> | 
				
			||||||
 | 
										                    <thead> | 
				
			||||||
 | 
										                        <tr> | 
				
			||||||
 | 
										                            <th>Id</th> | 
				
			||||||
 | 
										                            <th>{{.i18n.Tr "admin.users.name"}}</th> | 
				
			||||||
 | 
										                            <th>{{.i18n.Tr "admin.users.email"}}</th> | 
				
			||||||
 | 
										                            <th>{{.i18n.Tr "admin.users.activated"}}</th> | 
				
			||||||
 | 
										                            <th>{{.i18n.Tr "admin.users.admin"}}</th> | 
				
			||||||
 | 
										                            <th>{{.i18n.Tr "admin.users.repos"}}</th> | 
				
			||||||
 | 
										                            <th>{{.i18n.Tr "admin.users.created"}}</th> | 
				
			||||||
 | 
										                            <th>{{.i18n.Tr "admin.users.edit"}}</th> | 
				
			||||||
 | 
										                        </tr> | 
				
			||||||
 | 
										                    </thead> | 
				
			||||||
 | 
										                    <tbody> | 
				
			||||||
 | 
										                        {{range .Users}} | 
				
			||||||
 | 
										                        <tr> | 
				
			||||||
 | 
										                            <td>{{.Id}}</td> | 
				
			||||||
 | 
										                            <td><a href="/user/{{.Name}}">{{.Name}}</a></td> | 
				
			||||||
 | 
										                            <td>{{.Email}}</td> | 
				
			||||||
 | 
										                            <td><i class="fa fa{{if .IsActive}}-check{{end}}-square-o"></i></td> | 
				
			||||||
 | 
										                            <td><i class="fa fa{{if .IsAdmin}}-check{{end}}-square-o"></i></td> | 
				
			||||||
 | 
										                            <td>{{.NumRepos}}</td> | 
				
			||||||
 | 
										                            <td>{{DateFormat .Created "M d, Y"}}</td> | 
				
			||||||
 | 
										                            <td><a href="/admin/users/{{.Id}}"><i class="fa fa-pencil-square-o"></i></a></td> | 
				
			||||||
 | 
										                        </tr> | 
				
			||||||
 | 
										                        {{end}} | 
				
			||||||
 | 
										                    </tbody> | 
				
			||||||
 | 
										                </table> | 
				
			||||||
 | 
										                {{if or .LastPageNum .NextPageNum}} | 
				
			||||||
 | 
										                <ul class="pagination"> | 
				
			||||||
 | 
										                    {{if .LastPageNum}}<li><a class="btn btn-medium btn-gray btn-radius" href="/admin/users?p={{.LastPageNum}}">« Prev.</a></li>{{end}} | 
				
			||||||
 | 
										                    {{if .NextPageNum}}<li><a class="btn btn-medium btn-gray btn-radius" href="/admin/users?p={{.NextPageNum}}">» Next</a></li>{{end}} | 
				
			||||||
 | 
										                </ul> | 
				
			||||||
 | 
										                {{end}} | 
				
			||||||
 | 
									                </div> | 
				
			||||||
 | 
					                            </div> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        </div> | 
				
			||||||
 | 
					                    </div> | 
				
			||||||
 | 
					                </div> | 
				
			||||||
 | 
					            </div> | 
				
			||||||
 | 
					        </div> | 
				
			||||||
 | 
					    </div> | 
				
			||||||
 | 
					</div> | 
				
			||||||
 | 
					{{template "ng/base/footer" .}} | 
				
			||||||
@ -1,94 +1,58 @@ | 
				
			|||||||
{{template "base/head" .}} | 
					{{template "ng/base/head" .}} | 
				
			||||||
{{template "base/navbar" .}} | 
					{{template "ng/base/header" .}} | 
				
			||||||
<div id="body" class="container" data-page="admin"> | 
					<div id="admin-wrapper"> | 
				
			||||||
 | 
					    <div id="setting-wrapper" class="main-wrapper"> | 
				
			||||||
 | 
					        <div id="admin-setting" class="container clear"> | 
				
			||||||
            {{template "admin/nav" .}} | 
					            {{template "admin/nav" .}} | 
				
			||||||
    <div id="admin-container" class="col-md-9"> | 
					            <div class="grid-4-5 left"> | 
				
			||||||
        <div class="panel panel-default"> | 
					                <div class="setting-content"> | 
				
			||||||
            <div class="panel-heading"> | 
					                    {{template "ng/base/alert" .}} | 
				
			||||||
                New Account | 
					                    <div id="setting-content"> | 
				
			||||||
            </div> | 
					                        <div class="panel panel-radius"> | 
				
			||||||
 | 
					                            <div class="panel-header"> | 
				
			||||||
            <div class="panel-body"> | 
					                                <strong>{{.i18n.Tr "admin.users.new_account"}}</strong> | 
				
			||||||
            	<br/> | 
					                            </div> | 
				
			||||||
				<form action="/admin/users/new" method="post" class="form-horizontal"> | 
					                            <form class="form form-align panel-body" id="repo-setting-form" action="/admin/users/new" method="post"> | 
				
			||||||
					            {{.CsrfTokenHtml}} | 
										            {{.CsrfTokenHtml}} | 
				
			||||||
				    {{template "base/alert" .}} | 
					                                <div class="field"> | 
				
			||||||
				    <div class="form-group"> | 
					                                    <label class="req">{{.i18n.Tr "admin.users.auth_source"}}</label> | 
				
			||||||
					    <label class="col-md-3 control-label">Auth Source: </label> | 
					                                    <select id="login-type" name="logintype"> | 
				
			||||||
					    <div class="col-md-7"> | 
					                                        <option value="0-0">{{.i18n.Tr "admin.users.local"}}</option> | 
				
			||||||
						    <select name="logintype" class="form-control" id="login-type"> | 
					 | 
				
			||||||
							    <option value="0-0">Local</option> | 
					 | 
				
			||||||
                                        {{range $key, $val := .LoginSources}} | 
					                                        {{range $key, $val := .LoginSources}} | 
				
			||||||
                                        <option value="{{$val.Type}}-{{$val.Id}}">{{$val.Name}}</option> | 
					                                        <option value="{{$val.Type}}-{{$val.Id}}">{{$val.Name}}</option> | 
				
			||||||
                                        {{end}} | 
					                                        {{end}} | 
				
			||||||
                                    </select> | 
					                                    </select> | 
				
			||||||
                                </div> | 
					                                </div> | 
				
			||||||
 | 
					                                <div class="field auth-name hidden"> | 
				
			||||||
 | 
					                                    <label class="req" for="loginname">{{.i18n.Tr "admin.users.auth_login_name"}}</label> | 
				
			||||||
 | 
					                                    <input class="ipt ipt-large ipt-radius {{if .Err_LoginName}}ipt-error{{end}}" id="loginname" name="loginname" value="{{.loginname}}" /> | 
				
			||||||
                                </div> | 
					                                </div> | 
				
			||||||
 | 
					                                <div class="field"> | 
				
			||||||
					<div class="auth-name hidden"> | 
					                                    <label class="req" for="username">{{.i18n.Tr "username"}}</label> | 
				
			||||||
                        <div class="form-group"> | 
					                                    <input class="ipt ipt-large ipt-radius {{if .Err_UserName}}ipt-error{{end}}" id="username" name="uname" type="text" value="{{.uname}}" required /> | 
				
			||||||
                            <label class="col-md-3 control-label">Auth Login Name: </label> | 
					 | 
				
			||||||
                            <div class="col-md-7"> | 
					 | 
				
			||||||
                                <input name="loginname" class="form-control" placeholder="Type auth login's username" value="{{.loginname}}"> | 
					 | 
				
			||||||
                            </div> | 
					 | 
				
			||||||
                        </div> | 
					 | 
				
			||||||
					</div> | 
					 | 
				
			||||||
					 | 
					 | 
				
			||||||
					<div class="form-group {{if .Err_UserName}}has-error has-feedback{{end}}"> | 
					 | 
				
			||||||
						<label class="col-md-3 control-label">Username: </label> | 
					 | 
				
			||||||
						<div class="col-md-7"> | 
					 | 
				
			||||||
							<input name="username" class="form-control" placeholder="Type account's username" value="{{.username}}" required="required"> | 
					 | 
				
			||||||
						</div> | 
					 | 
				
			||||||
                                </div> | 
					                                </div> | 
				
			||||||
 | 
					                                <div class="field"> | 
				
			||||||
					<div class="form-group {{if .Err_Email}}has-error has-feedback{{end}}"> | 
					                                    <label class="req" for="email">{{.i18n.Tr "email"}}</label> | 
				
			||||||
						<label class="col-md-3 control-label">Email: </label> | 
					                                    <input class="ipt ipt-large ipt-radius {{if .Err_Email}}ipt-error{{end}}" id="email" name="email" type="email" value="{{.email}}" required/> | 
				
			||||||
						<div class="col-md-7"> | 
					 | 
				
			||||||
							<input name="email" class="form-control" placeholder="Type account's e-mail address" value="{{.email}}" required="required" title="Email is not valid"> | 
					 | 
				
			||||||
                                </div> | 
					                                </div> | 
				
			||||||
 | 
					                                <div class="field pwd"> | 
				
			||||||
 | 
					                                    <label class="req" for="password">{{.i18n.Tr "password"}}</label> | 
				
			||||||
 | 
					                                    <input class="ipt ipt-large ipt-radius {{if .Err_Password}}ipt-error{{end}}" id="password" name="password" type="password" value="{{.password}}" required/> | 
				
			||||||
                                </div> | 
					                                </div> | 
				
			||||||
 | 
					                                <div class="field"> | 
				
			||||||
					<div class="pwd"> | 
					                                    <label class="req" for="re-type">{{.i18n.Tr "re_type"}}</label> | 
				
			||||||
                        <div class="form-group {{if .Err_Password}}has-error has-feedback{{end}}"> | 
					                                    <input class="ipt ipt-large ipt-radius {{if .Err_Password}}ipt-error{{end}}" id="re-type" name="retype" type="password" required/> | 
				
			||||||
                            <label class="col-md-3 control-label">Password: </label> | 
					 | 
				
			||||||
                            <div class="col-md-7"> | 
					 | 
				
			||||||
                                <input name="passwd" type="password" class="form-control" placeholder="Type account's password" required="required" title="Password must contain at least 6 characters"> | 
					 | 
				
			||||||
                            </div> | 
					 | 
				
			||||||
                        </div> | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                        <div class="form-group {{if .Err_RetypePasswd}}has-error has-feedback{{end}}"> | 
					 | 
				
			||||||
                            <label class="col-md-3 control-label">Re-type: </label> | 
					 | 
				
			||||||
                            <div class="col-md-7"> | 
					 | 
				
			||||||
                                <input name="retypepasswd" type="password" class="form-control" placeholder="Re-type account's password" required="required" title="Re-type Password must be same to Password"> | 
					 | 
				
			||||||
                                </div> | 
					                                </div> | 
				
			||||||
 | 
					                                <div class="field"> | 
				
			||||||
 | 
					                                    <span class="form-label"></span> | 
				
			||||||
 | 
					                                    <button class="btn btn-blue btn-large btn-radius">{{.i18n.Tr "admin.users.new_account"}}</button> | 
				
			||||||
                                </div> | 
					                                </div> | 
				
			||||||
 | 
									            </form> | 
				
			||||||
                        </div> | 
					                        </div> | 
				
			||||||
                    <hr/> | 
					 | 
				
			||||||
                    <div class="form-group"> | 
					 | 
				
			||||||
                        <div class="col-md-offset-3 col-md-7"> | 
					 | 
				
			||||||
                            <button type="submit" class="btn btn-lg btn-primary">Create new account</button> | 
					 | 
				
			||||||
                    </div> | 
					                    </div> | 
				
			||||||
                </div> | 
					                </div> | 
				
			||||||
				</form> | 
					 | 
				
			||||||
            </div> | 
					            </div> | 
				
			||||||
        </div> | 
					        </div> | 
				
			||||||
 | 
					 | 
				
			||||||
    </div> | 
					    </div> | 
				
			||||||
</div> | 
					</div> | 
				
			||||||
<script> | 
					{{template "ng/base/footer" .}} | 
				
			||||||
    $(function(){ | 
					 | 
				
			||||||
        $('#login-type').on("change",function(){ | 
					 | 
				
			||||||
            var v = $(this).val(); | 
					 | 
				
			||||||
            if(v.indexOf("0-")+1){ | 
					 | 
				
			||||||
                $('.auth-name').toggleHide(); | 
					 | 
				
			||||||
                $(".pwd").find("input").attr("required","required") | 
					 | 
				
			||||||
                        .end().toggleShow(); | 
					 | 
				
			||||||
            }else{ | 
					 | 
				
			||||||
                $(".pwd").find("input").removeAttr("required") | 
					 | 
				
			||||||
                        .end().toggleHide(); | 
					 | 
				
			||||||
                $('.auth-name').toggleShow(); | 
					 | 
				
			||||||
            } | 
					 | 
				
			||||||
        }); | 
					 | 
				
			||||||
    }); | 
					 | 
				
			||||||
</script> | 
					 | 
				
			||||||
{{template "base/footer" .}} | 
					 | 
				
			||||||
@ -1,49 +0,0 @@ | 
				
			|||||||
{{template "base/head" .}} | 
					 | 
				
			||||||
{{template "base/navbar" .}} | 
					 | 
				
			||||||
<div id="body" class="container" data-page="admin"> | 
					 | 
				
			||||||
    {{template "admin/nav" .}} | 
					 | 
				
			||||||
    <div id="admin-container" class="col-md-10"> | 
					 | 
				
			||||||
        <div class="panel panel-default"> | 
					 | 
				
			||||||
            <div class="panel-heading"> | 
					 | 
				
			||||||
                User Management | 
					 | 
				
			||||||
            </div> | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            <div class="panel-body"> | 
					 | 
				
			||||||
                <a href="/admin/users/new" class="btn btn-primary">New Account</a> | 
					 | 
				
			||||||
                <table class="table table-striped"> | 
					 | 
				
			||||||
                    <thead> | 
					 | 
				
			||||||
                        <tr> | 
					 | 
				
			||||||
                            <th>Id</th> | 
					 | 
				
			||||||
                            <th>Name</th> | 
					 | 
				
			||||||
                            <th>E-mail</th> | 
					 | 
				
			||||||
                            <th>Actived</th> | 
					 | 
				
			||||||
                            <th>Admin</th> | 
					 | 
				
			||||||
                            <th>Repos</th> | 
					 | 
				
			||||||
                            <th>Join</th> | 
					 | 
				
			||||||
                            <th>Edit</th> | 
					 | 
				
			||||||
                        </tr> | 
					 | 
				
			||||||
                    </thead> | 
					 | 
				
			||||||
                    <tbody> | 
					 | 
				
			||||||
                        {{range .Users}} | 
					 | 
				
			||||||
                        <tr> | 
					 | 
				
			||||||
                            <td>{{.Id}}</td> | 
					 | 
				
			||||||
                            <td><a href="/user/{{.Name}}">{{.Name}}</a></td> | 
					 | 
				
			||||||
                            <td>{{.Email}}</td> | 
					 | 
				
			||||||
                            <td><i class="fa fa{{if .IsActive}}-check{{end}}-square-o"></i></td> | 
					 | 
				
			||||||
                            <td><i class="fa fa{{if .IsAdmin}}-check{{end}}-square-o"></i></td> | 
					 | 
				
			||||||
                            <td>{{.NumRepos}}</td> | 
					 | 
				
			||||||
                            <td>{{DateFormat .Created "M d, Y"}}</td> | 
					 | 
				
			||||||
                            <td><a href="/admin/users/{{.Id}}"><i class="fa fa-pencil-square-o"></i></a></td> | 
					 | 
				
			||||||
                        </tr> | 
					 | 
				
			||||||
                        {{end}} | 
					 | 
				
			||||||
                    </tbody> | 
					 | 
				
			||||||
                </table> | 
					 | 
				
			||||||
                <ul class="pagination"> | 
					 | 
				
			||||||
                    {{if .LastPageNum}}<li><a href="/admin/users?p={{.LastPageNum}}">« Prev.</a></li>{{end}} | 
					 | 
				
			||||||
                    {{if .NextPageNum}}<li><a href="/admin/users?p={{.NextPageNum}}">» Next</a></li>{{end}} | 
					 | 
				
			||||||
                </ul> | 
					 | 
				
			||||||
            </div> | 
					 | 
				
			||||||
        </div> | 
					 | 
				
			||||||
    </div> | 
					 | 
				
			||||||
</div> | 
					 | 
				
			||||||
{{template "base/footer" .}} | 
					 | 
				
			||||||
@ -1,75 +0,0 @@ | 
				
			|||||||
{{template "base/head" .}} | 
					 | 
				
			||||||
{{template "base/navbar" .}} | 
					 | 
				
			||||||
<div id="body-nav" class="org-nav org-nav-auto"> | 
					 | 
				
			||||||
    <div class="container clearfix"> | 
					 | 
				
			||||||
        <div id="org-nav-wrapper"> | 
					 | 
				
			||||||
            <ul class="nav nav-pills pull-right"> | 
					 | 
				
			||||||
                <li><a href="#"><i class="fa fa-users"></i>Members | 
					 | 
				
			||||||
                    <span class="label label-default">5</span></a> | 
					 | 
				
			||||||
                </li> | 
					 | 
				
			||||||
                <li class="active"><a href="#"><i class="fa fa-tags"></i>Teams | 
					 | 
				
			||||||
                    <span class="label label-default">2</span></a> | 
					 | 
				
			||||||
                </li> | 
					 | 
				
			||||||
            </ul> | 
					 | 
				
			||||||
            <img class="pull-left org-small-logo" src="https://avatars3.githubusercontent.com/u/6656686?s=140" alt="" width="60"/> | 
					 | 
				
			||||||
            <div id="org-nav-info"> | 
					 | 
				
			||||||
                <h2 class="org-name">Organization Name</h2> | 
					 | 
				
			||||||
            </div> | 
					 | 
				
			||||||
        </div> | 
					 | 
				
			||||||
    </div> | 
					 | 
				
			||||||
</div> | 
					 | 
				
			||||||
<div id="body" class="container"> | 
					 | 
				
			||||||
    <div id="org"> | 
					 | 
				
			||||||
        <form id="org-teams-edit" class="form-horizontal card"> | 
					 | 
				
			||||||
            <h3>Edit team</h3> | 
					 | 
				
			||||||
            <div class="form-group"> | 
					 | 
				
			||||||
                <label class="col-md-2 control-label">Team Name<strong class="text-danger">*</strong></label> | 
					 | 
				
			||||||
                <div class="col-md-8"> | 
					 | 
				
			||||||
                    <input name="team" type="text" class="form-control" placeholder="Type your team name" value="" required="required"> | 
					 | 
				
			||||||
                    <span class="help-block">You'll use this name to mention this team in conversations.</span> | 
					 | 
				
			||||||
                </div> | 
					 | 
				
			||||||
            </div> | 
					 | 
				
			||||||
            <div class="form-group"> | 
					 | 
				
			||||||
                <label class="col-md-2 control-label">Description</label> | 
					 | 
				
			||||||
                <div class="col-md-8"> | 
					 | 
				
			||||||
                    <input name="desc" type="text" class="form-control" placeholder="Type your team description (optional)" value=""> | 
					 | 
				
			||||||
                </div> | 
					 | 
				
			||||||
            </div> | 
					 | 
				
			||||||
            <div class="form-group"> | 
					 | 
				
			||||||
                <label class="col-md-2 control-label">Permission</label> | 
					 | 
				
			||||||
                <div class="col-md-8"> | 
					 | 
				
			||||||
                    <div class="radio"> | 
					 | 
				
			||||||
                        <label> | 
					 | 
				
			||||||
                            <input type="radio" name="permission" value="pull" checked=""> | 
					 | 
				
			||||||
                            <strong>Read & Clone</strong> | 
					 | 
				
			||||||
                        </label> | 
					 | 
				
			||||||
                        <p>This team will be able to view and clone its repositories.</p> | 
					 | 
				
			||||||
                    </div> | 
					 | 
				
			||||||
                    <div class="radio"> | 
					 | 
				
			||||||
                        <label> | 
					 | 
				
			||||||
                            <input type="radio" name="permission" value="push"> | 
					 | 
				
			||||||
                            <strong>Push, Read & Clone</strong> | 
					 | 
				
			||||||
                        </label> | 
					 | 
				
			||||||
                        <p>This team will be able to read its repositories, as well as push to them.</p> | 
					 | 
				
			||||||
                    </div> | 
					 | 
				
			||||||
                    <div class="radio"> | 
					 | 
				
			||||||
                        <label> | 
					 | 
				
			||||||
                            <input type="radio" name="permission" value="admin"> | 
					 | 
				
			||||||
                            <strong>Collaboration, Push, Read & Clone</strong> | 
					 | 
				
			||||||
                        </label> | 
					 | 
				
			||||||
                        <p>This team will be able to push/pull to its repositories, as well as add other collaborators to them.</p> | 
					 | 
				
			||||||
                    </div> | 
					 | 
				
			||||||
                </div> | 
					 | 
				
			||||||
            </div> | 
					 | 
				
			||||||
            <hr/> | 
					 | 
				
			||||||
            <div class="form-group"> | 
					 | 
				
			||||||
                <label class="col-md-2"> </label> | 
					 | 
				
			||||||
                <div class="col-md-8"> | 
					 | 
				
			||||||
                    <button class="btn btn-primary">Edit this team</button> | 
					 | 
				
			||||||
                    <button class="btn btn-danger pull-right" value="delete" name="delete">Delete this team</button> | 
					 | 
				
			||||||
                </div> | 
					 | 
				
			||||||
            </div> | 
					 | 
				
			||||||
        </form> | 
					 | 
				
			||||||
    </div> | 
					 | 
				
			||||||
</div> | 
					 | 
				
			||||||
{{template "base/footer" .}} | 
					 | 
				
			||||||
@ -1,106 +0,0 @@ | 
				
			|||||||
{{template "base/head" .}} | 
					 | 
				
			||||||
{{template "base/navbar" .}} | 
					 | 
				
			||||||
<div id="body-nav" class="org-nav org-nav-auto"> | 
					 | 
				
			||||||
    <div class="container clearfix"> | 
					 | 
				
			||||||
        <div id="org-nav-wrapper"> | 
					 | 
				
			||||||
            <ul class="nav nav-pills pull-right"> | 
					 | 
				
			||||||
                <li><a href="#"><i class="fa fa-users"></i>Members | 
					 | 
				
			||||||
                    <span class="label label-default">5</span></a> | 
					 | 
				
			||||||
                </li> | 
					 | 
				
			||||||
                <li class="active"><a href="#"><i class="fa fa-tags"></i>Teams | 
					 | 
				
			||||||
                    <span class="label label-default">2</span></a> | 
					 | 
				
			||||||
                </li> | 
					 | 
				
			||||||
            </ul> | 
					 | 
				
			||||||
            <img class="pull-left org-small-logo" src="https://avatars3.githubusercontent.com/u/6656686?s=140" alt="" width="60"/> | 
					 | 
				
			||||||
            <div id="org-nav-info"> | 
					 | 
				
			||||||
                <h2 class="org-name">Organization Name</h2> | 
					 | 
				
			||||||
            </div> | 
					 | 
				
			||||||
        </div> | 
					 | 
				
			||||||
    </div> | 
					 | 
				
			||||||
</div> | 
					 | 
				
			||||||
<div id="body" class="container"> | 
					 | 
				
			||||||
    <div id="org"> | 
					 | 
				
			||||||
        <div id="org-team"> | 
					 | 
				
			||||||
            <div id="org-team-card" class="col-md-3"> | 
					 | 
				
			||||||
                <h3 class="title">Team name</h3> | 
					 | 
				
			||||||
                <p class="desc">team description</p> | 
					 | 
				
			||||||
                <hr/> | 
					 | 
				
			||||||
                <div class="meta"> | 
					 | 
				
			||||||
                    <div class="col-md-6"> | 
					 | 
				
			||||||
                        <a href="#"><span class="num"><strong>1</strong></span> | 
					 | 
				
			||||||
                            <br/>Member</a> | 
					 | 
				
			||||||
                    </div> | 
					 | 
				
			||||||
                    <div class="col-md-6"> | 
					 | 
				
			||||||
                        <a href="#"><span class="num"><strong>1</strong></span> | 
					 | 
				
			||||||
                            <br/>Repository</a> | 
					 | 
				
			||||||
                    </div> | 
					 | 
				
			||||||
                </div> | 
					 | 
				
			||||||
                <hr style="width: 100%"/> | 
					 | 
				
			||||||
                <div class="action"> | 
					 | 
				
			||||||
                    <a href="#"> | 
					 | 
				
			||||||
                        <button class="btn btn-danger">Leave</button> | 
					 | 
				
			||||||
                    </a> | 
					 | 
				
			||||||
                    <a href="#"> | 
					 | 
				
			||||||
                        <button class="btn btn-success">Edit</button> | 
					 | 
				
			||||||
                    </a> | 
					 | 
				
			||||||
                    <a href="#"> | 
					 | 
				
			||||||
                        <button class="btn btn-default">Setting</button> | 
					 | 
				
			||||||
                    </a> | 
					 | 
				
			||||||
                </div> | 
					 | 
				
			||||||
                <hr/> | 
					 | 
				
			||||||
                <p>This team grants <strong>Push, Read & Clone</strong> access: members can read from and push to the team's repositories.</p> | 
					 | 
				
			||||||
            </div> | 
					 | 
				
			||||||
            <div id="org-team-content" class="col-md-9"> | 
					 | 
				
			||||||
                <div class="header"> | 
					 | 
				
			||||||
                    <div class="header-tab col-md-4"> | 
					 | 
				
			||||||
                        <div class="btn-group"> | 
					 | 
				
			||||||
                            <a class="btn btn-primary" href="#">Members</a> | 
					 | 
				
			||||||
                            <a class="btn btn-default" href="#">Repositories</a> | 
					 | 
				
			||||||
                        </div> | 
					 | 
				
			||||||
                    </div> | 
					 | 
				
			||||||
                    <form id="org-team-add-user-form" action="url" class="col-md-4 pull-right open" method="post"> | 
					 | 
				
			||||||
                        <input type="text" class="form-control" name="user" placeholder="add user to teams" id="org-team-add-user"/> | 
					 | 
				
			||||||
                        <div class="dropdown-menu"> | 
					 | 
				
			||||||
                            <ul class="list-unstyled"></ul> | 
					 | 
				
			||||||
                        </div> | 
					 | 
				
			||||||
                        <input type="hidden" name="team" value="team-id"/> | 
					 | 
				
			||||||
                    </form> | 
					 | 
				
			||||||
                </div> | 
					 | 
				
			||||||
                <div class="content" id="org-team-members"> | 
					 | 
				
			||||||
                    <div class="member">  | 
					 | 
				
			||||||
                        <div class="avatar col-md-1"> | 
					 | 
				
			||||||
                            <img src="https://avatars3.githubusercontent.com/u/2142787?s=140" alt=""> | 
					 | 
				
			||||||
                        </div> | 
					 | 
				
			||||||
                        <div class="name col-md-4"> | 
					 | 
				
			||||||
                            <a href="#"><strong>fuxiaohei</strong><span class="nick">傅小黑</span></a> | 
					 | 
				
			||||||
                        </div> | 
					 | 
				
			||||||
                        <a class="remove btn btn-danger pull-right" href="#">Remove</a> | 
					 | 
				
			||||||
                    </div> | 
					 | 
				
			||||||
                </div> | 
					 | 
				
			||||||
                <!---------------------- for ?member or ?repo ----------> | 
					 | 
				
			||||||
                <div class="header"> | 
					 | 
				
			||||||
                    <div class="header-tab col-md-4"> | 
					 | 
				
			||||||
                        <div class="btn-group"> | 
					 | 
				
			||||||
                            <a class="btn btn-default" href="#">Members</a> | 
					 | 
				
			||||||
                            <a class="btn btn-primary" href="#">Repositories</a> | 
					 | 
				
			||||||
                        </div> | 
					 | 
				
			||||||
                    </div> | 
					 | 
				
			||||||
                    <form id="org-team-add-repo-form" action="url" class="col-md-4 pull-right open" method="post"> | 
					 | 
				
			||||||
                        <input type="text" class="form-control" name="repo" placeholder="add repository to teams" id="org-team-add-repo"/> | 
					 | 
				
			||||||
                        <div class="dropdown-menu"> | 
					 | 
				
			||||||
                            <ul class="list-unstyled"></ul> | 
					 | 
				
			||||||
                        </div> | 
					 | 
				
			||||||
                        <input type="hidden" name="team" value="team-id"/> | 
					 | 
				
			||||||
                    </form> | 
					 | 
				
			||||||
                </div> | 
					 | 
				
			||||||
                <div class="content" id="org-team-repos"> | 
					 | 
				
			||||||
                    <div class="repo"> | 
					 | 
				
			||||||
                        <a href="#" class="repo-name"><i class="fa fa-book"></i> repo-name</a> | 
					 | 
				
			||||||
                        <a class="remove btn btn-danger pull-right" href="#">Remove</a> | 
					 | 
				
			||||||
                    </div> | 
					 | 
				
			||||||
                </div> | 
					 | 
				
			||||||
            </div> | 
					 | 
				
			||||||
        </div> | 
					 | 
				
			||||||
    </div> | 
					 | 
				
			||||||
</div> | 
					 | 
				
			||||||
{{template "base/footer" .}} | 
					 | 
				
			||||||
					Loading…
					
					
				
		Reference in new issue