]> source.dussan.org Git - gitea.git/commitdiff
Allow admins to change user avatars (#17661)
authorqwerty287 <80460567+qwerty287@users.noreply.github.com>
Tue, 16 Nov 2021 19:13:13 +0000 (20:13 +0100)
committerGitHub <noreply@github.com>
Tue, 16 Nov 2021 19:13:13 +0000 (19:13 +0000)
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>
options/locale/locale_en-US.ini
routers/web/admin/users.go
routers/web/web.go
templates/admin/user/edit.tmpl

index c39063e46e7529b329e424ee2f93cc0467630916..062ce029323e93f1263116906e52b8d7f49f2457 100644 (file)
@@ -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
index 8bafd1f19c343279c222c2978e3389c873de1e81..93e59893e96df08a94ffce5e5c2d18ceb6ed8ae0 100644 (file)
@@ -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))
+}
index a20bf484b3d4e61ede0b2c58aaa2d2ec5b1b3c41..132e649d45d24082cecdeeee13217336e042c38d 100644 (file)
@@ -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() {
index fb0ccd22bb5f8e41b092c7e62d0a9b548aafa037..9475a0cce645c53c9eb56d6d42f19c01094b7ef2 100644 (file)
                                </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>