diff --git a/common/djangoapps/course_modes/migrations/0013_auto_20200115_2022.py b/common/djangoapps/course_modes/migrations/0013_auto_20200115_2022.py new file mode 100644 index 0000000000..bd33c71d01 --- /dev/null +++ b/common/djangoapps/course_modes/migrations/0013_auto_20200115_2022.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.27 on 2020-01-15 20:22 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('course_modes', '0012_historicalcoursemode'), + ] + + operations = [ + migrations.AlterField( + model_name='coursemode', + name='course', + field=models.ForeignKey(db_constraint=False, on_delete=django.db.models.deletion.DO_NOTHING, related_name='modes', to='course_overviews.CourseOverview'), + ), + ] diff --git a/common/djangoapps/course_modes/models.py b/common/djangoapps/course_modes/models.py index 540145d711..e2aca1b2c5 100644 --- a/common/djangoapps/course_modes/models.py +++ b/common/djangoapps/course_modes/models.py @@ -54,7 +54,7 @@ class CourseMode(models.Model): db_constraint=False, db_index=True, related_name='modes', - on_delete=models.CASCADE, + on_delete=models.DO_NOTHING, ) # Django sets the `course_id` property in __init__ with the value from the database diff --git a/common/djangoapps/course_modes/tests/test_models.py b/common/djangoapps/course_modes/tests/test_models.py index 117ba30032..199dcdb4b2 100644 --- a/common/djangoapps/course_modes/tests/test_models.py +++ b/common/djangoapps/course_modes/tests/test_models.py @@ -21,6 +21,7 @@ from six.moves import zip from course_modes.helpers import enrollment_mode_display from course_modes.models import CourseMode, Mode, get_cosmetic_display_price, invalidate_course_mode_cache from course_modes.tests.factories import CourseModeFactory +from openedx.core.djangoapps.content.course_overviews.models import CourseOverview from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase from xmodule.modulestore.tests.factories import CourseFactory @@ -523,6 +524,19 @@ class CourseModeModelTest(TestCase): self.assertEqual(CourseMode.is_masters_only(self.course_key), expected_is_masters_only) +class TestCourseOverviewIntegration(ModuleStoreTestCase): + def test_course_overview_version_update(self): + course = CourseFactory.create() + course_overview = CourseOverview.get_from_id(course.id) + course_overview.version -= 1 + course_overview.save() + course_mode = CourseModeFactory.create(course_id=course_overview.id) + + assert CourseMode.objects.filter(pk=course_mode.pk).exists() + CourseOverview.get_from_id(course.id) + assert CourseMode.objects.filter(pk=course_mode.pk).exists() + + class TestDisplayPrices(ModuleStoreTestCase): @override_settings(PAID_COURSE_REGISTRATION_CURRENCY=["USD", "$"]) def test_get_cosmetic_display_price(self): diff --git a/common/djangoapps/entitlements/migrations/0014_auto_20200115_2022.py b/common/djangoapps/entitlements/migrations/0014_auto_20200115_2022.py new file mode 100644 index 0000000000..f7fa755e30 --- /dev/null +++ b/common/djangoapps/entitlements/migrations/0014_auto_20200115_2022.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.27 on 2020-01-15 20:22 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('entitlements', '0013_historicalcourseentitlementsupportdetail'), + ] + + operations = [ + migrations.AlterField( + model_name='courseentitlementsupportdetail', + name='unenrolled_run', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='course_overviews.CourseOverview'), + ), + ] diff --git a/common/djangoapps/entitlements/models.py b/common/djangoapps/entitlements/models.py index 9efe7bb432..f018d3e0ba 100644 --- a/common/djangoapps/entitlements/models.py +++ b/common/djangoapps/entitlements/models.py @@ -499,7 +499,7 @@ class CourseEntitlementSupportDetail(TimeStampedModel): null=True, blank=True, db_constraint=False, - on_delete=models.CASCADE, + on_delete=models.DO_NOTHING, ) history = HistoricalRecords() diff --git a/openedx/core/djangoapps/content/course_overviews/models.py b/openedx/core/djangoapps/content/course_overviews/models.py index 568394eaa2..e32f8068e1 100644 --- a/openedx/core/djangoapps/content/course_overviews/models.py +++ b/openedx/core/djangoapps/content/course_overviews/models.py @@ -321,9 +321,8 @@ class CourseOverview(TimeStampedModel): try: course_overview = cls.objects.select_related('image_set').get(id=course_id) if course_overview.version < cls.VERSION: - # Throw away old versions of CourseOverview, as they might contain stale data. - course_overview.delete() - course_overview = None + # Reload the overview from the modulestore to update the version + course_overview = cls.load_from_module_store(course_id) except cls.DoesNotExist: course_overview = None