Add support for refreshing multiple batches (results) at once
This commit is contained in:
parent
2605f5ab79
commit
0483f47b26
|
@ -4,7 +4,7 @@
|
||||||
<%def name="extra_javascript()">
|
<%def name="extra_javascript()">
|
||||||
${parent.extra_javascript()}
|
${parent.extra_javascript()}
|
||||||
% if not use_buefy:
|
% if not use_buefy:
|
||||||
% if master.results_executable and request.has_perm('{}.execute_multiple'.format(permission_prefix)):
|
% if master.results_executable and master.has_perm('execute_multiple'):
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
|
||||||
var has_execution_options = ${'true' if master.has_execution_options(batch) else 'false'};
|
var has_execution_options = ${'true' if master.has_execution_options(batch) else 'false'};
|
||||||
|
@ -12,6 +12,17 @@
|
||||||
|
|
||||||
$(function() {
|
$(function() {
|
||||||
|
|
||||||
|
$('#refresh-results-button').click(function() {
|
||||||
|
var count = $('.grid-wrapper').gridwrapper('results_count');
|
||||||
|
if (!count) {
|
||||||
|
alert("There are no batch results to refresh.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var form = $('form[name="refresh-results"]');
|
||||||
|
$(this).button('option', 'label', "Refreshing, please wait...").button('disable');
|
||||||
|
form.submit();
|
||||||
|
});
|
||||||
|
|
||||||
$('#execute-results-button').click(function() {
|
$('#execute-results-button').click(function() {
|
||||||
var count = $('.grid-wrapper').gridwrapper('results_count');
|
var count = $('.grid-wrapper').gridwrapper('results_count');
|
||||||
if (!count) {
|
if (!count) {
|
||||||
|
@ -65,7 +76,24 @@
|
||||||
|
|
||||||
<%def name="grid_tools()">
|
<%def name="grid_tools()">
|
||||||
${parent.grid_tools()}
|
${parent.grid_tools()}
|
||||||
% if master.results_executable and request.has_perm('{}.execute_multiple'.format(permission_prefix)):
|
|
||||||
|
## Refresh Results
|
||||||
|
% if master.results_refreshable and master.has_perm('refresh'):
|
||||||
|
% if use_buefy:
|
||||||
|
<b-button type="is-primary"
|
||||||
|
disabled
|
||||||
|
title="TODO: need to implement this for new theme">
|
||||||
|
Refresh Results
|
||||||
|
</b-button>
|
||||||
|
% else:
|
||||||
|
<button type="button" id="refresh-results-button">
|
||||||
|
Refresh Results
|
||||||
|
</button>
|
||||||
|
% endif
|
||||||
|
% endif
|
||||||
|
|
||||||
|
## Execute Results
|
||||||
|
% if master.results_executable and master.has_perm('execute_multiple'):
|
||||||
% if use_buefy:
|
% if use_buefy:
|
||||||
<b-button type="is-primary"
|
<b-button type="is-primary"
|
||||||
@click="executeResults()"
|
@click="executeResults()"
|
||||||
|
@ -110,7 +138,7 @@
|
||||||
|
|
||||||
<%def name="modify_this_page_vars()">
|
<%def name="modify_this_page_vars()">
|
||||||
${parent.modify_this_page_vars()}
|
${parent.modify_this_page_vars()}
|
||||||
% if master.results_executable and request.has_perm('{}.execute_multiple'.format(permission_prefix)):
|
% if master.results_executable and master.has_perm('execute_multiple'):
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
|
||||||
TailboneForm.methods.submit = function() {
|
TailboneForm.methods.submit = function() {
|
||||||
|
@ -150,7 +178,7 @@
|
||||||
|
|
||||||
<%def name="make_this_page_component()">
|
<%def name="make_this_page_component()">
|
||||||
${parent.make_this_page_component()}
|
${parent.make_this_page_component()}
|
||||||
% if master.results_executable and request.has_perm('{}.execute_multiple'.format(permission_prefix)):
|
% if master.results_executable and master.has_perm('execute_multiple'):
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
|
||||||
TailboneForm.data = function() { return TailboneFormData }
|
TailboneForm.data = function() { return TailboneFormData }
|
||||||
|
@ -163,7 +191,7 @@
|
||||||
|
|
||||||
<%def name="render_this_page_template()">
|
<%def name="render_this_page_template()">
|
||||||
${parent.render_this_page_template()}
|
${parent.render_this_page_template()}
|
||||||
% if master.results_executable and request.has_perm('{}.execute_multiple'.format(permission_prefix)):
|
% if master.results_executable and master.has_perm('execute_multiple'):
|
||||||
${execute_form.render_deform(form_kwargs={'ref': 'actualForm'}, buttons=False)|n}
|
${execute_form.render_deform(form_kwargs={'ref': 'actualForm'}, buttons=False)|n}
|
||||||
% endif
|
% endif
|
||||||
</%def>
|
</%def>
|
||||||
|
@ -172,7 +200,15 @@
|
||||||
${parent.body()}
|
${parent.body()}
|
||||||
|
|
||||||
% if not use_buefy:
|
% if not use_buefy:
|
||||||
% if master.results_executable and request.has_perm('{}.execute_multiple'.format(permission_prefix)):
|
|
||||||
|
## Refresh Results
|
||||||
|
% if master.results_refreshable and master.has_perm('refresh'):
|
||||||
|
${h.form(url('{}.refresh_results'.format(route_prefix)), name='refresh-results')}
|
||||||
|
${h.csrf_token(request)}
|
||||||
|
${h.end_form()}
|
||||||
|
% endif
|
||||||
|
|
||||||
|
% if master.results_executable and master.has_perm('execute_multiple'):
|
||||||
<div id="execution-options-dialog" style="display: none;">
|
<div id="execution-options-dialog" style="display: none;">
|
||||||
<br />
|
<br />
|
||||||
<p>
|
<p>
|
||||||
|
|
|
@ -79,6 +79,7 @@ class BatchMasterView(MasterView):
|
||||||
refresh_after_create = False
|
refresh_after_create = False
|
||||||
cloneable = False
|
cloneable = False
|
||||||
executable = True
|
executable = True
|
||||||
|
results_refreshable = False
|
||||||
results_executable = False
|
results_executable = False
|
||||||
supports_mobile = True
|
supports_mobile = True
|
||||||
mobile_filterable = True
|
mobile_filterable = True
|
||||||
|
@ -1138,6 +1139,64 @@ class BatchMasterView(MasterView):
|
||||||
progress.session['success_url'] = self.get_action_url('view', batch)
|
progress.session['success_url'] = self.get_action_url('view', batch)
|
||||||
progress.session.save()
|
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
|
# 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),
|
config.add_view(cls, attr='mobile_mark_pending', route_name='mobile.{}.mark_pending'.format(route_prefix),
|
||||||
permission='{}.edit'.format(permission_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
|
# execute (multiple) batch results
|
||||||
if cls.results_executable:
|
if cls.results_executable:
|
||||||
config.add_route('{}.execute_results'.format(route_prefix), '{}/execute-results'.format(url_prefix),
|
config.add_route('{}.execute_results'.format(route_prefix), '{}/execute-results'.format(url_prefix),
|
||||||
|
|
Loading…
Reference in a new issue