Replace a Preinstalled XBlock With a Custom Implementation

Contents

Replace a Preinstalled XBlock With a Custom Implementation#

In XBlock v5.1.0, the ability was introduced to override an XBlock with a custom implementation.

This can be done by:

  1. Creating an XBlock in a new or existing package installed into edx-platform.

  2. Adding the xblock.v1.overrides entry point in setup.py, pointing to your custom XBlock.

This works with updated logic in load_class’s default_select, which gives load priority to a class with the .overrides suffix.

This can be disabled by providing a different select kwarg to load_class which ignores or otherwise changes override logic.

Example#

Imagine there is an XBlock installed edx-platform:

# edx-platform/xblocks/video_block.py
class VideoBlock(XBlock):
    ...

# edx-platform/setup.py
setup(
    # ...

    entry_points={
        "xblock.v1": [
            "video = xblocks.video_block:VideoBlock"
            # ...
        ]
    }
)

If you then create your own Python package with a custom version of that XBlock…

# your_plugin/xblocks/video_block.py
class YourVideoBlock(XBlock):
    ...

# your_plugin/setup.py
setup(
    # ...
    entry_points={
        "xblock.v1.overrides": [
            "video = your_plugin.xblocks.video_block:YourVideoBlock"
            # ...
        ],
    }
)

And install that package into your virtual environment, then your block should be loaded instead of the existing implementation.

Note

The load_class code will throw an error in the following cases:

  1. There are multiple classes attempting to override one XBlock implementation.

  2. There is an override provided where an existing XBlock implementation is not found.