diff --git a/Makefile b/Makefile index 92d761a8da..2300b278e3 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,6 @@ # Do things in edx-platform -.PHONY: clean docs extract_translations help pull pull_translations push_translations requirements shell upgrade +.PHONY: clean extract_translations help pull pull_translations push_translations requirements shell upgrade +.PHONY: api-docs docs guides swagger # Careful with mktemp syntax: it has to work on Mac and Ubuntu, which have differences. PRIVATE_FILES := $(shell mktemp -u /tmp/private_files.XXXXXX) @@ -18,7 +19,19 @@ clean: ## archive and delete most git-ignored files tar xf $(PRIVATE_FILES) rm $(PRIVATE_FILES) -docs: ## build the developer documentation for this repository +SWAGGER = docs/swagger.yaml + +docs: api-docs guides ## build all the developer documentation for this repository + +swagger: ## generate the swagger.yaml file + DJANGO_SETTINGS_MODULE=docs.docs_settings python manage.py lms generate_swagger --generator-class=openedx.core.openapi.ApiSchemaGenerator -o $(SWAGGER) + +api-docs: swagger ## build the REST api docs + rm -f docs/api/gen/* + python docs/sw2md.py $(SWAGGER) docs/api/gen + cd docs/api; make html + +guides: ## build the developer guide docs cd docs/guides; make clean html extract_translations: ## extract localizable strings from sources diff --git a/docs/__init__.py b/docs/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/api/.gitignore b/docs/api/.gitignore new file mode 100644 index 0000000000..2b81fd4a0e --- /dev/null +++ b/docs/api/.gitignore @@ -0,0 +1,2 @@ +_build +gen diff --git a/docs/api/Makefile b/docs/api/Makefile new file mode 100644 index 0000000000..8fe8f3c739 --- /dev/null +++ b/docs/api/Makefile @@ -0,0 +1,19 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + $(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/api/__init__.py b/docs/api/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/api/conf.py b/docs/api/conf.py new file mode 100644 index 0000000000..b60c8f85ba --- /dev/null +++ b/docs/api/conf.py @@ -0,0 +1,190 @@ +# -*- coding: utf-8 -*- +# +# Configuration file for the Sphinx documentation builder. +# +# This file does only contain a selection of the most common options. For a +# full list see the documentation: +# http://www.sphinx-doc.org/en/master/config + +from __future__ import absolute_import, unicode_literals + +import os + +import edx_theme + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +# import os +# import sys +# sys.path.insert(0, os.path.abspath('.')) + + +# -- Project information ----------------------------------------------------- + +project = u'Open edX REST APIs' +copyright = edx_theme.COPYRIGHT +author = edx_theme.AUTHOR + +# The short X.Y version +version = u'' +# The full version, including alpha/beta/rc tags +release = u'' + + +# -- General configuration --------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +# +# needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'recommonmark', + 'sphinx.ext.autosectionlabel', +] + +# Prefix document path to section labels, otherwise autogenerated labels would look like 'heading' +# rather than 'path/to/file:heading' +autosectionlabel_prefix_document = True + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +source_suffix = ['.rst', '.md'] + +# The master toctree document. +master_doc = 'index' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = None + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = [u'_build', 'Thumbs.db', '.DS_Store'] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = None + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'edx_theme' + +html_theme_path = [edx_theme.get_html_theme_path()] + +html_theme_options = {'navigation_depth': 3} + +html_favicon = os.path.join(edx_theme.get_html_theme_path(), 'edx_theme', 'static', 'css', 'favicon.ico') + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +# html_theme_options = {} + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Custom sidebar templates, must be a dictionary that maps document names +# to template names. +# +# The default sidebars (for documents that don't match any pattern) are +# defined by theme itself. Builtin themes are using these templates by +# default: ``['localtoc.html', 'relations.html', 'sourcelink.html', +# 'searchbox.html']``. +# +# html_sidebars = {} + + +# -- Options for HTMLHelp output --------------------------------------------- + +# Output file base name for HTML help builder. +htmlhelp_basename = 'api-docsdoc' + + +# -- Options for LaTeX output ------------------------------------------------ + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'api-docs.tex', u'api-docs Documentation', + u'Nobody', 'manual'), +] + + +# -- Options for manual page output ------------------------------------------ + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'api-docs', u'api-docs Documentation', + [author], 1) +] + + +# -- Options for Texinfo output ---------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'api-docs', u'api-docs Documentation', + author, 'api-docs', 'One line description of project.', + 'Miscellaneous'), +] + + +# -- Options for Epub output ------------------------------------------------- + +# Bibliographic Dublin Core info. +epub_title = project + +# The unique identifier of the text. This can be a ISBN number +# or the project homepage. +# +# epub_identifier = '' + +# A unique identification for the text. +# +# epub_uid = '' + +# A list of files that should not be packed into the epub file. +epub_exclude_files = ['search.html'] diff --git a/docs/api/index.rst b/docs/api/index.rst new file mode 100644 index 0000000000..b87132225c --- /dev/null +++ b/docs/api/index.rst @@ -0,0 +1,14 @@ +################## +Open edX REST APIs +################## + +TODO: What should go here? + +See all the endpoints at :doc:`The Endpoints `. + +.. toctree:: + :glob: + :maxdepth: 1 + + gen/index + gen/* diff --git a/docs/guides/docs_settings.py b/docs/docs_settings.py similarity index 74% rename from docs/guides/docs_settings.py rename to docs/docs_settings.py index 9dfdec2cf0..db6834cd1d 100644 --- a/docs/guides/docs_settings.py +++ b/docs/docs_settings.py @@ -3,6 +3,7 @@ Django settings for use when generating API documentation. Basically the LMS devstack settings plus a few items needed to successfully import all the Studio code. """ + from __future__ import absolute_import, unicode_literals import os @@ -24,7 +25,14 @@ else: VIDEO_TRANSCRIPT_MIGRATIONS_JOB_QUEUE, ) -FEATURES['ENABLE_LTI_PROVIDER'] = True +# Turn on all the boolean feature flags, so that conditionally included +# API endpoints will be found. +for key, value in FEATURES.items(): + if value is False: + FEATURES[key] = True + +# Settings that will fail if we enable them, and we don't need them for docs anyway. +FEATURES['RUN_AS_ANALYTICS_SERVER_ENABLED'] = False INSTALLED_APPS.extend([ 'contentstore.apps.ContentstoreConfig', diff --git a/docs/guides/Makefile b/docs/guides/Makefile index ea9c33b5ec..1168ab7066 100644 --- a/docs/guides/Makefile +++ b/docs/guides/Makefile @@ -19,4 +19,4 @@ clean: # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + $(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/guides/conf.py b/docs/guides/conf.py index 57068f5a9b..ee85764e97 100644 --- a/docs/guides/conf.py +++ b/docs/guides/conf.py @@ -39,7 +39,7 @@ sys.path.append(root / "openedx/features") # without errors. If running sphinx-apidoc, we already set a different # settings module to use in the on_init() hook of the parent process if 'DJANGO_SETTINGS_MODULE' not in os.environ: - os.environ['DJANGO_SETTINGS_MODULE'] = 'docs_settings' + os.environ['DJANGO_SETTINGS_MODULE'] = 'docs.docs_settings' django.setup() diff --git a/docs/sw2md.py b/docs/sw2md.py new file mode 100644 index 0000000000..c263a6740c --- /dev/null +++ b/docs/sw2md.py @@ -0,0 +1,333 @@ +"""Generate Markdown documents from an OpenAPI swagger file.""" + +from __future__ import print_function + +import contextlib +import functools +import os +import os.path +import re +import sys + +import yaml + + +# JSON Reference helpers + +class JRefable(object): + """An object that can be indexed with JSON Pointers, and supports $ref.""" + def __init__(self, data, doc=None, ref=None): + self.data = data + self.doc = doc or data + self.ref = ref or '/' + self.name = None + + def __repr__(self): + return repr(self.data) + + def wrap(self, data, ref): + if isinstance(data, dict): + if '$ref' in data: + ref = data['$ref'] + ret = JRefableObject(self.doc)[ref] + ret.name = ref.split('/')[-1] + return ret + return JRefableObject(data, self.doc, ref) + if isinstance(data, list): + return JRefableArray(data, self.doc, ref) + return data + + +class JRefableObject(JRefable): + """Make a dictionary into a JSON Reference-capable object.""" + def __getitem__(self, jref): + if jref.startswith('#/'): + parts = jref[2:] + data = self.doc + ref = '/' + else: + parts = jref + data = self.data + ref = self.ref + for part in parts.split('/'): + try: + data = data[part] + except KeyError: + raise KeyError("{!r} not in {!r} then {!r}".format(part, self.ref, jref)) + ref = ref + part + '/' + return self.wrap(data, ref=ref) + + def get(self, key, default=None): + if key in self.data: + return self.wrap(self.data[key], self.ref + key + '/') + return default + + def keys(self): + return self.data.keys() + + def items(self): + for k, v in self.data.items(): + yield k, self.wrap(v, self.ref + k.replace('/', ':') + '/') + + def __contains__(self, val): + return val in self.data + + +class JRefableArray(JRefable): + """Make a list into a JSON Reference-capable array.""" + def __getitem__(self, index): + try: + data = self.data[index] + except IndexError: + raise IndexError("{!r} not in {!r}".format(index, self.ref)) + return self.wrap(data, self.ref + str(index) + '/') + + def __iter__(self): + for i, elt in enumerate(self.data): + yield self.wrap(elt, self.ref + str(i) + '/') + + +class OutputFiles(object): + """A context manager to manage a series of files. + + Use like this:: + + with OutputFiles() as outfiles: + ... + if some_condition(): + f = outfiles.open("filename.txt", "w") + + Each open will close the previously opened file, and the end of the with + statement will close the last one. + + """ + def __init__(self): + self.file = None + + def __enter__(self): + return self + + def __exit__(self, *args, **kwargs): + if self.file: + self.file.close() + return False + + def open(self, *args, **kwargs): + if self.file: + self.file.close() + self.file = open(*args, **kwargs) + return self.file + + +sluggers = [ + r"^.*?/v\d+/[\w_-]+", + r"^(/[\w_-]+){,3}", +] + +method_order = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options'] + + +def method_ordered_items(method_data): + keys = [k for k in method_order if k in method_data] + for key in keys: + yield key, method_data[key] + + +class MarkdownWriter(object): + """Help write markdown, managing indentation and header nesting.""" + + def __init__(self, outfile): + self.outfile = outfile + self.cur_indent = 0 + + def print(self, text='', increase_headers=0): + if increase_headers: + text = re.sub(r"^#", "#" * (increase_headers + 1), text, flags=re.MULTILINE) + if self.cur_indent: + text = re.sub(r"^", " " * self.cur_indent, text, flags=re.MULTILINE) + print(text, file=self.outfile) + + @contextlib.contextmanager + def indent(self, spaces): + old_indent = self.cur_indent + self.cur_indent += spaces + try: + yield + finally: + self.cur_indent = old_indent + + +def convert_swagger_to_markdown(swagger_data, output_dir): + """Convert a swagger.yaml file to a series of markdown documents.""" + sw = JRefableObject(swagger_data) + + if not os.path.exists(output_dir): + os.makedirs(output_dir) + + with open(os.path.join(output_dir, 'index.md'), 'w') as index: + indexmd = MarkdownWriter(index) + indexmd.print("# {}\n".format(sw['info/title'])) + indexmd.print(sw['info/description']) + indexmd.print() + + with OutputFiles() as outfiles: + slug = None + + for uri, methods in sorted(sw['paths'].items()): + for slugger in sluggers: + m = re.search(slugger, uri) + if m: + new_slug = m.group() + if new_slug != slug: + slug = new_slug + outfile = slug.strip('/').replace('/', '_') + '.md' + outf = outfiles.open(os.path.join(output_dir, outfile), 'w') + outmd = MarkdownWriter(outf) + outmd.print("# {}\n".format(slug)) + indexmd.print("## {}\n".format(slug)) + break + + common_params = methods.get('parameters', []) + for method, op_data in method_ordered_items(methods): + summary = '' + if 'summary' in op_data: + summary = " --- {}".format(op_data['summary']) + indexmd.print("[{} {}]({}){}\n".format(method.upper(), uri, outfile, summary)) + write_one_method(outmd, method, uri, op_data, common_params) + + +def write_one_method(outmd, method, uri, op_data, common_params): + """Write one entry (uri and method) to the markdown output.""" + outmd.print("\n## {} {}\n".format(method.upper(), uri)) + if 'summary' in op_data: + outmd.print(op_data['summary']) + outmd.print() + outmd.print(op_data['description'], increase_headers=2) + + params = list(op_data.get('parameters', [])) + params.extend(common_params) + if params: + outmd.print("\n### Parameters\n") + for param in params: + description = param.get('description', '').strip() + if description: + description = ": " + description + where = param['in'] + required = param.get('required', False) + required = "required" if required else "optional" + if where == 'body': + schema = param['schema'] + outmd.print("- **{}** (body, {}){}".format( + param['name'], + schema.name or schema['type'], + description, + )) + with outmd.indent(2): + write_schema(outmd, schema) + else: + outmd.print("- **{}** ({}, {}, {}){}".format( + param['name'], + where, + param['type'], + required, + description, + )) + + responses = op_data.get('responses', []) + if responses: + outmd.print("\n### Responses\n") + for status, response in sorted(responses.items()): + description = response.get('description', '').strip() + if description: + description = ": " + description + schema = response.get('schema') + if schema: + type_note = " ({})".format(type_name(schema)) + else: + type_note = "" + outmd.print("- **{}**{}{}".format( + status, + type_note, + description, + )) + if schema: + with outmd.indent(2): + write_schema(outmd, schema) + + +def type_name(schema): + """What is the short type name for `schema`?""" + if schema['type'] == 'object': + return schema.name or schema.get('type') or "object" + elif schema['type'] == 'array': + item_type = type_name(schema['items']) + return "array of " + item_type + else: + return schema['type'] + + +def write_schema(outmd, schema): + """Write a schema to the markdown output.""" + if schema['type'] == 'object': + required = set(schema.get('required', ())) + for prop_name, prop in sorted(schema['properties'].items()): + attrs = [] + type = type_name(prop) + if prop['type'] == 'array': + item_type = prop['items'] + else: + item_type = None + attrs.append(type) + if prop_name in required: + attrs.append("required") + else: + attrs.append("optional") + if 'format' in prop: + attrs.append("format {}".format(prop["format"])) + if 'pattern' in prop: + attrs.append("pattern `{}`".format(prop["pattern"])) + if 'minLength' in prop: + attrs.append("min length {}".format(prop["minLength"])) + if 'maxLength' in prop: + attrs.append("max length {}".format(prop["maxLength"])) + if 'minimum' in prop: + attrs.append("minimum {}".format(prop["minimum"])) + if 'maximum' in prop: + attrs.append("maximum {}".format(prop["maximum"])) + if prop.get('readOnly', False): + attrs.append("read only") + # TODO: enum + # TODO: x-nullable + + title = prop.get('title', '').strip() + if title: + title = ": " + title + description = prop.get('description', '').strip() + if description: + if title: + title = title + ". " + description + else: + title = ": " + description + + outmd.print("- **{name}** ({attrs}){title}".format( + name=prop_name, + attrs=", ".join(attrs), + title=title, + )) + if item_type and item_type['type'] in ['object', 'array']: + with outmd.indent(2): + write_schema(outmd, item_type) + elif schema['type'] == 'array': + write_schema(outmd, schema['items']) + else: + raise ValueError("Don't understand schema type {!r} at {}".format(schema['type'], schema.ref)) + + +def main(args): + with open(args[0]) as swyaml: + swagger_data = yaml.safe_load(swyaml) + convert_swagger_to_markdown(swagger_data, output_dir=args[1]) + + +if __name__ == '__main__': + sys.exit(main(sys.argv[1:])) diff --git a/docs/swagger.yaml b/docs/swagger.yaml new file mode 100755 index 0000000000..49939ec76b --- /dev/null +++ b/docs/swagger.yaml @@ -0,0 +1,5596 @@ +swagger: '2.0' +info: + title: Open edX API + description: APIs for access to Open edX information + contact: + email: oscm@edx.org + version: v1 +basePath: /api +consumes: + - application/json +produces: + - application/json +securityDefinitions: + Basic: + type: basic +security: + - Basic: [] +paths: + /badges/v1/assertions/user/{username}/: + get: + operationId: badges_v1_assertions_user_read + summary: '** Use cases **' + description: "Request a list of assertions for a user, optionally constrained\ + \ to a course.\n\n** Example Requests **\n\n GET /api/badges/v1/assertions/user/{username}/\n\ + \n** Response Values **\n\n Body comprised of a list of objects with the\ + \ following fields:\n\n * badge_class: The badge class the assertion was\ + \ awarded for. Represented as an object\n with the following fields:\n\ + \ * slug: The identifier for the badge class\n * issuing_component:\ + \ The software component responsible for issuing this badge.\n * display_name:\ + \ The display name of the badge.\n * course_id: The course key of the\ + \ course this badge is scoped to, or null if it isn't scoped to a course.\n\ + \ * description: A description of the award and its significance.\n\ + \ * criteria: A description of what is needed to obtain this award.\n\ + \ * image_url: A URL to the icon image used to represent this award.\n\ + \ * image_url: The baked assertion image derived from the badge_class icon--\ + \ contains metadata about the award\n in its headers.\n * assertion_url:\ + \ The URL to the OpenBadges BadgeAssertion object, for verification by compatible\ + \ tools\n and software.\n\n** Params **\n\n * slug (optional): The\ + \ identifier for a particular badge class to filter by.\n * issuing_component\ + \ (optional): The issuing component for a particular badge class to filter\ + \ by\n (requires slug to have been specified, or this will be ignored.)\ + \ If slug is provided and this is not,\n assumes the issuing_component\ + \ should be empty.\n * course_id (optional): Returns assertions that were\ + \ awarded as part of a particular course. If slug is\n provided, and\ + \ this field is not specified, assumes that the target badge has an empty\ + \ course_id field.\n '*' may be used to get all badges with the specified\ + \ slug, issuing_component combination across all courses.\n\n** Returns **\n\ + \n * 200 on success, with a list of Badge Assertion objects.\n * 403\ + \ if a user who does not have permission to masquerade as\n another user\ + \ specifies a username other than their own.\n * 404 if the specified user\ + \ does not exist\n\n {\n \"count\": 7,\n \"previous\": null,\n\ + \ \"num_pages\": 1,\n \"results\": [\n {\n \ + \ \"badge_class\": {\n \"slug\": \"special_award\"\ + ,\n \"issuing_component\": \"openedx__course\",\n \ + \ \"display_name\": \"Very Special Award\",\n \ + \ \"course_id\": \"course-v1:edX+DemoX+Demo_Course\",\n \ + \ \"description\": \"Awarded for people who did something incredibly\ + \ special\",\n \"criteria\": \"Do something incredibly\ + \ special.\",\n \"image\": \"http://example.com/media/badge_classes/badges/special_xdpqpBv_9FYOZwN.png\"\ + \n },\n \"image_url\": \"http://badges.example.com/media/issued/cd75b69fc1c979fcc1697c8403da2bdf.png\"\ + ,\n \"assertion_url\": \"http://badges.example.com/public/assertions/07020647-e772-44dd-98b7-d13d34335ca6\"\ + \n },\n ...\n ]\n }" + parameters: + - name: page + in: query + description: A page number within the paginated result set. + required: false + type: integer + - name: page_size + in: query + description: Number of results to return per page. + required: false + type: integer + responses: + '200': + description: '' + schema: + required: + - count + - results + type: object + properties: + count: + type: integer + next: + type: string + format: uri + x-nullable: true + previous: + type: string + format: uri + x-nullable: true + results: + type: array + items: + $ref: '#/definitions/BadgeAssertion' + tags: + - badges + parameters: + - name: username + in: path + required: true + type: string + /bookmarks/v1/bookmarks/: + get: + operationId: bookmarks_v1_bookmarks_list + summary: Get a paginated list of bookmarks for a user. + description: "The list can be filtered by passing parameter \"course_id=\"\ + \nto only include bookmarks from a particular course.\n\nThe bookmarks are\ + \ always sorted in descending order by creation date.\n\nEach page in the\ + \ list contains 10 bookmarks by default. The page\nsize can be altered by\ + \ passing parameter \"page_size=\".\n\nTo include the optional\ + \ fields pass the values in \"fields\" parameter\nas a comma separated list.\ + \ Possible values are:\n\n* \"display_name\"\n* \"path\"\n\n# Example Requests\n\ + \nGET /api/bookmarks/v1/bookmarks/?course_id={course_id1}&fields=display_name,path\n\ + \n# Response Values\n\n* count: The number of bookmarks in a course.\n\n*\ + \ next: The URI to the next page of bookmarks.\n\n* previous: The URI to the\ + \ previous page of bookmarks.\n\n* num_pages: The number of pages listing\ + \ bookmarks.\n\n* results: A list of bookmarks returned. Each collection\ + \ in the list\n contains these fields.\n\n * id: String. The identifier\ + \ string for the bookmark: {user_id},{usage_id}.\n\n * course_id: String.\ + \ The identifier string of the bookmark's course.\n\n * usage_id: String.\ + \ The identifier string of the bookmark's XBlock.\n\n * display_name: String.\ + \ (optional) Display name of the XBlock.\n\n * path: List. (optional) List\ + \ of dicts containing {\"usage_id\": , display_name:}\n\ + \ for the XBlocks from the top of the course tree till the parent of\ + \ the bookmarked XBlock.\n\n * created: ISO 8601 String. The timestamp\ + \ of bookmark's creation.\n\n" + parameters: + - name: page + in: query + description: A page number within the paginated result set. + required: false + type: integer + - name: page_size + in: query + description: Number of results to return per page. + required: false + type: integer + - name: course_id + in: query + description: The id of the course, of course + type: string + - name: fields + in: query + description: "The fields to return: display_name, path.\n" + type: string + responses: + '200': + description: '' + tags: + - bookmarks + post: + operationId: bookmarks_v1_bookmarks_create + summary: Create a new bookmark for a user. + description: "The POST request only needs to contain one parameter \"usage_id\"\ + .\n\nHttp400 is returned if the format of the request is not correct,\nthe\ + \ usage_id is invalid or a block corresponding to the usage_id\ncould not\ + \ be found.\n\n# Example Requests\n\nPOST /api/bookmarks/v1/bookmarks/\nRequest\ + \ data: {\"usage_id\": }\n\n" + parameters: [] + responses: + '201': + description: '' + tags: + - bookmarks + parameters: [] + /bookmarks/v1/bookmarks/{username},{usage_id}/: + get: + operationId: bookmarks_v1_bookmarks_read + summary: Get a specific bookmark for a user. + description: "# Example Requests\n\nGET /api/bookmarks/v1/bookmarks/{username},{usage_id}/?fields=display_name,path\n\ + \n" + parameters: [] + responses: + '200': + description: '' + tags: + - bookmarks + delete: + operationId: bookmarks_v1_bookmarks_delete + description: DELETE /api/bookmarks/v1/bookmarks/{username},{usage_id} + parameters: [] + responses: + '204': + description: '' + tags: + - bookmarks + parameters: + - name: usage_id + in: path + required: true + type: string + - name: username + in: path + required: true + type: string + /bulk_enroll/v1/bulk_enroll: + post: + operationId: bulk_enroll_v1_bulk_enroll_create + summary: '**Use Case**' + description: "Enroll multiple users in one or more courses.\n\n**Example Request**\n\ + \n POST /api/bulk_enroll/v1/bulk_enroll/ {\n \"auto_enroll\": true,\n\ + \ \"email_students\": true,\n \"action\": \"enroll\",\n \ + \ \"courses\": \"course-v1:edX+Demo+123,course-v1:edX+Demo2+456\",\n \ + \ \"cohorts\": \"cohortA,cohortA\",\n \"identifiers\": \"brandon@example.com,yamilah@example.com\"\ + \n }\n\n **POST Parameters**\n\n A POST request can include the\ + \ following parameters.\n\n * auto_enroll: When set to `true`, students\ + \ will be enrolled as soon\n as they register.\n * email_students:\ + \ When set to `true`, students will be sent email\n notifications upon\ + \ enrollment.\n * action: Can either be set to \"enroll\" or \"unenroll\"\ + . This determines the behavior\n * cohorts: Optional. If provided, the\ + \ number of items in the list should be equal to\n the number of courses.\ + \ first cohort coressponds with the first course and so on.\n The learners\ + \ will be added to the corresponding cohort.\n\n**Response Values**\n\n \ + \ If the supplied course data is valid and the enrollments were\n successful,\ + \ an HTTP 200 \"OK\" response is returned.\n\n The HTTP 200 response body\ + \ contains a list of response data for each\n enrollment. (See the `instructor.views.api.students_update_enrollment`\n\ + \ docstring for the specifics of the response data available for each\n\ + \ enrollment)\n\n If a cohorts list is provided, additional 'cohort'\ + \ keys will be added\n to the 'before' and 'after' states." + parameters: [] + responses: + '201': + description: '' + tags: + - bulk_enroll + parameters: [] + /ccx/v0/ccx/: + get: + operationId: ccx_v0_ccx_list + summary: Gets a list of CCX Courses for a given Master Course. + description: "Additional parameters are allowed for pagination purposes.\n\n\ + Args:\n request (Request): Django request object.\n\nReturn:\n A JSON\ + \ serialized representation of a list of CCX courses." + parameters: + - name: page + in: query + description: A page number within the paginated result set. + required: false + type: integer + - name: page_size + in: query + description: Number of results to return per page. + required: false + type: integer + responses: + '200': + description: '' + schema: + required: + - count + - results + type: object + properties: + count: + type: integer + next: + type: string + format: uri + x-nullable: true + previous: + type: string + format: uri + x-nullable: true + results: + type: array + items: + $ref: '#/definitions/CCXCourse' + tags: + - ccx + post: + operationId: ccx_v0_ccx_create + summary: Creates a new CCX course for a given Master Course. + description: "Args:\n request (Request): Django request object.\n\nReturn:\n\ + \ A JSON serialized representation a newly created CCX course." + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/CCXCourse' + responses: + '201': + description: '' + schema: + $ref: '#/definitions/CCXCourse' + tags: + - ccx + parameters: [] + /ccx/v0/ccx/{ccx_course_id}/: + get: + operationId: ccx_v0_ccx_read + summary: Gets a CCX Course information. + description: "Args:\n request (Request): Django request object.\n ccx_course_id\ + \ (string): URI element specifying the CCX course location.\n\nReturn:\n \ + \ A JSON serialized representation of the CCX course." + parameters: [] + responses: + '200': + description: '' + schema: + $ref: '#/definitions/CCXCourse' + tags: + - ccx + patch: + operationId: ccx_v0_ccx_partial_update + summary: Modifies a CCX course. + description: "Args:\n request (Request): Django request object.\n ccx_course_id\ + \ (string): URI element specifying the CCX course location." + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/CCXCourse' + responses: + '200': + description: '' + schema: + $ref: '#/definitions/CCXCourse' + tags: + - ccx + delete: + operationId: ccx_v0_ccx_delete + summary: Deletes a CCX course. + description: "Args:\n request (Request): Django request object.\n ccx_course_id\ + \ (string): URI element specifying the CCX course location." + parameters: [] + responses: + '204': + description: '' + tags: + - ccx + parameters: + - name: ccx_course_id + in: path + required: true + type: string + /certificates/v0/certificates/{username}/: + get: + operationId: certificates_v0_certificates_read + summary: Get a paginated list of bookmarks for a user. + description: "**Use Case**\n\n * Get the list of viewable course certificates\ + \ for a specific user.\n\n**Example Request**\n\n GET /api/certificates/v0/certificates/{username}\n\ + \n**GET Parameters**\n\n A GET request must include the following parameters.\n\ + \n * username: A string representation of an user's username.\n\n**GET\ + \ Response Values**\n\n If the request for information about the user's\ + \ certificates is successful,\n an HTTP 200 \"OK\" response is returned.\n\ + \n The HTTP 200 response contains a list of dicts with the following keys/values.\n\ + \n * username: A string representation of an user's username passed in\ + \ the request.\n\n * course_id: A string representation of a Course ID.\n\ + \n * course_display_name: A string representation of the Course name.\n\ + \n * course_organization: A string representation of the organization associated\ + \ with the Course.\n\n * certificate_type: A string representation of the\ + \ certificate type.\n Can be honor|verified|professional\n\n * created_date:\ + \ Date/time the certificate was created, in ISO-8661 format.\n\n * status:\ + \ A string representation of the certificate status.\n\n * is_passing:\ + \ True if the certificate has a passing status, False if not.\n\n * download_url:\ + \ A string representation of the certificate url.\n\n * grade: A string\ + \ representation of a float for the user's course grade.\n\n**Example GET\ + \ Response**\n\n [{\n \"username\": \"bob\",\n \"course_id\"\ + : \"edX/DemoX/Demo_Course\",\n \"certificate_type\": \"verified\",\n\ + \ \"created_date\": \"2015-12-03T13:14:28+0000\",\n \"status\"\ + : \"downloadable\",\n \"is_passing\": true,\n \"download_url\"\ + : \"http://www.example.com/cert.pdf\",\n \"grade\": \"0.98\"\n }]\n" + parameters: [] + responses: + '200': + description: '' + tags: + - certificates + parameters: + - name: username + in: path + required: true + type: string + /certificates/v0/certificates/{username}/courses/{course_id}/: + get: + operationId: certificates_v0_certificates_courses_read + summary: Gets a certificate information. + description: "Args:\n request (Request): Django request object.\n username\ + \ (string): URI element specifying the user's username.\n course_id (string):\ + \ URI element specifying the course location.\n\nReturn:\n A JSON serialized\ + \ representation of the certificate." + parameters: [] + responses: + '200': + description: '' + tags: + - certificates + parameters: + - name: course_id + in: path + required: true + type: string + - name: username + in: path + required: true + type: string + /cohorts/v1/courses/{course_key_string}/cohorts/{cohort_id}: + get: + operationId: cohorts_v1_courses_cohorts_read + description: Endpoint to get either one or all cohorts. + parameters: [] + responses: + '200': + description: '' + schema: + type: object + properties: {} + tags: + - cohorts + post: + operationId: cohorts_v1_courses_cohorts_create + description: Endpoint to create a new cohort, must not include cohort_id. + parameters: + - name: data + in: body + required: true + schema: + type: object + properties: {} + responses: + '201': + description: '' + schema: + type: object + properties: {} + tags: + - cohorts + patch: + operationId: cohorts_v1_courses_cohorts_partial_update + description: Endpoint to update a cohort name and/or assignment type. + parameters: + - name: data + in: body + required: true + schema: + type: object + properties: {} + responses: + '200': + description: '' + schema: + type: object + properties: {} + tags: + - cohorts + parameters: + - name: cohort_id + in: path + required: true + type: string + - name: course_key_string + in: path + required: true + type: string + /cohorts/v1/courses/{course_key_string}/cohorts/{cohort_id}/users/{username}: + get: + operationId: cohorts_v1_courses_cohorts_users_read + description: Lists the users in a specific cohort. + parameters: [] + responses: + '200': + description: '' + schema: + $ref: '#/definitions/CohortUsersAPI' + tags: + - cohorts + post: + operationId: cohorts_v1_courses_cohorts_users_create + description: Add given users to the cohort. + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/CohortUsersAPI' + responses: + '201': + description: '' + schema: + $ref: '#/definitions/CohortUsersAPI' + tags: + - cohorts + delete: + operationId: cohorts_v1_courses_cohorts_users_delete + summary: Removes and user from a specific cohort. + description: "Note: It's better to use the post method to move users between\ + \ cohorts." + parameters: [] + responses: + '204': + description: '' + tags: + - cohorts + parameters: + - name: cohort_id + in: path + required: true + type: string + - name: course_key_string + in: path + required: true + type: string + - name: username + in: path + required: true + type: string + /cohorts/v1/courses/{course_key_string}/users: + post: + operationId: cohorts_v1_courses_users_create + description: "View method that accepts an uploaded file (using key \"uploaded-file\"\ + )\ncontaining cohort assignments for users. This method spawns a celery task\n\ + to do the assignments, and a CSV file with results is provided via data downloads." + parameters: [] + responses: + '201': + description: '' + tags: + - cohorts + parameters: + - name: course_key_string + in: path + required: true + type: string + /cohorts/v1/settings/{course_key_string}: + get: + operationId: cohorts_v1_settings_read + description: Endpoint to fetch the course cohort settings. + parameters: [] + responses: + '200': + description: '' + schema: + type: object + properties: {} + tags: + - cohorts + put: + operationId: cohorts_v1_settings_update + description: Endpoint to set the course cohort settings. + parameters: + - name: data + in: body + required: true + schema: + type: object + properties: {} + responses: + '200': + description: '' + schema: + type: object + properties: {} + tags: + - cohorts + parameters: + - name: course_key_string + in: path + required: true + type: string + /commerce/v0/baskets/: + post: + operationId: commerce_v0_baskets_create + description: Attempt to enroll the user. + parameters: [] + responses: + '201': + description: '' + tags: + - commerce + parameters: [] + /commerce/v0/baskets/{basket_id}/order/: + get: + operationId: commerce_v0_baskets_order_list + description: HTTP handler. + parameters: [] + responses: + '200': + description: '' + tags: + - commerce + parameters: + - name: basket_id + in: path + required: true + type: string + /commerce/v1/courses/: + get: + operationId: commerce_v1_courses_list + description: List courses and modes. + parameters: [] + responses: + '200': + description: '' + schema: + type: array + items: + $ref: '#/definitions/commerce.Course' + tags: + - commerce + parameters: [] + /commerce/v1/courses/{course_id}/: + get: + operationId: commerce_v1_courses_read + description: Retrieve, update, or create courses/modes. + parameters: [] + responses: + '200': + description: '' + schema: + $ref: '#/definitions/commerce.Course' + tags: + - commerce + put: + operationId: commerce_v1_courses_update + description: Retrieve, update, or create courses/modes. + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/commerce.Course' + responses: + '200': + description: '' + schema: + $ref: '#/definitions/commerce.Course' + tags: + - commerce + patch: + operationId: commerce_v1_courses_partial_update + description: Retrieve, update, or create courses/modes. + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/commerce.Course' + responses: + '200': + description: '' + schema: + $ref: '#/definitions/commerce.Course' + tags: + - commerce + parameters: + - name: course_id + in: path + required: true + type: string + /commerce/v1/orders/{number}/: + get: + operationId: commerce_v1_orders_read + description: HTTP handler. + parameters: [] + responses: + '200': + description: '' + tags: + - commerce + parameters: + - name: number + in: path + required: true + type: string + /completion/v1/completion-batch: + post: + operationId: completion_v1_completion-batch_create + summary: Inserts a batch of completions. + description: "REST Endpoint Format:\n{\n \"username\": \"username\",\n \"\ + course_key\": \"course-key\",\n \"blocks\": {\n \"block_key1\": 0.0,\n\ + \ \"block_key2\": 1.0,\n \"block_key3\": 1.0,\n }\n}\n\n**Returns**\n\ + \nA Response object, with an appropriate status code.\n\nIf successful, status\ + \ code is 200.\n{\n \"detail\" : _(\"ok\")\n}\n\nOtherwise, a 400 or 404\ + \ may be returned, and the \"detail\" content will explain the error." + parameters: [] + responses: + '201': + description: '' + tags: + - completion + parameters: [] + /completion/v1/subsection-completion/{username}/{course_key}/(P{subsection_id}[/]*): + get: + operationId: completion_v1_subsection-completion_]*)_list + description: Returns completion for a (user, subsection, course). + parameters: [] + responses: + '200': + description: '' + tags: + - completion + parameters: + - name: course_key + in: path + required: true + type: string + - name: subsection_id + in: path + required: true + type: string + - name: username + in: path + required: true + type: string + /course_goals/v0/course_goals/: + get: + operationId: course_goals_v0_course_goals_list + description: description from swagger_auto_schema via method_decorator + parameters: + - name: page + in: query + description: A page number within the paginated result set. + required: false + type: integer + - name: page_size + in: query + description: Number of results to return per page. + required: false + type: integer + responses: + '200': + description: '' + schema: + required: + - count + - results + type: object + properties: + count: + type: integer + next: + type: string + format: uri + x-nullable: true + previous: + type: string + format: uri + x-nullable: true + results: + type: array + items: + $ref: '#/definitions/CourseGoal' + tags: + - course_goals + post: + operationId: course_goals_v0_course_goals_create + description: Create a new goal if one does not exist, otherwise update the existing + goal. + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/CourseGoal' + responses: + '201': + description: '' + schema: + $ref: '#/definitions/CourseGoal' + tags: + - course_goals + parameters: [] + /course_goals/v0/course_goals/{id}/: + get: + operationId: course_goals_v0_course_goals_read + summary: API calls to create and update a course goal. + description: "Validates incoming data to ensure that course_key maps to an actual\n\ + course and that the goal_key is a valid option.\n\n**Use Case**\n * Create\ + \ a new goal for a user.\n * Update an existing goal for a user\n\n**Example\ + \ Requests**\n POST /api/course_goals/v0/course_goals/\n Request\ + \ data: {\"course_key\": , \"goal_key\": \"\", \"user\"\ + : \"\"}\n\nReturns Http400 response if the course_key does not map\ + \ to a known\ncourse or if the goal_key does not map to a valid goal key." + parameters: [] + responses: + '200': + description: '' + schema: + $ref: '#/definitions/CourseGoal' + tags: + - course_goals + put: + operationId: course_goals_v0_course_goals_update + summary: API calls to create and update a course goal. + description: "Validates incoming data to ensure that course_key maps to an actual\n\ + course and that the goal_key is a valid option.\n\n**Use Case**\n * Create\ + \ a new goal for a user.\n * Update an existing goal for a user\n\n**Example\ + \ Requests**\n POST /api/course_goals/v0/course_goals/\n Request\ + \ data: {\"course_key\": , \"goal_key\": \"\", \"user\"\ + : \"\"}\n\nReturns Http400 response if the course_key does not map\ + \ to a known\ncourse or if the goal_key does not map to a valid goal key." + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/CourseGoal' + responses: + '200': + description: '' + schema: + $ref: '#/definitions/CourseGoal' + tags: + - course_goals + patch: + operationId: course_goals_v0_course_goals_partial_update + summary: API calls to create and update a course goal. + description: "Validates incoming data to ensure that course_key maps to an actual\n\ + course and that the goal_key is a valid option.\n\n**Use Case**\n * Create\ + \ a new goal for a user.\n * Update an existing goal for a user\n\n**Example\ + \ Requests**\n POST /api/course_goals/v0/course_goals/\n Request\ + \ data: {\"course_key\": , \"goal_key\": \"\", \"user\"\ + : \"\"}\n\nReturns Http400 response if the course_key does not map\ + \ to a known\ncourse or if the goal_key does not map to a valid goal key." + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/CourseGoal' + responses: + '200': + description: '' + schema: + $ref: '#/definitions/CourseGoal' + tags: + - course_goals + delete: + operationId: course_goals_v0_course_goals_delete + summary: API calls to create and update a course goal. + description: "Validates incoming data to ensure that course_key maps to an actual\n\ + course and that the goal_key is a valid option.\n\n**Use Case**\n * Create\ + \ a new goal for a user.\n * Update an existing goal for a user\n\n**Example\ + \ Requests**\n POST /api/course_goals/v0/course_goals/\n Request\ + \ data: {\"course_key\": , \"goal_key\": \"\", \"user\"\ + : \"\"}\n\nReturns Http400 response if the course_key does not map\ + \ to a known\ncourse or if the goal_key does not map to a valid goal key." + parameters: [] + responses: + '204': + description: '' + tags: + - course_goals + parameters: + - name: id + in: path + description: A unique integer value identifying this course goal. + required: true + type: integer + /course_modes/v1/courses/{course_id}/: + get: + operationId: course_modes_v1_courses_read + summary: View to list or create course modes for a course. + description: "**Use Case**\n\n List all course modes for a course, or create\ + \ a new\n course mode.\n\n**Example Requests**\n\n GET /api/course_modes/v1/courses/{course_id}/\n\ + \n Returns a list of all existing course modes for a course.\n\n \ + \ POST /api/course_modes/v1/courses/{course_id}/\n\n Creates a new\ + \ course mode in a course.\n\n**Response Values**\n\n For each HTTP verb\ + \ below, an HTTP 404 \"Not Found\" response is returned if the\n requested\ + \ course id does not exist.\n\n GET: If the request is successful, an HTTP\ + \ 200 \"OK\" response is returned\n along with a list of course mode dictionaries\ + \ within a course.\n The details are contained in a JSON dictionary as\ + \ follows:\n\n * course_id: The course identifier.\n * mode_slug:\ + \ The short name for the course mode.\n * mode_display_name: The verbose\ + \ name for the course mode.\n * min_price: The minimum price for which\ + \ a user can\n enroll in this mode.\n * currency: The currency\ + \ of the listed prices.\n * expiration_datetime: The date and time after\ + \ which\n users cannot enroll in the course in this mode (not required\ + \ for POST).\n * expiration_datetime_is_explicit: Whether the expiration_datetime\ + \ field was\n explicitly set (not required for POST).\n * description:\ + \ A description of this mode (not required for POST).\n * sku: The SKU\ + \ for this mode (for ecommerce purposes, not required for POST).\n *\ + \ bulk_sku: The bulk SKU for this mode (for ecommerce purposes, not required\ + \ for POST).\n\n POST: If the request is successful, an HTTP 201 \"Created\"\ + \ response is returned." + parameters: [] + responses: + '200': + description: '' + schema: + type: array + items: + $ref: '#/definitions/course_modes.CourseMode' + tags: + - course_modes + post: + operationId: course_modes_v1_courses_create + summary: View to list or create course modes for a course. + description: "**Use Case**\n\n List all course modes for a course, or create\ + \ a new\n course mode.\n\n**Example Requests**\n\n GET /api/course_modes/v1/courses/{course_id}/\n\ + \n Returns a list of all existing course modes for a course.\n\n \ + \ POST /api/course_modes/v1/courses/{course_id}/\n\n Creates a new\ + \ course mode in a course.\n\n**Response Values**\n\n For each HTTP verb\ + \ below, an HTTP 404 \"Not Found\" response is returned if the\n requested\ + \ course id does not exist.\n\n GET: If the request is successful, an HTTP\ + \ 200 \"OK\" response is returned\n along with a list of course mode dictionaries\ + \ within a course.\n The details are contained in a JSON dictionary as\ + \ follows:\n\n * course_id: The course identifier.\n * mode_slug:\ + \ The short name for the course mode.\n * mode_display_name: The verbose\ + \ name for the course mode.\n * min_price: The minimum price for which\ + \ a user can\n enroll in this mode.\n * currency: The currency\ + \ of the listed prices.\n * expiration_datetime: The date and time after\ + \ which\n users cannot enroll in the course in this mode (not required\ + \ for POST).\n * expiration_datetime_is_explicit: Whether the expiration_datetime\ + \ field was\n explicitly set (not required for POST).\n * description:\ + \ A description of this mode (not required for POST).\n * sku: The SKU\ + \ for this mode (for ecommerce purposes, not required for POST).\n *\ + \ bulk_sku: The bulk SKU for this mode (for ecommerce purposes, not required\ + \ for POST).\n\n POST: If the request is successful, an HTTP 201 \"Created\"\ + \ response is returned." + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/course_modes.CourseMode' + responses: + '201': + description: '' + schema: + $ref: '#/definitions/course_modes.CourseMode' + tags: + - course_modes + parameters: + - name: course_id + in: path + required: true + type: string + /course_modes/v1/courses/{course_id}/{mode_slug}: + get: + operationId: course_modes_v1_courses_read + summary: View to retrieve, update, or delete a specific course mode for a course. + description: "**Use Case**\n\n Get or update course mode details for a specific\ + \ course mode on a course.\n Or you may delete a specific course mode from\ + \ a course.\n\n**Example Requests**\n\n GET /api/course_modes/v1/courses/{course_id}/{mode_slug}\n\ + \n Returns details on an existing course mode for a course.\n\n \ + \ PATCH /api/course_modes/v1/courses/{course_id}/{mode_slug}\n\n Updates\ + \ (via merge) details of an existing course mode for a course.\n\n DELETE\ + \ /api/course_modes/v1/courses/{course_id}/{mode_slug}\n\n Deletes\ + \ an existing course mode for a course.\n\n**Response Values**\n\n For\ + \ each HTTP verb below, an HTTP 404 \"Not Found\" response is returned if\ + \ the\n requested course id does not exist, or the mode slug does not exist\ + \ within the course.\n\n GET: If the request is successful, an HTTP 200\ + \ \"OK\" response is returned\n along with a details for a single course\ + \ mode within a course. The details are contained\n in a JSON dictionary\ + \ as follows:\n\n * course_id: The course identifier.\n * mode_slug:\ + \ The short name for the course mode.\n * mode_display_name: The verbose\ + \ name for the course mode.\n * min_price: The minimum price for which\ + \ a user can\n enroll in this mode.\n * currency: The currency\ + \ of the listed prices.\n * expiration_datetime: The date and time after\ + \ which\n users cannot enroll in the course in this mode (not required\ + \ for PATCH).\n * expiration_datetime_is_explicit: Whether the expiration_datetime\ + \ field was\n explicitly set (not required for PATCH).\n * description:\ + \ A description of this mode (not required for PATCH).\n * sku: The SKU\ + \ for this mode (for ecommerce purposes, not required for PATCH).\n *\ + \ bulk_sku: The bulk SKU for this mode (for ecommerce purposes, not required\ + \ for PATCH).\n\n PATCH: If the request is successful, an HTTP 204 \"No\ + \ Content\" response is returned.\n If \"application/merge-patch+json\"\ + \ is not the specified content type,\n a 415 \"Unsupported Media Type\"\ + \ response is returned.\n\n DELETE: If the request is successful, an HTTP\ + \ 204 \"No Content\" response is returned." + parameters: [] + responses: + '200': + description: '' + schema: + $ref: '#/definitions/course_modes.CourseMode' + consumes: + - application/merge-patch+json + tags: + - course_modes + patch: + operationId: course_modes_v1_courses_partial_update + description: Performs a partial update of a CourseMode instance. + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/course_modes.CourseMode' + responses: + '200': + description: '' + schema: + $ref: '#/definitions/course_modes.CourseMode' + consumes: + - application/merge-patch+json + tags: + - course_modes + delete: + operationId: course_modes_v1_courses_delete + summary: View to retrieve, update, or delete a specific course mode for a course. + description: "**Use Case**\n\n Get or update course mode details for a specific\ + \ course mode on a course.\n Or you may delete a specific course mode from\ + \ a course.\n\n**Example Requests**\n\n GET /api/course_modes/v1/courses/{course_id}/{mode_slug}\n\ + \n Returns details on an existing course mode for a course.\n\n \ + \ PATCH /api/course_modes/v1/courses/{course_id}/{mode_slug}\n\n Updates\ + \ (via merge) details of an existing course mode for a course.\n\n DELETE\ + \ /api/course_modes/v1/courses/{course_id}/{mode_slug}\n\n Deletes\ + \ an existing course mode for a course.\n\n**Response Values**\n\n For\ + \ each HTTP verb below, an HTTP 404 \"Not Found\" response is returned if\ + \ the\n requested course id does not exist, or the mode slug does not exist\ + \ within the course.\n\n GET: If the request is successful, an HTTP 200\ + \ \"OK\" response is returned\n along with a details for a single course\ + \ mode within a course. The details are contained\n in a JSON dictionary\ + \ as follows:\n\n * course_id: The course identifier.\n * mode_slug:\ + \ The short name for the course mode.\n * mode_display_name: The verbose\ + \ name for the course mode.\n * min_price: The minimum price for which\ + \ a user can\n enroll in this mode.\n * currency: The currency\ + \ of the listed prices.\n * expiration_datetime: The date and time after\ + \ which\n users cannot enroll in the course in this mode (not required\ + \ for PATCH).\n * expiration_datetime_is_explicit: Whether the expiration_datetime\ + \ field was\n explicitly set (not required for PATCH).\n * description:\ + \ A description of this mode (not required for PATCH).\n * sku: The SKU\ + \ for this mode (for ecommerce purposes, not required for PATCH).\n *\ + \ bulk_sku: The bulk SKU for this mode (for ecommerce purposes, not required\ + \ for PATCH).\n\n PATCH: If the request is successful, an HTTP 204 \"No\ + \ Content\" response is returned.\n If \"application/merge-patch+json\"\ + \ is not the specified content type,\n a 415 \"Unsupported Media Type\"\ + \ response is returned.\n\n DELETE: If the request is successful, an HTTP\ + \ 204 \"No Content\" response is returned." + parameters: [] + responses: + '204': + description: '' + consumes: + - application/merge-patch+json + tags: + - course_modes + parameters: + - name: course_id + in: path + required: true + type: string + - name: mode_slug + in: path + required: true + type: string + /courses/v1/blocks/: + get: + operationId: courses_v1_blocks_list + summary: '**Use Case**' + description: "Returns the blocks in the course according to the requesting user's\n\ + \ access level.\n\n**Example requests**:\n\n GET /api/courses/v1/blocks/?course_id=\n\ + \ GET /api/courses/v1/blocks/?course_id=\n &username=anjali\n\ + \ &depth=all\n &requested_fields=graded,format,student_view_multi_device,lti_url\n\ + \ &block_counts=video\n &student_view_data=video\n &block_types_filter=problem,html\n\ + \n**Parameters**:\n\n This view redirects to /api/courses/v1/blocks//\ + \ for the\n root usage key of the course specified by course_id. The view\ + \ accepts\n all parameters accepted by :class:`BlocksView`, plus the following\n\ + \ required parameter\n\n * course_id: (string, required) The ID of the\ + \ course whose block data\n we want to return\n\n**Response Values**\n\ + \n Responses are identical to those returned by :class:`BlocksView` when\n\ + \ passed the root_usage_key of the requested course.\n\n If the course_id\ + \ is not supplied, a 400: Bad Request is returned, with\n a message indicating\ + \ that course_id is required.\n\n If an invalid course_id is supplied,\ + \ a 400: Bad Request is returned,\n with a message indicating that the\ + \ course_id is not valid." + parameters: + - name: page + in: query + description: A page number within the paginated result set. + required: false + type: integer + - name: page_size + in: query + description: Number of results to return per page. + required: false + type: integer + responses: + '200': + description: '' + tags: + - courses + parameters: [] + ? /courses/v1/blocks/(P{usage_key_string}{var}|api/courses/v1/blocks/(P{usage_key_string}(:i4x://[/]+/[/]+/[/]+/[@]+(:@[/]+))|{var}) + : get: + operationId: courses_v1_blocks_courses_v1_blocks__[_]+_[_]+_[_]+_[@]+(:@[_read + summary: '**Use Case**' + description: "Returns the blocks within the requested block tree according to\ + \ the\n requesting user's access level.\n\n**Example requests**:\n\n \ + \ GET /api/courses/v1/blocks//?depth=all\n GET /api/courses/v1/blocks//?\n\ + \ username=anjali\n &depth=all\n &requested_fields=graded,format,student_view_multi_device,lti_url,due\n\ + \ &block_counts=video\n &student_view_data=video\n &block_types_filter=problem,html\n\ + \n**Parameters**:\n\n * all_blocks: (boolean) Provide a value of \"true\"\ + \ to return all\n blocks. Returns all blocks only if the requesting user\ + \ has course\n staff permissions. Blocks that are visible only to specific\ + \ learners\n (for example, based on group membership or randomized content)\ + \ are\n all included. If all_blocks is not specified, you must specify\ + \ the\n username for the user whose course blocks are requested.\n\n\ + \ * username: (string) Required, unless ``all_blocks`` is specified.\n\ + \ Specify the username for the user whose course blocks are requested.\n\ + \ Only users with course staff permissions can specify other users'\n\ + \ usernames. If a username is specified, results include blocks that\n\ + \ are visible to that user, including those based on group or cohort\n\ + \ membership or randomized content assigned to that user.\n\n Example:\ + \ username=anjali\n\n * student_view_data: (list) Indicates for which block\ + \ types to return\n student_view_data.\n\n Example: student_view_data=video\n\ + \n * block_counts: (list) Indicates for which block types to return the\n\ + \ aggregate count of the blocks.\n\n Example: block_counts=video,problem\n\ + \n * requested_fields: (list) Indicates which additional fields to return\n\ + \ for each block. For a list of available fields see under `Response\n\ + \ Values -> blocks`, below.\n\n The following fields are always\ + \ returned: id, type, display_name\n\n Example: requested_fields=graded,format,student_view_multi_device\n\ + \n * depth: (integer or all) Indicates how deep to traverse into the blocks\n\ + \ hierarchy. A value of all means the entire hierarchy.\n\n Default\ + \ is 0\n\n Example: depth=all\n\n * nav_depth: (integer)\n\n \ + \ WARNING: nav_depth is not supported, and may be removed at any time.\n\n\ + \ Indicates how far deep to traverse into the\n course hierarchy\ + \ before bundling all the descendants.\n\n Default is 3 since typical\ + \ navigational views of the course show a\n maximum of chapter->sequential->vertical.\n\ + \n Example: nav_depth=3\n\n * return_type (string) Indicates in what\ + \ data type to return the\n blocks.\n\n Default is dict. Supported\ + \ values are: dict, list\n\n Example: return_type=dict\n\n * block_types_filter:\ + \ (list) Requested types of blocks used to filter the final result\n \ + \ of returned blocks. Possible values include sequential, vertical, html,\ + \ problem,\n video, and discussion.\n\n Example: block_types_filter=vertical,html\n\ + \n**Response Values**\n\n The following fields are returned with a successful\ + \ response.\n\n * root: The ID of the root node of the requested course\ + \ block\n structure.\n\n * blocks: A dictionary or list, based on\ + \ the value of the\n \"return_type\" parameter. Maps block usage IDs\ + \ to a collection of\n information about each block. Each block contains\ + \ the following\n fields.\n\n * id: (string) The usage ID of the\ + \ block.\n\n * type: (string) The type of block. Possible values the\ + \ names of any\n XBlock type in the system, including custom blocks.\ + \ Examples are\n course, chapter, sequential, vertical, html, problem,\ + \ video, and\n discussion.\n\n * display_name: (string) The display\ + \ name of the block.\n\n * children: (list) If the block has child blocks,\ + \ a list of IDs of\n the child blocks. Returned only if \"children\"\ + \ is included in the\n \"requested_fields\" parameter.\n\n * completion:\ + \ (float or None) The level of completion of the block.\n Its value\ + \ can vary between 0.0 and 1.0 or be equal to None\n if block is not\ + \ completable. Returned only if \"completion\"\n is included in the\ + \ \"requested_fields\" parameter.\n\n * block_counts: (dict) For each\ + \ block type specified in the\n block_counts parameter to the endpoint,\ + \ the aggregate number of\n blocks of that type for this block and\ + \ all of its descendants.\n\n * graded (boolean) Whether or not the block\ + \ or any of its descendants\n is graded. Returned only if \"graded\"\ + \ is included in the\n \"requested_fields\" parameter.\n\n * format:\ + \ (string) The assignment type of the block. Possible values\n can\ + \ be \"Homework\", \"Lab\", \"Midterm Exam\", and \"Final Exam\".\n \ + \ Returned only if \"format\" is included in the \"requested_fields\"\n \ + \ parameter.\n\n * student_view_data: (dict) The JSON data for\ + \ this block.\n Returned only if the \"student_view_data\" input parameter\ + \ contains\n this block's type.\n\n * student_view_url: (string)\ + \ The URL to retrieve the HTML rendering\n of this block's student\ + \ view. The HTML could include CSS and\n Javascript code. This field\ + \ can be used in combination with the\n student_view_multi_device field\ + \ to decide whether to display this\n content to the user.\n\n \ + \ This URL can be used as a fallback if the student_view_data for\n \ + \ this block type is not supported by the client or the block.\n\n \ + \ * student_view_multi_device: (boolean) Whether or not the HTML of\n \ + \ the student view that is rendered at \"student_view_url\" supports\n\ + \ responsive web layouts, touch-based inputs, and interactive state\n\ + \ management for a variety of device sizes and types, including\n \ + \ mobile and touch devices. Returned only if\n \"student_view_multi_device\"\ + \ is included in the \"requested_fields\"\n parameter.\n\n * lms_web_url:\ + \ (string) The URL to the navigational container of the\n xBlock on\ + \ the web LMS. This URL can be used as a further fallback\n if the\ + \ student_view_url and the student_view_data fields are not\n supported.\n\ + \n * lti_url: The block URL for an LTI consumer. Returned only if the\n\ + \ \"ENABLE_LTI_PROVIDER\" Django settign is set to \"True\".\n\n \ + \ * due: The due date of the block. Returned only if \"due\" is included\n\ + \ in the \"requested_fields\" parameter.\n\n * show_correctness:\ + \ Whether to show scores/correctness to learners for the current sequence\ + \ or problem.\n Returned only if \"show_correctness\" is included in\ + \ the \"requested_fields\" parameter." + parameters: + - name: page + in: query + description: A page number within the paginated result set. + required: false + type: integer + - name: page_size + in: query + description: Number of results to return per page. + required: false + type: integer + responses: + '200': + description: '' + tags: + - courses + parameters: + - name: usage_key_string + in: path + required: true + type: string + - name: var + in: path + required: true + type: string + /courses/v1/courses/: + get: + operationId: courses_v1_courses_list + summary: '**Use Cases**' + description: "Request information on all courses visible to the specified user.\n\ + \n**Example Requests**\n\n GET /api/courses/v1/courses/\n\n**Response Values**\n\ + \n Body comprises a list of objects as returned by `CourseDetailView`.\n\ + \n**Parameters**\n search_term (optional):\n Search term to filter\ + \ courses (used by ElasticSearch).\n\n username (optional):\n The\ + \ username of the specified user whose visible courses we\n want to\ + \ see. The username is not required only if the API is\n requested\ + \ by an Anonymous user.\n\n org (optional):\n If specified, visible\ + \ `CourseOverview` objects are filtered\n such that only those belonging\ + \ to the organization with the\n provided org code (e.g., \"HarvardX\"\ + ) are returned.\n Case-insensitive.\n\n role (optional):\n \ + \ If specified, visible `CourseOverview` objects are filtered\n such\ + \ that only those for which the user has the specified role\n are returned.\ + \ Multiple role parameters can be specified.\n Case-insensitive.\n\n\ + **Returns**\n\n * 200 on success, with a list of course discovery objects\ + \ as returned\n by `CourseDetailView`.\n * 400 if an invalid parameter\ + \ was sent or the username was not provided\n for an authenticated request.\n\ + \ * 403 if a user who does not have permission to masquerade as\n \ + \ another user specifies a username other than their own.\n * 404 if the\ + \ specified user does not exist, or the requesting user does\n not have\ + \ permission to view their courses.\n\n Example response:\n\n [\n\ + \ {\n \"blocks_url\": \"/api/courses/v1/blocks/?course_id=edX%2Fexample%2F2012_Fall\"\ + ,\n \"media\": {\n \"course_image\": {\n \ + \ \"uri\": \"/c4x/edX/example/asset/just_a_test.jpg\",\n \ + \ \"name\": \"Course Image\"\n }\n },\n \ + \ \"description\": \"An example course.\",\n \"end\": \"2015-09-19T18:00:00Z\"\ + ,\n \"enrollment_end\": \"2015-07-15T00:00:00Z\",\n \ + \ \"enrollment_start\": \"2015-06-15T00:00:00Z\",\n \"course_id\"\ + : \"edX/example/2012_Fall\",\n \"name\": \"Example Course\",\n\ + \ \"number\": \"example\",\n \"org\": \"edX\",\n \ + \ \"start\": \"2015-07-17T12:00:00Z\",\n \"start_display\"\ + : \"July 17, 2015\",\n \"start_type\": \"timestamp\"\n \ + \ }\n ]" + parameters: + - name: page + in: query + description: A page number within the paginated result set. + required: false + type: integer + - name: page_size + in: query + description: Number of results to return per page. + required: false + type: integer + responses: + '200': + description: '' + schema: + required: + - count + - results + type: object + properties: + count: + type: integer + next: + type: string + format: uri + x-nullable: true + previous: + type: string + format: uri + x-nullable: true + results: + type: array + items: + $ref: '#/definitions/Course' + tags: + - courses + parameters: [] + ? /courses/v1/courses/(P{course_key_string}[/+]+{var}[/+]+api/courses/v1/courses/(P{course_key_string}[/+]+(/|+)[/+]+{var}[/]+) + : get: + operationId: courses_v1_courses_+]+api_courses_v1_courses_+]+(_|+)[_]+)_read + summary: '**Use Cases**' + description: "Request details for a course\n\n**Example Requests**\n\n GET\ + \ /api/courses/v1/courses/{course_key}/\n\n**Response Values**\n\n Body\ + \ consists of the following fields:\n\n * effort: A textual description\ + \ of the weekly hours of effort expected\n in the course.\n * end:\ + \ Date the course ends, in ISO 8601 notation\n * enrollment_end: Date enrollment\ + \ ends, in ISO 8601 notation\n * enrollment_start: Date enrollment begins,\ + \ in ISO 8601 notation\n * id: A unique identifier of the course; a serialized\ + \ representation\n of the opaque key identifying the course.\n *\ + \ media: An object that contains named media items. Included here:\n \ + \ * course_image: An image to show for the course. Represented\n \ + \ as an object with the following fields:\n * uri: The location\ + \ of the image\n * name: Name of the course\n * number: Catalog number\ + \ of the course\n * org: Name of the organization that owns the course\n\ + \ * overview: A possibly verbose HTML textual description of the course.\n\ + \ Note: this field is only included in the Course Detail view, not\n\ + \ the Course List view.\n * short_description: A textual description\ + \ of the course\n * start: Date the course begins, in ISO 8601 notation\n\ + \ * start_display: Readably formatted start of the course\n * start_type:\ + \ Hint describing how `start_display` is set. One of:\n * `\"string\"\ + `: manually set by the course author\n * `\"timestamp\"`: generated\ + \ from the `start` timestamp\n * `\"empty\"`: no start date is specified\n\ + \ * pacing: Course pacing. Possible values: instructor, self\n\n Deprecated\ + \ fields:\n\n * blocks_url: Used to fetch the course blocks\n * course_id:\ + \ Course key (use 'id' instead)\n\n**Parameters:**\n\n username (optional):\n\ + \ The username of the specified user for whom the course data\n \ + \ is being accessed. The username is not only required if the API is\n\ + \ requested by an Anonymous user.\n\n**Returns**\n\n * 200 on success\ + \ with above fields.\n * 400 if an invalid parameter was sent or the username\ + \ was not provided\n for an authenticated request.\n * 403 if a user\ + \ who does not have permission to masquerade as\n another user specifies\ + \ a username other than their own.\n * 404 if the course is not available\ + \ or cannot be seen.\n\n Example response:\n\n {\n \"\ + blocks_url\": \"/api/courses/v1/blocks/?course_id=edX%2Fexample%2F2012_Fall\"\ + ,\n \"media\": {\n \"course_image\": {\n \ + \ \"uri\": \"/c4x/edX/example/asset/just_a_test.jpg\",\n \ + \ \"name\": \"Course Image\"\n }\n \ + \ },\n \"description\": \"An example course.\",\n \"\ + end\": \"2015-09-19T18:00:00Z\",\n \"enrollment_end\": \"2015-07-15T00:00:00Z\"\ + ,\n \"enrollment_start\": \"2015-06-15T00:00:00Z\",\n \ + \ \"course_id\": \"edX/example/2012_Fall\",\n \"name\": \"Example\ + \ Course\",\n \"number\": \"example\",\n \"org\": \"\ + edX\",\n \"overview: \"

A verbose description of the course.

\"\ + \n \"start\": \"2015-07-17T12:00:00Z\",\n \"start_display\"\ + : \"July 17, 2015\",\n \"start_type\": \"timestamp\",\n \ + \ \"pacing\": \"instructor\"\n }" + parameters: [] + responses: + '200': + description: '' + schema: + $ref: '#/definitions/CourseDetail' + tags: + - courses + parameters: + - name: course_key_string + in: path + required: true + type: string + - name: var + in: path + required: true + type: string + /courses/v2/blocks/: + get: + operationId: courses_v2_blocks_list + summary: '**Use Case**' + description: "Returns the blocks in the course according to the requesting user's\n\ + \ access level.\n\n**Example requests**:\n\n GET /api/courses/v1/blocks/?course_id=\n\ + \ GET /api/courses/v1/blocks/?course_id=\n &username=anjali\n\ + \ &depth=all\n &requested_fields=graded,format,student_view_multi_device,lti_url\n\ + \ &block_counts=video\n &student_view_data=video\n &block_types_filter=problem,html\n\ + \n**Parameters**:\n\n This view redirects to /api/courses/v1/blocks//\ + \ for the\n root usage key of the course specified by course_id. The view\ + \ accepts\n all parameters accepted by :class:`BlocksView`, plus the following\n\ + \ required parameter\n\n * course_id: (string, required) The ID of the\ + \ course whose block data\n we want to return\n\n**Response Values**\n\ + \n Responses are identical to those returned by :class:`BlocksView` when\n\ + \ passed the root_usage_key of the requested course.\n\n If the course_id\ + \ is not supplied, a 400: Bad Request is returned, with\n a message indicating\ + \ that course_id is required.\n\n If an invalid course_id is supplied,\ + \ a 400: Bad Request is returned,\n with a message indicating that the\ + \ course_id is not valid." + parameters: + - name: page + in: query + description: A page number within the paginated result set. + required: false + type: integer + - name: page_size + in: query + description: Number of results to return per page. + required: false + type: integer + responses: + '200': + description: '' + tags: + - courses + parameters: [] + ? /courses/v2/blocks/(P{usage_key_string}{var}|api/courses/v2/blocks/(P{usage_key_string}(:i4x://[/]+/[/]+/[/]+/[@]+(:@[/]+))|{var}) + : get: + operationId: courses_v2_blocks_courses_v2_blocks__[_]+_[_]+_[_]+_[@]+(:@[_read + summary: '**Use Case**' + description: "Returns the blocks within the requested block tree according to\ + \ the\n requesting user's access level.\n\n**Example requests**:\n\n \ + \ GET /api/courses/v1/blocks//?depth=all\n GET /api/courses/v1/blocks//?\n\ + \ username=anjali\n &depth=all\n &requested_fields=graded,format,student_view_multi_device,lti_url,due\n\ + \ &block_counts=video\n &student_view_data=video\n &block_types_filter=problem,html\n\ + \n**Parameters**:\n\n * all_blocks: (boolean) Provide a value of \"true\"\ + \ to return all\n blocks. Returns all blocks only if the requesting user\ + \ has course\n staff permissions. Blocks that are visible only to specific\ + \ learners\n (for example, based on group membership or randomized content)\ + \ are\n all included. If all_blocks is not specified, you must specify\ + \ the\n username for the user whose course blocks are requested.\n\n\ + \ * username: (string) Required, unless ``all_blocks`` is specified.\n\ + \ Specify the username for the user whose course blocks are requested.\n\ + \ Only users with course staff permissions can specify other users'\n\ + \ usernames. If a username is specified, results include blocks that\n\ + \ are visible to that user, including those based on group or cohort\n\ + \ membership or randomized content assigned to that user.\n\n Example:\ + \ username=anjali\n\n * student_view_data: (list) Indicates for which block\ + \ types to return\n student_view_data.\n\n Example: student_view_data=video\n\ + \n * block_counts: (list) Indicates for which block types to return the\n\ + \ aggregate count of the blocks.\n\n Example: block_counts=video,problem\n\ + \n * requested_fields: (list) Indicates which additional fields to return\n\ + \ for each block. For a list of available fields see under `Response\n\ + \ Values -> blocks`, below.\n\n The following fields are always\ + \ returned: id, type, display_name\n\n Example: requested_fields=graded,format,student_view_multi_device\n\ + \n * depth: (integer or all) Indicates how deep to traverse into the blocks\n\ + \ hierarchy. A value of all means the entire hierarchy.\n\n Default\ + \ is 0\n\n Example: depth=all\n\n * nav_depth: (integer)\n\n \ + \ WARNING: nav_depth is not supported, and may be removed at any time.\n\n\ + \ Indicates how far deep to traverse into the\n course hierarchy\ + \ before bundling all the descendants.\n\n Default is 3 since typical\ + \ navigational views of the course show a\n maximum of chapter->sequential->vertical.\n\ + \n Example: nav_depth=3\n\n * return_type (string) Indicates in what\ + \ data type to return the\n blocks.\n\n Default is dict. Supported\ + \ values are: dict, list\n\n Example: return_type=dict\n\n * block_types_filter:\ + \ (list) Requested types of blocks used to filter the final result\n \ + \ of returned blocks. Possible values include sequential, vertical, html,\ + \ problem,\n video, and discussion.\n\n Example: block_types_filter=vertical,html\n\ + \n**Response Values**\n\n The following fields are returned with a successful\ + \ response.\n\n * root: The ID of the root node of the requested course\ + \ block\n structure.\n\n * blocks: A dictionary or list, based on\ + \ the value of the\n \"return_type\" parameter. Maps block usage IDs\ + \ to a collection of\n information about each block. Each block contains\ + \ the following\n fields.\n\n * id: (string) The usage ID of the\ + \ block.\n\n * type: (string) The type of block. Possible values the\ + \ names of any\n XBlock type in the system, including custom blocks.\ + \ Examples are\n course, chapter, sequential, vertical, html, problem,\ + \ video, and\n discussion.\n\n * display_name: (string) The display\ + \ name of the block.\n\n * children: (list) If the block has child blocks,\ + \ a list of IDs of\n the child blocks. Returned only if \"children\"\ + \ is included in the\n \"requested_fields\" parameter.\n\n * completion:\ + \ (float or None) The level of completion of the block.\n Its value\ + \ can vary between 0.0 and 1.0 or be equal to None\n if block is not\ + \ completable. Returned only if \"completion\"\n is included in the\ + \ \"requested_fields\" parameter.\n\n * block_counts: (dict) For each\ + \ block type specified in the\n block_counts parameter to the endpoint,\ + \ the aggregate number of\n blocks of that type for this block and\ + \ all of its descendants.\n\n * graded (boolean) Whether or not the block\ + \ or any of its descendants\n is graded. Returned only if \"graded\"\ + \ is included in the\n \"requested_fields\" parameter.\n\n * format:\ + \ (string) The assignment type of the block. Possible values\n can\ + \ be \"Homework\", \"Lab\", \"Midterm Exam\", and \"Final Exam\".\n \ + \ Returned only if \"format\" is included in the \"requested_fields\"\n \ + \ parameter.\n\n * student_view_data: (dict) The JSON data for\ + \ this block.\n Returned only if the \"student_view_data\" input parameter\ + \ contains\n this block's type.\n\n * student_view_url: (string)\ + \ The URL to retrieve the HTML rendering\n of this block's student\ + \ view. The HTML could include CSS and\n Javascript code. This field\ + \ can be used in combination with the\n student_view_multi_device field\ + \ to decide whether to display this\n content to the user.\n\n \ + \ This URL can be used as a fallback if the student_view_data for\n \ + \ this block type is not supported by the client or the block.\n\n \ + \ * student_view_multi_device: (boolean) Whether or not the HTML of\n \ + \ the student view that is rendered at \"student_view_url\" supports\n\ + \ responsive web layouts, touch-based inputs, and interactive state\n\ + \ management for a variety of device sizes and types, including\n \ + \ mobile and touch devices. Returned only if\n \"student_view_multi_device\"\ + \ is included in the \"requested_fields\"\n parameter.\n\n * lms_web_url:\ + \ (string) The URL to the navigational container of the\n xBlock on\ + \ the web LMS. This URL can be used as a further fallback\n if the\ + \ student_view_url and the student_view_data fields are not\n supported.\n\ + \n * lti_url: The block URL for an LTI consumer. Returned only if the\n\ + \ \"ENABLE_LTI_PROVIDER\" Django settign is set to \"True\".\n\n \ + \ * due: The due date of the block. Returned only if \"due\" is included\n\ + \ in the \"requested_fields\" parameter.\n\n * show_correctness:\ + \ Whether to show scores/correctness to learners for the current sequence\ + \ or problem.\n Returned only if \"show_correctness\" is included in\ + \ the \"requested_fields\" parameter." + parameters: + - name: page + in: query + description: A page number within the paginated result set. + required: false + type: integer + - name: page_size + in: query + description: Number of results to return per page. + required: false + type: integer + responses: + '200': + description: '' + tags: + - courses + parameters: + - name: usage_key_string + in: path + required: true + type: string + - name: var + in: path + required: true + type: string + /credit/v1/courses/: + get: + operationId: credit_v1_courses_list + description: CreditCourse endpoints. + parameters: [] + responses: + '200': + description: '' + schema: + type: array + items: + $ref: '#/definitions/CreditCourse' + tags: + - credit + post: + operationId: credit_v1_courses_create + description: CreditCourse endpoints. + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/CreditCourse' + responses: + '201': + description: '' + schema: + $ref: '#/definitions/CreditCourse' + tags: + - credit + parameters: [] + /credit/v1/courses/{course_key}/: + get: + operationId: credit_v1_courses_read + description: CreditCourse endpoints. + parameters: [] + responses: + '200': + description: '' + schema: + $ref: '#/definitions/CreditCourse' + tags: + - credit + put: + operationId: credit_v1_courses_update + description: Create/update course modes for a course. + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/CreditCourse' + responses: + '200': + description: '' + schema: + $ref: '#/definitions/CreditCourse' + tags: + - credit + patch: + operationId: credit_v1_courses_partial_update + description: CreditCourse endpoints. + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/CreditCourse' + responses: + '200': + description: '' + schema: + $ref: '#/definitions/CreditCourse' + tags: + - credit + parameters: + - name: course_key + in: path + required: true + type: string + pattern: (?:[^/+]+(/|\+)[^/+]+(/|\+)[^/?]+) + /credit/v1/eligibility/: + get: + operationId: credit_v1_eligibility_list + description: Returns eligibility for a user-course combination. + parameters: [] + responses: + '200': + description: '' + schema: + type: array + items: + $ref: '#/definitions/CreditEligibility' + tags: + - credit + parameters: [] + /credit/v1/providers/: + get: + operationId: credit_v1_providers_list + description: Credit provider endpoints. + parameters: [] + responses: + '200': + description: '' + schema: + type: array + items: + $ref: '#/definitions/CreditProvider' + tags: + - credit + parameters: [] + /credit/v1/providers/{provider_id}/: + get: + operationId: credit_v1_providers_read + description: Credit provider endpoints. + parameters: [] + responses: + '200': + description: '' + schema: + $ref: '#/definitions/CreditProvider' + tags: + - credit + parameters: + - name: provider_id + in: path + description: Unique identifier for this credit provider. Only alphanumeric + characters and hyphens (-) are allowed. The identifier is case-sensitive. + required: true + type: string + pattern: '[a-z,A-Z,0-9,\-]+' + /credit/v1/providers/{provider_id}/callback/: + post: + operationId: credit_v1_providers_callback_create + description: POST handler. + parameters: [] + responses: + '201': + description: '' + tags: + - credit + parameters: + - name: provider_id + in: path + required: true + type: string + /credit/v1/providers/{provider_id}/request/: + post: + operationId: credit_v1_providers_request_create + description: POST handler. + parameters: [] + responses: + '201': + description: '' + tags: + - credit + parameters: + - name: provider_id + in: path + required: true + type: string + /discounts/course/(P{course_key_string}[/+]+{var}[/+]+api/discounts/course/(P{course_key_string}[/+]+(/|+)[/+]+{var}[/]+): + get: + operationId: discounts_course_+]+api_discounts_course_+]+(_|+)[_]+)_list + description: Return the discount percent, if the user has appropriate permissions. + parameters: [] + responses: + '200': + description: '' + tags: + - discounts + parameters: + - name: course_key_string + in: path + required: true + type: string + - name: var + in: path + required: true + type: string + ? /discounts/user/{user_id}/course/(P{course_key_string}[/+]+{var}[/+]+api/discounts/user/{user_id}/course/(P{course_key_string}[/+]+(/|+)[/+]+{var}[/]+) + : get: + operationId: discounts_user_course_+]+api_discounts_user_course_+]+(_|+)[_]+)_list + description: Return the discount percent, if the user has appropriate permissions. + parameters: [] + responses: + '200': + description: '' + tags: + - discounts + parameters: + - name: course_key_string + in: path + required: true + type: string + - name: user_id + in: path + required: true + type: string + - name: var + in: path + required: true + type: string + /discussion/v1/accounts/replace_username: + post: + operationId: discussion_v1_accounts_replace_username_create + description: Implements the username replacement endpoint + parameters: [] + responses: + '201': + description: '' + tags: + - discussion + parameters: [] + /discussion/v1/accounts/retire_forum: + post: + operationId: discussion_v1_accounts_retire_forum_create + description: Implements the retirement endpoint. + parameters: [] + responses: + '201': + description: '' + tags: + - discussion + parameters: [] + /discussion/v1/comments/: + get: + operationId: discussion_v1_comments_list + description: "Implements the GET method for the list endpoint as described in\ + \ the\nclass docstring." + parameters: [] + responses: + '200': + description: '' + consumes: + - application/json + - application/merge-patch+json + tags: + - discussion + post: + operationId: discussion_v1_comments_create + description: "Implements the POST method for the list endpoint as described\ + \ in the\nclass docstring." + parameters: [] + responses: + '201': + description: '' + consumes: + - application/json + - application/merge-patch+json + tags: + - discussion + parameters: [] + /discussion/v1/comments/{comment_id}/: + get: + operationId: discussion_v1_comments_read + description: Implements the GET method for comments against response ID + parameters: [] + responses: + '200': + description: '' + consumes: + - application/json + - application/merge-patch+json + tags: + - discussion + patch: + operationId: discussion_v1_comments_partial_update + description: "Implements the PATCH method for the instance endpoint as described\ + \ in\nthe class docstring." + parameters: [] + responses: + '200': + description: '' + consumes: + - application/json + - application/merge-patch+json + tags: + - discussion + delete: + operationId: discussion_v1_comments_delete + description: "Implements the DELETE method for the instance endpoint as described\ + \ in\nthe class docstring" + parameters: [] + responses: + '204': + description: '' + consumes: + - application/json + - application/merge-patch+json + tags: + - discussion + parameters: + - name: comment_id + in: path + required: true + type: string + ? /discussion/v1/course_topics/(P{course_id}[/+]+{var}[/+]+api/discussion/v1/course_topics/(P{course_id}[/+]+(/|+)[/+]+{var}[/]+) + : get: + operationId: discussion_v1_course_topics_+]+api_discussion_v1_course_topics_+]+(_|+)[_]+)_list + description: Implements the GET method as described in the class docstring. + parameters: [] + responses: + '200': + description: '' + tags: + - discussion + parameters: + - name: course_id + in: path + required: true + type: string + - name: var + in: path + required: true + type: string + /discussion/v1/courses/(P{course_id}[/+]+{var}[/+]+api/discussion/v1/courses/(P{course_id}[/+]+(/|+)[/+]+{var}[/]+): + get: + operationId: discussion_v1_courses_+]+api_discussion_v1_courses_+]+(_|+)[_]+)_list + description: Implements the GET method as described in the class docstring. + parameters: [] + responses: + '200': + description: '' + tags: + - discussion + parameters: + - name: course_id + in: path + required: true + type: string + - name: var + in: path + required: true + type: string + /discussion/v1/courses/{course_id}/roles/{rolename}/: + get: + operationId: discussion_v1_courses_roles_read + description: Implement a handler for the GET method. + parameters: [] + responses: + '200': + description: '' + tags: + - discussion + post: + operationId: discussion_v1_courses_roles_create + description: Implement a handler for the POST method. + parameters: [] + responses: + '201': + description: '' + tags: + - discussion + parameters: + - name: course_id + in: path + required: true + type: string + - name: rolename + in: path + required: true + type: string + /discussion/v1/courses/{course_id}/settings: + get: + operationId: discussion_v1_courses_settings_list + description: Implement a handler for the GET method. + parameters: [] + responses: + '200': + description: '' + consumes: + - application/json + - application/merge-patch+json + tags: + - discussion + patch: + operationId: discussion_v1_courses_settings_partial_update + description: Implement a handler for the PATCH method. + parameters: [] + responses: + '200': + description: '' + consumes: + - application/json + - application/merge-patch+json + tags: + - discussion + parameters: + - name: course_id + in: path + required: true + type: string + /discussion/v1/threads/: + get: + operationId: discussion_v1_threads_list + description: "Implements the GET method for the list endpoint as described in\ + \ the\nclass docstring." + parameters: [] + responses: + '200': + description: '' + consumes: + - application/json + - application/merge-patch+json + tags: + - discussion + post: + operationId: discussion_v1_threads_create + description: "Implements the POST method for the list endpoint as described\ + \ in the\nclass docstring." + parameters: [] + responses: + '201': + description: '' + consumes: + - application/json + - application/merge-patch+json + tags: + - discussion + parameters: [] + /discussion/v1/threads/{thread_id}/: + get: + operationId: discussion_v1_threads_read + description: Implements the GET method for thread ID + parameters: [] + responses: + '200': + description: '' + consumes: + - application/json + - application/merge-patch+json + tags: + - discussion + patch: + operationId: discussion_v1_threads_partial_update + description: "Implements the PATCH method for the instance endpoint as described\ + \ in\nthe class docstring." + parameters: [] + responses: + '200': + description: '' + consumes: + - application/json + - application/merge-patch+json + tags: + - discussion + delete: + operationId: discussion_v1_threads_delete + description: "Implements the DELETE method for the instance endpoint as described\ + \ in\nthe class docstring" + parameters: [] + responses: + '204': + description: '' + consumes: + - application/json + - application/merge-patch+json + tags: + - discussion + parameters: + - name: thread_id + in: path + required: true + type: string + /edx_proctoring/proctoring_review_callback/: + post: + operationId: edx_proctoring_proctoring_review_callback_create + description: Post callback handler + parameters: [] + responses: + '201': + description: '' + tags: + - edx_proctoring + parameters: [] + /edx_proctoring/v1/instructor/{course_id}: + get: + operationId: edx_proctoring_v1_instructor_read + description: Redirect to dashboard for a given course and optional exam_id + parameters: [] + responses: + '200': + description: '' + tags: + - edx_proctoring + parameters: + - name: course_id + in: path + required: true + type: string + /edx_proctoring/v1/instructor/{course_id}/{exam_id}: + get: + operationId: edx_proctoring_v1_instructor_read + description: Redirect to dashboard for a given course and optional exam_id + parameters: [] + responses: + '200': + description: '' + tags: + - edx_proctoring + parameters: + - name: course_id + in: path + required: true + type: string + - name: exam_id + in: path + required: true + type: string + /edx_proctoring/v1/proctored_exam/active_exams_for_user: + get: + operationId: edx_proctoring_v1_proctored_exam_active_exams_for_user_list + description: returns the get_active_exams_for_user + parameters: [] + responses: + '200': + description: '' + tags: + - edx_proctoring + parameters: [] + /edx_proctoring/v1/proctored_exam/allowance: + get: + operationId: edx_proctoring_v1_proctored_exam_allowance_list + description: "HTTP GET handler. Get all allowances for a course.\nCourse and\ + \ Global staff can view both timed and proctored exam allowances." + parameters: [] + responses: + '200': + description: '' + tags: + - edx_proctoring + put: + operationId: edx_proctoring_v1_proctored_exam_allowance_update + description: HTTP GET handler. Adds or updates Allowance + parameters: [] + responses: + '200': + description: '' + tags: + - edx_proctoring + delete: + operationId: edx_proctoring_v1_proctored_exam_allowance_delete + description: HTTP DELETE handler. Removes Allowance. + parameters: [] + responses: + '204': + description: '' + tags: + - edx_proctoring + parameters: [] + /edx_proctoring/v1/proctored_exam/attempt: + get: + operationId: edx_proctoring_v1_proctored_exam_attempt_list + description: HTTP GET Handler. Returns the status of the exam attempt. + parameters: [] + responses: + '200': + description: '' + tags: + - edx_proctoring + post: + operationId: edx_proctoring_v1_proctored_exam_attempt_create + description: HTTP POST handler. To create an exam attempt. + parameters: [] + responses: + '201': + description: '' + tags: + - edx_proctoring + parameters: [] + /edx_proctoring/v1/proctored_exam/attempt/course_id/{course_id}: + get: + operationId: edx_proctoring_v1_proctored_exam_attempt_course_id_read + description: "HTTP GET Handler. Returns the status of the exam attempt.\nCourse\ + \ and Global staff can view both timed and proctored exam attempts." + parameters: [] + responses: + '200': + description: '' + tags: + - edx_proctoring + parameters: + - name: course_id + in: path + required: true + type: string + /edx_proctoring/v1/proctored_exam/attempt/course_id/{course_id}/search/{search_by}: + get: + operationId: edx_proctoring_v1_proctored_exam_attempt_course_id_search_read + description: "HTTP GET Handler. Returns the status of the exam attempt.\nCourse\ + \ and Global staff can view both timed and proctored exam attempts." + parameters: [] + responses: + '200': + description: '' + tags: + - edx_proctoring + parameters: + - name: course_id + in: path + required: true + type: string + - name: search_by + in: path + required: true + type: string + /edx_proctoring/v1/proctored_exam/attempt/{attempt_id}: + get: + operationId: edx_proctoring_v1_proctored_exam_attempt_read + description: HTTP GET Handler. Returns the status of the exam attempt. + parameters: [] + responses: + '200': + description: '' + tags: + - edx_proctoring + put: + operationId: edx_proctoring_v1_proctored_exam_attempt_update + description: HTTP POST handler. To stop an exam. + parameters: [] + responses: + '200': + description: '' + tags: + - edx_proctoring + delete: + operationId: edx_proctoring_v1_proctored_exam_attempt_delete + description: HTTP DELETE handler. Removes an exam attempt. + parameters: [] + responses: + '204': + description: '' + tags: + - edx_proctoring + parameters: + - name: attempt_id + in: path + required: true + type: string + /edx_proctoring/v1/proctored_exam/attempt/{attempt_id}/review_status: + put: + operationId: edx_proctoring_v1_proctored_exam_attempt_review_status_update + description: Update the is_status_acknowledge flag for the specific attempt + parameters: [] + responses: + '200': + description: '' + tags: + - edx_proctoring + parameters: + - name: attempt_id + in: path + required: true + type: string + /edx_proctoring/v1/proctored_exam/attempt/{external_id}/ready: + post: + operationId: edx_proctoring_v1_proctored_exam_attempt_ready_create + description: Post callback handler + parameters: [] + responses: + '201': + description: '' + tags: + - edx_proctoring + parameters: + - name: external_id + in: path + required: true + type: string + /edx_proctoring/v1/proctored_exam/attempt/{external_id}/reviewed: + post: + operationId: edx_proctoring_v1_proctored_exam_attempt_reviewed_create + description: "Called when 3rd party proctoring service has finished its review\ + \ of\nan attempt." + parameters: [] + responses: + '201': + description: '' + tags: + - edx_proctoring + parameters: + - name: external_id + in: path + required: true + type: string + /edx_proctoring/v1/proctored_exam/exam: + get: + operationId: edx_proctoring_v1_proctored_exam_exam_list + description: "HTTP GET handler.\n Scenarios:\n by exam_id: calls get_exam_by_id()\n\ + \ by course_id, content_id: get_exam_by_content_id()" + parameters: [] + responses: + '200': + description: '' + tags: + - edx_proctoring + post: + operationId: edx_proctoring_v1_proctored_exam_exam_create + description: Http POST handler. Creates an exam. + parameters: [] + responses: + '201': + description: '' + tags: + - edx_proctoring + put: + operationId: edx_proctoring_v1_proctored_exam_exam_update + description: "HTTP PUT handler. To update an exam.\ncalls the update_exam" + parameters: [] + responses: + '200': + description: '' + tags: + - edx_proctoring + parameters: [] + /edx_proctoring/v1/proctored_exam/exam/course_id/{course_id}: + get: + operationId: edx_proctoring_v1_proctored_exam_exam_course_id_read + description: "HTTP GET handler.\n Scenarios:\n by exam_id: calls get_exam_by_id()\n\ + \ by course_id, content_id: get_exam_by_content_id()" + parameters: [] + responses: + '200': + description: '' + tags: + - edx_proctoring + post: + operationId: edx_proctoring_v1_proctored_exam_exam_course_id_create + description: Http POST handler. Creates an exam. + parameters: [] + responses: + '201': + description: '' + tags: + - edx_proctoring + put: + operationId: edx_proctoring_v1_proctored_exam_exam_course_id_update + description: "HTTP PUT handler. To update an exam.\ncalls the update_exam" + parameters: [] + responses: + '200': + description: '' + tags: + - edx_proctoring + parameters: + - name: course_id + in: path + required: true + type: string + /edx_proctoring/v1/proctored_exam/exam/course_id/{course_id}/content_id/{content_id}: + get: + operationId: edx_proctoring_v1_proctored_exam_exam_course_id_content_id_read + description: "HTTP GET handler.\n Scenarios:\n by exam_id: calls get_exam_by_id()\n\ + \ by course_id, content_id: get_exam_by_content_id()" + parameters: [] + responses: + '200': + description: '' + tags: + - edx_proctoring + post: + operationId: edx_proctoring_v1_proctored_exam_exam_course_id_content_id_create + description: Http POST handler. Creates an exam. + parameters: [] + responses: + '201': + description: '' + tags: + - edx_proctoring + put: + operationId: edx_proctoring_v1_proctored_exam_exam_course_id_content_id_update + description: "HTTP PUT handler. To update an exam.\ncalls the update_exam" + parameters: [] + responses: + '200': + description: '' + tags: + - edx_proctoring + parameters: + - name: content_id + in: path + required: true + type: string + - name: course_id + in: path + required: true + type: string + /edx_proctoring/v1/proctored_exam/exam/exam_id/{exam_id}: + get: + operationId: edx_proctoring_v1_proctored_exam_exam_exam_id_read + description: "HTTP GET handler.\n Scenarios:\n by exam_id: calls get_exam_by_id()\n\ + \ by course_id, content_id: get_exam_by_content_id()" + parameters: [] + responses: + '200': + description: '' + tags: + - edx_proctoring + post: + operationId: edx_proctoring_v1_proctored_exam_exam_exam_id_create + description: Http POST handler. Creates an exam. + parameters: [] + responses: + '201': + description: '' + tags: + - edx_proctoring + put: + operationId: edx_proctoring_v1_proctored_exam_exam_exam_id_update + description: "HTTP PUT handler. To update an exam.\ncalls the update_exam" + parameters: [] + responses: + '200': + description: '' + tags: + - edx_proctoring + parameters: + - name: exam_id + in: path + required: true + type: string + /edx_proctoring/v1/proctored_exam/{course_id}/allowance: + get: + operationId: edx_proctoring_v1_proctored_exam_allowance_list + description: "HTTP GET handler. Get all allowances for a course.\nCourse and\ + \ Global staff can view both timed and proctored exam allowances." + parameters: [] + responses: + '200': + description: '' + tags: + - edx_proctoring + put: + operationId: edx_proctoring_v1_proctored_exam_allowance_update + description: HTTP GET handler. Adds or updates Allowance + parameters: [] + responses: + '200': + description: '' + tags: + - edx_proctoring + delete: + operationId: edx_proctoring_v1_proctored_exam_allowance_delete + description: HTTP DELETE handler. Removes Allowance. + parameters: [] + responses: + '204': + description: '' + tags: + - edx_proctoring + parameters: + - name: course_id + in: path + required: true + type: string + /edx_proctoring/v1/retire_backend_user/{user_id}/: + post: + operationId: edx_proctoring_v1_retire_backend_user_create + description: "Deletes all user data for the particular user_id\nfrom all configured\ + \ backends" + parameters: [] + responses: + '201': + description: '' + tags: + - edx_proctoring + parameters: + - name: user_id + in: path + required: true + type: string + /edxnotes/v1/retire_user/: + post: + operationId: edxnotes_v1_retire_user_create + description: Implements the retirement endpoint. + parameters: [] + responses: + '201': + description: '' + tags: + - edxnotes + parameters: [] + /embargo/v1/course_access/: + get: + operationId: embargo_v1_course_access_list + summary: GET /api/embargo/v1/course_access/ + description: "Arguments:\n request (HttpRequest)\n\nReturn:\n Response:\ + \ True or False depending on the check." + parameters: [] + responses: + '200': + description: '' + tags: + - embargo + parameters: [] + /enrollment/v1/course/{course_id}: + get: + operationId: enrollment_v1_course_read + summary: Read enrollment information for a particular course. + description: "HTTP Endpoint for retrieving course level enrollment information.\n\ + \nArgs:\n request (Request): To get current course enrollment information,\ + \ a GET request will return\n information for the specified course.\n\ + \ course_id (str): URI element specifying the course location. Enrollment\ + \ information will be\n returned.\n\nReturn:\n A JSON serialized\ + \ representation of the course enrollment details." + parameters: [] + responses: + '200': + description: '' + tags: + - enrollment + parameters: + - name: course_id + in: path + required: true + type: string + /enrollment/v1/enrollment: + get: + operationId: enrollment_v1_enrollment_list + summary: Gets a list of all course enrollments for a user. + description: "Returns a list for the currently logged in user, or for the user\ + \ named by the 'user' GET\nparameter. If the username does not match that\ + \ of the currently logged in user, only\ncourses for which the currently logged\ + \ in user has the Staff or Admin role are listed.\nAs a result, a course team\ + \ member can find out which of his or her own courses a particular\nlearner\ + \ is enrolled in.\n\nOnly the Staff or Admin role (granted on the Django administrative\ + \ console as the staff\nor instructor permission) in individual courses gives\ + \ the requesting user access to\nenrollment data. Permissions granted at the\ + \ organizational level do not give a user\naccess to enrollment data for all\ + \ of that organization's courses.\n\nUsers who have the global staff permission\ + \ can access all enrollment data for all\ncourses." + parameters: [] + responses: + '200': + description: '' + tags: + - enrollment + post: + operationId: enrollment_v1_enrollment_create + summary: Enrolls the currently logged-in user in a course. + description: "Server-to-server calls may deactivate or modify the mode of existing\ + \ enrollments. All other requests\ngo through `add_enrollment()`, which allows\ + \ creation of new and reactivation of old enrollments." + parameters: [] + responses: + '201': + description: '' + tags: + - enrollment + parameters: [] + /enrollment/v1/enrollment/{course_id}: + get: + operationId: enrollment_v1_enrollment_read + summary: Create, read, or update enrollment information for a user. + description: "HTTP Endpoint for all CRUD operations for a user course enrollment.\ + \ Allows creation, reading, and\nupdates of the current enrollment for a particular\ + \ course.\n\nArgs:\n request (Request): To get current course enrollment\ + \ information, a GET request will return\n information for the current\ + \ user and the specified course.\n course_id (str): URI element specifying\ + \ the course location. Enrollment information will be\n returned, created,\ + \ or updated for this particular course.\n username (str): The username\ + \ associated with this enrollment request.\n\nReturn:\n A JSON serialized\ + \ representation of the course enrollment." + parameters: [] + responses: + '200': + description: '' + tags: + - enrollment + parameters: + - name: course_id + in: path + required: true + type: string + /enrollment/v1/enrollment/{username},{course_id}: + get: + operationId: enrollment_v1_enrollment_read + summary: Create, read, or update enrollment information for a user. + description: "HTTP Endpoint for all CRUD operations for a user course enrollment.\ + \ Allows creation, reading, and\nupdates of the current enrollment for a particular\ + \ course.\n\nArgs:\n request (Request): To get current course enrollment\ + \ information, a GET request will return\n information for the current\ + \ user and the specified course.\n course_id (str): URI element specifying\ + \ the course location. Enrollment information will be\n returned, created,\ + \ or updated for this particular course.\n username (str): The username\ + \ associated with this enrollment request.\n\nReturn:\n A JSON serialized\ + \ representation of the course enrollment." + parameters: [] + responses: + '200': + description: '' + tags: + - enrollment + parameters: + - name: course_id + in: path + required: true + type: string + - name: username + in: path + required: true + type: string + /enrollment/v1/enrollments/: + get: + operationId: enrollment_v1_enrollments_list + summary: '**Use Cases**' + description: "Get a list of all course enrollments, optionally filtered by a\ + \ course ID or list of usernames.\n\n**Example Requests**\n\n GET /api/enrollment/v1/enrollments\n\ + \n GET /api/enrollment/v1/enrollments?course_id={course_id}\n\n GET\ + \ /api/enrollment/v1/enrollments?username={username},{username},{username}\n\ + \n GET /api/enrollment/v1/enrollments?course_id={course_id}&username={username}\n\ + \n**Query Parameters for GET**\n\n * course_id: Filters the result to course\ + \ enrollments for the course corresponding to the\n given course ID.\ + \ The value must be URL encoded. Optional.\n\n * username: List of comma-separated\ + \ usernames. Filters the result to the course enrollments\n of the given\ + \ users. Optional.\n\n * page_size: Number of results to return per page.\ + \ Optional.\n\n * page: Page number to retrieve. Optional.\n\n**Response\ + \ Values**\n\n If the request for information about the course enrollments\ + \ is successful, an HTTP 200 \"OK\" response\n is returned.\n\n The\ + \ HTTP 200 response has the following values.\n\n * results: A list of\ + \ the course enrollments matching the request.\n\n * created: Date\ + \ and time when the course enrollment was created.\n\n * mode: Mode\ + \ for the course enrollment.\n\n * is_active: Whether the course enrollment\ + \ is active or not.\n\n * user: Username of the user in the course\ + \ enrollment.\n\n * course_id: Course ID of the course in the course\ + \ enrollment.\n\n * next: The URL to the next page of results, or null\ + \ if this is the\n last page.\n\n * previous: The URL to the next\ + \ page of results, or null if this\n is the first page.\n\n If the\ + \ user is not logged in, a 401 error is returned.\n\n If the user is not\ + \ global staff, a 403 error is returned.\n\n If the specified course_id\ + \ is not valid or any of the specified usernames\n are not valid, a 400\ + \ error is returned.\n\n If the specified course_id does not correspond\ + \ to a valid course or if all the specified\n usernames do not correspond\ + \ to valid users, an HTTP 200 \"OK\" response is returned with an\n empty\ + \ 'results' field." + parameters: + - name: cursor + in: query + description: The pagination cursor value. + required: false + type: string + responses: + '200': + description: '' + schema: + required: + - results + type: object + properties: + next: + type: string + format: uri + x-nullable: true + previous: + type: string + format: uri + x-nullable: true + results: + type: array + items: + $ref: '#/definitions/CourseEnrollmentsApiList' + tags: + - enrollment + parameters: [] + /enrollment/v1/roles/: + get: + operationId: enrollment_v1_roles_list + description: Gets a list of all roles for the currently logged-in user, filtered + by course_id if supplied + parameters: [] + responses: + '200': + description: '' + tags: + - enrollment + parameters: [] + /enrollment/v1/unenroll/: + post: + operationId: enrollment_v1_unenroll_create + description: Unenrolls the specified user from all courses. + parameters: [] + responses: + '201': + description: '' + tags: + - enrollment + parameters: [] + /entitlements/v1/entitlements/: + get: + operationId: entitlements_v1_entitlements_list + description: "Override the list method to expire records that are past the\n\ + policy and requested via the API before returning those records." + parameters: + - name: uuid + in: query + description: '' + required: false + type: string + - name: user + in: query + description: '' + required: false + type: string + - name: page + in: query + description: A page number within the paginated result set. + required: false + type: integer + - name: page_size + in: query + description: Number of results to return per page. + required: false + type: integer + responses: + '200': + description: '' + schema: + required: + - count + - results + type: object + properties: + count: + type: integer + next: + type: string + format: uri + x-nullable: true + previous: + type: string + format: uri + x-nullable: true + results: + type: array + items: + $ref: '#/definitions/CourseEntitlement' + tags: + - entitlements + post: + operationId: entitlements_v1_entitlements_create + description: '' + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/CourseEntitlement' + responses: + '201': + description: '' + schema: + $ref: '#/definitions/CourseEntitlement' + tags: + - entitlements + parameters: [] + /entitlements/v1/entitlements/{uuid}/: + get: + operationId: entitlements_v1_entitlements_read + description: "Override the retrieve method to expire a record that is past the\n\ + policy and is requested via the API before returning that record." + parameters: [] + responses: + '200': + description: '' + schema: + $ref: '#/definitions/CourseEntitlement' + tags: + - entitlements + put: + operationId: entitlements_v1_entitlements_update + description: '' + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/CourseEntitlement' + responses: + '200': + description: '' + schema: + $ref: '#/definitions/CourseEntitlement' + tags: + - entitlements + patch: + operationId: entitlements_v1_entitlements_partial_update + description: '' + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/CourseEntitlement' + responses: + '200': + description: '' + schema: + $ref: '#/definitions/CourseEntitlement' + tags: + - entitlements + delete: + operationId: entitlements_v1_entitlements_delete + description: '' + parameters: [] + responses: + '204': + description: '' + tags: + - entitlements + parameters: + - name: uuid + in: path + required: true + type: string + pattern: '[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}' + /experiments/v0/data/: + get: + operationId: experiments_v0_data_list + description: '' + parameters: + - name: experiment_id + in: query + description: '' + required: false + type: number + - name: key + in: query + description: '' + required: false + type: string + - name: page + in: query + description: A page number within the paginated result set. + required: false + type: integer + - name: page_size + in: query + description: Number of results to return per page. + required: false + type: integer + responses: + '200': + description: '' + schema: + required: + - count + - results + type: object + properties: + count: + type: integer + next: + type: string + format: uri + x-nullable: true + previous: + type: string + format: uri + x-nullable: true + results: + type: array + items: + $ref: '#/definitions/ExperimentData' + tags: + - experiments + post: + operationId: experiments_v0_data_create + description: '' + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/ExperimentDataCreate' + responses: + '201': + description: '' + schema: + $ref: '#/definitions/ExperimentDataCreate' + tags: + - experiments + put: + operationId: experiments_v0_data_update + description: '' + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/ExperimentData' + responses: + '200': + description: '' + schema: + $ref: '#/definitions/ExperimentData' + tags: + - experiments + parameters: [] + /experiments/v0/data/bulk_upsert/: + put: + operationId: experiments_v0_data_bulk_upsert + description: '' + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/ExperimentData' + responses: + '200': + description: '' + schema: + $ref: '#/definitions/ExperimentData' + tags: + - experiments + parameters: [] + /experiments/v0/data/{id}/: + get: + operationId: experiments_v0_data_read + description: '' + parameters: [] + responses: + '200': + description: '' + schema: + $ref: '#/definitions/ExperimentData' + tags: + - experiments + put: + operationId: experiments_v0_data_update + description: '' + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/ExperimentData' + responses: + '200': + description: '' + schema: + $ref: '#/definitions/ExperimentData' + tags: + - experiments + patch: + operationId: experiments_v0_data_partial_update + description: '' + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/ExperimentData' + responses: + '200': + description: '' + schema: + $ref: '#/definitions/ExperimentData' + tags: + - experiments + delete: + operationId: experiments_v0_data_delete + description: '' + parameters: [] + responses: + '204': + description: '' + tags: + - experiments + parameters: + - name: id + in: path + description: A unique integer value identifying this Experiment Data. + required: true + type: integer + /experiments/v0/key-value/: + get: + operationId: experiments_v0_key-value_list + description: '' + parameters: + - name: experiment_id + in: query + description: '' + required: false + type: number + - name: key + in: query + description: '' + required: false + type: string + - name: page + in: query + description: A page number within the paginated result set. + required: false + type: integer + - name: page_size + in: query + description: Number of results to return per page. + required: false + type: integer + responses: + '200': + description: '' + schema: + required: + - count + - results + type: object + properties: + count: + type: integer + next: + type: string + format: uri + x-nullable: true + previous: + type: string + format: uri + x-nullable: true + results: + type: array + items: + $ref: '#/definitions/ExperimentKeyValue' + tags: + - experiments + post: + operationId: experiments_v0_key-value_create + description: '' + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/ExperimentKeyValue' + responses: + '201': + description: '' + schema: + $ref: '#/definitions/ExperimentKeyValue' + tags: + - experiments + parameters: [] + /experiments/v0/key-value/bulk_upsert/: + put: + operationId: experiments_v0_key-value_bulk_upsert + description: '' + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/ExperimentKeyValue' + responses: + '200': + description: '' + schema: + $ref: '#/definitions/ExperimentKeyValue' + tags: + - experiments + parameters: [] + /experiments/v0/key-value/{id}/: + get: + operationId: experiments_v0_key-value_read + description: '' + parameters: [] + responses: + '200': + description: '' + schema: + $ref: '#/definitions/ExperimentKeyValue' + tags: + - experiments + put: + operationId: experiments_v0_key-value_update + description: '' + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/ExperimentKeyValue' + responses: + '200': + description: '' + schema: + $ref: '#/definitions/ExperimentKeyValue' + tags: + - experiments + patch: + operationId: experiments_v0_key-value_partial_update + description: '' + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/ExperimentKeyValue' + responses: + '200': + description: '' + schema: + $ref: '#/definitions/ExperimentKeyValue' + tags: + - experiments + delete: + operationId: experiments_v0_key-value_delete + description: '' + parameters: [] + responses: + '204': + description: '' + tags: + - experiments + parameters: + - name: id + in: path + description: A unique integer value identifying this Experiment Key-Value + Pair. + required: true + type: integer + /grades/v1/courses/: + get: + operationId: grades_v1_courses_list + description: "Gets a course progress status.\nArgs:\n request (Request):\ + \ Django request object.\n course_id (string): URI element specifying the\ + \ course location.\n Can also be passed as a GET parameter\ + \ instead.\nReturn:\n A JSON serialized representation of the requesting\ + \ user's current grade status." + parameters: + - name: cursor + in: query + description: The pagination cursor value. + required: false + type: string + - name: page_size + in: query + description: Number of results to return per page. + required: false + type: integer + responses: + '200': + description: '' + tags: + - grades + parameters: [] + /grades/v1/courses/{course_id}/: + get: + operationId: grades_v1_courses_read + description: "Gets a course progress status.\nArgs:\n request (Request):\ + \ Django request object.\n course_id (string): URI element specifying the\ + \ course location.\n Can also be passed as a GET parameter\ + \ instead.\nReturn:\n A JSON serialized representation of the requesting\ + \ user's current grade status." + parameters: [] + responses: + '200': + description: '' + tags: + - grades + parameters: + - name: course_id + in: path + required: true + type: string + /grades/v1/gradebook/{course_id}/: + get: + operationId: grades_v1_gradebook_read + description: "Checks for course author access for the given course by the requesting\ + \ user.\nCalls the view function if has access, otherwise raises a 403." + parameters: [] + responses: + '200': + description: '' + tags: + - grades + parameters: + - name: course_id + in: path + required: true + type: string + /grades/v1/gradebook/{course_id}/bulk-update: + post: + operationId: grades_v1_gradebook_bulk-update_create + description: "Checks for course author access for the given course by the requesting\ + \ user.\nCalls the view function if has access, otherwise raises a 403." + parameters: [] + responses: + '201': + description: '' + tags: + - grades + parameters: + - name: course_id + in: path + required: true + type: string + /grades/v1/gradebook/{course_id}/grading-info: + get: + operationId: grades_v1_gradebook_grading-info_list + description: "Checks for course author access for the given course by the requesting\ + \ user.\nCalls the view function if has access, otherwise raises a 403." + parameters: + - name: page + in: query + description: A page number within the paginated result set. + required: false + type: integer + - name: page_size + in: query + description: Number of results to return per page. + required: false + type: integer + responses: + '200': + description: '' + tags: + - grades + parameters: + - name: course_id + in: path + required: true + type: string + /grades/v1/policy/courses/{course_id}/: + get: + operationId: grades_v1_policy_courses_read + summary: '**Use Case**' + description: "Get the course grading policy.\n\n**Example requests**:\n\n \ + \ GET /api/grades/v1/policy/courses/{course_id}/\n\n**Response Values**\n\ + \n * assignment_type: The type of the assignment, as configured by course\n\ + \ staff. For example, course staff might make the assignment types Homework,\n\ + \ Quiz, and Exam.\n\n * count: The number of assignments of the type.\n\ + \n * dropped: Number of assignments of the type that are dropped.\n\n \ + \ * weight: The weight, or effect, of the assignment type on the learner's\n\ + \ final grade." + parameters: + - name: page + in: query + description: A page number within the paginated result set. + required: false + type: integer + - name: page_size + in: query + description: Number of results to return per page. + required: false + type: integer + responses: + '200': + description: '' + tags: + - grades + parameters: + - name: course_id + in: path + required: true + type: string + /grades/v1/subsection/{subsection_id}/: + get: + operationId: grades_v1_subsection_read + description: "Returns subection grade data, override grade data and a history\ + \ of changes made to\na specific users specific subsection grade.\n\nArgs:\n\ + \ subsection_id: String representation of a usage_key, which is an opaque\ + \ key of\n a persistant subection grade.\n user_id: An integer represenation\ + \ of a user" + parameters: [] + responses: + '200': + description: '' + tags: + - grades + parameters: + - name: subsection_id + in: path + required: true + type: string + /mobile/{api_version}/course_info/{course_id}/handouts: + get: + operationId: mobile_course_info_handouts_list + summary: '**Use Case**' + description: "Get the HTML for course handouts.\n\n**Example Request**\n\n \ + \ GET /api/mobile/v0.5/course_info/{course_id}/handouts\n\n**Response Values**\n\ + \n If the request is successful, the request returns an HTTP 200 \"OK\"\ + \n response along with the following value.\n\n * handouts_html: The\ + \ HTML for course handouts." + parameters: + - name: page + in: query + description: A page number within the paginated result set. + required: false + type: integer + - name: page_size + in: query + description: Number of results to return per page. + required: false + type: integer + responses: + '200': + description: '' + tags: + - mobile + parameters: + - name: api_version + in: path + required: true + type: string + - name: course_id + in: path + required: true + type: string + /mobile/{api_version}/course_info/{course_id}/updates: + get: + operationId: mobile_course_info_updates_list + summary: '**Use Case**' + description: "Get the content for course updates.\n\n**Example Request**\n\n\ + \ GET /api/mobile/v0.5/course_info/{course_id}/updates\n\n**Response Values**\n\ + \n If the request is successful, the request returns an HTTP 200 \"OK\"\ + \n response along with an array of course updates. Each course update\n\ + \ contains the following values.\n\n * content: The content, as\ + \ an HTML string, of the course update.\n * date: The date of the course\ + \ update.\n * id: The unique identifier of the update.\n * status:\ + \ Whether the update is visible or not." + parameters: + - name: page + in: query + description: A page number within the paginated result set. + required: false + type: integer + - name: page_size + in: query + description: Number of results to return per page. + required: false + type: integer + responses: + '200': + description: '' + tags: + - mobile + parameters: + - name: api_version + in: path + required: true + type: string + - name: course_id + in: path + required: true + type: string + /mobile/{api_version}/my_user_info: + get: + operationId: mobile_my_user_info_list + description: Redirect to the currently-logged-in user's info page + parameters: [] + responses: + '200': + description: '' + tags: + - mobile + parameters: + - name: api_version + in: path + required: true + type: string + /mobile/{api_version}/users/{username}: + get: + operationId: mobile_users_read + summary: '**Use Case**' + description: "Get information about the specified user and access other resources\n\ + \ the user has permissions for.\n\n Users are redirected to this endpoint\ + \ after they sign in.\n\n You can use the **course_enrollments** value\ + \ in the response to get a\n list of courses the user is enrolled in.\n\ + \n**Example Request**\n\n GET /api/mobile/{version}/users/{username}\n\n\ + **Response Values**\n\n If the request is successful, the request returns\ + \ an HTTP 200 \"OK\" response.\n\n The HTTP 200 response has the following\ + \ values.\n\n * course_enrollments: The URI to list the courses the currently\ + \ signed\n in user is enrolled in.\n * email: The email address of\ + \ the currently signed in user.\n * id: The ID of the user.\n * name:\ + \ The full name of the currently signed in user.\n * username: The username\ + \ of the currently signed in user." + parameters: [] + responses: + '200': + description: '' + schema: + $ref: '#/definitions/mobile_api.User' + tags: + - mobile + parameters: + - name: api_version + in: path + required: true + type: string + - name: username + in: path + description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_ + only. + required: true + type: string + pattern: ^[\w.@+-]+$ + /mobile/{api_version}/users/{username}/course_enrollments/: + get: + operationId: mobile_users_course_enrollments_list + summary: '**Use Case**' + description: "Get information about the courses that the currently signed in\ + \ user is\n enrolled in.\n\n v1 differs from v0.5 version by returning\ + \ ALL enrollments for\n a user rather than only the enrollments the user\ + \ has access to (that haven't expired).\n An additional attribute \"expiration\"\ + \ has been added to the response, which lists the date\n when access to\ + \ the course will expire or null if it doesn't expire.\n\n**Example Request**\n\ + \n GET /api/mobile/v1/users/{username}/course_enrollments/\n\n**Response\ + \ Values**\n\n If the request for information about the user is successful,\ + \ the\n request returns an HTTP 200 \"OK\" response.\n\n The HTTP 200\ + \ response has the following values.\n\n * expiration: The course expiration\ + \ date for given user course pair\n or null if the course does not expire.\n\ + \ * certificate: Information about the user's earned certificate in the\n\ + \ course.\n * course: A collection of the following data about the\ + \ course.\n\n * courseware_access: A JSON representation with access information\ + \ for the course,\n including any access errors.\n\n * course_about:\ + \ The URL to the course about page.\n * course_sharing_utm_parameters:\ + \ Encoded UTM parameters to be included in course sharing url\n * course_handouts:\ + \ The URI to get data for course handouts.\n * course_image: The path\ + \ to the course image.\n * course_updates: The URI to get data for course\ + \ updates.\n * discussion_url: The URI to access data for course discussions\ + \ if\n it is enabled, otherwise null.\n * end: The end date of\ + \ the course.\n * id: The unique ID of the course.\n * name: The\ + \ name of the course.\n * number: The course number.\n * org: The\ + \ organization that created the course.\n * start: The date and time\ + \ when the course starts.\n * start_display:\n If start_type is\ + \ a string, then the advertised_start date for the course.\n If start_type\ + \ is a timestamp, then a formatted date for the start of the course.\n \ + \ If start_type is empty, then the value is None and it indicates that\ + \ the course has not yet started.\n * start_type: One of either \"string\"\ + , \"timestamp\", or \"empty\"\n * subscription_id: A unique \"clean\"\ + \ (alphanumeric with '_') ID of\n the course.\n * video_outline:\ + \ The URI to get the list of all videos that the user\n can access\ + \ in the course.\n\n * created: The date the course was created.\n *\ + \ is_active: Whether the course is currently active. Possible values\n \ + \ are true or false.\n * mode: The type of certificate registration for\ + \ this course (honor or\n certified).\n * url: URL to the downloadable\ + \ version of the certificate, if exists." + parameters: [] + responses: + '200': + description: '' + schema: + type: array + items: + $ref: '#/definitions/CourseEnrollment' + tags: + - mobile + parameters: + - name: api_version + in: path + required: true + type: string + - name: username + in: path + required: true + type: string + ? /mobile/{api_version}/users/{username}/course_status_info/(P{course_id}[/+]+{var}[/+]+api/mobile/{api_version}/users/{username}/course_status_info/(P{course_id}[/+]+(/|+)[/+]+{var}[/]+) + : get: + operationId: mobile_users_course_status_info_+]+api_mobile_users_course_status_info_+]+(_|+)[_]+)_list + description: Get the ID of the module that the specified user last visited in + the specified course. + parameters: [] + responses: + '200': + description: '' + tags: + - mobile + patch: + operationId: mobile_users_course_status_info_+]+api_mobile_users_course_status_info_+]+(_|+)[_]+)_partial_update + description: Update the ID of the module that the specified user last visited + in the specified course. + parameters: [] + responses: + '200': + description: '' + tags: + - mobile + parameters: + - name: api_version + in: path + required: true + type: string + - name: course_id + in: path + required: true + type: string + - name: username + in: path + required: true + type: string + - name: var + in: path + required: true + type: string + /notifier/v1/users/: + get: + operationId: notifier_v1_users_list + description: "An endpoint that the notifier can use to retrieve users who have\ + \ enabled\ndaily forum digests, including all information that the notifier\ + \ needs about\nsuch users." + parameters: + - name: page + in: query + description: A page number within the paginated result set. + required: false + type: integer + - name: page_size + in: query + description: Number of results to return per page. + required: false + type: integer + responses: + '200': + description: '' + schema: + required: + - count + - results + type: object + properties: + count: + type: integer + next: + type: string + format: uri + x-nullable: true + previous: + type: string + format: uri + x-nullable: true + results: + type: array + items: + $ref: '#/definitions/NotifierUser' + tags: + - notifier + parameters: [] + /notifier/v1/users/{id}/: + get: + operationId: notifier_v1_users_read + description: "An endpoint that the notifier can use to retrieve users who have\ + \ enabled\ndaily forum digests, including all information that the notifier\ + \ needs about\nsuch users." + parameters: [] + responses: + '200': + description: '' + schema: + $ref: '#/definitions/NotifierUser' + tags: + - notifier + parameters: + - name: id + in: path + description: A unique integer value identifying this user. + required: true + type: integer + /organizations/v0/organizations/: + get: + operationId: organizations_v0_organizations_list + description: "Organization view to fetch list organization data or single organization\n\ + using organization short name." + parameters: + - name: page + in: query + description: A page number within the paginated result set. + required: false + type: integer + - name: page_size + in: query + description: Number of results to return per page. + required: false + type: integer + responses: + '200': + description: '' + schema: + required: + - count + - results + type: object + properties: + count: + type: integer + next: + type: string + format: uri + x-nullable: true + previous: + type: string + format: uri + x-nullable: true + results: + type: array + items: + $ref: '#/definitions/Organization' + tags: + - organizations + parameters: [] + /organizations/v0/organizations/{short_name}/: + get: + operationId: organizations_v0_organizations_read + description: "Organization view to fetch list organization data or single organization\n\ + using organization short name." + parameters: [] + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Organization' + tags: + - organizations + parameters: + - name: short_name + in: path + description: Please do not use spaces or special characters. Only allowed + special characters are period (.), hyphen (-) and underscore (_). + required: true + type: string + /profile_images/v1/{username}/remove: + post: + operationId: profile_images_v1_remove_create + description: POST /api/profile_images/v1/{username}/remove + parameters: [] + responses: + '201': + description: '' + tags: + - profile_images + parameters: + - name: username + in: path + required: true + type: string + /profile_images/v1/{username}/upload: + post: + operationId: profile_images_v1_upload_create + description: POST /api/profile_images/v1/{username}/upload + parameters: [] + responses: + '201': + description: '' + consumes: + - multipart/form-data + - application/x-www-form-urlencoded + tags: + - profile_images + parameters: + - name: username + in: path + required: true + type: string + /program_enrollments/v1/integration-reset: + post: + operationId: program_enrollments_v1_integration-reset_create + description: Reset enrollment and user data for organization + parameters: [] + responses: + '201': + description: '' + tags: + - program_enrollments + parameters: [] + /program_enrollments/v1/programs/enrollments/: + get: + operationId: program_enrollments_v1_programs_enrollments_list + description: How to respond to a GET request to this endpoint + parameters: [] + responses: + '200': + description: '' + tags: + - program_enrollments + parameters: [] + /program_enrollments/v1/programs/readonly_access/: + get: + operationId: program_enrollments_v1_programs_readonly_access_list + description: How to respond to a GET request to this endpoint + parameters: [] + responses: + '200': + description: '' + tags: + - program_enrollments + parameters: [] + /program_enrollments/v1/programs/{program_uuid}/courses/{course_id}/enrollments/: + get: + operationId: program_enrollments_v1_programs_courses_enrollments_list + description: Defines the GET list endpoint for ProgramCourseEnrollment objects. + parameters: + - name: cursor + in: query + description: The pagination cursor value. + required: false + type: string + - name: page_size + in: query + description: Number of results to return per page. + required: false + type: integer + responses: + '200': + description: '' + tags: + - program_enrollments + post: + operationId: program_enrollments_v1_programs_courses_enrollments_create + description: Enroll a list of students in a course in a program + parameters: [] + responses: + '201': + description: '' + tags: + - program_enrollments + put: + operationId: program_enrollments_v1_programs_courses_enrollments_update + description: Create or Update the program course enrollments of a list of learners + parameters: [] + responses: + '200': + description: '' + tags: + - program_enrollments + patch: + operationId: program_enrollments_v1_programs_courses_enrollments_partial_update + description: Modify the program course enrollments of a list of learners + parameters: [] + responses: + '200': + description: '' + tags: + - program_enrollments + parameters: + - name: course_id + in: path + required: true + type: string + - name: program_uuid + in: path + required: true + type: string + /program_enrollments/v1/programs/{program_uuid}/courses/{course_id}/grades/: + get: + operationId: program_enrollments_v1_programs_courses_grades_list + description: Defines the GET list endpoint for ProgramCourseGrade objects. + parameters: + - name: cursor + in: query + description: The pagination cursor value. + required: false + type: string + - name: page_size + in: query + description: Number of results to return per page. + required: false + type: integer + responses: + '200': + description: '' + tags: + - program_enrollments + parameters: + - name: course_id + in: path + required: true + type: string + - name: program_uuid + in: path + required: true + type: string + /program_enrollments/v1/programs/{program_uuid}/enrollments/: + get: + operationId: program_enrollments_v1_programs_enrollments_list + description: Defines the GET list endpoint for ProgramEnrollment objects. + parameters: + - name: cursor + in: query + description: The pagination cursor value. + required: false + type: string + - name: page_size + in: query + description: Number of results to return per page. + required: false + type: integer + responses: + '200': + description: '' + tags: + - program_enrollments + post: + operationId: program_enrollments_v1_programs_enrollments_create + description: Create program enrollments for a list of learners + parameters: [] + responses: + '201': + description: '' + tags: + - program_enrollments + put: + operationId: program_enrollments_v1_programs_enrollments_update + description: Create/modify program enrollments for a list of learners + parameters: [] + responses: + '200': + description: '' + tags: + - program_enrollments + patch: + operationId: program_enrollments_v1_programs_enrollments_partial_update + description: Modify program enrollments for a list of learners + parameters: [] + responses: + '200': + description: '' + tags: + - program_enrollments + parameters: + - name: program_uuid + in: path + required: true + type: string + /program_enrollments/v1/programs/{program_uuid}/overview/: + get: + operationId: program_enrollments_v1_programs_overview_list + description: "Defines the GET endpoint for overviews of course enrollments\n\ + for a user as part of a program." + parameters: [] + responses: + '200': + description: '' + tags: + - program_enrollments + parameters: + - name: program_uuid + in: path + required: true + type: string + /team/v0/team_membership/: + get: + operationId: team_v0_team_membership_list + description: GET /api/team/v0/team_membership + parameters: + - name: page + in: query + description: A page number within the paginated result set. + required: false + type: integer + - name: page_size + in: query + description: Number of results to return per page. + required: false + type: integer + responses: + '200': + description: '' + tags: + - team + post: + operationId: team_v0_team_membership_create + description: POST /api/team/v0/team_membership + parameters: [] + responses: + '201': + description: '' + tags: + - team + parameters: [] + /team/v0/team_membership/{team_id},{username}: + get: + operationId: team_v0_team_membership_read + description: GET /api/team/v0/team_membership/{team_id},{username} + parameters: [] + responses: + '200': + description: '' + tags: + - team + delete: + operationId: team_v0_team_membership_delete + description: DELETE /api/team/v0/team_membership/{team_id},{username} + parameters: [] + responses: + '204': + description: '' + tags: + - team + parameters: + - name: team_id + in: path + required: true + type: string + - name: username + in: path + required: true + type: string + /team/v0/teams/: + get: + operationId: team_v0_teams_list + description: GET /api/team/v0/teams/ + parameters: + - name: page + in: query + description: A page number within the paginated result set. + required: false + type: integer + - name: page_size + in: query + description: Number of results to return per page. + required: false + type: integer + responses: + '200': + description: '' + tags: + - team + post: + operationId: team_v0_teams_create + description: POST /api/team/v0/teams/ + parameters: [] + responses: + '201': + description: '' + tags: + - team + parameters: [] + /team/v0/teams/{team_id}: + get: + operationId: team_v0_teams_read + description: Retrieves the specified resource using the RetrieveModelMixin. + parameters: [] + responses: + '200': + description: '' + consumes: + - application/merge-patch+json + tags: + - team + patch: + operationId: team_v0_teams_partial_update + description: Checks for validation errors, then updates the model using the + UpdateModelMixin. + parameters: [] + responses: + '200': + description: '' + consumes: + - application/merge-patch+json + tags: + - team + delete: + operationId: team_v0_teams_delete + description: DELETE /api/team/v0/teams/{team_id} + parameters: [] + responses: + '204': + description: '' + consumes: + - application/merge-patch+json + tags: + - team + parameters: + - name: team_id + in: path + required: true + type: string + /team/v0/topics/: + get: + operationId: team_v0_topics_list + description: GET /api/team/v0/topics/?course_id={course_id} + parameters: + - name: page + in: query + description: A page number within the paginated result set. + required: false + type: integer + - name: page_size + in: query + description: Number of results to return per page. + required: false + type: integer + responses: + '200': + description: '' + tags: + - team + parameters: [] + /team/v0/topics/{topic_id},{course_id}: + get: + operationId: team_v0_topics_read + description: GET /api/team/v0/topics/{topic_id},{course_id}/ + parameters: [] + responses: + '200': + description: '' + tags: + - team + parameters: + - name: course_id + in: path + required: true + type: string + - name: topic_id + in: path + required: true + type: string + /third_party_auth/v0/providers/user_status: + get: + operationId: third_party_auth_v0_providers_user_status_list + summary: GET /api/third_party_auth/v0/providers/user_status/ + description: "**GET Response Values**\n{\n \"accepts_logins\": true,\n \ + \ \"name\": \"Google\",\n \"disconnect_url\": \"/auth/disconnect/google-oauth2/?\"\ + ,\n \"connect_url\": \"/auth/login/google-oauth2/?auth_entry=account_settings&next=%2Faccount%2Fsettings\"\ + ,\n \"connected\": false,\n \"id\": \"oa2-google-oauth2\"\n}" + parameters: [] + responses: + '200': + description: '' + tags: + - third_party_auth + parameters: [] + /third_party_auth/v0/providers/{provider_id}{var}/users: + get: + operationId: third_party_auth_v0_providers_users_list + summary: Map between the third party auth account IDs (remote_id) and EdX username. + description: "This API is intended to be a server-to-server endpoint. An on-campus\ + \ middleware or system should consume this.\n\n**Use Case**\n\n Get a paginated\ + \ list of mappings between edX users and remote user IDs for all users currently\n\ + \ linked to the given backend.\n\n The list can be filtered by edx username\ + \ or third party ids. The filter is limited by the max length of URL.\n \ + \ It is suggested to query no more than 50 usernames or remote_ids in each\ + \ request to stay within above\n limitation\n\n The page size can be\ + \ changed by specifying `page_size` parameter in the request.\n\n**Example\ + \ Requests**\n\n GET /api/third_party_auth/v0/providers/{provider_id}/users\n\ + \n GET /api/third_party_auth/v0/providers/{provider_id}/users?username={username1},{username2}\n\ + \n GET /api/third_party_auth/v0/providers/{provider_id}/users?username={username1}&usernames={username2}\n\ + \n GET /api/third_party_auth/v0/providers/{provider_id}/users?remote_id={remote_id1},{remote_id2}\n\ + \n GET /api/third_party_auth/v0/providers/{provider_id}/users?remote_id={remote_id1}&remote_id={remote_id2}\n\ + \n GET /api/third_party_auth/v0/providers/{provider_id}/users?username={username1}&remote_id={remote_id1}\n\ + \n**URL Parameters**\n\n * provider_id: The unique identifier of third_party_auth\ + \ provider (e.g. \"saml-ubc\", \"oa2-google\", etc.\n This is not the\ + \ same thing as the backend_name.). (Optional/future: We may also want to\ + \ allow\n this to be an 'external domain' like 'ssl:MIT' so that this\ + \ API can also search the legacy\n ExternalAuthMap table used by Standford/MIT)\n\ + \n**Query Parameters**\n\n * remote_ids: Optional. List of comma separated\ + \ remote (third party) user IDs to filter the result set.\n e.g. ?remote_ids=8721384623\n\ + \n * usernames: Optional. List of comma separated edX usernames to filter\ + \ the result set.\n e.g. ?usernames=bob123,jane456\n\n * page, page_size:\ + \ Optional. Used for paging the result set, especially when getting\n \ + \ an unfiltered list.\n\n**Response Values**\n\n If the request for information\ + \ about the user is successful, an HTTP 200 \"OK\" response\n is returned.\n\ + \n The HTTP 200 response has the following values:\n\n * count: The\ + \ number of mappings for the backend.\n\n * next: The URI to the next page\ + \ of the mappings.\n\n * previous: The URI to the previous page of the\ + \ mappings.\n\n * num_pages: The number of pages listing the mappings.\n\ + \n * results: A list of mappings returned. Each collection in the list\n\ + \ contains these fields.\n\n * username: The edx username\n\n\ + \ * remote_id: The Id from third party auth provider" + parameters: + - name: page + in: query + description: A page number within the paginated result set. + required: false + type: integer + - name: page_size + in: query + description: Number of results to return per page. + required: false + type: integer + responses: + '200': + description: '' + schema: + required: + - count + - results + type: object + properties: + count: + type: integer + next: + type: string + format: uri + x-nullable: true + previous: + type: string + format: uri + x-nullable: true + results: + type: array + items: + $ref: '#/definitions/UserMapping' + tags: + - third_party_auth + parameters: + - name: provider_id + in: path + required: true + type: string + - name: var + in: path + required: true + type: string + /third_party_auth/v0/users/: + get: + operationId: third_party_auth_v0_users_list + summary: Read provider information for a user. + description: "Allows reading the list of providers for a specified user.\n\n\ + Args:\n request (Request): The HTTP GET request\n\nRequest Parameters:\n\ + \ Must provide one of 'email' or 'username'. If both are provided,\n \ + \ the username will be ignored.\n\nReturn:\n JSON serialized list of\ + \ the providers linked to this user." + parameters: [] + responses: + '200': + description: '' + tags: + - third_party_auth + parameters: [] + /third_party_auth/v0/users/{username}: + get: + operationId: third_party_auth_v0_users_read + summary: Read provider information for a user. + description: "Allows reading the list of providers for a specified user.\n\n\ + Args:\n request (Request): The HTTP GET request\n username (str): Fetch\ + \ the list of providers linked to this user\n\nReturn:\n JSON serialized\ + \ list of the providers linked to this user." + parameters: [] + responses: + '200': + description: '' + tags: + - third_party_auth + parameters: + - name: username + in: path + required: true + type: string + /user/v1/accounts: + get: + operationId: user_v1_accounts_list + description: GET /api/user/v1/accounts?username={username1,username2} + parameters: [] + responses: + '200': + description: '' + consumes: + - application/merge-patch+json + tags: + - user + parameters: [] + /user/v1/accounts/deactivate_logout/: + post: + operationId: user_v1_accounts_deactivate_logout_create + summary: POST /api/user/v1/accounts/deactivate_logout/ + description: "Marks the user as having no password set for deactivation purposes,\n\ + and logs the user out." + parameters: [] + responses: + '201': + description: '' + tags: + - user + parameters: [] + /user/v1/accounts/replace_usernames/: + post: + operationId: user_v1_accounts_replace_usernames_create + description: "POST /api/user/v1/accounts/replace_usernames/\n{\n \"username_mappings\"\ + : [\n {\"current_username_1\": \"desired_username_1\"},\n {\"\ + current_username_2\": \"desired_username_2\"}\n ]\n}\n\n**POST Parameters**\n\ + \nA POST request must include the following parameter.\n\n* username_mappings:\ + \ Required. A list of objects that map the current username (key)\n to the\ + \ desired username (value)\n\n**POST Response Values**\n\nAs long as data\ + \ validation passes, the request will return a 200 with a new mapping\nof\ + \ old usernames (key) to new username (value)\n\n{\n \"successful_replacements\"\ + : [\n {\"old_username_1\": \"new_username_1\"}\n ],\n \"failed_replacements\"\ + : [\n {\"old_username_2\": \"new_username_2\"}\n ]\n}" + parameters: [] + responses: + '201': + description: '' + tags: + - user + parameters: [] + /user/v1/accounts/retire/: + post: + operationId: user_v1_accounts_post + summary: POST /api/user/v1/accounts/retire/ + description: "{\n 'username': 'user_to_retire'\n}\n\nRetires the user with\ + \ the given username. This includes\nretiring this username, the associated\ + \ email address, and\nany other PII associated with this user." + parameters: [] + responses: + '201': + description: '' + tags: + - user + parameters: [] + /user/v1/accounts/retire_misc/: + post: + operationId: user_v1_accounts_post + summary: POST /api/user/v1/accounts/retire_misc/ + description: "{\n 'username': 'user_to_retire'\n}\n\nRetires the user with\ + \ the given username in the LMS." + parameters: [] + responses: + '201': + description: '' + tags: + - user + parameters: [] + /user/v1/accounts/retirement_cleanup/: + post: + operationId: user_v1_accounts_cleanup + summary: POST /api/user/v1/accounts/retirement_cleanup/ + description: "{\n 'usernames': ['user1', 'user2', ...]\n}\n\nDeletes a batch\ + \ of retirement requests by username." + parameters: [] + responses: + '201': + description: '' + tags: + - user + parameters: [] + /user/v1/accounts/retirement_partner_report/: + post: + operationId: user_v1_accounts_retirement_partner_report_create + summary: POST /api/user/v1/accounts/retirement_partner_report/ + description: "Returns the list of UserRetirementPartnerReportingStatus users\n\ + that are not already being processed and updates their status\nto indicate\ + \ they are currently being processed." + parameters: [] + responses: + '201': + description: '' + tags: + - user + put: + operationId: user_v1_accounts_retirement_partner_report_update + summary: PUT /api/user/v1/accounts/retirement_partner_report/ + description: "{\n 'username': 'user_to_retire'\n}\n\nCreates a UserRetirementPartnerReportingStatus\ + \ object for the given user\nas part of the retirement pipeline." + parameters: [] + responses: + '200': + description: '' + tags: + - user + parameters: [] + /user/v1/accounts/retirement_partner_report_cleanup/: + post: + operationId: user_v1_accounts_retirement_partner_cleanup + summary: POST /api/user/v1/accounts/retirement_partner_report_cleanup/ + description: "[{'original_username': 'user1'}, {'original_username': 'user2'},\ + \ ...]\n\nDeletes UserRetirementPartnerReportingStatus objects for a list\ + \ of users\nthat have been reported on." + parameters: [] + responses: + '201': + description: '' + tags: + - user + parameters: [] + /user/v1/accounts/retirement_queue/: + get: + operationId: user_v1_accounts_retirement_queue + summary: "GET /api/user/v1/accounts/retirement_queue/\n{'cool_off_days': 7,\ + \ 'states': ['PENDING', 'COMPLETE']}" + description: "Returns the list of RetirementStatus users in the given states\ + \ that were\ncreated in the retirement queue at least `cool_off_days` ago." + parameters: [] + responses: + '200': + description: '' + tags: + - user + parameters: [] + /user/v1/accounts/retirements_by_status_and_date/: + get: + operationId: user_v1_accounts_retirements_by_status_and_date + summary: "GET /api/user/v1/accounts/retirements_by_status_and_date/\n?start_date=2018-09-05&end_date=2018-09-07&state=COMPLETE" + description: "Returns a list of UserRetirementStatusSerializer serialized\n\ + RetirementStatus rows in the given state that were created in the\nretirement\ + \ queue between the dates given. Date range is inclusive,\nso to get one day\ + \ you would set both dates to that day." + parameters: [] + responses: + '200': + description: '' + tags: + - user + parameters: [] + /user/v1/accounts/update_retirement_status/: + patch: + operationId: user_v1_accounts_update_retirement_status_partial_update + summary: PATCH /api/user/v1/accounts/update_retirement_status/ + description: "{\n 'username': 'user_to_retire',\n 'new_state': 'LOCKING_COMPLETE',\n\ + \ 'response': 'User account locked and logged out.'\n}\n\nUpdates the RetirementStatus\ + \ row for the given user to the new\nstatus, and append any messages to the\ + \ message log.\n\nNote that this implementation DOES NOT use the \"merge patch\"\ + \nimplementation seen in AccountViewSet. Slumber, the project\nwe use to power\ + \ edx-rest-api-client, does not currently support\nit. The content type for\ + \ this request is 'application/json'." + parameters: [] + responses: + '200': + description: '' + tags: + - user + parameters: [] + /user/v1/accounts/{username}: + get: + operationId: user_v1_accounts_read + description: GET /api/user/v1/accounts/{username}/ + parameters: [] + responses: + '200': + description: '' + consumes: + - application/merge-patch+json + tags: + - user + patch: + operationId: user_v1_accounts_partial_update + summary: PATCH /api/user/v1/accounts/{username}/ + description: "Note that this implementation is the \"merge patch\" implementation\ + \ proposed in\nhttps://tools.ietf.org/html/rfc7396. The content_type must\ + \ be \"application/merge-patch+json\" or\nelse an error response with status\ + \ code 415 will be returned." + parameters: [] + responses: + '200': + description: '' + consumes: + - application/merge-patch+json + tags: + - user + parameters: + - name: username + in: path + required: true + type: string + /user/v1/accounts/{username}/deactivate/: + post: + operationId: user_v1_accounts_deactivate_create + summary: POST /api/user/v1/accounts/{username}/deactivate/ + description: Marks the user as having no password set for deactivation purposes. + parameters: [] + responses: + '201': + description: '' + tags: + - user + parameters: + - name: username + in: path + required: true + type: string + /user/v1/accounts/{username}/image: + post: + operationId: user_v1_accounts_image_create + description: POST /api/user/v1/accounts/{username}/image + parameters: [] + responses: + '201': + description: '' + consumes: + - multipart/form-data + - application/x-www-form-urlencoded + tags: + - user + delete: + operationId: user_v1_accounts_image_delete + description: DELETE /api/user/v1/accounts/{username}/image + parameters: [] + responses: + '204': + description: '' + consumes: + - multipart/form-data + - application/x-www-form-urlencoded + tags: + - user + parameters: + - name: username + in: path + required: true + type: string + /user/v1/accounts/{username}/retirement_status/: + get: + operationId: user_v1_accounts_retirement_status_read + description: "GET /api/user/v1/accounts/{username}/retirement_status/\nReturns\ + \ the RetirementStatus of a given user, or 404 if that row\ndoesn't exist." + parameters: [] + responses: + '200': + description: '' + tags: + - user + parameters: + - name: username + in: path + required: true + type: string + /user/v1/accounts/{username}/verification_status/: + get: + operationId: user_v1_accounts_verification_status_read + description: IDVerificationStatus detail endpoint. + parameters: [] + responses: + '200': + description: '' + tags: + - user + parameters: + - name: username + in: path + required: true + type: string + /user/v1/me: + get: + operationId: user_v1_get + description: GET /api/user/v1/me + parameters: [] + responses: + '200': + description: '' + consumes: + - application/merge-patch+json + tags: + - user + parameters: [] + /user/v1/preferences/{username}: + get: + operationId: user_v1_preferences_read + description: GET /api/user/v1/preferences/{username}/ + parameters: [] + responses: + '200': + description: '' + consumes: + - application/merge-patch+json + tags: + - user + patch: + operationId: user_v1_preferences_partial_update + description: PATCH /api/user/v1/preferences/{username}/ + parameters: [] + responses: + '200': + description: '' + consumes: + - application/merge-patch+json + tags: + - user + parameters: + - name: username + in: path + required: true + type: string + /user/v1/preferences/{username}/{preference_key}: + get: + operationId: user_v1_preferences_read + description: GET /api/user/v1/preferences/{username}/{preference_key} + parameters: [] + responses: + '200': + description: '' + tags: + - user + put: + operationId: user_v1_preferences_update + description: PUT /api/user/v1/preferences/{username}/{preference_key} + parameters: [] + responses: + '200': + description: '' + tags: + - user + delete: + operationId: user_v1_preferences_delete + description: DELETE /api/user/v1/preferences/{username}/{preference_key} + parameters: [] + responses: + '204': + description: '' + tags: + - user + parameters: + - name: preference_key + in: path + required: true + type: string + - name: username + in: path + required: true + type: string + /user/v1/validation/registration: + post: + operationId: user_v1_validation_registration_create + summary: POST /api/user/v1/validation/registration/ + description: "Expects request of the form\n>>> {\n>>> \"name\": \"Dan the\ + \ Validator\",\n>>> \"username\": \"mslm\",\n>>> \"email\": \"mslm@gmail.com\"\ + ,\n>>> \"confirm_email\": \"mslm@gmail.com\",\n>>> \"password\": \"\ + password123\",\n>>> \"country\": \"PK\"\n>>> }\nwhere each key is the\ + \ appropriate form field name and the value is\nuser input. One may enter\ + \ individual inputs if needed. Some inputs\ncan get extra verification checks\ + \ if entered along with others,\nlike when the password may not equal the\ + \ username." + parameters: [] + responses: + '201': + description: '' + tags: + - user + parameters: [] + /val/v0/videos/: + get: + operationId: val_v0_videos_list + description: GETs or POST video objects + parameters: + - name: page + in: query + description: A page number within the paginated result set. + required: false + type: integer + - name: page_size + in: query + description: Number of results to return per page. + required: false + type: integer + responses: + '200': + description: '' + schema: + required: + - count + - results + type: object + properties: + count: + type: integer + next: + type: string + format: uri + x-nullable: true + previous: + type: string + format: uri + x-nullable: true + results: + type: array + items: + $ref: '#/definitions/Video' + tags: + - val + post: + operationId: val_v0_videos_create + description: GETs or POST video objects + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/Video' + responses: + '201': + description: '' + schema: + $ref: '#/definitions/Video' + tags: + - val + parameters: [] + /val/v0/videos/missing-hls/: + post: + operationId: val_v0_videos_missing-hls_create + summary: 'Retrieve video IDs that are missing HLS profiles. This endpoint supports + 2 types of input data:' + description: "1. If we want a batch of video ids which are missing HLS profile\ + \ irrespective of their courses, the request\n data should be in following\ + \ format:\n {\n 'batch_size': 50,\n 'offset':\ + \ 0\n }\n And response will be in following format:\n {\n\ + \ 'videos': ['video_id1', 'video_id2', 'video_id3', ... , video_id50],\n\ + \ 'total': 300,\n 'offset': 50,\n 'batch_size':\ + \ 50\n }\n\n2. If we want all the videos which are missing HLS profiles\ + \ in a set of specific courses, the request data\n should be in following\ + \ format:\n {\n 'courses': [\n 'course_id1',\n\ + \ 'course_id2',\n ...\n ]\n \ + \ }\n And response will be in following format:\n {\n \ + \ 'videos': ['video_id1', 'video_id2', 'video_id3', ...]\n }" + parameters: [] + responses: + '201': + description: '' + tags: + - val + put: + operationId: val_v0_videos_missing-hls_update + summary: Update a single profile for a given video. + description: "Example request data:\n {\n 'edx_video_id': '1234'\n\ + \ 'profile': 'hls',\n 'encode_data': {\n 'url': 'foo.com/qwe.m3u8'\n\ + \ 'file_size': 34\n 'bitrate': 12\n }\n }" + parameters: [] + responses: + '200': + description: '' + tags: + - val + parameters: [] + /val/v0/videos/status/: + patch: + operationId: val_v0_videos_status_partial_update + description: Update the status of a video. + parameters: [] + responses: + '200': + description: '' + tags: + - val + parameters: [] + /val/v0/videos/video-images/update/: + post: + operationId: val_v0_videos_video-images_update_create + description: Update a course video image instance with auto generated image + names. + parameters: [] + responses: + '201': + description: '' + tags: + - val + parameters: [] + /val/v0/videos/video-transcripts/create/: + post: + operationId: val_v0_videos_video-transcripts_create_create + summary: Creates a video transcript instance with the given information. + description: "Arguments:\n request: A WSGI request." + parameters: [] + responses: + '201': + description: '' + tags: + - val + parameters: [] + /val/v0/videos/{edx_video_id}: + get: + operationId: val_v0_videos_read + description: Gets a video instance given its edx_video_id + parameters: [] + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Video' + tags: + - val + put: + operationId: val_v0_videos_update + description: Gets a video instance given its edx_video_id + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/Video' + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Video' + tags: + - val + patch: + operationId: val_v0_videos_partial_update + description: Gets a video instance given its edx_video_id + parameters: + - name: data + in: body + required: true + schema: + $ref: '#/definitions/Video' + responses: + '200': + description: '' + schema: + $ref: '#/definitions/Video' + tags: + - val + delete: + operationId: val_v0_videos_delete + description: Gets a video instance given its edx_video_id + parameters: [] + responses: + '204': + description: '' + tags: + - val + parameters: + - name: edx_video_id + in: path + required: true + type: string + pattern: ^[a-zA-Z0-9\-_]*$ +definitions: + BadgeClass: + title: Badge class + required: + - slug + - display_name + - description + - criteria + type: object + properties: + slug: + title: Slug + type: string + format: slug + pattern: ^[-a-zA-Z0-9_]+$ + maxLength: 255 + minLength: 1 + issuing_component: + title: Issuing component + type: string + format: slug + pattern: ^[-a-zA-Z0-9_]+$ + default: '' + maxLength: 50 + display_name: + title: Display name + type: string + maxLength: 255 + minLength: 1 + course_id: + title: Course id + type: string + maxLength: 255 + description: + title: Description + type: string + minLength: 1 + criteria: + title: Criteria + type: string + minLength: 1 + image_url: + title: Image url + type: string + readOnly: true + format: uri + BadgeAssertion: + required: + - image_url + - assertion_url + type: object + properties: + badge_class: + $ref: '#/definitions/BadgeClass' + image_url: + title: Image url + type: string + format: uri + maxLength: 200 + minLength: 1 + assertion_url: + title: Assertion url + type: string + format: uri + maxLength: 200 + minLength: 1 + created: + title: Created + type: string + format: date-time + readOnly: true + CCXCourse: + required: + - master_course_id + - display_name + - coach_email + - start + - due + - max_students_allowed + type: object + properties: + ccx_course_id: + title: Ccx course id + type: string + readOnly: true + master_course_id: + title: Master course id + type: string + minLength: 1 + display_name: + title: Display name + type: string + minLength: 1 + coach_email: + title: Coach email + type: string + format: email + minLength: 1 + start: + title: Start + type: string + due: + title: Due + type: string + max_students_allowed: + title: Max students allowed + type: integer + course_modules: + title: Course modules + type: string + readOnly: true + CohortUsersAPI: + required: + - username + type: object + properties: + username: + title: Username + description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_ + only. + type: string + pattern: ^[\w.@+-]+$ + maxLength: 150 + minLength: 1 + email: + title: Email address + type: string + format: email + maxLength: 254 + name: + title: Name + type: string + readOnly: true + commerce.CourseMode: + required: + - name + - price + type: object + properties: + name: + title: Name + type: string + minLength: 1 + currency: + title: Currency + type: string + maxLength: 8 + minLength: 1 + price: + title: Price + type: integer + sku: + title: SKU + description: 'OPTIONAL: This is the SKU (stock keeping unit) of this mode + in the external ecommerce service. Leave this blank if the course has not + yet been migrated to the ecommerce service.' + type: string + maxLength: 255 + x-nullable: true + bulk_sku: + title: Bulk SKU + description: This is the bulk SKU (stock keeping unit) of this mode in the + external ecommerce service. + type: string + maxLength: 255 + x-nullable: true + expires: + title: Expires + type: string + format: date-time + x-nullable: true + commerce.Course: + required: + - id + - modes + type: object + properties: + id: + title: Id + type: string + minLength: 1 + name: + title: Name + type: string + readOnly: true + minLength: 1 + verification_deadline: + title: Verification deadline + type: string + format: date-time + x-nullable: true + modes: + type: array + items: + $ref: '#/definitions/commerce.CourseMode' + CourseGoal: + required: + - user + - course_key + type: object + properties: + user: + title: User + type: string + pattern: ^[\w.@+-]+$ + course_key: + title: Course key + type: string + maxLength: 255 + minLength: 1 + goal_key: + title: Goal key + type: string + enum: + - certify + - complete + - explore + - unsure + course_modes.CourseMode: + required: + - course_id + - mode_slug + - mode_display_name + - currency + type: object + properties: + course_id: + title: Course id + type: string + minLength: 1 + mode_slug: + title: Mode slug + type: string + minLength: 1 + mode_display_name: + title: Mode display name + type: string + minLength: 1 + min_price: + title: Min price + type: integer + currency: + title: Currency + type: string + minLength: 1 + expiration_datetime: + title: Expiration datetime + type: string + format: date-time + expiration_datetime_is_explicit: + title: Expiration datetime is explicit + type: boolean + description: + title: Description + type: string + minLength: 1 + sku: + title: Sku + type: string + minLength: 1 + bulk_sku: + title: Bulk sku + type: string + minLength: 1 + _Media: + title: Course image + type: object + properties: + uri: + title: Uri + type: string + readOnly: true + Image: + title: Image + required: + - raw + - small + - large + type: object + properties: + raw: + title: Raw + type: string + format: uri + minLength: 1 + small: + title: Small + type: string + format: uri + minLength: 1 + large: + title: Large + type: string + format: uri + minLength: 1 + _CourseApiMediaCollection: + title: Media + required: + - course_image + - course_video + - image + type: object + properties: + course_image: + $ref: '#/definitions/_Media' + course_video: + $ref: '#/definitions/_Media' + image: + $ref: '#/definitions/Image' + Course: + required: + - effort + - end + - enrollment_start + - enrollment_end + - id + - media + - name + - number + - org + - short_description + - start + - start_display + - start_type + - pacing + - mobile_available + - invitation_only + type: object + properties: + blocks_url: + title: Blocks url + type: string + readOnly: true + effort: + title: Effort + type: string + minLength: 1 + end: + title: End + type: string + format: date-time + enrollment_start: + title: Enrollment start + type: string + format: date-time + enrollment_end: + title: Enrollment end + type: string + format: date-time + id: + title: Id + type: string + minLength: 1 + media: + $ref: '#/definitions/_CourseApiMediaCollection' + name: + title: Name + type: string + minLength: 1 + number: + title: Number + type: string + minLength: 1 + org: + title: Org + type: string + minLength: 1 + short_description: + title: Short description + type: string + minLength: 1 + start: + title: Start + type: string + format: date-time + start_display: + title: Start display + type: string + minLength: 1 + start_type: + title: Start type + type: string + minLength: 1 + pacing: + title: Pacing + type: string + minLength: 1 + mobile_available: + title: Mobile available + type: boolean + hidden: + title: Hidden + type: string + readOnly: true + invitation_only: + title: Invitation only + type: boolean + course_id: + title: Course id + type: string + readOnly: true + minLength: 1 + CourseDetail: + required: + - effort + - end + - enrollment_start + - enrollment_end + - id + - media + - name + - number + - org + - short_description + - start + - start_display + - start_type + - pacing + - mobile_available + - invitation_only + type: object + properties: + blocks_url: + title: Blocks url + type: string + readOnly: true + effort: + title: Effort + type: string + minLength: 1 + end: + title: End + type: string + format: date-time + enrollment_start: + title: Enrollment start + type: string + format: date-time + enrollment_end: + title: Enrollment end + type: string + format: date-time + id: + title: Id + type: string + minLength: 1 + media: + $ref: '#/definitions/_CourseApiMediaCollection' + name: + title: Name + type: string + minLength: 1 + number: + title: Number + type: string + minLength: 1 + org: + title: Org + type: string + minLength: 1 + short_description: + title: Short description + type: string + minLength: 1 + start: + title: Start + type: string + format: date-time + start_display: + title: Start display + type: string + minLength: 1 + start_type: + title: Start type + type: string + minLength: 1 + pacing: + title: Pacing + type: string + minLength: 1 + mobile_available: + title: Mobile available + type: boolean + hidden: + title: Hidden + type: string + readOnly: true + invitation_only: + title: Invitation only + type: boolean + course_id: + title: Course id + type: string + readOnly: true + minLength: 1 + overview: + title: Overview + type: string + readOnly: true + CreditCourse: + required: + - course_key + type: object + properties: + course_key: + title: Course key + type: string + enabled: + title: Enabled + type: boolean + CreditEligibility: + required: + - username + type: object + properties: + username: + title: Username + type: string + maxLength: 255 + minLength: 1 + course_key: + title: Course key + type: string + readOnly: true + deadline: + title: Deadline + description: Deadline for purchasing and requesting credit. + type: string + format: date-time + CreditProvider: + required: + - id + - display_name + - url + - status_url + - description + type: object + properties: + id: + title: Id + type: string + minLength: 1 + display_name: + title: Display name + description: Name of the credit provider displayed to users + type: string + maxLength: 255 + minLength: 1 + url: + title: Url + type: string + format: uri + minLength: 1 + status_url: + title: Status url + type: string + format: uri + minLength: 1 + description: + title: Description + type: string + minLength: 1 + enable_integration: + title: Enable integration + description: When true, automatically notify the credit provider when a user + requests credit. In order for this to work, a shared secret key MUST be + configured for the credit provider in secure auth settings. + type: boolean + fulfillment_instructions: + title: Fulfillment instructions + description: Plain text or html content for displaying further steps on receipt + page *after* paying for the credit to get credit for a credit course against + a credit provider. + type: string + x-nullable: true + thumbnail_url: + title: Thumbnail url + description: Thumbnail image url of the credit provider. + type: string + format: uri + maxLength: 255 + minLength: 1 + CourseEnrollmentsApiList: + required: + - course_id + type: object + properties: + created: + title: Created + type: string + format: date-time + readOnly: true + mode: + title: Mode + type: string + maxLength: 100 + minLength: 1 + is_active: + title: Is active + type: boolean + user: + title: User + type: string + readOnly: true + course_id: + title: Course id + type: string + minLength: 1 + CourseEntitlement: + required: + - user + - course_uuid + - mode + type: object + properties: + user: + title: User + type: string + pattern: ^[\w.@+-]+$ + uuid: + title: Uuid + type: string + format: uuid + readOnly: true + course_uuid: + title: Course uuid + description: UUID for the Course, not the Course Run + type: string + format: uuid + enrollment_course_run: + title: Enrollment course run + type: string + readOnly: true + minLength: 1 + expired_at: + title: Expired at + description: The date that an entitlement expired, if NULL the entitlement + has not expired. + type: string + format: date-time + x-nullable: true + created: + title: Created + type: string + format: date-time + readOnly: true + modified: + title: Modified + type: string + format: date-time + readOnly: true + mode: + title: Mode + description: The mode of the Course that will be applied on enroll. + type: string + maxLength: 100 + minLength: 1 + refund_locked: + title: Refund locked + type: boolean + order_number: + title: Order number + type: string + maxLength: 128 + minLength: 1 + x-nullable: true + support_details: + title: Support details + type: string + readOnly: true + ExperimentData: + required: + - experiment_id + - key + - value + type: object + properties: + id: + title: ID + type: integer + readOnly: true + experiment_id: + title: Experiment ID + type: integer + maximum: 65535 + minimum: 0 + user: + title: User + type: string + pattern: ^[\w.@+-]+$ + readOnly: true + key: + title: Key + type: string + maxLength: 255 + minLength: 1 + value: + title: Value + type: string + minLength: 1 + created: + title: Created + type: string + format: date-time + readOnly: true + modified: + title: Modified + type: string + format: date-time + readOnly: true + ExperimentDataCreate: + required: + - experiment_id + - key + - value + type: object + properties: + id: + title: ID + type: integer + readOnly: true + experiment_id: + title: Experiment ID + type: integer + maximum: 65535 + minimum: 0 + user: + title: User + type: string + pattern: ^[\w.@+-]+$ + key: + title: Key + type: string + maxLength: 255 + minLength: 1 + value: + title: Value + type: string + minLength: 1 + created: + title: Created + type: string + format: date-time + readOnly: true + modified: + title: Modified + type: string + format: date-time + readOnly: true + ExperimentKeyValue: + required: + - experiment_id + - key + - value + type: object + properties: + id: + title: ID + type: integer + readOnly: true + experiment_id: + title: Experiment ID + type: integer + maximum: 65535 + minimum: 0 + key: + title: Key + type: string + maxLength: 255 + minLength: 1 + value: + title: Value + type: string + minLength: 1 + created: + title: Created + type: string + format: date-time + readOnly: true + modified: + title: Modified + type: string + format: date-time + readOnly: true + mobile_api.User: + required: + - username + type: object + properties: + id: + title: ID + type: integer + readOnly: true + username: + title: Username + description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_ + only. + type: string + pattern: ^[\w.@+-]+$ + maxLength: 150 + minLength: 1 + email: + title: Email address + type: string + format: email + maxLength: 254 + name: + title: Name + type: string + readOnly: true + course_enrollments: + title: Course enrollments + type: string + readOnly: true + CourseEnrollment: + type: object + properties: + audit_access_expires: + title: Audit access expires + type: string + readOnly: true + created: + title: Created + type: string + format: date-time + readOnly: true + mode: + title: Mode + type: string + maxLength: 100 + minLength: 1 + is_active: + title: Is active + type: boolean + course: + title: Course + type: string + readOnly: true + certificate: + title: Certificate + type: string + readOnly: true + NotifierUser: + type: object + properties: + id: + title: ID + type: integer + readOnly: true + email: + title: Email address + type: string + format: email + readOnly: true + minLength: 1 + name: + title: Name + type: string + readOnly: true + preferences: + title: Preferences + type: string + readOnly: true + course_info: + title: Course info + type: string + readOnly: true + Organization: + required: + - name + - short_name + type: object + properties: + id: + title: ID + type: integer + readOnly: true + created: + title: Created + type: string + format: date-time + readOnly: true + modified: + title: Modified + type: string + format: date-time + readOnly: true + name: + title: Name + type: string + maxLength: 255 + minLength: 1 + short_name: + title: Short Name + description: Please do not use spaces or special characters. Only allowed + special characters are period (.), hyphen (-) and underscore (_). + type: string + maxLength: 255 + minLength: 1 + description: + title: Description + type: string + x-nullable: true + logo: + title: Logo + description: Please add only .PNG files for logo images. This logo will be + used on certificates. + type: string + readOnly: true + x-nullable: true + format: uri + active: + title: Active + type: boolean + UserMapping: + type: object + properties: + username: + title: Username + type: string + readOnly: true + remote_id: + title: Remote id + type: string + readOnly: true + EncodedVideo: + required: + - url + - file_size + - bitrate + - profile + type: object + properties: + created: + title: Created + type: string + format: date-time + modified: + title: Modified + type: string + format: date-time + url: + title: Url + type: string + maxLength: 200 + minLength: 1 + file_size: + title: File size + type: integer + minimum: 0 + bitrate: + title: Bitrate + type: integer + minimum: 0 + profile: + title: Profile + type: string + pattern: ^[a-zA-Z0-9\-_]*$ + Video: + required: + - encoded_videos + - edx_video_id + - duration + - status + type: object + properties: + encoded_videos: + type: array + items: + $ref: '#/definitions/EncodedVideo' + courses: + type: array + items: + type: string + uniqueItems: true + url: + title: Url + type: string + readOnly: true + created: + title: Created + type: string + format: date-time + edx_video_id: + title: Edx video id + type: string + pattern: ^[a-zA-Z0-9\-_]*$ + maxLength: 100 + minLength: 1 + client_video_id: + title: Client video id + type: string + maxLength: 255 + duration: + title: Duration + type: number + minimum: 0 + status: + title: Status + type: string + maxLength: 255 + minLength: 1 diff --git a/requirements/edx/development.in b/requirements/edx/development.in index 3a199d85e2..4b7d48d036 100644 --- a/requirements/edx/development.in +++ b/requirements/edx/development.in @@ -20,3 +20,4 @@ pyinotify # More efficient checking for runserver relo sphinx==1.8.5 # Pinned because 2.0.0 release requires Python '>=3.5' but current Python is 2.7.12 vulture # Detects possible dead/unused code, used in scripts/find-dead-code.sh modernize # Used to make Python 2 code more modern with the intention of eventually porting it over to Python 3. +recommonmark # To use markdown in sphinx