Commit 860467e7 by Awais Committed by aamir-khan

ECOM-1441 additional methods for skip re-verification links.

parent b5f58ccf
...@@ -1077,3 +1077,28 @@ class SkippedReverification(models.Model): ...@@ -1077,3 +1077,28 @@ class SkippedReverification(models.Model):
class Meta: # pylint: disable=missing-docstring, old-style-class class Meta: # pylint: disable=missing-docstring, old-style-class
unique_together = (('user', 'course_id'),) unique_together = (('user', 'course_id'),)
@classmethod
def add_skipped_reverification_attempt(cls, checkpoint, user_id, course_id):
""" Create skipped reverification object
Arguments:
checkpoint(VerificationCheckpoint): VerificationCheckpoint object
user_id(str): User Id of currently logged in user
course_id(CourseKey): CourseKey
Returns:
None
"""
cls.objects.create(checkpoint=checkpoint, user_id=user_id, course_id=course_id)
@classmethod
def check_user_skipped_reverification_exists(cls, user, course_id):
"""Check user skipped re-verification attempt exists against specific course
Arguments:
user(User): user object
course_id(CourseKey): CourseKey
Returns:
Boolean
"""
return cls.objects.filter(user=user, course_id=course_id).exists()
...@@ -2,10 +2,14 @@ ...@@ -2,10 +2,14 @@
Implement the Reverification XBlock "reverification" server Implement the Reverification XBlock "reverification" server
""" """
import logging
from opaque_keys.edx.keys import CourseKey from opaque_keys.edx.keys import CourseKey
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from verify_student.models import VerificationCheckpoint, VerificationStatus from verify_student.models import VerificationCheckpoint, VerificationStatus, SkippedReverification
from django.db import IntegrityError
log = logging.getLogger(__name__)
class ReverificationService(object): class ReverificationService(object):
...@@ -14,7 +18,7 @@ class ReverificationService(object): ...@@ -14,7 +18,7 @@ class ReverificationService(object):
""" """
def get_status(self, user_id, course_id, related_assessment): def get_status(self, user_id, course_id, related_assessment):
""" Check if the user has any verification attempt for this checkpoint and course_id """ Check if the user has any verification attempt or has skipped the verification
Args: Args:
user_id(str): User Id string user_id(str): User Id string
...@@ -22,9 +26,13 @@ class ReverificationService(object): ...@@ -22,9 +26,13 @@ class ReverificationService(object):
related_assessment(str): Verification checkpoint name related_assessment(str): Verification checkpoint name
Returns: Returns:
Verification Status string if any attempt submitted by user else None "skipped" if has skip the re-verification or Verification Status string if
any attempt submitted by user else None
""" """
course_key = CourseKey.from_string(course_id) course_key = CourseKey.from_string(course_id)
has_skipped = SkippedReverification.check_user_skipped_reverification_exists(user_id, course_key)
if has_skipped:
return "skipped"
try: try:
checkpoint_status = VerificationStatus.objects.filter( checkpoint_status = VerificationStatus.objects.filter(
user_id=user_id, user_id=user_id,
...@@ -56,3 +64,23 @@ class ReverificationService(object): ...@@ -56,3 +64,23 @@ class ReverificationService(object):
) )
) )
return re_verification_link return re_verification_link
def skip_verification(self, checkpoint_name, user_id, course_id):
"""Create the add verification attempt
Args:
course_id(str): A string of course_id
user_id(str): User Id string
checkpoint_name(str): Verification checkpoint name
Returns:
None
"""
course_key = CourseKey.from_string(course_id)
checkpoint = VerificationCheckpoint.objects.get(course_id=course_key, checkpoint_name=checkpoint_name)
# if user do not already skipped the attempt for this course only then he can skip
try:
SkippedReverification.add_skipped_reverification_attempt(checkpoint, user_id, course_key)
except IntegrityError:
log.exception("Skipped attempt already exists for user %s: with course %s:", user_id, unicode(course_id))
...@@ -18,7 +18,8 @@ from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase ...@@ -18,7 +18,8 @@ from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
from xmodule.modulestore.tests.factories import CourseFactory from xmodule.modulestore.tests.factories import CourseFactory
from verify_student.models import ( from verify_student.models import (
SoftwareSecurePhotoVerification, VerificationException, VerificationCheckpoint, VerificationStatus SoftwareSecurePhotoVerification, VerificationException, VerificationCheckpoint, VerificationStatus,
SkippedReverification
) )
FAKE_SETTINGS = { FAKE_SETTINGS = {
...@@ -709,3 +710,71 @@ class VerificationStatusTest(ModuleStoreTestCase): ...@@ -709,3 +710,71 @@ class VerificationStatusTest(ModuleStoreTestCase):
self.assertEqual(len(result), len([self.check_point1.checkpoint_name, self.check_point2.checkpoint_name])) self.assertEqual(len(result), len([self.check_point1.checkpoint_name, self.check_point2.checkpoint_name]))
self.assertEqual(result[0].checkpoint.checkpoint_name, self.check_point1.checkpoint_name) self.assertEqual(result[0].checkpoint.checkpoint_name, self.check_point1.checkpoint_name)
self.assertEqual(result[1].checkpoint.checkpoint_name, self.check_point2.checkpoint_name) self.assertEqual(result[1].checkpoint.checkpoint_name, self.check_point2.checkpoint_name)
class SkippedReverificationTest(ModuleStoreTestCase):
"""Tests for the SkippedReverification model. """
def setUp(self):
super(SkippedReverificationTest, self).setUp()
self.user = UserFactory.create()
self.course = CourseFactory.create()
self.checkpoint = VerificationCheckpoint.objects.create(course_id=self.course.id, checkpoint_name="midterm")
def test_add_skipped_attempts(self):
"""adding skipped re-verification object using class method."""
# adding verification status
SkippedReverification.add_skipped_reverification_attempt(
checkpoint=self.checkpoint, user_id=self.user.id, course_id=unicode(self.course.id)
)
# getting the status from db
result = SkippedReverification.objects.filter(course_id=self.course.id)[0]
self.assertEqual(result.checkpoint, self.checkpoint)
self.assertEqual(result.user, self.user)
self.assertEqual(result.course_id, self.course.id)
def test_unique_constraint(self):
"""adding skipped re-verification with same user and course id will
raise integrity exception
"""
# adding verification object
SkippedReverification.add_skipped_reverification_attempt(
checkpoint=self.checkpoint, user_id=self.user.id, course_id=unicode(self.course.id)
)
with self.assertRaises(IntegrityError):
SkippedReverification.add_skipped_reverification_attempt(
checkpoint=self.checkpoint, user_id=self.user.id, course_id=unicode(self.course.id)
)
# Create skipped attempt for different user
user2 = UserFactory.create()
SkippedReverification.add_skipped_reverification_attempt(
checkpoint=self.checkpoint, user_id=user2.id, course_id=unicode(self.course.id)
)
# getting the status from db
result = SkippedReverification.objects.filter(user=user2)[0]
self.assertEqual(result.checkpoint, self.checkpoint)
self.assertEqual(result.user, user2)
self.assertEqual(result.course_id, self.course.id)
def test_check_user_skipped_reverification_exists(self):
"""Checking check_user_skipped_reverification_exists method returns boolean status"""
# adding verification status
SkippedReverification.add_skipped_reverification_attempt(
checkpoint=self.checkpoint, user_id=self.user.id, course_id=unicode(self.course.id)
)
self.assertTrue(
SkippedReverification.check_user_skipped_reverification_exists(course_id=self.course.id, user=self.user)
)
user2 = UserFactory.create()
self.assertFalse(
SkippedReverification.check_user_skipped_reverification_exists(course_id=self.course.id, user=user2)
)
...@@ -8,7 +8,7 @@ from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory ...@@ -8,7 +8,7 @@ from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory
from student.tests.factories import UserFactory from student.tests.factories import UserFactory
from course_modes.tests.factories import CourseModeFactory from course_modes.tests.factories import CourseModeFactory
from verify_student.services import ReverificationService from verify_student.services import ReverificationService
from verify_student.models import VerificationCheckpoint, VerificationStatus from verify_student.models import VerificationCheckpoint, VerificationStatus, SkippedReverification
@ddt.ddt @ddt.ddt
...@@ -62,3 +62,21 @@ class TestReverifyService(ModuleStoreTestCase): ...@@ -62,3 +62,21 @@ class TestReverifyService(ModuleStoreTestCase):
VerificationStatus.objects.create(checkpoint=checkpoint_obj, user=self.user, status='submitted') VerificationStatus.objects.create(checkpoint=checkpoint_obj, user=self.user, status='submitted')
self.assertEqual(rev.get_status(self.user.id, unicode(self.course_key), checkpoint_name), 'submitted') self.assertEqual(rev.get_status(self.user.id, unicode(self.course_key), checkpoint_name), 'submitted')
def test_skip_verification(self):
""" Adding the test skip verification attempt for the user """
checkpoint_name = 'final_term'
rev = ReverificationService()
VerificationCheckpoint.objects.create(
course_id=unicode(self.course_key), checkpoint_name=checkpoint_name
)
rev.skip_verification(checkpoint_name, self.user.id, unicode(self.course_key))
self.assertEqual(1, SkippedReverification.objects.filter(user=self.user, course_id=self.course_key).count())
rev.skip_verification(checkpoint_name, self.user.id, unicode(self.course_key))
self.assertEqual(1, SkippedReverification.objects.filter(user=self.user, course_id=self.course_key).count())
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment