Index: controlies/trunk/applications/controlies/controllers/reports.py
===================================================================
--- controlies/trunk/applications/controlies/controllers/reports.py	(revision 403)
+++ controlies/trunk/applications/controlies/controllers/reports.py	(revision 404)
@@ -13,45 +13,13 @@
 
 @auth.requires_login()      
 def report():
-
-    from applications.controlies.modules.Groups import Groups
-
-    sql = "SELECT lh.username, l.serial_number, lh.name, lt.trademark, lt.model "
-    sql = sql+" FROM laptops l, laptops_historical lh"
-    sql = sql+" LEFT JOIN laptops_trademarks lt ON l.id_trademark=lt.id_trademark "        
-    sql = sql+" LEFT JOIN users_types ut ON ut.id_user_type=lh.id_user_type "     
-    sql = sql+" WHERE lh.id_user_type="+request.vars['id_user_type']
-    sql = sql+" AND l.id_laptop=lh.id_laptop "
-    sql = sql+" AND lh.id_historical IN (SELECT MAX(lh2.id_historical) FROM laptops_historical lh2 WHERE lh2.id_laptop=l.id_laptop) "
     
-    if request.vars["search"]!="":
-        sql = sql+" AND (lh.username like '%"+request.vars["search"]+"%' OR lh.name like '%"+request.vars["search"]+"%' OR l.serial_number like '%"+request.vars["search"]+"%' OR lt.trademark like '%"+request.vars["search"]+"%' OR lt.model like '%"+request.vars["search"]+"%')"
-    
-    sql = sql+" GROUP BY l.id_laptop ORDER BY lh.datetime desc"
-    result = cdb.executesql(sql)
-
-    serials={}
-    for r in result:
-        if str(r[0])!="" and str(r[0])!="None":
-            serials[str(r[0])] = { 'serial':str(r[1].encode('latin1')), 'name':str(r[2].encode('latin1')) , 'trademark':str(r[3].encode('latin1'))+' - '+str(r[4].encode('latin1')) }
-
-    people = []
     if request.vars['id_user_type']=="1":
-        # Para profesores
-        for s in serials:
-            people.append(serials[s])
+        rows = getDataTeachers(request.vars['search'])
     else:
-        # Para alumnos
-        l=conecta()
-        g = Groups(l,"",request.vars['classroom'],"")
-        users = g.getGroupUsers()
-        l.close()
-        
-        for u in users:
-            if u in serials:
-                people.append(serials[u])
+        rows = getDataStudents(request.vars['classroom'])
 
-    if len(people)==0:
+    if len(rows)==0:
         return "noPeople"
 
     from gluon.contrib.pyfpdf import FPDF, HTMLMixin
@@ -77,15 +45,15 @@
         count = 0
         titulo = "Compromiso para el cuidado y mantenimiento del ordenador port�til"
         
-        for p in people:
+        for r in rows:
     
             if request.vars['id_user_type']=="1":
-                parrafo1 = "D/D�a <b>"+p['name']+"</b>, profesor/a de este centro , recibe en el d�a de hoy, de la Direcci�n del Centro, el ordenador port�til <b>"+p['trademark']+"</b> n�mero de serie: <b>"+p['serial']+"</b>, comprometi�ndose a utilizarlo como herramienta did�ctica en los cursos pertenecientes al Proyecto Escuela 2.0."
+                parrafo1 = "D/D�a <b>"+r['cn']+"</b>, profesor/a de este centro , recibe en el d�a de hoy, de la Direcci�n del Centro, el ordenador port�til <b>"+r['trademark']+"</b> n�mero de serie: <b>"+r['serial_number']+"</b>, comprometi�ndose a utilizarlo como herramienta did�ctica en los cursos pertenecientes al Proyecto Escuela 2.0."
                 parrafo2 = "Asimismo, se compromete a devolver a esta Direcci�n dicho ordenador port�til en el momento en que deje de tener vinculaci�n laboral con este centro o no sea profesor de alg�n curso integrado en el citado Proyecto Escuela 2.0."        
                 parrafo3 = "M�rida, a ...... de ....................... de ......"
                 parrafo4 = "Firmado: ............................................."
             else:
-                parrafo1 = "Yo <b>"+p['name']+"</b> alumno/a de este centro perteneciente al curso/grupo <b>"+request.vars['classroom']+"</b>, me comprometo a cuidar, custodiar y mantener en perfecto estado el ORDENADOR <b>"+p['trademark']+"</b> (n�mero de serie: <b>"+p['serial']+"</b>) y ACCESORIOS que me ha entregado el centro para su uso en las distintas �reas de conocimientos, con la supervisi�n de los profesores/as correspondientes y siguiendo siempre las indicaciones e instrucciones para su correcto manejo."
+                parrafo1 = "Yo <b>"+r["cn"]+"</b> alumno/a de este centro perteneciente al curso/grupo <b>"+request.vars['classroom']+"</b>, me comprometo a cuidar, custodiar y mantener en perfecto estado el ORDENADOR <b>"+r['trademark']+"</b> (n�mero de serie: <b>"+r['serial_number']+"</b>) y ACCESORIOS que me ha entregado el centro para su uso en las distintas �reas de conocimientos, con la supervisi�n de los profesores/as correspondientes y siguiendo siempre las indicaciones e instrucciones para su correcto manejo."
                 parrafo2 = "El deteriodo intencionado, p�rdida, robo o cualquier otra circunstancia que se produzca en el equipo ser� valorado por al Direcci�n/Jefatura del centro para tomar las medidas oportunas para su esclarecimiento y en su caso la reposici�n o arreglo por cuenta del alumno/a asignado/a, padres o tutores del mismo."        
                 parrafo3 = "M�rida, a ...... de ....................... de ......"
                 parrafo4 = "Firma del alumno: ....................................                     Firma de los padres/tutores: ...................................."
@@ -104,7 +72,7 @@
             count+=1            
     
     elif request.vars["report_type"]=="listado":
-        response.title = "Listado de port�tiles"
+        title = "Listado de port�tiles"
         
         head = THEAD(TR(TH("Nombre y apellidos",_width="35%"), 
                         TH("Marca/Modelo",_width="25%"),
@@ -111,24 +79,23 @@
                         TH("N� Serie",_width="40%"), 
                         _bgcolor="#A0A0A0"))
         
-        rows = []
+        rowsTable = []
         i=0;
-        for p in people:
+        for r in rows:
             col = i % 2 and "#F0F0F0" or "#FFFFFF"
-            rows.append(TR(TD(p["name"]),
-                           TD(p["trademark"], _align="center"),
-                           TD(p["serial"], _align="center"),
+            rowsTable.append(TR(TD(r["cn"]),
+                           TD(r["trademark"], _align="center"),
+                           TD(r["serial_number"], _align="center"),
                            _bgcolor=col))
             i+=1 
-    
-        body = TBODY(*rows)
-        table = TABLE(*[head, body], 
-                      _border="1", _align="center", _width="100%")
 
+        body = TBODY(*rowsTable)
+        table = TABLE(*[head, body], _border="1", _align="center", _width="100%")
+
         class MyFPDF(FPDF, HTMLMixin):
             def header(self):
                 self.set_font('Arial','B',15)
-                self.cell(0,10, response.title ,1,0,'C')
+                self.cell(0,10, title ,1,0,'C')
                 self.set_font('Arial','I',10)
                 
                 if request.vars['id_user_type']=="1": # Para profesores
@@ -153,7 +120,79 @@
     doc=pdf.output(dest='S')
     doc64=embed64(data=doc,extension='application/pdf')    
     return 'window.location="%s";' % doc64     
+
+def getDataStudents(classroom):
+    from applications.controlies.modules.Groups import Groups
+
+    l=conecta()
+    g = Groups(l,"",classroom,"")
+    listUsers = g.listUsers({'rows':'40', 'page':'1', 'sidx':'cn', 'sord':'desc'})
+    l.close()
+
+    # Obtenemos los numeros de serie de los portatiles
+    sql = "SELECT lh.username, l.serial_number, lt.trademark, lt.model FROM laptops l" 
+    sql = sql+" LEFT JOIN laptops_historical lh ON l.id_laptop=lh.id_laptop"
+    sql = sql+" LEFT JOIN laptops_trademarks lt ON l.id_trademark=lt.id_trademark" 
+    sql = sql+" GROUP BY l.id_laptop ORDER BY lh.datetime desc"
+    result = cdb.executesql(sql)
+
+    serials={}
+    for r in result:
+        if str(r[0])!="":
+            serials[str(r[0])]={'serial':str(r[1]), 'trademark':str(r[2])+' - '+str(r[3])}
+
+    rows=[]
+    for r in listUsers["rows"]:
+        num=""
+        trademark=""
+        if r["cell"][1] in serials:
+            num = serials[r["cell"][1]]['serial']
+            trademark = serials[r["cell"][1]]['trademark']
+
+        if num=="":
+            num = "                                              "
+
+        if trademark=="":
+            trademark = "                                         "
+
+        r["cell"].append(num)
+        r["serial_number"]=num
+        r["cell"].append(trademark)
+        r["trademark"]=trademark
+        rows.append(r)
         
+    return rows
+
+def getDataTeachers(search):
+    sql = "SELECT lh.username, l.serial_number, lh.name, lt.trademark, lt.model "
+    sql = sql+" FROM laptops l, laptops_historical lh"
+    sql = sql+" LEFT JOIN laptops_trademarks lt ON l.id_trademark=lt.id_trademark "        
+    sql = sql+" LEFT JOIN users_types ut ON ut.id_user_type=lh.id_user_type "     
+    sql = sql+" WHERE lh.id_user_type=1"
+    sql = sql+" AND l.id_laptop=lh.id_laptop "
+    sql = sql+" AND lh.id_historical IN (SELECT MAX(lh2.id_historical) FROM laptops_historical lh2 WHERE lh2.id_laptop=l.id_laptop) "
+    
+    if search!="":
+        sql = sql+" AND (lh.username like '%"+search+"%' "
+        sql = sql+" OR lh.name like '%"+search+"%' "
+        sql = sql+" OR l.serial_number like '%"+search+"%' "
+        sql = sql+" OR lt.trademark like '%"+search+"%' "
+        sql = sql+" OR lt.model like '%"+search+"%')"
+    
+    sql = sql+" GROUP BY l.id_laptop ORDER BY lh.datetime desc"
+    result = cdb.executesql(sql)
+
+    serials={}
+    for r in result:
+        if str(r[0])!="" and str(r[0])!="None":
+            serials[str(r[0])] = { 'serial_number':str(r[1].encode('latin1')), 'cn':str(r[2].encode('latin1')) , 'trademark':str(r[3].encode('latin1'))+' - '+str(r[4].encode('latin1')) }
+
+    teachers = []
+    for s in serials:
+        teachers.append(serials[s])
+
+    return teachers
+
 def call():
     """
     exposes services. for example:
Index: controlies/trunk/applications/controlies/controllers/laptops_groups.py
===================================================================
--- controlies/trunk/applications/controlies/controllers/laptops_groups.py	(revision 403)
+++ controlies/trunk/applications/controlies/controllers/laptops_groups.py	(revision 404)
@@ -28,8 +28,9 @@
     l.close()
 
     # Obtenemos los numeros de serie de los portatiles
-    sql = "SELECT lh.username, l.serial_number FROM laptops l" 
-    sql = sql+" LEFT JOIN laptops_historical lh ON l.id_laptop=lh.id_laptop" 
+    sql = "SELECT lh.username, l.serial_number, lt.trademark, lt.model FROM laptops l" 
+    sql = sql+" LEFT JOIN laptops_historical lh ON l.id_laptop=lh.id_laptop"
+    sql = sql+" LEFT JOIN laptops_trademarks lt ON l.id_trademark=lt.id_trademark" 
     sql = sql+" GROUP BY l.id_laptop ORDER BY lh.datetime desc"
     result = cdb.executesql(sql)
 
@@ -36,16 +37,20 @@
     serials={}
     for r in result:
         if str(r[0])!="":
-            serials[str(r[0])]=str(r[1])
+            serials[str(r[0])]={'serial':str(r[1]), 'trademark':str(r[2])+' - '+str(r[3])}
 
     rows=[]
     for r in response["rows"]:
         num=""
+        trademark=""
         if r["cell"][1] in serials:
-            num = serials[r["cell"][1]]
+            num = serials[r["cell"][1]]['serial']
+            trademark = serials[r["cell"][1]]['trademark']
 
         r["cell"].append(num)
         r["serial_number"]=num
+        r["cell"].append(trademark)
+        r["trademark"]=trademark
         rows.append(r)
 
     response["rows"]=rows
Index: controlies/trunk/applications/controlies/views/reports/laptops_authorization.html
===================================================================
--- controlies/trunk/applications/controlies/views/reports/laptops_authorization.html	(revision 403)
+++ controlies/trunk/applications/controlies/views/reports/laptops_authorization.html	(nonexistent)
@@ -1,81 +0,0 @@
-{{response.files.append(URL('static','js/utils.js'))}}
-
-{{extend 'layout.html'}}
-<script>
-    $(function() {
-        $("#tabsSearch").tabs().css("font-size","13px");
-        
-        getGroups();
-    })
-
-	function getGroups(){
-		jQuery.post("call/json/getClassrooms",
-			function(data){		
-				jQuery.each(data.classrooms, function(i,item){
-					jQuery("#classroom").append("<option value='"+item+"'>"+item+"</option>");
-				});
-			}
-		);
-	}
-	
-	function report(){
-		jQuery.ajax({url:"report",data:jQuery("#form_authorization").serialize()})
-			.done(function ( data ){
-				switch(data){
-					case 'noPeople':{
-						alert("no hay gente");
-						break
-					}
-					default: eval(data);
-				}
-			}
-		);
-		
-	}
-</script>
-<form id="form_authorization">
-   <table width="100%" cellspacing="12">
-    <tr>
-    <td>    
-        <div id="tabsSearch">
-            <ul>
-                <li><a href="#tabs-1"><span id="actions">Compromisos portátiles</span></a></li>
-            </ul>
-            <div id="tabs-1" style="padding:3px;">  
-                <table style="width:100%">
-                    <tr>
-                        <td>
-                        	Tipo usuario<br>
-                        	<select id="id_user_type" name="id_user_type">
-                        		<option value="1">Profesores</option>
-                        		<option value="2">Alumnos</option>
-                        	</select>
-                        </td>
-                        <td>
-                        	Curso<br><select id="classroom" name="classroom"></select>
-                        </td>
-                        <td>
-                        	Filtro<br><input type="text" id="search" name="search"/>
-                        </td>
-                        <td>
-                        	Tipo Informe<br>
-                        	<select id="report_type" name="report_type">
-                        		<option value="compromisos">Compromisos portátiles</option>
-                        		<option value="listado">Listado de Usuarios</option>
-                        	</select>
-                        </td>
-                   </tr>
-                   <tr>
-                        <td colspan="4" style="text-align:center;"><br><br>
-                        	<input type="button" value="Generar listado" onClick="javascript:report();">
-                        </td>
-                   </tr>
-                </table>
-            </div>
-        </div>              
-    </td>
-</tr>
-</table>
-</form>
-
-<div id="dialog-details"></div>
Index: controlies/trunk/applications/controlies/views/reports/laptops.html
===================================================================
--- controlies/trunk/applications/controlies/views/reports/laptops.html	(nonexistent)
+++ controlies/trunk/applications/controlies/views/reports/laptops.html	(revision 404)
@@ -0,0 +1,101 @@
+{{response.files.append(URL('static','js/utils.js'))}}
+
+{{extend 'layout.html'}}
+<script>
+    $(function() {
+        $("#tabsSearch").tabs().css("font-size","13px");
+        $("#buttonReport").button({ icons: { primary: "ui-icon-document"}});
+        
+        getGroups();
+		showFields();
+    })
+
+	function getGroups(){
+		jQuery.post("call/json/getClassrooms",
+			function(data){		
+				jQuery.each(data.classrooms, function(i,item){
+					jQuery("#classroom").append("<option value='"+item+"'>"+item+"</option>");
+				});
+			}
+		);
+	}
+	
+	function report(){
+		jQuery.ajax({url:"report",data:jQuery("#form_authorization").serialize()})
+			.done(function ( data ){
+				switch(data){
+					case 'noPeople':{
+						alert("no hay gente");
+						break
+					}
+					default: eval(data);
+				}
+			}
+		);	
+	}
+
+	function hideAllFields(){
+		jQuery("#form_authorization #searchTD").hide();
+		jQuery("#form_authorization #classroomsTD").hide();
+	}
+	
+	function showFields(){
+		hideAllFields();
+		switch(jQuery("#form_authorization #id_user_type").val()){
+			case '1':{ // Profesores
+				jQuery("#form_authorization #searchTD").show();
+				break;
+			}
+			case '2':{
+				jQuery("#form_authorization #classroomsTD").show();
+				break;
+			}
+		}
+	}	
+</script>
+<form id="form_authorization">
+   <table width="100%" cellspacing="12">
+    <tr>
+    <td>    
+        <div id="tabsSearch">
+            <ul>
+                <li><a href="#tabs-1"><span id="actions">Compromisos portátiles</span></a></li>
+            </ul>
+            <div id="tabs-1" style="padding:3px;">  
+                <table style="width:100%">
+                    <tr>
+                        <td>
+                        	Tipo usuario<br>
+                        	<select id="id_user_type" name="id_user_type" onChange="javascript:showFields();">
+                        		<option value="1">Profesores</option>
+                        		<option value="2">Alumnos</option>
+                        	</select>
+                        </td>
+                        <td id="classroomsTD">
+                        	Curso<br><select id="classroom" name="classroom"></select>
+                        </td>
+                        <td id="searchTD">
+                        	Filtro<br><input type="text" id="search" name="search"/>
+                        </td>
+                        <td>
+                        	Tipo Informe<br>
+                        	<select id="report_type" name="report_type">
+                        		<option value="compromisos">Compromisos portátiles</option>
+                        		<option value="listado">Listado de Usuarios</option>
+                        	</select>
+                        </td>
+                   </tr>
+                   <tr>
+                        <td colspan="4" style="text-align:center;"><br><br>
+                        	<button id="buttonReport" onClick="javascript:report();">Generar informe</button>
+                        </td>
+                   </tr>
+                </table>
+            </div>
+        </div>              
+    </td>
+</tr>
+</table>
+</form>
+
+<div id="dialog-details"></div>
