diff --git a/circle/dashboard/views.py b/circle/dashboard/views.py index 67eddc5..10c49a0 100644 --- a/circle/dashboard/views.py +++ b/circle/dashboard/views.py @@ -52,6 +52,7 @@ from django_tables2 import SingleTableView from braces.views import (LoginRequiredMixin, SuperuserRequiredMixin, PermissionRequiredMixin) from braces.views._access import AccessMixin +from celery.exceptions import TimeoutError from django_sshkey.models import UserKey @@ -583,13 +584,28 @@ class OperationView(RedirectToLoginMixin, DetailView): extra = {} result = None try: - self.get_op().async(user=request.user, **extra) + task = self.get_op().async(user=request.user, **extra) except Exception as e: messages.error(request, _('Could not start operation.')) logger.exception(e) result = e else: - messages.success(request, _('Operation is started.')) + wait = self.wait_for_result + if wait: + try: + result = task.get(timeout=wait, + interval=min((wait / 5, .5))) + except TimeoutError: + logger.debug("Result didn't arrive in %ss", + self.wait_for_result, exc_info=True) + except Exception as e: + messages.error(request, _('Operation failed.')) + logger.debug("Operation failed.", exc_info=True) + result = e + else: + messages.success(request, _('Operation succeeded.')) + if result is None: + messages.success(request, _('Operation is started.')) if "/json" in request.META.get("HTTP_ACCEPT", ""): data = self.get_response_data(result, post_extra=extra, **kwargs)