Revisión 404
Añadido por Manu Mora Gordillo hace más de 12 años
controlies/trunk/applications/controlies/controllers/reports.py | ||
---|---|---|
|
||
@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
|
||
... | ... | |
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: ...................................."
|
||
... | ... | |
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%"),
|
||
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
|
||
... | ... | |
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:
|
controlies/trunk/applications/controlies/controllers/laptops_groups.py | ||
---|---|---|
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)
|
||
|
||
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
|
controlies/trunk/applications/controlies/views/reports/laptops_authorization.html | ||
---|---|---|
{{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>
|
controlies/trunk/applications/controlies/views/reports/laptops.html | ||
---|---|---|
{{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>
|
Exportar a: Unified diff
Informes de portátiles