summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--yaksh/models.py10
-rw-r--r--yaksh/templates/yaksh/addteacher.html23
-rw-r--r--yaksh/templates/yaksh/courses.html38
-rw-r--r--yaksh/templates/yaksh/viewcourse.html51
-rw-r--r--yaksh/tests.py16
-rw-r--r--yaksh/urls.py3
-rw-r--r--yaksh/views.py55
7 files changed, 112 insertions, 84 deletions
diff --git a/yaksh/models.py b/yaksh/models.py
index 6db1298..bb85085 100644
--- a/yaksh/models.py
+++ b/yaksh/models.py
@@ -24,13 +24,11 @@ class Profile(models.Model):
position = models.CharField(max_length=64)
def is_moderator(self, user):
- return True if user.groups.filter(name='moderator').exists() else False
+ return user.groups.filter(name='moderator').exists()
def _add_to_group(self, user):
group = Group.objects.get(name="moderator")
user.groups.add(group)
- user.profile.position = "Faculty"
- user.profile.save()
languages = (
("python", "Python"),
@@ -139,6 +137,12 @@ class Course(models.Model):
rejected_teachers.append(teacher)
return added_teachers, rejected_teachers
+ def get_teachers(self):
+ return self.teachers.all()
+
+ def remove_teachers(self, *teachers):
+ self.teachers.remove(*teachers)
+
def __unicode__(self):
return self.name
diff --git a/yaksh/templates/yaksh/addteacher.html b/yaksh/templates/yaksh/addteacher.html
index b438262..790c06c 100644
--- a/yaksh/templates/yaksh/addteacher.html
+++ b/yaksh/templates/yaksh/addteacher.html
@@ -25,8 +25,10 @@
<center><h3>No results found</h3></center>
{% else %}
<center><b><u>Search Results</u></b></center><br>
+ <center><b>Search results does not include teachers already added</b></center><br>
<table>
<th></th>
+ <th>Username</th>
<th>First Name</th>
<th>Last Name</th>
<th>Email</th>
@@ -34,8 +36,10 @@
<th>Department</th>
<th>Position</th>
{% for teacher in teachers %}
+ {% if teacher not in course.get_teachers %}
<tr>
<td><input type="checkbox" name="check" value="{{ teacher.id }}"></td>
+ <td>{{ teacher.username }}</td>
<td>{{ teacher.first_name }}</td>
<td>{{ teacher.last_name }}</td>
<td>{{ teacher.email }}</td>
@@ -43,6 +47,7 @@
<td>{{ teacher.profile.department }}</td>
<td>{{ teacher.profile.position }}</td>
</tr>
+ {% endif %}
{% endfor %}
</table>
<button class="btn" type="submit">Add</button>
@@ -51,31 +56,35 @@
</form>
{% if status == True and teachers_added or teachers_rejected %}
<center>
-<h4>Note: Teacher(s) without profile are rejected</h4>
+<h4>Teacher(s) without profile are rejected</h4>
<div class="row">
<div class="span6 wrap">
<center><b><u>Teacher(s) Added</u></b></center><br>
+ {% if teachers_added %}
{% for teacher in teachers_added %}
<div class="well">
<div class="row">
- <div class="span3" style="padding-top:10px">
- <h5>{{ teacher.get_full_name }}</h5>
- </div>
+ <h5>{{ teacher.get_full_name }}</h5>
</div>
</div>
{% endfor %}
+ {% else %}
+ <center><b>No Teacher(s) Added</b></center>
+ {% endif %}
</div>
<div class="span6 wrap">
<center><b><u>Teacher(s) Rejected</u></b></center><br>
+ {% if teachers_rejected %}
{% for teacher in teachers_rejected %}
<div class="well">
<div class="row">
- <div class="span4" style="padding-top:10px">
- <h5>{{ teacher.get_full_name }}</h5>
- </div>
+ <h5>{{ teacher.get_full_name }}</h5>
</div>
</div>
{% endfor %}
+ {% else %}
+ <center><b>No Teacher(s) Rejected</b></center>
+ {% endif %}
</div>
</div>
</center>
diff --git a/yaksh/templates/yaksh/courses.html b/yaksh/templates/yaksh/courses.html
index 245c3cb..43a9535 100644
--- a/yaksh/templates/yaksh/courses.html
+++ b/yaksh/templates/yaksh/courses.html
@@ -11,10 +11,13 @@
{% block manage %}
<a href="{{URL_ROOT}}/exam/manage/viewcourse/">View Allotted Courses</a><br>
{% if not courses %}
- <center><h5> You have not created any courses </h5></center>
+ <center><h4> No new Courses added </h4></center>
{% else %}
-<center><h3> Course(s) created by you </h3></center>
+<center><h3> Course(s) Added</h3></center>
{% for course in courses %}
+ {% if user != course.creator %}
+ <h4> {{course.creator.get_full_name}} added you to this course</h4>
+ {% endif %}
<div class="row show-grid">
<div class="span14">
<div class="row">
@@ -28,11 +31,39 @@
{% endif %}
</p>
<a href="{{URL_ROOT}}/exam/manage/course_detail/{{course.id}}/">{{ course.name }}</a>
- </br>
+ </br></br>
+ {% if user == course.creator %}
+ <div class="row">
+ <div class="span6 wrap">
+ <center><b><u>Teacher(s) Added to {{ course }}</u></b></center>
+ {% if course.get_teachers %}
+ <div align="left">
+ <form action="{{URL_ROOT}}/exam/manage/remove_teachers/{{ course.id }}/" method="post">
+ {% csrf_token %}
+ {% for teacher in course.get_teachers %}
+ <div class="well">
+ <div class="row">
+ <div class="span3" style="width: auto;">
+ <input type="checkbox" name="remove" value="{{ teacher.id }}">&nbsp;{{ teacher.get_full_name }}
+ </div>
+ </div>
+ </div>
+ {% endfor %}
+ <button class="btn success" type="submit">Remove Selected</button>
+ </div>
+ {% else %}
+ <center><b>No Teacher(s) Added</b></center>
+ {% endif %}
+ </form>
+ </div>
+ </div>
+ {% endif %}
</div>
+ {% if user == course.creator %}
<div class="span6">
<p><b><a href="{{URL_ROOT}}/exam/manage/searchteacher/{{course.id}}/">Add Teacher</a></b></p>
</div>
+ {% endif %}
<div class="span6">
<p><b><u>Quiz(zes)</u></b></p>
{% if course.get_quizzes %}
@@ -48,7 +79,6 @@
</div>
<br><br>
{% endfor %}
-
<button class="btn primary" type="button" onClick='location.replace("{{URL_ROOT}}/exam/manage/add_course");'>Add New Course</button>
<button class="btn primary" type="button" onClick='location.replace("{{URL_ROOT}}/exam/manage/addquiz");'>Add New Quiz</button>
{% endif %}
diff --git a/yaksh/templates/yaksh/viewcourse.html b/yaksh/templates/yaksh/viewcourse.html
deleted file mode 100644
index a3ef3e6..0000000
--- a/yaksh/templates/yaksh/viewcourse.html
+++ /dev/null
@@ -1,51 +0,0 @@
-{% extends "manage.html" %}
-
-{% block title %} Courses {% endblock title %}
-
-{% block subtitle %} Courses {% endblock %}
-
-{% block css %}
-<link rel="stylesheet" media="all" type="text/css" href="{{ URL_ROOT }}/static/yaksh/css/course.css" />
-{% endblock %}
-
-{% block manage %}
-<center><h3> Course(s) Allotted </h3></center><br>
-{% if not courses %}
- <center><h3> You are not added to any course(s) </h3></center>
-{% else %}
-{% for course in courses %}
-<h4>{{ course.creator.get_full_name }} added you to this course</h4>
-<div class="row show-grid">
- <div class="span14">
- <div class="row">
- <div class="span6">
- <p>
- <b><u>Course</u></b>
- {% if course.active %}
- <span class="label success">Active</span>
- {% else %}
- <span class="label important">Closed</span>
- {% endif %}
- </p>
- <a href="{{URL_ROOT}}/exam/manage/course_detail/{{ course.id }}/">{{ course.name }}</a>
- </br>
- </div>
- <div class="span6">
- <p><b><u>Quiz(zes)</u></b></p>
- {% if course.get_quizzes %}
- {% for quiz in course.get_quizzes %}
- <a href="{{URL_ROOT}}/exam/manage/addquiz/{{ quiz.id }}/">{{ quiz.description }}</a><br>
- {% endfor %}
- {% else %}
- <p><b>No quiz </b>
- {% endif %}
- </div>
- </div>
- </div>
- </div>
- <br><br>
-{% endfor %}
-<button class="btn primary" type="button" onClick='location.replace("{{URL_ROOT}}/exam/manage/add_course");'>Add New Course</button>
-<button class="btn primary" type="button" onClick='location.replace("{{URL_ROOT}}/exam/manage/addquiz");'>Add New Quiz</button>
-{% endif %}
-{% endblock %}
diff --git a/yaksh/tests.py b/yaksh/tests.py
index d69882d..bd733c3 100644
--- a/yaksh/tests.py
+++ b/yaksh/tests.py
@@ -60,13 +60,13 @@ def tearDownModule():
###############################################################################
class ProfileTestCases(unittest.TestCase):
def setUp(self):
- self.user = User.objects.get(pk=1)
+ self.user1 = User.objects.get(pk=1)
self.profile = Profile.objects.get(pk=1)
- self.user1 = User.objects.get(pk=3)
+ self.user2 = User.objects.get(pk=3)
def test_user_profile(self):
""" Test user profile"""
- self.assertEqual(self.user.username, 'demo_user')
+ self.assertEqual(self.user1.username, 'demo_user')
self.assertEqual(self.profile.user.username, 'demo_user')
self.assertEqual(int(self.profile.roll_number), 1)
self.assertEqual(self.profile.institute, 'IIT')
@@ -74,9 +74,9 @@ class ProfileTestCases(unittest.TestCase):
self.assertEqual(self.profile.position, 'Student')
def test_is_moderator(self):
- result = self.user1.profile.is_moderator(self.user1)
+ result = self.user2.profile.is_moderator(self.user2)
self.assertTrue(result)
- result = self.user.profile.is_moderator(self.user)
+ result = self.user1.profile.is_moderator(self.user1)
self.assertFalse(result)
###############################################################################
@@ -454,3 +454,9 @@ class CourseTestCases(unittest.TestCase):
added_list, rejected_list = self.course.add_teachers(self.student1, self.student2)
self.assertSequenceEqual(added_list, [self.student2])
self.assertSequenceEqual(rejected_list, [self.student1])
+
+ def test_remove_teachers(self):
+ """ Test to remove teachers from a course"""
+ self.course.add_teachers(self.student1, self.student2)
+ self.course.remove_teachers(self.student1)
+ self.assertSequenceEqual(self.course.get_teachers(), [self.student2])
diff --git a/yaksh/urls.py b/yaksh/urls.py
index 7f42faf..1716818 100644
--- a/yaksh/urls.py
+++ b/yaksh/urls.py
@@ -87,5 +87,6 @@ urlpatterns += [
views.reject, {'was_enrolled': True}),
url(r'^manage/searchteacher/(?P<course_id>\d+)/$', views.search_teacher),
url(r'^manage/addteacher/(?P<course_id>\d+)/$', views.add_teacher),
- url(r'^manage/viewcourse/$', views.view_courses)
+ url(r'^manage/viewcourse/$', views.view_courses),
+ url(r'^manage/remove_teachers/(?P<course_id>\d+)/$', views.remove_teachers)
]
diff --git a/yaksh/views.py b/yaksh/views.py
index a56182b..dd8cc2b 100644
--- a/yaksh/views.py
+++ b/yaksh/views.py
@@ -596,10 +596,12 @@ def self_enroll(request, course_id):
@login_required
def courses(request):
user = request.user
+ ci = RequestContext(request)
if not is_moderator(user):
raise Http404('You are not allowed to view this page')
courses = Course.objects.filter(creator=user)
- return my_render_to_response('yaksh/courses.html', {'courses': courses})
+ return my_render_to_response('yaksh/courses.html', {'courses': courses},
+ context_instance=ci)
@login_required
@@ -608,8 +610,12 @@ def course_detail(request, course_id):
ci = RequestContext(request)
if not is_moderator(user):
raise Http404('You are not allowed to view this page')
- course = Course.objects.filter(Q(creator=user)|Q(teachers=user), pk=course_id).first()
- return my_render_to_response('yaksh/course_detail.html', {'course': course})
+ course = Course.objects.filter(Q(creator=user)|Q(teachers=user),
+ pk=course_id).first()
+ if user != course.creator and user not in course.teachers.all():
+ raise Http404('You are not allowed to view this page')
+ return my_render_to_response('yaksh/course_detail.html', {'course': course},
+ context_instance=ci)
@login_required
@@ -618,7 +624,8 @@ def enroll(request, course_id, user_id=None, was_rejected=False):
ci = RequestContext(request)
if not is_moderator(user):
raise Http404('You are not allowed to view this page')
- course = Course.objects.filter(Q(creator=user)|Q(teachers=user), pk=course_id).first()
+ course = Course.objects.filter(Q(creator=user)|Q(teachers=user),
+ pk=course_id).first()
if request.method == 'POST':
enroll_ids = request.POST.getlist('check')
else:
@@ -637,7 +644,8 @@ def reject(request, course_id, user_id=None, was_enrolled=False):
ci = RequestContext(request)
if not is_moderator(user):
raise Http404('You are not allowed to view this page')
- course = Course.objects.filter(Q(creator=user)|Q(teachers=user), pk=course_id).first()
+ course = Course.objects.filter(Q(creator=user)|Q(teachers=user),
+ pk=course_id).first()
if request.method == 'POST':
reject_ids = request.POST.getlist('check')
else:
@@ -655,7 +663,8 @@ def toggle_course_status(request, course_id):
user = request.user
if not is_moderator(user):
raise Http404('You are not allowed to view this page')
- course = Course.objects.filter(Q(creator=user)|Q(teachers=user), pk=course_id).first()
+ course = Course.objects.filter(Q(creator=user)|Q(teachers=user),
+ pk=course_id).first()
if course.active:
course.deactivate()
else:
@@ -982,9 +991,6 @@ def view_profile(request):
user = request.user
ci = RequestContext(request)
- if not is_moderator(user):
- raise Http404('You are not allowed to view this page!')
-
context = {}
if has_profile(user):
return my_render_to_response('yaksh/view_profile.html', {'user':user})
@@ -996,6 +1002,7 @@ def view_profile(request):
return my_render_to_response('yaksh/editprofile.html', context,
context_instance=ci)
+
@login_required
def edit_profile(request):
""" edit profile details facility for moderator and students """
@@ -1031,12 +1038,18 @@ def edit_profile(request):
context_instance=ci)
+@login_required
def search_teacher(request, course_id):
""" search teachers for the course """
+ user = request.user
+ ci = RequestContext(request)
+
+ if not is_moderator(user):
+ raise Http404('You are not allowed to view this page!')
+
+ context = {}
course = get_object_or_404(Course, creator=user, pk=course_id)
context['course'] = course
- if not user.is_authenticated() or not is_moderator(user):
- raise Http404('You are not allowed to view this page!')
if request.method == 'POST':
u_name = request.POST.get('uname')
@@ -1074,15 +1087,16 @@ def add_teacher(request, course_id):
teacher_ids = request.POST.getlist('check')
teachers = User.objects.filter(id__in=teacher_ids)
teachers_added, teachers_rejected = course.add_teachers(*teachers)
+ context['status'] = True
context['teachers_added'] = teachers_added
context['teachers_rejected'] = teachers_rejected
- context['status'] = True
return my_render_to_response('yaksh/addteacher.html', context,
context_instance=ci)
else:
return my_render_to_response('yaksh/addteacher.html', context,
context_instance=ci)
+
@login_required
def view_courses(request):
""" show courses allotted to a user """
@@ -1093,6 +1107,21 @@ def view_courses(request):
raise Http404('You are not allowed to view this page!')
courses = Course.objects.filter(teachers=user)
- return my_render_to_response('yaksh/viewcourse.html', {'courses': courses},
+ return my_render_to_response('yaksh/courses.html', {'courses': courses},
context_instance=ci)
+
+@login_required
+def remove_teachers(request, course_id):
+ """ show courses allotted to a user """
+
+ user = request.user
+ if not is_moderator(user):
+ raise Http404('You are not allowed to view this page!')
+
+ course = get_object_or_404(Course, creator=user, pk=course_id)
+ if request.method == "POST":
+ teacher_ids = request.POST.getlist('remove')
+ teachers = User.objects.filter(id__in=teacher_ids)
+ course.remove_teachers(*teachers)
+ return my_redirect('/exam/manage/courses')