Add progress indicator to batch execution.
Also disable Execute button immediately when clicked.
This commit is contained in:
parent
e01e323d3e
commit
6c5eec7981
2 changed files with 80 additions and 5 deletions
|
@ -647,13 +647,64 @@ class BatchCrud(BaseCrud):
|
|||
return self.request.route_url('{0}.refresh'.format(self.route_prefix), uuid=uuid)
|
||||
|
||||
def execute(self):
|
||||
"""
|
||||
Execute a batch. Starts a separate thread for the execution, and
|
||||
displays a progress indicator page.
|
||||
"""
|
||||
batch = self.current_batch()
|
||||
if self.handler.execute(batch):
|
||||
batch.executed = datetime.datetime.utcnow()
|
||||
batch.executed_by = self.request.user
|
||||
self.request.session.flash("Batch was executed successfully.")
|
||||
return HTTPFound(location=self.view_url(batch.uuid))
|
||||
|
||||
key = '{0}.execute'.format(self.batch_class.__tablename__)
|
||||
progress = SessionProgress(self.request, key)
|
||||
thread = Thread(target=self.execute_thread, args=(batch.uuid, progress))
|
||||
thread.start()
|
||||
|
||||
kwargs = {
|
||||
'key': key,
|
||||
'cancel_url': self.view_url(batch.uuid),
|
||||
'cancel_msg': "Batch execution was canceled.",
|
||||
}
|
||||
return render_to_response('/progress.mako', kwargs, request=self.request)
|
||||
|
||||
def execute_thread(self, batch_uuid, progress=None):
|
||||
"""
|
||||
Thread target for executing a batch with progress indicator.
|
||||
"""
|
||||
# Execute the batch, with progress. Note that we must use the rattail
|
||||
# session here; can't use tailbone because it has web request
|
||||
# transaction binding etc.
|
||||
session = RatSession()
|
||||
batch = session.query(self.batch_class).get(batch_uuid)
|
||||
try:
|
||||
result = self.handler.execute(batch, progress=progress)
|
||||
|
||||
# If anything goes wrong, rollback and log the error etc.
|
||||
except Exception as error:
|
||||
session.rollback()
|
||||
log.exception("execution failed for batch: {0}".format(batch))
|
||||
session.close()
|
||||
if progress:
|
||||
progress.session.load()
|
||||
progress.session['error'] = True
|
||||
progress.session['error_msg'] = "Batch execution failed: {0}".format(error)
|
||||
progress.session.save()
|
||||
|
||||
# If no error, check result flag (false means user canceled).
|
||||
else:
|
||||
if result:
|
||||
batch.executed = datetime.datetime.utcnow()
|
||||
batch.executed_by = self.request.user
|
||||
session.commit()
|
||||
else:
|
||||
session.rollback()
|
||||
session.refresh(batch)
|
||||
session.close()
|
||||
|
||||
if progress:
|
||||
progress.session.load()
|
||||
progress.session['complete'] = True
|
||||
progress.session['success_url'] = self.view_url(batch.uuid)
|
||||
progress.session.save()
|
||||
|
||||
|
||||
class FileBatchCrud(BatchCrud):
|
||||
"""
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue