Add support for refreshing multiple batches (results) at once

This commit is contained in:
Lance Edgar 2020-03-02 18:11:13 -06:00
parent 2605f5ab79
commit 0483f47b26
2 changed files with 108 additions and 6 deletions

View file

@ -79,6 +79,7 @@ class BatchMasterView(MasterView):
refresh_after_create = False
cloneable = False
executable = True
results_refreshable = False
results_executable = False
supports_mobile = True
mobile_filterable = True
@ -1138,6 +1139,64 @@ class BatchMasterView(MasterView):
progress.session['success_url'] = self.get_action_url('view', batch)
progress.session.save()
def refresh_results(self):
"""
Refresh all batches which are returned from the current index query.
Starts a separate thread for the refresh, and displays a progress
indicator page.
"""
key = '{}.refresh_results'.format(self.get_route_prefix())
batches = self.get_effective_data()
progress = self.make_progress(key)
kwargs = {'progress': progress}
thread = Thread(target=self.refresh_results_thread,
args=(batches, self.request.user.uuid),
kwargs=kwargs)
thread.start()
return self.render_progress(progress, {
'cancel_url': self.get_index_url(),
'cancel_msg': "Batch execution was canceled",
})
def refresh_results_thread(self, batches, user_uuid, progress=None):
"""
Thread target for refreshing multiple batches with progress indicator.
"""
session = RattailSession()
batches = batches.with_session(session).all()
user = session.query(model.User).get(user_uuid)
try:
self.handler.refresh_many(batches, user=user, progress=progress)
except Exception as error:
session.rollback()
log.exception("refresh failed for batch(es)!")
session.close()
if progress:
progress.session.load()
progress.session['error'] = True
progress.session['error_msg'] = self.refresh_error_message(error)
progress.session.save()
else:
session.commit()
self.request.session.flash("{} {} were refreshed".format(
len(batches), self.get_model_title_plural()))
success_url = self.get_refresh_results_success_url()
session.close()
if progress:
progress.session.load()
progress.session['complete'] = True
progress.session['success_url'] = success_url
progress.session.save()
def refresh_error_message(self, error):
return "Batch refresh failed: {}".format(simple_error(error))
def get_refresh_results_success_url(self):
return self.get_index_url()
########################################
# batch rows
########################################
@ -1478,6 +1537,13 @@ class BatchMasterView(MasterView):
config.add_view(cls, attr='mobile_mark_pending', route_name='mobile.{}.mark_pending'.format(route_prefix),
permission='{}.edit'.format(permission_prefix))
# refresh multiple batches (results)
if cls.results_refreshable:
config.add_route('{}.refresh_results'.format(route_prefix), '{}/refresh-results'.format(url_prefix),
request_method='POST')
config.add_view(cls, attr='refresh_results', route_name='{}.refresh_results'.format(route_prefix),
permission='{}.refresh'.format(permission_prefix))
# execute (multiple) batch results
if cls.results_executable:
config.add_route('{}.execute_results'.format(route_prefix), '{}/execute-results'.format(url_prefix),