feat(web): Add org removal functionality to admin user details page (#38013)

Signed-off-by: techknowlogick <techknowlogick@gitea.com>
Signed-off-by: Karthik Bhandary <34509856+karthikbhandary2@users.noreply.github.com>
Co-authored-by: techknowlogick <techknowlogick@gitea.com>
Co-authored-by: bircni <bircni@icloud.com>
Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
This commit is contained in:
Karthik Bhandary
2026-08-29 07:50:04 +00:00
committed by GitHub
co-authored by techknowlogick bircni wxiaoguang
parent 3c0bfe9463
commit 88974d2db9
7 changed files with 189 additions and 19 deletions
+61 -9
View File
@@ -21,7 +21,6 @@ import (
"gitea.dev/modules/log"
"gitea.dev/modules/optional"
"gitea.dev/modules/setting"
"gitea.dev/modules/structs"
"gitea.dev/modules/templates"
"gitea.dev/modules/web"
"gitea.dev/routers/web/explore"
@@ -30,6 +29,7 @@ import (
"gitea.dev/services/context"
"gitea.dev/services/forms"
"gitea.dev/services/mailer"
org_service "gitea.dev/services/org"
user_service "gitea.dev/services/user"
)
@@ -293,19 +293,12 @@ func ViewUser(ctx *context.Context) {
ctx.Data["Emails"] = emails
ctx.Data["EmailsTotal"] = len(emails)
orgs, err := db.Find[org_model.Organization](ctx, org_model.FindOrgOptions{
ListOptions: db.ListOptionsAll,
UserID: u.ID,
IncludeVisibility: structs.VisibleTypePrivate,
})
ctx.Data["UserOrgs"], err = org_model.GetUserOrganizations(ctx, u.ID)
if err != nil {
ctx.ServerError("FindOrgs", err)
return
}
ctx.Data["Users"] = orgs // needed to be able to use explore/user_list template
ctx.Data["OrgsTotal"] = len(orgs)
ctx.HTML(http.StatusOK, tplUserView)
}
@@ -518,6 +511,65 @@ func DeleteUser(ctx *context.Context) {
ctx.Redirect(setting.AppSubURL + "/-/admin/users")
}
func RemoveUserFromOrg(ctx *context.Context) {
u := prepareUserInfo(ctx)
if ctx.Written() {
return
}
orgID := ctx.PathParamInt64("org_id")
org, err := org_model.GetOrgByID(ctx, orgID)
if err != nil {
ctx.ServerError("GetOrgByID", err)
return
}
err = org_service.RemoveOrgUser(ctx, org, u)
if org_model.IsErrLastOrgOwner(err) {
ctx.Flash.Error(ctx.Tr("form.last_org_owner"))
ctx.JSONRedirect("")
return
} else if err != nil {
ctx.ServerError("RemoveOrgUser", err)
return
}
ctx.Flash.Success(ctx.Tr("admin.users.org_removed", org.Name))
ctx.JSONRedirect("")
}
func RemoveUserFromAllOrgs(ctx *context.Context) {
u := prepareUserInfo(ctx)
if ctx.Written() {
return
}
orgs, err := org_model.GetUserOrganizations(ctx, u.ID)
if err != nil {
ctx.ServerError("GetUserOrganizations", err)
return
}
removedCount := 0
for i := range orgs {
err = org_service.RemoveOrgUser(ctx, orgs[i], u)
if org_model.IsErrLastOrgOwner(err) {
continue
} else if err != nil {
log.Error("Failed to remove user %s from org %s: %v", u.Name, orgs[i].Name, err)
continue
}
removedCount++
}
if removedCount < len(orgs) {
ctx.Flash.Warning(ctx.Tr("admin.users.some_orgs_removed", removedCount, len(orgs)))
} else {
ctx.Flash.Success(ctx.Tr("admin.users.all_orgs_removed"))
}
ctx.JSONRedirect("")
}
// AvatarPost response for change user's avatar request
func AvatarPost(ctx *context.Context) {
u := prepareUserInfo(ctx)