Similar to https://github.com/openedx/edx-platform/pull/32287, this change removes another unnecessary step from the `xmodule_assets` script. The script, which generates XModule SCSS "entrypoint" files (synthesizing one or more "source" SCSS resources), was appending MD5 hashes to each SCSS entrypoint filename: common/static/xmodule/descriptors/scss: AboutBlockStudio.768623f4d8d73dfb637fc94583adb990.scss ... WordCloudBlockStudio.d41d8cd98f00b204e9800998ecf8427e.scss common/static/xmodule/modules/scss: AboutBlockPreview.05a6cbd5c10100a245fa2cbf151b9770.scss ... WordCloudBlockPreview.7b899a56a70d29c58cf14b7e1888a0ec.scss It's unclear why these MD5 hashes needed to be appended. A comment in xmodule/static_content.py hints that it might have something to do with de-duplication, but that doesn't make any sense, because each XModule has exactly two SCSS entrypoint files (one for studio_view and one for other student/author_views) and none of those entrypoint files can possibly be shared between XModules. Soon, as part of deleting the `xmodule_assets` script, we would like to just check these SCSS files into version control rather than generating them. In order to do that, we will need to drop the hashes. This commit does that. The new output looks like this: common/static/xmodule/descriptors: AboutBlockStudio.scss ... WordCloudBlockStudio.scss common/static/xmodule/modules: AboutBlockPreview.scss ... WordCloudBlockPreview.scss Part of: https://github.com/openedx/edx-platform/issues/32292
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'])
|