def check_progress(request, course, instance, content, revision, task_id): # Based on https://djangosnippets.org/snippets/2898/ # TODO: Check permissions task = celery_app.AsyncResult(id=task_id) info = task.info if task.ready(): return file_exercise_evaluation(request, course, instance, content, revision, task_id, task) else: celery_status = get_celery_worker_status() if "errors" in celery_status: data = celery_status else: progress_url = reverse('courses:check_progress', kwargs={ 'course': course, 'instance': instance, 'content': content, 'revision': revision, 'task_id': task_id, }) if not info: info = task.info # Try again in case the first time was too early data = { "state": task.state, "metadata": info, "redirect": progress_url } return JsonResponse(data)
def course_completion_csv_progress(request, course, instance, task_id): task = celery_app.AsyncResult(id=task_id) if task.ready(): download_url = reverse("teacher_tools:completion_csv_download", kwargs={ "course": course, "instance": instance, "task_id": task_id }) data = { "state": task.state, "metadata": task.info, "redirect": download_url } return JsonResponse(data) else: progress_url = reverse("teacher_tools:completion_csv_progress", kwargs={ "course": course, "instance": instance, "task_id": task_id }) data = { "state": task.state, "metadata": task.info, "redirect": progress_url } return JsonResponse(data)
def generate_instance_stats(request, course, instance): task_meta = cache.get("{}_stat_meta".format(instance.slug)) task_meta = task_meta and json.loads(task_meta) if task_meta and task_meta["completed"] is None: task = celery_app.AsyncResult(id=task_meta["task_id"]) if task.state in ("PENDING", "STARTED"): return HttpResponse( _("Stats generation for '%s' has already been requested." % instance.name), status=409 ) data = {"msg": _("Stats requested. Request processing starts approximately:")} if settings.STAT_GENERATION_HOUR is None: task = chain( stat_tasks.generate_instance_user_stats.si(instance_slug=instance.slug), stat_tasks.generate_instance_tasks_summary.si(instance_slug=instance.slug), stat_tasks.finalize_instance_stats.s(instance_slug=instance.slug) ).apply_async(ignore_result=True) data["eta"] = datetime.datetime.today().strftime("%Y-%m-%d %H:%M:%S") else: today = datetime.datetime.today() eta = today.replace(hour=settings.STAT_GENERATION_HOUR, minute=0, second=0) task = chain( stat_tasks.generate_instance_user_stats.si(instance_slug=instance.slug), stat_tasks.generate_instance_tasks_summary.si(instance_slug=instance.slug), stat_tasks.finalize_instance_stats.s(instance_slug=instance.slug) ).apply_async(eta=eta, ignore_result=True) data["eta"] = eta.strftime("%Y-%m-%d %H:%M:%S") cache.set("{}_stat_meta".format(instance.slug), json.dumps({"task_id": task.task_id, "completed": None})) return JsonResponse(data)
def course_completion_csv_download(request, course, instance, task_id): task = celery_app.AsyncResult(id=task_id) if task.ready(): csv_str = cache.get(task_id) cache.delete(task_id) task.forget() response = HttpResponse(content=csv_str, content_type="text/csv") response[ "Content-Disposition"] = "attachment; filename={}_completion_{}.csv".format( instance.slug, datetime.date.today().strftime("%Y-%m-%d")) return response else: return HttpResponseGone( _("Completion CSV generation (task id: %s) has already been downloaded." % task_id))
def moss_progress(request, course, instance, content, task_id): task = celery_app.AsyncResult(id=task_id) if task.ready(): data = {"state": task.state, "metadata": task.info} return JsonResponse(data) else: progress_url = reverse("teacher_tools:moss_progress", kwargs={ "course": course, "instance": instance, "content": content, "task_id": task_id }) data = { "state": task.state, "metadata": task.info, "redirect": progress_url } return JsonResponse(data)