Skip to content

Commit ef7a98b

Browse files
committed
improvements
1 parent ddd1e6c commit ef7a98b

File tree

9 files changed

+118
-46
lines changed

9 files changed

+118
-46
lines changed

models/user/user.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -955,6 +955,16 @@ func UpdateUserCols(ctx context.Context, u *User, cols ...string) error {
955955
return err
956956
}
957957

958+
// UpdateUserColsWithNoAutotime update user according special columns
959+
func UpdateUserColsWithNoAutotime(ctx context.Context, u *User, cols ...string) error {
960+
if err := ValidateUser(u, cols...); err != nil {
961+
return err
962+
}
963+
964+
_, err := db.GetEngine(ctx).ID(u.ID).Cols(cols...).NoAutoTime().Update(u)
965+
return err
966+
}
967+
958968
// GetInactiveUsers gets all inactive users
959969
func GetInactiveUsers(ctx context.Context, olderThan time.Duration) ([]*User, error) {
960970
cond := builder.And(

modules/structs/visible_type.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ func (vt VisibleType) IsPrivate() bool {
3939
return vt == VisibleTypePrivate
4040
}
4141

42+
func (vt VisibleType) IsValid() bool {
43+
return vt.String() != ""
44+
}
45+
4246
// VisibilityString provides the mode string of the visibility type (public, limited, private)
4347
func (vt VisibleType) String() string {
4448
for k, v := range VisibilityModes {
@@ -56,3 +60,10 @@ func ExtractKeysFromMapString(in map[string]VisibleType) (keys []string) {
5660
}
5761
return keys
5862
}
63+
64+
func ConvertStringToVisibleType(s string) VisibleType {
65+
if vt, ok := VisibilityModes[s]; ok {
66+
return vt
67+
}
68+
return VisibleType(-1) // Invalid type
69+
}

options/locale/locale_en-US.ini

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2826,6 +2826,14 @@ settings.location = Location
28262826
settings.permission = Permissions
28272827
settings.repoadminchangeteam = Repository admin can add and remove access for teams
28282828
settings.visibility = Visibility
2829+
settings.change_visibility = Change Visibility
2830+
settings.invalid_visibility = The new visibility is not valid.
2831+
settings.change_visibility_notices_1 = This operation <strong>CANNOT</strong> be undone.
2832+
settings.change_visibility_notices_2 = Some users will not visit the repositories of the orgniazation.
2833+
settings.change_visibility_no_change = The visibility is no change.
2834+
settings.change_visibility_failed = Change visibility of %s failed because of internal error
2835+
settings.change_visibility_success = Organization %s visibility has been changed successfully.
2836+
settings.visibility_desc = Changing the organisation visibility
28292837
settings.visibility.public = Public
28302838
settings.visibility.limited = Limited (Visible to authenticated users only)
28312839
settings.visibility.limited_shortname = Limited

routers/web/org/setting.go

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"code.gitea.io/gitea/modules/optional"
1818
repo_module "code.gitea.io/gitea/modules/repository"
1919
"code.gitea.io/gitea/modules/setting"
20+
"code.gitea.io/gitea/modules/structs"
2021
"code.gitea.io/gitea/modules/templates"
2122
"code.gitea.io/gitea/modules/util"
2223
"code.gitea.io/gitea/modules/web"
@@ -25,7 +26,6 @@ import (
2526
"code.gitea.io/gitea/services/context"
2627
"code.gitea.io/gitea/services/forms"
2728
org_service "code.gitea.io/gitea/services/org"
28-
repo_service "code.gitea.io/gitea/services/repository"
2929
user_service "code.gitea.io/gitea/services/user"
3030
)
3131

@@ -83,38 +83,17 @@ func SettingsPost(ctx *context.Context) {
8383
Description: optional.Some(form.Description),
8484
Website: optional.Some(form.Website),
8585
Location: optional.Some(form.Location),
86-
Visibility: optional.Some(form.Visibility),
8786
RepoAdminChangeTeamAccess: optional.Some(form.RepoAdminChangeTeamAccess),
8887
}
8988
if ctx.Doer.IsAdmin {
9089
opts.MaxRepoCreation = optional.Some(form.MaxRepoCreation)
9190
}
9291

93-
visibilityChanged := org.Visibility != form.Visibility
94-
9592
if err := user_service.UpdateUser(ctx, org.AsUser(), opts); err != nil {
9693
ctx.ServerError("UpdateUser", err)
9794
return
9895
}
9996

100-
// update forks visibility
101-
if visibilityChanged {
102-
repos, _, err := repo_model.GetUserRepositories(ctx, repo_model.SearchRepoOptions{
103-
Actor: org.AsUser(), Private: true, ListOptions: db.ListOptions{Page: 1, PageSize: org.NumRepos},
104-
})
105-
if err != nil {
106-
ctx.ServerError("GetRepositories", err)
107-
return
108-
}
109-
for _, repo := range repos {
110-
repo.OwnerName = org.Name
111-
if err := repo_service.UpdateRepository(ctx, repo, true); err != nil {
112-
ctx.ServerError("UpdateRepository", err)
113-
return
114-
}
115-
}
116-
}
117-
11897
log.Trace("Organization setting updated: %s", org.Name)
11998
ctx.Flash.Success(ctx.Tr("org.settings.update_setting_success"))
12099
ctx.Redirect(ctx.Org.OrgLink + "/settings")
@@ -251,3 +230,26 @@ func SettingsRenamePost(ctx *context.Context) {
251230
ctx.Flash.Success(ctx.Tr("org.settings.rename_success", oldOrgName, newOrgName))
252231
ctx.JSONRedirect(setting.AppSubURL + "/org/" + url.PathEscape(newOrgName) + "/settings")
253232
}
233+
234+
// SettingsChangeVisibilityPost response for change organization visibility
235+
func SettingsChangeVisibilityPost(ctx *context.Context) {
236+
visibility := structs.VisibleType(ctx.FormInt("visibility"))
237+
if !visibility.IsValid() {
238+
ctx.JSONError(ctx.Tr("org.settings.invalid_visibility"))
239+
return
240+
}
241+
242+
if ctx.Org.Organization.Visibility == visibility {
243+
ctx.JSONError(ctx.Tr("org.settings.change_visibility_no_change"))
244+
return
245+
}
246+
247+
if err := org_service.ChangeOrganizationVisibility(ctx, ctx.Org.Organization, visibility); err != nil {
248+
log.Error("ChangeOrganizationVisibility: %v", err)
249+
ctx.JSONError(util.Iif(ctx.Doer.IsAdmin, err.Error(), string(ctx.Tr("org.settings.change_visibility_failed", ctx.Org.Organization.Name))))
250+
return
251+
}
252+
253+
ctx.Flash.Success(ctx.Tr("org.settings.change_visibility_success", ctx.Org.Organization.Name))
254+
ctx.JSONRedirect(setting.AppSubURL + "/org/" + url.PathEscape(ctx.Org.Organization.Name) + "/settings")
255+
}

routers/web/web.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -966,6 +966,7 @@ func registerWebRoutes(m *web.Router) {
966966

967967
m.Post("/rename", web.Bind(forms.RenameOrgForm{}), org.SettingsRenamePost)
968968
m.Post("/delete", org.SettingsDeleteOrgPost)
969+
m.Post("/visibility", org.SettingsChangeVisibilityPost)
969970

970971
m.Group("/packages", func() {
971972
m.Get("", org.Packages)

services/forms/org.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ type UpdateOrgSettingForm struct {
4141
Description string `binding:"MaxSize(255)"`
4242
Website string `binding:"ValidUrl;MaxSize(255)"`
4343
Location string `binding:"MaxSize(50)"`
44-
Visibility structs.VisibleType
4544
MaxRepoCreation int
4645
RepoAdminChangeTeamAccess bool
4746
}

services/org/org.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
secret_model "code.gitea.io/gitea/models/secret"
1616
user_model "code.gitea.io/gitea/models/user"
1717
"code.gitea.io/gitea/modules/storage"
18+
"code.gitea.io/gitea/modules/structs"
1819
"code.gitea.io/gitea/modules/util"
1920
repo_service "code.gitea.io/gitea/services/repository"
2021
)
@@ -102,3 +103,14 @@ func DeleteOrganization(ctx context.Context, org *org_model.Organization, purge
102103

103104
return nil
104105
}
106+
107+
func ChangeOrganizationVisibility(ctx context.Context, org *org_model.Organization, visibility structs.VisibleType) error {
108+
if org.Visibility == visibility {
109+
return nil
110+
}
111+
112+
org.Visibility = visibility
113+
return db.WithTx(ctx, func(ctx context.Context) error {
114+
return user_model.UpdateUserColsWithNoAutotime(ctx, org.AsUser(), "visibility")
115+
})
116+
}

templates/org/settings/options.tmpl

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -29,29 +29,6 @@
2929
<input id="location" name="location" value="{{.Org.Location}}" maxlength="50">
3030
</div>
3131

32-
<div class="divider"></div>
33-
<div class="field" id="visibility_box">
34-
<label for="visibility">{{ctx.Locale.Tr "org.settings.visibility"}}</label>
35-
<div class="field">
36-
<div class="ui radio checkbox">
37-
<input class="enable-system-radio" name="visibility" type="radio" value="0" {{if eq .CurrentVisibility 0}}checked{{end}}>
38-
<label>{{ctx.Locale.Tr "org.settings.visibility.public"}}</label>
39-
</div>
40-
</div>
41-
<div class="field">
42-
<div class="ui radio checkbox">
43-
<input class="enable-system-radio" name="visibility" type="radio" value="1" {{if eq .CurrentVisibility 1}}checked{{end}}>
44-
<label>{{ctx.Locale.Tr "org.settings.visibility.limited"}}</label>
45-
</div>
46-
</div>
47-
<div class="field">
48-
<div class="ui radio checkbox">
49-
<input class="enable-system-radio" name="visibility" type="radio" value="2" {{if eq .CurrentVisibility 2}}checked{{end}}>
50-
<label>{{ctx.Locale.Tr "org.settings.visibility.private"}}</label>
51-
</div>
52-
</div>
53-
</div>
54-
5532
<div class="field" id="permission_box">
5633
<label>{{ctx.Locale.Tr "org.settings.permission"}}</label>
5734
<div class="field">

templates/org/settings/options_dangerzone.tmpl

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,16 @@
33
</h4>
44
<div class="ui attached error danger segment">
55
<div class="flex-list">
6+
<div class="flex-item tw-items-center">
7+
<div class="flex-item-main">
8+
<div class="flex-item-title">{{ctx.Locale.Tr "org.settings.visibility"}}</div>
9+
<div class="flex-item-body">{{ctx.Locale.Tr "org.settings.visibility_desc"}}</div>
10+
</div>
11+
<div class="flex-item-trailing">
12+
<button class="ui basic red show-modal button" data-modal="#change-visibility-org-modal">{{ctx.Locale.Tr "org.settings.change_visibility"}}</button>
13+
</div>
14+
</div>
15+
616
<div class="flex-item tw-items-center">
717
<div class="flex-item-main">
818
<div class="flex-item-title">{{ctx.Locale.Tr "org.settings.rename"}}</div>
@@ -25,6 +35,48 @@
2535
</div>
2636
</div>
2737

38+
<div class="ui small modal" id="change-visibility-org-modal">
39+
<div class="header">
40+
{{ctx.Locale.Tr "org.settings.change_visibility"}}
41+
</div>
42+
<div class="content">
43+
<ul class="ui warning message">
44+
<li>{{ctx.Locale.Tr "org.settings.change_visibility_notices_1"}}</li>
45+
<li>{{ctx.Locale.Tr "org.settings.change_visibility_notices_2"}}</li>
46+
</ul>
47+
<form class="ui form form-fetch-action" action="{{.Link}}/visibility" method="post">
48+
{{.CsrfTokenHtml}}
49+
50+
<div class="field" id="visibility_box">
51+
<label for="visibility">{{ctx.Locale.Tr "org.settings.visibility"}}</label>
52+
<div class="field">
53+
<div class="ui radio checkbox">
54+
<input class="enable-system-radio" name="visibility" type="radio" value="0" {{if eq .CurrentVisibility 0}}checked{{end}}>
55+
<label>{{ctx.Locale.Tr "org.settings.visibility.public"}}</label>
56+
</div>
57+
</div>
58+
<div class="field">
59+
<div class="ui radio checkbox">
60+
<input class="enable-system-radio" name="visibility" type="radio" value="1" {{if eq .CurrentVisibility 1}}checked{{end}}>
61+
<label>{{ctx.Locale.Tr "org.settings.visibility.limited"}}</label>
62+
</div>
63+
</div>
64+
<div class="field">
65+
<div class="ui radio checkbox">
66+
<input class="enable-system-radio" name="visibility" type="radio" value="2" {{if eq .CurrentVisibility 2}}checked{{end}}>
67+
<label>{{ctx.Locale.Tr "org.settings.visibility.private"}}</label>
68+
</div>
69+
</div>
70+
</div>
71+
72+
<div class="actions">
73+
<button class="ui cancel button">{{ctx.Locale.Tr "settings.cancel"}}</button>
74+
<button class="ui red button">{{ctx.Locale.Tr "org.settings.change_visibility"}}</button>
75+
</div>
76+
</form>
77+
</div>
78+
</div>
79+
2880
<div class="ui small modal" id="rename-org-modal">
2981
<div class="header">
3082
{{ctx.Locale.Tr "org.settings.rename"}}

0 commit comments

Comments
 (0)