Commit ae102de3 by Muzaffar yousaf

Merge pull request #6777 from edx/muzaffar/student-info-tnl836

Get user anonymous id via xblock user service.
parents 011a5f94 3a09af07
...@@ -80,7 +80,9 @@ class LibraryTestCase(ModuleStoreTestCase): ...@@ -80,7 +80,9 @@ class LibraryTestCase(ModuleStoreTestCase):
of a LibraryContent block of a LibraryContent block
""" """
if 'user' not in lib_content_block.runtime._services: # pylint: disable=protected-access 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( handler_url = reverse_usage_url(
'component_handler', 'component_handler',
lib_content_block.location, lib_content_block.location,
......
...@@ -7,8 +7,11 @@ from xblock_django.user_service import ( ...@@ -7,8 +7,11 @@ from xblock_django.user_service import (
ATTR_KEY_IS_AUTHENTICATED, ATTR_KEY_IS_AUTHENTICATED,
ATTR_KEY_USER_ID, ATTR_KEY_USER_ID,
ATTR_KEY_USERNAME, ATTR_KEY_USERNAME,
ATTR_KEY_USER_IS_STAFF,
) )
from student.models import anonymous_id_for_user
from student.tests.factories import UserFactory, AnonymousUserFactory from student.tests.factories import UserFactory, AnonymousUserFactory
from opaque_keys.edx.keys import CourseKey
class UserServiceTestCase(TestCase): class UserServiceTestCase(TestCase):
...@@ -37,6 +40,7 @@ class UserServiceTestCase(TestCase): ...@@ -37,6 +40,7 @@ class UserServiceTestCase(TestCase):
self.assertEqual(xb_user.full_name, dj_user.profile.name) 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_USERNAME], dj_user.username)
self.assertEqual(xb_user.opt_attrs[ATTR_KEY_USER_ID], dj_user.id) 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): def test_convert_anon_user(self):
""" """
...@@ -55,3 +59,40 @@ class UserServiceTestCase(TestCase): ...@@ -55,3 +59,40 @@ class UserServiceTestCase(TestCase):
xb_user = django_user_service.get_current_user() xb_user = django_user_service.get_current_user()
self.assertTrue(xb_user.is_current_user) self.assertTrue(xb_user.is_current_user)
self.assert_xblock_user_matches_django(xb_user, self.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)
""" """
Support for converting a django user to an XBlock user 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 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_IS_AUTHENTICATED = 'edx-platform.is_authenticated'
ATTR_KEY_USER_ID = 'edx-platform.user_id' ATTR_KEY_USER_ID = 'edx-platform.user_id'
ATTR_KEY_USERNAME = 'edx-platform.username' ATTR_KEY_USERNAME = 'edx-platform.username'
ATTR_KEY_USER_IS_STAFF = 'edx-platform.user_is_staff'
class DjangoXBlockUserService(UserService): class DjangoXBlockUserService(UserService):
...@@ -15,6 +19,8 @@ class DjangoXBlockUserService(UserService): ...@@ -15,6 +19,8 @@ class DjangoXBlockUserService(UserService):
def __init__(self, django_user, **kwargs): def __init__(self, django_user, **kwargs):
super(DjangoXBlockUserService, self).__init__(**kwargs) super(DjangoXBlockUserService, self).__init__(**kwargs)
self._django_user = django_user 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): def get_current_user(self):
""" """
...@@ -22,6 +28,29 @@ class DjangoXBlockUserService(UserService): ...@@ -22,6 +28,29 @@ class DjangoXBlockUserService(UserService):
""" """
return self._convert_django_user_to_xblock_user(self._django_user) 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): def _convert_django_user_to_xblock_user(self, django_user):
""" """
A function that returns an XBlockUser from the current Django request.user A function that returns an XBlockUser from the current Django request.user
...@@ -36,6 +65,7 @@ class DjangoXBlockUserService(UserService): ...@@ -36,6 +65,7 @@ class DjangoXBlockUserService(UserService):
xblock_user.opt_attrs[ATTR_KEY_IS_AUTHENTICATED] = True 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_USER_ID] = django_user.id
xblock_user.opt_attrs[ATTR_KEY_USERNAME] = django_user.username 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: else:
xblock_user.opt_attrs[ATTR_KEY_IS_AUTHENTICATED] = False xblock_user.opt_attrs[ATTR_KEY_IS_AUTHENTICATED] = False
......
...@@ -591,6 +591,8 @@ def get_module_system_for_user(user, field_data_cache, ...@@ -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 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( system = LmsModuleSystem(
track_function=track_function, track_function=track_function,
render_template=render_to_string, render_template=render_to_string,
...@@ -637,7 +639,7 @@ def get_module_system_for_user(user, field_data_cache, ...@@ -637,7 +639,7 @@ def get_module_system_for_user(user, field_data_cache,
'i18n': ModuleI18nService(), 'i18n': ModuleI18nService(),
'fs': xblock.reference.plugins.FSService(), 'fs': xblock.reference.plugins.FSService(),
'field-data': field_data, '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), get_user_role=lambda: get_user_role(user, course_id),
descriptor_runtime=descriptor.runtime, descriptor_runtime=descriptor.runtime,
...@@ -661,7 +663,7 @@ def get_module_system_for_user(user, field_data_cache, ...@@ -661,7 +663,7 @@ def get_module_system_for_user(user, field_data_cache,
make_psychometrics_data_update_handler(course_id, user, descriptor.location) 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')) system.set(u'user_is_admin', has_access(user, u'staff', 'global'))
# make an ErrorDescriptor -- assuming that the descriptor's system is ok # make an ErrorDescriptor -- assuming that the descriptor's system is ok
......
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