Index: controlies/trunk/applications/controlies/views/reports/laptops_authorization.html
===================================================================
--- controlies/trunk/applications/controlies/views/reports/laptops_authorization.html	(revision 400)
+++ controlies/trunk/applications/controlies/views/reports/laptops_authorization.html	(revision 401)
@@ -12,7 +12,7 @@
 		jQuery.post("call/json/getClassrooms",
 			function(data){		
 				jQuery.each(data.classrooms, function(i,item){
-					jQuery("#classrooms").append("<option value='"+item+"'>"+item+"</option>");
+					jQuery("#classroom").append("<option value='"+item+"'>"+item+"</option>");
 				});
 			}
 		);
@@ -20,8 +20,14 @@
 	
 	function report(){
 		jQuery.ajax({url:"report",data:jQuery("#form_authorization").serialize()})
-			.done(function ( data ){	
-				eval(data);
+			.done(function ( data ){
+				switch(data){
+					case 'noPeople':{
+						alert("no hay gente");
+						break
+					}
+					default: eval(data);
+				}
 			}
 		);
 		
@@ -40,9 +46,9 @@
                     <tr>
                         <td HEIGHT="200PX">
                         	Tipo usuario
-                        	<select id="user_type" name="user_type">
-                        		<option value="Profesor">Profesores</option>
-                        		<option value="Alumno">Alumnos</option>
+                        	<select id="id_user_type" name="id_user_type">
+                        		<option value="1">Profesores</option>
+                        		<option value="2">Alumnos</option>
                         	</select>
                         </td>
                         <td>
@@ -51,7 +57,7 @@
                         </td>
                         <td>
                         	Curso
-                        	<select multiple="multiple" size="20" id="classrooms" name="classrooms[]"></select>
+                        	<select id="classroom" name="classroom"></select>
                         </td>
                         <td>
                         	<input type="button" value="Generar listado" onClick="javascript:report();">
@@ -63,5 +69,6 @@
     </td>
 </tr>
 </table>
+</form>
 
 <div id="dialog-details"></div>
Index: controlies/trunk/applications/controlies/controllers/reports.py
===================================================================
--- controlies/trunk/applications/controlies/controllers/reports.py	(revision 400)
+++ controlies/trunk/applications/controlies/controllers/reports.py	(revision 401)
@@ -1,4 +1,4 @@
-# -*- coding: utf-8 -*-.
+# coding: latin1
 
 def laptops_authorization(): 
     return dict()
@@ -15,7 +15,8 @@
 def report():
     
     from gluon.contrib.pyfpdf import FPDF, HTMLMixin
- 
+    from applications.controlies.modules.Groups import Groups
+    
     class MyFPDF(FPDF, HTMLMixin):
         def header(self):
             #logo=os.path.join(request.env.web2py_path,"applications","controlies","static","logo_consejeria.jpg")
@@ -26,36 +27,57 @@
         def footer(self):
             #self.set_y(-15)
             #self.set_font('Arial','I',8)
-            #self.cell(0,10,"IES Sta Eulalia - MÃ©rida".decode("utf8").encode("latin1"),0,0,'L')
-            #self.cell(0,10,"ConsejerÃ­a de EducaciÃ³n - Gobierno de Extremadura".decode("utf8").encode("latin1"),0,0,'R')
+            #self.cell(0,10,"IES Sta Eulalia - Mérida".decode("utf8").encode("latin1"),0,0,'L')
+            #self.cell(0,10,"Consejería de Educación - Gobierno de Extremadura".decode("utf8").encode("latin1"),0,0,'R')
             pass
         
-    sql = "SELECT lh.name, lt.trademark, lt.model, l.serial_number, ut.user_type, lh.username"
-    sql = sql+" FROM laptops l, laptops_historical lh"
+    pdf=MyFPDF()
+    
+    # Obtenemos los numeros de serie de los portatiles
+    sql = "SELECT lh.username, l.serial_number, lh.name, lt.trademark, lt.model FROM laptops l" 
+    sql = sql+" LEFT JOIN laptops_historical lh ON l.id_laptop=lh.id_laptop AND lh.id_user_type="+request.vars['id_user_type']
     sql = sql+" LEFT JOIN laptops_trademarks lt ON l.id_trademark=lt.id_trademark"
-    sql = sql+" LEFT JOIN states s ON lh.id_state=s.id_state"
-    sql = sql+" LEFT JOIN users_types ut ON ut.id_user_type=lh.id_user_type"
-    sql = sql+" WHERE s.state='Asignado' AND user_type='"+request.vars['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)"
+    sql = sql+" GROUP BY l.id_laptop ORDER BY lh.datetime desc"
+    result = cdb.executesql(sql)
 
-    pdf=MyFPDF()
+    serials={}
+    for r in result:
+        if str(r[0])!="" and str(r[0])!="None":
+            serials[str(r[0])] = { 'serial':str(r[1]), 'name':str(r[2]) , 'trademark':str(r[3])+' - '+str(r[4]) }
+
+    people = []
+    if request.vars['id_user_type']=="1":
+        # Para profesores
+        for s in serials:
+            people.append(serials[s])
+    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])
+
+    if len(people)==0:
+        return "noPeople"
     
-    result = cdb.executesql(sql)
     count = 0
-    for reg in result:
+    titulo = "Compromiso para el cuidado y mantenimiento del ordenador portátil"
+    
+    for p in people:
 
-        titulo = "Compromiso para el cuidado y mantenimiento del ordenador portÃ¡til"
-
-        if request.vars['user_type']=="Profesor":
-            parrafo1 = "D/DÃ±a <b>"+reg[0]+"</b>, profesor/a de este centro , recibe en el dÃ­a de hoy, de la DirecciÃ³n del Centro, el ordenador portÃ¡til <b>"+reg[1]+" - "+reg[2]+"</b> nÃºmero de serie: <b>"+reg[3]+"</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 ......"
+        if request.vars['id_user_type']=="1":
+            parrafo1 = "D/Dña <b>"+p['name'].encode('latin1')+"</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'].encode('latin1')+"</b> número de serie: <b>"+p['serial'].encode('latin1')+"</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>"+reg[0]+"</b> alumno/a de este centro perteneciente al curso/grupo .... , me comprometo a cuidar, custodiar y mantener en perfecto estado el ORDENADOR <b>"+reg[1]+" - "+reg[2]+"</b> nÃºmero de serie: <b>"+reg[3]+"</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 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 ......"
+            parrafo1 = "Yo <b>"+p['name'].encode('latin1')+"</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'].encode('latin1')+"</b> (número de serie: <b>"+p['serial'].encode('latin1')+"</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: ...................................."
         
         if count%2==0:
@@ -63,13 +85,14 @@
         else:
             pdf.write_html("<br><br><br><center><p>______________________________________________________________________________________</p></center><br><br>")
 
-        pdf.write_html("<center><h1>"+titulo.decode("utf8").encode("latin1")+"</h1></center><br>")            
-        pdf.write_html("<p>"+parrafo1.decode("utf8").encode("latin1")+"</p><br>")
-        pdf.write_html("<p>"+parrafo2.decode("utf8").encode("latin1")+"</p>")
-        pdf.write_html("<br><br><center><p>"+parrafo3.decode("utf8").encode("latin1")+"</p></center>")
-        pdf.write_html("<br><br><br><br><center><p>"+parrafo4.decode("utf8").encode("latin1")+"</p></center>")
+        pdf.write_html("<center><h1>"+titulo+"</h1></center><br>")
+        pdf.write_html("<p>"+parrafo1+"</p><br>")
+        pdf.write_html("<p>"+parrafo2+"</p>")
+        pdf.write_html("<br><br><center><p>"+parrafo3+"</p></center>")
+        pdf.write_html("<br><br><br><br><center><p>"+parrafo4+"</p></center>")
         
         count+=1
+        
     # prepare PDF to download:
     response.headers['Content-Type']='application/pdf'
     doc=pdf.output(dest='S')
@@ -85,4 +108,4 @@
     supports xml, json, xmlrpc, jsonrpc, amfrpc, rss, csv
     """
     session.forget()
-    return service()
\ No newline at end of file
+    return service()
Index: controlies/trunk/applications/controlies/modules/Groups.py
===================================================================
--- controlies/trunk/applications/controlies/modules/Groups.py	(revision 400)
+++ controlies/trunk/applications/controlies/modules/Groups.py	(revision 401)
@@ -292,11 +292,7 @@
 
     def getGroupUsers(self):
 		result = self.ldap.search("ou=Group","cn="+self.name,["cn","memberUid"])
-		
-		members = []
-		for m in result:
-			members.append(m[0][1]["memberUid"][0])
-		
+		members = result[0][0][1]["memberUid"]
 		members.sort()
-		
+
 		return members
Index: controlies/trunk/applications/controlies/modules/Utils/LdapUtils.py
===================================================================
--- controlies/trunk/applications/controlies/modules/Utils/LdapUtils.py	(revision 400)
+++ controlies/trunk/applications/controlies/modules/Utils/LdapUtils.py	(revision 401)
@@ -64,6 +64,20 @@
 	
 	return { "classrooms":classrooms }
 
+def getClassroomGroupsWithUsers(ldap):
+	result = ldap.search("ou=Group","(|(groupType=school_class))",["cn","groupType","memberUid"])
+	
+	classrooms = []		
+	for g in result:
+		try:
+			d = {g[0][1]["cn"][0]:g[0][1]["memberUid"]}
+			classrooms.append(d)
+		except:
+			pass
+	
+	classrooms.sort()
+	return { "classrooms":classrooms }
+
 def getAllRanges(ldap):
 	myRange = []
 	mySubRange = []	
