* Expose Restricted field for User * Add Option to Change Restricted on User via adminEditUser API * Add test who change restricted & test if it changed it ... * make generate-swagger Co-authored-by: zeripath <art27@cantab.net> Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>tags/v1.15.0-dev
@@ -192,4 +192,18 @@ func TestAPIEditUser(t *testing.T) { | |||||
errMap := make(map[string]interface{}) | errMap := make(map[string]interface{}) | ||||
json.Unmarshal(resp.Body.Bytes(), &errMap) | json.Unmarshal(resp.Body.Bytes(), &errMap) | ||||
assert.EqualValues(t, "email is not allowed to be empty string", errMap["message"].(string)) | assert.EqualValues(t, "email is not allowed to be empty string", errMap["message"].(string)) | ||||
user2 := models.AssertExistsAndLoadBean(t, &models.User{LoginName: "user2"}).(*models.User) | |||||
assert.Equal(t, false, user2.IsRestricted) | |||||
bTrue := true | |||||
req = NewRequestWithJSON(t, "PATCH", urlStr, api.EditUserOption{ | |||||
// required | |||||
LoginName: "user2", | |||||
SourceID: 0, | |||||
// to change | |||||
Restricted: &bTrue, | |||||
}) | |||||
session.MakeRequest(t, req, http.StatusOK) | |||||
user2 = models.AssertExistsAndLoadBean(t, &models.User{LoginName: "user2"}).(*models.User) | |||||
assert.Equal(t, true, user2.IsRestricted) | |||||
} | } |
@@ -17,12 +17,13 @@ func ToUser(user *models.User, signed, authed bool) *api.User { | |||||
return nil | return nil | ||||
} | } | ||||
result := &api.User{ | result := &api.User{ | ||||
ID: user.ID, | |||||
UserName: user.Name, | |||||
FullName: markup.Sanitize(user.FullName), | |||||
Email: user.GetEmail(), | |||||
AvatarURL: user.AvatarLink(), | |||||
Created: user.CreatedUnix.AsTime(), | |||||
ID: user.ID, | |||||
UserName: user.Name, | |||||
FullName: markup.Sanitize(user.FullName), | |||||
Email: user.GetEmail(), | |||||
AvatarURL: user.AvatarLink(), | |||||
Created: user.CreatedUnix.AsTime(), | |||||
Restricted: user.IsRestricted, | |||||
} | } | ||||
// hide primary email if API caller is anonymous or user keep email private | // hide primary email if API caller is anonymous or user keep email private | ||||
if signed && (!user.KeepEmailPrivate || authed) { | if signed && (!user.KeepEmailPrivate || authed) { | ||||
@@ -41,4 +41,5 @@ type EditUserOption struct { | |||||
MaxRepoCreation *int `json:"max_repo_creation"` | MaxRepoCreation *int `json:"max_repo_creation"` | ||||
ProhibitLogin *bool `json:"prohibit_login"` | ProhibitLogin *bool `json:"prohibit_login"` | ||||
AllowCreateOrganization *bool `json:"allow_create_organization"` | AllowCreateOrganization *bool `json:"allow_create_organization"` | ||||
Restricted *bool `json:"restricted"` | |||||
} | } |
@@ -30,6 +30,8 @@ type User struct { | |||||
LastLogin time.Time `json:"last_login,omitempty"` | LastLogin time.Time `json:"last_login,omitempty"` | ||||
// swagger:strfmt date-time | // swagger:strfmt date-time | ||||
Created time.Time `json:"created,omitempty"` | Created time.Time `json:"created,omitempty"` | ||||
// Is user restricted | |||||
Restricted bool `json:"restricted"` | |||||
} | } | ||||
// MarshalJSON implements the json.Marshaler interface for User, adding field(s) for backward compatibility | // MarshalJSON implements the json.Marshaler interface for User, adding field(s) for backward compatibility | ||||
@@ -224,6 +224,9 @@ func EditUser(ctx *context.APIContext) { | |||||
if form.ProhibitLogin != nil { | if form.ProhibitLogin != nil { | ||||
u.ProhibitLogin = *form.ProhibitLogin | u.ProhibitLogin = *form.ProhibitLogin | ||||
} | } | ||||
if form.Restricted != nil { | |||||
u.IsRestricted = *form.Restricted | |||||
} | |||||
if err := models.UpdateUser(u); err != nil { | if err := models.UpdateUser(u); err != nil { | ||||
if models.IsErrEmailAlreadyUsed(err) || models.IsErrEmailInvalid(err) { | if models.IsErrEmailAlreadyUsed(err) || models.IsErrEmailInvalid(err) { | ||||
@@ -13796,6 +13796,10 @@ | |||||
"type": "boolean", | "type": "boolean", | ||||
"x-go-name": "ProhibitLogin" | "x-go-name": "ProhibitLogin" | ||||
}, | }, | ||||
"restricted": { | |||||
"type": "boolean", | |||||
"x-go-name": "Restricted" | |||||
}, | |||||
"source_id": { | "source_id": { | ||||
"type": "integer", | "type": "integer", | ||||
"format": "int64", | "format": "int64", | ||||
@@ -16209,6 +16213,11 @@ | |||||
"description": "the user's username", | "description": "the user's username", | ||||
"type": "string", | "type": "string", | ||||
"x-go-name": "UserName" | "x-go-name": "UserName" | ||||
}, | |||||
"restricted": { | |||||
"description": "Is user restricted", | |||||
"type": "boolean", | |||||
"x-go-name": "Restricted" | |||||
} | } | ||||
}, | }, | ||||
"x-go-package": "code.gitea.io/gitea/modules/structs" | "x-go-package": "code.gitea.io/gitea/modules/structs" | ||||