diff --git a/cms/djangoapps/contentstore/tests/test_libraries.py b/cms/djangoapps/contentstore/tests/test_libraries.py index f6b8905dcc..f9e8c1a13b 100644 --- a/cms/djangoapps/contentstore/tests/test_libraries.py +++ b/cms/djangoapps/contentstore/tests/test_libraries.py @@ -80,7 +80,9 @@ class LibraryTestCase(ModuleStoreTestCase): of a LibraryContent block """ if 'user' not in lib_content_block.runtime._services: # pylint: disable=protected-access - lib_content_block.runtime._services['user'] = Mock(user_id=self.user.id) # pylint: disable=protected-access + mocked_user_service = Mock(user_id=self.user.id).get_current_user.return_value = {} + lib_content_block.runtime._services['user'] = mocked_user_service # pylint: disable=protected-access + handler_url = reverse_usage_url( 'component_handler', lib_content_block.location, diff --git a/common/djangoapps/xblock_django/tests/test_user_service.py b/common/djangoapps/xblock_django/tests/test_user_service.py index 536a2af1eb..e3bf764a53 100644 --- a/common/djangoapps/xblock_django/tests/test_user_service.py +++ b/common/djangoapps/xblock_django/tests/test_user_service.py @@ -7,8 +7,11 @@ from xblock_django.user_service import ( ATTR_KEY_IS_AUTHENTICATED, ATTR_KEY_USER_ID, ATTR_KEY_USERNAME, + ATTR_KEY_USER_IS_STAFF, ) +from student.models import anonymous_id_for_user from student.tests.factories import UserFactory, AnonymousUserFactory +from opaque_keys.edx.keys import CourseKey class UserServiceTestCase(TestCase): @@ -37,6 +40,7 @@ class UserServiceTestCase(TestCase): self.assertEqual(xb_user.full_name, dj_user.profile.name) self.assertEqual(xb_user.opt_attrs[ATTR_KEY_USERNAME], dj_user.username) self.assertEqual(xb_user.opt_attrs[ATTR_KEY_USER_ID], dj_user.id) + self.assertFalse(xb_user.opt_attrs[ATTR_KEY_USER_IS_STAFF]) def test_convert_anon_user(self): """ @@ -55,3 +59,40 @@ class UserServiceTestCase(TestCase): xb_user = django_user_service.get_current_user() self.assertTrue(xb_user.is_current_user) self.assert_xblock_user_matches_django(xb_user, self.user) + + def test_get_anonymous_user_id_returns_none_for_non_staff_users(self): + """ + Tests for anonymous_user_id method to return None if user is Non-Staff. + """ + django_user_service = DjangoXBlockUserService(self.user, user_is_staff=False) + + anonymous_user_id = django_user_service.get_anonymous_user_id(username=self.user.username, course_id='edx/toy/2012_Fall') + self.assertIsNone(anonymous_user_id) + + def test_get_anonymous_user_id_returns_none_for_non_existing_users(self): + """ + Tests for anonymous_user_id method to return None username does not exist in system. + """ + django_user_service = DjangoXBlockUserService(self.user, user_is_staff=True) + + anonymous_user_id = django_user_service.get_anonymous_user_id(username="No User", course_id='edx/toy/2012_Fall') + self.assertIsNone(anonymous_user_id) + + def test_get_anonymous_user_id_returns_id_for_existing_users(self): + """ + Tests for anonymous_user_id method returns anonymous user id for a user. + """ + course_key = CourseKey.from_string('edX/toy/2012_Fall') + anon_user_id = anonymous_id_for_user( + user=self.user, + course_id=course_key, + save=True + ) + + django_user_service = DjangoXBlockUserService(self.user, user_is_staff=True) + anonymous_user_id = django_user_service.get_anonymous_user_id( + username=self.user.username, + course_id='edX/toy/2012_Fall' + ) + + self.assertEqual(anonymous_user_id, anon_user_id) diff --git a/common/djangoapps/xblock_django/user_service.py b/common/djangoapps/xblock_django/user_service.py index 6867db9f38..c09e518578 100644 --- a/common/djangoapps/xblock_django/user_service.py +++ b/common/djangoapps/xblock_django/user_service.py @@ -1,11 +1,15 @@ """ Support for converting a django user to an XBlock user """ +from django.contrib.auth.models import User +from opaque_keys.edx.keys import CourseKey from xblock.reference.user_service import XBlockUser, UserService +from student.models import anonymous_id_for_user, get_user_by_username_or_email ATTR_KEY_IS_AUTHENTICATED = 'edx-platform.is_authenticated' ATTR_KEY_USER_ID = 'edx-platform.user_id' ATTR_KEY_USERNAME = 'edx-platform.username' +ATTR_KEY_USER_IS_STAFF = 'edx-platform.user_is_staff' class DjangoXBlockUserService(UserService): @@ -15,6 +19,8 @@ class DjangoXBlockUserService(UserService): def __init__(self, django_user, **kwargs): super(DjangoXBlockUserService, self).__init__(**kwargs) self._django_user = django_user + if self._django_user: + self._django_user.user_is_staff = kwargs.get('user_is_staff', False) def get_current_user(self): """ @@ -22,6 +28,29 @@ class DjangoXBlockUserService(UserService): """ return self._convert_django_user_to_xblock_user(self._django_user) + def get_anonymous_user_id(self, username, course_id): + """ + Get the anonymous user id for a user. + + Args: + username(str): username of a user. + course_id(str): course id of particular course. + + Returns: + A unique anonymous_user_id for (user, course) pair. + None for Non-staff users. + """ + if not self.get_current_user().opt_attrs.get(ATTR_KEY_USER_IS_STAFF): + return None + + try: + user = get_user_by_username_or_email(username_or_email=username) + except User.DoesNotExist: + return None + + course_id = CourseKey.from_string(course_id) + return anonymous_id_for_user(user=user, course_id=course_id, save=False) + def _convert_django_user_to_xblock_user(self, django_user): """ A function that returns an XBlockUser from the current Django request.user @@ -36,6 +65,7 @@ class DjangoXBlockUserService(UserService): xblock_user.opt_attrs[ATTR_KEY_IS_AUTHENTICATED] = True xblock_user.opt_attrs[ATTR_KEY_USER_ID] = django_user.id xblock_user.opt_attrs[ATTR_KEY_USERNAME] = django_user.username + xblock_user.opt_attrs[ATTR_KEY_USER_IS_STAFF] = django_user.user_is_staff else: xblock_user.opt_attrs[ATTR_KEY_IS_AUTHENTICATED] = False diff --git a/lms/djangoapps/courseware/module_render.py b/lms/djangoapps/courseware/module_render.py index 9ecf00a9ad..93cb59a49f 100644 --- a/lms/djangoapps/courseware/module_render.py +++ b/lms/djangoapps/courseware/module_render.py @@ -591,6 +591,8 @@ def get_module_system_for_user(user, field_data_cache, field_data = LmsFieldData(descriptor._field_data, student_data) # pylint: disable=protected-access + user_is_staff = has_access(user, u'staff', descriptor.location, course_id) + system = LmsModuleSystem( track_function=track_function, render_template=render_to_string, @@ -637,7 +639,7 @@ def get_module_system_for_user(user, field_data_cache, 'i18n': ModuleI18nService(), 'fs': xblock.reference.plugins.FSService(), 'field-data': field_data, - 'user': DjangoXBlockUserService(user), + 'user': DjangoXBlockUserService(user, user_is_staff=user_is_staff), }, get_user_role=lambda: get_user_role(user, course_id), descriptor_runtime=descriptor.runtime, @@ -661,7 +663,7 @@ def get_module_system_for_user(user, field_data_cache, make_psychometrics_data_update_handler(course_id, user, descriptor.location) ) - system.set(u'user_is_staff', has_access(user, u'staff', descriptor.location, course_id)) + system.set(u'user_is_staff', user_is_staff) system.set(u'user_is_admin', has_access(user, u'staff', 'global')) # make an ErrorDescriptor -- assuming that the descriptor's system is ok