# Openedx LTI Store
A plugin for openedx-platform to store LTI configurations centrally. This allows course creators to add [LTI components](https://edx.readthedocs.io/projects/edx-partner-course-staff/en/latest/exercises_tools/lti_component.html) without having to enter the details like secrets, keys and URLs everytime the component block is created.
## Development
The development instructions are written with the [Open edX Devstack](https://edx.readthedocs.io/projects/open-edx-devstack/en/latest/index.html) as reference.
1. Clone the repostiory to `<devstack_root>/src/` directory
```sh
cd <devstack_root>/src/
git clone git@github.com:open-craft/openedx-ltistore.git
```
2. Install the plugin inside the Studio container and run migrations
```sh
cd <devstack_root>/devstack/
make studio-shell
pip install -e /edx/src/openedx-ltistore
python manage.py cms migrate lti_store
exit
```
3. Install the plugin inside the LMS Container
```sh
make lms-shell
pip install -e /edx/src/openedx-ltistore
exit
```
4. The LTI Consumer XBlock can fetch configurations to LTI Tools using `openedx-filters` mechanism. It calls the filter `org.openedx.xblock.lti_consumer.configuration.listed.v1` whenever it wants to fetch the configurations from external tools like plugins. In order for **LTI Store** to send available LTI Tools, add the following to any existing `openedx-filters` configurations for both LMS (`edx-platform/lms/envs/devstack.py` or `private.py`) and studio (`edx-platform/cms/envs/devstack.py`):
```py
OPEN_EDX_FILTERS_CONFIG = {
"org.openedx.xblock.lti_consumer.configuration.listed.v1": {
"fail_silently": False,
"pipeline": [
"lti_store.pipelines.GetLtiConfigurations"
]
}
}
```
5. Restart the LMS & Studio for the latest config to take effect
```sh
make lms-restart
make studio-restart
```
Now any changes made to the source code should reflect in the application
## Adding LTI Tools to the store
1. Go to `http://localhost:18000/admin`
2. Look for `LTI_STORE` and add **External lti configurations** by clicking `+ Add` button
## Use configuration on LTI consumer XBlock
1. Go to `http://localhost:18000/admin`
2. Look for `LTI_STORE` and go to **External lti configurations**
3. On the list of external LTI configurations, note down the "Filter Key" value
of the configuration to use (Example: `lti_store:1`).
4. Copy "Filter Key" to the "External ID" field on the LTI consumer XBlock.
## Linting
The project uses [Black](https://black.readthedocs.io/en/stable/) for linting. To lint the code
```
make lint
```
## Testing
Unit tests can be run with
```
make test
```
Change Log
==========
Unreleased
----------
*
1.1.2 - 2025-09-19
------------------
### Fixed
* Fixed issue with LTI 1.3 public JWK not being included in serialized config.
1.1.0 – 2025-05-21
------------------
### Added
* Initial release to PyPI.
* CI pipelines.
* Django 5.2 support.
Raw data
{
"_id": null,
"home_page": "https://github.com/openedx/openedx-ltistore",
"name": "openedx-ltistore",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.11",
"maintainer_email": null,
"keywords": "Python edx",
"author": "edX",
"author_email": "oscm@edx.org",
"download_url": "https://files.pythonhosted.org/packages/23/8a/048b4c373779bb5bee862e70bd4ce66fc4aeede4dfc9f79dfbed117c1e7d/openedx_ltistore-1.1.2.tar.gz",
"platform": null,
"description": "# Openedx LTI Store\n\nA plugin for openedx-platform to store LTI configurations centrally. This allows course creators to add [LTI components](https://edx.readthedocs.io/projects/edx-partner-course-staff/en/latest/exercises_tools/lti_component.html) without having to enter the details like secrets, keys and URLs everytime the component block is created.\n\n## Development\n\nThe development instructions are written with the [Open edX Devstack](https://edx.readthedocs.io/projects/open-edx-devstack/en/latest/index.html) as reference.\n\n1. Clone the repostiory to `<devstack_root>/src/` directory\n ```sh\n cd <devstack_root>/src/\n git clone git@github.com:open-craft/openedx-ltistore.git\n ```\n2. Install the plugin inside the Studio container and run migrations\n ```sh\n cd <devstack_root>/devstack/\n make studio-shell\n pip install -e /edx/src/openedx-ltistore\n python manage.py cms migrate lti_store\n exit\n ```\n3. Install the plugin inside the LMS Container\n ```sh\n make lms-shell\n pip install -e /edx/src/openedx-ltistore\n exit\n ```\n4. The LTI Consumer XBlock can fetch configurations to LTI Tools using `openedx-filters` mechanism. It calls the filter `org.openedx.xblock.lti_consumer.configuration.listed.v1` whenever it wants to fetch the configurations from external tools like plugins. In order for **LTI Store** to send available LTI Tools, add the following to any existing `openedx-filters` configurations for both LMS (`edx-platform/lms/envs/devstack.py` or `private.py`) and studio (`edx-platform/cms/envs/devstack.py`):\n ```py\n OPEN_EDX_FILTERS_CONFIG = {\n \"org.openedx.xblock.lti_consumer.configuration.listed.v1\": {\n \"fail_silently\": False,\n \"pipeline\": [\n \"lti_store.pipelines.GetLtiConfigurations\"\n ]\n }\n }\n ```\n5. Restart the LMS & Studio for the latest config to take effect\n ```sh\n make lms-restart\n make studio-restart\n ```\n\nNow any changes made to the source code should reflect in the application\n\n## Adding LTI Tools to the store\n\n1. Go to `http://localhost:18000/admin`\n2. Look for `LTI_STORE` and add **External lti configurations** by clicking `+ Add` button\n\n## Use configuration on LTI consumer XBlock\n\n1. Go to `http://localhost:18000/admin`\n2. Look for `LTI_STORE` and go to **External lti configurations**\n3. On the list of external LTI configurations, note down the \"Filter Key\" value\n of the configuration to use (Example: `lti_store:1`).\n4. Copy \"Filter Key\" to the \"External ID\" field on the LTI consumer XBlock.\n\n## Linting\n\nThe project uses [Black](https://black.readthedocs.io/en/stable/) for linting. To lint the code\n\n```\nmake lint\n```\n\n## Testing\n\nUnit tests can be run with\n\n```\nmake test\n```\n\n\nChange Log\n==========\n\nUnreleased\n----------\n\n*\n\n1.1.2 - 2025-09-19\n------------------\n\n### Fixed\n\n* Fixed issue with LTI 1.3 public JWK not being included in serialized config.\n\n1.1.0 \u2013 2025-05-21\n------------------\n\n### Added\n\n* Initial release to PyPI.\n* CI pipelines.\n* Django 5.2 support.\n",
"bugtrack_url": null,
"license": "AGPL 3.0",
"summary": "An app for storing LTI provider configurations centrally.",
"version": "1.1.2",
"project_urls": {
"Homepage": "https://github.com/openedx/openedx-ltistore"
},
"split_keywords": [
"python",
"edx"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "bf83e374701b7c3bb9301eff68497c0572edb7d03f01204e8196a73f3fae2231",
"md5": "58142b10b0da91d01897d528c7cc7d16",
"sha256": "6912497d012cac0f3841023e6c9300d3d2d672b1c6b2021a44ed26bfd710ac48"
},
"downloads": -1,
"filename": "openedx_ltistore-1.1.2-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "58142b10b0da91d01897d528c7cc7d16",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": ">=3.11",
"size": 22488,
"upload_time": "2025-09-19T11:24:38",
"upload_time_iso_8601": "2025-09-19T11:24:38.270001Z",
"url": "https://files.pythonhosted.org/packages/bf/83/e374701b7c3bb9301eff68497c0572edb7d03f01204e8196a73f3fae2231/openedx_ltistore-1.1.2-py2.py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "238a048b4c373779bb5bee862e70bd4ce66fc4aeede4dfc9f79dfbed117c1e7d",
"md5": "3eb360c83154997d87cfe110026a6be4",
"sha256": "ccb33cde9eb1368c00edab8a06c69c3aecce82497aba9279990d11980b3c0566"
},
"downloads": -1,
"filename": "openedx_ltistore-1.1.2.tar.gz",
"has_sig": false,
"md5_digest": "3eb360c83154997d87cfe110026a6be4",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.11",
"size": 23947,
"upload_time": "2025-09-19T11:24:40",
"upload_time_iso_8601": "2025-09-19T11:24:40.283743Z",
"url": "https://files.pythonhosted.org/packages/23/8a/048b4c373779bb5bee862e70bd4ce66fc4aeede4dfc9f79dfbed117c1e7d/openedx_ltistore-1.1.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-09-19 11:24:40",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "openedx",
"github_project": "openedx-ltistore",
"github_not_found": true,
"lcname": "openedx-ltistore"
}