diff --git a/models/user/user.go b/models/user/user.go index 3c72aa7cc4abb..9c0f505d7b00b 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -395,11 +395,19 @@ func (u *User) IsOrganization() bool { return u.Type == UserTypeOrganization } +func (u *User) IsReservedOrganization() bool { + return u.Type == UserTypeOrganizationReserved +} + // IsIndividual returns true if user is actually a individual user. func (u *User) IsIndividual() bool { return u.Type == UserTypeIndividual } +func (u *User) IsReservedIndividual() bool { + return u.Type == UserTypeUserReserved +} + // IsTypeBot returns whether the user is of type bot func (u *User) IsTypeBot() bool { return u.Type == UserTypeBot diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 1da2fb61ad41a..add06b653ea56 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -1010,7 +1010,7 @@ email_notifications.disable = Disable Email Notifications email_notifications.submit = Set Email Preference email_notifications.andyourown = And Your Own Notifications -visibility = User visibility +visibility = User Visibility visibility.public = Public visibility.public_tooltip = Visible to everyone visibility.limited = Limited @@ -1018,6 +1018,13 @@ visibility.limited_tooltip = Visible only to authenticated users visibility.private = Private visibility.private_tooltip = Visible only to members of organizations you have joined +user_type = User Type +user_type.individual = Individual +user_type.organization = Organization +user_type.reservedindividual = Reserved Individual +user_type.reservedorganization = Reserved Organization +user_type.bot = Bot + [repo] new_repo_helper = A repository contains all project files, including revision history. Already hosting one elsewhere? Migrate repository. owner = Owner diff --git a/routers/web/admin/users.go b/routers/web/admin/users.go index f6a3af1c866d4..26cac2b7b4ea7 100644 --- a/routers/web/admin/users.go +++ b/routers/web/admin/users.go @@ -440,6 +440,7 @@ func EditUserPost(ctx *context.Context) { IsRestricted: optional.Some(form.Restricted), Visibility: optional.Some(form.Visibility), Language: optional.Some(form.Language), + UserType: optional.Some(form.UserType), } if err := user_service.UpdateUser(ctx, u, opts); err != nil { diff --git a/services/forms/admin.go b/services/forms/admin.go index 81276f8f46f9c..a45a03f42bef2 100644 --- a/services/forms/admin.go +++ b/services/forms/admin.go @@ -52,6 +52,7 @@ type AdminEditUserForm struct { ProhibitLogin bool Reset2FA bool `form:"reset_2fa"` Visibility structs.VisibleType + UserType int } // Validate validates form fields diff --git a/services/user/update.go b/services/user/update.go index 4a39f4f783647..16c018638b511 100644 --- a/services/user/update.go +++ b/services/user/update.go @@ -36,6 +36,7 @@ type UpdateOptions struct { EmailNotificationsPreference optional.Option[string] SetLastLogin bool RepoAdminChangeTeamAccess optional.Option[bool] + UserType optional.Option[int] } func UpdateUser(ctx context.Context, u *user_model.User, opts *UpdateOptions) error { @@ -133,6 +134,10 @@ func UpdateUser(ctx context.Context, u *user_model.User, opts *UpdateOptions) er cols = append(cols, "keep_activity_private") } + if opts.UserType.Has() { + u.Type = user_model.UserType(opts.UserType.Value()) + cols = append(cols, "type") + } if opts.AllowCreateOrganization.Has() { u.AllowCreateOrganization = opts.AllowCreateOrganization.Value() diff --git a/templates/admin/user/edit.tmpl b/templates/admin/user/edit.tmpl index c04d332660677..e7b46664d45bb 100644 --- a/templates/admin/user/edit.tmpl +++ b/templates/admin/user/edit.tmpl @@ -53,6 +53,28 @@ +
+ + +
+
diff --git a/templates/admin/user/view_details.tmpl b/templates/admin/user/view_details.tmpl index db61bc9359757..5af14ab31b23a 100644 --- a/templates/admin/user/view_details.tmpl +++ b/templates/admin/user/view_details.tmpl @@ -29,6 +29,14 @@ {{ctx.Locale.Tr "admin.users.restricted"}}: {{svg (Iif .User.IsRestricted "octicon-check" "octicon-x")}}
+
+ {{ctx.Locale.Tr "settings.user_type"}}: + {{if .User.IsIndividual}}{{ctx.Locale.Tr "settings.user_type.individual"}}{{end}} + {{if .User.IsOrganization}}{{ctx.Locale.Tr "settings.user_type.organization"}}{{end}} + {{if .User.IsReservedIndividual}}{{ctx.Locale.Tr "settings.user_type.reservedindividual"}}{{end}} + {{if .User.IsReservedOrganization}}{{ctx.Locale.Tr "settings.user_type.reservedorganization"}}{{end}} + {{if .User.IsTypeBot}}{{ctx.Locale.Tr "settings.user_type.bot"}}{{end}} +
{{ctx.Locale.Tr "settings.visibility"}}: {{if .User.Visibility.IsPublic}}{{ctx.Locale.Tr "settings.visibility.public"}}{{end}}