Add support for refreshing multiple batches (results) at once
This commit is contained in:
parent
2605f5ab79
commit
0483f47b26
2 changed files with 108 additions and 6 deletions
|
@ -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),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue