Exemplo n.º 1
0
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)
Exemplo n.º 2
0
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)
Exemplo n.º 3
0
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)
Exemplo n.º 4
0
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))
Exemplo n.º 5
0
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)