=== modified file 'code/modules/qatracker/qatracker.display.php'
--- code/modules/qatracker/qatracker.display.php	2010-10-13 10:36:19 +0000
+++ code/modules/qatracker/qatracker.display.php	2011-02-28 17:05:46 +0000
@@ -1,6 +1,7 @@
 <?php
 /*
 Copyright (C) 2007 Stephane Graber <stgraber@ubuntu.com>
+Copyright (C) 2010-2011 Sergio Zanchetta <primes2h@ubuntu.com>
 
 This program is free software; you can redistribute it and/or
 modify it under the terms of the GNU General Public License
@@ -129,6 +130,16 @@
 			else
 				return drupal_access_denied();
 		break;
+		case "laptop":
+			if ($site->id == 12) {
+				if (count($args) > 2)
+					$content=qatracker_laptopreport($args[2],$args[1]);
+				else
+					$content=qatracker_laptopsummary();
+			}
+			else
+				return drupal_not_found();
+		break;
 		default:
 			return drupal_not_found();
 		break;
@@ -851,6 +862,245 @@
 	return $content;
 }
 
+function qatracker_laptopreport($reporterID,$release) {
+	global $site;
+	$laptop_settings= db_query("SELECT 
+						qawebsite_user_setting.title,
+						qawebsite_user_setting_info.value 
+						FROM qawebsite_user_setting 
+						LEFT JOIN qawebsite_user_setting_info ON qawebsite_user_setting.id=qawebsite_user_setting_info.settingid 
+						WHERE userid='".$reporterID."' AND siteid='".$site->id."'");
+
+	$lpusername = db_result(db_query("SELECT value from qawebsite_user_setting_info WHERE userid='".$reporterID."' AND settingid='1'"));
+	$reporter = db_result(db_query("SELECT name from users WHERE uid='".$reporterID."'"));
+	if ($reporter == null)
+		return "";
+
+	$laptopnameitem=array();
+	for ($i = 0;$i < 2; $i++)
+		array_push($laptopnameitem,db_fetch_object($laptop_settings)->value);
+
+	$laptopname=implode(" ",$laptopnameitem);
+	$content.="<h1>".$laptopname."</h1><br \>";
+	$content.="
+			<h3>Reporter: &nbsp; &nbsp;".$reporter."&nbsp; → &nbsp; <a rel=\"external\" href=\"https://launchpad.net/".$lpusername."\">".$lpusername."</a></h3><br \>";
+	if (db_result(db_query("SELECT count(id) FROM qatracker_milestone WHERE title LIKE '".$release."%'")) == "0")
+		$content.="     <h1>This release is not present on the tracker</h1>";
+
+	$products=db_query("SELECT id FROM qatracker_product WHERE siteid='".$site->id."'");
+		while ($product=db_fetch_object($products)) {
+			if (db_result(db_query("SELECT 
+							count(qatracker_result.id) 
+							FROM qatracker_result 
+							LEFT JOIN qatracker_build ON qatracker_result.buildid=qatracker_build.id 
+							LEFT JOIN qatracker_milestone ON qatracker_build.milestoneid=qatracker_milestone.id 
+							WHERE reporterid='".$reporterID."' AND productid='".$product->id."' AND title LIKE '".$release."%'")) != "0") {
+				$content.=qatracker_laptopstat($product->id,$reporterID,$release);
+				$content.="<br />";
+				$content.="<br />";
+			}
+		} 
+	$content.="<br />
+                                <h2>Hardware information:</h2>";
+	while($laptop_setting = db_fetch_object($laptop_settings)) {
+		$laptop_setting->title=substr($laptop_setting->title,3);
+		$content.="
+				<table class=\"listing\" style=\"width:auto;\">
+				<tr><td><b>".$laptop_setting->title."</b></td></tr>
+				<tr><td>".nl2br($laptop_setting->value)."</td></tr>
+				</table><br />";
+	}	
+	return $content;
+}
+
+function qatracker_laptopstat($productID,$reporterID,$release) {
+	global $base_url, $site;
+
+	$query=db_query("SELECT 
+				qatracker_build.id AS build, title as milestone 
+				FROM qatracker_build 
+				LEFT JOIN qatracker_milestone ON qatracker_build.milestoneid=qatracker_milestone.id 
+				WHERE siteid='".$site->id."' AND title LIKE '".$release."%' AND productid='".$productID."' 
+				ORDER BY qatracker_milestone.id");
+
+	$testcases=db_query("SELECT id,title FROM qatracker_testcase WHERE productid='".$productID."'");
+	$product = db_result(db_query("SELECT title from qatracker_product WHERE id='".$productID."'"));
+
+	$milestones=array();
+	while ($item = db_fetch_object($query)) {
+		array_push_associative($milestones, array($item->build => $item->milestone));
+	}
+	$content.="	
+			<table cellpadding=\"10\">
+				<caption><h2>".$release." - ".$product.":</h2></caption>
+					<tr class=\"trheader\"><td style=\"width:230px;\"><b>Testcase</b></td>";
+	$archive=array();
+	foreach ($milestones as $build => $milestone) {
+		$milestonename=substr($milestone,strpos($milestone,' '));
+		$status=db_result(db_query("SELECT status FROM qatracker_milestone WHERE qatracker_milestone.title='".$milestone."'"));
+		switch($status) {
+			case "0":
+				$content.="<td style=\"width:170px;text-align:center;\"><p><b>".$milestonename."</b></p><p style=\"color:red;\"><b>Testing</b></p></td>";
+				array_push_associative($archive,array($milestone => 0));
+			break;
+			case "1":
+				$content.="<td style=\"width:170px;text-align:center;\"><p><b>".$milestonename."</b></p><p style=\"color:red;\"><b>Released</b></p></td>";
+				array_push_associative($archive,array($milestone => 0));
+			break;
+			case "2":
+				$content.="<td style=\"width:170px;text-align:center;\"><p><b>".$milestonename."</b></p><p style=\"color:red;\"><b>Archived</b></p></td>";
+				array_push_associative($archive,array($milestone => 1));
+			break;
+		}
+	}
+	$content.="</tr>";
+
+	$item=array();
+	$countv=0;
+	$lastcategory="";
+	while($testcase = db_fetch_object($testcases)) {
+	        $title=explode(" - ", $testcase->title);
+		$category=$title[0];
+		if ($category!=$lastcategory) {
+			$countv++;
+			$content.="<tr><td style=\"background-color:#f6f6f6;\"><b><a href=\"javascript:ShowHide('block".$productID."".$countv."')\"> [+] ".$category." (click to expand)</a></b></td>";
+			foreach($milestones as $build => $milestone) {
+				$category_stat = qatracker_getbuildstat($build,$archive[$milestone],0,$reporterID,$category);
+				$content.="<td style=\"display:table-cell\" align=\"center\" class=\"block".$productID."".$countv."\">".$category_stat."</td>";
+			}
+			$lastcategory=$category;
+			$content.="</tr>";
+		}
+		$content.=" <tr class=\"block".$productID."".$countv."\" style=\"display:none;\">
+				<td style=\"width=230px;\">&nbsp; <img style=\"margin-bottom:0px;\" src=\"$base_url/modules/qatracker/images/test.png\" alt=\"spacer\" /> ".$title[1]."</td>";
+		foreach($milestones as $build => $milestone) {
+			$results=db_fetch_object(db_query("SELECT result,comment FROM qatracker_result WHERE reporterid='".$reporterID."' AND buildid='".$build."' AND testcaseid='".$testcase->id."'"));
+			if ($results->result != null) {
+				$content.="<td style=\"text-align:center;\">";
+				if ($results->comment != null) {
+					$content.="<b style=\"margin-right:-32px;font-size:10px;\">?</b>
+                        				<div class=\"balloonleft\" style=\"margin-bottom:0px;\"><div>
+								<b>Comment: <br \></b>".$results->comment."</div>";
+				}
+				switch($results->result) {
+					case "0":
+						$content.="	<a rel=\"external\" href=\"$base_url/qatracker/result/".$build."/".$testcase->id."\">
+								<img style=\"margin-bottom:0px;\" src=\"$base_url/modules/qatracker/images/fail.png\" alt=\"spacer\" /></a></div>";
+					break;
+					case "1":
+						$content.="	<a rel=\"external\" href=\"$base_url/qatracker/result/".$build."/".$testcase->id."\">
+								<img style=\"margin-bottom:0px;\" src=\"$base_url/modules/qatracker/images/pass.png\" alt=\"spacer\" /></a></div>";
+					break;
+				}
+				$content.="&nbsp;".qatracker_getbugslist($build, $testcase->id, 0)."<br \></td>";
+			}
+			else
+				$content.="<td cellpadding=\"10\" style=\"text-align:center;font-size:10px;\">Not <br \> tested</td>";
+		}
+		$content.="		</tr>";
+	}
+	$content.="		</table>";
+	return $content;
+}
+
+function qatracker_laptopsummary() {
+	global $base_url, $site;
+
+	$content.="<p><br /><b>Laptops tested so far:</b><br /><br /></p>";
+	$content.="	<table class=\"listing\" style=\"padding-bottom:2em;\">
+			<tr class=\"trheader\">
+				<td align=\"left\"><b>Laptop</b></td>
+				<td style=\"align=\"left\"><b>Reporter</b></td>
+				<td style=\"align=\"left\"><b>Report</b></td>
+			</tr>";
+
+	$laptops=db_query("SELECT DISTINCT
+                                        name,settingid,value
+                                        FROM qatracker_result
+                                        LEFT JOIN users ON qatracker_result.reporterid=users.uid
+					LEFT JOIN qawebsite_user_setting_info ON users.uid=qawebsite_user_setting_info.userid
+					WHERE (settingid='1' OR settingid='8' OR settingid='9') ORDER BY name,settingid ASC");
+	$laptopnameitem=array();
+	$lpusername=array();
+	$laptop=array();
+	while ($item = db_fetch_object($laptops)) {
+		switch($item->settingid) {
+			case "1":
+				array_push_associative($lpusername,array($item->name => $item->value));
+			break;
+			case "8":
+				if ($item->value!='') 
+					array_push($laptopnameitem,$item->value);
+			break;
+			case "9":
+				if ($item->value!='') {
+					array_push($laptopnameitem,$item->value);
+					array_push_associative($laptop,array($item->name => implode(" ", $laptopnameitem)));
+					$laptopnameitem=array();
+				}
+			break;
+		}
+	}
+	asort($laptop);
+
+	$milestones=db_query("SELECT title FROM qatracker_milestone WHERE siteid='".$site->id."' ORDER BY id");
+
+	$release=array();
+	$lastreleasename='';
+	while ($milestone = db_fetch_object($milestones)) {
+		$releasename=substr($milestone->title,0,strpos($milestone->title," "));
+		if ($releasename!=$lastreleasename) {
+			array_push($release,$releasename);	
+		}
+		$lastreleasename=$releasename;
+	}
+
+	$lastlaptopmake='';
+	foreach($laptop as $reporter => $laptopname) {
+	       	$laptopmake = substr($laptopname,0,strpos($laptopname," "));
+		$reporterID=db_result(db_query("SELECT uid from users where name='".$reporter."'"));
+		if ($lastlaptopmake != $laptopmake) {
+			$countv++;
+			$content.="<tr><td colspan=\"3\" style=\"background-color:#e6e6e6;\"><b>".$laptopmake."</b></td></tr>";
+		}
+		$content.=" <tr>
+				<td style=\"width:20%;\">&nbsp;".$laptopname."</td>
+				<td style=\"width:30%;\">&nbsp;".$reporter."&nbsp;→&nbsp;<a rel=\"external\" href=\"https://launchpad.net/~".$lpusername[$reporter]."\">".$lpusername[$reporter]."</a></td>";
+
+		$content.="	<td><table>";
+		foreach ($release as $name) {
+			$query=db_query("SELECT qatracker_product.title as product,count(qatracker_result.id) as result from qatracker_result 
+                                                LEFT JOIN qatracker_build ON qatracker_build.id=qatracker_result.buildid 
+                                                LEFT JOIN qatracker_milestone ON qatracker_milestone.id=qatracker_build.milestoneid 
+                                                LEFT JOIN qatracker_product ON qatracker_product.id=qatracker_build.productid
+                                                LEFT JOIN users ON qatracker_result.reporterid=users.uid
+                                                WHERE users.name='".$reporter."' AND qatracker_milestone.title like '".$name."%' GROUP BY product");
+                        $first=True;
+			while($item = db_fetch_object($query)) {
+				if ($first) 
+					$content.="<tr>
+							<td style=\"width:auto;text-align:left\"><a rel=\"external\" href=\"$base_url/qatracker/laptop/".$name."/".$reporterID."\">".$name."</a>&nbsp;</td>
+							<td>&nbsp;(";
+				else
+                                        $content.=", ";
+
+				$content.="".$item->product."";
+                                $first=False;
+			}
+			if (!$first)
+				$content.=")</td></tr>";
+			else
+				$content.="</td></tr>";
+		}
+		$lastlaptopmake=$laptopmake;
+
+		$content.="	</table></td></tr>";
+	}
+	
+	$content.="		</table>";
+	return $content;
+}
+
 function qatracker_buildstat($milestoneID) {
 	if (!is_numeric($milestoneID))
 		return "";
@@ -911,7 +1161,7 @@
 	$content.="</table>";
 	$optional_testcases=db_query("SELECT
 								qatracker_bug.bugnumber, 
-								count(qatracker_bug.bugnumber) as dupe 
+								count(qatracker_bug.bugnumber) as dupe
 								FROM qatracker_bug 
 								LEFT JOIN qatracker_result ON qatracker_result.id=qatracker_bug.resultid 
 								LEFT JOIN qatracker_build ON qatracker_build.id=qatracker_result.buildid 
@@ -959,7 +1209,7 @@
 	$content.="</table>";
 	$previous_bugs=db_query("SELECT
 								qatracker_bug.bugnumber, 
-								count(qatracker_bug.bugnumber) as dupe 
+								count(qatracker_bug.bugnumber) as dupe
 								FROM qatracker_bug 
 								LEFT JOIN qatracker_result ON qatracker_result.id=qatracker_bug.resultid 
 								LEFT JOIN qatracker_build ON qatracker_build.id=qatracker_result.buildid 
@@ -2121,6 +2371,9 @@
 	if (user_access("Registered User")) {
 		$menu['Actions']['My subscriptions']="/qatracker/user/subscription";
 	}
+	if ($site->id == 12) {
+	$menu['Actions']['Laptops summary']="/qatracker/laptop";
+	}
 
 	//Administration pages
 	if (user_access($site->adminrole)) {

=== modified file 'code/modules/qatracker/qatracker.function.php'
--- code/modules/qatracker/qatracker.function.php	2010-10-13 10:36:19 +0000
+++ code/modules/qatracker/qatracker.function.php	2011-02-28 17:05:46 +0000
@@ -1,6 +1,7 @@
 <?php
 /*
 Copyright (C) 2007 Stephane Graber <stgraber@ubuntu.com>
+Copyright (C) 2010-2011 Sergio Zanchetta <primes2h@ubuntu.com>
 
 This program is free software; you can redistribute it and/or
 modify it under the terms of the GNU General Public License
@@ -172,23 +173,39 @@
 			else
 				$path.=" -> <a href=\"/qatracker/archive/".$site->getSetting('default_product')."\">".$site->getSetting('default_product')."</a>";
 		break;
+		case "laptop":
+			if (count($args) > 2)
+				$path.=" -> <a href=\"/qatracker/laptop/".$args[1]."/".$args[2]."\">Laptop report - ".$args[1]."</a>";
+			else
+				$path.=" -> <a href=\"/qatracker/laptop\">Laptops summary</a>";
+		break;
 	}
 	$path.="</span>";
 	return $path;
 }
 
-function qatracker_getbuildstat($buildID,$archive=0,$status=0) {
-
-    $total=db_query("SELECT count(title) from qatracker_testcase LEFT JOIN qatracker_build ON qatracker_build.productid=qatracker_testcase.productid WHERE qatracker_build.id='$buildID' AND qatracker_testcase.status='$status'");
+function qatracker_getbuildstat($buildID,$archive=0,$status=0,$reporterID=0,$testcasecat = "All") {
+
+    if ($testcasecat != "All")
+		$and_title="AND qatracker_testcase.title LIKE '".db_escape_string($testcasecat)."%'";
+    else
+		$and_title="";
+
+    if ($reporterID != 0)
+		$and_reporter="AND qatracker_result.reporterid='".db_escape_string($reporterID)."'";
+    else
+		$and_reporter="";
+
+    $total=db_query("SELECT count(title) from qatracker_testcase LEFT JOIN qatracker_build ON qatracker_build.productid=qatracker_testcase.productid WHERE qatracker_build.id='$buildID' AND qatracker_testcase.status='$status' $and_title");
     $total=db_result($total);
 
     if ($total==0)
         return "None";
 
-	$done=db_query("SELECT count(DISTINCT testcaseID) from qatracker_result LEFT JOIN qatracker_testcase ON qatracker_testcase.id=qatracker_result.testcaseid WHERE qatracker_result.buildid='".$buildID."' AND qatracker_result.status='0' AND qatracker_result.result != '2' AND qatracker_testcase.status='$status'");
+	$done=db_query("SELECT count(DISTINCT testcaseID) from qatracker_result LEFT JOIN qatracker_testcase ON qatracker_testcase.id=qatracker_result.testcaseid WHERE qatracker_result.buildid='".$buildID."' AND qatracker_result.status='0' AND qatracker_result.result != '2' AND qatracker_testcase.status='$status' $and_title $and_reporter");
 	$done=db_result($done);
     
-    $started=db_query("SELECT count(DISTINCT testcaseID) from qatracker_result LEFT JOIN qatracker_testcase ON qatracker_testcase.id=qatracker_result.testcaseid WHERE qatracker_result.buildid='".$buildID."' AND qatracker_result.status='0' AND qatracker_result.result='2' AND qatracker_testcase.status='$status'");
+    $started=db_query("SELECT count(DISTINCT testcaseID) from qatracker_result LEFT JOIN qatracker_testcase ON qatracker_testcase.id=qatracker_result.testcaseid WHERE qatracker_result.buildid='".$buildID."' AND qatracker_result.status='0' AND qatracker_result.result='2' AND qatracker_testcase.status='$status' $and_title $and_reporter");
     $started=db_result($started);
 
     if ($started != 0)
@@ -196,11 +213,11 @@
     else
         $started = "";
 
-    $donet=db_query("SELECT count(DISTINCT testcaseID) from qatracker_result LEFT JOIN qatracker_testcase ON qatracker_testcase.id=qatracker_result.testcaseid WHERE qatracker_result.buildid='".$buildID."' AND qatracker_result.result != '2' AND qatracker_result.status='0'");
+    $donet=db_query("SELECT count(DISTINCT testcaseID) from qatracker_result LEFT JOIN qatracker_testcase ON qatracker_testcase.id=qatracker_result.testcaseid WHERE qatracker_result.buildid='".$buildID."' AND qatracker_result.result != '2' AND qatracker_result.status='0' $and_title $and_reporter");
 	$donet=db_result($donet);
-	$reports=db_query("SELECT count(qatracker_result.id) from  qatracker_result LEFT JOIN qatracker_testcase ON qatracker_testcase.id=qatracker_result.testcaseid WHERE qatracker_testcase.status='0' AND buildid='".$buildID."' AND qatracker_result.status='0'");
+	$reports=db_query("SELECT count(qatracker_result.id) from  qatracker_result LEFT JOIN qatracker_testcase ON qatracker_testcase.id=qatracker_result.testcaseid WHERE qatracker_testcase.status='0' AND buildid='".$buildID."' AND qatracker_result.status='0' $and_title $and_reporter");
 	$reports=db_result($reports);
-	$fail=db_query("SELECT count(qatracker_result.id) from  qatracker_result LEFT JOIN qatracker_testcase ON qatracker_testcase.id=qatracker_result.testcaseid WHERE qatracker_testcase.status='0' AND buildid='".$buildID."' AND qatracker_result.status='0' AND result='0'");
+	$fail=db_query("SELECT count(qatracker_result.id) from  qatracker_result LEFT JOIN qatracker_testcase ON qatracker_testcase.id=qatracker_result.testcaseid WHERE qatracker_testcase.status='0' AND buildid='".$buildID."' AND qatracker_result.status='0' AND result='0' $and_title $and_reporter");
 	$fail=db_result($fail);
 	if ($archive == 1)
 		$total=$done;

=== added file 'code/modules/qawebsite/images/logo/laptoptesting-logo.png'
Binary files code/modules/qawebsite/images/logo/laptoptesting-logo.png	1970-01-01 00:00:00 +0000 and code/modules/qawebsite/images/logo/laptoptesting-logo.png	2011-02-28 17:05:46 +0000 differ
