From a95a671237f4f4c6ed60ff30bc6366d4d0019053 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Jul 04 2017 13:56:44 +0000 Subject: Show the task's status on the wait page and avoid reloading the page Instead of reloading the entire page, query for its status using JS and only redirect once the task has completed. Signed-off-by: Pierre-Yves Chibon --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 3821f39..c669604 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -1814,12 +1814,13 @@ def fork_project(session, user, repo, gitfolder, session.flush() session.commit() - return tasks.fork.delay(repo.name, + task = tasks.fork.delay(repo.name, repo.namespace, repo.user.username if repo.is_fork else None, user, editbranch, - editfile).id + editfile) + return task.id def search_projects( diff --git a/pagure/lib/git_auth.py b/pagure/lib/git_auth.py index e5c7168..6a84b33 100644 --- a/pagure/lib/git_auth.py +++ b/pagure/lib/git_auth.py @@ -375,7 +375,7 @@ class Gitolite2Auth(GitAuthHelper): error_msg = ( 'The command "{0}" failed with' '\n\n out: "{1}\n\n err:"{2}"' - .format(' '.join(cmd), stdout, stderr)) + .format(cmd, stdout, stderr)) raise pagure.exceptions.PagureException(error_msg) diff --git a/pagure/templates/waiting.html b/pagure/templates/waiting.html index b3765cd..d539f41 100644 --- a/pagure/templates/waiting.html +++ b/pagure/templates/waiting.html @@ -14,13 +14,14 @@

We are waiting for your task to finish. This page should be refreshed automatically, but if not click - Here + Here +

+

+ You task is currently {{ task.status }} +

+ - {% if count >= 5 %} -

- This is taking longer than usual... Sorry for that -

- {% endif %} @@ -29,12 +30,43 @@ {% endblock %} {% block jscripts %} - {{ super() }} - {% endblock %} diff --git a/pagure/ui/app.py b/pagure/ui/app.py index 0e0a332..e20a2c3 100644 --- a/pagure/ui/app.py +++ b/pagure/ui/app.py @@ -502,36 +502,53 @@ def new_project(): @APP.route('/wait/') def wait_task(taskid): - status = pagure.lib.tasks.get_result(taskid) - if status.ready(): - result = status.get(timeout=0, propagate=False) - if status.failed(): + """ Shows a wait page until the task finishes. """ + task = pagure.lib.tasks.get_result(taskid) + + is_js = flask.request.args.get('js') + if str(is_js).lower() == '1': + is_js = True + else: + is_js = False + + prev = flask.request.args.get('prev') + if not is_safe_url(prev): + prev = flask.url_for('index') + + count = flask.request.args.get('count', 0) + try: + count = int(count) + if count < 1: + count = 0 + except ValueError: + count = 0 + + if task.ready(): + if is_js: + flask.abort(417) + + result = task.get(timeout=0, propagate=False) + if task.failed(): flask.flash('Your task failed: %s' % str(result)) - status.forget() - prev = flask.request.args.get('prev') - if not is_safe_url(prev): - prev = flask.url_for('index') + task.forget() return flask.redirect(prev) endpoint = result.pop('endpoint') - status.forget() + task.forget() return flask.redirect( flask.url_for(endpoint, **result)) else: - count = int(flask.request.args.get('count', 0)) - # First refresh in 10ms, after that, wait a second - delay = 10 if count == 0 else 1000 - prev = flask.request.args.get('prev') - if not is_safe_url(prev): - prev = flask.url_for('index') + if is_js: + return flask.jsonify({ + 'count': count + 1, + 'status': task.status, + }) + return flask.render_template( 'waiting.html', - taskid=taskid, - wait_delay=str(delay), + task=task, count=count, - wait_next=flask.url_for('wait_task', - taskid=taskid, - count=str(count + 1), - prev=prev)) + prev=prev, + ) @APP.route('/settings/', methods=('GET', 'POST')) diff --git a/pagure/ui/fork.py b/pagure/ui/fork.py index 78be8ef..1c70831 100644 --- a/pagure/ui/fork.py +++ b/pagure/ui/fork.py @@ -897,7 +897,13 @@ def fork_project(repo, username=None, namespace=None): user=flask.g.fas_user.username) SESSION.commit() - return pagure.wait_for_task(taskid) + return pagure.wait_for_task( + taskid, + prev=flask.url_for( + 'view_repo', repo=repo.name, + username=username, namespace=namespace + ) + ) except pagure.exceptions.PagureException as err: flask.flash(str(err), 'error') except SQLAlchemyError as err: # pragma: no cover diff --git a/tests/__init__.py b/tests/__init__.py index b0d21ad..fe49fc7 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -85,7 +85,7 @@ if os.environ.get('BUILD_ID')or os.environ.get('FAITOUT_URL'): pass -WAIT_REGEX = re.compile("""window\.location = '(\/wait\/[a-z0-9-]+\?.*)'""") +WAIT_REGEX = re.compile("""var _url = '(\/wait\/[a-z0-9-]+\?.*)'""") def get_wait_target(html): """ This parses the window.location out of the HTML for the wait page. """ found = WAIT_REGEX.findall(html)