Adding get_anonymous_user_id in Xblock 'user' service.
TNL-836
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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'))
|
||||
|
||||
Reference in New Issue
Block a user