Merge pull request #28440 from open-craft/jill/BD-13-user-service
[BD-13] Let ModuleSystem use UserService
This commit is contained in:
11
common/djangoapps/xblock_django/constants.py
Normal file
11
common/djangoapps/xblock_django/constants.py
Normal file
@@ -0,0 +1,11 @@
|
||||
"""
|
||||
Constants used by DjangoXBlockUserService
|
||||
"""
|
||||
|
||||
# Optional attributes stored on the XBlockUser
|
||||
ATTR_KEY_ANONYMOUS_USER_ID = 'edx-platform.anonymous_user_id'
|
||||
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'
|
||||
ATTR_KEY_USER_PREFERENCES = 'edx-platform.user_preferences'
|
||||
@@ -2,6 +2,7 @@
|
||||
Tests for the DjangoXBlockUserService.
|
||||
"""
|
||||
|
||||
import ddt
|
||||
import pytest
|
||||
from django.test import TestCase
|
||||
from opaque_keys.edx.keys import CourseKey
|
||||
@@ -12,6 +13,7 @@ from common.djangoapps.student.models import anonymous_id_for_user
|
||||
from common.djangoapps.student.tests.factories import AnonymousUserFactory, UserFactory
|
||||
from common.djangoapps.xblock_django.user_service import (
|
||||
ATTR_KEY_IS_AUTHENTICATED,
|
||||
ATTR_KEY_ANONYMOUS_USER_ID,
|
||||
ATTR_KEY_USER_ID,
|
||||
ATTR_KEY_USER_IS_STAFF,
|
||||
ATTR_KEY_USER_PREFERENCES,
|
||||
@@ -21,6 +23,7 @@ from common.djangoapps.xblock_django.user_service import (
|
||||
)
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
class UserServiceTestCase(TestCase):
|
||||
"""
|
||||
Tests for the DjangoXBlockUserService.
|
||||
@@ -42,7 +45,7 @@ class UserServiceTestCase(TestCase):
|
||||
assert xb_user.full_name is None
|
||||
self.assertListEqual(xb_user.emails, [])
|
||||
|
||||
def assert_xblock_user_matches_django(self, xb_user, dj_user):
|
||||
def assert_xblock_user_matches_django(self, xb_user, dj_user, user_is_staff=False, anonymous_user_id=None):
|
||||
"""
|
||||
A set of assertions for comparing a XBlockUser to a django User
|
||||
"""
|
||||
@@ -51,7 +54,8 @@ 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 not xb_user.opt_attrs[ATTR_KEY_USER_IS_STAFF]
|
||||
assert xb_user.opt_attrs[ATTR_KEY_USER_IS_STAFF] == user_is_staff
|
||||
assert xb_user.opt_attrs[ATTR_KEY_ANONYMOUS_USER_ID] == anonymous_user_id
|
||||
assert all((pref in USER_PREFERENCES_WHITE_LIST) for pref in xb_user.opt_attrs[ATTR_KEY_USER_PREFERENCES])
|
||||
|
||||
def test_convert_anon_user(self):
|
||||
@@ -63,14 +67,25 @@ class UserServiceTestCase(TestCase):
|
||||
assert xb_user.is_current_user
|
||||
self.assert_is_anon_xb_user(xb_user)
|
||||
|
||||
def test_convert_authenticate_user(self):
|
||||
@ddt.data(
|
||||
(False, None),
|
||||
(True, None),
|
||||
(False, 'abcdef0123'),
|
||||
(True, 'abcdef0123'),
|
||||
)
|
||||
@ddt.unpack
|
||||
def test_convert_authenticate_user(self, user_is_staff, anonymous_user_id):
|
||||
"""
|
||||
Tests for convert_django_user_to_xblock_user behavior when django user is User.
|
||||
"""
|
||||
django_user_service = DjangoXBlockUserService(self.user)
|
||||
django_user_service = DjangoXBlockUserService(
|
||||
self.user,
|
||||
user_is_staff=user_is_staff,
|
||||
anonymous_user_id=anonymous_user_id,
|
||||
)
|
||||
xb_user = django_user_service.get_current_user()
|
||||
assert 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, user_is_staff, anonymous_user_id)
|
||||
|
||||
def test_get_anonymous_user_id_returns_none_for_non_staff_users(self):
|
||||
"""
|
||||
|
||||
@@ -11,11 +11,16 @@ from openedx.core.djangoapps.external_user_ids.models import ExternalId
|
||||
from openedx.core.djangoapps.user_api.preferences.api import get_user_preferences
|
||||
from common.djangoapps.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'
|
||||
ATTR_KEY_USER_PREFERENCES = 'edx-platform.user_preferences'
|
||||
from .constants import (
|
||||
ATTR_KEY_ANONYMOUS_USER_ID,
|
||||
ATTR_KEY_IS_AUTHENTICATED,
|
||||
ATTR_KEY_USER_ID,
|
||||
ATTR_KEY_USERNAME,
|
||||
ATTR_KEY_USER_IS_STAFF,
|
||||
ATTR_KEY_USER_PREFERENCES,
|
||||
)
|
||||
|
||||
|
||||
USER_PREFERENCES_WHITE_LIST = ['pref-lang', 'time_zone']
|
||||
|
||||
|
||||
@@ -24,10 +29,18 @@ class DjangoXBlockUserService(UserService):
|
||||
A user service that converts Django users to XBlockUser
|
||||
"""
|
||||
def __init__(self, django_user, **kwargs):
|
||||
"""
|
||||
Constructs a DjangoXBlockUserService object.
|
||||
|
||||
Args:
|
||||
user_is_staff(bool): optional - whether the user is staff in the course
|
||||
anonymous_user_id(str): optional - anonymous_user_id for the user in the course
|
||||
"""
|
||||
super().__init__(**kwargs)
|
||||
self._django_user = django_user
|
||||
if self._django_user:
|
||||
self._django_user.user_is_staff = kwargs.get('user_is_staff', False)
|
||||
self._django_user.anonymous_user_id = kwargs.get('anonymous_user_id', None)
|
||||
|
||||
def get_current_user(self):
|
||||
"""
|
||||
@@ -82,6 +95,7 @@ class DjangoXBlockUserService(UserService):
|
||||
full_name = None
|
||||
xblock_user.full_name = full_name
|
||||
xblock_user.emails = [django_user.email]
|
||||
xblock_user.opt_attrs[ATTR_KEY_ANONYMOUS_USER_ID] = django_user.anonymous_user_id
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user