This document describes how to extend the edX platform with a new tab that can be added to courses.
...
Property | Description | Default | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
name | The name of the tab. This name is used as the id of the tab when persisted in a course. | |||||||||
title | The title of the tab. This is typically shown as the tab's label. | |||||||||
fragment_view_name | The name of the fragment view class that renders the tab's contents. This property should only be specified if the tab class includesuses | None | ||||||||
view_name | The name of the Django view that renders the tab. This field is required if Note that for the moment all new tabs must be implemented as Django views. The following JIRA story proposes support for adding new tabs using xblocks:
| None | ||||||||
priority | The relative priority of this tab. If specified, it affects the order in which this tab is added to a course. Lower priorities appear first, and the built-in tabs use priorities below 50. It is strongly recommended to use the default and allow the tabs to be sorted alphabetically. | None | ||||||||
tab_id | The HTML id to be used when the tab is rendered. | uses value of name | ||||||||
is_movable | If true, the author can move this tab to a different position. | True | ||||||||
is_dynamic | If true, this tab will be shown dynamically to the user, instead of being persisted into the course's tabs. A good example is the "Instructor" tab which is shown only to course staff. | False | ||||||||
is_default | If true, this tab will be added to the end of course's list of tabs if it is enabled. For example, the "Notes" tab appears automatically when Student Notes is enabled in a course. This tab will then be exported with the rest of the course. The list of tabs is refreshed after modifying the advanced settings. | True | ||||||||
is_hideable | If true, an author can choose to hide this tab from their course. | False | ||||||||
allow_multiple | If true, a course can add more than one instance of this view type. | False |
...
Method | Signature | Description |
---|---|---|
is_enabled | def is_enabled(cls, course, user=None) | Returns true if this tab is enabled for the current course for the specified user. If user is None, this method is being called by Studio and should generally return True if the tab will be shown to at least some students. |
validate | def validate(cls, tab_dict, raise_error=True) | Validates a dictionary representing a course tab. If raise_error then issues are raised as exceptions, else the function should return True if the dictionary is valid. |
Note |
---|
The course stores a static list of its tabs in the database, and this list is only updated when one of the following actions take place:
This means that if you have a pre-existing course then it won't immediately show a tab even after you've registered the new entry point. |
3. Implement the view
You have two choices to implement your new tab view:
...
Be sure to fill in PAGE-SLUG and PAGE NAME with the correct slug and name for your new page. Replace TEMPLATE_CODE
with the Mako markup and code for the rest of the page.
Examples
...
Fragment
...
Example: Discussions tab
The Discussions feature implements a renders its tab as a web fragment. Here's how it works:
- the "Discussion" tab is defined here:
- it refers to the fragment view class
DiscussionBoardFragmentView
: - the fragment's URL is declared here:
- the "Discussion" tab is then registered here:
...
Full Page Example: Teams tab
Warning |
---|
This example is to explain how legacy tabs were created. For new tabs, please follow the Django Fragment View fragment example. |
A simple example of a full Django View is the "Teams" tab. Here's how it gets added to the platform:
...
- You can put a breakpoint in this method to see whether or not your tab type is being added:
- The method which returns all possible tab types is here:
- https://github.com/edx/edx-platform/blob/master/openedx/core/lib/course_tabs.py#L20
- You can print the tab_types to see if tab isn't returned in the full list of types.
If your new tab type isn't returned then that means that the entry point registration didn't work.
- Try the following:
- check that you registered your new tab in setup.py.
- If you added your new Django app into edx-platform, then add it here:
- make sure that you've increased the version number so that pip knows that it needs to reinstall
- try manually reinstalling the app. For an edx-platform extension, do the following in devstack:
No Format sudo su edxapp pip install -e /edx/app/edxapp/edx-platform
...