feat: remove block-specific handling from runtime role checks
This commit is contained in:
@@ -3,12 +3,26 @@ Constants used by DjangoXBlockUserService
|
||||
"""
|
||||
|
||||
# Optional attributes stored on the XBlockUser
|
||||
|
||||
# The anonymous user ID for the user in the course.
|
||||
ATTR_KEY_ANONYMOUS_USER_ID = 'edx-platform.anonymous_user_id'
|
||||
# The global (course-agnostic) anonymous user ID for the user.
|
||||
ATTR_KEY_DEPRECATED_ANONYMOUS_USER_ID = 'edx-platform.deprecated_anonymous_user_id'
|
||||
# The country code determined from the user's request IP address.
|
||||
ATTR_KEY_REQUEST_COUNTRY_CODE = 'edx-platform.request_country_code'
|
||||
# Whether the user is authenticated or anonymous.
|
||||
ATTR_KEY_IS_AUTHENTICATED = 'edx-platform.is_authenticated'
|
||||
# The personally identifiable user ID.
|
||||
ATTR_KEY_USER_ID = 'edx-platform.user_id'
|
||||
# The username.
|
||||
ATTR_KEY_USERNAME = 'edx-platform.username'
|
||||
# Whether the user is enrolled in the course as a Beta Tester.
|
||||
ATTR_KEY_USER_IS_BETA_TESTER = 'edx-platform.user_is_beta_tester'
|
||||
# Whether the user has staff access to the platform.
|
||||
ATTR_KEY_USER_IS_GLOBAL_STAFF = 'edx-platform.user_is_global_staff'
|
||||
# Whether the user is a course team member with 'Staff' or 'Admin' access.
|
||||
ATTR_KEY_USER_IS_STAFF = 'edx-platform.user_is_staff'
|
||||
# A dict containing user's entries from the `UserPreference` model.
|
||||
ATTR_KEY_USER_PREFERENCES = 'edx-platform.user_preferences'
|
||||
# The user's role in the course ('staff', 'instructor', or 'student').
|
||||
ATTR_KEY_USER_ROLE = 'edx-platform.user_role'
|
||||
|
||||
@@ -16,6 +16,8 @@ from common.djangoapps.xblock_django.user_service import (
|
||||
ATTR_KEY_ANONYMOUS_USER_ID,
|
||||
ATTR_KEY_REQUEST_COUNTRY_CODE,
|
||||
ATTR_KEY_USER_ID,
|
||||
ATTR_KEY_USER_IS_BETA_TESTER,
|
||||
ATTR_KEY_USER_IS_GLOBAL_STAFF,
|
||||
ATTR_KEY_USER_IS_STAFF,
|
||||
ATTR_KEY_USER_PREFERENCES,
|
||||
ATTR_KEY_USER_ROLE,
|
||||
@@ -49,11 +51,15 @@ class UserServiceTestCase(TestCase):
|
||||
self.assertListEqual(xb_user.emails, [])
|
||||
|
||||
def assert_xblock_user_matches_django(
|
||||
self, xb_user, dj_user,
|
||||
self,
|
||||
xb_user,
|
||||
dj_user,
|
||||
user_is_staff=False,
|
||||
user_role=None,
|
||||
anonymous_user_id=None,
|
||||
request_country_code=None,
|
||||
user_is_global_staff=False,
|
||||
user_is_beta_tester=False,
|
||||
):
|
||||
"""
|
||||
A set of assertions for comparing a XBlockUser to a django User
|
||||
@@ -63,7 +69,9 @@ class UserServiceTestCase(TestCase):
|
||||
assert xb_user.full_name == dj_user.profile.name
|
||||
assert xb_user.opt_attrs[ATTR_KEY_USERNAME] == dj_user.username
|
||||
assert xb_user.opt_attrs[ATTR_KEY_USER_ID] == dj_user.id
|
||||
assert xb_user.opt_attrs[ATTR_KEY_USER_IS_BETA_TESTER] == user_is_beta_tester
|
||||
assert xb_user.opt_attrs[ATTR_KEY_USER_IS_STAFF] == user_is_staff
|
||||
assert xb_user.opt_attrs[ATTR_KEY_USER_IS_GLOBAL_STAFF] == user_is_global_staff
|
||||
assert xb_user.opt_attrs[ATTR_KEY_USER_ROLE] == user_role
|
||||
assert xb_user.opt_attrs[ATTR_KEY_ANONYMOUS_USER_ID] == anonymous_user_id
|
||||
assert xb_user.opt_attrs[ATTR_KEY_REQUEST_COUNTRY_CODE] == request_country_code
|
||||
@@ -80,14 +88,24 @@ class UserServiceTestCase(TestCase):
|
||||
self.assert_is_anon_xb_user(xb_user, request_country_code=country_code)
|
||||
|
||||
@ddt.data(
|
||||
(False, None, None, None),
|
||||
(True, 'instructor', None, None),
|
||||
(True, 'staff', None, None),
|
||||
(False, 'student', 'abcdef0123', None),
|
||||
(True, 'student', 'abcdef0123', 'uk'),
|
||||
(False, None, None, None, False, False),
|
||||
(True, 'instructor', None, None, False, False),
|
||||
(True, 'staff', None, None, False, False),
|
||||
(False, 'student', 'abcdef0123', None, False, False),
|
||||
(True, 'student', 'abcdef0123', 'uk', False, False),
|
||||
(False, None, None, None, True, False),
|
||||
(False, None, None, None, False, True),
|
||||
)
|
||||
@ddt.unpack
|
||||
def test_convert_authenticate_user(self, user_is_staff, user_role, anonymous_user_id, request_country_code):
|
||||
def test_convert_authenticate_user(
|
||||
self,
|
||||
user_is_staff,
|
||||
user_role,
|
||||
anonymous_user_id,
|
||||
request_country_code,
|
||||
user_is_global_staff,
|
||||
user_is_beta_tester,
|
||||
):
|
||||
"""
|
||||
Tests for convert_django_user_to_xblock_user behavior when django user is User.
|
||||
"""
|
||||
@@ -97,15 +115,20 @@ class UserServiceTestCase(TestCase):
|
||||
user_role=user_role,
|
||||
anonymous_user_id=anonymous_user_id,
|
||||
request_country_code=request_country_code,
|
||||
user_is_global_staff=user_is_global_staff,
|
||||
user_is_beta_tester=user_is_beta_tester,
|
||||
)
|
||||
xb_user = django_user_service.get_current_user()
|
||||
assert xb_user.is_current_user
|
||||
self.assert_xblock_user_matches_django(
|
||||
xb_user, self.user,
|
||||
xb_user,
|
||||
self.user,
|
||||
user_is_staff,
|
||||
user_role,
|
||||
anonymous_user_id,
|
||||
request_country_code,
|
||||
user_is_global_staff,
|
||||
user_is_beta_tester,
|
||||
)
|
||||
|
||||
def test_get_anonymous_user_id_returns_none_for_non_staff_users(self):
|
||||
|
||||
@@ -18,6 +18,8 @@ from .constants import (
|
||||
ATTR_KEY_REQUEST_COUNTRY_CODE,
|
||||
ATTR_KEY_USER_ID,
|
||||
ATTR_KEY_USERNAME,
|
||||
ATTR_KEY_USER_IS_BETA_TESTER,
|
||||
ATTR_KEY_USER_IS_GLOBAL_STAFF,
|
||||
ATTR_KEY_USER_IS_STAFF,
|
||||
ATTR_KEY_USER_PREFERENCES,
|
||||
ATTR_KEY_USER_ROLE,
|
||||
@@ -36,7 +38,10 @@ class DjangoXBlockUserService(UserService):
|
||||
Constructs a DjangoXBlockUserService object.
|
||||
|
||||
Args:
|
||||
user_is_staff(bool): optional - whether the user is staff in the course
|
||||
django_user(User): optional - the user we are binding to the runtime. Is `None` for an anonymous user.
|
||||
user_is_beta_tester(bool): optional - whether the user is enrolled in the course as a Beta Tester.
|
||||
user_is_global_staff(bool): optional - whether the user has staff access to the platform.
|
||||
user_is_staff(bool): optional - whether the user is a course team member with 'Staff' or 'Admin' access.
|
||||
user_role(str): optional -- user's role in the course ('staff', 'instructor', or 'student')
|
||||
anonymous_user_id(str): optional - anonymous_user_id for the user in the course
|
||||
deprecated_anonymous_user_id(str): optional - There are XBlocks (CAPA and HTML) that use the per-student
|
||||
@@ -46,6 +51,8 @@ class DjangoXBlockUserService(UserService):
|
||||
"""
|
||||
super().__init__(**kwargs)
|
||||
self._django_user = django_user
|
||||
self._user_is_beta_tester = kwargs.get('user_is_beta_tester', False)
|
||||
self._user_is_global_staff = kwargs.get('user_is_global_staff', False)
|
||||
self._user_is_staff = kwargs.get('user_is_staff', False)
|
||||
self._user_role = kwargs.get('user_role', 'student')
|
||||
self._anonymous_user_id = kwargs.get('anonymous_user_id', None)
|
||||
@@ -121,6 +128,8 @@ class DjangoXBlockUserService(UserService):
|
||||
xblock_user.opt_attrs[ATTR_KEY_REQUEST_COUNTRY_CODE] = self._request_country_code
|
||||
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_BETA_TESTER] = self._user_is_beta_tester
|
||||
xblock_user.opt_attrs[ATTR_KEY_USER_IS_GLOBAL_STAFF] = self._user_is_global_staff
|
||||
xblock_user.opt_attrs[ATTR_KEY_USER_IS_STAFF] = self._user_is_staff
|
||||
xblock_user.opt_attrs[ATTR_KEY_USER_ROLE] = self._user_role
|
||||
user_preferences = get_user_preferences(django_user)
|
||||
|
||||
Reference in New Issue
Block a user