This reverts commit 5671dab975.
The original PR is causing styling issues due to broken CSS references
on studio.edx.org.
See https://github.com/openedx/edx-platform/issues/32292 for follow-up.
114 lines
4.2 KiB
Python
114 lines
4.2 KiB
Python
"""
|
|
Exposes Django utilities for consumption in the xmodule library
|
|
NOTE: This file should only be imported into 'django-safe' code, i.e. known that this code runs int the Django
|
|
runtime environment with the djangoapps in common configured to load
|
|
"""
|
|
|
|
|
|
from os import listdir
|
|
|
|
import webpack_loader
|
|
# NOTE: we are importing this method so that any module that imports us has access to get_current_request
|
|
from crum import get_current_request
|
|
from django.conf import settings
|
|
from webpack_loader.loader import WebpackLoader
|
|
|
|
|
|
class XModuleWebpackLoader(WebpackLoader):
|
|
"""
|
|
Custom webpack loader that consumes the output generated by webpack-bundle-tracker
|
|
and the files from XModule style generation stage. Briefly, this allows to use the
|
|
generated js bundles and compiled assets for XModule-style during Xblocks rendering.
|
|
"""
|
|
|
|
def load_assets(self):
|
|
"""
|
|
This function will append XModule css files to the standard load_assets results.
|
|
|
|
The standard WebpackLoader load_assets method returns a dictionary like the following:
|
|
|
|
{
|
|
'status': 'done',
|
|
'chunks': {
|
|
'AnnotatableBlockPreview': [
|
|
{
|
|
'name': 'AnnotatableBlockPreview.js',
|
|
'path': '/openedx/edx-platform/common/static/bundles/AnnotatableBlockPreview.js'
|
|
},
|
|
{
|
|
'name': 'AnnotatableBlockPreview.js.map',
|
|
'path': '/openedx/edx-platform/common/static/bundles/AnnotatableBlockPreview.js.map'
|
|
}
|
|
],
|
|
...
|
|
}
|
|
}
|
|
|
|
Chunks key contains the data for every file in /openedx/edx-platform/common/static/bundles/, that
|
|
is a folder created during the compilation theme, this method will append the listed files in
|
|
common/static/css/xmodule to the correspondent key, the result will be the following:
|
|
|
|
{
|
|
'status': 'done',
|
|
'chunks': {
|
|
'AnnotatableBlockPreview': [
|
|
{
|
|
'name': 'AnnotatableBlockPreview.js',
|
|
'path': '/openedx/edx-platform/common/static/bundles/AnnotatableBlockPreview.js'
|
|
},
|
|
{
|
|
'name': 'AnnotatableBlockPreview.js.map',
|
|
'path': '/openedx/edx-platform/common/static/bundles/AnnotatableBlockPreview.js.map'
|
|
},
|
|
{
|
|
'name': 'AnnotatableBlockPreview.css',
|
|
'path': 'common/static/css/xmodule/AnnotatableBlockPreview.css',
|
|
'publicPath': '/static/css/xmodule/AnnotatableBlockPreview.css'
|
|
}
|
|
],
|
|
...
|
|
}
|
|
}
|
|
|
|
Returns:
|
|
dict: Assets dictionary as described above.
|
|
"""
|
|
assets = super().load_assets()
|
|
|
|
css_path = "common/static/css/xmodule"
|
|
css_files = listdir(css_path)
|
|
|
|
for css_file in css_files:
|
|
name = css_file.split(".")[0]
|
|
css_chunk = {
|
|
"name": css_file,
|
|
"path": f"{css_path}/{css_file}",
|
|
"publicPath": f"{settings.STATIC_URL}css/xmodule/{css_file}",
|
|
}
|
|
assets["chunks"][name].append(css_chunk)
|
|
|
|
return assets
|
|
|
|
|
|
def get_current_request_hostname():
|
|
"""
|
|
This method will return the hostname that was used in the current Django request
|
|
"""
|
|
hostname = None
|
|
request = get_current_request()
|
|
if request:
|
|
hostname = request.META.get('HTTP_HOST')
|
|
|
|
return hostname
|
|
|
|
|
|
def add_webpack_to_fragment(fragment, bundle_name, extension=None, config='DEFAULT'):
|
|
"""
|
|
Add all webpack chunks to the supplied fragment as the appropriate resource type.
|
|
"""
|
|
for chunk in webpack_loader.utils.get_files(bundle_name, extension, config):
|
|
if chunk['name'].endswith(('.js', '.js.gz')):
|
|
fragment.add_javascript_url(chunk['url'])
|
|
elif chunk['name'].endswith(('.css', '.css.gz')):
|
|
fragment.add_css_url(chunk['url'])
|