From 4d729100605bcaac658db5ff6765f208dda9f23c Mon Sep 17 00:00:00 2001 From: muzaffaryousaf Date: Mon, 1 Dec 2014 19:31:34 +0500 Subject: [PATCH] Adding get_anonymous_user_id in Xblock 'user' service. TNL-836 --- .../xblock_django/tests/test_user_service.py | 38 +++++++++++++++++++ .../djangoapps/xblock_django/user_service.py | 28 ++++++++++++++ lms/djangoapps/courseware/module_render.py | 6 ++- .../courseware/tests/test_module_render.py | 20 ++++++++++ 4 files changed, 90 insertions(+), 2 deletions(-) diff --git a/common/djangoapps/xblock_django/tests/test_user_service.py b/common/djangoapps/xblock_django/tests/test_user_service.py index 536a2af1eb..2f910de3c4 100644 --- a/common/djangoapps/xblock_django/tests/test_user_service.py +++ b/common/djangoapps/xblock_django/tests/test_user_service.py @@ -8,7 +8,9 @@ from xblock_django.user_service import ( ATTR_KEY_USER_ID, ATTR_KEY_USERNAME, ) +from student.models import anonymous_id_for_user from student.tests.factories import UserFactory, AnonymousUserFactory +from opaque_keys.edx.locations import SlashSeparatedCourseKey class UserServiceTestCase(TestCase): @@ -55,3 +57,39 @@ 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. + """ + anon_user_id = anonymous_id_for_user( + user=self.user, + course_id=SlashSeparatedCourseKey('edX', 'toy', '2012_Fall'), + 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..7b9e290492 100644 --- a/common/djangoapps/xblock_django/user_service.py +++ b/common/djangoapps/xblock_django/user_service.py @@ -1,7 +1,11 @@ """ Support for converting a django user to an XBlock user """ +from django.contrib.auth.models import User + from xblock.reference.user_service import XBlockUser, UserService +from student.models import anonymous_id_for_user, get_user_by_username_or_email +from opaque_keys.edx.locations import SlashSeparatedCourseKey ATTR_KEY_IS_AUTHENTICATED = 'edx-platform.is_authenticated' ATTR_KEY_USER_ID = 'edx-platform.user_id' @@ -15,6 +19,7 @@ class DjangoXBlockUserService(UserService): def __init__(self, django_user, **kwargs): super(DjangoXBlockUserService, self).__init__(**kwargs) self._django_user = django_user + self._user_is_staff = kwargs.get('user_is_staff', False) def get_current_user(self): """ @@ -22,6 +27,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._user_is_staff: + return None + + try: + user = get_user_by_username_or_email(username_or_email=username) + except User.DoesNotExist: + return None + + course_id = SlashSeparatedCourseKey.from_deprecated_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 diff --git a/lms/djangoapps/courseware/module_render.py b/lms/djangoapps/courseware/module_render.py index 4a0ae1e8a4..854cb6efe0 100644 --- a/lms/djangoapps/courseware/module_render.py +++ b/lms/djangoapps/courseware/module_render.py @@ -598,6 +598,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, @@ -644,7 +646,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, @@ -668,7 +670,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 diff --git a/lms/djangoapps/courseware/tests/test_module_render.py b/lms/djangoapps/courseware/tests/test_module_render.py index b4156ccc35..c0dc82e97c 100644 --- a/lms/djangoapps/courseware/tests/test_module_render.py +++ b/lms/djangoapps/courseware/tests/test_module_render.py @@ -1218,3 +1218,23 @@ class LMSXBlockServiceBindingTest(ModuleStoreTestCase): ) service = runtime.service(descriptor, expected_service) self.assertIsNotNone(service) + + @XBlock.register_temp_plugin(PureXBlock, identifier='pure') + @ddt.data("user") + def test_expected_user_service_exists_with_staff_info(self, expected_service): + """ + Tests that the LMS runtime contains the 'user' service with appropriate staff info. + """ + descriptor = ItemFactory(category="pure", parent=self.course) + runtime, _ = render.get_module_system_for_user( + self.user, + self.field_data_cache, + descriptor, + self.course.id, + self.track_function, + self.xqueue_callback_url_prefix, + self.request_token + ) + service = runtime.service(descriptor, expected_service) + self.assertIsNotNone(service) + self.assertTrue(hasattr(service, '_user_is_staff'))