diff --git a/common/djangoapps/student/models/user.py b/common/djangoapps/student/models/user.py index 572925437dbe..4789f0e47c38 100644 --- a/common/djangoapps/student/models/user.py +++ b/common/djangoapps/student/models/user.py @@ -806,7 +806,7 @@ def user_post_save_callback(sender, **kwargs): 'education': profile.level_of_education_display, 'address': profile.mailing_address, 'gender': profile.gender_display, - 'country': str(profile.country), + 'country': str(profile.country) if profile.country else '', 'is_marketable': False } # .. pii: Many pieces of PII are sent to Segment here. Retired directly through Segment API call in Tubular. diff --git a/lms/djangoapps/courseware/views/views.py b/lms/djangoapps/courseware/views/views.py index 04aaf65191f1..960be2fd7849 100644 --- a/lms/djangoapps/courseware/views/views.py +++ b/lms/djangoapps/courseware/views/views.py @@ -2234,7 +2234,7 @@ def financial_assistance_form(request, course_id=None): 'email': user.email, 'username': user.username, 'name': user.profile.name, - 'country': str(user.profile.country.name), + 'country': str(user.profile.country.name) if user.profile.country else '', }, 'submit_url': reverse(submit_url), 'fields': [ diff --git a/lms/djangoapps/instructor_analytics/basic.py b/lms/djangoapps/instructor_analytics/basic.py index f99afe2e71da..2948773aa026 100644 --- a/lms/djangoapps/instructor_analytics/basic.py +++ b/lms/djangoapps/instructor_analytics/basic.py @@ -186,6 +186,9 @@ def _extract_attr(student, feature): ) return None + if attr is None: + return '' + try: DjangoJSONEncoder().default(attr) return attr diff --git a/lms/djangoapps/instructor_analytics/tests/test_basic.py b/lms/djangoapps/instructor_analytics/tests/test_basic.py index 3b6c3a2cb85f..e810e75377be 100644 --- a/lms/djangoapps/instructor_analytics/tests/test_basic.py +++ b/lms/djangoapps/instructor_analytics/tests/test_basic.py @@ -195,10 +195,7 @@ def test_enrolled_students_features_keys(self): def test_enrolled_student_with_no_country_city(self): userreports = enrolled_students_features(self.course_key, ('username', 'city', 'country',)) for userreport in userreports: - # This behaviour is somewhat inconsistent: None string fields - # objects are converted to "None", but non-JSON serializable fields - # are converted to an empty string. - assert userreport['city'] == 'None' + assert userreport['city'] == '' assert userreport['country'] == '' def test_enrolled_students_meta_features_keys(self): diff --git a/openedx/core/djangoapps/credit/api/provider.py b/openedx/core/djangoapps/credit/api/provider.py index 8cbe362b4acf..356f89974cfb 100644 --- a/openedx/core/djangoapps/credit/api/provider.py +++ b/openedx/core/djangoapps/credit/api/provider.py @@ -309,7 +309,7 @@ def create_credit_request(course_key, provider_id, username): "user_mailing_address": "", "user_country": ( user.profile.country.code - if user.profile.country.code is not None + if user.profile.country is not None else "" ), } diff --git a/openedx/core/djangoapps/credit/tests/factories.py b/openedx/core/djangoapps/credit/tests/factories.py index 1c810450aa0a..eae8ceade2c8 100644 --- a/openedx/core/djangoapps/credit/tests/factories.py +++ b/openedx/core/djangoapps/credit/tests/factories.py @@ -89,7 +89,7 @@ def post(obj, create, extracted, **kwargs): "user_email": user.email, "user_full_name": user_profile.name, "user_mailing_address": "", - "user_country": user_profile.country.code or "", + "user_country": user_profile.country.code if user_profile.country else "", }) obj.save() diff --git a/openedx/core/djangoapps/embargo/api.py b/openedx/core/djangoapps/embargo/api.py index cba176f76363..ef12b93e293d 100644 --- a/openedx/core/djangoapps/embargo/api.py +++ b/openedx/core/djangoapps/embargo/api.py @@ -169,7 +169,7 @@ def _get_user_country_from_profile(user: types.User) -> str: profile_country = cache.get(cache_key) if profile_country is None: profile = getattr(user, 'profile', None) - if profile is not None and profile.country.code is not None: + if profile is not None and profile.country is not None: profile_country = profile.country.code.upper() else: profile_country = "" diff --git a/openedx/core/djangoapps/user_api/accounts/serializers.py b/openedx/core/djangoapps/user_api/accounts/serializers.py index 2d6a8b384881..6ad83c2a56f6 100644 --- a/openedx/core/djangoapps/user_api/accounts/serializers.py +++ b/openedx/core/djangoapps/user_api/accounts/serializers.py @@ -184,7 +184,9 @@ def to_representation(self, user): # pylint: disable=arguments-differ data.update( { "bio": AccountLegacyProfileSerializer.convert_empty_to_None(user_profile.bio), - "country": AccountLegacyProfileSerializer.convert_empty_to_None(user_profile.country.code), + "country": AccountLegacyProfileSerializer.convert_empty_to_None( + user_profile.country.code if user_profile.country else "" + ), "state": AccountLegacyProfileSerializer.convert_empty_to_None(user_profile.state), "profile_image": AccountLegacyProfileSerializer.get_profile_image( user_profile, user, self.context.get('request') diff --git a/openedx/core/djangoapps/user_authn/views/register.py b/openedx/core/djangoapps/user_authn/views/register.py index 4a78ee83ef06..0ab4c9f81dfa 100644 --- a/openedx/core/djangoapps/user_authn/views/register.py +++ b/openedx/core/djangoapps/user_authn/views/register.py @@ -374,7 +374,7 @@ def _track_user_registration(user, profile, params, third_party_provider, regist 'education': profile.level_of_education_display, 'address': profile.mailing_address, 'gender': profile.gender_display, - 'country': str(profile.country), + 'country': str(profile.country) if profile.country else '', 'is_marketable': is_marketable, 'anonymous_id': anonymous_id } diff --git a/requirements/edx-sandbox/base.txt b/requirements/edx-sandbox/base.txt index 1f28c78b8dac..65424f445469 100644 --- a/requirements/edx-sandbox/base.txt +++ b/requirements/edx-sandbox/base.txt @@ -14,7 +14,7 @@ codejail-includes==2.0.0 # via -r requirements/edx-sandbox/base.in contourpy==1.3.3 # via matplotlib -cryptography==48.0.0 +cryptography==49.0.0 # via -r requirements/edx-sandbox/base.in cycler==0.12.1 # via matplotlib @@ -36,7 +36,7 @@ markupsafe==3.0.3 # via # chem # openedx-calc -matplotlib==3.10.9 +matplotlib==3.11.0 # via -r requirements/edx-sandbox/base.in mpmath==1.3.0 # via sympy @@ -84,5 +84,5 @@ sympy==1.14.0 # via # -r requirements/edx-sandbox/base.in # openedx-calc -tqdm==4.68.1 +tqdm==4.68.2 # via nltk diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index 608eb6ba8a39..67fd046da98e 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -22,7 +22,7 @@ aniso8601==10.0.1 # tincan annotated-types==0.7.0 # via pydantic -anyio==4.13.0 +anyio==4.14.0 # via httpx appdirs==1.4.4 # via fs @@ -68,14 +68,14 @@ bleach[css]==6.4.0 # ora2 # xblock-drag-and-drop-v2 # xblock-poll -boto3==1.43.25 +boto3==1.43.30 # via # -r requirements/edx/kernel.in # django-ses # fs-s3fs # ora2 # snowflake-connector-python -botocore==1.43.25 +botocore==1.43.30 # via # -r requirements/edx/kernel.in # boto3 @@ -148,9 +148,9 @@ code-annotations==3.0.0 # edx-toggles codejail-includes==2.0.0 # via -r requirements/edx/kernel.in -crowdsourcehinter-xblock==1.0.0 +crowdsourcehinter-xblock==1.0.1 # via -r requirements/edx/bundled.in -cryptography==48.0.0 +cryptography==49.0.0 # via # -r requirements/edx/kernel.in # django-fernet-fields-v2 @@ -268,7 +268,7 @@ django-config-models==3.0.0 # lti-consumer-xblock django-cors-headers==4.9.0 # via -r requirements/edx/kernel.in -django-countries==8.2.0 +django-countries==9.0.0 # via # -r requirements/edx/kernel.in # edx-enterprise @@ -296,7 +296,7 @@ django-ipware==7.0.1 # -r requirements/edx/kernel.in # edx-enterprise # edx-proctoring -django-js-asset==3.1.2 +django-js-asset==4.0.1 # via django-mptt django-method-override==1.0.4 # via -r requirements/edx/kernel.in @@ -515,6 +515,7 @@ edx-opaque-keys[django]==4.0.0 # openedx-events # openedx-filters # ora2 + # xblock # xblocks-contrib edx-organizations==8.0.0 # via @@ -589,7 +590,7 @@ event-tracking==4.0.2 # edx-search fastavro==1.12.2 # via openedx-events -filelock==3.29.1 +filelock==3.29.4 # via snowflake-connector-python firebase-admin==7.4.0 # via edx-ace @@ -618,7 +619,7 @@ google-api-core[grpc]==2.31.0 # google-cloud-core # google-cloud-firestore # google-cloud-storage -google-auth==2.53.0 +google-auth==2.55.0 # via # google-api-core # google-cloud-core @@ -630,7 +631,7 @@ google-cloud-core==2.6.0 # google-cloud-storage google-cloud-firestore==2.27.0 # via firebase-admin -google-cloud-storage==3.11.0 +google-cloud-storage==3.12.0 # via firebase-admin google-crc32c==1.8.0 # via @@ -642,12 +643,12 @@ googleapis-common-protos==1.75.0 # via # google-api-core # grpcio-status -grpcio==1.81.0 +grpcio==1.81.1 # via # google-api-core # google-cloud-firestore # grpcio-status -grpcio-status==1.81.0 +grpcio-status==1.81.1 # via google-api-core gunicorn==26.0.0 # via -r requirements/edx/kernel.in @@ -672,7 +673,7 @@ httpx[http2]==0.28.1 # typesense hyperframe==6.1.0 # via h2 -icalendar==7.1.2 +icalendar==7.1.3 # via -r requirements/edx/kernel.in idna==3.18 # via @@ -791,7 +792,7 @@ more-itertools==11.1.0 # via cssutils mpmath==1.3.0 # via sympy -msgpack==1.1.2 +msgpack==1.2.0 # via cachecontrol multidict==6.7.1 # via @@ -918,7 +919,7 @@ proto-plus==1.28.0 # via # google-api-core # google-cloud-firestore -protobuf==7.35.0 +protobuf==7.35.1 # via # google-api-core # google-cloud-firestore @@ -987,7 +988,7 @@ pynacl==1.6.2 # paramiko pynliner==0.8.0 # via -r requirements/edx/kernel.in -pyopenssl==26.2.0 +pyopenssl==26.3.0 # via snowflake-connector-python pyparsing==3.3.2 # via @@ -1182,7 +1183,7 @@ soupsieve==2.8.4 # via beautifulsoup4 sqlparse==0.5.5 # via django -staff-graded-xblock==4.0.0 +staff-graded-xblock==4.0.1 # via -r requirements/edx/bundled.in stevedore==5.8.0 # via @@ -1196,7 +1197,7 @@ super-csv==5.0.0 # via edx-bulk-grades sympy==1.14.0 # via openedx-calc -testfixtures==12.0.0 +testfixtures==12.1.0 # via edx-enterprise text-unidecode==1.3 # via python-slugify @@ -1208,7 +1209,7 @@ tomlkit==0.15.0 # via # openedx-core # snowflake-connector-python -tqdm==4.68.1 +tqdm==4.68.2 # via nltk typesense==2.0.0 # via @@ -1231,6 +1232,7 @@ typing-extensions==4.15.0 # pyopenssl # referencing # snowflake-connector-python + # testfixtures # typesense # typing-inspection typing-inspection==0.4.2 @@ -1239,7 +1241,7 @@ tzdata==2026.2 # via # icalendar # kombu -tzlocal==5.3.1 +tzlocal==5.4 # via celery unicodecsv==0.14.1 # via @@ -1273,12 +1275,8 @@ wcwidth==0.8.1 web-fragments==4.0.0 # via # -r requirements/edx/kernel.in - # crowdsourcehinter-xblock # edx-sga - # staff-graded-xblock - # xblock # xblock-utils - # xblocks-contrib webencodings==0.5.1 # via # bleach @@ -1295,7 +1293,7 @@ wrapt==2.2.1 # via # -r requirements/edx/kernel.in # xblocks-contrib -xblock[django]==6.1.0 +xblock[django]==6.3.0 # via # -r requirements/edx/kernel.in # acid-xblock @@ -1321,7 +1319,7 @@ xblock-utils==4.0.0 # via # edx-sga # xblock-poll -xblocks-contrib==0.16.1 +xblocks-contrib==0.17.0 # via -r requirements/edx/bundled.in xmlsec==1.3.14 # via diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt index 466df74e311c..d570bbc6e89d 100644 --- a/requirements/edx/development.txt +++ b/requirements/edx/development.txt @@ -51,7 +51,7 @@ annotated-types==0.7.0 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # pydantic -anyio==4.13.0 +anyio==4.14.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -134,7 +134,7 @@ bleach[css]==6.4.0 # ora2 # xblock-drag-and-drop-v2 # xblock-poll -boto3==1.43.25 +boto3==1.43.30 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -142,7 +142,7 @@ boto3==1.43.25 # fs-s3fs # ora2 # snowflake-connector-python -botocore==1.43.25 +botocore==1.43.30 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -285,11 +285,11 @@ coverage[toml]==7.14.1 # via # -r requirements/edx/testing.txt # pytest-cov -crowdsourcehinter-xblock==1.0.0 +crowdsourcehinter-xblock==1.0.1 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -cryptography==48.0.0 +cryptography==49.0.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -333,7 +333,7 @@ dill==0.4.1 # via # -r requirements/edx/testing.txt # pylint -distlib==0.4.2 +distlib==0.4.3 # via # -r requirements/edx/testing.txt # virtualenv @@ -452,7 +452,7 @@ django-cors-headers==4.9.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -django-countries==8.2.0 +django-countries==9.0.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -490,7 +490,7 @@ django-ipware==7.0.1 # -r requirements/edx/testing.txt # edx-enterprise # edx-proctoring -django-js-asset==3.1.2 +django-js-asset==4.0.1 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -799,6 +799,7 @@ edx-opaque-keys[django]==4.0.0 # openedx-events # openedx-filters # ora2 + # xblock # xblocks-contrib edx-organizations==8.0.0 # via @@ -906,7 +907,7 @@ execnet==2.1.2 # pytest-xdist factory-boy==3.3.3 # via -r requirements/edx/testing.txt -faker==40.21.0 +faker==40.23.0 # via # -r requirements/edx/testing.txt # factory-boy @@ -915,7 +916,7 @@ fastavro==1.12.2 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # openedx-events -filelock==3.29.1 +filelock==3.29.4 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -971,7 +972,7 @@ google-api-core[grpc]==2.31.0 # google-cloud-core # google-cloud-firestore # google-cloud-storage -google-auth==2.53.0 +google-auth==2.55.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -990,7 +991,7 @@ google-cloud-firestore==2.27.0 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # firebase-admin -google-cloud-storage==3.11.0 +google-cloud-storage==3.12.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1016,14 +1017,14 @@ grimp==3.14 # via # -r requirements/edx/testing.txt # import-linter -grpcio==1.81.0 +grpcio==1.81.1 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # google-api-core # google-cloud-firestore # grpcio-status -grpcio-status==1.81.0 +grpcio-status==1.81.1 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1075,7 +1076,7 @@ hyperframe==6.1.0 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # h2 -icalendar==7.1.2 +icalendar==7.1.3 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1306,7 +1307,7 @@ mpmath==1.3.0 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # sympy -msgpack==1.1.2 +msgpack==1.2.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1535,7 +1536,7 @@ proto-plus==1.28.0 # -r requirements/edx/testing.txt # google-api-core # google-cloud-firestore -protobuf==7.35.0 +protobuf==7.35.1 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1631,7 +1632,7 @@ pylatexenc==2.10 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # olxcleaner -pylint==4.0.5 +pylint==4.0.6 # via # -r requirements/edx/testing.txt # edx-lint @@ -1681,7 +1682,7 @@ pynliner==0.8.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -pyopenssl==26.2.0 +pyopenssl==26.3.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -1759,7 +1760,7 @@ python-dateutil==2.9.0.post0 # olxcleaner # ora2 # xblock -python-discovery==1.4.0 +python-discovery==1.4.2 # via # -r requirements/edx/testing.txt # tox @@ -1811,7 +1812,7 @@ pyuca==1.2 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -pywatchman==3.0.0 +pywatchman==4.0.0 # via -r requirements/edx/development.in pyyaml==6.0.3 # via @@ -1899,7 +1900,7 @@ rpds-py==2026.5.1 # -r requirements/edx/testing.txt # jsonschema # referencing -ruff==0.15.16 +ruff==0.15.17 # via -r requirements/edx/testing.txt rules==3.5 # via @@ -2082,7 +2083,7 @@ sqlparse==0.5.5 # -r requirements/edx/testing.txt # django # django-debug-toolbar -staff-graded-xblock==4.0.0 +staff-graded-xblock==4.0.1 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -2105,7 +2106,7 @@ sympy==1.14.0 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # openedx-calc -testfixtures==12.0.0 +testfixtures==12.1.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -2139,7 +2140,7 @@ tomlkit==0.15.0 # snowflake-connector-python tox==4.55.1 # via -r requirements/edx/testing.txt -tqdm==4.68.1 +tqdm==4.68.2 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -2183,6 +2184,7 @@ typing-extensions==4.15.0 # pyopenssl # referencing # snowflake-connector-python + # testfixtures # typesense # typing-inspection typing-inspection==0.4.2 @@ -2196,7 +2198,7 @@ tzdata==2026.2 # -r requirements/edx/testing.txt # icalendar # kombu -tzlocal==5.3.1 +tzlocal==5.4 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -2234,7 +2236,7 @@ vine==5.1.0 # amqp # celery # kombu -virtualenv==21.4.2 +virtualenv==21.5.0 # via # -r requirements/edx/testing.txt # tox @@ -2266,12 +2268,8 @@ web-fragments==4.0.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt - # crowdsourcehinter-xblock # edx-sga - # staff-graded-xblock - # xblock # xblock-utils - # xblocks-contrib webencodings==0.5.1 # via # -r requirements/edx/doc.txt @@ -2297,7 +2295,7 @@ wrapt==2.2.1 # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt # xblocks-contrib -xblock[django]==6.1.0 +xblock[django]==6.3.0 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt @@ -2332,7 +2330,7 @@ xblock-utils==4.0.0 # -r requirements/edx/testing.txt # edx-sga # xblock-poll -xblocks-contrib==0.16.1 +xblocks-contrib==0.17.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 6c77e638a040..6ba272a9e82c 100644 --- a/requirements/edx/doc.txt +++ b/requirements/edx/doc.txt @@ -37,7 +37,7 @@ annotated-types==0.7.0 # via # -r requirements/edx/base.txt # pydantic -anyio==4.13.0 +anyio==4.14.0 # via # -r requirements/edx/base.txt # httpx @@ -105,14 +105,14 @@ bleach[css]==6.4.0 # ora2 # xblock-drag-and-drop-v2 # xblock-poll -boto3==1.43.25 +boto3==1.43.30 # via # -r requirements/edx/base.txt # django-ses # fs-s3fs # ora2 # snowflake-connector-python -botocore==1.43.25 +botocore==1.43.30 # via # -r requirements/edx/base.txt # boto3 @@ -208,9 +208,9 @@ code-annotations==3.0.0 # edx-toggles codejail-includes==2.0.0 # via -r requirements/edx/base.txt -crowdsourcehinter-xblock==1.0.0 +crowdsourcehinter-xblock==1.0.1 # via -r requirements/edx/base.txt -cryptography==48.0.0 +cryptography==49.0.0 # via # -r requirements/edx/base.txt # django-fernet-fields-v2 @@ -338,7 +338,7 @@ django-config-models==3.0.0 # lti-consumer-xblock django-cors-headers==4.9.0 # via -r requirements/edx/base.txt -django-countries==8.2.0 +django-countries==9.0.0 # via # -r requirements/edx/base.txt # edx-enterprise @@ -367,7 +367,7 @@ django-ipware==7.0.1 # -r requirements/edx/base.txt # edx-enterprise # edx-proctoring -django-js-asset==3.1.2 +django-js-asset==4.0.1 # via # -r requirements/edx/base.txt # django-mptt @@ -605,6 +605,7 @@ edx-opaque-keys[django]==4.0.0 # openedx-events # openedx-filters # ora2 + # xblock # xblocks-contrib edx-organizations==8.0.0 # via @@ -689,7 +690,7 @@ fastavro==1.12.2 # via # -r requirements/edx/base.txt # openedx-events -filelock==3.29.1 +filelock==3.29.4 # via # -r requirements/edx/base.txt # snowflake-connector-python @@ -728,7 +729,7 @@ google-api-core[grpc]==2.31.0 # google-cloud-core # google-cloud-firestore # google-cloud-storage -google-auth==2.53.0 +google-auth==2.55.0 # via # -r requirements/edx/base.txt # google-api-core @@ -744,7 +745,7 @@ google-cloud-firestore==2.27.0 # via # -r requirements/edx/base.txt # firebase-admin -google-cloud-storage==3.11.0 +google-cloud-storage==3.12.0 # via # -r requirements/edx/base.txt # firebase-admin @@ -762,13 +763,13 @@ googleapis-common-protos==1.75.0 # -r requirements/edx/base.txt # google-api-core # grpcio-status -grpcio==1.81.0 +grpcio==1.81.1 # via # -r requirements/edx/base.txt # google-api-core # google-cloud-firestore # grpcio-status -grpcio-status==1.81.0 +grpcio-status==1.81.1 # via # -r requirements/edx/base.txt # google-api-core @@ -806,7 +807,7 @@ hyperframe==6.1.0 # via # -r requirements/edx/base.txt # h2 -icalendar==7.1.2 +icalendar==7.1.3 # via -r requirements/edx/base.txt idna==3.18 # via @@ -963,7 +964,7 @@ mpmath==1.3.0 # via # -r requirements/edx/base.txt # sympy -msgpack==1.1.2 +msgpack==1.2.0 # via # -r requirements/edx/base.txt # cachecontrol @@ -1115,7 +1116,7 @@ proto-plus==1.28.0 # -r requirements/edx/base.txt # google-api-core # google-cloud-firestore -protobuf==7.35.0 +protobuf==7.35.1 # via # -r requirements/edx/base.txt # google-api-core @@ -1206,7 +1207,7 @@ pynacl==1.6.2 # paramiko pynliner==0.8.0 # via -r requirements/edx/base.txt -pyopenssl==26.2.0 +pyopenssl==26.3.0 # via # -r requirements/edx/base.txt # snowflake-connector-python @@ -1484,7 +1485,7 @@ sqlparse==0.5.5 # via # -r requirements/edx/base.txt # django -staff-graded-xblock==4.0.0 +staff-graded-xblock==4.0.1 # via -r requirements/edx/base.txt stevedore==5.8.0 # via @@ -1502,7 +1503,7 @@ sympy==1.14.0 # via # -r requirements/edx/base.txt # openedx-calc -testfixtures==12.0.0 +testfixtures==12.1.0 # via # -r requirements/edx/base.txt # edx-enterprise @@ -1523,7 +1524,7 @@ tomlkit==0.15.0 # -r requirements/edx/base.txt # openedx-core # snowflake-connector-python -tqdm==4.68.1 +tqdm==4.68.2 # via # -r requirements/edx/base.txt # nltk @@ -1551,6 +1552,7 @@ typing-extensions==4.15.0 # pyopenssl # referencing # snowflake-connector-python + # testfixtures # typesense # typing-inspection typing-inspection==0.4.2 @@ -1562,7 +1564,7 @@ tzdata==2026.2 # -r requirements/edx/base.txt # icalendar # kombu -tzlocal==5.3.1 +tzlocal==5.4 # via # -r requirements/edx/base.txt # celery @@ -1609,12 +1611,8 @@ wcwidth==0.8.1 web-fragments==4.0.0 # via # -r requirements/edx/base.txt - # crowdsourcehinter-xblock # edx-sga - # staff-graded-xblock - # xblock # xblock-utils - # xblocks-contrib webencodings==0.5.1 # via # -r requirements/edx/base.txt @@ -1634,7 +1632,7 @@ wrapt==2.2.1 # via # -r requirements/edx/base.txt # xblocks-contrib -xblock[django]==6.1.0 +xblock[django]==6.3.0 # via # -r requirements/edx/base.txt # acid-xblock @@ -1661,7 +1659,7 @@ xblock-utils==4.0.0 # -r requirements/edx/base.txt # edx-sga # xblock-poll -xblocks-contrib==0.16.1 +xblocks-contrib==0.17.0 # via -r requirements/edx/base.txt xmlsec==1.3.14 # via diff --git a/requirements/edx/semgrep.txt b/requirements/edx/semgrep.txt index 5614f2dec99a..f1399ba335fe 100644 --- a/requirements/edx/semgrep.txt +++ b/requirements/edx/semgrep.txt @@ -6,7 +6,7 @@ # annotated-types==0.7.0 # via pydantic -anyio==4.13.0 +anyio==4.14.0 # via # httpx # mcp @@ -43,7 +43,7 @@ click-option-group==0.5.9 # via semgrep colorama==0.4.6 # via semgrep -cryptography==48.0.0 +cryptography==49.0.0 # via pyjwt exceptiongroup==1.2.2 # via semgrep @@ -140,7 +140,7 @@ pydantic-settings==2.14.1 # via mcp pygments==2.20.0 # via rich -pyjwt[crypto]==2.12.1 +pyjwt[crypto]==2.13.0 # via # mcp # semgrep @@ -168,11 +168,11 @@ ruamel-yaml-clib==0.2.15 # via semgrep semantic-version==2.10.0 # via semgrep -semgrep==1.165.0 +semgrep==1.166.0 # via -r requirements/edx/semgrep.in sse-starlette==3.4.4 # via mcp -starlette==1.2.1 +starlette==1.3.1 # via # mcp # sse-starlette diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt index ce6156ced07d..997a9d0704f2 100644 --- a/requirements/edx/testing.txt +++ b/requirements/edx/testing.txt @@ -33,7 +33,7 @@ annotated-types==0.7.0 # via # -r requirements/edx/base.txt # pydantic -anyio==4.13.0 +anyio==4.14.0 # via # -r requirements/edx/base.txt # httpx @@ -100,14 +100,14 @@ bleach[css]==6.4.0 # ora2 # xblock-drag-and-drop-v2 # xblock-poll -boto3==1.43.25 +boto3==1.43.30 # via # -r requirements/edx/base.txt # django-ses # fs-s3fs # ora2 # snowflake-connector-python -botocore==1.43.25 +botocore==1.43.30 # via # -r requirements/edx/base.txt # boto3 @@ -219,9 +219,9 @@ coverage[toml]==7.14.1 # via # -r requirements/edx/coverage.txt # pytest-cov -crowdsourcehinter-xblock==1.0.0 +crowdsourcehinter-xblock==1.0.1 # via -r requirements/edx/base.txt -cryptography==48.0.0 +cryptography==49.0.0 # via # -r requirements/edx/base.txt # django-fernet-fields-v2 @@ -256,7 +256,7 @@ diff-cover==10.3.0 # via -r requirements/edx/coverage.txt dill==0.4.1 # via pylint -distlib==0.4.2 +distlib==0.4.3 # via virtualenv django==5.2.15 # via @@ -359,7 +359,7 @@ django-config-models==3.0.0 # lti-consumer-xblock django-cors-headers==4.9.0 # via -r requirements/edx/base.txt -django-countries==8.2.0 +django-countries==9.0.0 # via # -r requirements/edx/base.txt # edx-enterprise @@ -388,7 +388,7 @@ django-ipware==7.0.1 # -r requirements/edx/base.txt # edx-enterprise # edx-proctoring -django-js-asset==3.1.2 +django-js-asset==4.0.1 # via # -r requirements/edx/base.txt # django-mptt @@ -623,6 +623,7 @@ edx-opaque-keys[django]==4.0.0 # openedx-events # openedx-filters # ora2 + # xblock # xblocks-contrib edx-organizations==8.0.0 # via @@ -707,13 +708,13 @@ execnet==2.1.2 # via pytest-xdist factory-boy==3.3.3 # via -r requirements/edx/testing.in -faker==40.21.0 +faker==40.23.0 # via factory-boy fastavro==1.12.2 # via # -r requirements/edx/base.txt # openedx-events -filelock==3.29.1 +filelock==3.29.4 # via # -r requirements/edx/base.txt # python-discovery @@ -753,7 +754,7 @@ google-api-core[grpc]==2.31.0 # google-cloud-core # google-cloud-firestore # google-cloud-storage -google-auth==2.53.0 +google-auth==2.55.0 # via # -r requirements/edx/base.txt # google-api-core @@ -769,7 +770,7 @@ google-cloud-firestore==2.27.0 # via # -r requirements/edx/base.txt # firebase-admin -google-cloud-storage==3.11.0 +google-cloud-storage==3.12.0 # via # -r requirements/edx/base.txt # firebase-admin @@ -789,13 +790,13 @@ googleapis-common-protos==1.75.0 # grpcio-status grimp==3.14 # via import-linter -grpcio==1.81.0 +grpcio==1.81.1 # via # -r requirements/edx/base.txt # google-api-core # google-cloud-firestore # grpcio-status -grpcio-status==1.81.0 +grpcio-status==1.81.1 # via # -r requirements/edx/base.txt # google-api-core @@ -835,7 +836,7 @@ hyperframe==6.1.0 # via # -r requirements/edx/base.txt # h2 -icalendar==7.1.2 +icalendar==7.1.3 # via -r requirements/edx/base.txt idna==3.18 # via @@ -1003,7 +1004,7 @@ mpmath==1.3.0 # via # -r requirements/edx/base.txt # sympy -msgpack==1.1.2 +msgpack==1.2.0 # via # -r requirements/edx/base.txt # cachecontrol @@ -1171,7 +1172,7 @@ proto-plus==1.28.0 # -r requirements/edx/base.txt # google-api-core # google-cloud-firestore -protobuf==7.35.0 +protobuf==7.35.1 # via # -r requirements/edx/base.txt # google-api-core @@ -1243,7 +1244,7 @@ pylatexenc==2.10 # via # -r requirements/edx/base.txt # olxcleaner -pylint==4.0.5 +pylint==4.0.6 # via # edx-lint # pylint-celery @@ -1279,7 +1280,7 @@ pynacl==1.6.2 # paramiko pynliner==0.8.0 # via -r requirements/edx/base.txt -pyopenssl==26.2.0 +pyopenssl==26.3.0 # via # -r requirements/edx/base.txt # snowflake-connector-python @@ -1345,7 +1346,7 @@ python-dateutil==2.9.0.post0 # olxcleaner # ora2 # xblock -python-discovery==1.4.0 +python-discovery==1.4.2 # via # tox # virtualenv @@ -1455,7 +1456,7 @@ rpds-py==2026.5.1 # -r requirements/edx/base.txt # jsonschema # referencing -ruff==0.15.16 +ruff==0.15.17 # via -r requirements/edx/testing.in rules==3.5 # via @@ -1552,7 +1553,7 @@ sqlparse==0.5.5 # via # -r requirements/edx/base.txt # django -staff-graded-xblock==4.0.0 +staff-graded-xblock==4.0.1 # via -r requirements/edx/base.txt stevedore==5.8.0 # via @@ -1570,7 +1571,7 @@ sympy==1.14.0 # via # -r requirements/edx/base.txt # openedx-calc -testfixtures==12.0.0 +testfixtures==12.1.0 # via # -r requirements/edx/base.txt # -r requirements/edx/testing.in @@ -1598,7 +1599,7 @@ tomlkit==0.15.0 # snowflake-connector-python tox==4.55.1 # via -r requirements/edx/testing.in -tqdm==4.68.1 +tqdm==4.68.2 # via # -r requirements/edx/base.txt # nltk @@ -1628,6 +1629,7 @@ typing-extensions==4.15.0 # pyopenssl # referencing # snowflake-connector-python + # testfixtures # typesense # typing-inspection typing-inspection==0.4.2 @@ -1639,7 +1641,7 @@ tzdata==2026.2 # -r requirements/edx/base.txt # icalendar # kombu -tzlocal==5.3.1 +tzlocal==5.4 # via # -r requirements/edx/base.txt # celery @@ -1669,7 +1671,7 @@ vine==5.1.0 # amqp # celery # kombu -virtualenv==21.4.2 +virtualenv==21.5.0 # via tox voluptuous==0.16.0 # via @@ -1690,12 +1692,8 @@ wcwidth==0.8.1 web-fragments==4.0.0 # via # -r requirements/edx/base.txt - # crowdsourcehinter-xblock # edx-sga - # staff-graded-xblock - # xblock # xblock-utils - # xblocks-contrib webencodings==0.5.1 # via # -r requirements/edx/base.txt @@ -1715,7 +1713,7 @@ wrapt==2.2.1 # via # -r requirements/edx/base.txt # xblocks-contrib -xblock[django]==6.1.0 +xblock[django]==6.3.0 # via # -r requirements/edx/base.txt # acid-xblock @@ -1742,7 +1740,7 @@ xblock-utils==4.0.0 # -r requirements/edx/base.txt # edx-sga # xblock-poll -xblocks-contrib==0.16.1 +xblocks-contrib==0.17.0 # via -r requirements/edx/base.txt xmlsec==1.3.14 # via diff --git a/scripts/structures_pruning/requirements/testing.txt b/scripts/structures_pruning/requirements/testing.txt index 68dc9cfd7d07..1fd6e5024650 100644 --- a/scripts/structures_pruning/requirements/testing.txt +++ b/scripts/structures_pruning/requirements/testing.txt @@ -30,7 +30,7 @@ pymongo==4.4.0 # via # -r scripts/structures_pruning/requirements/base.txt # edx-opaque-keys -pytest==9.0.3 +pytest==9.1.0 # via -r scripts/structures_pruning/requirements/testing.in stevedore==5.8.0 # via diff --git a/scripts/user_retirement/requirements/base.txt b/scripts/user_retirement/requirements/base.txt index 31ed803b298d..cd9f7cae32dc 100644 --- a/scripts/user_retirement/requirements/base.txt +++ b/scripts/user_retirement/requirements/base.txt @@ -10,9 +10,9 @@ attrs==26.1.0 # via zeep backoff==2.2.1 # via -r scripts/user_retirement/requirements/base.in -boto3==1.43.25 +boto3==1.43.30 # via -r scripts/user_retirement/requirements/base.in -botocore==1.43.25 +botocore==1.43.30 # via # boto3 # s3transfer @@ -28,7 +28,7 @@ click==8.4.1 # via # -r scripts/user_retirement/requirements/base.in # edx-django-utils -cryptography==48.0.0 +cryptography==49.0.0 # via # google-auth # pyjwt @@ -51,7 +51,7 @@ google-api-core==2.31.0 # via google-api-python-client google-api-python-client==2.197.0 # via -r scripts/user_retirement/requirements/base.in -google-auth==2.53.0 +google-auth==2.55.0 # via # google-api-core # google-api-python-client @@ -84,7 +84,7 @@ platformdirs==4.10.0 # via zeep proto-plus==1.28.0 # via google-api-core -protobuf==7.35.0 +protobuf==7.35.1 # via # google-api-core # googleapis-common-protos diff --git a/scripts/user_retirement/requirements/testing.txt b/scripts/user_retirement/requirements/testing.txt index 8a022d354b7a..b7a14e0de024 100644 --- a/scripts/user_retirement/requirements/testing.txt +++ b/scripts/user_retirement/requirements/testing.txt @@ -14,11 +14,11 @@ attrs==26.1.0 # zeep backoff==2.2.1 # via -r scripts/user_retirement/requirements/base.txt -boto3==1.43.25 +boto3==1.43.30 # via # -r scripts/user_retirement/requirements/base.txt # moto -botocore==1.43.25 +botocore==1.43.30 # via # -r scripts/user_retirement/requirements/base.txt # boto3 @@ -41,7 +41,7 @@ click==8.4.1 # via # -r scripts/user_retirement/requirements/base.txt # edx-django-utils -cryptography==48.0.0 +cryptography==49.0.0 # via # -r scripts/user_retirement/requirements/base.txt # google-auth @@ -75,7 +75,7 @@ google-api-core==2.31.0 # google-api-python-client google-api-python-client==2.197.0 # via -r scripts/user_retirement/requirements/base.txt -google-auth==2.53.0 +google-auth==2.55.0 # via # -r scripts/user_retirement/requirements/base.txt # google-api-core @@ -137,7 +137,7 @@ proto-plus==1.28.0 # via # -r scripts/user_retirement/requirements/base.txt # google-api-core -protobuf==7.35.0 +protobuf==7.35.1 # via # -r scripts/user_retirement/requirements/base.txt # google-api-core @@ -174,7 +174,7 @@ pyparsing==3.3.2 # via # -r scripts/user_retirement/requirements/base.txt # httplib2 -pytest==9.0.3 +pytest==9.1.0 # via -r scripts/user_retirement/requirements/testing.in python-dateutil==2.9.0.post0 # via diff --git a/xmodule/js/spec/video/video_volume_control_spec.js b/xmodule/js/spec/video/video_volume_control_spec.js index c869316031b1..8785d41e6a3d 100644 --- a/xmodule/js/spec/video/video_volume_control_spec.js +++ b/xmodule/js/spec/video/video_volume_control_spec.js @@ -42,8 +42,17 @@ expect(volumeControl.volume).toEqual(75); }); - it('render the volume control', function() { - expect($('.volume')).toExist(); + it('render the volume control', function(done) { + jasmine.waitUntil(function() { + return state.videoVolumeControl && + state.videoVolumeControl.el && + state.videoVolumeControl.el.closest('.secondary-controls').length === 1; + }).then(function() { + expect(state.videoVolumeControl.el).toBeInDOM(); + done(); + }).fail(function() { + done.fail('VideoVolumeControl did not render into .secondary-controls before the test timed out.'); + }); }); it('create the slider', function() {