Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Table of Contents

New Guidance

This wiki document may be out of date - please check Options for Extending the Open edX Platform for newer information.

Introduction

This document describes the different options available to you to add a new feature to the edX platform.

...

  1. Create a new XBlock in its own Git repository
  2. Create a new IDA (independently deployable application)
    • If a feature doesn't need to be tightly integrated into Studio or the LMS then it can be built as an independent app
    • It can make use of the Open edX ReST APIs to get any platform data that it requires
    • IDAs are a good choice when:
      • They need to scale independently of the edX platform
      • They will be built, deployed and managed by a separate team
      • LMS and Studio should continue unaffected even if the application goes down
    • Consider the following before choosing to make a new IDA:
      • There is more operational complexity for the community to deploy and manage your feature
      • There are performance implications with introducing extra network calls
      • There is more application complexity when working with related data from external APIs, e.g. joins and referential integrity must be implemented in the application layer
    • Examples of IDAs:
    • See the documentation below: Create a new IDA
  3. Create a new Django app in its own Git repository
    • New Django apps can be implemented in a separate repo and pip installed into the platform
    • A Django app in its own repository is a good choice when:
      • it provides new services that will be consumed by other parts of the platform
      • if it requires new UI for LMS or Studio, it provides it via extensions and does not introduce new URLs
        • See OEP-12 for the recommended way to add pluggable user interfaces
  4. Add a new Django app to the edX platform
  5. Update the platform directly
    • This is the option of last resort
    • When should you update the platform directly?
      • When the feature you are implementing updates core functionality in fundamental ways
      • When there are no extension points that you can use to build the functionality you need
    • Consider the following before doing this:
      • Features which update the platform directly require the most scrutiny in code review
      • There is far more risk of unexpected fallout from your changes
      • Consider whether it is possible to introduce a platform extension point and then use it
      • Be sure to discuss your proposed approach with the Open edX community first to ensure that this is the best way to move forward
    • Examples:
    • See the documentation below: Update the platform directly

...

  1. Create a new Django app, where all Python, mako and underscore templates, and JavaScript will live (note that there is an open story to allow sass files to also live in this app)
    • Our current best practice it so put new features into the platform directory openedx/features


    • Run the following code in an lms-shell (run "make lms-shell" in devstack)

      Code Block
      root@lms:/edx/app/edxapp/edx-platform# mkdir ./openedx/features/[Your App Name]
      root@lms:/edx/app/edxapp/edx-platform# ./manage.py lms startapp [Your App Name] ./openedx/features/[Your App Name]


  2. Create your Python view code, urls.py file, and unit tests
  3. If you have JavaScript and underscore templates:
    • Put your JavaScript files inside of a static directory, namespaced by the name of your app (for instance, teams/static/teams/js). 
    • As a best practice, use RequireJS and Backbone for your JavaScript
    • Use Underscore to handle client-side templates and load them using RequireJS Text (example).
    • Put your underscore templates inside the same namespaced static directory (for instance, teams/static/teams/templates). 
    • Put your Jasmine unit tests inside a spec directory within the JS directory (for instance, teams/static/teams/js/spec).
    • To enable the Jasmine unit tests as part of running LMS unit tests:
      • Add the names of your specs to lms/static/js/spec/main.js.
      • Add to src_paths, spec_paths, and fixture_paths in lms/static/karma_lms.conf.js (example).
      • Create a symbolic link in lms/static to the location of your static directory so that unit tests can find the appropriate files (example).
    • For more details, see How to add a new page to LMS or Studio/wiki/spaces/ArchiveEng/pages/16646275
  4. Add the name of your app to OPTIONAL_APPS in lms/envs/common.py
  5. Add your urls to lms/urls.py, most likely behind a feature flag or configuration setting
    • Be sure to have a urls.py within your Django app, and then include it from the platform's urls.py
  6. Write bok choy acceptance tests in common/test/acceptance to verify that your plugin is working.

...

Once you have chosen how to provide your new feature, you can add many different types of functionality:

...