* The LMS now also monkey-patches xmodule.x_module.descriptor_global_handler_url and xmodule.x_module.descriptor_global_local_resource_url so that we can get LMS XBlock URLs from the DescriptorSystem. That functionality is needed in the block transforms collect() phase for certain XModules like Video. For instance, say we want to generate the transcripts URLs. The collect phase is run asynchronously, without a user context. * The URL handler monkey-patching is now done in the startup.py files for LMS and Studio. Studio used to do this in the import of cms/djangoapps/contentstore/views/item.py. This was mostly just because it seemed like a sane and consistent place to put it. * LmsHandlerUrls was removed, its handler_url and local_resource_url methods were moved to be top level functions. The only reason that class existed seems to be to give a place to store course_id state, and that can now be derived from the block location. * To avoid the Module -> Descriptor ProxyAttribute magic that we do (which explodes with an UndefinedContext error because there is no user involved), when examining the block's handler method in handler_url, I made a few changes: ** Check the .__class__ to see if the handler was defined, instead of the block itself. ** The above required me to relax the check for _is_xblock_handler on the function, since that will no longer be defined. 90% of this goes away when we kill XModules and do the refactoring we've wanted to do for a while.
81 lines
2.6 KiB
Python
81 lines
2.6 KiB
Python
"""
|
|
Module with code executed during Studio startup
|
|
"""
|
|
|
|
from django.conf import settings
|
|
|
|
# Force settings to run so that the python path is modified
|
|
settings.INSTALLED_APPS # pylint: disable=pointless-statement
|
|
|
|
from openedx.core.lib.django_startup import autostartup
|
|
from monkey_patch import django_utils_translation
|
|
|
|
import xmodule.x_module
|
|
import cms.lib.xblock.runtime
|
|
|
|
|
|
def run():
|
|
"""
|
|
Executed during django startup
|
|
"""
|
|
django_utils_translation.patch()
|
|
|
|
autostartup()
|
|
|
|
add_mimetypes()
|
|
|
|
if settings.FEATURES.get('USE_CUSTOM_THEME', False):
|
|
enable_theme()
|
|
|
|
# In order to allow descriptors to use a handler url, we need to
|
|
# monkey-patch the x_module library.
|
|
# TODO: Remove this code when Runtimes are no longer created by modulestores
|
|
# https://openedx.atlassian.net/wiki/display/PLAT/Convert+from+Storage-centric+runtimes+to+Application-centric+runtimes
|
|
xmodule.x_module.descriptor_global_handler_url = cms.lib.xblock.runtime.handler_url
|
|
xmodule.x_module.descriptor_global_local_resource_url = cms.lib.xblock.runtime.local_resource_url
|
|
|
|
|
|
def add_mimetypes():
|
|
"""
|
|
Add extra mimetypes. Used in xblock_resource.
|
|
|
|
If you add a mimetype here, be sure to also add it in lms/startup.py.
|
|
"""
|
|
import mimetypes
|
|
|
|
mimetypes.add_type('application/vnd.ms-fontobject', '.eot')
|
|
mimetypes.add_type('application/x-font-opentype', '.otf')
|
|
mimetypes.add_type('application/x-font-ttf', '.ttf')
|
|
mimetypes.add_type('application/font-woff', '.woff')
|
|
|
|
|
|
def enable_theme():
|
|
"""
|
|
Enable the settings for a custom theme, whose files should be stored
|
|
in ENV_ROOT/themes/THEME_NAME (e.g., edx_all/themes/stanford).
|
|
At this moment this is actually just a fix for collectstatic,
|
|
(see https://openedx.atlassian.net/browse/TNL-726),
|
|
but can be improved with a full theming option also for Studio
|
|
in the future (see lms.startup)
|
|
"""
|
|
# Workaround for setting THEME_NAME to an empty
|
|
# string which is the default due to this ansible
|
|
# bug: https://github.com/ansible/ansible/issues/4812
|
|
if settings.THEME_NAME == "":
|
|
settings.THEME_NAME = None
|
|
return
|
|
|
|
assert settings.FEATURES['USE_CUSTOM_THEME']
|
|
settings.FAVICON_PATH = 'themes/{name}/images/favicon.ico'.format(
|
|
name=settings.THEME_NAME
|
|
)
|
|
|
|
# Calculate the location of the theme's files
|
|
theme_root = settings.ENV_ROOT / "themes" / settings.THEME_NAME
|
|
|
|
# Namespace the theme's static files to 'themes/<theme_name>' to
|
|
# avoid collisions with default edX static files
|
|
settings.STATICFILES_DIRS.append(
|
|
(u'themes/{}'.format(settings.THEME_NAME), theme_root / 'static')
|
|
)
|