###################
LTI Consumer XBlock
###################
| |status-badge| |license-badge| |ci-badge| |codecov-badge| |pypi-badge|
Purpose
*******
This XBlock implements the consumer side of the LTI specification enabling
integration of third-party LTI provider tools.
Getting Started
***************
Installation
============
For details regarding how to deploy this or any other XBlock in the lms instance, see the `installing-the-xblock`_ documentation.
.. _installing-the-xblock: https://edx.readthedocs.io/projects/xblock-tutorial/en/latest/edx_platform/devstack.html#installing-the-xblock
Installing in Docker Devstack
-----------------------------
Assuming that your ``devstack`` repo lives at ``~/code/devstack``
and that ``edx-platform`` lives right alongside that directory, you'll want
to checkout ``xblock-lti-consumer`` and have it live in ``~/code/src/xblock-lti-consumer``.
This will make it so that you can access it inside an LMS container shell
and easily make modifications for local testing.
**You will have to run the below instructions twice, once for the LMS and once for Studio.
Otherwise you will be using different versions of the xblock in the two containers.**
Run ``make dev.shell.lms`` or ``make dev.shell.studio`` from your ``devstack`` directory to enter a running container.
Once in there, you can do the following to have your devstack pointing at a local development
version of ``xblock-lti-consumer``:
.. code:: bash
$ pushd /edx/src/xblock-lti-consumer
$ virtualenv venv/
$ source venv/bin/activate
$ make install
$ make test # optional, if you want to see that everything works
$ deactivate
$ pushd # should take you back to /edx/app/edxapp/edx-platform
$ pip uninstall -y lti_consumer_xblock
$ pip install -e /edx/src/xblock-lti-consumer
Enabling in Studio
------------------
You can enable the LTI Consumer XBlock in Studio through the
advanced settings.
1. From the main page of a specific course, navigate to
``Settings -> Advanced Settings`` from the top menu.
2. Check for the ``advanced_modules`` policy key, and add
``"lti_consumer"`` to the policy value list.
3. Click the "Save changes" button.
Developing
===========
One Time Setup
--------------
.. code:: bash
# Clone the repository
git clone git@github.com:openedx/xblock-lti-consumer.git
cd xblock-lti-consumer
# Set up a virtualenv using virtualenvwrapper with the same name as the repo and activate it
mkvirtualenv -p python3.11 xblock-lti-consumer
Every time you develop something in this repo
---------------------------------------------
.. code:: bash
# Activate the virtualenv
workon xblock-lti-consumer
# Grab the latest code
git checkout master
git pull
# Install/update the dev requirements
make install
# Run the tests (to verify the status before you make any changes)
make test
# Make a new branch for your changes
git checkout -b <your_github_username>/<short_description>
# Using your favorite editor, edit the code to make your change.
vim ...
# Changes to style rules should be made to the Sass files, compiled to CSS,
# and committed to the git repository.
make compile-sass
# Run your new tests
pytest ./path/to/new/tests
# Run quality checks
make quality
# Add a changelog entry to CHANGELOG.rst
# Commit all your changes
git commit ...
git push
# Open a PR and ask for review.
Package Requirements
--------------------
setup.py contains a list of package dependencies which are required for this XBlock package.
This list is what is used to resolve dependencies when an upstream project is consuming
this XBlock package. requirements.txt is used to install the same dependencies when running
the tests for this package.
Further Development Info
------------------------
See the `developer guide`_ for implementation details and other developer concerns.
.. _developer guide: ./docs/developing.rst
Testing
*******
Unit Testing
============
* To run all of the unit tests at once, run `make test`
* To run tests on individual files in development, run `python ./test.py -k=[name of test file without .py]`
* For example, if you want to run the tests in test_permissions.py, run `python ./test.py -k=test_permissions`
* To run a specific test in a file, run something like `python ./test.py -k=test_permissions.TestClass.test_function`
Testing Against an LTI Provider
===============================
LTI 1.1
-------
http://lti.tools/saltire/ provides a "Test Tool Provider" service that allows
you to see messages sent by an LTI consumer.
We have some useful documentation on how to set this up here:
http://edx.readthedocs.io/projects/open-edx-building-and-running-a-course/en/latest/exercises_tools/lti_component.html#lti-authentication-information
1. In Studio Advanced settings, set the value of the "LTI Passports" field to "test:test:secret" -
this will set the OAuth client key and secret used to send a message to the test LTI provider.
2. Create an LTI Consumer problem in a course in Studio (after enabling it in "advanced_modules"
as seen above). Make a unit, select "Advanced", then "LTI Consumer".
3. Click edit and fill in the following fields:
``LTI ID``: "test"
``LTI URL``: "https://saltire.lti.app/tool"
**Note:** If you are using more than one same LTI xblocks in the same unit,
please append the `norefresh` parameter to the LTI URL to avoid any
potential failures. Then LTI URL will look like this:
`https://saltire.lti.app/tool?norefresh`.
4. Click save. The unit should refresh and you should see "Passed" in the "Verification" field of
the message tab in the LTI Tool Provider emulator.
5. Click the "Publish" button.
6. View the unit in your local LMS. If you get an ``ImportError: No module named lti_consumer``, you
should ``docker-compose restart lms`` (since we previously uninstalled the lti_consumer to get the
tests for this repo running inside an LMS container). From here, you can see the contents of the
messages that we are sending as an LTI Consumer in the "Message Parameters" part of the "Message" tab.
LTI 1.3
-------
IMS Global provides a reference implementation of LTI 1.3 that can be used to test the XBlock.
On LTI 1.3 the authentication mechanism used is OAuth2 using the Client Credentials grant, this means
that to configure the tool, the LMS needs to know the keyset URL or public key of the tool, and the tool
needs to know the LMS's one.
Instructions:
#. Set up a local tunnel (using `ngrok` or a similar tool) to get a URL accessible from the internet.
#. Add the following settings to `edx-platform/lms/envs/private.py` and `edx-platform/cms/envs/private.py`:
* LTI_BASE="http://localhost:18000"
* LTI_API_BASE="http://<your_ngrok>.ngrok.io"
#. Create a new course, and add the `lti_consumer` block to the advanced modules list.
#. In the course, create a new unit and add the LTI block.
* Set ``LTI Version`` to ``LTI 1.3``.
* Set the ``Tool Launch URL`` to ``https://lti-ri.imsglobal.org/lti/tools/``
#. In Studio, you'll see a few parameters being displayed in the preview:
.. code::
Client ID: f0532860-cb34-47a9-b16c-53deb077d4de
Deployment ID: 1
# Note that these are LMS URLS
Keyset URL: http://1234.ngrok.io/api/lti_consumer/v1/public_keysets/88e45ecbd-7cce-4fa0-9537-23e9f7288ad9
Access Token URL: http://1234.ngrok.io/api/lti_consumer/v1/token/8e45ecbd-7cce-4fa0-9537-23e9f7288ad9
OIDC Callback URL: http://localhost:18000/api/lti_consumer/v1/launch/
#. Set up a tool in the IMS Global reference implementation (https://lti-ri.imsglobal.org/lti/tools/).
* Click on ``Add tool`` at the top of the page (https://lti-ri.imsglobal.org/lti/tools).
* Add the parameters and URLs provided by the block, and generate a private key on https://lti-ri.imsglobal.org/keygen/index and paste it there (don't close the tab, you'll need the public key later).
#. Go back to Studio, and edit the block adding its settings (you'll find them by scrolling down https://lti-ri.imsglobal.org/lti/tools/ until you find the tool you just created):
.. code::
Tool Launch URL: https://lti-ri.imsglobal.org/lti/tools/[tool_id]/launches
Tool Initiate Login URL: https://lti-ri.imsglobal.org/lti/tools/[tool_id]/login_initiations
Tool Public key: Public key from key page.
#. Publish block, log into LMS and navigate to the LTI block page.
#. Click ``Send Request`` and verify that the LTI launch was successful.
LTI Advantage Features
----------------------
This XBlock supports LTI 1.3 and the following LTI Avantage services:
* Deep Linking (LTI-DL)
* Assignments and Grades services (LTI-AGS)
* Names and Roles Provisioning services (LTI-NRP)
To enable LTI-AGS, you need to set **LTI Assignment and Grades Service** in Studio to
allow tools to send back grades. There's two grade interaction models implemented:
* **Allow tools to submit grades only (declarative)(Default)**: enables LTI-AGS and
creates a single fixed LineItem that the tools can send grades too.
* **Allow tools to manage and submit grades (programmatic)**: enables LTI-AGS and
enables full access to LTI-AGS endpoints. Tools will be able to create, manage and
delete multiple LineItems, and set multiple grades per student per problem.
*In this implementation, the tool is responsible for managing grades and linking them in the LMS.*
To enable LTI-DL and its capabilities, you need to set these settings in the block:
1. Locate the **Deep linking** setting and set it to **True (enabled)**.
2. Set **Deep Linking Launch URL** setting. You can retrieve it from the tool you’re integrating with.
If it’s not provided, try using the same value as in the LTI 1.3 Tool Launch URL.
To enable LTI-NRPS, you set **Enable LTI NRPS** to **True** in the block settings on Studio.
LTI 1.1/1.2 Basic Outcomes Service 1.1
--------------------------------------
This XBlock supports `LTI 1.1/1.2 Basic Outcomes Service 1.0 <http://www.imsglobal.org/spec/lti-bo/v1p1/>`_. Please see these
`LTI 1.1/1.2 Basic Outcomes Service 1.0 instructions <https://github.com/openedx/xblock-lti-consumer/tree/master/docs/basic_outcomes_service.rst>`_
for testing the LTI 1.1/1.2 Basic Outcomes Service 1.1 implementation.
LTI 2.0 Result Service 2.0
--------------------------
This XBlock supports `LTI 2.0 Result Service 2.0 <https://www.imsglobal.org/lti/model/uml/purl.imsglobal.org/vocab/lis/v2/outcomes/Result/service.html>`_.
Please see the `LTI 2.0 Result Service 2.0 instructions <https://github.com/openedx/xblock-lti-consumer/tree/master/docs/result_service.rst>`_
for testing the LTI 2.0 Result Service 2.0 implementation.
LTI Reusable configuration
**************************
The LTI Consumer XBlock supports configuration reusability via plugins.
It is compatible with both LTI 1.1 and LTI 1.3.
All values (including the access token and keyset URL for LTI 1.3)
are shared across the XBlocks with the same external configuration ID.
This eliminates the need to have a tool deployment for each XBlock.
How to Setup
============
1. Install and setup the `openedx-ltistore`_ plugin on the LMS and Studio.
2. Go to LMS admin -> WAFFLE_UTILS -> Waffle flag course override
(http://localhost:18000/admin/waffle_utils/waffleflagcourseoverridemodel/).
3. Create a waffle flag course override with these values:
- Waffle flag: lti_consumer.enable_external_config_filter
- Course id: <your course id>
- Override choice: Force On
- Enabled: True
4. Create a new external LTI configuration and use it in the XBlock.
This is explained in the README of the `openedx-ltistore`_ repository.
.. _openedx-ltistore: https://github.com/open-craft/openedx-ltistore
Getting Help
************
If you're having trouble, we have discussion forums at
https://discuss.openedx.org where you can connect with others in the
community.
Our real-time conversations are on Slack. You can request a `Slack
invitation`_, then join our `community Slack workspace`_.
For anything non-trivial, the best path is to open an issue in this
repository with as many details about the issue you are facing as you
can provide.
https://github.com/openedx/xblock-lti-consumer/issues
For more information about these options, see the `Getting Help`_ page.
.. _Slack invitation: https://openedx.org/slack
.. _community Slack workspace: https://openedx.slack.com/
.. _Getting Help: https://openedx.org/getting-help
License
*******
The code in this repository is licensed under the AGPL v3 License unless
otherwise noted.
Please see `LICENSE.txt <LICENSE.txt>`_ for details.
Contributing
************
Contributions are very welcome.
Please read `How To Contribute <https://openedx.org/r/how-to-contribute>`_ for details.
This project is currently accepting all types of contributions, bug fixes,
security fixes, maintenance work, or new features. However, please make sure
to have a discussion about your new feature idea with the maintainers prior to
beginning development to maximize the chances of your change being accepted.
You can start a conversation by creating a new issue on this repo summarizing
your idea.
The Open edX Code of Conduct
****************************
All community members are expected to follow the `Open edX Code of Conduct`_.
.. _Open edX Code of Conduct: https://openedx.org/code-of-conduct/
People
******
The assigned maintainers for this component and other project details may be
found in `Backstage`_. Backstage pulls this data from the ``catalog-info.yaml``
file in this repo.
.. _Backstage: https://backstage.openedx.org/catalog/default/component/xblock-lti-consumer
Reporting Security Issues
*************************
Please do not report security issues in public. Please email security@openedx.org.
.. |ci-badge| image:: https://github.com/openedx/xblock-lti-consumer/workflows/Python%20CI/badge.svg?branch=master
:target: https://github.com/openedx/xblock-lti-consumer/actions?query=workflow%3A%22Python+CI%22
:alt: Test suite status
.. |codecov-badge| image:: https://codecov.io/github/openedx/xblock-lti-consumer/coverage.svg?branch=master
:target: https://codecov.io/github/openedx/xblock-lti-consumer?branch=master
:alt: Code coverage
.. |status-badge| image:: https://img.shields.io/badge/Status-Maintained-brightgreen
:alt: Maintained
.. |license-badge| image:: https://img.shields.io/github/license/openedx/xblock-lti-consumer.svg
:target: https://github.com/openedx/edx-rest-api-client/blob/master/LICENSE
:alt: License
.. |pypi-badge| image:: https://img.shields.io/pypi/v/lti-consumer-xblock.svg
:target: https://pypi.python.org/pypi/lti-consumer-xblock/
:alt: PyPI
Raw data
{
"_id": null,
"home_page": "https://github.com/openedx/xblock-lti-consumer",
"name": "lti-consumer-xblock",
"maintainer": null,
"docs_url": null,
"requires_python": null,
"maintainer_email": null,
"keywords": "lti consumer xblock",
"author": "Open edX project",
"author_email": "oscm@edx.org",
"download_url": "https://files.pythonhosted.org/packages/cd/08/98a12ac59be266d7e9f2feb42cf676880605542546deee7047fa9ac0af5d/lti_consumer_xblock-9.12.1.tar.gz",
"platform": null,
"description": "###################\nLTI Consumer XBlock\n###################\n\n| |status-badge| |license-badge| |ci-badge| |codecov-badge| |pypi-badge|\n\nPurpose\n*******\n\nThis XBlock implements the consumer side of the LTI specification enabling\nintegration of third-party LTI provider tools.\n\nGetting Started\n***************\n\nInstallation\n============\n\nFor details regarding how to deploy this or any other XBlock in the lms instance, see the `installing-the-xblock`_ documentation.\n\n.. _installing-the-xblock: https://edx.readthedocs.io/projects/xblock-tutorial/en/latest/edx_platform/devstack.html#installing-the-xblock\n\nInstalling in Docker Devstack\n-----------------------------\n\nAssuming that your ``devstack`` repo lives at ``~/code/devstack``\nand that ``edx-platform`` lives right alongside that directory, you'll want\nto checkout ``xblock-lti-consumer`` and have it live in ``~/code/src/xblock-lti-consumer``.\nThis will make it so that you can access it inside an LMS container shell\nand easily make modifications for local testing.\n\n**You will have to run the below instructions twice, once for the LMS and once for Studio.\nOtherwise you will be using different versions of the xblock in the two containers.**\n\nRun ``make dev.shell.lms`` or ``make dev.shell.studio`` from your ``devstack`` directory to enter a running container.\nOnce in there, you can do the following to have your devstack pointing at a local development\nversion of ``xblock-lti-consumer``:\n\n.. code:: bash\n\n $ pushd /edx/src/xblock-lti-consumer\n $ virtualenv venv/\n $ source venv/bin/activate\n $ make install\n $ make test # optional, if you want to see that everything works\n $ deactivate\n $ pushd # should take you back to /edx/app/edxapp/edx-platform\n $ pip uninstall -y lti_consumer_xblock\n $ pip install -e /edx/src/xblock-lti-consumer\n\nEnabling in Studio\n------------------\n\nYou can enable the LTI Consumer XBlock in Studio through the\nadvanced settings.\n\n1. From the main page of a specific course, navigate to\n ``Settings -> Advanced Settings`` from the top menu.\n2. Check for the ``advanced_modules`` policy key, and add\n ``\"lti_consumer\"`` to the policy value list.\n3. Click the \"Save changes\" button.\n\nDeveloping\n===========\n\nOne Time Setup\n--------------\n.. code:: bash\n\n # Clone the repository\n git clone git@github.com:openedx/xblock-lti-consumer.git\n cd xblock-lti-consumer\n\n # Set up a virtualenv using virtualenvwrapper with the same name as the repo and activate it\n mkvirtualenv -p python3.11 xblock-lti-consumer\n\n\nEvery time you develop something in this repo\n---------------------------------------------\n.. code:: bash\n\n # Activate the virtualenv\n workon xblock-lti-consumer\n\n # Grab the latest code\n git checkout master\n git pull\n\n # Install/update the dev requirements\n make install\n\n # Run the tests (to verify the status before you make any changes)\n make test\n\n # Make a new branch for your changes\n git checkout -b <your_github_username>/<short_description>\n\n # Using your favorite editor, edit the code to make your change.\n vim ...\n\n # Changes to style rules should be made to the Sass files, compiled to CSS,\n # and committed to the git repository.\n make compile-sass\n\n # Run your new tests\n pytest ./path/to/new/tests\n\n # Run quality checks\n make quality\n\n # Add a changelog entry to CHANGELOG.rst\n\n # Commit all your changes\n git commit ...\n git push\n\n # Open a PR and ask for review.\n\nPackage Requirements\n--------------------\n\nsetup.py contains a list of package dependencies which are required for this XBlock package.\nThis list is what is used to resolve dependencies when an upstream project is consuming\nthis XBlock package. requirements.txt is used to install the same dependencies when running\nthe tests for this package.\n\nFurther Development Info\n------------------------\n\nSee the `developer guide`_ for implementation details and other developer concerns.\n\n.. _developer guide: ./docs/developing.rst\n\nTesting\n*******\n\nUnit Testing\n============\n\n* To run all of the unit tests at once, run `make test`\n* To run tests on individual files in development, run `python ./test.py -k=[name of test file without .py]`\n* For example, if you want to run the tests in test_permissions.py, run `python ./test.py -k=test_permissions`\n* To run a specific test in a file, run something like `python ./test.py -k=test_permissions.TestClass.test_function`\n\nTesting Against an LTI Provider\n===============================\n\nLTI 1.1\n-------\n\nhttp://lti.tools/saltire/ provides a \"Test Tool Provider\" service that allows\nyou to see messages sent by an LTI consumer.\n\nWe have some useful documentation on how to set this up here:\nhttp://edx.readthedocs.io/projects/open-edx-building-and-running-a-course/en/latest/exercises_tools/lti_component.html#lti-authentication-information\n\n1. In Studio Advanced settings, set the value of the \"LTI Passports\" field to \"test:test:secret\" -\n this will set the OAuth client key and secret used to send a message to the test LTI provider.\n2. Create an LTI Consumer problem in a course in Studio (after enabling it in \"advanced_modules\"\n as seen above). Make a unit, select \"Advanced\", then \"LTI Consumer\".\n3. Click edit and fill in the following fields:\n ``LTI ID``: \"test\"\n ``LTI URL``: \"https://saltire.lti.app/tool\"\n **Note:** If you are using more than one same LTI xblocks in the same unit, \n please append the `norefresh` parameter to the LTI URL to avoid any \n potential failures. Then LTI URL will look like this: \n `https://saltire.lti.app/tool?norefresh`.\n4. Click save. The unit should refresh and you should see \"Passed\" in the \"Verification\" field of\n the message tab in the LTI Tool Provider emulator.\n5. Click the \"Publish\" button.\n6. View the unit in your local LMS. If you get an ``ImportError: No module named lti_consumer``, you\n should ``docker-compose restart lms`` (since we previously uninstalled the lti_consumer to get the\n tests for this repo running inside an LMS container). From here, you can see the contents of the\n messages that we are sending as an LTI Consumer in the \"Message Parameters\" part of the \"Message\" tab.\n\n\nLTI 1.3\n-------\n\nIMS Global provides a reference implementation of LTI 1.3 that can be used to test the XBlock.\n\nOn LTI 1.3 the authentication mechanism used is OAuth2 using the Client Credentials grant, this means\nthat to configure the tool, the LMS needs to know the keyset URL or public key of the tool, and the tool\nneeds to know the LMS's one.\n\nInstructions:\n\n#. Set up a local tunnel (using `ngrok` or a similar tool) to get a URL accessible from the internet.\n#. Add the following settings to `edx-platform/lms/envs/private.py` and `edx-platform/cms/envs/private.py`:\n\n * LTI_BASE=\"http://localhost:18000\"\n * LTI_API_BASE=\"http://<your_ngrok>.ngrok.io\"\n\n#. Create a new course, and add the `lti_consumer` block to the advanced modules list.\n#. In the course, create a new unit and add the LTI block.\n\n * Set ``LTI Version`` to ``LTI 1.3``.\n * Set the ``Tool Launch URL`` to ``https://lti-ri.imsglobal.org/lti/tools/``\n\n#. In Studio, you'll see a few parameters being displayed in the preview:\n\n.. code::\n\n Client ID: f0532860-cb34-47a9-b16c-53deb077d4de\n Deployment ID: 1\n # Note that these are LMS URLS\n Keyset URL: http://1234.ngrok.io/api/lti_consumer/v1/public_keysets/88e45ecbd-7cce-4fa0-9537-23e9f7288ad9\n Access Token URL: http://1234.ngrok.io/api/lti_consumer/v1/token/8e45ecbd-7cce-4fa0-9537-23e9f7288ad9\n OIDC Callback URL: http://localhost:18000/api/lti_consumer/v1/launch/\n\n\n#. Set up a tool in the IMS Global reference implementation (https://lti-ri.imsglobal.org/lti/tools/).\n\n * Click on ``Add tool`` at the top of the page (https://lti-ri.imsglobal.org/lti/tools).\n * Add the parameters and URLs provided by the block, and generate a private key on https://lti-ri.imsglobal.org/keygen/index and paste it there (don't close the tab, you'll need the public key later).\n\n#. Go back to Studio, and edit the block adding its settings (you'll find them by scrolling down https://lti-ri.imsglobal.org/lti/tools/ until you find the tool you just created):\n\n.. code::\n\n Tool Launch URL: https://lti-ri.imsglobal.org/lti/tools/[tool_id]/launches\n Tool Initiate Login URL: https://lti-ri.imsglobal.org/lti/tools/[tool_id]/login_initiations\n Tool Public key: Public key from key page.\n\n#. Publish block, log into LMS and navigate to the LTI block page.\n#. Click ``Send Request`` and verify that the LTI launch was successful.\n\n\nLTI Advantage Features\n----------------------\n\nThis XBlock supports LTI 1.3 and the following LTI Avantage services:\n\n* Deep Linking (LTI-DL)\n* Assignments and Grades services (LTI-AGS)\n* Names and Roles Provisioning services (LTI-NRP)\n\nTo enable LTI-AGS, you need to set **LTI Assignment and Grades Service** in Studio to\nallow tools to send back grades. There's two grade interaction models implemented:\n\n* **Allow tools to submit grades only (declarative)(Default)**: enables LTI-AGS and\n creates a single fixed LineItem that the tools can send grades too.\n* **Allow tools to manage and submit grades (programmatic)**: enables LTI-AGS and\n enables full access to LTI-AGS endpoints. Tools will be able to create, manage and\n delete multiple LineItems, and set multiple grades per student per problem.\n *In this implementation, the tool is responsible for managing grades and linking them in the LMS.*\n\nTo enable LTI-DL and its capabilities, you need to set these settings in the block:\n\n1. Locate the **Deep linking** setting and set it to **True (enabled)**.\n2. Set **Deep Linking Launch URL** setting. You can retrieve it from the tool you\u2019re integrating with.\n If it\u2019s not provided, try using the same value as in the LTI 1.3 Tool Launch URL.\n\nTo enable LTI-NRPS, you set **Enable LTI NRPS** to **True** in the block settings on Studio.\n\n\nLTI 1.1/1.2 Basic Outcomes Service 1.1\n--------------------------------------\n\nThis XBlock supports `LTI 1.1/1.2 Basic Outcomes Service 1.0 <http://www.imsglobal.org/spec/lti-bo/v1p1/>`_. Please see these\n`LTI 1.1/1.2 Basic Outcomes Service 1.0 instructions <https://github.com/openedx/xblock-lti-consumer/tree/master/docs/basic_outcomes_service.rst>`_\nfor testing the LTI 1.1/1.2 Basic Outcomes Service 1.1 implementation.\n\nLTI 2.0 Result Service 2.0\n--------------------------\n\nThis XBlock supports `LTI 2.0 Result Service 2.0 <https://www.imsglobal.org/lti/model/uml/purl.imsglobal.org/vocab/lis/v2/outcomes/Result/service.html>`_.\nPlease see the `LTI 2.0 Result Service 2.0 instructions <https://github.com/openedx/xblock-lti-consumer/tree/master/docs/result_service.rst>`_\nfor testing the LTI 2.0 Result Service 2.0 implementation.\n\nLTI Reusable configuration\n**************************\n\nThe LTI Consumer XBlock supports configuration reusability via plugins.\nIt is compatible with both LTI 1.1 and LTI 1.3.\nAll values (including the access token and keyset URL for LTI 1.3)\nare shared across the XBlocks with the same external configuration ID.\nThis eliminates the need to have a tool deployment for each XBlock.\n\nHow to Setup\n============\n\n1. Install and setup the `openedx-ltistore`_ plugin on the LMS and Studio.\n2. Go to LMS admin -> WAFFLE_UTILS -> Waffle flag course override\n (http://localhost:18000/admin/waffle_utils/waffleflagcourseoverridemodel/).\n3. Create a waffle flag course override with these values:\n - Waffle flag: lti_consumer.enable_external_config_filter\n - Course id: <your course id>\n - Override choice: Force On\n - Enabled: True\n4. Create a new external LTI configuration and use it in the XBlock.\n This is explained in the README of the `openedx-ltistore`_ repository.\n\n.. _openedx-ltistore: https://github.com/open-craft/openedx-ltistore\n\nGetting Help\n************\n\nIf you're having trouble, we have discussion forums at\nhttps://discuss.openedx.org where you can connect with others in the\ncommunity.\n\nOur real-time conversations are on Slack. You can request a `Slack\ninvitation`_, then join our `community Slack workspace`_.\n\nFor anything non-trivial, the best path is to open an issue in this\nrepository with as many details about the issue you are facing as you\ncan provide.\n\nhttps://github.com/openedx/xblock-lti-consumer/issues\n\nFor more information about these options, see the `Getting Help`_ page.\n\n.. _Slack invitation: https://openedx.org/slack\n.. _community Slack workspace: https://openedx.slack.com/\n.. _Getting Help: https://openedx.org/getting-help\n\nLicense\n*******\n\nThe code in this repository is licensed under the AGPL v3 License unless\notherwise noted.\n\nPlease see `LICENSE.txt <LICENSE.txt>`_ for details.\n\nContributing\n************\n\nContributions are very welcome.\nPlease read `How To Contribute <https://openedx.org/r/how-to-contribute>`_ for details.\n\nThis project is currently accepting all types of contributions, bug fixes,\nsecurity fixes, maintenance work, or new features. However, please make sure\nto have a discussion about your new feature idea with the maintainers prior to\nbeginning development to maximize the chances of your change being accepted.\nYou can start a conversation by creating a new issue on this repo summarizing\nyour idea.\n\nThe Open edX Code of Conduct\n****************************\n\nAll community members are expected to follow the `Open edX Code of Conduct`_.\n\n.. _Open edX Code of Conduct: https://openedx.org/code-of-conduct/\n\nPeople\n******\n\nThe assigned maintainers for this component and other project details may be\nfound in `Backstage`_. Backstage pulls this data from the ``catalog-info.yaml``\nfile in this repo.\n\n.. _Backstage: https://backstage.openedx.org/catalog/default/component/xblock-lti-consumer\n\nReporting Security Issues\n*************************\n\nPlease do not report security issues in public. Please email security@openedx.org.\n\n.. |ci-badge| image:: https://github.com/openedx/xblock-lti-consumer/workflows/Python%20CI/badge.svg?branch=master\n :target: https://github.com/openedx/xblock-lti-consumer/actions?query=workflow%3A%22Python+CI%22\n :alt: Test suite status\n\n.. |codecov-badge| image:: https://codecov.io/github/openedx/xblock-lti-consumer/coverage.svg?branch=master\n :target: https://codecov.io/github/openedx/xblock-lti-consumer?branch=master\n :alt: Code coverage\n\n.. |status-badge| image:: https://img.shields.io/badge/Status-Maintained-brightgreen\n :alt: Maintained\n\n.. |license-badge| image:: https://img.shields.io/github/license/openedx/xblock-lti-consumer.svg\n :target: https://github.com/openedx/edx-rest-api-client/blob/master/LICENSE\n :alt: License\n\n.. |pypi-badge| image:: https://img.shields.io/pypi/v/lti-consumer-xblock.svg\n :target: https://pypi.python.org/pypi/lti-consumer-xblock/\n :alt: PyPI\n",
"bugtrack_url": null,
"license": null,
"summary": "This XBlock implements the consumer side of the LTI specification.",
"version": "9.12.1",
"project_urls": {
"Homepage": "https://github.com/openedx/xblock-lti-consumer"
},
"split_keywords": [
"lti",
"consumer",
"xblock"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "517f2da8fdda76828395bf9856c86682a67a854c9c4c8d5cf3f25db6f71915cf",
"md5": "beb3b16d43346eff8f071d6b7e2cd7df",
"sha256": "aa39b790d092b3e7aad79e10017432504959d667d03e0fc1344986117e46ac07"
},
"downloads": -1,
"filename": "lti_consumer_xblock-9.12.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "beb3b16d43346eff8f071d6b7e2cd7df",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 391094,
"upload_time": "2024-12-19T15:35:51",
"upload_time_iso_8601": "2024-12-19T15:35:51.050963Z",
"url": "https://files.pythonhosted.org/packages/51/7f/2da8fdda76828395bf9856c86682a67a854c9c4c8d5cf3f25db6f71915cf/lti_consumer_xblock-9.12.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "cd0898a12ac59be266d7e9f2feb42cf676880605542546deee7047fa9ac0af5d",
"md5": "e0a639e15cd8d00358914b702db6d7ae",
"sha256": "a94f0093d0433b5bffa7db5d8b2e0d0e63ed6005cc2c21238f5f54192fb00d84"
},
"downloads": -1,
"filename": "lti_consumer_xblock-9.12.1.tar.gz",
"has_sig": false,
"md5_digest": "e0a639e15cd8d00358914b702db6d7ae",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 268032,
"upload_time": "2024-12-19T15:35:55",
"upload_time_iso_8601": "2024-12-19T15:35:55.486228Z",
"url": "https://files.pythonhosted.org/packages/cd/08/98a12ac59be266d7e9f2feb42cf676880605542546deee7047fa9ac0af5d/lti_consumer_xblock-9.12.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-12-19 15:35:55",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "openedx",
"github_project": "xblock-lti-consumer",
"travis_ci": false,
"coveralls": true,
"github_actions": true,
"tox": true,
"lcname": "lti-consumer-xblock"
}