73 lines
2.8 KiB
Python
73 lines
2.8 KiB
Python
"""
|
|
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 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'
|
|
|
|
|
|
class DjangoXBlockUserService(UserService):
|
|
"""
|
|
A user service that converts Django users to XBlockUser
|
|
"""
|
|
def __init__(self, django_user, **kwargs):
|
|
super(DjangoXBlockUserService, self).__init__(**kwargs)
|
|
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):
|
|
"""
|
|
Returns the currently-logged in user, as an instance of XBlockUser
|
|
"""
|
|
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):
|
|
"""
|
|
A function that returns an XBlockUser from the current Django request.user
|
|
"""
|
|
xblock_user = XBlockUser(is_current_user=True)
|
|
|
|
if django_user is not None and django_user.is_authenticated():
|
|
# This full_name is dependent on edx-platform's profile implementation
|
|
full_name = getattr(django_user.profile, 'name') if hasattr(django_user, 'profile') else None
|
|
xblock_user.full_name = full_name
|
|
xblock_user.emails = [django_user.email]
|
|
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
|
|
xblock_user.opt_attrs[ATTR_KEY_USER_IS_STAFF] = django_user.user_is_staff
|
|
else:
|
|
xblock_user.opt_attrs[ATTR_KEY_IS_AUTHENTICATED] = False
|
|
|
|
return xblock_user
|