1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
from django.utils.functional import SimpleLazyObject
from django.shortcuts import render
from django.conf import settings
# This is the whole site navigation structure. Stick in a smarter file?
sitenav = {
'about': [
{'title': 'About', 'link': '/about/'},
{'title': 'Governance', 'link': '/about/governance/'},
{'title': 'Policies', 'link': '/about/policies/'},
{'title': 'Feature Matrix', 'link': '/about/featurematrix/'},
{'title': 'Donate', 'link': '/about/donate/'},
{'title': 'History', 'link': '/docs/current/history.html'},
{'title': 'Sponsors', 'link': '/about/sponsors/', 'submenu': [
{'title': 'Contributing', 'link': '/about/contributing/'},
{'title': 'Financial', 'link': '/about/financial/'},
{'title': 'Servers', 'link': '/about/servers/'},
]},
{'title': 'Latest News', 'link': '/about/newsarchive/'},
{'title': 'Upcoming Events', 'link': '/about/events/', 'submenu': [
{'title': 'Past events', 'link': '/about/eventarchive/'},
]},
{'title': 'Press', 'link': '/about/press/'},
{'title': 'Licence', 'link': '/about/licence/'},
],
'download': [
{'title': 'Downloads', 'link': '/download/', 'submenu': [
{'title': 'Packages', 'link': '/download/'},
{'title': 'Source', 'link': '/ftp/source/'}
]},
{'title': 'Software Catalogue', 'link': '/download/product-categories/'},
{'title': 'File Browser', 'link': '/ftp/'},
],
'docs': [
{'title': 'Documentation', 'link': '/docs/'},
{'title': 'Manuals', 'link': '/docs/', 'submenu': [
{'title': 'Archive', 'link': '/docs/manuals/archive/'},
]},
{'title': 'Release Notes', 'link': '/docs/release/'},
{'title': 'Books', 'link': '/docs/books/'},
{'title': 'Tutorials & Other Resources', 'link': '/docs/online-resources/'},
{'title': 'FAQ', 'link': '/docs/faq/'},
{'title': 'Wiki', 'link': 'https://wiki.postgresql.org'},
],
'community': [
{'title': 'Community', 'link': '/community/'},
{'title': 'Contributors', 'link': '/community/contributors/'},
{'title': 'Mailing Lists', 'link': '/list/'},
{'title': 'IRC', 'link': '/community/irc/'},
# {'title': 'Slack', 'link': 'https://join.slack.com/t/postgresteam/shared_invite/zt-1qj14i9sj-E9WqIFlvcOiHsEk2yFEMjA'},
{'title': 'Local User Groups', 'link': '/community/user-groups/'},
{'title': 'Recognised NPOs', 'link': '/community/recognised-npos/'},
{'title': 'Events', 'link': '/about/events/'},
{'title': 'International Sites', 'link': '/community/international/'},
],
'developer': [
{'title': 'Developers', 'link': '/developer/'},
{'title': 'Core Team', 'link': '/developer/core/'},
{'title': 'Committers', 'link': '/developer/committers/'},
{'title': 'Roadmap', 'link': '/developer/roadmap/'},
{'title': 'Coding', 'link': '/developer/coding/'},
{'title': 'CommitFests', 'link': 'https://commitfest.postgresql.org'},
{'title': 'Testing', 'link': '/developer/testing/', 'submenu': [
{'title': 'Beta Information', 'link': '/developer/beta/'},
]},
{'title': 'Mailing Lists', 'link': '/list/'},
{'title': 'Developer FAQ', 'link': 'https://wiki.postgresql.org/wiki/Developer_FAQ'},
{'title': 'Related Projects', 'link': '/developer/related-projects/'},
],
'support': [
{'title': 'Support', 'link': '/support/'},
{'title': 'Versioning Policy', 'link': '/support/versioning/'},
{'title': 'Security', 'link': '/support/security/'},
{'title': 'Professional Services', 'link': '/support/professional_support/'},
{'title': 'Hosting Solutions', 'link': '/support/professional_hosting/'},
{'title': 'Report a Bug', 'link': '/account/submitbug/'},
],
'account': [
{'title': 'Your account', 'link': '/account'},
{'title': 'Profile', 'link': '/account/profile'},
{'title': 'Mailing List Subscriptions', 'link': 'https://lists.postgresql.org/manage/'},
{'title': 'Submitted data', 'link': '/account', 'submenu': [
{'title': 'News Articles', 'link': '/account/edit/news/'},
{'title': 'Events', 'link': '/account/edit/events/'},
{'title': 'Products', 'link': '/account/edit/products/'},
{'title': 'Professional Services', 'link': '/account/edit/services/'},
{'title': 'Organisations', 'link': '/account/edit/organisations/'},
]},
{'title': 'Change password', 'link': '/account/changepwd/'},
{'title': 'Logout', 'link': '/account/logout'},
],
}
def get_nav_menu(section):
if section in sitenav:
return sitenav[section]
else:
return {}
def render_pgweb(request, section, template, context):
context['navmenu'] = get_nav_menu(section)
return render(request, template, context)
def _get_gitrev():
# Return the current git revision, that is used for
# cache-busting URLs.
try:
with open('.git/refs/heads/master') as f:
return f.readline()[:8]
except IOError:
# A "git gc" will remove the ref and replace it with a packed-refs.
try:
with open('.git/packed-refs') as f:
for l in f.readlines():
if l.endswith("refs/heads/master\n"):
return l[:8]
# Not found in packed-refs. Meh, just make one up.
return 'ffffffff'
except IOError:
# If packed-refs also can't be read, just give up
return 'eeeeeeee'
# Template context processor to add information about the root link and
# the current git revision. git revision is returned as a lazy object so
# we don't spend effort trying to load it if we don't need it (though
# all general pages will need it since it's used to render the css urls)
def PGWebContextProcessor(request):
gitrev = SimpleLazyObject(_get_gitrev)
if request.is_secure():
return {
'link_root': settings.SITE_ROOT,
'do_esi': settings.DO_ESI,
'gitrev': gitrev,
}
else:
return {
'gitrev': gitrev,
'do_esi': settings.DO_ESI,
}
|