Revisión 367
Añadido por Manu Mora Gordillo hace casi 13 años
controlies/trunk/applications/controlies/views/laptops_groups/form.html | ||
---|---|---|
<script language="javascript">
|
||
|
||
$(function() {
|
||
$("#id_trademark").focus();
|
||
$("#saveButton").button({ icons: { primary: "ui-icon-disk"}});
|
||
$("#cancelButton")
|
||
.button({ icons: { primary: "ui-icon-close"}})
|
||
.click( function(){ $('#dialog-form').dialog('close'); });
|
||
});
|
||
|
||
function restartStyle(){
|
||
$("#form_data p span").css("color","black");
|
||
$('#message').html("");
|
||
}
|
||
|
||
function send(){
|
||
|
||
restartStyle();
|
||
jQuery.post('call/json/modify', jQuery("#form_data").serialize(), function(result) {
|
||
switch(result.response){
|
||
case "OK":{
|
||
jQuery('#message').html("Operación realizada correctamente").css("color","green").effect("highlight", {"color":"yellow"}, 1000);
|
||
setTimeout("$('#dialog-form').dialog('close')",1000);
|
||
break;
|
||
}
|
||
case "fail":{
|
||
jQuery('#message').html("Se produjo un error").effect("highlight", {"color":"yellow"}, 1000);
|
||
break;
|
||
}
|
||
case "serial_number_exists":{
|
||
jQuery('#serial_numberTag').css("color","red");
|
||
jQuery('#serial_number').effect("highlight", {"color":"yellow"}, 1000).focus();
|
||
jQuery('#message').html("Ya existe ese número de serie").effect("slide");
|
||
break;
|
||
}
|
||
default:{
|
||
jQuery('#'+result.response+"Tag").css("color","red");
|
||
jQuery('#'+result.response).effect("highlight", {"color":"yellow"}, 1000).focus();
|
||
jQuery('#message').html("Hay campos vacíos o incorrectos").effect("slide");
|
||
break;
|
||
}
|
||
}
|
||
});
|
||
|
||
return false;
|
||
}
|
||
|
||
</script>
|
||
|
||
<form id="form_data" onsubmit="return send();">
|
||
<input type="hidden" id="action" name="action"/>
|
||
<input type="hidden" id="username" name="username"/>
|
||
<input type="hidden" id="id_laptop" name="id_laptop"/>
|
||
<div>
|
||
<p><span id="id_trademarkTag">Marca / Modelo</span><br>
|
||
<select type="text" id="id_trademark" name="id_trademark">
|
||
<option value="none">Seleccione...</option>
|
||
</select>
|
||
</p>
|
||
<p><span id="serial_numberTag">Número Serie</span><br><input type="text" id="serial_number" name="serial_number"/></p>
|
||
</div>
|
||
<div id="message" style="text-align:center; font-weight:bold; color:red; padding:3px; "></div>
|
||
<div style="text-align:center;"><button id="saveButton" type="submit" style="width:100px;">Guardar</button> <button type="button" id="cancelButton" style="width:100px;">Cancelar</button></div>
|
||
<p style="padding-top:10px; text-align:center; font-size:10px;" id="messageForm"></p>
|
||
</form>
|
||
controlies/trunk/applications/controlies/views/laptops_groups/index.html | ||
---|---|---|
<!-- Libreria Multiselect -->
|
||
{{response.files.append(URL('static','js/multiselect/jquery.multiselect.css'))}}
|
||
{{response.files.append(URL('static','js/multiselect/jquery.multiselect.min.js'))}}
|
||
{{response.files.append(URL('static','js/multiselect/jquery.multiselect.es.js'))}}
|
||
|
||
{{response.files.append(URL('static','js/autocomplete/TextboxList.css'))}}
|
||
{{response.files.append(URL('static','js/autocomplete/TextboxList.Autocomplete.css'))}}
|
||
{{response.files.append(URL('static','js/autocomplete/GrowingInput.js'))}}
|
||
{{response.files.append(URL('static','js/autocomplete/TextboxList.js'))}}
|
||
{{response.files.append(URL('static','js/autocomplete/TextboxList.Autocomplete.js'))}}
|
||
{{response.files.append(URL('static','js/autocomplete/TextboxList.Autocomplete.Binary.js'))}}
|
||
|
||
|
||
{{extend 'layout.html'}}
|
||
|
||
<div id="tabla_clientes" class="centerGrid">
|
||
<table width="100%">
|
||
<tr>
|
||
<td style="width:2%"></td>
|
||
<td><table id="list" width="100%"></table></td>
|
||
<td style="width:2%"></td>
|
||
</tr>
|
||
</table>
|
||
<div id="pager" style=""></div>
|
||
<div id="filter" style="margin-left:30%;display:none">Search Invoices</div>
|
||
</div>
|
||
|
||
<div id="dialog-form"></div>
|
||
|
||
<div id="dialog-confirm" title="¿Borrar el registro seleccionado?" style="display:none;">
|
||
<p><span class="ui-icon ui-icon-alert" style="float:left; margin:0 7px 20px 0;"></span>Este elemento quedará permanentemente eliminado. ¿Está seguro?</p>
|
||
</div>
|
||
|
||
<div id="dialog-confirm-newlaptop" title="El portátil no existe ¿Desea registrarlo?" style="display:none;">
|
||
<p><span class="ui-icon ui-icon-alert" style="float:left; margin:0 7px 20px 0;"></span>El portátil no existe ¿Desea registrarlo?</p>
|
||
</div>
|
||
|
||
<div id="dialog-confirm-alreadyUser" title="Ya asignado" style="display:none;">
|
||
<p><span class="ui-icon ui-icon-alert" style="float:left; margin:0 7px 20px 0;"></span>El portátil se encuentra asignado a otro usuario ¿Desea reasignarlo?</p>
|
||
</div>
|
||
|
||
<div id="dialog-alert" title="Atención" style="display:none;">
|
||
<p><span class="ui-icon ui-icon-alert" style="float:left; margin:0 7px 20px 0;"></span>Para operar sobre un registro debe seleccionarlo previamente.</p>
|
||
</div>
|
||
|
||
|
||
<script type="text/javascript">
|
||
|
||
jQuery(function() {
|
||
jQuery("#dialog-confirm").dialog({ autoOpen: false });
|
||
jQuery("#dialog-confirm-newlaptop").dialog({ autoOpen: false });
|
||
jQuery("#dialog-confirm-alreadyUser").dialog({ autoOpen: false });
|
||
jQuery("#dialog-alert").dialog({ autoOpen: false });
|
||
});
|
||
|
||
var lastsel;
|
||
function print_grid(){
|
||
jQuery("#list").jqGrid({
|
||
url:"{{=URL(c='laptops_groups',f='call',args=['json','list'])}}",
|
||
data: "{}",
|
||
mtype: 'GET',
|
||
datatype: "json",
|
||
colNames:['Tipo Grupo','Nombre','ID Grupo','Nº Usuarios'],
|
||
colModel:[
|
||
{name:'type',index:'type', width:60, align:"center", stype:'select', editoptions:{value:":Todo;Departamento:Departamentos;Aula:Cursos"}},
|
||
{name:'cn',index:'cn', width:80, align:"center"},
|
||
{name:'gidNumber',index:'gidNumber', width:60, align:"center"},
|
||
{name:'usersNumber',index:'usersNumber', width:60, align:"center"}
|
||
],
|
||
rowNum:25,
|
||
height:335,
|
||
width: 900,
|
||
rowList:[25,50,75],
|
||
pager: '#pager',
|
||
sortname: 'cn',
|
||
autowidth: false,
|
||
viewrecords: true,
|
||
sortorder: "desc",
|
||
subGrid: true,
|
||
caption:"Relación de portátiles por Grupos",
|
||
subGridOptions: {
|
||
"plusicon" : "ui-icon-triangle-1-e",
|
||
"minusicon" : "ui-icon-triangle-1-s",
|
||
"openicon" : "ui-icon-arrowreturn-1-e",
|
||
"reloadOnExpand" : false,
|
||
"selectOnExpand" : true
|
||
},
|
||
subGridRowExpanded: function(subgrid_id, row_id) {
|
||
var subgrid_table_id, pager_id;
|
||
subgrid_table_id = subgrid_id+"_t";
|
||
pager_id = "p_"+subgrid_table_id;
|
||
$("#"+subgrid_id).html("<table id='"+subgrid_table_id+"' class='scroll'></table><div id='"+pager_id+"' class='scroll'></div>");
|
||
jQuery("#"+subgrid_table_id).jqGrid({
|
||
url:"{{=URL(c='laptops_groups',f='call',args=['json','getUsers'])}}?row_id="+row_id,
|
||
mtype: 'GET',
|
||
datatype: "json",
|
||
colNames: ['Nombre y Apellidos','Usuario','Identificación','Nº Serie'],
|
||
colModel: [
|
||
{name:"cn",index:"cn",width:250},
|
||
{name:"uid",index:"uid",width:150,key:true},
|
||
{name:"employeeNumber",index:"employeeNumber",width:150,align:"center"},
|
||
{name:"serial_number",index:"serial_number", editable:true, width:250,align:"center"}
|
||
],
|
||
rowNum:30,
|
||
pager: pager_id,
|
||
sortname: 'cn',
|
||
sortorder: "desc",
|
||
onSelectRow: function(uid){
|
||
cellValue = jQuery("#"+subgrid_table_id).getCell(uid, 'serial_number');
|
||
|
||
if(uid && uid!==lastsel){
|
||
jQuery("#"+subgrid_table_id).jqGrid('restoreRow',lastsel);
|
||
}
|
||
|
||
jQuery("#"+subgrid_table_id).jqGrid('editRow',uid,true,false,false,false,false,
|
||
|
||
function (rowid, responseXML){
|
||
var a = jQuery.parseJSON(responseXML.responseText);
|
||
|
||
if(a.response=="not_exists"){
|
||
|
||
jQuery( "#dialog-confirm-newlaptop" ).dialog({
|
||
resizable: false,
|
||
height:160,
|
||
width:350,
|
||
modal: true,
|
||
buttons: {
|
||
"Sí": function() {
|
||
$(this).dialog( "close" );
|
||
addLaptop(jQuery("#"+subgrid_table_id).getCell(uid, 'serial_number'),uid);
|
||
},
|
||
"No": function() {
|
||
jQuery("#"+subgrid_table_id).setCell(uid, 'serial_number',' ');
|
||
$(this).dialog( "close" );
|
||
}
|
||
}
|
||
}).dialog('open');
|
||
}
|
||
if(a.response=="already_assigned"){
|
||
jQuery( "#dialog-confirm-alreadyUser" ).dialog({
|
||
resizable: false,
|
||
height:160,
|
||
width:350,
|
||
modal: true,
|
||
buttons: {
|
||
"Sí": function() {
|
||
newSerial = jQuery("#"+subgrid_table_id).getCell(uid, 'serial_number');
|
||
$(this).dialog( "close" );
|
||
$.post("{{=URL(c='laptops_groups',f='call',args=['json','reassignmentSerialNumber'])}}","username="+uid+"&serial="+cellValue+"&newSerial="+newSerial , function(request) {
|
||
jQuery("#"+subgrid_table_id).trigger("reloadGrid");
|
||
});
|
||
},
|
||
"No": function() {
|
||
if (cellValue=="") cellValue=" ";
|
||
jQuery("#"+subgrid_table_id).setCell(uid, 'serial_number',cellValue);
|
||
$(this).dialog( "close" );
|
||
}
|
||
}
|
||
}).dialog('open');
|
||
}
|
||
}
|
||
|
||
);
|
||
lastsel=uid;
|
||
},
|
||
editurl:"{{=URL(c='laptops_groups',f='call',args=['json','modifySerialNumber'])}}",
|
||
height: 150
|
||
});
|
||
jQuery("#"+subgrid_table_id).jqGrid('navGrid',"#"+pager_id,{edit:false,add:false,del:false,search:false,refresh:false})
|
||
}
|
||
|
||
});
|
||
jQuery("#list").jqGrid('navGrid','#pager',{add:false,edit:false,del:false,search:false,refresh:false});
|
||
|
||
jQuery("#list").jqGrid('navButtonAdd','#pager',{
|
||
caption: "Insertar",
|
||
buttonicon :'ui-icon-plus',
|
||
onClickButton : function (){
|
||
addRecord();
|
||
}
|
||
});
|
||
jQuery("#list").jqGrid('navButtonAdd','#pager',{
|
||
caption: "Modificar",
|
||
buttonicon :'ui-icon-pencil',
|
||
onClickButton : function (){
|
||
modifyRecord();
|
||
}
|
||
});
|
||
jQuery("#list").jqGrid('navButtonAdd','#pager',{
|
||
caption: "Borrar",
|
||
buttonicon :'ui-icon-trash',
|
||
onClickButton : function (){
|
||
deleteRecord();
|
||
}
|
||
});
|
||
|
||
jQuery("#list").jqGrid('filterToolbar');
|
||
}
|
||
|
||
function addLaptop(serial_number,uid){
|
||
|
||
jQuery("#messageLoading").show();
|
||
|
||
jQuery("#dialog-form").html("").css("display","none");
|
||
jQuery("#dialog-form").load("form.html", function() {
|
||
getAllLaptopTypes();
|
||
|
||
jQuery("#form_data #action").val("add");
|
||
jQuery("#form_data #username").val(uid);
|
||
jQuery("#form_data #serial_number").attr("readonly","true");
|
||
jQuery("#form_data #serial_number").css("background-color","#DDD");
|
||
jQuery("#form_data #serial_number").val(serial_number);
|
||
jQuery("#form_data #messageForm").html("Todos los campos son obligatorios");
|
||
|
||
x = (jQuery(window).width()-350)/2;
|
||
y = (jQuery(window).height()-500)/2;
|
||
|
||
jQuery("#messageLoading").hide();
|
||
|
||
jQuery("#dialog-form").dialog({
|
||
resizable: false,
|
||
position: top,
|
||
modal: true,
|
||
width: 350,
|
||
title: "Añadir Portátil"
|
||
}).dialog('option', 'position', [x, y]);
|
||
});
|
||
}
|
||
|
||
|
||
function getAllLaptopTypes(){
|
||
$.post("call/json/getAllLaptopTypes", function(result) {
|
||
$.each( result.response, function(i, l){
|
||
jQuery("#form_data #id_trademark").append("<option value='"+l.id_trademark+"'>"+l.trademark+"</option>");
|
||
});
|
||
});
|
||
}
|
||
|
||
function rowSelected(){
|
||
var uid = jQuery("#list").jqGrid('getGridParam','selrow');
|
||
|
||
if( uid == null ){
|
||
jQuery( "#dialog-alert" ).dialog({
|
||
resizable: false,
|
||
height:150,
|
||
width:290,
|
||
modal: true,
|
||
buttons: { "Aceptar": function() { $( this ).dialog( "close" ); }}
|
||
}).dialog('open');
|
||
return false;
|
||
}
|
||
return uid;
|
||
}
|
||
|
||
|
||
function getAllUsers(){
|
||
$.post("{{=URL(c='usuarios',f='call',args=['json','getAllUsers'])}}", function(users) {
|
||
});
|
||
}
|
||
|
||
</script>
|
||
|
||
|
||
<script type="text/javascript">
|
||
jQuery(document).ready(function(){ print_grid();});
|
||
</script>
|
||
controlies/trunk/applications/controlies/controllers/laptops_groups.py | ||
---|---|---|
# coding: utf8
|
||
from applications.controlies.modules.Groups import Groups
|
||
from applications.controlies.modules.Users import Users
|
||
from applications.controlies.modules.Laptops import Laptops
|
||
from applications.controlies.modules.LaptopsHistory import LaptopsHistory
|
||
from applications.controlies.modules.SQLiteConnection import SQLiteConnection
|
||
|
||
def index():
|
||
return dict()
|
||
|
||
@service.json
|
||
@auth.requires_login()
|
||
def list():
|
||
l=conecta()
|
||
g = Groups(l,"school_class","","")
|
||
a=request.vars
|
||
response = g.list(a)
|
||
l.close()
|
||
|
||
return response
|
||
|
||
@service.json
|
||
@auth.requires_login()
|
||
def getUsers():
|
||
l=conecta()
|
||
g = Groups(l,"",request.vars['row_id'],"")
|
||
response = g.listUsers(request.vars)
|
||
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 = sql+" GROUP BY l.id_laptop ORDER BY lh.datetime desc"
|
||
|
||
my = SQLiteConnection()
|
||
db = my.getDB()
|
||
result = db.executesql(sql)
|
||
|
||
serials={}
|
||
for r in result:
|
||
if str(r[0])!="":
|
||
serials[str(r[0])]=str(r[1])
|
||
|
||
rows=[]
|
||
for r in response["rows"]:
|
||
num=""
|
||
if r["cell"][1] in serials:
|
||
num = serials[r["cell"][1]]
|
||
|
||
r["cell"].append(num)
|
||
r["serial_number"]=num
|
||
rows.append(r)
|
||
|
||
response["rows"]=rows
|
||
return response
|
||
|
||
@service.json
|
||
@auth.requires_login()
|
||
def modifySerialNumber():
|
||
my = SQLiteConnection()
|
||
l = Laptops(my,"","","")
|
||
id_laptop = l.existsSerialNumber(request.vars['serial_number'])
|
||
response=""
|
||
if not id_laptop:
|
||
response = "not_exists"
|
||
else:
|
||
lh = LaptopsHistory(my,"",id_laptop,"","","","","","")
|
||
data = lh.getLastHistory()
|
||
if data["username"]!="" and data["username"]!=request.vars['id']:
|
||
response = "already_assigned"
|
||
else:
|
||
ld=conecta()
|
||
u = Users(ld,"","","","",request.vars["id"],"","","","")
|
||
userData = u.getUserData()
|
||
ld.close()
|
||
|
||
lh = LaptopsHistory(my,"",id_laptop,"2","1",userData["nif"],request.vars["id"],userData["name"],"Reasignado")
|
||
lh.add()
|
||
response="OK"
|
||
|
||
return dict(response=response)
|
||
|
||
@service.json
|
||
@auth.requires_login()
|
||
def reassignmentSerialNumber():
|
||
my = SQLiteConnection()
|
||
l = Laptops(my,"","","")
|
||
|
||
if request.vars["serial"]!="":
|
||
id_laptop = l.existsSerialNumber(request.vars['serial'])
|
||
unassignment = LaptopsHistory(my,"",id_laptop,"1","","","","","Desasignado")
|
||
unassignment.add()
|
||
|
||
ld=conecta()
|
||
u = Users(ld,"","","","",request.vars["username"],"","","","")
|
||
userData = u.getUserData()
|
||
ld.close()
|
||
|
||
id_laptop = l.existsSerialNumber(request.vars['newSerial'])
|
||
lh = LaptopsHistory(my,"",id_laptop,"2","1",userData["nif"],request.vars["username"],userData["name"],"Reasignado")
|
||
lh.add()
|
||
response="OK"
|
||
|
||
return dict(response=response)
|
||
|
||
@service.json
|
||
@auth.requires_login()
|
||
def modify():
|
||
my = SQLiteConnection()
|
||
l = Laptops(my,"",request.vars["serial_number"],request.vars["id_trademark"])
|
||
response = l.process(request.vars["action"])
|
||
|
||
if response=="OK":
|
||
ld=conecta()
|
||
u = Users(ld,"","","","",request.vars["username"],"","","","")
|
||
userData = u.getUserData()
|
||
ld.close()
|
||
|
||
max = l.getMaxId()
|
||
lh = LaptopsHistory(my,"",max,"2","1",userData["nif"],request.vars["username"],userData["name"],"Reasignado")
|
||
|
||
id_laptop = lh.userAssignment()
|
||
if id_laptop:
|
||
unassignment = LaptopsHistory(my,"",id_laptop,"1","","","","","Desasignado")
|
||
unassignment.add()
|
||
|
||
lh.add()
|
||
|
||
return dict(response = response)
|
||
|
||
@service.json
|
||
def getAllLaptopTypes():
|
||
my = SQLiteConnection()
|
||
l = Laptops(my,"","","")
|
||
response = l.getAllLaptopTypes()
|
||
return dict(response=response)
|
||
|
||
def search():
|
||
return dict()
|
||
|
||
def form():
|
||
return dict()
|
||
|
||
def call():
|
||
"""
|
||
exposes services. for example:
|
||
http://..../[app]/default/call/jsonrpc
|
||
decorate with @services.jsonrpc the functions to expose
|
||
supports xml, json, xmlrpc, jsonrpc, amfrpc, rss, csv
|
||
"""
|
||
session.forget()
|
||
return service()
|
||
Exportar a: Unified diff
Laptops_groups