@ -0,0 +1,55 @@ | |||
// 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 middleware | |||
import ( | |||
"github.com/Unknwon/macaron" | |||
"github.com/gogits/gogs/models" | |||
) | |||
func OrgAssignment(redirect bool, args ...bool) macaron.Handler { | |||
return func(ctx *Context) { | |||
var ( | |||
requireMember bool | |||
requireOwner bool | |||
) | |||
if len(args) >= 1 { | |||
requireMember = args[0] | |||
} | |||
if len(args) >= 2 { | |||
requireOwner = args[1] | |||
} | |||
orgName := ctx.Params(":org") | |||
var err error | |||
ctx.Org.Organization, err = models.GetUserByName(orgName) | |||
if err != nil { | |||
if err == models.ErrUserNotExist { | |||
ctx.Handle(404, "GetUserByName", err) | |||
} else if redirect { | |||
ctx.Redirect("/") | |||
} else { | |||
ctx.Handle(500, "GetUserByName", err) | |||
} | |||
return | |||
} | |||
ctx.Data["Org"] = ctx.Org.Organization | |||
if ctx.IsSigned { | |||
ctx.Org.IsOwner = ctx.Org.Organization.IsOrgOwner(ctx.User.Id) | |||
if ctx.Org.IsOwner { | |||
ctx.Org.IsMember = true | |||
} else { | |||
ctx.Org.IsMember = ctx.Org.Organization.IsOrgMember(ctx.User.Id) | |||
} | |||
} | |||
if (requireMember && !ctx.Org.IsMember) || (requireOwner && !ctx.Org.IsOwner) { | |||
ctx.Handle(404, "OrgAssignment", err) | |||
return | |||
} | |||
} | |||
} |
@ -0,0 +1,99 @@ | |||
// 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 org | |||
import ( | |||
"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 ( | |||
SETTINGS_OPTIONS base.TplName = "org/settings/options" | |||
SETTINGS_DELETE base.TplName = "org/settings/delete" | |||
) | |||
func Settings(ctx *middleware.Context) { | |||
ctx.Data["Title"] = ctx.Tr("org.settings") | |||
ctx.Data["PageIsSettingsOptions"] = true | |||
ctx.HTML(200, SETTINGS_OPTIONS) | |||
} | |||
func SettingsPost(ctx *middleware.Context, form auth.UpdateOrgSettingForm) { | |||
ctx.Data["Title"] = ctx.Tr("org.settings") | |||
ctx.Data["PageIsSettingsOptions"] = true | |||
if ctx.HasError() { | |||
ctx.HTML(200, SETTINGS_OPTIONS) | |||
return | |||
} | |||
org := ctx.Org.Organization | |||
// Check if organization name has been changed. | |||
if org.Name != form.OrgUserName { | |||
isExist, err := models.IsUserExist(form.OrgUserName) | |||
if err != nil { | |||
ctx.Handle(500, "IsUserExist", err) | |||
return | |||
} else if isExist { | |||
ctx.RenderWithErr(ctx.Tr("form.username_been_taken"), SETTINGS_OPTIONS, &form) | |||
return | |||
} else if err = models.ChangeUserName(org, form.OrgUserName); err != nil { | |||
if err == models.ErrUserNameIllegal { | |||
ctx.Flash.Error(ctx.Tr("form.illegal_username")) | |||
ctx.Redirect("/org/" + org.LowerName + "/settings") | |||
return | |||
} else { | |||
ctx.Handle(500, "ChangeUserName", err) | |||
} | |||
return | |||
} | |||
log.Trace("Organization name changed: %s -> %s", org.Name, form.OrgUserName) | |||
org.Name = form.OrgUserName | |||
} | |||
org.FullName = form.OrgFullName | |||
org.Email = form.Email | |||
org.Description = form.Description | |||
org.Website = form.Website | |||
org.Location = form.Location | |||
org.Avatar = base.EncodeMd5(form.Avatar) | |||
org.AvatarEmail = form.Avatar | |||
if err := models.UpdateUser(org); err != nil { | |||
ctx.Handle(500, "UpdateUser", err) | |||
return | |||
} | |||
log.Trace("Organization setting updated: %s", org.Name) | |||
ctx.Flash.Success(ctx.Tr("org.settings.update_setting_success")) | |||
ctx.Redirect("/org/" + org.Name + "/settings") | |||
} | |||
func SettingsDelete(ctx *middleware.Context) { | |||
ctx.Data["Title"] = ctx.Tr("org.settings") | |||
ctx.Data["PageIsSettingsDelete"] = true | |||
org := ctx.Org.Organization | |||
if ctx.Req.Method == "POST" { | |||
// TODO: validate password. | |||
if err := models.DeleteOrganization(org); err != nil { | |||
switch err { | |||
case models.ErrUserOwnRepos: | |||
ctx.Flash.Error(ctx.Tr("form.org_still_own_repo")) | |||
ctx.Redirect("/org/" + org.LowerName + "/settings/delete") | |||
default: | |||
ctx.Handle(500, "DeleteOrganization", err) | |||
} | |||
} else { | |||
log.Trace("Organization deleted: %s", ctx.User.Name) | |||
ctx.Redirect("/") | |||
} | |||
return | |||
} | |||
ctx.HTML(200, SETTINGS_DELETE) | |||
} |
@ -1 +1 @@ | |||
0.4.7.0810 Alpha | |||
0.4.7.0814 Alpha |
@ -0,0 +1,28 @@ | |||
{{template "ng/base/head" .}} | |||
{{template "ng/base/header" .}} | |||
<div id="setting-wrapper" class="main-wrapper"> | |||
<div id="org-setting" class="container clear"> | |||
{{template "org/settings/nav" .}} | |||
<div class="grid-4-5 left"> | |||
<div class="setting-content"> | |||
{{template "ng/base/alert" .}} | |||
<div id="setting-content"> | |||
<div id="user-profile-setting-content" class="panel panel-warning panel-radius"> | |||
<p class="panel-header"><strong>{{.i18n.Tr "org.settings.delete_account"}}</strong></p> | |||
<div class="panel-body panel-content"> | |||
<span class="alert alert-red alert-radius block"><i class="octicon octicon-alert"></i>{{.i18n.Tr "org.settings.delete_prompt" | Str2html}}</span> | |||
<form action="/org/{{.Org.LowerName}}/settings/delete" method="post"> | |||
{{.CsrfTokenHtml}} | |||
<p class="field"> | |||
<span class="form-label"></span> | |||
<button class="btn btn-red btn-large btn-radius" id="delete-org-button">{{.i18n.Tr "org.settings.confirm_delete_account"}}</button> | |||
</p> | |||
</form> | |||
</div> | |||
</div> | |||
</div> | |||
</div> | |||
</div> | |||
</div> | |||
</div> | |||
{{template "ng/base/footer" .}} |
@ -0,0 +1,11 @@ | |||
<div id="setting-menu" class="grid-1-5 panel panel-radius left"> | |||
<div class="panel-header"> | |||
<strong>{{.i18n.Tr "org.settings"}}</strong> | |||
</div> | |||
<div class="panel-body"> | |||
<ul class="menu menu-vertical switching-list grid-1-5 left"> | |||
<li {{if .PageIsSettingsOptions}}class="current"{{end}}><a href="/org/{{.Org.LowerName}}/settings">{{.i18n.Tr "org.settings.options"}}</a></li> | |||
<li {{if .PageIsSettingsDelete}}class="current"{{end}}><a href="/org/{{.Org.LowerName}}/settings/delete">{{.i18n.Tr "org.settings.delete"}}</a></li> | |||
</ul> | |||
</div> | |||
</div> |
@ -0,0 +1,56 @@ | |||
{{template "ng/base/head" .}} | |||
{{template "ng/base/header" .}} | |||
<div id="setting-wrapper" class="main-wrapper"> | |||
<div id="org-setting" class="container clear"> | |||
{{template "org/settings/nav" .}} | |||
<div class="grid-4-5 left"> | |||
<div class="setting-content"> | |||
{{template "ng/base/alert" .}} | |||
<div id="setting-content"> | |||
<div id="user-profile-setting-content" class="panel panel-radius"> | |||
<div class="panel-header"> | |||
<strong>{{.i18n.Tr "org.settings.options"}}</strong> | |||
</div> | |||
<form class="form form-align panel-body" id="org-setting-form" action="/org/{{.Org.LowerName}}/settings" method="post"> | |||
{{.CsrfTokenHtml}} | |||
<input type="hidden" name="action" value="update"> | |||
<div class="field"> | |||
<label class="req" for="orgname">{{.i18n.Tr "username"}}</label> | |||
<input class="ipt ipt-large ipt-radius {{if .Err_UserName}}ipt-error{{end}}" id="orgname" name="uname" value="{{.Org.Name}}" data-orgname="{{.Org.Name}}" required /> | |||
</div> | |||
<div class="field"> | |||
<label for="full-name">{{.i18n.Tr "org.settings.full_name"}}</label> | |||
<input class="ipt ipt-large ipt-radius {{if .Err_FullName}}ipt-error{{end}}" id="full-name" name="fullname" value="{{.Org.FullName}}" /> | |||
</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="{{.Org.Email}}" required /> | |||
</div> | |||
<div class="field clear"> | |||
<label class="left" for="desc">{{.i18n.Tr "org.org_desc"}}</label> | |||
<textarea class="ipt ipt-large ipt-radius {{if .Err_Description}}ipt-error{{end}}" id="desc" name="desc">{{.Org.Description}}</textarea> | |||
</div> | |||
<div class="field"> | |||
<label for="website">{{.i18n.Tr "org.settings.website"}}</label> | |||
<input class="ipt ipt-large ipt-radius {{if .Err_Website}}ipt-error{{end}}" id="website" name="website" type="url" value="{{.Org.Website}}" /> | |||
</div> | |||
<div class="field"> | |||
<label for="location">{{.i18n.Tr "org.settings.location"}}</label> | |||
<input class="ipt ipt-large ipt-radius {{if .Err_Location}}ipt-error{{end}}" id="location" name="location" type="text" value="{{.Org.Location}}" /> | |||
</div> | |||
<div class="field"> | |||
<label for="gravatar-email">Gravatar {{.i18n.Tr "email"}}</label> | |||
<input class="ipt ipt-large ipt-radius {{if .Err_Avatar}}ipt-error{{end}}" id="gravatar-email" name="avatar" type="text" value="{{.Org.AvatarEmail}}" /> | |||
</div> | |||
<div class="field"> | |||
<span class="form-label"></span> | |||
<button class="btn btn-green btn-large btn-radius">{{.i18n.Tr "org.settings.update_settings"}}</button> | |||
</div> | |||
</form> | |||
</div> | |||
</div> | |||
</div> | |||
</div> | |||
</div> | |||
</div> | |||
{{template "ng/base/footer" .}} |