aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorqwerty287 <80460567+qwerty287@users.noreply.github.com>2021-11-16 20:13:13 +0100
committerGitHub <noreply@github.com>2021-11-16 19:13:13 +0000
commit3be156f66a9682d698fe1191a7dd1016270873ab (patch)
tree55a17870cdfe1fa037a9b2d42836f1ae871debda
parentbbffcc3aecda040a40d49078e7141213bc8d78af (diff)
downloadgitea-3be156f66a9682d698fe1191a7dd1016270873ab.tar.gz
gitea-3be156f66a9682d698fe1191a7dd1016270873ab.zip
Allow admins to change user avatars (#17661)
Adds the avatar change panel to the edit user page (bottom) and allows admins to change it this way Co-authored-by: Gusted <williamzijl7@hotmail.com> Co-authored-by: zeripath <art27@cantab.net>
-rw-r--r--options/locale/locale_en-US.ini1
-rw-r--r--routers/web/admin/users.go31
-rw-r--r--routers/web/web.go2
-rw-r--r--templates/admin/user/edit.tmpl38
4 files changed, 72 insertions, 0 deletions
diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini
index c39063e46e..062ce02932 100644
--- a/options/locale/locale_en-US.ini
+++ b/options/locale/locale_en-US.ini
@@ -545,6 +545,7 @@ delete_current_avatar = Delete Current Avatar
uploaded_avatar_not_a_image = The uploaded file is not an image.
uploaded_avatar_is_too_big = The uploaded file has exceeded the maximum size.
update_avatar_success = Your avatar has been updated.
+update_user_avatar_success = The user's avatar has been updated.
change_password = Update Password
old_password = Current Password
diff --git a/routers/web/admin/users.go b/routers/web/admin/users.go
index 8bafd1f19c..93e59893e9 100644
--- a/routers/web/admin/users.go
+++ b/routers/web/admin/users.go
@@ -401,3 +401,34 @@ func DeleteUser(ctx *context.Context) {
"redirect": setting.AppSubURL + "/admin/users",
})
}
+
+// AvatarPost response for change user's avatar request
+func AvatarPost(ctx *context.Context) {
+ u := prepareUserInfo(ctx)
+ if ctx.Written() {
+ return
+ }
+
+ form := web.GetForm(ctx).(*forms.AvatarForm)
+ if err := router_user_setting.UpdateAvatarSetting(ctx, form, u); err != nil {
+ ctx.Flash.Error(err.Error())
+ } else {
+ ctx.Flash.Success(ctx.Tr("settings.update_user_avatar_success"))
+ }
+
+ ctx.Redirect(setting.AppSubURL + "/admin/users/" + strconv.FormatInt(u.ID, 10))
+}
+
+// DeleteAvatar render delete avatar page
+func DeleteAvatar(ctx *context.Context) {
+ u := prepareUserInfo(ctx)
+ if ctx.Written() {
+ return
+ }
+
+ if err := u.DeleteAvatar(); err != nil {
+ ctx.Flash.Error(err.Error())
+ }
+
+ ctx.Redirect(setting.AppSubURL + "/admin/users/" + strconv.FormatInt(u.ID, 10))
+}
diff --git a/routers/web/web.go b/routers/web/web.go
index a20bf484b3..132e649d45 100644
--- a/routers/web/web.go
+++ b/routers/web/web.go
@@ -408,6 +408,8 @@ func RegisterRoutes(m *web.Route) {
m.Combo("/new").Get(admin.NewUser).Post(bindIgnErr(forms.AdminCreateUserForm{}), admin.NewUserPost)
m.Combo("/{userid}").Get(admin.EditUser).Post(bindIgnErr(forms.AdminEditUserForm{}), admin.EditUserPost)
m.Post("/{userid}/delete", admin.DeleteUser)
+ m.Post("/{userid}/avatar", bindIgnErr(forms.AvatarForm{}), admin.AvatarPost)
+ m.Post("/{userid}/avatar/delete", admin.DeleteAvatar)
})
m.Group("/emails", func() {
diff --git a/templates/admin/user/edit.tmpl b/templates/admin/user/edit.tmpl
index fb0ccd22bb..9475a0cce6 100644
--- a/templates/admin/user/edit.tmpl
+++ b/templates/admin/user/edit.tmpl
@@ -155,6 +155,44 @@
</div>
</form>
</div>
+
+ <h4 class="ui top attached header">
+ {{.i18n.Tr "settings.avatar"}}
+ </h4>
+ <div class="ui attached segment">
+ <form class="ui form" action="{{.Link}}/avatar" method="post" enctype="multipart/form-data">
+ {{.CsrfTokenHtml}}
+ {{if not DisableGravatar}}
+ <div class="inline field">
+ <div class="ui radio checkbox">
+ <input name="source" value="lookup" type="radio" {{if not .User.UseCustomAvatar}}checked{{end}}>
+ <label>{{.i18n.Tr "settings.lookup_avatar_by_mail"}}</label>
+ </div>
+ </div>
+ <div class="field {{if .Err_Gravatar}}error{{end}}">
+ <label for="gravatar">Avatar {{.i18n.Tr "email"}}</label>
+ <input id="gravatar" name="gravatar" value="{{.User.AvatarEmail}}" />
+ </div>
+ {{end}}
+
+ <div class="inline field">
+ <div class="ui radio checkbox">
+ <input name="source" value="local" type="radio" {{if .User.UseCustomAvatar}}checked{{end}}>
+ <label>{{.i18n.Tr "settings.enable_custom_avatar"}}</label>
+ </div>
+ </div>
+
+ <div class="inline field">
+ <label for="avatar">{{.i18n.Tr "settings.choose_new_avatar"}}</label>
+ <input name="avatar" type="file" >
+ </div>
+
+ <div class="field">
+ <button class="ui green button">{{$.i18n.Tr "settings.update_avatar"}}</button>
+ <a class="ui red button delete-post" data-request-url="{{.Link}}/avatar/delete" data-done-url="{{.Link}}">{{$.i18n.Tr "settings.delete_current_avatar"}}</a>
+ </div>
+ </form>
+ </div>
</div>
</div>