Skip to content

Commit ae3627f

Browse files
committed
clarify HasOrgProfileReadme vs HasUserProfileReadme, fix tests
1 parent 93e7a01 commit ae3627f

File tree

9 files changed

+82
-84
lines changed

9 files changed

+82
-84
lines changed

routers/web/org/home.go

Lines changed: 37 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"code.gitea.io/gitea/models/organization"
1313
"code.gitea.io/gitea/models/renderhelper"
1414
repo_model "code.gitea.io/gitea/models/repo"
15+
"code.gitea.io/gitea/modules/git"
1516
"code.gitea.io/gitea/modules/log"
1617
"code.gitea.io/gitea/modules/markup/markdown"
1718
"code.gitea.io/gitea/modules/setting"
@@ -21,9 +22,7 @@ import (
2122
"code.gitea.io/gitea/services/context"
2223
)
2324

24-
const (
25-
tplOrgHome templates.TplName = "org/home"
26-
)
25+
const tplOrgHome templates.TplName = "org/home"
2726

2827
// Home show organization home page
2928
func Home(ctx *context.Context) {
@@ -110,29 +109,13 @@ func home(ctx *context.Context, viewRepositories bool) {
110109
ctx.Data["DisableNewPullMirrors"] = setting.Mirror.DisableNewPull
111110
ctx.Data["ShowMemberAndTeamTab"] = ctx.Org.IsMember || len(members) > 0
112111

113-
err = shared_user.RenderOrgHeader(ctx)
112+
prepareResult, err := shared_user.PrepareOrgHeader(ctx)
114113
if err != nil {
115-
ctx.ServerError("RenderOrgHeader", err)
114+
ctx.ServerError("PrepareOrgHeader", err)
116115
return
117116
}
118-
isBothProfilesExist := ctx.Data["HasPublicProfileReadme"] == true && ctx.Data["HasPrivateProfileReadme"] == true
119-
120-
isViewerMember := ctx.FormString("view_as")
121-
ctx.Data["IsViewerMember"] = isViewerMember == "member"
122117

123-
viewAsPrivate := isViewerMember == "member"
124-
125-
if !isBothProfilesExist {
126-
if !prepareOrgProfileReadme(ctx, prepareOrgProfileReadmeOptions{viewRepositories: viewRepositories}) {
127-
if !prepareOrgProfileReadme(ctx, prepareOrgProfileReadmeOptions{viewRepositories: viewRepositories, viewAsPrivate: true}) {
128-
ctx.Data["PageIsViewRepositories"] = true
129-
}
130-
}
131-
} else {
132-
if !prepareOrgProfileReadme(ctx, prepareOrgProfileReadmeOptions{viewRepositories: viewRepositories, viewAsPrivate: viewAsPrivate}) {
133-
ctx.Data["PageIsViewRepositories"] = true
134-
}
135-
}
118+
ctx.Data["HasPrivateProfileReadme"] = viewRepositories || !prepareOrgProfileReadme(ctx, prepareResult)
136119

137120
var (
138121
repos []*repo_model.Repository
@@ -171,36 +154,45 @@ func home(ctx *context.Context, viewRepositories bool) {
171154
ctx.HTML(http.StatusOK, tplOrgHome)
172155
}
173156

174-
type prepareOrgProfileReadmeOptions struct {
175-
viewRepositories bool
176-
viewAsPrivate bool
177-
}
178-
179-
func prepareOrgProfileReadme(ctx *context.Context, opts prepareOrgProfileReadmeOptions) bool {
180-
profileRepoName := util.Iif(opts.viewAsPrivate, shared_user.RepoNameProfilePrivate, shared_user.RepoNameProfile)
181-
profileDbRepo, profileReadme := shared_user.FindOwnerProfileReadme(ctx, ctx.Doer, profileRepoName)
157+
func prepareOrgProfileReadme(ctx *context.Context, prepareResult *shared_user.PrepareOrgHeaderResult) bool {
158+
viewAs := ctx.FormString("view_as")
159+
viewAsMember := viewAs == "member"
182160

183-
if opts.viewAsPrivate {
184-
ctx.Data["HasPrivateProfileReadme"] = profileReadme != nil
161+
var profileRepo *repo_model.Repository
162+
var readmeBlob *git.Blob
163+
if viewAsMember {
164+
if prepareResult.ProfilePrivateReadmeBlob != nil {
165+
profileRepo, readmeBlob = prepareResult.ProfilePrivateRepo, prepareResult.ProfilePrivateReadmeBlob
166+
} else {
167+
profileRepo, readmeBlob = prepareResult.ProfilePublicRepo, prepareResult.ProfilePublicReadmeBlob
168+
viewAsMember = false
169+
}
185170
} else {
186-
ctx.Data["HasPublicProfileReadme"] = profileReadme != nil
171+
if prepareResult.ProfilePublicReadmeBlob != nil {
172+
profileRepo, readmeBlob = prepareResult.ProfilePublicRepo, prepareResult.ProfilePublicReadmeBlob
173+
} else {
174+
profileRepo, readmeBlob = prepareResult.ProfilePrivateRepo, prepareResult.ProfilePrivateReadmeBlob
175+
viewAsMember = true
176+
}
177+
}
178+
if readmeBlob == nil {
179+
return false
187180
}
188181

189-
if profileReadme == nil || opts.viewRepositories {
182+
readmeBytes, err := readmeBlob.GetBlobContent(setting.UI.MaxDisplayFileSize)
183+
if err != nil {
184+
log.Error("failed to GetBlobContent for %q profile (view as %q) readme: %v", ctx.ContextUser.Name, viewAs, err)
190185
return false
191186
}
192187

193-
if bytes, err := profileReadme.GetBlobContent(setting.UI.MaxDisplayFileSize); err != nil {
194-
log.Error("failed to GetBlobContent for %s profile readme: %v", profileRepoName, err)
195-
} else {
196-
rctx := renderhelper.NewRenderContextRepoFile(ctx, profileDbRepo, renderhelper.RepoFileOptions{
197-
CurrentRefPath: path.Join("branch", util.PathEscapeSegments(profileDbRepo.DefaultBranch)),
198-
})
199-
if profileContent, err := markdown.RenderString(rctx, bytes); err != nil {
200-
log.Error("failed to RenderString for %s profile readme: %v", profileRepoName, err)
201-
} else {
202-
ctx.Data["ProfileReadmeContent"] = profileContent
203-
}
188+
rctx := renderhelper.NewRenderContextRepoFile(ctx, profileRepo, renderhelper.RepoFileOptions{
189+
CurrentRefPath: path.Join("branch", util.PathEscapeSegments(profileRepo.DefaultBranch)),
190+
})
191+
ctx.Data["ProfileReadmeContent"], err = markdown.RenderString(rctx, readmeBytes)
192+
if err != nil {
193+
log.Error("failed to GetBlobContent for %q profile (view as %q) readme: %v", ctx.ContextUser.Name, viewAs, err)
194+
return false
204195
}
196+
ctx.Data["IsViewingOrgAsMember"] = viewAsMember
205197
return true
206198
}

routers/web/org/members.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,9 @@ func Members(ctx *context.Context) {
5454
return
5555
}
5656

57-
err = shared_user.RenderOrgHeader(ctx)
57+
_, err = shared_user.PrepareOrgHeader(ctx)
5858
if err != nil {
59-
ctx.ServerError("RenderOrgHeader", err)
59+
ctx.ServerError("PrepareOrgHeader", err)
6060
return
6161
}
6262

routers/web/org/teams.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,9 @@ func Teams(ctx *context.Context) {
5858
}
5959
ctx.Data["Teams"] = ctx.Org.Teams
6060

61-
err := shared_user.RenderOrgHeader(ctx)
61+
_, err := shared_user.PrepareOrgHeader(ctx)
6262
if err != nil {
63-
ctx.ServerError("RenderOrgHeader", err)
63+
ctx.ServerError("PrepareOrgHeader", err)
6464
return
6565
}
6666

routers/web/shared/user/header.go

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ func RenderUserHeader(ctx *context.Context) {
142142
prepareContextForCommonProfile(ctx)
143143

144144
_, profileReadmeBlob := FindOwnerProfileReadme(ctx, ctx.Doer)
145-
ctx.Data["HasPublicProfileReadme"] = profileReadmeBlob != nil
145+
ctx.Data["HasUserProfileReadme"] = profileReadmeBlob != nil
146146
}
147147

148148
func LoadHeaderCount(ctx *context.Context) error {
@@ -184,18 +184,24 @@ const (
184184
RepoNameProfile = ".profile"
185185
)
186186

187-
func RenderOrgHeader(ctx *context.Context) error {
188-
if err := LoadHeaderCount(ctx); err != nil {
189-
return err
190-
}
191-
192-
// FIXME: only do database query, do not open it
193-
_, profileReadmeBlob := FindOwnerProfileReadme(ctx, ctx.Doer)
194-
ctx.Data["HasPublicProfileReadme"] = profileReadmeBlob != nil
187+
type PrepareOrgHeaderResult struct {
188+
ProfilePublicRepo *repo_model.Repository
189+
ProfilePublicReadmeBlob *git.Blob
190+
ProfilePrivateRepo *repo_model.Repository
191+
ProfilePrivateReadmeBlob *git.Blob
192+
HasOrgProfileReadme bool
193+
}
195194

196-
// FIXME: only do database query, do not open it
197-
_, profileReadmeBlob = FindOwnerProfileReadme(ctx, ctx.Doer, RepoNameProfilePrivate)
198-
ctx.Data["HasPrivateProfileReadme"] = profileReadmeBlob != nil
195+
func PrepareOrgHeader(ctx *context.Context) (result *PrepareOrgHeaderResult, err error) {
196+
if err = LoadHeaderCount(ctx); err != nil {
197+
return nil, err
198+
}
199199

200-
return nil
200+
result = &PrepareOrgHeaderResult{}
201+
result.ProfilePublicRepo, result.ProfilePublicReadmeBlob = FindOwnerProfileReadme(ctx, ctx.Doer)
202+
result.ProfilePrivateRepo, result.ProfilePrivateReadmeBlob = FindOwnerProfileReadme(ctx, ctx.Doer, RepoNameProfilePrivate)
203+
result.HasOrgProfileReadme = result.ProfilePublicReadmeBlob != nil || result.ProfilePrivateReadmeBlob != nil
204+
ctx.Data["HasOrgProfileReadme"] = result.HasOrgProfileReadme // many pages need it to show the "overview" tab
205+
ctx.Data["ShowOrgProfileReadmeSelector"] = result.ProfilePublicReadmeBlob != nil && result.ProfilePrivateReadmeBlob != nil
206+
return result, nil
201207
}

routers/web/user/profile.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ func prepareUserProfileTabData(ctx *context.Context, showPrivate bool, profileDb
9595
}
9696
}
9797
ctx.Data["TabName"] = tab
98-
ctx.Data["HasPublicProfileReadme"] = profileReadme != nil
98+
ctx.Data["HasUserProfileReadme"] = profileReadme != nil
9999

100100
page := ctx.FormInt("page")
101101
if page <= 0 {

templates/org/home.tmpl

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<div class="ui mobile reversed stackable grid">
77
<div class="ui {{if .ShowMemberAndTeamTab}}eleven wide{{end}} column">
88
{{if .ProfileReadmeContent}}
9-
<div id="readme_profile" class="markup">{{.ProfileReadmeContent}}</div>
9+
<div id="readme_profile" class="markup" data-profile-view-as-member="{{.IsViewingOrgAsMember}}">{{.ProfileReadmeContent}}</div>
1010
{{end}}
1111
{{template "shared/repo_search" .}}
1212
{{template "explore/repo_list" .}}
@@ -25,26 +25,26 @@
2525
<div class="divider"></div>
2626
{{end}}
2727

28-
{{if and .ShowMemberAndTeamTab .HasPublicProfileReadme .HasPrivateProfileReadme}}
28+
{{if and .ShowMemberAndTeamTab .ShowOrgProfileReadmeSelector}}
2929
<div class="tw-my-4">
3030
<div id="org-home-view-as-dropdown" class="ui dropdown jump">
3131
<span class="text">
3232
{{svg "octicon-eye"}}
33-
View as: {{if not .IsViewerMember}}{{ctx.Locale.Tr "settings.visibility.public"}}{{else}}{{ctx.Locale.Tr "org.members.member"}}{{end}}
33+
View as: {{if not .IsViewingOrgAsMember}}{{ctx.Locale.Tr "settings.visibility.public"}}{{else}}{{ctx.Locale.Tr "org.members.member"}}{{end}}
3434
</span>
3535
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
3636
<div class="menu">
3737
{{/* TODO: does it really need to use CurrentURL with query parameters? Why not construct a new link with clear parameters */}}
38-
<a href="{{QueryBuild $.CurrentURL "view_as" "public"}}" class="item {{if not .IsViewerMember}}selected{{end}}">
39-
{{svg "octicon-check" 14 (Iif (not .IsViewerMember) "" "tw-invisible")}} {{ctx.Locale.Tr "settings.visibility.public"}}
38+
<a href="{{QueryBuild $.CurrentURL "view_as" "public"}}" class="item {{if not .IsViewingOrgAsMember}}selected{{end}}">
39+
{{svg "octicon-check" 14 (Iif (not .IsViewingOrgAsMember) "" "tw-invisible")}} {{ctx.Locale.Tr "settings.visibility.public"}}
4040
</a>
41-
<a href="{{QueryBuild $.CurrentURL "view_as" "member"}}" class="item {{if .IsViewerMember}}selected{{end}}">
42-
{{svg "octicon-check" 14 (Iif .IsViewerMember "" "tw-invisible")}} {{ctx.Locale.Tr "org.members.member"}}
41+
<a href="{{QueryBuild $.CurrentURL "view_as" "member"}}" class="item {{if .IsViewingOrgAsMember}}selected{{end}}">
42+
{{svg "octicon-check" 14 (Iif .IsViewingOrgAsMember "" "tw-invisible")}} {{ctx.Locale.Tr "org.members.member"}}
4343
</a>
4444
</div>
4545
</div>
4646
<div class="tw-my-2">
47-
{{if .IsViewerMember}}{{ctx.Locale.Tr "org.view_as_member_hint"}}{{else}}{{ctx.Locale.Tr "org.view_as_public_hint"}}{{end}}
47+
{{if .IsViewingOrgAsMember}}{{ctx.Locale.Tr "org.view_as_member_hint"}}{{else}}{{ctx.Locale.Tr "org.view_as_public_hint"}}{{end}}
4848
</div>
4949
</div>
5050
{{end}}

templates/org/menu.tmpl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
<div class="ui container">
22
<overflow-menu class="ui secondary pointing tabular borderless menu tw-mb-4">
33
<div class="overflow-menu-items">
4-
{{if or .HasPublicProfileReadme .HasPrivateProfileReadme}}
4+
{{if .HasOrgProfileReadme}}
55
<a class="{{if .PageIsViewOverview}}active {{end}}item" href="{{$.Org.HomeLink}}">
66
{{svg "octicon-info"}} {{ctx.Locale.Tr "user.overview"}}
77
</a>
88
{{end}}
9-
<a class="{{if .PageIsViewRepositories}}active {{end}}item" href="{{$.Org.HomeLink}}{{if or .HasPublicProfileReadme .HasPrivateProfileReadme}}/-/repositories{{end}}">
9+
<a class="{{if .PageIsViewRepositories}}active {{end}}item" href="{{$.Org.HomeLink}}{{if .HasOrgProfileReadme}}/-/repositories{{end}}">
1010
{{svg "octicon-repo"}} {{ctx.Locale.Tr "user.repositories"}}
1111
{{if .RepoCount}}
1212
<div class="ui small label">{{.RepoCount}}</div>

templates/user/overview/header.tmpl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<overflow-menu class="ui secondary pointing tabular borderless menu">
22
<div class="overflow-menu-items">
3-
{{if and .HasPublicProfileReadme .ContextUser.IsIndividual}}
3+
{{if and .HasUserProfileReadme .ContextUser.IsIndividual}}
44
<a class="{{if eq .TabName "overview"}}active {{end}}item" href="{{.ContextUser.HomeLink}}?tab=overview">
55
{{svg "octicon-info"}} {{ctx.Locale.Tr "user.overview"}}
66
</a>

tests/integration/org_profile_test.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ func testOrgProfile(t *testing.T, u *url.URL) {
6969
resp := MakeRequest(t, req, http.StatusOK)
7070
htmlDoc := NewHTMLParser(t, resp.Body)
7171

72-
profileDivs := htmlDoc.doc.Find("#user-content-public")
72+
profileDivs := htmlDoc.doc.Find("[data-profile-view-as-member=false]")
7373
assert.EqualValues(t, 1, profileDivs.Length())
7474

7575
dropDownDiv := htmlDoc.doc.Find("#org-home-view-as-dropdown")
@@ -81,7 +81,7 @@ func testOrgProfile(t *testing.T, u *url.URL) {
8181
resp = session.MakeRequest(t, req, http.StatusOK)
8282
htmlDoc = NewHTMLParser(t, resp.Body)
8383

84-
profileDivs = htmlDoc.doc.Find("#user-content-public")
84+
profileDivs = htmlDoc.doc.Find("[data-profile-view-as-member=false]")
8585
assert.EqualValues(t, 1, profileDivs.Length())
8686

8787
dropDownDiv = htmlDoc.doc.Find("#org-home-view-as-dropdown")
@@ -93,7 +93,7 @@ func testOrgProfile(t *testing.T, u *url.URL) {
9393
resp = session.MakeRequest(t, req, http.StatusOK)
9494
htmlDoc = NewHTMLParser(t, resp.Body)
9595

96-
profileDivs = htmlDoc.doc.Find("#user-content-public")
96+
profileDivs = htmlDoc.doc.Find("[data-profile-view-as-member=false]")
9797
assert.EqualValues(t, 1, profileDivs.Length())
9898

9999
dropDownDiv = htmlDoc.doc.Find("#org-home-view-as-dropdown")
@@ -103,14 +103,14 @@ func testOrgProfile(t *testing.T, u *url.URL) {
103103
resp = session.MakeRequest(t, req, http.StatusOK)
104104
htmlDoc = NewHTMLParser(t, resp.Body)
105105

106-
profileDivs = htmlDoc.doc.Find("#user-content-private")
106+
profileDivs = htmlDoc.doc.Find("[data-profile-view-as-member=true]")
107107
assert.EqualValues(t, 1, profileDivs.Length())
108108

109109
req = NewRequest(t, "GET", "/org3?view_as=public")
110110
resp = session.MakeRequest(t, req, http.StatusOK)
111111
htmlDoc = NewHTMLParser(t, resp.Body)
112112

113-
profileDivs = htmlDoc.doc.Find("#user-content-public")
113+
profileDivs = htmlDoc.doc.Find("[data-profile-view-as-member=false]")
114114
assert.EqualValues(t, 1, profileDivs.Length())
115115

116116
// PART 2: Each org has either one of private pr public profile
@@ -121,17 +121,17 @@ func testOrgProfile(t *testing.T, u *url.URL) {
121121
req = NewRequest(t, "GET", "/org41")
122122
resp = MakeRequest(t, req, http.StatusOK)
123123
htmlDoc = NewHTMLParser(t, resp.Body)
124-
profileDivs = htmlDoc.doc.Find("#user-content-public")
124+
profileDivs = htmlDoc.doc.Find("[data-profile-view-as-member=false]")
125125
assert.EqualValues(t, 1, profileDivs.Length())
126126
dropDownDiv = htmlDoc.doc.Find("#org-home-view-as-dropdown")
127127
assert.EqualValues(t, 0, dropDownDiv.Length())
128128

129129
req = NewRequest(t, "GET", "/org42")
130130
resp = MakeRequest(t, req, http.StatusOK)
131131
htmlDoc = NewHTMLParser(t, resp.Body)
132-
profileDivs = htmlDoc.doc.Find("#user-content-public")
132+
profileDivs = htmlDoc.doc.Find("[data-profile-view-as-member=false]")
133133
assert.EqualValues(t, 0, profileDivs.Length())
134-
profileDivs = htmlDoc.doc.Find("#user-content-public")
134+
profileDivs = htmlDoc.doc.Find("[data-profile-view-as-member=false]")
135135
assert.EqualValues(t, 0, profileDivs.Length())
136136
dropDownDiv = htmlDoc.doc.Find("#org-home-view-as-dropdown")
137137
assert.EqualValues(t, 0, dropDownDiv.Length())
@@ -140,15 +140,15 @@ func testOrgProfile(t *testing.T, u *url.URL) {
140140
req = NewRequest(t, "GET", "/org41")
141141
resp = session.MakeRequest(t, req, http.StatusOK)
142142
htmlDoc = NewHTMLParser(t, resp.Body)
143-
profileDivs = htmlDoc.doc.Find("#user-content-public")
143+
profileDivs = htmlDoc.doc.Find("[data-profile-view-as-member=false]")
144144
assert.EqualValues(t, 1, profileDivs.Length())
145145
dropDownDiv = htmlDoc.doc.Find("#org-home-view-as-dropdown")
146146
assert.EqualValues(t, 0, dropDownDiv.Length())
147147

148148
req = NewRequest(t, "GET", "/org42")
149149
resp = session.MakeRequest(t, req, http.StatusOK)
150150
htmlDoc = NewHTMLParser(t, resp.Body)
151-
profileDivs = htmlDoc.doc.Find("#user-content-private")
151+
profileDivs = htmlDoc.doc.Find("[data-profile-view-as-member=true]")
152152
assert.EqualValues(t, 1, profileDivs.Length())
153153
dropDownDiv = htmlDoc.doc.Find("#org-home-view-as-dropdown")
154154
assert.EqualValues(t, 0, dropDownDiv.Length())

0 commit comments

Comments
 (0)