Openedx Hooks Extension Framework#

To sustain the growth of the Open edX ecosystem, the business rules of the platform must be open for extension following the open-closed principle. This framework allows developers to do just that without needing to fork and modify the main Open edX platform.

Context#

Hooks are predefined places in the Open edX project core where externally defined functions can take place. In some cases, those functions can alter what the user sees or experiences in the platform. Other cases are informative only. All cases are meant to be extended using Open edX plugins and configuration.

Hooks can be of two types, events and filters. Events are in essence signals, in that they are sent in specific application places and whose listeners can extend functionality. functionality. On the other hand Filters can be used to act on data before it is put back in the original application flow. In order to allow extension developers to use the Events and Filters definitions on their plugins, both kinds of hooks are defined in lightweight external libraries.

Hooks are designed with stability in mind. The main goal is that developers can use them to change the functionality of the platform as needed and still be able to migrate to newer open releases with very little to no development effort. In the case of the events, this is detailed in the versioning ADR and the payload ADR.

A longer description of the framework and its history can be found in OEP 50.

On the technical side events are implemented through django signals which makes them run in the same python process as the service where this library is installed. Furthermore, events block the running process. Listeners of an event are encouraged to monitor the performance or use alternative arch patterns such as receiving the event and defer to launching async tasks than do the slow processing.