From c269d8497430d0dd74274607b05acf4fe2fd64bc Mon Sep 17 00:00:00 2001 From: Irtaza Akram Date: Mon, 18 Nov 2024 11:21:13 +0500 Subject: [PATCH 1/7] fix: unpin pylint pycodestyle --- requirements/constraints.txt | 14 --- requirements/edx-sandbox/base.txt | 12 +- requirements/edx/base.txt | 77 ++++++------ requirements/edx/coverage.txt | 2 +- requirements/edx/development.txt | 110 ++++++++---------- requirements/edx/doc.txt | 86 +++++++------- requirements/edx/paver.txt | 2 +- requirements/edx/semgrep.txt | 16 +-- requirements/edx/testing.in | 2 +- requirements/edx/testing.txt | 106 ++++++++--------- requirements/pip-tools.txt | 4 +- requirements/pip.txt | 4 +- .../requirements/testing.txt | 2 +- scripts/user_retirement/requirements/base.txt | 18 +-- .../user_retirement/requirements/testing.txt | 22 ++-- 15 files changed, 220 insertions(+), 257 deletions(-) diff --git a/requirements/constraints.txt b/requirements/constraints.txt index 48b74cac6a10..c7575d1e6ddd 100644 --- a/requirements/constraints.txt +++ b/requirements/constraints.txt @@ -148,16 +148,6 @@ openai<=0.28.1 # Issue for unpinning: https://github.com/openedx/edx-platform/issues/35267 path<16.12.0 -# Date: 2022-08-03 -# pycodestyle==2.9.0 generates false positive error E275. -# Constraint can be removed once the issue https://github.com/PyCQA/pycodestyle/issues/1090 is fixed. -pycodestyle<2.9.0 - -# Date: 2021-07-12 -# Issue for unpinning: https://github.com/openedx/edx-platform/issues/33560 -pylint<2.16.0 # greater version failing quality test. Fix them in seperate ticket. -astroid<2.14.0 - # Date: 2021-08-25 # At the time of writing this comment, we do not know whether py2neo>=2022 # will support our currently-deployed Neo4j version (3.5). @@ -177,7 +167,3 @@ pymongo<4.4.1 # We are pinning this until after all the smaller migrations get handled and then we can migrate this all at once. # Issue for unpinning: https://github.com/edx/edx-arch-experiments/issues/760 social-auth-app-django<=5.4.1 - -# # Date: 2024-10-14 -# # The edx-enterprise is currently using edx-rest-api-client==5.7.1, which needs to be updated first. -# edx-rest-api-client==5.7.1 diff --git a/requirements/edx-sandbox/base.txt b/requirements/edx-sandbox/base.txt index 8cf0cbb82904..15ea566721e5 100644 --- a/requirements/edx-sandbox/base.txt +++ b/requirements/edx-sandbox/base.txt @@ -14,13 +14,13 @@ click==8.1.6 # nltk codejail-includes==1.0.0 # via -r requirements/edx-sandbox/base.in -contourpy==1.3.0 +contourpy==1.3.1 # via matplotlib cryptography==43.0.3 # via -r requirements/edx-sandbox/base.in cycler==0.12.1 # via matplotlib -fonttools==4.54.1 +fonttools==4.55.0 # via matplotlib joblib==1.4.2 # via nltk @@ -31,7 +31,7 @@ lxml[html-clean,html_clean]==5.3.0 # -r requirements/edx-sandbox/base.in # lxml-html-clean # openedx-calc -lxml-html-clean==0.3.1 +lxml-html-clean==0.4.1 # via lxml markupsafe==3.0.2 # via @@ -57,7 +57,7 @@ numpy==1.26.4 # scipy openedx-calc==3.1.2 # via -r requirements/edx-sandbox/base.in -packaging==24.1 +packaging==24.2 # via matplotlib pillow==11.0.0 # via matplotlib @@ -73,7 +73,7 @@ python-dateutil==2.9.0.post0 # via matplotlib random2==1.0.2 # via -r requirements/edx-sandbox/base.in -regex==2024.9.11 +regex==2024.11.6 # via nltk scipy==1.14.1 # via @@ -88,5 +88,5 @@ sympy==1.13.3 # via # -r requirements/edx-sandbox/base.in # openedx-calc -tqdm==4.66.6 +tqdm==4.67.0 # via nltk diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index ab33781c6bad..eb6e5723f2ea 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -10,7 +10,7 @@ acid-xblock==0.4.1 # via -r requirements/edx/kernel.in aiohappyeyeballs==2.4.3 # via aiohttp -aiohttp==3.10.10 +aiohttp==3.11.2 # via # geoip2 # openai @@ -20,7 +20,7 @@ algoliasearch==3.0.0 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/bundled.in -amqp==5.2.0 +amqp==5.3.1 # via kombu analytics-python==1.4.post1 # via -r requirements/edx/kernel.in @@ -60,7 +60,7 @@ beautifulsoup4==4.12.3 # via pynliner billiard==4.2.1 # via celery -bleach[css]==6.1.0 +bleach[css]==6.2.0 # via # edx-enterprise # lti-consumer-xblock @@ -70,20 +70,20 @@ bleach[css]==6.1.0 # xblock-poll boto==2.49.0 # via -r requirements/edx/kernel.in -boto3==1.35.50 +boto3==1.35.63 # via # -r requirements/edx/kernel.in # django-ses # fs-s3fs # ora2 -botocore==1.35.50 +botocore==1.35.63 # via # -r requirements/edx/kernel.in # boto3 # s3transfer bridgekeeper==0.9 # via -r requirements/edx/kernel.in -cachecontrol==0.14.0 +cachecontrol==0.14.1 # via firebase-admin cachetools==5.5.0 # via google-auth @@ -138,7 +138,7 @@ click-plugins==1.1.1 # via celery click-repl==0.3.0 # via celery -code-annotations==1.8.0 +code-annotations==1.8.1 # via # edx-enterprise # edx-toggles @@ -254,7 +254,7 @@ django-config-models==2.7.0 # edx-enterprise # edx-name-affirmation # lti-consumer-xblock -django-cors-headers==4.5.0 +django-cors-headers==4.6.0 # via -r requirements/edx/kernel.in django-countries==7.6.1 # via @@ -309,7 +309,7 @@ django-mptt==0.16.0 # openedx-django-wiki django-multi-email-field==0.7.0 # via edx-enterprise -django-mysql==4.14.0 +django-mysql==4.15.0 # via -r requirements/edx/kernel.in django-oauth-toolkit==1.7.1 # via @@ -352,7 +352,7 @@ django-storages==1.14.3 # edxval django-user-tasks==3.2.0 # via -r requirements/edx/kernel.in -django-waffle==4.1.0 +django-waffle==4.2.0 # via # -r requirements/edx/kernel.in # edx-django-utils @@ -427,9 +427,9 @@ edx-celeryutils==1.3.0 # -r requirements/edx/kernel.in # edx-name-affirmation # super-csv -edx-codejail==3.5.1 +edx-codejail==3.5.2 # via -r requirements/edx/kernel.in -edx-completion==4.7.3 +edx-completion==4.7.6 # via -r requirements/edx/kernel.in edx-django-release-util==1.4.0 # via @@ -517,7 +517,7 @@ edx-search==4.1.1 # via -r requirements/edx/kernel.in edx-sga==0.25.0 # via -r requirements/edx/bundled.in -edx-submissions==3.8.2 +edx-submissions==3.8.3 # via # -r requirements/edx/kernel.in # ora2 @@ -541,7 +541,7 @@ edx-when==2.5.0 # via # -r requirements/edx/kernel.in # edx-proctoring -edxval==2.6.0 +edxval==2.6.1 # via -r requirements/edx/kernel.in elasticsearch==7.9.1 # via @@ -562,7 +562,7 @@ fastavro==1.9.7 # via openedx-events filelock==3.16.1 # via snowflake-connector-python -firebase-admin==6.5.0 +firebase-admin==6.6.0 # via edx-ace frozenlist==1.5.0 # via @@ -584,16 +584,16 @@ geoip2==4.8.0 # via -r requirements/edx/kernel.in glob2==0.7 # via -r requirements/edx/kernel.in -google-api-core[grpc]==2.22.0 +google-api-core[grpc]==2.23.0 # via # firebase-admin # google-api-python-client # google-cloud-core # google-cloud-firestore # google-cloud-storage -google-api-python-client==2.149.0 +google-api-python-client==2.153.0 # via firebase-admin -google-auth==2.35.0 +google-auth==2.36.0 # via # google-api-core # google-api-python-client @@ -617,15 +617,15 @@ google-crc32c==1.6.0 # google-resumable-media google-resumable-media==2.7.2 # via google-cloud-storage -googleapis-common-protos==1.65.0 +googleapis-common-protos==1.66.0 # via # google-api-core # grpcio-status -grpcio==1.67.0 +grpcio==1.68.0 # via # google-api-core # grpcio-status -grpcio-status==1.67.0 +grpcio-status==1.68.0 # via google-api-core gunicorn==23.0.0 # via -r requirements/edx/kernel.in @@ -706,7 +706,7 @@ libsass==0.10.0 # -r requirements/edx/paver.txt loremipsum==1.0.5 # via ora2 -lti-consumer-xblock==9.11.3 +lti-consumer-xblock==9.12.0 # via -r requirements/edx/kernel.in lxml[html-clean,html_clean]==5.3.0 # via @@ -721,7 +721,7 @@ lxml[html-clean,html_clean]==5.3.0 # python3-saml # xblock # xmlsec -lxml-html-clean==0.3.1 +lxml-html-clean==0.4.1 # via lxml mailsnake==1.6.4 # via -r requirements/edx/bundled.in @@ -771,7 +771,7 @@ multidict==6.1.0 # via # aiohttp # yarl -mysqlclient==2.2.5 +mysqlclient==2.2.6 # via -r requirements/edx/kernel.in newrelic==10.2.0 # via edx-django-utils @@ -839,13 +839,13 @@ optimizely-sdk==4.1.1 # -r requirements/edx/bundled.in ora2==6.14.0 # via -r requirements/edx/bundled.in -packaging==24.1 +packaging==24.2 # via # drf-yasg # gunicorn # py2neo # snowflake-connector-python -pansi==2020.7.3 +pansi==2024.11.0 # via py2neo paramiko==3.5.0 # via edx-enterprise @@ -877,6 +877,7 @@ pillow==11.0.0 # edx-enterprise # edx-organizations # edxval + # pansi platformdirs==4.3.6 # via snowflake-connector-python polib==1.2.0 @@ -884,7 +885,9 @@ polib==1.2.0 prompt-toolkit==3.0.48 # via click-repl propcache==0.2.0 - # via yarl + # via + # aiohttp + # yarl proto-plus==1.25.0 # via # google-api-core @@ -934,7 +937,7 @@ pyjwkest==1.4.2 # -r requirements/edx/kernel.in # edx-token-utils # lti-consumer-xblock -pyjwt[crypto]==2.9.0 +pyjwt[crypto]==2.10.0 # via # -r requirements/edx/kernel.in # drf-jwt @@ -1050,7 +1053,7 @@ referencing==0.35.1 # via # jsonschema # jsonschema-specifications -regex==2024.9.11 +regex==2024.11.6 # via nltk requests==2.32.3 # via @@ -1083,7 +1086,7 @@ requests-oauthlib==2.0.0 # via # -r requirements/edx/kernel.in # social-auth-core -rpds-py==0.20.0 +rpds-py==0.21.0 # via # jsonschema # referencing @@ -1119,7 +1122,6 @@ six==1.16.0 # -r requirements/edx/kernel.in # -r requirements/edx/paver.txt # analytics-python - # bleach # codejail-includes # crowdsourcehinter-xblock # edx-ace @@ -1136,7 +1138,6 @@ six==1.16.0 # interchange # libsass # optimizely-sdk - # pansi # paver # py2neo # pyjwkest @@ -1168,7 +1169,7 @@ sortedcontainers==2.4.0 # snowflake-connector-python soupsieve==2.6 # via beautifulsoup4 -sqlparse==0.5.1 +sqlparse==0.5.2 # via django staff-graded-xblock==2.3.0 # via -r requirements/edx/bundled.in @@ -1189,11 +1190,11 @@ testfixtures==8.3.0 # via edx-enterprise text-unidecode==1.3 # via python-slugify -tinycss2==1.2.1 +tinycss2==1.4.0 # via bleach tomlkit==0.13.2 # via snowflake-connector-python -tqdm==4.66.6 +tqdm==4.67.0 # via # nltk # openai @@ -1239,7 +1240,7 @@ voluptuous==0.15.2 # via ora2 walrus==0.9.4 # via edx-event-bus-redis -watchdog==5.0.3 +watchdog==6.0.0 # via -r requirements/edx/paver.txt wcwidth==0.2.13 # via prompt-toolkit @@ -1291,9 +1292,9 @@ xmlsec==1.3.14 # via python3-saml xss-utils==0.6.0 # via -r requirements/edx/kernel.in -yarl==1.17.0 +yarl==1.17.2 # via aiohttp -zipp==3.20.2 +zipp==3.21.0 # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: diff --git a/requirements/edx/coverage.txt b/requirements/edx/coverage.txt index 3635567f8906..2e82a2fb4d9a 100644 --- a/requirements/edx/coverage.txt +++ b/requirements/edx/coverage.txt @@ -6,7 +6,7 @@ # chardet==5.2.0 # via diff-cover -coverage==7.6.4 +coverage==7.6.7 # via -r requirements/edx/coverage.in diff-cover==9.2.0 # via -r requirements/edx/coverage.in diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt index 94b4f14e18e0..c07ac16c55ac 100644 --- a/requirements/edx/development.txt +++ b/requirements/edx/development.txt @@ -21,7 +21,7 @@ aiohappyeyeballs==2.4.3 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # aiohttp -aiohttp==3.10.10 +aiohttp==3.11.2 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -41,7 +41,7 @@ algoliasearch==3.0.0 # -c requirements/edx/../constraints.txt # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -amqp==5.2.0 +amqp==5.3.1 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -81,9 +81,8 @@ asn1crypto==1.5.1 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # snowflake-connector-python -astroid==2.13.5 +astroid==3.3.5 # via - # -c requirements/edx/../constraints.txt # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # pylint @@ -129,7 +128,7 @@ billiard==4.2.1 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # celery -bleach[css]==6.1.0 +bleach[css]==6.2.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -143,14 +142,14 @@ boto==2.49.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -boto3==1.35.50 +boto3==1.35.63 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # django-ses # fs-s3fs # ora2 -botocore==1.35.50 +botocore==1.35.63 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -164,7 +163,7 @@ build==1.2.2.post1 # via # -r requirements/edx/../pip-tools.txt # pip-tools -cachecontrol==0.14.0 +cachecontrol==0.14.1 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -266,7 +265,7 @@ click-repl==0.3.0 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # celery -code-annotations==1.8.0 +code-annotations==1.8.1 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -281,7 +280,7 @@ colorama==0.4.6 # via # -r requirements/edx/testing.txt # tox -coverage[toml]==7.6.4 +coverage[toml]==7.6.7 # via # -r requirements/edx/testing.txt # pytest-cov @@ -438,7 +437,7 @@ django-config-models==2.7.0 # edx-enterprise # edx-name-affirmation # lti-consumer-xblock -django-cors-headers==4.5.0 +django-cors-headers==4.6.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -514,7 +513,7 @@ django-multi-email-field==0.7.0 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise -django-mysql==4.14.0 +django-mysql==4.15.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -585,7 +584,7 @@ django-user-tasks==3.2.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -django-waffle==4.1.0 +django-waffle==4.2.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -695,11 +694,11 @@ edx-celeryutils==1.3.0 # -r requirements/edx/testing.txt # edx-name-affirmation # super-csv -edx-codejail==3.5.1 +edx-codejail==3.5.2 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -edx-completion==4.7.3 +edx-completion==4.7.6 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -817,7 +816,7 @@ edx-sga==0.25.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -edx-submissions==3.8.2 +edx-submissions==3.8.3 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -849,7 +848,7 @@ edx-when==2.5.0 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-proctoring -edxval==2.6.0 +edxval==2.6.1 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -882,11 +881,11 @@ execnet==2.1.1 # pytest-xdist factory-boy==3.3.1 # via -r requirements/edx/testing.txt -faker==30.8.1 +faker==33.0.0 # via # -r requirements/edx/testing.txt # factory-boy -fastapi==0.115.4 +fastapi==0.115.5 # via # -r requirements/edx/testing.txt # pact-python @@ -902,7 +901,7 @@ filelock==3.16.1 # snowflake-connector-python # tox # virtualenv -firebase-admin==6.5.0 +firebase-admin==6.6.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -946,7 +945,7 @@ glob2==0.7 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -google-api-core[grpc]==2.22.0 +google-api-core[grpc]==2.23.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -955,12 +954,12 @@ google-api-core[grpc]==2.22.0 # google-cloud-core # google-cloud-firestore # google-cloud-storage -google-api-python-client==2.149.0 +google-api-python-client==2.153.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # firebase-admin -google-auth==2.35.0 +google-auth==2.36.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1002,7 +1001,7 @@ google-resumable-media==2.7.2 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # google-cloud-storage -googleapis-common-protos==1.65.0 +googleapis-common-protos==1.66.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1012,13 +1011,13 @@ grimp==3.5 # via # -r requirements/edx/testing.txt # import-linter -grpcio==1.67.0 +grpcio==1.68.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # google-api-core # grpcio-status -grpcio-status==1.67.0 +grpcio-status==1.68.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1168,11 +1167,6 @@ lazy==1.6 # lti-consumer-xblock # ora2 # xblock -lazy-object-proxy==1.10.0 - # via - # -r requirements/edx/doc.txt - # -r requirements/edx/testing.txt - # astroid libsass==0.10.0 # via # -c requirements/edx/../constraints.txt @@ -1184,7 +1178,7 @@ loremipsum==1.0.5 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # ora2 -lti-consumer-xblock==9.11.3 +lti-consumer-xblock==9.12.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1203,7 +1197,7 @@ lxml[html-clean]==5.3.0 # python3-saml # xblock # xmlsec -lxml-html-clean==0.3.1 +lxml-html-clean==0.4.1 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1298,7 +1292,7 @@ mypy==1.11.2 # djangorestframework-stubs mypy-extensions==1.0.0 # via mypy -mysqlclient==2.2.5 +mysqlclient==2.2.6 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1404,7 +1398,7 @@ ora2==6.14.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -packaging==24.1 +packaging==24.2 # via # -r requirements/edx/../pip-tools.txt # -r requirements/edx/doc.txt @@ -1420,7 +1414,7 @@ packaging==24.1 # tox pact-python==2.2.2 # via -r requirements/edx/testing.txt -pansi==2020.7.3 +pansi==2024.11.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1473,6 +1467,7 @@ pillow==11.0.0 # edx-enterprise # edx-organizations # edxval + # pansi pip-tools==7.4.1 # via -r requirements/edx/../pip-tools.txt platformdirs==4.3.6 @@ -1503,6 +1498,7 @@ propcache==0.2.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt + # aiohttp # yarl proto-plus==1.25.0 # via @@ -1545,10 +1541,8 @@ pyasn1-modules==0.4.1 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # google-auth -pycodestyle==2.8.0 - # via - # -c requirements/edx/../constraints.txt - # -r requirements/edx/testing.txt +pycodestyle==2.12.1 + # via -r requirements/edx/testing.txt pycountry==24.6.1 # via # -r requirements/edx/doc.txt @@ -1596,7 +1590,7 @@ pyjwkest==1.4.2 # -r requirements/edx/testing.txt # edx-token-utils # lti-consumer-xblock -pyjwt[crypto]==2.9.0 +pyjwt[crypto]==2.10.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1614,9 +1608,8 @@ pylatexenc==2.10 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # olxcleaner -pylint==2.15.10 +pylint==3.3.1 # via - # -c requirements/edx/../constraints.txt # -r requirements/edx/testing.txt # edx-lint # pylint-celery @@ -1627,7 +1620,7 @@ pylint-celery==0.3 # via # -r requirements/edx/testing.txt # edx-lint -pylint-django==2.5.5 +pylint-django==2.6.1 # via # -r requirements/edx/testing.txt # edx-lint @@ -1636,7 +1629,7 @@ pylint-plugin-utils==0.8.2 # -r requirements/edx/testing.txt # pylint-celery # pylint-django -pylint-pytest==0.3.0 +pylint-pytest==1.1.8 # via -r requirements/edx/testing.txt pylti1p3==2.0.0 # via @@ -1699,7 +1692,7 @@ pysrt==1.1.2 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edxval -pytest==8.3.3 +pytest==8.2.0 # via # -r requirements/edx/testing.txt # pylint-pytest @@ -1712,7 +1705,7 @@ pytest==8.3.3 # pytest-xdist pytest-attrib==0.1.3 # via -r requirements/edx/testing.txt -pytest-cov==5.0.0 +pytest-cov==6.0.0 # via -r requirements/edx/testing.txt pytest-django==4.9.0 # via -r requirements/edx/testing.txt @@ -1826,7 +1819,7 @@ referencing==0.35.1 # -r requirements/edx/testing.txt # jsonschema # jsonschema-specifications -regex==2024.9.11 +regex==2024.11.6 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1867,7 +1860,7 @@ requests-oauthlib==2.0.0 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # social-auth-core -rpds-py==0.20.0 +rpds-py==0.21.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1926,7 +1919,6 @@ six==1.16.0 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # analytics-python - # bleach # codejail-includes # crowdsourcehinter-xblock # edx-ace @@ -1945,7 +1937,6 @@ six==1.16.0 # libsass # optimizely-sdk # pact-python - # pansi # paver # py2neo # pyjwkest @@ -2057,7 +2048,7 @@ sphinxcontrib-serializinghtml==2.0.0 # sphinx sphinxext-rediraffe==0.2.7 # via -r requirements/edx/doc.txt -sqlparse==0.5.1 +sqlparse==0.5.2 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -2100,12 +2091,12 @@ text-unidecode==1.3 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # python-slugify -tinycss2==1.2.1 +tinycss2==1.4.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # bleach -tomli==2.0.2 +tomli==2.1.0 # via django-stubs tomlkit==0.13.2 # via @@ -2115,7 +2106,7 @@ tomlkit==0.13.2 # snowflake-connector-python tox==4.23.2 # via -r requirements/edx/testing.txt -tqdm==4.66.6 +tqdm==4.67.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -2210,7 +2201,7 @@ walrus==0.9.4 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-event-bus-redis -watchdog==5.0.3 +watchdog==6.0.0 # via # -r requirements/edx/development.in # -r requirements/edx/doc.txt @@ -2241,7 +2232,7 @@ webob==1.8.9 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # xblock -wheel==0.44.0 +wheel==0.45.0 # via # -r requirements/edx/../pip-tools.txt # pip-tools @@ -2249,7 +2240,6 @@ wrapt==1.16.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt - # astroid xblock[django]==5.1.0 # via # -r requirements/edx/doc.txt @@ -2293,13 +2283,13 @@ xss-utils==0.6.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -yarl==1.17.0 +yarl==1.17.2 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # aiohttp # pact-python -zipp==3.20.2 +zipp==3.21.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt diff --git a/requirements/edx/doc.txt b/requirements/edx/doc.txt index 96ec726460c8..7d322ef5d245 100644 --- a/requirements/edx/doc.txt +++ b/requirements/edx/doc.txt @@ -14,7 +14,7 @@ aiohappyeyeballs==2.4.3 # via # -r requirements/edx/base.txt # aiohttp -aiohttp==3.10.10 +aiohttp==3.11.2 # via # -r requirements/edx/base.txt # geoip2 @@ -29,7 +29,7 @@ algoliasearch==3.0.0 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt -amqp==5.2.0 +amqp==5.3.1 # via # -r requirements/edx/base.txt # kombu @@ -57,10 +57,8 @@ asn1crypto==1.5.1 # via # -r requirements/edx/base.txt # snowflake-connector-python -astroid==2.13.5 - # via - # -c requirements/edx/../constraints.txt - # sphinx-autoapi +astroid==3.3.5 + # via sphinx-autoapi attrs==24.2.0 # via # -r requirements/edx/base.txt @@ -95,7 +93,7 @@ billiard==4.2.1 # via # -r requirements/edx/base.txt # celery -bleach[css]==6.1.0 +bleach[css]==6.2.0 # via # -r requirements/edx/base.txt # edx-enterprise @@ -106,20 +104,20 @@ bleach[css]==6.1.0 # xblock-poll boto==2.49.0 # via -r requirements/edx/base.txt -boto3==1.35.50 +boto3==1.35.63 # via # -r requirements/edx/base.txt # django-ses # fs-s3fs # ora2 -botocore==1.35.50 +botocore==1.35.63 # via # -r requirements/edx/base.txt # boto3 # s3transfer bridgekeeper==0.9 # via -r requirements/edx/base.txt -cachecontrol==0.14.0 +cachecontrol==0.14.1 # via # -r requirements/edx/base.txt # firebase-admin @@ -190,7 +188,7 @@ click-repl==0.3.0 # via # -r requirements/edx/base.txt # celery -code-annotations==1.8.0 +code-annotations==1.8.1 # via # -r requirements/edx/base.txt # -r requirements/edx/doc.in @@ -318,7 +316,7 @@ django-config-models==2.7.0 # edx-enterprise # edx-name-affirmation # lti-consumer-xblock -django-cors-headers==4.5.0 +django-cors-headers==4.6.0 # via -r requirements/edx/base.txt django-countries==7.6.1 # via @@ -379,7 +377,7 @@ django-multi-email-field==0.7.0 # via # -r requirements/edx/base.txt # edx-enterprise -django-mysql==4.14.0 +django-mysql==4.15.0 # via -r requirements/edx/base.txt django-oauth-toolkit==1.7.1 # via @@ -426,7 +424,7 @@ django-storages==1.14.3 # edxval django-user-tasks==3.2.0 # via -r requirements/edx/base.txt -django-waffle==4.1.0 +django-waffle==4.2.0 # via # -r requirements/edx/base.txt # edx-django-utils @@ -511,9 +509,9 @@ edx-celeryutils==1.3.0 # -r requirements/edx/base.txt # edx-name-affirmation # super-csv -edx-codejail==3.5.1 +edx-codejail==3.5.2 # via -r requirements/edx/base.txt -edx-completion==4.7.3 +edx-completion==4.7.6 # via -r requirements/edx/base.txt edx-django-release-util==1.4.0 # via @@ -602,7 +600,7 @@ edx-search==4.1.1 # via -r requirements/edx/base.txt edx-sga==0.25.0 # via -r requirements/edx/base.txt -edx-submissions==3.8.2 +edx-submissions==3.8.3 # via # -r requirements/edx/base.txt # ora2 @@ -628,7 +626,7 @@ edx-when==2.5.0 # via # -r requirements/edx/base.txt # edx-proctoring -edxval==2.6.0 +edxval==2.6.1 # via -r requirements/edx/base.txt elasticsearch==7.9.1 # via @@ -656,7 +654,7 @@ filelock==3.16.1 # via # -r requirements/edx/base.txt # snowflake-connector-python -firebase-admin==6.5.0 +firebase-admin==6.6.0 # via # -r requirements/edx/base.txt # edx-ace @@ -687,7 +685,7 @@ gitpython==3.1.43 # via -r requirements/edx/doc.in glob2==0.7 # via -r requirements/edx/base.txt -google-api-core[grpc]==2.22.0 +google-api-core[grpc]==2.23.0 # via # -r requirements/edx/base.txt # firebase-admin @@ -695,11 +693,11 @@ google-api-core[grpc]==2.22.0 # google-cloud-core # google-cloud-firestore # google-cloud-storage -google-api-python-client==2.149.0 +google-api-python-client==2.153.0 # via # -r requirements/edx/base.txt # firebase-admin -google-auth==2.35.0 +google-auth==2.36.0 # via # -r requirements/edx/base.txt # google-api-core @@ -734,17 +732,17 @@ google-resumable-media==2.7.2 # via # -r requirements/edx/base.txt # google-cloud-storage -googleapis-common-protos==1.65.0 +googleapis-common-protos==1.66.0 # via # -r requirements/edx/base.txt # google-api-core # grpcio-status -grpcio==1.67.0 +grpcio==1.68.0 # via # -r requirements/edx/base.txt # google-api-core # grpcio-status -grpcio-status==1.67.0 +grpcio-status==1.68.0 # via # -r requirements/edx/base.txt # google-api-core @@ -845,8 +843,6 @@ lazy==1.6 # lti-consumer-xblock # ora2 # xblock -lazy-object-proxy==1.10.0 - # via astroid libsass==0.10.0 # via # -c requirements/edx/../constraints.txt @@ -855,7 +851,7 @@ loremipsum==1.0.5 # via # -r requirements/edx/base.txt # ora2 -lti-consumer-xblock==9.11.3 +lti-consumer-xblock==9.12.0 # via -r requirements/edx/base.txt lxml[html-clean]==5.3.0 # via @@ -870,7 +866,7 @@ lxml[html-clean]==5.3.0 # python3-saml # xblock # xmlsec -lxml-html-clean==0.3.1 +lxml-html-clean==0.4.1 # via # -r requirements/edx/base.txt # lxml @@ -934,7 +930,7 @@ multidict==6.1.0 # -r requirements/edx/base.txt # aiohttp # yarl -mysqlclient==2.2.5 +mysqlclient==2.2.6 # via -r requirements/edx/base.txt newrelic==10.2.0 # via @@ -1009,7 +1005,7 @@ optimizely-sdk==4.1.1 # -r requirements/edx/base.txt ora2==6.14.0 # via -r requirements/edx/base.txt -packaging==24.1 +packaging==24.2 # via # -r requirements/edx/base.txt # drf-yasg @@ -1017,7 +1013,7 @@ packaging==24.1 # py2neo # snowflake-connector-python # sphinx -pansi==2020.7.3 +pansi==2024.11.0 # via # -r requirements/edx/base.txt # py2neo @@ -1057,6 +1053,7 @@ pillow==11.0.0 # edx-enterprise # edx-organizations # edxval + # pansi platformdirs==4.3.6 # via # -r requirements/edx/base.txt @@ -1072,6 +1069,7 @@ prompt-toolkit==3.0.48 propcache==0.2.0 # via # -r requirements/edx/base.txt + # aiohttp # yarl proto-plus==1.25.0 # via @@ -1139,7 +1137,7 @@ pyjwkest==1.4.2 # -r requirements/edx/base.txt # edx-token-utils # lti-consumer-xblock -pyjwt[crypto]==2.9.0 +pyjwt[crypto]==2.10.0 # via # -r requirements/edx/base.txt # drf-jwt @@ -1270,7 +1268,7 @@ referencing==0.35.1 # -r requirements/edx/base.txt # jsonschema # jsonschema-specifications -regex==2024.9.11 +regex==2024.11.6 # via # -r requirements/edx/base.txt # nltk @@ -1306,7 +1304,7 @@ requests-oauthlib==2.0.0 # via # -r requirements/edx/base.txt # social-auth-core -rpds-py==0.20.0 +rpds-py==0.21.0 # via # -r requirements/edx/base.txt # jsonschema @@ -1351,7 +1349,6 @@ six==1.16.0 # via # -r requirements/edx/base.txt # analytics-python - # bleach # codejail-includes # crowdsourcehinter-xblock # edx-ace @@ -1368,7 +1365,6 @@ six==1.16.0 # interchange # libsass # optimizely-sdk - # pansi # paver # py2neo # pyjwkest @@ -1449,7 +1445,7 @@ sphinxcontrib-serializinghtml==2.0.0 # via sphinx sphinxext-rediraffe==0.2.7 # via -r requirements/edx/doc.in -sqlparse==0.5.1 +sqlparse==0.5.2 # via # -r requirements/edx/base.txt # django @@ -1479,7 +1475,7 @@ text-unidecode==1.3 # via # -r requirements/edx/base.txt # python-slugify -tinycss2==1.2.1 +tinycss2==1.4.0 # via # -r requirements/edx/base.txt # bleach @@ -1487,7 +1483,7 @@ tomlkit==0.13.2 # via # -r requirements/edx/base.txt # snowflake-connector-python -tqdm==4.66.6 +tqdm==4.67.0 # via # -r requirements/edx/base.txt # nltk @@ -1542,7 +1538,7 @@ walrus==0.9.4 # via # -r requirements/edx/base.txt # edx-event-bus-redis -watchdog==5.0.3 +watchdog==6.0.0 # via -r requirements/edx/base.txt wcwidth==0.2.13 # via @@ -1567,9 +1563,7 @@ webob==1.8.9 # -r requirements/edx/base.txt # xblock wrapt==1.16.0 - # via - # -r requirements/edx/base.txt - # astroid + # via -r requirements/edx/base.txt xblock[django]==5.1.0 # via # -r requirements/edx/base.txt @@ -1602,11 +1596,11 @@ xmlsec==1.3.14 # python3-saml xss-utils==0.6.0 # via -r requirements/edx/base.txt -yarl==1.17.0 +yarl==1.17.2 # via # -r requirements/edx/base.txt # aiohttp -zipp==3.20.2 +zipp==3.21.0 # via # -r requirements/edx/base.txt # importlib-metadata diff --git a/requirements/edx/paver.txt b/requirements/edx/paver.txt index f3dae3b0efda..9f297db1926d 100644 --- a/requirements/edx/paver.txt +++ b/requirements/edx/paver.txt @@ -59,7 +59,7 @@ typing-extensions==4.12.2 # via edx-opaque-keys urllib3==2.2.3 # via requests -watchdog==5.0.3 +watchdog==6.0.0 # via -r requirements/edx/paver.in wrapt==1.16.0 # via -r requirements/edx/paver.in diff --git a/requirements/edx/semgrep.txt b/requirements/edx/semgrep.txt index 61db06bbf123..153084bb164b 100644 --- a/requirements/edx/semgrep.txt +++ b/requirements/edx/semgrep.txt @@ -34,17 +34,17 @@ colorama==0.4.6 # via semgrep defusedxml==0.7.1 # via semgrep -deprecated==1.2.14 +deprecated==1.2.15 # via # opentelemetry-api # opentelemetry-exporter-otlp-proto-http exceptiongroup==1.2.2 # via semgrep -face==22.0.0 +face==24.0.0 # via glom glom==22.1.0 # via semgrep -googleapis-common-protos==1.65.0 +googleapis-common-protos==1.66.0 # via opentelemetry-exporter-otlp-proto-http idna==3.10 # via requests @@ -88,9 +88,9 @@ opentelemetry-semantic-conventions==0.46b0 # opentelemetry-sdk opentelemetry-util-http==0.46b0 # via opentelemetry-instrumentation-requests -packaging==24.1 +packaging==24.2 # via semgrep -peewee==3.17.7 +peewee==3.17.8 # via semgrep protobuf==4.25.5 # via @@ -108,7 +108,7 @@ requests==2.32.3 # semgrep rich==13.5.3 # via semgrep -rpds-py==0.20.0 +rpds-py==0.21.0 # via # jsonschema # referencing @@ -116,7 +116,7 @@ ruamel-yaml==0.17.40 # via semgrep ruamel-yaml-clib==0.2.12 # via ruamel-yaml -semgrep==1.93.0 +semgrep==1.96.0 # via -r requirements/edx/semgrep.in tomli==2.0.2 # via semgrep @@ -134,7 +134,7 @@ wrapt==1.16.0 # via # deprecated # opentelemetry-instrumentation -zipp==3.20.2 +zipp==3.21.0 # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: diff --git a/requirements/edx/testing.in b/requirements/edx/testing.in index b903768f4de6..fc7b22d419d9 100644 --- a/requirements/edx/testing.in +++ b/requirements/edx/testing.in @@ -43,6 +43,6 @@ singledispatch # Backport of functools.singledispatch from Python 3.4 testfixtures # Provides a LogCapture utility used by several tests tox # virtualenv management for tests unidiff # Required by coverage_pytest_plugin -pylint-pytest==0.3.0 # A Pylint plugin to suppress pytest-related false positives. +pylint-pytest # A Pylint plugin to suppress pytest-related false positives. pact-python # Library for contract testing py # Needed for pytest configurations, was previously been fetched through tox diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt index b344dc9f5a22..f3aa786e031c 100644 --- a/requirements/edx/testing.txt +++ b/requirements/edx/testing.txt @@ -12,7 +12,7 @@ aiohappyeyeballs==2.4.3 # via # -r requirements/edx/base.txt # aiohttp -aiohttp==3.10.10 +aiohttp==3.11.2 # via # -r requirements/edx/base.txt # geoip2 @@ -25,7 +25,7 @@ algoliasearch==3.0.0 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt -amqp==5.2.0 +amqp==5.3.1 # via # -r requirements/edx/base.txt # kombu @@ -55,9 +55,8 @@ asn1crypto==1.5.1 # via # -r requirements/edx/base.txt # snowflake-connector-python -astroid==2.13.5 +astroid==3.3.5 # via - # -c requirements/edx/../constraints.txt # pylint # pylint-celery attrs==24.2.0 @@ -92,7 +91,7 @@ billiard==4.2.1 # via # -r requirements/edx/base.txt # celery -bleach[css]==6.1.0 +bleach[css]==6.2.0 # via # -r requirements/edx/base.txt # edx-enterprise @@ -103,20 +102,20 @@ bleach[css]==6.1.0 # xblock-poll boto==2.49.0 # via -r requirements/edx/base.txt -boto3==1.35.50 +boto3==1.35.63 # via # -r requirements/edx/base.txt # django-ses # fs-s3fs # ora2 -botocore==1.35.50 +botocore==1.35.63 # via # -r requirements/edx/base.txt # boto3 # s3transfer bridgekeeper==0.9 # via -r requirements/edx/base.txt -cachecontrol==0.14.0 +cachecontrol==0.14.1 # via # -r requirements/edx/base.txt # firebase-admin @@ -199,7 +198,7 @@ click-repl==0.3.0 # via # -r requirements/edx/base.txt # celery -code-annotations==1.8.0 +code-annotations==1.8.1 # via # -r requirements/edx/base.txt # -r requirements/edx/testing.in @@ -210,7 +209,7 @@ codejail-includes==1.0.0 # via -r requirements/edx/base.txt colorama==0.4.6 # via tox -coverage[toml]==7.6.4 +coverage[toml]==7.6.7 # via # -r requirements/edx/coverage.txt # pytest-cov @@ -344,7 +343,7 @@ django-config-models==2.7.0 # edx-enterprise # edx-name-affirmation # lti-consumer-xblock -django-cors-headers==4.5.0 +django-cors-headers==4.6.0 # via -r requirements/edx/base.txt django-countries==7.6.1 # via @@ -405,7 +404,7 @@ django-multi-email-field==0.7.0 # via # -r requirements/edx/base.txt # edx-enterprise -django-mysql==4.14.0 +django-mysql==4.15.0 # via -r requirements/edx/base.txt django-oauth-toolkit==1.7.1 # via @@ -452,7 +451,7 @@ django-storages==1.14.3 # edxval django-user-tasks==3.2.0 # via -r requirements/edx/base.txt -django-waffle==4.1.0 +django-waffle==4.2.0 # via # -r requirements/edx/base.txt # edx-django-utils @@ -532,9 +531,9 @@ edx-celeryutils==1.3.0 # -r requirements/edx/base.txt # edx-name-affirmation # super-csv -edx-codejail==3.5.1 +edx-codejail==3.5.2 # via -r requirements/edx/base.txt -edx-completion==4.7.3 +edx-completion==4.7.6 # via -r requirements/edx/base.txt edx-django-release-util==1.4.0 # via @@ -625,7 +624,7 @@ edx-search==4.1.1 # via -r requirements/edx/base.txt edx-sga==0.25.0 # via -r requirements/edx/base.txt -edx-submissions==3.8.2 +edx-submissions==3.8.3 # via # -r requirements/edx/base.txt # ora2 @@ -651,7 +650,7 @@ edx-when==2.5.0 # via # -r requirements/edx/base.txt # edx-proctoring -edxval==2.6.0 +edxval==2.6.1 # via -r requirements/edx/base.txt elasticsearch==7.9.1 # via @@ -675,9 +674,9 @@ execnet==2.1.1 # via pytest-xdist factory-boy==3.3.1 # via -r requirements/edx/testing.in -faker==30.8.1 +faker==33.0.0 # via factory-boy -fastapi==0.115.4 +fastapi==0.115.5 # via pact-python fastavro==1.9.7 # via @@ -689,7 +688,7 @@ filelock==3.16.1 # snowflake-connector-python # tox # virtualenv -firebase-admin==6.5.0 +firebase-admin==6.6.0 # via # -r requirements/edx/base.txt # edx-ace @@ -718,7 +717,7 @@ geoip2==4.8.0 # via -r requirements/edx/base.txt glob2==0.7 # via -r requirements/edx/base.txt -google-api-core[grpc]==2.22.0 +google-api-core[grpc]==2.23.0 # via # -r requirements/edx/base.txt # firebase-admin @@ -726,11 +725,11 @@ google-api-core[grpc]==2.22.0 # google-cloud-core # google-cloud-firestore # google-cloud-storage -google-api-python-client==2.149.0 +google-api-python-client==2.153.0 # via # -r requirements/edx/base.txt # firebase-admin -google-auth==2.35.0 +google-auth==2.36.0 # via # -r requirements/edx/base.txt # google-api-core @@ -765,19 +764,19 @@ google-resumable-media==2.7.2 # via # -r requirements/edx/base.txt # google-cloud-storage -googleapis-common-protos==1.65.0 +googleapis-common-protos==1.66.0 # via # -r requirements/edx/base.txt # google-api-core # grpcio-status grimp==3.5 # via import-linter -grpcio==1.67.0 +grpcio==1.68.0 # via # -r requirements/edx/base.txt # google-api-core # grpcio-status -grpcio-status==1.67.0 +grpcio-status==1.68.0 # via # -r requirements/edx/base.txt # google-api-core @@ -888,8 +887,6 @@ lazy==1.6 # lti-consumer-xblock # ora2 # xblock -lazy-object-proxy==1.10.0 - # via astroid libsass==0.10.0 # via # -c requirements/edx/../constraints.txt @@ -898,7 +895,7 @@ loremipsum==1.0.5 # via # -r requirements/edx/base.txt # ora2 -lti-consumer-xblock==9.11.3 +lti-consumer-xblock==9.12.0 # via -r requirements/edx/base.txt lxml[html-clean]==5.3.0 # via @@ -914,7 +911,7 @@ lxml[html-clean]==5.3.0 # python3-saml # xblock # xmlsec -lxml-html-clean==0.3.1 +lxml-html-clean==0.4.1 # via # -r requirements/edx/base.txt # lxml @@ -979,7 +976,7 @@ multidict==6.1.0 # -r requirements/edx/base.txt # aiohttp # yarl -mysqlclient==2.2.5 +mysqlclient==2.2.6 # via -r requirements/edx/base.txt newrelic==10.2.0 # via @@ -1054,7 +1051,7 @@ optimizely-sdk==4.1.1 # -r requirements/edx/base.txt ora2==6.14.0 # via -r requirements/edx/base.txt -packaging==24.1 +packaging==24.2 # via # -r requirements/edx/base.txt # drf-yasg @@ -1066,7 +1063,7 @@ packaging==24.1 # tox pact-python==2.2.2 # via -r requirements/edx/testing.in -pansi==2020.7.3 +pansi==2024.11.0 # via # -r requirements/edx/base.txt # py2neo @@ -1104,6 +1101,7 @@ pillow==11.0.0 # edx-enterprise # edx-organizations # edxval + # pansi platformdirs==4.3.6 # via # -r requirements/edx/base.txt @@ -1129,6 +1127,7 @@ prompt-toolkit==3.0.48 propcache==0.2.0 # via # -r requirements/edx/base.txt + # aiohttp # yarl proto-plus==1.25.0 # via @@ -1165,10 +1164,8 @@ pyasn1-modules==0.4.1 # via # -r requirements/edx/base.txt # google-auth -pycodestyle==2.8.0 - # via - # -c requirements/edx/../constraints.txt - # -r requirements/edx/testing.in +pycodestyle==2.12.1 + # via -r requirements/edx/testing.in pycountry==24.6.1 # via -r requirements/edx/base.txt pycparser==2.22 @@ -1201,7 +1198,7 @@ pyjwkest==1.4.2 # -r requirements/edx/base.txt # edx-token-utils # lti-consumer-xblock -pyjwt[crypto]==2.9.0 +pyjwt[crypto]==2.10.0 # via # -r requirements/edx/base.txt # drf-jwt @@ -1217,9 +1214,8 @@ pylatexenc==2.10 # via # -r requirements/edx/base.txt # olxcleaner -pylint==2.15.10 +pylint==3.3.1 # via - # -c requirements/edx/../constraints.txt # edx-lint # pylint-celery # pylint-django @@ -1227,13 +1223,13 @@ pylint==2.15.10 # pylint-pytest pylint-celery==0.3 # via edx-lint -pylint-django==2.5.5 +pylint-django==2.6.1 # via edx-lint pylint-plugin-utils==0.8.2 # via # pylint-celery # pylint-django -pylint-pytest==0.3.0 +pylint-pytest==1.1.8 # via -r requirements/edx/testing.in pylti1p3==2.0.0 # via -r requirements/edx/base.txt @@ -1277,7 +1273,7 @@ pysrt==1.1.2 # via # -r requirements/edx/base.txt # edxval -pytest==8.3.3 +pytest==8.2.0 # via # -r requirements/edx/testing.in # pylint-pytest @@ -1290,7 +1286,7 @@ pytest==8.3.3 # pytest-xdist pytest-attrib==0.1.3 # via -r requirements/edx/testing.in -pytest-cov==5.0.0 +pytest-cov==6.0.0 # via -r requirements/edx/testing.in pytest-django==4.9.0 # via -r requirements/edx/testing.in @@ -1381,7 +1377,7 @@ referencing==0.35.1 # -r requirements/edx/base.txt # jsonschema # jsonschema-specifications -regex==2024.9.11 +regex==2024.11.6 # via # -r requirements/edx/base.txt # nltk @@ -1417,7 +1413,7 @@ requests-oauthlib==2.0.0 # via # -r requirements/edx/base.txt # social-auth-core -rpds-py==0.20.0 +rpds-py==0.21.0 # via # -r requirements/edx/base.txt # jsonschema @@ -1464,7 +1460,6 @@ six==1.16.0 # via # -r requirements/edx/base.txt # analytics-python - # bleach # codejail-includes # crowdsourcehinter-xblock # edx-ace @@ -1483,7 +1478,6 @@ six==1.16.0 # libsass # optimizely-sdk # pact-python - # pansi # paver # py2neo # pyjwkest @@ -1521,7 +1515,7 @@ soupsieve==2.6 # via # -r requirements/edx/base.txt # beautifulsoup4 -sqlparse==0.5.1 +sqlparse==0.5.2 # via # -r requirements/edx/base.txt # django @@ -1554,7 +1548,7 @@ text-unidecode==1.3 # via # -r requirements/edx/base.txt # python-slugify -tinycss2==1.2.1 +tinycss2==1.4.0 # via # -r requirements/edx/base.txt # bleach @@ -1565,7 +1559,7 @@ tomlkit==0.13.2 # snowflake-connector-python tox==4.23.2 # via -r requirements/edx/testing.in -tqdm==4.66.6 +tqdm==4.67.0 # via # -r requirements/edx/base.txt # nltk @@ -1629,7 +1623,7 @@ walrus==0.9.4 # via # -r requirements/edx/base.txt # edx-event-bus-redis -watchdog==5.0.3 +watchdog==6.0.0 # via -r requirements/edx/base.txt wcwidth==0.2.13 # via @@ -1654,9 +1648,7 @@ webob==1.8.9 # -r requirements/edx/base.txt # xblock wrapt==1.16.0 - # via - # -r requirements/edx/base.txt - # astroid + # via -r requirements/edx/base.txt xblock[django]==5.1.0 # via # -r requirements/edx/base.txt @@ -1689,12 +1681,12 @@ xmlsec==1.3.14 # python3-saml xss-utils==0.6.0 # via -r requirements/edx/base.txt -yarl==1.17.0 +yarl==1.17.2 # via # -r requirements/edx/base.txt # aiohttp # pact-python -zipp==3.20.2 +zipp==3.21.0 # via # -r requirements/edx/base.txt # importlib-metadata diff --git a/requirements/pip-tools.txt b/requirements/pip-tools.txt index 110663ff6ab3..b99cbb6be456 100644 --- a/requirements/pip-tools.txt +++ b/requirements/pip-tools.txt @@ -10,7 +10,7 @@ click==8.1.6 # via # -c requirements/constraints.txt # pip-tools -packaging==24.1 +packaging==24.2 # via build pip-tools==7.4.1 # via -r requirements/pip-tools.in @@ -18,7 +18,7 @@ pyproject-hooks==1.2.0 # via # build # pip-tools -wheel==0.44.0 +wheel==0.45.0 # via pip-tools # The following packages are considered to be unsafe in a requirements file: diff --git a/requirements/pip.txt b/requirements/pip.txt index 797974efa45a..dc5fcdc8f714 100644 --- a/requirements/pip.txt +++ b/requirements/pip.txt @@ -4,7 +4,7 @@ # # make upgrade # -wheel==0.44.0 +wheel==0.45.0 # via -r requirements/pip.in # The following packages are considered to be unsafe in a requirements file: @@ -12,5 +12,5 @@ pip==24.2 # via # -c requirements/common_constraints.txt # -r requirements/pip.in -setuptools==75.2.0 +setuptools==75.5.0 # via -r requirements/pip.in diff --git a/scripts/structures_pruning/requirements/testing.txt b/scripts/structures_pruning/requirements/testing.txt index 94c6ac6982f3..c0f645997f01 100644 --- a/scripts/structures_pruning/requirements/testing.txt +++ b/scripts/structures_pruning/requirements/testing.txt @@ -20,7 +20,7 @@ edx-opaque-keys==2.11.0 # via -r scripts/structures_pruning/requirements/base.txt iniconfig==2.0.0 # via pytest -packaging==24.1 +packaging==24.2 # via pytest pbr==6.1.0 # via diff --git a/scripts/user_retirement/requirements/base.txt b/scripts/user_retirement/requirements/base.txt index 704baaff2c79..a50d50cd2ef8 100644 --- a/scripts/user_retirement/requirements/base.txt +++ b/scripts/user_retirement/requirements/base.txt @@ -10,9 +10,9 @@ attrs==24.2.0 # via zeep backoff==2.2.1 # via -r scripts/user_retirement/requirements/base.in -boto3==1.35.50 +boto3==1.35.63 # via -r scripts/user_retirement/requirements/base.in -botocore==1.35.50 +botocore==1.35.63 # via # boto3 # s3transfer @@ -44,24 +44,24 @@ django==4.2.16 # edx-django-utils django-crum==0.7.9 # via edx-django-utils -django-waffle==4.1.0 +django-waffle==4.2.0 # via edx-django-utils edx-django-utils==7.0.0 # via edx-rest-api-client edx-rest-api-client==6.0.0 # via -r scripts/user_retirement/requirements/base.in -google-api-core==2.22.0 +google-api-core==2.23.0 # via google-api-python-client -google-api-python-client==2.149.0 +google-api-python-client==2.153.0 # via -r scripts/user_retirement/requirements/base.in -google-auth==2.35.0 +google-auth==2.36.0 # via # google-api-core # google-api-python-client # google-auth-httplib2 google-auth-httplib2==0.2.0 # via google-api-python-client -googleapis-common-protos==1.65.0 +googleapis-common-protos==1.66.0 # via google-api-core httplib2==0.22.0 # via @@ -104,7 +104,7 @@ pyasn1-modules==0.4.1 # via google-auth pycparser==2.22 # via cffi -pyjwt[crypto]==2.9.0 +pyjwt[crypto]==2.10.0 # via # edx-rest-api-client # simple-salesforce @@ -146,7 +146,7 @@ six==1.16.0 # via # jenkinsapi # python-dateutil -sqlparse==0.5.1 +sqlparse==0.5.2 # via django stevedore==5.3.0 # via edx-django-utils diff --git a/scripts/user_retirement/requirements/testing.txt b/scripts/user_retirement/requirements/testing.txt index 4cb3de607db7..d63847927511 100644 --- a/scripts/user_retirement/requirements/testing.txt +++ b/scripts/user_retirement/requirements/testing.txt @@ -14,11 +14,11 @@ attrs==24.2.0 # zeep backoff==2.2.1 # via -r scripts/user_retirement/requirements/base.txt -boto3==1.35.50 +boto3==1.35.63 # via # -r scripts/user_retirement/requirements/base.txt # moto -botocore==1.35.50 +botocore==1.35.63 # via # -r scripts/user_retirement/requirements/base.txt # boto3 @@ -62,7 +62,7 @@ django-crum==0.7.9 # via # -r scripts/user_retirement/requirements/base.txt # edx-django-utils -django-waffle==4.1.0 +django-waffle==4.2.0 # via # -r scripts/user_retirement/requirements/base.txt # edx-django-utils @@ -72,13 +72,13 @@ edx-django-utils==7.0.0 # edx-rest-api-client edx-rest-api-client==6.0.0 # via -r scripts/user_retirement/requirements/base.txt -google-api-core==2.22.0 +google-api-core==2.23.0 # via # -r scripts/user_retirement/requirements/base.txt # google-api-python-client -google-api-python-client==2.149.0 +google-api-python-client==2.153.0 # via -r scripts/user_retirement/requirements/base.txt -google-auth==2.35.0 +google-auth==2.36.0 # via # -r scripts/user_retirement/requirements/base.txt # google-api-core @@ -88,7 +88,7 @@ google-auth-httplib2==0.2.0 # via # -r scripts/user_retirement/requirements/base.txt # google-api-python-client -googleapis-common-protos==1.65.0 +googleapis-common-protos==1.66.0 # via # -r scripts/user_retirement/requirements/base.txt # google-api-core @@ -136,7 +136,7 @@ newrelic==10.2.0 # via # -r scripts/user_retirement/requirements/base.txt # edx-django-utils -packaging==24.1 +packaging==24.2 # via pytest pbr==6.1.0 # via @@ -175,7 +175,7 @@ pycparser==2.22 # via # -r scripts/user_retirement/requirements/base.txt # cffi -pyjwt[crypto]==2.9.0 +pyjwt[crypto]==2.10.0 # via # -r scripts/user_retirement/requirements/base.txt # edx-rest-api-client @@ -248,7 +248,7 @@ six==1.16.0 # -r scripts/user_retirement/requirements/base.txt # jenkinsapi # python-dateutil -sqlparse==0.5.1 +sqlparse==0.5.2 # via # -r scripts/user_retirement/requirements/base.txt # django @@ -272,7 +272,7 @@ urllib3==1.26.20 # botocore # requests # responses -werkzeug==3.0.6 +werkzeug==3.1.3 # via moto xmltodict==0.14.2 # via moto From fe4ecdeb8cf373d532f10ef634cbe39d33e94378 Mon Sep 17 00:00:00 2001 From: Irtaza Akram Date: Mon, 18 Nov 2024 16:06:42 +0500 Subject: [PATCH 2/7] fix: unpin pylint error --- .../contentstore/api/tests/test_validation.py | 2 +- .../contentstore/api/views/course_quality.py | 96 +++++++++---------- .../api/views/course_validation.py | 62 ++++++------ .../contentstore/courseware_index.py | 2 +- .../commands/backfill_course_tabs.py | 7 +- .../commands/export_content_library.py | 26 ++--- .../rest_api/v0/tests/test_tabs.py | 4 +- cms/djangoapps/contentstore/tasks.py | 4 +- .../contentstore/tests/test_contentstore.py | 14 +-- .../contentstore/tests/test_course_listing.py | 2 +- .../contentstore/tests/test_libraries.py | 2 +- .../contentstore/video_storage_handlers.py | 2 +- cms/djangoapps/contentstore/views/preview.py | 2 +- .../views/tests/test_import_export.py | 2 +- cms/envs/common.py | 52 +++++----- cms/envs/test.py | 35 +++---- pylint_django_settings.py | 8 +- pylintrc | 5 +- pylintrc_tweaks | 1 + xmodule/capa/tests/test_input_templates.py | 4 +- xmodule/capa/xqueue_interface.py | 12 +-- xmodule/capa_block.py | 4 +- xmodule/course_block.py | 8 +- xmodule/item_bank_block.py | 2 +- xmodule/library_content_block.py | 4 +- xmodule/library_tools.py | 10 +- xmodule/modulestore/inheritance.py | 18 ++-- xmodule/modulestore/mongo/draft.py | 2 +- .../modulestore/perf_tests/generate_report.py | 4 +- .../modulestore/split_mongo/split_draft.py | 2 +- xmodule/modulestore/tests/utils.py | 22 ++--- xmodule/split_test_block.py | 6 +- xmodule/tests/test_graders.py | 9 +- xmodule/tests/test_html_block.py | 2 +- xmodule/tests/test_sequence.py | 20 ++-- xmodule/vertical_block.py | 2 +- xmodule/video_block/transcripts_utils.py | 15 +-- 37 files changed, 241 insertions(+), 233 deletions(-) diff --git a/cms/djangoapps/contentstore/api/tests/test_validation.py b/cms/djangoapps/contentstore/api/tests/test_validation.py index 4b94c3558822..a65a1de6c892 100644 --- a/cms/djangoapps/contentstore/api/tests/test_validation.py +++ b/cms/djangoapps/contentstore/api/tests/test_validation.py @@ -54,7 +54,7 @@ def initialize_course(cls, course): update_key.course_key, update_key.block_type, block_id=update_key.block_id, - fields=dict(data="
  1. Date

    Hello world!
"), + fields={"data": "
  1. Date

    Hello world!
"}, ) section = BlockFactory.create( diff --git a/cms/djangoapps/contentstore/api/views/course_quality.py b/cms/djangoapps/contentstore/api/views/course_quality.py index 42489978b857..1b34556a56d7 100644 --- a/cms/djangoapps/contentstore/api/views/course_quality.py +++ b/cms/djangoapps/contentstore/api/views/course_quality.py @@ -103,26 +103,26 @@ def _execute_method_and_log_time(log_time, func, *args): # Added for EDUCATOR-3660 course_key_harvard = str(course_key) == 'course-v1:HarvardX+SW12.1x+2016' - response = dict( - is_self_paced=course.self_paced, - ) + response = { + "is_self_paced": course.self_paced, + } if get_bool_param(request, 'sections', all_requested): response.update( - sections=_execute_method_and_log_time(course_key_harvard, self._sections_quality, course) + {"sections": _execute_method_and_log_time(course_key_harvard, self._sections_quality, course)} ) if get_bool_param(request, 'subsections', all_requested): response.update( - subsections=_execute_method_and_log_time( + {"subsections": _execute_method_and_log_time( course_key_harvard, self._subsections_quality, course, request - ) + )} ) if get_bool_param(request, 'units', all_requested): response.update( - units=_execute_method_and_log_time(course_key_harvard, self._units_quality, course, request) + {"units": _execute_method_and_log_time(course_key_harvard, self._units_quality, course, request)} ) if get_bool_param(request, 'videos', all_requested): response.update( - videos=_execute_method_and_log_time(course_key_harvard, self._videos_quality, course) + {"videos": _execute_method_and_log_time(course_key_harvard, self._videos_quality, course)} ) return Response(response) @@ -142,13 +142,13 @@ def _required_course_depth(self, request, all_requested): # lint-amnesty, pylin def _sections_quality(self, course): sections, visible_sections = self._get_sections(course) sections_with_highlights = [section for section in visible_sections if section.highlights] - return dict( - total_number=len(sections), - total_visible=len(visible_sections), - number_with_highlights=len(sections_with_highlights), - highlights_active_for_course=course.highlights_enabled_for_messaging, - highlights_enabled=True, # used to be controlled by a waffle switch, now just always enabled - ) + return { + "total_number": len(sections), + "total_visible": len(visible_sections), + "number_with_highlights": len(sections_with_highlights), + "highlights_active_for_course": course.highlights_enabled_for_messaging, + "highlights_enabled": True, # used to be controlled by a waffle switch, now just always enabled + } def _subsections_quality(self, course, request): # lint-amnesty, pylint: disable=missing-function-docstring subsection_unit_dict = self._get_subsections_and_units(course, request) @@ -160,11 +160,11 @@ def _subsections_quality(self, course, request): # lint-amnesty, pylint: disabl ) num_block_types_per_subsection_dict[subsection_key] = len(set().union(*leaf_block_types_in_subsection)) - return dict( - total_visible=len(num_block_types_per_subsection_dict), - num_with_one_block_type=list(num_block_types_per_subsection_dict.values()).count(1), - num_block_types=self._stats_dict(list(num_block_types_per_subsection_dict.values())), - ) + return { + "total_visible": len(num_block_types_per_subsection_dict), + "num_with_one_block_type": list(num_block_types_per_subsection_dict.values()).count(1), + "num_block_types": self._stats_dict(list(num_block_types_per_subsection_dict.values())), + } def _units_quality(self, course, request): # lint-amnesty, pylint: disable=missing-function-docstring subsection_unit_dict = self._get_subsections_and_units(course, request) @@ -173,10 +173,10 @@ def _units_quality(self, course, request): # lint-amnesty, pylint: disable=miss for unit_dict in subsection_unit_dict.values() for unit_info in unit_dict.values() ] - return dict( - total_visible=len(num_leaf_blocks_per_unit), - num_blocks=self._stats_dict(num_leaf_blocks_per_unit), - ) + return { + "total_visible": len(num_leaf_blocks_per_unit), + "num_blocks": self._stats_dict(num_leaf_blocks_per_unit), + } def _videos_quality(self, course): # lint-amnesty, pylint: disable=missing-function-docstring video_blocks_in_course = modulestore().get_items(course.id, qualifiers={'category': 'video'}) @@ -184,12 +184,12 @@ def _videos_quality(self, course): # lint-amnesty, pylint: disable=missing-func videos_in_val = list(videos) video_durations = [video['duration'] for video in videos_in_val] - return dict( - total_number=len(video_blocks_in_course), - num_mobile_encoded=len(videos_in_val), - num_with_val_id=len([v for v in video_blocks_in_course if v.edx_video_id]), - durations=self._stats_dict(video_durations), - ) + return { + "total_number": len(video_blocks_in_course), + "num_mobile_encoded": len(videos_in_val), + "num_with_val_id": len([v for v in video_blocks_in_course if v.edx_video_id]), + "durations": self._stats_dict(video_durations), + } @classmethod @request_cached() @@ -212,10 +212,10 @@ def _get_subsections_and_units(cls, course, request): for unit in visible_units: leaf_blocks = cls._get_leaf_blocks(unit) - unit_dict[unit.location] = dict( - num_leaf_blocks=len(leaf_blocks), - leaf_block_types={block.location.block_type for block in leaf_blocks}, - ) + unit_dict[unit.location] = { + "num_leaf_blocks": len(leaf_blocks), + "leaf_block_types": {block.location.block_type for block in leaf_blocks}, + } subsection_dict[subsection.location] = unit_dict return subsection_dict @@ -259,18 +259,18 @@ def leaf_filter(block): def _stats_dict(self, data): # lint-amnesty, pylint: disable=missing-function-docstring if not data: - return dict( - min=None, - max=None, - mean=None, - median=None, - mode=None, - ) + return { + "min": None, + "max": None, + "mean": None, + "median": None, + "mode": None, + } else: - return dict( - min=min(data), - max=max(data), - mean=np.around(np.mean(data)), - median=np.around(np.median(data)), - mode=stats.mode(data, axis=None)[0], - ) + return { + "min": min(data), + "max": max(data), + "mean": np.around(np.mean(data)), + "median": np.around(np.median(data)), + "mode": stats.mode(data, axis=None)[0], + } diff --git a/cms/djangoapps/contentstore/api/views/course_validation.py b/cms/djangoapps/contentstore/api/views/course_validation.py index 0fa8d9041c1b..39f9610550cf 100644 --- a/cms/djangoapps/contentstore/api/views/course_validation.py +++ b/cms/djangoapps/contentstore/api/views/course_validation.py @@ -76,9 +76,9 @@ def get(self, request, course_key): with store.bulk_operations(course_key): course = store.get_course(course_key, depth=self._required_course_depth(request, all_requested)) - response = dict( - is_self_paced=course.self_paced, - ) + response = { + "is_self_paced": course.self_paced, + } if get_bool_param(request, 'dates', all_requested): response.update( dates=self._dates_validation(course) @@ -113,10 +113,10 @@ def _required_course_depth(self, request, all_requested): return 0 def _dates_validation(self, course): - return dict( - has_start_date=self._has_start_date(course), - has_end_date=course.end is not None, - ) + return { + "has_start_date": self._has_start_date(course), + "has_end_date": course.end is not None, + } def _assignments_validation(self, course, request): # lint-amnesty, pylint: disable=missing-function-docstring assignments, visible_assignments = self._get_assignments(course) @@ -193,38 +193,38 @@ def _assignments_validation(self, course, request): # lint-amnesty, pylint: dis 'display_name': parent_assignment.display_name }) - return dict( - total_number=len(assignments), - total_visible=len(visible_assignments), - assignments_with_dates_before_start=assignments_with_dates_before_start, - assignments_with_dates_after_end=assignments_with_dates_after_end, - assignments_with_ora_dates_before_start=assignments_with_ora_dates_before_start, - assignments_with_ora_dates_after_end=assignments_with_ora_dates_after_end, - ) + return { + "total_number": len(assignments), + "total_visible": len(visible_assignments), + "assignments_with_dates_before_start": assignments_with_dates_before_start, + "assignments_with_dates_after_end": assignments_with_dates_after_end, + "assignments_with_ora_dates_before_start": assignments_with_ora_dates_before_start, + "assignments_with_ora_dates_after_end": assignments_with_ora_dates_after_end, + } def _grades_validation(self, course): has_grading_policy = self._has_grading_policy(course) sum_of_weights = course.grader.sum_of_weights - return dict( - has_grading_policy=has_grading_policy, - sum_of_weights=sum_of_weights, - ) + return { + "has_grading_policy": has_grading_policy, + "sum_of_weights": sum_of_weights, + } def _certificates_validation(self, course): is_activated, certificates = CertificateManager.is_activated(course) certificates_enabled = certificates is not None - return dict( - is_activated=is_activated, - has_certificate=certificates_enabled and len(certificates) > 0, - is_enabled=certificates_enabled, - ) + return { + "is_activated": is_activated, + "has_certificate": certificates_enabled and len(certificates) > 0, + "is_enabled": certificates_enabled, + } def _updates_validation(self, course, request): updates_usage_key = course.id.make_usage_key('course_info', 'updates') updates = get_course_updates(updates_usage_key, provided_id=None, user_id=request.user.id) - return dict( - has_update=len(updates) > 0, - ) + return { + "has_update": len(updates) > 0, + } def _get_assignments(self, course): # lint-amnesty, pylint: disable=missing-function-docstring store = modulestore() @@ -336,7 +336,7 @@ def _has_grading_policy(self, course): # lint-amnesty, pylint: disable=missing- def _proctoring_validation(self, course): # A proctoring escalation email is currently only required for courses using Proctortrack - return dict( - needs_proctoring_escalation_email=course.proctoring_provider == 'proctortrack', - has_proctoring_escalation_email=bool(course.proctoring_escalation_email) - ) + return { + "needs_proctoring_escalation_email": course.proctoring_provider == 'proctortrack', + "has_proctoring_escalation_email": bool(course.proctoring_escalation_email) + } diff --git a/cms/djangoapps/contentstore/courseware_index.py b/cms/djangoapps/contentstore/courseware_index.py index d3b6f811d5f6..3942ada9c41f 100644 --- a/cms/djangoapps/contentstore/courseware_index.py +++ b/cms/djangoapps/contentstore/courseware_index.py @@ -473,7 +473,7 @@ def _get_location_info(cls, normalized_structure_key): @classmethod def _id_modifier(cls, usage_id): """ Modifies usage_id to submit to index """ - return usage_id.replace(library_key=(usage_id.library_key.replace(version_guid=None, branch=None))) + return usage_id.replace(library_key=usage_id.library_key.replace(version_guid=None, branch=None)) @classmethod def do_library_reindex(cls, modulestore, library_key): diff --git a/cms/djangoapps/contentstore/management/commands/backfill_course_tabs.py b/cms/djangoapps/contentstore/management/commands/backfill_course_tabs.py index 878a8dabaa27..61bda4020311 100644 --- a/cms/djangoapps/contentstore/management/commands/backfill_course_tabs.py +++ b/cms/djangoapps/contentstore/management/commands/backfill_course_tabs.py @@ -70,7 +70,8 @@ def handle(self, *args, **options): error_keys.append(course_key) if error_keys: - msg = 'The following courses encountered errors and were not updated:\n' - for error_key in error_keys: - msg += f' - {error_key}\n' + msg = ( + "The following courses encountered errors and were not updated:\n" + + "\n".join(f" - {error_key}" for error_key in error_keys) + ) logger.info(msg) diff --git a/cms/djangoapps/contentstore/management/commands/export_content_library.py b/cms/djangoapps/contentstore/management/commands/export_content_library.py index 0b4cbfb1fbad..b6a088824c71 100644 --- a/cms/djangoapps/contentstore/management/commands/export_content_library.py +++ b/cms/djangoapps/contentstore/management/commands/export_content_library.py @@ -51,16 +51,16 @@ def handle(self, *args, **options): tarball = tasks.create_export_tarball(library, library_key, {}, None) except Exception as e: raise CommandError(f'Failed to export "{library_key}" with "{e}"') # lint-amnesty, pylint: disable=raise-missing-from - else: - with tarball: - # Save generated archive with keyed filename - prefix, suffix, n = str(library_key).replace(':', '+'), '.tar.gz', 0 - while os.path.exists(prefix + suffix): - n += 1 - prefix = '{}_{}'.format(prefix.rsplit('_', 1)[0], n) if n > 1 else f'{prefix}_1' - filename = prefix + suffix - target = os.path.join(dest_path, filename) - tarball.file.seek(0) - with open(target, 'wb') as f: - shutil.copyfileobj(tarball.file, f) - print(f'Library "{library.location.library_key}" exported to "{target}"') + + with tarball: + # Save generated archive with keyed filename + prefix, suffix, n = str(library_key).replace(':', '+'), '.tar.gz', 0 + while os.path.exists(prefix + suffix): + n += 1 + prefix = '{}_{}'.format(prefix.rsplit('_', 1)[0], n) if n > 1 else f'{prefix}_1' + filename = prefix + suffix + target = os.path.join(dest_path, filename) + tarball.file.seek(0) + with open(target, 'wb') as f: + shutil.copyfileobj(tarball.file, f) + print(f'Library "{library.location.library_key}" exported to "{target}"') diff --git a/cms/djangoapps/contentstore/rest_api/v0/tests/test_tabs.py b/cms/djangoapps/contentstore/rest_api/v0/tests/test_tabs.py index 5da8938935d3..d08de967ad58 100644 --- a/cms/djangoapps/contentstore/rest_api/v0/tests/test_tabs.py +++ b/cms/djangoapps/contentstore/rest_api/v0/tests/test_tabs.py @@ -212,8 +212,8 @@ def test_toggle_invalid_tab_visibility(self, invalid_tab_locator): self.check_invalid_response(resp) @ddt.data( - dict(is_hidden=None), - dict(is_hidden="abc"), + {"is_hidden": None}, + {"is_hidden": 'abc'}, {}, ) def test_toggle_tab_invalid_visibility(self, invalid_visibility): diff --git a/cms/djangoapps/contentstore/tasks.py b/cms/djangoapps/contentstore/tasks.py index bb220c371711..87fa5378f34a 100644 --- a/cms/djangoapps/contentstore/tasks.py +++ b/cms/djangoapps/contentstore/tasks.py @@ -217,7 +217,7 @@ def update_search_index(course_id, triggered_time_isoformat): ) return - CoursewareSearchIndexer.index(modulestore(), course_key, triggered_at=(_parse_time(triggered_time_isoformat))) + CoursewareSearchIndexer.index(modulestore(), course_key, triggered_at=_parse_time(triggered_time_isoformat)) except SearchIndexingError as exc: error_list = exc.error_list @@ -237,7 +237,7 @@ def update_library_index(library_id, triggered_time_isoformat): """ Updates course search index. """ try: library_key = CourseKey.from_string(library_id) - LibrarySearchIndexer.index(modulestore(), library_key, triggered_at=(_parse_time(triggered_time_isoformat))) + LibrarySearchIndexer.index(modulestore(), library_key, triggered_at=_parse_time(triggered_time_isoformat)) except SearchIndexingError as exc: LOGGER.error('Search indexing error for library %s - %s', library_id, str(exc)) diff --git a/cms/djangoapps/contentstore/tests/test_contentstore.py b/cms/djangoapps/contentstore/tests/test_contentstore.py index 39e826b3e4f3..b01f26e73701 100644 --- a/cms/djangoapps/contentstore/tests/test_contentstore.py +++ b/cms/djangoapps/contentstore/tests/test_contentstore.py @@ -1923,13 +1923,13 @@ def test_rerun_course_video_upload_token(self): def test_rerun_course_success(self): source_course = CourseFactory.create(default_store=ModuleStoreEnum.Type.split) create_video( - dict( - edx_video_id="tree-hugger", - courses=[str(source_course.id)], - status='test', - duration=2, - encoded_videos=[] - ) + { + "edx_video_id": "tree-hugger", + "courses": [str(source_course.id)], + "status": "test", + "duration": 2, + "encoded_videos": [] + } ) destination_course_key = self.post_rerun_request(source_course.id) self.verify_rerun_course(source_course.id, destination_course_key, self.destination_course_data['display_name']) diff --git a/cms/djangoapps/contentstore/tests/test_course_listing.py b/cms/djangoapps/contentstore/tests/test_course_listing.py index 44084e3595b8..f281b34265ac 100644 --- a/cms/djangoapps/contentstore/tests/test_course_listing.py +++ b/cms/djangoapps/contentstore/tests/test_course_listing.py @@ -149,7 +149,7 @@ def test_courses_list_with_ccx_courses(self): # Get all courses which user has access. instructor_courses = UserBasedRole(self.user, CourseInstructorRole.ROLE).courses_with_role() staff_courses = UserBasedRole(self.user, CourseStaffRole.ROLE).courses_with_role() - all_courses = (instructor_courses | staff_courses) + all_courses = instructor_courses | staff_courses # Verify that CCX course exists in access but filtered by `_accessible_courses_list_from_groups`. self.assertIn( diff --git a/cms/djangoapps/contentstore/tests/test_libraries.py b/cms/djangoapps/contentstore/tests/test_libraries.py index 376ba56d8dd9..0ed0eaa7b359 100644 --- a/cms/djangoapps/contentstore/tests/test_libraries.py +++ b/cms/djangoapps/contentstore/tests/test_libraries.py @@ -745,7 +745,7 @@ def test_duplicate_across_courses(self, library_role, course_role, expected_resu 'duplicate_source_locator': str(block.location), }) self.assertIn(response.status_code, (200, 403)) # 400 would be ambiguous - duplicate_action_allowed = (response.status_code == 200) + duplicate_action_allowed = response.status_code == 200 self.assertEqual(duplicate_action_allowed, expected_result) @ddt.data( diff --git a/cms/djangoapps/contentstore/video_storage_handlers.py b/cms/djangoapps/contentstore/video_storage_handlers.py index 4cc5c738b5dc..88048c37b6d4 100644 --- a/cms/djangoapps/contentstore/video_storage_handlers.py +++ b/cms/djangoapps/contentstore/video_storage_handlers.py @@ -995,7 +995,7 @@ def get_course_youtube_edx_video_ids(course_id): f"InvalidKeyError occurred while getting YouTube video IDs for course_id: {course_id}: {error}" ) return JsonResponse({'error': invalid_key_error_msg}, status=500) - except Exception as error: + except Exception as error: # pylint: disable=broad-exception-caught LOGGER.exception( f"Unexpected error occurred while getting YouTube video IDs for course_id: {course_id}: {error}" ) diff --git a/cms/djangoapps/contentstore/views/preview.py b/cms/djangoapps/contentstore/views/preview.py index aa7421bb87b3..5a70f32cc700 100644 --- a/cms/djangoapps/contentstore/views/preview.py +++ b/cms/djangoapps/contentstore/views/preview.py @@ -159,7 +159,7 @@ def _prepare_runtime_for_preview(request, block): """ course_id = block.location.course_key - display_name_only = (block.category == 'static_tab') + display_name_only = block.category == 'static_tab' wrappers = [ # This wrapper wraps the block in the template specified above diff --git a/cms/djangoapps/contentstore/views/tests/test_import_export.py b/cms/djangoapps/contentstore/views/tests/test_import_export.py index 6528d142f993..8aec35a9df54 100644 --- a/cms/djangoapps/contentstore/views/tests/test_import_export.py +++ b/cms/djangoapps/contentstore/views/tests/test_import_export.py @@ -1155,7 +1155,7 @@ def _setup_source_course_with_library_content(self, publish=False, version=None) display_name='Test Unit' ) lc_block = self._add_library_content_block( - vertical, self.lib_key, publish_item=publish, other_settings=dict(source_library_version=version) + vertical, self.lib_key, publish_item=publish, other_settings={"source_library_version": version} ) lc_block.sync_from_library(upgrade_to_latest=True) diff --git a/cms/envs/common.py b/cms/envs/common.py index a72af4c9f37f..999693e7a075 100644 --- a/cms/envs/common.py +++ b/cms/envs/common.py @@ -143,20 +143,20 @@ ENABLE_CREDIT_ELIGIBILITY = True ################################ Block Structures ################################### -BLOCK_STRUCTURES_SETTINGS = dict( +BLOCK_STRUCTURES_SETTINGS = { # Delay, in seconds, after a new edit of a course is published # before updating the block structures cache. This is needed # for a better chance at getting the latest changes when there # are secondary reads in sharded mongoDB clusters. See TNL-5041 # for more info. - COURSE_PUBLISH_TASK_DELAY=30, + "COURSE_PUBLISH_TASK_DELAY": 30, # Delay, in seconds, between retry attempts if a task fails. - TASK_DEFAULT_RETRY_DELAY=30, + "TASK_DEFAULT_RETRY_DELAY": 30, # Maximum number of retries per task. - TASK_MAX_RETRIES=5, -) + "TASK_MAX_RETRIES": 5, +} ############################ FEATURE CONFIGURATION ############################# @@ -2553,33 +2553,33 @@ ########################## VIDEO IMAGE STORAGE ############################ -VIDEO_IMAGE_SETTINGS = dict( - VIDEO_IMAGE_MAX_BYTES=2 * 1024 * 1024, # 2 MB - VIDEO_IMAGE_MIN_BYTES=2 * 1024, # 2 KB +VIDEO_IMAGE_SETTINGS = { + "VIDEO_IMAGE_MAX_BYTES": 2 * 1024 * 1024, # 2 MB + "VIDEO_IMAGE_MIN_BYTES": 2 * 1024, # 2 KB # Backend storage - # STORAGE_CLASS='storages.backends.s3boto3.S3Boto3Storage', - # STORAGE_KWARGS=dict(bucket='video-image-bucket'), - STORAGE_KWARGS=dict( - location=MEDIA_ROOT, - ), - DIRECTORY_PREFIX='video-images/', - BASE_URL=MEDIA_URL, -) + # "STORAGE_CLASS": "storages.backends.s3boto3.S3Boto3Storage", + # "STORAGE_KWARGS": {"bucket": "video-image-bucket"}, + "STORAGE_KWARGS": { + "location": MEDIA_ROOT, + }, + "DIRECTORY_PREFIX": "video-images/", + "BASE_URL": MEDIA_URL, +} VIDEO_IMAGE_MAX_AGE = 31536000 ########################## VIDEO TRANSCRIPTS STORAGE ############################ -VIDEO_TRANSCRIPTS_SETTINGS = dict( - VIDEO_TRANSCRIPTS_MAX_BYTES=3 * 1024 * 1024, # 3 MB +VIDEO_TRANSCRIPTS_SETTINGS = { + "VIDEO_TRANSCRIPTS_MAX_BYTES": 3 * 1024 * 1024, # 3 MB # Backend storage - # STORAGE_CLASS='storages.backends.s3boto3.S3Boto3Storage', - # STORAGE_KWARGS=dict(bucket='video-transcripts-bucket'), - STORAGE_KWARGS=dict( - location=MEDIA_ROOT, - ), - DIRECTORY_PREFIX='video-transcripts/', - BASE_URL=MEDIA_URL, -) + # "STORAGE_CLASS": "storages.backends.s3boto3.S3Boto3Storage", + # "STORAGE_KWARGS": {"bucket": "video-transcripts-bucket"}, + "STORAGE_KWARGS": { + "location": MEDIA_ROOT, + }, + "DIRECTORY_PREFIX": "video-transcripts/", + "BASE_URL": MEDIA_URL, +} VIDEO_TRANSCRIPTS_MAX_AGE = 31536000 diff --git a/cms/envs/test.py b/cms/envs/test.py index 49db50608858..43d4d65a1f4e 100644 --- a/cms/envs/test.py +++ b/cms/envs/test.py @@ -265,26 +265,27 @@ FEATURES['CUSTOM_COURSES_EDX'] = True ########################## VIDEO IMAGE STORAGE ############################ -VIDEO_IMAGE_SETTINGS = dict( - VIDEO_IMAGE_MAX_BYTES=2 * 1024 * 1024, # 2 MB - VIDEO_IMAGE_MIN_BYTES=2 * 1024, # 2 KB - STORAGE_KWARGS=dict( - location=MEDIA_ROOT, - ), - DIRECTORY_PREFIX='video-images/', - BASE_URL=MEDIA_URL, -) +VIDEO_IMAGE_SETTINGS = { + "VIDEO_IMAGE_MAX_BYTES": 2 * 1024 * 1024, # 2 MB + "VIDEO_IMAGE_MIN_BYTES": 2 * 1024, # 2 KB + "STORAGE_KWARGS": { + "location": MEDIA_ROOT, + }, + "DIRECTORY_PREFIX": "video-images/", + "BASE_URL": MEDIA_URL, +} VIDEO_IMAGE_DEFAULT_FILENAME = 'default_video_image.png' ########################## VIDEO TRANSCRIPTS STORAGE ############################ -VIDEO_TRANSCRIPTS_SETTINGS = dict( - VIDEO_TRANSCRIPTS_MAX_BYTES=3 * 1024 * 1024, # 3 MB - STORAGE_KWARGS=dict( - location=MEDIA_ROOT, - base_url=MEDIA_URL, - ), - DIRECTORY_PREFIX='video-transcripts/', -) +VIDEO_TRANSCRIPTS_SETTINGS = { + "VIDEO_TRANSCRIPTS_MAX_BYTES": 3 * 1024 * 1024, # 3 MB + "STORAGE_KWARGS": { + "location": MEDIA_ROOT, + "base_url": MEDIA_URL, + }, + "DIRECTORY_PREFIX": "video-transcripts/", +} + ####################### Plugin Settings ########################## diff --git a/pylint_django_settings.py b/pylint_django_settings.py index 46abfd81f883..6051d9ab4b56 100644 --- a/pylint_django_settings.py +++ b/pylint_django_settings.py @@ -1,5 +1,5 @@ -from pylint_django.checkers import ForeignKeyStringsChecker -from pylint_plugin_utils import get_checker +import os +import sys class ArgumentCompatibilityError(Exception): @@ -47,6 +47,4 @@ def load_configuration(linter): """ Configures the Django settings module based on the command-line arguments passed to pylint. """ - name_checker = get_checker(linter, ForeignKeyStringsChecker) - arguments = linter.cmdline_parser.parse_args()[1] - name_checker.config.django_settings_module = _get_django_settings_module(arguments) + os.environ.setdefault("DJANGO_SETTINGS_MODULE", _get_django_settings_module(sys.argv[1:])) diff --git a/pylintrc b/pylintrc index 55a9bbab3b9c..a71b8635e137 100644 --- a/pylintrc +++ b/pylintrc @@ -64,7 +64,7 @@ # SERIOUSLY. # # ------------------------------ -# Generated by edx-lint version: 5.3.7 +# Generated by edx-lint version: 5.4.1 # ------------------------------ [MASTER] ignore = ,.git,.tox,migrations,node_modules,.pycharm_helpers @@ -314,6 +314,7 @@ disable = c-extension-no-member, no-name-in-module, unnecessary-lambda-assignment, + too-many-positional-arguments [REPORTS] output-format = text @@ -410,4 +411,4 @@ int-import-graph = [EXCEPTIONS] overgeneral-exceptions = builtins.Exception -# e624ea03d8124aa9cf2e577f830632344a0a07d9 +# 9a6ef98201621694b12a50a2f5b71bd35471700d diff --git a/pylintrc_tweaks b/pylintrc_tweaks index 1633da5c10a4..1396fd6b92ed 100644 --- a/pylintrc_tweaks +++ b/pylintrc_tweaks @@ -33,6 +33,7 @@ disable+ = c-extension-no-member, no-name-in-module, unnecessary-lambda-assignment, + too-many-positional-arguments [BASIC] attr-rgx = [a-z_][a-z0-9_]{2,40}$ diff --git a/xmodule/capa/tests/test_input_templates.py b/xmodule/capa/tests/test_input_templates.py index 4b14bd5ef86c..156921bf5301 100644 --- a/xmodule/capa/tests/test_input_templates.py +++ b/xmodule/capa/tests/test_input_templates.py @@ -76,8 +76,8 @@ def render_to_xml(self, context_dict): except Exception as exc: raise TemplateError("Could not parse XML from '{0}': {1}".format( # lint-amnesty, pylint: disable=raise-missing-from xml_str, str(exc))) - else: - return xml + + return xml def assert_has_xpath(self, xml_root, xpath, context_dict, exact_num=1): """ diff --git a/xmodule/capa/xqueue_interface.py b/xmodule/capa/xqueue_interface.py index aee7232a4133..d81d7f5747c0 100644 --- a/xmodule/capa/xqueue_interface.py +++ b/xmodule/capa/xqueue_interface.py @@ -186,12 +186,12 @@ def construct_callback(self, dispatch: str = 'score_update') -> str: """ relative_xqueue_callback_url = reverse( 'xqueue_callback', - kwargs=dict( - course_id=str(self._block.scope_ids.usage_id.context_key), - userid=str(self._block.scope_ids.user_id), - mod_id=str(self._block.scope_ids.usage_id), - dispatch=dispatch, - ), + kwargs = { + "course_id": str(self._block.scope_ids.usage_id.context_key), + "userid": str(self._block.scope_ids.user_id), + "mod_id": str(self._block.scope_ids.usage_id), + "dispatch": dispatch, + }, ) xqueue_callback_url_prefix = settings.XQUEUE_INTERFACE.get('callback_url', settings.LMS_ROOT_URL) return xqueue_callback_url_prefix + relative_xqueue_callback_url diff --git a/xmodule/capa_block.py b/xmodule/capa_block.py index 24737b689845..dc543afc2aad 100644 --- a/xmodule/capa_block.py +++ b/xmodule/capa_block.py @@ -1049,7 +1049,7 @@ def should_show_reset_button(self): """ Return True/False to indicate whether to show the "Reset" button. """ - is_survey_question = (self.max_attempts == 0) + is_survey_question = self.max_attempts == 0 # If the problem is closed (and not a survey question with max_attempts==0), # then do NOT show the reset button. @@ -1077,7 +1077,7 @@ def should_show_save_button(self): if self.force_save_button: return not self.closed() else: - is_survey_question = (self.max_attempts == 0) + is_survey_question = self.max_attempts == 0 needs_reset = self.is_submitted() and self.rerandomize == RANDOMIZATION.ALWAYS # If the student has unlimited attempts, and their answers diff --git a/xmodule/course_block.py b/xmodule/course_block.py index 5b1f92d77734..cc203842c7d4 100644 --- a/xmodule/course_block.py +++ b/xmodule/course_block.py @@ -864,13 +864,11 @@ class CourseFields: # lint-amnesty, pylint: disable=missing-class-docstring help=_( "Enter the proctoring provider you want to use for this course run. " "Choose from the following options: {available_providers}."), - help_format_args=dict( + help_format_args = { # Put the available providers into a format variable so that translators # don't translate them. - available_providers=( - ', '.join(get_available_providers()) - ), - ), + "available_providers": ", ".join(get_available_providers()), + }, scope=Scope.settings, deprecated=EXAM_SETTINGS_HTML_VIEW_ENABLED ) diff --git a/xmodule/item_bank_block.py b/xmodule/item_bank_block.py index 7adf935e48ee..b783ef5a5c9b 100644 --- a/xmodule/item_bank_block.py +++ b/xmodule/item_bank_block.py @@ -136,7 +136,7 @@ def make_selection(cls, selected, children, max_count): valid_block_keys = {(c.block_type, c.block_id) for c in children} # Remove any selected blocks that are no longer valid: - invalid_block_keys = (selected_keys - valid_block_keys) + invalid_block_keys = selected_keys - valid_block_keys if invalid_block_keys: selected_keys -= invalid_block_keys diff --git a/xmodule/library_content_block.py b/xmodule/library_content_block.py index 52e33108027c..27044bf75ff7 100644 --- a/xmodule/library_content_block.py +++ b/xmodule/library_content_block.py @@ -390,8 +390,8 @@ def post_editor_saved(self, user, old_metadata, old_content): # pylint: disable """ If source library or capa_type have been edited, upgrade library & sync automatically. """ - source_lib_changed = (self.source_library_id != old_metadata.get("source_library_id", "")) - capa_filter_changed = (self.capa_type != old_metadata.get("capa_type", ANY_CAPA_TYPE_VALUE)) + source_lib_changed = self.source_library_id != old_metadata.get("source_library_id", "") + capa_filter_changed = self.capa_type != old_metadata.get("capa_type", ANY_CAPA_TYPE_VALUE) if source_lib_changed or capa_filter_changed: try: self.sync_from_library(upgrade_to_latest=True) diff --git a/xmodule/library_tools.py b/xmodule/library_tools.py index 52a31c0608ea..457b00d021c1 100644 --- a/xmodule/library_tools.py +++ b/xmodule/library_tools.py @@ -105,11 +105,11 @@ def trigger_library_sync(self, dest_block: LegacyLibraryContentBlock, library_ve # These race conditions lead to failed imports of library content from course import. # See: TNL-11339, https://github.com/openedx/edx-platform/issues/34029 for more info. library_tasks.sync_from_library.apply( - kwargs=dict( - user_id=self.user_id, - dest_block_id=str(dest_block.scope_ids.usage_id), - library_version=library_version, - ), + kwargs={ + "user_id": self.user_id, + "dest_block_id": str(dest_block.scope_ids.usage_id), + "library_version": library_version, + }, ) def trigger_duplication( diff --git a/xmodule/modulestore/inheritance.py b/xmodule/modulestore/inheritance.py index 4c5a14b769cb..b6ce5727316c 100644 --- a/xmodule/modulestore/inheritance.py +++ b/xmodule/modulestore/inheritance.py @@ -178,24 +178,24 @@ class InheritanceMixin(XBlockMixin): scope=Scope.settings, default=False ) - video_bumper = Dict( - display_name=_("Video Pre-Roll"), - help=_( + video_bumper = { + "display_name": _("Video Pre-Roll"), + "help": _( "Identify a video, 5-10 seconds in length, to play before course videos. Enter the video ID from " "the Video Uploads page and one or more transcript files in the following format: {format}. " "For example, an entry for a video with two transcripts looks like this: {example}" ), - help_format_args=dict( - format='{"video_id": "ID", "transcripts": {"language": "/static/filename.srt"}}', - example=( + "help_format_args": { + "format": '{"video_id": "ID", "transcripts": {"language": "/static/filename.srt"}}', + "example": ( '{' '"video_id": "77cef264-d6f5-4cf2-ad9d-0178ab8c77be", ' '"transcripts": {"en": "/static/DemoX-D01_1.srt", "uk": "/static/DemoX-D01_1_uk.srt"}' '}' ), - ), - scope=Scope.settings - ) + }, + "scope": Scope.settings, + } show_reset_button = Boolean( display_name=_("Show Reset Button for Problems"), diff --git a/xmodule/modulestore/mongo/draft.py b/xmodule/modulestore/mongo/draft.py index 5e171e36daf6..255c4bffd85f 100644 --- a/xmodule/modulestore/mongo/draft.py +++ b/xmodule/modulestore/mongo/draft.py @@ -35,7 +35,7 @@ def wrap_draft(item): Sets `item.is_draft` to `True` if the item is DRAFT, and `False` otherwise. Sets the item's location to the non-draft location in either case. """ - item.is_draft = (item.location.branch == MongoRevisionKey.draft) + item.is_draft = item.location.branch == MongoRevisionKey.draft item.location = item.location.replace(revision=MongoRevisionKey.published) return item diff --git a/xmodule/modulestore/perf_tests/generate_report.py b/xmodule/modulestore/perf_tests/generate_report.py index fbecd33bbbd9..9387b1f311a0 100644 --- a/xmodule/modulestore/perf_tests/generate_report.py +++ b/xmodule/modulestore/perf_tests/generate_report.py @@ -167,7 +167,7 @@ def generate_html(self): value = 0 else: value = (per_amount[modulestore] - per_phase['0'][modulestore]) / float(amount) - row.append(f"{value}") + row.append(f"{value}") # pylint: disable=possibly-used-before-assignment phase_table.add_row(row) # Add the table title and the table. @@ -282,7 +282,7 @@ def cli(outfile, db_name, data_type): elif data_type == 'find': f_gen = FindReportGen(db_name) html = f_gen.generate_html() - click.echo(html.tostring(), file=outfile) + click.echo(html.tostring(), file=outfile) # pylint: disable=possibly-used-before-assignment if __name__ == '__main__': if click is not None: diff --git a/xmodule/modulestore/split_mongo/split_draft.py b/xmodule/modulestore/split_mongo/split_draft.py index 62ee4166df9d..8a234147360a 100644 --- a/xmodule/modulestore/split_mongo/split_draft.py +++ b/xmodule/modulestore/split_mongo/split_draft.py @@ -235,7 +235,7 @@ def delete_item(self, location, user_id, revision=None, skip_auto_publish=False, ) self._flag_publish_event(location.course_key) - for branch in branches_to_delete: + for branch in branches_to_delete: # pylint: disable=possibly-used-before-assignment branched_location = location.for_branch(branch) super().delete_item(branched_location, user_id) diff --git a/xmodule/modulestore/tests/utils.py b/xmodule/modulestore/tests/utils.py index 8cac4bf72831..0414dc77bf39 100644 --- a/xmodule/modulestore/tests/utils.py +++ b/xmodule/modulestore/tests/utils.py @@ -245,12 +245,12 @@ def build_with_contentstore(self, contentstore, **kwargs): contentstore: The contentstore that this modulestore should use to store all of its assets. """ - doc_store_config = dict( - db=f'modulestore{THIS_UUID}', - collection='xmodule', - asset_collection='asset_metadata', - **COMMON_DOCSTORE_CONFIG - ) + doc_store_config = { + "db": f"modulestore{THIS_UUID}", + "collection": "xmodule", + "asset_collection": "asset_metadata", + **COMMON_DOCSTORE_CONFIG, + } # Set up a temp directory for storing filesystem content created during import fs_root = mkdtemp() @@ -293,11 +293,11 @@ def build_with_contentstore(self, contentstore, **kwargs): contentstore: The contentstore that this modulestore should use to store all of its assets. """ - doc_store_config = dict( - db=f'modulestore{THIS_UUID}', - collection='split_module', - **COMMON_DOCSTORE_CONFIG - ) + doc_store_config = { + "db": f"modulestore{THIS_UUID}", + "collection": "split_module", + **COMMON_DOCSTORE_CONFIG, + } # Set up a temp directory for storing filesystem content created during import fs_root = mkdtemp() diff --git a/xmodule/split_test_block.py b/xmodule/split_test_block.py index 05ca3a5db454..2ec49f0a80e6 100644 --- a/xmodule/split_test_block.py +++ b/xmodule/split_test_block.py @@ -419,9 +419,9 @@ def log_child_render(self, request, suffix=''): # lint-amnesty, pylint: disable ) ) raise - else: - self.runtime.publish(self, 'xblock.split_test.child_render', {'child_id': child_id}) - return Response() + + self.runtime.publish(self, 'xblock.split_test.child_render', {'child_id': child_id}) + return Response() def get_icon_class(self): return self.child.get_icon_class() if self.child else 'other' diff --git a/xmodule/tests/test_graders.py b/xmodule/tests/test_graders.py index 5073052b1ba8..97e441b0939b 100644 --- a/xmodule/tests/test_graders.py +++ b/xmodule/tests/test_graders.py @@ -21,8 +21,13 @@ class GradesheetTest(unittest.TestCase): def test_weighted_grading(self): scores = [] - agg_fields = dict(first_attempted=None) - prob_fields = dict(raw_earned=0, raw_possible=0, weight=0, first_attempted=None) + agg_fields = {"first_attempted": None} + prob_fields = { + "raw_earned": 0, + "raw_possible": 0, + "weight": 0, + "first_attempted": None, + } # No scores all_total, graded_total = aggregate_scores(scores) diff --git a/xmodule/tests/test_html_block.py b/xmodule/tests/test_html_block.py index 8cca7acc0499..70b491a8bbce 100644 --- a/xmodule/tests/test_html_block.py +++ b/xmodule/tests/test_html_block.py @@ -77,7 +77,7 @@ def test_common_values(self, html): field_data = DictFieldData({'data': html}) module_system = get_test_system() block = HtmlBlock(module_system, field_data, Mock()) - assert block.student_view_data() == dict(enabled=True, html=html) + assert block.student_view_data() == {"enabled": True, "html": html} @ddt.data( STUDENT_VIEW, diff --git a/xmodule/tests/test_sequence.py b/xmodule/tests/test_sequence.py index be773865a717..731d6eeedc76 100644 --- a/xmodule/tests/test_sequence.py +++ b/xmodule/tests/test_sequence.py @@ -149,7 +149,7 @@ def test_student_view_init(self): def test_render_student_view(self, view): html = self._get_rendered_view( self.sequence_3_1, - extra_context=dict(next_url='NextSequential', prev_url='PrevSequential'), + extra_context={"next_url": 'NextSequential', "prev_url": 'PrevSequential'}, view=view ) self._assert_view_at_position(html, expected_position=1) @@ -171,7 +171,7 @@ def test_timed_exam_gating_waffle_flag(self, mocked_function): # pylint: disabl with override_waffle_flag(TIMED_EXAM_GATING_WAFFLE_FLAG, active=False): self._get_rendered_view( self.sequence_5_1, - extra_context=dict(next_url='NextSequential', prev_url='PrevSequential'), + extra_context={"next_url": 'NextSequential', "prev_url": 'PrevSequential'}, view=STUDENT_VIEW ) mocked_function.assert_not_called() @@ -179,7 +179,7 @@ def test_timed_exam_gating_waffle_flag(self, mocked_function): # pylint: disabl with override_waffle_flag(TIMED_EXAM_GATING_WAFFLE_FLAG, active=True): self._get_rendered_view( self.sequence_5_1, - extra_context=dict(next_url='NextSequential', prev_url='PrevSequential'), + extra_context={"next_url": 'NextSequential', "prev_url": 'PrevSequential'}, view=STUDENT_VIEW ) mocked_function.assert_called_once() @@ -199,7 +199,7 @@ def test_that_timed_sequence_gating_respects_access_configurations(self): )) view = self._get_rendered_view( self.sequence_5_1, - extra_context=dict(next_url='NextSequential', prev_url='PrevSequential'), + extra_context={"next_url": 'NextSequential', "prev_url": 'PrevSequential'}, view=STUDENT_VIEW ) assert 'i_am_gated' in view @@ -243,7 +243,7 @@ def test_hidden_content_past_due(self): progress_url = 'http://test_progress_link' html = self._get_rendered_view( self.sequence_4_1, - extra_context=dict(progress_url=progress_url), + extra_context={"progress_url": progress_url}, ) assert 'hidden_content.html' in html assert progress_url in html @@ -252,7 +252,7 @@ def test_masquerade_hidden_content_past_due(self): with freeze_time(COURSE_END_DATE): html = self._get_rendered_view( self.sequence_4_1, - extra_context=dict(specific_masquerade=True), + extra_context={"specific_masquerade": True}, ) assert 'seq_block.html' in html html = self.get_context_dict_from_string(html) @@ -269,7 +269,7 @@ def test_hidden_content_self_paced_past_end(self): progress_url = 'http://test_progress_link' html = self._get_rendered_view( self.sequence_4_1, - extra_context=dict(progress_url=progress_url), + extra_context={"progress_url": progress_url}, self_paced=True, ) assert 'hidden_content.html' in html @@ -335,7 +335,7 @@ def test_gated_content(self): html = self._get_rendered_view( self.sequence_1_2, - extra_context=dict(next_url='NextSequential', prev_url='PrevSequential'), + extra_context={"next_url": 'NextSequential', "prev_url": 'PrevSequential'}, ) # expect content to be gated, with no banner @@ -348,7 +348,7 @@ def test_gated_content(self): html = self._get_rendered_view( self.sequence_1_2, - extra_context=dict(next_url='NextSequential', prev_url='PrevSequential'), + extra_context={"next_url": 'NextSequential', "prev_url": 'PrevSequential'}, ) # assert that content and preq banner is shown self._assert_prereq(html, self.sequence_1_2) @@ -360,7 +360,7 @@ def test_gated_content(self): html = self._get_rendered_view( self.sequence_1_2, - extra_context=dict(next_url='NextSequential', prev_url='PrevSequential'), + extra_context={"next_url": 'NextSequential', "prev_url": 'PrevSequential'}, ) # assert content shown as normal diff --git a/xmodule/vertical_block.py b/xmodule/vertical_block.py index 150e6310853e..b0db520350f5 100644 --- a/xmodule/vertical_block.py +++ b/xmodule/vertical_block.py @@ -116,7 +116,7 @@ def _student_or_public_view(self, context, view): # lint-amnesty, pylint: disab child_block_context = copy(child_context) if child in list(child_blocks_to_complete_on_view): child_block_context['wrap_xblock_data'] = { - 'mark-completed-on-view-after-delay': complete_on_view_delay + 'mark-completed-on-view-after-delay': complete_on_view_delay # pylint: disable=possibly-used-before-assignment } try: # .. filter_implemented_name: VerticalBlockChildRenderStarted diff --git a/xmodule/video_block/transcripts_utils.py b/xmodule/video_block/transcripts_utils.py index 866edf596812..0f5a653751dc 100644 --- a/xmodule/video_block/transcripts_utils.py +++ b/xmodule/video_block/transcripts_utils.py @@ -639,10 +639,10 @@ def get_video_transcript_content(edx_video_id, language_code): f"Error getting transcript from edx-val id: {edx_video_id}: language code {language_code}" ) content = '{"start": [1],"end": [2],"text": ["An error occured obtaining the transcript."]}' - transcript = dict( - file_name='error-{edx_video_id}-{language_code}.srt', - content=Transcript.convert(content, 'sjson', 'srt') - ) + transcript = { + "file_name": f"error-{edx_video_id}-{language_code}.srt", + "content": Transcript.convert(content, "sjson", "srt"), + } return transcript @@ -681,7 +681,10 @@ def convert_video_transcript(file_name, content, output_format): filename = f'{basename}.{output_format}' converted_transcript = Transcript.convert(content, input_format=input_format, output_format=output_format) - return dict(filename=filename, content=converted_transcript) + return { + "filename": filename, + "content": converted_transcript, + } class Transcript: @@ -835,7 +838,7 @@ def available_translations(self, transcripts, verify_assets=None, is_bumper=Fals sub, other_langs = transcripts["sub"], transcripts["transcripts"] if verify_assets: - all_langs = dict(**other_langs) + all_langs = {**other_langs} if sub: all_langs.update({'en': sub}) From 49f479191cf77889796fc303cb8cb2f325320275 Mon Sep 17 00:00:00 2001 From: Irtaza Akram Date: Tue, 19 Nov 2024 16:48:18 +0500 Subject: [PATCH 3/7] fix: pylint issues --- .../course_modes/tests/test_views.py | 2 +- .../rest_api/v1/tests/test_serializers.py | 4 +- .../rest_api/v1/tests/test_views.py | 12 +-- .../entitlements/tests/test_models.py | 4 +- .../entitlements/tests/test_utils.py | 4 +- common/djangoapps/status/tests.py | 6 +- .../commands/bulk_change_enrollment_csv.py | 4 +- .../management/commands/change_enrollment.py | 5 +- common/djangoapps/student/models/user.py | 2 +- .../student/tests/test_enrollment.py | 5 +- .../djangoapps/student/tests/test_helpers.py | 4 +- .../student/tests/test_parental_controls.py | 2 +- .../student/tests/test_receivers.py | 2 +- common/djangoapps/student/tests/test_views.py | 8 +- .../api/tests/test_permissions.py | 45 ++++---- .../third_party_auth/api/tests/test_views.py | 2 +- common/djangoapps/third_party_auth/lti.py | 2 +- common/djangoapps/third_party_auth/models.py | 2 +- .../djangoapps/third_party_auth/pipeline.py | 2 +- common/djangoapps/track/views/segmentio.py | 6 +- .../django_comment_client/base/views.py | 2 +- lms/djangoapps/discussion/rest_api/api.py | 4 +- .../discussion/rest_api/tests/test_api.py | 21 +++- .../discussion/rest_api/tests/test_views.py | 4 +- lms/djangoapps/discussion/rest_api/views.py | 4 +- lms/djangoapps/discussion/tasks.py | 2 - .../discussion/tests/test_signals.py | 2 +- lms/djangoapps/discussion/tests/test_views.py | 6 +- lms/djangoapps/edxnotes/helpers.py | 2 +- lms/djangoapps/edxnotes/views.py | 2 +- lms/djangoapps/experiments/flags.py | 2 +- .../management/commands/compute_grades.py | 2 +- .../grades/rest_api/v1/gradebook_views.py | 33 +++--- lms/djangoapps/grades/signals/handlers.py | 31 +++--- lms/djangoapps/grades/subsection_grade.py | 24 ++--- .../grades/tests/test_course_data.py | 8 +- lms/djangoapps/grades/tests/utils.py | 14 +-- .../instructor/tests/test_certificates.py | 52 ++++----- lms/djangoapps/instructor/views/api.py | 19 +++- .../instructor/views/gradebook_api.py | 2 +- .../instructor_analytics/distributions.py | 2 +- lms/djangoapps/instructor_task/api.py | 2 +- .../tasks_helper/module_state.py | 24 +---- .../instructor_task/tests/test_integration.py | 15 +-- .../mfe_config_api/tests/test_views.py | 66 ++++++------ .../mobile_api/course_info/views.py | 4 +- .../tests/test_course_info_views.py | 2 +- lms/djangoapps/mobile_api/users/tests.py | 2 +- .../test_send_program_course_nudge_email.py | 4 +- lms/djangoapps/static_template_view/views.py | 3 +- lms/djangoapps/support/tests/test_views.py | 2 +- .../user_tours/v1/tests/test_views.py | 2 +- .../test_retry_failed_photo_verifications.py | 2 +- .../verify_student/tests/test_models.py | 4 +- .../verify_student/tests/test_views.py | 2 +- lms/djangoapps/verify_student/views.py | 2 +- lms/envs/common.py | 54 +++++----- lms/envs/test.py | 16 +-- .../ace_common/tests/test_tracking.py | 4 +- .../djangoapps/api_admin/tests/test_views.py | 2 +- .../management/commands/cache_programs.py | 2 +- .../commands/generate_course_blocks.py | 2 +- .../tests/test_generate_course_blocks.py | 2 +- .../content/block_structure/models.py | 10 +- .../content/block_structure/signals.py | 2 +- .../content/block_structure/store.py | 12 +-- .../block_structure/tests/test_models.py | 16 +-- .../block_structure/tests/test_tasks.py | 2 +- .../commands/tests/test_simulate_publish.py | 20 ++-- .../content/course_overviews/models.py | 2 +- .../tests/test_course_overviews.py | 4 +- .../djangoapps/content_libraries/tasks.py | 2 +- .../tests/test_content_libraries.py | 18 ++-- .../contentserver/test/test_contentserver.py | 4 +- .../djangoapps/cookie_metadata/middleware.py | 2 +- .../djangoapps/cors_csrf/tests/test_views.py | 2 +- .../course_apps/rest_api/tests/test_views.py | 2 +- .../courseware_api/tests/test_views.py | 2 +- openedx/core/djangoapps/credit/models.py | 1 - openedx/core/djangoapps/credit/tasks.py | 3 +- openedx/core/djangoapps/enrollments/data.py | 3 +- .../enrollments/tests/test_views.py | 2 +- openedx/core/djangoapps/geoinfo/middleware.py | 2 +- .../commands/create_dot_application.py | 12 +-- .../tests/test_generate_jwt_signing_key.py | 25 ++++- .../oauth_dispatch/tests/test_api.py | 6 +- .../oauth_dispatch/tests/test_dot_adapter.py | 8 +- .../tests/test_dot_overrides.py | 10 +- .../oauth_dispatch/tests/test_jwt.py | 12 ++- .../oauth_dispatch/tests/test_views.py | 8 +- openedx/core/djangoapps/programs/tasks.py | 2 +- .../djangoapps/programs/tests/test_signals.py | 42 ++++---- openedx/core/djangoapps/programs/utils.py | 22 +++- .../djangoapps/safe_sessions/middleware.py | 16 +-- .../commands/tests/send_email_base.py | 69 +++++++----- .../commands/tests/test_send_course_update.py | 24 ++--- .../tests/test_send_upgrade_reminder.py | 31 +++--- .../management/commands/tests/upsell_base.py | 10 +- openedx/core/djangoapps/schedules/signals.py | 10 +- openedx/core/djangoapps/schedules/tasks.py | 2 +- .../core/djangoapps/user_api/accounts/api.py | 2 +- .../user_api/accounts/tests/test_api.py | 32 +++--- .../commands/bulk_user_org_email_optout.py | 10 +- .../tests/test_email_opt_in_list.py | 2 +- .../core/djangoapps/user_api/middleware.py | 2 +- .../core/djangoapps/user_authn/tests/utils.py | 2 +- openedx/core/djangoapps/util/user_messages.py | 2 +- openedx/core/djangoapps/waffle_utils/views.py | 2 +- openedx/core/djangoapps/xblock/apps.py | 13 +-- openedx/core/lib/api/view_utils.py | 3 +- openedx/core/lib/celery/task_utils.py | 6 +- openedx/core/lib/extract_archive.py | 2 +- .../core/lib/tests/test_graph_traversals.py | 18 ++-- openedx/core/lib/tests/test_teams_config.py | 20 ++-- .../tests/test_course_expiration.py | 2 +- .../enterprise_support/tests/test_api.py | 4 +- openedx/features/enterprise_support/utils.py | 6 +- .../learner_profile/views/learner_profile.py | 2 +- pavelib/paver_tests/test_assets.py | 102 +++++++++--------- pavelib/paver_tests/test_timer.py | 2 +- pavelib/paver_tests/utils.py | 2 - pavelib/quality.py | 12 +-- requirements/edx/testing.in | 5 +- xmodule/tests/test_graders.py | 2 +- xmodule/tests/test_html_block.py | 8 +- xmodule/tests/test_video.py | 5 +- xmodule/tests/test_xml_block.py | 10 +- 127 files changed, 649 insertions(+), 628 deletions(-) diff --git a/common/djangoapps/course_modes/tests/test_views.py b/common/djangoapps/course_modes/tests/test_views.py index d7b069865317..d3fe39789076 100644 --- a/common/djangoapps/course_modes/tests/test_views.py +++ b/common/djangoapps/course_modes/tests/test_views.py @@ -323,7 +323,7 @@ def test_choose_mode_redirect(self, course_mode, expected_redirect): self.fail("Must provide a valid redirect URL name") with mock_payment_processors(expect_called=None): - self.assertRedirects(response, redirect_url, fetch_redirect_response=False,) + self.assertRedirects(response, redirect_url, fetch_redirect_response=False,) # pylint: disable=possibly-used-before-assignment def test_choose_mode_audit_enroll_on_post(self): audit_mode = 'audit' diff --git a/common/djangoapps/entitlements/rest_api/v1/tests/test_serializers.py b/common/djangoapps/entitlements/rest_api/v1/tests/test_serializers.py index 250317cc9db1..48bd1d1e1531 100644 --- a/common/djangoapps/entitlements/rest_api/v1/tests/test_serializers.py +++ b/common/djangoapps/entitlements/rest_api/v1/tests/test_serializers.py @@ -21,9 +21,9 @@ class EntitlementsSerializerTests(ModuleStoreTestCase): """ def test_data(self): - entitlement = CourseEntitlementFactory() + entitlement = CourseEntitlementFactory() # pylint: disable=possibly-used-before-assignment request = RequestFactory().get('') - serializer = CourseEntitlementSerializer(entitlement, context={'request': request}) + serializer = CourseEntitlementSerializer(entitlement, context={'request': request}) # pylint: disable=possibly-used-before-assignment expected = { 'user': entitlement.user.username, diff --git a/common/djangoapps/entitlements/rest_api/v1/tests/test_views.py b/common/djangoapps/entitlements/rest_api/v1/tests/test_views.py index 86d4ae6a87e1..3fdad30be48b 100644 --- a/common/djangoapps/entitlements/rest_api/v1/tests/test_views.py +++ b/common/djangoapps/entitlements/rest_api/v1/tests/test_views.py @@ -77,7 +77,7 @@ def _assert_default_policy(self, policy): """ Assert that a policy is equal to the default Course Entitlement Policy. """ - default_policy = CourseEntitlementPolicy() + default_policy = CourseEntitlementPolicy() # pylint: disable=possibly-used-before-assignment assert policy.expiration_period == default_policy.expiration_period assert policy.refund_period == default_policy.refund_period assert policy.regain_period == default_policy.regain_period @@ -124,7 +124,7 @@ def test_staff_user_required_for_delete(self): not_staff_user = UserFactory() self.client.login(username=not_staff_user.username, password=TEST_PASSWORD) - course_entitlement = CourseEntitlementFactory.create() + course_entitlement = CourseEntitlementFactory.create() # pylint: disable=possibly-used-before-assignment url = reverse(self.ENTITLEMENTS_DETAILS_PATH, args=[str(course_entitlement.uuid)]) response = self.client.delete( @@ -145,11 +145,11 @@ def test_add_entitlement(self): assert response.status_code == 201 results = response.data - course_entitlement = CourseEntitlement.objects.get( + course_entitlement = CourseEntitlement.objects.get( # pylint: disable=possibly-used-before-assignment user=self.user, course_uuid=course_uuid ) - assert results == CourseEntitlementSerializer(course_entitlement).data + assert results == CourseEntitlementSerializer(course_entitlement).data # pylint: disable=possibly-used-before-assignment def test_add_duplicate_entitlement(self): """ @@ -293,7 +293,7 @@ def test_set_custom_site_policy_on_create(self): policy_site = SiteFactory.create() policy = CourseEntitlementPolicy.objects.create(mode=None, site=policy_site) - set_entitlement_policy(course_entitlement, policy_site) + set_entitlement_policy(course_entitlement, policy_site) # pylint: disable=possibly-used-before-assignment assert course_entitlement.policy == policy def test_set_policy_match_site_over_mode(self): @@ -767,7 +767,7 @@ def test_reinstate_entitlement(self): 'support_details': [ { 'unenrolled_run': str(enrollment.course.id), - 'action': CourseEntitlementSupportDetail.REISSUE, + 'action': CourseEntitlementSupportDetail.REISSUE, # pylint: disable=possibly-used-before-assignment 'comments': 'Severe illness.' } ] diff --git a/common/djangoapps/entitlements/tests/test_models.py b/common/djangoapps/entitlements/tests/test_models.py index e0500da454a2..bca1d185f73f 100644 --- a/common/djangoapps/entitlements/tests/test_models.py +++ b/common/djangoapps/entitlements/tests/test_models.py @@ -45,7 +45,7 @@ def test_check_for_existing_entitlement_and_enroll(self, mock_get_course_uuid): # This must be in the future to ensure it is returned by downstream code. expiration_datetime=now() + timedelta(days=1) ) - entitlement = CourseEntitlementFactory.create( + entitlement = CourseEntitlementFactory.create( # pylint: disable=possibly-used-before-assignment mode=CourseMode.VERIFIED, user=self.user, ) @@ -53,7 +53,7 @@ def test_check_for_existing_entitlement_and_enroll(self, mock_get_course_uuid): assert not CourseEnrollment.is_enrolled(user=self.user, course_key=course.id) - CourseEntitlement.check_for_existing_entitlement_and_enroll( + CourseEntitlement.check_for_existing_entitlement_and_enroll( # pylint: disable=possibly-used-before-assignment user=self.user, course_run_key=course.id, ) diff --git a/common/djangoapps/entitlements/tests/test_utils.py b/common/djangoapps/entitlements/tests/test_utils.py index cc2235edb028..4e37d34e59d3 100644 --- a/common/djangoapps/entitlements/tests/test_utils.py +++ b/common/djangoapps/entitlements/tests/test_utils.py @@ -69,9 +69,9 @@ def test_course_run_fulfillable(self): enrollment_end_from_now=1 ) - entitlement = CourseEntitlementFactory.create(mode=CourseMode.VERIFIED) + entitlement = CourseEntitlementFactory.create(mode=CourseMode.VERIFIED) # pylint: disable=possibly-used-before-assignment - assert is_course_run_entitlement_fulfillable(course_overview.id, entitlement) + assert is_course_run_entitlement_fulfillable(course_overview.id, entitlement) # pylint: disable=possibly-used-before-assignment def test_course_run_missing_overview_not_fulfillable(self): entitlement = CourseEntitlementFactory.create(mode=CourseMode.VERIFIED) diff --git a/common/djangoapps/status/tests.py b/common/djangoapps/status/tests.py index 53798e7b1210..ccf235b3d877 100644 --- a/common/djangoapps/status/tests.py +++ b/common/djangoapps/status/tests.py @@ -36,15 +36,15 @@ def test_get_site_status_msg(self, test_global_message, test_course_message): """Test status messages in a variety of situations.""" # When we don't have any data set. - assert get_site_status_msg(None) is None + assert get_site_status_msg(None) is None # pylint: disable=possibly-used-before-assignment assert get_site_status_msg(self.course_key) is None - msg = GlobalStatusMessage.objects.create(message=test_global_message, enabled=True) + msg = GlobalStatusMessage.objects.create(message=test_global_message, enabled=True) # pylint: disable=possibly-used-before-assignment msg.save() assert get_site_status_msg(None) == test_global_message - course_msg = CourseMessage.objects.create( + course_msg = CourseMessage.objects.create( # pylint: disable=possibly-used-before-assignment global_message=msg, message=test_course_message, course_key=self.course_key ) course_msg.save() diff --git a/common/djangoapps/student/management/commands/bulk_change_enrollment_csv.py b/common/djangoapps/student/management/commands/bulk_change_enrollment_csv.py index a9c1d5349858..945fb796ccdd 100644 --- a/common/djangoapps/student/management/commands/bulk_change_enrollment_csv.py +++ b/common/djangoapps/student/management/commands/bulk_change_enrollment_csv.py @@ -65,7 +65,7 @@ def get_file_from_database(self): return enrollment_config.csv_file def handle(self, *args, **options): - """ Main handler for the command.""" + """Main handler for the command.""" file_path = options.get('csv_file_path', None) file_from_database = options['file_from_database'] @@ -81,7 +81,7 @@ def handle(self, *args, **options): self.change_enrollments(csv_file) else: - CommandError('No file is provided. File is required') + raise CommandError('No file is provided. File is required') def change_enrollments(self, csv_file): """ change the enrollments of the learners. """ diff --git a/common/djangoapps/student/management/commands/change_enrollment.py b/common/djangoapps/student/management/commands/change_enrollment.py index fa322fdd7be0..eb5cc0e5334a 100644 --- a/common/djangoapps/student/management/commands/change_enrollment.py +++ b/common/djangoapps/student/management/commands/change_enrollment.py @@ -81,10 +81,7 @@ def handle(self, *args, **options): if not options['username'] and not options['email']: raise CommandError('You must include usernames (-u) or emails (-e) to select users to update') - enrollment_args = dict( - course_id=course_key, - mode=options['from_mode'] - ) + enrollment_args = {"course_id": course_key, "mode": options['from_mode']} error_users = [] success_users = [] diff --git a/common/djangoapps/student/models/user.py b/common/djangoapps/student/models/user.py index 9d979beb19cb..7fe69bd678e4 100644 --- a/common/djangoapps/student/models/user.py +++ b/common/djangoapps/student/models/user.py @@ -1028,7 +1028,7 @@ def clear_lockout_counter(cls, user): entry = cls._get_record_for_user(user) entry.delete() except ObjectDoesNotExist: - return + pass def __str__(self): """Str -> Username: count - date.""" diff --git a/common/djangoapps/student/tests/test_enrollment.py b/common/djangoapps/student/tests/test_enrollment.py index fee4ec39906f..a6d66c0eaf83 100644 --- a/common/djangoapps/student/tests/test_enrollment.py +++ b/common/djangoapps/student/tests/test_enrollment.py @@ -507,10 +507,7 @@ def test_score_recalculation_on_enrollment_update(self): ) CourseEnrollment.enroll(self.user, self.course.id, mode="audit") - local_task_args = dict( - user_id=self.user.id, - course_key=str(self.course.id) - ) + local_task_args = {"user_id": self.user.id, "course_key": str(self.course.id)} with patch( 'lms.djangoapps.grades.tasks.recalculate_course_and_subsection_grades_for_user.apply_async', diff --git a/common/djangoapps/student/tests/test_helpers.py b/common/djangoapps/student/tests/test_helpers.py index 450f0ed695f9..1f124f8bcd9e 100644 --- a/common/djangoapps/student/tests/test_helpers.py +++ b/common/djangoapps/student/tests/test_helpers.py @@ -121,7 +121,7 @@ def validate_login(): req = self.request.get(settings.LOGIN_URL + f"?next={next_url}") elif method == 'POST': req = self.request.post(settings.LOGIN_URL, {'next': next_url}) - req.META["HTTP_ACCEPT"] = "text/html" + req.META["HTTP_ACCEPT"] = "text/html" # pylint: disable=possibly-used-before-assignment self._add_session(req) next_page = get_next_url_for_login_page(req) assert next_page == expected_url @@ -129,7 +129,7 @@ def validate_login(): with override_settings(FEATURES=dict(settings.FEATURES, THIRD_PARTY_AUTH_HINT=tpa_hint)): validate_login() - with with_site_configuration_context(configuration=dict(THIRD_PARTY_AUTH_HINT=tpa_hint)): + with with_site_configuration_context(configuration={"THIRD_PARTY_AUTH_HINT": tpa_hint}): validate_login() @skip_unless_lms diff --git a/common/djangoapps/student/tests/test_parental_controls.py b/common/djangoapps/student/tests/test_parental_controls.py index 4e49f88af992..62cd30707d5a 100644 --- a/common/djangoapps/student/tests/test_parental_controls.py +++ b/common/djangoapps/student/tests/test_parental_controls.py @@ -59,7 +59,7 @@ def test_child_user(self): self.set_year_of_birth(current_year - 13) assert self.profile.requires_parental_consent() assert self.profile.requires_parental_consent(year=current_year) - assert not self.profile.requires_parental_consent(year=(current_year + 1)) + assert not self.profile.requires_parental_consent(year=current_year + 1) # Verify for a child born 14 years ago self.set_year_of_birth(current_year - 14) diff --git a/common/djangoapps/student/tests/test_receivers.py b/common/djangoapps/student/tests/test_receivers.py index e987120a9d67..3e6d981c5182 100644 --- a/common/djangoapps/student/tests/test_receivers.py +++ b/common/djangoapps/student/tests/test_receivers.py @@ -64,7 +64,7 @@ def test_listen_for_verified_name_approved(self): # Send a VERIFIED_NAME_APPROVED signal where the profile name matches the name # change request - VERIFIED_NAME_APPROVED.send(sender=None, user_id=user.id, profile_name=new_name) + VERIFIED_NAME_APPROVED.send(sender=None, user_id=user.id, profile_name=new_name) # pylint: disable=possibly-used-before-assignment # Assert that the pending name change was deleted and the profile name was updated assert PendingNameChange.objects.count() == 0 diff --git a/common/djangoapps/student/tests/test_views.py b/common/djangoapps/student/tests/test_views.py index 16bab13b90e7..8728ae8a2e79 100644 --- a/common/djangoapps/student/tests/test_views.py +++ b/common/djangoapps/student/tests/test_views.py @@ -51,8 +51,8 @@ TOMORROW = now() + timedelta(days=1) ONE_WEEK_AGO = now() - timedelta(weeks=1) -THREE_YEARS_FROM_NOW = now() + timedelta(days=(365 * 3)) -THREE_YEARS_AGO = now() - timedelta(days=(365 * 3)) +THREE_YEARS_FROM_NOW = now() + timedelta(days=365 * 3) +THREE_YEARS_AGO = now() - timedelta(days=365 * 3) # Name of the method to mock for Content Type Gating. GATING_METHOD_NAME = 'openedx.features.content_type_gating.models.ContentTypeGatingConfig.enabled_for_enrollment' @@ -869,13 +869,13 @@ def test_dashboard_with_resume_buttons_and_view_buttons(self): html_for_view_buttons.append( self._get_html_for_view_course_button( course_key_string, - course_run_string + course_run_string # pylint: disable=possibly-used-before-assignment ) ) html_for_resume_buttons.append( self._get_html_for_resume_course_button( course_key_string, - last_completed_block_string, + last_completed_block_string, # pylint: disable=possibly-used-before-assignment course_run_string ) ) diff --git a/common/djangoapps/third_party_auth/api/tests/test_permissions.py b/common/djangoapps/third_party_auth/api/tests/test_permissions.py index 1cb9450c49a2..4743fd3acc30 100644 --- a/common/djangoapps/third_party_auth/api/tests/test_permissions.py +++ b/common/djangoapps/third_party_auth/api/tests/test_permissions.py @@ -34,7 +34,7 @@ def _create_user(self, is_superuser=False, is_staff=False): def _create_request(self, auth_header=None): url = '/' - extra = dict(HTTP_AUTHORIZATION=auth_header) if auth_header else {} + extra = {"HTTP_AUTHORIZATION": auth_header} if auth_header else {} return RequestFactory().get(url, **extra) def _create_session(self, request, user): @@ -65,16 +65,9 @@ def test_session_with_user_permission(self, is_superuser, is_staff, expected_sta @ddt.data( # unrestricted (for example, jwt cookies) - dict( - is_restricted=False, - expected_response=403, - ), - + {"is_restricted": False, "expected_response": 403}, # restricted (note: further test cases for scopes and filters are in tests below) - dict( - is_restricted=True, - expected_response=403, - ), + {"is_restricted": True, "expected_response": 403}, ) @ddt.unpack def test_jwt_without_scopes_and_filters( @@ -94,12 +87,12 @@ def test_jwt_without_scopes_and_filters( @ddt.data( # valid scopes - dict(scopes=['tpa:read'], expected_response=200), - dict(scopes=['tpa:read', 'another_scope'], expected_response=200), + {"scopes": ['tpa:read'], "expected_response": 200}, + {"scopes": ['tpa:read', 'another_scope'], "expected_response": 200}, # invalid scopes - dict(scopes=[], expected_response=403), - dict(scopes=['another_scope'], expected_response=403), + {"scopes": [], "expected_response": 403}, + {"scopes": ['another_scope'], "expected_response": 403}, ) @ddt.unpack def test_jwt_scopes(self, scopes, expected_response): @@ -111,20 +104,20 @@ def test_jwt_scopes(self, scopes, expected_response): @ddt.data( # valid provider filters - dict( - filters=['tpa_provider:some_tpa_provider', 'tpa_provider:another_tpa_provider'], - expected_response=200, - ), + { + "filters": ["tpa_provider:some_tpa_provider", "tpa_provider:another_tpa_provider"], + "expected_response": 200, + }, # invalid provider filters - dict( - filters=['tpa_provider:another_tpa_provider'], - expected_response=403, - ), - dict( - filters=[], - expected_response=403, - ), + { + "filters": ["tpa_provider:another_tpa_provider"], + "expected_response": 403, + }, + { + "filters": [], + "expected_response": 403, + }, ) @ddt.unpack def test_jwt_org_filters(self, filters, expected_response): diff --git a/common/djangoapps/third_party_auth/api/tests/test_views.py b/common/djangoapps/third_party_auth/api/tests/test_views.py index aea4c18367e6..948314a0672f 100644 --- a/common/djangoapps/third_party_auth/api/tests/test_views.py +++ b/common/djangoapps/third_party_auth/api/tests/test_views.py @@ -60,7 +60,7 @@ def setUp(self): # pylint: disable=arguments-differ # Create several users and link each user to Google and TestShib for username in LINKED_USERS: - make_superuser = (username == ADMIN_USERNAME) + make_superuser = username == ADMIN_USERNAME make_staff = (username == STAFF_USERNAME) or make_superuser user = UserFactory.create( username=username, diff --git a/common/djangoapps/third_party_auth/lti.py b/common/djangoapps/third_party_auth/lti.py index 3895c888661c..496b7dcbbbab 100644 --- a/common/djangoapps/third_party_auth/lti.py +++ b/common/djangoapps/third_party_auth/lti.py @@ -177,7 +177,7 @@ def safe_int(value): # As this must take constant time, do not use shortcutting operators such as 'and'. # Instead, use constant time operators such as '&', which is the bitwise and. - valid = (lti_consumer_valid) + valid = lti_consumer_valid valid = valid & (submitted_signature == computed_signature) valid = valid & (request.oauth_version == '1.0') valid = valid & (request.oauth_signature_method == 'HMAC-SHA1') diff --git a/common/djangoapps/third_party_auth/models.py b/common/djangoapps/third_party_auth/models.py index 6d244d96eddd..1dbe8611f5bc 100644 --- a/common/djangoapps/third_party_auth/models.py +++ b/common/djangoapps/third_party_auth/models.py @@ -879,7 +879,7 @@ def get_config(self): conf['x509certMulti'] = {'signing': public_keys} conf['x509cert'] = '' - conf['url'] = sso_url + conf['url'] = sso_url # pylint: disable=possibly-used-before-assignment # Add SAMLConfiguration appropriate for this IdP conf['saml_sp_configuration'] = ( diff --git a/common/djangoapps/third_party_auth/pipeline.py b/common/djangoapps/third_party_auth/pipeline.py index 8e688208af19..c7e8264da9a4 100644 --- a/common/djangoapps/third_party_auth/pipeline.py +++ b/common/djangoapps/third_party_auth/pipeline.py @@ -790,7 +790,7 @@ def associate_by_email_if_enterprise_user(): they should not be prompted for their edX password. """ try: - enterprise_customer_user = is_enterprise_customer_user(current_provider.provider_id, current_user) + enterprise_customer_user = is_enterprise_customer_user(current_provider.provider_id, current_user) # pylint: disable=possibly-used-before-assignment logger.info( '[Multiple_SSO_SAML_Accounts_Association_to_User] Enterprise user verification:' 'User Email: {email}, User ID: {user_id}, Provider ID: {provider_id},' diff --git a/common/djangoapps/track/views/segmentio.py b/common/djangoapps/track/views/segmentio.py index 2ab5306232c5..8c022211ad1c 100644 --- a/common/djangoapps/track/views/segmentio.py +++ b/common/djangoapps/track/views/segmentio.py @@ -205,9 +205,9 @@ def track_segmentio_event(request): # pylint: disable=too-many-statements raise EventValidationError(ERROR_USER_NOT_EXIST) # lint-amnesty, pylint: disable=raise-missing-from except ValueError: raise EventValidationError(ERROR_INVALID_USER_ID) # lint-amnesty, pylint: disable=raise-missing-from - else: - context['user_id'] = user.id - context['username'] = user.username + + context['user_id'] = user.id + context['username'] = user.username # course_id is expected to be provided in the context when applicable course_id = context.get('course_id') diff --git a/lms/djangoapps/discussion/django_comment_client/base/views.py b/lms/djangoapps/discussion/django_comment_client/base/views.py index e3e52a5400a4..8c8e984cda3d 100644 --- a/lms/djangoapps/discussion/django_comment_client/base/views.py +++ b/lms/djangoapps/discussion/django_comment_client/base/views.py @@ -157,7 +157,7 @@ def track_created_event(request, event_name, course, obj, data): def add_truncated_title_to_event_data(event_data, full_title): - event_data['title_truncated'] = (len(full_title) > TRACKING_MAX_FORUM_TITLE) + event_data['title_truncated'] = len(full_title) > TRACKING_MAX_FORUM_TITLE event_data['title'] = full_title[:TRACKING_MAX_FORUM_TITLE] diff --git a/lms/djangoapps/discussion/rest_api/api.py b/lms/djangoapps/discussion/rest_api/api.py index 19ccf26d19a4..c1e2ff44a13a 100644 --- a/lms/djangoapps/discussion/rest_api/api.py +++ b/lms/djangoapps/discussion/rest_api/api.py @@ -866,7 +866,7 @@ def _serialize_discussion_entities(request, context, discussion_entities, reques serialized_entity = ThreadSerializer(entity, context=context).data elif discussion_entity_type == DiscussionEntity.comment: serialized_entity = CommentSerializer(entity, context=context).data - results.append(serialized_entity) + results.append(serialized_entity) # pylint: disable=possibly-used-before-assignment if include_profile_image: if serialized_entity['author'] and serialized_entity['author'] not in usernames: @@ -1010,7 +1010,7 @@ def get_thread_list( if view in ["unread", "unanswered", "unresponded"]: query_params[view] = "true" else: - ValidationError({ + raise ValidationError({ "view": [f"Invalid value. '{view}' must be 'unread' or 'unanswered'"] }) diff --git a/lms/djangoapps/discussion/rest_api/tests/test_api.py b/lms/djangoapps/discussion/rest_api/tests/test_api.py index 9a9041fd5fa4..96370d5d997f 100644 --- a/lms/djangoapps/discussion/rest_api/tests/test_api.py +++ b/lms/djangoapps/discussion/rest_api/tests/test_api.py @@ -4137,7 +4137,7 @@ def setUp(self) -> None: parent_location=self.sequential.location, category='vertical', display_name='staff-vertical-1', - metadata=dict(visible_to_staff_only=True), + metadata={"visible_to_staff_only": True}, ) self.course_key = course_key = self.course.id self.config = DiscussionsConfiguration.objects.create(context_key=course_key, provider_type=Provider.OPEN_EDX) @@ -4178,10 +4178,21 @@ def setUp(self) -> None: # Set up topic stats for all topics, but have one deleted topic # and one active topic return zero stats for testing. self.topic_stats = { - **{topic_id: dict(discussion=random.randint(0, 10), question=random.randint(0, 10)) - for topic_id in self.all_topic_ids}, - deleted_topic_ids[0]: dict(discussion=0, question=0), - self.topic_ids[0]: dict(discussion=0, question=0), + **{ + topic_id: { + 'discussion': random.randint(0, 10), + 'question': random.randint(0, 10) + } + for topic_id in self.all_topic_ids + }, + deleted_topic_ids[0]: { + 'discussion': 0, + 'question': 0 + }, + self.topic_ids[0]: { + 'discussion': 0, + 'question': 0 + }, } patcher = mock.patch( 'lms.djangoapps.discussion.rest_api.api.get_course_commentable_counts', diff --git a/lms/djangoapps/discussion/rest_api/tests/test_views.py b/lms/djangoapps/discussion/rest_api/tests/test_views.py index 283117000712..3a70279a3ebf 100644 --- a/lms/djangoapps/discussion/rest_api/tests/test_views.py +++ b/lms/djangoapps/discussion/rest_api/tests/test_views.py @@ -977,9 +977,9 @@ def setUp(self) -> None: topic_ids = list(topic_id_query.order_by('ordering')) DiscussionTopicLink.objects.bulk_create(topic_links) self.topic_stats = { - **{topic_id: dict(discussion=random.randint(0, 10), question=random.randint(0, 10)) + **{topic_id: {"discussion": random.randint(0, 10), "question": random.randint(0, 10)} for topic_id in set(topic_ids)}, - topic_ids[0]: dict(discussion=0, question=0), + topic_ids[0]: {"discussion": 0, "question": 0}, } patcher = mock.patch( 'lms.djangoapps.discussion.rest_api.api.get_course_commentable_counts', diff --git a/lms/djangoapps/discussion/rest_api/views.py b/lms/djangoapps/discussion/rest_api/views.py index 2b0bf8c41e5b..aafdc59876d2 100644 --- a/lms/djangoapps/discussion/rest_api/views.py +++ b/lms/djangoapps/discussion/rest_api/views.py @@ -1320,7 +1320,7 @@ class CourseDiscussionSettingsAPIView(DeveloperErrorViewMixin, APIView): permission_classes = (permissions.IsAuthenticated, IsStaffOrAdmin) def _get_request_kwargs(self, course_id): - return dict(course_id=course_id) + return {"course_id": course_id} def get(self, request, course_id): """ @@ -1443,7 +1443,7 @@ class CourseDiscussionRolesAPIView(DeveloperErrorViewMixin, APIView): permission_classes = (permissions.IsAuthenticated, permissions.IsAdminUser) def _get_request_kwargs(self, course_id, rolename): - return dict(course_id=course_id, rolename=rolename) + return {"course_id": course_id, "rolename": rolename} def get(self, request, course_id, rolename): """ diff --git a/lms/djangoapps/discussion/tasks.py b/lms/djangoapps/discussion/tasks.py index 3fef4f5f7cef..d483388f54ae 100644 --- a/lms/djangoapps/discussion/tasks.py +++ b/lms/djangoapps/discussion/tasks.py @@ -120,8 +120,6 @@ def send_ace_message(context): # lint-amnesty, pylint: disable=missing-function log.info('Sending forum comment notification with context %s', message_context) ace.send(message, limit_to_channels=[ChannelType.PUSH]) _track_notification_sent(message, context) - else: - return @shared_task(base=LoggedTask) diff --git a/lms/djangoapps/discussion/tests/test_signals.py b/lms/djangoapps/discussion/tests/test_signals.py index d61b706292cf..38731bfd6f43 100644 --- a/lms/djangoapps/discussion/tests/test_signals.py +++ b/lms/djangoapps/discussion/tests/test_signals.py @@ -85,7 +85,7 @@ class CoursePublishHandlerTestCase(ModuleStoreTestCase): ENABLED_SIGNALS = ['course_published'] def test_discussion_id_map_updates_on_publish(self): - course_key_args = dict(org='org', course='number', run='run') + course_key_args = {"org": 'org', "course": 'number', "run": 'run'} course_key = self.store.make_course_key(**course_key_args) # create course diff --git a/lms/djangoapps/discussion/tests/test_views.py b/lms/djangoapps/discussion/tests/test_views.py index e0d3b869da3d..0ca917cb0a5c 100644 --- a/lms/djangoapps/discussion/tests/test_views.py +++ b/lms/djangoapps/discussion/tests/test_views.py @@ -555,7 +555,7 @@ def call_single_thread(): """ Call single_thread and assert that it returns what we expect. """ - with patch.dict("django.conf.settings.FEATURES", dict(ENABLE_ENTERPRISE_INTEGRATION=enterprise_enabled)): + with patch.dict("django.conf.settings.FEATURES", {"ENABLE_ENTERPRISE_INTEGRATION": enterprise_enabled}): response = views.single_thread( request, str(course.id), @@ -1884,9 +1884,9 @@ def test_consent_required(self, mock_enterprise_customer_for_request, mock_reque for url in ( reverse('forum_form_discussion', - kwargs=dict(course_id=course_id)), + kwargs={"course_id": course_id}), reverse('single_thread', - kwargs=dict(course_id=course_id, discussion_id=self.discussion_id, thread_id=thread_id)), + kwargs={"course_id": course_id, "discussion_id": self.discussion_id, "thread_id": thread_id}), ): self.verify_consent_required(self.client, url) # pylint: disable=no-value-for-parameter diff --git a/lms/djangoapps/edxnotes/helpers.py b/lms/djangoapps/edxnotes/helpers.py index 17705f835e9d..be7f7bbb8d65 100644 --- a/lms/djangoapps/edxnotes/helpers.py +++ b/lms/djangoapps/edxnotes/helpers.py @@ -164,7 +164,7 @@ def preprocess_collection(user, course, collection): store = modulestore() filtered_collection = [] cache = {} - include_path_info = ('course_structure' not in settings.NOTES_DISABLED_TABS) + include_path_info = 'course_structure' not in settings.NOTES_DISABLED_TABS with store.bulk_operations(course.id): for model in collection: update = { diff --git a/lms/djangoapps/edxnotes/views.py b/lms/djangoapps/edxnotes/views.py index 3e23ebe9ab47..6c2d99224c6b 100644 --- a/lms/djangoapps/edxnotes/views.py +++ b/lms/djangoapps/edxnotes/views.py @@ -57,7 +57,7 @@ def edxnotes(request, course_id): raise Http404 notes_info = get_notes(request, course) - has_notes = (len(notes_info.get('results')) > 0) + has_notes = len(notes_info.get('results')) > 0 context = { "course": course, "notes_endpoint": reverse("notes", kwargs={"course_id": course_id}), diff --git a/lms/djangoapps/experiments/flags.py b/lms/djangoapps/experiments/flags.py index b83a7751fae7..3b45bcee5b5c 100644 --- a/lms/djangoapps/experiments/flags.py +++ b/lms/djangoapps/experiments/flags.py @@ -245,7 +245,7 @@ def get_bucket(self, course_key=None, track=True): if ( track and hasattr(request, 'session') and session_key not in request.session and - not masquerading_as_specific_student and not anonymous + not masquerading_as_specific_student and not anonymous # pylint: disable=used-before-assignment ): segment.track( user_id=user.id, diff --git a/lms/djangoapps/grades/management/commands/compute_grades.py b/lms/djangoapps/grades/management/commands/compute_grades.py index a1ead12d7fd3..245a593ba281 100644 --- a/lms/djangoapps/grades/management/commands/compute_grades.py +++ b/lms/djangoapps/grades/management/commands/compute_grades.py @@ -139,7 +139,7 @@ def _set_log_level(self, options): log_level = logging.WARNING elif options.get('verbosity') >= 1: log_level = logging.INFO - log.setLevel(log_level) + log.setLevel(log_level) # pylint: disable=possibly-used-before-assignment def _latest_settings(self): """ diff --git a/lms/djangoapps/grades/rest_api/v1/gradebook_views.py b/lms/djangoapps/grades/rest_api/v1/gradebook_views.py index 26df7ce2583d..86fe689d65f2 100644 --- a/lms/djangoapps/grades/rest_api/v1/gradebook_views.py +++ b/lms/djangoapps/grades/rest_api/v1/gradebook_views.py @@ -504,7 +504,7 @@ def _gradebook_entry(self, user, course, graded_subsections, course_grade): user_entry['section_breakdown'] = breakdown user_entry['progress_page_url'] = reverse( 'student_progress', - kwargs=dict(course_id=str(course.id), student_id=user.id) + kwargs={"course_id": str(course.id), "student_id": user.id} ) user_entry['user_id'] = user.id @@ -642,10 +642,7 @@ def get(self, request, course_key): # lint-amnesty, pylint: disable=too-many-st q_objects.append(q_object) if request.GET.get('excluded_course_roles'): excluded_course_roles = request.GET.getlist('excluded_course_roles') - course_access_role_filters = dict( - user=OuterRef('user'), - course_id=course_key, - ) + course_access_role_filters = {"user": OuterRef('user'), "course_id": course_key} if 'all' not in excluded_course_roles: course_access_role_filters['role__in'] = excluded_course_roles annotations['has_excluded_role'] = Exists( @@ -919,19 +916,19 @@ def _create_override(self, request_user, subsection_grade_model, **override_data create_new_event_transaction_id() recalculate_subsection_grade_v3.apply( - kwargs=dict( - user_id=subsection_grade_model.user_id, - anonymous_user_id=None, - course_id=str(subsection_grade_model.course_id), - usage_id=str(subsection_grade_model.usage_key), - only_if_higher=False, - expected_modified_time=to_timestamp(override.modified), - score_deleted=False, - event_transaction_id=str(get_event_transaction_id()), - event_transaction_type=str(get_event_transaction_type()), - score_db_table=grades_constants.ScoreDatabaseTableEnum.overrides, - force_update_subsections=True, - ) + kwargs={ + "user_id": subsection_grade_model.user_id, + "anonymous_user_id": None, + "course_id": str(subsection_grade_model.course_id), + "usage_id": str(subsection_grade_model.usage_key), + "only_if_higher": False, + "expected_modified_time": to_timestamp(override.modified), + "score_deleted": False, + "event_transaction_id": str(get_event_transaction_id()), + "event_transaction_type": str(get_event_transaction_type()), + "score_db_table": grades_constants.ScoreDatabaseTableEnum.overrides, + "force_update_subsections": True, + } ) # Emit events to let our tracking system to know we updated subsection grade grades_events.subsection_grade_calculated(subsection_grade_model) diff --git a/lms/djangoapps/grades/signals/handlers.py b/lms/djangoapps/grades/signals/handlers.py index 58c5fb90aace..1548ed528eea 100644 --- a/lms/djangoapps/grades/signals/handlers.py +++ b/lms/djangoapps/grades/signals/handlers.py @@ -234,19 +234,19 @@ def enqueue_subsection_update(sender, **kwargs): # pylint: disable=unused-argum if not context_key.is_course: return # If it's not a course, it has no subsections, so skip the subsection grading update recalculate_subsection_grade_v3.apply_async( - kwargs=dict( - user_id=kwargs['user_id'], - anonymous_user_id=kwargs.get('anonymous_user_id'), - course_id=kwargs['course_id'], - usage_id=kwargs['usage_id'], - only_if_higher=kwargs.get('only_if_higher'), - expected_modified_time=to_timestamp(kwargs['modified']), - score_deleted=kwargs.get('score_deleted', False), - event_transaction_id=str(get_event_transaction_id()), - event_transaction_type=str(get_event_transaction_type()), - score_db_table=kwargs['score_db_table'], - force_update_subsections=kwargs.get('force_update_subsections', False), - ), + kwargs={ + "user_id": kwargs["user_id"], + "anonymous_user_id": kwargs.get("anonymous_user_id"), + "course_id": kwargs["course_id"], + "usage_id": kwargs["usage_id"], + "only_if_higher": kwargs.get("only_if_higher"), + "expected_modified_time": to_timestamp(kwargs["modified"]), + "score_deleted": kwargs.get("score_deleted", False), + "event_transaction_id": str(get_event_transaction_id()), + "event_transaction_type": str(get_event_transaction_type()), + "score_db_table": kwargs["score_db_table"], + "force_update_subsections": kwargs.get("force_update_subsections", False), + }, countdown=RECALCULATE_GRADE_DELAY_SECONDS, ) @@ -269,10 +269,7 @@ def recalculate_course_and_subsection_grades(sender, user, course_key, countdown """ recalculate_course_and_subsection_grades_for_user.apply_async( countdown=countdown, - kwargs=dict( - user_id=user.id, - course_key=str(course_key) - ) + kwargs={"user_id": user.id, "course_key": str(course_key)} ) diff --git a/lms/djangoapps/grades/subsection_grade.py b/lms/djangoapps/grades/subsection_grade.py index ba098a92a417..9442d837a036 100644 --- a/lms/djangoapps/grades/subsection_grade.py +++ b/lms/djangoapps/grades/subsection_grade.py @@ -361,18 +361,18 @@ def _persisted_model_params(self, student): Returns the parameters for creating/updating the persisted model for this subsection grade. """ - return dict( - user_id=student.id, - usage_key=self.location, - course_version=self.course_version, - subtree_edited_timestamp=self.subtree_edited_timestamp, - earned_all=self.all_total.earned, - possible_all=self.all_total.possible, - earned_graded=self.graded_total.earned, - possible_graded=self.graded_total.possible, - visible_blocks=self._get_visible_blocks, - first_attempted=self.all_total.first_attempted, - ) + return { + "user_id": student.id, + "usage_key": self.location, + "course_version": self.course_version, + "subtree_edited_timestamp": self.subtree_edited_timestamp, + "earned_all": self.all_total.earned, + "possible_all": self.all_total.possible, + "earned_graded": self.graded_total.earned, + "possible_graded": self.graded_total.possible, + "visible_blocks": self._get_visible_blocks, + "first_attempted": self.all_total.first_attempted, + } @property def _get_visible_blocks(self): diff --git a/lms/djangoapps/grades/tests/test_course_data.py b/lms/djangoapps/grades/tests/test_course_data.py index d71858312171..60f69201efee 100644 --- a/lms/djangoapps/grades/tests/test_course_data.py +++ b/lms/djangoapps/grades/tests/test_course_data.py @@ -67,10 +67,10 @@ def test_properties(self): ) for kwargs in [ - dict(course=self.course), - dict(collected_block_structure=self.one_true_structure), - dict(structure=self.one_true_structure), - dict(course_key=self.course.id), + {"course": self.course}, + {"collected_block_structure": self.one_true_structure}, + {"structure": self.one_true_structure}, + {"course_key": self.course.id}, ]: course_data = CourseData(self.user, **kwargs) assert course_data.course_key == self.course.id diff --git a/lms/djangoapps/grades/tests/utils.py b/lms/djangoapps/grades/tests/utils.py index 9111820379b4..31520cc58b0f 100644 --- a/lms/djangoapps/grades/tests/utils.py +++ b/lms/djangoapps/grades/tests/utils.py @@ -19,13 +19,13 @@ def mock_passing_grade(letter_grade='Pass', percent=0.75, last_updated=None): """ Mock the grading function to always return a passing grade. """ - passing_grade_fields = dict( - letter_grade=letter_grade, - percent=percent, - passed=letter_grade is not None, - attempted=True, - last_updated=last_updated, - ) + passing_grade_fields = { + "letter_grade": letter_grade, + "percent": percent, + "passed": letter_grade is not None, + "attempted": True, + "last_updated": last_updated, + } with patch('lms.djangoapps.grades.course_grade_factory.CourseGradeFactory.read') as mock_grade_read: mock_grade_read.return_value = MagicMock(**passing_grade_fields) with patch('lms.djangoapps.grades.course_grade.CourseGrade.update') as mock_grade_update: diff --git a/lms/djangoapps/instructor/tests/test_certificates.py b/lms/djangoapps/instructor/tests/test_certificates.py index b24ef618c7ce..dffa5e97d8b0 100644 --- a/lms/djangoapps/instructor/tests/test_certificates.py +++ b/lms/djangoapps/instructor/tests/test_certificates.py @@ -405,21 +405,21 @@ def setUp(self): course_id=self.course.id, ) - self.certificate_exception = dict( - created="", - notes="Test Notes for Test Certificate Exception", - user_email='', - user_id='', - user_name=str(self.user.username) - ) - - self.certificate_exception_in_db = dict( - id=certificate_allowlist_item.id, - user_name=certificate_allowlist_item.user.username, - notes=certificate_allowlist_item.notes, - user_email=certificate_allowlist_item.user.email, - user_id=certificate_allowlist_item.user.id, - ) + self.certificate_exception = { + "created": "", + "notes": "Test Notes for Test Certificate Exception", + "user_email": '', + "user_id": '', + "user_name": str(self.user.username) + } + + self.certificate_exception_in_db = { + "id": certificate_allowlist_item.id, + "user_name": certificate_allowlist_item.user.username, + "notes": certificate_allowlist_item.notes, + "user_email": certificate_allowlist_item.user.email, + "user_id": certificate_allowlist_item.user.id, + } # Enable certificate generation cache.clear() @@ -706,13 +706,13 @@ def setUp(self): course_id=self.course.id, ) - self.certificate_exception = dict( - id=certificate_exception.id, - user_name=certificate_exception.user.username, - notes=certificate_exception.notes, - user_email=certificate_exception.user.email, - user_id=certificate_exception.user.id, - ) + self.certificate_exception = { + "id": certificate_exception.id, + "user_name": certificate_exception.user.username, + "notes": certificate_exception.notes, + "user_email": certificate_exception.user.email, + "user_id": certificate_exception.user.id, + } # Enable certificate generation cache.clear() @@ -1025,10 +1025,10 @@ def setUp(self): mode='honor', ) - self.certificate_invalidation_data = dict( - user=self.enrolled_user_1.username, - notes=self.notes, - ) + self.certificate_invalidation_data = { + "user": self.enrolled_user_1.username, + "notes": self.notes, + } # Global staff can see the certificates section self.client.login(username=self.global_staff.username, password=self.TEST_PASSWORD) diff --git a/lms/djangoapps/instructor/views/api.py b/lms/djangoapps/instructor/views/api.py index f27ffc32dbdb..50eee3676d26 100644 --- a/lms/djangoapps/instructor/views/api.py +++ b/lms/djangoapps/instructor/views/api.py @@ -477,7 +477,7 @@ def post(self, request, course_id): # pylint: disable=too-many-statements }) course_mode = default_course_mode - email_params = get_email_params(course, True, secure=request.is_secure()) + email_params = get_email_params(course, True, secure=request.is_secure()) # pylint: disable=possibly-used-before-assignment try: validate_email(email) # Raises ValidationError if invalid except ValidationError: @@ -2630,8 +2630,13 @@ def _list_report_downloads(request, course_id): response_payload = { 'downloads': [ - dict(name=name, url=url, link=HTML('{}').format(HTML(url), Text(name))) - for name, url in report_store.links_for(course_id) if report_name is None or name == report_name + { + 'name': name, + 'url': url, + 'link': HTML('{}').format(HTML(url), Text(name)) + } + for name, url in report_store.links_for(course_id) + if report_name is None or name == report_name ] } return JsonResponse(response_payload) @@ -2651,7 +2656,11 @@ def list_financial_report_downloads(_request, course_id): response_payload = { 'downloads': [ - dict(name=name, url=url, link=HTML('{}').format(HTML(url), Text(name))) + { + 'name': name, + 'url': url, + 'link': HTML('{}').format(HTML(url), Text(name)) + } for name, url in report_store.links_for(course_id) ] } @@ -3225,7 +3234,7 @@ def enable_certificate_generation(request, course_id=None): """ course_key = CourseKey.from_string(course_id) - is_enabled = (request.POST.get('certificates-enabled', 'false') == 'true') + is_enabled = request.POST.get('certificates-enabled', 'false') == 'true' certs_api.set_cert_generation_enabled(course_key, is_enabled) return redirect(_instructor_dash_url(course_key, section='certificates')) diff --git a/lms/djangoapps/instructor/views/gradebook_api.py b/lms/djangoapps/instructor/views/gradebook_api.py index b4de0b73e627..9a3c81f977e7 100644 --- a/lms/djangoapps/instructor/views/gradebook_api.py +++ b/lms/djangoapps/instructor/views/gradebook_api.py @@ -44,7 +44,7 @@ def calculate_page_info(offset, total_students): previous_offset = offset - MAX_STUDENTS_PER_PAGE_GRADE_BOOK # calculate current page number. - page_num = ((offset / MAX_STUDENTS_PER_PAGE_GRADE_BOOK) + 1) + page_num = (offset / MAX_STUDENTS_PER_PAGE_GRADE_BOOK) + 1 # calculate total number of pages. total_pages = int(math.ceil(float(total_students) / MAX_STUDENTS_PER_PAGE_GRADE_BOOK)) or 1 diff --git a/lms/djangoapps/instructor_analytics/distributions.py b/lms/djangoapps/instructor_analytics/distributions.py index 1a91771a2fa2..b1553a72f4cf 100644 --- a/lms/djangoapps/instructor_analytics/distributions.py +++ b/lms/djangoapps/instructor_analytics/distributions.py @@ -111,7 +111,7 @@ def profile_distribution(course_id, feature): raw_choices = UserProfile.LEVEL_OF_EDUCATION_CHOICES # short name and display name (full) of the choices. - choices = list(raw_choices) + [('no_data', 'No Data')] + choices = list(raw_choices) + [('no_data', 'No Data')] # pylint: disable=possibly-used-before-assignment def get_filter(feature, value): """ Get the orm filter parameters for a feature. """ diff --git a/lms/djangoapps/instructor_task/api.py b/lms/djangoapps/instructor_task/api.py index 62095c3ae3aa..1e61c8772eeb 100644 --- a/lms/djangoapps/instructor_task/api.py +++ b/lms/djangoapps/instructor_task/api.py @@ -388,7 +388,7 @@ def submit_calculate_students_features_csv(request, course_key, features, **task """ task_type = InstructorTaskTypes.PROFILE_INFO_CSV task_class = calculate_students_features_csv - task_input = dict(features=features, **task_kwargs) + task_input = {"features": features, **task_kwargs} task_key = "" return submit_task(request, task_type, task_class, course_key, task_input, task_key) diff --git a/lms/djangoapps/instructor_task/tasks_helper/module_state.py b/lms/djangoapps/instructor_task/tasks_helper/module_state.py index 53e22feb236e..0af890137191 100644 --- a/lms/djangoapps/instructor_task/tasks_helper/module_state.py +++ b/lms/djangoapps/instructor_task/tasks_helper/module_state.py @@ -174,21 +174,13 @@ def rescore_problem_module_state(xblock_instance_args, block, student_module, ta TASK_LOG.exception( "error processing rescore call for course %(course)s, problem %(loc)s " "and student %(student)s", - dict( - course=course_id, - loc=usage_key, - student=student - ) + {"course": course_id, "loc": usage_key, "student": student} ) except StudentInputError: TASK_LOG.warning( "error processing rescore call for course %(course)s, problem %(loc)s " "and student %(student)s", - dict( - course=course_id, - loc=usage_key, - student=student - ) + {"course": course_id, "loc": usage_key, "student": student} ) return UPDATE_STATUS_FAILED @@ -196,11 +188,7 @@ def rescore_problem_module_state(xblock_instance_args, block, student_module, ta TASK_LOG.debug( "successfully processed rescore call for course %(course)s, problem %(loc)s " "and student %(student)s", - dict( - course=course_id, - loc=usage_key, - student=student - ) + {"course": course_id, "loc": usage_key, "student": student} ) return UPDATE_STATUS_SUCCEEDED @@ -276,11 +264,7 @@ def override_score_module_state(xblock_instance_args, block, student_module, tas TASK_LOG.debug( "successfully processed score override for course %(course)s, problem %(loc)s " "and student %(student)s", - dict( - course=course_id, - loc=usage_key, - student=student - ) + {"course": course_id, "loc": usage_key, "student": student} ) return UPDATE_STATUS_SUCCEEDED diff --git a/lms/djangoapps/instructor_task/tests/test_integration.py b/lms/djangoapps/instructor_task/tests/test_integration.py index 004cba1cdacc..02fafeeb99b5 100644 --- a/lms/djangoapps/instructor_task/tests/test_integration.py +++ b/lms/djangoapps/instructor_task/tests/test_integration.py @@ -199,11 +199,12 @@ def verify_rescore_results(self, problem_edit, new_expected_scores, new_expected RescoreTestData = namedtuple('RescoreTestData', 'edit, new_expected_scores, new_expected_max') @ddt.data( - RescoreTestData(edit=dict(correct_answer=OPTION_2), new_expected_scores=(0, 1, 1, 2), new_expected_max=2), - RescoreTestData(edit=dict(num_inputs=2), new_expected_scores=(2, 1, 1, 0), new_expected_max=4), - RescoreTestData(edit=dict(num_inputs=4), new_expected_scores=(2, 1, 1, 0), new_expected_max=8), - RescoreTestData(edit=dict(num_responses=4), new_expected_scores=(2, 1, 1, 0), new_expected_max=4), - RescoreTestData(edit=dict(num_inputs=2, num_responses=4), new_expected_scores=(2, 1, 1, 0), new_expected_max=8), + RescoreTestData(edit={'correct_answer': OPTION_2}, new_expected_scores=(0, 1, 1, 2), new_expected_max=2), + RescoreTestData(edit={'num_inputs': 2}, new_expected_scores=(2, 1, 1, 0), new_expected_max=4), + RescoreTestData(edit={'num_inputs': 4}, new_expected_scores=(2, 1, 1, 0), new_expected_max=8), + RescoreTestData(edit={'num_responses': 4}, new_expected_scores=(2, 1, 1, 0), new_expected_max=4), + RescoreTestData(edit={ + 'num_inputs': 2, 'num_responses': 4}, new_expected_scores=(2, 1, 1, 0), new_expected_max=8), ) @ddt.unpack def test_rescoring_option_problem(self, problem_edit, new_expected_scores, new_expected_max): @@ -221,7 +222,7 @@ def test_rescoring_option_problem(self, problem_edit, new_expected_scores, new_e @ddt.data( RescoreTestData(edit={}, new_expected_scores=(2, 1, 1, 0), new_expected_max=2), - RescoreTestData(edit=dict(correct_answer=OPTION_2), new_expected_scores=(2, 1, 1, 2), new_expected_max=2), + RescoreTestData(edit={"correct_answer": OPTION_2}, new_expected_scores=(2, 1, 1, 2), new_expected_max=2), ) @ddt.unpack def test_rescoring_if_higher(self, problem_edit, new_expected_scores, new_expected_max): @@ -234,7 +235,7 @@ def test_rescoring_if_higher_scores_equal(self): Specifically tests rescore when the previous and new raw scores are equal. In this case, the scores should be updated. """ - problem_edit = dict(num_inputs=2) # this change to the problem means the problem will now have a max score of 4 + problem_edit = {"num_inputs": 2} # this change to the problem means the problem will now have a max score of 4 unchanged_max = 2 new_max = 4 problem_url_name = 'H1P1' diff --git a/lms/djangoapps/mfe_config_api/tests/test_views.py b/lms/djangoapps/mfe_config_api/tests/test_views.py index fef7574f5932..eb15c1698f0a 100644 --- a/lms/djangoapps/mfe_config_api/tests/test_views.py +++ b/lms/djangoapps/mfe_config_api/tests/test_views.py @@ -62,44 +62,40 @@ def test_get_mfe_config_with_queryparam(self, configuration_helpers_mock): @ddt.unpack @ddt.data( - dict( - mfe_config={}, - mfe_config_overrides={}, - expected_response={}, - ), - dict( - mfe_config={"EXAMPLE_VAR": "value"}, - mfe_config_overrides={}, - expected_response={"EXAMPLE_VAR": "value"}, - ), - dict( - mfe_config={}, - mfe_config_overrides={"mymfe": {"EXAMPLE_VAR": "mymfe_value"}}, - expected_response={"EXAMPLE_VAR": "mymfe_value"}, - ), - dict( - mfe_config={"EXAMPLE_VAR": "value"}, - mfe_config_overrides={"mymfe": {"EXAMPLE_VAR": "mymfe_value"}}, - expected_response={"EXAMPLE_VAR": "mymfe_value"}, - ), - dict( - mfe_config={"EXAMPLE_VAR": "value", "OTHER": "other"}, - mfe_config_overrides={"mymfe": {"EXAMPLE_VAR": "mymfe_value"}}, - expected_response={"EXAMPLE_VAR": "mymfe_value", "OTHER": "other"}, - ), - dict( - mfe_config={"EXAMPLE_VAR": "value"}, - mfe_config_overrides={"yourmfe": {"EXAMPLE_VAR": "yourmfe_value"}}, - expected_response={"EXAMPLE_VAR": "value"}, - ), - dict( - mfe_config={"EXAMPLE_VAR": "value"}, - mfe_config_overrides={ + {"mfe_config": {}, "mfe_config_overrides": {}, "expected_response": {}}, + { + "mfe_config": {"EXAMPLE_VAR": "value"}, + "mfe_config_overrides": {}, + "expected_response": {"EXAMPLE_VAR": "value"}, + }, + { + "mfe_config": {}, + "mfe_config_overrides": {"mymfe": {"EXAMPLE_VAR": "mymfe_value"}}, + "expected_response": {"EXAMPLE_VAR": "mymfe_value"}, + }, + { + "mfe_config": {"EXAMPLE_VAR": "value"}, + "mfe_config_overrides": {"mymfe": {"EXAMPLE_VAR": "mymfe_value"}}, + "expected_response": {"EXAMPLE_VAR": "mymfe_value"}, + }, + { + "mfe_config": {"EXAMPLE_VAR": "value", "OTHER": "other"}, + "mfe_config_overrides": {"mymfe": {"EXAMPLE_VAR": "mymfe_value"}}, + "expected_response": {"EXAMPLE_VAR": "mymfe_value", "OTHER": "other"}, + }, + { + "mfe_config": {"EXAMPLE_VAR": "value"}, + "mfe_config_overrides": {"yourmfe": {"EXAMPLE_VAR": "yourmfe_value"}}, + "expected_response": {"EXAMPLE_VAR": "value"}, + }, + { + "mfe_config": {"EXAMPLE_VAR": "value"}, + "mfe_config_overrides": { "yourmfe": {"EXAMPLE_VAR": "yourmfe_value"}, "mymfe": {"EXAMPLE_VAR": "mymfe_value"}, }, - expected_response={"EXAMPLE_VAR": "mymfe_value"}, - ), + "expected_response": {"EXAMPLE_VAR": "mymfe_value"}, + }, ) @patch("lms.djangoapps.mfe_config_api.views.configuration_helpers") def test_get_mfe_config_with_queryparam_multiple_configs( diff --git a/lms/djangoapps/mobile_api/course_info/views.py b/lms/djangoapps/mobile_api/course_info/views.py index 0a173863db13..d013ab2b98f8 100644 --- a/lms/djangoapps/mobile_api/course_info/views.py +++ b/lms/djangoapps/mobile_api/course_info/views.py @@ -181,11 +181,11 @@ def post(self, request, *args, **kwargs): log.warning('For this mobile request, user activity is not enabled for this user {} and course {}'.format( str(user_id), str(course_key)) ) - return Response(status=(200)) + return Response(status=200) # Populate user activity for tracking progress towards a user's course goals UserActivity.record_user_activity(user, course_key) - return Response(status=(200)) + return Response(status=200) @view_auth_classes(is_authenticated=False) diff --git a/lms/djangoapps/mobile_api/tests/test_course_info_views.py b/lms/djangoapps/mobile_api/tests/test_course_info_views.py index 56c020ec8fa3..38b470c6f3bd 100644 --- a/lms/djangoapps/mobile_api/tests/test_course_info_views.py +++ b/lms/djangoapps/mobile_api/tests/test_course_info_views.py @@ -306,7 +306,7 @@ def test_get_requested_user(self, user_role, username, expected_username, mock_g elif user_role == 'student': request_user = self.student_user - self.request.user = request_user + self.request.user = request_user # pylint: disable=possibly-used-before-assignment if expected_username == 'student_user': mock_user = self.student_user diff --git a/lms/djangoapps/mobile_api/users/tests.py b/lms/djangoapps/mobile_api/users/tests.py index 2cfefaa058d9..6b4df3373b74 100644 --- a/lms/djangoapps/mobile_api/users/tests.py +++ b/lms/djangoapps/mobile_api/users/tests.py @@ -110,7 +110,7 @@ class TestUserEnrollmentApi(UrlResetMixin, MobileAPITestCase, MobileAuthUserTest ALLOW_ACCESS_TO_NON_VISIBLE_COURSE = True NEXT_WEEK = datetime.datetime.now(pytz.UTC) + datetime.timedelta(days=7) LAST_WEEK = datetime.datetime.now(pytz.UTC) - datetime.timedelta(days=7) - THREE_YEARS_AGO = now() - datetime.timedelta(days=(365 * 3)) + THREE_YEARS_AGO = now() - datetime.timedelta(days=365 * 3) ADVERTISED_START = "Spring 2016" ENABLED_SIGNALS = ['course_published'] DATES = { diff --git a/lms/djangoapps/program_enrollments/management/commands/tests/test_send_program_course_nudge_email.py b/lms/djangoapps/program_enrollments/management/commands/tests/test_send_program_course_nudge_email.py index f5a6dcebb846..3c6aa3c42ecb 100644 --- a/lms/djangoapps/program_enrollments/management/commands/tests/test_send_program_course_nudge_email.py +++ b/lms/djangoapps/program_enrollments/management/commands/tests/test_send_program_course_nudge_email.py @@ -108,7 +108,7 @@ def enroll_user(self, user, course, create_grade=False): @patch('common.djangoapps.student.models.course_enrollment.segment.track') @patch('lms.djangoapps.program_enrollments.management.commands.send_program_course_nudge_email.get_programs') @patch('lms.djangoapps.certificates.api.certificates_viewable_for_course', return_value=True) - @override_settings(FEATURES=dict(ENABLE_ENTERPRISE_INTEGRATION=True)) + @override_settings(FEATURES={"ENABLE_ENTERPRISE_INTEGRATION": True}) def test_email_send(self, add_no_commit, __, get_programs_mock, mock_track): """ Test Segment fired as expected. @@ -145,7 +145,7 @@ def test_email_send(self, add_no_commit, __, get_programs_mock, mock_track): ) @patch('common.djangoapps.student.models.course_enrollment.segment.track') @patch('lms.djangoapps.program_enrollments.management.commands.send_program_course_nudge_email.get_programs') - @override_settings(FEATURES=dict(ENABLE_ENTERPRISE_INTEGRATION=True)) + @override_settings(FEATURES={"ENABLE_ENTERPRISE_INTEGRATION": True}) def test_email_no_course_recommendation(self, add_no_commit, get_programs_mock, mock_track): """ Test Segment fired as expected. diff --git a/lms/djangoapps/static_template_view/views.py b/lms/djangoapps/static_template_view/views.py index a788f77a95fd..f8962897c033 100644 --- a/lms/djangoapps/static_template_view/views.py +++ b/lms/djangoapps/static_template_view/views.py @@ -92,8 +92,7 @@ def render_press_release(request, slug): resp = render_to_response('static_templates/press_releases/' + template, {}) except TemplateDoesNotExist: raise Http404 # lint-amnesty, pylint: disable=raise-missing-from - else: - return resp + return resp @fix_crum_request diff --git a/lms/djangoapps/support/tests/test_views.py b/lms/djangoapps/support/tests/test_views.py index 147532bf2e27..6b77e04a9441 100644 --- a/lms/djangoapps/support/tests/test_views.py +++ b/lms/djangoapps/support/tests/test_views.py @@ -394,7 +394,7 @@ def test_order_source_system_information(self): assert len(data) == 1 assert data[0]['source_system'] == 'commercetools' - @override_settings(FEATURES=dict(ENABLE_ENTERPRISE_INTEGRATION=True)) + @override_settings(FEATURES={"ENABLE_ENTERPRISE_INTEGRATION": True}) @enterprise_is_enabled() def test_get_enrollments_enterprise_enabled(self): url = reverse( diff --git a/lms/djangoapps/user_tours/v1/tests/test_views.py b/lms/djangoapps/user_tours/v1/tests/test_views.py index f78586b78dec..878de68c6cdf 100644 --- a/lms/djangoapps/user_tours/v1/tests/test_views.py +++ b/lms/djangoapps/user_tours/v1/tests/test_views.py @@ -64,7 +64,7 @@ def test_unauthorized_user(self, method): response = self.client.get(url) elif method == 'PATCH': response = self.client.patch(url, data={}) - assert response.status_code == status.HTTP_401_UNAUTHORIZED + assert response.status_code == status.HTTP_401_UNAUTHORIZED # pylint: disable=possibly-used-before-assignment def test_get_success(self): """ Test GET request for a user. """ diff --git a/lms/djangoapps/verify_student/management/commands/tests/test_retry_failed_photo_verifications.py b/lms/djangoapps/verify_student/management/commands/tests/test_retry_failed_photo_verifications.py index 8fa84efe3a85..043fad1fe419 100644 --- a/lms/djangoapps/verify_student/management/commands/tests/test_retry_failed_photo_verifications.py +++ b/lms/djangoapps/verify_student/management/commands/tests/test_retry_failed_photo_verifications.py @@ -55,7 +55,7 @@ def test_command(self): def add_test_config_for_retry_verification(self): """Setups verification retry configuration.""" config = SSPVerificationRetryConfig.current() - config.arguments = ('--verification-ids 1 2 3') + config.arguments = '--verification-ids 1 2 3' config.enabled = True config.save() diff --git a/lms/djangoapps/verify_student/tests/test_models.py b/lms/djangoapps/verify_student/tests/test_models.py index dfea8081e4d4..63550bc7b996 100644 --- a/lms/djangoapps/verify_student/tests/test_models.py +++ b/lms/djangoapps/verify_student/tests/test_models.py @@ -282,14 +282,14 @@ def test_initial_verification_for_user(self): assert second_result == first_result # Test method 'get_initial_verification' returns None after expiration - expired_future = now() + timedelta(days=(FAKE_SETTINGS['DAYS_GOOD_FOR'] + 1)) + expired_future = now() + timedelta(days=FAKE_SETTINGS['DAYS_GOOD_FOR'] + 1) with freeze_time(expired_future): third_result = SoftwareSecurePhotoVerification.get_initial_verification(user) assert third_result is None # Test method 'get_initial_verification' returns correct attempt after system expiration, # but within earliest allowed override. - expired_future = now() + timedelta(days=(FAKE_SETTINGS['DAYS_GOOD_FOR'] + 1)) + expired_future = now() + timedelta(days=FAKE_SETTINGS['DAYS_GOOD_FOR'] + 1) earliest_allowed = now() - timedelta(days=1) with freeze_time(expired_future): fourth_result = SoftwareSecurePhotoVerification.get_initial_verification(user, earliest_allowed) diff --git a/lms/djangoapps/verify_student/tests/test_views.py b/lms/djangoapps/verify_student/tests/test_views.py index 77ee515d3757..f6e12ad0e952 100644 --- a/lms/djangoapps/verify_student/tests/test_views.py +++ b/lms/djangoapps/verify_student/tests/test_views.py @@ -1792,7 +1792,7 @@ def test_reverify_view_can_reverify_expired(self): attempt.approve() days_good_for = settings.VERIFY_STUDENT["DAYS_GOOD_FOR"] - attempt.expiration_date = now() - timedelta(days=(days_good_for + 1)) + attempt.expiration_date = now() - timedelta(days=days_good_for + 1) attempt.save() # Allow the student to re-verify diff --git a/lms/djangoapps/verify_student/views.py b/lms/djangoapps/verify_student/views.py index 1b6a47bee879..ed9073d6b891 100644 --- a/lms/djangoapps/verify_student/views.py +++ b/lms/djangoapps/verify_student/views.py @@ -382,7 +382,7 @@ def get( # lint-amnesty, pylint: disable=too-many-statements # Remember whether the user is upgrading # so we can fire an analytics event upon payment. - request.session['attempting_upgrade'] = (message == self.UPGRADE_MSG) + request.session['attempting_upgrade'] = message == self.UPGRADE_MSG # Determine the photo verification status verification_good_until = self._verification_valid_until(request.user) diff --git a/lms/envs/common.py b/lms/envs/common.py index 29e90eddfbcd..e082a24cd1aa 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -1274,13 +1274,14 @@ # 3 months and then we expire refresh tokens using edx_clear_expired_tokens (length is mobile app driven) 'REFRESH_TOKEN_EXPIRE_SECONDS': 7776000, 'SCOPES_BACKEND_CLASS': 'openedx.core.djangoapps.oauth_dispatch.scopes.ApplicationModelScopes', - 'SCOPES': dict(OAUTH2_DEFAULT_SCOPES, **{ + 'SCOPES': { + **OAUTH2_DEFAULT_SCOPES, 'certificates:read': _('Retrieve your course certificates'), 'grades:read': _('Retrieve your grades for your enrolled courses'), 'tpa:read': _('Retrieve your third-party authentication username mapping'), # user_id is added in code as a default scope for JWT cookies and all password grant_type JWTs 'user_id': _('Know your user identifier'), - }), + }, 'DEFAULT_SCOPES': OAUTH2_DEFAULT_SCOPES, 'REQUEST_APPROVAL_PROMPT': 'auto_even_if_expired', 'ERROR_RESPONSE_WITH_SCOPES': True, @@ -2961,7 +2962,7 @@ def _make_locale_paths(settings): # pylint: disable=missing-function-docstring # .. setting_description: Stores all the settings used by block structures and block structure # related tasks. See BLOCK_STRUCTURES_SETTINGS[XXX] documentation for details of each setting. # For more information, check https://github.com/openedx/edx-platform/pull/13388. -BLOCK_STRUCTURES_SETTINGS = dict( +BLOCK_STRUCTURES_SETTINGS = { # .. setting_name: BLOCK_STRUCTURES_SETTINGS['COURSE_PUBLISH_TASK_DELAY'] # .. setting_default: 30 # .. setting_description: Delay, in seconds, after a new edit of a course is published before @@ -2969,14 +2970,14 @@ def _make_locale_paths(settings): # pylint: disable=missing-function-docstring # the latest changes when there are secondary reads in sharded mongoDB clusters. # For more information, check https://github.com/openedx/edx-platform/pull/13388 and # https://github.com/openedx/edx-platform/pull/14571. - COURSE_PUBLISH_TASK_DELAY=30, + 'COURSE_PUBLISH_TASK_DELAY': 30, # .. setting_name: BLOCK_STRUCTURES_SETTINGS['TASK_DEFAULT_RETRY_DELAY'] # .. setting_default: 30 # .. setting_description: Delay, in seconds, between retry attempts if a block structure task # fails. For more information, check https://github.com/openedx/edx-platform/pull/13388 and # https://github.com/openedx/edx-platform/pull/14571. - TASK_DEFAULT_RETRY_DELAY=30, + 'TASK_DEFAULT_RETRY_DELAY': 30, # .. setting_name: BLOCK_STRUCTURES_SETTINGS['TASK_MAX_RETRIES'] # .. setting_default: 5 @@ -2985,8 +2986,8 @@ def _make_locale_paths(settings): # pylint: disable=missing-function-docstring # the celery task, or wait for it to be triggered again. # For more information, check https://github.com/openedx/edx-platform/pull/13388 and # https://github.com/openedx/edx-platform/pull/14571. - TASK_MAX_RETRIES=5, -) + 'TASK_MAX_RETRIES': 5, +} ################################ Bulk Email ################################### @@ -3868,35 +3869,34 @@ def _make_locale_paths(settings): # pylint: disable=missing-function-docstring ########################## VIDEO IMAGE STORAGE ############################ -VIDEO_IMAGE_SETTINGS = dict( - VIDEO_IMAGE_MAX_BYTES=2 * 1024 * 1024, # 2 MB - VIDEO_IMAGE_MIN_BYTES=2 * 1024, # 2 KB +VIDEO_IMAGE_SETTINGS = { + 'VIDEO_IMAGE_MAX_BYTES': 2 * 1024 * 1024, # 2 MB + 'VIDEO_IMAGE_MIN_BYTES': 2 * 1024, # 2 KB # Backend storage # STORAGE_CLASS='storages.backends.s3boto3.S3Boto3Storage', - # STORAGE_KWARGS=dict(bucket='video-image-bucket'), - STORAGE_KWARGS=dict( - location=MEDIA_ROOT, - ), - DIRECTORY_PREFIX='video-images/', - BASE_URL=MEDIA_URL, - -) + # STORAGE_KWARGS={'bucket': 'video-image-bucket'}, + 'STORAGE_KWARGS': { + 'location': MEDIA_ROOT, + }, + 'DIRECTORY_PREFIX': 'video-images/', + 'BASE_URL': MEDIA_URL, +} VIDEO_IMAGE_MAX_AGE = 31536000 ########################## VIDEO TRANSCRIPTS STORAGE ############################ -VIDEO_TRANSCRIPTS_SETTINGS = dict( - VIDEO_TRANSCRIPTS_MAX_BYTES=3 * 1024 * 1024, # 3 MB +VIDEO_TRANSCRIPTS_SETTINGS = { + 'VIDEO_TRANSCRIPTS_MAX_BYTES': 3 * 1024 * 1024, # 3 MB # Backend storage # STORAGE_CLASS='storages.backends.s3boto3.S3Boto3Storage', - # STORAGE_KWARGS=dict(bucket='video-transcripts-bucket'), - STORAGE_KWARGS=dict( - location=MEDIA_ROOT, - ), - DIRECTORY_PREFIX='video-transcripts/', - BASE_URL=MEDIA_URL, -) + # STORAGE_KWARGS={'bucket': 'video-transcripts-bucket'}, + 'STORAGE_KWARGS': { + 'location': MEDIA_ROOT, + }, + 'DIRECTORY_PREFIX': 'video-transcripts/', + 'BASE_URL': MEDIA_URL, +} VIDEO_TRANSCRIPTS_MAX_AGE = 31536000 diff --git a/lms/envs/test.py b/lms/envs/test.py index a9e8aaf9f2e2..89f43cee1fd9 100644 --- a/lms/envs/test.py +++ b/lms/envs/test.py @@ -489,14 +489,14 @@ ) ########################## VIDEO TRANSCRIPTS STORAGE ############################ -VIDEO_TRANSCRIPTS_SETTINGS = dict( - VIDEO_TRANSCRIPTS_MAX_BYTES=3 * 1024 * 1024, # 3 MB - STORAGE_KWARGS=dict( - location=MEDIA_ROOT, - base_url=MEDIA_URL, - ), - DIRECTORY_PREFIX='video-transcripts/', -) +VIDEO_TRANSCRIPTS_SETTINGS = { + 'VIDEO_TRANSCRIPTS_MAX_BYTES': 3 * 1024 * 1024, # 3 MB + 'STORAGE_KWARGS': { + 'location': MEDIA_ROOT, + 'base_url': MEDIA_URL, + }, + 'DIRECTORY_PREFIX': 'video-transcripts/', +} ####################### Authentication Settings ########################## JWT_AUTH.update({ diff --git a/openedx/core/djangoapps/ace_common/tests/test_tracking.py b/openedx/core/djangoapps/ace_common/tests/test_tracking.py index b6c0fa1df5b6..a192f8f0b58c 100644 --- a/openedx/core/djangoapps/ace_common/tests/test_tracking.py +++ b/openedx/core/djangoapps/ace_common/tests/test_tracking.py @@ -122,9 +122,7 @@ def test_missing_settings(self): @override_settings(GOOGLE_ANALYTICS_TRACKING_ID='UA-123456-1') def test_site_config_override(self): site_config = SiteConfigurationFactory.create( - site_values=dict( - GOOGLE_ANALYTICS_ACCOUNT='UA-654321-1' - ) + site_values={"GOOGLE_ANALYTICS_ACCOUNT": 'UA-654321-1'} ) pixel = GoogleAnalyticsTrackingPixel(site=site_config.site) self.assert_query_string_parameters_equal(pixel.generate_image_url(), tid='UA-654321-1') diff --git a/openedx/core/djangoapps/api_admin/tests/test_views.py b/openedx/core/djangoapps/api_admin/tests/test_views.py index ae07399acb44..9228684c4faf 100644 --- a/openedx/core/djangoapps/api_admin/tests/test_views.py +++ b/openedx/core/djangoapps/api_admin/tests/test_views.py @@ -189,7 +189,7 @@ def test_post(self, status, application_exists, new_application_created): applications = Application.objects.filter(user=self.user) if application_exists and new_application_created: assert applications.count() == 1 - assert old_application != applications[0] + assert old_application != applications[0] # pylint: disable=possibly-used-before-assignment elif application_exists: assert applications.count() == 1 assert old_application == applications[0] diff --git a/openedx/core/djangoapps/catalog/management/commands/cache_programs.py b/openedx/core/djangoapps/catalog/management/commands/cache_programs.py index 9e0664f4930f..c4aa27f866fc 100644 --- a/openedx/core/djangoapps/catalog/management/commands/cache_programs.py +++ b/openedx/core/djangoapps/catalog/management/commands/cache_programs.py @@ -203,7 +203,7 @@ def get_pathways(self, client, site, api_base_url): api_url = urljoin(f"{api_base_url}/", "pathways/") next_page = 1 while next_page: - response = client.get(api_url, params=dict(exclude_utm=1, page=next_page)) + response = client.get(api_url, params={"exclude_utm": 1, "page": next_page}) response.raise_for_status() new_pathways = response.json() pathways.extend(new_pathways['results']) diff --git a/openedx/core/djangoapps/content/block_structure/management/commands/generate_course_blocks.py b/openedx/core/djangoapps/content/block_structure/management/commands/generate_course_blocks.py index 047c945fe406..2abf656362f3 100644 --- a/openedx/core/djangoapps/content/block_structure/management/commands/generate_course_blocks.py +++ b/openedx/core/djangoapps/content/block_structure/management/commands/generate_course_blocks.py @@ -140,7 +140,7 @@ def _generate_for_course(self, options, course_key): action = tasks.update_course_in_cache_v2 if options.get('force_update') else tasks.get_course_in_cache_v2 task_options = {'routing_key': options['routing_key']} if options.get('routing_key') else {} result = action.apply_async( - kwargs=dict(course_id=str(course_key)), + kwargs={"course_id": str(course_key)}, **task_options ) log.info('BlockStructure: ENQUEUED generating for course: %s, task_id: %s.', course_key, result.id) diff --git a/openedx/core/djangoapps/content/block_structure/management/commands/tests/test_generate_course_blocks.py b/openedx/core/djangoapps/content/block_structure/management/commands/tests/test_generate_course_blocks.py index 430f374b07cc..55e7c8f3119f 100644 --- a/openedx/core/djangoapps/content/block_structure/management/commands/tests/test_generate_course_blocks.py +++ b/openedx/core/djangoapps/content/block_structure/management/commands/tests/test_generate_course_blocks.py @@ -99,7 +99,7 @@ def test_one_course(self): ) @ddt.unpack def test_enqueue(self, enqueue_task, force_update, routing_key): - command_options = dict(all_courses=True, enqueue_task=enqueue_task, force_update=force_update) + command_options = {"all_courses": True, "enqueue_task": enqueue_task, "force_update": force_update} if enqueue_task and routing_key: command_options['routing_key'] = routing_key diff --git a/openedx/core/djangoapps/content/block_structure/models.py b/openedx/core/djangoapps/content/block_structure/models.py index c2837e1a77f0..ba4d1e381151 100644 --- a/openedx/core/djangoapps/content/block_structure/models.py +++ b/openedx/core/djangoapps/content/block_structure/models.py @@ -96,11 +96,11 @@ class CustomizableFileField(models.FileField): create new migration files for each configuration change. """ def __init__(self, *args, **kwargs): - kwargs.update(dict( - upload_to=_path_name, - storage=_bs_model_storage(), - max_length=500, # allocate enough for base path + prefix + usage_key + timestamp in filepath - )) + kwargs.update({ + "upload_to": _path_name, + "storage": _bs_model_storage(), + "max_length": 500, # allocate enough for base path + prefix + usage_key + timestamp in filepath + }) super().__init__(*args, **kwargs) def deconstruct(self): # lint-amnesty, pylint: disable=missing-function-docstring diff --git a/openedx/core/djangoapps/content/block_structure/signals.py b/openedx/core/djangoapps/content/block_structure/signals.py index d097216d26ac..939b001f57f7 100644 --- a/openedx/core/djangoapps/content/block_structure/signals.py +++ b/openedx/core/djangoapps/content/block_structure/signals.py @@ -27,7 +27,7 @@ def update_block_structure_on_course_publish(sender, course_key, **kwargs): # p return update_course_in_cache_v2.apply_async( - kwargs=dict(course_id=str(course_key)), + kwargs={"course_id": str(course_key)}, countdown=settings.BLOCK_STRUCTURES_SETTINGS['COURSE_PUBLISH_TASK_DELAY'], ) diff --git a/openedx/core/djangoapps/content/block_structure/store.py b/openedx/core/djangoapps/content/block_structure/store.py index 37a2b57449c0..e88188ea313d 100644 --- a/openedx/core/djangoapps/content/block_structure/store.py +++ b/openedx/core/djangoapps/content/block_structure/store.py @@ -206,12 +206,12 @@ def _version_data_of_block(root_block): Returns the version-relevant data for the given block, including the current schema state of the Transformers and BlockStructure classes. """ - return dict( - data_version=getattr(root_block, 'course_version', None), - data_edit_timestamp=getattr(root_block, 'subtree_edited_on', None), - transformers_schema_version=TransformerRegistry.get_write_version_hash(), - block_structure_schema_version=str(BlockStructureBlockData.VERSION), - ) + return { + "data_version": getattr(root_block, "course_version", None), + "data_edit_timestamp": getattr(root_block, "subtree_edited_on", None), + "transformers_schema_version": TransformerRegistry.get_write_version_hash(), + "block_structure_schema_version": str(BlockStructureBlockData.VERSION), + } @staticmethod def _version_data_of_model(bs_model): diff --git a/openedx/core/djangoapps/content/block_structure/tests/test_models.py b/openedx/core/djangoapps/content/block_structure/tests/test_models.py index 39bb68b09412..05610ebd6d9f 100644 --- a/openedx/core/djangoapps/content/block_structure/tests/test_models.py +++ b/openedx/core/djangoapps/content/block_structure/tests/test_models.py @@ -56,13 +56,13 @@ def _create_bsm_params(self): """ Returns the parameters for creating a BlockStructureModel. """ - return dict( - data_usage_key=self.usage_key, - data_version='DV', - data_edit_timestamp=now(), - transformers_schema_version='TV', - block_structure_schema_version=str(1), - ) + return { + "data_usage_key": self.usage_key, + "data_version": "DV", + "data_edit_timestamp": now(), + "transformers_schema_version": "TV", + "block_structure_schema_version": str(1), + } def _verify_update_or_create_call(self, serialized_data, mock_log=None, expect_created=None): """ @@ -96,7 +96,7 @@ def test_update_or_create(self, mock_log): assert 'Read' in mock_log.info.call_args[0][1] # update entry - self.params.update(dict(data_version='new version')) + self.params.update({"data_version": 'new version'}) updated_serialized_data = 'updated data' updated_bsm = self._verify_update_or_create_call(updated_serialized_data, mock_log, expect_created=False) assert bsm.data.name != updated_bsm.data.name diff --git a/openedx/core/djangoapps/content/block_structure/tests/test_tasks.py b/openedx/core/djangoapps/content/block_structure/tests/test_tasks.py index 834600e3c97d..bafc1c04a279 100644 --- a/openedx/core/djangoapps/content/block_structure/tests/test_tasks.py +++ b/openedx/core/djangoapps/content/block_structure/tests/test_tasks.py @@ -21,5 +21,5 @@ def test_retry_on_error(self, mock_update, mock_retry): Ensures that tasks will be retried if IntegrityErrors are encountered. """ mock_update.side_effect = Exception("WHAMMY") - update_course_in_cache_v2.apply(kwargs=dict(course_id="invalid_course_key raises exception 12345 meow")) + update_course_in_cache_v2.apply(kwargs={"course_id": 'invalid_course_key raises exception 12345 meow'}) assert mock_retry.called diff --git a/openedx/core/djangoapps/content/course_overviews/management/commands/tests/test_simulate_publish.py b/openedx/core/djangoapps/content/course_overviews/management/commands/tests/test_simulate_publish.py index a91ff0ffffa4..761becc3608b 100644 --- a/openedx/core/djangoapps/content/course_overviews/management/commands/tests/test_simulate_publish.py +++ b/openedx/core/djangoapps/content/course_overviews/management/commands/tests/test_simulate_publish.py @@ -89,16 +89,16 @@ def options(self, **kwargs): name_from_fn(self.sample_receiver_1), name_from_fn(self.sample_receiver_2), ] - default_options = dict( - show_receivers=False, - dry_run=False, - receivers=default_receivers, - courses=None, - delay=0, - force_lms=False, - skip_ccx=False, - args_from_database=False - ) + default_options = { + "show_receivers": False, + "dry_run": False, + "receivers": default_receivers, + "courses": None, + "delay": 0, + "force_lms": False, + "skip_ccx": False, + "args_from_database": False, + } default_options.update(kwargs) return default_options diff --git a/openedx/core/djangoapps/content/course_overviews/models.py b/openedx/core/djangoapps/content/course_overviews/models.py index 10a56f0868fb..7cb712a6f3d1 100644 --- a/openedx/core/djangoapps/content/course_overviews/models.py +++ b/openedx/core/djangoapps/content/course_overviews/models.py @@ -231,7 +231,7 @@ def _create_or_update(cls, course): # lint-amnesty, pylint: disable=too-many-st course_overview.certificate_available_date = updated_available_date course_overview.certificates_show_before_end = course.certificates_show_before_end course_overview.cert_html_view_enabled = course.cert_html_view_enabled - course_overview.has_any_active_web_certificate = (get_active_web_certificate(course) is not None) + course_overview.has_any_active_web_certificate = get_active_web_certificate(course) is not None course_overview.cert_name_short = course.cert_name_short course_overview.cert_name_long = course.cert_name_long course_overview.lowest_passing_grade = lowest_passing_grade diff --git a/openedx/core/djangoapps/content/course_overviews/tests/test_course_overviews.py b/openedx/core/djangoapps/content/course_overviews/tests/test_course_overviews.py index 8e95c44825c5..24ccf1c5e985 100644 --- a/openedx/core/djangoapps/content/course_overviews/tests/test_course_overviews.py +++ b/openedx/core/djangoapps/content/course_overviews/tests/test_course_overviews.py @@ -539,8 +539,8 @@ def test_get_all_courses_by_mobile_available(self): test_cases = ( (None, {non_mobile_course.id, mobile_course.id}), - (dict(mobile_available=True), {mobile_course.id}), - (dict(mobile_available=False), {non_mobile_course.id}), + ({"mobile_available": True}, {mobile_course.id}), + ({"mobile_available": False}, {non_mobile_course.id}), ) for filter_, expected_courses in test_cases: diff --git a/openedx/core/djangoapps/content_libraries/tasks.py b/openedx/core/djangoapps/content_libraries/tasks.py index f56b4adfe313..11da1d452b04 100644 --- a/openedx/core/djangoapps/content_libraries/tasks.py +++ b/openedx/core/djangoapps/content_libraries/tasks.py @@ -190,7 +190,7 @@ def _sync_children( except ItemNotFoundError: task.status.fail(f"Requested library {library_key} not found.") return - filter_children = (dest_block.capa_type != ANY_CAPA_TYPE_VALUE) + filter_children = dest_block.capa_type != ANY_CAPA_TYPE_VALUE if filter_children: # Apply simple filtering based on CAPA problem types: source_blocks.extend(_problem_type_filter(store, library, dest_block.capa_type)) diff --git a/openedx/core/djangoapps/content_libraries/tests/test_content_libraries.py b/openedx/core/djangoapps/content_libraries/tests/test_content_libraries.py index 18d4ec591604..4fb1ecf76321 100644 --- a/openedx/core/djangoapps/content_libraries/tests/test_content_libraries.py +++ b/openedx/core/djangoapps/content_libraries/tests/test_content_libraries.py @@ -1087,9 +1087,9 @@ class ContentLibraryXBlockValidationTest(APITestCase): """Tests only focused on service validation, no Learning Core interactions here.""" @ddt.data( - (URL_BLOCK_METADATA_URL, dict(block_key='totally_invalid_key')), - (URL_BLOCK_RENDER_VIEW, dict(block_key='totally_invalid_key', view_name='random')), - (URL_BLOCK_GET_HANDLER_URL, dict(block_key='totally_invalid_key', handler_name='random')), + (URL_BLOCK_METADATA_URL, {"block_key": 'totally_invalid_key'}), + (URL_BLOCK_RENDER_VIEW, {"block_key": 'totally_invalid_key', "view_name": 'random'}), + (URL_BLOCK_GET_HANDLER_URL, {"block_key": 'totally_invalid_key', "handler_name": 'random'}), ) @ddt.unpack def test_invalid_key(self, endpoint, endpoint_parameters): @@ -1102,10 +1102,10 @@ def test_invalid_key(self, endpoint, endpoint_parameters): def test_xblock_handler_invalid_key(self): """This endpoint is tested separately from the previous ones as it's not a DRF endpoint.""" client = Client() - response = client.get(URL_BLOCK_XBLOCK_HANDLER.format(**dict( - block_key='totally_invalid_key', - handler_name='random', - user_id='random', - secure_token='random', - ))) + response = client.get(URL_BLOCK_XBLOCK_HANDLER.format(**{ + "block_key": "totally_invalid_key", + "handler_name": "random", + "user_id": "random", + "secure_token": "random", + })) self.assertEqual(response.status_code, 404) diff --git a/openedx/core/djangoapps/contentserver/test/test_contentserver.py b/openedx/core/djangoapps/contentserver/test/test_contentserver.py index 4c0180c402e9..0e0f8d186c23 100644 --- a/openedx/core/djangoapps/contentserver/test/test_contentserver.py +++ b/openedx/core/djangoapps/contentserver/test/test_contentserver.py @@ -273,7 +273,7 @@ def test_range_request_malformed_invalid_range(self): 416 Requested Range Not Satisfiable. """ resp = self.client.get(self.url_unlocked, HTTP_RANGE='bytes={first}-{last}'.format( - first=(self.length_unlocked // 2), last=(self.length_unlocked // 4))) + first=self.length_unlocked // 2, last=self.length_unlocked // 4)) assert resp.status_code == 416 def test_range_request_malformed_out_of_bounds(self): @@ -282,7 +282,7 @@ def test_range_request_malformed_out_of_bounds(self): outputs 416 Requested Range Not Satisfiable. """ resp = self.client.get(self.url_unlocked, HTTP_RANGE='bytes={first}-{last}'.format( - first=(self.length_unlocked), last=(self.length_unlocked))) + first=self.length_unlocked, last=self.length_unlocked)) assert resp.status_code == 416 def test_vary_header_sent(self): diff --git a/openedx/core/djangoapps/cookie_metadata/middleware.py b/openedx/core/djangoapps/cookie_metadata/middleware.py index f54839da8fe8..5c7f30c0f09f 100644 --- a/openedx/core/djangoapps/cookie_metadata/middleware.py +++ b/openedx/core/djangoapps/cookie_metadata/middleware.py @@ -91,7 +91,7 @@ def __call__(self, request): expand_settings["current"] not in request.COOKIES and alt_cookie_in_request ): - request.COOKIES[expand_settings["current"]] = alt_cookie_value + request.COOKIES[expand_settings["current"]] = alt_cookie_value # pylint: disable=possibly-used-before-assignment set_custom_attribute("cookie.change_name", 1) response = self.get_response(request) diff --git a/openedx/core/djangoapps/cors_csrf/tests/test_views.py b/openedx/core/djangoapps/cors_csrf/tests/test_views.py index a5f7c31b8800..4de88998e659 100644 --- a/openedx/core/djangoapps/cors_csrf/tests/test_views.py +++ b/openedx/core/djangoapps/cors_csrf/tests/test_views.py @@ -57,7 +57,7 @@ def test_xdomain_proxy_enabled_with_whitelist(self, whitelist, expected_whitelis def _configure(self, is_enabled, whitelist=None): """Enable or disable the end-point and configure the whitelist. """ - config = XDomainProxyConfiguration.current() + config = XDomainProxyConfiguration.current() # pylint: disable=possibly-used-before-assignment config.enabled = is_enabled if whitelist: diff --git a/openedx/core/djangoapps/course_apps/rest_api/tests/test_views.py b/openedx/core/djangoapps/course_apps/rest_api/tests/test_views.py index 768643a7a204..49bd85e91e97 100644 --- a/openedx/core/djangoapps/course_apps/rest_api/tests/test_views.py +++ b/openedx/core/djangoapps/course_apps/rest_api/tests/test_views.py @@ -33,7 +33,7 @@ def setUp(self): self.user = UserFactory() self.client = Client() self.client.login(username=self.instructor.username, password=self.TEST_PASSWORD) - self.url = reverse("course_apps_api:v1:course_apps", kwargs=dict(course_id=self.course.id)) + self.url = reverse("course_apps_api:v1:course_apps", kwargs={"course_id": self.course.id}) CourseStaffRole(self.course.id).add_users(self.instructor) @contextlib.contextmanager diff --git a/openedx/core/djangoapps/courseware_api/tests/test_views.py b/openedx/core/djangoapps/courseware_api/tests/test_views.py index ef2f9ef24796..7f8c0fb1ea5a 100644 --- a/openedx/core/djangoapps/courseware_api/tests/test_views.py +++ b/openedx/core/djangoapps/courseware_api/tests/test_views.py @@ -181,7 +181,7 @@ def test_enrolled_course_metadata(self, logged_in, enrollment_mode): assert response.data['verification_status'] == 'none' request = RequestFactory().request() - cert_url = get_certificate_url(course_id=self.course.id, uuid=cert.verify_uuid) + cert_url = get_certificate_url(course_id=self.course.id, uuid=cert.verify_uuid) # pylint: disable=possibly-used-before-assignment linkedin_url_params = { 'name': '{platform_name} Verified Certificate for {course_name}'.format( platform_name=settings.PLATFORM_NAME, course_name=self.course.display_name, diff --git a/openedx/core/djangoapps/credit/models.py b/openedx/core/djangoapps/credit/models.py index 2a9fa2088551..9c14a15104b9 100644 --- a/openedx/core/djangoapps/credit/models.py +++ b/openedx/core/djangoapps/credit/models.py @@ -514,7 +514,6 @@ def remove_requirement_status(cls, username, requirement): ) ) log.error(log_msg) - return @classmethod def retire_user(cls, retirement): diff --git a/openedx/core/djangoapps/credit/tasks.py b/openedx/core/djangoapps/credit/tasks.py index 312e278a985f..79ef613e3d19 100644 --- a/openedx/core/djangoapps/credit/tasks.py +++ b/openedx/core/djangoapps/credit/tasks.py @@ -41,8 +41,7 @@ def update_credit_course_requirements(course_id): except (InvalidKeyError, ItemNotFoundError, InvalidCreditRequirements) as exc: LOGGER.error('Error on adding the requirements for course %s - %s', course_id, str(exc)) raise update_credit_course_requirements.retry(args=[course_id], exc=exc) - else: - LOGGER.info('Requirements added for course %s', course_id) + LOGGER.info('Requirements added for course %s', course_id) def _get_course_credit_requirements(course_key): diff --git a/openedx/core/djangoapps/enrollments/data.py b/openedx/core/djangoapps/enrollments/data.py index 9986830a3491..b76042f72c9d 100644 --- a/openedx/core/djangoapps/enrollments/data.py +++ b/openedx/core/djangoapps/enrollments/data.py @@ -341,8 +341,7 @@ def get_course_enrollment_info(course_id, include_expired=False): msg = f"Requested enrollment information for unknown course {course_id}" log.warning(msg) raise CourseNotFoundError(msg) # lint-amnesty, pylint: disable=raise-missing-from - else: - return CourseSerializer(course, include_expired=include_expired).data + return CourseSerializer(course, include_expired=include_expired).data def get_user_roles(username): diff --git a/openedx/core/djangoapps/enrollments/tests/test_views.py b/openedx/core/djangoapps/enrollments/tests/test_views.py index 2318904baf65..1c9d8e460085 100644 --- a/openedx/core/djangoapps/enrollments/tests/test_views.py +++ b/openedx/core/djangoapps/enrollments/tests/test_views.py @@ -1245,7 +1245,7 @@ def test_enrollment_with_global_staff_permissions(self, using_global_staff_user, @httpretty.activate @override_settings(ENTERPRISE_SERVICE_WORKER_USERNAME='enterprise_worker', - FEATURES=dict(ENABLE_ENTERPRISE_INTEGRATION=True)) + FEATURES={"ENABLE_ENTERPRISE_INTEGRATION": True}) @patch('openedx.features.enterprise_support.api.enterprise_customer_from_api') def test_enterprise_course_enrollment_with_ec_uuid(self, mock_enterprise_customer_from_api): """Verify that the enrollment completes when the EnterpriseCourseEnrollment creation succeeds. """ diff --git a/openedx/core/djangoapps/geoinfo/middleware.py b/openedx/core/djangoapps/geoinfo/middleware.py index ff9ed271bbd1..17d9c9e7bf02 100644 --- a/openedx/core/djangoapps/geoinfo/middleware.py +++ b/openedx/core/djangoapps/geoinfo/middleware.py @@ -37,7 +37,7 @@ def process_request(self, request): old_ip_address = request.session.get('ip_address', None) - if not new_ip_address and old_ip_address: + if not new_ip_address and old_ip_address: # pylint: disable=possibly-used-before-assignment del request.session['ip_address'] del request.session['country_code'] elif new_ip_address != old_ip_address and new_ip_address_obj.is_global: diff --git a/openedx/core/djangoapps/oauth_dispatch/management/commands/create_dot_application.py b/openedx/core/djangoapps/oauth_dispatch/management/commands/create_dot_application.py index 4041b00e15ad..b2cc1842d49a 100644 --- a/openedx/core/djangoapps/oauth_dispatch/management/commands/create_dot_application.py +++ b/openedx/core/djangoapps/oauth_dispatch/management/commands/create_dot_application.py @@ -145,12 +145,12 @@ def handle(self, *args, **options): client_id = options['client_id'] client_secret = options['client_secret'] - application_kwargs = dict( - redirect_uris=redirect_uris, - client_type=client_type, - authorization_grant_type=grant_type, - skip_authorization=skip_authorization - ) + application_kwargs = { + "redirect_uris": redirect_uris, + "client_type": client_type, + "authorization_grant_type": grant_type, + "skip_authorization": skip_authorization, + } if client_id: application_kwargs['client_id'] = client_id if client_secret: diff --git a/openedx/core/djangoapps/oauth_dispatch/management/commands/tests/test_generate_jwt_signing_key.py b/openedx/core/djangoapps/oauth_dispatch/management/commands/tests/test_generate_jwt_signing_key.py index 75d45fe883b2..e2277b813964 100644 --- a/openedx/core/djangoapps/oauth_dispatch/management/commands/tests/test_generate_jwt_signing_key.py +++ b/openedx/core/djangoapps/oauth_dispatch/management/commands/tests/test_generate_jwt_signing_key.py @@ -72,13 +72,30 @@ def _assert_presence_of_key_id(self, mock_log, output_stream, provide_key_id, ke assert len(key_id) == (key_id_size or 8) @ddt.data( - dict(add_previous_public_keys=True, provide_key_id=False, key_id_size=None, strip_key_prefix=True), - dict(add_previous_public_keys=True, provide_key_id=False, key_id_size=16, strip_key_prefix=False), - dict(add_previous_public_keys=False, provide_key_id=True, key_id_size=None, strip_key_prefix=False), + { + "add_previous_public_keys": True, + "provide_key_id": False, + "key_id_size": None, + "strip_key_prefix": True, + }, + { + "add_previous_public_keys": True, + "provide_key_id": False, + "key_id_size": 16, + "strip_key_prefix": False, + }, + { + "add_previous_public_keys": False, + "provide_key_id": True, + "key_id_size": None, + "strip_key_prefix": False, + }, ) @ddt.unpack def test_command(self, add_previous_public_keys, provide_key_id, key_id_size, strip_key_prefix): - command_options = dict(add_previous_public_keys=add_previous_public_keys) + command_options = { + "add_previous_public_keys": add_previous_public_keys, + } if provide_key_id: command_options['key_id'] = TEST_KEY_IDENTIFIER if key_id_size: diff --git a/openedx/core/djangoapps/oauth_dispatch/tests/test_api.py b/openedx/core/djangoapps/oauth_dispatch/tests/test_api.py index 3c064cc63c55..bb040f99823e 100644 --- a/openedx/core/djangoapps/oauth_dispatch/tests/test_api.py +++ b/openedx/core/djangoapps/oauth_dispatch/tests/test_api.py @@ -24,12 +24,12 @@ class TestOAuthDispatchAPI(TestCase): """ Tests for oauth_dispatch's api.py module. """ def setUp(self): super().setUp() - self.adapter = DOTAdapter() + self.adapter = DOTAdapter() # pylint: disable=possibly-used-before-assignment self.user = UserFactory() self.client = self.adapter.create_public_client( name='public app', user=self.user, - redirect_uri=DUMMY_REDIRECT_URL, + redirect_uri=DUMMY_REDIRECT_URL, # pylint: disable=possibly-used-before-assignment client_id='public-client-id', ) @@ -40,7 +40,7 @@ def _assert_stored_token(self, stored_token_value, expected_token_user, expected assert stored_access_token.application.user.id == expected_client.user.id def test_create_token_success(self): - token = api.create_dot_access_token(HttpRequest(), self.user, self.client) + token = api.create_dot_access_token(HttpRequest(), self.user, self.client) # pylint: disable=possibly-used-before-assignment assert token['access_token'] assert token['refresh_token'] self.assertDictContainsSubset( diff --git a/openedx/core/djangoapps/oauth_dispatch/tests/test_dot_adapter.py b/openedx/core/djangoapps/oauth_dispatch/tests/test_dot_adapter.py index ef30e6d3415d..edd12235c44e 100644 --- a/openedx/core/djangoapps/oauth_dispatch/tests/test_dot_adapter.py +++ b/openedx/core/djangoapps/oauth_dispatch/tests/test_dot_adapter.py @@ -30,12 +30,12 @@ class DOTAdapterTestCase(TestCase): """ def setUp(self): super().setUp() - self.adapter = DOTAdapter() + self.adapter = DOTAdapter() # pylint: disable=possibly-used-before-assignment self.user = UserFactory() self.public_client = self.adapter.create_public_client( name='public app', user=self.user, - redirect_uri=DUMMY_REDIRECT_URL, + redirect_uri=DUMMY_REDIRECT_URL, # pylint: disable=possibly-used-before-assignment client_id='public-client-id', ) self.confidential_client = self.adapter.create_confidential_client( @@ -47,10 +47,10 @@ def setUp(self): self.restricted_client = self.adapter.create_confidential_client( name='restricted app', user=self.user, - redirect_uri=DUMMY_REDIRECT_URL2, + redirect_uri=DUMMY_REDIRECT_URL2, # pylint: disable=possibly-used-before-assignment client_id='restricted-client-id', ) - self.restricted_app = RestrictedApplication.objects.create(application=self.restricted_client) + self.restricted_app = RestrictedApplication.objects.create(application=self.restricted_client) # pylint: disable=possibly-used-before-assignment def test_restricted_app_unicode(self): """ diff --git a/openedx/core/djangoapps/oauth_dispatch/tests/test_dot_overrides.py b/openedx/core/djangoapps/oauth_dispatch/tests/test_dot_overrides.py index 52a79615c29d..ebac7116fe1d 100644 --- a/openedx/core/djangoapps/oauth_dispatch/tests/test_dot_overrides.py +++ b/openedx/core/djangoapps/oauth_dispatch/tests/test_dot_overrides.py @@ -39,7 +39,7 @@ def setUp(self): password=self.TEST_PASSWORD, email='darkhelmet@spaceball_one.org', ) - self.validator = EdxOAuth2Validator() + self.validator = EdxOAuth2Validator() # pylint: disable=possibly-used-before-assignment def test_authenticate_with_username(self): user = self.validator._authenticate(username='darkhelmet', password=self.TEST_PASSWORD) @@ -115,7 +115,7 @@ class CustomAuthorizationViewTestCase(TestCase): def setUp(self): super().setUp() self.TEST_PASSWORD = 'Password1234' - self.dot_adapter = adapters.DOTAdapter() + self.dot_adapter = adapters.DOTAdapter() # pylint: disable=possibly-used-before-assignment self.user = UserFactory(password=self.TEST_PASSWORD) self.client.login(username=self.user.username, password=self.TEST_PASSWORD) @@ -126,15 +126,15 @@ def _create_restricted_app(self): # lint-amnesty, pylint: disable=missing-funct restricted_app = self.dot_adapter.create_confidential_client( name='test restricted dot application', user=self.user, - redirect_uri=DUMMY_REDIRECT_URL, + redirect_uri=DUMMY_REDIRECT_URL, # pylint: disable=possibly-used-before-assignment client_id='dot-restricted-app-client-id', ) - models.RestrictedApplication.objects.create(application=restricted_app) + models.RestrictedApplication.objects.create(application=restricted_app) # pylint: disable=possibly-used-before-assignment return restricted_app def _create_expired_token(self, application): date_in_the_past = timezone.now() + datetime.timedelta(days=-100) - dot_models.AccessToken.objects.create( + dot_models.AccessToken.objects.create( # pylint: disable=possibly-used-before-assignment user=self.user, token='1234567890', application=application, diff --git a/openedx/core/djangoapps/oauth_dispatch/tests/test_jwt.py b/openedx/core/djangoapps/oauth_dispatch/tests/test_jwt.py index da95fd072ded..4bde5bd4d48d 100644 --- a/openedx/core/djangoapps/oauth_dispatch/tests/test_jwt.py +++ b/openedx/core/djangoapps/oauth_dispatch/tests/test_jwt.py @@ -45,11 +45,13 @@ def _get_token_dict(self, client_restricted, oauth_adapter, grant_type=None): client = self._create_client(oauth_adapter, client_restricted, grant_type=grant_type) expires_in = 60 * 60 expires = now() + timedelta(seconds=expires_in) - token_dict = dict( - access_token=oauth_adapter.create_access_token_for_test('token', client, self.user, expires), - expires_in=expires_in, - scope=' '.join(self.default_scopes) - ) + token_dict = token_dict = { + "access_token": oauth_adapter.create_access_token_for_test( + "token", client, self.user, expires + ), + "expires_in": expires_in, + "scope": " ".join(self.default_scopes), + } return token_dict def _create_jwt_for_token( diff --git a/openedx/core/djangoapps/oauth_dispatch/tests/test_views.py b/openedx/core/djangoapps/oauth_dispatch/tests/test_views.py index ef03dab0ac8a..973a113de84e 100644 --- a/openedx/core/djangoapps/oauth_dispatch/tests/test_views.py +++ b/openedx/core/djangoapps/oauth_dispatch/tests/test_views.py @@ -85,16 +85,16 @@ class _DispatchingViewTestCase(TestCase): def setUp(self): super().setUp() self.TEST_PASSWORD = 'Password1234' - self.dot_adapter = adapters.DOTAdapter() + self.dot_adapter = adapters.DOTAdapter() # pylint: disable=possibly-used-before-assignment self.user = UserFactory(password=self.TEST_PASSWORD) self.dot_app = self.dot_adapter.create_public_client( name='test dot application', user=self.user, - redirect_uri=DUMMY_REDIRECT_URL, + redirect_uri=DUMMY_REDIRECT_URL, # pylint: disable=possibly-used-before-assignment client_id='dot-app-client-id', ) - self.dot_app_access = models.ApplicationAccess.objects.create( + self.dot_app_access = models.ApplicationAccess.objects.create( # pylint: disable=possibly-used-before-assignment application=self.dot_app, scopes=['grades:read'], ) @@ -133,7 +133,7 @@ class TestAccessTokenView(AccessTokenLoginMixin, mixins.AccessTokenMixin, _Dispa def setUp(self): super().setUp() self.url = reverse('access_token') - self.view_class = views.AccessTokenView + self.view_class = views.AccessTokenView # pylint: disable=possibly-used-before-assignment def _post_body(self, user, client, token_type=None, scope=None, asymmetric_jwt=None): """ diff --git a/openedx/core/djangoapps/programs/tasks.py b/openedx/core/djangoapps/programs/tasks.py index d3b4b867e4cd..681fed8a7bdb 100644 --- a/openedx/core/djangoapps/programs/tasks.py +++ b/openedx/core/djangoapps/programs/tasks.py @@ -790,5 +790,5 @@ def update_certificate_available_date_on_course_update(self, course_key): new_certificate_available_date = None update_credentials_course_certificate_configuration_available_date.delay( - str(course_key), new_certificate_available_date + str(course_key), new_certificate_available_date # pylint: disable=possibly-used-before-assignment ) diff --git a/openedx/core/djangoapps/programs/tests/test_signals.py b/openedx/core/djangoapps/programs/tests/test_signals.py index fae9b1dff22a..b57fbc99bc91 100644 --- a/openedx/core/djangoapps/programs/tests/test_signals.py +++ b/openedx/core/djangoapps/programs/tests/test_signals.py @@ -48,13 +48,13 @@ def signal_kwargs(self): """ DRY helper. """ - return dict( - sender=self.__class__, - user=UserFactory.create(username=TEST_USERNAME), - course_key=TEST_COURSE_KEY, - mode="test-mode", - status="test-status", - ) + return { + "sender": self.__class__, + "user": UserFactory.create(username=TEST_USERNAME), + "course_key": TEST_COURSE_KEY, + "mode": "test-mode", + "status": "test-status", + } def test_signal_received(self, mock_is_learner_issuance_enabled, mock_task): # pylint: disable=unused-argument """ @@ -113,13 +113,13 @@ def signal_kwargs(self): """ DRY helper. """ - return dict( - sender=self.__class__, - user=self.user, - course_key=TEST_COURSE_KEY, - mode="test-mode", - status="test-status", - ) + return { + "sender": self.__class__, + "user": self.user, + "course_key": TEST_COURSE_KEY, + "mode": "test-mode", + "status": "test-status", + } def test_signal_received(self, mock_is_learner_issuance_enabled, mock_task): # pylint: disable=unused-argument """ @@ -190,13 +190,13 @@ def signal_kwargs(self): """ DRY helper. """ - return dict( - sender=self.__class__, - user=UserFactory.create(username=TEST_USERNAME), - course_key=TEST_COURSE_KEY, - mode="test-mode", - status="test-status", - ) + return { + "sender": self.__class__, + "user": UserFactory.create(username=TEST_USERNAME), + "course_key": TEST_COURSE_KEY, + "mode": "test-mode", + "status": "test-status", + } def test_signal_received(self, mock_is_learner_issuance_enabled, mock_task): # pylint: disable=unused-argument """ diff --git a/openedx/core/djangoapps/programs/utils.py b/openedx/core/djangoapps/programs/utils.py index 95044a6faeff..6c42be145764 100644 --- a/openedx/core/djangoapps/programs/utils.py +++ b/openedx/core/djangoapps/programs/utils.py @@ -755,14 +755,28 @@ def _collect_one_click_purchase_eligibility_data(self): # lint-amnesty, pylint: if is_anonymous or ALWAYS_CALCULATE_PROGRAM_PRICE_AS_ANONYMOUS_USER.is_enabled(): # The bundle uuid is necessary to see the program's discounted price if bundle_uuid: - params = dict(sku=skus, is_anonymous=True, bundle=bundle_uuid) + params = { + "sku": skus, + "is_anonymous": True, + "bundle": bundle_uuid, + } else: - params = dict(sku=skus, is_anonymous=True) + params = { + "sku": skus, + "is_anonymous": True, + } else: if bundle_uuid: - params = dict(sku=skus, username=self.user.username, bundle=bundle_uuid) + params = { + "sku": skus, + "username": self.user.username, + "bundle": bundle_uuid, + } else: - params = dict(sku=skus, username=self.user.username) + params = { + "sku": skus, + "username": self.user.username, + } response = api_client.get(api_url, params=params) response.raise_for_status() discount_data = response.json() diff --git a/openedx/core/djangoapps/safe_sessions/middleware.py b/openedx/core/djangoapps/safe_sessions/middleware.py index f3948217efd9..3e0948b0a2cc 100644 --- a/openedx/core/djangoapps/safe_sessions/middleware.py +++ b/openedx/core/djangoapps/safe_sessions/middleware.py @@ -244,14 +244,14 @@ def parse(cls, safe_cookie_string): raise SafeCookieError( # lint-amnesty, pylint: disable=raise-missing-from f"SafeCookieData BWC parse error: {safe_cookie_string!r}." ) - else: - if safe_cookie_data.version != cls.CURRENT_VERSION: - raise SafeCookieError( - "SafeCookieData version {!r} is not supported. Current version is {}.".format( - safe_cookie_data.version, - cls.CURRENT_VERSION, - )) - return safe_cookie_data + + if safe_cookie_data.version != cls.CURRENT_VERSION: + raise SafeCookieError( + "SafeCookieData version {!r} is not supported. Current version is {}.".format( + safe_cookie_data.version, + cls.CURRENT_VERSION, + )) + return safe_cookie_data def __str__(self): """ diff --git a/openedx/core/djangoapps/schedules/management/commands/tests/send_email_base.py b/openedx/core/djangoapps/schedules/management/commands/tests/send_email_base.py index 774f1f418124..77dad3b9cc8b 100644 --- a/openedx/core/djangoapps/schedules/management/commands/tests/send_email_base.py +++ b/openedx/core/djangoapps/schedules/management/commands/tests/send_email_base.py @@ -221,9 +221,12 @@ def test_schedule_bin(self, schedule_count, mock_attribute, mock_ace): is_first_match = False with self.assertNumQueries(expected_queries, table_ignorelist=WAFFLE_TABLES): - self.task().apply(kwargs=dict( - site_id=self.site_config.site.id, target_day_str=target_day_str, day_offset=offset, bin_num=b, - )) + self.task().apply(kwargs={ + "site_id": self.site_config.site.id, + "target_day_str": target_day_str, + "day_offset": offset, + "bin_num": b, + }) num_schedules = mock_attribute.call_args[0][1] if b in bins_in_use: @@ -245,12 +248,12 @@ def test_no_course_overview(self): with patch.object(self.task, 'async_send_task') as mock_schedule_send: for bin_num in range(self.task().num_bins): - self.task().apply(kwargs=dict( - site_id=self.site_config.site.id, - target_day_str=serialize(target_day), - day_offset=offset, - bin_num=bin_num, - )) + self.task().apply(kwargs={ + "site_id": self.site_config.site.id, + "target_day_str": serialize(target_day), + "day_offset": offset, + "bin_num": bin_num, + }) # There is no database constraint that enforces that enrollment.course_id points # to a valid CourseOverview object. However, in that case, schedules isn't going @@ -333,9 +336,12 @@ def test_site_config(self, this_org_list, other_org_list, expected_message_count ) with patch.object(self.task, 'async_send_task') as mock_schedule_send: - self.task().apply(kwargs=dict( - site_id=this_config.site.id, target_day_str=serialize(target_day), day_offset=offset, bin_num=0 - )) + self.task().apply(kwargs={ + "site_id": this_config.site.id, + "target_day_str": serialize(target_day), + "day_offset": offset, + "bin_num": 0, + }) assert mock_schedule_send.apply_async.call_count == expected_message_count assert not mock_ace.send.called @@ -353,9 +359,12 @@ def test_course_end(self, has_course_ended): ) with patch.object(self.task, 'async_send_task') as mock_schedule_send: - self.task().apply(kwargs=dict( - site_id=self.site_config.site.id, target_day_str=serialize(target_day), day_offset=offset, bin_num=0, - )) + self.task().apply(kwargs={ + "site_id": self.site_config.site.id, + "target_day_str": serialize(target_day), + "day_offset": offset, + "bin_num": 0, + }) if has_course_ended: assert not mock_schedule_send.apply_async.called @@ -379,10 +388,12 @@ def test_multiple_target_schedules(self, mock_ace): expected_query_count = NUM_QUERIES_FIRST_MATCH + additional_course_queries with self.assertNumQueries(expected_query_count, table_ignorelist=WAFFLE_TABLES): with patch.object(self.task, 'async_send_task') as mock_schedule_send: - self.task().apply(kwargs=dict( - site_id=self.site_config.site.id, target_day_str=serialize(target_day), day_offset=offset, - bin_num=self._calculate_bin_for_user(user), - )) + self.task().apply(kwargs={ + "site_id": self.site_config.site.id, + "target_day_str": serialize(target_day), + "day_offset": offset, + "bin_num": self._calculate_bin_for_user(user), + }) expected_call_count = 1 if self.consolidates_emails_for_learner else num_courses assert mock_schedule_send.apply_async.call_count == expected_call_count @@ -432,10 +443,12 @@ def _assert_template_for_offset(self, offset, message_count): # lint-amnesty, p num_expected_queries += 1 with self.assertNumQueries(num_expected_queries, table_ignorelist=WAFFLE_TABLES): - self.task().apply(kwargs=dict( - site_id=self.site_config.site.id, target_day_str=serialize(target_day), day_offset=offset, - bin_num=self._calculate_bin_for_user(user), - )) + self.task().apply(kwargs={ + "site_id": self.site_config.site.id, + "target_day_str": serialize(target_day), + "day_offset": offset, + "bin_num": self._calculate_bin_for_user(user), + }) num_expected_messages = 1 if self.consolidates_emails_for_learner else message_count assert len(sent_messages) == num_expected_messages @@ -467,10 +480,12 @@ def _check_if_email_sent_for_experience(self, test_config): # lint-amnesty, pyl schedule = self._schedule_factory(**kwargs) with patch.object(tasks, 'ace') as mock_ace: - self.task().apply(kwargs=dict( - site_id=self.site_config.site.id, target_day_str=serialize(target_day), day_offset=offset, - bin_num=self._calculate_bin_for_user(schedule.enrollment.user), - )) + self.task().apply(kwargs={ + "site_id": self.site_config.site.id, + "target_day_str": serialize(target_day), + "day_offset": offset, + "bin_num": self._calculate_bin_for_user(schedule.enrollment.user), + }) assert mock_ace.send.called == test_config.email_sent diff --git a/openedx/core/djangoapps/schedules/management/commands/tests/test_send_course_update.py b/openedx/core/djangoapps/schedules/management/commands/tests/test_send_course_update.py index 72e68b042012..288c16fd7249 100644 --- a/openedx/core/djangoapps/schedules/management/commands/tests/test_send_course_update.py +++ b/openedx/core/djangoapps/schedules/management/commands/tests/test_send_course_update.py @@ -96,12 +96,12 @@ def test_with_course_data(self): offset, target_day, enrollment = self.prepare_course_data() with patch.object(tasks, 'ace') as mock_ace: - self.task().apply(kwargs=dict( - site_id=self.site_config.site.id, - target_day_str=serialize(target_day), - day_offset=offset, - bin_num=self._calculate_bin_for_user(enrollment.user), - )) + self.task().apply(kwargs={ + "site_id": self.site_config.site.id, + "target_day_str": serialize(target_day), + "day_offset": offset, + "bin_num": self._calculate_bin_for_user(enrollment.user), + }) assert mock_ace.send.called @@ -112,10 +112,10 @@ def test_template_for_instructor_led_courses(self): """ offset, target_day, enrollment = self.prepare_course_data(is_self_paced=False) - self.task().apply(kwargs=dict( - site_id=self.site_config.site.id, - target_day_str=serialize(target_day), - day_offset=offset, - bin_num=self._calculate_bin_for_user(enrollment.user), - )) + self.task().apply(kwargs={ + "site_id": self.site_config.site.id, + "target_day_str": serialize(target_day), + "day_offset": offset, + "bin_num": self._calculate_bin_for_user(enrollment.user), + }) assert f'{enrollment.course.display_name} Weekly Update' == mail.outbox[0].subject diff --git a/openedx/core/djangoapps/schedules/management/commands/tests/test_send_upgrade_reminder.py b/openedx/core/djangoapps/schedules/management/commands/tests/test_send_upgrade_reminder.py index 86e782a13283..5cd232316429 100644 --- a/openedx/core/djangoapps/schedules/management/commands/tests/test_send_upgrade_reminder.py +++ b/openedx/core/djangoapps/schedules/management/commands/tests/test_send_upgrade_reminder.py @@ -53,10 +53,12 @@ def test_verified_learner(self, is_verified, mock_ace): enrollment__mode=CourseMode.VERIFIED if is_verified else CourseMode.AUDIT, ) - self.task().apply(kwargs=dict( - site_id=self.site_config.site.id, target_day_str=serialize(target_day), day_offset=offset, - bin_num=self._calculate_bin_for_user(schedule.enrollment.user), - )) + self.task().apply(kwargs={ + "site_id": self.site_config.site.id, + "target_day_str": serialize(target_day), + "day_offset": offset, + "bin_num": self._calculate_bin_for_user(schedule.enrollment.user), + }) assert mock_ace.send.called == (not is_verified) @@ -77,10 +79,12 @@ def test_filter_out_verified_schedules(self): with patch.object(self.task, 'async_send_task') as mock_schedule_send: mock_schedule_send.apply_async = lambda args, *_a, **_kw: sent_messages.append(args[1]) - self.task().apply(kwargs=dict( - site_id=self.site_config.site.id, target_day_str=serialize(target_day), day_offset=offset, - bin_num=self._calculate_bin_for_user(user), - )) + self.task().apply(kwargs={ + "site_id": self.site_config.site.id, + "target_day_str": serialize(target_day), + "day_offset": offset, + "bin_num": self._calculate_bin_for_user(user), + }) messages = [Message.from_string(m) for m in sent_messages] assert len(messages) == 1 @@ -96,10 +100,13 @@ def test_course_without_verified_mode(self, mock_ace): schedule = self._schedule_factory() schedule.enrollment.course.modes.filter(mode_slug=CourseMode.VERIFIED).delete() - self.task().apply(kwargs=dict( - site_id=self.site_config.site.id, target_day_str=serialize(target_day), day_offset=offset, - bin_num=self._calculate_bin_for_user(schedule.enrollment.user), - )) + self.task().apply(kwargs={ + "site_id": self.site_config.site.id, + "target_day_str": serialize(target_day), + "day_offset": offset, + "bin_num": self._calculate_bin_for_user(schedule.enrollment.user), + }) + assert mock_ace.send.called is False @ddt.data( diff --git a/openedx/core/djangoapps/schedules/management/commands/tests/upsell_base.py b/openedx/core/djangoapps/schedules/management/commands/tests/upsell_base.py index 9b199e5ed189..c84e0735e582 100644 --- a/openedx/core/djangoapps/schedules/management/commands/tests/upsell_base.py +++ b/openedx/core/djangoapps/schedules/management/commands/tests/upsell_base.py @@ -45,10 +45,12 @@ def _send_message_task(self, schedule, offset, target_day): sent_messages = [] with patch.object(self.task, 'async_send_task') as mock_schedule_send: mock_schedule_send.apply_async = lambda args, *_a, **_kw: sent_messages.append(args[1]) - self.task().apply(kwargs=dict( - site_id=self.site_config.site.id, target_day_str=serialize(target_day), day_offset=offset, - bin_num=self._calculate_bin_for_user(schedule.enrollment.user), - )) + self.task().apply(kwargs={ + "site_id": self.site_config.site.id, + "target_day_str": serialize(target_day), + "day_offset": offset, + "bin_num": self._calculate_bin_for_user(schedule.enrollment.user), + }) assert len(sent_messages) == 1 return Message.from_string(sent_messages[0]) diff --git a/openedx/core/djangoapps/schedules/signals.py b/openedx/core/djangoapps/schedules/signals.py index c88119d83f34..4ff9fd4b74ea 100644 --- a/openedx/core/djangoapps/schedules/signals.py +++ b/openedx/core/djangoapps/schedules/signals.py @@ -66,11 +66,11 @@ def update_schedules_on_course_start_changed(sender, updated_course_overview, pr content_availability_date=updated_course_overview.start, ) update_course_schedules.apply_async( - kwargs=dict( - course_id=str(updated_course_overview.id), - new_start_date_str=date.serialize(updated_course_overview.start), - new_upgrade_deadline_str=date.serialize(upgrade_deadline), - ), + kwargs={ + "course_id": str(updated_course_overview.id), + "new_start_date_str": date.serialize(updated_course_overview.start), + "new_upgrade_deadline_str": date.serialize(upgrade_deadline), + }, ) diff --git a/openedx/core/djangoapps/schedules/tasks.py b/openedx/core/djangoapps/schedules/tasks.py index 55288d63f1a8..aee1a397bd18 100644 --- a/openedx/core/djangoapps/schedules/tasks.py +++ b/openedx/core/djangoapps/schedules/tasks.py @@ -233,7 +233,7 @@ class ScheduleCourseNextSectionUpdate(ScheduleMessageBaseTask): # lint-amnesty, @classmethod def enqueue(cls, site, current_date, day_offset, override_recipient_email=None): # lint-amnesty, pylint: disable=missing-function-docstring set_code_owner_attribute_from_module(__name__) - target_datetime = (current_date - datetime.timedelta(days=day_offset)) + target_datetime = current_date - datetime.timedelta(days=day_offset) if not cls.is_enqueue_enabled(site): cls.log_info('Message queuing disabled for site %s', site.domain) diff --git a/openedx/core/djangoapps/user_api/accounts/api.py b/openedx/core/djangoapps/user_api/accounts/api.py index 6cc466ba0038..ee31f10e28fe 100644 --- a/openedx/core/djangoapps/user_api/accounts/api.py +++ b/openedx/core/djangoapps/user_api/accounts/api.py @@ -309,7 +309,7 @@ def _does_name_change_require_verification(user_profile, old_name, new_name): # at least one seat. has_verified_enrollments = len(get_verified_enrollments(user.username)) > 0 - validator = NameChangeValidator(old_names_list, num_passing_certs, old_name, new_name) + validator = NameChangeValidator(old_names_list, num_passing_certs, old_name, new_name) # pylint: disable=possibly-used-before-assignment return not validator.validate() and has_verified_enrollments diff --git a/openedx/core/djangoapps/user_api/accounts/tests/test_api.py b/openedx/core/djangoapps/user_api/accounts/tests/test_api.py index 5123c4cf41c2..3de2f3c2effe 100644 --- a/openedx/core/djangoapps/user_api/accounts/tests/test_api.py +++ b/openedx/core/djangoapps/user_api/accounts/tests/test_api.py @@ -177,7 +177,7 @@ def test_get_empty_social_links(self): def test_set_single_social_link(self): social_links = [ - dict(platform="facebook", social_link=f"https://www.facebook.com/{self.user.username}") + {"platform": "facebook", "social_link": f"https://www.facebook.com/{self.user.username}"}, ] update_account_settings(self.user, {"social_links": social_links}) account_settings = get_account_settings(self.default_request)[0] @@ -185,8 +185,8 @@ def test_set_single_social_link(self): def test_set_multiple_social_links(self): social_links = [ - dict(platform="facebook", social_link=f"https://www.facebook.com/{self.user.username}"), - dict(platform="twitter", social_link=f"https://www.twitter.com/{self.user.username}"), + {"platform": "facebook", "social_link": f"https://www.facebook.com/{self.user.username}"}, + {"platform": "twitter", "social_link": f"https://www.twitter.com/{self.user.username}"}, ] update_account_settings(self.user, {"social_links": social_links}) account_settings = get_account_settings(self.default_request)[0] @@ -194,37 +194,37 @@ def test_set_multiple_social_links(self): def test_add_social_links(self): original_social_links = [ - dict(platform="facebook", social_link=f"https://www.facebook.com/{self.user.username}") + {"platform": "facebook", "social_link": f"https://www.facebook.com/{self.user.username}"} ] update_account_settings(self.user, {"social_links": original_social_links}) extra_social_links = [ - dict(platform="twitter", social_link=f"https://www.twitter.com/{self.user.username}"), - dict(platform="linkedin", social_link=f"https://www.linkedin.com/in/{self.user.username}"), + {"platform": "twitter", "social_link": f"https://www.twitter.com/{self.user.username}"}, + {"platform": "linkedin", "social_link": f"https://www.linkedin.com/in/{self.user.username}"}, ] update_account_settings(self.user, {"social_links": extra_social_links}) account_settings = get_account_settings(self.default_request)[0] assert account_settings['social_links'] == \ - sorted((original_social_links + extra_social_links), key=(lambda s: s['platform'])) + sorted((original_social_links + extra_social_links), key=lambda s: s['platform']) def test_replace_social_links(self): - original_facebook_link = dict(platform="facebook", social_link="https://www.facebook.com/myself") - original_twitter_link = dict(platform="twitter", social_link="https://www.twitter.com/myself") + original_facebook_link = {"platform": 'facebook', "social_link": 'https://www.facebook.com/myself'} + original_twitter_link = {"platform": 'twitter', "social_link": 'https://www.twitter.com/myself'} update_account_settings(self.user, {"social_links": [original_facebook_link, original_twitter_link]}) - modified_facebook_link = dict(platform="facebook", social_link="https://www.facebook.com/new_me") + modified_facebook_link = {"platform": 'facebook', "social_link": 'https://www.facebook.com/new_me'} update_account_settings(self.user, {"social_links": [modified_facebook_link]}) account_settings = get_account_settings(self.default_request)[0] assert account_settings['social_links'] == [modified_facebook_link, original_twitter_link] def test_remove_social_link(self): - original_facebook_link = dict(platform="facebook", social_link="https://www.facebook.com/myself") - original_twitter_link = dict(platform="twitter", social_link="https://www.twitter.com/myself") + original_facebook_link = {"platform": 'facebook', "social_link": 'https://www.facebook.com/myself'} + original_twitter_link = {"platform": 'twitter', "social_link": 'https://www.twitter.com/myself'} update_account_settings(self.user, {"social_links": [original_facebook_link, original_twitter_link]}) - removed_facebook_link = dict(platform="facebook", social_link="") + removed_facebook_link = {"platform": 'facebook', "social_link": ''} update_account_settings(self.user, {"social_links": [removed_facebook_link]}) account_settings = get_account_settings(self.default_request)[0] @@ -232,7 +232,7 @@ def test_remove_social_link(self): def test_unsupported_social_link_platform(self): social_links = [ - dict(platform="unsupported", social_link=f"https://www.unsupported.com/{self.user.username}") + {"platform": "unsupported", "social_link": f"https://www.unsupported.com/{self.user.username}"} ] with pytest.raises(AccountValidationError): update_account_settings(self.user, {"social_links": social_links}) @@ -459,7 +459,7 @@ def test_update_sending_email_fails(self, send_mail): account_settings = get_account_settings(self.default_request)[0] assert 'Mickey Mouse' == account_settings['name'] - @patch.dict(settings.FEATURES, dict(ALLOW_EMAIL_ADDRESS_CHANGE=False)) + @patch.dict(settings.FEATURES, {"ALLOW_EMAIL_ADDRESS_CHANGE": False}) def test_email_changes_disabled(self): """ Test that email address changes are rejected when ALLOW_EMAIL_ADDRESS_CHANGE is not set. @@ -470,7 +470,7 @@ def test_email_changes_disabled(self): update_account_settings(self.user, disabled_update) assert 'Email address changes have been disabled' in context_manager.value.developer_message - @patch.dict(settings.FEATURES, dict(ALLOW_EMAIL_ADDRESS_CHANGE=True)) + @patch.dict(settings.FEATURES, {"ALLOW_EMAIL_ADDRESS_CHANGE": True}) def test_email_changes_blocked_on_retired_email(self): """ Test that email address changes are rejected when an email associated with a *partially* retired account is diff --git a/openedx/core/djangoapps/user_api/management/commands/bulk_user_org_email_optout.py b/openedx/core/djangoapps/user_api/management/commands/bulk_user_org_email_optout.py index e465ff5610ed..ab795491ec49 100644 --- a/openedx/core/djangoapps/user_api/management/commands/bulk_user_org_email_optout.py +++ b/openedx/core/djangoapps/user_api/management/commands/bulk_user_org_email_optout.py @@ -135,11 +135,11 @@ def handle(self, *args, **options): optout_rows[end_idx][0], optout_rows[end_idx][1], str(err)) raise - else: - cursor.execute('COMMIT;') - log.info("Committed opt-out for rows (%s, %s) through (%s, %s).", - optout_rows[start_idx][0], optout_rows[start_idx][1], - optout_rows[end_idx][0], optout_rows[end_idx][1]) + + cursor.execute('COMMIT;') + log.info("Committed opt-out for rows (%s, %s) through (%s, %s).", + optout_rows[start_idx][0], optout_rows[start_idx][1], + optout_rows[end_idx][0], optout_rows[end_idx][1]) log.info("Sleeping %s seconds...", sleep_between) time.sleep(sleep_between) curr_row_idx += chunk_size diff --git a/openedx/core/djangoapps/user_api/management/tests/test_email_opt_in_list.py b/openedx/core/djangoapps/user_api/management/tests/test_email_opt_in_list.py index b32a8f723d5e..ceb028921eff 100644 --- a/openedx/core/djangoapps/user_api/management/tests/test_email_opt_in_list.py +++ b/openedx/core/djangoapps/user_api/management/tests/test_email_opt_in_list.py @@ -270,7 +270,7 @@ def test_not_enough_args(self, num_args): expected_msg_regex = ( "^Error: the following arguments are required: OUTPUT_FILENAME, ORG_ALIASES$" ) - with self.assertRaisesRegex(CommandError, expected_msg_regex): + with self.assertRaisesRegex(CommandError, expected_msg_regex): # pylint: disable=possibly-used-before-assignment call_command('email_opt_in_list', *args) def test_file_already_exists(self): diff --git a/openedx/core/djangoapps/user_api/middleware.py b/openedx/core/djangoapps/user_api/middleware.py index 95bb3d568db6..636cc1dcefd1 100644 --- a/openedx/core/djangoapps/user_api/middleware.py +++ b/openedx/core/djangoapps/user_api/middleware.py @@ -41,7 +41,7 @@ def process_request(self, request): context['course_user_tags'] = dict( UserCourseTag.objects.filter( user=request.user.pk, - course_id=course_key, + course_id=course_key, # pylint: disable=possibly-used-before-assignment ).values_list('key', 'value') ) else: diff --git a/openedx/core/djangoapps/user_authn/tests/utils.py b/openedx/core/djangoapps/user_authn/tests/utils.py index 09ca85145f35..363f9441fbe9 100644 --- a/openedx/core/djangoapps/user_authn/tests/utils.py +++ b/openedx/core/djangoapps/user_authn/tests/utils.py @@ -91,7 +91,7 @@ def get_response(self, auth_type, requesting_user=None, requested_user=None, url token = self._create_jwt_token(requesting_user, auth_type) auth_header = f"JWT {token}" - extra = dict(HTTP_AUTHORIZATION=auth_header) if auth_header else {} + extra = {"HTTP_AUTHORIZATION": auth_header} if auth_header else {} return self.client.get( url if url else self.get_url(requested_user.username), **extra diff --git a/openedx/core/djangoapps/util/user_messages.py b/openedx/core/djangoapps/util/user_messages.py index 2b6962f39f55..e8744557c0bd 100644 --- a/openedx/core/djangoapps/util/user_messages.py +++ b/openedx/core/djangoapps/util/user_messages.py @@ -224,7 +224,7 @@ def user_messages(cls, request): notice_type = getattr(UserMessageType, notice_type_str, UserMessageType.INFO) msgs.append(UserMessage( - type=notice_type, + type=notice_type, # pylint: disable=possibly-used-before-assignment message_html=str(cls.get_message_html(Text(notice_message))), )) except BaseException as e: diff --git a/openedx/core/djangoapps/waffle_utils/views.py b/openedx/core/djangoapps/waffle_utils/views.py index a630976210f9..b1d0f84f3281 100644 --- a/openedx/core/djangoapps/waffle_utils/views.py +++ b/openedx/core/djangoapps/waffle_utils/views.py @@ -138,7 +138,7 @@ def _get_flag_overrides(course_or_org: FlagOverride): one_override = flag_overrides.setdefault( override.waffle_flag, OrderedDict() ).setdefault( - override_match_val, OrderedDict() + override_match_val, OrderedDict() # pylint: disable=possibly-used-before-assignment ) # data is reverse ordered by date, so the first record is the current record if override_key not in one_override: diff --git a/openedx/core/djangoapps/xblock/apps.py b/openedx/core/djangoapps/xblock/apps.py index e4f07666c35e..300c7a0165b5 100644 --- a/openedx/core/djangoapps/xblock/apps.py +++ b/openedx/core/djangoapps/xblock/apps.py @@ -48,10 +48,10 @@ def get_runtime_params(self): Get the LearningCoreXBlockRuntime parameters appropriate for viewing and/or editing XBlock content in the LMS """ - return dict( - student_data_mode=StudentDataMode.Persisted, - authored_data_mode=AuthoredDataMode.STRICTLY_PUBLISHED, - ) + return { + "student_data_mode": StudentDataMode.Persisted, + "authored_data_mode": AuthoredDataMode.STRICTLY_PUBLISHED + } def get_site_root_url(self): """ @@ -71,10 +71,7 @@ def get_runtime_params(self): Get the LearningCoreXBlockRuntime parameters appropriate for viewing and/or editing XBlock content in Studio """ - return dict( - student_data_mode=StudentDataMode.Ephemeral, - authored_data_mode=AuthoredDataMode.DEFAULT_DRAFT, - ) + return {"student_data_mode": StudentDataMode.Ephemeral, "authored_data_mode": AuthoredDataMode.DEFAULT_DRAFT} def get_site_root_url(self): """ diff --git a/openedx/core/lib/api/view_utils.py b/openedx/core/lib/api/view_utils.py index 054755ae3cc1..d876e49ae579 100644 --- a/openedx/core/lib/api/view_utils.py +++ b/openedx/core/lib/api/view_utils.py @@ -265,8 +265,7 @@ def __len__(self): def __iter__(self): # Yield all the known data first - for item in self._data: - yield item + yield from self._data # Capture and yield data from the underlying iterator # until it is exhausted diff --git a/openedx/core/lib/celery/task_utils.py b/openedx/core/lib/celery/task_utils.py index 738f074be68c..b19caf16142d 100644 --- a/openedx/core/lib/celery/task_utils.py +++ b/openedx/core/lib/celery/task_utils.py @@ -50,9 +50,9 @@ def emulate_http_request(site=None, user=None, middleware_classes=None): for middleware in reversed(middleware_instances): _run_method_if_implemented(middleware, 'process_exception', request, exc) raise - else: - for middleware in reversed(middleware_instances): - _run_method_if_implemented(middleware, 'process_response', request, response) + + for middleware in reversed(middleware_instances): + _run_method_if_implemented(middleware, 'process_response', request, response) def _run_method_if_implemented(instance, method_name, *args, **kwargs): diff --git a/openedx/core/lib/extract_archive.py b/openedx/core/lib/extract_archive.py index 4706e0caffb7..9f55291e863f 100644 --- a/openedx/core/lib/extract_archive.py +++ b/openedx/core/lib/extract_archive.py @@ -81,7 +81,7 @@ def _checkmembers(members: Union[List[ZipInfo], List[TarInfo]], base: str): elif isinstance(finfo, TarInfo): filename = finfo.name _check_tarinfo(finfo, base) - if _is_bad_path(filename, base): + if _is_bad_path(filename, base): # pylint: disable=possibly-used-before-assignment log.debug("File %r is blocked (illegal path)", filename) raise SuspiciousOperation("Illegal path") diff --git a/openedx/core/lib/tests/test_graph_traversals.py b/openedx/core/lib/tests/test_graph_traversals.py index 47996ccde372..880ba67dbae8 100644 --- a/openedx/core/lib/tests/test_graph_traversals.py +++ b/openedx/core/lib/tests/test_graph_traversals.py @@ -71,25 +71,25 @@ def get_child_to_parents_map(parent_to_children_map): def test_pre_order(self): assert list( traverse_pre_order(start_node='b1', - get_children=(lambda node: self.parent_to_children_map[node]), - filter_func=(lambda node: (node != 'd3'))) + get_children=lambda node: self.parent_to_children_map[node], + filter_func=lambda node: (node != 'd3')) ) == ['b1', 'c1', 'd1', 'e1', 'd2', 'e2', 'f1', 'c2'] def test_post_order(self): assert list( traverse_post_order( start_node='b1', - get_children=(lambda node: self.parent_to_children_map[node]), - filter_func=(lambda node: (node != 'd3'))) + get_children=lambda node: self.parent_to_children_map[node], + filter_func=lambda node: (node != 'd3')) ) == ['e1', 'd1', 'f1', 'e2', 'd2', 'c1', 'c2', 'b1'] def test_topological(self): assert list( traverse_topologically( start_node='b1', - get_children=(lambda node: self.parent_to_children_map[node]), - get_parents=(lambda node: self.child_to_parents_map[node]), - filter_func=(lambda node: (node != 'd3'))) + get_children=lambda node: self.parent_to_children_map[node], + get_parents=lambda node: self.child_to_parents_map[node], + filter_func=lambda node: (node != 'd3')) ) == ['b1', 'c1', 'd1', 'd2', 'e1', 'e2', 'f1', 'c2'] def test_topological_yield_descendants(self): @@ -164,6 +164,6 @@ def test_topological_complex(self): assert list( traverse_topologically( start_node='root', - get_children=(lambda node: parent_to_children[node]), - get_parents=(lambda node: child_to_parents[node])) + get_children=lambda node: parent_to_children[node], + get_parents=lambda node: child_to_parents[node]) ) == ['root', 'A', 'D', 'B', 'E', 'F', 'J', 'K', 'M', 'N', 'G', 'C', 'H', 'L', 'O', 'P', 'I'] diff --git a/openedx/core/lib/tests/test_teams_config.py b/openedx/core/lib/tests/test_teams_config.py index c983e841c50c..68a866cdfba8 100644 --- a/openedx/core/lib/tests/test_teams_config.py +++ b/openedx/core/lib/tests/test_teams_config.py @@ -152,23 +152,21 @@ def test_disabled_team_configs(self, data): "team_sets": [], } INPUT_DATA_4 = { - "team_sets": [dict(id="test-teamset", name="test", description="test")] + "team_sets": [{"id": 'test-teamset', "name": 'test', "description": 'test'}] } OUTPUT_DATA_4 = { # If teamsets are provided, but a value for "enabled" isn't, then the presence of teamsets indicates that # teams should be considered enabled, and the "enabled" field should be set to True. "enabled": True, "max_team_size": DEFAULT_COURSE_RUN_MAX_TEAM_SIZE, - "team_sets": [ - dict( - id="test-teamset", - name="test", - description="test", - type="open", - max_team_size=None, - user_partition_id=None - ), - ], + "team_sets": [{ + "id": "test-teamset", + "name": "test", + "description": "test", + "type": "open", + "max_team_size": None, + "user_partition_id": None, + }], } @ddt.data( diff --git a/openedx/features/course_duration_limits/tests/test_course_expiration.py b/openedx/features/course_duration_limits/tests/test_course_expiration.py index b794ef3076c4..2d1b332db651 100644 --- a/openedx/features/course_duration_limits/tests/test_course_expiration.py +++ b/openedx/features/course_duration_limits/tests/test_course_expiration.py @@ -65,7 +65,7 @@ def setUp(self): display_name='Test Vertical' ) self.user = UserFactory() - self.THREE_YEARS_AGO = now() - timedelta(days=(365 * 3)) + self.THREE_YEARS_AGO = now() - timedelta(days=365 * 3) # Make this a verified course so we can test expiration date add_course_mode(self.course, mode_slug=CourseMode.AUDIT) diff --git a/openedx/features/enterprise_support/tests/test_api.py b/openedx/features/enterprise_support/tests/test_api.py index 40f2c834e6b0..ac1c1ba0e4bd 100644 --- a/openedx/features/enterprise_support/tests/test_api.py +++ b/openedx/features/enterprise_support/tests/test_api.py @@ -870,7 +870,7 @@ def view_func(request, course_id, *args, **kwargs): # Call the wrapped function args = (mock.MagicMock(), 'course-id', 'another arg', 'and another') - kwargs = dict(a=1, b=2, c=3) + kwargs = {"a": 1, "b": 2, "c": 3} response = view_func(*args, **kwargs) # If consent required, then the response should be a redirect to the consent URL, and the view function would @@ -1068,7 +1068,7 @@ def test_get_dashboard_consent_notification( else: assert notification_string == '' - @override_settings(FEATURES=dict(ENABLE_ENTERPRISE_INTEGRATION=False)) + @override_settings(FEATURES={"ENABLE_ENTERPRISE_INTEGRATION": False}) def test_utils_with_enterprise_disabled(self): """ Test that disabling the enterprise integration flag causes diff --git a/openedx/features/enterprise_support/utils.py b/openedx/features/enterprise_support/utils.py index 6b007ebed57b..926c285edf0f 100644 --- a/openedx/features/enterprise_support/utils.py +++ b/openedx/features/enterprise_support/utils.py @@ -32,11 +32,7 @@ def get_data_consent_share_cache_key(user_id, course_id, enterprise_customer_uui """ Returns cache key for data sharing consent needed against user_id, course_id and enterprise_customer_uuid """ - cache_key_params = dict( - type='data_sharing_consent_needed', - user_id=user_id, - course_id=course_id, - ) + cache_key_params = {"type": 'data_sharing_consent_needed', "user_id": user_id, "course_id": course_id} if enterprise_customer_uuid: cache_key_params['enterprise_customer_uuid'] = enterprise_customer_uuid diff --git a/openedx/features/learner_profile/views/learner_profile.py b/openedx/features/learner_profile/views/learner_profile.py index 6a3a251fde9a..9f6f685007b9 100644 --- a/openedx/features/learner_profile/views/learner_profile.py +++ b/openedx/features/learner_profile/views/learner_profile.py @@ -77,7 +77,7 @@ def learner_profile_context(request, profile_username, user_is_staff): profile_user = User.objects.get(username=profile_username) logged_in_user = request.user - own_profile = (logged_in_user.username == profile_username) + own_profile = logged_in_user.username == profile_username account_settings_data = get_account_settings(request, [profile_username])[0] diff --git a/pavelib/paver_tests/test_assets.py b/pavelib/paver_tests/test_assets.py index f7100a7f03c3..082bc9d780cc 100644 --- a/pavelib/paver_tests/test_assets.py +++ b/pavelib/paver_tests/test_assets.py @@ -51,60 +51,66 @@ def tearDown(self): del os.environ['NO_PREREQ_INSTALL'] @ddt.data( - dict( - task_name='pavelib.assets.compile_sass', - args=[], - kwargs={}, - expected=["npm run compile-sass --"], - ), - dict( - task_name='pavelib.assets.compile_sass', - args=[], - kwargs={"system": "lms,studio"}, - expected=["npm run compile-sass --"], - ), - dict( - task_name='pavelib.assets.compile_sass', - args=[], - kwargs={"debug": True}, - expected=["npm run compile-sass-dev --"], - ), - dict( - task_name='pavelib.assets.compile_sass', - args=[], - kwargs={"system": "lms"}, - expected=["npm run compile-sass -- --skip-cms"], - ), - dict( - task_name='pavelib.assets.compile_sass', - args=[], - kwargs={"system": "studio"}, - expected=["npm run compile-sass -- --skip-lms"], - ), - dict( - task_name='pavelib.assets.compile_sass', - args=[], - kwargs={"system": "cms", "theme_dirs": f"{REPO_ROOT}/common/test,{REPO_ROOT}/themes"}, - expected=[ + { + "task_name": "pavelib.assets.compile_sass", + "args": [], + "kwargs": {}, + "expected": ["npm run compile-sass --"], + }, + { + "task_name": "pavelib.assets.compile_sass", + "args": [], + "kwargs": {"system": "lms,studio"}, + "expected": ["npm run compile-sass --"], + }, + { + "task_name": "pavelib.assets.compile_sass", + "args": [], + "kwargs": {"debug": True}, + "expected": ["npm run compile-sass-dev --"], + }, + { + "task_name": "pavelib.assets.compile_sass", + "args": [], + "kwargs": {"system": "lms"}, + "expected": ["npm run compile-sass -- --skip-cms"], + }, + { + "task_name": "pavelib.assets.compile_sass", + "args": [], + "kwargs": {"system": "studio"}, + "expected": ["npm run compile-sass -- --skip-lms"], + }, + { + "task_name": "pavelib.assets.compile_sass", + "args": [], + "kwargs": { + "system": "cms", + "theme_dirs": f"{REPO_ROOT}/common/test,{REPO_ROOT}/themes", + }, + "expected": [ "npm run compile-sass -- --skip-lms " + f"--theme-dir {REPO_ROOT}/common/test --theme-dir {REPO_ROOT}/themes" ], - ), - dict( - task_name='pavelib.assets.compile_sass', - args=[], - kwargs={"theme_dirs": f"{REPO_ROOT}/common/test,{REPO_ROOT}/themes", "themes": "red-theme,test-theme"}, - expected=[ + }, + { + "task_name": "pavelib.assets.compile_sass", + "args": [], + "kwargs": { + "theme_dirs": f"{REPO_ROOT}/common/test,{REPO_ROOT}/themes", + "themes": "red-theme,test-theme", + }, + "expected": [ "npm run compile-sass -- " + f"--theme-dir {REPO_ROOT}/common/test --theme-dir {REPO_ROOT}/themes " + "--theme red-theme --theme test-theme" ], - ), - dict( - task_name='pavelib.assets.update_assets', - args=["lms", "studio", "--settings=fake.settings"], - kwargs={}, - expected=[ + }, + { + "task_name": "pavelib.assets.update_assets", + "args": ["lms", "studio", "--settings=fake.settings"], + "kwargs": {}, + "expected": [ ( "WEBPACK_CONFIG_PATH=webpack.fake.config.js " + "NODE_ENV=production " + @@ -121,7 +127,7 @@ def tearDown(self): "( ./manage.py cms --settings=fake.settings collectstatic --noinput )" ), ], - ), + }, ) @ddt.unpack @patch.object(pavelib.assets, 'sh') diff --git a/pavelib/paver_tests/test_timer.py b/pavelib/paver_tests/test_timer.py index bc9817668347..0c39b59fdb59 100644 --- a/pavelib/paver_tests/test_timer.py +++ b/pavelib/paver_tests/test_timer.py @@ -88,7 +88,7 @@ def test_no_logs(self): @patch.object(timer, 'PAVER_TIMER_LOG', '/tmp/some-log') def test_arguments(self): - messages = self.get_log_messages(args=(1, 'foo'), kwargs=dict(bar='baz')) + messages = self.get_log_messages(args=(1, 'foo'), kwargs={"bar": 'baz'}) assert len(messages) == 1 assert 'args' in messages[0] and messages[0]['args'] == [repr(1), repr('foo')] diff --git a/pavelib/paver_tests/utils.py b/pavelib/paver_tests/utils.py index 1db26cf76a4c..b2278c0d4d8b 100644 --- a/pavelib/paver_tests/utils.py +++ b/pavelib/paver_tests/utils.py @@ -93,5 +93,3 @@ def unexpected_fail_on_npm_install(*args, **kwargs): # pylint: disable=unused-a """ if ["npm", "install", "--verbose"] == args[0]: # lint-amnesty, pylint: disable=no-else-raise raise BuildFailure('Subprocess return code: 50') - else: - return diff --git a/pavelib/quality.py b/pavelib/quality.py index 774179f45048..54d677446c45 100644 --- a/pavelib/quality.py +++ b/pavelib/quality.py @@ -83,7 +83,7 @@ def _get_pep8_violations(clean=True): where violations_string is a string of all PEP 8 violations found, separated by new lines. """ - report_dir = (Env.REPORT_DIR / 'pep8') + report_dir = Env.REPORT_DIR / 'pep8' if clean: report_dir.rmtree(ignore_errors=True) report_dir.makedirs_p() @@ -155,7 +155,7 @@ def run_eslint(options): If limit option is passed, fails build if more violations than the limit are found. """ - eslint_report_dir = (Env.REPORT_DIR / "eslint") + eslint_report_dir = Env.REPORT_DIR / "eslint" eslint_report = eslint_report_dir / "eslint.report" _prepare_report_dir(eslint_report_dir) violations_limit = int(getattr(options, 'limit', -1)) @@ -197,7 +197,7 @@ def _get_stylelint_violations(): """ Returns the number of Stylelint violations. """ - stylelint_report_dir = (Env.REPORT_DIR / "stylelint") + stylelint_report_dir = Env.REPORT_DIR / "stylelint" stylelint_report = stylelint_report_dir / "stylelint.report" _prepare_report_dir(stylelint_report_dir) formatter = 'node_modules/stylelint-formatter-pretty' @@ -280,7 +280,7 @@ def run_xsslint(options): ) xsslint_script = "xss_linter.py" - xsslint_report_dir = (Env.REPORT_DIR / "xsslint") + xsslint_report_dir = Env.REPORT_DIR / "xsslint" xsslint_report = xsslint_report_dir / "xsslint.report" _prepare_report_dir(xsslint_report_dir) @@ -316,7 +316,7 @@ def run_xsslint(options): ) ) - metrics_report = (Env.METRICS_DIR / "xsslint") + metrics_report = Env.METRICS_DIR / "xsslint" # Record the metric _write_metric(metrics_str, metrics_report) # Print number of violations to log. @@ -519,7 +519,7 @@ def run_pii_check(options): Guarantee that all Django models are PII-annotated. """ pii_report_name = 'pii' - default_report_dir = (Env.REPORT_DIR / pii_report_name) + default_report_dir = Env.REPORT_DIR / pii_report_name report_dir = getattr(options, 'report_dir', default_report_dir) output_file = os.path.join(report_dir, 'pii_check_{}.report') env_report = [] diff --git a/requirements/edx/testing.in b/requirements/edx/testing.in index fc7b22d419d9..e74a2cd918f2 100644 --- a/requirements/edx/testing.in +++ b/requirements/edx/testing.in @@ -23,7 +23,6 @@ cssselect # Used to extract HTML fragments via CSS selectors in ddt # Run a test case multiple times with different input; used in many, many of our tests edx-lint # pylint extensions for Open edX repositories factory-boy # Library for creating test fixtures, used in many tests -# Pinning the freezegun version because 0.3.13 is causing failures which have also been reported on the git repo by public. freezegun # Allows tests to mock the output of assorted datetime module functions httpretty # Library for mocking HTTP requests, used in many tests import-linter # Tool for making assertions about which modules can import which others @@ -36,11 +35,11 @@ pytest-attrib # Select tests based on attributes pytest-cov # pytest plugin for measuring code coverage pytest-django # Django support for pytest pytest-json-report # Output json formatted warnings after running pytest -pytest-metadata==1.8.0 # To prevent 'make upgrade' failure, dependency of pytest-json-report +pytest-metadata # To prevent 'make upgrade' failure, dependency of pytest-json-report pytest-randomly # pytest plugin to randomly order tests pytest-xdist[psutil] # Parallel execution of tests on multiple CPU cores or hosts singledispatch # Backport of functools.singledispatch from Python 3.4+, used in tests of XBlock rendering -testfixtures # Provides a LogCapture utility used by several tests +testfixtures # Provides a LogCapture utility used by several tests tox # virtualenv management for tests unidiff # Required by coverage_pytest_plugin pylint-pytest # A Pylint plugin to suppress pytest-related false positives. diff --git a/xmodule/tests/test_graders.py b/xmodule/tests/test_graders.py index 97e441b0939b..d78ad2c17629 100644 --- a/xmodule/tests/test_graders.py +++ b/xmodule/tests/test_graders.py @@ -83,7 +83,7 @@ def __init__(self, graded_total, display_name): def percent_graded(self): return compute_percent(self.graded_total.earned, self.graded_total.possible) - common_fields = dict(graded=True, first_attempted=datetime.now()) + common_fields = {"graded": True, "first_attempted": datetime.now()} test_gradesheet = { 'Homework': { 'hw1': MockGrade(AggregatedScore(tw_earned=2, tw_possible=20.0, **common_fields), display_name='hw1'), diff --git a/xmodule/tests/test_html_block.py b/xmodule/tests/test_html_block.py index 70b491a8bbce..c4b242adcdbf 100644 --- a/xmodule/tests/test_html_block.py +++ b/xmodule/tests/test_html_block.py @@ -38,8 +38,8 @@ class HtmlBlockCourseApiTestCase(unittest.TestCase): @ddt.data( {}, - dict(FEATURES={}), - dict(FEATURES=dict(ENABLE_HTML_XBLOCK_STUDENT_VIEW_DATA=False)) + {"FEATURES": {}}, + {"FEATURES": {"ENABLE_HTML_XBLOCK_STUDENT_VIEW_DATA": False}} ) def test_disabled(self, settings): """ @@ -52,7 +52,7 @@ def test_disabled(self, settings): with override_settings(**settings): assert block.student_view_data() ==\ - dict(enabled=False, message='To enable, set FEATURES["ENABLE_HTML_XBLOCK_STUDENT_VIEW_DATA"]') + {"enabled": False, "message": 'To enable, set FEATURES["ENABLE_HTML_XBLOCK_STUDENT_VIEW_DATA"]'} @ddt.data( '

Some content

', # Valid HTML @@ -63,7 +63,7 @@ def test_disabled(self, settings): '', # Images allowed 'short string ' * 100, # May contain long strings ) - @override_settings(FEATURES=dict(ENABLE_HTML_XBLOCK_STUDENT_VIEW_DATA=True)) + @override_settings(FEATURES={"ENABLE_HTML_XBLOCK_STUDENT_VIEW_DATA": True}) def test_common_values(self, html): """ Ensure that student_view_data will return HTML data when enabled, diff --git a/xmodule/tests/test_video.py b/xmodule/tests/test_video.py index 5e95f77082b1..76e8a8ca5564 100644 --- a/xmodule/tests/test_video.py +++ b/xmodule/tests/test_video.py @@ -690,10 +690,7 @@ def test_export_to_xml(self, mock_val_api): """ edx_video_id = 'test_edx_video_id' mock_val_api.export_to_xml = Mock( - return_value=dict( - xml=etree.Element('video_asset'), - transcripts={} - ) + return_value={"xml": etree.Element('video_asset'), "transcripts": {}} ) self.block.youtube_id_0_75 = 'izygArpw-Qo' self.block.youtube_id_1_0 = 'p2Q6BrNhdh8' diff --git a/xmodule/tests/test_xml_block.py b/xmodule/tests/test_xml_block.py index 7f33aad0f998..c12bb7baeb39 100644 --- a/xmodule/tests/test_xml_block.py +++ b/xmodule/tests/test_xml_block.py @@ -189,8 +189,8 @@ def test_non_defaults_inherited_across_lib(self): parent_block = self.get_block_using_split_kvs( block_type="library_content", block_id="parent", - fields=dict(inherited="changed!"), - defaults=dict(inherited="parent's default"), + fields={"inherited": 'changed!'}, + defaults={"inherited": "parent's default"}, ) assert parent_block.inherited == 'changed!' @@ -211,8 +211,8 @@ def test_defaults_not_inherited_across_lib(self): parent_block = self.get_block_using_split_kvs( block_type="library_content", block_id="parent", - fields=dict(inherited="changed!"), - defaults=dict(inherited="parent's default"), + fields={"inherited": 'changed!'}, + defaults={"inherited": "parent's default"}, ) assert parent_block.inherited == 'changed!' @@ -220,7 +220,7 @@ def test_defaults_not_inherited_across_lib(self): block_type="library_content", block_id="parent", fields={}, - defaults=dict(inherited="child's default"), + defaults={"inherited": "child's default"}, ) child.parent = parent_block.location assert child.inherited == "child's default" From f0ef865cf130d3d67356a7f6fc031711efbe8e75 Mon Sep 17 00:00:00 2001 From: Irtaza Akram Date: Tue, 19 Nov 2024 18:06:11 +0500 Subject: [PATCH 4/7] fix: pylint issues --- lms/djangoapps/bulk_email/models.py | 2 +- lms/djangoapps/ccx/views.py | 2 +- lms/djangoapps/certificates/api.py | 6 +-- lms/djangoapps/certificates/tests/test_api.py | 4 +- .../certificates/tests/test_webview_views.py | 40 +++++++++---------- lms/djangoapps/certificates/views/webview.py | 2 +- lms/djangoapps/commerce/tests/test_utils.py | 2 +- lms/djangoapps/course_api/tests/test_api.py | 4 +- lms/djangoapps/course_api/tests/test_views.py | 4 +- .../transformers/tests/test_visibility.py | 2 +- .../commands/goal_reminder_email.py | 12 +++--- lms/djangoapps/courseware/rules.py | 2 +- .../courseware/tests/test_access.py | 2 +- .../courseware/tests/test_block_render.py | 14 +++---- .../courseware/tests/test_courses.py | 4 +- .../courseware/tests/test_date_summary.py | 2 +- .../courseware/tests/test_video_mongo.py | 38 +++++++++--------- lms/djangoapps/courseware/tests/test_views.py | 12 +++--- .../content_staging/tests/test_clipboard.py | 1 + requirements/edx/base.txt | 10 ++--- requirements/edx/development.txt | 14 +++---- requirements/edx/doc.txt | 10 ++--- requirements/edx/testing.txt | 14 +++---- scripts/user_retirement/requirements/base.txt | 6 +-- .../user_retirement/requirements/testing.txt | 6 +-- 25 files changed, 105 insertions(+), 110 deletions(-) diff --git a/lms/djangoapps/bulk_email/models.py b/lms/djangoapps/bulk_email/models.py index 0e26ea559c20..942cac8eb04c 100644 --- a/lms/djangoapps/bulk_email/models.py +++ b/lms/djangoapps/bulk_email/models.py @@ -114,7 +114,7 @@ def get_users(self, course_id, user_id=None): """ staff_qset = CourseStaffRole(course_id).users_with_role() instructor_qset = CourseInstructorRole(course_id).users_with_role() - staff_instructor_qset = (staff_qset | instructor_qset) + staff_instructor_qset = staff_qset | instructor_qset enrollment_query = models.Q( is_active=True, courseenrollment__course_id=course_id, diff --git a/lms/djangoapps/ccx/views.py b/lms/djangoapps/ccx/views.py index 7c6a75aaf6d4..2fdf00d83336 100644 --- a/lms/djangoapps/ccx/views.py +++ b/lms/djangoapps/ccx/views.py @@ -417,7 +417,7 @@ def visit(node, depth=1): 'display_name': child.display_name, 'category': child.category, 'start': start, - 'due': due, + 'due': due, # pylint: disable=possibly-used-before-assignment 'hidden': hidden, } else: diff --git a/lms/djangoapps/certificates/api.py b/lms/djangoapps/certificates/api.py index bd7db8662e70..d05c14b9bf07 100644 --- a/lms/djangoapps/certificates/api.py +++ b/lms/djangoapps/certificates/api.py @@ -548,11 +548,7 @@ def get_certificate_header_context(is_secure=True): Return data to be used in Certificate Header, data returned should be customized according to the site configuration. """ - data = dict( - logo_src=branding_api.get_logo_url(is_secure), - logo_url=branding_api.get_base_url(is_secure), - ) - + data = {"logo_src": branding_api.get_logo_url(is_secure), "logo_url": branding_api.get_base_url(is_secure)} return data diff --git a/lms/djangoapps/certificates/tests/test_api.py b/lms/djangoapps/certificates/tests/test_api.py index cb11b9e00bd1..02384d83a4e7 100644 --- a/lms/djangoapps/certificates/tests/test_api.py +++ b/lms/djangoapps/certificates/tests/test_api.py @@ -471,11 +471,11 @@ def test_get_web_certificate_url(self): """ Test the get_certificate_url with a web cert course """ - expected_url = reverse("certificates:render_cert_by_uuid", kwargs=dict(certificate_uuid=self.uuid)) + expected_url = reverse("certificates:render_cert_by_uuid", kwargs={"certificate_uuid": self.uuid}) cert_url = get_certificate_url(user_id=self.student.id, course_id=self.web_cert_course.id, uuid=self.uuid) assert expected_url == cert_url - expected_url = reverse("certificates:render_cert_by_uuid", kwargs=dict(certificate_uuid=self.uuid)) + expected_url = reverse("certificates:render_cert_by_uuid", kwargs={"certificate_uuid": self.uuid}) cert_url = get_certificate_url(user_id=self.student.id, course_id=self.web_cert_course.id, uuid=self.uuid) assert expected_url == cert_url diff --git a/lms/djangoapps/certificates/tests/test_webview_views.py b/lms/djangoapps/certificates/tests/test_webview_views.py index 7949b84f13b1..fc70e1abd1ac 100644 --- a/lms/djangoapps/certificates/tests/test_webview_views.py +++ b/lms/djangoapps/certificates/tests/test_webview_views.py @@ -438,11 +438,11 @@ def test_social_sharing_availability_site(self, facebook_sharing, twitter_sharin """ self._add_course_certificates(count=1, signatory_count=1, is_active=True) test_url = get_certificate_url(course_id=self.cert.course_id, uuid=self.cert.verify_uuid) - social_sharing_settings = dict( - CERTIFICATE_FACEBOOK=facebook_sharing, - CERTIFICATE_TWITTER=twitter_sharing, - CERTIFICATE_LINKEDIN=linkedin_sharing, - ) + social_sharing_settings = { + 'CERTIFICATE_FACEBOOK': facebook_sharing, + 'CERTIFICATE_TWITTER': twitter_sharing, + 'CERTIFICATE_LINKEDIN': linkedin_sharing, + } with with_site_configuration_context( configuration={ 'platform_name': 'My Platform Site', @@ -463,10 +463,10 @@ def test_facebook_default_text_site(self): self._add_course_certificates(count=1, signatory_count=1, is_active=True) test_url = get_certificate_url(course_id=self.cert.course_id, uuid=self.cert.verify_uuid) facebook_text = "Facebook text on Test Site" - social_sharing_settings = dict( - CERTIFICATE_FACEBOOK=True, - CERTIFICATE_FACEBOOK_TEXT=facebook_text, - ) + social_sharing_settings = { + 'CERTIFICATE_FACEBOOK': True, + 'CERTIFICATE_FACEBOOK_TEXT': facebook_text, + } with with_site_configuration_context( configuration={ 'SOCIAL_SHARING_SETTINGS': social_sharing_settings, @@ -483,10 +483,10 @@ def test_twitter_default_text_site(self): self._add_course_certificates(count=1, signatory_count=1, is_active=True) test_url = get_certificate_url(course_id=self.cert.course_id, uuid=self.cert.verify_uuid) twitter_text = "Twitter text on Test Site" - social_sharing_settings = dict( - CERTIFICATE_TWITTER=True, - CERTIFICATE_TWITTER_TEXT=twitter_text, - ) + social_sharing_settings = { + 'CERTIFICATE_TWITTER': True, + 'CERTIFICATE_TWITTER_TEXT': twitter_text, + } with with_site_configuration_context( configuration={ 'SOCIAL_SHARING_SETTINGS': social_sharing_settings, @@ -530,13 +530,13 @@ def test_rendering_course_organization_data(self): "CERTIFICATE_FACEBOOK": True, }) @with_site_configuration( - configuration=dict( - platform_name='My Platform Site', - SITE_NAME='test_site.localhost', - urls=dict( - ABOUT='https://www.test-site.org/about-us', - ), - ), + configuration={ + 'platform_name': 'My Platform Site', + 'SITE_NAME': 'test_site.localhost', + 'urls': { + 'ABOUT': 'https://www.test-site.org/about-us', + }, + } ) def test_rendering_maximum_data(self): """ diff --git a/lms/djangoapps/certificates/views/webview.py b/lms/djangoapps/certificates/views/webview.py index 06e4e8a55337..03996f7a88b2 100644 --- a/lms/djangoapps/certificates/views/webview.py +++ b/lms/djangoapps/certificates/views/webview.py @@ -366,7 +366,7 @@ def _get_user_certificate(request, user, course_key, course_overview, preview_mo user_certificate = GeneratedCertificate( mode=preview_mode, verify_uuid=str(uuid4().hex), - modified_date=modified_date, + modified_date=modified_date, # pylint: disable=possibly-used-before-assignment created_date=datetime.now().date(), ) elif certificates_viewable_for_course(course_overview): diff --git a/lms/djangoapps/commerce/tests/test_utils.py b/lms/djangoapps/commerce/tests/test_utils.py index d5d0cf1f1c23..bc07ff9424e7 100644 --- a/lms/djangoapps/commerce/tests/test_utils.py +++ b/lms/djangoapps/commerce/tests/test_utils.py @@ -201,7 +201,7 @@ def setUp(self): @patch('lms.djangoapps.commerce.utils.is_commerce_service_configured', return_value=False) def test_ecommerce_service_not_configured(self, mock_commerce_configured): - course_entitlement = CourseEntitlementFactory.create(mode=CourseMode.VERIFIED) + course_entitlement = CourseEntitlementFactory.create(mode=CourseMode.VERIFIED) # pylint: disable=possibly-used-before-assignment refund_success = refund_entitlement(course_entitlement) assert mock_commerce_configured.is_called assert not refund_success diff --git a/lms/djangoapps/course_api/tests/test_api.py b/lms/djangoapps/course_api/tests/test_api.py index 8e4d1253f8f7..37529f048123 100644 --- a/lms/djangoapps/course_api/tests/test_api.py +++ b/lms/djangoapps/course_api/tests/test_api.py @@ -216,8 +216,8 @@ def test_filter(self): test_cases = [ (None, [alternate_course, self.course]), - (dict(mobile_available=True), [alternate_course]), - (dict(mobile_available=False), [self.course]), + ({"mobile_available": True}, [alternate_course]), + ({"mobile_available": False}, [self.course]), ] for filter_, expected_courses in test_cases: filtered_courses = self._make_api_call(self.staff_user, self.staff_user, filter_=filter_) diff --git a/lms/djangoapps/course_api/tests/test_views.py b/lms/djangoapps/course_api/tests/test_views.py index aab9769661a2..683d32862619 100644 --- a/lms/djangoapps/course_api/tests/test_views.py +++ b/lms/djangoapps/course_api/tests/test_views.py @@ -210,8 +210,8 @@ def test_filter(self): test_cases = [ (None, [alternate_course, self.course]), - (dict(mobile=True), [alternate_course]), - (dict(mobile=False), [self.course]), + ({"mobile": True}, [alternate_course]), + ({"mobile": False}, [self.course]), ] for filter_, expected_courses in test_cases: params = {'username': self.staff_user.username} diff --git a/lms/djangoapps/course_blocks/transformers/tests/test_visibility.py b/lms/djangoapps/course_blocks/transformers/tests/test_visibility.py index 8ceb821a642a..6b1f311ba44c 100644 --- a/lms/djangoapps/course_blocks/transformers/tests/test_visibility.py +++ b/lms/djangoapps/course_blocks/transformers/tests/test_visibility.py @@ -36,7 +36,7 @@ def test_block_visibility( ): for idx, _ in enumerate(self.parents_map): block = self.get_block(idx) - block.visible_to_staff_only = (idx in staff_only_blocks) + block.visible_to_staff_only = idx in staff_only_blocks update_block(block) self.assert_transform_results( diff --git a/lms/djangoapps/course_goals/management/commands/goal_reminder_email.py b/lms/djangoapps/course_goals/management/commands/goal_reminder_email.py index b49d79976c06..c03c68e26b27 100644 --- a/lms/djangoapps/course_goals/management/commands/goal_reminder_email.py +++ b/lms/djangoapps/course_goals/management/commands/goal_reminder_email.py @@ -211,8 +211,8 @@ def _handle_all_goals(self): 'goal_count': total_goals, } ) - log.info(f'Processing course goals, total goal count {total_goals},' - + f'timestamp: {datetime.now()}, uuid: {session_id}') + log.info('Processing course goals, total goal count %d, timestamp: %s, uuid: %s', + total_goals, datetime.now(), session_id) for goal in course_goals: # emulate a request for waffle's benefit with emulate_http_request(site=Site.objects.get_current(), user=goal.user): @@ -221,8 +221,8 @@ def _handle_all_goals(self): else: filtered_count += 1 if (sent_count + filtered_count) % 10000 == 0: - log.info(f'Processing course goals: sent {sent_count} filtered {filtered_count} out of {total_goals},' - + f'timestamp: {datetime.now()}, uuid: {session_id}') + log.info('Processing course goals: sent %d filtered %d out of %d, timestamp: %s, uuid: %s', + sent_count, filtered_count, total_goals, datetime.now(), session_id) tracker.emit( 'edx.course.goal.email.session_completed', @@ -234,8 +234,8 @@ def _handle_all_goals(self): 'emails_filtered': filtered_count, } ) - log.info(f'Processing course goals complete: sent {sent_count} emails, filtered out {filtered_count} emails' - + f'timestamp: {datetime.now()}, uuid: {session_id}') + log.info('Processing course goals complete: sent %d emails, filtered out %d emails, timestamp: %s, uuid: %s', + sent_count, filtered_count, datetime.now(), session_id) @staticmethod def handle_goal(goal, today, sunday_date, monday_date, session_id): diff --git a/lms/djangoapps/courseware/rules.py b/lms/djangoapps/courseware/rules.py index 07cbbab9022c..25bf3c752f12 100644 --- a/lms/djangoapps/courseware/rules.py +++ b/lms/djangoapps/courseware/rules.py @@ -118,7 +118,7 @@ def _check_with_query(self, user, instance=None): elif isinstance(instance, str): course_key = CourseKey.from_string(instance) - return self.filter(user, CourseOverview.objects.filter(id=course_key)).exists() + return self.filter(user, CourseOverview.objects.filter(id=course_key)).exists() # pylint: disable=possibly-used-before-assignment def query(self, user): """ diff --git a/lms/djangoapps/courseware/tests/test_access.py b/lms/djangoapps/courseware/tests/test_access.py index e0c5f59a83fb..5fa6ab323d90 100644 --- a/lms/djangoapps/courseware/tests/test_access.py +++ b/lms/djangoapps/courseware/tests/test_access.py @@ -960,5 +960,5 @@ def test_course_catalog_access_num_queries_enterprise(self, user_attr_name, cour num_queries = 0 course_overview = CourseOverview.get_from_id(course.id) - with self.assertNumQueries(num_queries, table_ignorelist=QUERY_COUNT_TABLE_IGNORELIST): + with self.assertNumQueries(num_queries, table_ignorelist=QUERY_COUNT_TABLE_IGNORELIST): # pylint: disable=possibly-used-before-assignment bool(access.has_access(user, 'see_exists', course_overview, course_key=course.id)) diff --git a/lms/djangoapps/courseware/tests/test_block_render.py b/lms/djangoapps/courseware/tests/test_block_render.py index 182f8d0c03ab..5c1a15ea3213 100644 --- a/lms/djangoapps/courseware/tests/test_block_render.py +++ b/lms/djangoapps/courseware/tests/test_block_render.py @@ -231,12 +231,12 @@ def setUp(self): # Construct a 'standard' xqueue_callback url self.callback_url = reverse( 'xqueue_callback', - kwargs=dict( - course_id=str(self.course_key), - userid=str(self.mock_user.id), - mod_id=self.mock_block.id, - dispatch=self.dispatch - ) + kwargs={ + 'course_id': str(self.course_key), + 'userid': str(self.mock_user.id), + 'mod_id': self.mock_block.id, + 'dispatch': self.dispatch, + } ) def tearDown(self): @@ -2533,7 +2533,7 @@ def _has_access(self, user, action, obj, course_key=None): key = obj.scope_ids.usage_id elif isinstance(obj, UsageKey): key = obj - if key == self.parent.scope_ids.usage_id: # lint-amnesty, pylint: disable=no-member + if key == self.parent.scope_ids.usage_id: # lint-amnesty, pylint: disable=no-member, possibly-used-before-assignment return AccessResponse(True) return AccessResponse(key == self.children_for_user[user]) diff --git a/lms/djangoapps/courseware/tests/test_courses.py b/lms/djangoapps/courseware/tests/test_courses.py index 804f9037791f..cbe642086ecf 100644 --- a/lms/djangoapps/courseware/tests/test_courses.py +++ b/lms/djangoapps/courseware/tests/test_courses.py @@ -155,8 +155,8 @@ def test_get_courses_with_filter(self): test_cases = ( (None, {non_mobile_course.id, mobile_course.id}), - (dict(mobile_available=True), {mobile_course.id}), - (dict(mobile_available=False), {non_mobile_course.id}), + ({"mobile_available": True}, {mobile_course.id}), + ({"mobile_available": False}, {non_mobile_course.id}), ) for filter_, expected_courses in test_cases: assert {course.id for course in get_courses(user, filter_=filter_)} ==\ diff --git a/lms/djangoapps/courseware/tests/test_date_summary.py b/lms/djangoapps/courseware/tests/test_date_summary.py index 27e7f1a3c226..d9fa21096cb4 100644 --- a/lms/djangoapps/courseware/tests/test_date_summary.py +++ b/lms/djangoapps/courseware/tests/test_date_summary.py @@ -586,7 +586,7 @@ def test_verification_deadline_date_denied(self): block = VerificationDeadlineDate(course, user) assert block.css_class == 'verification-deadline-passed' assert block.title == 'Missed Verification Deadline' - assert block.date == (datetime.now(utc) + timedelta(days=(- 1))) + assert block.date == (datetime.now(utc) + timedelta(days=- 1)) assert block.description == "Unfortunately you missed this course's deadline for a successful verification." assert block.link_text == 'Learn More' assert block.link == '' diff --git a/lms/djangoapps/courseware/tests/test_video_mongo.py b/lms/djangoapps/courseware/tests/test_video_mongo.py index d45bb94816b9..b4ee7d760018 100644 --- a/lms/djangoapps/courseware/tests/test_video_mongo.py +++ b/lms/djangoapps/courseware/tests/test_video_mongo.py @@ -858,21 +858,21 @@ def encode_and_create_video(self, edx_video_id): for profile, extension in [("desktop_webm", "webm"), ("desktop_mp4", "mp4")]: create_profile(profile) encoded_videos.append( - dict( - url=f"http://fake-video.edx.org/{edx_video_id}.{extension}", - file_size=9000, - bitrate=42, - profile=profile, - ) + { + 'url': f"http://fake-video.edx.org/{edx_video_id}.{extension}", + 'file_size': 9000, + 'bitrate': 42, + 'profile': profile, + } ) result = create_video( - dict( - client_video_id='A Client Video id', - duration=111.0, - edx_video_id=edx_video_id, - status='test', - encoded_videos=encoded_videos, - ) + { + 'client_video_id': 'A Client Video id', + 'duration': 111.0, + 'edx_video_id': edx_video_id, + 'status': 'test', + 'encoded_videos': encoded_videos, + } ) assert result == edx_video_id return encoded_videos @@ -1784,12 +1784,12 @@ def setUp(self): self.addCleanup(shutil.rmtree, self.temp_dir) def get_video_transcript_data(self, video_id, language_code='en', file_format='srt', provider='Custom'): - return dict( - video_id=video_id, - language_code=language_code, - provider=provider, - file_format=file_format, - ) + return { + 'video_id': video_id, + 'language_code': language_code, + 'provider': provider, + 'file_format': file_format, + } def test_get_context(self): """" diff --git a/lms/djangoapps/courseware/tests/test_views.py b/lms/djangoapps/courseware/tests/test_views.py index 126233880ae1..eabc44087d15 100644 --- a/lms/djangoapps/courseware/tests/test_views.py +++ b/lms/djangoapps/courseware/tests/test_views.py @@ -302,7 +302,7 @@ def test_jump_to_legacy_for_learner_with_staff_only_content(self, store_type, is sequence = BlockFactory.create(category='sequential', parent_location=chapter.location) __ = BlockFactory.create(category='vertical', parent_location=sequence.location) staff_only_vertical = BlockFactory.create(category='vertical', parent_location=sequence.location, - metadata=dict(visible_to_staff_only=True)) + metadata={"visible_to_staff_only": True}) __ = BlockFactory.create(category='vertical', parent_location=sequence.location) usage_key = UsageKey.from_string(str(staff_only_vertical.location)).replace(course_key=course_key) @@ -1884,9 +1884,7 @@ def setup_course(self, show_correctness='', due_date=None, graded=False, **cours } self.create_course(**course_options) - metadata = dict( - show_correctness=show_correctness, - ) + metadata = {"show_correctness": show_correctness} if due_date is not None: metadata['due'] = due_date if graded: @@ -3198,9 +3196,9 @@ def test_consent_required(self, mock_enterprise_customer_for_request): course_id = str(self.course.id) for url in ( - reverse("courseware", kwargs=dict(course_id=course_id)), - reverse("progress", kwargs=dict(course_id=course_id)), - reverse("student_progress", kwargs=dict(course_id=course_id, student_id=str(self.user.id))), + reverse("courseware", kwargs={'course_id': course_id}), + reverse("progress", kwargs={'course_id': course_id}), + reverse("student_progress", kwargs={'course_id': course_id, 'student_id': str(self.user.id)}), ): self.verify_consent_required(self.client, url) # lint-amnesty, pylint: disable=no-value-for-parameter diff --git a/openedx/core/djangoapps/content_staging/tests/test_clipboard.py b/openedx/core/djangoapps/content_staging/tests/test_clipboard.py index 551f94e90e1a..ab65d444ed6f 100644 --- a/openedx/core/djangoapps/content_staging/tests/test_clipboard.py +++ b/openedx/core/djangoapps/content_staging/tests/test_clipboard.py @@ -1,3 +1,4 @@ +# pylint: skip-file """ Tests for the clipboard functionality """ diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index eb6e5723f2ea..0357ebbd15c7 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -10,7 +10,7 @@ acid-xblock==0.4.1 # via -r requirements/edx/kernel.in aiohappyeyeballs==2.4.3 # via aiohttp -aiohttp==3.11.2 +aiohttp==3.11.4 # via # geoip2 # openai @@ -70,13 +70,13 @@ bleach[css]==6.2.0 # xblock-poll boto==2.49.0 # via -r requirements/edx/kernel.in -boto3==1.35.63 +boto3==1.35.64 # via # -r requirements/edx/kernel.in # django-ses # fs-s3fs # ora2 -botocore==1.35.63 +botocore==1.35.64 # via # -r requirements/edx/kernel.in # boto3 @@ -580,7 +580,7 @@ fs-s3fs==0.1.8 # openedx-django-pyfs future==1.0.0 # via pyjwkest -geoip2==4.8.0 +geoip2==4.8.1 # via -r requirements/edx/kernel.in glob2==0.7 # via -r requirements/edx/kernel.in @@ -773,7 +773,7 @@ multidict==6.1.0 # yarl mysqlclient==2.2.6 # via -r requirements/edx/kernel.in -newrelic==10.2.0 +newrelic==10.3.0 # via edx-django-utils nh3==0.2.18 # via -r requirements/edx/kernel.in diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt index c07ac16c55ac..8eccc5de8a4a 100644 --- a/requirements/edx/development.txt +++ b/requirements/edx/development.txt @@ -21,7 +21,7 @@ aiohappyeyeballs==2.4.3 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # aiohttp -aiohttp==3.11.2 +aiohttp==3.11.4 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -142,14 +142,14 @@ boto==2.49.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -boto3==1.35.63 +boto3==1.35.64 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # django-ses # fs-s3fs # ora2 -botocore==1.35.63 +botocore==1.35.64 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -931,7 +931,7 @@ future==1.0.0 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # pyjwkest -geoip2==4.8.0 +geoip2==4.8.1 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1296,7 +1296,7 @@ mysqlclient==2.2.6 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -newrelic==10.2.0 +newrelic==10.3.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1711,7 +1711,7 @@ pytest-django==4.9.0 # via -r requirements/edx/testing.txt pytest-json-report==1.5.0 # via -r requirements/edx/testing.txt -pytest-metadata==1.8.0 +pytest-metadata==3.1.1 # via # -r requirements/edx/testing.txt # pytest-json-report @@ -2058,7 +2058,7 @@ staff-graded-xblock==2.3.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -starlette==0.41.2 +starlette==0.41.3 # via # -r requirements/edx/testing.txt # fastapi diff --git a/requirements/edx/doc.txt b/requirements/edx/doc.txt index 7d322ef5d245..d5ab76cc7da3 100644 --- a/requirements/edx/doc.txt +++ b/requirements/edx/doc.txt @@ -14,7 +14,7 @@ aiohappyeyeballs==2.4.3 # via # -r requirements/edx/base.txt # aiohttp -aiohttp==3.11.2 +aiohttp==3.11.4 # via # -r requirements/edx/base.txt # geoip2 @@ -104,13 +104,13 @@ bleach[css]==6.2.0 # xblock-poll boto==2.49.0 # via -r requirements/edx/base.txt -boto3==1.35.63 +boto3==1.35.64 # via # -r requirements/edx/base.txt # django-ses # fs-s3fs # ora2 -botocore==1.35.63 +botocore==1.35.64 # via # -r requirements/edx/base.txt # boto3 @@ -677,7 +677,7 @@ future==1.0.0 # via # -r requirements/edx/base.txt # pyjwkest -geoip2==4.8.0 +geoip2==4.8.1 # via -r requirements/edx/base.txt gitdb==4.0.11 # via gitpython @@ -932,7 +932,7 @@ multidict==6.1.0 # yarl mysqlclient==2.2.6 # via -r requirements/edx/base.txt -newrelic==10.2.0 +newrelic==10.3.0 # via # -r requirements/edx/base.txt # edx-django-utils diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt index f3aa786e031c..744eaf672843 100644 --- a/requirements/edx/testing.txt +++ b/requirements/edx/testing.txt @@ -12,7 +12,7 @@ aiohappyeyeballs==2.4.3 # via # -r requirements/edx/base.txt # aiohttp -aiohttp==3.11.2 +aiohttp==3.11.4 # via # -r requirements/edx/base.txt # geoip2 @@ -102,13 +102,13 @@ bleach[css]==6.2.0 # xblock-poll boto==2.49.0 # via -r requirements/edx/base.txt -boto3==1.35.63 +boto3==1.35.64 # via # -r requirements/edx/base.txt # django-ses # fs-s3fs # ora2 -botocore==1.35.63 +botocore==1.35.64 # via # -r requirements/edx/base.txt # boto3 @@ -713,7 +713,7 @@ future==1.0.0 # via # -r requirements/edx/base.txt # pyjwkest -geoip2==4.8.0 +geoip2==4.8.1 # via -r requirements/edx/base.txt glob2==0.7 # via -r requirements/edx/base.txt @@ -978,7 +978,7 @@ multidict==6.1.0 # yarl mysqlclient==2.2.6 # via -r requirements/edx/base.txt -newrelic==10.2.0 +newrelic==10.3.0 # via # -r requirements/edx/base.txt # edx-django-utils @@ -1292,7 +1292,7 @@ pytest-django==4.9.0 # via -r requirements/edx/testing.in pytest-json-report==1.5.0 # via -r requirements/edx/testing.in -pytest-metadata==1.8.0 +pytest-metadata==3.1.1 # via # -r requirements/edx/testing.in # pytest-json-report @@ -1521,7 +1521,7 @@ sqlparse==0.5.2 # django staff-graded-xblock==2.3.0 # via -r requirements/edx/base.txt -starlette==0.41.2 +starlette==0.41.3 # via fastapi stevedore==5.3.0 # via diff --git a/scripts/user_retirement/requirements/base.txt b/scripts/user_retirement/requirements/base.txt index a50d50cd2ef8..e326343c0f5b 100644 --- a/scripts/user_retirement/requirements/base.txt +++ b/scripts/user_retirement/requirements/base.txt @@ -10,9 +10,9 @@ attrs==24.2.0 # via zeep backoff==2.2.1 # via -r scripts/user_retirement/requirements/base.in -boto3==1.35.63 +boto3==1.35.64 # via -r scripts/user_retirement/requirements/base.in -botocore==1.35.63 +botocore==1.35.64 # via # boto3 # s3transfer @@ -81,7 +81,7 @@ lxml==5.3.0 # via zeep more-itertools==10.5.0 # via simple-salesforce -newrelic==10.2.0 +newrelic==10.3.0 # via edx-django-utils pbr==6.1.0 # via stevedore diff --git a/scripts/user_retirement/requirements/testing.txt b/scripts/user_retirement/requirements/testing.txt index d63847927511..32152877688e 100644 --- a/scripts/user_retirement/requirements/testing.txt +++ b/scripts/user_retirement/requirements/testing.txt @@ -14,11 +14,11 @@ attrs==24.2.0 # zeep backoff==2.2.1 # via -r scripts/user_retirement/requirements/base.txt -boto3==1.35.63 +boto3==1.35.64 # via # -r scripts/user_retirement/requirements/base.txt # moto -botocore==1.35.63 +botocore==1.35.64 # via # -r scripts/user_retirement/requirements/base.txt # boto3 @@ -132,7 +132,7 @@ more-itertools==10.5.0 # simple-salesforce moto==4.2.14 # via -r scripts/user_retirement/requirements/testing.in -newrelic==10.2.0 +newrelic==10.3.0 # via # -r scripts/user_retirement/requirements/base.txt # edx-django-utils From 84c9c057c4be34a3abfb99d413ef23f852f957e2 Mon Sep 17 00:00:00 2001 From: Irtaza Akram Date: Tue, 19 Nov 2024 18:43:26 +0500 Subject: [PATCH 5/7] fix: quality issues --- common/djangoapps/course_modes/signals.py | 2 +- common/djangoapps/student/auth.py | 2 +- common/djangoapps/student/models/user.py | 2 +- common/djangoapps/student/tests/test_views.py | 2 +- common/djangoapps/student/views/dashboard.py | 2 +- .../certificates/tests/test_webview_views.py | 2 +- .../commands/tests/test_configure_commerce.py | 2 +- lms/djangoapps/course_api/tests/test_api.py | 2 +- .../transformers/tests/test_user_partitions.py | 6 +++--- lms/djangoapps/grades/tests/test_transformer.py | 2 +- lms/djangoapps/teams/csv.py | 2 +- lms/djangoapps/verify_student/tests/test_views.py | 2 +- lms/envs/common.py | 2 +- .../content/block_structure/tests/helpers.py | 2 +- .../learning_sequences/api/tests/test_outlines.py | 14 +++++++------- .../djangoapps/content_libraries/tests/base.py | 4 ++-- .../djangoapps/course_groups/tests/test_cohorts.py | 6 +++--- .../djangoapps/models/tests/test_course_details.py | 4 ++-- .../commands/bulk_user_org_email_optout.py | 4 ++-- .../enterprise_support/tests/mixins/enterprise.py | 2 +- xmodule/capa/checker.py | 3 +-- xmodule/capa/inputtypes.py | 2 +- xmodule/capa/tests/test_responsetypes.py | 2 +- xmodule/capa/xqueue_interface.py | 2 +- xmodule/capa_block.py | 4 ++-- xmodule/course_block.py | 2 +- xmodule/modulestore/tests/test_contentstore.py | 2 +- .../modulestore/tests/test_split_modulestore.py | 6 +++--- xmodule/tests/__init__.py | 4 ++-- xmodule/tests/test_transcripts_utils.py | 4 ++-- 30 files changed, 48 insertions(+), 49 deletions(-) diff --git a/common/djangoapps/course_modes/signals.py b/common/djangoapps/course_modes/signals.py index 5ee83c723655..90efff000788 100644 --- a/common/djangoapps/course_modes/signals.py +++ b/common/djangoapps/course_modes/signals.py @@ -45,7 +45,7 @@ def _listen_for_course_publish(sender, course_key, **kwargs): # pylint: disable def _should_update_date(verified_mode): """ Returns whether or not the verified mode should be updated. """ - return not(verified_mode is None or verified_mode.expiration_datetime_is_explicit) + return not (verified_mode is None or verified_mode.expiration_datetime_is_explicit) @receiver(post_save, sender=CourseMode) diff --git a/common/djangoapps/student/auth.py b/common/djangoapps/student/auth.py index d3dc51616c75..14163e13c021 100644 --- a/common/djangoapps/student/auth.py +++ b/common/djangoapps/student/auth.py @@ -200,7 +200,7 @@ def remove_users(caller, role, *users): :param role: an AccessRole """ # can always remove self (at this layer) - if not(len(users) == 1 and caller == users[0]): + if not (len(users) == 1 and caller == users[0]): _check_caller_authority(caller, role) role.remove_users(*users) diff --git a/common/djangoapps/student/models/user.py b/common/djangoapps/student/models/user.py index 7fe69bd678e4..a18ba55f3574 100644 --- a/common/djangoapps/student/models/user.py +++ b/common/djangoapps/student/models/user.py @@ -1090,7 +1090,7 @@ def __eq__(self, other): Overriding eq b/c the django impl relies on the primary key which requires fetch. sometimes we just want to compare roles w/o doing another fetch. """ - return type(self) == type(other) and self._key == other._key # lint-amnesty, pylint: disable=protected-access, unidiomatic-typecheck + return isinstance(other, type(self)) and self._key == other._key def __hash__(self): return hash(self._key) diff --git a/common/djangoapps/student/tests/test_views.py b/common/djangoapps/student/tests/test_views.py index 8728ae8a2e79..1d7d505505a0 100644 --- a/common/djangoapps/student/tests/test_views.py +++ b/common/djangoapps/student/tests/test_views.py @@ -690,7 +690,7 @@ def _get_html_for_resume_course_button(course_key_string, resume_block_key_strin @staticmethod def _get_html_for_entitlement_button(course_key: CourseKey): - return''' + return '''
{org} - {course} diff --git a/common/djangoapps/student/views/dashboard.py b/common/djangoapps/student/views/dashboard.py index f729a2aee130..96022a837420 100644 --- a/common/djangoapps/student/views/dashboard.py +++ b/common/djangoapps/student/views/dashboard.py @@ -829,7 +829,7 @@ def student_dashboard(request): # lint-amnesty, pylint: disable=too-many-statem 'show_dashboard_tabs': True, 'disable_courseware_js': True, 'display_course_modes_on_dashboard': enable_verified_certificates and display_course_modes_on_dashboard, - 'display_sidebar_account_activation_message': not(user.is_active or hide_dashboard_courses_until_activated), + 'display_sidebar_account_activation_message': not (user.is_active or hide_dashboard_courses_until_activated), 'display_dashboard_courses': (user.is_active or not hide_dashboard_courses_until_activated), 'empty_dashboard_message': empty_dashboard_message, 'enrollments_fbe_is_on': enrollments_fbe_is_on, diff --git a/lms/djangoapps/certificates/tests/test_webview_views.py b/lms/djangoapps/certificates/tests/test_webview_views.py index fc70e1abd1ac..ffe02b83f683 100644 --- a/lms/djangoapps/certificates/tests/test_webview_views.py +++ b/lms/djangoapps/certificates/tests/test_webview_views.py @@ -780,7 +780,7 @@ def test_course_display_name_not_override_with_course_title(self): 'description': 'Description 0', 'signatories': [], 'version': 1, - 'is_active':True + 'is_active': True } ] self.course.certificates = {'certificates': test_certificates} diff --git a/lms/djangoapps/commerce/management/commands/tests/test_configure_commerce.py b/lms/djangoapps/commerce/management/commands/tests/test_configure_commerce.py index 4b4aac519217..d542085d3edf 100644 --- a/lms/djangoapps/commerce/management/commands/tests/test_configure_commerce.py +++ b/lms/djangoapps/commerce/management/commands/tests/test_configure_commerce.py @@ -55,5 +55,5 @@ def test_site_associated_commerce_configuration(self): This is done to make sure that this command gets updated once site_id field is added to CommerceConfiguration model. """ - assert not hasattr(CommerceConfiguration, 'site'),\ + assert not hasattr(CommerceConfiguration, 'site'), \ 'Update configure_commerce command to account for site specific configurations.' diff --git a/lms/djangoapps/course_api/tests/test_api.py b/lms/djangoapps/course_api/tests/test_api.py index 37529f048123..de886af2aafe 100644 --- a/lms/djangoapps/course_api/tests/test_api.py +++ b/lms/djangoapps/course_api/tests/test_api.py @@ -221,7 +221,7 @@ def test_filter(self): ] for filter_, expected_courses in test_cases: filtered_courses = self._make_api_call(self.staff_user, self.staff_user, filter_=filter_) - assert {course.id for course in filtered_courses} == {course.id for course in expected_courses},\ + assert {course.id for course in filtered_courses} == {course.id for course in expected_courses}, \ f'testing course_api.api.list_courses with filter_={filter_}' def test_permissions(self): diff --git a/lms/djangoapps/course_blocks/transformers/tests/test_user_partitions.py b/lms/djangoapps/course_blocks/transformers/tests/test_user_partitions.py index 410de94dc845..03943e79318d 100644 --- a/lms/djangoapps/course_blocks/transformers/tests/test_user_partitions.py +++ b/lms/djangoapps/course_blocks/transformers/tests/test_user_partitions.py @@ -324,19 +324,19 @@ def get_course_hierarchy(self): '#type': 'vertical', '#ref': 'B', '#parents': ['A'], - 'metadata': {'group_access': {1: [1], 2:[3], 3:[]}}, + 'metadata': {'group_access': {1: [1], 2: [3], 3: []}}, }, { '#type': 'vertical', '#ref': 'C', '#parents': ['A'], - 'metadata': {'group_access': {1: [2], 2:[2], 3:[]}}, + 'metadata': {'group_access': {1: [2], 2: [2], 3: []}}, }, { '#type': 'vertical', '#ref': 'D', '#parents': ['A'], - 'metadata': {'group_access': {1: [3], 2:[1], 3:[]}}, + 'metadata': {'group_access': {1: [3], 2: [1], 3: []}}, }, { '#type': 'vertical', diff --git a/lms/djangoapps/grades/tests/test_transformer.py b/lms/djangoapps/grades/tests/test_transformer.py index 7ef13e5b5b7c..486bdf11a51b 100644 --- a/lms/djangoapps/grades/tests/test_transformer.py +++ b/lms/djangoapps/grades/tests/test_transformer.py @@ -75,7 +75,7 @@ def assert_collected_xblock_fields(self, block_structure, usage_key, **expectati for field in expectations: # Append our custom message to the default assertEqual error message self.longMessage = True # pylint: disable=invalid-name - assert expectations[field] == block_structure.get_xblock_field(usage_key, field),\ + assert expectations[field] == block_structure.get_xblock_field(usage_key, field), \ f'in field {repr(field)},' assert block_structure.get_xblock_field(usage_key, 'subtree_edited_on') is not None diff --git a/lms/djangoapps/teams/csv.py b/lms/djangoapps/teams/csv.py index cbfb754a50bb..00801dd230d7 100644 --- a/lms/djangoapps/teams/csv.py +++ b/lms/djangoapps/teams/csv.py @@ -378,7 +378,7 @@ def validate_compatible_enrollment_modes(self, user, team_name, teamset_id): with other enrollment modes on a single team. Masters track students can't be added to existing non-protected teams """ - if(teamset_id, team_name) not in self.user_enrollment_by_team: + if (teamset_id, team_name) not in self.user_enrollment_by_team: self.user_enrollment_by_team[teamset_id, team_name] = set() self.user_enrollment_by_team[teamset_id, team_name].add(self.user_to_actual_enrollment_mode[user.id]) if self.is_FERPA_bubble_breached(teamset_id, team_name) or \ diff --git a/lms/djangoapps/verify_student/tests/test_views.py b/lms/djangoapps/verify_student/tests/test_views.py index f6e12ad0e952..a77541931e2a 100644 --- a/lms/djangoapps/verify_student/tests/test_views.py +++ b/lms/djangoapps/verify_student/tests/test_views.py @@ -961,7 +961,7 @@ def _get_page_data(self, response): soup = BeautifulSoup(markup=response.content, features="lxml") pay_and_verify_div = soup.find(id="pay-and-verify-container") - assert pay_and_verify_div is not None,\ + assert pay_and_verify_div is not None, \ "Could not load pay and verify flow data. Maybe this isn't the pay and verify page?" return { diff --git a/lms/envs/common.py b/lms/envs/common.py index e082a24cd1aa..121a5f3fba0e 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -1275,7 +1275,7 @@ 'REFRESH_TOKEN_EXPIRE_SECONDS': 7776000, 'SCOPES_BACKEND_CLASS': 'openedx.core.djangoapps.oauth_dispatch.scopes.ApplicationModelScopes', 'SCOPES': { - **OAUTH2_DEFAULT_SCOPES, + **OAUTH2_DEFAULT_SCOPES, 'certificates:read': _('Retrieve your course certificates'), 'grades:read': _('Retrieve your grades for your enrolled courses'), 'tpa:read': _('Retrieve your third-party authentication username mapping'), diff --git a/openedx/core/djangoapps/content/block_structure/tests/helpers.py b/openedx/core/djangoapps/content/block_structure/tests/helpers.py index f0a20554e6d2..1c166879b4db 100644 --- a/openedx/core/djangoapps/content/block_structure/tests/helpers.py +++ b/openedx/core/djangoapps/content/block_structure/tests/helpers.py @@ -307,7 +307,7 @@ def assert_block_structure(self, block_structure, children_map, missing_blocks=N for block_key, children in enumerate(children_map): # Verify presence - assert (self.block_key_factory(block_key) in block_structure) == (block_key not in missing_blocks),\ + assert (self.block_key_factory(block_key) in block_structure) == (block_key not in missing_blocks), \ 'Expected presence in block_structure for block_key {} to match absence in missing_blocks.'\ .format(str(block_key)) diff --git a/openedx/core/djangoapps/content/learning_sequences/api/tests/test_outlines.py b/openedx/core/djangoapps/content/learning_sequences/api/tests/test_outlines.py index 20effa6b16cd..4e2c8db5497a 100644 --- a/openedx/core/djangoapps/content/learning_sequences/api/tests/test_outlines.py +++ b/openedx/core/djangoapps/content/learning_sequences/api/tests/test_outlines.py @@ -1064,7 +1064,7 @@ def get_attempt_status_side_effect(user_id, _course_key, usage_key): for sequence_key in self.get_sequence_keys(exclude=[self.seq_normal_key]): assert sequence_key in student_details.special_exam_attempts.sequences attempt_summary = student_details.special_exam_attempts.sequences[sequence_key] - assert type(attempt_summary) == dict # lint-amnesty, pylint: disable=unidiomatic-typecheck + assert isinstance(attempt_summary, dict) assert attempt_summary["summary"]["usage_key"] == str(sequence_key) @patch.dict(settings.FEATURES, {'ENABLE_SPECIAL_EXAMS': False}) @@ -1101,7 +1101,7 @@ def test_special_exam_attempt_data_exam_type(self): # Ensure that exam type is correct for proctored exam assert self.seq_proctored_exam_key in student_details.special_exam_attempts.sequences attempt_summary = student_details.special_exam_attempts.sequences[self.seq_proctored_exam_key] - assert type(attempt_summary) == dict # lint-amnesty, pylint: disable=unidiomatic-typecheck + assert isinstance(attempt_summary, dict) assert attempt_summary["short_description"] == "Proctored Exam" @@ -1262,7 +1262,7 @@ def test_public_course_outline(self): assert len(user_course_outline.sections) == 3 assert len(user_course_outline.sequences) == 6 assert all([(seq.usage_key in user_course_outline.accessible_sequences) for seq in # lint-amnesty, pylint: disable=use-a-generator - user_course_outline.sequences.values()]),\ + user_course_outline.sequences.values()]), \ 'Sequences should be accessible to all users for a public course' @override_waffle_flag(COURSE_ENABLE_UNENROLLED_ACCESS_FLAG, active=True) @@ -1287,11 +1287,11 @@ def test_public_outline_course_outline(self): ] if user in [self.anonymous_user, self.unenrolled_student]: - assert all((not is_accessible) for is_accessible in is_sequence_accessible),\ + assert all((not is_accessible) for is_accessible in is_sequence_accessible), \ "Sequences shouldn't be accessible to anonymous or " \ "non-enrolled students for a public_outline course" else: - assert all(is_sequence_accessible),\ + assert all(is_sequence_accessible), \ 'Sequences should be accessible to enrolled, staff users for a public_outline course' @override_waffle_flag(COURSE_ENABLE_UNENROLLED_ACCESS_FLAG, active=True) @@ -1313,13 +1313,13 @@ def test_private_course_outline(self): ] if user in [self.anonymous_user, self.unenrolled_student]: - assert (len(user_course_outline.sections) == len(user_course_outline.sequences) == 0),\ + assert (len(user_course_outline.sections) == len(user_course_outline.sequences) == 0), \ 'No section of a private course should be visible to anonymous or non-enrolled student' else: # Enrolled or Staff User assert len(user_course_outline.sections) == 3 assert len(user_course_outline.sequences) == 6 - assert all(is_sequence_accessible),\ + assert all(is_sequence_accessible), \ 'Sequences should be accessible to enrolled, staff users for a public_outline course' diff --git a/openedx/core/djangoapps/content_libraries/tests/base.py b/openedx/core/djangoapps/content_libraries/tests/base.py index 638c053f62c3..b06565f9951e 100644 --- a/openedx/core/djangoapps/content_libraries/tests/base.py +++ b/openedx/core/djangoapps/content_libraries/tests/base.py @@ -105,7 +105,7 @@ def _api(self, method, url, data, expect_response): Call a REST API """ response = getattr(self.client, method)(url, data, format="json") - assert response.status_code == expect_response,\ + assert response.status_code == expect_response, \ 'Unexpected response code {}:\n{}'.format(response.status_code, getattr(response, 'data', '(no data)')) return response.data @@ -277,7 +277,7 @@ def _set_library_block_asset(self, block_key, file_name, content, expect_respons file_handle = BytesIO(content) url = URL_LIB_BLOCK_ASSET_FILE.format(block_key=block_key, file_name=file_name) response = self.client.put(url, data={"content": file_handle}) - assert response.status_code == expect_response,\ + assert response.status_code == expect_response, \ 'Unexpected response code {}:\n{}'.format(response.status_code, getattr(response, 'data', '(no data)')) def _delete_library_block_asset(self, block_key, file_name, expect_response=204): diff --git a/openedx/core/djangoapps/course_groups/tests/test_cohorts.py b/openedx/core/djangoapps/course_groups/tests/test_cohorts.py index 0f6dd85863ba..e46829e0f7f7 100644 --- a/openedx/core/djangoapps/course_groups/tests/test_cohorts.py +++ b/openedx/core/djangoapps/course_groups/tests/test_cohorts.py @@ -257,7 +257,7 @@ def test_get_cohort(self): assert cohorts.get_cohort(user, course.id).id == cohort.id, 'user should be assigned to the correct cohort' assert cohorts.get_cohort(other_user, course.id).id == cohorts\ - .get_cohort_by_name(course.id, cohorts.DEFAULT_COHORT_NAME).id,\ + .get_cohort_by_name(course.id, cohorts.DEFAULT_COHORT_NAME).id, \ 'other_user should be assigned to the default cohort' def test_get_cohort_preassigned_user(self): @@ -411,7 +411,7 @@ def test_cohorting_with_migrations_done(self): assert cohorts.get_cohort(user2, course.id).name == 'AutoGroup', 'user2 should be assigned to AutoGroups' - assert cohorts.get_cohort(user1, course.id).name == 'AutoGroup',\ + assert cohorts.get_cohort(user1, course.id).name == 'AutoGroup', \ 'user1 should still be in originally placed cohort' def test_cohorting_with_no_auto_cohorts(self): @@ -446,7 +446,7 @@ def test_cohorting_with_no_auto_cohorts(self): ) assert cohorts.get_cohort(user1, course.id).name == cohorts\ - .get_cohort_by_name(course.id, cohorts.DEFAULT_COHORT_NAME).name,\ + .get_cohort_by_name(course.id, cohorts.DEFAULT_COHORT_NAME).name, \ 'user1 should still be in the default cohort' assert cohorts.get_cohort(user2, course.id).id == cohorts\ diff --git a/openedx/core/djangoapps/models/tests/test_course_details.py b/openedx/core/djangoapps/models/tests/test_course_details.py index 41e739ecb4c8..09fafe8e9dea 100644 --- a/openedx/core/djangoapps/models/tests/test_course_details.py +++ b/openedx/core/djangoapps/models/tests/test_course_details.py @@ -51,9 +51,9 @@ def test_virgin_fetch(self, should_have_default_enroll_start): assert details.start_date.tzinfo is not None assert details.end_date is None, ('end date somehow initialized ' + str(details.end_date)) assert details.enrollment_start == course.enrollment_start, wrong_enrollment_start_msg - assert details.enrollment_end is None,\ + assert details.enrollment_end is None, \ ('enrollment_end date somehow initialized ' + str(details.enrollment_end)) - assert details.certificate_available_date is None,\ + assert details.certificate_available_date is None, \ ('certificate_available_date date somehow initialized ' + str(details.certificate_available_date)) assert details.syllabus is None, ('syllabus somehow initialized' + str(details.syllabus)) assert details.intro_video is None, ('intro_video somehow initialized' + str(details.intro_video)) diff --git a/openedx/core/djangoapps/user_api/management/commands/bulk_user_org_email_optout.py b/openedx/core/djangoapps/user_api/management/commands/bulk_user_org_email_optout.py index ab795491ec49..5c873a88eee6 100644 --- a/openedx/core/djangoapps/user_api/management/commands/bulk_user_org_email_optout.py +++ b/openedx/core/djangoapps/user_api/management/commands/bulk_user_org_email_optout.py @@ -138,8 +138,8 @@ def handle(self, *args, **options): cursor.execute('COMMIT;') log.info("Committed opt-out for rows (%s, %s) through (%s, %s).", - optout_rows[start_idx][0], optout_rows[start_idx][1], - optout_rows[end_idx][0], optout_rows[end_idx][1]) + optout_rows[start_idx][0], optout_rows[start_idx][1], + optout_rows[end_idx][0], optout_rows[end_idx][1]) log.info("Sleeping %s seconds...", sleep_between) time.sleep(sleep_between) curr_row_idx += chunk_size diff --git a/openedx/features/enterprise_support/tests/mixins/enterprise.py b/openedx/features/enterprise_support/tests/mixins/enterprise.py index 8b8f420dddfb..ac772aa94f6c 100644 --- a/openedx/features/enterprise_support/tests/mixins/enterprise.py +++ b/openedx/features/enterprise_support/tests/mixins/enterprise.py @@ -327,7 +327,7 @@ def mock_consent_reverse(*args, **kwargs): # Ensure that when consent is necessary, the user is redirected to the consent page. mock_consent_necessary.return_value = True response = client.get(url) - while(response.status_code == 302 and 'grant_data_sharing_permissions' not in response.url): + while (response.status_code == 302 and 'grant_data_sharing_permissions' not in response.url): response = client.get(response.url) assert response.status_code == 302 assert 'grant_data_sharing_permissions' in response.url diff --git a/xmodule/capa/checker.py b/xmodule/capa/checker.py index bcbdd85e5260..aa7252f9ff79 100755 --- a/xmodule/capa/checker.py +++ b/xmodule/capa/checker.py @@ -132,8 +132,7 @@ def check_that_suggested_answers_work(problem): in problem.grade_answers(all_answers).items() if answer_id in real_answers) log.debug(real_results) - assert(all(result == 'correct' - for answer_id, result in real_results.items())) + assert (all(result == 'correct' for answer_id, result in real_results.items())) except UndefinedVariable as uv_exc: log.error("The variable \"{0}\" specified in the ".format(uv_exc) + # lint-amnesty, pylint: disable=logging-not-lazy "solution isn't recognized (is it a units measure?).") diff --git a/xmodule/capa/inputtypes.py b/xmodule/capa/inputtypes.py index 8dff57768688..2628d58b6395 100644 --- a/xmodule/capa/inputtypes.py +++ b/xmodule/capa/inputtypes.py @@ -906,7 +906,7 @@ def ungraded_response(self, queue_msg, queuekey): nothing """ # check the queuekey against the saved queuekey - if('queuestate' in self.input_state and self.input_state['queuestate'] == 'queued' + if ('queuestate' in self.input_state and self.input_state['queuestate'] == 'queued' and self.input_state['queuekey'] == queuekey): msg = self._parse_data(queue_msg) # save the queue message so that it can be rendered later diff --git a/xmodule/capa/tests/test_responsetypes.py b/xmodule/capa/tests/test_responsetypes.py index e8df8894c78f..65caefde320b 100644 --- a/xmodule/capa/tests/test_responsetypes.py +++ b/xmodule/capa/tests/test_responsetypes.py @@ -2483,7 +2483,7 @@ def test_grade(self): actual_correctness = correct_map.get_correctness(answer_id) actual_points = correct_map.get_npoints(answer_id) - assert expected_correctness == actual_correctness,\ + assert expected_correctness == actual_correctness, \ ('%s should be marked %s' % (answer_id, expected_correctness)) assert expected_points == actual_points, ('%s should have %d points' % (answer_id, expected_points)) diff --git a/xmodule/capa/xqueue_interface.py b/xmodule/capa/xqueue_interface.py index d81d7f5747c0..054d409f2f9b 100644 --- a/xmodule/capa/xqueue_interface.py +++ b/xmodule/capa/xqueue_interface.py @@ -186,7 +186,7 @@ def construct_callback(self, dispatch: str = 'score_update') -> str: """ relative_xqueue_callback_url = reverse( 'xqueue_callback', - kwargs = { + kwargs={ "course_id": str(self._block.scope_ids.usage_id.context_key), "userid": str(self._block.scope_ids.user_id), "mod_id": str(self._block.scope_ids.usage_id), diff --git a/xmodule/capa_block.py b/xmodule/capa_block.py index dc543afc2aad..61cca6a3f9ad 100644 --- a/xmodule/capa_block.py +++ b/xmodule/capa_block.py @@ -998,7 +998,7 @@ def get_html(self): def handle_fatal_lcp_error(self, error): # lint-amnesty, pylint: disable=missing-function-docstring log.exception(f"LcpFatalError Encountered for {str(self.location)}") if error: - return( + return ( HTML('

Error formatting HTML for problem:

{msg}

').format( msg=str(error)) ) @@ -1719,7 +1719,7 @@ def make_dict_of_responses(data): try: val = json.loads(data[key]) # If the submission wasn't deserializable, raise an error. - except(KeyError, ValueError): + except (KeyError, ValueError): raise ValueError( # lint-amnesty, pylint: disable=raise-missing-from f"Invalid submission: {data[key]} for {key}" ) diff --git a/xmodule/course_block.py b/xmodule/course_block.py index cc203842c7d4..2767b9804653 100644 --- a/xmodule/course_block.py +++ b/xmodule/course_block.py @@ -864,7 +864,7 @@ class CourseFields: # lint-amnesty, pylint: disable=missing-class-docstring help=_( "Enter the proctoring provider you want to use for this course run. " "Choose from the following options: {available_providers}."), - help_format_args = { + help_format_args={ # Put the available providers into a format variable so that translators # don't translate them. "available_providers": ", ".join(get_available_providers()), diff --git a/xmodule/modulestore/tests/test_contentstore.py b/xmodule/modulestore/tests/test_contentstore.py index b5d755a8bea1..73519e5fe2b3 100644 --- a/xmodule/modulestore/tests/test_contentstore.py +++ b/xmodule/modulestore/tests/test_contentstore.py @@ -122,7 +122,7 @@ def test_find(self, deprecated): unknown_asset = self.course1_key.make_asset_key('asset', 'no_such_file.gif') with pytest.raises(NotFoundError): self.contentstore.find(unknown_asset) - assert self.contentstore.find(unknown_asset, throw_on_not_found=False) is None,\ + assert self.contentstore.find(unknown_asset, throw_on_not_found=False) is None, \ f'Found unknown asset {unknown_asset}' @ddt.data(True, False) diff --git a/xmodule/modulestore/tests/test_split_modulestore.py b/xmodule/modulestore/tests/test_split_modulestore.py index bee57733acee..f493baced9e8 100644 --- a/xmodule/modulestore/tests/test_split_modulestore.py +++ b/xmodule/modulestore/tests/test_split_modulestore.py @@ -1166,7 +1166,7 @@ def test_create_minimal_item(self): # check that course version changed and course's previous is the other one assert new_block.location.course == 'GreekHero' assert new_block.location.version_guid != premod_course.location.version_guid - assert locator.version_guid is None,\ + assert locator.version_guid is None, \ 'Version inadvertently filled in' # lint-amnesty, pylint: disable=no-member current_course = modulestore().get_course(locator) assert new_block.location.version_guid == current_course.location.version_guid @@ -2001,9 +2001,9 @@ def _check_course(self, source_course_loc, dest_course_loc, expected_blocks, une pub_copy = modulestore().get_item(dest_course_loc.make_usage_key(expected.type, expected.id)) # everything except previous_version & children should be the same assert source.category == pub_copy.category - assert source.update_version == pub_copy.source_version,\ + assert source.update_version == pub_copy.source_version, \ f"Versions don't match for {expected}: {source.update_version} != {pub_copy.update_version}" - assert self.user_id == pub_copy.edited_by,\ + assert self.user_id == pub_copy.edited_by, \ f'{pub_copy.location} edited_by {pub_copy.edited_by} not {self.user_id}' for field in source.fields.values(): if field.name == 'children': diff --git a/xmodule/tests/__init__.py b/xmodule/tests/__init__.py index b2cdd67b71ba..abb0120c9dc1 100644 --- a/xmodule/tests/__init__.py +++ b/xmodule/tests/__init__.py @@ -362,7 +362,7 @@ def extract_key(usage_key): elif isinstance(reference_field, ReferenceValueDict): expected = {key: extract_key(val) for (key, val) in expected.items()} actual = {key: extract_key(val) for (key, val) in actual.items()} - assert expected == actual,\ + assert expected == actual, \ LazyFormat("Field {} doesn't match between usages {} and {}: {!r} != {!r}", reference_field.name, expected_block.scope_ids.usage_id, @@ -386,7 +386,7 @@ def assertFieldEqual(self, field, expected_block, actual_block): else: expected = field.read_from(expected_block) actual = field.read_from(actual_block) - assert expected == actual,\ + assert expected == actual, \ LazyFormat("Field {} doesn't match between usages {} and {}: {!r} != {!r}", field.name, expected_block.scope_ids.usage_id, diff --git a/xmodule/tests/test_transcripts_utils.py b/xmodule/tests/test_transcripts_utils.py index bb4141f06c81..ffe2b9e582d4 100644 --- a/xmodule/tests/test_transcripts_utils.py +++ b/xmodule/tests/test_transcripts_utils.py @@ -123,7 +123,7 @@ def test_get_transcript_link_from_youtube(self, language_code, mock_get): {language_code: CAPTION_URL_UTF8_DECODED_TEMPLATE.format(language_code)} ) - @ mock.patch('requests.get') + @mock.patch('requests.get') @ddt.data(None) def test_get_caption_no_caption(self, language_code, mock_get): """ @@ -134,7 +134,7 @@ def test_get_caption_no_caption(self, language_code, mock_get): english_language_caption_link = get_transcript_link_from_youtube(YOUTUBE_VIDEO_ID) self.assertIsNone(english_language_caption_link) - @ mock.patch('requests.get') + @mock.patch('requests.get') def test_get_caption_malformed_caption_locator(self, mock_get): """ Caption track provided on video page for the selected language, but with broken syntax From 108700c360fb13bab50d5b5c4d8e001c44e50eeb Mon Sep 17 00:00:00 2001 From: Irtaza Akram Date: Tue, 19 Nov 2024 19:54:00 +0500 Subject: [PATCH 6/7] fix: pylint issues --- .../contentstore/api/views/course_quality.py | 4 +- .../api/views/course_validation.py | 48 +++++++------------ .../rest_api/v0/tests/test_tabs.py | 2 +- .../contentstore/tests/test_contentstore.py | 16 +++---- .../api/tests/test_permissions.py | 11 +---- .../courseware/tests/test_video_mongo.py | 30 +++++------- .../discussion/rest_api/tests/test_api.py | 17 ++----- .../tests/test_generate_jwt_signing_key.py | 4 +- openedx/core/djangoapps/programs/utils.py | 16 ++----- 9 files changed, 49 insertions(+), 99 deletions(-) diff --git a/cms/djangoapps/contentstore/api/views/course_quality.py b/cms/djangoapps/contentstore/api/views/course_quality.py index 1b34556a56d7..18fe15966ed2 100644 --- a/cms/djangoapps/contentstore/api/views/course_quality.py +++ b/cms/djangoapps/contentstore/api/views/course_quality.py @@ -103,9 +103,7 @@ def _execute_method_and_log_time(log_time, func, *args): # Added for EDUCATOR-3660 course_key_harvard = str(course_key) == 'course-v1:HarvardX+SW12.1x+2016' - response = { - "is_self_paced": course.self_paced, - } + response = {"is_self_paced": course.self_paced} if get_bool_param(request, 'sections', all_requested): response.update( {"sections": _execute_method_and_log_time(course_key_harvard, self._sections_quality, course)} diff --git a/cms/djangoapps/contentstore/api/views/course_validation.py b/cms/djangoapps/contentstore/api/views/course_validation.py index 39f9610550cf..f22ee68e78c5 100644 --- a/cms/djangoapps/contentstore/api/views/course_validation.py +++ b/cms/djangoapps/contentstore/api/views/course_validation.py @@ -74,35 +74,23 @@ def get(self, request, course_key): store = modulestore() with store.bulk_operations(course_key): - course = store.get_course(course_key, depth=self._required_course_depth(request, all_requested)) + course = store.get_course( + course_key, depth=self._required_course_depth(request, all_requested) + ) - response = { - "is_self_paced": course.self_paced, - } - if get_bool_param(request, 'dates', all_requested): - response.update( - dates=self._dates_validation(course) - ) - if get_bool_param(request, 'assignments', all_requested): - response.update( - assignments=self._assignments_validation(course, request) - ) - if get_bool_param(request, 'grades', all_requested): - response.update( - grades=self._grades_validation(course) - ) - if get_bool_param(request, 'certificates', all_requested): - response.update( - certificates=self._certificates_validation(course) - ) - if get_bool_param(request, 'updates', all_requested): - response.update( - updates=self._updates_validation(course, request) - ) - if get_bool_param(request, 'proctoring', all_requested): - response.update( - proctoring=self._proctoring_validation(course) - ) + response = {"is_self_paced": course.self_paced} + if get_bool_param(request, "dates", all_requested): + response.update({"dates": self._dates_validation(course)}) + if get_bool_param(request, "assignments", all_requested): + response.update({"assignments": self._assignments_validation(course, request)}) + if get_bool_param(request, "grades", all_requested): + response.update({"grades": self._grades_validation(course)}) + if get_bool_param(request, "certificates", all_requested): + response.update({"certificates": self._certificates_validation(course)}) + if get_bool_param(request, "updates", all_requested): + response.update({"updates": self._updates_validation(course, request)}) + if get_bool_param(request, "proctoring", all_requested): + response.update({"proctoring": self._proctoring_validation(course)}) return Response(response) @@ -222,9 +210,7 @@ def _certificates_validation(self, course): def _updates_validation(self, course, request): updates_usage_key = course.id.make_usage_key('course_info', 'updates') updates = get_course_updates(updates_usage_key, provided_id=None, user_id=request.user.id) - return { - "has_update": len(updates) > 0, - } + return {"has_update": len(updates) > 0} def _get_assignments(self, course): # lint-amnesty, pylint: disable=missing-function-docstring store = modulestore() diff --git a/cms/djangoapps/contentstore/rest_api/v0/tests/test_tabs.py b/cms/djangoapps/contentstore/rest_api/v0/tests/test_tabs.py index d08de967ad58..6b78ee1c16a3 100644 --- a/cms/djangoapps/contentstore/rest_api/v0/tests/test_tabs.py +++ b/cms/djangoapps/contentstore/rest_api/v0/tests/test_tabs.py @@ -213,7 +213,7 @@ def test_toggle_invalid_tab_visibility(self, invalid_tab_locator): @ddt.data( {"is_hidden": None}, - {"is_hidden": 'abc'}, + {"is_hidden": "abc"}, {}, ) def test_toggle_tab_invalid_visibility(self, invalid_visibility): diff --git a/cms/djangoapps/contentstore/tests/test_contentstore.py b/cms/djangoapps/contentstore/tests/test_contentstore.py index b01f26e73701..082ee7d1df82 100644 --- a/cms/djangoapps/contentstore/tests/test_contentstore.py +++ b/cms/djangoapps/contentstore/tests/test_contentstore.py @@ -1922,15 +1922,13 @@ def test_rerun_course_video_upload_token(self): def test_rerun_course_success(self): source_course = CourseFactory.create(default_store=ModuleStoreEnum.Type.split) - create_video( - { - "edx_video_id": "tree-hugger", - "courses": [str(source_course.id)], - "status": "test", - "duration": 2, - "encoded_videos": [] - } - ) + create_video({ + "edx_video_id": "tree-hugger", + "courses": [str(source_course.id)], + "status": "test", + "duration": 2, + "encoded_videos": [] + }) destination_course_key = self.post_rerun_request(source_course.id) self.verify_rerun_course(source_course.id, destination_course_key, self.destination_course_data['display_name']) diff --git a/common/djangoapps/third_party_auth/api/tests/test_permissions.py b/common/djangoapps/third_party_auth/api/tests/test_permissions.py index 4743fd3acc30..9ae60482b03e 100644 --- a/common/djangoapps/third_party_auth/api/tests/test_permissions.py +++ b/common/djangoapps/third_party_auth/api/tests/test_permissions.py @@ -108,16 +108,9 @@ def test_jwt_scopes(self, scopes, expected_response): "filters": ["tpa_provider:some_tpa_provider", "tpa_provider:another_tpa_provider"], "expected_response": 200, }, - # invalid provider filters - { - "filters": ["tpa_provider:another_tpa_provider"], - "expected_response": 403, - }, - { - "filters": [], - "expected_response": 403, - }, + {"filters": ["tpa_provider:another_tpa_provider"], "expected_response": 403}, + {"filters": [], "expected_response": 403}, ) @ddt.unpack def test_jwt_org_filters(self, filters, expected_response): diff --git a/lms/djangoapps/courseware/tests/test_video_mongo.py b/lms/djangoapps/courseware/tests/test_video_mongo.py index b4ee7d760018..2074f8f221b5 100644 --- a/lms/djangoapps/courseware/tests/test_video_mongo.py +++ b/lms/djangoapps/courseware/tests/test_video_mongo.py @@ -857,23 +857,19 @@ def encode_and_create_video(self, edx_video_id): encoded_videos = [] for profile, extension in [("desktop_webm", "webm"), ("desktop_mp4", "mp4")]: create_profile(profile) - encoded_videos.append( - { - 'url': f"http://fake-video.edx.org/{edx_video_id}.{extension}", - 'file_size': 9000, - 'bitrate': 42, - 'profile': profile, - } - ) - result = create_video( - { - 'client_video_id': 'A Client Video id', - 'duration': 111.0, - 'edx_video_id': edx_video_id, - 'status': 'test', - 'encoded_videos': encoded_videos, - } - ) + encoded_videos.append({ + 'url': f"http://fake-video.edx.org/{edx_video_id}.{extension}", + 'file_size': 9000, + 'bitrate': 42, + 'profile': profile, + }) + result = create_video({ + 'client_video_id': 'A Client Video id', + 'duration': 111.0, + 'edx_video_id': edx_video_id, + 'status': 'test', + 'encoded_videos': encoded_videos, + }) assert result == edx_video_id return encoded_videos diff --git a/lms/djangoapps/discussion/rest_api/tests/test_api.py b/lms/djangoapps/discussion/rest_api/tests/test_api.py index 96370d5d997f..4cbb44e40dc8 100644 --- a/lms/djangoapps/discussion/rest_api/tests/test_api.py +++ b/lms/djangoapps/discussion/rest_api/tests/test_api.py @@ -4179,23 +4179,14 @@ def setUp(self) -> None: # and one active topic return zero stats for testing. self.topic_stats = { **{ - topic_id: { - 'discussion': random.randint(0, 10), - 'question': random.randint(0, 10) - } + topic_id: {"discussion": random.randint(0, 10), "question": random.randint(0, 10)} for topic_id in self.all_topic_ids }, - deleted_topic_ids[0]: { - 'discussion': 0, - 'question': 0 - }, - self.topic_ids[0]: { - 'discussion': 0, - 'question': 0 - }, + deleted_topic_ids[0]: {"discussion": 0, "question": 0}, + self.topic_ids[0]: {"discussion": 0, "question": 0}, } patcher = mock.patch( - 'lms.djangoapps.discussion.rest_api.api.get_course_commentable_counts', + "lms.djangoapps.discussion.rest_api.api.get_course_commentable_counts", mock.Mock(return_value=self.topic_stats), ) patcher.start() diff --git a/openedx/core/djangoapps/oauth_dispatch/management/commands/tests/test_generate_jwt_signing_key.py b/openedx/core/djangoapps/oauth_dispatch/management/commands/tests/test_generate_jwt_signing_key.py index e2277b813964..7344328978a8 100644 --- a/openedx/core/djangoapps/oauth_dispatch/management/commands/tests/test_generate_jwt_signing_key.py +++ b/openedx/core/djangoapps/oauth_dispatch/management/commands/tests/test_generate_jwt_signing_key.py @@ -93,9 +93,7 @@ def _assert_presence_of_key_id(self, mock_log, output_stream, provide_key_id, ke ) @ddt.unpack def test_command(self, add_previous_public_keys, provide_key_id, key_id_size, strip_key_prefix): - command_options = { - "add_previous_public_keys": add_previous_public_keys, - } + command_options = {"add_previous_public_keys": add_previous_public_keys} if provide_key_id: command_options['key_id'] = TEST_KEY_IDENTIFIER if key_id_size: diff --git a/openedx/core/djangoapps/programs/utils.py b/openedx/core/djangoapps/programs/utils.py index 6c42be145764..f26be5589d56 100644 --- a/openedx/core/djangoapps/programs/utils.py +++ b/openedx/core/djangoapps/programs/utils.py @@ -755,16 +755,9 @@ def _collect_one_click_purchase_eligibility_data(self): # lint-amnesty, pylint: if is_anonymous or ALWAYS_CALCULATE_PROGRAM_PRICE_AS_ANONYMOUS_USER.is_enabled(): # The bundle uuid is necessary to see the program's discounted price if bundle_uuid: - params = { - "sku": skus, - "is_anonymous": True, - "bundle": bundle_uuid, - } + params = {"sku": skus, "is_anonymous": True, "bundle": bundle_uuid} else: - params = { - "sku": skus, - "is_anonymous": True, - } + params = {"sku": skus, "is_anonymous": True} else: if bundle_uuid: params = { @@ -773,10 +766,7 @@ def _collect_one_click_purchase_eligibility_data(self): # lint-amnesty, pylint: "bundle": bundle_uuid, } else: - params = { - "sku": skus, - "username": self.user.username, - } + params = {"sku": skus, "username": self.user.username} response = api_client.get(api_url, params=params) response.raise_for_status() discount_data = response.json() From 67a2270c47d94ac6b8186a988a1ddf7018e5f078 Mon Sep 17 00:00:00 2001 From: Irtaza Akram Date: Mon, 16 Dec 2024 12:04:49 +0500 Subject: [PATCH 7/7] chore: make upgrade --- requirements/edx-sandbox/base.txt | 12 +- requirements/edx/base.txt | 95 +++---------- requirements/edx/coverage.txt | 8 +- requirements/edx/development.txt | 127 ++++-------------- requirements/edx/doc.txt | 102 ++++---------- requirements/edx/paver.txt | 2 +- requirements/edx/semgrep.txt | 16 +-- requirements/edx/testing.txt | 124 ++++------------- scripts/user_retirement/requirements/base.txt | 36 ++--- .../user_retirement/requirements/testing.txt | 38 ++---- scripts/xblock/requirements.txt | 2 +- 11 files changed, 133 insertions(+), 429 deletions(-) diff --git a/requirements/edx-sandbox/base.txt b/requirements/edx-sandbox/base.txt index cb224e498823..401f74cef400 100644 --- a/requirements/edx-sandbox/base.txt +++ b/requirements/edx-sandbox/base.txt @@ -20,11 +20,7 @@ cryptography==44.0.0 # via -r requirements/edx-sandbox/base.in cycler==0.12.1 # via matplotlib -<<<<<<< HEAD -fonttools==4.55.0 -======= -fonttools==4.55.2 ->>>>>>> master +fonttools==4.55.3 # via matplotlib joblib==1.4.2 # via nltk @@ -41,7 +37,7 @@ markupsafe==3.0.2 # via # chem # openedx-calc -matplotlib==3.9.3 +matplotlib==3.10.0 # via -r requirements/edx-sandbox/base.in mpmath==1.3.0 # via sympy @@ -92,9 +88,5 @@ sympy==1.13.3 # via # -r requirements/edx-sandbox/base.in # openedx-calc -<<<<<<< HEAD -tqdm==4.67.0 -======= tqdm==4.67.1 ->>>>>>> master # via nltk diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index 0ea205b6de4e..b03843d02d05 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -10,15 +10,11 @@ acid-xblock==0.4.1 # via -r requirements/edx/kernel.in aiohappyeyeballs==2.4.4 # via aiohttp -<<<<<<< HEAD -aiohttp==3.11.4 -======= -aiohttp==3.11.9 ->>>>>>> master +aiohttp==3.11.10 # via # geoip2 # openai -aiosignal==1.3.1 +aiosignal==1.3.2 # via aiohttp algoliasearch==3.0.0 # via @@ -76,21 +72,13 @@ bleach[css]==6.2.0 # xblock-poll boto==2.49.0 # via -r requirements/edx/kernel.in -<<<<<<< HEAD -boto3==1.35.64 -======= -boto3==1.35.76 ->>>>>>> master +boto3==1.35.81 # via # -r requirements/edx/kernel.in # django-ses # fs-s3fs # ora2 -<<<<<<< HEAD -botocore==1.35.64 -======= -botocore==1.35.76 ->>>>>>> master +botocore==1.35.81 # via # -r requirements/edx/kernel.in # boto3 @@ -113,7 +101,7 @@ celery==5.4.0 # edx-enterprise # event-tracking # openedx-learning -certifi==2024.8.30 +certifi==2024.12.14 # via # -r requirements/edx/paver.txt # elasticsearch @@ -152,11 +140,7 @@ click-plugins==1.1.1 # via celery click-repl==0.3.0 # via celery -<<<<<<< HEAD -code-annotations==1.8.1 -======= -code-annotations==2.0.0 ->>>>>>> master +code-annotations==2.1.0 # via # edx-enterprise # edx-toggles @@ -337,7 +321,7 @@ django-oauth-toolkit==1.7.1 # edx-enterprise django-object-actions==4.3.0 # via edx-enterprise -django-pipeline==3.1.0 +django-pipeline==4.0.0 # via -r requirements/edx/kernel.in django-push-notifications==3.1.0 # via edx-ace @@ -347,7 +331,7 @@ django-sekizai==4.1.0 # via # -r requirements/edx/kernel.in # openedx-django-wiki -django-ses==4.3.0 +django-ses==4.3.1 # via -r requirements/edx/bundled.in django-simple-history==3.4.0 # via @@ -450,7 +434,7 @@ edx-celeryutils==1.3.0 # super-csv edx-codejail==3.5.2 # via -r requirements/edx/kernel.in -edx-completion==4.7.6 +edx-completion==4.7.7 # via -r requirements/edx/kernel.in edx-django-release-util==1.4.0 # via @@ -524,7 +508,7 @@ edx-opaque-keys[django]==2.11.0 # ora2 edx-organizations==6.13.0 # via -r requirements/edx/kernel.in -edx-proctoring==4.18.4 +edx-proctoring==5.0.1 # via # -r requirements/edx/kernel.in # edx-proctoring-proctortrack @@ -541,7 +525,7 @@ edx-search==4.1.1 # openedx-forum edx-sga==0.25.0 # via -r requirements/edx/bundled.in -edx-submissions==3.8.3 +edx-submissions==3.8.4 # via # -r requirements/edx/kernel.in # ora2 @@ -609,20 +593,16 @@ geoip2==4.8.1 # via -r requirements/edx/kernel.in glob2==0.7 # via -r requirements/edx/kernel.in -google-api-core[grpc]==2.23.0 +google-api-core[grpc]==2.24.0 # via # firebase-admin # google-api-python-client # google-cloud-core # google-cloud-firestore # google-cloud-storage -<<<<<<< HEAD -google-api-python-client==2.153.0 -======= -google-api-python-client==2.154.0 ->>>>>>> master +google-api-python-client==2.155.0 # via firebase-admin -google-auth==2.36.0 +google-auth==2.37.0 # via # google-api-core # google-api-python-client @@ -650,19 +630,11 @@ googleapis-common-protos==1.66.0 # via # google-api-core # grpcio-status -<<<<<<< HEAD -grpcio==1.68.0 - # via - # google-api-core - # grpcio-status -grpcio-status==1.68.0 -======= grpcio==1.68.1 # via # google-api-core # grpcio-status grpcio-status==1.68.1 ->>>>>>> master # via google-api-core gunicorn==23.0.0 # via -r requirements/edx/kernel.in @@ -762,7 +734,7 @@ lxml-html-clean==0.4.1 # via lxml mailsnake==1.6.4 # via -r requirements/edx/bundled.in -mako==1.3.7 +mako==1.3.8 # via # -r requirements/edx/kernel.in # acid-xblock @@ -809,15 +781,10 @@ multidict==6.1.0 # aiohttp # yarl mysqlclient==2.2.6 -<<<<<<< HEAD - # via -r requirements/edx/kernel.in -newrelic==10.3.0 -======= # via # -r requirements/edx/kernel.in # openedx-forum -newrelic==10.3.1 ->>>>>>> master +newrelic==10.4.0 # via edx-django-utils nh3==0.2.19 # via -r requirements/edx/kernel.in @@ -869,7 +836,7 @@ openedx-events==9.15.0 # edx-name-affirmation # event-tracking # ora2 -openedx-filters==1.11.0 +openedx-filters==1.12.0 # via # -r requirements/edx/kernel.in # lti-consumer-xblock @@ -886,7 +853,7 @@ optimizely-sdk==4.1.1 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/bundled.in -ora2==6.14.1 +ora2==6.14.2 # via -r requirements/edx/bundled.in packaging==24.2 # via @@ -933,11 +900,7 @@ polib==1.2.0 # via edx-i18n-tools prompt-toolkit==3.0.48 # via click-repl -<<<<<<< HEAD -propcache==0.2.0 -======= propcache==0.2.1 ->>>>>>> master # via # aiohttp # yarl @@ -990,11 +953,7 @@ pyjwkest==1.4.2 # -r requirements/edx/kernel.in # edx-token-utils # lti-consumer-xblock -<<<<<<< HEAD -pyjwt[crypto]==2.10.0 -======= pyjwt[crypto]==2.10.1 ->>>>>>> master # via # -r requirements/edx/kernel.in # drf-jwt @@ -1103,7 +1062,7 @@ random2==1.0.2 # via -r requirements/edx/kernel.in recommender-xblock==3.0.0 # via -r requirements/edx/bundled.in -redis==5.2.0 +redis==5.2.1 # via # -r requirements/edx/kernel.in # walrus @@ -1145,11 +1104,7 @@ requests-oauthlib==2.0.0 # via # -r requirements/edx/kernel.in # social-auth-core -<<<<<<< HEAD -rpds-py==0.21.0 -======= rpds-py==0.22.3 ->>>>>>> master # via # jsonschema # referencing @@ -1232,7 +1187,7 @@ sortedcontainers==2.4.0 # snowflake-connector-python soupsieve==2.6 # via beautifulsoup4 -sqlparse==0.5.2 +sqlparse==0.5.3 # via django staff-graded-xblock==2.3.0 # via -r requirements/edx/bundled.in @@ -1257,11 +1212,7 @@ tinycss2==1.4.0 # via bleach tomlkit==0.13.2 # via snowflake-connector-python -<<<<<<< HEAD -tqdm==4.67.0 -======= tqdm==4.67.1 ->>>>>>> master # via # nltk # openai @@ -1328,6 +1279,8 @@ webob==1.8.9 # via # -r requirements/edx/kernel.in # xblock +wheel==0.45.1 + # via django-pipeline wrapt==1.17.0 # via -r requirements/edx/paver.txt xblock[django]==5.1.0 @@ -1362,11 +1315,7 @@ xmlsec==1.3.14 # via python3-saml xss-utils==0.6.0 # via -r requirements/edx/kernel.in -<<<<<<< HEAD -yarl==1.17.2 -======= yarl==1.18.3 ->>>>>>> master # via aiohttp zipp==3.21.0 # via importlib-metadata diff --git a/requirements/edx/coverage.txt b/requirements/edx/coverage.txt index 24caf4178a9e..23a32bde5e5c 100644 --- a/requirements/edx/coverage.txt +++ b/requirements/edx/coverage.txt @@ -6,13 +6,9 @@ # chardet==5.2.0 # via diff-cover -<<<<<<< HEAD -coverage==7.6.7 -======= -coverage==7.6.8 ->>>>>>> master +coverage==7.6.9 # via -r requirements/edx/coverage.in -diff-cover==9.2.0 +diff-cover==9.2.1 # via -r requirements/edx/coverage.in jinja2==3.1.4 # via diff-cover diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt index a43bb3dc0f45..216acaab3e0b 100644 --- a/requirements/edx/development.txt +++ b/requirements/edx/development.txt @@ -21,17 +21,13 @@ aiohappyeyeballs==2.4.4 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # aiohttp -<<<<<<< HEAD -aiohttp==3.11.4 -======= -aiohttp==3.11.9 ->>>>>>> master +aiohttp==3.11.10 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # geoip2 # openai -aiosignal==1.3.1 +aiosignal==1.3.2 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -85,7 +81,7 @@ asn1crypto==1.5.1 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # snowflake-connector-python -astroid==3.3.5 +astroid==3.3.6 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -147,22 +143,14 @@ boto==2.49.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -<<<<<<< HEAD -boto3==1.35.64 -======= -boto3==1.35.76 ->>>>>>> master +boto3==1.35.81 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # django-ses # fs-s3fs # ora2 -<<<<<<< HEAD -botocore==1.35.64 -======= -botocore==1.35.76 ->>>>>>> master +botocore==1.35.81 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -203,7 +191,7 @@ celery==5.4.0 # edx-enterprise # event-tracking # openedx-learning -certifi==2024.8.30 +certifi==2024.12.14 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -278,11 +266,7 @@ click-repl==0.3.0 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # celery -<<<<<<< HEAD -code-annotations==1.8.1 -======= -code-annotations==2.0.0 ->>>>>>> master +code-annotations==2.1.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -297,11 +281,7 @@ colorama==0.4.6 # via # -r requirements/edx/testing.txt # tox -<<<<<<< HEAD -coverage[toml]==7.6.7 -======= -coverage[toml]==7.6.8 ->>>>>>> master +coverage[toml]==7.6.9 # via # -r requirements/edx/testing.txt # pytest-cov @@ -346,7 +326,7 @@ defusedxml==0.7.1 # ora2 # python3-openid # social-auth-core -diff-cover==9.2.0 +diff-cover==9.2.1 # via -r requirements/edx/testing.txt dill==0.3.9 # via @@ -550,7 +530,7 @@ django-object-actions==4.3.0 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edx-enterprise -django-pipeline==3.1.0 +django-pipeline==4.0.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -568,7 +548,7 @@ django-sekizai==4.1.0 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # openedx-django-wiki -django-ses==4.3.0 +django-ses==4.3.1 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -722,7 +702,7 @@ edx-codejail==3.5.2 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -edx-completion==4.7.6 +edx-completion==4.7.7 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -817,7 +797,7 @@ edx-organizations==6.13.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -edx-proctoring==4.18.4 +edx-proctoring==5.0.1 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -842,7 +822,7 @@ edx-sga==0.25.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -edx-submissions==3.8.3 +edx-submissions==3.8.4 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -908,19 +888,11 @@ execnet==2.1.1 # pytest-xdist factory-boy==3.3.1 # via -r requirements/edx/testing.txt -<<<<<<< HEAD -faker==33.0.0 - # via - # -r requirements/edx/testing.txt - # factory-boy -fastapi==0.115.5 -======= faker==33.1.0 # via # -r requirements/edx/testing.txt # factory-boy fastapi==0.115.6 ->>>>>>> master # via # -r requirements/edx/testing.txt # pact-python @@ -980,7 +952,7 @@ glob2==0.7 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -google-api-core[grpc]==2.23.0 +google-api-core[grpc]==2.24.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -989,16 +961,12 @@ google-api-core[grpc]==2.23.0 # google-cloud-core # google-cloud-firestore # google-cloud-storage -<<<<<<< HEAD -google-api-python-client==2.153.0 -======= -google-api-python-client==2.154.0 ->>>>>>> master +google-api-python-client==2.155.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # firebase-admin -google-auth==2.36.0 +google-auth==2.37.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1050,21 +1018,13 @@ grimp==3.5 # via # -r requirements/edx/testing.txt # import-linter -<<<<<<< HEAD -grpcio==1.68.0 -======= grpcio==1.68.1 ->>>>>>> master # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # google-api-core # grpcio-status -<<<<<<< HEAD -grpcio-status==1.68.0 -======= grpcio-status==1.68.1 ->>>>>>> master # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1253,7 +1213,7 @@ mailsnake==1.6.4 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -mako==1.3.7 +mako==1.3.8 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1343,12 +1303,8 @@ mysqlclient==2.2.6 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -<<<<<<< HEAD -newrelic==10.3.0 -======= # openedx-forum -newrelic==10.3.1 ->>>>>>> master +newrelic==10.4.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1428,7 +1384,7 @@ openedx-events==9.15.0 # edx-name-affirmation # event-tracking # ora2 -openedx-filters==1.11.0 +openedx-filters==1.12.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1452,7 +1408,7 @@ optimizely-sdk==4.1.1 # -c requirements/edx/../constraints.txt # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -ora2==6.14.1 +ora2==6.14.2 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1648,11 +1604,7 @@ pyjwkest==1.4.2 # -r requirements/edx/testing.txt # edx-token-utils # lti-consumer-xblock -<<<<<<< HEAD -pyjwt[crypto]==2.10.0 -======= pyjwt[crypto]==2.10.1 ->>>>>>> master # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1670,7 +1622,7 @@ pylatexenc==2.10 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # olxcleaner -pylint==3.3.1 +pylint==3.3.2 # via # -r requirements/edx/testing.txt # edx-lint @@ -1755,11 +1707,7 @@ pysrt==1.1.2 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # edxval -<<<<<<< HEAD pytest==8.2.0 -======= -pytest==8.3.4 ->>>>>>> master # via # -r requirements/edx/testing.txt # pylint-pytest @@ -1875,7 +1823,7 @@ recommender-xblock==3.0.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -redis==5.2.0 +redis==5.2.1 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1928,11 +1876,7 @@ requests-oauthlib==2.0.0 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # social-auth-core -<<<<<<< HEAD -rpds-py==0.21.0 -======= rpds-py==0.22.3 ->>>>>>> master # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -2120,7 +2064,7 @@ sphinxcontrib-serializinghtml==2.0.0 # sphinx sphinxext-rediraffe==0.2.7 # via -r requirements/edx/doc.txt -sqlparse==0.5.2 +sqlparse==0.5.3 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -2168,11 +2112,7 @@ tinycss2==1.4.0 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # bleach -<<<<<<< HEAD -tomli==2.1.0 -======= tomli==2.2.1 ->>>>>>> master # via django-stubs tomlkit==0.13.2 # via @@ -2182,11 +2122,7 @@ tomlkit==0.13.2 # snowflake-connector-python tox==4.23.2 # via -r requirements/edx/testing.txt -<<<<<<< HEAD -tqdm==4.67.0 -======= tqdm==4.67.1 ->>>>>>> master # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -2255,7 +2191,7 @@ user-util==1.1.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -uvicorn==0.32.1 +uvicorn==0.34.0 # via # -r requirements/edx/testing.txt # pact-python @@ -2275,7 +2211,7 @@ voluptuous==0.15.2 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # ora2 -vulture==2.13 +vulture==2.14 # via -r requirements/edx/development.in walrus==0.9.4 # via @@ -2313,13 +2249,12 @@ webob==1.8.9 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # xblock -<<<<<<< HEAD -wheel==0.45.0 -======= wheel==0.45.1 ->>>>>>> master # via # -r requirements/edx/../pip-tools.txt + # -r requirements/edx/doc.txt + # -r requirements/edx/testing.txt + # django-pipeline # pip-tools wrapt==1.17.0 # via @@ -2373,11 +2308,7 @@ xss-utils==0.6.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -<<<<<<< HEAD -yarl==1.17.2 -======= yarl==1.18.3 ->>>>>>> master # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt diff --git a/requirements/edx/doc.txt b/requirements/edx/doc.txt index a980f8b39168..980cc42044a2 100644 --- a/requirements/edx/doc.txt +++ b/requirements/edx/doc.txt @@ -14,16 +14,12 @@ aiohappyeyeballs==2.4.4 # via # -r requirements/edx/base.txt # aiohttp -<<<<<<< HEAD -aiohttp==3.11.4 -======= -aiohttp==3.11.9 ->>>>>>> master +aiohttp==3.11.10 # via # -r requirements/edx/base.txt # geoip2 # openai -aiosignal==1.3.1 +aiosignal==1.3.2 # via # -r requirements/edx/base.txt # aiohttp @@ -61,7 +57,7 @@ asn1crypto==1.5.1 # via # -r requirements/edx/base.txt # snowflake-connector-python -astroid==3.3.5 +astroid==3.3.6 # via sphinx-autoapi attrs==24.2.0 # via @@ -109,21 +105,13 @@ bleach[css]==6.2.0 # xblock-poll boto==2.49.0 # via -r requirements/edx/base.txt -<<<<<<< HEAD -boto3==1.35.64 -======= -boto3==1.35.76 ->>>>>>> master +boto3==1.35.81 # via # -r requirements/edx/base.txt # django-ses # fs-s3fs # ora2 -<<<<<<< HEAD -botocore==1.35.64 -======= -botocore==1.35.76 ->>>>>>> master +botocore==1.35.81 # via # -r requirements/edx/base.txt # boto3 @@ -152,7 +140,7 @@ celery==5.4.0 # edx-enterprise # event-tracking # openedx-learning -certifi==2024.8.30 +certifi==2024.12.14 # via # -r requirements/edx/base.txt # elasticsearch @@ -201,11 +189,7 @@ click-repl==0.3.0 # via # -r requirements/edx/base.txt # celery -<<<<<<< HEAD -code-annotations==1.8.1 -======= -code-annotations==2.0.0 ->>>>>>> master +code-annotations==2.1.0 # via # -r requirements/edx/base.txt # -r requirements/edx/doc.in @@ -406,7 +390,7 @@ django-object-actions==4.3.0 # via # -r requirements/edx/base.txt # edx-enterprise -django-pipeline==3.1.0 +django-pipeline==4.0.0 # via -r requirements/edx/base.txt django-push-notifications==3.1.0 # via @@ -418,7 +402,7 @@ django-sekizai==4.1.0 # via # -r requirements/edx/base.txt # openedx-django-wiki -django-ses==4.3.0 +django-ses==4.3.1 # via -r requirements/edx/base.txt django-simple-history==3.4.0 # via @@ -531,7 +515,7 @@ edx-celeryutils==1.3.0 # super-csv edx-codejail==3.5.2 # via -r requirements/edx/base.txt -edx-completion==4.7.6 +edx-completion==4.7.7 # via -r requirements/edx/base.txt edx-django-release-util==1.4.0 # via @@ -604,7 +588,7 @@ edx-opaque-keys[django]==2.11.0 # ora2 edx-organizations==6.13.0 # via -r requirements/edx/base.txt -edx-proctoring==4.18.4 +edx-proctoring==5.0.1 # via # -r requirements/edx/base.txt # edx-proctoring-proctortrack @@ -623,7 +607,7 @@ edx-search==4.1.1 # openedx-forum edx-sga==0.25.0 # via -r requirements/edx/base.txt -edx-submissions==3.8.3 +edx-submissions==3.8.4 # via # -r requirements/edx/base.txt # ora2 @@ -709,7 +693,7 @@ gitpython==3.1.43 # via -r requirements/edx/doc.in glob2==0.7 # via -r requirements/edx/base.txt -google-api-core[grpc]==2.23.0 +google-api-core[grpc]==2.24.0 # via # -r requirements/edx/base.txt # firebase-admin @@ -717,15 +701,11 @@ google-api-core[grpc]==2.23.0 # google-cloud-core # google-cloud-firestore # google-cloud-storage -<<<<<<< HEAD -google-api-python-client==2.153.0 -======= -google-api-python-client==2.154.0 ->>>>>>> master +google-api-python-client==2.155.0 # via # -r requirements/edx/base.txt # firebase-admin -google-auth==2.36.0 +google-auth==2.37.0 # via # -r requirements/edx/base.txt # google-api-core @@ -765,20 +745,12 @@ googleapis-common-protos==1.66.0 # -r requirements/edx/base.txt # google-api-core # grpcio-status -<<<<<<< HEAD -grpcio==1.68.0 -======= grpcio==1.68.1 ->>>>>>> master # via # -r requirements/edx/base.txt # google-api-core # grpcio-status -<<<<<<< HEAD -grpcio-status==1.68.0 -======= grpcio-status==1.68.1 ->>>>>>> master # via # -r requirements/edx/base.txt # google-api-core @@ -908,7 +880,7 @@ lxml-html-clean==0.4.1 # lxml mailsnake==1.6.4 # via -r requirements/edx/base.txt -mako==1.3.7 +mako==1.3.8 # via # -r requirements/edx/base.txt # acid-xblock @@ -967,15 +939,10 @@ multidict==6.1.0 # aiohttp # yarl mysqlclient==2.2.6 -<<<<<<< HEAD - # via -r requirements/edx/base.txt -newrelic==10.3.0 -======= # via # -r requirements/edx/base.txt # openedx-forum -newrelic==10.3.1 ->>>>>>> master +newrelic==10.4.0 # via # -r requirements/edx/base.txt # edx-django-utils @@ -1034,7 +1001,7 @@ openedx-events==9.15.0 # edx-name-affirmation # event-tracking # ora2 -openedx-filters==1.11.0 +openedx-filters==1.12.0 # via # -r requirements/edx/base.txt # lti-consumer-xblock @@ -1051,7 +1018,7 @@ optimizely-sdk==4.1.1 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt -ora2==6.14.1 +ora2==6.14.2 # via -r requirements/edx/base.txt packaging==24.2 # via @@ -1185,11 +1152,7 @@ pyjwkest==1.4.2 # -r requirements/edx/base.txt # edx-token-utils # lti-consumer-xblock -<<<<<<< HEAD -pyjwt[crypto]==2.10.0 -======= pyjwt[crypto]==2.10.1 ->>>>>>> master # via # -r requirements/edx/base.txt # drf-jwt @@ -1312,7 +1275,7 @@ random2==1.0.2 # via -r requirements/edx/base.txt recommender-xblock==3.0.0 # via -r requirements/edx/base.txt -redis==5.2.0 +redis==5.2.1 # via # -r requirements/edx/base.txt # walrus @@ -1358,11 +1321,7 @@ requests-oauthlib==2.0.0 # via # -r requirements/edx/base.txt # social-auth-core -<<<<<<< HEAD -rpds-py==0.21.0 -======= rpds-py==0.22.3 ->>>>>>> master # via # -r requirements/edx/base.txt # jsonschema @@ -1503,7 +1462,7 @@ sphinxcontrib-serializinghtml==2.0.0 # via sphinx sphinxext-rediraffe==0.2.7 # via -r requirements/edx/doc.in -sqlparse==0.5.2 +sqlparse==0.5.3 # via # -r requirements/edx/base.txt # django @@ -1541,11 +1500,7 @@ tomlkit==0.13.2 # via # -r requirements/edx/base.txt # snowflake-connector-python -<<<<<<< HEAD -tqdm==4.67.0 -======= tqdm==4.67.1 ->>>>>>> master # via # -r requirements/edx/base.txt # nltk @@ -1624,15 +1579,12 @@ webob==1.8.9 # via # -r requirements/edx/base.txt # xblock -<<<<<<< HEAD -wrapt==1.16.0 - # via -r requirements/edx/base.txt -======= -wrapt==1.17.0 +wheel==0.45.1 # via # -r requirements/edx/base.txt - # astroid ->>>>>>> master + # django-pipeline +wrapt==1.17.0 + # via -r requirements/edx/base.txt xblock[django]==5.1.0 # via # -r requirements/edx/base.txt @@ -1668,11 +1620,7 @@ xmlsec==1.3.14 # python3-saml xss-utils==0.6.0 # via -r requirements/edx/base.txt -<<<<<<< HEAD -yarl==1.17.2 -======= yarl==1.18.3 ->>>>>>> master # via # -r requirements/edx/base.txt # aiohttp diff --git a/requirements/edx/paver.txt b/requirements/edx/paver.txt index c9ee8f3aff49..6c3d7272b47e 100644 --- a/requirements/edx/paver.txt +++ b/requirements/edx/paver.txt @@ -4,7 +4,7 @@ # # make upgrade # -certifi==2024.8.30 +certifi==2024.12.14 # via requests charset-normalizer==2.0.12 # via diff --git a/requirements/edx/semgrep.txt b/requirements/edx/semgrep.txt index 98481fc8d00a..9f7f2a04faae 100644 --- a/requirements/edx/semgrep.txt +++ b/requirements/edx/semgrep.txt @@ -4,7 +4,7 @@ # # make upgrade # -attrs==24.2.0 +attrs==24.3.0 # via # glom # jsonschema @@ -17,7 +17,7 @@ boltons==21.0.0 # semgrep bracex==2.5.post1 # via wcmatch -certifi==2024.8.30 +certifi==2024.12.14 # via requests charset-normalizer==2.0.12 # via @@ -108,23 +108,15 @@ requests==2.32.3 # semgrep rich==13.5.3 # via semgrep -<<<<<<< HEAD -rpds-py==0.21.0 -======= rpds-py==0.22.3 ->>>>>>> master # via # jsonschema # referencing -ruamel-yaml==0.17.40 +ruamel-yaml==0.18.6 # via semgrep ruamel-yaml-clib==0.2.12 # via ruamel-yaml -<<<<<<< HEAD -semgrep==1.96.0 -======= -semgrep==1.97.0 ->>>>>>> master +semgrep==1.100.0 # via -r requirements/edx/semgrep.in tomli==2.0.2 # via semgrep diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt index c1b93657bb7d..868f40987d32 100644 --- a/requirements/edx/testing.txt +++ b/requirements/edx/testing.txt @@ -12,16 +12,12 @@ aiohappyeyeballs==2.4.4 # via # -r requirements/edx/base.txt # aiohttp -<<<<<<< HEAD -aiohttp==3.11.4 -======= -aiohttp==3.11.9 ->>>>>>> master +aiohttp==3.11.10 # via # -r requirements/edx/base.txt # geoip2 # openai -aiosignal==1.3.1 +aiosignal==1.3.2 # via # -r requirements/edx/base.txt # aiohttp @@ -59,7 +55,7 @@ asn1crypto==1.5.1 # via # -r requirements/edx/base.txt # snowflake-connector-python -astroid==3.3.5 +astroid==3.3.6 # via # pylint # pylint-celery @@ -107,21 +103,13 @@ bleach[css]==6.2.0 # xblock-poll boto==2.49.0 # via -r requirements/edx/base.txt -<<<<<<< HEAD -boto3==1.35.64 -======= -boto3==1.35.76 ->>>>>>> master +boto3==1.35.81 # via # -r requirements/edx/base.txt # django-ses # fs-s3fs # ora2 -<<<<<<< HEAD -botocore==1.35.64 -======= -botocore==1.35.76 ->>>>>>> master +botocore==1.35.81 # via # -r requirements/edx/base.txt # boto3 @@ -151,7 +139,7 @@ celery==5.4.0 # edx-enterprise # event-tracking # openedx-learning -certifi==2024.8.30 +certifi==2024.12.14 # via # -r requirements/edx/base.txt # elasticsearch @@ -211,11 +199,7 @@ click-repl==0.3.0 # via # -r requirements/edx/base.txt # celery -<<<<<<< HEAD -code-annotations==1.8.1 -======= -code-annotations==2.0.0 ->>>>>>> master +code-annotations==2.1.0 # via # -r requirements/edx/base.txt # -r requirements/edx/testing.in @@ -226,11 +210,7 @@ codejail-includes==1.0.0 # via -r requirements/edx/base.txt colorama==0.4.6 # via tox -<<<<<<< HEAD -coverage[toml]==7.6.7 -======= -coverage[toml]==7.6.8 ->>>>>>> master +coverage[toml]==7.6.9 # via # -r requirements/edx/coverage.txt # pytest-cov @@ -266,7 +246,7 @@ defusedxml==0.7.1 # ora2 # python3-openid # social-auth-core -diff-cover==9.2.0 +diff-cover==9.2.1 # via -r requirements/edx/coverage.txt dill==0.3.9 # via pylint @@ -437,7 +417,7 @@ django-object-actions==4.3.0 # via # -r requirements/edx/base.txt # edx-enterprise -django-pipeline==3.1.0 +django-pipeline==4.0.0 # via -r requirements/edx/base.txt django-push-notifications==3.1.0 # via @@ -449,7 +429,7 @@ django-sekizai==4.1.0 # via # -r requirements/edx/base.txt # openedx-django-wiki -django-ses==4.3.0 +django-ses==4.3.1 # via -r requirements/edx/base.txt django-simple-history==3.4.0 # via @@ -557,7 +537,7 @@ edx-celeryutils==1.3.0 # super-csv edx-codejail==3.5.2 # via -r requirements/edx/base.txt -edx-completion==4.7.6 +edx-completion==4.7.7 # via -r requirements/edx/base.txt edx-django-release-util==1.4.0 # via @@ -632,7 +612,7 @@ edx-opaque-keys[django]==2.11.0 # ora2 edx-organizations==6.13.0 # via -r requirements/edx/base.txt -edx-proctoring==4.18.4 +edx-proctoring==5.0.1 # via # -r requirements/edx/base.txt # edx-proctoring-proctortrack @@ -651,7 +631,7 @@ edx-search==4.1.1 # openedx-forum edx-sga==0.25.0 # via -r requirements/edx/base.txt -edx-submissions==3.8.3 +edx-submissions==3.8.4 # via # -r requirements/edx/base.txt # ora2 @@ -702,15 +682,9 @@ execnet==2.1.1 # via pytest-xdist factory-boy==3.3.1 # via -r requirements/edx/testing.in -<<<<<<< HEAD -faker==33.0.0 - # via factory-boy -fastapi==0.115.5 -======= faker==33.1.0 # via factory-boy fastapi==0.115.6 ->>>>>>> master # via pact-python fastavro==1.9.7 # via @@ -751,7 +725,7 @@ geoip2==4.8.1 # via -r requirements/edx/base.txt glob2==0.7 # via -r requirements/edx/base.txt -google-api-core[grpc]==2.23.0 +google-api-core[grpc]==2.24.0 # via # -r requirements/edx/base.txt # firebase-admin @@ -759,15 +733,11 @@ google-api-core[grpc]==2.23.0 # google-cloud-core # google-cloud-firestore # google-cloud-storage -<<<<<<< HEAD -google-api-python-client==2.153.0 -======= -google-api-python-client==2.154.0 ->>>>>>> master +google-api-python-client==2.155.0 # via # -r requirements/edx/base.txt # firebase-admin -google-auth==2.36.0 +google-auth==2.37.0 # via # -r requirements/edx/base.txt # google-api-core @@ -809,20 +779,12 @@ googleapis-common-protos==1.66.0 # grpcio-status grimp==3.5 # via import-linter -<<<<<<< HEAD -grpcio==1.68.0 -======= grpcio==1.68.1 ->>>>>>> master # via # -r requirements/edx/base.txt # google-api-core # grpcio-status -<<<<<<< HEAD -grpcio-status==1.68.0 -======= grpcio-status==1.68.1 ->>>>>>> master # via # -r requirements/edx/base.txt # google-api-core @@ -963,7 +925,7 @@ lxml-html-clean==0.4.1 # lxml mailsnake==1.6.4 # via -r requirements/edx/base.txt -mako==1.3.7 +mako==1.3.8 # via # -r requirements/edx/base.txt # acid-xblock @@ -1023,15 +985,10 @@ multidict==6.1.0 # aiohttp # yarl mysqlclient==2.2.6 -<<<<<<< HEAD - # via -r requirements/edx/base.txt -newrelic==10.3.0 -======= # via # -r requirements/edx/base.txt # openedx-forum -newrelic==10.3.1 ->>>>>>> master +newrelic==10.4.0 # via # -r requirements/edx/base.txt # edx-django-utils @@ -1090,7 +1047,7 @@ openedx-events==9.15.0 # edx-name-affirmation # event-tracking # ora2 -openedx-filters==1.11.0 +openedx-filters==1.12.0 # via # -r requirements/edx/base.txt # lti-consumer-xblock @@ -1107,7 +1064,7 @@ optimizely-sdk==4.1.1 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt -ora2==6.14.1 +ora2==6.14.2 # via -r requirements/edx/base.txt packaging==24.2 # via @@ -1256,11 +1213,7 @@ pyjwkest==1.4.2 # -r requirements/edx/base.txt # edx-token-utils # lti-consumer-xblock -<<<<<<< HEAD -pyjwt[crypto]==2.10.0 -======= pyjwt[crypto]==2.10.1 ->>>>>>> master # via # -r requirements/edx/base.txt # drf-jwt @@ -1276,7 +1229,7 @@ pylatexenc==2.10 # via # -r requirements/edx/base.txt # olxcleaner -pylint==3.3.1 +pylint==3.3.2 # via # edx-lint # pylint-celery @@ -1336,11 +1289,7 @@ pysrt==1.1.2 # via # -r requirements/edx/base.txt # edxval -<<<<<<< HEAD pytest==8.2.0 -======= -pytest==8.3.4 ->>>>>>> master # via # -r requirements/edx/testing.in # pylint-pytest @@ -1435,7 +1384,7 @@ random2==1.0.2 # via -r requirements/edx/base.txt recommender-xblock==3.0.0 # via -r requirements/edx/base.txt -redis==5.2.0 +redis==5.2.1 # via # -r requirements/edx/base.txt # walrus @@ -1481,11 +1430,7 @@ requests-oauthlib==2.0.0 # via # -r requirements/edx/base.txt # social-auth-core -<<<<<<< HEAD -rpds-py==0.21.0 -======= rpds-py==0.22.3 ->>>>>>> master # via # -r requirements/edx/base.txt # jsonschema @@ -1587,7 +1532,7 @@ soupsieve==2.6 # via # -r requirements/edx/base.txt # beautifulsoup4 -sqlparse==0.5.2 +sqlparse==0.5.3 # via # -r requirements/edx/base.txt # django @@ -1631,11 +1576,7 @@ tomlkit==0.13.2 # snowflake-connector-python tox==4.23.2 # via -r requirements/edx/testing.in -<<<<<<< HEAD -tqdm==4.67.0 -======= tqdm==4.67.1 ->>>>>>> master # via # -r requirements/edx/base.txt # nltk @@ -1682,7 +1623,7 @@ urllib3==2.2.3 # requests user-util==1.1.0 # via -r requirements/edx/base.txt -uvicorn==0.32.1 +uvicorn==0.34.0 # via pact-python vine==5.1.0 # via @@ -1724,15 +1665,12 @@ webob==1.8.9 # via # -r requirements/edx/base.txt # xblock -<<<<<<< HEAD -wrapt==1.16.0 - # via -r requirements/edx/base.txt -======= -wrapt==1.17.0 +wheel==0.45.1 # via # -r requirements/edx/base.txt - # astroid ->>>>>>> master + # django-pipeline +wrapt==1.17.0 + # via -r requirements/edx/base.txt xblock[django]==5.1.0 # via # -r requirements/edx/base.txt @@ -1768,11 +1706,7 @@ xmlsec==1.3.14 # python3-saml xss-utils==0.6.0 # via -r requirements/edx/base.txt -<<<<<<< HEAD -yarl==1.17.2 -======= yarl==1.18.3 ->>>>>>> master # via # -r requirements/edx/base.txt # aiohttp diff --git a/scripts/user_retirement/requirements/base.txt b/scripts/user_retirement/requirements/base.txt index a98302aa009b..0149ec4e7e83 100644 --- a/scripts/user_retirement/requirements/base.txt +++ b/scripts/user_retirement/requirements/base.txt @@ -6,25 +6,19 @@ # asgiref==3.8.1 # via django -attrs==24.2.0 +attrs==24.3.0 # via zeep backoff==2.2.1 # via -r scripts/user_retirement/requirements/base.in -<<<<<<< HEAD -boto3==1.35.64 +boto3==1.35.81 # via -r scripts/user_retirement/requirements/base.in -botocore==1.35.64 -======= -boto3==1.35.76 - # via -r scripts/user_retirement/requirements/base.in -botocore==1.35.76 ->>>>>>> master +botocore==1.35.81 # via # boto3 # s3transfer cachetools==5.5.0 # via google-auth -certifi==2024.8.30 +certifi==2024.12.14 # via requests cffi==1.17.1 # via @@ -56,15 +50,11 @@ edx-django-utils==7.1.0 # via edx-rest-api-client edx-rest-api-client==6.0.0 # via -r scripts/user_retirement/requirements/base.in -google-api-core==2.23.0 +google-api-core==2.24.0 # via google-api-python-client -<<<<<<< HEAD -google-api-python-client==2.153.0 -======= -google-api-python-client==2.154.0 ->>>>>>> master +google-api-python-client==2.155.0 # via -r scripts/user_retirement/requirements/base.in -google-auth==2.36.0 +google-auth==2.37.0 # via # google-api-core # google-api-python-client @@ -91,11 +81,7 @@ lxml==5.3.0 # via zeep more-itertools==10.5.0 # via simple-salesforce -<<<<<<< HEAD -newrelic==10.3.0 -======= -newrelic==10.3.1 ->>>>>>> master +newrelic==10.4.0 # via edx-django-utils pbr==6.1.0 # via stevedore @@ -118,11 +104,7 @@ pyasn1-modules==0.4.1 # via google-auth pycparser==2.22 # via cffi -<<<<<<< HEAD -pyjwt[crypto]==2.10.0 -======= pyjwt[crypto]==2.10.1 ->>>>>>> master # via # edx-rest-api-client # simple-salesforce @@ -164,7 +146,7 @@ six==1.17.0 # via # jenkinsapi # python-dateutil -sqlparse==0.5.2 +sqlparse==0.5.3 # via django stevedore==5.4.0 # via edx-django-utils diff --git a/scripts/user_retirement/requirements/testing.txt b/scripts/user_retirement/requirements/testing.txt index 3cbe83bf6be7..95751081eac0 100644 --- a/scripts/user_retirement/requirements/testing.txt +++ b/scripts/user_retirement/requirements/testing.txt @@ -8,25 +8,17 @@ asgiref==3.8.1 # via # -r scripts/user_retirement/requirements/base.txt # django -attrs==24.2.0 +attrs==24.3.0 # via # -r scripts/user_retirement/requirements/base.txt # zeep backoff==2.2.1 # via -r scripts/user_retirement/requirements/base.txt -<<<<<<< HEAD -boto3==1.35.64 +boto3==1.35.81 # via # -r scripts/user_retirement/requirements/base.txt # moto -botocore==1.35.64 -======= -boto3==1.35.76 - # via - # -r scripts/user_retirement/requirements/base.txt - # moto -botocore==1.35.76 ->>>>>>> master +botocore==1.35.81 # via # -r scripts/user_retirement/requirements/base.txt # boto3 @@ -36,7 +28,7 @@ cachetools==5.5.0 # via # -r scripts/user_retirement/requirements/base.txt # google-auth -certifi==2024.8.30 +certifi==2024.12.14 # via # -r scripts/user_retirement/requirements/base.txt # requests @@ -80,17 +72,13 @@ edx-django-utils==7.1.0 # edx-rest-api-client edx-rest-api-client==6.0.0 # via -r scripts/user_retirement/requirements/base.txt -google-api-core==2.23.0 +google-api-core==2.24.0 # via # -r scripts/user_retirement/requirements/base.txt # google-api-python-client -<<<<<<< HEAD -google-api-python-client==2.153.0 -======= -google-api-python-client==2.154.0 ->>>>>>> master +google-api-python-client==2.155.0 # via -r scripts/user_retirement/requirements/base.txt -google-auth==2.36.0 +google-auth==2.37.0 # via # -r scripts/user_retirement/requirements/base.txt # google-api-core @@ -144,11 +132,7 @@ more-itertools==10.5.0 # simple-salesforce moto==4.2.14 # via -r scripts/user_retirement/requirements/testing.in -<<<<<<< HEAD -newrelic==10.3.0 -======= -newrelic==10.3.1 ->>>>>>> master +newrelic==10.4.0 # via # -r scripts/user_retirement/requirements/base.txt # edx-django-utils @@ -191,11 +175,7 @@ pycparser==2.22 # via # -r scripts/user_retirement/requirements/base.txt # cffi -<<<<<<< HEAD -pyjwt[crypto]==2.10.0 -======= pyjwt[crypto]==2.10.1 ->>>>>>> master # via # -r scripts/user_retirement/requirements/base.txt # edx-rest-api-client @@ -268,7 +248,7 @@ six==1.17.0 # -r scripts/user_retirement/requirements/base.txt # jenkinsapi # python-dateutil -sqlparse==0.5.2 +sqlparse==0.5.3 # via # -r scripts/user_retirement/requirements/base.txt # django diff --git a/scripts/xblock/requirements.txt b/scripts/xblock/requirements.txt index 920cf0cf6ac1..470964021355 100644 --- a/scripts/xblock/requirements.txt +++ b/scripts/xblock/requirements.txt @@ -4,7 +4,7 @@ # # make upgrade # -certifi==2024.8.30 +certifi==2024.12.14 # via requests charset-normalizer==2.0.12 # via