From 21779bfb08067d38a43f5af9667082a3ea8ca043 Mon Sep 17 00:00:00 2001 From: Joerg Jaspert Date: Fri, 19 Dec 2008 23:00:45 +0100 Subject: [PATCH] html fun * daklib/utils.py: move the html escape stuff here. * dak/examine_package.py: Remove the html escape stuff. * dak/queue_report.py: lotsa html changes to get more info on the page and to get Tinchos css foo working. * web/style.css: Added new stuff from Tincho Signed-off-by: Joerg Jaspert --- ChangeLog | 11 +++ dak/examine_package.py | 16 +-- dak/queue_report.py | 220 +++++++++++++++++++++++++---------------- daklib/utils.py | 8 ++ web/style.css | 102 +++++++++++++++++++ 5 files changed, 262 insertions(+), 95 deletions(-) diff --git a/ChangeLog b/ChangeLog index f3f16af3..61903eba 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2008-12-19 Joerg Jaspert + + * daklib/utils.py: move the html escape stuff here. + + * dak/examine_package.py: Remove the html escape stuff. + + * dak/queue_report.py: lotsa html changes to get more info on the + page and to get Tinchos css foo working. + + * web/style.css: Added new stuff from Tincho + 2008-12-16 Joerg Jaspert * config/debian/cron.dinstall: Run logs.py as last command before diff --git a/dak/examine_package.py b/dak/examine_package.py index ae3ec6c9..c7ab7ad5 100755 --- a/dak/examine_package.py +++ b/dak/examine_package.py @@ -55,9 +55,6 @@ re_version = re.compile('^(.*)\((.*)\)') re_newlinespace = re.compile('\n') re_spacestrip = re.compile('(\s)') -html_escaping = {'"':'"', '&':'&', '<':'<', '>':'>'} -re_html_escaping = re.compile('|'.join(map(re.escape, html_escaping.keys()))) - ################################################################################ Cnf = None @@ -89,12 +86,9 @@ PACKAGE can be a .changes, .dsc, .deb or .udeb filename.""" ################################################################################ # probably xml.sax.saxutils would work as well -def html_escape(s): - return re_html_escaping.sub(lambda x: html_escaping.get(x.group(0)), s) - def escape_if_needed(s): if use_html: - return re_html_escaping.sub(lambda x: html_escaping.get(x.group(0)), s) + return utils.re_html_escaping.sub(lambda x: utils.html_escaping.get(x.group(0)), s) else: return s @@ -103,9 +97,9 @@ def headline(s, level=2, bodyelement=None): if bodyelement: print """ %(title)s (click to toggle) - """%{"bodyelement":bodyelement,"title":html_escape(s)} + """%{"bodyelement":bodyelement,"title":utils.html_escape(s)} else: - print "%s" % (level, html_escape(s), level) + print "%s" % (level, utils.html_escape(s), level) else: print "---- %s ----" % (s) @@ -130,7 +124,7 @@ html_colours = { def colour_output(s, colour): if use_html: - return ("%s%s%s" % (html_colours[colour][0], html_escape(s), html_colours[colour][1])) + return ("%s%s%s" % (html_colours[colour][0], utils.html_escape(s), html_colours[colour][1])) else: return ("%s%s%s" % (ansi_colours[colour], s, ansi_colours['end'])) @@ -146,7 +140,7 @@ def formatted_text(s, strip=False): if use_html: if strip: s = s.strip() - return "
%s
" % (html_escape(s)) + return "
%s
" % (utils.html_escape(s)) else: return s diff --git a/dak/queue_report.py b/dak/queue_report.py index aa1c54da..33e26594 100755 --- a/dak/queue_report.py +++ b/dak/queue_report.py @@ -36,6 +36,7 @@ import copy, glob, os, stat, sys, time import apt_pkg +import cgi from daklib import queue from daklib import utils from daklib.dak_exceptions import * @@ -157,100 +158,133 @@ def sortfunc(a,b): ############################################################ def header(): - print """ - - Debian NEW and BYHAND Packages - - - - -
- - - - Debian Project -
-
- - - - - - - - - - -
- Debian NEW and BYHAND Packages -
- -
- """ + print """ + + + + + + + Debian NEW and BYHAND Packages + + + + +
+ + corner image + corner image + corner image + corner image + + Debian NEW and BYHAND Packages + +
+ """ def footer(): - print "

Timestamp: %s (UTC)

" % (time.strftime("%d.%m.%Y / %H:%M:%S", time.gmtime())) - print "

Hint: Age is the youngest upload of the package, if there is more than one version.

" - print "

You may want to look at the REJECT-FAQ for possible reasons why one of the above packages may get rejected.

" - print """ - Valid HTML 4.01! - - Valid CSS! + print "

Timestamp: %s (UTC)

" % (time.strftime("%d.%m.%Y / %H:%M:%S", time.gmtime())) + + print """ + """ - print "" -def table_header(type): +def table_header(type, source_count, total_count): print "

Summary for: %s

" % (type) - print """
+ print """ +
+ + - - - - - - - + + + + + + + - """ + + + """ -def table_footer(type, source_count, total_count): - print "
+ """ + print "Package count in %s: %s |  Total Package count: %s" % (type, source_count, total_count) + print """ +
PackageVersionArchDistributionAgeMaintainerClosesPackageVersionArchDistributionAgeUpload infoCloses

\n" - print "

Package count in %s: %s\n" % (type, source_count) - print "
Total Package count: %s

\n" % (total_count) +def table_footer(type): + print "" -def table_row(source, version, arch, last_mod, maint, distribution, closes): +def table_row(source, version, arch, last_mod, maint, distribution, closes, fingerprint, sponsor, changedby): global row_number + trclass = "sid" + for dist in distribution: + if dist == "experimental": + trclass = "exp" + if row_number % 2 != 0: - print "" + print "" % (trclass) else: - print "" + print "" % (trclass) - tdclass = "sid" - for dist in distribution: - if dist == "experimental": - tdclass = "exp" - print "%s" % (tdclass, source) - print "" % (tdclass) + print "%s" % (source) + print "" for vers in version.split(): - print "%s
" % (source, vers, vers) - print "%s" % (tdclass, arch, tdclass) + print "%s
" % (source, utils.html_escape(vers), utils.html_escape(vers)) + print "" + print "%s" % (arch) + print "" for dist in distribution: - print "%s
" % (dist) - print "%s" % (tdclass, last_mod) + print "%s
" % (dist) + print "" + print "%s" % (last_mod) (name, mail) = maint.split(":") - print "%s" % (tdclass, mail, name) - print "" % (tdclass) + print "" + print "Maintainer: %s
" % (utils.html_escape(mail), utils.html_escape(name)) + (name, mail) = changedby.split(":") + print "Changed-By: %s
" % (utils.html_escape(mail), utils.html_escape(name)) + + try: + (login, domain) = sponsor.split("@") + print "Sponsor: %s@debian.org
" % (utils.html_escape(login), utils.html_escape(login)) + except: + pass + + print "Fingerprint: %s" % (fingerprint) + print "" + + print "" for close in closes: - print "#%s
" % (close, close) + print "#%s
" % (utils.html_escape(close), utils.html_escape(close)) print "" row_number+=1 @@ -306,11 +340,15 @@ def process_changes_files(changes_files, type): max_source_len = 0 max_version_len = 0 max_arch_len = 0 - maintainer = {} - maint="" - distribution="" - closes="" for i in per_source_items: + maintainer = {} + maint="" + distribution="" + closes="" + fingerprint="" + changeby = {} + changedby="" + sponsor="" last_modified = time.time()-i[1]["oldest"] source = i[1]["list"][0]["source"] if len(source) > max_source_len: @@ -328,8 +366,22 @@ def process_changes_files(changes_files, type): maintainer["maintainername"] = "Unknown" maintainer["maintaineremail"] = "Unknown" maint="%s:%s" % (maintainer["maintainername"], maintainer["maintaineremail"]) + # ...likewise for the Changed-By: field if it exists. + try: + (changeby["changedby822"], changeby["changedby2047"], + changeby["changedbyname"], changeby["changedbyemail"]) = \ + utils.fix_maintainer (j["changed-by"]) + except ParseMaintError, msg: + (changeby["changedby822"], changeby["changedby2047"], + changeby["changedbyname"], changeby["changedbyemail"]) = \ + ("", "", "", "") + changedby="%s:%s" % (changeby["changedbyname"], changeby["changedbyemail"]) + distribution=j["distribution"].keys() closes=j["closes"].keys() + fingerprint=j["fingerprint"] + if j.has_key("sponsoremail"): + sponsor=j["sponsoremail"] for arch in j["architecture"].keys(): arches[arch] = "" version = j["version"] @@ -346,7 +398,7 @@ def process_changes_files(changes_files, type): note = " | [N]" else: note = "" - entries.append([source, version_list, arch_list, note, last_modified, maint, distribution, closes]) + entries.append([source, version_list, arch_list, note, last_modified, maint, distribution, closes, fingerprint, sponsor, changedby]) # direction entry consists of "Which field, which direction, time-consider" where # time-consider says how we should treat last_modified. Thats all. @@ -391,20 +443,20 @@ def process_changes_files(changes_files, type): # Output for a html file. First table header. then table_footer. # Any line between them is then a printed from subroutine table_row. if len(entries) > 0: - table_header(type.upper()) - for entry in entries: - (source, version_list, arch_list, note, last_modified, maint, distribution, closes) = entry - table_row(source, version_list, arch_list, time_pp(last_modified), maint, distribution, closes) total_count = len(changes_files) source_count = len(per_source_items) - table_footer(type.upper(), source_count, total_count) + table_header(type.upper(), source_count, total_count) + for entry in entries: + (source, version_list, arch_list, note, last_modified, maint, distribution, closes, fingerprint, sponsor, changedby) = entry + table_row(source, version_list, arch_list, time_pp(last_modified), maint, distribution, closes, fingerprint, sponsor, changedby) + table_footer(type.upper()) else: # The "normal" output without any formatting. format="%%-%ds | %%-%ds | %%-%ds%%s | %%s old\n" % (max_source_len, max_version_len, max_arch_len) msg = "" for entry in entries: - (source, version_list, arch_list, note, last_modified, undef, undef, undef) = entry + (source, version_list, arch_list, note, last_modified, undef, undef, undef, undef, undef, undef) = entry msg += format % (source, version_list, arch_list, note, time_pp(last_modified)) if msg: diff --git a/daklib/utils.py b/daklib/utils.py index fc1465d1..47c80f3c 100755 --- a/daklib/utils.py +++ b/daklib/utils.py @@ -50,6 +50,9 @@ re_verwithext = re.compile(r"^(\d+)(?:\.(\d+))(?:\s+\((\S+)\))?$") re_srchasver = re.compile(r"^(\S+)\s+\((\S+)\)$") +html_escaping = {'"':'"', '&':'&', '<':'<', '>':'>'} +re_html_escaping = re.compile('|'.join(map(re.escape, html_escaping.keys()))) + default_config = "/etc/dak/dak.conf" default_apt_config = "/etc/dak/apt.conf" @@ -62,6 +65,11 @@ known_hashes = [("sha1", apt_pkg.sha1sum, (1, 8)), ################################################################################ +def html_escape(s): + return re_html_escaping.sub(lambda x: html_escaping.get(x.group(0)), s) + +################################################################################ + def open_file(filename, mode='r'): try: f = open(filename, mode) diff --git a/web/style.css b/web/style.css index b942d1b0..cb427719 100644 --- a/web/style.css +++ b/web/style.css @@ -300,3 +300,105 @@ a:hover{ #NEW-details-page td pre { margin: 0pt } + +/* + * Added by Tincho 2008/12/18 + */ +#NEW p { + font-weight: normal; +} +#NEW div.footer { + border-top: 1px solid black; +} +#NEW p.timestamp { + text-align: right; + font-size: 90%; + font-family: monospace; + margin: 0px; +} +table.NEW { + margin: auto auto; + width: 95%; +} +table.NEW tr { + background-color: #FFF; + text-align: left; +} +table.NEW tr.exp td.package, table.NEW tr.exp td.distribution, table.NEW tr.exp td.arch, table.NEW tr.exp td.age { + color: #c00; +} +table.NEW tr.sid { + color: #000; +} +table.NEW tr.odd { + background-color: #FFFFFF; +} +table.NEW tr.even { + background-color: #e8e8e8; +} +table.NEW td { + vertical-align: top; +} +table.NEW td.upload-data { +} +table.NEW span.signature { + font-size: 60%; +} +table.NEW caption { + caption-side: bottom; + background-color: #FFF; +} +/* + * Copied from removals-style.css + */ +a img { + text-decoration: none; + border: none; +} +#logo { + text-align: center; + margin-bottom: 1.5em; +} +#titleblock { + position: relative; + width: 100%; + text-align: center; + background-color: #DF0451; + color: #FFFF00; + padding: 0.2em; +} + .titleblock a { + color: #FFFF00; + text-decoration: none; + } + .titleblock a:hover { + color: #FFFF00; + text-decoration: underline; + } + #red-upperleft { + position: absolute; + top: 0px; + left: 0px; + } + #red-lowerleft { + position: absolute; + bottom: 0px; + left: 0px; + } + #red-upperright { + position: absolute; + top: 0px; + right: 0px; + } + #red-lowerright { + position: absolute; + bottom: 0px; + right: 0px; + } + .title { + vertical-align: middle; + font-weight: normal; + font-family: serif; + font-size: 22px; + } + -- 2.39.2