openedx.core.djangoapps.monkey_patch package#

Module contents#

Monkey-patch the edX platform

Here be dragons (and simians!)

  • USE WITH CAUTION *

No, but seriously, you probably never really want to make changes here. This module contains methods to monkey-patch [0] the edx-platform. Patches are to be applied as early as possible in the callstack (currently lms/startup.py and cms/startup.py). Consequently, changes made here will affect the entire platform.

That said, if you’ve decided you really need to monkey-patch the platform (and you’ve convinced enough people that this is best solution), kindly follow these guidelines:

  • Reference django_18_upgrade.py for a sample implementation.

  • Name your module by replacing periods with underscores for the module to be patched:

    • patching ‘django.utils.translation’ becomes ‘django_utils_translation’

    • patching ‘your.module’ becomes ‘your_module’

  • Implement argumentless function wrappers in monkey_patch.your_module for the following:

    • is_patched

    • patch

    • unpatch

  • Add the following code where needed (typically cms/startup.py and lms/startup.py):

    ` from openedx.core.djangoapps.monkey_patch import your_module your_module.patch() `

  • Write tests! All code should be tested anyway, but with code that patches the platform runtime, we must be extra sure there are no unintended consequences.

[0] http://en.wikipedia.org/wiki/Monkey_patch

openedx.core.djangoapps.monkey_patch.is_patched(module, attribute_name)#

Check if an attribute has been monkey-patched

openedx.core.djangoapps.monkey_patch.patch(module, attribute_name, attribute_replacement)#

Monkey-patch an attribute

A backup of the original attribute is preserved in the patched attribute (see: __BACKUP_ATTRIBUTE_NAME).

openedx.core.djangoapps.monkey_patch.unpatch(module, attribute_name)#

Un-monkey-patch an attribute

Restore a backup of the original attribute from the patched attribute, iff it exists (see: __BACKUP_ATTRIBUTE_NAME).

Return boolean whether or not the attribute could be unpatched