summaryrefslogtreecommitdiff
path: root/yaksh/tasks.py
diff options
context:
space:
mode:
Diffstat (limited to 'yaksh/tasks.py')
-rw-r--r--yaksh/tasks.py83
1 files changed, 83 insertions, 0 deletions
diff --git a/yaksh/tasks.py b/yaksh/tasks.py
new file mode 100644
index 0000000..c68faa9
--- /dev/null
+++ b/yaksh/tasks.py
@@ -0,0 +1,83 @@
+# Python Imports
+from __future__ import absolute_import, unicode_literals
+from textwrap import dedent
+
+# Django and celery imports
+from celery import shared_task
+from celery.utils.log import get_task_logger
+from django.urls import reverse
+from django.shortcuts import get_object_or_404
+
+# Local imports
+from .models import Course, QuestionPaper, Quiz, AnswerPaper, CourseStatus
+from notifications_plugin.models import NotificationMessage, Notification
+
+
+@shared_task
+def regrade_papers(data):
+ question_id = data.get("question_id")
+ questionpaper_id = data.get("questionpaper_id")
+ answerpaper_id = data.get("answerpaper_id")
+ course_id = data.get("course_id")
+ user_id = data.get("user_id")
+ quiz_id = data.get("quiz_id")
+ quiz_name = data.get("quiz_name")
+ course_name = data.get("course_name")
+
+ logger = get_task_logger(__name__)
+
+ try:
+ if answerpaper_id is not None and question_id is None:
+ # Regrade specific user for all questions
+ answerpaper = AnswerPaper.objects.get(id=answerpaper_id)
+ for question in answerpaper.questions.all():
+ answerpaper.regrade(question.id)
+ course_status = CourseStatus.objects.filter(
+ user=answerpaper.user, course=answerpaper.course)
+ if course_status.exists():
+ course_status.first().set_grade()
+ url = reverse("yaksh:grade_user",
+ args=[quiz_id, answerpaper.user_id, course_id])
+
+ elif answerpaper_id is not None and question_id is not None:
+ # Regrade specific user for a specific question
+ answerpaper = AnswerPaper.objects.get(pk=answerpaper_id)
+ answerpaper.regrade(question_id)
+ course_status = CourseStatus.objects.filter(user=answerpaper.user,
+ course=answerpaper.course)
+ if course_status.exists():
+ course_status.first().set_grade()
+ url = reverse("yaksh:grade_user",
+ args=[quiz_id, answerpaper.user_id, course_id])
+
+ elif questionpaper_id is not None and question_id is not None:
+ # Regrade all users for a specific question
+ answerpapers = AnswerPaper.objects.filter(
+ questions=question_id,
+ question_paper_id=questionpaper_id, course_id=course_id)
+ for answerpaper in answerpapers:
+ answerpaper.regrade(question_id)
+ course_status = CourseStatus.objects.filter(
+ user=answerpaper.user, course=answerpaper.course)
+ if course_status.exists():
+ course_status.first().set_grade()
+ url = reverse("yaksh:grade_user", args=[quiz_id, course_id])
+
+ message = dedent("""
+ Quiz re-evaluation is complete Click <a href="{0}">here</a> to view
+ """.format(url)
+ )
+ nm = NotificationMessage.objects.add_single_message(
+ user_id, "{0} re-evaluation status".format(quiz_name),
+ message, "success"
+ )
+ except Exception as e:
+ nm = NotificationMessage.objects.add_single_message(
+ user_id, "{0} re-evaluation status".format(quiz_name),
+ "Unable to regrade {0}. Try again later".format(quiz_name),
+ "warning"
+ )
+ logger.error(e)
+ notification = Notification.objects.add_single_notification(
+ user_id, nm.id
+ )