add swagger for CMS API via drf-spectacular (#33282)

This adds two new urls: `<studio-base>/cms-api/ui` and `<studio-base>/cms-api/schema` with swagger ui and swaggerfile only for the new CMS API using drf-spectacular
This commit is contained in:
Jesper Hodge
2023-09-19 17:06:40 -04:00
committed by GitHub
parent 67140624ed
commit f197f9e61e
22 changed files with 184 additions and 98 deletions

View File

@@ -575,7 +575,7 @@ def _get_thumbnail_asset_key(asset, course_key):
# TODO: this method needs improvement. These view decorators should be at the top in an actual view method,
# but this is just a method called by the asset_handler. The asset_handler used by the public studio content API
# but this is just a method called by the asset_handler. The asset_handler used by the public CMS API
# just ignores all of this stuff.
@require_http_methods(('DELETE', 'POST', 'PUT'))
@login_required

View File

@@ -0,0 +1,15 @@
"""
API Serializers for xblocks
"""
# TODO: implement and use serializer
# from rest_framework import serializers
# class XblockSerializer(serializers.Serializer):
# """Serializer for xblocks"""
# id=serializers.CharField(required=False)
# display_name=serializers.CharField(required=False)
# category=serializers.CharField(required=False)
# data=serializers.CharField(required=False)
# metadata=serializers.DictField(required=False)

View File

@@ -1,5 +1,5 @@
"""
Public rest API endpoints for the Studio Content API Assets.
Public rest API endpoints for the CMS API Assets.
"""
import logging
from rest_framework.generics import RetrieveUpdateDestroyAPIView, CreateAPIView
@@ -21,7 +21,7 @@ toggles = contentstore_toggles
@view_auth_classes()
class AssetsView(DeveloperErrorViewMixin, RetrieveUpdateDestroyAPIView, CreateAPIView):
"""
public rest API endpoints for the Studio Content API Assets.
public rest API endpoints for the CMS API Assets.
course_key: required argument, needed to authorize course authors and identify the asset.
asset_key_string: required argument, needed to identify the asset.
"""

View File

@@ -1,7 +1,7 @@
"""
Tests for the xblock view of the Studio Content API. This tests only the view itself,
Tests for the xblock view of the CMS API. This tests only the view itself,
not the underlying Xblock service.
It checks that the assets_handler method of the Xblock service is called with the expected parameters.
"""

View File

@@ -1,5 +1,5 @@
"""
Tests for the xblock view of the Studio Content API. This tests only the view itself,
Tests for the xblock view of the CMS API. This tests only the view itself,
not the underlying Xblock service.
It checks that the xblock_handler method of the Xblock service is called with the expected parameters.
"""

View File

@@ -1,5 +1,5 @@
"""
Public rest API endpoints for the Studio Content API video assets.
Public rest API endpoints for the CMS API video assets.
"""
import logging
from rest_framework.generics import (
@@ -29,7 +29,7 @@ toggles = contentstore_toggles
@view_auth_classes()
class TranscriptView(DeveloperErrorViewMixin, CreateAPIView, RetrieveAPIView, DestroyAPIView):
"""
public rest API endpoints for the Studio Content API video transcripts.
public rest API endpoints for the CMS API video transcripts.
course_key: required argument, needed to authorize course authors and identify the video.
edx_video_id: optional query parameter, needed to identify the transcript.
language_code: optional query parameter, needed to identify the transcript.

View File

@@ -1,5 +1,5 @@
"""
Public rest API endpoints for the Studio Content API video assets.
Public rest API endpoints for the CMS API video assets.
"""
import logging
from rest_framework.generics import (
@@ -31,7 +31,7 @@ toggles = contentstore_toggles
@view_auth_classes()
class VideosView(DeveloperErrorViewMixin, CreateAPIView, RetrieveAPIView, DestroyAPIView):
"""
public rest API endpoints for the Studio Content API video assets.
public rest API endpoints for the CMS API video assets.
course_key: required argument, needed to authorize course authors and identify the video.
video_id: required argument, needed to identify the video.
"""

View File

@@ -1,5 +1,5 @@
"""
Public rest API endpoints for the Studio Content API.
Public rest API endpoints for the CMS API.
"""
import logging
from rest_framework.generics import RetrieveUpdateDestroyAPIView, CreateAPIView
@@ -9,11 +9,13 @@ from django.http import Http404
from openedx.core.lib.api.view_utils import DeveloperErrorViewMixin, view_auth_classes
from common.djangoapps.util.json_request import expect_json_in_class_view
from ....api import course_author_access_required
from cms.djangoapps.contentstore.api import course_author_access_required
from cms.djangoapps.contentstore.xblock_storage_handlers import view_handlers
import cms.djangoapps.contentstore.toggles as contentstore_toggles
# from cms.djangoapps.contentstore.rest_api.v1.serializers import XblockSerializer
log = logging.getLogger(__name__)
toggles = contentstore_toggles
handle_xblock = view_handlers.handle_xblock
@@ -22,11 +24,13 @@ handle_xblock = view_handlers.handle_xblock
@view_auth_classes()
class XblockView(DeveloperErrorViewMixin, RetrieveUpdateDestroyAPIView, CreateAPIView):
"""
Public rest API endpoints for the Studio Content API.
Public rest API endpoints for the CMS API.
course_key: required argument, needed to authorize course authors.
usage_key_string (optional):
xblock identifier, for example in the form of "block-v1:<course id>+type@<type>+block@<block id>"
"""
# TODO: uncomment next line after XblockSerializer is implemented
# serializer_class = XblockSerializer
def dispatch(self, request, *args, **kwargs):
# TODO: probably want to refactor this to a decorator.

View File

@@ -175,7 +175,7 @@ def handle_xblock(request, usage_key_string=None):
"""
Service method with all business logic for handling xblock requests.
This method is used both by the internal xblock_handler API and by
the public studio content API.
the public CMS API.
"""
if usage_key_string:
usage_key = usage_key_with_run(usage_key_string)

View File

@@ -1791,6 +1791,9 @@ INSTALLED_APPS = [
# Blockstore
'blockstore.apps.bundles',
# alternative swagger generator for CMS API
'drf_spectacular',
]
@@ -2771,3 +2774,16 @@ DISCUSSIONS_INCONTEXT_LEARNMORE_URL = ''
#### django-simple-history##
# disable indexing on date field its coming django-simple-history.
SIMPLE_HISTORY_DATE_INDEX = False
# This affects the CMS API swagger docs but not the legacy swagger docs under /api-docs/.
REST_FRAMEWORK['DEFAULT_SCHEMA_CLASS'] = 'drf_spectacular.openapi.AutoSchema'
# These fields override the spectacular settings default values.
# Any fields not included here will use the default values.
SPECTACULAR_SETTINGS = {
'TITLE': 'CMS API',
'DESCRIPTION': 'Experimental API to edit xblocks and course content. Danger: Do not use on running courses!',
'VERSION': '1.0.0',
'SERVE_INCLUDE_SCHEMA': False,
'PREPROCESSING_HOOKS': ['cms.lib.spectacular.cms_api_filter'], # restrict spectacular to CMS API endpoints
}

19
cms/lib/spectacular.py Normal file
View File

@@ -0,0 +1,19 @@
""" Helper functions for drf-spectacular """
def cms_api_filter(endpoints):
"""
At the moment, we are only enabling drf-spectacular for the CMS API.
Filter out endpoints that are not part of the CMS API.
"""
filtered = []
for (path, path_regex, method, callback) in endpoints:
# Add only paths to the list that are part of the CMS API
if (
path.startswith("/api/contentstore/v1/xblock") or
path.startswith("/api/contentstore/v1/videos") or
path.startswith("/api/contentstore/v1/video_transcripts") or
path.startswith("/api/contentstore/v1/file_assets")
):
filtered.append((path, path_regex, method, callback))
return filtered

View File

@@ -8,9 +8,10 @@ from django.contrib.admin import autodiscover as django_autodiscover
from django.urls import include
from django.urls import path, re_path
from django.utils.translation import gettext_lazy as _
from django.contrib import admin
from drf_spectacular.views import SpectacularAPIView, SpectacularSwaggerView
from auth_backends.urls import oauth2_urlpatterns
from edx_api_doc_tools import make_docs_urls
from django.contrib import admin
import openedx.core.djangoapps.common_views.xblock
import openedx.core.djangoapps.debug.views
@@ -340,3 +341,9 @@ urlpatterns += [
urlpatterns += [
path('api/content_tagging/', include(('openedx.features.content_tagging.urls'))),
]
# studio-content-api specific API docs (using drf-spectacular and openapi-v3)
urlpatterns += [
re_path('^cms-api/ui/', SpectacularSwaggerView.as_view(url_name='schema'), name='swagger-ui'),
re_path('^cms-api/schema/', SpectacularAPIView.as_view(), name='schema'),
]

View File

@@ -14,7 +14,7 @@ click==8.1.6
# nltk
codejail-includes==1.0.0
# via -r requirements/edx-sandbox/py38.in
contourpy==1.1.0
contourpy==1.1.1
# via matplotlib
cryptography==38.0.4
# via
@@ -38,7 +38,7 @@ markupsafe==2.1.3
# via
# chem
# openedx-calc
matplotlib==3.7.2
matplotlib==3.7.3
# via -r requirements/edx-sandbox/py38.in
mpmath==1.3.0
# via sympy
@@ -65,7 +65,7 @@ pillow==9.5.0
# matplotlib
pycparser==2.21
# via cffi
pyparsing==3.0.9
pyparsing==3.1.1
# via
# -r requirements/edx-sandbox/py38.in
# chem
@@ -94,5 +94,5 @@ sympy==1.12
# openedx-calc
tqdm==4.66.1
# via nltk
zipp==3.16.2
zipp==3.17.0
# via importlib-resources

View File

@@ -209,6 +209,7 @@ django==3.2.21
# done-xblock
# drf-jwt
# drf-nested-routers
# drf-spectacular
# drf-yasg
# edx-ace
# edx-api-doc-tools
@@ -252,7 +253,7 @@ django==3.2.21
# xss-utils
django-appconf==1.0.5
# via django-statici18n
django-cache-memoize==0.1.10
django-cache-memoize==0.2.0
# via edx-enterprise
django-celery-results==2.5.1
# via -r requirements/edx/kernel.in
@@ -283,7 +284,7 @@ django-environ==0.11.2
# via openedx-blockstore
django-fernet-fields-v2==0.9
# via edx-enterprise
django-filter==23.2
django-filter==23.3
# via
# -r requirements/edx/kernel.in
# edx-enterprise
@@ -341,7 +342,7 @@ django-sekizai==4.1.0
# openedx-django-wiki
django-ses==3.5.0
# via -r requirements/edx/bundled.in
django-simple-history==3.3.0
django-simple-history==3.4.0
# via
# -r requirements/edx/kernel.in
# edx-enterprise
@@ -385,6 +386,7 @@ djangorestframework==3.14.0
# django-user-tasks
# drf-jwt
# drf-nested-routers
# drf-spectacular
# drf-yasg
# edx-api-doc-tools
# edx-completion
@@ -410,6 +412,8 @@ drf-jwt==1.19.2
# via edx-drf-extensions
drf-nested-routers==0.93.4
# via openedx-blockstore
drf-spectacular==0.26.4
# via -r requirements/edx/kernel.in
drf-yasg==1.21.5
# via
# -c requirements/edx/../constraints.txt
@@ -470,7 +474,7 @@ edx-django-utils==5.7.0
# openedx-blockstore
# ora2
# super-csv
edx-drf-extensions==8.9.2
edx-drf-extensions==8.10.0
# via
# -r requirements/edx/kernel.in
# edx-completion
@@ -570,7 +574,7 @@ event-tracking==2.2.0
# edx-search
fastavro==1.8.3
# via openedx-events
filelock==3.12.3
filelock==3.12.4
# via snowflake-connector-python
frozenlist==1.4.0
# via
@@ -600,7 +604,7 @@ html5lib==1.1
# via
# -r requirements/edx/kernel.in
# ora2
icalendar==5.0.7
icalendar==5.0.8
# via -r requirements/edx/kernel.in
idna==3.4
# via
@@ -616,7 +620,9 @@ importlib-resources==6.0.1
# jsonschema
# jsonschema-specifications
inflection==0.5.1
# via drf-yasg
# via
# drf-spectacular
# drf-yasg
interchange==2021.0.4
# via py2neo
ipaddress==1.0.23
@@ -647,7 +653,9 @@ jsonfield==3.1.0
# lti-consumer-xblock
# ora2
jsonschema==4.19.0
# via optimizely-sdk
# via
# drf-spectacular
# optimizely-sdk
jsonschema-specifications==2023.7.1
# via jsonschema
jwcrypto==1.5.0
@@ -658,7 +666,7 @@ kombu==5.3.2
# via celery
laboratory==1.0.2
# via -r requirements/edx/kernel.in
lazy==1.5
lazy==1.6
# via
# -r requirements/edx/paver.txt
# acid-xblock
@@ -849,7 +857,7 @@ pycountry==22.3.5
# via -r requirements/edx/kernel.in
pycparser==2.21
# via cffi
pycryptodomex==3.18.0
pycryptodomex==3.19.0
# via
# -r requirements/edx/kernel.in
# edx-proctoring
@@ -917,7 +925,6 @@ python-dateutil==2.8.2
# botocore
# celery
# edx-ace
# edx-drf-extensions
# edx-enterprise
# edx-proctoring
# icalendar
@@ -965,6 +972,7 @@ pyyaml==6.0.1
# via
# -r requirements/edx/kernel.in
# code-annotations
# drf-spectacular
# edx-django-release-util
# edx-i18n-tools
# xblock
@@ -1009,7 +1017,7 @@ requests-oauthlib==1.3.1
# via
# -r requirements/edx/kernel.in
# social-auth-core
rpds-py==0.10.2
rpds-py==0.10.3
# via
# jsonschema
# referencing
@@ -1057,7 +1065,6 @@ six==1.16.0
# edx-ccx-keys
# edx-codejail
# edx-django-release-util
# edx-drf-extensions
# edx-milestones
# edx-rbac
# event-tracking
@@ -1122,7 +1129,7 @@ super-csv==3.1.0
# via edx-bulk-grades
sympy==1.12
# via openedx-calc
testfixtures==7.1.0
testfixtures==7.2.0
# via edx-enterprise
text-unidecode==1.3
# via python-slugify
@@ -1134,13 +1141,12 @@ tqdm==4.66.1
# via
# nltk
# openai
typing-extensions==4.7.1
typing-extensions==4.8.0
# via
# -r requirements/edx/paver.txt
# asgiref
# django-countries
# edx-opaque-keys
# filelock
# kombu
# pylti1p3
# snowflake-connector-python
@@ -1155,6 +1161,7 @@ unicodecsv==0.14.1
uritemplate==4.1.1
# via
# coreapi
# drf-spectacular
# drf-yasg
urllib3==1.26.16
# via
@@ -1236,7 +1243,7 @@ xss-utils==0.5.0
# via -r requirements/edx/kernel.in
yarl==1.9.2
# via aiohttp
zipp==3.16.2
zipp==3.17.0
# via
# importlib-metadata
# importlib-resources

View File

@@ -370,6 +370,7 @@ django==3.2.21
# done-xblock
# drf-jwt
# drf-nested-routers
# drf-spectacular
# drf-yasg
# edx-ace
# edx-api-doc-tools
@@ -416,7 +417,7 @@ django-appconf==1.0.5
# -r requirements/edx/doc.txt
# -r requirements/edx/testing.txt
# django-statici18n
django-cache-memoize==0.1.10
django-cache-memoize==0.2.0
# via
# -r requirements/edx/doc.txt
# -r requirements/edx/testing.txt
@@ -468,7 +469,7 @@ django-fernet-fields-v2==0.9
# -r requirements/edx/doc.txt
# -r requirements/edx/testing.txt
# edx-enterprise
django-filter==23.2
django-filter==23.3
# via
# -r requirements/edx/doc.txt
# -r requirements/edx/testing.txt
@@ -551,7 +552,7 @@ django-ses==3.5.0
# via
# -r requirements/edx/doc.txt
# -r requirements/edx/testing.txt
django-simple-history==3.3.0
django-simple-history==3.4.0
# via
# -r requirements/edx/doc.txt
# -r requirements/edx/testing.txt
@@ -612,6 +613,7 @@ djangorestframework==3.14.0
# django-user-tasks
# drf-jwt
# drf-nested-routers
# drf-spectacular
# drf-yasg
# edx-api-doc-tools
# edx-completion
@@ -657,6 +659,10 @@ drf-nested-routers==0.93.4
# -r requirements/edx/doc.txt
# -r requirements/edx/testing.txt
# openedx-blockstore
drf-spectacular==0.26.4
# via
# -r requirements/edx/doc.txt
# -r requirements/edx/testing.txt
drf-yasg==1.21.5
# via
# -c requirements/edx/../constraints.txt
@@ -735,7 +741,7 @@ edx-django-utils==5.7.0
# openedx-blockstore
# ora2
# super-csv
edx-drf-extensions==8.9.2
edx-drf-extensions==8.10.0
# via
# -r requirements/edx/doc.txt
# -r requirements/edx/testing.txt
@@ -903,7 +909,7 @@ fastavro==1.8.3
# -r requirements/edx/doc.txt
# -r requirements/edx/testing.txt
# openedx-events
filelock==3.12.3
filelock==3.12.4
# via
# -r requirements/edx/doc.txt
# -r requirements/edx/testing.txt
@@ -943,7 +949,7 @@ gitdb==4.0.10
# via
# -r requirements/edx/doc.txt
# gitpython
gitpython==3.1.35
gitpython==3.1.36
# via -r requirements/edx/doc.txt
glob2==0.7
# via
@@ -981,7 +987,7 @@ httpx==0.23.3
# via
# -r requirements/edx/testing.txt
# pact-python
icalendar==5.0.7
icalendar==5.0.8
# via
# -r requirements/edx/doc.txt
# -r requirements/edx/testing.txt
@@ -1020,6 +1026,7 @@ inflection==0.5.1
# via
# -r requirements/edx/doc.txt
# -r requirements/edx/testing.txt
# drf-spectacular
# drf-yasg
iniconfig==2.0.0
# via
@@ -1086,6 +1093,7 @@ jsonschema==4.19.0
# via
# -r requirements/edx/doc.txt
# -r requirements/edx/testing.txt
# drf-spectacular
# optimizely-sdk
# sphinxcontrib-openapi
jsonschema-specifications==2023.7.1
@@ -1108,7 +1116,7 @@ laboratory==1.0.2
# via
# -r requirements/edx/doc.txt
# -r requirements/edx/testing.txt
lazy==1.5
lazy==1.6
# via
# -r requirements/edx/doc.txt
# -r requirements/edx/testing.txt
@@ -1461,7 +1469,7 @@ pycparser==2.21
# -r requirements/edx/doc.txt
# -r requirements/edx/testing.txt
# cffi
pycryptodomex==3.18.0
pycryptodomex==3.19.0
# via
# -r requirements/edx/doc.txt
# -r requirements/edx/testing.txt
@@ -1477,7 +1485,7 @@ pydantic-core==2.6.3
# via
# -r requirements/edx/testing.txt
# pydantic
pydata-sphinx-theme==0.13.3
pydata-sphinx-theme==0.14.0
# via
# -r requirements/edx/doc.txt
# sphinx-book-theme
@@ -1628,7 +1636,6 @@ python-dateutil==2.8.2
# botocore
# celery
# edx-ace
# edx-drf-extensions
# edx-enterprise
# edx-proctoring
# faker
@@ -1695,6 +1702,7 @@ pyyaml==6.0.1
# -r requirements/edx/doc.txt
# -r requirements/edx/testing.txt
# code-annotations
# drf-spectacular
# edx-django-release-util
# edx-i18n-tools
# sphinxcontrib-openapi
@@ -1759,7 +1767,7 @@ rfc3986[idna2008]==1.5.0
# via
# -r requirements/edx/testing.txt
# httpx
rpds-py==0.10.2
rpds-py==0.10.3
# via
# -r requirements/edx/doc.txt
# -r requirements/edx/testing.txt
@@ -1837,7 +1845,6 @@ six==1.16.0
# edx-ccx-keys
# edx-codejail
# edx-django-release-util
# edx-drf-extensions
# edx-lint
# edx-milestones
# edx-rbac
@@ -1865,7 +1872,7 @@ slumber==0.7.1
# edx-bulk-grades
# edx-enterprise
# edx-rest-api-client
smmap==5.0.0
smmap==5.0.1
# via
# -r requirements/edx/doc.txt
# gitdb
@@ -1998,7 +2005,7 @@ sympy==1.12
# -r requirements/edx/doc.txt
# -r requirements/edx/testing.txt
# openedx-calc
testfixtures==7.1.0
testfixtures==7.2.0
# via
# -r requirements/edx/doc.txt
# -r requirements/edx/testing.txt
@@ -2048,7 +2055,7 @@ tqdm==4.66.1
# -r requirements/edx/testing.txt
# nltk
# openai
types-pytz==2023.3.0.1
types-pytz==2023.3.1.0
# via django-stubs
types-pyyaml==6.0.12.11
# via
@@ -2058,7 +2065,7 @@ types-requests==2.31.0.2
# via djangorestframework-stubs
types-urllib3==1.26.25.14
# via types-requests
typing-extensions==4.7.1
typing-extensions==4.8.0
# via
# -r requirements/edx/doc.txt
# -r requirements/edx/testing.txt
@@ -2072,7 +2079,6 @@ typing-extensions==4.7.1
# edx-opaque-keys
# faker
# fastapi
# filelock
# grimp
# import-linter
# kombu
@@ -2103,6 +2109,7 @@ uritemplate==4.1.1
# -r requirements/edx/doc.txt
# -r requirements/edx/testing.txt
# coreapi
# drf-spectacular
# drf-yasg
urllib3==1.26.16
# via
@@ -2239,7 +2246,7 @@ yarl==1.9.2
# -r requirements/edx/doc.txt
# -r requirements/edx/testing.txt
# aiohttp
zipp==3.16.2
zipp==3.17.0
# via
# -r requirements/edx/../pip-tools.txt
# -r requirements/edx/doc.txt

View File

@@ -256,6 +256,7 @@ django==3.2.21
# done-xblock
# drf-jwt
# drf-nested-routers
# drf-spectacular
# drf-yasg
# edx-ace
# edx-api-doc-tools
@@ -301,7 +302,7 @@ django-appconf==1.0.5
# via
# -r requirements/edx/base.txt
# django-statici18n
django-cache-memoize==0.1.10
django-cache-memoize==0.2.0
# via
# -r requirements/edx/base.txt
# edx-enterprise
@@ -340,7 +341,7 @@ django-fernet-fields-v2==0.9
# via
# -r requirements/edx/base.txt
# edx-enterprise
django-filter==23.2
django-filter==23.3
# via
# -r requirements/edx/base.txt
# edx-enterprise
@@ -404,7 +405,7 @@ django-sekizai==4.1.0
# openedx-django-wiki
django-ses==3.5.0
# via -r requirements/edx/base.txt
django-simple-history==3.3.0
django-simple-history==3.4.0
# via
# -r requirements/edx/base.txt
# edx-enterprise
@@ -448,6 +449,7 @@ djangorestframework==3.14.0
# django-user-tasks
# drf-jwt
# drf-nested-routers
# drf-spectacular
# drf-yasg
# edx-api-doc-tools
# edx-completion
@@ -483,6 +485,8 @@ drf-nested-routers==0.93.4
# via
# -r requirements/edx/base.txt
# openedx-blockstore
drf-spectacular==0.26.4
# via -r requirements/edx/base.txt
drf-yasg==1.21.5
# via
# -c requirements/edx/../constraints.txt
@@ -544,7 +548,7 @@ edx-django-utils==5.7.0
# openedx-blockstore
# ora2
# super-csv
edx-drf-extensions==8.9.2
edx-drf-extensions==8.10.0
# via
# -r requirements/edx/base.txt
# edx-completion
@@ -654,7 +658,7 @@ fastavro==1.8.3
# via
# -r requirements/edx/base.txt
# openedx-events
filelock==3.12.3
filelock==3.12.4
# via
# -r requirements/edx/base.txt
# snowflake-connector-python
@@ -681,7 +685,7 @@ geoip2==4.7.0
# via -r requirements/edx/base.txt
gitdb==4.0.10
# via gitpython
gitpython==3.1.35
gitpython==3.1.36
# via -r requirements/edx/doc.in
glob2==0.7
# via -r requirements/edx/base.txt
@@ -693,7 +697,7 @@ html5lib==1.1
# via
# -r requirements/edx/base.txt
# ora2
icalendar==5.0.7
icalendar==5.0.8
# via -r requirements/edx/base.txt
idna==3.4
# via
@@ -717,6 +721,7 @@ importlib-resources==6.0.1
inflection==0.5.1
# via
# -r requirements/edx/base.txt
# drf-spectacular
# drf-yasg
interchange==2021.0.4
# via
@@ -763,6 +768,7 @@ jsonfield==3.1.0
jsonschema==4.19.0
# via
# -r requirements/edx/base.txt
# drf-spectacular
# optimizely-sdk
# sphinxcontrib-openapi
jsonschema-specifications==2023.7.1
@@ -780,7 +786,7 @@ kombu==5.3.2
# celery
laboratory==1.0.2
# via -r requirements/edx/base.txt
lazy==1.5
lazy==1.6
# via
# -r requirements/edx/base.txt
# acid-xblock
@@ -1012,14 +1018,14 @@ pycparser==2.21
# via
# -r requirements/edx/base.txt
# cffi
pycryptodomex==3.18.0
pycryptodomex==3.19.0
# via
# -r requirements/edx/base.txt
# edx-proctoring
# lti-consumer-xblock
# pyjwkest
# snowflake-connector-python
pydata-sphinx-theme==0.13.3
pydata-sphinx-theme==0.14.0
# via sphinx-book-theme
pygments==2.16.1
# via
@@ -1093,7 +1099,6 @@ python-dateutil==2.8.2
# botocore
# celery
# edx-ace
# edx-drf-extensions
# edx-enterprise
# edx-proctoring
# icalendar
@@ -1145,6 +1150,7 @@ pyyaml==6.0.1
# via
# -r requirements/edx/base.txt
# code-annotations
# drf-spectacular
# edx-django-release-util
# edx-i18n-tools
# sphinxcontrib-openapi
@@ -1194,7 +1200,7 @@ requests-oauthlib==1.3.1
# via
# -r requirements/edx/base.txt
# social-auth-core
rpds-py==0.10.2
rpds-py==0.10.3
# via
# -r requirements/edx/base.txt
# jsonschema
@@ -1253,7 +1259,6 @@ six==1.16.0
# edx-ccx-keys
# edx-codejail
# edx-django-release-util
# edx-drf-extensions
# edx-milestones
# edx-rbac
# event-tracking
@@ -1277,7 +1282,7 @@ slumber==0.7.1
# edx-bulk-grades
# edx-enterprise
# edx-rest-api-client
smmap==5.0.0
smmap==5.0.1
# via gitdb
snowballstemmer==2.2.0
# via sphinx
@@ -1367,7 +1372,7 @@ sympy==1.12
# via
# -r requirements/edx/base.txt
# openedx-calc
testfixtures==7.1.0
testfixtures==7.2.0
# via
# -r requirements/edx/base.txt
# edx-enterprise
@@ -1388,13 +1393,12 @@ tqdm==4.66.1
# -r requirements/edx/base.txt
# nltk
# openai
typing-extensions==4.7.1
typing-extensions==4.8.0
# via
# -r requirements/edx/base.txt
# asgiref
# django-countries
# edx-opaque-keys
# filelock
# kombu
# pydata-sphinx-theme
# pylti1p3
@@ -1412,6 +1416,7 @@ uritemplate==4.1.1
# via
# -r requirements/edx/base.txt
# coreapi
# drf-spectacular
# drf-yasg
urllib3==1.26.16
# via
@@ -1505,7 +1510,7 @@ yarl==1.9.2
# via
# -r requirements/edx/base.txt
# aiohttp
zipp==3.16.2
zipp==3.17.0
# via
# -r requirements/edx/base.txt
# importlib-metadata

View File

@@ -58,6 +58,7 @@ django-user-tasks
django-waffle
django-webpack-loader # Used to wire webpack bundles into the django asset pipeline
djangorestframework
drf-spectacular
edx-ace
edx-api-doc-tools
edx-auth-backends # Allow Studio to use LMS SSO

View File

@@ -14,7 +14,7 @@ edx-opaque-keys==2.5.0
# via -r requirements/edx/paver.in
idna==3.4
# via requests
lazy==1.5
lazy==1.6
# via -r requirements/edx/paver.in
libsass==0.10.0
# via
@@ -52,7 +52,7 @@ stevedore==5.1.0
# via
# -r requirements/edx/paver.in
# edx-opaque-keys
typing-extensions==4.7.1
typing-extensions==4.8.0
# via edx-opaque-keys
urllib3==1.26.16
# via

View File

@@ -15,7 +15,7 @@ boltons==21.0.0
# face
# glom
# semgrep
bracex==2.3.post1
bracex==2.4
# via wcmatch
certifi==2023.7.22
# via requests
@@ -68,9 +68,9 @@ referencing==0.30.2
# jsonschema-specifications
requests==2.31.0
# via semgrep
rich==13.5.2
rich==13.5.3
# via semgrep
rpds-py==0.10.0
rpds-py==0.10.3
# via
# jsonschema
# referencing
@@ -78,11 +78,11 @@ ruamel-yaml==0.17.32
# via semgrep
ruamel-yaml-clib==0.2.7
# via ruamel-yaml
semgrep==1.38.0
semgrep==1.41.0
# via -r requirements/edx/semgrep.in
tomli==2.0.1
# via semgrep
typing-extensions==4.7.1
typing-extensions==4.8.0
# via
# rich
# semgrep
@@ -95,5 +95,5 @@ urllib3==1.26.16
# semgrep
wcmatch==8.5
# via semgrep
zipp==3.16.2
zipp==3.17.0
# via importlib-resources

View File

@@ -289,6 +289,7 @@ django==3.2.21
# done-xblock
# drf-jwt
# drf-nested-routers
# drf-spectacular
# drf-yasg
# edx-ace
# edx-api-doc-tools
@@ -334,7 +335,7 @@ django-appconf==1.0.5
# via
# -r requirements/edx/base.txt
# django-statici18n
django-cache-memoize==0.1.10
django-cache-memoize==0.2.0
# via
# -r requirements/edx/base.txt
# edx-enterprise
@@ -373,7 +374,7 @@ django-fernet-fields-v2==0.9
# via
# -r requirements/edx/base.txt
# edx-enterprise
django-filter==23.2
django-filter==23.3
# via
# -r requirements/edx/base.txt
# edx-enterprise
@@ -437,7 +438,7 @@ django-sekizai==4.1.0
# openedx-django-wiki
django-ses==3.5.0
# via -r requirements/edx/base.txt
django-simple-history==3.3.0
django-simple-history==3.4.0
# via
# -r requirements/edx/base.txt
# edx-enterprise
@@ -481,6 +482,7 @@ djangorestframework==3.14.0
# django-user-tasks
# drf-jwt
# drf-nested-routers
# drf-spectacular
# drf-yasg
# edx-api-doc-tools
# edx-completion
@@ -513,6 +515,8 @@ drf-nested-routers==0.93.4
# via
# -r requirements/edx/base.txt
# openedx-blockstore
drf-spectacular==0.26.4
# via -r requirements/edx/base.txt
drf-yasg==1.21.5
# via
# -c requirements/edx/../constraints.txt
@@ -574,7 +578,7 @@ edx-django-utils==5.7.0
# openedx-blockstore
# ora2
# super-csv
edx-drf-extensions==8.9.2
edx-drf-extensions==8.10.0
# via
# -r requirements/edx/base.txt
# edx-completion
@@ -699,7 +703,7 @@ fastavro==1.8.3
# via
# -r requirements/edx/base.txt
# openedx-events
filelock==3.12.3
filelock==3.12.4
# via
# -r requirements/edx/base.txt
# snowflake-connector-python
@@ -750,7 +754,7 @@ httpretty==1.1.4
# via -r requirements/edx/testing.in
httpx==0.23.3
# via pact-python
icalendar==5.0.7
icalendar==5.0.8
# via -r requirements/edx/base.txt
idna==3.4
# via
@@ -776,6 +780,7 @@ importlib-resources==6.0.1
inflection==0.5.1
# via
# -r requirements/edx/base.txt
# drf-spectacular
# drf-yasg
iniconfig==2.0.0
# via pytest
@@ -829,6 +834,7 @@ jsonfield==3.1.0
jsonschema==4.19.0
# via
# -r requirements/edx/base.txt
# drf-spectacular
# optimizely-sdk
jsonschema-specifications==2023.7.1
# via
@@ -845,7 +851,7 @@ kombu==5.3.2
# celery
laboratory==1.0.2
# via -r requirements/edx/base.txt
lazy==1.5
lazy==1.6
# via
# -r requirements/edx/base.txt
# acid-xblock
@@ -1099,7 +1105,7 @@ pycparser==2.21
# via
# -r requirements/edx/base.txt
# cffi
pycryptodomex==3.18.0
pycryptodomex==3.19.0
# via
# -r requirements/edx/base.txt
# edx-proctoring
@@ -1227,7 +1233,6 @@ python-dateutil==2.8.2
# botocore
# celery
# edx-ace
# edx-drf-extensions
# edx-enterprise
# edx-proctoring
# faker
@@ -1281,6 +1286,7 @@ pyyaml==6.0.1
# via
# -r requirements/edx/base.txt
# code-annotations
# drf-spectacular
# edx-django-release-util
# edx-i18n-tools
# xblock
@@ -1331,7 +1337,7 @@ requests-oauthlib==1.3.1
# social-auth-core
rfc3986[idna2008]==1.5.0
# via httpx
rpds-py==0.10.2
rpds-py==0.10.3
# via
# -r requirements/edx/base.txt
# jsonschema
@@ -1396,7 +1402,6 @@ six==1.16.0
# edx-ccx-keys
# edx-codejail
# edx-django-release-util
# edx-drf-extensions
# edx-lint
# edx-milestones
# edx-rbac
@@ -1479,7 +1484,7 @@ sympy==1.12
# via
# -r requirements/edx/base.txt
# openedx-calc
testfixtures==7.1.0
testfixtures==7.2.0
# via
# -r requirements/edx/base.txt
# -r requirements/edx/testing.in
@@ -1516,7 +1521,7 @@ tqdm==4.66.1
# -r requirements/edx/base.txt
# nltk
# openai
typing-extensions==4.7.1
typing-extensions==4.8.0
# via
# -r requirements/edx/base.txt
# annotated-types
@@ -1526,7 +1531,6 @@ typing-extensions==4.7.1
# edx-opaque-keys
# faker
# fastapi
# filelock
# grimp
# import-linter
# kombu
@@ -1552,6 +1556,7 @@ uritemplate==4.1.1
# via
# -r requirements/edx/base.txt
# coreapi
# drf-spectacular
# drf-yasg
urllib3==1.26.16
# via
@@ -1652,7 +1657,7 @@ yarl==1.9.2
# via
# -r requirements/edx/base.txt
# aiohttp
zipp==3.16.2
zipp==3.17.0
# via
# -r requirements/edx/base.txt
# importlib-metadata

View File

@@ -25,7 +25,7 @@ tomli==2.0.1
# pyproject-hooks
wheel==0.41.2
# via pip-tools
zipp==3.16.2
zipp==3.17.0
# via importlib-metadata
# The following packages are considered to be unsafe in a requirements file:

View File

@@ -10,5 +10,5 @@ wheel==0.41.2
# The following packages are considered to be unsafe in a requirements file:
pip==23.2.1
# via -r requirements/pip.in
setuptools==68.2.1
setuptools==68.2.2
# via -r requirements/pip.in