diff --git a/edx_exams/apps/core/api.py b/edx_exams/apps/core/api.py index 2b1fcdfa..b6173fef 100644 --- a/edx_exams/apps/core/api.py +++ b/edx_exams/apps/core/api.py @@ -17,6 +17,7 @@ ExamIllegalStatusTransition ) from edx_exams.apps.core.models import Exam, ExamAttempt +from edx_exams.apps.core.signals.signals import emit_exam_attempt_submitted_event from edx_exams.apps.core.statuses import ExamAttemptStatus log = logging.getLogger(__name__) @@ -96,6 +97,15 @@ def update_attempt_status(attempt_id, to_status): if to_status == ExamAttemptStatus.submitted: attempt_obj.end_time = datetime.now(pytz.UTC) + course_key = CourseKey.from_string(attempt_obj.exam.course_id) + usage_key = UsageKey.from_string(attempt_obj.exam.content_id) + emit_exam_attempt_submitted_event( + attempt_obj.user, + course_key, + usage_key, + attempt_obj.exam.exam_type + ) + attempt_obj.status = to_status attempt_obj.save() diff --git a/edx_exams/apps/core/apps.py b/edx_exams/apps/core/apps.py new file mode 100644 index 00000000..b73c1398 --- /dev/null +++ b/edx_exams/apps/core/apps.py @@ -0,0 +1,18 @@ +""" +Core Application Configuration +""" + +from django.apps import AppConfig + + +class CoreConfig(AppConfig): + """ + Application configuration for core application. + """ + name = 'edx_exams.apps.core' + + def ready(self): + """ + Connect handlers to signals. + """ + from .signals import handlers # pylint: disable=unused-import,import-outside-toplevel diff --git a/edx_exams/apps/core/signals/__init__.py b/edx_exams/apps/core/signals/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/edx_exams/apps/core/signals/handlers.py b/edx_exams/apps/core/signals/handlers.py new file mode 100644 index 00000000..8e4fdf35 --- /dev/null +++ b/edx_exams/apps/core/signals/handlers.py @@ -0,0 +1,20 @@ +""" +Signal handlers for the edx-exams application. +""" +from django.dispatch import receiver +from openedx_events.event_bus import get_producer +from openedx_events.learning.signals import EXAM_ATTEMPT_SUBMITTED + + +@receiver(EXAM_ATTEMPT_SUBMITTED) +def listen_for_exam_attempt_submitted(sender, signal, **kwargs): # pylint: disable=unused-argument + """ + Publish EXAM_ATTEMPT_SUBMITTED signals onto the event bus. + """ + get_producer().send( + signal=EXAM_ATTEMPT_SUBMITTED, + topic='exam-attempt-submitted', + event_key_field='exam_attempt.course_key', + event_data={'exam_attempt': kwargs['exam_attempt']}, + event_metadata=kwargs['metadata'], + ) diff --git a/edx_exams/apps/core/signals/signals.py b/edx_exams/apps/core/signals/signals.py new file mode 100644 index 00000000..3ddeb515 --- /dev/null +++ b/edx_exams/apps/core/signals/signals.py @@ -0,0 +1,32 @@ +""" +Signal definitions and functions to send those signals for the edx-exams application. +""" + +from openedx_events.learning.data import ExamAttemptData, UserData, UserPersonalData +from openedx_events.learning.signals import EXAM_ATTEMPT_SUBMITTED + + +def emit_exam_attempt_submitted_event(user, course_key, usage_key, exam_type): + """ + Emit the EXAM_ATTEMPT_SUBMITTED Open edX event. + """ + user_data = UserData( + id=user.id, + is_active=user.is_active, + pii=UserPersonalData( + username=user.username, + email=user.email, + name=user.full_name + ) + ) + + # .. event_implemented_name: EXAM_ATTEMPT_SUBMITTED + EXAM_ATTEMPT_SUBMITTED.send_event( + exam_attempt=ExamAttemptData( + student_user=user_data, + course_key=course_key, + usage_key=usage_key, + exam_type=exam_type, + requesting_user=user_data + ) + ) diff --git a/edx_exams/apps/core/test_utils/factories.py b/edx_exams/apps/core/test_utils/factories.py index c75a5a0b..4ec17ca1 100644 --- a/edx_exams/apps/core/test_utils/factories.py +++ b/edx_exams/apps/core/test_utils/factories.py @@ -37,6 +37,7 @@ class Meta: password = factory.PostGenerationMethodCall('set_password', _DEFAULT_PASSWORD) first_name = factory.Sequence('User{}'.format) last_name = 'Test' + full_name = "{} {}".format(first_name, last_name) is_superuser = False is_staff = False diff --git a/edx_exams/apps/core/tests/test_api.py b/edx_exams/apps/core/tests/test_api.py index 69d5155e..49553449 100644 --- a/edx_exams/apps/core/tests/test_api.py +++ b/edx_exams/apps/core/tests/test_api.py @@ -11,6 +11,7 @@ from django.utils import timezone from freezegun import freeze_time from opaque_keys.edx.keys import CourseKey, UsageKey +from openedx_events.learning.data import ExamAttemptData, UserData, UserPersonalData from edx_exams.apps.api.test_utils import ExamsAPITestCase from edx_exams.apps.core.api import ( @@ -212,7 +213,7 @@ def setUp(self): resource_id=str(uuid.uuid4()), course_id=self.course_id, provider=self.test_provider, - content_id='abcd1234', + content_id='block-v1:edX+test+2023+type@sequential+block@1111111111', exam_name='test_exam', exam_type='proctored', time_limit_mins=30, @@ -298,6 +299,35 @@ def test_submit_attempt(self): self.assertEqual(updated_attempt.status, ExamAttemptStatus.submitted) self.assertEqual(updated_attempt.end_time, timezone.now()) + @patch('edx_exams.apps.core.signals.signals.EXAM_ATTEMPT_SUBMITTED.send_event') + def test_submit_attempt_event_emitted(self, mock_event_send): + """ + Test that when an exam is submitted, the EXAM_ATTEMPT_SUBMITED Open edX event is emitted. + """ + update_attempt_status(self.exam_attempt.id, ExamAttemptStatus.submitted) + self.assertEqual(mock_event_send.call_count, 1) + + user_data = UserData( + id=self.user.id, + is_active=self.user.is_active, + pii=UserPersonalData( + username=self.user.username, + email=self.user.email, + name=self.user.full_name + ) + ) + course_key = CourseKey.from_string(self.exam.course_id) + usage_key = UsageKey.from_string(self.exam.content_id) + + expected_data = ExamAttemptData( + student_user=user_data, + course_key=course_key, + usage_key=usage_key, + exam_type=self.exam.exam_type, + requesting_user=user_data, + ) + mock_event_send.assert_called_with(exam_attempt=expected_data) + def test_illegal_start(self): """ Test that an already started exam cannot be started diff --git a/requirements/base.txt b/requirements/base.txt index ffe3afbe..4f812410 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -12,23 +12,23 @@ attrs==23.1.0 # via # lti-consumer-xblock # openedx-events -avro==1.11.2 +avro==1.11.3 # via confluent-kafka bleach==6.0.0 # via lti-consumer-xblock -boto3==1.28.52 +boto3==1.28.57 # via fs-s3fs -botocore==1.31.52 +botocore==1.31.57 # via # boto3 # s3transfer certifi==2023.7.22 # via requests -cffi==1.15.1 +cffi==1.16.0 # via # cryptography # pynacl -charset-normalizer==3.2.0 +charset-normalizer==3.3.0 # via requests click==8.1.7 # via @@ -48,7 +48,7 @@ cryptography==41.0.4 # via # pyjwt # social-auth-core -defusedxml==0.7.1 +defusedxml==0.8.0rc2 # via # python3-openid # social-auth-core @@ -208,7 +208,7 @@ markupsafe==2.1.3 # xblock mysqlclient==2.2.0 # via -r requirements/base.in -newrelic==9.0.0 +newrelic==9.1.0 # via edx-django-utils oauthlib==3.2.2 # via @@ -221,13 +221,13 @@ openedx-django-pyfs==3.4.0 # via # lti-consumer-xblock # xblock -openedx-events==8.6.0 +openedx-events==8.8.0 # via # -r requirements/base.in # edx-event-bus-kafka openedx-filters==1.6.0 # via lti-consumer-xblock -packaging==23.1 +packaging==23.2 # via drf-yasg pbr==5.11.1 # via stevedore @@ -287,7 +287,7 @@ requests==2.31.0 # social-auth-core requests-oauthlib==1.3.1 # via social-auth-core -s3transfer==0.6.2 +s3transfer==0.7.0 # via boto3 semantic-version==2.10.0 # via edx-drf-extensions @@ -330,7 +330,7 @@ uritemplate==4.1.1 # via # coreapi # drf-yasg -urllib3==1.26.16 +urllib3==1.26.17 # via # botocore # requests @@ -342,7 +342,7 @@ webencodings==0.5.1 # via bleach webob==1.8.7 # via xblock -xblock[django]==1.7.0 +xblock[django]==1.8.0 # via # lti-consumer-xblock # xblock-utils diff --git a/requirements/ci.txt b/requirements/ci.txt index 57563091..267f554b 100644 --- a/requirements/ci.txt +++ b/requirements/ci.txt @@ -10,9 +10,9 @@ filelock==3.12.4 # via # tox # virtualenv -packaging==23.1 +packaging==23.2 # via tox -platformdirs==3.10.0 +platformdirs==3.11.0 # via virtualenv pluggy==1.3.0 # via tox diff --git a/requirements/dev.txt b/requirements/dev.txt index 5d846abe..1d134f19 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -12,7 +12,7 @@ asgiref==3.7.2 # via # -r requirements/validation.txt # django -astroid==2.15.6 +astroid==2.15.8 # via # -r requirements/validation.txt # pylint @@ -22,7 +22,7 @@ attrs==23.1.0 # -r requirements/validation.txt # lti-consumer-xblock # openedx-events -avro==1.11.2 +avro==1.11.3 # via # -r requirements/validation.txt # confluent-kafka @@ -30,11 +30,11 @@ bleach==6.0.0 # via # -r requirements/validation.txt # lti-consumer-xblock -boto3==1.28.52 +boto3==1.28.57 # via # -r requirements/validation.txt # fs-s3fs -botocore==1.31.52 +botocore==1.31.57 # via # -r requirements/validation.txt # boto3 @@ -47,14 +47,14 @@ certifi==2023.7.22 # via # -r requirements/validation.txt # requests -cffi==1.15.1 +cffi==1.16.0 # via # -r requirements/validation.txt # cryptography # pynacl chardet==5.2.0 # via diff-cover -charset-normalizer==3.2.0 +charset-normalizer==3.3.0 # via # -r requirements/validation.txt # requests @@ -87,7 +87,7 @@ coreschema==0.0.4 # via # -r requirements/validation.txt # coreapi -coverage[toml]==7.3.1 +coverage[toml]==7.3.2 # via # -r requirements/validation.txt # pytest-cov @@ -98,7 +98,7 @@ cryptography==41.0.4 # social-auth-core ddt==1.6.0 # via -r requirements/validation.txt -defusedxml==0.7.1 +defusedxml==0.8.0rc2 # via # -r requirements/validation.txt # python3-openid @@ -384,7 +384,7 @@ more-itertools==10.1.0 # jaraco-classes mysqlclient==2.2.0 # via -r requirements/validation.txt -newrelic==9.0.0 +newrelic==9.1.0 # via # -r requirements/validation.txt # edx-django-utils @@ -407,7 +407,7 @@ openedx-django-pyfs==3.4.0 # -r requirements/validation.txt # lti-consumer-xblock # xblock -openedx-events==8.6.0 +openedx-events==8.8.0 # via # -r requirements/validation.txt # edx-event-bus-kafka @@ -415,7 +415,7 @@ openedx-filters==1.6.0 # via # -r requirements/validation.txt # lti-consumer-xblock -packaging==23.1 +packaging==23.2 # via # -r requirements/pip-tools.txt # -r requirements/validation.txt @@ -435,7 +435,7 @@ pkginfo==1.9.6 # via # -r requirements/validation.txt # twine -platformdirs==3.10.0 +platformdirs==3.11.0 # via # -r requirements/validation.txt # pylint @@ -488,7 +488,7 @@ pyjwt[crypto]==2.8.0 # edx-drf-extensions # edx-rest-api-client # social-auth-core -pylint==2.17.5 +pylint==2.17.7 # via # -r requirements/validation.txt # edx-lint @@ -592,11 +592,11 @@ rfc3986==2.0.0 # via # -r requirements/validation.txt # twine -rich==13.5.3 +rich==13.6.0 # via # -r requirements/validation.txt # twine -s3transfer==0.6.2 +s3transfer==0.7.0 # via # -r requirements/validation.txt # boto3 @@ -673,7 +673,7 @@ tox==3.28.0 # via -r requirements/validation.txt twine==4.0.2 # via -r requirements/validation.txt -types-pyyaml==6.0.12.11 +types-pyyaml==6.0.12.12 # via # -r requirements/validation.txt # responses @@ -691,7 +691,7 @@ uritemplate==4.1.1 # -r requirements/validation.txt # coreapi # drf-yasg -urllib3==1.26.16 +urllib3==1.26.17 # via # -r requirements/validation.txt # botocore @@ -723,7 +723,7 @@ wrapt==1.15.0 # via # -r requirements/validation.txt # astroid -xblock[django]==1.7.0 +xblock[django]==1.8.0 # via # -r requirements/validation.txt # lti-consumer-xblock diff --git a/requirements/doc.txt b/requirements/doc.txt index 5e25e1f1..bd9d7186 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -14,7 +14,7 @@ asgiref==3.7.2 # via # -r requirements/test.txt # django -astroid==2.15.6 +astroid==2.15.8 # via # -r requirements/test.txt # pylint @@ -24,7 +24,7 @@ attrs==23.1.0 # -r requirements/test.txt # lti-consumer-xblock # openedx-events -avro==1.11.2 +avro==1.11.3 # via # -r requirements/test.txt # confluent-kafka @@ -34,11 +34,11 @@ bleach==6.0.0 # via # -r requirements/test.txt # lti-consumer-xblock -boto3==1.28.52 +boto3==1.28.57 # via # -r requirements/test.txt # fs-s3fs -botocore==1.31.52 +botocore==1.31.57 # via # -r requirements/test.txt # boto3 @@ -49,12 +49,12 @@ certifi==2023.7.22 # via # -r requirements/test.txt # requests -cffi==1.15.1 +cffi==1.16.0 # via # -r requirements/test.txt # cryptography # pynacl -charset-normalizer==3.2.0 +charset-normalizer==3.3.0 # via # -r requirements/test.txt # requests @@ -85,7 +85,7 @@ coreschema==0.0.4 # via # -r requirements/test.txt # coreapi -coverage[toml]==7.3.1 +coverage[toml]==7.3.2 # via # -r requirements/test.txt # pytest-cov @@ -96,7 +96,7 @@ cryptography==41.0.4 # social-auth-core ddt==1.6.0 # via -r requirements/test.txt -defusedxml==0.7.1 +defusedxml==0.8.0rc2 # via # -r requirements/test.txt # python3-openid @@ -372,7 +372,7 @@ more-itertools==10.1.0 # via jaraco-classes mysqlclient==2.2.0 # via -r requirements/test.txt -newrelic==9.0.0 +newrelic==9.1.0 # via # -r requirements/test.txt # edx-django-utils @@ -393,7 +393,7 @@ openedx-django-pyfs==3.4.0 # -r requirements/test.txt # lti-consumer-xblock # xblock -openedx-events==8.6.0 +openedx-events==8.8.0 # via # -r requirements/test.txt # edx-event-bus-kafka @@ -401,7 +401,7 @@ openedx-filters==1.6.0 # via # -r requirements/test.txt # lti-consumer-xblock -packaging==23.1 +packaging==23.2 # via # -r requirements/test.txt # build @@ -415,7 +415,7 @@ pbr==5.11.1 # stevedore pkginfo==1.9.6 # via twine -platformdirs==3.10.0 +platformdirs==3.11.0 # via # -r requirements/test.txt # pylint @@ -461,7 +461,7 @@ pyjwt[crypto]==2.8.0 # edx-drf-extensions # edx-rest-api-client # social-auth-core -pylint==2.17.5 +pylint==2.17.7 # via # -r requirements/test.txt # edx-lint @@ -560,9 +560,9 @@ restructuredtext-lint==1.4.0 # via doc8 rfc3986==2.0.0 # via twine -rich==13.5.3 +rich==13.6.0 # via twine -s3transfer==0.6.2 +s3transfer==0.7.0 # via # -r requirements/test.txt # boto3 @@ -655,7 +655,7 @@ tox==3.28.0 # -r requirements/test.txt twine==4.0.2 # via -r requirements/doc.in -types-pyyaml==6.0.12.11 +types-pyyaml==6.0.12.12 # via # -r requirements/test.txt # responses @@ -673,7 +673,7 @@ uritemplate==4.1.1 # -r requirements/test.txt # coreapi # drf-yasg -urllib3==1.26.16 +urllib3==1.26.17 # via # -r requirements/test.txt # botocore @@ -701,7 +701,7 @@ wrapt==1.15.0 # via # -r requirements/test.txt # astroid -xblock[django]==1.7.0 +xblock[django]==1.8.0 # via # -r requirements/test.txt # lti-consumer-xblock diff --git a/requirements/pip-tools.txt b/requirements/pip-tools.txt index 894fa179..50d35f22 100644 --- a/requirements/pip-tools.txt +++ b/requirements/pip-tools.txt @@ -10,7 +10,7 @@ click==8.1.7 # via pip-tools importlib-metadata==6.8.0 # via build -packaging==23.1 +packaging==23.2 # via build pip-tools==7.3.0 # via -r requirements/pip-tools.in diff --git a/requirements/production.txt b/requirements/production.txt index 5a90800a..7e730d04 100644 --- a/requirements/production.txt +++ b/requirements/production.txt @@ -17,7 +17,7 @@ attrs==23.1.0 # -r requirements/base.txt # lti-consumer-xblock # openedx-events -avro==1.11.2 +avro==1.11.3 # via # -r requirements/base.txt # confluent-kafka @@ -25,11 +25,11 @@ bleach==6.0.0 # via # -r requirements/base.txt # lti-consumer-xblock -boto3==1.28.52 +boto3==1.28.57 # via # -r requirements/base.txt # fs-s3fs -botocore==1.31.52 +botocore==1.31.57 # via # -r requirements/base.txt # boto3 @@ -38,12 +38,12 @@ certifi==2023.7.22 # via # -r requirements/base.txt # requests -cffi==1.15.1 +cffi==1.16.0 # via # -r requirements/base.txt # cryptography # pynacl -charset-normalizer==3.2.0 +charset-normalizer==3.3.0 # via # -r requirements/base.txt # requests @@ -72,7 +72,7 @@ cryptography==41.0.4 # -r requirements/base.txt # pyjwt # social-auth-core -defusedxml==0.7.1 +defusedxml==0.8.0rc2 # via # -r requirements/base.txt # python3-openid @@ -275,7 +275,7 @@ mysqlclient==2.2.0 # via # -r requirements/base.txt # -r requirements/production.in -newrelic==9.0.0 +newrelic==9.1.0 # via # -r requirements/base.txt # edx-django-utils @@ -294,7 +294,7 @@ openedx-django-pyfs==3.4.0 # -r requirements/base.txt # lti-consumer-xblock # xblock -openedx-events==8.6.0 +openedx-events==8.8.0 # via # -r requirements/base.txt # edx-event-bus-kafka @@ -302,7 +302,7 @@ openedx-filters==1.6.0 # via # -r requirements/base.txt # lti-consumer-xblock -packaging==23.1 +packaging==23.2 # via # -r requirements/base.txt # drf-yasg @@ -390,7 +390,7 @@ requests-oauthlib==1.3.1 # via # -r requirements/base.txt # social-auth-core -s3transfer==0.6.2 +s3transfer==0.7.0 # via # -r requirements/base.txt # boto3 @@ -452,7 +452,7 @@ uritemplate==4.1.1 # -r requirements/base.txt # coreapi # drf-yasg -urllib3==1.26.16 +urllib3==1.26.17 # via # -r requirements/base.txt # botocore @@ -470,7 +470,7 @@ webob==1.8.7 # via # -r requirements/base.txt # xblock -xblock[django]==1.7.0 +xblock[django]==1.8.0 # via # -r requirements/base.txt # lti-consumer-xblock diff --git a/requirements/quality.txt b/requirements/quality.txt index 959d6d66..43f7e0d6 100644 --- a/requirements/quality.txt +++ b/requirements/quality.txt @@ -12,7 +12,7 @@ asgiref==3.7.2 # via # -r requirements/test.txt # django -astroid==2.15.6 +astroid==2.15.8 # via # -r requirements/test.txt # pylint @@ -22,7 +22,7 @@ attrs==23.1.0 # -r requirements/test.txt # lti-consumer-xblock # openedx-events -avro==1.11.2 +avro==1.11.3 # via # -r requirements/test.txt # confluent-kafka @@ -30,11 +30,11 @@ bleach==6.0.0 # via # -r requirements/test.txt # lti-consumer-xblock -boto3==1.28.52 +boto3==1.28.57 # via # -r requirements/test.txt # fs-s3fs -botocore==1.31.52 +botocore==1.31.57 # via # -r requirements/test.txt # boto3 @@ -43,12 +43,12 @@ certifi==2023.7.22 # via # -r requirements/test.txt # requests -cffi==1.15.1 +cffi==1.16.0 # via # -r requirements/test.txt # cryptography # pynacl -charset-normalizer==3.2.0 +charset-normalizer==3.3.0 # via # -r requirements/test.txt # requests @@ -79,7 +79,7 @@ coreschema==0.0.4 # via # -r requirements/test.txt # coreapi -coverage[toml]==7.3.1 +coverage[toml]==7.3.2 # via # -r requirements/test.txt # pytest-cov @@ -90,7 +90,7 @@ cryptography==41.0.4 # social-auth-core ddt==1.6.0 # via -r requirements/test.txt -defusedxml==0.7.1 +defusedxml==0.8.0rc2 # via # -r requirements/test.txt # python3-openid @@ -356,7 +356,7 @@ more-itertools==10.1.0 # via jaraco-classes mysqlclient==2.2.0 # via -r requirements/test.txt -newrelic==9.0.0 +newrelic==9.1.0 # via # -r requirements/test.txt # edx-django-utils @@ -377,7 +377,7 @@ openedx-django-pyfs==3.4.0 # -r requirements/test.txt # lti-consumer-xblock # xblock -openedx-events==8.6.0 +openedx-events==8.8.0 # via # -r requirements/test.txt # edx-event-bus-kafka @@ -385,7 +385,7 @@ openedx-filters==1.6.0 # via # -r requirements/test.txt # lti-consumer-xblock -packaging==23.1 +packaging==23.2 # via # -r requirements/test.txt # drf-yasg @@ -397,7 +397,7 @@ pbr==5.11.1 # stevedore pkginfo==1.9.6 # via twine -platformdirs==3.10.0 +platformdirs==3.11.0 # via # -r requirements/test.txt # pylint @@ -445,7 +445,7 @@ pyjwt[crypto]==2.8.0 # edx-drf-extensions # edx-rest-api-client # social-auth-core -pylint==2.17.5 +pylint==2.17.7 # via # -r requirements/test.txt # edx-lint @@ -538,9 +538,9 @@ responses==0.23.3 # via -r requirements/test.txt rfc3986==2.0.0 # via twine -rich==13.5.3 +rich==13.6.0 # via twine -s3transfer==0.6.2 +s3transfer==0.7.0 # via # -r requirements/test.txt # boto3 @@ -612,7 +612,7 @@ tox==3.28.0 # -r requirements/test.txt twine==4.0.2 # via -r requirements/quality.in -types-pyyaml==6.0.12.11 +types-pyyaml==6.0.12.12 # via # -r requirements/test.txt # responses @@ -630,7 +630,7 @@ uritemplate==4.1.1 # -r requirements/test.txt # coreapi # drf-yasg -urllib3==1.26.16 +urllib3==1.26.17 # via # -r requirements/test.txt # botocore @@ -658,7 +658,7 @@ wrapt==1.15.0 # via # -r requirements/test.txt # astroid -xblock[django]==1.7.0 +xblock[django]==1.8.0 # via # -r requirements/test.txt # lti-consumer-xblock diff --git a/requirements/test.txt b/requirements/test.txt index c48a5431..65fcb08e 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -12,7 +12,7 @@ asgiref==3.7.2 # via # -r requirements/base.txt # django -astroid==2.15.6 +astroid==2.15.8 # via # pylint # pylint-celery @@ -21,7 +21,7 @@ attrs==23.1.0 # -r requirements/base.txt # lti-consumer-xblock # openedx-events -avro==1.11.2 +avro==1.11.3 # via # -r requirements/base.txt # confluent-kafka @@ -29,11 +29,11 @@ bleach==6.0.0 # via # -r requirements/base.txt # lti-consumer-xblock -boto3==1.28.52 +boto3==1.28.57 # via # -r requirements/base.txt # fs-s3fs -botocore==1.31.52 +botocore==1.31.57 # via # -r requirements/base.txt # boto3 @@ -42,12 +42,12 @@ certifi==2023.7.22 # via # -r requirements/base.txt # requests -cffi==1.15.1 +cffi==1.16.0 # via # -r requirements/base.txt # cryptography # pynacl -charset-normalizer==3.2.0 +charset-normalizer==3.3.0 # via # -r requirements/base.txt # requests @@ -77,7 +77,7 @@ coreschema==0.0.4 # via # -r requirements/base.txt # coreapi -coverage[toml]==7.3.1 +coverage[toml]==7.3.2 # via # -r requirements/test.in # pytest-cov @@ -88,7 +88,7 @@ cryptography==41.0.4 # social-auth-core ddt==1.6.0 # via -r requirements/test.in -defusedxml==0.7.1 +defusedxml==0.8.0rc2 # via # -r requirements/base.txt # python3-openid @@ -315,7 +315,7 @@ mock==5.1.0 # via -r requirements/test.in mysqlclient==2.2.0 # via -r requirements/base.txt -newrelic==9.0.0 +newrelic==9.1.0 # via # -r requirements/base.txt # edx-django-utils @@ -334,7 +334,7 @@ openedx-django-pyfs==3.4.0 # -r requirements/base.txt # lti-consumer-xblock # xblock -openedx-events==8.6.0 +openedx-events==8.8.0 # via # -r requirements/base.txt # edx-event-bus-kafka @@ -342,7 +342,7 @@ openedx-filters==1.6.0 # via # -r requirements/base.txt # lti-consumer-xblock -packaging==23.1 +packaging==23.2 # via # -r requirements/base.txt # drf-yasg @@ -352,7 +352,7 @@ pbr==5.11.1 # via # -r requirements/base.txt # stevedore -platformdirs==3.10.0 +platformdirs==3.11.0 # via # pylint # virtualenv @@ -388,7 +388,7 @@ pyjwt[crypto]==2.8.0 # edx-drf-extensions # edx-rest-api-client # social-auth-core -pylint==2.17.5 +pylint==2.17.7 # via # edx-lint # pylint-celery @@ -466,7 +466,7 @@ requests-oauthlib==1.3.1 # social-auth-core responses==0.23.3 # via -r requirements/test.in -s3transfer==0.6.2 +s3transfer==0.7.0 # via # -r requirements/base.txt # boto3 @@ -531,7 +531,7 @@ tox==3.28.0 # via # -c https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt # -r requirements/test.in -types-pyyaml==6.0.12.11 +types-pyyaml==6.0.12.12 # via responses typing-extensions==4.8.0 # via @@ -546,7 +546,7 @@ uritemplate==4.1.1 # -r requirements/base.txt # coreapi # drf-yasg -urllib3==1.26.16 +urllib3==1.26.17 # via # -r requirements/base.txt # botocore @@ -569,7 +569,7 @@ webob==1.8.7 # xblock wrapt==1.15.0 # via astroid -xblock[django]==1.7.0 +xblock[django]==1.8.0 # via # -r requirements/base.txt # lti-consumer-xblock diff --git a/requirements/validation.txt b/requirements/validation.txt index f3b2fcad..1691b842 100644 --- a/requirements/validation.txt +++ b/requirements/validation.txt @@ -14,7 +14,7 @@ asgiref==3.7.2 # -r requirements/quality.txt # -r requirements/test.txt # django -astroid==2.15.6 +astroid==2.15.8 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -26,7 +26,7 @@ attrs==23.1.0 # -r requirements/test.txt # lti-consumer-xblock # openedx-events -avro==1.11.2 +avro==1.11.3 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -36,12 +36,12 @@ bleach==6.0.0 # -r requirements/quality.txt # -r requirements/test.txt # lti-consumer-xblock -boto3==1.28.52 +boto3==1.28.57 # via # -r requirements/quality.txt # -r requirements/test.txt # fs-s3fs -botocore==1.31.52 +botocore==1.31.57 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -52,13 +52,13 @@ certifi==2023.7.22 # -r requirements/quality.txt # -r requirements/test.txt # requests -cffi==1.15.1 +cffi==1.16.0 # via # -r requirements/quality.txt # -r requirements/test.txt # cryptography # pynacl -charset-normalizer==3.2.0 +charset-normalizer==3.3.0 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -97,7 +97,7 @@ coreschema==0.0.4 # -r requirements/quality.txt # -r requirements/test.txt # coreapi -coverage[toml]==7.3.1 +coverage[toml]==7.3.2 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -112,7 +112,7 @@ ddt==1.6.0 # via # -r requirements/quality.txt # -r requirements/test.txt -defusedxml==0.7.1 +defusedxml==0.8.0rc2 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -463,7 +463,7 @@ mysqlclient==2.2.0 # via # -r requirements/quality.txt # -r requirements/test.txt -newrelic==9.0.0 +newrelic==9.1.0 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -490,7 +490,7 @@ openedx-django-pyfs==3.4.0 # -r requirements/test.txt # lti-consumer-xblock # xblock -openedx-events==8.6.0 +openedx-events==8.8.0 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -500,7 +500,7 @@ openedx-filters==1.6.0 # -r requirements/quality.txt # -r requirements/test.txt # lti-consumer-xblock -packaging==23.1 +packaging==23.2 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -516,7 +516,7 @@ pkginfo==1.9.6 # via # -r requirements/quality.txt # twine -platformdirs==3.10.0 +platformdirs==3.11.0 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -573,7 +573,7 @@ pyjwt[crypto]==2.8.0 # edx-drf-extensions # edx-rest-api-client # social-auth-core -pylint==2.17.5 +pylint==2.17.7 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -692,11 +692,11 @@ rfc3986==2.0.0 # via # -r requirements/quality.txt # twine -rich==13.5.3 +rich==13.6.0 # via # -r requirements/quality.txt # twine -s3transfer==0.6.2 +s3transfer==0.7.0 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -782,7 +782,7 @@ tox==3.28.0 # -r requirements/test.txt twine==4.0.2 # via -r requirements/quality.txt -types-pyyaml==6.0.12.11 +types-pyyaml==6.0.12.12 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -803,7 +803,7 @@ uritemplate==4.1.1 # -r requirements/test.txt # coreapi # drf-yasg -urllib3==1.26.16 +urllib3==1.26.17 # via # -r requirements/quality.txt # -r requirements/test.txt @@ -837,7 +837,7 @@ wrapt==1.15.0 # -r requirements/quality.txt # -r requirements/test.txt # astroid -xblock[django]==1.7.0 +xblock[django]==1.8.0 # via # -r requirements/quality.txt # -r requirements/test.txt