-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: add CourseApp for Learning Assistant feature and register as en…
…trypoint This commit adds a concrete implementation of the CourseApp ABC from the CourseApps edx-platform Django app. This enables the Learning Assistant to be represented by a card on the Studio Pages & Resources pages. Please see the associated ADR for more details. This commit also registers this CourseApp class as an entrypoint to the CourseApps edx-platfrom Django app. Because the CourseApps REST API is a part of the CMS, the Learning Assistant plugin was also added as entrypoint to the CMS.
- Loading branch information
1 parent
5859798
commit 03ccf9a
Showing
18 changed files
with
476 additions
and
13 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -8,3 +8,4 @@ omit = | |
*admin.py | ||
*static* | ||
*templates* | ||
learning_assistant/plugins.py |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
""" | ||
Data classes for the Learning Assistant application. | ||
""" | ||
from attrs import field, frozen, validators | ||
from opaque_keys.edx.keys import CourseKey | ||
|
||
|
||
@frozen | ||
class LearningAssistantCourseEnabledData: | ||
""" | ||
Data class representing whether Learning Assistant is enabled in a course. | ||
""" | ||
|
||
course_key: CourseKey = field(validator=validators.instance_of(CourseKey)) | ||
enabled: bool = field(validator=validators.instance_of(bool)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,87 @@ | ||
""" | ||
Plugins for the Learning Assistant application. | ||
""" | ||
# pylint: disable=import-error | ||
from openedx.core.djangoapps.course_apps.plugins import CourseApp | ||
|
||
from learning_assistant import plugins_api | ||
|
||
|
||
class LearningAssistantCourseApp(CourseApp): | ||
""" | ||
A CourseApp plugin representing the Learning Assistant feature. | ||
Please see the associated ADR for more details. | ||
""" | ||
|
||
app_id = 'learning_assistant' | ||
name = 'Learning Assistant' | ||
description = 'TBD' | ||
documentation_links = {} | ||
|
||
@classmethod | ||
def is_available(cls, course_key): | ||
""" | ||
Return a boolean indicating this course app's availability for a given course. | ||
If an app is not available, it will not show up in the UI at all for that course, | ||
and it will not be possible to enable/disable/configure it. | ||
Args: | ||
course_key (CourseKey): Course key for course whose availability is being checked. | ||
Returns: | ||
bool: Availability status of app. | ||
""" | ||
return plugins_api.is_available(course_key) | ||
|
||
@classmethod | ||
def is_enabled(cls, course_key): | ||
""" | ||
Return if this course app is enabled for the provided course. | ||
Args: | ||
course_key (CourseKey): The course key for the course you | ||
want to check the status of. | ||
Returns: | ||
bool: The status of the course app for the specified course. | ||
""" | ||
return plugins_api.is_enabled(course_key) | ||
|
||
@classmethod | ||
def set_enabled(cls, course_key, enabled, user): | ||
""" | ||
Update the status of this app for the provided course and return the new status. | ||
Args: | ||
course_key (CourseKey): The course key for the course for which the app should be enabled. | ||
enabled (bool): The new status of the app. | ||
user (User): The user performing this operation. | ||
Returns: | ||
bool: The new status of the course app. | ||
""" | ||
return plugins_api.set_enabled(course_key, enabled, user) | ||
|
||
@classmethod | ||
def get_allowed_operations(cls, course_key, user=None): | ||
""" | ||
Return a dictionary of available operations for this app. | ||
Not all apps will support being configured, and some may support | ||
other operations via the UI. This will list, the minimum whether | ||
the app can be enabled/disabled and whether it can be configured. | ||
Args: | ||
course_key (CourseKey): The course key for a course. | ||
user (User): The user for which the operation is to be tested. | ||
Returns: | ||
A dictionary that has keys like 'enable', 'configure' etc | ||
with values indicating whether those operations are allowed. | ||
get_allowed_operations: function that returns a dictionary of the form | ||
{'enable': <bool>, 'configure': <bool>}. | ||
""" | ||
return plugins_api.get_allowed_operations(course_key, user) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,88 @@ | ||
""" | ||
Concrete implementations of abstract methods of the CourseApp plugin ABC, for use by the LearningAssistantCourseApp. | ||
Because the LearningAssistantCourseApp plugin inherits from the CourseApp class, which is imported from the | ||
edx-platform, we cannot test that plugin directly, because pytest will run outside the platform context. | ||
Instead, the CourseApp abstract methods are implemented here and | ||
imported into and used by the LearningAssistantCourseApp. This way, these implementations can be tested. | ||
""" | ||
|
||
from learning_assistant.api import learning_assistant_enabled, set_learning_assistant_enabled | ||
from learning_assistant.platform_imports import get_user_role, learning_assistant_available | ||
from learning_assistant.utils import user_role_is_staff | ||
|
||
|
||
def is_available(course_key): | ||
""" | ||
Return a boolean indicating this course app's availability for a given course. | ||
If an app is not available, it will not show up in the UI at all for that course, | ||
and it will not be possible to enable/disable/configure it. | ||
Args: | ||
course_key (CourseKey): Course key for course whose availability is being checked. | ||
Returns: | ||
bool: Availability status of app. | ||
""" | ||
return learning_assistant_available(course_key) | ||
|
||
|
||
def is_enabled(course_key): | ||
""" | ||
Return if this course app is enabled for the provided course. | ||
Args: | ||
course_key (CourseKey): The course key for the course you | ||
want to check the status of. | ||
Returns: | ||
bool: The status of the course app for the specified course. | ||
""" | ||
return learning_assistant_enabled(course_key) | ||
|
||
|
||
# pylint: disable=unused-argument | ||
def set_enabled(course_key, enabled, user): | ||
""" | ||
Update the status of this app for the provided course and return the new status. | ||
Args: | ||
course_key (CourseKey): The course key for the course for which the app should be enabled. | ||
enabled (bool): The new status of the app. | ||
user (User): The user performing this operation. | ||
Returns: | ||
bool: The new status of the course app. | ||
""" | ||
obj = set_learning_assistant_enabled(course_key, enabled) | ||
|
||
return obj.enabled | ||
|
||
|
||
def get_allowed_operations(course_key, user=None): | ||
""" | ||
Return a dictionary of available operations for this app. | ||
Not all apps will support being configured, and some may support | ||
other operations via the UI. This will list, the minimum whether | ||
the app can be enabled/disabled and whether it can be configured. | ||
Args: | ||
course_key (CourseKey): The course key for a course. | ||
user (User): The user for which the operation is to be tested. | ||
Returns: | ||
A dictionary that has keys like 'enable', 'configure' etc | ||
with values indicating whether those operations are allowed. | ||
get_allowed_operations: function that returns a dictionary of the form | ||
{'enable': <bool>, 'configure': <bool>}. | ||
""" | ||
if not user: | ||
return {'configure': False, 'enable': False} | ||
else: | ||
user_role = get_user_role(user, course_key) | ||
is_staff = user_role_is_staff(user_role) | ||
|
||
return {'configure': False, 'enable': is_staff} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.