Refactor front-end display code

Signed-off-by: Martin J. Bligh <mbligh@google.com>



git-svn-id: http://test.kernel.org/svn/autotest/trunk@675 592f7852-d20e-0410-864c-8624ca9c26a4
diff --git a/tko/display.py b/tko/display.py
index 2bcaefd..3e29285 100755
--- a/tko/display.py
+++ b/tko/display.py
@@ -4,102 +4,146 @@
 
 db = db.db() # db.db(debug=True)
 
+color_map = {
+	'GOOD'		: '#66ff66', # green
+	'WARN'		: '#fffc00', # yellow
+	'FAIL'		: '#ff6666', # red
+	'ABORT'		: '#ff6666', # red
+	'ERROR'		: '#ff6666', # red
+	'NOSTATUS'	: '#ffffff', # white
+	'white'		: '#ffffff', # white
+	'green'		: '#66ff66', # green
+	'yellow'	: '#fffc00', # yellow
+	'red'		: '#ff6666', # red
+}
 
-def print_kernel_machine(kernel, machine):
+
+class box:
+	def __init__(self, data, color_key = None, header = False):
+		self.data = data
+		if color_map.has_key(color_key):
+			self.color = color_map[color_key]
+		else:
+			self.color = color_map['white']
+		self.header = header
+
+
+	def display(self):
+		if self.data:
+			data = self.data
+		else:
+			data = '&nbsp'
+
+		if self.header:
+			box_html = 'th'
+		else:
+			box_html = 'td'
+
+		print "<%s bgcolor=%s>" % (box_html, self.color)
+		print data
+		print "</%s>" % box_html
+
+
+def print_table(matrix):
+	"""
+	matrix: list of lists of boxes, giving a matrix of data
+	Each of the inner lists is a row, not a column.
+
+	Display the given matrix of data as a table.
+	"""
+
+	print '<table cellpadding=5 border=1 class="boldtable">'
+	for row in matrix:
+		print '<tr>'
+		for element in row:
+			print element
+			element.display()
+		print '</tr>'
+	print '</table>'
+
+
+def kernel_machine_box(kernel, machine):
 	status = None
 	status_word = ''
 	tests = frontend.test.select(db, { 'kernel_idx' : kernel.idx ,
-				  'machine' : machine })
+					   'machine' : machine })
 	for t in tests:
 		if not status or t.status_num < status:
 			status = t.status_num
 			status_word = db.status_word[status]
-	# lines = ['%s %s<br>' % (t.subdir, t.status_word) for t in tests]
-	# print_colored_box(status_word, '\n'.join(lines))
+
 	link = 'machine_kernel_test.cgi?machine=%s&kernel=%s' % \
 					(machine, kernel.idx)
 	if status_word:
 		html = '<a href="%s">%s</a>' % (link, status_word)
 	else:
 		html = None
-	print_colored_box(status_word, html)
-
-
-def print_colored_box(status, html):
-	if not html:
-		html = '&nbsp'
-	print "<td bgcolor=%s>" % frontend.status_colour[status]
-	print html
-	print "</td>"
-
-
-def print_machines_row(machines):
-	print "<tr>"
-	print "<th>Version</th>"
-	for machine in machines:
-		print "<th>%s</th>" % machine
-	print "</tr>"
-	print ""
+	return box(html, color_key = status_word)
 
 
 def kernel_encode(kernel):
 	return kernel_versions.version_encode(kernel.printable)
 
 
-def print_machine_vs_kernel(machines):
-	print '<table cellpadding=5 border=1 class="boldtable">'
-	print_machines_row(machines)
+def print_machines_vs_all_kernels(machines):
+	header_row = [ box(x, header=True) for x in ['Version'] + machines ] 
 
 	kernels = frontend.kernel.select(db)
 	kernels.sort(key = kernel_encode, reverse = True)
-	for kernel in kernels:
-		print "<tr>"
-		print "<td>%s</td>" % kernel.printable
-		for machine in machines:
-			print_kernel_machine(kernel, machine)
-		print "</tr>"
-		print ""
 
-	print_machines_row(machines)
-	print "</table>"
+	matrix = [header_row]
+	for kernel in kernels:
+		row = [box(kernel.printable)]
+		for machine in machines:
+			row.append(kernel_machine_box(kernel, machine))
+		matrix.append(row)
+	matrix.append(header_row)
+
+	print_table(matrix)
+
+
+def sort_tests(tests):
+	kernel_order = ['patch', 'config', 'build', 'mkinitrd', 'install']
+
+	results = []
+	for kernel_op in kernel_order:
+		test = 'kernel.' + kernel_op
+		if tests.count(test):
+			results.append(test)
+			tests.remove(test)
+	return results + sorted(tests)
 
 
 def print_kernel_machines_vs_test(machines, kernel_idx, html_root):
 	# first we have to get a list of all run tests across all machines
-	all_tests = {}
-	all_kernel = {}
-	results = {}
+	all_tests = []
+	results = {}         # will be a 2d hash [machine][testname]
 	for machine in machines:
 		where = { 'kernel_idx' : kernel_idx , 'machine' : machine }
 		tests = frontend.test.select(db, where)
 		test_dict = {}
 		for test in tests:
-			if test.subdir.startswith('kernel.'):
-				all_kernel[test.subdir] = True
-			else:
-				all_tests[test.subdir] = True
+			all_tests.append(test.subdir)
 			test_dict[test.subdir] = test
 		results[machine] = test_dict
-	test_list = sorted(all_kernel.keys()) + sorted(all_tests.keys())
+	test_list = sort_tests(all_tests)
 
 	kernel = frontend.kernel.select(db, {'kernel_idx' : kernel_idx })[0]
 	print '<h1>%s</h1>' % kernel.printable
 
-	print '<table cellpadding=5 border=1 class="boldtable">'
-	# First let's get the header row
-	print "<tr>"
-	print "<td></td>"
-	for testname in test_list:
-		print "<td>%s</td>" % testname
-	print "</tr>"
+	header_row = [ box(re.sub(r'kernel.', r'kernel<br>', x), header=True)
+				for x in ['Version'] + test_list ]
+	matrix = [header_row]
 
 	for machine in machines:
-		print "\n<tr>"
-		print "<td>%s</td>" % machine
+		row = [box(machine)]
 		for testname in test_list:
 			test = results[machine][testname]
 			html = '<a href="%s">%s</a>' % \
 						(test.url, test.status_word)
-			print_colored_box(test.status_word, html)
-		print "</tr>"
-	print '</table>'
+			row.append(box(html, color_key = test.status_word))
+		matrix.append(row)
+	matrix.append(header_row)
+
+	print_table(matrix)
+