Hi, See attached or branch html5+external_css from ssh://git.debian.org/git/collab-maint/secure-testing.git
These patches turn the html into html5 and introduce a modern, slick css style inspired from tracker.d.o - enjoy! :) & Feedback welcome! cheers & thanks to Ulrike for the nice work! Holger
From 1317d0e6a710195c3012f6b84afeebddfddfde20 Mon Sep 17 00:00:00 2001 From: Holger Levsen <hol...@layer-acht.org> Date: Sun, 14 Sep 2014 22:36:54 +0200 Subject: [PATCH 1/4] tracker_service.py: add support for external css files --- bin/tracker_service.css | 0 bin/tracker_service.py | 11 +++++++++-- lib/python/web_support.py | 6 +++--- 3 files changed, 12 insertions(+), 5 deletions(-) create mode 100644 bin/tracker_service.css diff --git a/bin/tracker_service.css b/bin/tracker_service.css new file mode 100644 index 0000000..e69de29 diff --git a/bin/tracker_service.py b/bin/tracker_service.py index bb1411a..79662b0 100644 --- a/bin/tracker_service.py +++ b/bin/tracker_service.py @@ -160,6 +160,13 @@ function onSearch(query) { self.register('data/pts/1', self.page_data_pts) self.register('debsecan/**', self.page_debsecan) self.register('data/report', self.page_report) + self.register('style.css', self.page_style_css) + + def page_style_css(self, path, params, url): + f=open('tracker_service.css', 'r') + content=f.read() + f.close() + return BinaryResult(content,'text/css') def page_home(self, path, params, url): query = params.get('query', ('',))[0] @@ -1198,13 +1205,13 @@ Debian bug number.'''), data.append(':') data.append(str(bugs)) data.append('\n') - return BinaryResult(''.join(data)) + return BinaryResult(''.join(data),'application/octet-stream') def page_debsecan(self, path, params, url): obj = '/'.join(path) data = self.db.getDebsecan(obj) if data: - return BinaryResult(data) + return BinaryResult(data,'application/octet-stream') else: return self.create_page( url, "Object not found", diff --git a/lib/python/web_support.py b/lib/python/web_support.py index 3c3ab99..e8b055c 100644 --- a/lib/python/web_support.py +++ b/lib/python/web_support.py @@ -620,7 +620,7 @@ class RedirectResult(Result): class HTMLResult(Result): """An object of this class combines a status code with HTML contents.""" - def __init__(self, contents, status=200, doctype=''): + def __init__(self, contents, doctype='', status=200): self.contents = contents self.status = status self.doctype = doctype @@ -649,8 +649,8 @@ class HTMLResult(Result): class BinaryResult(Result): """An object of this class combines a status code with HTML contents.""" - def __init__(self, contents, status=200, - mimetype='application/octet-stream'): + def __init__(self, contents, + mimetype='application/octet-stream', status=200): self.contents = contents self.status = status self.mimetype = mimetype -- 1.9.1
From d172f236441c888a3e47a40363d4b1f283709a98 Mon Sep 17 00:00:00 2001 From: u451f <u...@451f.org> Date: Sun, 14 Sep 2014 22:43:06 +0200 Subject: [PATCH 2/4] use modern html5 css. switch to external stylesheet. --- bin/tracker_service.css | 133 ++++++++++++++++++++++++++++++++++++++++++++++ bin/tracker_service.py | 55 ++++++++----------- lib/python/web_support.py | 12 ++++- 3 files changed, 164 insertions(+), 36 deletions(-) diff --git a/bin/tracker_service.css b/bin/tracker_service.css index e69de29..0e02a61 100644 --- a/bin/tracker_service.css +++ b/bin/tracker_service.css @@ -0,0 +1,133 @@ +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust:100%; +} + +body { + width: 90%; + max-width: 1200px; + margin: 2em auto 1em; + font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; + font-size: 14px; + line-height: 20px; + color: #333333; +} + +header { + border-bottom: 1px solid crimson; + margin-bottom: 2em; +} + +a { + color:#0088cc; + text-decoration:none; +} + +a:hover, a:focus { + color:#005580; + text-decoration:underline; +} + +ul, li { + list-style: none; +} + +ul, ol { + padding-left: 0; +} + +h1 { + font-size : 250%; + padding: 0; + margin: 0; + line-height: 1.4em; +} + +h2 { + font-size : 110%; + background: crimson; + margin: 1em 0 0; + padding: 0.5em; + color: #fff; + border-top-left-radius: 0.5em; + border-top-right-radius: 0.5em; +} + +h3 { + font-size : 110%; +} + +table { + width: 100%; + border: 1px solid #ddd; + border-radius: 0.5em; + border-collapse: collapse; + box-shadow: 0 1px 3px #eee; + margin-bottom: 2em; +} + +tr(even) { + background-color: #fafafa; +} + +td, th { + text-align: left; + padding: 0.25em 0.5em; + border-bottom: 1px solid #ddd; + border-collapse: collapse; + vertical-align: top; +} + +table tr:last-child td { + border: none; +} + +th { + background: #eee; + padding: 0.5em; +} + +hr { + display: none; +} + +footer { + text-align: center; + margin-top: 1em; +} + +form { + text-align: center; + padding: 1em 0; + margin: 1em 0; + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; +} + +span.red { color: red; } +span.purple { color: purple; } +span.green { color: green; } +span.dangerous { color: rgb(191,127,0); } + +@media all and (max-width: 641px) { + body { + font-size: 13px; + } + table { + table-layout: fixed; + } + td, th { + overflow: hidden; + } +} + +@media all and (min-width: 641px) { + header { + background: url(https://tracker.debian.org/static/img/logo.png) top right no-repeat; + min-height: 60px; + } + h1 { + line-height: 2.4em; + } +} diff --git a/bin/tracker_service.py b/bin/tracker_service.py index 79662b0..f002cc4 100644 --- a/bin/tracker_service.py +++ b/bin/tracker_service.py @@ -86,37 +86,24 @@ class BugFilterNoDSA(BugFilter): return nodsa and not self.params['show_nodsa'] class TrackerService(webservice_base_class): - head_contents = compose(STYLE( - """h1 { font-size : 144%; } -h2 { font-size : 120%; } -h3 { font-size : 100%; } - -table { padding-left : 1.5em } -td, th { text-align : left; - padding-left : 0.25em; - padding-right : 0.25em; } -td { vertical-align: baseline } -span.red { color: red; } -span.purple { color: purple; } -span.green { color: green; } -span.dangerous { color: rgb(191,127,0); } -"""), SCRIPT('''var old_query_value = ""; - -function selectSearch() { - document.searchForm.query.focus(); -} - -function onSearch(query) { - if (old_query_value == "") { - if (query.length > 5) { - old_query_value = query; - document.searchForm.submit(); - } else { - old_query_value = query; - } - } -} -''')).toHTML() + head_contents = compose( + LINK(' ', href="/tracker/style.css"), + SCRIPT('''var old_query_value = ""; + function selectSearch() { + document.searchForm.query.focus(); + } + + function onSearch(query) { + if (old_query_value == "") { + if (query.length > 5) { + old_query_value = query; + document.searchForm.submit(); + } else { + old_query_value = query; + } + } + } + ''')).toHTML() nvd_text = P('''If a "**" is included, the urgency field was automatically assigned by the NVD (National Vulnerability Database). Note that this @@ -232,7 +219,7 @@ aware of and/or help us improve the quality of this information by """, P("""(You can enter CVE names, Debian bug numbers and package names in the search forms.)"""), - H2("External interfaces"), + H3("External interfaces"), P("""If you want to automatically open a relevant web page for some object, use the """, CODE(str(url.scriptRelative("redirect/")), EM("object")), @@ -1223,7 +1210,7 @@ Debian bug number.'''), append(HR()) if not search_in_page: append(self.make_search_button(url)) - append(P(A(url.scriptRelative(""), "Home"), + append(FOOTER(P(A(url.scriptRelative(""), "Home"), " - ", A(url.absolute("http://secure-testing.debian.net/"), "Testing Security Team"), " - ", A(url.absolute("https://www.debian.org/security/"), @@ -1231,7 +1218,7 @@ Debian bug number.'''), " - ", A(url.absolute("https://anonscm.debian.org/viewvc/secure-testing/bin/tracker_service.py?view=markup"), "Source"), " ", A(url.absolute("svn://anonscm.debian.org/svn/secure-testing"), "(SVN)"), - )) + ))) if search_in_page: on_load = "selectSearch()" else: diff --git a/lib/python/web_support.py b/lib/python/web_support.py index e8b055c..f4d267e 100644 --- a/lib/python/web_support.py +++ b/lib/python/web_support.py @@ -379,6 +379,8 @@ def STYLE(contents, type='text/css'): return tag('style', contents, type=type) def SCRIPT(contents, type="text/javascript", language="JavaScript"): return tag('script', contents, type=type, language=language) +def LINK(contents, type="text/css", rel="stylesheet", href=""): + return tag('link', contents, type=type, rel=rel, href=href) def TITLE(contents): return tag('title', contents) def HTML(head, body): @@ -391,6 +393,8 @@ def H1(contents): return tag('h1', contents) def H2(contents): return tag('h2', contents) +def H3(contents): + return tag('h3', contents) def P(*contents): return Tag('p', contents) def SPAN(*__contents, **__attribs): @@ -419,6 +423,10 @@ def INPUT(*__contents, **__attribs): return Tag('input', __contents, __attribs) def LI(*__contents, **__attribs): return Tag('li', __contents, __attribs) +def HEADER(*__contents, **__attribs): + return Tag('header', __contents, __attribs) +def FOOTER(*__contents, **__attribs): + return Tag('footer', __contents, __attribs) def _linkify(match): extra = match.group(2) @@ -691,7 +699,7 @@ class WebServiceBase: def html_dtd(self): """Returns the DOCTYPE declaration to be used for HTML documents. Can be overridden.""" - return '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">' + return '<!DOCTYPE html>' def add_title(self, title, body, head_contents=None, body_attribs={}): """Takes a sequence of HTML objects and wraps them in 'body' @@ -711,7 +719,7 @@ class WebServiceBase: body_list = [body] else: body_list = list(body) - body_list[:0] = (H1(title),) + body_list[:0] = (HEADER(H1(title)),) return tag('html', (HEAD(head_list), Tag('body', body_list, body_attribs))) -- 1.9.1
From 8a84725d8657d66a5807f60332a3c280a0603e32 Mon Sep 17 00:00:00 2001 From: Holger Levsen <hol...@layer-acht.org> Date: Mon, 15 Sep 2014 01:16:23 +0200 Subject: [PATCH 3/4] introduce new directory and serve static files from there, currently just static/style.css --- bin/tracker_service.css | 133 ------------------------------------------------ bin/tracker_service.py | 2 +- static/style.css | 133 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 134 insertions(+), 134 deletions(-) delete mode 100644 bin/tracker_service.css create mode 100644 static/style.css diff --git a/bin/tracker_service.css b/bin/tracker_service.css deleted file mode 100644 index 0e02a61..0000000 --- a/bin/tracker_service.css +++ /dev/null @@ -1,133 +0,0 @@ -html { - font-size: 100%; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust:100%; -} - -body { - width: 90%; - max-width: 1200px; - margin: 2em auto 1em; - font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; - font-size: 14px; - line-height: 20px; - color: #333333; -} - -header { - border-bottom: 1px solid crimson; - margin-bottom: 2em; -} - -a { - color:#0088cc; - text-decoration:none; -} - -a:hover, a:focus { - color:#005580; - text-decoration:underline; -} - -ul, li { - list-style: none; -} - -ul, ol { - padding-left: 0; -} - -h1 { - font-size : 250%; - padding: 0; - margin: 0; - line-height: 1.4em; -} - -h2 { - font-size : 110%; - background: crimson; - margin: 1em 0 0; - padding: 0.5em; - color: #fff; - border-top-left-radius: 0.5em; - border-top-right-radius: 0.5em; -} - -h3 { - font-size : 110%; -} - -table { - width: 100%; - border: 1px solid #ddd; - border-radius: 0.5em; - border-collapse: collapse; - box-shadow: 0 1px 3px #eee; - margin-bottom: 2em; -} - -tr(even) { - background-color: #fafafa; -} - -td, th { - text-align: left; - padding: 0.25em 0.5em; - border-bottom: 1px solid #ddd; - border-collapse: collapse; - vertical-align: top; -} - -table tr:last-child td { - border: none; -} - -th { - background: #eee; - padding: 0.5em; -} - -hr { - display: none; -} - -footer { - text-align: center; - margin-top: 1em; -} - -form { - text-align: center; - padding: 1em 0; - margin: 1em 0; - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; -} - -span.red { color: red; } -span.purple { color: purple; } -span.green { color: green; } -span.dangerous { color: rgb(191,127,0); } - -@media all and (max-width: 641px) { - body { - font-size: 13px; - } - table { - table-layout: fixed; - } - td, th { - overflow: hidden; - } -} - -@media all and (min-width: 641px) { - header { - background: url(https://tracker.debian.org/static/img/logo.png) top right no-repeat; - min-height: 60px; - } - h1 { - line-height: 2.4em; - } -} diff --git a/bin/tracker_service.py b/bin/tracker_service.py index f002cc4..523213d 100644 --- a/bin/tracker_service.py +++ b/bin/tracker_service.py @@ -150,7 +150,7 @@ class TrackerService(webservice_base_class): self.register('style.css', self.page_style_css) def page_style_css(self, path, params, url): - f=open('tracker_service.css', 'r') + f=open('../static/style.css', 'r') content=f.read() f.close() return BinaryResult(content,'text/css') diff --git a/static/style.css b/static/style.css new file mode 100644 index 0000000..0e02a61 --- /dev/null +++ b/static/style.css @@ -0,0 +1,133 @@ +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust:100%; +} + +body { + width: 90%; + max-width: 1200px; + margin: 2em auto 1em; + font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; + font-size: 14px; + line-height: 20px; + color: #333333; +} + +header { + border-bottom: 1px solid crimson; + margin-bottom: 2em; +} + +a { + color:#0088cc; + text-decoration:none; +} + +a:hover, a:focus { + color:#005580; + text-decoration:underline; +} + +ul, li { + list-style: none; +} + +ul, ol { + padding-left: 0; +} + +h1 { + font-size : 250%; + padding: 0; + margin: 0; + line-height: 1.4em; +} + +h2 { + font-size : 110%; + background: crimson; + margin: 1em 0 0; + padding: 0.5em; + color: #fff; + border-top-left-radius: 0.5em; + border-top-right-radius: 0.5em; +} + +h3 { + font-size : 110%; +} + +table { + width: 100%; + border: 1px solid #ddd; + border-radius: 0.5em; + border-collapse: collapse; + box-shadow: 0 1px 3px #eee; + margin-bottom: 2em; +} + +tr(even) { + background-color: #fafafa; +} + +td, th { + text-align: left; + padding: 0.25em 0.5em; + border-bottom: 1px solid #ddd; + border-collapse: collapse; + vertical-align: top; +} + +table tr:last-child td { + border: none; +} + +th { + background: #eee; + padding: 0.5em; +} + +hr { + display: none; +} + +footer { + text-align: center; + margin-top: 1em; +} + +form { + text-align: center; + padding: 1em 0; + margin: 1em 0; + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; +} + +span.red { color: red; } +span.purple { color: purple; } +span.green { color: green; } +span.dangerous { color: rgb(191,127,0); } + +@media all and (max-width: 641px) { + body { + font-size: 13px; + } + table { + table-layout: fixed; + } + td, th { + overflow: hidden; + } +} + +@media all and (min-width: 641px) { + header { + background: url(https://tracker.debian.org/static/img/logo.png) top right no-repeat; + min-height: 60px; + } + h1 { + line-height: 2.4em; + } +} -- 1.9.1
From 9c9738636e709f5547deaf5bd64bd1232d605de3 Mon Sep 17 00:00:00 2001 From: Holger Levsen <hol...@layer-acht.org> Date: Mon, 15 Sep 2014 01:22:45 +0200 Subject: [PATCH 4/4] use local copy of Debian logo.png --- bin/tracker_service.py | 7 +++++++ static/logo.png | Bin 0 -> 6733 bytes static/style.css | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 static/logo.png diff --git a/bin/tracker_service.py b/bin/tracker_service.py index 523213d..7c5b31d 100644 --- a/bin/tracker_service.py +++ b/bin/tracker_service.py @@ -148,6 +148,7 @@ class TrackerService(webservice_base_class): self.register('debsecan/**', self.page_debsecan) self.register('data/report', self.page_report) self.register('style.css', self.page_style_css) + self.register('logo.png', self.page_logo_png) def page_style_css(self, path, params, url): f=open('../static/style.css', 'r') @@ -155,6 +156,12 @@ class TrackerService(webservice_base_class): f.close() return BinaryResult(content,'text/css') + def page_logo_png(self, path, params, url): + f=open('../static/logo.png', 'r') + content=f.read() + f.close() + return BinaryResult(content,'image/png') + def page_home(self, path, params, url): query = params.get('query', ('',))[0] if query: diff --git a/static/logo.png b/static/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d1321d8f4534ddedd013a3f7921b76446741fbd8 GIT binary patch literal 6733 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 literal 0 HcmV?d00001 diff --git a/static/style.css b/static/style.css index 0e02a61..42f6f4d 100644 --- a/static/style.css +++ b/static/style.css @@ -124,7 +124,7 @@ span.dangerous { color: rgb(191,127,0); } @media all and (min-width: 641px) { header { - background: url(https://tracker.debian.org/static/img/logo.png) top right no-repeat; + background: url(/tracker/logo.png) top right no-repeat; min-height: 60px; } h1 { -- 1.9.1
signature.asc
Description: This is a digitally signed message part.