Skip to content

Commit f5fae46

Browse files
committed
Moderator interface: Course dashboard optimization
1 parent 8031599 commit f5fae46

File tree

3 files changed

+124
-143
lines changed

3 files changed

+124
-143
lines changed

yaksh/models.py

Lines changed: 16 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -564,27 +564,7 @@ def get_total_students(self, course):
564564
return AnswerPaper.objects.filter(
565565
question_paper=qp,
566566
course=course
567-
).values_list("user", flat=True).distinct().count()
568-
569-
def get_passed_students(self, course):
570-
try:
571-
qp = self.questionpaper_set.get().id
572-
except QuestionPaper.DoesNotExist:
573-
qp = None
574-
return AnswerPaper.objects.filter(
575-
question_paper=qp,
576-
course=course, passed=True
577-
).values_list("user", flat=True).distinct().count()
578-
579-
def get_failed_students(self, course):
580-
try:
581-
qp = self.questionpaper_set.get().id
582-
except QuestionPaper.DoesNotExist:
583-
qp = None
584-
return AnswerPaper.objects.filter(
585-
question_paper=qp,
586-
course=course, passed=False
587-
).values_list("user", flat=True).distinct().count()
567+
)
588568

589569
def get_answerpaper_status(self, user, course):
590570
try:
@@ -737,8 +717,7 @@ class LearningModule(models.Model):
737717
is_trial = models.BooleanField(default=False)
738718

739719
def get_quiz_units(self):
740-
return [unit.quiz for unit in self.learning_unit.filter(
741-
type="quiz")]
720+
return self.learning_unit.filter(type="quiz")
742721

743722
def get_lesson_units(self):
744723
return [unit.lesson for unit in self.learning_unit.filter(
@@ -1099,17 +1078,23 @@ def get_unit_completion_status(self, unit, user, course_status):
10991078
return unit.get_completion_status(user, self, course_status)
11001079

11011080
def get_quizzes(self):
1102-
learning_modules = self.learning_module.all()
1103-
quiz_list = []
1081+
learning_modules = self.get_learning_modules()
1082+
unit_list = []
11041083
for module in learning_modules:
1105-
quiz_list.extend(module.get_quiz_units())
1106-
return quiz_list
1084+
unit_list.extend(module.learning_unit.filter(type='quiz'))
1085+
return unit_list
11071086

11081087
def get_quiz_details(self):
1109-
return [(quiz, quiz.get_total_students(self),
1110-
quiz.get_passed_students(self),
1111-
quiz.get_failed_students(self))
1112-
for quiz in self.get_quizzes()]
1088+
unit_list = self.get_quizzes()
1089+
1090+
quiz_data = []
1091+
for unit in unit_list:
1092+
total_students = unit.quiz.get_total_students(self)
1093+
t_students = total_students.distinct().count()
1094+
p_students = total_students.filter(passed=True).distinct().count()
1095+
f_students = total_students.filter(passed=False).distinct().count()
1096+
quiz_data.append((unit, t_students, p_students, f_students))
1097+
return quiz_data
11131098

11141099
def get_learning_units(self):
11151100
learning_modules = self.get_learning_modules()

yaksh/templates/yaksh/moderator_dashboard.html

Lines changed: 106 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -5,117 +5,113 @@
55
{% block pagetitle %} <h2>My Dashboard</h2> {% endblock %}
66

77
{% block content %}
8-
<div class="container">
9-
<center>
10-
<h4>
11-
List of quizzes! Click on the given links to have a look at answer papers for a quiz
12-
</h4>
13-
</center>
14-
<hr>
15-
<center>
16-
<a href="{% url 'yaksh:add_course' %}" class="btn btn-success btn-lg">
17-
<span class=" fa fa-plus-circle"></span>&nbsp;Add Course
18-
</a>
19-
<a href="{% url 'yaksh:create_demo_course' %}" class="btn btn-primary btn-lg">
20-
Create Demo Course
21-
</a>
22-
<br><br>
23-
{% if messages %}
24-
{% for message in messages %}
25-
<div class="alert alert-dismissible alert-{{ message.tags }}">
26-
<button type="button" class="close" data-dismiss="alert">
27-
<i class="fa fa-close"></i>
28-
</button>
29-
<strong>{{ message }}</strong>
30-
</div>
31-
{% endfor %}
32-
{% endif %}
33-
</center>
34-
{% with objects as courses %}
35-
<br>
36-
{% if not courses %}
37-
<div class="alert alert-info">
38-
No Courses found. Add a new course or Create demo course
39-
</div>
40-
{% else %}
41-
{% include "yaksh/paginator.html" %}
42-
<br>
43-
<div id="accordion">
44-
{% for course in courses %}
45-
<div class="card">
46-
<div class="card-header">
47-
<div class="row">
48-
<div class="col-md-4">
49-
<h4 data-toggle="tooltip" title="{{course.name}}">
50-
{{ course.name | truncatechars:40 }}
51-
</h4>
52-
</div>
53-
<div class="col-md-2">
54-
{% if course.active %}
55-
<span class="badge badge-pill badge-success">
56-
Active
57-
</span>
58-
{% else %}
59-
<span class="badge badge-pill badge-danger">
60-
Inactive
61-
</span>
62-
{% endif %}
63-
</div>
64-
<div class="col-md-3">
65-
<a href="{% url 'yaksh:course_detail' course.id %}" class="btn btn-primary">
66-
<i class="fa fa-tasks"></i>
67-
Manage Course
68-
</a>
69-
</div>
70-
<div class="col-md">
71-
<a class="card-link btn btn-outline-info" data-toggle="collapse" href="#collapse{{course.id}}">
72-
Details
73-
<i class="fa fa-toggle-down" id="toggle_course_{{course.id}}"></i>
74-
</a>
8+
<div class="container">
9+
<center>
10+
<h4>
11+
List of quizzes! Click on the given links to have a look at answer papers for a quiz
12+
</h4>
13+
</center>
14+
<hr>
15+
<center>
16+
<a href="{% url 'yaksh:add_course' %}" class="btn btn-success btn-lg">
17+
<span class=" fa fa-plus-circle"></span>&nbsp;Add Course
18+
</a>
19+
<a href="{% url 'yaksh:create_demo_course' %}" class="btn btn-primary btn-lg">
20+
Create Demo Course
21+
</a>
22+
<br><br>
23+
{% if messages %}
24+
{% for message in messages %}
25+
<div class="alert alert-dismissible alert-{{ message.tags }}">
26+
<button type="button" class="close" data-dismiss="alert">
27+
<i class="fa fa-close"></i>
28+
</button>
29+
<strong>{{ message }}</strong>
30+
</div>
31+
{% endfor %}
32+
{% endif %}
33+
</center>
34+
{% with objects as courses %}
35+
<br/>
36+
{% if not courses %}
37+
<div class="alert alert-info">
38+
No Courses found. Add a new course or Create a Demo Course
39+
</div>
40+
{% else %}
41+
{% include 'yaksh/paginator.html' %}
42+
<br/>
43+
<div id="accordian">
44+
{% for course in courses %}
45+
<div class="card">
46+
<div class="card-header">
47+
<div class="row">
48+
<div class="col-md-4">
49+
<h4 data-toggle="tooltip" title="{{course.name}}">
50+
{{ course.name | truncatechars:40 }}
51+
</h4>
52+
</div>
53+
<div class="col-md-2">
54+
{% if course.active %}
55+
<span class="badge badge-pill badge-success">
56+
Active
57+
</span>
58+
{% else %}
59+
<span class="badge badge-pill badge-danger">
60+
Inactive
61+
</span>
62+
{% endif %}
63+
</div>
64+
<div class="col-md-3">
65+
<a href="{% url 'yaksh:course_detail' course.id %}" class="btn btn-primary">
66+
<i class="fa fa-tasks"></i>
67+
Manage Course
68+
</a>
69+
</div>
70+
<div class="col-md">
71+
<a class="card-link btn btn-outline-info" data-toggle="collapse" href="#collapse{{course.id}}">
72+
Details
73+
<i class="fa fa-toggle-down" id="toggle_course_{{course.id}}"></i>
74+
</a>
75+
</div>
76+
</div>
7577
</div>
76-
</div>
77-
</div>
78-
<div id="collapse{{course.id}}" class="collapse hide" data-parent="#accordion">
79-
<div class="card-body">
80-
<strong>{{ course.name }}</strong>
81-
{% get_course_details course as course_details %}
82-
{% if course_details %}
83-
<table class="table table-responsive-sm">
84-
<tr>
85-
<th>Quiz</th>
86-
<th>Taken By</th>
87-
<th>No. of users Passed</th>
88-
<th>No. of users Failed</th>
89-
</tr>
90-
{% for quiz, users_no, passed, failed in course_details %}
91-
<tr>
92-
<td>
93-
<a href="{% url 'yaksh:monitor' quiz.id course.id %}">
94-
{{ quiz.description }}
95-
</a>
96-
</td>
97-
<td>{{users_no}} user(s)</td>
98-
<td>{{passed}}</td>
99-
<td>{{failed}}</td>
100-
</tr>
101-
{% endfor %}
102-
</table>
103-
{% else %}
104-
<br><br>
105-
<div class="alert alert-info">
106-
<strong>No Quizzes</strong>
78+
<div id="collapse{{course.id}}" class="collapse hide" data-parent="#accordian">
79+
<div class="card-body">
80+
<strong>{{course.name}}</strong>
81+
{% get_course_details course as course_details %}
82+
{% if course_details %}
83+
<table class="table table-responsive-sm">
84+
<tr>
85+
<th>Quiz</th>
86+
<th>Taken By</th>
87+
<th>No. of users Passed</th>
88+
<th>No. of users Failed</th>
89+
</tr>
90+
{% for unit, total, passed, failed in course_details %}
91+
<tr>
92+
<td>
93+
<a href="{% url 'yaksh:monitor' unit.quiz.id course.id %}">
94+
{{ unit.quiz.description }}
95+
</a>
96+
</td>
97+
<td>{{total}} user(s)</td>
98+
<td>{{passed}}</td>
99+
<td>{{failed}}</td>
100+
</tr>
101+
{% endfor %}
102+
</table>
103+
{% else %}
104+
<br><br>
105+
<div class="alert alert-info">
106+
<strong>No Quizzes</strong>
107+
</div>
108+
{% endif %}
107109
</div>
108-
{% endif %}
110+
</div>
109111
</div>
110-
</div>
112+
{% endfor %}
111113
</div>
112-
<br>
113-
{% endfor %}
114-
</div>
115-
{% include "yaksh/paginator.html" %}
116-
<br>
117-
{% endif %}
118-
{% endwith %}
119-
</div>
120-
{% endblock %}
121-
114+
{% endif %}s
115+
{% endwith %}
116+
</div>
117+
{% endblock content %}

yaksh/views.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -452,11 +452,11 @@ def prof_manage(request, msg=None):
452452
return my_redirect('/exam/login')
453453
if not is_moderator(user):
454454
return my_redirect('/exam/')
455-
courses = Course.objects.get_queryset().filter(
455+
courses = Course.objects.filter(
456456
Q(creator=user) | Q(teachers=user),
457457
is_trial=False).distinct().order_by("-active")
458458

459-
paginator = Paginator(courses, 20)
459+
paginator = Paginator(courses, 15)
460460
page = request.GET.get('page')
461461
courses = paginator.get_page(page)
462462
messages.info(request, msg)

0 commit comments

Comments
 (0)