Proyecto

General

Perfil

« Anterior | Siguiente » 

Revisión 367

Añadido por Manu Mora Gordillo hace casi 13 años

Laptops_groups

Ver diferencias:

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>&nbsp;&nbsp;<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