diff --git a/lms/djangoapps/courseware/rules.py b/lms/djangoapps/courseware/rules.py new file mode 100644 index 0000000000..ce019ca574 --- /dev/null +++ b/lms/djangoapps/courseware/rules.py @@ -0,0 +1,25 @@ +""" +django-rules for courseware related features +""" +from __future__ import absolute_import + +from opaque_keys.edx.keys import CourseKey +from student.models import CourseEnrollment + +import rules + + +@rules.predicate +def is_verified_or_masters_track_exam(user, exam): + """ + Returns whether the user is in a verified or master's track + """ + course_id = CourseKey.from_string(exam['course_id']) + mode, is_active = CourseEnrollment.enrollment_mode_for_user(user, course_id) + return is_active and mode in ('verified', 'masters') + + +# The edx_proctoring.api uses this permission to gate access to the +# proctored experience +can_take_proctored_exam = is_verified_or_masters_track_exam +rules.set_perm('edx_proctoring.can_take_proctored_exam', is_verified_or_masters_track_exam) diff --git a/lms/djangoapps/courseware/tests/test_rules.py b/lms/djangoapps/courseware/tests/test_rules.py new file mode 100644 index 0000000000..cd36ad0115 --- /dev/null +++ b/lms/djangoapps/courseware/tests/test_rules.py @@ -0,0 +1,48 @@ +""" +Tests for permissions defined in courseware.rules +""" +import ddt + +from django.test import TestCase + +from course_modes.tests.factories import CourseModeFactory + +from opaque_keys.edx.locator import CourseLocator +from student.models import CourseEnrollment +from student.tests.factories import UserFactory + + +@ddt.ddt +class PermissionTests(TestCase): + """ + Tests for permissions defined in courseware.rules + """ + def setUp(self): + super(PermissionTests, self).setUp() + self.user = UserFactory() + + self.course_id = CourseLocator('MITx', '000', 'Perm_course') + CourseModeFactory(mode_slug='verified', course_id=self.course_id) + CourseModeFactory(mode_slug='masters', course_id=self.course_id) + + def tearDown(self): + super(PermissionTests, self).tearDown() + self.user.delete() + + @ddt.data( + (None, False), + ('audit', False), + ('verified', True), + ('masters', True), + ) + @ddt.unpack + def test_proctoring_perm(self, mode, should_have_perm): + """ + Test that the user has the edx_proctoring.can_take_proctored_exam permission + """ + if mode is not None: + CourseEnrollment.enroll(self.user, self.course_id, mode=mode) + else: + CourseEnrollment.unenroll(self.user, self.course_id) + has_perm = self.user.has_perm('edx_proctoring.can_take_proctored_exam', {'course_id': unicode(self.course_id)}) + assert has_perm == should_have_perm