Commit 3732d418 by cahrens

Add helper methods to hide internals of how users are enrolled in courses.

Remove _

Minor cleanup.
parent a227b14f
......@@ -49,7 +49,7 @@ import datetime
from pytz import UTC
from uuid import uuid4
from pymongo import MongoClient
from .utils import get_enrollment_count
from student.views import is_enrolled_in_course
TEST_DATA_CONTENTSTORE = copy.deepcopy(settings.CONTENTSTORE)
TEST_DATA_CONTENTSTORE['OPTIONS']['db'] = 'test_xcontent_%s' % uuid4().hex
......@@ -1042,7 +1042,7 @@ class ContentStoreTest(ModuleStoreTestCase):
self.assertNotIn('ErrMsg', data)
self.assertEqual(data['id'], 'i4x://MITx/{0}/course/2013_Spring'.format(test_course_data['number']))
# Verify that the creator is now registered in the course.
self.assertEqual(1, get_enrollment_count(self.user, self._get_course_id(test_course_data)))
self.assertTrue(is_enrolled_in_course(self.user, self._get_course_id(test_course_data)))
return test_course_data
def test_create_course_check_forum_seeding(self):
......@@ -1064,12 +1064,14 @@ class ContentStoreTest(ModuleStoreTestCase):
Checks that the course did not get created
"""
course_id = self._get_course_id(self.course_data)
initially_enrolled_count = get_enrollment_count(self.user, course_id)
initially_enrolled = is_enrolled_in_course(self.user, course_id)
resp = self.client.post(reverse('create_new_course'), self.course_data)
self.assertEqual(resp.status_code, 200)
data = parse_json(resp)
self.assertEqual(data['ErrMsg'], error_message)
self.assertEqual(initially_enrolled_count, get_enrollment_count(self.user, course_id))
# One test case involves trying to create the same course twice. Hence for that course,
# the user will be enrolled. In the other cases, initially_enrolled will be False.
self.assertEqual(initially_enrolled, is_enrolled_in_course(self.user, course_id))
def test_create_course_duplicate_number(self):
"""Test new course creation - error path"""
......
......@@ -2,10 +2,11 @@
Tests for contentstore/views/user.py.
"""
import json
from .utils import CourseTestCase, get_enrollment_count
from .utils import CourseTestCase
from django.contrib.auth.models import User, Group
from django.core.urlresolvers import reverse
from auth.authz import get_course_groupname_for_role
from student.views import is_enrolled_in_course
class UsersTestCase(CourseTestCase):
......@@ -332,7 +333,7 @@ class UsersTestCase(CourseTestCase):
# Verify that ext_user is not enrolled in the new course before being added as a staff member.
self.assert_not_enrolled()
def test_remove_staff_does_not_enroll(self):
def test_remove_staff_does_not_unenroll(self):
# Add user with staff permissions.
self.client.post(
self.detail_url,
......@@ -370,14 +371,14 @@ class UsersTestCase(CourseTestCase):
def assert_not_enrolled(self):
""" Asserts that self.ext_user is not enrolled in self.course. """
self.assertEqual(
0, get_enrollment_count(self.ext_user, self.course.location.course_id),
self.assertFalse(
is_enrolled_in_course(self.ext_user, self.course.location.course_id),
'Did not expect ext_user to be enrolled in course'
)
def assert_enrolled(self):
""" Asserts that self.ext_user is enrolled in self.course. """
self.assertEqual(
1, get_enrollment_count(self.ext_user, self.course.location.course_id),
self.assertTrue(
is_enrolled_in_course(self.ext_user, self.course.location.course_id),
'User ext_user should have been enrolled in the course'
)
......@@ -5,7 +5,6 @@ Utilities for contentstore tests
import json
from student.models import Registration
from student.models import CourseEnrollment
from django.contrib.auth.models import User
from django.test.client import Client
......@@ -28,15 +27,6 @@ def registration(email):
return Registration.objects.get(user__email=email)
def get_enrollment_count(user, course_id):
"""
Gets the number of enrolled registrants for given course and user=self.user.
This should always be 0 or 1.
"""
return CourseEnrollment.objects.filter(user=user, course_id=course_id).count()
class CourseTestCase(ModuleStoreTestCase):
def setUp(self):
"""
......
......@@ -44,7 +44,7 @@ from .component import (
from django_comment_common.utils import seed_permissions_roles
from student.models import CourseEnrollment
from student.views import enroll_in_course
from xmodule.html_module import AboutDescriptor
__all__ = ['course_index', 'create_new_course', 'course_info',
......@@ -165,7 +165,7 @@ def create_new_course(request):
seed_permissions_roles(new_course.location.course_id)
# auto-enroll the course creator in the course so that "View Live" will work.
CourseEnrollment.objects.get_or_create(user=request.user, course_id=new_course.location.course_id)
enroll_in_course(request.user, new_course.location.course_id)
return JsonResponse({'id': new_course.location.url()})
......
......@@ -23,7 +23,7 @@ from course_creators.views import (
from .access import has_access
from student.models import CourseEnrollment
from student.views import enroll_in_course
@login_required
......@@ -204,7 +204,7 @@ def course_team_user(request, org, course, name, email):
user.groups.add(groups["instructor"])
user.save()
# auto-enroll the course creator in the course so that "View Live" will work.
CourseEnrollment.objects.get_or_create(user=user, course_id=location.course_id)
enroll_in_course(user, location.course_id)
elif role == "staff":
# if we're trying to downgrade a user from "instructor" to "staff",
# make sure we have at least one other instructor in the course team.
......@@ -219,7 +219,7 @@ def course_team_user(request, org, course, name, email):
user.groups.add(groups["staff"])
user.save()
# auto-enroll the course creator in the course so that "View Live" will work.
CourseEnrollment.objects.get_or_create(user=user, course_id=location.course_id)
enroll_in_course(user, location.course_id)
return JsonResponse()
......
......@@ -23,6 +23,7 @@ from textwrap import dedent
from student.models import unique_id_for_user
from student.views import process_survey_link, _cert_info, password_reset, password_reset_confirm_wrapper
from student.views import enroll_in_course, is_enrolled_in_course
from student.tests.factories import UserFactory
from student.tests.test_email import mock_render_to_string
COURSE_1 = 'edX/toy/2012_Fall'
......@@ -205,3 +206,15 @@ class CourseEndingTest(TestCase):
'show_survey_button': False,
'grade': '67'
})
class EnrollInCourseTest(TestCase):
""" Tests the helper method for enrolling a user in a class """
def test_enroll_in_course(self):
user = User.objects.create_user("joe", "joe@joe.com", "password")
user.save()
course_id = "course_id"
self.assertFalse(is_enrolled_in_course(user, course_id))
enroll_in_course(user, course_id)
self.assertTrue(is_enrolled_in_course(user, course_id))
......@@ -378,7 +378,7 @@ def change_enrollment(request):
"run:{0}".format(run)])
try:
enrollment, _created = CourseEnrollment.objects.get_or_create(user=user, course_id=course.id)
enroll_in_course(user, course.id)
except IntegrityError:
# If we've already created this enrollment in a separate transaction,
# then just continue
......@@ -403,6 +403,23 @@ def change_enrollment(request):
return HttpResponseBadRequest(_("Enrollment action is invalid"))
def enroll_in_course(user, course_id):
"""
Helper method to enroll a user in a particular class.
It is expected that this method is called from a method which has already
verified the user authentication and access.
"""
CourseEnrollment.objects.get_or_create(user=user, course_id=course_id)
def is_enrolled_in_course(user, course_id):
"""
Helper method that returns whether or not the user is enrolled in a particular course.
"""
return CourseEnrollment.objects.filter(user=user, course_id=course_id).count() > 0
@ensure_csrf_cookie
def accounts_login(request, error=""):
......
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