Commit 939dbb6c by Sarina Canelake

Merge pull request #1579 from edx/sarina/enhance-user-factories

Sarina/enhance user factories
parents 68a42902 ea529b88
"""Provides factories for student models."""
from student.models import (User, UserProfile, Registration, from student.models import (User, UserProfile, Registration,
CourseEnrollmentAllowed, CourseEnrollment, CourseEnrollmentAllowed, CourseEnrollment,
PendingEmailChange, UserStanding, PendingEmailChange, UserStanding,
...@@ -10,7 +11,7 @@ from uuid import uuid4 ...@@ -10,7 +11,7 @@ from uuid import uuid4
from pytz import UTC from pytz import UTC
# Factories don't have __init__ methods, and are self documenting # Factories don't have __init__ methods, and are self documenting
# pylint: disable=W0232 # pylint: disable=W0232, C0111
class GroupFactory(DjangoModelFactory): class GroupFactory(DjangoModelFactory):
...@@ -18,6 +19,7 @@ class GroupFactory(DjangoModelFactory): ...@@ -18,6 +19,7 @@ class GroupFactory(DjangoModelFactory):
name = u'staff_MITx/999/Robot_Super_Course' name = u'staff_MITx/999/Robot_Super_Course'
class UserStandingFactory(DjangoModelFactory): class UserStandingFactory(DjangoModelFactory):
FACTORY_FOR = UserStanding FACTORY_FOR = UserStanding
...@@ -47,6 +49,7 @@ class CourseModeFactory(DjangoModelFactory): ...@@ -47,6 +49,7 @@ class CourseModeFactory(DjangoModelFactory):
suggested_prices = '' suggested_prices = ''
currency = 'usd' currency = 'usd'
class RegistrationFactory(DjangoModelFactory): class RegistrationFactory(DjangoModelFactory):
FACTORY_FOR = Registration FACTORY_FOR = Registration
...@@ -70,7 +73,7 @@ class UserFactory(DjangoModelFactory): ...@@ -70,7 +73,7 @@ class UserFactory(DjangoModelFactory):
date_joined = datetime(2011, 1, 1, tzinfo=UTC) date_joined = datetime(2011, 1, 1, tzinfo=UTC)
@post_generation @post_generation
def profile(obj, create, extracted, **kwargs): def profile(obj, create, extracted, **kwargs): # pylint: disable=unused-argument, no-self-argument
if create: if create:
obj.save() obj.save()
return UserProfileFactory.create(user=obj, **kwargs) return UserProfileFactory.create(user=obj, **kwargs)
......
...@@ -11,7 +11,9 @@ from django.core.management import call_command ...@@ -11,7 +11,9 @@ from django.core.management import call_command
from django.test.utils import override_settings from django.test.utils import override_settings
from courseware.tests.tests import TEST_DATA_MONGO_MODULESTORE from courseware.tests.tests import TEST_DATA_MONGO_MODULESTORE
from student.tests.factories import UserFactory, GroupFactory, CourseEnrollmentFactory from student.tests.factories import CourseEnrollmentFactory, UserFactory
from courseware.tests.factories import StaffFactory, InstructorFactory
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
from xmodule.modulestore.tests.factories import CourseFactory from xmodule.modulestore.tests.factories import CourseFactory
from bulk_email.models import Optout from bulk_email.models import Optout
...@@ -47,16 +49,11 @@ class TestEmailSendFromDashboard(ModuleStoreTestCase): ...@@ -47,16 +49,11 @@ class TestEmailSendFromDashboard(ModuleStoreTestCase):
@patch.dict(settings.MITX_FEATURES, {'ENABLE_INSTRUCTOR_EMAIL': True, 'REQUIRE_COURSE_EMAIL_AUTH': False}) @patch.dict(settings.MITX_FEATURES, {'ENABLE_INSTRUCTOR_EMAIL': True, 'REQUIRE_COURSE_EMAIL_AUTH': False})
def setUp(self): def setUp(self):
self.course = CourseFactory.create() self.course = CourseFactory.create()
self.instructor = UserFactory.create(username="instructor", email="robot+instructor@edx.org")
# Create instructor group for course self.instructor = InstructorFactory(self.course)
instructor_group = GroupFactory.create(name="instructor_MITx/999/Robot_Super_Course")
instructor_group.user_set.add(self.instructor)
# Create staff # Create staff
self.staff = [UserFactory() for _ in xrange(STAFF_COUNT)] self.staff = [StaffFactory(self.course) for _ in xrange(STAFF_COUNT)]
staff_group = GroupFactory()
for staff in self.staff:
staff_group.user_set.add(staff) # pylint: disable=E1101
# Create students # Create students
self.students = [UserFactory() for _ in xrange(STUDENT_COUNT)] self.students = [UserFactory() for _ in xrange(STUDENT_COUNT)]
......
...@@ -10,6 +10,7 @@ from student.tests.factories import CourseEnrollmentAllowedFactory as StudentCou ...@@ -10,6 +10,7 @@ from student.tests.factories import CourseEnrollmentAllowedFactory as StudentCou
from student.tests.factories import RegistrationFactory as StudentRegistrationFactory from student.tests.factories import RegistrationFactory as StudentRegistrationFactory
from courseware.models import StudentModule, XModuleUserStateSummaryField from courseware.models import StudentModule, XModuleUserStateSummaryField
from courseware.models import XModuleStudentInfoField, XModuleStudentPrefsField from courseware.models import XModuleStudentInfoField, XModuleStudentPrefsField
from instructor.access import allow_access
from xmodule.modulestore import Location from xmodule.modulestore import Location
from pytz import UTC from pytz import UTC
...@@ -33,6 +34,26 @@ class UserFactory(StudentUserFactory): ...@@ -33,6 +34,26 @@ class UserFactory(StudentUserFactory):
date_joined = datetime.now(UTC) date_joined = datetime.now(UTC)
def InstructorFactory(course): # pylint: disable=invalid-name
"""
Given a course object, returns a User object with instructor
permissions for `course`.
"""
user = StudentUserFactory.create(last_name="Instructor")
allow_access(course, user, "instructor")
return user
def StaffFactory(course): # pylint: disable=invalid-name
"""
Given a course object, returns a User object with staff
permissions for `course`.
"""
user = StudentUserFactory.create(last_name="Staff")
allow_access(course, user, "staff")
return user
class GroupFactory(StudentGroupFactory): class GroupFactory(StudentGroupFactory):
name = 'test_group' name = 'test_group'
......
...@@ -82,7 +82,7 @@ def _change_access(course, user, level, action): ...@@ -82,7 +82,7 @@ def _change_access(course, user, level, action):
raise ValueError("unrecognized action '{}'".format(action)) raise ValueError("unrecognized action '{}'".format(action))
def update_forum_role_membership(course_id, user, rolename, action): def update_forum_role(course_id, user, rolename, action):
""" """
Change forum access of user. Change forum access of user.
......
...@@ -17,7 +17,7 @@ from django_comment_common.models import (Role, ...@@ -17,7 +17,7 @@ from django_comment_common.models import (Role,
from instructor.access import (allow_access, from instructor.access import (allow_access,
revoke_access, revoke_access,
list_with_level, list_with_level,
update_forum_role_membership) update_forum_role)
@override_settings(MODULESTORE=TEST_DATA_MIXED_MODULESTORE) @override_settings(MODULESTORE=TEST_DATA_MIXED_MODULESTORE)
...@@ -148,44 +148,44 @@ class TestInstructorAccessForum(ModuleStoreTestCase): ...@@ -148,44 +148,44 @@ class TestInstructorAccessForum(ModuleStoreTestCase):
def test_allow(self): def test_allow(self):
user = UserFactory.create() user = UserFactory.create()
update_forum_role_membership(self.course.id, user, FORUM_ROLE_MODERATOR, 'allow') update_forum_role(self.course.id, user, FORUM_ROLE_MODERATOR, 'allow')
self.assertIn(user, self.mod_role.users.all()) self.assertIn(user, self.mod_role.users.all())
def test_allow_twice(self): def test_allow_twice(self):
user = UserFactory.create() user = UserFactory.create()
update_forum_role_membership(self.course.id, user, FORUM_ROLE_MODERATOR, 'allow') update_forum_role(self.course.id, user, FORUM_ROLE_MODERATOR, 'allow')
self.assertIn(user, self.mod_role.users.all()) self.assertIn(user, self.mod_role.users.all())
update_forum_role_membership(self.course.id, user, FORUM_ROLE_MODERATOR, 'allow') update_forum_role(self.course.id, user, FORUM_ROLE_MODERATOR, 'allow')
self.assertIn(user, self.mod_role.users.all()) self.assertIn(user, self.mod_role.users.all())
@raises(Role.DoesNotExist) @raises(Role.DoesNotExist)
def test_allow_badrole(self): def test_allow_badrole(self):
user = UserFactory.create() user = UserFactory.create()
update_forum_role_membership(self.course.id, user, 'robot-not-a-real-role', 'allow') update_forum_role(self.course.id, user, 'robot-not-a-real-role', 'allow')
def test_revoke(self): def test_revoke(self):
user = self.moderators[0] user = self.moderators[0]
update_forum_role_membership(self.course.id, user, FORUM_ROLE_MODERATOR, 'revoke') update_forum_role(self.course.id, user, FORUM_ROLE_MODERATOR, 'revoke')
self.assertNotIn(user, self.mod_role.users.all()) self.assertNotIn(user, self.mod_role.users.all())
def test_revoke_twice(self): def test_revoke_twice(self):
user = self.moderators[0] user = self.moderators[0]
update_forum_role_membership(self.course.id, user, FORUM_ROLE_MODERATOR, 'revoke') update_forum_role(self.course.id, user, FORUM_ROLE_MODERATOR, 'revoke')
self.assertNotIn(user, self.mod_role.users.all()) self.assertNotIn(user, self.mod_role.users.all())
update_forum_role_membership(self.course.id, user, FORUM_ROLE_MODERATOR, 'revoke') update_forum_role(self.course.id, user, FORUM_ROLE_MODERATOR, 'revoke')
self.assertNotIn(user, self.mod_role.users.all()) self.assertNotIn(user, self.mod_role.users.all())
def test_revoke_notallowed(self): def test_revoke_notallowed(self):
user = UserFactory() user = UserFactory()
update_forum_role_membership(self.course.id, user, FORUM_ROLE_MODERATOR, 'revoke') update_forum_role(self.course.id, user, FORUM_ROLE_MODERATOR, 'revoke')
self.assertNotIn(user, self.mod_role.users.all()) self.assertNotIn(user, self.mod_role.users.all())
@raises(Role.DoesNotExist) @raises(Role.DoesNotExist)
def test_revoke_badrole(self): def test_revoke_badrole(self):
user = self.moderators[0] user = self.moderators[0]
update_forum_role_membership(self.course.id, user, 'robot-not-a-real-role', 'allow') update_forum_role(self.course.id, user, 'robot-not-a-real-role', 'allow')
@raises(ValueError) @raises(ValueError)
def test_bad_mode(self): def test_bad_mode(self):
user = UserFactory() user = UserFactory()
update_forum_role_membership(self.course.id, user, FORUM_ROLE_MODERATOR, 'robot-not-a-mode') update_forum_role(self.course.id, user, FORUM_ROLE_MODERATOR, 'robot-not-a-mode')
...@@ -35,7 +35,7 @@ from instructor_task.views import get_task_completion_info ...@@ -35,7 +35,7 @@ from instructor_task.views import get_task_completion_info
import instructor.enrollment as enrollment import instructor.enrollment as enrollment
from instructor.enrollment import enroll_email, unenroll_email from instructor.enrollment import enroll_email, unenroll_email
from instructor.views.tools import strip_if_string, get_student_from_identifier from instructor.views.tools import strip_if_string, get_student_from_identifier
import instructor.access as access from instructor.access import list_with_level, allow_access, revoke_access, update_forum_role
import analytics.basic import analytics.basic
import analytics.distributions import analytics.distributions
import analytics.csvs import analytics.csvs
...@@ -294,9 +294,9 @@ def modify_access(request, course_id): ...@@ -294,9 +294,9 @@ def modify_access(request, course_id):
) )
if action == 'allow': if action == 'allow':
access.allow_access(course, user, rolename) allow_access(course, user, rolename)
elif action == 'revoke': elif action == 'revoke':
access.revoke_access(course, user, rolename) revoke_access(course, user, rolename)
else: else:
return HttpResponseBadRequest("unrecognized action '{}'".format(action)) return HttpResponseBadRequest("unrecognized action '{}'".format(action))
...@@ -352,7 +352,7 @@ def list_course_role_members(request, course_id): ...@@ -352,7 +352,7 @@ def list_course_role_members(request, course_id):
response_payload = { response_payload = {
'course_id': course_id, 'course_id': course_id,
rolename: map(extract_user_info, access.list_with_level( rolename: map(extract_user_info, list_with_level(
course, rolename course, rolename
)), )),
} }
...@@ -381,7 +381,7 @@ def get_grading_config(request, course_id): ...@@ -381,7 +381,7 @@ def get_grading_config(request, course_id):
@ensure_csrf_cookie @ensure_csrf_cookie
@cache_control(no_cache=True, no_store=True, must_revalidate=True) @cache_control(no_cache=True, no_store=True, must_revalidate=True)
@require_level('staff') @require_level('staff')
def get_students_features(request, course_id, csv=False): # pylint: disable=W0613 def get_students_features(request, course_id, csv=False): # pylint: disable=W0613, W0621
""" """
Respond with json which contains a summary of all enrolled students profile information. Respond with json which contains a summary of all enrolled students profile information.
...@@ -882,7 +882,7 @@ def update_forum_role_membership(request, course_id): ...@@ -882,7 +882,7 @@ def update_forum_role_membership(request, course_id):
return HttpResponseBadRequest("Cannot revoke instructor forum admin privelages.") return HttpResponseBadRequest("Cannot revoke instructor forum admin privelages.")
try: try:
access.update_forum_role_membership(course_id, user, rolename, action) update_forum_role(course_id, user, rolename, action)
except Role.DoesNotExist: except Role.DoesNotExist:
return HttpResponseBadRequest("Role does not exist.") return HttpResponseBadRequest("Role does not exist.")
......
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