diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 46900d0a42..e7795974e5 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -16,6 +16,11 @@ Change Log Unreleased ---------- +[4.10.4] +-------- + +revert: 4.10.1 + [4.10.3] -------- diff --git a/enterprise/__init__.py b/enterprise/__init__.py index ad8416750c..a7d65f0abd 100644 --- a/enterprise/__init__.py +++ b/enterprise/__init__.py @@ -2,4 +2,4 @@ Your project description goes here. """ -__version__ = "4.10.3" +__version__ = "4.10.4" diff --git a/integrated_channels/blackboard/migrations/0018_auto_20240110_1301.py b/integrated_channels/blackboard/migrations/0018_auto_20240110_1301.py deleted file mode 100644 index 79c0ef22ba..0000000000 --- a/integrated_channels/blackboard/migrations/0018_auto_20240110_1301.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 3.2.23 on 2024-01-10 13:01 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('blackboard', '0017_alter_historicalblackboardenterprisecustomerconfiguration_options'), - ] - - operations = [ - migrations.AddField( - model_name='blackboardlearnerassessmentdatatransmissionaudit', - name='transmission_status', - field=models.JSONField(blank=True, default=list, null=True), - ), - migrations.AddField( - model_name='blackboardlearnerdatatransmissionaudit', - name='transmission_status', - field=models.JSONField(blank=True, default=list, null=True), - ), - ] diff --git a/integrated_channels/canvas/migrations/0033_auto_20240110_1301.py b/integrated_channels/canvas/migrations/0033_auto_20240110_1301.py deleted file mode 100644 index 3c4ab2ff5d..0000000000 --- a/integrated_channels/canvas/migrations/0033_auto_20240110_1301.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 3.2.23 on 2024-01-10 13:01 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('canvas', '0032_alter_historicalcanvasenterprisecustomerconfiguration_options'), - ] - - operations = [ - migrations.AddField( - model_name='canvaslearnerassessmentdatatransmissionaudit', - name='transmission_status', - field=models.JSONField(blank=True, default=list, null=True), - ), - migrations.AddField( - model_name='canvaslearnerdatatransmissionaudit', - name='transmission_status', - field=models.JSONField(blank=True, default=list, null=True), - ), - ] diff --git a/integrated_channels/cornerstone/migrations/0032_cornerstonelearnerdatatransmissionaudit_transmission_status.py b/integrated_channels/cornerstone/migrations/0032_cornerstonelearnerdatatransmissionaudit_transmission_status.py deleted file mode 100644 index b606802498..0000000000 --- a/integrated_channels/cornerstone/migrations/0032_cornerstonelearnerdatatransmissionaudit_transmission_status.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.23 on 2024-01-16 07:30 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('cornerstone', '0031_cornerstoneapirequestlogs'), - ] - - operations = [ - migrations.AddField( - model_name='cornerstonelearnerdatatransmissionaudit', - name='transmission_status', - field=models.JSONField(blank=True, default=list, null=True), - ), - ] diff --git a/integrated_channels/degreed/migrations/0032_degreedlearnerdatatransmissionaudit_transmission_status.py b/integrated_channels/degreed/migrations/0032_degreedlearnerdatatransmissionaudit_transmission_status.py deleted file mode 100644 index 4bfd135b84..0000000000 --- a/integrated_channels/degreed/migrations/0032_degreedlearnerdatatransmissionaudit_transmission_status.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.23 on 2024-01-10 13:01 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('degreed', '0031_alter_historicaldegreedenterprisecustomerconfiguration_options'), - ] - - operations = [ - migrations.AddField( - model_name='degreedlearnerdatatransmissionaudit', - name='transmission_status', - field=models.JSONField(blank=True, default=list, null=True), - ), - ] diff --git a/integrated_channels/degreed2/migrations/0024_degreed2learnerdatatransmissionaudit_transmission_status.py b/integrated_channels/degreed2/migrations/0024_degreed2learnerdatatransmissionaudit_transmission_status.py deleted file mode 100644 index 0f367ac477..0000000000 --- a/integrated_channels/degreed2/migrations/0024_degreed2learnerdatatransmissionaudit_transmission_status.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.23 on 2024-01-10 13:01 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('degreed2', '0023_alter_historicaldegreed2enterprisecustomerconfiguration_options'), - ] - - operations = [ - migrations.AddField( - model_name='degreed2learnerdatatransmissionaudit', - name='transmission_status', - field=models.JSONField(blank=True, default=list, null=True), - ), - ] diff --git a/integrated_channels/integrated_channel/constants.py b/integrated_channels/integrated_channel/constants.py index 7f0e33189c..8636e653ab 100644 --- a/integrated_channels/integrated_channel/constants.py +++ b/integrated_channels/integrated_channel/constants.py @@ -4,4 +4,3 @@ ISO_8601_DATE_FORMAT = '%Y-%m-%dT%H:%M:%S.%fZ' TASK_LOCK_EXPIRY_SECONDS = 60 * 60 * 12 -TRANSMISSION_STATUS_RECORDS_LIMIT = 3 diff --git a/integrated_channels/integrated_channel/migrations/0031_genericlearnerdatatransmissionaudit_transmission_status.py b/integrated_channels/integrated_channel/migrations/0031_genericlearnerdatatransmissionaudit_transmission_status.py deleted file mode 100644 index 843c65d649..0000000000 --- a/integrated_channels/integrated_channel/migrations/0031_genericlearnerdatatransmissionaudit_transmission_status.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.23 on 2024-01-16 07:59 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('integrated_channel', '0030_integratedchannelapirequestlogs'), - ] - - operations = [ - migrations.AddField( - model_name='genericlearnerdatatransmissionaudit', - name='transmission_status', - field=models.JSONField(blank=True, default=list, null=True), - ), - ] diff --git a/integrated_channels/integrated_channel/models.py b/integrated_channels/integrated_channel/models.py index cc0d60fc64..0d2a26f4e3 100644 --- a/integrated_channels/integrated_channel/models.py +++ b/integrated_channels/integrated_channel/models.py @@ -12,7 +12,6 @@ from django.db import models from django.db.models import Q from django.db.models.query import QuerySet -from django.utils import timezone from django.utils.translation import gettext_lazy as _ from model_utils.models import TimeStampedModel @@ -20,7 +19,6 @@ from enterprise.constants import TRANSMISSION_MARK_CREATE, TRANSMISSION_MARK_DELETE, TRANSMISSION_MARK_UPDATE from enterprise.models import EnterpriseCustomer, EnterpriseCustomerCatalog from enterprise.utils import localized_utcnow -from integrated_channels.integrated_channel.constants import TRANSMISSION_STATUS_RECORDS_LIMIT from integrated_channels.integrated_channel.exporters.content_metadata import ContentMetadataExporter from integrated_channels.integrated_channel.exporters.learner_data import LearnerExporter from integrated_channels.integrated_channel.transmitters.content_metadata import ContentMetadataTransmitter @@ -533,8 +531,6 @@ class LearnerDataTransmissionAudit(TimeStampedModel): help_text=_('Data pertaining to the transmissions API request response.') ) - transmission_status = models.JSONField(default=list, blank=True, null=True) - class Meta: abstract = True app_label = 'integrated_channel' @@ -607,20 +603,6 @@ def _payload_data(self): 'grade': self.grade, } - def add_transmission_status(self, status_code, error_message): - """ - Append the new entry to the list, keeping the list limited to latest three entries. - """ - new_entry = { - 'timestamp': timezone.now().isoformat(), - 'Status_code': status_code, - 'error_message': error_message, - } - - self.transmission_status.append(new_entry) - - self.transmission_status = self.transmission_status[-TRANSMISSION_STATUS_RECORDS_LIMIT:] - class GenericLearnerDataTransmissionAudit(LearnerDataTransmissionAudit): """ diff --git a/integrated_channels/integrated_channel/transmitters/learner_data.py b/integrated_channels/integrated_channel/transmitters/learner_data.py index 23208d49ab..09398ce39b 100644 --- a/integrated_channels/integrated_channel/transmitters/learner_data.py +++ b/integrated_channels/integrated_channel/transmitters/learner_data.py @@ -380,7 +380,6 @@ def transmit(self, payload, **kwargs): # pylint: disable=arguments-differ was_successful = code < 300 learner_data.status = str(code) learner_data.error_message = body if not was_successful else '' - learner_data.add_transmission_status(learner_data.status, learner_data.error_message) learner_data.save() self.enterprise_configuration.update_learner_synced_at(action_happened_at, was_successful) diff --git a/integrated_channels/moodle/migrations/0032_auto_20240117_1202.py b/integrated_channels/moodle/migrations/0031_auto_20240117_1202.py similarity index 92% rename from integrated_channels/moodle/migrations/0032_auto_20240117_1202.py rename to integrated_channels/moodle/migrations/0031_auto_20240117_1202.py index 7a445ec62a..29ed6e8e9f 100644 --- a/integrated_channels/moodle/migrations/0032_auto_20240117_1202.py +++ b/integrated_channels/moodle/migrations/0031_auto_20240117_1202.py @@ -6,7 +6,7 @@ class Migration(migrations.Migration): dependencies = [ - ('moodle', '0031_moodlelearnerdatatransmissionaudit_transmission_status'), + ('moodle', '0030_merge_0028_auto_20231116_1826_0029_auto_20231106_1233'), ] operations = [ diff --git a/integrated_channels/moodle/migrations/0031_moodlelearnerdatatransmissionaudit_transmission_status.py b/integrated_channels/moodle/migrations/0031_moodlelearnerdatatransmissionaudit_transmission_status.py deleted file mode 100644 index c5ce2da304..0000000000 --- a/integrated_channels/moodle/migrations/0031_moodlelearnerdatatransmissionaudit_transmission_status.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.23 on 2024-01-15 08:47 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('moodle', '0030_merge_0028_auto_20231116_1826_0029_auto_20231106_1233'), - ] - - operations = [ - migrations.AddField( - model_name='moodlelearnerdatatransmissionaudit', - name='transmission_status', - field=models.JSONField(blank=True, default=list, null=True), - ), - ] diff --git a/integrated_channels/sap_success_factors/migrations/0015_sapsuccessfactorslearnerdatatransmissionaudit_transmission_status.py b/integrated_channels/sap_success_factors/migrations/0015_sapsuccessfactorslearnerdatatransmissionaudit_transmission_status.py deleted file mode 100644 index e2a2af9165..0000000000 --- a/integrated_channels/sap_success_factors/migrations/0015_sapsuccessfactorslearnerdatatransmissionaudit_transmission_status.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.23 on 2024-01-10 13:01 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('sap_success_factors', '0014_alter_sapsuccessfactorsenterprisecustomerconfiguration_show_course_price'), - ] - - operations = [ - migrations.AddField( - model_name='sapsuccessfactorslearnerdatatransmissionaudit', - name='transmission_status', - field=models.JSONField(blank=True, default=list, null=True), - ), - ] diff --git a/integrated_channels/xapi/migrations/0012_xapilearnerdatatransmissionaudit_transmission_status.py b/integrated_channels/xapi/migrations/0012_xapilearnerdatatransmissionaudit_transmission_status.py deleted file mode 100644 index 1ce5515876..0000000000 --- a/integrated_channels/xapi/migrations/0012_xapilearnerdatatransmissionaudit_transmission_status.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.23 on 2024-01-10 13:01 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('xapi', '0011_alter_xapilearnerdatatransmissionaudit_index_together'), - ] - - operations = [ - migrations.AddField( - model_name='xapilearnerdatatransmissionaudit', - name='transmission_status', - field=models.JSONField(blank=True, default=list, null=True), - ), - ] diff --git a/tests/test_integrated_channels/test_integrated_channel/test_transmitters/test_learner_data.py b/tests/test_integrated_channels/test_integrated_channel/test_transmitters/test_learner_data.py index a04161a274..0d2b7345a2 100644 --- a/tests/test_integrated_channels/test_integrated_channel/test_transmitters/test_learner_data.py +++ b/tests/test_integrated_channels/test_integrated_channel/test_transmitters/test_learner_data.py @@ -1,7 +1,7 @@ """ Tests for the base learner data transmitter. """ -import datetime + import unittest from unittest import mock from unittest.mock import MagicMock, Mock @@ -9,12 +9,9 @@ import ddt from pytest import mark -from integrated_channels.integrated_channel.constants import TRANSMISSION_STATUS_RECORDS_LIMIT from integrated_channels.integrated_channel.exporters.learner_data import LearnerExporter from integrated_channels.integrated_channel.tasks import transmit_single_learner_data from integrated_channels.integrated_channel.transmitters.learner_data import LearnerTransmitter -from integrated_channels.sap_success_factors.models import SapSuccessFactorsLearnerDataTransmissionAudit -from integrated_channels.sap_success_factors.transmitters import learner_data from test_utils import factories @@ -29,13 +26,6 @@ def setUp(self): super().setUp() enterprise_customer = factories.EnterpriseCustomerFactory(name='Starfleet Academy') - self.enterprise_customer_user = factories.EnterpriseCustomerUserFactory( - enterprise_customer=enterprise_customer, - ) - self.enterprise_course_enrollment = factories.EnterpriseCourseEnrollmentFactory( - id=5, - enterprise_customer_user=self.enterprise_customer_user, - ) # We need some non-abstract configuration for these things to work, # so it's okay for it to be any arbitrary channel. We randomly choose SAPSF. @@ -47,25 +37,6 @@ def setUp(self): sapsf_user_id="user_id", secret="client_secret", ) - self.payload = SapSuccessFactorsLearnerDataTransmissionAudit( - enterprise_course_enrollment_id=self.enterprise_course_enrollment.id, - course_id='course-v1:edX+DemoX+DemoCourse', - course_completed=True, - sap_completed_timestamp=1486855998, - completed_timestamp=datetime.datetime.fromtimestamp(1486855998), - total_hours=1.0, - grade=.9, - ) - self.exporter = lambda payloads=self.payload: mock.MagicMock( - export=mock.MagicMock(return_value=iter(payloads)) - ) - # Mocks - create_course_completion_mock = mock.patch( - 'integrated_channels.sap_success_factors.client.SAPSuccessFactorsAPIClient.create_course_completion' - ) - - self.create_course_completion_mock = create_course_completion_mock.start() - self.addCleanup(create_course_completion_mock.stop) self.learner_transmitter = LearnerTransmitter(self.enterprise_config) @@ -222,23 +193,3 @@ def test_learner_data_transmission_dry_run_mode(self, already_transmitted_mock, ) # with dry_run_mode_enabled = True we shouldn't be able to call this method assert not self.learner_transmitter.client.create_assessment_reporting.called - - def test_transmission_status_learner_data_transmission(self): - """ - Test that transmission status records three most recent status instances. - """ - self.create_course_completion_mock.return_value = 200, '' - - transmitter = learner_data.SapSuccessFactorsLearnerTransmitter(self.enterprise_config) - for _ in range(TRANSMISSION_STATUS_RECORDS_LIMIT + 1): - if _ == TRANSMISSION_STATUS_RECORDS_LIMIT: - self.create_course_completion_mock.return_value = 400, '{"error":{"code":null,"message":"Invalid value for property \'courseCompleted\'."}}' - transmitter.transmit(self.exporter([self.payload])) - actual_transmission_status = self.payload.transmission_status - - expected_transmission_status = [ - {'timestamp': mock.ANY, 'Status_code': '200', 'error_message': ''}, - {'timestamp': mock.ANY, 'Status_code': '200', 'error_message': ''}, - {'timestamp': mock.ANY, 'Status_code': '400', 'error_message': 'Client create_course_completion failed: {"error":{"code":null,"message":"Invalid value for property \'courseCompleted\'."}}'}, - ] - assert expected_transmission_status == actual_transmission_status