]>
git.ipfire.org Git - people/jschlag/pbs.git/blob - src/web/ui_modules.py
3 from __future__
import division
15 from ..constants
import *
17 class UIModule(tornado
.web
.UIModule
):
20 return self
.handler
.application
.backend
24 return self
.pakfire
.settings
27 class TextModule(UIModule
):
30 LINK
= """<a href="%s" target="_blank">%s</a>"""
33 def bugzilla_url(self
):
34 return self
.settings
.get("bugzilla_url", "")
37 def bugzilla_pattern(self
):
38 if not self
.__cache
.has_key("bugzilla_pattern"):
39 self
.__cache
["bugzilla_pattern"] = re
.compile(BUGZILLA_PATTERN
)
41 return self
.__cache
["bugzilla_pattern"]
44 def bugzilla_repl(self
):
45 return self
.LINK
% (self
.bugzilla_url
% { "bugid" : r
"\2" }, r
"\1\2")
49 return self
.settings
.get("cve_url", "")
52 def cve_pattern(self
):
53 if not self
.__cache
.has_key("cve_pattern"):
54 self
.__cache
["cve_pattern"] = re
.compile(CVE_PATTERN
)
56 return self
.__cache
["cve_pattern"]
60 return self
.LINK
% (self
.cve_url
% r
"\3", r
"\1\2\3")
62 def split_paragraphs(self
, s
):
63 for group_seperator
, line_iteration
in itertools
.groupby(s
.splitlines(True), key
=str.isspace
):
67 paragraph
= "".join(line_iteration
)
68 yield paragraph
.replace("\n", " ")
70 def render(self
, text
, pre
=False, remove_linebreaks
=True):
71 link
= """<a href="%s" target="_blank">%s</a>"""
74 text
= text
.replace("\n", " ")
76 # Escape the text and create make urls clickable.
77 text
= tornado
.escape
.xhtml_escape(text
)
78 text
= tornado
.escape
.linkify(text
, shorten
=True,
79 extra_params
='target="_blank"')
81 # Search for bug ids that need to be linked to bugzilla.
83 text
= re
.sub(self
.bugzilla_pattern
, self
.bugzilla_repl
, text
, re
.I|re
.U
)
85 # Search for CVE numbers and create hyperlinks.
87 text
= re
.sub(self
.cve_pattern
, self
.cve_repl
, text
, re
.I|re
.U
)
90 return "<pre>%s</pre>" % text
95 class CommitMessageModule(TextModule
):
96 def render(self
, commit
):
97 s
= "h5. %s\n\n" % commit
.subject
99 paragraphs
= self
.split_paragraphs(commit
.message
)
100 s
+= "\n\n".join(paragraphs
)
102 return TextModule
.render(self
, s
, remove_linebreaks
=False)
105 class ModalModule(UIModule
):
106 def render(self
, what
, **kwargs
):
107 what
= "modules/modal-%s.html" % what
109 return self
.render_string(what
, **kwargs
)
112 class BuildHeadlineModule(UIModule
):
113 def render(self
, build
, short
=False, shorter
=False):
117 return self
.render_string("modules/build-headline.html",
118 build
=build
, pkg
=build
.pkg
, short
=short
, shorter
=shorter
)
121 class JobsStatusModule(UIModule
):
122 def render(self
, build
):
123 return self
.render_string("modules/jobs/status.html",
124 build
=build
, jobs
=build
.jobs
)
127 class BuildersLoadModule(UIModule
):
129 load
= self
.pakfire
.builders
.get_load()
131 return self
.render_string("modules/builders/load.html", load
=load
)
134 class BugsTableModule(UIModule
):
135 def render(self
, pkg
, bugs
):
136 return self
.render_string("modules/bugs-table.html",
140 class ChangelogModule(UIModule
):
141 def render(self
, name
=None, builds
=None, *args
, **kwargs
):
143 builds
= self
.pakfire
.builds
.get_changelog(name
, *args
, **kwargs
)
145 return self
.render_string("modules/changelog/index.html", builds
=builds
)
148 class ChangelogEntryModule(UIModule
):
149 def render(self
, build
):
150 return self
.render_string("modules/changelog/entry.html", build
=build
)
153 class CommitsTableModule(UIModule
):
154 def render(self
, distro
, source
, commits
, full_format
=True):
155 return self
.render_string("modules/commits-table.html",
156 distro
=distro
, source
=source
, commits
=commits
,
157 full_format
=full_format
)
160 class FooterModule(UIModule
):
162 return self
.render_string("modules/footer.html")
165 class HeadingDateModule(UIModule
):
166 def render(self
, date
):
167 _
= self
.locale
.translate
169 # Check if this is today.
170 today
= datetime
.date
.today()
174 # Check if this was yesterday.
175 yesterday
= today
- datetime
.timedelta(days
=1)
176 if date
== yesterday
:
177 return _("Yesterday")
179 # Convert date to datetime.
180 date
= datetime
.datetime(date
.year
, date
.month
, date
.day
)
182 return self
.locale
.format_date(date
, shorter
=True, relative
=False)
185 class PackagesTableModule(UIModule
):
186 def render(self
, job
, packages
):
187 return self
.render_string("modules/packages-table.html", job
=job
,
191 class PackagesDependencyTableModule(UIModule
):
192 def render(self
, pkg
):
193 if pkg
.type == "source":
195 (None, pkg
.requires
),
199 ("provides", pkg
.provides
),
200 ("requires", pkg
.requires
),
201 ("prerequires", pkg
.prerequires
),
202 ("conflicts", pkg
.conflicts
),
203 ("obsoletes", pkg
.obsoletes
),
204 ("recommends", pkg
.recommends
),
205 ("suggests", pkg
.suggests
),
209 for name
, deps
in all_deps
:
211 has_deps
.append((name
, deps
))
214 span
= math
.floor(12 / len(has_deps
))
221 return self
.render_string("modules/packages/dependency-table.html",
222 pkg
=pkg
, dependencies
=has_deps
, span
=span
)
225 class PackageTable2Module(UIModule
):
226 def render(self
, packages
):
227 return self
.render_string("modules/package-table-detail.html",
231 class FilesTableModule(UIModule
):
232 def render(self
, files
):
233 return self
.render_string("modules/files-table.html", files
=files
)
236 class LogFilesTableModule(UIModule
):
237 def render(self
, job
, files
):
238 return self
.render_string("modules/log-files-table.html", job
=job
,
242 class PackageHeaderModule(UIModule
):
243 def render(self
, pkg
):
244 return self
.render_string("modules/package-header.html", pkg
=pkg
)
247 class PackageFilesTableModule(UIModule
):
248 def render(self
, pkg
, filelist
):
249 return self
.render_string("modules/packages-files-table.html",
250 pkg
=pkg
, filelist
=filelist
)
253 class BuildTableModule(UIModule
):
254 def render(self
, builds
, **kwargs
):
258 show_repo_time
= False,
259 show_can_move_forward
= False,
262 settings
.update(kwargs
)
268 dates
[b
.date
].append(b
)
272 dates
= sorted(dates
.items(), reverse
=True)
274 return self
.render_string("modules/build-table.html", dates
=dates
, **settings
)
277 class BuildStateWarningsModule(UIModule
):
278 def render(self
, build
):
279 return self
.render_string("modules/build-state-warnings.html", build
=build
)
282 class JobsBoxesModule(UIModule
):
283 def render(self
, build
, jobs
=None):
287 return self
.render_string("modules/jobs/boxes.html",
288 build
=build
, jobs
=jobs
)
291 class JobStateModule(UIModule
):
292 def render(self
, job
, cls
=None, show_arch
=False, show_icon
=False, plain
=False):
295 _
= self
.locale
.translate
299 if state
== "aborted":
301 classes
.append("muted")
302 icon
= "icon-warning-sign"
304 elif state
== "dependency_error":
305 text
= _("Dependency problem")
306 classes
.append("text-warning")
309 elif state
== "dispatching":
310 text
= _("Dispatching")
311 classes
.append("text-info")
312 icon
= "icon-download-alt"
314 elif state
== "failed":
316 classes
.append("text-error")
319 elif state
== "finished":
321 classes
.append("text-success")
326 classes
.append("muted")
327 icon
= "icon-asterisk"
329 elif state
== "pending":
331 classes
.append("muted")
334 elif state
== "running":
336 classes
.append("text-info")
339 elif state
== "uploading":
340 text
= _("Uploading")
341 classes
.append("text-info")
342 icon
= "icon-upload-alt"
344 # Return just the string, is state is unknown.
346 text
= _("Unknown: %s") % state
347 classes
.append("muted")
358 if show_icon
and icon
:
359 text
= """<i class="%s"></i> %s""" % (icon
, text
)
361 return """<span class="%s">%s</span>""" % (" ".join(classes
), text
)
364 class JobsTableModule(UIModule
):
365 def render(self
, build
, jobs
=None, type="release"):
369 return self
.render_string("modules/jobs-table.html", build
=build
,
370 jobs
=jobs
, type=type)
373 class JobsListModule(UIModule
):
374 def render(self
, jobs
):
375 return self
.render_string("modules/jobs/list.html", jobs
=jobs
)
378 class RepositoryTableModule(UIModule
):
379 def render(self
, distro
, repos
):
380 return self
.render_string("modules/repository-table.html",
381 distro
=distro
, repos
=repos
)
384 class SourceTableModule(UIModule
):
385 def render(self
, distro
, sources
):
386 return self
.render_string("modules/source-table.html",
387 distro
=distro
, sources
=sources
)
390 class CommentsTableModule(UIModule
):
391 def render(self
, comments
, show_package
=False, show_user
=True):
393 for comment
in comments
:
396 pkg
= pkgs
[comment
.pkg_id
]
398 pkg
= pkgs
[comment
.pkg_id
] = \
399 self
.pakfire
.packages
.get_by_id(comment
.pkg_id
)
405 user
= users
[comment
.user_id
]
407 user
= users
[comment
.user_id
] = \
408 self
.pakfire
.users
.get_by_id(comment
.user_id
)
410 comment
["user"] = user
412 return self
.render_string("modules/comments-table.html",
413 comments
=comments
, show_package
=show_package
, show_user
=show_user
)
416 class LogModule(UIModule
):
417 def render(self
, entries
, **args
):
418 return self
.render_string("modules/log.html",
419 entries
=entries
, args
=args
)
422 class LogEntryModule(UIModule
):
423 def render(self
, entry
, small
=None, **args
):
424 if small
or not entry
.user
:
425 template
= "modules/log-entry-small.html"
427 template
= "modules/log-entry.html"
429 return self
.render_string(template
, entry
=entry
, u
=entry
.user
,
430 show_build
=False, **args
)
433 class LogEntryCommentModule(LogEntryModule
):
434 def render(self
, entry
, show_build
=False, **args
):
435 return self
.render_string("modules/log-entry-comment.html",
436 entry
=entry
, u
=entry
.user
, show_build
=show_build
, **args
)
439 class MaintainerModule(UIModule
):
440 def render(self
, maintainer
):
441 if isinstance(maintainer
, users
.User
):
446 return self
.render_string("modules/maintainer.html",
447 type=type, maintainer
=maintainer
)
450 class BuildLogModule(UIModule
):
452 def render(self
, messages
):
453 _
= self
.locale
.translate
455 for message
in messages
:
457 msg
= LOG2MSG
[message
.message
]
458 message
["message"] = _(msg
)
462 return self
.render_string("modules/build-log.html", messages
=messages
)
465 class LogTableModule(UIModule
):
466 def render(self
, messages
, links
=["pkg",]):
467 for message
in messages
:
469 message
["message"] = LOG2MSG
[message
.message
]
474 message
["build"] = self
.pakfire
.builds
.get_by_id(message
.build_id
)
477 message
["pkg"] = self
.pakfire
.packages
.get_by_id(message
.pkg_id
)
479 return self
.render_string("modules/log-table.html",
480 messages
=messages
, links
=links
)
483 class UsersTableModule(UIModule
):
484 def render(self
, users
):
485 return self
.render_string("modules/user-table.html", users
=users
)
488 class BuildOffsetModule(UIModule
):
490 return self
.render_string("modules/build-offset.html")
493 class RepoActionsTableModule(UIModule
):
494 def render(self
, repo
):
495 actions
= repo
.get_actions()
497 return self
.render_string("modules/repo-actions-table.html",
498 repo
=repo
, actions
=actions
)
501 class UpdatesTableModule(UIModule
):
502 def render(self
, updates
):
503 return self
.render_string("modules/updates-table.html", updates
=updates
)
506 class WatchersSidebarTableModule(UIModule
):
508 return "css/watchers-sidebar-table.css"
510 def render(self
, build
, watchers
, limit
=5):
511 # Sort the watchers by their realname.
512 watchers
.sort(key
=lambda watcher
: watcher
.realname
)
514 return self
.render_string("modules/watchers-sidebar-table.html",
515 build
=build
, watchers
=watchers
, limit
=limit
)
518 class SelectLocaleModule(UIModule
):
520 # local code, English name, name
521 ("ca_ES", u
"Catalan", "Catal\xc3\xa0"),
522 ("da_DK", u
"Danish", u
"Dansk"),
523 ("de_DE", u
"German", u
"Deutsch"),
524 ("en_GB", u
"English (UK)", u
"English (UK)"),
525 ("en_US", u
"English (US)", u
"English (US)"),
526 ("es_ES", u
"Spanish (Spain)", u
"Espa\xf1ol (Espa\xf1a)"),
527 ("es_LA", u
"Spanish", u
"Espa\xf1ol"),
528 ("fr_CA", u
"French (Canada)", u
"Fran\xe7ais (Canada)"),
529 ("fr_FR", u
"French", u
"Fran\xe7ais"),
530 ("it_IT", u
"Italian", u
"Italiano"),
531 ("km_KH", u
"Khmer", u
"\u1797\u17b6\u179f\u17b6\u1781\u17d2\u1798\u17c2\u179a"),
532 ("nl_NL", u
"Dutch", u
"Nederlands"),
533 ("pt_BR", u
"Portuguese (Brazil)", u
"Portugu\xeas (Brasil)"),
534 ("pt_PT", u
"Portuguese (Portugal)", u
"Portugu\xeas (Portugal)"),
535 ("ro_RO", u
"Romanian", u
"Rom\xe2n\u0103"),
536 ("ru_RU", u
"Russian", u
"\u0440\u0443\u0441\u0441\u043a\u0438\u0439"),
537 ("uk_UA", u
"Ukrainian", u
"\u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430"),
540 # Sort the list of locales by their English name.
541 LOCALE_NAMES
.sort(key
=lambda x
: x
[1])
543 def render(self
, name
=None, id=None, preselect
=None):
544 return self
.render_string("modules/select/locale.html",
545 name
=name
, id=id, preselect
=preselect
, supported_locales
=self
.LOCALE_NAMES
)
548 class SelectTimezoneModule(UIModule
):
549 def render(self
, name
=None, id=None, preselect
=None):
550 return self
.render_string("modules/select/timezone.html",
551 name
=name
, id=id, preselect
=preselect
,
552 supported_timezones
=pytz
.common_timezones
)