${_("Classes Start")}
- % if isinstance(course_start_date, string_types): + % if isinstance(course_start_date, str): ${course_start_date} % else: <% @@ -191,7 +188,7 @@ from six import string_types${_("Classes End")}
- % if isinstance(course_end_date, string_types): + % if isinstance(course_end_date, str): ${course_end_date} % else: <% @@ -217,7 +214,7 @@ from six import string_types %endif % if pre_requisite_courses: - <% prc_target = reverse('about_course', args=[text_type(pre_requisite_courses[0]['key'])]) %> + <% prc_target = reverse('about_course', args=[str(pre_requisite_courses[0]['key'])]) %>${_("Prerequisites")}
diff --git a/lms/templates/courseware/course_about_sidebar_header.html b/lms/templates/courseware/course_about_sidebar_header.html index c15ae42e7d..b511fe7ce6 100644 --- a/lms/templates/courseware/course_about_sidebar_header.html +++ b/lms/templates/courseware/course_about_sidebar_header.html @@ -6,7 +6,6 @@ import six from django.utils.translation import ugettext as _ from django.urls import reverse from django.conf import settings -from six import text_type %>-
% if can_unenroll:
-
- <% course_refund_url = reverse('course_run_refund_status', args=[six.text_type(course_overview.id)]) %>
+ <% course_refund_url = reverse('course_run_refund_status', args=[str(course_overview.id)]) %>
+ <% prc_target = reverse('about_course', args=[str(course_requirements['courses'][0]['key'])]) %>
${Text(_("You must successfully complete {link_start}{prc_display}{link_end} before you begin this course.")).format( diff --git a/lms/templates/dashboard/_dashboard_entitlement_actions.html b/lms/templates/dashboard/_dashboard_entitlement_actions.html index 767d516541..280f1431b5 100644 --- a/lms/templates/dashboard/_dashboard_entitlement_actions.html +++ b/lms/templates/dashboard/_dashboard_entitlement_actions.html @@ -1,7 +1,6 @@ <%page args="course_overview, entitlement, dashboard_index, can_refund_entitlement, show_email_settings" expression_filter="h"/> <%! -import six from django.utils.translation import gettext as _ from django.urls import reverse %> @@ -39,7 +38,7 @@ dropdown_btn_id = "entitlement-actions-dropdown-btn-{}".format(dashboard_index) data-dropdown-button-selector="#${dropdown_btn_id}" data-course-name="${course_overview.display_name_with_default}" data-course-number="${course_overview.number}" - data-entitlement-api-endpoint="${reverse('entitlements_api:v1:enrollments', args=[six.text_type(entitlement.uuid)]) + '?is_refund=true'}"> + data-entitlement-api-endpoint="${reverse('entitlements_api:v1:enrollments', args=[str(entitlement.uuid)]) + '?is_refund=true'}"> ${_('Unenroll')} @@ -54,7 +53,7 @@ dropdown_btn_id = "entitlement-actions-dropdown-btn-{}".format(dashboard_index) data-course-id="${course_overview.id}" data-course-number="${course_overview.number}" data-dashboard-index="${dashboard_index}" - data-optout="${six.text_type(course_overview.id) in course_optouts}">${_('Email Settings')} + data-optout="${str(course_overview.id) in course_optouts}">${_('Email Settings')} % endif diff --git a/lms/templates/header/navbar-not-authenticated.html b/lms/templates/header/navbar-not-authenticated.html index 47aa9abd2c..c1e7200ed5 100644 --- a/lms/templates/header/navbar-not-authenticated.html +++ b/lms/templates/header/navbar-not-authenticated.html @@ -9,7 +9,6 @@ from django.conf import settings from django.urls import reverse from django.utils.translation import gettext as _ -from six import text_type from openedx.core.djangoapps.user_authn.toggles import should_redirect_to_authn_microfrontend %> diff --git a/lms/templates/instructor/instructor_dashboard_2/instructor_dashboard_2.html b/lms/templates/instructor/instructor_dashboard_2/instructor_dashboard_2.html index 7f0046a79d..c0392f3293 100644 --- a/lms/templates/instructor/instructor_dashboard_2/instructor_dashboard_2.html +++ b/lms/templates/instructor/instructor_dashboard_2/instructor_dashboard_2.html @@ -54,7 +54,8 @@ from openedx.core.djangolib.markup import HTML - <%static:js group='module-descriptor-js'/> + <%static:webpack entry='HtmlBlockEditor'/> + <%static:js group='instructor_dash'/> <%static:js group='application'/> diff --git a/lms/templates/learner_dashboard/program_details_fragment.html b/lms/templates/learner_dashboard/program_details_fragment.html index d27b5e4467..7aff07a6a3 100644 --- a/lms/templates/learner_dashboard/program_details_fragment.html +++ b/lms/templates/learner_dashboard/program_details_fragment.html @@ -23,6 +23,7 @@ ProgramDetailsFactory({ creditPathways: ${credit_pathways | n, dump_js_escaped_json}, programTabViewEnabled: ${program_tab_view_enabled | n, dump_js_escaped_json}, isUserB2CSubscriptionsEnabled: ${is_user_b2c_subscriptions_enabled | n, dump_js_escaped_json}, + subscriptionsTrialLength: ${subscriptions_trial_length | n, dump_js_escaped_json}, discussionFragment: ${discussion_fragment, | n, dump_js_escaped_json}, live_fragment: ${live_fragment, | n, dump_js_escaped_json} }); diff --git a/lms/templates/learner_dashboard/programs_fragment.html b/lms/templates/learner_dashboard/programs_fragment.html index 0bf18cfaec..d3e9f3d8ef 100644 --- a/lms/templates/learner_dashboard/programs_fragment.html +++ b/lms/templates/learner_dashboard/programs_fragment.html @@ -30,9 +30,9 @@ from openedx.core.djangolib.js_utils import ( <%static:webpack entry="ProgramListFactory"> ProgramListFactory({ marketingUrl: '${marketing_url | n, js_escaped_string}', - subscriptionsMarketingUrl: '${subscriptions_marketing_url | n, js_escaped_string}', programsData: ${programs | n, dump_js_escaped_json}, programsSubscriptionData: ${programs_subscription_data | n, dump_js_escaped_json}, + subscriptionUpsellData: ${subscription_upsell_data | n, dump_js_escaped_json}, userProgress: ${progress | n, dump_js_escaped_json}, userPreferences: ${user_preferences | n, dump_js_escaped_json}, isUserB2CSubscriptionsEnabled: ${is_user_b2c_subscriptions_enabled | n, dump_js_escaped_json}, diff --git a/lms/templates/learner_dashboard/subscription_upsell_view.underscore b/lms/templates/learner_dashboard/subscription_upsell_view.underscore index ef765da17b..cc01d47c81 100644 --- a/lms/templates/learner_dashboard/subscription_upsell_view.underscore +++ b/lms/templates/learner_dashboard/subscription_upsell_view.underscore @@ -8,10 +8,13 @@
- + <%- gettext('Explore subscription options') %> diff --git a/lms/templates/main.html b/lms/templates/main.html index a723e1835f..1cbd04c1fa 100644 --- a/lms/templates/main.html +++ b/lms/templates/main.html @@ -14,7 +14,6 @@ <%namespace name='static' file='static_content.html'/> <% online_help_token = self.online_help_token() if hasattr(self, 'online_help_token') else None %> <%! -import six from lms.djangoapps.branding import api as branding_api from django.urls import reverse from django.utils.http import urlquote_plus @@ -93,7 +92,7 @@ from common.djangoapps.pipeline_mako import render_require_js_path_overrides <% rtl_css_file = self.attr.main_css.replace('.css', '-rtl.css') %> - + % else: % endif diff --git a/lms/templates/navigation/navbar-not-authenticated.html b/lms/templates/navigation/navbar-not-authenticated.html index a82a24e878..5a82a76ef0 100644 --- a/lms/templates/navigation/navbar-not-authenticated.html +++ b/lms/templates/navigation/navbar-not-authenticated.html @@ -7,7 +7,6 @@ <%! from django.urls import reverse from django.utils.translation import ugettext as _ -from six import text_type %>-
diff --git a/lms/templates/public_video_share_embed.html b/lms/templates/public_video_share_embed.html
index 5246ef92a8..1da4c2da49 100644
--- a/lms/templates/public_video_share_embed.html
+++ b/lms/templates/public_video_share_embed.html
@@ -5,7 +5,6 @@
<%namespace name='static' file='static_content.html'/>
<%!
-import six
from lms.djangoapps.branding import api as branding_api
from django.utils.translation import gettext as _
from django.utils.translation import get_language_bidi
@@ -45,7 +44,7 @@ from openedx.core.djangolib.markup import HTML
<%
rtl_css_file = self.attr.main_css.replace('.css', '-rtl.css')
%>
-
+
% else:
% endif
diff --git a/lms/templates/save_for_later/edx_ace/saveforlater/email/body.html b/lms/templates/save_for_later/edx_ace/saveforlater/email/body.html
deleted file mode 100644
index a85058c51d..0000000000
--- a/lms/templates/save_for_later/edx_ace/saveforlater/email/body.html
+++ /dev/null
@@ -1,205 +0,0 @@
-{% extends 'ace_common/edx_ace/common/base_body.html' %}
-
-{% load django_markup %}
-{% load i18n %}
-{% load static %}
-{% block content %}
-
- ${six.text_type(url["name"])}: ${six.text_type(url["description"])} +
- ${str(url["name"])}: ${str(url["description"])} % endfor
------- {% filter force_escape %} - {% blocktrans %}Check out this course on edx{% endblocktrans %} - {% endfilter %} -
- ---- {% if partner_image_url %} ---- {% endif %} --
--- {{ display_name }} -
-- {{ short_description }} -
---{% endblock %} diff --git a/lms/templates/save_for_later/edx_ace/saveforlater/email/body.txt b/lms/templates/save_for_later/edx_ace/saveforlater/email/body.txt deleted file mode 100644 index 79a6155aa6..0000000000 --- a/lms/templates/save_for_later/edx_ace/saveforlater/email/body.txt +++ /dev/null @@ -1,8 +0,0 @@ -{% load i18n %}{% autoescape off %} -{% blocktrans %}Check out this course on {{ platform_name }}.{% endblocktrans %} - -{% blocktrans %}This email message was automatically sent by {{ lms_url }} {% endblocktrans %} - -{{ confirm_link }} - -{% endautoescape %} diff --git a/lms/templates/save_for_later/edx_ace/saveforlater/email/from_name.txt b/lms/templates/save_for_later/edx_ace/saveforlater/email/from_name.txt deleted file mode 100644 index dcbc23c004..0000000000 --- a/lms/templates/save_for_later/edx_ace/saveforlater/email/from_name.txt +++ /dev/null @@ -1 +0,0 @@ -{{ platform_name }} diff --git a/lms/templates/save_for_later/edx_ace/saveforlater/email/head.html b/lms/templates/save_for_later/edx_ace/saveforlater/email/head.html deleted file mode 100644 index 366ada7ad9..0000000000 --- a/lms/templates/save_for_later/edx_ace/saveforlater/email/head.html +++ /dev/null @@ -1 +0,0 @@ -{% extends 'ace_common/edx_ace/common/base_head.html' %} diff --git a/lms/templates/save_for_later/edx_ace/saveforlater/email/subject.txt b/lms/templates/save_for_later/edx_ace/saveforlater/email/subject.txt deleted file mode 100644 index acdb68c148..0000000000 --- a/lms/templates/save_for_later/edx_ace/saveforlater/email/subject.txt +++ /dev/null @@ -1,4 +0,0 @@ -{% load i18n %} -{% autoescape off %} -{% blocktrans trimmed %} {{ display_name }} {% endblocktrans %} -{% endautoescape %} diff --git a/lms/templates/staff_problem_info.html b/lms/templates/staff_problem_info.html index 849032b15b..a8ada96817 100644 --- a/lms/templates/staff_problem_info.html +++ b/lms/templates/staff_problem_info.html @@ -4,7 +4,6 @@ from django.utils.translation import gettext as _ from openedx.core.djangolib.markup import HTML from openedx.core.djangolib.js_utils import js_escaped_string -from six import text_type %> ## The JS for this is defined in xqa_interface.html @@ -100,7 +99,7 @@ ${block_content | n, decode.utf8}--- ----- {% trans "Estimated 6 weeks" as estimated_weeks_heading %}{{ estimated_weeks_heading | force_escape }} -
-- {% trans "4-6 hours per week" as estimated_weeks_msg %}{{ estimated_weeks_msg | force_escape }} -
---- ----- {% trans "Self-paced" as self_paced_heading %}{{ self_paced_heading | force_escape }} -
-- {% trans "Progress at your own speed" as self_paced_msg %}{{ self_paced_msg | force_escape }} -
---- ----- {% trans "Free" as upgrade_heading %}{{ upgrade_heading | force_escape }} -
-- {% trans "Optional upgrade available" as upgrade_msg %}{{ upgrade_msg | force_escape }} -
-is_released = ${is_released} - location = ${text_type(location)} + location = ${str(location)} diff --git a/lms/templates/support/index.html b/lms/templates/support/index.html index 8435ab4f70..eeedea60ca 100644 --- a/lms/templates/support/index.html +++ b/lms/templates/support/index.html @@ -1,7 +1,6 @@ ## mako <%page expression_filter="h"/> <%! -import six from django.urls import reverse from django.utils.translation import gettext as _ %> @@ -18,7 +17,7 @@ ${_("Student Support")}${_('Module Fields')} ${_("Student Support")}
-
% for url in urls:
-
diff --git a/xmodule/assets/README.rst b/xmodule/assets/README.rst index c87642384f..618ba02924 100644 --- a/xmodule/assets/README.rst +++ b/xmodule/assets/README.rst @@ -75,14 +75,11 @@ Currently, edx-platform XBlock JS is defined both here in `xmodule/assets`_ and * `VerticalBlock`_ * `LibrarySourcedBlock`_ -* Some XBlock JS is also processed through Django Pipeline and used in a couple specific legacy places. - As part of an `active build refactoring`_: * We update the older builtin XBlocks to reference their JS directly rather than using copies of it. * We will move ``webpack.xmodule.config.js`` here instead of generating it. * We will consolidate all edx-platform XBlock JS here in `xmodule/assets`_. -* We will remove XBlock JS from Django Pipeline. * We will delete the ``xmodule_assets`` script. .. _xmodule/assets: https://github.com/openedx/edx-platform/tree/master/xmodule/assets diff --git a/xmodule/capa/capa_problem.py b/xmodule/capa/capa_problem.py index d8b9b85c7b..072df22dbc 100644 --- a/xmodule/capa/capa_problem.py +++ b/xmodule/capa/capa_problem.py @@ -22,7 +22,6 @@ from copy import deepcopy from datetime import datetime from xml.sax.saxutils import unescape -import six from django.conf import settings from lxml import etree @@ -181,7 +180,7 @@ class LoncapaProblem(object): self.problem_text = problem_text # parse problem XML file into an element tree - if isinstance(problem_text, six.text_type): + if isinstance(problem_text, str): # etree chokes on Unicode XML with an encoding declaration problem_text = problem_text.encode('utf-8') self.tree = etree.XML(problem_text) @@ -658,7 +657,7 @@ class LoncapaProblem(object): self.find_answer_text(answer_id, answer) for answer in current_answer ) - elif isinstance(current_answer, six.string_types) and current_answer.startswith('choice_'): + elif isinstance(current_answer, str) and current_answer.startswith('choice_'): # Many problem (e.g. checkbox) report "choice_0" "choice_1" etc. # Here we transform it elems = self.tree.xpath('//*[@id="{answer_id}"]//*[@name="{choice_number}"]'.format( @@ -677,7 +676,7 @@ class LoncapaProblem(object): log.warning("Multiple answers found for answer id: %s and choice number: %s", answer_id, current_answer) answer_text = "Multiple answers found" - elif isinstance(current_answer, six.string_types): + elif isinstance(current_answer, str): # Already a string with the answer answer_text = current_answer @@ -808,7 +807,7 @@ class LoncapaProblem(object): """ includes = self.tree.findall('.//include') for inc in includes: - filename = inc.get('file') if six.PY3 else inc.get('file').decode('utf-8') + filename = inc.get('file') if filename is not None: try: # open using LoncapaSystem OSFS filesystem @@ -961,7 +960,7 @@ class LoncapaProblem(object): Used by get_html. """ - if not isinstance(problemtree.tag, six.string_types): + if not isinstance(problemtree.tag, str): # Comment and ProcessingInstruction nodes are not Elements, # and we're ok leaving those behind. # BTW: etree gives us no good way to distinguish these things diff --git a/xmodule/capa/inputtypes.py b/xmodule/capa/inputtypes.py index c3f67bc0b0..5decad4a2c 100644 --- a/xmodule/capa/inputtypes.py +++ b/xmodule/capa/inputtypes.py @@ -55,7 +55,6 @@ from calc.preview import latex_preview from chem import chemcalc from lxml import etree -from six import text_type from xmodule.capa.xqueue_interface import XQUEUE_TIMEOUT from openedx.core.djangolib.markup import HTML, Text @@ -85,7 +84,7 @@ class Status(object): } __slots__ = ('classname', '_status', 'display_name', 'display_tooltip') - def __init__(self, status, gettext_func=six.text_type): + def __init__(self, status, gettext_func=str): self.classname = self.css_classes.get(status, status) _ = gettext_func names = { @@ -110,7 +109,7 @@ class Status(object): ['incomplete', 'unanswered', 'unsubmitted'], _('Not yet answered.') ) ) - self.display_name = names.get(status, six.text_type(status)) + self.display_name = names.get(status, str(status)) self.display_tooltip = tooltips.get(status, '') self._status = status or '' @@ -255,7 +254,7 @@ class InputTypeBase(object): except Exception as err: # lint-amnesty, pylint: disable=broad-except # Something went wrong: add xml to message, but keep the traceback msg = "Error in xml '{x}': {err} ".format( - x=etree.tostring(xml), err=text_type(err)) + x=etree.tostring(xml), err=str(err)) six.reraise(Exception, Exception(msg), sys.exc_info()[2]) @classmethod @@ -427,10 +426,7 @@ class OptionInput(InputTypeBase): options = re.sub(r"([a-zA-Z])('|\\')([a-zA-Z])", r"\1'\3", options) options = re.sub(r"\\'", r"'", options) # replace already escaped single quotes # parse the set of possible options - if six.PY3: - lexer = shlex.shlex(options[1:-1]) - else: - lexer = shlex.shlex(options[1:-1].encode('utf-8')) + lexer = shlex.shlex(options[1:-1]) lexer.quotes = "'" # Allow options to be separated by whitespace as well as commas @@ -438,10 +434,7 @@ class OptionInput(InputTypeBase): # remove quotes # convert escaped single quotes (html encoded string) back to single quotes - if six.PY3: - tokens = [x[1:-1].replace("'", "'") for x in lexer] - else: - tokens = [x[1:-1].decode('utf-8').replace("'", "'") for x in lexer] + tokens = [x[1:-1].replace("'", "'") for x in lexer] # make list of (option_id, option_description), with description=id return [(t, t) for t in tokens] @@ -564,7 +557,7 @@ class ChoiceGroup(InputTypeBase): return choices def get_user_visible_answer(self, internal_answer): - if isinstance(internal_answer, six.string_types): + if isinstance(internal_answer, str): return self._choices_map[internal_answer] return [self._choices_map[i] for i in internal_answer] @@ -1571,7 +1564,7 @@ class AnnotationInput(InputTypeBase): d = {} comment_value = d.get('comment', '') - if not isinstance(comment_value, six.string_types): + if not isinstance(comment_value, str): comment_value = '' options_value = d.get('options', []) diff --git a/xmodule/capa/responsetypes.py b/xmodule/capa/responsetypes.py index 4be0eea1b5..73378e7c0a 100644 --- a/xmodule/capa/responsetypes.py +++ b/xmodule/capa/responsetypes.py @@ -33,7 +33,6 @@ from lxml.html.soupparser import fromstring as fromstring_bs # uses Beautiful S from pyparsing import ParseException from pytz import UTC from shapely.geometry import MultiPoint, Point -from six import text_type from six.moves import map, range, zip import xmodule.capa.safe_exec as safe_exec @@ -177,14 +176,14 @@ class LoncapaResponse(six.with_metaclass(abc.ABCMeta, object)): for abox in inputfields: if abox.tag not in self.allowed_inputfields: msg = "%s: cannot have input field %s" % ( - six.text_type(self), abox.tag) + str(self), abox.tag) msg += "\nSee XML source line %s" % getattr( xml, 'sourceline', '[unavailable]') raise LoncapaProblemError(msg) if self.max_inputfields and len(inputfields) > self.max_inputfields: msg = "%s: cannot have more than %s input fields" % ( - six.text_type(self), self.max_inputfields) + str(self), self.max_inputfields) msg += "\nSee XML source line %s" % getattr( xml, 'sourceline', '[unavailable]') raise LoncapaProblemError(msg) @@ -192,7 +191,7 @@ class LoncapaResponse(six.with_metaclass(abc.ABCMeta, object)): for prop in self.required_attributes: if not xml.get(prop): msg = "Error in problem specification: %s missing required attribute %s" % ( - six.text_type(self), prop) + str(self), prop) msg += "\nSee XML source line %s" % getattr( xml, 'sourceline', '[unavailable]') raise LoncapaProblemError(msg) @@ -365,7 +364,7 @@ class LoncapaResponse(six.with_metaclass(abc.ABCMeta, object)): # This is the "feedback hint" event event_info = {} - event_info['module_id'] = text_type(self.capa_block.location) + event_info['module_id'] = str(self.capa_block.location) event_info['problem_part_id'] = self.id event_info['trigger_type'] = 'single' # maybe be overwritten by log_extra event_info['hint_label'] = label @@ -1458,7 +1457,7 @@ class OptionResponse(LoncapaResponse): for key, val in six.iteritems(self.context): # convert val into unicode because student answer always be a unicode string # even it is a list, dict etc. - if six.text_type(val) == student_answers[aid]: + if str(val) == student_answers[aid]: return '$' + key return None @@ -1606,10 +1605,10 @@ class NumericalResponse(LoncapaResponse): err.args[0] ) except ValueError as val_err: - if 'factorial' in text_type(val_err): # lint-amnesty, pylint: disable=no-else-raise + if 'factorial' in str(val_err): # lint-amnesty, pylint: disable=no-else-raise # This is thrown when fact() or factorial() is used in an answer # that evaluates on negative and/or non-integer inputs - # text_type(ve) will be: `factorial() only accepts integral values` or + # str(ve) will be: `factorial() only accepts integral values` or # `factorial() not defined for negative values` raise StudentInputError( # lint-amnesty, pylint: disable=raise-missing-from _("Factorial function evaluated outside its domain:" @@ -2039,7 +2038,7 @@ class StringResponse(LoncapaResponse): except Exception as err: msg = '[courseware.capa.responsetypes.stringresponse] {error}: {message}'.format( error=_('error'), - message=text_type(err) + message=str(err) ) log.error(msg, exc_info=True) raise ResponseError(msg) # lint-amnesty, pylint: disable=raise-missing-from @@ -2170,7 +2169,7 @@ class CustomResponse(LoncapaResponse): """ _ = self.capa_system.i18n.gettext - log.debug('%s: student_answers=%s', six.text_type(self), student_answers) + log.debug('%s: student_answers=%s', str(self), student_answers) # ordered list of answer id's # sort the responses on the bases of the problem's position number @@ -2284,7 +2283,7 @@ class CustomResponse(LoncapaResponse): def execute_check_function(self, idset, submission): # lint-amnesty, pylint: disable=missing-function-docstring, too-many-statements # exec the check function - if isinstance(self.code, six.string_types): # lint-amnesty, pylint: disable=too-many-nested-blocks + if isinstance(self.code, str): # lint-amnesty, pylint: disable=too-many-nested-blocks try: safe_exec.safe_exec( self.code, @@ -2512,7 +2511,7 @@ class CustomResponse(LoncapaResponse): # Notify student with a student input error _, _, traceback_obj = sys.exc_info() - raise ResponseError(text_type(err), traceback_obj) + raise ResponseError(str(err), traceback_obj) #----------------------------------------------------------------------------- @@ -2897,7 +2896,7 @@ class ExternalResponse(LoncapaResponse): # nodiff --git a/lms/templates/wiki/preview_inline.html b/lms/templates/wiki/preview_inline.html index 1dd3ede920..4fdab7a575 100644 --- a/lms/templates/wiki/preview_inline.html +++ b/lms/templates/wiki/preview_inline.html @@ -40,7 +40,6 @@ {% javascript 'application' %} - {% javascript 'module-js' %} {% with mathjax_mode='wiki' %} {% include "mathjax_include.html" %} {% endwith %} diff --git a/lms/urls.py b/lms/urls.py index 390e6f9c8b..8b8462034d 100644 --- a/lms/urls.py +++ b/lms/urls.py @@ -1031,12 +1031,6 @@ if getattr(settings, 'PROVIDER_STATES_URL', None): ) ] -# save_for_later API urls -if settings.ENABLE_SAVE_FOR_LATER: - urlpatterns += [ - path('', include('lms.djangoapps.save_for_later.urls')), - ] - # Enhanced Staff Grader (ESG) URLs urlpatterns += [ path('api/ora_staff_grader/', include('lms.djangoapps.ora_staff_grader.urls', 'ora-staff-grader')), diff --git a/openedx/core/djangoapps/credentials/utils.py b/openedx/core/djangoapps/credentials/utils.py index 893aba7871..9e7f61e189 100644 --- a/openedx/core/djangoapps/credentials/utils.py +++ b/openedx/core/djangoapps/credentials/utils.py @@ -110,11 +110,11 @@ def get_credentials(user, program_uuid=None, credential_type=None): ) -def get_courses_completion_status(lms_user_id, course_run_ids): +def get_courses_completion_status(username, course_run_ids): """ - Given the lms_user_id and course run ids, checks for course completion status + Given the username and course run ids, checks for course completion status Arguments: - lms_user_id (User): The user to authenticate as when requesting credentials. + username (User): Username of the user whose credentials are being requested. course_run_ids(List): list of course run ids for which we need to check the completion status Returns: list of course_run_ids for which user has completed the course @@ -134,7 +134,7 @@ def get_courses_completion_status(lms_user_id, course_run_ids): api_response = api_client.post( completion_status_url, json={ - 'lms_user_id': lms_user_id, + 'username': username, 'course_runs': course_run_ids, } ) @@ -142,16 +142,16 @@ def get_courses_completion_status(lms_user_id, course_run_ids): course_completion_response = api_response.json() except Exception as exc: # pylint: disable=broad-except log.exception("An unexpected error occurred while reqeusting course completion statuses " - "for lms_user_id [%s] for course_run_ids [%s] with exc [%s]:", - lms_user_id, + "for user [%s] for course_run_ids [%s] with exc [%s]:", + username, course_run_ids, exc ) return [], True # Yes, This is course_credentials_data. The key is named status but # it contains all the courses data from credentials. - log.info("Course completion status response for lms_user_id [%s] for course_run_ids [%s] is [%s]", - lms_user_id, + log.info("Course completion status response for user [%s] for course_run_ids [%s] is [%s]", + username, course_run_ids, course_completion_response) course_credentials_data = course_completion_response.get('status', []) @@ -159,8 +159,8 @@ def get_courses_completion_status(lms_user_id, course_run_ids): filtered_records = [course_data['course_run']['key'] for course_data in course_credentials_data if course_data['course_run']['key'] in course_run_ids and course_data['status'] == settings.CREDENTIALS_COURSE_COMPLETION_STATE] - log.info("Filtered course completion status response for lms_user_id [%s] for course_run_ids [%s] is [%s]", - lms_user_id, + log.info("Filtered course completion status response for user [%s] for course_run_ids [%s] is [%s]", + username, course_run_ids, filtered_records) return filtered_records, False diff --git a/openedx/core/djangoapps/credit/signature.py b/openedx/core/djangoapps/credit/signature.py index a631e078a7..b95d9ffbfc 100644 --- a/openedx/core/djangoapps/credit/signature.py +++ b/openedx/core/djangoapps/credit/signature.py @@ -28,7 +28,7 @@ log = logging.getLogger(__name__) def _encode_secret(secret, provider_id): """ - Helper function for encoding text_type secrets into ascii. + Helper function for encoding string secrets into ascii. """ try: secret.encode('ascii') diff --git a/openedx/core/djangoapps/enrollments/errors.py b/openedx/core/djangoapps/enrollments/errors.py index e68228d367..167b176129 100644 --- a/openedx/core/djangoapps/enrollments/errors.py +++ b/openedx/core/djangoapps/enrollments/errors.py @@ -52,3 +52,7 @@ class EnrollmentApiLoadError(CourseEnrollmentError): class InvalidEnrollmentAttribute(CourseEnrollmentError): """Enrollment Attributes could not be validated""" pass # lint-amnesty, pylint: disable=unnecessary-pass + + +class CourseEnrollmentNotUpdatableError(CourseEnrollmentError): + """The requested enrollment could not be updated.""" diff --git a/openedx/core/djangoapps/notifications/admin.py b/openedx/core/djangoapps/notifications/admin.py index 65b7db61fd..621257ed9f 100644 --- a/openedx/core/djangoapps/notifications/admin.py +++ b/openedx/core/djangoapps/notifications/admin.py @@ -8,7 +8,10 @@ from .models import CourseNotificationPreference, Notification class NotificationAdmin(admin.ModelAdmin): - pass + """ + Admin for Notifications + """ + raw_id_fields = ('user',) class CourseNotificationPreferenceAdmin(admin.ModelAdmin): @@ -16,6 +19,7 @@ class CourseNotificationPreferenceAdmin(admin.ModelAdmin): Admin for Course Notification Preferences """ model = CourseNotificationPreference + raw_id_fields = ('user',) list_display = ['get_username', 'course_id', 'notification_preference_config'] @admin.display(description='Username', ordering='user__username') diff --git a/openedx/features/enterprise_support/enrollments/tests/test_utils.py b/openedx/features/enterprise_support/enrollments/tests/test_utils.py index 2bfab38704..d0588b2f01 100644 --- a/openedx/features/enterprise_support/enrollments/tests/test_utils.py +++ b/openedx/features/enterprise_support/enrollments/tests/test_utils.py @@ -1,11 +1,12 @@ """ Test the enterprise support utils. """ - +import ddt from unittest import mock from unittest.case import TestCase from django.core.exceptions import ObjectDoesNotExist +from django.test import override_settings from opaque_keys.edx.keys import CourseKey from openedx.core.djangoapps.course_groups.cohorts import CourseUserGroup @@ -15,8 +16,10 @@ from openedx.features.enterprise_support.enrollments.exceptions import ( CourseIdMissingException, UserDoesNotExistException ) -from openedx.features.enterprise_support.enrollments.utils import lms_enroll_user_in_course - +from openedx.features.enterprise_support.enrollments.utils import ( + lms_enroll_user_in_course, + lms_update_or_create_enrollment, +) COURSE_STRING = 'course-v1:OpenEdX+OutlineCourse+Run3' ENTERPRISE_UUID = 'enterprise_uuid' COURSE_ID = CourseKey.from_string(COURSE_STRING) @@ -26,6 +29,7 @@ COURSE_MODE = 'verified' @skip_unless_lms +@ddt.ddt class EnrollmentUtilsTest(TestCase): """ Test enterprise support utils. @@ -37,104 +41,222 @@ class EnrollmentUtilsTest(TestCase): self.a_user.id = USER_ID self.a_user.username = USERNAME - def test_validation_of_inputs_course_id(self): - with self.assertRaises(CourseIdMissingException): - lms_enroll_user_in_course(USERNAME, None, COURSE_MODE, ENTERPRISE_UUID) + def run_test_with_setting( + self, + setting, + mock_update_create_enroll, + mock_enroll_user, + test_function_true, + test_function_false, + ): + """ + Run a test with a setting. + """ + with override_settings( + ENABLE_ENTERPRISE_BACKEND_EMET_AUTO_UPGRADE_ENROLLMENT_MODE=setting + ): + if setting: + return test_function_true(mock_update_create_enroll) + return test_function_false(mock_enroll_user) - def test_validation_of_inputs_user_not_provided(self): - with self.assertRaises(UserDoesNotExistException): - lms_enroll_user_in_course( - None, - COURSE_ID, - COURSE_MODE, - ENTERPRISE_UUID, + @mock.patch('openedx.features.enterprise_support.enrollments.utils.lms_enroll_user_in_course') + @mock.patch('openedx.features.enterprise_support.enrollments.utils.lms_update_or_create_enrollment') + @ddt.data(True, False) + def test_validation_of_inputs_course_id(self, setting_value, mock_update_create_enroll, mock_enroll_user): + test_function_true = lambda mock_fn: lms_update_or_create_enrollment( + USERNAME, None, COURSE_MODE, is_active=True, enterprise_uuid=ENTERPRISE_UUID + ) + test_function_false = lambda mock_fn: lms_enroll_user_in_course(USERNAME, None, COURSE_MODE, ENTERPRISE_UUID) + with self.assertRaises(CourseIdMissingException): + self.run_test_with_setting( + setting_value, + mock_update_create_enroll, + mock_enroll_user, + test_function_true, + test_function_false ) + @mock.patch('openedx.features.enterprise_support.enrollments.utils.lms_enroll_user_in_course') + @mock.patch('openedx.features.enterprise_support.enrollments.utils.lms_update_or_create_enrollment') + @ddt.data(True, False) + def test_validation_of_inputs_user_not_provided(self, setting_value, mock_update_create_enroll, mock_enroll_user): + test_function_true = lambda mock_fn: lms_update_or_create_enrollment( + None, COURSE_ID, COURSE_MODE, is_active=True, enterprise_uuid=ENTERPRISE_UUID + ) + test_function_false = lambda mock_fn: lms_enroll_user_in_course(None, COURSE_ID, COURSE_MODE, ENTERPRISE_UUID) + with self.assertRaises(UserDoesNotExistException): + self.run_test_with_setting( + setting_value, + mock_update_create_enroll, + mock_enroll_user, + test_function_true, + test_function_false + ) + + @mock.patch('openedx.features.enterprise_support.enrollments.utils.lms_enroll_user_in_course') + @mock.patch('openedx.features.enterprise_support.enrollments.utils.lms_update_or_create_enrollment') @mock.patch('openedx.features.enterprise_support.enrollments.utils.User.objects.get') @mock.patch('openedx.features.enterprise_support.enrollments.utils.transaction') - def test_validation_of_inputs_user_not_found(self, mock_tx, mock_user_model): + @ddt.data(True, False) + def test_validation_of_inputs_user_not_found( + self, + setting_value, + mock_tx, + mock_user_model, + mock_update_create_enroll, + mock_enroll_user + ): mock_tx.return_value.atomic.side_effect = None mock_user_model.side_effect = ObjectDoesNotExist() + test_function_true = lambda mock_fn: lms_update_or_create_enrollment( + USERNAME, COURSE_ID, COURSE_MODE, is_active=True, enterprise_uuid=ENTERPRISE_UUID + ) + test_function_false = lambda mock_fn: lms_enroll_user_in_course( + USERNAME, + COURSE_ID, + COURSE_MODE, + ENTERPRISE_UUID + ) with self.assertRaises(UserDoesNotExistException): - lms_enroll_user_in_course( - USERNAME, - COURSE_ID, - COURSE_MODE, - ENTERPRISE_UUID, + self.run_test_with_setting( + setting_value, + mock_update_create_enroll, + mock_enroll_user, + test_function_true, + test_function_false ) + @mock.patch('openedx.features.enterprise_support.enrollments.utils.lms_enroll_user_in_course') + @mock.patch('openedx.features.enterprise_support.enrollments.utils.lms_update_or_create_enrollment') @mock.patch('openedx.features.enterprise_support.enrollments.utils.enrollment_api.add_enrollment') @mock.patch('openedx.features.enterprise_support.enrollments.utils.enrollment_api.get_enrollment') @mock.patch('openedx.features.enterprise_support.enrollments.utils.User.objects.get') @mock.patch('openedx.features.enterprise_support.enrollments.utils.transaction') + @ddt.data(True, False) def test_course_enrollment_error_raises( self, + setting_value, mock_tx, mock_user_model, mock_get_enrollment_api, mock_add_enrollment_api, + mock_update_create_enroll, + mock_enroll_user ): - enrollment_response = {'mode': COURSE_MODE, 'is_active': True} + test_function_true = lambda mock_fn: lms_update_or_create_enrollment( + USERNAME, COURSE_ID, COURSE_MODE, is_active=True, enterprise_uuid=ENTERPRISE_UUID + ) + test_function_false = lambda mock_fn: lms_enroll_user_in_course( + USERNAME, + COURSE_ID, + COURSE_MODE, + ENTERPRISE_UUID + ) mock_add_enrollment_api.side_effect = CourseEnrollmentError("test") mock_tx.return_value.atomic.side_effect = None - mock_get_enrollment_api.return_value = enrollment_response - mock_user_model.return_value = self.a_user + enrollment_response = {'mode': COURSE_MODE, 'is_active': True} if not setting_value else None + mock_get_enrollment_api.return_value = enrollment_response with self.assertRaises(CourseEnrollmentError): - lms_enroll_user_in_course(USERNAME, COURSE_ID, COURSE_MODE, ENTERPRISE_UUID) - mock_get_enrollment_api.assert_called_once() + self.run_test_with_setting( + setting_value, + mock_update_create_enroll, + mock_enroll_user, + test_function_true, + test_function_false + ) + mock_get_enrollment_api.assert_called_once_with(USERNAME, str(COURSE_ID)) + @mock.patch('openedx.features.enterprise_support.enrollments.utils.lms_enroll_user_in_course') + @mock.patch('openedx.features.enterprise_support.enrollments.utils.lms_update_or_create_enrollment') @mock.patch('openedx.features.enterprise_support.enrollments.utils.enrollment_api.add_enrollment') @mock.patch('openedx.features.enterprise_support.enrollments.utils.enrollment_api.get_enrollment') @mock.patch('openedx.features.enterprise_support.enrollments.utils.User.objects.get') @mock.patch('openedx.features.enterprise_support.enrollments.utils.transaction') + @ddt.data(True, False) def test_course_group_error_raises( self, + setting_value, mock_tx, mock_user_model, mock_get_enrollment_api, mock_add_enrollment_api, + mock_update_create_enroll, + mock_enroll_user ): - enrollment_response = {'mode': COURSE_MODE, 'is_active': True} - + test_function_true = lambda mock_fn: lms_update_or_create_enrollment( + USERNAME, COURSE_ID, COURSE_MODE, is_active=True, enterprise_uuid=ENTERPRISE_UUID + ) + test_function_false = lambda mock_fn: lms_enroll_user_in_course( + USERNAME, + COURSE_ID, + COURSE_MODE, + ENTERPRISE_UUID + ) mock_add_enrollment_api.side_effect = CourseUserGroup.DoesNotExist() mock_tx.return_value.atomic.side_effect = None - mock_get_enrollment_api.return_value = enrollment_response - mock_user_model.return_value = self.a_user - + enrollment_response = {'mode': COURSE_MODE, 'is_active': True} if not setting_value else None + mock_get_enrollment_api.return_value = enrollment_response with self.assertRaises(CourseUserGroup.DoesNotExist): - lms_enroll_user_in_course(USERNAME, COURSE_ID, COURSE_MODE, ENTERPRISE_UUID) - mock_get_enrollment_api.assert_called_once() + self.run_test_with_setting( + setting_value, + mock_update_create_enroll, + mock_enroll_user, + test_function_true, + test_function_false + ) + mock_get_enrollment_api.assert_called_once_with(USERNAME, str(COURSE_ID)) + @mock.patch('openedx.features.enterprise_support.enrollments.utils.lms_enroll_user_in_course') + @mock.patch('openedx.features.enterprise_support.enrollments.utils.lms_update_or_create_enrollment') @mock.patch('openedx.features.enterprise_support.enrollments.utils.enrollment_api.add_enrollment') @mock.patch('openedx.features.enterprise_support.enrollments.utils.enrollment_api.get_enrollment') @mock.patch('openedx.features.enterprise_support.enrollments.utils.User.objects.get') @mock.patch('openedx.features.enterprise_support.enrollments.utils.transaction') + @ddt.data(True, False) def test_calls_enrollment_and_cohort_apis( self, + setting, mock_tx, mock_user_model, mock_get_enrollment_api, mock_add_enrollment_api, + mock_update_create_enroll, + mock_enroll_user, ): - - expected_response = {'a': 'value'} + test_function_true = lambda mock_fn: lms_update_or_create_enrollment( + USERNAME, COURSE_ID, COURSE_MODE, is_active=True, enterprise_uuid=ENTERPRISE_UUID + ) + test_function_false = lambda mock_fn: lms_enroll_user_in_course( + USERNAME, + COURSE_ID, + COURSE_MODE, + ENTERPRISE_UUID + ) + expected_response = {'mode': COURSE_MODE, 'is_active': True} enrollment_response = {'mode': COURSE_MODE, 'is_active': True} mock_add_enrollment_api.return_value = expected_response mock_tx.return_value.atomic.side_effect = None - mock_get_enrollment_api.return_value = enrollment_response - mock_user_model.return_value = self.a_user - response = lms_enroll_user_in_course(USERNAME, COURSE_ID, COURSE_MODE, ENTERPRISE_UUID) - + if setting: + mock_get_enrollment_api.return_value = None + else: + mock_get_enrollment_api.return_value = enrollment_response + response = self.run_test_with_setting( + setting, + mock_update_create_enroll, + mock_enroll_user, + test_function_true, + test_function_false + ) assert response == expected_response mock_add_enrollment_api.assert_called_once_with( USERNAME, @@ -144,22 +266,35 @@ class EnrollmentUtilsTest(TestCase): enrollment_attributes=None, enterprise_uuid=ENTERPRISE_UUID, ) - mock_get_enrollment_api.assert_called_once_with(USERNAME, str(COURSE_ID)) + @mock.patch('openedx.features.enterprise_support.enrollments.utils.lms_enroll_user_in_course') + @mock.patch('openedx.features.enterprise_support.enrollments.utils.lms_update_or_create_enrollment') @mock.patch('openedx.features.enterprise_support.enrollments.utils.enrollment_api.add_enrollment') @mock.patch('openedx.features.enterprise_support.enrollments.utils.enrollment_api.get_enrollment') @mock.patch('openedx.features.enterprise_support.enrollments.utils.User.objects.get') @mock.patch('openedx.features.enterprise_support.enrollments.utils.transaction') + @ddt.data(True, False) def test_existing_enrollment_does_not_fail( self, + setting_value, mock_tx, mock_user_model, mock_get_enrollment_api, mock_add_enrollment_api, + mock_update_create_enroll, + mock_enroll_user, ): - - expected_response = None + test_function_true = lambda mock_fn: lms_update_or_create_enrollment( + USERNAME, COURSE_ID, COURSE_MODE, is_active=True, enterprise_uuid=ENTERPRISE_UUID + ) + test_function_false = lambda mock_fn: lms_enroll_user_in_course( + USERNAME, + COURSE_ID, + COURSE_MODE, + ENTERPRISE_UUID + ) + expected_response = {'mode': COURSE_MODE, 'is_active': True} enrollment_response = {'mode': COURSE_MODE, 'is_active': True} mock_add_enrollment_api.side_effect = CourseEnrollmentExistsError("test", {}) @@ -169,16 +304,97 @@ class EnrollmentUtilsTest(TestCase): mock_user_model.return_value = self.a_user - response = lms_enroll_user_in_course(USERNAME, COURSE_ID, COURSE_MODE, ENTERPRISE_UUID) + response = self.run_test_with_setting( + setting_value, + mock_update_create_enroll, + mock_enroll_user, + test_function_true, + test_function_false + ) + if setting_value: + mock_add_enrollment_api.assert_not_called() + assert response == expected_response + else: + mock_add_enrollment_api.assert_called_once_with( + USERNAME, + str(COURSE_ID), + mode=COURSE_MODE, + is_active=True, + enrollment_attributes=None, + enterprise_uuid=ENTERPRISE_UUID, + ) + assert response is None + mock_get_enrollment_api.assert_called_once() - assert response == expected_response - mock_add_enrollment_api.assert_called_once_with( - USERNAME, - str(COURSE_ID), - mode=COURSE_MODE, - is_active=True, - enrollment_attributes=None, - enterprise_uuid=ENTERPRISE_UUID, + @mock.patch('openedx.features.enterprise_support.enrollments.utils.enrollment_api.update_enrollment') + @mock.patch('openedx.features.enterprise_support.enrollments.utils.enrollment_api.get_enrollment') + @mock.patch('openedx.features.enterprise_support.enrollments.utils.enrollment_api.add_enrollment') + @mock.patch('openedx.features.enterprise_support.enrollments.utils.User.objects.get') + @mock.patch('openedx.features.enterprise_support.enrollments.utils.transaction') + def test_upgrade_user_enrollment_mode( + self, + mock_tx, + mock_user_model, + mock_add_enrollment_api, + mock_get_enrollment_api, + mock_update_enrollment_api, + ): + enrollment_response = {'mode': COURSE_MODE, 'is_active': True} + mock_get_enrollment_api.return_value = { + 'mode': 'audit', + 'is_active': True, + } + + mock_update_enrollment_api.return_value = { + 'mode': 'verified', + 'is_active': True, + } + mock_tx.return_value.atomic.side_effect = None + mock_user_model.return_value = self.a_user + + upgraded_enrollment = lms_update_or_create_enrollment( + USERNAME, COURSE_ID, desired_mode=COURSE_MODE, is_active=True ) + assert upgraded_enrollment == enrollment_response + mock_update_enrollment_api.assert_called_once_with( + USERNAME, + str(COURSE_ID), + mode='verified', + is_active=True, + enrollment_attributes=None, + ) + + mock_get_enrollment_api.assert_called_once_with(USERNAME, str(COURSE_ID)) + mock_add_enrollment_api.assert_not_called() + + @mock.patch('openedx.features.enterprise_support.enrollments.utils.enrollment_api.update_enrollment') + @mock.patch('openedx.features.enterprise_support.enrollments.utils.enrollment_api.get_enrollment') + @mock.patch('openedx.features.enterprise_support.enrollments.utils.enrollment_api.add_enrollment') + @mock.patch('openedx.features.enterprise_support.enrollments.utils.User.objects.get') + @mock.patch('openedx.features.enterprise_support.enrollments.utils.transaction') + def test_upgrade_user_enrollment_mode_already_verified( + self, + mock_tx, + mock_user_model, + mock_add_enrollment_api, + mock_get_enrollment_api, + mock_update_enrollment_api, + ): + existing_enrollment = { + 'mode': 'verified', + 'is_active': True, + } + mock_get_enrollment_api.return_value = existing_enrollment + + mock_tx.return_value.atomic.side_effect = None + mock_user_model.return_value = self.a_user + + upgraded_enrollment = lms_update_or_create_enrollment( + USERNAME, COURSE_ID, desired_mode='verified', is_active=True + ) + + assert upgraded_enrollment == existing_enrollment + mock_update_enrollment_api.assert_not_called() mock_get_enrollment_api.assert_called_once() + mock_add_enrollment_api.assert_not_called() diff --git a/openedx/features/enterprise_support/enrollments/utils.py b/openedx/features/enterprise_support/enrollments/utils.py index dbc4ef6ebf..f44de3e2d4 100644 --- a/openedx/features/enterprise_support/enrollments/utils.py +++ b/openedx/features/enterprise_support/enrollments/utils.py @@ -8,7 +8,11 @@ from django.db import transaction from common.djangoapps.student.models import User from openedx.core.djangoapps.enrollments import api as enrollment_api -from openedx.core.djangoapps.enrollments.errors import CourseEnrollmentError, CourseEnrollmentExistsError +from openedx.core.djangoapps.enrollments.errors import ( + CourseEnrollmentError, + CourseEnrollmentExistsError, + CourseEnrollmentNotUpdatableError, +) from openedx.core.lib.log_utils import audit_log from openedx.features.enterprise_support.enrollments.exceptions import ( CourseIdMissingException, @@ -26,25 +30,7 @@ def lms_enroll_user_in_course( is_active=True, ): """ - Enrollment function meant to be called by edx-enterprise to replace the - current uses of the EnrollmentApiClient - The REST enrollment endpoint may also eventually also want to reuse this function - since it's a subset of what the endpoint handles - - Unlike the REST endpoint, this function does not check for enterprise enabled, or user api key - permissions etc. Those concerns are still going to be used by REST endpoint but this function - is meant for use from within edx-enterprise hence already presume such privileges. - - Arguments: - - username (str): User name - - course_id (obj) : Course key obtained using CourseKey.from_string(course_id_input) - - mode (CourseMode): course mode - - enterprise_uuid (str): id to identify the enterprise to enroll under - - is_active (bool): Optional. A Boolean value that indicates whether the - enrollment is to be set to inactive (if False). Usually we want a True if enrolling anew. - - Returns: A serializable dictionary of the new course enrollment. If it hits - `CourseEnrollmentExistsError` then it logs the error and returns None. + Temporarily keeping the original enrollment function to help with deployment """ user = _validate_enrollment_inputs(username, course_id) @@ -81,6 +67,134 @@ def lms_enroll_user_in_course( ) +def lms_update_or_create_enrollment( + username, + course_id, + desired_mode, + is_active, + enterprise_uuid=None, +): + """ + Update or create the user's course enrollment based on the existing enrollment mode. + If an enrollment exists and its mode is not equal to the desired mode, + then it updates the enrollment. + Otherwise, it creates a new enrollment. + Enrollment function meant to be called by edx-enterprise to replace the + current uses of the EnrollmentApiClient + The REST enrollment endpoint may also eventually also want to reuse this function + since it's a subset of what the endpoint handles + + Unlike the REST endpoint, this function does not check for enterprise enabled, or user api key + permissions etc. Those concerns are still going to be used by REST endpoint but this function + is meant for use from within edx-enterprise hence already presume such privileges. + + Arguments: + - username (str): User name + - course_id (obj) : Course key obtained using CourseKey.from_string(course_id_input) + - desired_mode (CourseMode): desired course mode + - is_active (bool): A Boolean value that indicates whether the + enrollment is to be set to inactive (if False). Usually we want a True if enrolling anew. + - enterprise_uuid (str): Optional. id to identify the enterprise to enroll under + + Returns: A serializable dictionary of the new or updated course enrollment. If it hits + CourseEnrollmentError or CourseEnrollmentNotUpdatableError, it raises those exceptions. + In case of the add_enrollment call, it returns None if the enrollment already exists and + the desired_mode or is_active match the existing enrollment. + """ + user = _validate_enrollment_inputs(username, course_id) + current_enrollment = enrollment_api.get_enrollment(username, str(course_id)) + response = None + if ( + current_enrollment + and current_enrollment['mode'] == desired_mode + and current_enrollment['is_active'] == is_active + ): + log.info( + "Existing enrollment [%s] for user [%s] matches desired enrollment. No action taken.", + current_enrollment, + username, + ) + return current_enrollment + with transaction.atomic(): + try: + if current_enrollment: + response = enrollment_api.update_enrollment( + username, + str(course_id), + mode=desired_mode, + is_active=is_active, + enrollment_attributes=None, + ) + if not response or ( + response['mode'] != desired_mode or + response['is_active'] != is_active + ): + log.exception( + "An error occurred while updating the course enrollment for user " + "[%s]: course run = [%s], enterprise_uuid = [%s], is_active = [%s], ", + username, + course_id, + str(enterprise_uuid), + is_active, + ) + raise CourseEnrollmentNotUpdatableError( + f"Unable to upgrade enrollment for user {username} " + "in course {course_id} to {desired_mode} mode." + "Response from update_enrollment: {response}" + ) + else: + response = enrollment_api.add_enrollment( + username, + str(course_id), + mode=desired_mode, + is_active=is_active, + enrollment_attributes=None, + enterprise_uuid=enterprise_uuid, + ) + if not response: + log.exception( + "An error occurred while creating the new course enrollment for user " + "[%s] in course run [%s]", + username, + course_id, + ) + raise CourseEnrollmentError( + f"Unable to create enrollment for user {username} in course {course_id}." + ) + except CourseEnrollmentExistsError as error: + # This will rarely be raised when we hit a race condition in adding a net-new enrollment + log.warning( + "An enrollment [%s] already exists for user [%s] in course run [%s].", + error.enrollment, + username, + course_id, + ) + return None + except (CourseEnrollmentError, CourseEnrollmentNotUpdatableError) as error: + log.exception( + "Raising error [%s] for user " + "[%s]: course run = [%s], enterprise_uuid = [%s], is_active = [%s], ", + error, + username, + course_id, + str(enterprise_uuid), + is_active, + ) + raise error + finally: + final_enrollment = response or current_enrollment + audit_log( + 'enrollment_change_requested', + course_id=str(course_id), + requested_mode=desired_mode, + actual_mode=final_enrollment['mode'] if final_enrollment else None, + requested_activation=is_active, + actual_activation=final_enrollment['is_active'] if final_enrollment else None, + user_id=user.id + ) + return response + + def _validate_enrollment_inputs(username, course_id): """ Validates username and course_id. diff --git a/package-lock.json b/package-lock.json index afa65c71f6..effe781439 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,7 +32,7 @@ "css-loader": "0.28.8", "datatables": "1.10.18", "datatables.net-fixedcolumns": "3.2.6", - "edx-proctoring-proctortrack": "git+https://git@github.com/anupdhabarde/edx-proctoring-proctortrack.git#fe0027330bf2edb8b7fc9cb3df8f3b3b02db9459", + "edx-proctoring-proctortrack": "git+https://git@github.com/anupdhabarde/edx-proctoring-proctortrack.git#e439f14975fb32b726dfd874ed210529d158ea40", "edx-ui-toolkit": "1.5.4", "exports-loader": "0.6.4", "file-loader": "1.1.6", @@ -7385,8 +7385,8 @@ }, "node_modules/edx-proctoring-proctortrack": { "version": "1.1.1", - "resolved": "git+https://git@github.com/anupdhabarde/edx-proctoring-proctortrack.git#fe0027330bf2edb8b7fc9cb3df8f3b3b02db9459", - "integrity": "sha512-EmAiTm+Ds2Ps92h99/dwoDsO9rcI28+8IB/kI9yB/hXHOjM3a5FfvgWWlAni0rxH9YZ0Le8hbpCiFZsBbxujYA==", + "resolved": "git+https://git@github.com/anupdhabarde/edx-proctoring-proctortrack.git#e439f14975fb32b726dfd874ed210529d158ea40", + "integrity": "sha512-2hvFSp1te3tBvTA6UsMS8nb9/yeDXYF/RSGrKHOFwyazee6VVBuO2Z4pZG2J/N072yunB3DQS7f0mkLgTFCopQ==", "license": "Apache-2.0", "peerDependencies": { "@edx/edx-proctoring": "^4.8.1" @@ -30659,9 +30659,9 @@ "dev": true }, "edx-proctoring-proctortrack": { - "version": "git+https://git@github.com/anupdhabarde/edx-proctoring-proctortrack.git#fe0027330bf2edb8b7fc9cb3df8f3b3b02db9459", - "integrity": "sha512-EmAiTm+Ds2Ps92h99/dwoDsO9rcI28+8IB/kI9yB/hXHOjM3a5FfvgWWlAni0rxH9YZ0Le8hbpCiFZsBbxujYA==", - "from": "edx-proctoring-proctortrack@git+https://git@github.com/anupdhabarde/edx-proctoring-proctortrack.git#fe0027330bf2edb8b7fc9cb3df8f3b3b02db9459", + "version": "git+https://git@github.com/anupdhabarde/edx-proctoring-proctortrack.git#e439f14975fb32b726dfd874ed210529d158ea40", + "integrity": "sha512-2hvFSp1te3tBvTA6UsMS8nb9/yeDXYF/RSGrKHOFwyazee6VVBuO2Z4pZG2J/N072yunB3DQS7f0mkLgTFCopQ==", + "from": "edx-proctoring-proctortrack@git+https://git@github.com/anupdhabarde/edx-proctoring-proctortrack.git#e439f14975fb32b726dfd874ed210529d158ea40", "requires": {} }, "edx-ui-toolkit": { diff --git a/package.json b/package.json index fb855d32a3..6a1be3bad8 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "css-loader": "0.28.8", "datatables": "1.10.18", "datatables.net-fixedcolumns": "3.2.6", - "edx-proctoring-proctortrack": "git+https://git@github.com/anupdhabarde/edx-proctoring-proctortrack.git#fe0027330bf2edb8b7fc9cb3df8f3b3b02db9459", + "edx-proctoring-proctortrack": "git+https://git@github.com/anupdhabarde/edx-proctoring-proctortrack.git#e439f14975fb32b726dfd874ed210529d158ea40", "edx-ui-toolkit": "1.5.4", "exports-loader": "0.6.4", "file-loader": "1.1.6", diff --git a/requirements/constraints.txt b/requirements/constraints.txt index 3fdefab02a..c96ddb4ba0 100644 --- a/requirements/constraints.txt +++ b/requirements/constraints.txt @@ -27,7 +27,7 @@ django-storages==1.9.1 # The team that owns this package will manually bump this package rather than having it pulled in automatically. # This is to allow them to better control its deployment and to do it in a process that works better # for them. -edx-enterprise==4.0.0 +edx-enterprise==4.0.1 # oauthlib>3.0.1 causes test failures ( also remove the django-oauth-toolkit constraint when this is fixed ) oauthlib==3.0.1 diff --git a/requirements/edx-sandbox/py38.txt b/requirements/edx-sandbox/py38.txt index 725fed910e..98b4b5521e 100644 --- a/requirements/edx-sandbox/py38.txt +++ b/requirements/edx-sandbox/py38.txt @@ -8,7 +8,7 @@ cffi==1.15.1 # via cryptography chem==1.2.0 # via -r requirements/edx-sandbox/py38.in -click==8.1.4 +click==8.1.5 # via # -c requirements/edx-sandbox/../constraints.txt # nltk diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index 87140765c6..7201a2b19d 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -121,7 +121,7 @@ charset-normalizer==2.0.12 # snowflake-connector-python chem==1.2.0 # via -r requirements/edx/kernel.in -click==8.1.4 +click==8.1.5 # via # -c requirements/edx/../constraints.txt # celery @@ -484,7 +484,7 @@ edx-drf-extensions==8.8.0 # edx-when # edxval # learner-pathway-progress -edx-enterprise==4.0.0 +edx-enterprise==4.0.1 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/kernel.in @@ -601,7 +601,7 @@ geoip2==4.7.0 # via -r requirements/edx/kernel.in glob2==0.7 # via -r requirements/edx/kernel.in -gunicorn==20.1.0 +gunicorn==21.0.0 # via -r requirements/edx/kernel.in help-tokens==2.2.0 # via -r requirements/edx/kernel.in @@ -657,7 +657,7 @@ jsonfield==3.1.0 # lti-consumer-xblock # ora2 # outcome-surveys -jsonschema==4.18.2 +jsonschema==4.18.3 # via optimizely-sdk jsonschema-specifications==2023.6.1 # via jsonschema @@ -799,6 +799,7 @@ outcome-surveys==2.4.0 packaging==23.1 # via # drf-yasg + # gunicorn # py2neo # snowflake-connector-python pansi==2020.7.3 @@ -882,6 +883,8 @@ pylatexenc==2.10 # via olxcleaner pylti1p3==2.0.0 # via -r requirements/edx/kernel.in +pymemcache==4.0.0 + # via -r requirements/edx/paver.txt pymongo==3.13.0 # via # -c requirements/edx/../constraints.txt @@ -1011,7 +1014,7 @@ requests-oauthlib==1.3.1 # via # -r requirements/edx/kernel.in # social-auth-core -rpds-py==0.8.10 +rpds-py==0.8.11 # via # jsonschema # referencing @@ -1168,7 +1171,7 @@ vine==5.0.0 # kombu voluptuous==0.13.1 # via ora2 -walrus==0.9.2 +walrus==0.9.3 # via edx-event-bus-redis watchdog==3.0.0 # via -r requirements/edx/paver.txt @@ -1231,7 +1234,7 @@ xss-utils==0.4.0 # via -r requirements/edx/kernel.in yarl==1.9.2 # via aiohttp -zipp==3.16.1 +zipp==3.16.2 # via # importlib-metadata # importlib-resources diff --git a/requirements/edx/coverage.txt b/requirements/edx/coverage.txt index fbf2b5cfb8..c0b44e4fdd 100644 --- a/requirements/edx/coverage.txt +++ b/requirements/edx/coverage.txt @@ -8,7 +8,7 @@ chardet==5.1.0 # via diff-cover coverage==7.2.7 # via -r requirements/edx/coverage.in -diff-cover==7.6.1 +diff-cover==7.7.0 # via -r requirements/edx/coverage.in jinja2==3.1.2 # via diff-cover diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt index 93cae87cf4..6b6183120e 100644 --- a/requirements/edx/development.txt +++ b/requirements/edx/development.txt @@ -9,13 +9,17 @@ accessible-pygments==0.0.4 # -r requirements/edx/doc.txt # pydata-sphinx-theme acid-xblock==0.2.1 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt aiohttp==3.8.4 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # geoip2 aiosignal==1.3.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # aiohttp alabaster==0.7.13 @@ -25,15 +29,20 @@ alabaster==0.7.13 algoliasearch==2.6.3 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt amqp==5.1.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # kombu analytics-python==1.4.post1 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt aniso8601==9.0.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-tincan-py35 annotated-types==0.5.0 @@ -47,15 +56,18 @@ anyio==3.7.1 # starlette appdirs==1.4.4 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # fs asgiref==3.7.2 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # django # django-countries asn1crypto==1.5.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # oscrypto # snowflake-connector-python @@ -66,6 +78,7 @@ astroid==2.13.5 # pylint-celery async-timeout==4.0.2 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # aiohttp # redis @@ -91,10 +104,12 @@ babel==2.11.0 # sphinx backoff==1.10.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # analytics-python backports-zoneinfo[tzdata]==0.2.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # celery # icalendar @@ -107,10 +122,12 @@ beautifulsoup4==4.12.2 # pynliner billiard==4.1.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # celery bleach[css]==6.0.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise # lti-consumer-xblock @@ -123,10 +140,12 @@ bok-choy==2.0.2 boto==2.39.0 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt boto3==1.7.0 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # django-ses # fs-s3fs @@ -134,11 +153,14 @@ boto3==1.7.0 botocore==1.10.84 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # boto3 # s3transfer bridgekeeper==0.9 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt build==0.10.0 # via # -r requirements/edx/../pip-tools.txt @@ -146,6 +168,7 @@ build==0.10.0 celery==5.3.1 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # django-celery-results # django-user-tasks @@ -164,12 +187,14 @@ certifi==2023.5.7 # snowflake-connector-python cffi==1.15.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # cryptography # pynacl # snowflake-connector-python chardet==5.1.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # diff-cover # pysrt @@ -182,8 +207,10 @@ charset-normalizer==2.0.12 # requests # snowflake-connector-python chem==1.2.0 - # via -r requirements/edx/testing.txt -click==8.1.4 + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt +click==8.1.5 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/../pip-tools.txt @@ -206,6 +233,7 @@ click==8.1.4 # uvicorn click-didyoumean==0.3.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # celery click-log==0.4.0 @@ -214,10 +242,12 @@ click-log==0.4.0 # edx-lint click-plugins==1.1.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # celery click-repl==0.3.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # celery code-annotations==1.3.0 @@ -228,13 +258,17 @@ code-annotations==1.3.0 # edx-lint # edx-toggles codejail-includes==1.0.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt coreapi==2.3.3 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # drf-yasg coreschema==0.0.4 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # coreapi # drf-yasg @@ -243,10 +277,13 @@ coverage[toml]==7.2.7 # -r requirements/edx/testing.txt # pytest-cov crowdsourcehinter-xblock==0.6 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt cryptography==38.0.4 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # django-fernet-fields # djfernet @@ -264,6 +301,7 @@ cssselect==1.2.0 # pyquery cssutils==2.7.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # pynliner ddt==1.6.0 @@ -274,6 +312,7 @@ deepmerge==1.1.0 # sphinxcontrib-openapi defusedxml==0.7.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # djangorestframework-xml # ora2 @@ -281,21 +320,23 @@ defusedxml==0.7.1 # social-auth-core deprecated==1.2.14 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # jwcrypto -diff-cover==7.6.1 +diff-cover==7.7.0 # via -r requirements/edx/testing.txt dill==0.3.6 # via # -r requirements/edx/testing.txt # pylint -distlib==0.3.6 +distlib==0.3.7 # via # -r requirements/edx/testing.txt # virtualenv django==3.2.20 # via # -c requirements/edx/../common_constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # django-appconf # django-celery-results @@ -366,32 +407,42 @@ django==3.2.20 # xss-utils django-appconf==1.0.5 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # django-statici18n django-cache-memoize==0.1.10 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise django-celery-results==2.5.1 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt django-classy-tags==4.0.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # django-sekizai django-config-models==2.3.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise # edx-name-affirmation # lti-consumer-xblock django-cors-headers==4.2.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt django-countries==7.5.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise django-crum==0.7.9 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-django-utils # edx-enterprise @@ -403,14 +454,17 @@ django-debug-toolbar==4.1.0 # via -r requirements/edx/development.in django-environ==0.10.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # openedx-blockstore django-fernet-fields==0.6 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise django-filter==23.2 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise # learner-pathway-progress @@ -419,17 +473,22 @@ django-filter==23.2 django-ipware==4.0.2 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise # edx-proctoring django-js-asset==2.1.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # django-mptt django-method-override==1.0.4 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt django-model-utils==4.3.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # django-user-tasks # edx-bulk-grades @@ -451,35 +510,49 @@ django-model-utils==4.3.1 # super-csv django-mptt==0.14.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # openedx-django-wiki django-multi-email-field==0.7.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise django-mysql==4.11.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt django-oauth-toolkit==1.3.2 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt django-object-actions==4.1.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise django-pipeline==2.1.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt django-ratelimit==4.0.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt django-sekizai==4.1.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # openedx-django-wiki django-ses==3.5.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt django-simple-history==3.0.0 # via # -c requirements/edx/../common_constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise # edx-name-affirmation @@ -488,21 +561,28 @@ django-simple-history==3.0.0 # learner-pathway-progress # ora2 django-splash==1.3.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt django-statici18n==2.3.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # lti-consumer-xblock # xblock-drag-and-drop-v2 django-storages==1.9.1 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edxval django-user-tasks==3.0.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt django-waffle==3.0.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-django-utils # edx-drf-extensions @@ -513,11 +593,13 @@ django-waffle==3.0.0 django-webpack-loader==0.7.0 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-proctoring djangorestframework==3.14.0 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # django-config-models # django-user-tasks @@ -538,10 +620,12 @@ djangorestframework==3.14.0 # super-csv djangorestframework-xml==2.0.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise djfernet==0.8.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edxval docutils==0.19 @@ -554,57 +638,80 @@ docutils==0.19 # sphinx # sphinx-mdinclude done-xblock==2.0.5 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt drf-jwt==1.19.2 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-drf-extensions drf-nested-routers==0.93.4 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # openedx-blockstore drf-yasg==1.21.5 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-api-doc-tools edx-ace==1.6.1 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt edx-api-doc-tools==1.6.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-name-affirmation # openedx-blockstore edx-auth-backends==4.1.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # openedx-blockstore edx-braze-client==0.1.7 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt edx-bulk-grades==1.0.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # staff-graded-xblock edx-ccx-keys==1.2.1 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt edx-celeryutils==1.2.2 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-name-affirmation # super-csv edx-codejail==3.3.3 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt edx-completion==4.2.1 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt edx-django-release-util==1.2.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edxval # openedx-blockstore edx-django-sites-extensions==4.0.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt edx-django-utils==5.5.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # django-config-models # edx-drf-extensions @@ -623,6 +730,7 @@ edx-django-utils==5.5.0 # super-csv edx-drf-extensions==8.8.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-completion # edx-enterprise @@ -633,27 +741,38 @@ edx-drf-extensions==8.8.0 # edx-when # edxval # learner-pathway-progress -edx-enterprise==4.0.0 +edx-enterprise==4.0.1 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # learner-pathway-progress edx-event-bus-kafka==5.1.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt edx-event-bus-redis==0.3.1 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt edx-i18n-tools==1.0.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # ora2 edx-lint==5.3.4 # via -r requirements/edx/testing.txt edx-milestones==0.4.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt edx-name-affirmation==2.3.5 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt edx-opaque-keys[django]==2.3.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-bulk-grades # edx-ccx-keys @@ -671,36 +790,50 @@ edx-opaque-keys[django]==2.3.0 # ora2 # outcome-surveys edx-organizations==6.11.1 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt edx-proctoring==4.16.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-proctoring-proctortrack edx-proctoring-proctortrack==1.0.5 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt edx-rbac==1.7.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise edx-rest-api-client==5.5.2 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise # edx-proctoring edx-search==3.6.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt edx-sga==0.22.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt edx-submissions==3.5.6 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # ora2 edx-tincan-py35==1.0.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise edx-toggles==5.0.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-completion # edx-event-bus-kafka @@ -711,28 +844,40 @@ edx-toggles==5.0.0 # learner-pathway-progress # ora2 edx-token-utils==0.2.1 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt edx-user-state-client==1.3.2 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt edx-when==2.4.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-proctoring edxval==2.3.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt elasticsearch==7.13.4 # via # -c requirements/edx/../common_constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-search enmerkar==0.7.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # enmerkar-underscore enmerkar-underscore==2.1.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt event-tracking==2.1.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-proctoring # edx-search @@ -757,10 +902,12 @@ fastapi==0.100.0 # pact-python fastavro==1.8.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # openedx-events filelock==3.12.2 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # snowflake-connector-python # tox @@ -769,25 +916,31 @@ freezegun==1.2.2 # via -r requirements/edx/testing.txt frozenlist==1.4.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # aiohttp # aiosignal fs==2.0.27 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # fs-s3fs # openedx-django-pyfs # xblock fs-s3fs==0.1.8 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # openedx-django-pyfs future==0.18.3 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # pyjwkest geoip2==4.7.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt gitdb==4.0.10 # via # -r requirements/edx/doc.txt @@ -795,22 +948,29 @@ gitdb==4.0.10 gitpython==3.1.32 # via -r requirements/edx/doc.txt glob2==0.7 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt grimp==2.5 # via # -r requirements/edx/testing.txt # import-linter -gunicorn==20.1.0 - # via -r requirements/edx/testing.txt +gunicorn==21.0.0 + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt h11==0.14.0 # via # -r requirements/edx/testing.txt # httpcore # uvicorn help-tokens==2.2.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt html5lib==1.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # ora2 httpcore==0.16.3 @@ -824,7 +984,9 @@ httpx==0.23.3 # -r requirements/edx/testing.txt # pact-python icalendar==5.0.7 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt idna==3.4 # via # -r requirements/edx/doc.txt @@ -856,6 +1018,7 @@ importlib-resources==6.0.0 # jsonschema-specifications inflection==0.5.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # drf-yasg iniconfig==2.0.0 @@ -864,12 +1027,16 @@ iniconfig==2.0.0 # pytest interchange==2021.0.4 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # py2neo ipaddress==1.0.23 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt isodate==0.6.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # python3-saml isort==5.12.0 @@ -878,6 +1045,7 @@ isort==5.12.0 # pylint itypes==1.2.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # coreapi jinja2==3.1.2 @@ -890,19 +1058,23 @@ jinja2==3.1.2 # sphinx jmespath==0.10.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # boto3 # botocore joblib==1.3.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # nltk jsondiff==2.0.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise jsonfield==3.1.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-celeryutils # edx-enterprise @@ -912,7 +1084,7 @@ jsonfield==3.1.0 # lti-consumer-xblock # ora2 # outcome-surveys -jsonschema==4.18.2 +jsonschema==4.18.3 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -925,16 +1097,21 @@ jsonschema-specifications==2023.6.1 # jsonschema jwcrypto==1.5.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # pylti1p3 kombu==5.3.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # celery laboratory==1.0.2 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt lazy==1.5 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # acid-xblock # bok-choy @@ -946,19 +1123,26 @@ lazy-object-proxy==1.9.0 # -r requirements/edx/testing.txt # astroid learner-pathway-progress==1.3.4 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt libsass==0.10.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # ora2 loremipsum==1.0.5 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # ora2 lti-consumer-xblock==9.5.5 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt lxml==4.9.3 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edxval # lti-consumer-xblock @@ -970,9 +1154,12 @@ lxml==4.9.3 # xblock # xmlsec mailsnake==1.6.4 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt mako==1.2.4 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # acid-xblock # lti-consumer-xblock @@ -981,12 +1168,14 @@ mako==1.2.4 markdown==3.3.7 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # openedx-django-wiki # staff-graded-xblock # xblock-poll markey==0.8 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # enmerkar-underscore markupsafe==2.1.3 @@ -1000,6 +1189,7 @@ markupsafe==2.1.3 # xblock maxminddb==2.4.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # geoip2 mccabe==0.7.0 @@ -1011,20 +1201,27 @@ mistune==2.0.5 # -r requirements/edx/doc.txt # sphinx-mdinclude mock==5.1.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt mongoengine==0.27.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt monotonic==1.6 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # analytics-python # py2neo mpmath==1.3.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # sympy multidict==6.0.4 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # aiohttp # yarl @@ -1034,20 +1231,26 @@ mypy-extensions==1.0.0 # via mypy mysqlclient==2.2.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # openedx-blockstore newrelic==8.8.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-django-utils nltk==3.8.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # chem nodeenv==1.8.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt numpy==1.22.4 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # chem # openedx-calc @@ -1056,48 +1259,71 @@ numpy==1.22.4 oauthlib==3.0.1 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # django-oauth-toolkit # lti-consumer-xblock # requests-oauthlib # social-auth-core olxcleaner==0.2.1 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt openedx-blockstore==1.3.1 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt openedx-calc==3.0.1 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt openedx-django-pyfs==3.4.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # xblock openedx-django-require==2.0.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt openedx-django-wiki==2.0.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt openedx-events==8.2.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-event-bus-kafka # edx-event-bus-redis # skill-tagging openedx-filters==1.3.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # lti-consumer-xblock # skill-tagging openedx-mongodbproxy==0.2.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt optimizely-sdk==4.1.1 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt ora2==5.1.1 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt oscrypto==1.3.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # snowflake-connector-python outcome-surveys==2.4.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt packaging==23.1 # via # -r requirements/edx/../pip-tools.txt @@ -1105,6 +1331,7 @@ packaging==23.1 # -r requirements/edx/testing.txt # build # drf-yasg + # gunicorn # py2neo # pydata-sphinx-theme # pytest @@ -1115,21 +1342,26 @@ pact-python==2.0.0 # via -r requirements/edx/testing.txt pansi==2020.7.3 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # py2neo path==16.7.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-i18n-tools # path-py path-py==12.5.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise # ora2 # staff-graded-xblock paver==1.3.4 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt pbr==5.11.1 # via # -r requirements/edx/doc.txt @@ -1137,6 +1369,7 @@ pbr==5.11.1 # stevedore pgpy==0.6.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise picobox==3.0.0 @@ -1144,10 +1377,13 @@ picobox==3.0.0 # -r requirements/edx/doc.txt # sphinxcontrib-openapi piexif==1.1.3 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt pillow==9.5.0 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise # edx-organizations @@ -1159,7 +1395,7 @@ pkgutil-resolve-name==1.3.10 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # jsonschema -platformdirs==3.8.1 +platformdirs==3.9.1 # via # -r requirements/edx/testing.txt # pylint @@ -1172,14 +1408,17 @@ pluggy==1.2.0 # tox polib==1.2.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-i18n-tools prompt-toolkit==3.0.39 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # click-repl psutil==5.9.5 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-django-utils # pact-python @@ -1191,9 +1430,11 @@ py==1.11.0 py2neo==2021.2.3 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt pyasn1==0.5.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # pgpy pycodestyle==2.8.0 @@ -1201,23 +1442,27 @@ pycodestyle==2.8.0 # -c requirements/edx/../constraints.txt # -r requirements/edx/testing.txt pycountry==22.3.5 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt pycparser==2.21 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # cffi pycryptodomex==3.18.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-proctoring # lti-consumer-xblock # pyjwkest # snowflake-connector-python -pydantic==2.0.2 +pydantic==2.0.3 # via # -r requirements/edx/testing.txt # fastapi -pydantic-core==2.1.2 +pydantic-core==2.3.0 # via # -r requirements/edx/testing.txt # pydantic @@ -1237,11 +1482,13 @@ pygments==2.15.1 # sphinx-mdinclude pyjwkest==1.4.2 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-token-utils # lti-consumer-xblock pyjwt[crypto]==2.7.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # drf-jwt # edx-auth-backends @@ -1253,6 +1500,7 @@ pyjwt[crypto]==2.7.0 # social-auth-core pylatexenc==2.10 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # olxcleaner pylint==2.15.10 @@ -1280,10 +1528,17 @@ pylint-plugin-utils==0.8.2 pylint-pytest==0.3.0 # via -r requirements/edx/testing.txt pylti1p3==2.0.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt +pymemcache==4.0.0 + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt pymongo==3.13.0 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-opaque-keys # event-tracking @@ -1291,18 +1546,23 @@ pymongo==3.13.0 # openedx-mongodbproxy pynacl==1.5.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-django-utils pynliner==0.8.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt pyopenssl==22.0.0 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # optimizely-sdk # snowflake-connector-python pyparsing==3.1.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # chem # openedx-calc @@ -1314,10 +1574,12 @@ pyquery==2.0.0 # via -r requirements/edx/testing.txt pyrsistent==0.19.3 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # optimizely-sdk pysrt==1.1.2 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edxval pytest==7.4.0 @@ -1349,6 +1611,7 @@ pytest-xdist[psutil]==3.3.1 # via -r requirements/edx/testing.txt python-dateutil==2.8.2 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # analytics-python # botocore @@ -1364,7 +1627,9 @@ python-dateutil==2.8.2 # ora2 # xblock python-memcached==1.59 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt python-slugify==8.0.1 # via # -r requirements/edx/doc.txt @@ -1372,14 +1637,18 @@ python-slugify==8.0.1 # code-annotations python-swiftclient==4.3.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # ora2 python3-openid==3.2.0 ; python_version >= "3" # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # social-auth-core python3-saml==1.15.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt pytz==2022.7.1 # via # -c requirements/edx/../constraints.txt @@ -1406,7 +1675,9 @@ pytz==2022.7.1 # snowflake-connector-python # xblock pyuca==1.2 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt pywatchman==1.4.1 # via -r requirements/edx/development.in pyyaml==6.0 @@ -1419,11 +1690,16 @@ pyyaml==6.0 # sphinxcontrib-openapi # xblock random2==1.0.1 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt recommender-xblock==2.0.1 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt redis==4.6.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # walrus referencing==0.29.1 @@ -1434,6 +1710,7 @@ referencing==0.29.1 # jsonschema-specifications regex==2023.6.3 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # nltk requests==2.31.0 @@ -1465,13 +1742,14 @@ requests==2.31.0 # sphinx requests-oauthlib==1.3.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # social-auth-core rfc3986[idna2008]==1.5.0 # via # -r requirements/edx/testing.txt # httpx -rpds-py==0.8.10 +rpds-py==0.8.11 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1479,28 +1757,34 @@ rpds-py==0.8.10 # referencing ruamel-yaml==0.17.32 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # drf-yasg ruamel-yaml-clib==0.2.7 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # ruamel-yaml rules==3.3 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise # edx-proctoring s3transfer==0.1.13 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # boto3 sailthru-client==2.2.3 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-ace scipy==1.7.3 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # chem # openedx-calc @@ -1510,12 +1794,16 @@ selenium==3.141.0 # bok-choy semantic-version==2.10.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-drf-extensions shapely==2.0.1 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt simplejson==3.19.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # sailthru-client # super-csv @@ -1558,9 +1846,12 @@ six==1.16.0 # sphinxcontrib-httpdomain # tox skill-tagging==0.1.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt slumber==0.7.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-bulk-grades # edx-enterprise @@ -1581,25 +1872,30 @@ snowballstemmer==2.2.0 # sphinx snowflake-connector-python==3.0.4 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise social-auth-app-django==5.0.0 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-auth-backends social-auth-core==4.3.0 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-auth-backends # social-auth-app-django sorl-thumbnail==12.9.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # openedx-django-wiki sortedcontainers==2.4.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # snowflake-connector-python soupsieve==2.4.1 @@ -1613,6 +1909,7 @@ sphinx==6.2.1 # pydata-sphinx-theme # sphinx-book-theme # sphinx-design + # sphinx-reredirects # sphinxcontrib-httpdomain # sphinxcontrib-openapi # sphinxext-rediraffe @@ -1624,6 +1921,8 @@ sphinx-mdinclude==0.5.3 # via # -r requirements/edx/doc.txt # sphinxcontrib-openapi +sphinx-reredirects==0.1.2 + # via -r requirements/edx/doc.txt sphinxcontrib-applehelp==1.0.4 # via # -r requirements/edx/doc.txt @@ -1658,12 +1957,15 @@ sphinxext-rediraffe==0.2.7 # via -r requirements/edx/doc.txt sqlparse==0.4.4 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # django # django-debug-toolbar # openedx-blockstore staff-graded-xblock==2.0.1 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt starlette==0.27.0 # via # -r requirements/edx/testing.txt @@ -1679,14 +1981,17 @@ stevedore==5.1.0 # edx-opaque-keys super-csv==3.0.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-bulk-grades sympy==1.12 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # openedx-calc testfixtures==7.1.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise text-unidecode==1.3 @@ -1696,6 +2001,7 @@ text-unidecode==1.3 # python-slugify tinycss2==1.1.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # bleach toml==0.10.2 @@ -1726,6 +2032,7 @@ tox-battery==0.6.1 # via -r requirements/edx/testing.txt tqdm==4.65.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # nltk typing-extensions==4.7.1 @@ -1751,17 +2058,20 @@ typing-extensions==4.7.1 # starlette tzdata==2023.3 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # backports-zoneinfo # celery unicodecsv==0.14.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise unidiff==0.7.5 # via -r requirements/edx/testing.txt uritemplate==4.1.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # coreapi # drf-yasg @@ -1777,39 +2087,48 @@ urllib3==1.26.16 # selenium # snowflake-connector-python user-util==1.0.0 - # via -r requirements/edx/testing.txt -uvicorn==0.22.0 + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt +uvicorn==0.23.0 # via # -r requirements/edx/testing.txt # pact-python vine==5.0.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # amqp # celery # kombu -virtualenv==20.23.1 +virtualenv==20.24.0 # via # -r requirements/edx/testing.txt # tox voluptuous==0.13.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # ora2 vulture==2.7 # via -r requirements/edx/development.in -walrus==0.9.2 +walrus==0.9.3 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-event-bus-redis watchdog==3.0.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt wcwidth==0.2.6 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # prompt-toolkit web-fragments==2.0.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # crowdsourcehinter-xblock # edx-sga @@ -1818,12 +2137,14 @@ web-fragments==2.0.0 # xblock-utils webencodings==0.5.1 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # bleach # html5lib # tinycss2 webob==1.8.7 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # xblock wheel==0.40.0 @@ -1832,11 +2153,13 @@ wheel==0.40.0 # pip-tools wrapt==1.15.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # astroid # deprecated xblock[django]==1.6.2 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # acid-xblock # crowdsourcehinter-xblock @@ -1852,13 +2175,20 @@ xblock[django]==1.6.2 # xblock-poll # xblock-utils xblock-drag-and-drop-v2==3.2.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt xblock-google-drive==0.3.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt xblock-poll==1.13.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt xblock-utils==3.2.0 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-sga # lti-consumer-xblock @@ -1867,15 +2197,19 @@ xblock-utils==3.2.0 # xblock-google-drive xmlsec==1.3.13 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # python3-saml xss-utils==0.4.0 - # via -r requirements/edx/testing.txt + # via + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt yarl==1.9.2 # via + # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # aiohttp -zipp==3.16.1 +zipp==3.16.2 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt diff --git a/requirements/edx/doc.in b/requirements/edx/doc.in index 0dd7ad9aa6..013bafc42e 100644 --- a/requirements/edx/doc.in +++ b/requirements/edx/doc.in @@ -1,6 +1,7 @@ # Requirements for documentation validation -c ../constraints.txt +-r base.txt code-annotations # provides annotations for certain documentation sphinx-book-theme # Common theme for all Open edX projects gitpython # fetch git repo information @@ -8,3 +9,4 @@ Sphinx # Documentation builder sphinx-design # provides various responsive web-components sphinxcontrib-openapi[markdown] # Be able to render openapi schema in a sphinx project sphinxext-rediraffe # Quickly and easily redirect when we move pages around. +sphinx-reredirects # Redirect from a sphinx project out to other places on the web including other sphinx projects diff --git a/requirements/edx/doc.txt b/requirements/edx/doc.txt index c5852af197..d9aa9770b8 100644 --- a/requirements/edx/doc.txt +++ b/requirements/edx/doc.txt @@ -6,117 +6,1321 @@ # accessible-pygments==0.0.4 # via pydata-sphinx-theme +acid-xblock==0.2.1 + # via -r requirements/edx/base.txt +aiohttp==3.8.4 + # via + # -r requirements/edx/base.txt + # geoip2 +aiosignal==1.3.1 + # via + # -r requirements/edx/base.txt + # aiohttp alabaster==0.7.13 # via sphinx +algoliasearch==2.6.3 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt +amqp==5.1.1 + # via + # -r requirements/edx/base.txt + # kombu +analytics-python==1.4.post1 + # via -r requirements/edx/base.txt +aniso8601==9.0.1 + # via + # -r requirements/edx/base.txt + # edx-tincan-py35 +appdirs==1.4.4 + # via + # -r requirements/edx/base.txt + # fs +asgiref==3.7.2 + # via + # -r requirements/edx/base.txt + # django + # django-countries +asn1crypto==1.5.1 + # via + # -r requirements/edx/base.txt + # oscrypto + # snowflake-connector-python +async-timeout==4.0.2 + # via + # -r requirements/edx/base.txt + # aiohttp + # redis attrs==23.1.0 # via + # -r requirements/edx/base.txt + # aiohttp + # edx-ace # jsonschema + # lti-consumer-xblock + # openedx-blockstore + # openedx-events # referencing babel==2.11.0 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # enmerkar + # enmerkar-underscore # pydata-sphinx-theme # sphinx +backoff==1.10.0 + # via + # -r requirements/edx/base.txt + # analytics-python +backports-zoneinfo[tzdata]==0.2.1 + # via + # -r requirements/edx/base.txt + # celery + # icalendar + # kombu beautifulsoup4==4.12.2 - # via pydata-sphinx-theme + # via + # -r requirements/edx/base.txt + # pydata-sphinx-theme + # pynliner +billiard==4.1.0 + # via + # -r requirements/edx/base.txt + # celery +bleach[css]==6.0.0 + # via + # -r requirements/edx/base.txt + # edx-enterprise + # lti-consumer-xblock + # openedx-django-wiki + # ora2 + # xblock-drag-and-drop-v2 + # xblock-poll +boto==2.39.0 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt +boto3==1.7.0 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # django-ses + # fs-s3fs + # ora2 +botocore==1.10.84 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # boto3 + # s3transfer +bridgekeeper==0.9 + # via -r requirements/edx/base.txt +celery==5.3.1 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # django-celery-results + # django-user-tasks + # edx-celeryutils + # edx-enterprise + # event-tracking certifi==2023.5.7 - # via requests + # via + # -r requirements/edx/base.txt + # elasticsearch + # py2neo + # requests + # snowflake-connector-python +cffi==1.15.1 + # via + # -r requirements/edx/base.txt + # cryptography + # pynacl + # snowflake-connector-python +chardet==5.1.0 + # via + # -r requirements/edx/base.txt + # pysrt charset-normalizer==2.0.12 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # aiohttp # requests -click==8.1.4 + # snowflake-connector-python +chem==1.2.0 + # via -r requirements/edx/base.txt +click==8.1.5 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # celery + # click-didyoumean + # click-plugins + # click-repl # code-annotations + # edx-django-utils + # nltk + # user-util +click-didyoumean==0.3.0 + # via + # -r requirements/edx/base.txt + # celery +click-plugins==1.1.1 + # via + # -r requirements/edx/base.txt + # celery +click-repl==0.3.0 + # via + # -r requirements/edx/base.txt + # celery code-annotations==1.3.0 - # via -r requirements/edx/doc.in + # via + # -r requirements/edx/base.txt + # -r requirements/edx/doc.in + # edx-enterprise + # edx-toggles +codejail-includes==1.0.0 + # via -r requirements/edx/base.txt +coreapi==2.3.3 + # via + # -r requirements/edx/base.txt + # drf-yasg +coreschema==0.0.4 + # via + # -r requirements/edx/base.txt + # coreapi + # drf-yasg +crowdsourcehinter-xblock==0.6 + # via -r requirements/edx/base.txt +cryptography==38.0.4 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # django-fernet-fields + # djfernet + # edx-enterprise + # jwcrypto + # optimizely-sdk + # pgpy + # pyjwt + # pyopenssl + # snowflake-connector-python + # social-auth-core +cssutils==2.7.1 + # via + # -r requirements/edx/base.txt + # pynliner deepmerge==1.1.0 # via sphinxcontrib-openapi +defusedxml==0.7.1 + # via + # -r requirements/edx/base.txt + # djangorestframework-xml + # ora2 + # python3-openid + # social-auth-core +deprecated==1.2.14 + # via + # -r requirements/edx/base.txt + # jwcrypto +django==3.2.20 + # via + # -c requirements/edx/../common_constraints.txt + # -r requirements/edx/base.txt + # django-appconf + # django-celery-results + # django-classy-tags + # django-config-models + # django-cors-headers + # django-crum + # django-fernet-fields + # django-filter + # django-js-asset + # django-method-override + # django-model-utils + # django-multi-email-field + # django-mysql + # django-oauth-toolkit + # django-sekizai + # django-ses + # django-splash + # django-statici18n + # django-storages + # django-user-tasks + # djangorestframework + # drf-jwt + # drf-nested-routers + # drf-yasg + # edx-ace + # edx-api-doc-tools + # edx-auth-backends + # edx-bulk-grades + # edx-celeryutils + # edx-completion + # edx-django-release-util + # edx-django-sites-extensions + # edx-django-utils + # edx-drf-extensions + # edx-enterprise + # edx-event-bus-kafka + # edx-event-bus-redis + # edx-i18n-tools + # edx-milestones + # edx-name-affirmation + # edx-organizations + # edx-proctoring + # edx-rbac + # edx-search + # edx-submissions + # edx-toggles + # edx-token-utils + # edx-when + # edxval + # enmerkar + # enmerkar-underscore + # event-tracking + # help-tokens + # jsonfield + # learner-pathway-progress + # lti-consumer-xblock + # openedx-blockstore + # openedx-django-pyfs + # openedx-django-wiki + # openedx-events + # openedx-filters + # ora2 + # outcome-surveys + # skill-tagging + # super-csv + # xss-utils +django-appconf==1.0.5 + # via + # -r requirements/edx/base.txt + # django-statici18n +django-cache-memoize==0.1.10 + # via + # -r requirements/edx/base.txt + # edx-enterprise +django-celery-results==2.5.1 + # via -r requirements/edx/base.txt +django-classy-tags==4.0.0 + # via + # -r requirements/edx/base.txt + # django-sekizai +django-config-models==2.3.0 + # via + # -r requirements/edx/base.txt + # edx-enterprise + # edx-name-affirmation + # lti-consumer-xblock +django-cors-headers==4.2.0 + # via -r requirements/edx/base.txt +django-countries==7.5.1 + # via + # -r requirements/edx/base.txt + # edx-enterprise +django-crum==0.7.9 + # via + # -r requirements/edx/base.txt + # edx-django-utils + # edx-enterprise + # edx-proctoring + # edx-rbac + # edx-toggles + # super-csv +django-environ==0.10.0 + # via + # -r requirements/edx/base.txt + # openedx-blockstore +django-fernet-fields==0.6 + # via + # -r requirements/edx/base.txt + # edx-enterprise +django-filter==23.2 + # via + # -r requirements/edx/base.txt + # edx-enterprise + # learner-pathway-progress + # lti-consumer-xblock + # openedx-blockstore +django-ipware==4.0.2 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # edx-enterprise + # edx-proctoring +django-js-asset==2.1.0 + # via + # -r requirements/edx/base.txt + # django-mptt +django-method-override==1.0.4 + # via -r requirements/edx/base.txt +django-model-utils==4.3.1 + # via + # -r requirements/edx/base.txt + # django-user-tasks + # edx-bulk-grades + # edx-celeryutils + # edx-completion + # edx-enterprise + # edx-milestones + # edx-name-affirmation + # edx-organizations + # edx-proctoring + # edx-rbac + # edx-submissions + # edx-when + # edxval + # learner-pathway-progress + # ora2 + # outcome-surveys + # skill-tagging + # super-csv +django-mptt==0.14.0 + # via + # -r requirements/edx/base.txt + # openedx-django-wiki +django-multi-email-field==0.7.0 + # via + # -r requirements/edx/base.txt + # edx-enterprise +django-mysql==4.11.0 + # via -r requirements/edx/base.txt +django-oauth-toolkit==1.3.2 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt +django-object-actions==4.1.0 + # via + # -r requirements/edx/base.txt + # edx-enterprise +django-pipeline==2.1.0 + # via -r requirements/edx/base.txt +django-ratelimit==4.0.0 + # via -r requirements/edx/base.txt +django-sekizai==4.1.0 + # via + # -r requirements/edx/base.txt + # openedx-django-wiki +django-ses==3.5.0 + # via -r requirements/edx/base.txt +django-simple-history==3.0.0 + # via + # -c requirements/edx/../common_constraints.txt + # -r requirements/edx/base.txt + # edx-enterprise + # edx-name-affirmation + # edx-organizations + # edx-proctoring + # learner-pathway-progress + # ora2 +django-splash==1.3.0 + # via -r requirements/edx/base.txt +django-statici18n==2.3.1 + # via + # -r requirements/edx/base.txt + # lti-consumer-xblock + # xblock-drag-and-drop-v2 +django-storages==1.9.1 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # edxval +django-user-tasks==3.0.0 + # via -r requirements/edx/base.txt +django-waffle==3.0.0 + # via + # -r requirements/edx/base.txt + # edx-django-utils + # edx-drf-extensions + # edx-enterprise + # edx-proctoring + # edx-toggles + # openedx-blockstore +django-webpack-loader==0.7.0 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # edx-proctoring +djangorestframework==3.14.0 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # django-config-models + # django-user-tasks + # drf-jwt + # drf-nested-routers + # drf-yasg + # edx-api-doc-tools + # edx-completion + # edx-drf-extensions + # edx-enterprise + # edx-name-affirmation + # edx-organizations + # edx-proctoring + # edx-submissions + # learner-pathway-progress + # openedx-blockstore + # ora2 + # super-csv +djangorestframework-xml==2.0.0 + # via + # -r requirements/edx/base.txt + # edx-enterprise +djfernet==0.8.1 + # via + # -r requirements/edx/base.txt + # edxval docutils==0.19 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # botocore # pydata-sphinx-theme # sphinx # sphinx-mdinclude +done-xblock==2.0.5 + # via -r requirements/edx/base.txt +drf-jwt==1.19.2 + # via + # -r requirements/edx/base.txt + # edx-drf-extensions +drf-nested-routers==0.93.4 + # via + # -r requirements/edx/base.txt + # openedx-blockstore +drf-yasg==1.21.5 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # edx-api-doc-tools +edx-ace==1.6.1 + # via -r requirements/edx/base.txt +edx-api-doc-tools==1.6.0 + # via + # -r requirements/edx/base.txt + # edx-name-affirmation + # openedx-blockstore +edx-auth-backends==4.1.0 + # via + # -r requirements/edx/base.txt + # openedx-blockstore +edx-braze-client==0.1.7 + # via -r requirements/edx/base.txt +edx-bulk-grades==1.0.1 + # via + # -r requirements/edx/base.txt + # staff-graded-xblock +edx-ccx-keys==1.2.1 + # via -r requirements/edx/base.txt +edx-celeryutils==1.2.2 + # via + # -r requirements/edx/base.txt + # edx-name-affirmation + # super-csv +edx-codejail==3.3.3 + # via -r requirements/edx/base.txt +edx-completion==4.2.1 + # via -r requirements/edx/base.txt +edx-django-release-util==1.2.0 + # via + # -r requirements/edx/base.txt + # edxval + # openedx-blockstore +edx-django-sites-extensions==4.0.0 + # via -r requirements/edx/base.txt +edx-django-utils==5.5.0 + # via + # -r requirements/edx/base.txt + # django-config-models + # edx-drf-extensions + # edx-enterprise + # edx-event-bus-kafka + # edx-event-bus-redis + # edx-name-affirmation + # edx-rest-api-client + # edx-toggles + # edx-when + # event-tracking + # learner-pathway-progress + # openedx-blockstore + # ora2 + # outcome-surveys + # super-csv +edx-drf-extensions==8.8.0 + # via + # -r requirements/edx/base.txt + # edx-completion + # edx-enterprise + # edx-name-affirmation + # edx-organizations + # edx-proctoring + # edx-rbac + # edx-when + # edxval + # learner-pathway-progress +edx-enterprise==4.0.0 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # learner-pathway-progress +edx-event-bus-kafka==5.1.0 + # via -r requirements/edx/base.txt +edx-event-bus-redis==0.3.1 + # via -r requirements/edx/base.txt +edx-i18n-tools==1.0.0 + # via + # -r requirements/edx/base.txt + # ora2 +edx-milestones==0.4.0 + # via -r requirements/edx/base.txt +edx-name-affirmation==2.3.5 + # via -r requirements/edx/base.txt +edx-opaque-keys[django]==2.3.0 + # via + # -r requirements/edx/base.txt + # edx-bulk-grades + # edx-ccx-keys + # edx-completion + # edx-drf-extensions + # edx-enterprise + # edx-milestones + # edx-organizations + # edx-proctoring + # edx-user-state-client + # edx-when + # learner-pathway-progress + # lti-consumer-xblock + # openedx-events + # ora2 + # outcome-surveys +edx-organizations==6.11.1 + # via -r requirements/edx/base.txt +edx-proctoring==4.16.0 + # via + # -r requirements/edx/base.txt + # edx-proctoring-proctortrack +edx-proctoring-proctortrack==1.0.5 + # via -r requirements/edx/base.txt +edx-rbac==1.7.0 + # via + # -r requirements/edx/base.txt + # edx-enterprise +edx-rest-api-client==5.5.2 + # via + # -r requirements/edx/base.txt + # edx-enterprise + # edx-proctoring +edx-search==3.6.0 + # via -r requirements/edx/base.txt +edx-sga==0.22.0 + # via -r requirements/edx/base.txt +edx-submissions==3.5.6 + # via + # -r requirements/edx/base.txt + # ora2 +edx-tincan-py35==1.0.0 + # via + # -r requirements/edx/base.txt + # edx-enterprise +edx-toggles==5.0.0 + # via + # -r requirements/edx/base.txt + # edx-completion + # edx-event-bus-kafka + # edx-event-bus-redis + # edx-name-affirmation + # edx-search + # edxval + # learner-pathway-progress + # ora2 +edx-token-utils==0.2.1 + # via -r requirements/edx/base.txt +edx-user-state-client==1.3.2 + # via -r requirements/edx/base.txt +edx-when==2.4.0 + # via + # -r requirements/edx/base.txt + # edx-proctoring +edxval==2.3.0 + # via -r requirements/edx/base.txt +elasticsearch==7.13.4 + # via + # -c requirements/edx/../common_constraints.txt + # -r requirements/edx/base.txt + # edx-search +enmerkar==0.7.1 + # via + # -r requirements/edx/base.txt + # enmerkar-underscore +enmerkar-underscore==2.1.0 + # via -r requirements/edx/base.txt +event-tracking==2.1.0 + # via + # -r requirements/edx/base.txt + # edx-proctoring + # edx-search +fastavro==1.8.0 + # via + # -r requirements/edx/base.txt + # openedx-events +filelock==3.12.2 + # via + # -r requirements/edx/base.txt + # snowflake-connector-python +frozenlist==1.4.0 + # via + # -r requirements/edx/base.txt + # aiohttp + # aiosignal +fs==2.0.27 + # via + # -r requirements/edx/base.txt + # fs-s3fs + # openedx-django-pyfs + # xblock +fs-s3fs==0.1.8 + # via + # -r requirements/edx/base.txt + # openedx-django-pyfs +future==0.18.3 + # via + # -r requirements/edx/base.txt + # pyjwkest +geoip2==4.7.0 + # via -r requirements/edx/base.txt gitdb==4.0.10 # via gitpython gitpython==3.1.32 # via -r requirements/edx/doc.in +glob2==0.7 + # via -r requirements/edx/base.txt +gunicorn==21.0.0 + # via -r requirements/edx/base.txt +help-tokens==2.2.0 + # via -r requirements/edx/base.txt +html5lib==1.1 + # via + # -r requirements/edx/base.txt + # ora2 +icalendar==5.0.7 + # via -r requirements/edx/base.txt idna==3.4 - # via requests + # via + # -r requirements/edx/base.txt + # optimizely-sdk + # requests + # snowflake-connector-python + # yarl imagesize==1.4.1 # via sphinx importlib-metadata==6.8.0 - # via sphinx + # via + # -r requirements/edx/base.txt + # markdown + # sphinx importlib-resources==6.0.0 # via + # -r requirements/edx/base.txt # jsonschema # jsonschema-specifications +inflection==0.5.1 + # via + # -r requirements/edx/base.txt + # drf-yasg +interchange==2021.0.4 + # via + # -r requirements/edx/base.txt + # py2neo +ipaddress==1.0.23 + # via -r requirements/edx/base.txt +isodate==0.6.1 + # via + # -r requirements/edx/base.txt + # python3-saml +itypes==1.2.0 + # via + # -r requirements/edx/base.txt + # coreapi jinja2==3.1.2 # via + # -r requirements/edx/base.txt # code-annotations + # coreschema # sphinx -jsonschema==4.18.2 - # via sphinxcontrib-openapi +jmespath==0.10.0 + # via + # -r requirements/edx/base.txt + # boto3 + # botocore +joblib==1.3.1 + # via + # -r requirements/edx/base.txt + # nltk +jsondiff==2.0.0 + # via + # -r requirements/edx/base.txt + # edx-enterprise +jsonfield==3.1.0 + # via + # -r requirements/edx/base.txt + # edx-celeryutils + # edx-enterprise + # edx-proctoring + # edx-submissions + # learner-pathway-progress + # lti-consumer-xblock + # ora2 + # outcome-surveys +jsonschema==4.18.3 + # via + # -r requirements/edx/base.txt + # optimizely-sdk + # sphinxcontrib-openapi jsonschema-specifications==2023.6.1 - # via jsonschema + # via + # -r requirements/edx/base.txt + # jsonschema +jwcrypto==1.5.0 + # via + # -r requirements/edx/base.txt + # pylti1p3 +kombu==5.3.1 + # via + # -r requirements/edx/base.txt + # celery +laboratory==1.0.2 + # via -r requirements/edx/base.txt +lazy==1.5 + # via + # -r requirements/edx/base.txt + # acid-xblock + # lti-consumer-xblock + # ora2 + # xblock +learner-pathway-progress==1.3.4 + # via -r requirements/edx/base.txt +libsass==0.10.0 + # via + # -r requirements/edx/base.txt + # ora2 +loremipsum==1.0.5 + # via + # -r requirements/edx/base.txt + # ora2 +lti-consumer-xblock==9.5.5 + # via -r requirements/edx/base.txt +lxml==4.9.3 + # via + # -r requirements/edx/base.txt + # edxval + # lti-consumer-xblock + # olxcleaner + # openedx-calc + # ora2 + # python3-saml + # xblock + # xmlsec +mailsnake==1.6.4 + # via -r requirements/edx/base.txt +mako==1.2.4 + # via + # -r requirements/edx/base.txt + # acid-xblock + # lti-consumer-xblock + # xblock-google-drive + # xblock-utils +markdown==3.3.7 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # openedx-django-wiki + # staff-graded-xblock + # xblock-poll +markey==0.8 + # via + # -r requirements/edx/base.txt + # enmerkar-underscore markupsafe==2.1.3 - # via jinja2 + # via + # -r requirements/edx/base.txt + # chem + # jinja2 + # mako + # openedx-calc + # xblock +maxminddb==2.4.0 + # via + # -r requirements/edx/base.txt + # geoip2 mistune==2.0.5 # via sphinx-mdinclude +mock==5.1.0 + # via -r requirements/edx/base.txt +mongoengine==0.27.0 + # via -r requirements/edx/base.txt +monotonic==1.6 + # via + # -r requirements/edx/base.txt + # analytics-python + # py2neo +mpmath==1.3.0 + # via + # -r requirements/edx/base.txt + # sympy +multidict==6.0.4 + # via + # -r requirements/edx/base.txt + # aiohttp + # yarl +mysqlclient==2.2.0 + # via + # -r requirements/edx/base.txt + # openedx-blockstore +newrelic==8.8.1 + # via + # -r requirements/edx/base.txt + # edx-django-utils +nltk==3.8.1 + # via + # -r requirements/edx/base.txt + # chem +nodeenv==1.8.0 + # via -r requirements/edx/base.txt +numpy==1.22.4 + # via + # -r requirements/edx/base.txt + # chem + # openedx-calc + # scipy + # shapely +oauthlib==3.0.1 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # django-oauth-toolkit + # lti-consumer-xblock + # requests-oauthlib + # social-auth-core +olxcleaner==0.2.1 + # via -r requirements/edx/base.txt +openedx-blockstore==1.3.1 + # via -r requirements/edx/base.txt +openedx-calc==3.0.1 + # via -r requirements/edx/base.txt +openedx-django-pyfs==3.4.0 + # via + # -r requirements/edx/base.txt + # xblock +openedx-django-require==2.0.0 + # via -r requirements/edx/base.txt +openedx-django-wiki==2.0.0 + # via -r requirements/edx/base.txt +openedx-events==8.2.0 + # via + # -r requirements/edx/base.txt + # edx-event-bus-kafka + # edx-event-bus-redis + # skill-tagging +openedx-filters==1.3.0 + # via + # -r requirements/edx/base.txt + # lti-consumer-xblock + # skill-tagging +openedx-mongodbproxy==0.2.0 + # via -r requirements/edx/base.txt +optimizely-sdk==4.1.1 + # via -r requirements/edx/base.txt +ora2==5.1.1 + # via -r requirements/edx/base.txt +oscrypto==1.3.0 + # via + # -r requirements/edx/base.txt + # snowflake-connector-python +outcome-surveys==2.4.0 + # via -r requirements/edx/base.txt packaging==23.1 # via + # -r requirements/edx/base.txt + # drf-yasg + # gunicorn + # py2neo # pydata-sphinx-theme + # snowflake-connector-python # sphinx +pansi==2020.7.3 + # via + # -r requirements/edx/base.txt + # py2neo +path==16.7.1 + # via + # -r requirements/edx/base.txt + # edx-i18n-tools + # path-py +path-py==12.5.0 + # via + # -r requirements/edx/base.txt + # edx-enterprise + # ora2 + # staff-graded-xblock +paver==1.3.4 + # via -r requirements/edx/base.txt pbr==5.11.1 - # via stevedore + # via + # -r requirements/edx/base.txt + # stevedore +pgpy==0.6.0 + # via + # -r requirements/edx/base.txt + # edx-enterprise picobox==3.0.0 # via sphinxcontrib-openapi +piexif==1.1.3 + # via -r requirements/edx/base.txt +pillow==9.5.0 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # edx-enterprise + # edx-organizations + # edxval pkgutil-resolve-name==1.3.10 - # via jsonschema + # via + # -r requirements/edx/base.txt + # jsonschema +polib==1.2.0 + # via + # -r requirements/edx/base.txt + # edx-i18n-tools +prompt-toolkit==3.0.39 + # via + # -r requirements/edx/base.txt + # click-repl +psutil==5.9.5 + # via + # -r requirements/edx/base.txt + # edx-django-utils +py2neo==2021.2.3 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt +pyasn1==0.5.0 + # via + # -r requirements/edx/base.txt + # pgpy +pycountry==22.3.5 + # via -r requirements/edx/base.txt +pycparser==2.21 + # via + # -r requirements/edx/base.txt + # cffi +pycryptodomex==3.18.0 + # via + # -r requirements/edx/base.txt + # edx-proctoring + # lti-consumer-xblock + # pyjwkest + # snowflake-connector-python pydata-sphinx-theme==0.13.3 # via sphinx-book-theme pygments==2.15.1 # via + # -r requirements/edx/base.txt # accessible-pygments + # py2neo # pydata-sphinx-theme # sphinx # sphinx-mdinclude +pyjwkest==1.4.2 + # via + # -r requirements/edx/base.txt + # edx-token-utils + # lti-consumer-xblock +pyjwt[crypto]==2.7.0 + # via + # -r requirements/edx/base.txt + # drf-jwt + # edx-auth-backends + # edx-drf-extensions + # edx-proctoring + # edx-rest-api-client + # pylti1p3 + # snowflake-connector-python + # social-auth-core +pylatexenc==2.10 + # via + # -r requirements/edx/base.txt + # olxcleaner +pylti1p3==2.0.0 + # via -r requirements/edx/base.txt +pymemcache==4.0.0 + # via -r requirements/edx/base.txt +pymongo==3.13.0 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # edx-opaque-keys + # event-tracking + # mongoengine + # openedx-mongodbproxy +pynacl==1.5.0 + # via + # -r requirements/edx/base.txt + # edx-django-utils +pynliner==0.8.0 + # via -r requirements/edx/base.txt +pyopenssl==22.0.0 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # optimizely-sdk + # snowflake-connector-python +pyparsing==3.1.0 + # via + # -r requirements/edx/base.txt + # chem + # openedx-calc +pyrsistent==0.19.3 + # via + # -r requirements/edx/base.txt + # optimizely-sdk +pysrt==1.1.2 + # via + # -r requirements/edx/base.txt + # edxval +python-dateutil==2.8.2 + # via + # -r requirements/edx/base.txt + # analytics-python + # botocore + # celery + # edx-ace + # edx-drf-extensions + # edx-enterprise + # edx-proctoring + # icalendar + # olxcleaner + # ora2 + # xblock +python-memcached==1.59 + # via -r requirements/edx/base.txt python-slugify==8.0.1 - # via code-annotations + # via + # -r requirements/edx/base.txt + # code-annotations +python-swiftclient==4.3.0 + # via + # -r requirements/edx/base.txt + # ora2 +python3-openid==3.2.0 ; python_version >= "3" + # via + # -r requirements/edx/base.txt + # social-auth-core +python3-saml==1.15.0 + # via -r requirements/edx/base.txt pytz==2022.7.1 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt # babel + # django + # django-ses + # djangorestframework + # drf-yasg + # edx-completion + # edx-enterprise + # edx-proctoring + # edx-submissions + # edx-tincan-py35 + # event-tracking + # fs + # icalendar + # interchange + # learner-pathway-progress + # olxcleaner + # openedx-blockstore + # ora2 + # snowflake-connector-python + # xblock +pyuca==1.2 + # via -r requirements/edx/base.txt pyyaml==6.0 # via + # -r requirements/edx/base.txt # code-annotations + # edx-django-release-util + # edx-i18n-tools # sphinxcontrib-openapi + # xblock +random2==1.0.1 + # via -r requirements/edx/base.txt +recommender-xblock==2.0.1 + # via -r requirements/edx/base.txt +redis==4.6.0 + # via + # -r requirements/edx/base.txt + # walrus referencing==0.29.1 # via + # -r requirements/edx/base.txt # jsonschema # jsonschema-specifications -requests==2.31.0 - # via sphinx -rpds-py==0.8.10 +regex==2023.6.3 # via + # -r requirements/edx/base.txt + # nltk +requests==2.31.0 + # via + # -r requirements/edx/base.txt + # algoliasearch + # analytics-python + # coreapi + # django-oauth-toolkit + # edx-bulk-grades + # edx-drf-extensions + # edx-enterprise + # edx-rest-api-client + # geoip2 + # learner-pathway-progress + # mailsnake + # optimizely-sdk + # outcome-surveys + # pyjwkest + # pylti1p3 + # python-swiftclient + # requests-oauthlib + # sailthru-client + # slumber + # snowflake-connector-python + # social-auth-core + # sphinx +requests-oauthlib==1.3.1 + # via + # -r requirements/edx/base.txt + # social-auth-core +rpds-py==0.8.11 + # via + # -r requirements/edx/base.txt # jsonschema # referencing +ruamel-yaml==0.17.32 + # via + # -r requirements/edx/base.txt + # drf-yasg +ruamel-yaml-clib==0.2.7 + # via + # -r requirements/edx/base.txt + # ruamel-yaml +rules==3.3 + # via + # -r requirements/edx/base.txt + # edx-enterprise + # edx-proctoring +s3transfer==0.1.13 + # via + # -r requirements/edx/base.txt + # boto3 +sailthru-client==2.2.3 + # via + # -r requirements/edx/base.txt + # edx-ace +scipy==1.7.3 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # chem + # openedx-calc +semantic-version==2.10.0 + # via + # -r requirements/edx/base.txt + # edx-drf-extensions +shapely==2.0.1 + # via -r requirements/edx/base.txt +simplejson==3.19.1 + # via + # -r requirements/edx/base.txt + # sailthru-client + # super-csv + # xblock-utils six==1.16.0 - # via sphinxcontrib-httpdomain + # via + # -r requirements/edx/base.txt + # analytics-python + # bleach + # chem + # codejail-includes + # crowdsourcehinter-xblock + # edx-ace + # edx-auth-backends + # edx-ccx-keys + # edx-codejail + # edx-django-release-util + # edx-drf-extensions + # edx-milestones + # edx-rbac + # event-tracking + # fs + # fs-s3fs + # html5lib + # interchange + # isodate + # libsass + # optimizely-sdk + # pansi + # paver + # py2neo + # pyjwkest + # python-dateutil + # python-memcached + # sphinxcontrib-httpdomain +skill-tagging==0.1.0 + # via -r requirements/edx/base.txt +slumber==0.7.1 + # via + # -r requirements/edx/base.txt + # edx-bulk-grades + # edx-enterprise + # edx-rest-api-client smmap==5.0.0 # via gitdb snowballstemmer==2.2.0 # via sphinx +snowflake-connector-python==3.0.4 + # via + # -r requirements/edx/base.txt + # edx-enterprise +social-auth-app-django==5.0.0 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # edx-auth-backends +social-auth-core==4.3.0 + # via + # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # edx-auth-backends + # social-auth-app-django +sorl-thumbnail==12.9.0 + # via + # -r requirements/edx/base.txt + # openedx-django-wiki +sortedcontainers==2.4.0 + # via + # -r requirements/edx/base.txt + # snowflake-connector-python soupsieve==2.4.1 - # via beautifulsoup4 + # via + # -r requirements/edx/base.txt + # beautifulsoup4 sphinx==6.2.1 # via # -r requirements/edx/doc.in # pydata-sphinx-theme # sphinx-book-theme # sphinx-design + # sphinx-reredirects # sphinxcontrib-httpdomain # sphinxcontrib-openapi # sphinxext-rediraffe @@ -126,6 +1330,8 @@ sphinx-design==0.4.1 # via -r requirements/edx/doc.in sphinx-mdinclude==0.5.3 # via sphinxcontrib-openapi +sphinx-reredirects==0.1.2 + # via -r requirements/edx/doc.in sphinxcontrib-applehelp==1.0.4 # via sphinx sphinxcontrib-devhelp==1.0.2 @@ -144,17 +1350,165 @@ sphinxcontrib-serializinghtml==1.1.5 # via sphinx sphinxext-rediraffe==0.2.7 # via -r requirements/edx/doc.in +sqlparse==0.4.4 + # via + # -r requirements/edx/base.txt + # django + # openedx-blockstore +staff-graded-xblock==2.0.1 + # via -r requirements/edx/base.txt stevedore==5.1.0 - # via code-annotations + # via + # -r requirements/edx/base.txt + # code-annotations + # edx-ace + # edx-django-utils + # edx-enterprise + # edx-opaque-keys +super-csv==3.0.1 + # via + # -r requirements/edx/base.txt + # edx-bulk-grades +sympy==1.12 + # via + # -r requirements/edx/base.txt + # openedx-calc +testfixtures==7.1.0 + # via + # -r requirements/edx/base.txt + # edx-enterprise text-unidecode==1.3 - # via python-slugify + # via + # -r requirements/edx/base.txt + # python-slugify +tinycss2==1.1.1 + # via + # -r requirements/edx/base.txt + # bleach +tqdm==4.65.0 + # via + # -r requirements/edx/base.txt + # nltk typing-extensions==4.7.1 - # via pydata-sphinx-theme + # via + # -r requirements/edx/base.txt + # asgiref + # django-countries + # kombu + # pydata-sphinx-theme + # pylti1p3 + # snowflake-connector-python +tzdata==2023.3 + # via + # -r requirements/edx/base.txt + # backports-zoneinfo + # celery +unicodecsv==0.14.1 + # via + # -r requirements/edx/base.txt + # edx-enterprise +uritemplate==4.1.1 + # via + # -r requirements/edx/base.txt + # coreapi + # drf-yasg urllib3==1.26.16 # via # -c requirements/edx/../constraints.txt + # -r requirements/edx/base.txt + # elasticsearch + # py2neo # requests -zipp==3.16.1 + # snowflake-connector-python +user-util==1.0.0 + # via -r requirements/edx/base.txt +vine==5.0.0 # via + # -r requirements/edx/base.txt + # amqp + # celery + # kombu +voluptuous==0.13.1 + # via + # -r requirements/edx/base.txt + # ora2 +walrus==0.9.3 + # via + # -r requirements/edx/base.txt + # edx-event-bus-redis +watchdog==3.0.0 + # via -r requirements/edx/base.txt +wcwidth==0.2.6 + # via + # -r requirements/edx/base.txt + # prompt-toolkit +web-fragments==2.0.0 + # via + # -r requirements/edx/base.txt + # crowdsourcehinter-xblock + # edx-sga + # staff-graded-xblock + # xblock + # xblock-utils +webencodings==0.5.1 + # via + # -r requirements/edx/base.txt + # bleach + # html5lib + # tinycss2 +webob==1.8.7 + # via + # -r requirements/edx/base.txt + # xblock +wrapt==1.15.0 + # via + # -r requirements/edx/base.txt + # deprecated +xblock[django]==1.6.2 + # via + # -r requirements/edx/base.txt + # acid-xblock + # crowdsourcehinter-xblock + # done-xblock + # edx-completion + # edx-sga + # edx-user-state-client + # edx-when + # lti-consumer-xblock + # ora2 + # staff-graded-xblock + # xblock-google-drive + # xblock-poll + # xblock-utils +xblock-drag-and-drop-v2==3.2.0 + # via -r requirements/edx/base.txt +xblock-google-drive==0.3.0 + # via -r requirements/edx/base.txt +xblock-poll==1.13.0 + # via -r requirements/edx/base.txt +xblock-utils==3.2.0 + # via + # -r requirements/edx/base.txt + # edx-sga + # lti-consumer-xblock + # staff-graded-xblock + # xblock-drag-and-drop-v2 + # xblock-google-drive +xmlsec==1.3.13 + # via + # -r requirements/edx/base.txt + # python3-saml +xss-utils==0.4.0 + # via -r requirements/edx/base.txt +yarl==1.9.2 + # via + # -r requirements/edx/base.txt + # aiohttp +zipp==3.16.2 + # via + # -r requirements/edx/base.txt # importlib-metadata # importlib-resources + +# The following packages are considered to be unsafe in a requirements file: +# setuptools diff --git a/requirements/edx/paver.in b/requirements/edx/paver.in index c5e80916e9..caaf349592 100644 --- a/requirements/edx/paver.in +++ b/requirements/edx/paver.in @@ -20,6 +20,7 @@ paver # Build, distribution and deployment scripti psutil # Library for retrieving information on running processes and system utilization pymongo # via edx-opaque-keys python-memcached # Python interface to the memcached memory cache daemon +pymemcache # Python interface to the memcached memory cache daemon requests # Simple interface for making HTTP requests stevedore # Support for runtime plugins, used for XBlocks and edx-platform Django app plugins watchdog # Used in paver watch_assets diff --git a/requirements/edx/paver.txt b/requirements/edx/paver.txt index 18eb26f2ef..34b6b91243 100644 --- a/requirements/edx/paver.txt +++ b/requirements/edx/paver.txt @@ -30,6 +30,8 @@ pbr==5.11.1 # via stevedore psutil==5.9.5 # via -r requirements/edx/paver.in +pymemcache==4.0.0 + # via -r requirements/edx/paver.in pymongo==3.13.0 # via # -c requirements/edx/../constraints.txt diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt index bec66eeb67..6dab6bac6b 100644 --- a/requirements/edx/testing.txt +++ b/requirements/edx/testing.txt @@ -161,7 +161,7 @@ charset-normalizer==2.0.12 # snowflake-connector-python chem==1.2.0 # via -r requirements/edx/base.txt -click==8.1.4 +click==8.1.5 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt @@ -251,11 +251,11 @@ deprecated==1.2.14 # via # -r requirements/edx/base.txt # jwcrypto -diff-cover==7.6.1 +diff-cover==7.7.0 # via -r requirements/edx/coverage.txt dill==0.3.6 # via pylint -distlib==0.3.6 +distlib==0.3.7 # via virtualenv django==3.2.20 # via @@ -590,7 +590,7 @@ edx-drf-extensions==8.8.0 # edx-when # edxval # learner-pathway-progress -edx-enterprise==4.0.0 +edx-enterprise==4.0.1 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt @@ -743,7 +743,7 @@ glob2==0.7 # via -r requirements/edx/base.txt grimp==2.5 # via import-linter -gunicorn==20.1.0 +gunicorn==21.0.0 # via -r requirements/edx/base.txt h11==0.14.0 # via @@ -839,7 +839,7 @@ jsonfield==3.1.0 # lti-consumer-xblock # ora2 # outcome-surveys -jsonschema==4.18.2 +jsonschema==4.18.3 # via # -r requirements/edx/base.txt # optimizely-sdk @@ -1014,6 +1014,7 @@ packaging==23.1 # via # -r requirements/edx/base.txt # drf-yasg + # gunicorn # py2neo # pytest # snowflake-connector-python @@ -1058,7 +1059,7 @@ pkgutil-resolve-name==1.3.10 # via # -r requirements/edx/base.txt # jsonschema -platformdirs==3.8.1 +platformdirs==3.9.1 # via # pylint # virtualenv @@ -1110,9 +1111,9 @@ pycryptodomex==3.18.0 # lti-consumer-xblock # pyjwkest # snowflake-connector-python -pydantic==2.0.2 +pydantic==2.0.3 # via fastapi -pydantic-core==2.1.2 +pydantic-core==2.3.0 # via pydantic pygments==2.15.1 # via @@ -1160,6 +1161,8 @@ pylint-pytest==0.3.0 # via -r requirements/edx/testing.in pylti1p3==2.0.0 # via -r requirements/edx/base.txt +pymemcache==4.0.0 + # via -r requirements/edx/base.txt pymongo==3.13.0 # via # -c requirements/edx/../constraints.txt @@ -1335,7 +1338,7 @@ requests-oauthlib==1.3.1 # social-auth-core rfc3986[idna2008]==1.5.0 # via httpx -rpds-py==0.8.10 +rpds-py==0.8.11 # via # -r requirements/edx/base.txt # jsonschema @@ -1562,7 +1565,7 @@ urllib3==1.26.16 # snowflake-connector-python user-util==1.0.0 # via -r requirements/edx/base.txt -uvicorn==0.22.0 +uvicorn==0.23.0 # via pact-python vine==5.0.0 # via @@ -1570,13 +1573,13 @@ vine==5.0.0 # amqp # celery # kombu -virtualenv==20.23.1 +virtualenv==20.24.0 # via tox voluptuous==0.13.1 # via # -r requirements/edx/base.txt # ora2 -walrus==0.9.2 +walrus==0.9.3 # via # -r requirements/edx/base.txt # edx-event-bus-redis @@ -1649,7 +1652,7 @@ yarl==1.9.2 # via # -r requirements/edx/base.txt # aiohttp -zipp==3.16.1 +zipp==3.16.2 # via # -r requirements/edx/base.txt # importlib-metadata diff --git a/requirements/pip-tools.txt b/requirements/pip-tools.txt index f25e2bece4..c668c984a2 100644 --- a/requirements/pip-tools.txt +++ b/requirements/pip-tools.txt @@ -6,7 +6,7 @@ # build==0.10.0 # via pip-tools -click==8.1.4 +click==8.1.5 # via # -c requirements/constraints.txt # pip-tools @@ -20,6 +20,7 @@ tomli==2.0.1 # via # build # pip-tools + # pyproject-hooks wheel==0.40.0 # via pip-tools diff --git a/requirements/pip.txt b/requirements/pip.txt index fa19e6f0b1..bd9fb55318 100644 --- a/requirements/pip.txt +++ b/requirements/pip.txt @@ -8,7 +8,7 @@ wheel==0.40.0 # via -r requirements/pip.in # The following packages are considered to be unsafe in a requirements file: -pip==23.1.2 +pip==23.2 # via -r requirements/pip.in setuptools==68.0.0 # via -r requirements/pip.in diff --git a/themes/stanford-style/lms/templates/register-form.html b/themes/stanford-style/lms/templates/register-form.html index ce3234f5fb..16228ad8ed 100644 --- a/themes/stanford-style/lms/templates/register-form.html +++ b/themes/stanford-style/lms/templates/register-form.html @@ -1,7 +1,6 @@ ## xss-lint: disable=mako-missing-default <%! from common.djangoapps import third_party_auth -import six from common.djangoapps.third_party_auth import pipeline, provider from django.utils.translation import ugettext as _ from django_countries import countries @@ -169,7 +168,7 @@ from common.djangoapps.student.models import UserProfile
stanza; get code from