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:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
@@ -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.
|
||||
"""
|
||||
|
||||
@@ -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.
|
||||
"""
|
||||
|
||||
@@ -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.
|
||||
"""
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
"""
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
19
cms/lib/spectacular.py
Normal 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
|
||||
@@ -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'),
|
||||
]
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user