]> git.ipfire.org Git - people/jschlag/pbs.git/blame - web/ui_modules.py
Add permanent cache for Settings.
[people/jschlag/pbs.git] / web / ui_modules.py
CommitLineData
f6e6ff79 1#!/usr/bin/python
9137135a 2
f6e6ff79
MT
3import re
4import string
e434b018 5import textile
f6e6ff79 6import tornado.escape
9137135a
MT
7import tornado.web
8
f6e6ff79 9import backend.users
9137135a
MT
10from backend.constants import *
11
12class UIModule(tornado.web.UIModule):
13 @property
14 def pakfire(self):
15 return self.handler.application.pakfire
16
f6e6ff79
MT
17 @property
18 def settings(self):
19 return self.pakfire.settings
20
21
22class TextModule(UIModule):
c21cb4ec 23 def render(self, text, pre=False, remove_linebreaks=True):
f6e6ff79
MT
24 link = """<a href="%s" target="_blank">%s</a>"""
25
26 bz_url = self.settings.get("bugzilla_url", "")
27 bz_pattern = re.compile(r"(bug\s?|#)(\d+)")
28 bz_repl = link % (bz_url % { "bugid" : r"\2" }, r"\1\2")
29
30 cve_url = self.settings.get("cve_url", "")
31 cve_pattern = re.compile(r"(CVE)(\s|\-)(\d{4}\-\d{4})")
32 cve_repl = link % (cve_url % r"\3", r"\1\2\3")
33
c21cb4ec
MT
34 if remove_linebreaks:
35 text = text.replace("\n", " ")
36
f6e6ff79
MT
37 o = []
38 for p in text.splitlines():
39 # Escape the text and create make urls clickable.
40 p = tornado.escape.xhtml_escape(p)
41 p = tornado.escape.linkify(p, shorten=True,
42 extra_params='target="_blank"')
43
44 # Search for bug ids that need to be linked to bugzilla.
45 if bz_url:
46 p = re.sub(bz_pattern, bz_repl, p, re.I|re.U)
47
48 # Search for CVE numbers and create hyperlinks.
49 if cve_url:
50 p = re.sub(cve_pattern, cve_repl, p, re.I|re.U)
51
52 o.append(p)
53
54 o = "\n".join(o)
55
56 if pre:
57 return "<pre>%s</pre>" % o
58
e434b018 59 return textile.textile(o)
f6e6ff79
MT
60
61
62class ModalModule(UIModule):
63 def render(self, what, **kwargs):
64 what = "modules/modal-%s.html" % what
9137135a 65
f6e6ff79
MT
66 return self.render_string(what, **kwargs)
67
68
69class BuildHeadlineModule(UIModule):
70 def render(self, prefix, build, short=False, shorter=False):
71 if shorter:
72 short = True
73
74 return self.render_string("modules/build-headline.html",
75 prefix=prefix, build=build, pkg=build.pkg, short=short, shorter=shorter)
76
77
78class BugsTableModule(UIModule):
79 def render(self, pkg, bugs):
80 return self.render_string("modules/bugs-table.html",
81 pkg=pkg, bugs=bugs)
82
83
4b1e87c4
MT
84class ChangelogModule(UIModule):
85 def render(self, name=None, builds=None, *args, **kwargs):
86 if not builds:
87 builds = self.pakfire.builds.get_changelog(name, *args, **kwargs)
88
89 return self.render_string("modules/changelog/index.html", builds=builds)
90
91
92class ChangelogEntryModule(UIModule):
93 def render(self, build):
94 return self.render_string("modules/changelog/entry.html", build=build)
95
96
f6e6ff79
MT
97class CommitsTableModule(UIModule):
98 def render(self, distro, source, commits, full_format=True):
99 return self.render_string("modules/commits-table.html",
100 distro=distro, source=source, commits=commits,
101 full_format=full_format)
102
103
104class FooterModule(UIModule):
105 def render(self):
106 return self.render_string("modules/footer.html")
107
108
109class PackagesTableModule(UIModule):
110 def render(self, job, packages):
111 return self.render_string("modules/packages-table.html", job=job,
112 packages=packages)
9137135a
MT
113
114
115class PackageTable2Module(UIModule):
116 def render(self, packages):
117 return self.render_string("modules/package-table-detail.html",
118 packages=packages)
119
120
121class FilesTableModule(UIModule):
122 def render(self, files):
123 return self.render_string("modules/files-table.html", files=files)
124
125
f6e6ff79
MT
126class LogFilesTableModule(UIModule):
127 def render(self, job, files):
128 return self.render_string("modules/log-files-table.html", job=job,
129 files=files)
130
131
132class PackageHeaderModule(UIModule):
133 def render(self, pkg):
134 return self.render_string("modules/package-header.html", pkg=pkg)
135
136
9137135a 137class PackageFilesTableModule(UIModule):
f6e6ff79
MT
138 def render(self, pkg, filelist):
139 return self.render_string("modules/packages-files-table.html",
140 pkg=pkg, filelist=filelist)
9137135a
MT
141
142
143class BuildTableModule(UIModule):
f6e6ff79
MT
144 def render(self, builds, **kwargs):
145 settings = dict(
146 show_user = False,
147 show_repo = False,
148 show_repo_time = False,
149 show_can_move_forward = False,
150 show_when = True,
151 )
152 settings.update(kwargs)
153
154 return self.render_string("modules/build-table.html",
155 builds=builds, **settings)
156
157
158class BuildStateWarningsModule(UIModule):
159 def render(self, build):
160 return self.render_string("modules/build-state-warnings.html", build=build)
161
162
163class JobsTableModule(UIModule):
164 def render(self, build, jobs=None, type="release"):
165 if jobs is None:
166 jobs = build.jobs
167
168 return self.render_string("modules/jobs-table.html", build=build,
169 jobs=jobs, type=type)
170
171
172class JobsListModule(UIModule):
173 def render(self, jobs, show_builder=False):
174 return self.render_string("modules/jobs-list.html", jobs=jobs,
175 show_builder=show_builder)
9137135a
MT
176
177
178class RepositoryTableModule(UIModule):
179 def render(self, distro, repos):
180 return self.render_string("modules/repository-table.html",
181 distro=distro, repos=repos)
182
183
184class SourceTableModule(UIModule):
185 def render(self, distro, sources):
186 return self.render_string("modules/source-table.html",
187 distro=distro, sources=sources)
188
189
190class CommentsTableModule(UIModule):
191 def render(self, comments, show_package=False, show_user=True):
192 pkgs, users = {}, {}
193 for comment in comments:
194 if show_package:
195 try:
196 pkg = pkgs[comment.pkg_id]
197 except KeyError:
198 pkg = pkgs[comment.pkg_id] = \
199 self.pakfire.packages.get_by_id(comment.pkg_id)
200
201 comment["pkg"] = pkg
202
203 if show_user:
204 try:
205 user = users[comment.user_id]
206 except KeyError:
207 user = users[comment.user_id] = \
208 self.pakfire.users.get_by_id(comment.user_id)
209
210 comment["user"] = user
211
212 return self.render_string("modules/comments-table.html",
213 comments=comments, show_package=show_package, show_user=show_user)
214
215
f6e6ff79
MT
216class LogModule(UIModule):
217 def render(self, entries, **args):
218 return self.render_string("modules/log.html",
219 entries=entries, args=args)
220
221
222class LogEntryModule(UIModule):
e434b018
MT
223 def render(self, entry, small=None, **args):
224 if small or entry.system_msg:
225 template = "modules/log-entry-small.html"
226 else:
227 template = "modules/log-entry.html"
228
229 return self.render_string(template, entry=entry, u=entry.user, **args)
f6e6ff79
MT
230
231
232class LogEntryCommentModule(LogEntryModule):
233 def render(self, entry, **args):
234 return self.render_string("modules/log-entry-comment.html",
e434b018 235 entry=entry, u=entry.user, **args)
f6e6ff79
MT
236
237
238class MaintainerModule(UIModule):
239 def render(self, maintainer):
240 if isinstance(maintainer, backend.users.User):
241 type = "user"
242 else:
243 type = "string"
244
245 return self.render_string("modules/maintainer.html",
246 type=type, maintainer=maintainer)
247
248
9137135a
MT
249class BuildLogModule(UIModule):
250 # XXX deprecated
251 def render(self, messages):
252 _ = self.locale.translate
253
254 for message in messages:
255 try:
256 msg = LOG2MSG[message.message]
257 message["message"] = _(msg)
258 except KeyError:
259 pass
260
261 return self.render_string("modules/build-log.html", messages=messages)
262
263
264class LogTableModule(UIModule):
265 def render(self, messages, links=["pkg",]):
266 for message in messages:
267 try:
268 message["message"] = LOG2MSG[message.message]
269 except KeyError:
270 pass
271
272 if message.build_id:
273 message["build"] = self.pakfire.builds.get_by_id(message.build_id)
274
275 elif message.pkg_id:
276 message["pkg"] = self.pakfire.packages.get_by_id(message.pkg_id)
277
278 return self.render_string("modules/log-table.html",
279 messages=messages, links=links)
280
281
282class UsersTableModule(UIModule):
283 def render(self, users):
284 return self.render_string("modules/user-table.html", users=users)
285
286
287class BuildOffsetModule(UIModule):
288 def render(self):
289 return self.render_string("modules/build-offset.html")
290
291
292class RepoActionsTableModule(UIModule):
293 def render(self, repo):
294 actions = repo.get_actions()
295
296 return self.render_string("modules/repo-actions-table.html",
297 repo=repo, actions=actions)
f6e6ff79
MT
298
299
300class UpdatesTableModule(UIModule):
301 def render(self, updates):
302 return self.render_string("modules/updates-table.html", updates=updates)
303
304
305class WatchersSidebarTableModule(UIModule):
306 def css_files(self):
307 return "css/watchers-sidebar-table.css"
308
309 def render(self, build, watchers, limit=5):
310 # Sort the watchers by their realname.
311 watchers.sort(key=lambda watcher: watcher.realname)
312
313 return self.render_string("modules/watchers-sidebar-table.html",
314 build=build, watchers=watchers, limit=limit)