summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--yaksh/models.py33
-rw-r--r--yaksh/views.py46
2 files changed, 51 insertions, 28 deletions
diff --git a/yaksh/models.py b/yaksh/models.py
index 984a712..9153367 100644
--- a/yaksh/models.py
+++ b/yaksh/models.py
@@ -2134,11 +2134,38 @@ class AnswerPaperManager(models.Manager):
best_attempt = 0.0
papers = self.filter(question_paper__quiz_id=quiz.id,
course_id=course_id,
- user=user_id).values("marks_obtained")
- if papers:
- best_attempt = max([marks["marks_obtained"] for marks in papers])
+ user=user_id).order_by("-marks_obtained").values(
+ "marks_obtained")
+ if papers.exists():
+ best_attempt = papers[0]["marks_obtained"]
return best_attempt
+ def get_user_scores(self, question_papers, user, course_id):
+ qp_ids = list(zip(*question_papers))[0]
+ papers = self.filter(
+ course_id=course_id, user_id=user.get("id"),
+ question_paper__id__in=qp_ids
+ ).values("question_paper_id", "marks_obtained")
+ df = pd.DataFrame(papers)
+ user_marks = 0
+ ap_data = None
+ if not df.empty:
+ ap_data = df.groupby("question_paper_id").tail(1)
+ for qp_id, quiz, quiz_marks in question_papers:
+ if ap_data is not None:
+ qp = ap_data['question_paper_id'].to_list()
+ marks = ap_data['marks_obtained'].to_list()
+ if qp_id in qp:
+ idx = qp.index(qp_id)
+ user_marks += marks[idx]
+ user[f"{quiz}-{quiz_marks}-Marks"] = marks[idx]
+ else:
+ user[f"{quiz}-{quiz_marks}-Marks"] = 0
+ else:
+ user[f"{quiz}-{quiz_marks}-Marks"] = 0
+ user.pop("id")
+ user["total_marks"] = user_marks
+
###############################################################################
class AnswerPaper(models.Model):
diff --git a/yaksh/views.py b/yaksh/views.py
index dc4f833..1530cd6 100644
--- a/yaksh/views.py
+++ b/yaksh/views.py
@@ -2256,40 +2256,36 @@ def download_course_csv(request, course_id):
user = request.user
if not is_moderator(user):
raise Http404('You are not allowed to view this page!')
- course = Course.objects.prefetch_related("learning_module").get(
- id=course_id)
+ course = get_object_or_404(
+ Course.objects.prefetch_related("learning_module"), id=course_id
+ )
if not course.is_creator(user) and not course.is_teacher(user):
- raise Http404('The question paper does not belong to your course')
- students = course.get_only_students().annotate(
+ raise Http404('You are not allowed to view this course')
+ students = list(course.get_only_students().annotate(
roll_number=F('profile__roll_number'),
institute=F('profile__institute')
).values(
- "id", "first_name", "last_name",
- "email", "institute", "roll_number"
- )
- quizzes = course.get_quizzes()
-
+ "id", "first_name", "last_name", "email", "institute", "roll_number"
+ ))
+ que_pprs = [
+ quiz.questionpaper_set.values(
+ "id", "quiz__description", "total_marks")[0]
+ for quiz in course.get_quizzes()
+ ]
+ total_course_marks = sum([qp.get("total_marks", 0) for qp in que_pprs])
+ qp_ids = [
+ (qp.get("id"), qp.get("quiz__description"), qp.get("total_marks"))
+ for qp in que_pprs
+ ]
for student in students:
- total_course_marks = 0.0
user_course_marks = 0.0
- for quiz in quizzes:
- quiz_best_marks = AnswerPaper.objects. \
- get_user_best_of_attempts_marks(quiz, student["id"], course_id)
- user_course_marks += quiz_best_marks
- total_course_marks += quiz.questionpaper_set.values_list(
- "total_marks", flat=True)[0]
- student["{}".format(quiz.description)] = quiz_best_marks
- student["total_scored"] = user_course_marks
+ AnswerPaper.objects.get_user_scores(qp_ids, student, course_id)
student["out_of"] = total_course_marks
+ df = pd.DataFrame(students)
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="{0}.csv"'.format(
- (course.name).lower().replace('.', ''))
- header = ['first_name', 'last_name', "roll_number", "email", "institute"]\
- + [quiz.description for quiz in quizzes] + ['total_scored', 'out_of']
- writer = csv.DictWriter(response, fieldnames=header, extrasaction='ignore')
- writer.writeheader()
- for student in students:
- writer.writerow(student)
+ (course.name).lower().replace(' ', '_'))
+ output_file = df.to_csv(response, index=False)
return response