I have a time consuming server side calculation, which is triggered by 
edit-form submitting and can run up to several minutes (its a sports event 
data recalculation if rules are changed). During this time I want to 
receive messages via ajax from server and post them in a div for a progress 
visualization. So far I`v done this using DB table for recording log 
messages:

*db.py:*
#here I store messages 
db.define_table('log', Field('message', 'string')) 

*controller #1:*
def editForm():
...
if form.process().accepted:
event=db(db.event.id==request.get_vars.id).select().first()
recalculateEvent(event)

*myModel.py:*
#recalculation must be accessible from all controller files, so I put it in 
a Model 
import myModule

recalculateEvent(event): 
db.log.truncate()     #clear log
session._unlock(response)          #without this, this function does not 
allow functions in other controllers to run
db.log.insert(message='Starting Calculation') 
db.commit()                          #if I do not commit after every 
insert, messages do not appear in DB table
myModule.calculateSomeMoreData()
for p in players:
db.log.insert(message='Calculating player '+p.name) 
db.commit()
...more calculations...
p.update_record()

*controller#2:*
#ajax calls this function every .5 seconds for messages
def getProgress():
m=' '.join([l.message for l in db(db.log).select()])
return json.dumps(dict(m=m))

*View, javascript:*
$("#submit_button").click(function(e){
$('#progress').show();
GetProgres();
$("#myForm").submit();
});
function GetProgres() {
$.ajax({
type: "POST",
url: '{{=URL('controller#2', 'getProgress')}}',
dataType: "json",
success: function(data) {
$('#progress').html(data.m);
setTimeout(function() { GetProgres(); }, 500);
},
error: function (xhr, ajaxOptions, thrownError){
alert(xhr.status);
alert(xhr.statusText);
alert(thrownError);
}
});
}

I have 2 problems with this:

1. Every other time web2py throws this error after recalculateEvent(event) 
function completes:
Traceback (most recent call last):
File "gluon/main.py", line 576, in wsgibase
File "gluon/globals.py", line 749, in _try_store_in_cookie_or_file
File "gluon/globals.py", line 768, in _try_store_in_file
IOError: [Errno 13] Permission denied

If I remove db.log.insert+db.commit lines - no error. But how else can I 
transfer live data between running real-time function in a model and 
function in a controller? I tried storing messages in a session, but it 
does not update until model function is finished.

2. Ajax call from view works only when hosting on my local machine and only 
in Opera and IE. It does not call controller#2/getProgress function in 
Chrome and Firefox on localhost. When hosting on outside server it does not 
work on any browser... Only Firefox triggers ajax error, with 
xhr.statusText='error'.

I guess this is something to do with that I`m triggering form submission, 
calculation function and at the same time polling sever. But I have no idea 
what to do.

May be if my approach is totally wrong somebody can suggest how to 
implement this in other way.

-- 

--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to