diff --git a/.github/workflows/migrations-check.yml b/.github/workflows/migrations-check.yml index fb66cfe775cb..3929e7f10e6f 100644 --- a/.github/workflows/migrations-check.yml +++ b/.github/workflows/migrations-check.yml @@ -16,11 +16,16 @@ jobs: os: [ ubuntu-20.04 ] python-version: [ 3.8 ] # 'pinned' is used to install the latest patch version of Django - # within the global constraint i.e. Django==4.2.8 in current case + # within the global constraint i.e. Django==3.2.21 in current case # because we have global constraint of Django<4.2 - django-version: ["pinned"] + django-version: ["pinned", "4.2"] mongo-version: ["4"] - mysql-version: ["8"] + mysql-version: ["5.7", "8"] + # excluding mysql5.7 with Django 4.2 since Django 4.2 has + # dropped support for MySQL<8 + exclude: + - django-version: "4.2" + mysql-version: "5.7" services: mongo: image: mongo:${{ matrix.mongo-version }} diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index be7e122f2fd8..c3b1086c20eb 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -17,6 +17,7 @@ jobs: - "3.8" django-version: - "pinned" + - "4.2" # When updating the shards, remember to make the same changes in # .github/workflows/unit-tests-gh-hosted.yml shard_name: diff --git a/Makefile b/Makefile index 92c89d844aa8..cc6fa5591376 100644 --- a/Makefile +++ b/Makefile @@ -150,8 +150,6 @@ compile-requirements: pre-requirements $(COMMON_CONSTRAINTS_TXT) ## Re-compile * @# time someone tries to use the outputs. sed '/^django-simple-history==/d' requirements/common_constraints.txt > requirements/common_constraints.tmp mv requirements/common_constraints.tmp requirements/common_constraints.txt - sed 's/Django<4.0//g' requirements/common_constraints.txt > requirements/common_constraints.tmp - mv requirements/common_constraints.tmp requirements/common_constraints.txt pip-compile -v --allow-unsafe ${COMPILE_OPTS} -o requirements/pip.txt requirements/pip.in pip install -r requirements/pip.txt diff --git a/cms/envs/common.py b/cms/envs/common.py index 8f974e73e521..4ded7a9cff34 100644 --- a/cms/envs/common.py +++ b/cms/envs/common.py @@ -1105,8 +1105,8 @@ } DEFAULT_AUTO_FIELD = 'django.db.models.AutoField' -DEFAULT_HASHING_ALGORITHM = 'sha256' - +# This will be overridden through CMS config +DEFAULT_HASHING_ALGORITHM = 'sha1' #################### Python sandbox ############################################ CODE_JAIL = { diff --git a/lms/envs/common.py b/lms/envs/common.py index 729717b7ae72..94d298cddbd1 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -1762,8 +1762,8 @@ def _make_mako_template_dirs(settings): DEFAULT_AUTO_FIELD = 'django.db.models.AutoField' -DEFAULT_HASHING_ALGORITHM = 'sha256' - +# This will be overridden through LMS config +DEFAULT_HASHING_ALGORITHM = 'sha1' #################### Python sandbox ############################################ CODE_JAIL = { diff --git a/openedx/core/djangoapps/safe_sessions/tests/test_safe_cookie_data.py b/openedx/core/djangoapps/safe_sessions/tests/test_safe_cookie_data.py index 650a8d157baf..47efa626ec99 100644 --- a/openedx/core/djangoapps/safe_sessions/tests/test_safe_cookie_data.py +++ b/openedx/core/djangoapps/safe_sessions/tests/test_safe_cookie_data.py @@ -236,7 +236,7 @@ def test_pinned_values(self): "|HvGnjXf1b3jU" "|ImExZWZiNzVlZGFmM2FkZWZmYjM4YjI0ZmZkOWU4MzExODU0MTk4NmVlNGRiYzBlODdhYWUzOGM5MzVlNzk4NjUi" ":1m6Hve" - ":Pra4iochviPvKUoIV33gdVZFDgG-cMDlIYfl8iFIMaY" + ":OMhY2FL2pudJjSSXChtI-zR8QVA" ) @pytest.mark.skipif(django.VERSION[0] < 4, reason="For django42 default algorithm is sha256. No need for django32.") diff --git a/openedx/core/djangoapps/theming/storage.py b/openedx/core/djangoapps/theming/storage.py index 4a48cbb6e0a5..e8e3eefcd3d7 100644 --- a/openedx/core/djangoapps/theming/storage.py +++ b/openedx/core/djangoapps/theming/storage.py @@ -192,41 +192,33 @@ def converter(matchobj): This requires figuring out which files the matched URL resolves to and calling the url() method of the storage. """ - matches = matchobj.groupdict() - matched = matches["matched"] - url = matches["url"] + matched, url = matchobj.groups() # Ignore absolute/protocol-relative and data-uri URLs. - if re.match(r"^[a-z]+:", url): + if re.match(r'^[a-z]+:', url): return matched # Ignore absolute URLs that don't point to a static file (dynamic # CSS / JS?). Note that STATIC_URL cannot be empty. - if url.startswith("/") and not url.startswith(settings.STATIC_URL): + if url.startswith('/') and not url.startswith(settings.STATIC_URL): return matched # Strip off the fragment so a path-like fragment won't interfere. url_path, fragment = urldefrag(url) - # Ignore URLs without a path - if not url_path: - return matched - - if url_path.startswith("/"): + if url_path.startswith('/'): # Otherwise the condition above would have returned prematurely. assert url_path.startswith(settings.STATIC_URL) target_name = url_path[len(settings.STATIC_URL):] else: # We're using the posixpath module to mix paths and URLs conveniently. - source_name = name if os.sep == "/" else name.replace(os.sep, "/") + source_name = name if os.sep == '/' else name.replace(os.sep, '/') target_name = posixpath.join(posixpath.dirname(source_name), url_path) # Determine the hashed name of the target file with the storage backend. hashed_url = self._url( - self._stored_name, - unquote(target_name), - force=True, - hashed_files=hashed_files, + self._stored_name, unquote(target_name), + force=True, hashed_files=hashed_files, ) # NOTE: @@ -236,19 +228,15 @@ def converter(matchobj): # The line is commented and not removed to make future django upgrade easier and show exactly what is # changed in this method override # - # transformed_url = "/".join( - # url_path.split("/")[:-1] + hashed_url.split("/")[-1:] - # ) - + #transformed_url = '/'.join(url_path.split('/')[:-1] + hashed_url.split('/')[-1:]) transformed_url = hashed_url # This line was added. # Restore the fragment that was stripped off earlier. if fragment: - transformed_url += ("?#" if "?#" in url else "#") + fragment + transformed_url += ('?#' if '?#' in url else '#') + fragment # Return the hashed version to the file - matches["url"] = unquote(transformed_url) - return template % matches + return template % unquote(transformed_url) return converter diff --git a/requirements/common_constraints.txt b/requirements/common_constraints.txt index 7313473a1675..53dff4a22d75 100644 --- a/requirements/common_constraints.txt +++ b/requirements/common_constraints.txt @@ -17,7 +17,7 @@ # using LTS django version - +Django<4.0 # elasticsearch>=7.14.0 includes breaking changes in it which caused issues in discovery upgrade process. # elastic search changelog: https://www.elastic.co/guide/en/enterprise-search/master/release-notes-7.14.0.html diff --git a/requirements/constraints.txt b/requirements/constraints.txt index 111ead0354a1..c42e9e2b5942 100644 --- a/requirements/constraints.txt +++ b/requirements/constraints.txt @@ -25,15 +25,10 @@ click>=8.0,<9.0 # for them. edx-enterprise==4.10.6 -# Stay on LTS version, remove once this is added to common constraint -Django<5.0 - # django-oauth-toolkit version >=2.0.0 has breaking changes. More details # mentioned on this issue https://github.com/openedx/edx-platform/issues/32884 django-oauth-toolkit==1.7.1 -# incremental upgrade -django-simple-history==3.4.0 # constrained in opaque_keys. migration guide here: https://pymongo.readthedocs.io/en/4.0/migrate-to-pymongo4.html # Major upgrade will be done in separate ticket. diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index 21dc8c3b2e62..197dab2cb7f9 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -56,7 +56,6 @@ backoff==1.10.0 backports-zoneinfo[tzdata]==0.2.1 # via # celery - # django # icalendar # kombu beautifulsoup4==4.12.2 @@ -174,9 +173,9 @@ defusedxml==0.7.1 # social-auth-core deprecated==1.2.14 # via jwcrypto -django==4.2.8 +django==3.2.23 # via - # -c requirements/edx/../constraints.txt + # -c requirements/edx/../common_constraints.txt # -r requirements/edx/kernel.in # django-appconf # django-celery-results @@ -338,7 +337,6 @@ django-ses==3.5.2 # via -r requirements/edx/bundled.in django-simple-history==3.4.0 # via - # -c requirements/edx/../constraints.txt # -r requirements/edx/kernel.in # edx-enterprise # edx-name-affirmation @@ -939,6 +937,7 @@ pytz==2023.3.post1 # via # -r requirements/edx/kernel.in # babel + # django # django-ses # djangorestframework # drf-yasg diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt index 9c0325ee5f84..af369d720af6 100644 --- a/requirements/edx/development.txt +++ b/requirements/edx/development.txt @@ -117,7 +117,6 @@ backports-zoneinfo[tzdata]==0.2.1 # -r requirements/edx/testing.txt # backports-zoneinfo # celery - # django # icalendar # kombu beautifulsoup4==4.12.2 @@ -343,9 +342,9 @@ distlib==0.3.8 # via # -r requirements/edx/testing.txt # virtualenv -django==4.2.8 +django==3.2.23 # via - # -c requirements/edx/../constraints.txt + # -c requirements/edx/../common_constraints.txt # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # django-appconf @@ -560,7 +559,6 @@ django-ses==3.5.2 # -r requirements/edx/testing.txt django-simple-history==3.4.0 # via - # -c requirements/edx/../constraints.txt # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise @@ -1671,6 +1669,7 @@ pytz==2023.3.post1 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # babel + # django # django-ses # djangorestframework # drf-yasg diff --git a/requirements/edx/doc.txt b/requirements/edx/doc.txt index 36014f6b3749..7eb6b36351d3 100644 --- a/requirements/edx/doc.txt +++ b/requirements/edx/doc.txt @@ -79,7 +79,6 @@ backports-zoneinfo[tzdata]==0.2.1 # -r requirements/edx/base.txt # backports-zoneinfo # celery - # django # icalendar # kombu beautifulsoup4==4.12.2 @@ -224,9 +223,9 @@ deprecated==1.2.14 # via # -r requirements/edx/base.txt # jwcrypto -django==4.2.8 +django==3.2.23 # via - # -c requirements/edx/../constraints.txt + # -c requirements/edx/../common_constraints.txt # -r requirements/edx/base.txt # django-appconf # django-celery-results @@ -404,7 +403,6 @@ django-ses==3.5.2 # via -r requirements/edx/base.txt django-simple-history==3.4.0 # via - # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt # edx-enterprise # edx-name-affirmation @@ -1122,6 +1120,7 @@ pytz==2023.3.post1 # via # -r requirements/edx/base.txt # babel + # django # django-ses # djangorestframework # drf-yasg diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt index 4b47f1324270..4fadc81c7ff6 100644 --- a/requirements/edx/testing.txt +++ b/requirements/edx/testing.txt @@ -83,7 +83,6 @@ backports-zoneinfo[tzdata]==0.2.1 # -r requirements/edx/base.txt # backports-zoneinfo # celery - # django # icalendar # kombu beautifulsoup4==4.12.2 @@ -257,9 +256,9 @@ dill==0.3.7 # via pylint distlib==0.3.8 # via virtualenv -django==4.2.8 +django==3.2.23 # via - # -c requirements/edx/../constraints.txt + # -c requirements/edx/../common_constraints.txt # -r requirements/edx/base.txt # django-appconf # django-celery-results @@ -437,7 +436,6 @@ django-ses==3.5.2 # via -r requirements/edx/base.txt django-simple-history==3.4.0 # via - # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt # edx-enterprise # edx-name-affirmation @@ -1252,6 +1250,7 @@ pytz==2023.3.post1 # via # -r requirements/edx/base.txt # babel + # django # django-ses # djangorestframework # drf-yasg