""" 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'])