From 69cf82593a0fbd5c1261d247f950c1b9027d051c Mon Sep 17 00:00:00 2001 From: Jillian Vogel Date: Thu, 28 Mar 2024 18:54:08 +1030 Subject: [PATCH 1/7] chore: adds catalog-info.yaml with new maintainer information. --- catalog-info.yaml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 catalog-info.yaml diff --git a/catalog-info.yaml b/catalog-info.yaml new file mode 100644 index 0000000..aec7541 --- /dev/null +++ b/catalog-info.yaml @@ -0,0 +1,16 @@ +# This file records information about this repo. Its use is described in OEP-55: +# https://open-edx-proposals.readthedocs.io/en/latest/processes/oep-0055-proc-project-maintainers.html + +apiVersion: backstage.io/v1alpha1 +kind: Component +metadata: + name: 'completion' + description: "A library for tracking completion of blocks by learners in edX courses." + links: + - url: "https://github.com/openedx/completion" + title: "Block Completion API", + icon: "Web" +spec: + owner: group:committers-completion + type: 'library' + lifecycle: 'production' From c18dd788622b1551deeb8b81cbe9f1081a21ac3a Mon Sep 17 00:00:00 2001 From: Jillian Vogel Date: Thu, 28 Mar 2024 19:21:07 +1030 Subject: [PATCH 2/7] fix: issues preventing python manage.py migrate * fix typo in default settings module * add default urls.py --- completion/urls.py | 1 + manage.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 completion/urls.py diff --git a/completion/urls.py b/completion/urls.py new file mode 100644 index 0000000..637600f --- /dev/null +++ b/completion/urls.py @@ -0,0 +1 @@ +urlpatterns = [] diff --git a/manage.py b/manage.py index 9d442a6..d2fcfaf 100755 --- a/manage.py +++ b/manage.py @@ -9,7 +9,7 @@ PWD = os.path.abspath(os.path.dirname(__file__)) if __name__ == '__main__': - os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings.test_settings') + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'completion.settings.test_settings') sys.path.append(PWD) try: from django.core.management import execute_from_command_line # pylint: disable=wrong-import-position From 9255258f0407bf941a5e3e732aef9a7a73f6a4b6 Mon Sep 17 00:00:00 2001 From: Jillian Vogel Date: Thu, 28 Mar 2024 19:21:31 +1030 Subject: [PATCH 3/7] chore: updates README using template See OEP-55 / 0003 README specification --- README.rst | 134 +++++++++++++++++++++++++++++++++-------------------- 1 file changed, 85 insertions(+), 49 deletions(-) diff --git a/README.rst b/README.rst index 1178940..d80cc77 100644 --- a/README.rst +++ b/README.rst @@ -1,94 +1,125 @@ completion -============================= +########## -|pypi-badge| |CI| |codecov-badge| |doc-badge| |pyversions-badge| -|license-badge| +|pypi-badge| |ci-badge| |codecov-badge| |doc-badge| |pyversions-badge| +|license-badge| |status-badge| -A library for tracking completion of blocks by learners in edX courses. +Purpose +******* -Overview -________ +A library for tracking completion of blocks by learners in edX courses. This repository provides a Django model `BlockCompletion` that is intended to be plugged into ``edx-platform``. It provides various handlers and services for the recording of completion data. It also provides a DRF API for submitting completion data in batches. Enabling in the LMS -------------------- -By default, the Open edX LMS does not use this library. To turn it on, go to http://localhost:18000/admin/waffle/switch/ (substitute your LMS URL for http://localhost:18000/), and add a new switch with Name ``completion.enable_completion_tracking`` and Active selected. +******************* + +By default, the Open edX LMS does not use this library. To turn it on, go to http://your.lms.site/admin/waffle/switch/, and add a new switch with Name ``completion.enable_completion_tracking`` and Active selected. See `Completion Tool `_ in the Open edX documentation for details on what will happen once enabled. -License -------- +Getting Started with Development +******************************** -The code in this repository is licensed under the AGPL 3.0 unless -otherwise noted. +Please see the Open edX documentation for `guidance on Python development `_ in this repo. -Please see ``LICENSE.txt`` for details. +To install the ``completion`` app, run these commands from the `completion` root directory: -How To Contribute ------------------ +.. code:: bash -Contributions are very welcome. + pip install -e -Please read `How To Contribute `_ for details. +To run the test suite: -PR description template should be automatically applied if you are sending PR from github interface; otherwise you -can find it it at `PULL_REQUEST_TEMPLATE.md `_ +.. code:: bash -Issue report template should be automatically applied if you are sending it from github UI as well; otherwise you -can find it at `ISSUE_TEMPLATE.md `_ + pip install tox + tox # to run only a single environment, do e.g. tox -e py38-django42-drflatest -Reporting Security Issues -------------------------- -Please do not report security issues in public. Please email security@openedx.org. +To use a Django shell to test commands: -Using with Docker Devstack --------------------------- +.. code:: bash -Prerequisite: Have your Open edX `Devstack `_ properly installed. + make install + python manage.py migrate + python manage.py shell + >>> from completion.models import BlockCompletion + >>> -Note: When you see "from inside the lms" below, it means that you've run ``make lms-shell`` from your devstack -directory and are on a command prompt inside the LMS container. -#. Clone this repo into ``../src/`` directory (relative to your "devstack" repo location). This will mount the - directory in a way that is accessible to the lms container. +Deploying +********* -#. From inside the lms, uninstall completion and reinstall your local copy. You can just copy the following line:: +Tagged versions of the completion library are released to pypi.org. - pip uninstall completion -y; pip install -e /edx/src/completion/ +To use the latest release in your project, add the following to your pip requirements file: -#. Now, get your completion development environment set up:: +.. code:: bash - cd /edx/src/completion - virtualenv completion-env - source completion-env/bin/activate - make install + edx-completion -#. Don't forget to enable the waffle switch as described above in "Enabling in the LMS" +Getting Help +************ -#. That's it! In order to simulate a given tox environment ``(django18, django111, quality)``, run ``tox -e `` for the env in question. If you want to run ``pytest`` directly:: +Documentation +============= - pytest completion/tests/test_models.py +Start by going through `the documentation`_ (generated from `/docs `_). If you need more help see below. -Getting Help ------------- +.. _the documentation: https://docs.openedx.org/projects/completion -Have a question about this repository, or about Open edX in general? Please -refer to this `list of resources`_ if you need any assistance. +License +******* + +The code in this repository is licensed under version 3 of the AGPL unless +otherwise noted. -.. _list of resources: https://open.edx.org/getting-help +Please see `LICENSE.txt `_ for details. +Contributing +************ + +Contributions are very welcome. +Please read `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/completion + +Reporting Security Issues +************************* + +Please do not report security issues in public. Please email security@openedx.org. .. |pypi-badge| image:: https://img.shields.io/pypi/v/edx-completion.svg :target: https://pypi.python.org/pypi/edx-completion/ :alt: PyPI -.. |CI| image:: https://github.com/openedx/completion/workflows/Python%20CI/badge.svg?branch=master - :target: https://github.com/openedx/completion/actions?query=workflow%3A%22Python+CI%22 +.. |ci-badge| image:: https://github.com/openedx/completion/actions/workflows/ci.yml/badge.svg?branch=master + :target: https://github.com/openedx/completion/actions/workflows/ci.yml?branch=master :alt: CI .. |codecov-badge| image:: http://codecov.io/github/edx/completion/coverage.svg?branch=master @@ -96,7 +127,7 @@ refer to this `list of resources`_ if you need any assistance. :alt: Codecov .. |doc-badge| image:: https://readthedocs.org/projects/completion/badge/?version=latest - :target: http://completion.readthedocs.io/en/latest/ + :target: https://docs.openedx.org/projects/completion :alt: Documentation .. |pyversions-badge| image:: https://img.shields.io/pypi/pyversions/edx-completion.svg @@ -106,3 +137,8 @@ refer to this `list of resources`_ if you need any assistance. .. |license-badge| image:: https://img.shields.io/github/license/edx/completion.svg :target: https://github.com/openedx/completion/blob/master/LICENSE.txt :alt: License + +.. .. |status-badge| image:: https://img.shields.io/badge/Status-Experimental-yellow +.. |status-badge| image:: https://img.shields.io/badge/Status-Maintained-brightgreen +.. .. |status-badge| image:: https://img.shields.io/badge/Status-Deprecated-orange +.. .. |status-badge| image:: https://img.shields.io/badge/Status-Unsupported-red From 0a59fb81881482519d5e7d5d0bc493fa7afd7c30 Mon Sep 17 00:00:00 2001 From: Jillian Vogel Date: Thu, 28 Mar 2024 19:21:45 +1030 Subject: [PATCH 4/7] chore: move LICENSE to LICENSE.txt to match cookiecutter defaults --- LICENSE => LICENSE.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename LICENSE => LICENSE.txt (100%) diff --git a/LICENSE b/LICENSE.txt similarity index 100% rename from LICENSE rename to LICENSE.txt From dd0d175e2b11a8a6530602b22cb6e12ac87a64b4 Mon Sep 17 00:00:00 2001 From: Jillian Vogel Date: Thu, 28 Mar 2024 19:27:28 +1030 Subject: [PATCH 5/7] chore: removes Reviewers list from PR template We tag reviewers in github now. --- .github/PULL_REQUEST_TEMPLATE.md | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index a69e19e..d2506e4 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -4,15 +4,10 @@ **Dependencies:** dependencies on other outstanding PRs, issues, etc. -**Installation instructions:** List any non-trivial installation -instructions. +**Installation instructions:** List any non-trivial installation instructions. **Testing instructions:** List testing instructions -**Reviewers:** -- [ ] tag reviewer -- [ ] tag reviewer - **Merge checklist:** - [ ] All reviewers approved - [ ] CI build is green @@ -23,6 +18,5 @@ instructions. **Post merge:** - [ ] Create a tag -- [ ] Check new version is pushed to PyPi after tag-triggered build is - finished. +- [ ] Check new version is pushed to PyPi after tag-triggered build is finished. - [ ] Delete working branch (if not needed anymore) From 11d45f68b8e089027f373d815e92f9a8098ab667 Mon Sep 17 00:00:00 2001 From: Jillian Vogel Date: Thu, 28 Mar 2024 19:38:10 +1030 Subject: [PATCH 6/7] fix: quality issues --- CHANGELOG.rst | 82 +++++++++++++++++++++++----------------------- completion/urls.py | 1 + 2 files changed, 42 insertions(+), 41 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 53c5654..17d9aed 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,5 +1,5 @@ Change Log ----------- +========== .. All enhancements and patches to completion will be documented @@ -12,69 +12,69 @@ Change Log .. There should always be an "Unreleased" section for changes pending release. Unreleased -~~~~~~~~~~ +---------- [4.5.0] - 2024-3-19 -~~~~~~~~~~~~~~~~~~~~ +-------------------- * Added ``clear_learning_context_completion`` to enable clearing a learner's completion for a course [4.4.1] - 2023-10-27 -~~~~~~~~~~~~~~~~~~~~ +-------------------- * Fix RemovedInDjango41Warning by removing `django_app_config` [4.4.0] - 2023-10-20 -~~~~~~~~~~~~~~~~~~~~ +-------------------- * Added tracking logs for completion events [4.3.0]- 2023-07-26 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------ * Added support for Django 4.2 [4.2.1]- 2023-04-26 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------ * Support ``get_child_blocks`` along with ``get_child_descriptors``. * Switch from ``edx-sphinx-theme`` to ``sphinx-book-theme`` since the former is deprecated [4.1.0]- 2021-07-19 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------ * Add Django 3.0, 3.1 & 3.2 Support [4.0.4]- 2021-02-04 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------ * Update ``get_key_to_last_completed_block`` to return ``full_block_key`` instead of ``block_key`` [4.0.2] - 2021-02-04 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------ * Future-proof usage of ``edx_toggles.toggles`` [4.0.1] - 2021-01-05 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------ * Replace reference to deprecated import path ``student.models`` with ``common.djangoapps.student.models``. * Updated the build status badge in README.rst to point to travis-ci.com instead of travis-ci.org [4.0.0] - 2020-11-05 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------ * Remove soon-to-be-deprecated WaffleSwitchNamespace class instances * BACKWARD INCOMPATIBLE: Removes ``waffle()``, which returned a (now deprecated) WaffleSwitchNamespace. This should only affect tests in edx-platform. * Requires edx-toggles>=1.2.0, which introduces a new API to waffle objects. * Refactors ``ENABLE_COMPLETION_TRACKING_SWITCH`` from a ``LegacyWaffleSwitch`` to the updated ``WaffleSwitch``. We don't expect uses of this updated switch to require changes, unless there are surprise uses of deprecated methods from ``LegacyWaffleSwitch``. [3.2.5] - 2020-10-23 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------ * Fix waffle switch override in tests by relying on newest edx_toggles API [3.2.4] - 2020-07-21 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------ * Fix AttributeError raised by `vertical_is_complete`. * by ensuring `get_completable_children` doesn't return null [3.2.3] - 2020-07-01 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------ * Updated the children lookup for `vertical_is_complete` to utilize the XBlockCompletion model. There are three completion modes to consider: EXCLUDED, AGGREGATOR, COMPLETABLE. @@ -84,7 +84,7 @@ Unreleased determine if the vertical is complete. [3.2.2] - 2020-06-30 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------ * Adding recursive lookup for children of a vertical to the `vertical_is_complete` method in services.py. * This was added because verticals containing children that had their own children were not being properly marked @@ -92,19 +92,19 @@ Unreleased incomplete, but the vertical would still be marked as complete. Now it looks at all leaves under the vertical. [3.1.1] - 2020-02-24 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------ * Remove unnecessary constraint for edx-drf-extensions<3.0.0 [3.1.0] - 2020-02-18 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------ * Upgrades packages, drops support for Python 2. [3.0.1] - 2019-10-22 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------ * Fix the package long description to be valid rST, check this in CI. [3.0.0] - 2019-10-22 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------ * Support tracking completion of XBlocks in any "learning context", such as in a content library, and not just in courses. To keep the code clean, this has been done as a **breaking change** to the python API. (The API has been @@ -112,100 +112,100 @@ Unreleased usage key rather than block key + course key.) The REST API is unchanged. [2.1.1] - 2019-10-21 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------ * Updated credentials for PyPI deployment via token. [2.1.0] - 2019-10-18 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------ * Switch blocks_to_mark_complete_on_view() to return a list of XBlocks instead of a set. Many XBlocks aren't hashable; the old implementation allowed subtle bugs under Python 2.7 but triggers an immediate error under 3.5. [2.0.0] - 2019-04-23 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------ * Unpin django-rest-framework requirements. This is a potentially **breaking change** if people were relying on this package to ensure the correct version of djangorestframework was being installed. * Remove the AUTHORS file and references to it. [1.0.2] - 2019-03-11 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------ * Fix the 403 error occurring for completion-batch API for requests coming from the iOS devices [1.0.0] - 2018-10-16 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------ * Updated edx-drf-extensions imports. Completion will no longer work with outdated versions of edx-drf-extensions. [0.1.14] - 2018-10-04 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------ * Added submit_completion and submit_group_completion methods on CompletionService. [0.1.7] - 2018-06-18 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------ * Added can_mark_block_complete_on_view() and blocks_to_mark_complete_on_view() methods on CompletionService and renamed get_completion_by_viewing_delay_ms() to get_complete_on_view_delay_ms(). [0.1.6] - 2018-04-13 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------ * Remove usage of deprecated CourseStructure api. [0.1.5] - 2018-04-03 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------ * Delete enable_visual_progress methods and checks. Deprecate ENABLE_VISUAL_PROGRESS, ENABLE_COURSE_VISUAL_PROGRESS, and ENABLE_SITE_VISUAL_PROGRESS waffle flags [0.1.4] - 2018-03-28 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------ * Site configurations must now explicitly disable visual progress for the enable_visual_progress() feature gating function to return False early. [0.1.3] - 2018-03-26 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------ * Added some documentation. [0.1.2] - 2018-03-23 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------ * Fix management of dependency versions [0.1.1] - 2018-03-23 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------ * Fixes wildly inefficient raw query in BlockCompletion.latest_blocks_completed_all_courses() * Updates freezegun version, makes tests that use it somewhat faster. [0.1.0] - 2018-03-20 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------ * Fixes https://openedx.atlassian.net/browse/EDUCATOR-2540 [0.0.11] - 2018-03-20 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------ * Added "subsection-completion/{username}/{course_key}/{subsection_id}" API endpoint, to be used with the completion milestones experiment. [0.0.9] - 2018-02-27 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------ * Added "utilities.py", which houses methods for working with BlockCompletion data. [0.0.8] - 2018-03-01 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------ * Add model method for superlative “last completed block” - for site awareness include every last completed block by course, for later sorting in business layer. [0.0.7] - 2018-02-15 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------ * Add settings and service method for determining completion-by-viewing delay. [0.0.6] - 2018-02-13 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------ * Add the additional completion logic into the service and models from edx-platform [0.0.2] - 2018-01-31 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------ * Fix up edx-lint requirements shenanigans. [0.0.1] - 2018-01-31 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------ * Initial release diff --git a/completion/urls.py b/completion/urls.py index 637600f..3f1ca78 100644 --- a/completion/urls.py +++ b/completion/urls.py @@ -1 +1,2 @@ +"""Completion has no urls or views""" urlpatterns = [] From 917477c4d601c0707dc324206ff33c14cb9a8082 Mon Sep 17 00:00:00 2001 From: Jillian Vogel Date: Thu, 28 Mar 2024 19:56:38 +1030 Subject: [PATCH 7/7] fix: address PR review * use Open edX instead of edX * reverts LICENSE move --- LICENSE.txt => LICENSE | 0 README.rst | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename LICENSE.txt => LICENSE (100%) diff --git a/LICENSE.txt b/LICENSE similarity index 100% rename from LICENSE.txt rename to LICENSE diff --git a/README.rst b/README.rst index d80cc77..417721b 100644 --- a/README.rst +++ b/README.rst @@ -7,7 +7,7 @@ completion Purpose ******* -A library for tracking completion of blocks by learners in edX courses. +A library for tracking completion of blocks by learners in Open edX courses. This repository provides a Django model `BlockCompletion` that is intended to be plugged into ``edx-platform``. It provides various handlers and services for the recording of completion data. It also provides a DRF API for submitting @@ -78,7 +78,7 @@ License The code in this repository is licensed under version 3 of the AGPL unless otherwise noted. -Please see `LICENSE.txt `_ for details. +Please see `LICENSE `_ for details. Contributing ************