summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--yaksh/models.py12
-rw-r--r--yaksh/templates/yaksh/view_profile.html1
-rw-r--r--yaksh/test_views.py117
-rw-r--r--yaksh/urls.py1
-rw-r--r--yaksh/views.py46
5 files changed, 142 insertions, 35 deletions
diff --git a/yaksh/models.py b/yaksh/models.py
index 1eca721..1199a92 100644
--- a/yaksh/models.py
+++ b/yaksh/models.py
@@ -8,7 +8,7 @@ from ruamel.yaml.comments import CommentedMap
from random import sample
from collections import Counter
from django.db import models
-from django.contrib.auth.models import User
+from django.contrib.auth.models import User, Group
from django.contrib.contenttypes.models import ContentType
from taggit.managers import TaggableManager
from django.utils import timezone
@@ -982,6 +982,7 @@ class Profile(models.Model):
institute = models.CharField(max_length=128)
department = models.CharField(max_length=64)
position = models.CharField(max_length=64)
+ is_moderator = models.BooleanField(default=False)
timezone = models.CharField(
max_length=64,
default=pytz.utc.zone,
@@ -1000,6 +1001,15 @@ class Profile(models.Model):
os.chmod(user_dir, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
return user_dir
+ def _add_to_moderator_group(self, group_name='moderator'):
+ if self.is_moderator:
+ group = Group.objects.get(name=group_name)
+ self.user.groups.add(group)
+
+ def save(self, *args, **kwargs):
+ super(Profile, self).save(*args, **kwargs)
+ self._add_to_moderator_group()
+
def __str__(self):
return '%s' % (self.user.get_full_name())
diff --git a/yaksh/templates/yaksh/view_profile.html b/yaksh/templates/yaksh/view_profile.html
index ce95226..1b75e6e 100644
--- a/yaksh/templates/yaksh/view_profile.html
+++ b/yaksh/templates/yaksh/view_profile.html
@@ -37,4 +37,5 @@
</tr>
</table>
<a class="btn btn-primary pull-right" href="{{ URL_ROOT }}/exam/editprofile/">Edit Profile</a>
+ <a class="btn btn-primary pull-left" href="{{ URL_ROOT }}/exam/toggle_moderator/">Toggle Moderator Role</a>
{% endblock %}
diff --git a/yaksh/test_views.py b/yaksh/test_views.py
index 06a4fa3..b71020e 100644
--- a/yaksh/test_views.py
+++ b/yaksh/test_views.py
@@ -467,7 +467,7 @@ class TestMonitor(TestCase):
password=self.user_plaintext_pass,
first_name='first_name',
last_name='last_name',
- email='demo@test.com'
+ email='demo@test.com',
)
Profile.objects.create(
@@ -476,7 +476,8 @@ class TestMonitor(TestCase):
institute='IIT',
department='Chemical',
position='Moderator',
- timezone='UTC'
+ timezone='UTC',
+ is_moderator=True
)
# Create Student
@@ -661,7 +662,8 @@ class TestGradeUser(TestCase):
institute='IIT',
department='Chemical',
position='Moderator',
- timezone='UTC'
+ timezone='UTC',
+ is_moderator=True
)
# Create Student
@@ -877,7 +879,8 @@ class TestDownloadAssignment(TestCase):
institute='IIT',
department='Chemical',
position='Moderator',
- timezone='UTC'
+ timezone='UTC',
+ is_moderator=True
)
# Add to moderator group
@@ -1052,7 +1055,8 @@ class TestAddQuiz(TestCase):
institute='IIT',
department='Chemical',
position='Moderator',
- timezone='UTC'
+ timezone='UTC',
+ is_moderator=True
)
# Create Student
@@ -1354,7 +1358,8 @@ class TestAddTeacher(TestCase):
institute='IIT',
department='Chemical',
position='Moderator',
- timezone='UTC'
+ timezone='UTC',
+ is_moderator=True
)
# Create Student
@@ -1668,7 +1673,8 @@ class TestCourses(TestCase):
institute='IIT',
department='Chemical',
position='Moderator',
- timezone='UTC'
+ timezone='UTC',
+ is_moderator=True
)
self.user2_plaintext_pass = 'demo2'
@@ -1686,7 +1692,8 @@ class TestCourses(TestCase):
institute='IIT',
department='Aeronautical',
position='Moderator',
- timezone='UTC'
+ timezone='UTC',
+ is_moderator=True
)
# Create Student
@@ -1716,6 +1723,16 @@ class TestCourses(TestCase):
email='demo_teacher@test.com'
)
+ Profile.objects.create(
+ user=self.teacher,
+ roll_number=10,
+ institute='IIT',
+ department='Aeronautical',
+ position='Moderator',
+ timezone='UTC',
+ is_moderator=True
+ )
+
# Add to moderator group
self.mod_group.user_set.add(self.user1)
self.mod_group.user_set.add(self.user2)
@@ -2087,7 +2104,8 @@ class TestAddCourse(TestCase):
institute='IIT',
department='Chemical',
position='Moderator',
- timezone='UTC'
+ timezone='UTC',
+ is_moderator=True
)
# Create a teacher
@@ -2106,7 +2124,8 @@ class TestAddCourse(TestCase):
institute='IIT',
department='Chemical',
position='Moderator',
- timezone='UTC'
+ timezone='UTC',
+ is_moderator=True
)
# Create Student
@@ -2266,7 +2285,8 @@ class TestCourseDetail(TestCase):
institute='IIT',
department='Chemical',
position='Moderator',
- timezone='UTC'
+ timezone='UTC',
+ is_moderator=True
)
self.user2_plaintext_pass = 'demo2'
@@ -2849,7 +2869,8 @@ class TestEnrollRequest(TestCase):
institute='IIT',
department='Chemical',
position='Moderator',
- timezone='UTC'
+ timezone='UTC',
+ is_moderator=True
)
self.user2_plaintext_pass = 'demo2'
@@ -2867,7 +2888,8 @@ class TestEnrollRequest(TestCase):
institute='IIT',
department='Aeronautical',
position='Moderator',
- timezone='UTC'
+ timezone='UTC',
+ is_moderator=True
)
# Create Student
@@ -3118,7 +3140,8 @@ class TestSelfEnroll(TestCase):
institute='IIT',
department='Chemical',
position='Moderator',
- timezone='UTC'
+ timezone='UTC',
+ is_moderator=True
)
self.user2_plaintext_pass = 'demo2'
@@ -3136,7 +3159,8 @@ class TestSelfEnroll(TestCase):
institute='IIT',
department='Aeronautical',
position='Moderator',
- timezone='UTC'
+ timezone='UTC',
+ is_moderator=True
)
# Create Student
@@ -3228,7 +3252,8 @@ class TestGrader(TestCase):
institute='IIT',
department='Chemical',
position='Moderator',
- timezone='UTC'
+ timezone='UTC',
+ is_moderator=True
)
self.user2_plaintext_pass = 'demo2'
@@ -3246,7 +3271,8 @@ class TestGrader(TestCase):
institute='IIT',
department='Aeronautical',
position='Moderator',
- timezone='UTC'
+ timezone='UTC',
+ is_moderator=True
)
# Create Student
@@ -3553,7 +3579,8 @@ class TestModeratorDashboard(TestCase):
institute='IIT',
department='Chemical',
position='Moderator',
- timezone='UTC'
+ timezone='UTC',
+ is_moderator=True
)
self.mod_no_profile_plaintext_pass = 'demo2'
@@ -3801,7 +3828,7 @@ class TestUserLogin(TestCase):
self.assertTemplateUsed(response, "yaksh/activation_status.html")
-class TestDownloadcsv(TestCase):
+class TestDownloadCsv(TestCase):
def setUp(self):
self.client = Client()
tzone = pytz.timezone("utc")
@@ -3841,7 +3868,8 @@ class TestDownloadcsv(TestCase):
institute='IIT',
department='Chemical',
position='Moderator',
- timezone='UTC'
+ timezone='UTC',
+ is_moderator=True
)
self.mod_group.user_set.add(self.user)
self.course = Course.objects.create(
@@ -4036,7 +4064,8 @@ class TestShowQuestions(TestCase):
institute='IIT',
department='Chemical',
position='Moderator',
- timezone='UTC'
+ timezone='UTC',
+ is_moderator=True
)
self.mod_group.user_set.add(self.user)
self.question = Question.objects.create(
@@ -4352,7 +4381,8 @@ class TestShowStatistics(TestCase):
institute='IIT',
department='Chemical',
position='Moderator',
- timezone='UTC'
+ timezone='UTC',
+ is_moderator=True
)
# Create Student
@@ -4514,7 +4544,8 @@ class TestQuestionPaper(TestCase):
institute='IIT',
department='Chemical',
position='Moderator',
- timezone='UTC'
+ timezone='UTC',
+ is_moderator=True
)
self.student_plaintext_pass = 'demo'
@@ -4568,7 +4599,8 @@ class TestQuestionPaper(TestCase):
institute='IIT',
department='Chemical',
position='Moderator',
- timezone='UTC'
+ timezone='UTC',
+ is_moderator=True
)
# Add to moderator group
@@ -5262,7 +5294,8 @@ class TestLearningModule(TestCase):
institute='IIT',
department='Chemical',
position='Moderator',
- timezone='UTC'
+ timezone='UTC',
+ is_moderator=True
)
# Create a student
@@ -5282,7 +5315,17 @@ class TestLearningModule(TestCase):
password=self.teacher_plaintext_pass,
first_name='first_name',
last_name='last_name',
- email='demo@student.com'
+ email='demo@teacher.com',
+ )
+
+ Profile.objects.create(
+ user=self.teacher,
+ roll_number=10,
+ institute='IIT',
+ department='Chemical',
+ position='Moderator',
+ timezone='UTC',
+ is_moderator=True
)
# Add to moderator group
@@ -5643,7 +5686,8 @@ class TestLessons(TestCase):
institute='IIT',
department='Chemical',
position='Moderator',
- timezone='UTC'
+ timezone='UTC',
+ is_moderator=True
)
# Create a student
@@ -5656,6 +5700,15 @@ class TestLessons(TestCase):
email='demo@student.com'
)
+ Profile.objects.create(
+ user=self.student,
+ roll_number=10,
+ institute='IIT',
+ department='Chemical',
+ position='student',
+ timezone='UTC'
+ )
+
# Create a teacher to add to the course
self.teacher_plaintext_pass = 'demo_teacher'
self.teacher = User.objects.create_user(
@@ -5666,6 +5719,16 @@ class TestLessons(TestCase):
email='demo@student.com'
)
+ Profile.objects.create(
+ user=self.teacher,
+ roll_number=10,
+ institute='IIT',
+ department='Chemical',
+ position='Moderator',
+ timezone='UTC',
+ is_moderator=True
+ )
+
# Add to moderator group
self.mod_group.user_set.add(self.user)
self.mod_group.user_set.add(self.teacher)
diff --git a/yaksh/urls.py b/yaksh/urls.py
index 6e6b8c1..8f3401b 100644
--- a/yaksh/urls.py
+++ b/yaksh/urls.py
@@ -8,6 +8,7 @@ urlpatterns = [
url(r'^update_email/$', views.update_email, name="update_email"),
url(r'^activate/(?P<key>.+)$', views.activate_user, name="activate"),
url(r'^new_activation/$', views.new_activation, name='new_activation'),
+ url(r'^toggle_moderator/$', views.toggle_moderator_role, name='toggle_moderator'),
url(r'^quizzes/$', views.quizlist_user, name='quizlist_user'),
url(r'^quizzes/(?P<enrolled>\w+)/$', views.quizlist_user,
name='quizlist_user'),
diff --git a/yaksh/views.py b/yaksh/views.py
index c6b1184..7cfb03f 100644
--- a/yaksh/views.py
+++ b/yaksh/views.py
@@ -63,18 +63,27 @@ def my_render_to_response(request, template, context=None, **kwargs):
return render(request, template, context, **kwargs)
-def is_moderator(user):
+def is_moderator(user, group_name='moderator'):
"""Check if the user is having moderator rights"""
- if user.groups.filter(name='moderator').exists():
- return True
+ try:
+ group = Group.objects.get(name='moderator')
+ return user.profile.is_moderator and user in group.user_set.all()
+ except Profile.DoesNotExist:
+ return False
+ except Group.DoesNotExist:
+ return False
-def add_to_group(users):
+def add_as_moderator(users, group_name='moderator'):
""" add users to moderator group """
- group = Group.objects.get(name="moderator")
+ try:
+ group = Group.objects.get(name=group_name)
+ except Group.DoesNotExist:
+ raise Http404('The Group {0} does not exist.'.format(group_name))
for user in users:
if not is_moderator(user):
- user.groups.add(group)
+ user.profile.is_moderator = True
+ user.profile.save()
CSV_FIELDS = ['name', 'username', 'roll_number', 'institute', 'department',
@@ -1757,6 +1766,29 @@ def search_teacher(request, course_id):
@login_required
@email_verified
+def toggle_moderator_role(request):
+ """ Allow moderator to switch to student and back """
+
+ user = request.user
+
+ try:
+ group = Group.objects.get(name='moderator')
+ except Group.DoesNotExist:
+ raise Http404('The Moderator group does not exist')
+
+ if not user.profile.is_moderator:
+ raise Http404('You are not allowed to view this page!')
+
+ if user not in group.user_set.all():
+ group.user_set.add(user)
+ else:
+ group.user_set.remove(user)
+
+ return my_redirect('/exam/')
+
+
+@login_required
+@email_verified
def add_teacher(request, course_id):
""" add teachers to the course """
@@ -1775,7 +1807,7 @@ def add_teacher(request, course_id):
if request.method == 'POST':
teacher_ids = request.POST.getlist('check')
teachers = User.objects.filter(id__in=teacher_ids)
- add_to_group(teachers)
+ add_as_moderator(teachers)
course.add_teachers(*teachers)
context['status'] = True
context['teachers_added'] = teachers