84 lines
2.7 KiB
Python
84 lines
2.7 KiB
Python
"""
|
|
Support for course tool plugins.
|
|
"""
|
|
from openedx.core.lib.plugins import PluginManager
|
|
|
|
# Stevedore extension point namespace
|
|
COURSE_TOOLS_NAMESPACE = 'openedx.course_tool'
|
|
|
|
|
|
class CourseTool(object):
|
|
"""
|
|
This is an optional base class for Course Tool plugins.
|
|
|
|
Plugin implementations inside this repo should subclass CourseTool to get
|
|
useful default behavior, and to add clarity to the code. This base class is
|
|
not a requirement, and plugin implementations outside of this repo should
|
|
simply follow the contract defined below.
|
|
"""
|
|
@classmethod
|
|
def analytics_id(cls):
|
|
"""
|
|
Returns an id to uniquely identify this tool in analytics events.
|
|
|
|
For example, 'edx.bookmarks'. New tools may warrant doc updates for the new id.
|
|
"""
|
|
raise NotImplementedError("Must specify an id to enable course tool eventing.")
|
|
|
|
@classmethod
|
|
def is_enabled(cls, request, course_key):
|
|
"""
|
|
Returns true if this tool is enabled for the specified course key.
|
|
"""
|
|
return True
|
|
|
|
@classmethod
|
|
def title(cls, course_key):
|
|
"""
|
|
Returns the title for the course tool.
|
|
"""
|
|
raise NotImplementedError("Must specify a title for a course tool.")
|
|
|
|
@classmethod
|
|
def icon_classes(cls, course_key):
|
|
"""
|
|
Returns the icon classes needed to represent this tool.
|
|
|
|
For example, return an icon from font-awasome.css, like 'fa fa-star'.
|
|
"""
|
|
raise NotImplementedError("Must specify an icon for a course tool.")
|
|
|
|
@classmethod
|
|
def url(cls, course_key):
|
|
"""
|
|
Returns the URL for this tool for the specified course key.
|
|
"""
|
|
raise NotImplementedError("Must specify a url for a course tool.")
|
|
|
|
|
|
class CourseToolsPluginManager(PluginManager):
|
|
"""
|
|
Manager for all of the course tools that have been made available.
|
|
|
|
Course tool implementation can subclass `CourseTool` or can implement
|
|
the required class methods themselves.
|
|
"""
|
|
NAMESPACE = COURSE_TOOLS_NAMESPACE
|
|
|
|
@classmethod
|
|
def get_course_tools(cls):
|
|
"""
|
|
Returns the list of available course tools in their canonical order.
|
|
"""
|
|
course_tools = cls.get_available_plugins().values()
|
|
course_tools.sort(key=lambda course_tool: course_tool.title())
|
|
return course_tools
|
|
|
|
@classmethod
|
|
def get_enabled_course_tools(cls, request, course_key):
|
|
"""
|
|
Returns the course tools applicable to the current user and course.
|
|
"""
|
|
course_tools = CourseToolsPluginManager.get_course_tools()
|
|
return filter(lambda tool: tool.is_enabled(request, course_key), course_tools)
|