-<% if (highlights_preview_only) { %>
-
- <%- gettext('This feature is currently in testing. Course teams can enter highlights, but learners will not receive email messages.') %>
-
-<% } %>
-
<%- gettext('Enter 3-5 highlights to include in the email message that learners receive for this section (250 character limit).') %>
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 fbb71df12c..c866d96d2d 100644
--- a/common/djangoapps/entitlements/rest_api/v1/tests/test_views.py
+++ b/common/djangoapps/entitlements/rest_api/v1/tests/test_views.py
@@ -20,7 +20,6 @@ from common.djangoapps.course_modes.tests.factories import CourseModeFactory
from lms.djangoapps.courseware.models import DynamicUpgradeDeadlineConfiguration
from openedx.core.djangoapps.content.course_overviews.models import CourseOverview
from openedx.core.djangoapps.content.course_overviews.tests.factories import CourseOverviewFactory
-from openedx.core.djangoapps.schedules.tests.factories import ScheduleFactory
from openedx.core.djangoapps.site_configuration.tests.factories import SiteFactory
from openedx.core.djangoapps.user_api.models import UserOrgTag
from common.djangoapps.student.models import CourseEnrollment
@@ -485,7 +484,7 @@ class EntitlementViewSetTest(ModuleStoreTestCase):
DynamicUpgradeDeadlineConfiguration.objects.create(enabled=True)
course = CourseFactory.create(self_paced=True)
course_uuid = uuid.uuid4()
- course_mode = CourseModeFactory(
+ CourseModeFactory(
course_id=course.id,
mode_slug=CourseMode.VERIFIED,
# This must be in the future to ensure it is returned by downstream code.
@@ -499,11 +498,9 @@ class EntitlementViewSetTest(ModuleStoreTestCase):
# Add an audit course enrollment for user.
enrollment = CourseEnrollment.enroll(self.user, course.id, mode=CourseMode.AUDIT)
- # Set an upgrade schedule so that dynamic upgrade deadlines are used
- ScheduleFactory.create(
- enrollment=enrollment,
- upgrade_deadline=course_mode.expiration_datetime + timedelta(days=-3)
- )
+ # Set an expired dynamic upgrade deadline
+ enrollment.schedule.upgrade_deadline = now() + timedelta(days=-2)
+ enrollment.schedule.save()
# The upgrade should complete and ignore the deadline
response = self.client.post(
diff --git a/common/djangoapps/student/tests/test_models.py b/common/djangoapps/student/tests/test_models.py
index 4b7afc7c27..fcc93e412d 100644
--- a/common/djangoapps/student/tests/test_models.py
+++ b/common/djangoapps/student/tests/test_models.py
@@ -27,7 +27,6 @@ from lms.djangoapps.courseware.toggles import (
)
from openedx.core.djangoapps.content.course_overviews.models import CourseOverview
from openedx.core.djangoapps.schedules.models import Schedule
-from openedx.core.djangoapps.schedules.tests.factories import ScheduleFactory
from openedx.core.djangoapps.user_api.preferences.api import set_user_preference
from openedx.core.djangolib.testing.utils import skip_unless_lms
from common.djangoapps.student.models import (
@@ -139,8 +138,6 @@ class CourseEnrollmentTests(SharedModuleStoreTestCase): # lint-amnesty, pylint:
self.assertListEqual([self.user, self.user_2], all_enrolled_users)
@skip_unless_lms
- # NOTE: We mute the post_save signal to prevent Schedules from being created for new enrollments
- @factory.django.mute_signals(signals.post_save)
def test_upgrade_deadline(self):
""" The property should use either the CourseMode or related Schedule to determine the deadline. """
course = CourseFactory(self_paced=True)
@@ -151,12 +148,10 @@ class CourseEnrollmentTests(SharedModuleStoreTestCase): # lint-amnesty, pylint:
expiration_datetime=datetime.datetime.now(pytz.UTC) + datetime.timedelta(days=1)
)
enrollment = CourseEnrollmentFactory(course_id=course.id, mode=CourseMode.AUDIT)
- assert Schedule.objects.all().count() == 0
+ Schedule.objects.all().delete()
assert enrollment.upgrade_deadline == course_mode.expiration_datetime
@skip_unless_lms
- # NOTE: We mute the post_save signal to prevent Schedules from being created for new enrollments
- @factory.django.mute_signals(signals.post_save)
def test_upgrade_deadline_with_schedule(self):
""" The property should use either the CourseMode or related Schedule to determine the deadline. """
course = CourseFactory(self_paced=True)
@@ -167,16 +162,17 @@ class CourseEnrollmentTests(SharedModuleStoreTestCase): # lint-amnesty, pylint:
expiration_datetime=datetime.datetime.now(pytz.UTC) + datetime.timedelta(days=30),
)
course_overview = CourseOverview.load_from_module_store(course.id)
- enrollment = CourseEnrollmentFactory(
+ CourseEnrollmentFactory(
course_id=course.id,
mode=CourseMode.AUDIT,
course=course_overview,
)
+ Schedule.objects.update(upgrade_deadline=datetime.datetime.now(pytz.UTC) + datetime.timedelta(days=5))
+ enrollment = CourseEnrollment.objects.first()
# The schedule's upgrade deadline should be used if a schedule exists
DynamicUpgradeDeadlineConfiguration.objects.create(enabled=True)
- schedule = ScheduleFactory(enrollment=enrollment)
- assert enrollment.upgrade_deadline == schedule.upgrade_deadline
+ assert enrollment.upgrade_deadline == enrollment.schedule.upgrade_deadline
@skip_unless_lms
@ddt.data(*(set(CourseMode.ALL_MODES) - set(CourseMode.AUDIT_MODES)))
@@ -197,7 +193,6 @@ class CourseEnrollmentTests(SharedModuleStoreTestCase): # lint-amnesty, pylint:
)
enrollment = CourseEnrollmentFactory(course_id=course.id, mode=CourseMode.AUDIT)
DynamicUpgradeDeadlineConfiguration.objects.create(enabled=True)
- ScheduleFactory(enrollment=enrollment)
assert enrollment.schedule is not None
assert enrollment.upgrade_deadline == course_upgrade_deadline
@@ -215,13 +210,10 @@ class CourseEnrollmentTests(SharedModuleStoreTestCase): # lint-amnesty, pylint:
)
enrollment = CourseEnrollmentFactory(course_id=course.id, mode=CourseMode.AUDIT)
DynamicUpgradeDeadlineConfiguration.objects.create(enabled=True)
- ScheduleFactory(enrollment=enrollment)
assert enrollment.schedule is not None
assert enrollment.upgrade_deadline is None
@skip_unless_lms
- # NOTE: We mute the post_save signal to prevent Schedules from being created for new enrollments
- @factory.django.mute_signals(signals.post_save)
def test_enrollments_not_deleted(self):
""" Recreating a CourseOverview with an outdated version should not delete the associated enrollment. """
course = CourseFactory(self_paced=True)
diff --git a/common/djangoapps/student/tests/test_views.py b/common/djangoapps/student/tests/test_views.py
index 7f26e201fc..937a25795f 100644
--- a/common/djangoapps/student/tests/test_views.py
+++ b/common/djangoapps/student/tests/test_views.py
@@ -17,7 +17,6 @@ from django.test import TestCase
from django.test.utils import override_settings
from django.urls import reverse
from django.utils.timezone import now
-from edx_toggles.toggles.testutils import override_waffle_flag
from milestones.tests.utils import MilestonesTestCaseMixin
from mock import patch
from opaque_keys import InvalidKeyError
@@ -31,8 +30,6 @@ from lms.djangoapps.certificates.tests.factories import GeneratedCertificateFact
from openedx.core.djangoapps.catalog.tests.factories import ProgramFactory
from openedx.core.djangoapps.content.course_overviews.models import CourseOverview
from openedx.core.djangoapps.content.course_overviews.tests.factories import CourseOverviewFactory
-from openedx.core.djangoapps.schedules.config import COURSE_UPDATE_WAFFLE_FLAG
-from openedx.core.djangoapps.schedules.tests.factories import ScheduleFactory
from openedx.core.djangoapps.site_configuration.tests.test_util import with_site_configuration_context
from openedx.features.course_duration_limits.models import CourseDurationLimitConfig
from openedx.features.course_experience.tests.views.helpers import add_course_mode
@@ -755,7 +752,6 @@ class StudentDashboardTests(SharedModuleStoreTestCase, MilestonesTestCaseMixin,
assert resume_button_html in dashboard_html
assert view_button_html not in dashboard_html
- @override_waffle_flag(COURSE_UPDATE_WAFFLE_FLAG, True)
def test_content_gating_course_card_changes(self):
"""
When a course is expired, the links on the course card should be removed.
@@ -775,9 +771,6 @@ class StudentDashboardTests(SharedModuleStoreTestCase, MilestonesTestCaseMixin,
enrollment.created = self.THREE_YEARS_AGO + timedelta(days=1)
enrollment.save()
- # pylint: disable=unused-variable
- schedule = ScheduleFactory(enrollment=enrollment)
-
response = self.client.get(reverse('dashboard'))
dashboard_html = self._remove_whitespace_from_response(response)
access_expired_substring = 'Accessexpired'
diff --git a/common/djangoapps/student/tests/tests.py b/common/djangoapps/student/tests/tests.py
index a71ff9946a..44848f460c 100644
--- a/common/djangoapps/student/tests/tests.py
+++ b/common/djangoapps/student/tests/tests.py
@@ -418,7 +418,7 @@ class DashboardTest(ModuleStoreTestCase, TestVerificationBase):
Note to future developers:
If you break this test so that the "check_mongo_calls(0)" fails,
- please do NOT change it to "check_mongo_calls(n>1)". Instead, change
+ please do NOT change it to "check_mongo_calls(n>=1)". Instead, change
your code to not load courses from the module store. This may
involve adding fields to CourseOverview so that loading a full
CourseDescriptor isn't necessary.
diff --git a/lms/djangoapps/courseware/tests/test_course_tools.py b/lms/djangoapps/courseware/tests/test_course_tools.py
index d726bcd7fb..4a012ee6f0 100644
--- a/lms/djangoapps/courseware/tests/test_course_tools.py
+++ b/lms/djangoapps/courseware/tests/test_course_tools.py
@@ -12,12 +12,9 @@ from mock import patch
from common.djangoapps.course_modes.models import CourseMode
from common.djangoapps.course_modes.tests.factories import CourseModeFactory
-from edx_toggles.toggles.testutils import override_waffle_flag # lint-amnesty, pylint: disable=wrong-import-order
from lms.djangoapps.courseware.course_tools import FinancialAssistanceTool, VerifiedUpgradeTool
from lms.djangoapps.courseware.models import DynamicUpgradeDeadlineConfiguration
from openedx.core.djangoapps.content.course_overviews.models import CourseOverview
-from openedx.core.djangoapps.schedules.config import CREATE_SCHEDULE_WAFFLE_FLAG
-from openedx.core.djangoapps.site_configuration.tests.factories import SiteFactory
from common.djangoapps.student.tests.factories import CourseEnrollmentFactory, UserFactory
from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase
from xmodule.modulestore.tests.factories import CourseFactory
@@ -39,7 +36,6 @@ class VerifiedUpgradeToolTest(SharedModuleStoreTestCase): # lint-amnesty, pylin
)
cls.course_overview = CourseOverview.get_from_id(cls.course.id)
- @override_waffle_flag(CREATE_SCHEDULE_WAFFLE_FLAG, True)
def setUp(self):
super(VerifiedUpgradeToolTest, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
@@ -49,11 +45,6 @@ class VerifiedUpgradeToolTest(SharedModuleStoreTestCase): # lint-amnesty, pylin
expiration_datetime=self.now + datetime.timedelta(days=30),
)
- patcher = patch('openedx.core.djangoapps.schedules.signals.get_current_site')
- mock_get_current_site = patcher.start()
- self.addCleanup(patcher.stop)
- mock_get_current_site.return_value = SiteFactory.create()
-
DynamicUpgradeDeadlineConfiguration.objects.create(enabled=True)
self.request = RequestFactory().request()
@@ -122,7 +113,6 @@ class FinancialAssistanceToolTest(SharedModuleStoreTestCase):
)
cls.course_overview = CourseOverview.get_from_id(cls.course.id)
- @override_waffle_flag(CREATE_SCHEDULE_WAFFLE_FLAG, True)
def setUp(self):
super(FinancialAssistanceToolTest, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
diff --git a/lms/djangoapps/courseware/tests/test_date_summary.py b/lms/djangoapps/courseware/tests/test_date_summary.py
index 9601c6d68d..dd5c3aa2e5 100644
--- a/lms/djangoapps/courseware/tests/test_date_summary.py
+++ b/lms/djangoapps/courseware/tests/test_date_summary.py
@@ -40,7 +40,6 @@ from lms.djangoapps.verify_student.models import VerificationDeadline
from lms.djangoapps.verify_student.services import IDVerificationService
from lms.djangoapps.verify_student.tests.factories import SoftwareSecurePhotoVerificationFactory
from openedx.core.djangoapps.content.course_overviews.models import CourseOverview
-from openedx.core.djangoapps.schedules.signals import CREATE_SCHEDULE_WAFFLE_FLAG
from openedx.core.djangoapps.self_paced.models import SelfPacedConfiguration
from openedx.core.djangoapps.site_configuration.tests.factories import SiteFactory
from openedx.core.djangoapps.user_api.preferences.api import set_user_preference
@@ -884,16 +883,6 @@ class TestDateAlerts(SharedModuleStoreTestCase):
class TestScheduleOverrides(SharedModuleStoreTestCase):
""" Tests for Schedule Overrides """
- def setUp(self):
- super(TestScheduleOverrides, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
-
- patcher = patch('openedx.core.djangoapps.schedules.signals.get_current_site')
- mock_get_current_site = patcher.start()
- self.addCleanup(patcher.stop)
-
- mock_get_current_site.return_value = SiteFactory.create()
-
- @override_waffle_flag(CREATE_SCHEDULE_WAFFLE_FLAG, True)
def test_date_with_self_paced_with_enrollment_before_course_start(self):
""" Enrolling before a course begins should result in the upgrade deadline being set relative to the
course start date. """
@@ -914,7 +903,6 @@ class TestScheduleOverrides(SharedModuleStoreTestCase):
" certificate."
assert upgrade_date_summary.relative_datestring == u'by {date}'
- @override_waffle_flag(CREATE_SCHEDULE_WAFFLE_FLAG, True)
def test_date_with_self_paced_with_enrollment_after_course_start(self):
""" Enrolling after a course begins should result in the upgrade deadline being set relative to the
enrollment date.
@@ -947,7 +935,6 @@ class TestScheduleOverrides(SharedModuleStoreTestCase):
expected = enrollment.created + timedelta(days=course_config.deadline_days)
assert block.date == expected
- @override_waffle_flag(CREATE_SCHEDULE_WAFFLE_FLAG, True)
def test_date_with_self_paced_without_dynamic_upgrade_deadline(self):
""" Disabling the dynamic upgrade deadline functionality should result in the verified mode's
expiration date being returned. """
@@ -958,7 +945,6 @@ class TestScheduleOverrides(SharedModuleStoreTestCase):
block = VerifiedUpgradeDeadlineDate(course, enrollment.user)
assert block.date == expected
- @override_waffle_flag(CREATE_SCHEDULE_WAFFLE_FLAG, True)
def test_date_with_existing_schedule(self):
""" If a schedule is created while deadlines are disabled, they shouldn't magically appear once the feature is
turned on. """
@@ -1018,7 +1004,6 @@ class TestScheduleOverrides(SharedModuleStoreTestCase):
(True, True, True, True, True, False),
)
@ddt.unpack
- @override_waffle_flag(CREATE_SCHEDULE_WAFFLE_FLAG, True)
def test_date_with_org_and_course_config_overrides(self, enroll_first, org_config_enabled, org_config_opt_out,
course_config_enabled, course_config_opt_out,
expected_dynamic_deadline):
diff --git a/lms/djangoapps/courseware/tests/test_views.py b/lms/djangoapps/courseware/tests/test_views.py
index 6cfe09c645..a06302f593 100644
--- a/lms/djangoapps/courseware/tests/test_views.py
+++ b/lms/djangoapps/courseware/tests/test_views.py
@@ -1408,7 +1408,7 @@ class ProgressPageTests(ProgressPageBaseTests):
self.assertContains(resp, u"Download Your Certificate")
@ddt.data(
- (True, 55),
+ (True, 54),
(False, 54),
)
@ddt.unpack
diff --git a/lms/djangoapps/instructor/tests/test_api.py b/lms/djangoapps/instructor/tests/test_api.py
index 5a74c5f81c..9025d429f4 100644
--- a/lms/djangoapps/instructor/tests/test_api.py
+++ b/lms/djangoapps/instructor/tests/test_api.py
@@ -22,8 +22,6 @@ from django.http import HttpRequest, HttpResponse
from django.test import RequestFactory, TestCase
from django.urls import reverse as django_reverse
from django.utils.translation import ugettext as _
-from edx_toggles.toggles.testutils import \
- override_waffle_flag # lint-amnesty, pylint: disable=unused-import, wrong-import-order
from edx_when.api import get_dates_for_course, get_overrides_for_user, set_date_for_block
from freezegun import freeze_time
from opaque_keys.edx.keys import CourseKey
@@ -48,28 +46,23 @@ from common.djangoapps.student.models import (
get_retired_email_by_email,
get_retired_username_by_username
)
-from common.djangoapps.student.roles import ( # lint-amnesty, pylint: disable=unused-import
+from common.djangoapps.student.roles import (
CourseBetaTesterRole,
CourseDataResearcherRole,
CourseFinanceAdminRole,
CourseInstructorRole,
- CourseSalesAdminRole
-)
-from common.djangoapps.student.tests.factories import ( # lint-amnesty, pylint: disable=unused-import
- AdminFactory,
- UserFactory
)
+from common.djangoapps.student.tests.factories import CourseEnrollmentFactory, UserFactory
from lms.djangoapps.bulk_email.models import BulkEmailFlag, CourseEmail, CourseEmailTemplate
from lms.djangoapps.certificates.api import generate_user_certificates
from lms.djangoapps.certificates.models import CertificateStatuses
from lms.djangoapps.certificates.tests.factories import GeneratedCertificateFactory
from lms.djangoapps.courseware.models import StudentModule
-from lms.djangoapps.courseware.tests.factories import ( # lint-amnesty, pylint: disable=unused-import
+from lms.djangoapps.courseware.tests.factories import (
BetaTesterFactory,
GlobalStaffFactory,
InstructorFactory,
StaffFactory,
- UserProfileFactory
)
from lms.djangoapps.courseware.tests.helpers import LoginEnrollmentTestCase
from lms.djangoapps.experiments.testutils import override_experiment_waffle_flag
@@ -89,7 +82,6 @@ from openedx.core.djangoapps.course_date_signals.handlers import extract_dates
from openedx.core.djangoapps.course_groups.cohorts import set_course_cohorted
from openedx.core.djangoapps.django_comment_common.models import FORUM_ROLE_COMMUNITY_TA
from openedx.core.djangoapps.django_comment_common.utils import seed_permissions_roles
-from openedx.core.djangoapps.schedules.tests.factories import ScheduleFactory
from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers
from openedx.core.djangoapps.site_configuration.tests.mixins import SiteMixin
from openedx.core.lib.teams_config import TeamsConfig
@@ -3883,8 +3875,8 @@ class TestDueDateExtensions(SharedModuleStoreTestCase, LoginEnrollmentTestCase):
self.user1 = user1
self.user2 = user2
- ScheduleFactory.create(enrollment__user=self.user1, enrollment__course_id=self.course.id)
- ScheduleFactory.create(enrollment__user=self.user2, enrollment__course_id=self.course.id)
+ CourseEnrollmentFactory.create(user=self.user1, course_id=self.course.id)
+ CourseEnrollmentFactory.create(user=self.user2, course_id=self.course.id)
self.instructor = InstructorFactory(course_key=self.course.id)
self.client.login(username=self.instructor.username, password='test')
extract_dates(None, self.course.id)
@@ -4054,8 +4046,8 @@ class TestDueDateExtensionsDeletedDate(ModuleStoreTestCase, LoginEnrollmentTestC
self.user1 = user1
self.user2 = user2
- ScheduleFactory.create(enrollment__user=self.user1, enrollment__course_id=self.course.id)
- ScheduleFactory.create(enrollment__user=self.user2, enrollment__course_id=self.course.id)
+ CourseEnrollmentFactory.create(user=self.user1, course_id=self.course.id)
+ CourseEnrollmentFactory.create(user=self.user2, course_id=self.course.id)
self.instructor = InstructorFactory(course_key=self.course.id)
self.client.login(username=self.instructor.username, password='test')
extract_dates(None, self.course.id)
diff --git a/lms/djangoapps/instructor/tests/test_tools.py b/lms/djangoapps/instructor/tests/test_tools.py
index 2ad4579e00..0713bd1f56 100644
--- a/lms/djangoapps/instructor/tests/test_tools.py
+++ b/lms/djangoapps/instructor/tests/test_tools.py
@@ -17,9 +17,8 @@ from edx_when.field_data import DateLookupFieldData
from opaque_keys.edx.keys import CourseKey
from pytz import UTC
-from common.djangoapps.student.tests.factories import UserFactory
+from common.djangoapps.student.tests.factories import CourseEnrollmentFactory, UserFactory
from openedx.core.djangoapps.course_date_signals import handlers
-from openedx.core.djangoapps.schedules.tests.factories import ScheduleFactory
from xmodule.fields import Date
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase, SharedModuleStoreTestCase
from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory
@@ -219,7 +218,7 @@ class TestSetDueDateExtension(ModuleStoreTestCase):
self.week3 = week3
self.user = user
- ScheduleFactory.create(enrollment__user=self.user, enrollment__course_id=self.course.id)
+ CourseEnrollmentFactory.create(user=self.user, course_id=self.course.id)
inject_field_data((course, week1, week2, week3, homework, assignment), course, user)
@@ -307,8 +306,8 @@ class TestDataDumps(ModuleStoreTestCase):
self.week2 = week2
self.user1 = user1
self.user2 = user2
- ScheduleFactory.create(enrollment__user=self.user1, enrollment__course_id=self.course.id)
- ScheduleFactory.create(enrollment__user=self.user2, enrollment__course_id=self.course.id)
+ CourseEnrollmentFactory.create(user=self.user1, course_id=self.course.id)
+ CourseEnrollmentFactory.create(user=self.user2, course_id=self.course.id)
handlers.extract_dates(None, course.id)
def test_dump_module_extensions(self):
diff --git a/lms/djangoapps/mobile_api/users/tests.py b/lms/djangoapps/mobile_api/users/tests.py
index dc73b85850..4f3a0d7f4f 100644
--- a/lms/djangoapps/mobile_api/users/tests.py
+++ b/lms/djangoapps/mobile_api/users/tests.py
@@ -34,7 +34,6 @@ from lms.djangoapps.mobile_api.testutils import (
MobileCourseAccessTestMixin
)
from lms.djangoapps.mobile_api.utils import API_V1, API_V05
-from openedx.core.djangoapps.schedules.tests.factories import ScheduleFactory
from openedx.core.lib.courses import course_image_url
from openedx.features.course_duration_limits.models import CourseDurationLimitConfig
from openedx.features.course_experience.tests.views.helpers import add_course_mode
@@ -279,10 +278,6 @@ class TestUserEnrollmentApi(UrlResetMixin, MobileAPITestCase, MobileAuthUserTest
)
enrollment.created = self.THREE_YEARS_AGO + datetime.timedelta(days=1)
enrollment.save()
-
- ScheduleFactory(
- enrollment=enrollment
- )
else:
course = CourseFactory.create(start=self.LAST_WEEK, mobile_available=True)
self.enroll(course.id)
diff --git a/openedx/core/djangoapps/content/course_overviews/migrations/0024_overview_adds_has_highlights.py b/openedx/core/djangoapps/content/course_overviews/migrations/0024_overview_adds_has_highlights.py
new file mode 100644
index 0000000000..a63459c7a7
--- /dev/null
+++ b/openedx/core/djangoapps/content/course_overviews/migrations/0024_overview_adds_has_highlights.py
@@ -0,0 +1,23 @@
+# Generated by Django 2.2.19 on 2021-02-23 14:30
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('course_overviews', '0023_courseoverview_banner_image_url'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='courseoverview',
+ name='has_highlights',
+ field=models.NullBooleanField(default=None),
+ ),
+ migrations.AddField(
+ model_name='historicalcourseoverview',
+ name='has_highlights',
+ field=models.NullBooleanField(default=None),
+ ),
+ ]
diff --git a/openedx/core/djangoapps/content/course_overviews/models.py b/openedx/core/djangoapps/content/course_overviews/models.py
index bab37b1e9e..0c4649ae3a 100644
--- a/openedx/core/djangoapps/content/course_overviews/models.py
+++ b/openedx/core/djangoapps/content/course_overviews/models.py
@@ -12,7 +12,9 @@ from config_models.models import ConfigurationModel
from django.conf import settings
from django.db import models, transaction
from django.db.models import Q
-from django.db.models.fields import BooleanField, DateTimeField, DecimalField, FloatField, IntegerField, TextField
+from django.db.models.fields import (
+ BooleanField, DateTimeField, DecimalField, FloatField, IntegerField, NullBooleanField, TextField
+)
from django.db.models.signals import post_save, post_delete
from django.db.utils import IntegrityError
from django.template import defaultfilters
@@ -126,6 +128,9 @@ class CourseOverview(TimeStampedModel):
marketing_url = TextField(null=True)
eligible_for_financial_aid = BooleanField(default=True)
+ # Course highlight info, used to guide course update emails
+ has_highlights = NullBooleanField(default=None) # if None, you have to look up the answer yourself
+
language = TextField(null=True)
history = HistoricalRecords()
@@ -229,6 +234,8 @@ class CourseOverview(TimeStampedModel):
course_overview.course_video_url = CourseDetails.fetch_video_url(course.id)
course_overview.self_paced = course.self_paced
+ course_overview.has_highlights = cls._get_course_has_highlights(course)
+
if not CatalogIntegration.is_enabled():
course_overview.language = course.language
@@ -413,6 +420,12 @@ class CourseOverview(TimeStampedModel):
overviews[course_id] = None
return overviews
+ @classmethod
+ def _get_course_has_highlights(cls, course):
+ # Avoid circular import here
+ from openedx.core.djangoapps.schedules.content_highlights import course_has_highlights
+ return course_has_highlights(course)
+
def clean_id(self, padding_char='='):
"""
Returns a unique deterministic base32-encoded ID for the course.
diff --git a/openedx/core/djangoapps/schedules/admin.py b/openedx/core/djangoapps/schedules/admin.py
index 9e27d7c315..fa7e3184e4 100644
--- a/openedx/core/djangoapps/schedules/admin.py
+++ b/openedx/core/djangoapps/schedules/admin.py
@@ -166,22 +166,16 @@ class ScheduleAdmin(admin.ModelAdmin): # lint-amnesty, pylint: disable=missing-
class ScheduleConfigAdminForm(forms.ModelForm): # lint-amnesty, pylint: disable=missing-class-docstring
-
- def clean_hold_back_ratio(self):
- hold_back_ratio = self.cleaned_data["hold_back_ratio"]
- if hold_back_ratio < 0 or hold_back_ratio > 1:
- raise forms.ValidationError("Invalid hold back ratio, the value must be between 0 and 1.")
- return hold_back_ratio
+ pass
@admin.register(models.ScheduleConfig)
class ScheduleConfigAdmin(admin.ModelAdmin): # lint-amnesty, pylint: disable=missing-class-docstring
search_fields = ('site',)
list_display = (
- 'site', 'create_schedules',
+ 'site',
'enqueue_recurring_nudge', 'deliver_recurring_nudge',
'enqueue_upgrade_reminder', 'deliver_upgrade_reminder',
'enqueue_course_update', 'deliver_course_update',
- 'hold_back_ratio',
)
form = ScheduleConfigAdminForm
diff --git a/openedx/core/djangoapps/schedules/config.py b/openedx/core/djangoapps/schedules/config.py
index 768c9f0132..f02043c766 100644
--- a/openedx/core/djangoapps/schedules/config.py
+++ b/openedx/core/djangoapps/schedules/config.py
@@ -2,31 +2,10 @@
Contains configuration for schedules app
"""
+from edx_toggles.toggles import LegacyWaffleSwitch, LegacyWaffleSwitchNamespace, WaffleFlag
-from edx_toggles.toggles import (
- WaffleFlag,
- LegacyWaffleFlagNamespace,
- LegacyWaffleSwitch,
- LegacyWaffleSwitchNamespace
-)
-
-from openedx.core.djangoapps.waffle_utils import CourseWaffleFlag
-
-WAFFLE_FLAG_NAMESPACE = LegacyWaffleFlagNamespace(name='schedules')
WAFFLE_SWITCH_NAMESPACE = LegacyWaffleSwitchNamespace(name='schedules')
-CREATE_SCHEDULE_WAFFLE_FLAG = CourseWaffleFlag(
- waffle_namespace=WAFFLE_FLAG_NAMESPACE,
- flag_name='create_schedules_for_course',
- module_name=__name__,
-)
-
-COURSE_UPDATE_WAFFLE_FLAG = CourseWaffleFlag(
- waffle_namespace=WAFFLE_FLAG_NAMESPACE,
- flag_name='send_updates_for_course',
- module_name=__name__,
-)
-
# .. toggle_name: schedules.enable_debugging
# .. toggle_implementation: WaffleFlag
# .. toggle_default: False
diff --git a/openedx/core/djangoapps/schedules/content_highlights.py b/openedx/core/djangoapps/schedules/content_highlights.py
index 282e4aff82..4d0eac8bcb 100644
--- a/openedx/core/djangoapps/schedules/content_highlights.py
+++ b/openedx/core/djangoapps/schedules/content_highlights.py
@@ -7,7 +7,6 @@ schedule experience built on the Schedules app.
import logging
from openedx.core.djangoapps.course_date_signals.utils import spaced_out_sections
-from openedx.core.djangoapps.schedules.config import COURSE_UPDATE_WAFFLE_FLAG
from openedx.core.djangoapps.schedules.exceptions import CourseUpdateDoesNotExist
from openedx.core.lib.request_utils import get_request_or_stub
from xmodule.modulestore.django import modulestore
@@ -15,16 +14,16 @@ from xmodule.modulestore.django import modulestore
log = logging.getLogger(__name__)
-def course_has_highlights(course_key):
+def course_has_highlights(course):
"""
Does the course have any highlights for any section/week in it?
This ignores access checks, since highlights may be lurking in currently
inaccessible content.
- """
- try:
- course = _get_course_with_highlights(course_key)
- except CourseUpdateDoesNotExist:
+ Arguments:
+ course (CourseDescriptor): course object to check
+ """
+ if not course.highlights_enabled_for_messaging:
return False
else:
@@ -36,12 +35,28 @@ def course_has_highlights(course_key):
if not highlights_are_available:
log.warning(
- 'Course team enabled highlights and provided no highlights in {}'.format(course_key)
+ 'Course team enabled highlights and provided no highlights in {}'.format(course.id)
)
return highlights_are_available
+def course_has_highlights_from_store(course_key):
+ """
+ Does the course have any highlights for any section/week in it?
+ This ignores access checks, since highlights may be lurking in currently
+ inaccessible content.
+
+ Arguments:
+ course_key (CourseKey): course to lookup from the modulestore
+ """
+ try:
+ course = _get_course_descriptor(course_key)
+ except CourseUpdateDoesNotExist:
+ return False
+ return course_has_highlights(course)
+
+
def get_week_highlights(user, course_key, week_num):
"""
Get highlights (list of unicode strings) for a given week.
@@ -76,11 +91,6 @@ def get_next_section_highlights(user, course_key, start_date, target_date):
def _get_course_with_highlights(course_key):
""" Gets Course descriptor iff highlights are enabled for the course """
- if not COURSE_UPDATE_WAFFLE_FLAG.is_enabled(course_key):
- raise CourseUpdateDoesNotExist(
- '{} Course Update Messages waffle flag is disabled.'.format(course_key)
- )
-
course_descriptor = _get_course_descriptor(course_key)
if not course_descriptor.highlights_enabled_for_messaging:
raise CourseUpdateDoesNotExist(
diff --git a/openedx/core/djangoapps/schedules/docs/README.rst b/openedx/core/djangoapps/schedules/docs/README.rst
index 853ca0af7b..9b662eb7bb 100644
--- a/openedx/core/djangoapps/schedules/docs/README.rst
+++ b/openedx/core/djangoapps/schedules/docs/README.rst
@@ -236,28 +236,6 @@ Configuration Flags
Configuring Schedule Creation
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-Make sure a Site has been created at ``/admin/sites/site``.
-
-ScheduleConfig
-^^^^^^^^^^^^^^
-
-In the Django admin panel at
-``/admin/schedules/scheduleconfig/`` create a ScheduleConfig
-and link it to the Site. Make sure to enable all of the settings:
-
-- ``create_schedules``: enables creating new Schedules when new Course
- Enrollments are created.
-- ``hold_back_ratio``: ratio of all new Course Enrollments that should
- NOT have a Schedule created.
-
-Roll-out Waffle Flag
-^^^^^^^^^^^^^^^^^^^^
-
-There is one roll-out related course waffle flag that we plan to delete
-called ``schedules.create_schedules_for_course``, which, if the
-``ScheduleConfig.create_schedules`` is disabled, will enable schedule
-creation on a per-course basis.
-
Self-paced Configuration
^^^^^^^^^^^^^^^^^^^^^^^^
@@ -324,25 +302,6 @@ configure enqueueing and delivering emails per message type:
- ``deliver_*``: allows delivering emails through ACE for this message
type.
-.. roll-out-waffle-flag-1:
-
-Roll-out Waffle Flag
-^^^^^^^^^^^^^^^^^^^^
-
-Another roll-out related course waffle flag that we plan to delete
-called ``schedules.send_updates_for_course`` will enable sending
-specifically the course updates email per-course.
-
-Configuring Highlights UI in Studio
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The button and modal on the course outline page that allows course
-authors to enter section highlights can be toggled globally by going to
-``/admin/waffle/switch/`` and adding an active switch called
-``dynamic_pacing.studio_course_update``.
-
-This is a roll-out related waffle switch that we will eventually delete.
-
Configuring a Learner’s Schedule
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -463,10 +422,10 @@ To begin using Litmus, follow these steps:
1. Make sure that ACE is configured to use Sailthru (see instructions above).
2. Go to the `Litmus checklist page `__ and start
a new checklist.
-3. The checklist will provide you with an email address to which you will send
+3. The checklist will provide you with an email address to which you will send
a test email.
-4. Send an email. Use one of the management commands with the
- `--override-recipient-email` flag. Use the Litmus email you got in step 3
+4. Send an email. Use one of the management commands with the
+ `--override-recipient-email` flag. Use the Litmus email you got in step 3
as the flag value.
::
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 bfb0797f9a..5332d7e56b 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
@@ -12,9 +12,7 @@ from edx_ace.utils.date import serialize
from mock import patch
from six.moves import range
-from edx_toggles.toggles.testutils import override_waffle_flag
from openedx.core.djangoapps.schedules import resolvers, tasks
-from openedx.core.djangoapps.schedules.config import COURSE_UPDATE_WAFFLE_FLAG
from openedx.core.djangoapps.schedules.management.commands import send_course_update as nudge
from openedx.core.djangoapps.schedules.management.commands.tests.send_email_base import (
ExperienceTest,
@@ -59,13 +57,12 @@ class TestSendCourseUpdate(ScheduleUpsellTestMixin, ScheduleSendEmailTestMixin,
mock_highlights.return_value = [u'Highlight {}'.format(num + 1) for num in range(3)]
self.addCleanup(self.stop_highlights_patcher)
- def prepare_course_data(self, mock_get_current_site, is_self_paced=True):
+ def prepare_course_data(self, is_self_paced=True):
"""
Prepare course data with highlights
"""
self.highlights_patcher.stop()
self.highlights_patcher = None
- mock_get_current_site.return_value = self.site_config.site
course = CourseFactory(highlights_enabled_for_messaging=True, self_paced=is_self_paced)
with self.store.bulk_operations(course.id):
@@ -96,10 +93,8 @@ class TestSendCourseUpdate(ScheduleUpsellTestMixin, ScheduleSendEmailTestMixin,
def test_schedule_in_different_experience(self, test_config):
self._check_if_email_sent_for_experience(test_config)
- @override_waffle_flag(COURSE_UPDATE_WAFFLE_FLAG, True)
- @patch('openedx.core.djangoapps.schedules.signals.get_current_site')
- def test_with_course_data(self, mock_get_current_site):
- offset, target_day, enrollment = self.prepare_course_data(mock_get_current_site)
+ 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(
@@ -111,14 +106,12 @@ class TestSendCourseUpdate(ScheduleUpsellTestMixin, ScheduleSendEmailTestMixin,
assert mock_ace.send.called
- @override_waffle_flag(COURSE_UPDATE_WAFFLE_FLAG, True)
- @patch('openedx.core.djangoapps.schedules.signals.get_current_site')
- def test_template_for_instructor_led_courses(self, mock_get_current_site):
+ def test_template_for_instructor_led_courses(self):
"""
Test that InstructorLedCourseUpdate template is picked for instructor led
courses
"""
- offset, target_day, enrollment = self.prepare_course_data(mock_get_current_site, is_self_paced=False)
+ offset, target_day, enrollment = self.prepare_course_data(is_self_paced=False)
self.task().apply(kwargs=dict(
site_id=self.site_config.site.id,
diff --git a/openedx/core/djangoapps/schedules/models.py b/openedx/core/djangoapps/schedules/models.py
index 00f857af5f..d747b77ccb 100644
--- a/openedx/core/djangoapps/schedules/models.py
+++ b/openedx/core/djangoapps/schedules/models.py
@@ -54,14 +54,14 @@ class ScheduleConfig(ConfigurationModel):
KEY_FIELDS = ('site',)
site = models.ForeignKey(Site, on_delete=models.CASCADE)
- create_schedules = models.BooleanField(default=False)
+ create_schedules = models.BooleanField(default=False) # deprecated, do not use
enqueue_recurring_nudge = models.BooleanField(default=False)
deliver_recurring_nudge = models.BooleanField(default=False)
enqueue_upgrade_reminder = models.BooleanField(default=False)
deliver_upgrade_reminder = models.BooleanField(default=False)
enqueue_course_update = models.BooleanField(default=False)
deliver_course_update = models.BooleanField(default=False)
- hold_back_ratio = models.FloatField(default=0)
+ hold_back_ratio = models.FloatField(default=0) # deprecated, do not use
class ScheduleExperience(models.Model):
diff --git a/openedx/core/djangoapps/schedules/signals.py b/openedx/core/djangoapps/schedules/signals.py
index b1454fd9b6..f84a6f5566 100644
--- a/openedx/core/djangoapps/schedules/signals.py
+++ b/openedx/core/djangoapps/schedules/signals.py
@@ -4,7 +4,6 @@ CourseEnrollment related signal handlers.
import datetime
import logging
-import random
import six
from django.db.models.signals import post_save
@@ -18,16 +17,13 @@ from lms.djangoapps.courseware.models import (
OrgDynamicUpgradeDeadlineConfiguration
)
from openedx.core.djangoapps.content.course_overviews.signals import COURSE_START_DATE_CHANGED
-from openedx.core.djangoapps.schedules.content_highlights import course_has_highlights
+from openedx.core.djangoapps.schedules.content_highlights import course_has_highlights_from_store
from openedx.core.djangoapps.schedules.models import ScheduleExperience
from openedx.core.djangoapps.schedules.utils import reset_self_paced_schedule
-from openedx.core.djangoapps.theming.helpers import get_current_site
from common.djangoapps.student.models import CourseEnrollment
-from common.djangoapps.student.signals import ENROLL_STATUS_CHANGE, ENROLLMENT_TRACK_UPDATED # lint-amnesty, pylint: disable=unused-import
-from common.djangoapps.track import segment
+from common.djangoapps.student.signals import ENROLLMENT_TRACK_UPDATED
-from .config import CREATE_SCHEDULE_WAFFLE_FLAG
-from .models import Schedule, ScheduleConfig
+from .models import Schedule
from .tasks import update_course_schedules
log = logging.getLogger(__name__)
@@ -139,39 +135,6 @@ def _get_upgrade_deadline_delta_setting(course_id): # lint-amnesty, pylint: dis
return delta
-def _should_randomly_suppress_schedule_creation( # lint-amnesty, pylint: disable=missing-function-docstring
- schedule_config,
- enrollment,
- upgrade_deadline,
- experience_type,
- content_availability_date,
-):
- # The hold back ratio is always between 0 and 1. A value of 0 indicates that schedules should be created for all
- # schedules. A value of 1 indicates that no schedules should be created for any enrollments. A value of 0.2 would
- # mean that 20% of enrollments should *not* be given schedules.
-
- # This allows us to measure the impact of the dynamic schedule experience by comparing this "control" group that
- # does not receive any of benefits of the feature against the group that does.
- if random.random() < schedule_config.hold_back_ratio:
- log.debug('Schedules: Enrollment held back from dynamic schedule experiences.')
- upgrade_deadline_str = None
- if upgrade_deadline:
- upgrade_deadline_str = upgrade_deadline.isoformat()
- segment.track(
- user_id=enrollment.user.id,
- event_name='edx.bi.schedule.suppressed',
- properties={
- 'course_id': six.text_type(enrollment.course_id),
- 'experience_type': experience_type,
- 'upgrade_deadline': upgrade_deadline_str,
- 'content_availability_date': content_availability_date.isoformat(),
- }
- )
- return True
-
- return False
-
-
def _create_schedule(enrollment, enrollment_created):
"""
Checks configuration and creates Schedule with ScheduleExperience for this enrollment.
@@ -180,34 +143,12 @@ def _create_schedule(enrollment, enrollment_created):
# only create schedules when enrollment records are created
return
- current_site = get_current_site()
- if current_site is None:
- log.debug('Schedules: No current site')
- return
-
- schedule_config = ScheduleConfig.current(current_site)
- if (
- not schedule_config.create_schedules and
- not CREATE_SCHEDULE_WAFFLE_FLAG.is_enabled(enrollment.course_id)
- ):
- log.debug('Schedules: Creation not enabled for this course or for this site')
- return
-
# This represents the first date at which the learner can access the content. This will be the latter of
# either the enrollment date or the course's start date.
content_availability_date = max(enrollment.created, enrollment.course_overview.start)
upgrade_deadline = _calculate_upgrade_deadline(enrollment.course_id, content_availability_date)
experience_type = _get_experience_type(enrollment)
- if _should_randomly_suppress_schedule_creation(
- schedule_config,
- enrollment,
- upgrade_deadline,
- experience_type,
- content_availability_date,
- ):
- return
-
schedule = Schedule.objects.create(
enrollment=enrollment,
start_date=content_availability_date,
@@ -229,7 +170,11 @@ def _get_experience_type(enrollment):
Schedules will receive the Course Updates experience if the course has any section highlights defined.
"""
- if course_has_highlights(enrollment.course_id):
+ has_highlights = enrollment.course_overview.has_highlights
+ if has_highlights is None: # old course that doesn't have this info cached in the overview
+ has_highlights = course_has_highlights_from_store(enrollment.course_id)
+
+ if has_highlights:
return ScheduleExperience.EXPERIENCES.course_updates
else:
return ScheduleExperience.EXPERIENCES.default
diff --git a/openedx/core/djangoapps/schedules/tests/factories.py b/openedx/core/djangoapps/schedules/tests/factories.py
index 4e4467e85b..580cf44018 100644
--- a/openedx/core/djangoapps/schedules/tests/factories.py
+++ b/openedx/core/djangoapps/schedules/tests/factories.py
@@ -33,11 +33,9 @@ class ScheduleConfigFactory(factory.DjangoModelFactory): # lint-amnesty, pylint
model = models.ScheduleConfig
site = factory.SubFactory(SiteFactory)
- create_schedules = True
enqueue_recurring_nudge = True
deliver_recurring_nudge = True
enqueue_upgrade_reminder = True
deliver_upgrade_reminder = True
enqueue_course_update = True
deliver_course_update = True
- hold_back_ratio = 0
diff --git a/openedx/core/djangoapps/schedules/tests/test_content_highlights.py b/openedx/core/djangoapps/schedules/tests/test_content_highlights.py
index edededafb0..adb3f63243 100644
--- a/openedx/core/djangoapps/schedules/tests/test_content_highlights.py
+++ b/openedx/core/djangoapps/schedules/tests/test_content_highlights.py
@@ -3,10 +3,8 @@
import datetime
from unittest.mock import patch
import pytest
-from edx_toggles.toggles.testutils import override_waffle_flag
-from openedx.core.djangoapps.schedules.config import COURSE_UPDATE_WAFFLE_FLAG
from openedx.core.djangoapps.schedules.content_highlights import (
- course_has_highlights,
+ course_has_highlights_from_store,
get_next_section_highlights,
get_week_highlights
)
@@ -44,35 +42,22 @@ class TestContentHighlights(ModuleStoreTestCase): # lint-amnesty, pylint: disab
**kwargs
)
- @override_waffle_flag(COURSE_UPDATE_WAFFLE_FLAG, True)
def test_non_existent_course_raises_exception(self):
nonexistent_course_key = self.course_key.replace(run='no_such_run')
with pytest.raises(CourseUpdateDoesNotExist):
get_week_highlights(self.user, nonexistent_course_key, week_num=1)
- @override_waffle_flag(COURSE_UPDATE_WAFFLE_FLAG, True)
def test_empty_course_raises_exception(self):
with pytest.raises(CourseUpdateDoesNotExist):
get_week_highlights(self.user, self.course_key, week_num=1)
- @override_waffle_flag(COURSE_UPDATE_WAFFLE_FLAG, False)
- def test_flag_disabled(self):
- with self.store.bulk_operations(self.course_key):
- self._create_chapter(highlights=['highlights'])
-
- assert not course_has_highlights(self.course_key)
- with pytest.raises(CourseUpdateDoesNotExist):
- get_week_highlights(self.user, self.course_key, week_num=1)
-
- @override_waffle_flag(COURSE_UPDATE_WAFFLE_FLAG, True)
- def test_flag_enabled(self):
+ def test_happy_path(self):
highlights = ['highlights']
with self.store.bulk_operations(self.course_key):
self._create_chapter(highlights=highlights)
- assert course_has_highlights(self.course_key)
+ assert course_has_highlights_from_store(self.course_key)
assert get_week_highlights(self.user, self.course_key, week_num=1) == highlights
- @override_waffle_flag(COURSE_UPDATE_WAFFLE_FLAG, True)
def test_highlights_disabled_for_messaging(self):
highlights = ['A test highlight.']
with self.store.bulk_operations(self.course_key):
@@ -80,7 +65,7 @@ class TestContentHighlights(ModuleStoreTestCase): # lint-amnesty, pylint: disab
self.course.highlights_enabled_for_messaging = False
self.store.update_item(self.course, self.user.id)
- assert not course_has_highlights(self.course_key)
+ assert not course_has_highlights_from_store(self.course_key)
with pytest.raises(CourseUpdateDoesNotExist):
get_week_highlights(
@@ -89,7 +74,6 @@ class TestContentHighlights(ModuleStoreTestCase): # lint-amnesty, pylint: disab
week_num=1,
)
- @override_waffle_flag(COURSE_UPDATE_WAFFLE_FLAG, True)
def test_course_with_no_highlights(self):
with self.store.bulk_operations(self.course_key):
self._create_chapter(display_name=u"Week 1")
@@ -98,25 +82,23 @@ class TestContentHighlights(ModuleStoreTestCase): # lint-amnesty, pylint: disab
self.course = self.store.get_course(self.course_key) # lint-amnesty, pylint: disable=attribute-defined-outside-init
assert len(self.course.get_children()) == 2
- assert not course_has_highlights(self.course_key)
+ assert not course_has_highlights_from_store(self.course_key)
with pytest.raises(CourseUpdateDoesNotExist):
get_week_highlights(self.user, self.course_key, week_num=1)
- @override_waffle_flag(COURSE_UPDATE_WAFFLE_FLAG, True)
def test_course_with_highlights(self):
with self.store.bulk_operations(self.course_key):
self._create_chapter(highlights=['a', 'b', 'á'])
self._create_chapter(highlights=[])
self._create_chapter(highlights=['skipped a week'])
- assert course_has_highlights(self.course_key)
+ assert course_has_highlights_from_store(self.course_key)
assert get_week_highlights(self.user, self.course_key, week_num=1) == ['a', 'b', 'á']
assert get_week_highlights(self.user, self.course_key, week_num=2) == ['skipped a week']
with pytest.raises(CourseUpdateDoesNotExist):
get_week_highlights(self.user, self.course_key, week_num=3)
- @override_waffle_flag(COURSE_UPDATE_WAFFLE_FLAG, True)
def test_staff_only(self):
with self.store.bulk_operations(self.course_key):
self._create_chapter(
@@ -124,11 +106,10 @@ class TestContentHighlights(ModuleStoreTestCase): # lint-amnesty, pylint: disab
visible_to_staff_only=True,
)
- assert course_has_highlights(self.course_key)
+ assert course_has_highlights_from_store(self.course_key)
with pytest.raises(CourseUpdateDoesNotExist):
get_week_highlights(self.user, self.course_key, week_num=1)
- @override_waffle_flag(COURSE_UPDATE_WAFFLE_FLAG, True)
@patch('openedx.core.djangoapps.course_date_signals.utils.get_expected_duration')
def test_get_next_section_highlights(self, mock_duration):
# All of the dates chosen here are to make things easy and clean to calculate with date offsets
@@ -170,7 +151,6 @@ class TestContentHighlights(ModuleStoreTestCase): # lint-amnesty, pylint: disab
with pytest.raises(CourseUpdateDoesNotExist):
get_next_section_highlights(self.user, self.course_key, two_days_ago, six_days.date())
- @override_waffle_flag(COURSE_UPDATE_WAFFLE_FLAG, True)
@patch('lms.djangoapps.courseware.module_render.get_module_for_descriptor')
def test_get_highlights_without_module(self, mock_get_module):
mock_get_module.return_value = None
diff --git a/openedx/core/djangoapps/schedules/tests/test_resolvers.py b/openedx/core/djangoapps/schedules/tests/test_resolvers.py
index bc51100323..d0fb6776b1 100644
--- a/openedx/core/djangoapps/schedules/tests/test_resolvers.py
+++ b/openedx/core/djangoapps/schedules/tests/test_resolvers.py
@@ -4,7 +4,7 @@ Tests for schedules resolvers
import datetime
-from unittest.mock import Mock, patch
+from unittest.mock import Mock
import ddt
from django.test import TestCase
@@ -12,8 +12,6 @@ from django.test.utils import override_settings
from testfixtures import LogCapture
from waffle.testutils import override_switch
-from edx_toggles.toggles.testutils import override_waffle_flag
-from openedx.core.djangoapps.schedules.config import COURSE_UPDATE_WAFFLE_FLAG
from openedx.core.djangoapps.schedules.models import Schedule
from openedx.core.djangoapps.schedules.resolvers import (
LOG,
@@ -111,9 +109,7 @@ class TestCourseUpdateResolver(SchedulesResolverTestMixin, ModuleStoreTestCase):
"""
Creates a CourseUpdateResolver with an enrollment to schedule.
"""
- with patch('openedx.core.djangoapps.schedules.signals.get_current_site') as mock_get_current_site:
- mock_get_current_site.return_value = self.site_config.site
- enrollment = CourseEnrollmentFactory(course_id=self.course.id, user=self.user, mode='audit')
+ enrollment = CourseEnrollmentFactory(course_id=self.course.id, user=self.user, mode='audit')
return CourseUpdateResolver(
async_send_task=Mock(name='async_send_task'),
@@ -125,7 +121,6 @@ class TestCourseUpdateResolver(SchedulesResolverTestMixin, ModuleStoreTestCase):
@override_settings(CONTACT_MAILING_ADDRESS='123 Sesame Street')
@override_settings(LOGO_URL_PNG='https://www.logo.png')
- @override_waffle_flag(COURSE_UPDATE_WAFFLE_FLAG, True)
def test_schedule_context(self):
resolver = self.create_resolver()
schedules = list(resolver.schedules_for_bin())
@@ -149,14 +144,12 @@ class TestCourseUpdateResolver(SchedulesResolverTestMixin, ModuleStoreTestCase):
}
assert schedules == [(self.user, None, expected_context)]
- @override_waffle_flag(COURSE_UPDATE_WAFFLE_FLAG, True)
@override_switch('schedules.course_update_show_unsubscribe', True)
def test_schedule_context_show_unsubscribe(self):
resolver = self.create_resolver()
schedules = list(resolver.schedules_for_bin())
assert 'optout' in schedules[0][2]['unsubscribe_url']
- @override_waffle_flag(COURSE_UPDATE_WAFFLE_FLAG, True)
def test_get_schedules_with_target_date_by_bin_and_orgs_filter_inactive_users(self):
"""Tests that schedules of inactive users are excluded"""
resolver = self.create_resolver()
@@ -194,9 +187,7 @@ class TestCourseNextSectionUpdateResolver(SchedulesResolverTestMixin, ModuleStor
"""
Creates a CourseNextSectionUpdateResolver with an enrollment to schedule.
"""
- with patch('openedx.core.djangoapps.schedules.signals.get_current_site') as mock_get_current_site:
- mock_get_current_site.return_value = self.site_config.site
- CourseEnrollmentFactory(course_id=self.course.id, user=self.user, mode='audit')
+ CourseEnrollmentFactory(course_id=self.course.id, user=self.user, mode='audit')
# Need to update the user's schedule so the due date for the chapter we want
# matches with the user's schedule and the target date. The numbers are based on the
@@ -214,7 +205,6 @@ class TestCourseNextSectionUpdateResolver(SchedulesResolverTestMixin, ModuleStor
@override_settings(CONTACT_MAILING_ADDRESS='123 Sesame Street')
@override_settings(LOGO_URL_PNG='https://www.logo.png')
- @override_waffle_flag(COURSE_UPDATE_WAFFLE_FLAG, True)
def test_schedule_context(self):
resolver = self.create_resolver()
# using this to make sure the select_related stays intact
@@ -242,14 +232,12 @@ class TestCourseNextSectionUpdateResolver(SchedulesResolverTestMixin, ModuleStor
}
assert schedules == [(self.user, None, expected_context)]
- @override_waffle_flag(COURSE_UPDATE_WAFFLE_FLAG, True)
@override_switch('schedules.course_update_show_unsubscribe', True)
def test_schedule_context_show_unsubscribe(self):
resolver = self.create_resolver()
schedules = list(resolver.get_schedules())
assert 'optout' in schedules[0][2]['unsubscribe_url']
- @override_waffle_flag(COURSE_UPDATE_WAFFLE_FLAG, True)
def test_schedule_context_error(self):
resolver = self.create_resolver(user_start_date_offset=29)
with LogCapture(LOG.name) as log_capture:
@@ -258,7 +246,6 @@ class TestCourseNextSectionUpdateResolver(SchedulesResolverTestMixin, ModuleStor
'There are no more highlights for {}'.format(self.course.id))
log_capture.check_present((LOG.name, 'WARNING', log_message))
- @override_waffle_flag(COURSE_UPDATE_WAFFLE_FLAG, True)
def test_no_updates_if_course_ended(self):
self.course.end = self.yesterday
self.course = self.update_course(self.course, self.user.id)
diff --git a/openedx/core/djangoapps/schedules/tests/test_signals.py b/openedx/core/djangoapps/schedules/tests/test_signals.py
index bf50282a2a..0739a5e7d6 100644
--- a/openedx/core/djangoapps/schedules/tests/test_signals.py
+++ b/openedx/core/djangoapps/schedules/tests/test_signals.py
@@ -7,16 +7,14 @@ import datetime
import ddt
import pytest
-from edx_toggles.toggles.testutils import override_waffle_flag
from mock import patch
from pytz import utc
-from testfixtures import LogCapture
from common.djangoapps.course_modes.models import CourseMode
from common.djangoapps.course_modes.tests.factories import CourseModeFactory
from lms.djangoapps.courseware.models import DynamicUpgradeDeadlineConfiguration
+from openedx.core.djangoapps.content.course_overviews.models import CourseOverview
from openedx.core.djangoapps.schedules.models import ScheduleExperience
-from openedx.core.djangoapps.schedules.signals import CREATE_SCHEDULE_WAFFLE_FLAG, log
from openedx.core.djangoapps.site_configuration.tests.factories import SiteFactory
from openedx.core.djangolib.testing.utils import skip_unless_lms
from common.djangoapps.student.models import CourseEnrollment
@@ -30,7 +28,6 @@ from ..tests.factories import ScheduleConfigFactory
@ddt.ddt
-@patch('openedx.core.djangoapps.schedules.signals.get_current_site')
@skip_unless_lms
class CreateScheduleTests(SharedModuleStoreTestCase): # lint-amnesty, pylint: disable=missing-class-docstring
@@ -57,115 +54,39 @@ class CreateScheduleTests(SharedModuleStoreTestCase): # lint-amnesty, pylint: d
with pytest.raises(Schedule.DoesNotExist):
enrollment.schedule # lint-amnesty, pylint: disable=pointless-statement
- @override_waffle_flag(CREATE_SCHEDULE_WAFFLE_FLAG, True)
- def test_create_schedule(self, mock_get_current_site):
- site = SiteFactory.create()
- mock_get_current_site.return_value = site
- ScheduleConfigFactory.create(site=site)
+ def test_create_schedule(self):
self.assert_schedule_created()
- @override_waffle_flag(CREATE_SCHEDULE_WAFFLE_FLAG, True)
- def test_no_current_site(self, mock_get_current_site):
- mock_get_current_site.return_value = None
- self.assert_schedule_not_created()
-
- @override_waffle_flag(CREATE_SCHEDULE_WAFFLE_FLAG, True)
- def test_schedule_config_disabled_waffle_enabled(self, mock_get_current_site):
- site = SiteFactory.create()
- mock_get_current_site.return_value = site
- ScheduleConfigFactory.create(site=site, create_schedules=False)
- self.assert_schedule_created()
-
- @override_waffle_flag(CREATE_SCHEDULE_WAFFLE_FLAG, False)
- def test_schedule_config_enabled_waffle_disabled(self, mock_get_current_site):
- site = SiteFactory.create()
- mock_get_current_site.return_value = site
- ScheduleConfigFactory.create(site=site, create_schedules=True)
- self.assert_schedule_created()
-
- @override_waffle_flag(CREATE_SCHEDULE_WAFFLE_FLAG, False)
- def test_schedule_config_disabled_waffle_disabled(self, mock_get_current_site):
- site = SiteFactory.create()
- mock_get_current_site.return_value = site
- ScheduleConfigFactory.create(site=site, create_schedules=False)
- with LogCapture(log.name) as log_capture:
- self.assert_schedule_not_created()
- log_capture.check((log.name, 'DEBUG', 'Schedules: Creation not enabled for this course or for this site'))
-
- @override_waffle_flag(CREATE_SCHEDULE_WAFFLE_FLAG, True)
- @patch('openedx.core.djangoapps.schedules.signals.course_has_highlights')
- def test_schedule_config_creation_enabled_instructor_paced(self, mock_course_has_highlights, mock_get_current_site):
- site = SiteFactory.create()
- mock_course_has_highlights.return_value = True
- mock_get_current_site.return_value = site
+ @patch.object(CourseOverview, '_get_course_has_highlights', return_value=True)
+ def test_schedule_config_creation_enabled_instructor_paced(self, _mock_highlights):
self.assert_schedule_created(is_self_paced=False, experience_type=ScheduleExperience.EXPERIENCES.course_updates)
- @override_waffle_flag(CREATE_SCHEDULE_WAFFLE_FLAG, True)
- @patch('openedx.core.djangoapps.schedules.signals.course_has_highlights')
- def test_create_schedule_course_updates_experience(self, mock_course_has_highlights, mock_get_current_site):
- site = SiteFactory.create()
- mock_course_has_highlights.return_value = True
- mock_get_current_site.return_value = site
+ @patch.object(CourseOverview, '_get_course_has_highlights', return_value=True)
+ def test_create_schedule_course_updates_experience(self, _mock_highlights):
self.assert_schedule_created(experience_type=ScheduleExperience.EXPERIENCES.course_updates)
- @override_waffle_flag(CREATE_SCHEDULE_WAFFLE_FLAG, True)
- @patch('openedx.core.djangoapps.schedules.signals.segment.track')
- @patch('openedx.core.djangoapps.schedules.signals.random.random', return_value=0.2)
- @ddt.data(
- (0, True),
- (0.1, True),
- (0.3, False),
- )
- @ddt.unpack
- def test_create_schedule_hold_backs(
- self,
- hold_back_ratio,
- expect_schedule_created,
- mock_random, # lint-amnesty, pylint: disable=unused-argument
- mock_track,
- mock_get_current_site
- ):
- schedule_config = ScheduleConfigFactory.create(enabled=True, hold_back_ratio=hold_back_ratio)
- mock_get_current_site.return_value = schedule_config.site
- if expect_schedule_created:
- self.assert_schedule_created()
- assert not mock_track.called
- else:
- self.assert_schedule_not_created()
- mock_track.assert_called_once()
- assert mock_track.call_args[1].get('event_name') == 'edx.bi.schedule.suppressed'
-
@patch('openedx.core.djangoapps.schedules.signals.log.exception')
@patch('openedx.core.djangoapps.schedules.signals.Schedule.objects.create')
- def test_create_schedule_error(self, mock_create_schedule, mock_log, mock_get_current_site):
- site = SiteFactory.create()
- mock_get_current_site.return_value = site
- ScheduleConfigFactory.create(site=site)
+ def test_create_schedule_error(self, mock_create_schedule, mock_log):
mock_create_schedule.side_effect = ValueError('Fake error')
self.assert_schedule_not_created()
mock_log.assert_called_once()
assert 'Encountered error in creating a Schedule for CourseEnrollment' in mock_log.call_args[0][0]
- @override_waffle_flag(CREATE_SCHEDULE_WAFFLE_FLAG, True)
- def test_course_start_date_in_future(self, mock_get_current_site):
+ def test_course_start_date_in_future(self):
"""
Test that the schedule start date will be set to course's start date
if course starts after enrollment
"""
- site = SiteFactory.create()
- mock_get_current_site.return_value = site
course = _create_course_run(self_paced=True, start_day_offset=5) # course starts in future
enrollment = CourseEnrollmentFactory(course_id=course.id, mode=CourseMode.AUDIT)
assert _strip_secs(enrollment.schedule.start_date) == _strip_secs(course.start)
- @override_waffle_flag(CREATE_SCHEDULE_WAFFLE_FLAG, True)
- def test_course_already_started(self, mock_get_current_site):
+ def test_course_already_started(self):
"""
Test that the schedule start date will be set to the date enrollment was
created if course has already started
"""
- site = SiteFactory.create()
- mock_get_current_site.return_value = site
course = _create_course_run(self_paced=True, start_day_offset=-5) # course already started
enrollment = CourseEnrollmentFactory(course_id=course.id, mode=CourseMode.AUDIT)
assert _strip_secs(enrollment.schedule.start_date) == _strip_secs(enrollment.created)
@@ -173,7 +94,6 @@ class CreateScheduleTests(SharedModuleStoreTestCase): # lint-amnesty, pylint: d
@ddt.ddt
@skip_unless_lms
-@patch('openedx.core.djangoapps.schedules.signals.get_current_site')
class UpdateScheduleTests(SharedModuleStoreTestCase): # lint-amnesty, pylint: disable=missing-class-docstring
ENABLED_SIGNALS = ['course_published']
VERIFICATION_DEADLINE_DAYS = 14
@@ -189,9 +109,7 @@ class UpdateScheduleTests(SharedModuleStoreTestCase): # lint-amnesty, pylint: d
deadline_delta = datetime.timedelta(days=self.VERIFICATION_DEADLINE_DAYS)
assert _strip_secs(schedule.upgrade_deadline) == _strip_secs(expected_start) + deadline_delta
- def test_updated_when_course_not_started(self, mock_get_current_site):
- mock_get_current_site.return_value = self.site
-
+ def test_updated_when_course_not_started(self):
course = _create_course_run(self_paced=True, start_day_offset=5) # course starts in future
enrollment = CourseEnrollmentFactory(course_id=course.id, mode=CourseMode.AUDIT)
self.assert_schedule_dates(enrollment.schedule, enrollment.course.start)
@@ -201,9 +119,7 @@ class UpdateScheduleTests(SharedModuleStoreTestCase): # lint-amnesty, pylint: d
enrollment = CourseEnrollment.objects.get(id=enrollment.id)
self.assert_schedule_dates(enrollment.schedule, course.start) # start set to new course start
- def test_updated_when_course_already_started(self, mock_get_current_site):
- mock_get_current_site.return_value = self.site
-
+ def test_updated_when_course_already_started(self):
course = _create_course_run(self_paced=True, start_day_offset=-5) # course starts in past
enrollment = CourseEnrollmentFactory(course_id=course.id, mode=CourseMode.AUDIT)
self.assert_schedule_dates(enrollment.schedule, enrollment.created)
@@ -213,9 +129,7 @@ class UpdateScheduleTests(SharedModuleStoreTestCase): # lint-amnesty, pylint: d
enrollment = CourseEnrollment.objects.get(id=enrollment.id)
self.assert_schedule_dates(enrollment.schedule, course.start) # start set to new course start
- def test_updated_when_new_start_in_past(self, mock_get_current_site):
- mock_get_current_site.return_value = self.site
-
+ def test_updated_when_new_start_in_past(self):
course = _create_course_run(self_paced=True, start_day_offset=5) # course starts in future
enrollment = CourseEnrollmentFactory(course_id=course.id, mode=CourseMode.AUDIT)
previous_start = enrollment.course.start
@@ -228,17 +142,11 @@ class UpdateScheduleTests(SharedModuleStoreTestCase): # lint-amnesty, pylint: d
@skip_unless_lms
-@override_waffle_flag(CREATE_SCHEDULE_WAFFLE_FLAG, True)
class ResetScheduleTests(SharedModuleStoreTestCase): # lint-amnesty, pylint: disable=missing-class-docstring
def setUp(self):
super().setUp()
- self.config = ScheduleConfigFactory(create_schedules=True)
-
- site_patch = patch('openedx.core.djangoapps.schedules.signals.get_current_site', return_value=self.config.site)
- self.addCleanup(site_patch.stop)
- site_patch.start()
-
+ self.config = ScheduleConfigFactory()
self.course = _create_course_run(self_paced=True)
self.enrollment = CourseEnrollmentFactory(
course_id=self.course.id,
diff --git a/openedx/core/djangoapps/schedules/tests/test_utils.py b/openedx/core/djangoapps/schedules/tests/test_utils.py
index 8e6a7d90a1..4bfb76df36 100644
--- a/openedx/core/djangoapps/schedules/tests/test_utils.py
+++ b/openedx/core/djangoapps/schedules/tests/test_utils.py
@@ -5,10 +5,9 @@ Tests for schedules utils
import datetime
import ddt
-from common.djangoapps.course_modes.models import CourseMode
-from mock import patch # lint-amnesty, pylint: disable=wrong-import-order
-from pytz import utc # lint-amnesty, pylint: disable=wrong-import-order
+from pytz import utc
+from common.djangoapps.course_modes.models import CourseMode
from openedx.core.djangoapps.schedules.models import Schedule
from openedx.core.djangoapps.schedules.tests.factories import ScheduleConfigFactory
from openedx.core.djangoapps.schedules.utils import reset_self_paced_schedule
@@ -22,11 +21,7 @@ from xmodule.modulestore.tests.factories import CourseFactory
@skip_unless_lms
class ResetSelfPacedScheduleTests(SharedModuleStoreTestCase): # lint-amnesty, pylint: disable=missing-class-docstring
def create_schedule(self, offset=0): # lint-amnesty, pylint: disable=missing-function-docstring
- self.config = ScheduleConfigFactory(create_schedules=True) # lint-amnesty, pylint: disable=attribute-defined-outside-init
-
- site_patch = patch('openedx.core.djangoapps.schedules.signals.get_current_site', return_value=self.config.site)
- self.addCleanup(site_patch.stop)
- site_patch.start()
+ self.config = ScheduleConfigFactory() # lint-amnesty, pylint: disable=attribute-defined-outside-init
start = datetime.datetime.now(utc) - datetime.timedelta(days=100)
self.course = CourseFactory.create(start=start, self_paced=True) # lint-amnesty, pylint: disable=attribute-defined-outside-init
diff --git a/openedx/features/course_duration_limits/tests/test_access.py b/openedx/features/course_duration_limits/tests/test_access.py
index 8ce1e90b04..8b18d3a9bd 100644
--- a/openedx/features/course_duration_limits/tests/test_access.py
+++ b/openedx/features/course_duration_limits/tests/test_access.py
@@ -14,7 +14,7 @@ from common.djangoapps.course_modes.models import CourseMode
from common.djangoapps.course_modes.tests.factories import CourseModeFactory
from common.djangoapps.student.tests.factories import UserFactory
from lms.djangoapps.courseware.models import DynamicUpgradeDeadlineConfiguration
-from openedx.core.djangoapps.schedules.tests.factories import ScheduleFactory
+from openedx.core.djangoapps.schedules.models import Schedule
from openedx.core.djangoapps.user_api.preferences.api import set_user_preference
from openedx.core.djangolib.testing.utils import CacheIsolationTestCase
from openedx.features.course_duration_limits.access import (
@@ -113,10 +113,7 @@ class TestAccess(CacheIsolationTestCase):
course_id=enrollment.course.id,
mode_slug=CourseMode.AUDIT,
)
- ScheduleFactory.create(
- enrollment=enrollment,
- upgrade_deadline=schedule_upgrade_deadline,
- )
+ Schedule.objects.update(upgrade_deadline=schedule_upgrade_deadline)
duration_limit_upgrade_deadline = get_user_course_expiration_date(enrollment.user, enrollment.course)
assert duration_limit_upgrade_deadline is not None
@@ -155,10 +152,7 @@ class TestAccess(CacheIsolationTestCase):
course_id=enrollment.course.id,
mode_slug=CourseMode.AUDIT,
)
- ScheduleFactory.create(
- enrollment=enrollment,
- start_date=datetime(2017, 1, 1, tzinfo=UTC),
- )
+ Schedule.objects.update(start_date=datetime(2017, 1, 1, tzinfo=UTC))
content_availability_date = max(enrollment.created, enrollment.course.start)
access_duration = get_user_course_duration(enrollment.user, enrollment.course)
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 9d6f084e6d..ee0edc4e18 100644
--- a/openedx/features/course_duration_limits/tests/test_course_expiration.py
+++ b/openedx/features/course_duration_limits/tests/test_course_expiration.py
@@ -30,7 +30,7 @@ from openedx.core.djangoapps.django_comment_common.models import (
FORUM_ROLE_GROUP_MODERATOR,
FORUM_ROLE_MODERATOR
)
-from openedx.core.djangoapps.schedules.tests.factories import ScheduleFactory
+from openedx.core.djangoapps.schedules.models import Schedule
from openedx.features.content_type_gating.helpers import CONTENT_GATING_PARTITION_ID, CONTENT_TYPE_GATE_GROUP_IDS
from openedx.features.course_duration_limits.access import get_user_course_expiration_date
from openedx.features.course_duration_limits.models import CourseDurationLimitConfig
@@ -337,12 +337,12 @@ class CourseExpirationTestCase(ModuleStoreTestCase, MasqueradeMixin):
else:
expired_staff = role_factory.create(password=TEST_PASSWORD, course_key=self.course.id)
- ScheduleFactory(
- start_date=self.THREE_YEARS_AGO,
- enrollment__mode=CourseMode.AUDIT,
- enrollment__course_id=self.course.id,
- enrollment__user=expired_staff
+ CourseEnrollmentFactory.create(
+ mode=CourseMode.AUDIT,
+ course_id=self.course.id,
+ user=expired_staff,
)
+ Schedule.objects.update(start_date=self.THREE_YEARS_AGO)
CourseDurationLimitConfig.objects.create(
enabled=True,
course=CourseOverview.get_from_id(self.course.id),
@@ -385,12 +385,12 @@ class CourseExpirationTestCase(ModuleStoreTestCase, MasqueradeMixin):
role = RoleFactory(name=role_name, course_id=self.course.id)
role.users.add(expired_staff)
- ScheduleFactory(
- start_date=self.THREE_YEARS_AGO,
- enrollment__mode=CourseMode.AUDIT,
- enrollment__course_id=self.course.id,
- enrollment__user=expired_staff
+ CourseEnrollmentFactory.create(
+ mode=CourseMode.AUDIT,
+ course_id=self.course.id,
+ user=expired_staff,
)
+ Schedule.objects.update(start_date=self.THREE_YEARS_AGO)
CourseDurationLimitConfig.objects.create(
enabled=True,
diff --git a/openedx/features/course_experience/api/v1/tests/test_views.py b/openedx/features/course_experience/api/v1/tests/test_views.py
index 87cc854be3..c92cf32f7e 100644
--- a/openedx/features/course_experience/api/v1/tests/test_views.py
+++ b/openedx/features/course_experience/api/v1/tests/test_views.py
@@ -44,15 +44,12 @@ class ResetCourseDeadlinesViewTests(EventTestMixin, BaseCourseHomeTests, Masquer
student_username = self.user.username
student_user_id = self.user.id
student_enrollment = CourseEnrollment.enroll(self.user, course.id)
- student_schedule = ScheduleFactory.create(
- start_date=timezone.now() - datetime.timedelta(days=100),
- enrollment=student_enrollment
- )
- staff_schedule = ScheduleFactory(
- start_date=timezone.now() - datetime.timedelta(days=30),
- enrollment__course__id=course.id,
- enrollment__user=self.staff_user,
- )
+ student_enrollment.schedule.start_date = timezone.now() - datetime.timedelta(days=100)
+ student_enrollment.schedule.save()
+
+ staff_enrollment = CourseEnrollment.enroll(self.staff_user, course.id)
+ staff_enrollment.schedule.start_date = timezone.now() - datetime.timedelta(days=30)
+ staff_enrollment.schedule.save()
self.switch_to_staff()
self.update_masquerade(course=course, username=student_username)
@@ -60,10 +57,10 @@ class ResetCourseDeadlinesViewTests(EventTestMixin, BaseCourseHomeTests, Masquer
with patch('openedx.features.course_experience.api.v1.views.dates_banner_should_display',
return_value=(True, False)):
self.client.post(reverse('course-experience-reset-course-deadlines'), {'course_key': course.id})
- updated_schedule = Schedule.objects.get(id=student_schedule.id)
+ updated_schedule = Schedule.objects.get(id=student_enrollment.schedule.id)
assert updated_schedule.start_date.date() == datetime.datetime.today().date()
- updated_staff_schedule = Schedule.objects.get(id=staff_schedule.id)
- assert updated_staff_schedule.start_date == staff_schedule.start_date
+ updated_staff_schedule = Schedule.objects.get(id=staff_enrollment.schedule.id)
+ assert updated_staff_schedule.start_date == staff_enrollment.schedule.start_date
self.assert_event_emitted(
'edx.ui.lms.reset_deadlines.clicked',
courserun_key=str(course.id),
diff --git a/openedx/features/course_experience/tests/views/test_course_home.py b/openedx/features/course_experience/tests/views/test_course_home.py
index 874b9b71c5..24ff886d83 100644
--- a/openedx/features/course_experience/tests/views/test_course_home.py
+++ b/openedx/features/course_experience/tests/views/test_course_home.py
@@ -44,7 +44,7 @@ from openedx.core.djangoapps.django_comment_common.models import (
FORUM_ROLE_GROUP_MODERATOR,
FORUM_ROLE_MODERATOR
)
-from openedx.core.djangoapps.schedules.tests.factories import ScheduleFactory
+from openedx.core.djangoapps.schedules.models import Schedule
from openedx.core.djangoapps.waffle_utils.testutils import WAFFLE_TABLES
from openedx.core.djangolib.markup import HTML
from openedx.features.course_duration_limits.models import CourseDurationLimitConfig
@@ -448,12 +448,8 @@ class TestCourseHomePageAccess(CourseHomePageTestCase):
url = course_home_url(course)
user = UserFactory.create(password=self.TEST_PASSWORD)
- ScheduleFactory(
- start_date=THREE_YEARS_AGO,
- enrollment__mode=CourseMode.VERIFIED,
- enrollment__course_id=course.id,
- enrollment__user=user
- )
+ CourseEnrollment.enroll(user, self.course.id, mode=CourseMode.VERIFIED)
+ Schedule.objects.update(start_date=THREE_YEARS_AGO)
# ensure that the user who has indefinite access
self.client.login(username=user.username, password=self.TEST_PASSWORD)
@@ -478,12 +474,8 @@ class TestCourseHomePageAccess(CourseHomePageTestCase):
url = course_home_url(course)
user = role_factory.create(password=self.TEST_PASSWORD, course_key=course.id)
- ScheduleFactory(
- start_date=THREE_YEARS_AGO,
- enrollment__mode=CourseMode.AUDIT,
- enrollment__course_id=course.id,
- enrollment__user=user
- )
+ CourseEnrollment.enroll(user, self.course.id, mode=CourseMode.AUDIT)
+ Schedule.objects.update(start_date=THREE_YEARS_AGO)
# ensure that the user has indefinite access
self.client.login(username=user.username, password=self.TEST_PASSWORD)
@@ -526,12 +518,8 @@ class TestCourseHomePageAccess(CourseHomePageTestCase):
url = course_home_url(course)
user = role_factory.create(password=self.TEST_PASSWORD)
- ScheduleFactory(
- start_date=THREE_YEARS_AGO,
- enrollment__mode=CourseMode.AUDIT,
- enrollment__course_id=course.id,
- enrollment__user=user
- )
+ CourseEnrollment.enroll(user, self.course.id, mode=CourseMode.AUDIT)
+ Schedule.objects.update(start_date=THREE_YEARS_AGO)
# ensure that the user who has indefinite access
self.client.login(username=user.username, password=self.TEST_PASSWORD)
@@ -557,7 +545,6 @@ class TestCourseHomePageAccess(CourseHomePageTestCase):
audit_enrollment = CourseEnrollment.enroll(audit_user, course.id, mode=CourseMode.AUDIT)
audit_enrollment.created = THREE_YEARS_AGO + timedelta(days=1)
audit_enrollment.save()
- ScheduleFactory(enrollment=audit_enrollment)
response = self.client.get(url)
@@ -627,7 +614,7 @@ class TestCourseHomePageAccess(CourseHomePageTestCase):
audit_user = UserFactory(password=self.TEST_PASSWORD)
self.client.login(username=audit_user.username, password=self.TEST_PASSWORD)
audit_enrollment = CourseEnrollment.enroll(audit_user, course.id, mode=CourseMode.AUDIT)
- ScheduleFactory(start_date=THREE_YEARS_AGO, enrollment=audit_enrollment)
+ Schedule.objects.update(start_date=THREE_YEARS_AGO)
FBEEnrollmentExclusion.objects.create(
enrollment=audit_enrollment
)
diff --git a/openedx/features/course_experience/tests/views/test_course_outline.py b/openedx/features/course_experience/tests/views/test_course_outline.py
index 825cdfca27..888c47a59e 100644
--- a/openedx/features/course_experience/tests/views/test_course_outline.py
+++ b/openedx/features/course_experience/tests/views/test_course_outline.py
@@ -128,11 +128,8 @@ class TestCourseOutlinePage(SharedModuleStoreTestCase, MasqueradeMixin):
"""Set up and enroll our fake user in the course."""
cls.user = UserFactory(password=TEST_PASSWORD)
for course in cls.courses:
- enrollment = CourseEnrollment.enroll(cls.user, course.id)
- ScheduleFactory.create(
- start_date=timezone.now() - datetime.timedelta(days=1),
- enrollment=enrollment
- )
+ CourseEnrollment.enroll(cls.user, course.id)
+ Schedule.objects.update(start_date=timezone.now() - datetime.timedelta(days=1))
def setUp(self):
"""
@@ -238,53 +235,41 @@ class TestCourseOutlinePage(SharedModuleStoreTestCase, MasqueradeMixin):
@override_experiment_waffle_flag(RELATIVE_DATES_FLAG, active=True)
def test_reset_course_deadlines(self):
course = self.courses[0]
- enrollment = CourseEnrollment.objects.get(course_id=course.id)
- enrollment.schedule.start_date = timezone.now() - datetime.timedelta(days=30)
- enrollment.schedule.save()
- student_schedule = CourseEnrollment.objects.get(course_id=course.id, user=self.user).schedule
- student_schedule.start_date = timezone.now() - datetime.timedelta(days=30)
- student_schedule.save()
staff = StaffFactory(course_key=course.id)
- staff_schedule = ScheduleFactory(
- start_date=timezone.now() - datetime.timedelta(days=30),
- enrollment__course__id=course.id,
- enrollment__user=staff,
- )
+ CourseEnrollment.enroll(staff, course.id)
+
+ start_date = timezone.now() - datetime.timedelta(days=30)
+ Schedule.objects.update(start_date=start_date)
self.client.login(username=staff.username, password=TEST_PASSWORD)
self.update_masquerade(course=course, username=self.user.username)
post_dict = {'course_id': str(course.id)}
self.client.post(reverse(RESET_COURSE_DEADLINES_NAME), post_dict)
- updated_schedule = Schedule.objects.get(id=student_schedule.id)
+ updated_schedule = Schedule.objects.get(enrollment__user=self.user, enrollment__course_id=course.id)
assert updated_schedule.start_date.date() == datetime.datetime.today().date()
- updated_staff_schedule = Schedule.objects.get(id=staff_schedule.id)
- assert updated_staff_schedule.start_date == staff_schedule.start_date
+ updated_staff_schedule = Schedule.objects.get(enrollment__user=staff, enrollment__course_id=course.id)
+ assert updated_staff_schedule.start_date == start_date
@override_experiment_waffle_flag(RELATIVE_DATES_FLAG, active=True)
def test_reset_course_deadlines_masquerade_generic_student(self):
course = self.courses[0]
- student_schedule = CourseEnrollment.objects.get(course_id=course.id, user=self.user).schedule
- student_schedule.start_date = timezone.now() - datetime.timedelta(days=30)
- student_schedule.save()
-
staff = StaffFactory(course_key=course.id)
- staff_schedule = ScheduleFactory(
- start_date=timezone.now() - datetime.timedelta(days=30),
- enrollment__course__id=course.id,
- enrollment__user=staff,
- )
+ CourseEnrollment.enroll(staff, course.id)
+
+ start_date = timezone.now() - datetime.timedelta(days=30)
+ Schedule.objects.update(start_date=start_date)
self.client.login(username=staff.username, password=TEST_PASSWORD)
self.update_masquerade(course=course)
post_dict = {'course_id': str(course.id)}
self.client.post(reverse(RESET_COURSE_DEADLINES_NAME), post_dict)
- updated_student_schedule = Schedule.objects.get(id=student_schedule.id)
- assert updated_student_schedule.start_date == student_schedule.start_date
- updated_staff_schedule = Schedule.objects.get(id=staff_schedule.id)
+ updated_student_schedule = Schedule.objects.get(enrollment__user=self.user, enrollment__course_id=course.id)
+ assert updated_student_schedule.start_date == start_date
+ updated_staff_schedule = Schedule.objects.get(enrollment__user=staff, enrollment__course_id=course.id)
assert updated_staff_schedule.start_date.date() == datetime.date.today()
From 1ec2e797a1bbc83b4ded77b1edd790bccbf30c6e Mon Sep 17 00:00:00 2001
From: Cory Lee
Date: Tue, 23 Feb 2021 13:01:16 -0500
Subject: [PATCH 19/74] Revert "pyupgrade on static_templates, staticbook and
support apps (#26646)" (#26685)
This reverts commit a235425ac3da65b178406228e29737ec62b599ad.
---
.../static_template_view/tests/test_views.py | 18 ++---
lms/djangoapps/static_template_view/urls.py | 2 +-
lms/djangoapps/static_template_view/views.py | 4 +-
lms/djangoapps/staticbook/tests.py | 8 +--
lms/djangoapps/staticbook/views.py | 12 ++--
lms/djangoapps/support/serializers.py | 14 ++--
lms/djangoapps/support/tests/test_views.py | 71 +++++++++----------
lms/djangoapps/support/urls.py | 2 +-
lms/djangoapps/support/views/certificate.py | 3 +-
lms/djangoapps/support/views/contact_us.py | 4 +-
lms/djangoapps/support/views/enrollments.py | 24 +++----
lms/djangoapps/support/views/manage_user.py | 5 +-
.../support/views/program_enrollments.py | 11 +--
lms/djangoapps/support/views/sso_records.py | 2 +-
14 files changed, 92 insertions(+), 88 deletions(-)
diff --git a/lms/djangoapps/static_template_view/tests/test_views.py b/lms/djangoapps/static_template_view/tests/test_views.py
index f876c8897b..562ae9e69c 100644
--- a/lms/djangoapps/static_template_view/tests/test_views.py
+++ b/lms/djangoapps/static_template_view/tests/test_views.py
@@ -37,10 +37,10 @@ class MarketingSiteViewTests(TestCase):
"""
Test the about view with the header and content set in SiteConfiguration.
"""
- test_header = "Very Unique Test Header"
- test_content = "Very Unique Test Content"
- test_header_key = 'static_template_about_header'
- test_content_key = 'static_template_about_content'
+ test_header = u"Very Unique Test Header"
+ test_content = u"Very Unique Test Content"
+ test_header_key = u'static_template_about_header'
+ test_content_key = u'static_template_about_content'
response = None
configuration = {test_header_key: test_header, test_content_key: test_content}
with with_site_configuration_context(configuration=configuration):
@@ -52,10 +52,10 @@ class MarketingSiteViewTests(TestCase):
"""
Test the about view with html in the header.
"""
- test_header = "Very Unique Test Header"
- test_content = "Very Unique Test Content"
- test_header_key = 'static_template_about_header'
- test_content_key = 'static_template_about_content'
+ test_header = u"Very Unique Test Header"
+ test_content = u"Very Unique Test Content"
+ test_header_key = u'static_template_about_header'
+ test_content_key = u'static_template_about_content'
response = None
configuration = {test_header_key: test_header, test_content_key: test_content}
with with_site_configuration_context(configuration=configuration):
@@ -85,7 +85,7 @@ class MarketingSiteViewTests(TestCase):
resp = self.client.get(url)
self.assertContains(
resp,
- 'There has been a 500 error on the {platform_name} servers'.format(
+ u'There has been a 500 error on the {platform_name} servers'.format(
platform_name=settings.PLATFORM_NAME
),
status_code=500
diff --git a/lms/djangoapps/static_template_view/urls.py b/lms/djangoapps/static_template_view/urls.py
index a05783085c..5dd3fa96be 100644
--- a/lms/djangoapps/static_template_view/urls.py
+++ b/lms/djangoapps/static_template_view/urls.py
@@ -46,7 +46,7 @@ for key, value in settings.MKTG_URL_LINK_MAP.items():
if '.' not in template:
# Append STATIC_TEMPLATE_VIEW_DEFAULT_FILE_EXTENSION if
# no file extension was specified in the key
- template = f"{template}.{settings.STATIC_TEMPLATE_VIEW_DEFAULT_FILE_EXTENSION}"
+ template = "%s.%s" % (template, settings.STATIC_TEMPLATE_VIEW_DEFAULT_FILE_EXTENSION)
# Make the assumption that the URL we want is the lowercased
# version of the map key
diff --git a/lms/djangoapps/static_template_view/views.py b/lms/djangoapps/static_template_view/views.py
index f63cb58171..9ce2666bc2 100644
--- a/lms/djangoapps/static_template_view/views.py
+++ b/lms/djangoapps/static_template_view/views.py
@@ -15,13 +15,13 @@ from django.template import TemplateDoesNotExist
from django.utils.safestring import mark_safe
from django.views.decorators.csrf import ensure_csrf_cookie
from django.views.defaults import permission_denied
-from mako.exceptions import TopLevelLookupException
from ratelimit.exceptions import Ratelimited
+from mako.exceptions import TopLevelLookupException
from common.djangoapps.edxmako.shortcuts import render_to_response, render_to_string
+from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers
from common.djangoapps.util.cache import cache_if_anonymous
from common.djangoapps.util.views import fix_crum_request
-from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers
valid_templates = []
diff --git a/lms/djangoapps/staticbook/tests.py b/lms/djangoapps/staticbook/tests.py
index f560ddb7e3..56153b42df 100644
--- a/lms/djangoapps/staticbook/tests.py
+++ b/lms/djangoapps/staticbook/tests.py
@@ -4,11 +4,11 @@ Test the lms/staticbook views.
import textwrap
-from unittest import mock
-
import pytest
+import mock
import requests
from django.urls import NoReverseMatch, reverse
+from six import text_type
from common.djangoapps.student.tests.factories import CourseEnrollmentFactory, UserFactory
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
@@ -50,7 +50,7 @@ class StaticBookTest(ModuleStoreTestCase):
"""
def __init__(self, *args, **kwargs):
- super().__init__(*args, **kwargs)
+ super(StaticBookTest, self).__init__(*args, **kwargs) # lint-amnesty, pylint: disable=super-with-arguments
self.course = None
def make_course(self, **kwargs):
@@ -69,7 +69,7 @@ class StaticBookTest(ModuleStoreTestCase):
Automatically provides the course id.
"""
- kwargs['course_id'] = str(self.course.id)
+ kwargs['course_id'] = text_type(self.course.id)
url = reverse(url_name, kwargs=kwargs)
return url
diff --git a/lms/djangoapps/staticbook/views.py b/lms/djangoapps/staticbook/views.py
index 2e6d1c9a8e..8d0d9a40cd 100644
--- a/lms/djangoapps/staticbook/views.py
+++ b/lms/djangoapps/staticbook/views.py
@@ -8,10 +8,10 @@ from django.http import Http404
from django.views.decorators.clickjacking import xframe_options_exempt
from opaque_keys.edx.keys import CourseKey
-from common.djangoapps.edxmako.shortcuts import render_to_response
-from common.djangoapps.static_replace import replace_static_urls
from lms.djangoapps.courseware.access import has_access
from lms.djangoapps.courseware.courses import get_course_with_access
+from common.djangoapps.edxmako.shortcuts import render_to_response
+from common.djangoapps.static_replace import replace_static_urls
@login_required
@@ -25,7 +25,7 @@ def index(request, course_id, book_index, page=None):
book_index = int(book_index)
if book_index < 0 or book_index >= len(course.textbooks):
- raise Http404(f"Invalid book index value: {book_index}")
+ raise Http404(u"Invalid book index value: {0}".format(book_index))
textbook = course.textbooks[book_index]
table_of_contents = textbook.table_of_contents
@@ -83,7 +83,7 @@ def pdf_index(request, course_id, book_index, chapter=None, page=None):
book_index = int(book_index)
if book_index < 0 or book_index >= len(course.pdf_textbooks):
- raise Http404(f"Invalid book index value: {book_index}")
+ raise Http404(u"Invalid book index value: {0}".format(book_index))
textbook = course.pdf_textbooks[book_index]
viewer_params = '&file='
@@ -108,7 +108,7 @@ def pdf_index(request, course_id, book_index, chapter=None, page=None):
viewer_params += '#zoom=page-fit&disableRange=true'
if page is not None:
- viewer_params += f'&page={page}'
+ viewer_params += '&page={}'.format(page)
if request.GET.get('viewer', '') == 'true':
template = 'pdf_viewer.html'
@@ -151,7 +151,7 @@ def html_index(request, course_id, book_index, chapter=None):
book_index = int(book_index)
if book_index < 0 or book_index >= len(course.html_textbooks):
- raise Http404(f"Invalid book index value: {book_index}")
+ raise Http404(u"Invalid book index value: {0}".format(book_index))
textbook = course.html_textbooks[book_index]
if 'url' in textbook:
diff --git a/lms/djangoapps/support/serializers.py b/lms/djangoapps/support/serializers.py
index 29baa1f563..840df93a36 100644
--- a/lms/djangoapps/support/serializers.py
+++ b/lms/djangoapps/support/serializers.py
@@ -4,10 +4,14 @@ Serializers for use in the support app.
import json
from django.urls import reverse
+
from rest_framework import serializers
from common.djangoapps.student.models import CourseEnrollment, ManualEnrollmentAudit
-from lms.djangoapps.program_enrollments.models import ProgramCourseEnrollment, ProgramEnrollment
+from lms.djangoapps.program_enrollments.models import (
+ ProgramEnrollment,
+ ProgramCourseEnrollment,
+)
from openedx.core.djangoapps.catalog.utils import get_programs_by_uuids
from openedx.features.course_experience import default_course_url_name
@@ -19,7 +23,7 @@ class ManualEnrollmentSerializer(serializers.ModelSerializer):
"""Serializes a manual enrollment audit object."""
enrolled_by = serializers.SlugRelatedField(slug_field='email', read_only=True, default='')
- class Meta:
+ class Meta(object):
model = ManualEnrollmentAudit
fields = ('enrolled_by', 'time_stamp', 'reason')
@@ -30,7 +34,7 @@ class CourseEnrollmentSerializer(serializers.Serializer):
is_active = serializers.BooleanField()
mode = serializers.CharField()
- class Meta:
+ class Meta(object):
model = CourseEnrollment
@@ -43,7 +47,7 @@ class ProgramCourseEnrollmentSerializer(serializers.Serializer):
course_enrollment = CourseEnrollmentSerializer()
course_url = serializers.SerializerMethodField()
- class Meta:
+ class Meta(object):
model = ProgramCourseEnrollment
def get_course_url(self, obj):
@@ -61,7 +65,7 @@ class ProgramEnrollmentSerializer(serializers.Serializer):
program_course_enrollments = ProgramCourseEnrollmentSerializer(many=True)
program_name = serializers.SerializerMethodField()
- class Meta:
+ class Meta(object):
model = ProgramEnrollment
def get_program_name(self, obj):
diff --git a/lms/djangoapps/support/tests/test_views.py b/lms/djangoapps/support/tests/test_views.py
index 4810854d42..adacde150e 100644
--- a/lms/djangoapps/support/tests/test_views.py
+++ b/lms/djangoapps/support/tests/test_views.py
@@ -1,3 +1,4 @@
+# coding: UTF-8
"""
Tests for support views.
"""
@@ -7,35 +8,31 @@ import itertools
import json
import re
from datetime import datetime, timedelta
-from unittest.mock import patch
from uuid import UUID, uuid4
import ddt
+import six
from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user
from django.db.models import signals
from django.http import HttpResponse
from django.urls import reverse
+from mock import patch
from organizations.tests.factories import OrganizationFactory
from pytz import UTC
from social_django.models import UserSocialAuth
+from common.test.utils import disable_signal
from common.djangoapps.course_modes.models import CourseMode
from common.djangoapps.course_modes.tests.factories import CourseModeFactory
-from common.djangoapps.student.models import ( # lint-amnesty, pylint: disable=line-too-long
- ENROLLED_TO_ENROLLED,
- CourseEnrollment,
- CourseEnrollmentAttribute,
- ManualEnrollmentAudit
-)
-from common.djangoapps.student.roles import GlobalStaff, SupportStaffRole
-from common.djangoapps.student.tests.factories import CourseEnrollmentFactory, UserFactory
-from common.djangoapps.third_party_auth.tests.factories import SAMLProviderConfigFactory
-from common.test.utils import disable_signal
from lms.djangoapps.program_enrollments.tests.factories import ProgramCourseEnrollmentFactory, ProgramEnrollmentFactory
from lms.djangoapps.support.serializers import ProgramEnrollmentSerializer
from lms.djangoapps.verify_student.models import VerificationDeadline
from lms.djangoapps.verify_student.services import IDVerificationService
from lms.djangoapps.verify_student.tests.factories import SSOVerificationFactory
+from common.djangoapps.student.models import ENROLLED_TO_ENROLLED, CourseEnrollment, CourseEnrollmentAttribute, ManualEnrollmentAudit # lint-amnesty, pylint: disable=line-too-long
+from common.djangoapps.student.roles import GlobalStaff, SupportStaffRole
+from common.djangoapps.student.tests.factories import CourseEnrollmentFactory, UserFactory
+from common.djangoapps.third_party_auth.tests.factories import SAMLProviderConfigFactory
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase, SharedModuleStoreTestCase
from xmodule.modulestore.tests.factories import CourseFactory
@@ -51,7 +48,7 @@ class SupportViewTestCase(ModuleStoreTestCase):
def setUp(self):
"""Create a user and log in. """
- super().setUp()
+ super(SupportViewTestCase, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.user = UserFactory(username=self.USERNAME, email=self.EMAIL, password=self.PASSWORD)
self.course = CourseFactory.create()
success = self.client.login(username=self.USERNAME, password=self.PASSWORD)
@@ -65,7 +62,7 @@ class SupportViewManageUserTests(SupportViewTestCase):
def setUp(self):
"""Make the user support staff"""
- super().setUp()
+ super(SupportViewManageUserTests, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
SupportStaffRole().add_users(self.user)
def test_get_contact_us(self):
@@ -192,7 +189,7 @@ class SupportViewIndexTests(SupportViewTestCase):
def setUp(self):
"""Make the user support staff. """
- super().setUp()
+ super(SupportViewIndexTests, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
SupportStaffRole().add_users(self.user)
def test_index(self):
@@ -210,7 +207,7 @@ class SupportViewCertificatesTests(SupportViewTestCase):
"""
def setUp(self):
"""Make the user support staff. """
- super().setUp()
+ super(SupportViewCertificatesTests, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
SupportStaffRole().add_users(self.user)
def test_certificates_no_filter(self):
@@ -226,10 +223,10 @@ class SupportViewCertificatesTests(SupportViewTestCase):
def test_certificates_along_with_course_filter(self):
# Check that an initial filter is passed to the JavaScript client.
- url = reverse("support:certificates") + "?user=student@example.com&course_id=" + str(self.course.id)
+ url = reverse("support:certificates") + "?user=student@example.com&course_id=" + six.text_type(self.course.id)
response = self.client.get(url)
self.assertContains(response, "userFilter: 'student@example.com'")
- self.assertContains(response, "courseFilter: '" + str(self.course.id) + "'")
+ self.assertContains(response, "courseFilter: '" + six.text_type(self.course.id) + "'")
@ddt.ddt
@@ -237,10 +234,10 @@ class SupportViewEnrollmentsTests(SharedModuleStoreTestCase, SupportViewTestCase
"""Tests for the enrollment support view."""
def setUp(self):
- super().setUp()
+ super(SupportViewEnrollmentsTests, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
SupportStaffRole().add_users(self.user)
- self.course = CourseFactory(display_name='teꜱᴛ')
+ self.course = CourseFactory(display_name=u'teꜱᴛ')
self.student = UserFactory.create(username='student', email='test@example.com', password='test')
for mode in (
@@ -280,7 +277,7 @@ class SupportViewEnrollmentsTests(SharedModuleStoreTestCase, SupportViewTestCase
'mode': CourseMode.AUDIT,
'manual_enrollment': {},
'user': self.student.username,
- 'course_id': str(self.course.id),
+ 'course_id': six.text_type(self.course.id),
'is_active': True,
'verified_upgrade_deadline': None,
}, data[0])
@@ -311,7 +308,7 @@ class SupportViewEnrollmentsTests(SharedModuleStoreTestCase, SupportViewTestCase
kwargs={'username_or_email': getattr(self.student, search_string_type)}
)
response = self.client.post(url, data={
- 'course_id': str(self.course.id),
+ 'course_id': six.text_type(self.course.id),
'old_mode': CourseMode.AUDIT,
'new_mode': CourseMode.VERIFIED,
'reason': 'Financial Assistance'
@@ -424,11 +421,11 @@ class SupportViewEnrollmentsTests(SharedModuleStoreTestCase, SupportViewTestCase
with patch('lms.djangoapps.support.views.enrollments.get_credit_provider_attribute_values') as mock_method:
credit_provider = (
- ['Arizona State University'], 'You are now eligible for credit from Arizona State University'
+ [u'Arizona State University'], 'You are now eligible for credit from Arizona State University'
)
mock_method.return_value = credit_provider
response = self.client.post(url, data={
- 'course_id': str(self.course.id),
+ 'course_id': six.text_type(self.course.id),
'old_mode': CourseMode.AUDIT,
'new_mode': new_mode,
'reason': 'Financial Assistance'
@@ -439,7 +436,7 @@ class SupportViewEnrollmentsTests(SharedModuleStoreTestCase, SupportViewTestCase
self.assert_enrollment(new_mode)
if new_mode == 'credit':
enrollment_attr = CourseEnrollmentAttribute.objects.first()
- assert enrollment_attr.value == str(credit_provider[0])
+ assert enrollment_attr.value == six.text_type(credit_provider[0])
def set_course_end_date_and_expiry(self):
""" Set the course-end date and expire its verified mode."""
@@ -468,7 +465,7 @@ class SupportViewLinkProgramEnrollmentsTests(SupportViewTestCase):
def setUp(self):
"""Make the user support staff. """
- super().setUp()
+ super(SupportViewLinkProgramEnrollmentsTests, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.url = reverse("support:link_program_enrollments")
SupportStaffRole().add_users(self.user)
self.program_uuid = str(uuid4())
@@ -490,7 +487,7 @@ class SupportViewLinkProgramEnrollmentsTests(SupportViewTestCase):
Test the view without mocking out the rendering like the rest of the tests.
"""
response = self.client.get(self.url)
- content = str(response.content, encoding='utf-8')
+ content = six.text_type(response.content, encoding='utf-8')
assert '"programUUID": ""' in content
assert '"text": ""' in content
@@ -500,7 +497,7 @@ class SupportViewLinkProgramEnrollmentsTests(SupportViewTestCase):
'program_uuid': 'notauuid',
'text': self.text,
})
- msg = "Supplied program UUID 'notauuid' is not a valid UUID."
+ msg = u"Supplied program UUID 'notauuid' is not a valid UUID."
render_call_dict = mocked_render.call_args[0][1]
assert render_call_dict['errors'] == [msg]
@@ -513,9 +510,9 @@ class SupportViewLinkProgramEnrollmentsTests(SupportViewTestCase):
@ddt.unpack
def test_missing_parameter(self, program_uuid, text, mocked_render):
error = (
- "You must provide both a program uuid "
- "and a series of lines with the format "
- "'external_user_key,lms_username'."
+ u"You must provide both a program uuid "
+ u"and a series of lines with the format "
+ u"'external_user_key,lms_username'."
)
self.client.post(self.url, data={
'program_uuid': program_uuid,
@@ -551,7 +548,7 @@ class SupportViewLinkProgramEnrollmentsTests(SupportViewTestCase):
'program_uuid': self.program_uuid,
'text': text,
})
- msg = "All linking lines must be in the format 'external_user_key,lms_username'"
+ msg = u"All linking lines must be in the format 'external_user_key,lms_username'"
render_call_dict = mocked_render.call_args[0][1]
assert render_call_dict['errors'] == [msg]
@@ -613,14 +610,14 @@ class SupportViewLinkProgramEnrollmentsTests(SupportViewTestCase):
})
render_call_dict = mocked_render.call_args[0][1]
if username:
- expected_success = f"('{external_user_key}', '{username}')"
+ expected_success = "('{}', '{}')".format(external_user_key, username)
assert render_call_dict['successes'] == [expected_success]
program_enrollment.refresh_from_db()
assert program_enrollment.user == linked_user
program_course_enrollment.refresh_from_db()
assert program_course_enrollment.course_enrollment.user == linked_user
else:
- error = "All linking lines must be in the format 'external_user_key,lms_username'"
+ error = u"All linking lines must be in the format 'external_user_key,lms_username'"
assert render_call_dict['errors'] == [error]
@@ -636,7 +633,7 @@ class ProgramEnrollmentsInspectorViewTests(SupportViewTestCase):
)
def setUp(self):
- super().setUp()
+ super(ProgramEnrollmentsInspectorViewTests, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.url = reverse("support:program_enrollments_inspector")
SupportStaffRole().add_users(self.user)
self.program_uuid = str(uuid4())
@@ -662,7 +659,7 @@ class ProgramEnrollmentsInspectorViewTests(SupportViewTestCase):
def test_initial_rendering(self):
response = self.client.get(self.url)
- content = str(response.content, encoding='utf-8')
+ content = six.text_type(response.content, encoding='utf-8')
expected_organization_serialized = '"orgKeys": {}'.format(
json.dumps(sorted(self.org_key_list))
)
@@ -684,7 +681,7 @@ class ProgramEnrollmentsInspectorViewTests(SupportViewTestCase):
if org_key and external_user_key:
user_social_auth = UserSocialAuth.objects.create(
user=user,
- uid=f'{org_key}:{external_user_key}',
+ uid='{0}:{1}'.format(org_key, external_user_key),
provider='tpa-saml'
)
user_info['sso_list'] = [{
@@ -957,7 +954,7 @@ class SsoRecordsTests(SupportViewTestCase): # lint-amnesty, pylint: disable=mis
def setUp(self):
"""Make the user support staff"""
- super().setUp()
+ super(SsoRecordsTests, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
SupportStaffRole().add_users(self.user)
self.student = UserFactory.create(username='student', email='test@example.com', password='test')
self.url = reverse("support:sso_records", kwargs={'username_or_email': self.student.username})
diff --git a/lms/djangoapps/support/urls.py b/lms/djangoapps/support/urls.py
index ed9c985971..06554f4c01 100644
--- a/lms/djangoapps/support/urls.py
+++ b/lms/djangoapps/support/urls.py
@@ -5,8 +5,8 @@ URLs for the student support app.
from django.conf.urls import url
-from .views.certificate import CertificatesSupportView
from .views.contact_us import ContactUsView
+from .views.certificate import CertificatesSupportView
from .views.course_entitlements import EntitlementSupportView
from .views.enrollments import EnrollmentSupportListView, EnrollmentSupportView
from .views.feature_based_enrollments import FeatureBasedEnrollmentsSupportView
diff --git a/lms/djangoapps/support/views/certificate.py b/lms/djangoapps/support/views/certificate.py
index 41e8685d4d..6019551b5e 100644
--- a/lms/djangoapps/support/views/certificate.py
+++ b/lms/djangoapps/support/views/certificate.py
@@ -1,10 +1,11 @@
"""
Certificate tool in the student support app.
"""
-from urllib.parse import quote_plus, unquote
+
from django.utils.decorators import method_decorator
from django.views.generic import View
+from six.moves.urllib.parse import quote_plus, unquote
from common.djangoapps.edxmako.shortcuts import render_to_response
from lms.djangoapps.support.decorators import require_support_permission
diff --git a/lms/djangoapps/support/views/contact_us.py b/lms/djangoapps/support/views/contact_us.py
index 180276a400..4612ef4667 100644
--- a/lms/djangoapps/support/views/contact_us.py
+++ b/lms/djangoapps/support/views/contact_us.py
@@ -8,9 +8,9 @@ from django.http import Http404
from django.views.generic import View
from common.djangoapps.edxmako.shortcuts import render_to_response
-from common.djangoapps.student.models import CourseEnrollment
from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers
from openedx.features.enterprise_support import api as enterprise_api
+from common.djangoapps.student.models import CourseEnrollment
class ContactUsView(View):
@@ -35,7 +35,7 @@ class ContactUsView(View):
current_site_name = configuration_helpers.get_value("SITE_NAME")
if current_site_name:
current_site_name = current_site_name.replace(".", "_")
- tags.append(f"site_name_{current_site_name}")
+ tags.append("site_name_{site}".format(site=current_site_name))
if request.user.is_authenticated:
context['course_id'] = request.session.get('course_id', '')
diff --git a/lms/djangoapps/support/views/enrollments.py b/lms/djangoapps/support/views/enrollments.py
index fa65a45d62..4a3c43039b 100644
--- a/lms/djangoapps/support/views/enrollments.py
+++ b/lms/djangoapps/support/views/enrollments.py
@@ -2,6 +2,8 @@
Support tool for changing course enrollments.
"""
+
+import six
from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user
from django.db import transaction
from django.db.models import Q
@@ -12,16 +14,10 @@ from django.views.generic import View
from opaque_keys import InvalidKeyError
from opaque_keys.edx.keys import CourseKey
from rest_framework.generics import GenericAPIView
+from six import text_type
from common.djangoapps.course_modes.models import CourseMode
from common.djangoapps.edxmako.shortcuts import render_to_response
-from common.djangoapps.student.models import ( # lint-amnesty, pylint: disable=line-too-long
- ENROLLED_TO_ENROLLED,
- CourseEnrollment,
- CourseEnrollmentAttribute,
- ManualEnrollmentAudit
-)
-from common.djangoapps.util.json_request import JsonResponse
from lms.djangoapps.support.decorators import require_support_permission
from lms.djangoapps.support.serializers import ManualEnrollmentSerializer
from lms.djangoapps.verify_student.models import VerificationDeadline
@@ -29,6 +25,8 @@ from openedx.core.djangoapps.credit.email_utils import get_credit_provider_attri
from openedx.core.djangoapps.enrollments.api import get_enrollments, update_enrollment
from openedx.core.djangoapps.enrollments.errors import CourseModeNotFoundError
from openedx.core.djangoapps.enrollments.serializers import ModeSerializer
+from common.djangoapps.student.models import ENROLLED_TO_ENROLLED, CourseEnrollment, CourseEnrollmentAttribute, ManualEnrollmentAudit # lint-amnesty, pylint: disable=line-too-long
+from common.djangoapps.util.json_request import JsonResponse
class EnrollmentSupportView(View):
@@ -93,19 +91,19 @@ class EnrollmentSupportListView(GenericAPIView):
reason = request.data['reason']
enrollment = CourseEnrollment.objects.get(user=user, course_id=course_key)
if enrollment.mode != old_mode:
- return HttpResponseBadRequest('User {username} is not enrolled with mode {old_mode}.'.format(
+ return HttpResponseBadRequest(u'User {username} is not enrolled with mode {old_mode}.'.format(
username=user.username,
old_mode=old_mode
))
except KeyError as err:
- return HttpResponseBadRequest('The field {} is required.'.format(str(err)))
+ return HttpResponseBadRequest(u'The field {} is required.'.format(text_type(err)))
except InvalidKeyError:
- return HttpResponseBadRequest('Could not parse course key.')
+ return HttpResponseBadRequest(u'Could not parse course key.')
except (CourseEnrollment.DoesNotExist, User.DoesNotExist):
return HttpResponseBadRequest(
- 'Could not find enrollment for user {username} in course {course}.'.format(
+ u'Could not find enrollment for user {username} in course {course}.'.format(
username=username_or_email,
- course=str(course_key)
+ course=six.text_type(course_key)
)
)
try:
@@ -132,7 +130,7 @@ class EnrollmentSupportListView(GenericAPIView):
)
return JsonResponse(ManualEnrollmentSerializer(instance=manual_enrollment).data)
except CourseModeNotFoundError as err:
- return HttpResponseBadRequest(str(err))
+ return HttpResponseBadRequest(text_type(err))
@staticmethod
def include_verified_mode_info(enrollment_data, course_key):
diff --git a/lms/djangoapps/support/views/manage_user.py b/lms/djangoapps/support/views/manage_user.py
index ef83bf518d..21442a2566 100644
--- a/lms/djangoapps/support/views/manage_user.py
+++ b/lms/djangoapps/support/views/manage_user.py
@@ -11,12 +11,13 @@ from django.utils.translation import ugettext as _
from django.views.generic import View
from rest_framework.generics import GenericAPIView
-from common.djangoapps.edxmako.shortcuts import render_to_response
from common.djangoapps.student.models import UserPasswordToggleHistory
-from common.djangoapps.util.json_request import JsonResponse
+from common.djangoapps.edxmako.shortcuts import render_to_response
from lms.djangoapps.support.decorators import require_support_permission
from openedx.core.djangoapps.user_api.accounts.serializers import AccountUserSerializer
from openedx.core.djangoapps.user_authn.utils import generate_password
+from common.djangoapps.util.json_request import JsonResponse
+
from openedx.core.djangolib.oauth2_retirement_utils import retire_dot_oauth2_models
diff --git a/lms/djangoapps/support/views/program_enrollments.py b/lms/djangoapps/support/views/program_enrollments.py
index a756361551..c0454abc99 100644
--- a/lms/djangoapps/support/views/program_enrollments.py
+++ b/lms/djangoapps/support/views/program_enrollments.py
@@ -13,7 +13,6 @@ from django.views.generic import View
from social_django.models import UserSocialAuth
from common.djangoapps.edxmako.shortcuts import render_to_response
-from common.djangoapps.third_party_auth.models import SAMLProviderConfig
from lms.djangoapps.program_enrollments.api import (
fetch_program_enrollments_by_student,
get_users_by_external_keys_and_org_key,
@@ -25,8 +24,12 @@ from lms.djangoapps.program_enrollments.exceptions import (
ProviderDoesNotExistException
)
from lms.djangoapps.support.decorators import require_support_permission
-from lms.djangoapps.support.serializers import ProgramEnrollmentSerializer, serialize_user_info
+from lms.djangoapps.support.serializers import (
+ ProgramEnrollmentSerializer,
+ serialize_user_info
+)
from lms.djangoapps.verify_student.services import IDVerificationService
+from common.djangoapps.third_party_auth.models import SAMLProviderConfig
TEMPLATE_PATH = 'support/link_program_enrollments.html'
DATETIME_FORMAT = '%Y-%m-%dT%H:%M:%S'
@@ -91,7 +94,7 @@ class LinkProgramEnrollmentSupportView(View):
program_uuid = UUID(program_uuid_string)
except ValueError:
return [], [
- f"Supplied program UUID '{program_uuid_string}' is not a valid UUID."
+ "Supplied program UUID '{}' is not a valid UUID.".format(program_uuid_string)
]
reader = csv.DictReader(
linkage_text.splitlines(), fieldnames=('external_key', 'username')
@@ -210,7 +213,7 @@ class ProgramEnrollmentsInspectorView(View):
result['id_verification'] = IDVerificationService.user_status(user)
return result, ''
except User.DoesNotExist:
- return {}, f'Could not find edx account with {username_or_email}'
+ return {}, 'Could not find edx account with {}'.format(username_or_email)
def _get_external_user_info(self, external_user_key, org_key, idp_provider=None):
"""
diff --git a/lms/djangoapps/support/views/sso_records.py b/lms/djangoapps/support/views/sso_records.py
index b86984aac7..00be03e6db 100644
--- a/lms/djangoapps/support/views/sso_records.py
+++ b/lms/djangoapps/support/views/sso_records.py
@@ -8,9 +8,9 @@ from django.utils.decorators import method_decorator
from rest_framework.generics import GenericAPIView
from social_django.models import UserSocialAuth
-from common.djangoapps.util.json_request import JsonResponse
from lms.djangoapps.support.decorators import require_support_permission
from lms.djangoapps.support.serializers import serialize_sso_records
+from common.djangoapps.util.json_request import JsonResponse
class SsoView(GenericAPIView):
From f84468191300c91da62ddaa8f1ab615f06ead1b1 Mon Sep 17 00:00:00 2001
From: Christie Rice <8483753+crice100@users.noreply.github.com>
Date: Tue, 23 Feb 2021 15:29:49 -0500
Subject: [PATCH 20/74] Revert "BOM-2368: pyupgrade in LMS Directory (#26649)"
This reverts commit fc06846cb0a3d64642a4866f586fe88004954a4c.
---
lms/__init__.py | 3 +-
lms/celery.py | 2 +-
lms/docker_lms_gunicorn.py | 2 +-
lms/envs/bok_choy.py | 15 +-
lms/envs/bok_choy_docker.py | 10 +-
lms/envs/common.py | 619 +++++++++---------
lms/envs/devstack.py | 11 +-
lms/envs/devstack_decentralized.py | 11 +-
lms/envs/devstack_optimized.py | 3 +-
lms/envs/devstack_with_worker.py | 3 +
lms/envs/production.py | 24 +-
lms/envs/test.py | 19 +-
.../courseware_search/lms_filter_generator.py | 8 +-
.../test/test_lms_filter_generator.py | 15 +-
.../test/test_lms_result_processor.py | 15 +-
lms/lib/tests/test_utils.py | 2 +-
lms/lib/xblock/test/test_mixin.py | 8 +-
lms/tests.py | 1 +
lms/urls.py | 18 +-
lms/wsgi.py | 22 +-
lms/wsgi_apache_lms.py | 14 +-
21 files changed, 415 insertions(+), 410 deletions(-)
diff --git a/lms/__init__.py b/lms/__init__.py
index 12f5322a8b..b2e36bfc94 100644
--- a/lms/__init__.py
+++ b/lms/__init__.py
@@ -12,10 +12,9 @@ registration and discovery can work correctly.
# FWIW, this is identical behavior to what happens in Kombu if pkg_resources
# isn't available.
import kombu.utils
+kombu.utils.entrypoints = lambda namespace: iter([])
# This will make sure the app is always imported when Django starts so
# that shared_task will use this app, and also ensures that the celery
# singleton is always configured for the LMS.
from .celery import APP as CELERY_APP # lint-amnesty, pylint: disable=wrong-import-position
-
-kombu.utils.entrypoints = lambda namespace: iter([])
diff --git a/lms/celery.py b/lms/celery.py
index 45b94c834c..2e7235f8d5 100644
--- a/lms/celery.py
+++ b/lms/celery.py
@@ -7,8 +7,8 @@ Taken from: https://celery.readthedocs.org/en/latest/django/first-steps-with-dja
import os
-from openedx.core.lib.celery import APP # pylint: disable=wrong-import-position,unused-import
# Set the default Django settings module for the 'celery' program
# and then instantiate the Celery singleton.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'lms.envs.production')
+from openedx.core.lib.celery import APP # pylint: disable=wrong-import-position,unused-import
diff --git a/lms/docker_lms_gunicorn.py b/lms/docker_lms_gunicorn.py
index 32653ca096..9b79a792a1 100644
--- a/lms/docker_lms_gunicorn.py
+++ b/lms/docker_lms_gunicorn.py
@@ -11,7 +11,7 @@ workers = 17
def pre_request(worker, req):
- worker.log.info(f"{req.method} {req.path}")
+ worker.log.info("%s %s" % (req.method, req.path))
def close_all_caches():
diff --git a/lms/envs/bok_choy.py b/lms/envs/bok_choy.py
index fb843755e0..6c2f16e963 100644
--- a/lms/envs/bok_choy.py
+++ b/lms/envs/bok_choy.py
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
"""
Settings for Bok Choy tests that are used when running LMS.
@@ -34,11 +35,11 @@ TEST_ROOT = CONFIG_ROOT.dirname().dirname() / "test_root"
os.environ['SERVICE_VARIANT'] = 'bok_choy_docker' if 'BOK_CHOY_HOSTNAME' in os.environ else 'bok_choy'
os.environ['LMS_CFG'] = str.format("{config_root}/{service_variant}.yml",
config_root=CONFIG_ROOT, service_variant=os.environ['SERVICE_VARIANT'])
-os.environ['REVISION_CFG'] = f"{CONFIG_ROOT}/revisions.yml"
-
+os.environ['REVISION_CFG'] = "{config_root}/revisions.yml".format(config_root=CONFIG_ROOT)
from .production import * # pylint: disable=wildcard-import, unused-wildcard-import, wrong-import-position
+
######################### Testing overrides ####################################
# Redirect to the test_root folder within the repo
@@ -57,8 +58,8 @@ update_module_store_settings(
default_store=os.environ.get('DEFAULT_STORE', 'draft'),
)
-PLATFORM_NAME = ugettext_lazy("édX")
-PLATFORM_DESCRIPTION = ugettext_lazy("Open édX Platform")
+PLATFORM_NAME = ugettext_lazy(u"édX")
+PLATFORM_DESCRIPTION = ugettext_lazy(u"Open édX Platform")
############################ STATIC FILES #############################
@@ -100,9 +101,9 @@ YOUTUBE_HOSTNAME = os.environ.get('BOK_CHOY_HOSTNAME', '127.0.0.1')
# Point the URL used to test YouTube availability to our stub YouTube server
YOUTUBE_PORT = 9080
YOUTUBE['TEST_TIMEOUT'] = 5000
-YOUTUBE['API'] = f"http://{YOUTUBE_HOSTNAME}:{YOUTUBE_PORT}/get_youtube_api/"
-YOUTUBE['METADATA_URL'] = f"http://{YOUTUBE_HOSTNAME}:{YOUTUBE_PORT}/test_youtube/"
-YOUTUBE['TEXT_API']['url'] = f"{YOUTUBE_HOSTNAME}:{YOUTUBE_PORT}/test_transcripts_youtube/"
+YOUTUBE['API'] = "http://{0}:{1}/get_youtube_api/".format(YOUTUBE_HOSTNAME, YOUTUBE_PORT)
+YOUTUBE['METADATA_URL'] = "http://{0}:{1}/test_youtube/".format(YOUTUBE_HOSTNAME, YOUTUBE_PORT)
+YOUTUBE['TEXT_API']['url'] = "{0}:{1}/test_transcripts_youtube/".format(YOUTUBE_HOSTNAME, YOUTUBE_PORT)
############################# SECURITY SETTINGS ################################
# Default to advanced security in common.py, so tests can reset here to use
diff --git a/lms/envs/bok_choy_docker.py b/lms/envs/bok_choy_docker.py
index 65ca041516..58fe106963 100644
--- a/lms/envs/bok_choy_docker.py
+++ b/lms/envs/bok_choy_docker.py
@@ -1,12 +1,14 @@
+# -*- coding: utf-8 -*-
"""
Settings for Bok Choy tests that are used when running Studio in Docker-based devstack.
"""
+# noinspection PyUnresolvedReferences
from .bok_choy import * # pylint: disable=wildcard-import
CMS_BASE = '{}:{}'.format(os.environ['BOK_CHOY_HOSTNAME'], os.environ.get('BOK_CHOY_CMS_PORT', 8031))
LMS_BASE = '{}:{}'.format(os.environ['BOK_CHOY_HOSTNAME'], os.environ.get('BOK_CHOY_LMS_PORT', 8003))
-LMS_ROOT_URL = f'http://{LMS_BASE}'
+LMS_ROOT_URL = 'http://{}'.format(LMS_BASE)
LOGIN_REDIRECT_WHITELIST = [CMS_BASE]
SITE_NAME = LMS_BASE
@@ -22,6 +24,6 @@ LOGGING['loggers']['tracking']['handlers'] = ['console']
# Point the URL used to test YouTube availability to our stub YouTube server
BOK_CHOY_HOST = os.environ['BOK_CHOY_HOSTNAME']
-YOUTUBE['API'] = f"http://{BOK_CHOY_HOST}:{YOUTUBE_PORT}/get_youtube_api/"
-YOUTUBE['METADATA_URL'] = f"http://{BOK_CHOY_HOST}:{YOUTUBE_PORT}/test_youtube/"
-YOUTUBE['TEXT_API']['url'] = f"{BOK_CHOY_HOST}:{YOUTUBE_PORT}/test_transcripts_youtube/"
+YOUTUBE['API'] = "http://{}:{}/get_youtube_api/".format(BOK_CHOY_HOST, YOUTUBE_PORT)
+YOUTUBE['METADATA_URL'] = "http://{}:{}/test_youtube/".format(BOK_CHOY_HOST, YOUTUBE_PORT)
+YOUTUBE['TEXT_API']['url'] = "{}:{}/test_transcripts_youtube/".format(BOK_CHOY_HOST, YOUTUBE_PORT)
diff --git a/lms/envs/common.py b/lms/envs/common.py
index 51f3a82380..91fa13247c 100644
--- a/lms/envs/common.py
+++ b/lms/envs/common.py
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
"""
This is the common settings file, intended to set sane defaults. If you have a
piece of configuration that's dependent on a set of feature flags being set,
@@ -29,43 +30,29 @@ Longer TODO:
import importlib.util
-import os
import sys
-################################## TEMPLATE CONFIGURATION #####################################
-# Mako templating
-import tempfile # pylint: disable=wrong-import-position,wrong-import-order
+import os
from corsheaders.defaults import default_headers as corsheaders_default_headers
+from path import Path as path
from django.utils.translation import ugettext_lazy as _
-from edx_django_utils.plugins import ( # pylint: disable=wrong-import-position,wrong-import-order
- add_plugins,
- get_plugin_apps
-)
from enterprise.constants import (
ENTERPRISE_ADMIN_ROLE,
ENTERPRISE_CATALOG_ADMIN_ROLE,
ENTERPRISE_DASHBOARD_ADMIN_ROLE,
ENTERPRISE_ENROLLMENT_API_ADMIN_ROLE,
- ENTERPRISE_OPERATOR_ROLE,
- ENTERPRISE_REPORTING_CONFIG_ADMIN_ROLE
+ ENTERPRISE_REPORTING_CONFIG_ADMIN_ROLE,
+ ENTERPRISE_OPERATOR_ROLE
)
-from path import Path as path
-################################# WIKI ###################################
-from lms.djangoapps.course_wiki import settings as course_wiki_settings # pylint: disable=wrong-import-position
-from lms.djangoapps.lms_xblock.mixin import LmsBlockMixin
-from openedx.core.constants import COURSE_ID_PATTERN, COURSE_KEY_PATTERN, COURSE_KEY_REGEX
-from openedx.core.djangoapps.plugins.constants import ProjectType, SettingsType # pylint: disable=wrong-import-position
-from openedx.core.djangoapps.theming.helpers_dirs import get_theme_base_dirs_from_settings, get_themes_unchecked
+from openedx.core.constants import COURSE_KEY_REGEX, COURSE_KEY_PATTERN, COURSE_ID_PATTERN
+from openedx.core.djangoapps.theming.helpers_dirs import (
+ get_themes_unchecked,
+ get_theme_base_dirs_from_settings
+)
from openedx.core.lib.derived import derived, derived_collection_entry
-from openedx.core.lib.rooted_paths import rooted_glob # pylint: disable=wrong-import-position
from openedx.core.release import doc_version
-from xmodule.modulestore import prefer_xmodules
-# Import after sys.path fixup
-# pylint: disable=wrong-import-position
-from xmodule.modulestore.edit_info import EditInfoMixin
-from xmodule.modulestore.inheritance import InheritanceMixin
-from xmodule.x_module import XModuleMixin
+from lms.djangoapps.lms_xblock.mixin import LmsBlockMixin
################################### FEATURES ###################################
# .. setting_name: PLATFORM_NAME
@@ -1088,6 +1075,9 @@ OAUTH_EXPIRE_PUBLIC_CLIENT_DAYS = 30
TPA_PROVIDER_BURST_THROTTLE = '10/min'
TPA_PROVIDER_SUSTAINED_THROTTLE = '50/hr'
+################################## TEMPLATE CONFIGURATION #####################################
+# Mako templating
+import tempfile # pylint: disable=wrong-import-position,wrong-import-order
MAKO_MODULE_DIR = os.path.join(tempfile.gettempdir(), 'mako_lms')
MAKO_TEMPLATE_DIRS_BASE = [
PROJECT_ROOT / 'templates',
@@ -1282,13 +1272,13 @@ WIKI_ENABLED = True
COURSE_MODE_DEFAULTS = {
'bulk_sku': None,
- 'currency': 'usd',
+ 'currency': u'usd',
'description': None,
'expiration_datetime': None,
'min_price': 0,
- 'name': _('Audit'),
+ 'name': _(u'Audit'),
'sku': None,
- 'slug': 'audit',
+ 'slug': u'audit',
'suggested_prices': '',
}
@@ -1305,7 +1295,7 @@ USAGE_ID_PATTERN = r'(?P(?:i4x://?[^/]+/[^/]+/[^/]+/[^@]+(?:@[^/]+)?)|
# However, backward compatibility with Ficus older releases is still maintained (space is still not valid)
# in the AccountCreationForm and the user_api through the ENABLE_UNICODE_USERNAME feature flag.
USERNAME_REGEX_PARTIAL = r'[\w .@_+-]+'
-USERNAME_PATTERN = fr'(?P{USERNAME_REGEX_PARTIAL})'
+USERNAME_PATTERN = r'(?P{regex})'.format(regex=USERNAME_REGEX_PARTIAL)
############################## EVENT TRACKING #################################
@@ -1397,6 +1387,12 @@ COURSE_LISTINGS = {}
############# XBlock Configuration ##########
+# Import after sys.path fixup
+# pylint: disable=wrong-import-position
+from xmodule.modulestore.edit_info import EditInfoMixin
+from xmodule.modulestore.inheritance import InheritanceMixin
+from xmodule.modulestore import prefer_xmodules
+from xmodule.x_module import XModuleMixin
# pylint: enable=wrong-import-position
# These are the Mixins that should be added to every XBlock.
@@ -1658,87 +1654,87 @@ LANGUAGE_COOKIE = "openedx-language-preference"
# Sourced from http://www.localeplanet.com/icu/ and wikipedia
LANGUAGES = [
- ('en', 'English'),
- ('rtl', 'Right-to-Left Test Language'),
- ('eo', 'Dummy Language (Esperanto)'), # Dummy languaged used for testing
- ('fake2', 'Fake translations'), # Another dummy language for testing (not pushed to prod)
+ ('en', u'English'),
+ ('rtl', u'Right-to-Left Test Language'),
+ ('eo', u'Dummy Language (Esperanto)'), # Dummy languaged used for testing
+ ('fake2', u'Fake translations'), # Another dummy language for testing (not pushed to prod)
- ('am', 'አማርኛ'), # Amharic
- ('ar', 'العربية'), # Arabic
- ('az', 'azərbaycanca'), # Azerbaijani
- ('bg-bg', 'български (България)'), # Bulgarian (Bulgaria)
- ('bn-bd', 'বাংলা (বাংলাদেশ)'), # Bengali (Bangladesh)
- ('bn-in', 'বাংলা (ভারত)'), # Bengali (India)
- ('bs', 'bosanski'), # Bosnian
- ('ca', 'Català'), # Catalan
- ('ca@valencia', 'Català (València)'), # Catalan (Valencia)
- ('cs', 'Čeština'), # Czech
- ('cy', 'Cymraeg'), # Welsh
- ('da', 'dansk'), # Danish
- ('de-de', 'Deutsch (Deutschland)'), # German (Germany)
- ('el', 'Ελληνικά'), # Greek
- ('en-uk', 'English (United Kingdom)'), # English (United Kingdom)
- ('en@lolcat', 'LOLCAT English'), # LOLCAT English
- ('en@pirate', 'Pirate English'), # Pirate English
- ('es-419', 'Español (Latinoamérica)'), # Spanish (Latin America)
- ('es-ar', 'Español (Argentina)'), # Spanish (Argentina)
- ('es-ec', 'Español (Ecuador)'), # Spanish (Ecuador)
- ('es-es', 'Español (España)'), # Spanish (Spain)
- ('es-mx', 'Español (México)'), # Spanish (Mexico)
- ('es-pe', 'Español (Perú)'), # Spanish (Peru)
- ('et-ee', 'Eesti (Eesti)'), # Estonian (Estonia)
- ('eu-es', 'euskara (Espainia)'), # Basque (Spain)
- ('fa', 'فارسی'), # Persian
- ('fa-ir', 'فارسی (ایران)'), # Persian (Iran)
- ('fi-fi', 'Suomi (Suomi)'), # Finnish (Finland)
- ('fil', 'Filipino'), # Filipino
- ('fr', 'Français'), # French
- ('gl', 'Galego'), # Galician
- ('gu', 'ગુજરાતી'), # Gujarati
- ('he', 'עברית'), # Hebrew
- ('hi', 'हिन्दी'), # Hindi
- ('hr', 'hrvatski'), # Croatian
- ('hu', 'magyar'), # Hungarian
- ('hy-am', 'Հայերեն (Հայաստան)'), # Armenian (Armenia)
- ('id', 'Bahasa Indonesia'), # Indonesian
- ('it-it', 'Italiano (Italia)'), # Italian (Italy)
- ('ja-jp', '日本語 (日本)'), # Japanese (Japan)
- ('kk-kz', 'қазақ тілі (Қазақстан)'), # Kazakh (Kazakhstan)
- ('km-kh', 'ភាសាខ្មែរ (កម្ពុជា)'), # Khmer (Cambodia)
- ('kn', 'ಕನ್ನಡ'), # Kannada
- ('ko-kr', '한국어 (대한민국)'), # Korean (Korea)
- ('lt-lt', 'Lietuvių (Lietuva)'), # Lithuanian (Lithuania)
- ('ml', 'മലയാളം'), # Malayalam
- ('mn', 'Монгол хэл'), # Mongolian
- ('mr', 'मराठी'), # Marathi
- ('ms', 'Bahasa Melayu'), # Malay
- ('nb', 'Norsk bokmål'), # Norwegian Bokmål
- ('ne', 'नेपाली'), # Nepali
- ('nl-nl', 'Nederlands (Nederland)'), # Dutch (Netherlands)
- ('or', 'ଓଡ଼ିଆ'), # Oriya
- ('pl', 'Polski'), # Polish
- ('pt-br', 'Português (Brasil)'), # Portuguese (Brazil)
- ('pt-pt', 'Português (Portugal)'), # Portuguese (Portugal)
- ('ro', 'română'), # Romanian
- ('ru', 'Русский'), # Russian
- ('si', 'සිංහල'), # Sinhala
- ('sk', 'Slovenčina'), # Slovak
- ('sl', 'Slovenščina'), # Slovenian
- ('sq', 'shqip'), # Albanian
- ('sr', 'Српски'), # Serbian
- ('sv', 'svenska'), # Swedish
- ('sw', 'Kiswahili'), # Swahili
- ('ta', 'தமிழ்'), # Tamil
- ('te', 'తెలుగు'), # Telugu
- ('th', 'ไทย'), # Thai
- ('tr-tr', 'Türkçe (Türkiye)'), # Turkish (Turkey)
- ('uk', 'Українська'), # Ukranian
- ('ur', 'اردو'), # Urdu
- ('vi', 'Tiếng Việt'), # Vietnamese
- ('uz', 'Ўзбек'), # Uzbek
- ('zh-cn', '中文 (简体)'), # Chinese (China)
- ('zh-hk', '中文 (香港)'), # Chinese (Hong Kong)
- ('zh-tw', '中文 (台灣)'), # Chinese (Taiwan)
+ ('am', u'አማርኛ'), # Amharic
+ ('ar', u'العربية'), # Arabic
+ ('az', u'azərbaycanca'), # Azerbaijani
+ ('bg-bg', u'български (България)'), # Bulgarian (Bulgaria)
+ ('bn-bd', u'বাংলা (বাংলাদেশ)'), # Bengali (Bangladesh)
+ ('bn-in', u'বাংলা (ভারত)'), # Bengali (India)
+ ('bs', u'bosanski'), # Bosnian
+ ('ca', u'Català'), # Catalan
+ ('ca@valencia', u'Català (València)'), # Catalan (Valencia)
+ ('cs', u'Čeština'), # Czech
+ ('cy', u'Cymraeg'), # Welsh
+ ('da', u'dansk'), # Danish
+ ('de-de', u'Deutsch (Deutschland)'), # German (Germany)
+ ('el', u'Ελληνικά'), # Greek
+ ('en-uk', u'English (United Kingdom)'), # English (United Kingdom)
+ ('en@lolcat', u'LOLCAT English'), # LOLCAT English
+ ('en@pirate', u'Pirate English'), # Pirate English
+ ('es-419', u'Español (Latinoamérica)'), # Spanish (Latin America)
+ ('es-ar', u'Español (Argentina)'), # Spanish (Argentina)
+ ('es-ec', u'Español (Ecuador)'), # Spanish (Ecuador)
+ ('es-es', u'Español (España)'), # Spanish (Spain)
+ ('es-mx', u'Español (México)'), # Spanish (Mexico)
+ ('es-pe', u'Español (Perú)'), # Spanish (Peru)
+ ('et-ee', u'Eesti (Eesti)'), # Estonian (Estonia)
+ ('eu-es', u'euskara (Espainia)'), # Basque (Spain)
+ ('fa', u'فارسی'), # Persian
+ ('fa-ir', u'فارسی (ایران)'), # Persian (Iran)
+ ('fi-fi', u'Suomi (Suomi)'), # Finnish (Finland)
+ ('fil', u'Filipino'), # Filipino
+ ('fr', u'Français'), # French
+ ('gl', u'Galego'), # Galician
+ ('gu', u'ગુજરાતી'), # Gujarati
+ ('he', u'עברית'), # Hebrew
+ ('hi', u'हिन्दी'), # Hindi
+ ('hr', u'hrvatski'), # Croatian
+ ('hu', u'magyar'), # Hungarian
+ ('hy-am', u'Հայերեն (Հայաստան)'), # Armenian (Armenia)
+ ('id', u'Bahasa Indonesia'), # Indonesian
+ ('it-it', u'Italiano (Italia)'), # Italian (Italy)
+ ('ja-jp', u'日本語 (日本)'), # Japanese (Japan)
+ ('kk-kz', u'қазақ тілі (Қазақстан)'), # Kazakh (Kazakhstan)
+ ('km-kh', u'ភាសាខ្មែរ (កម្ពុជា)'), # Khmer (Cambodia)
+ ('kn', u'ಕನ್ನಡ'), # Kannada
+ ('ko-kr', u'한국어 (대한민국)'), # Korean (Korea)
+ ('lt-lt', u'Lietuvių (Lietuva)'), # Lithuanian (Lithuania)
+ ('ml', u'മലയാളം'), # Malayalam
+ ('mn', u'Монгол хэл'), # Mongolian
+ ('mr', u'मराठी'), # Marathi
+ ('ms', u'Bahasa Melayu'), # Malay
+ ('nb', u'Norsk bokmål'), # Norwegian Bokmål
+ ('ne', u'नेपाली'), # Nepali
+ ('nl-nl', u'Nederlands (Nederland)'), # Dutch (Netherlands)
+ ('or', u'ଓଡ଼ିଆ'), # Oriya
+ ('pl', u'Polski'), # Polish
+ ('pt-br', u'Português (Brasil)'), # Portuguese (Brazil)
+ ('pt-pt', u'Português (Portugal)'), # Portuguese (Portugal)
+ ('ro', u'română'), # Romanian
+ ('ru', u'Русский'), # Russian
+ ('si', u'සිංහල'), # Sinhala
+ ('sk', u'Slovenčina'), # Slovak
+ ('sl', u'Slovenščina'), # Slovenian
+ ('sq', u'shqip'), # Albanian
+ ('sr', u'Српски'), # Serbian
+ ('sv', u'svenska'), # Swedish
+ ('sw', u'Kiswahili'), # Swahili
+ ('ta', u'தமிழ்'), # Tamil
+ ('te', u'తెలుగు'), # Telugu
+ ('th', u'ไทย'), # Thai
+ ('tr-tr', u'Türkçe (Türkiye)'), # Turkish (Turkey)
+ ('uk', u'Українська'), # Ukranian
+ ('ur', u'اردو'), # Urdu
+ ('vi', u'Tiếng Việt'), # Vietnamese
+ ('uz', u'Ўзбек'), # Uzbek
+ ('zh-cn', u'中文 (简体)'), # Chinese (China)
+ ('zh-hk', u'中文 (香港)'), # Chinese (Hong Kong)
+ ('zh-tw', u'中文 (台灣)'), # Chinese (Taiwan)
]
LANGUAGE_DICT = dict(LANGUAGES)
@@ -1794,6 +1790,8 @@ AWS_S3_CUSTOM_DOMAIN = "SET-ME-PLEASE (ex. bucket-name.s3.amazonaws.com)"
SIMPLE_WIKI_REQUIRE_LOGIN_EDIT = True
SIMPLE_WIKI_REQUIRE_LOGIN_VIEW = False
+################################# WIKI ###################################
+from lms.djangoapps.course_wiki import settings as course_wiki_settings # pylint: disable=wrong-import-position
# .. toggle_name: WIKI_ACCOUNT_HANDLING
# .. toggle_implementation: DjangoSetting
@@ -2093,6 +2091,7 @@ STATICFILES_FINDERS = [
'pipeline.finders.PipelineFinder',
]
+from openedx.core.lib.rooted_paths import rooted_glob # pylint: disable=wrong-import-position
courseware_js = [
'js/ajax-error.js',
@@ -3173,28 +3172,28 @@ SOCIAL_MEDIA_FOOTER_DISPLAY = {
# translate this the way that Facebook advertises in your language.
"title": _("Facebook"),
"icon": "fa-facebook-square",
- "action": _("Like {platform_name} on Facebook")
+ "action": _(u"Like {platform_name} on Facebook")
},
"twitter": {
# Translators: This is the website name of www.twitter.com. Please
# translate this the way that Twitter advertises in your language.
"title": _("Twitter"),
"icon": "fa-twitter-square",
- "action": _("Follow {platform_name} on Twitter")
+ "action": _(u"Follow {platform_name} on Twitter")
},
"linkedin": {
# Translators: This is the website name of www.linkedin.com. Please
# translate this the way that LinkedIn advertises in your language.
"title": _("LinkedIn"),
"icon": "fa-linkedin-square",
- "action": _("Follow {platform_name} on LinkedIn")
+ "action": _(u"Follow {platform_name} on LinkedIn")
},
"instagram": {
# Translators: This is the website name of www.instagram.com. Please
# translate this the way that Instagram advertises in your language.
"title": _("Instagram"),
"icon": "fa-instagram",
- "action": _("Follow {platform_name} on Instagram")
+ "action": _(u"Follow {platform_name} on Instagram")
},
"tumblr": {
# Translators: This is the website name of www.tumblr.com. Please
@@ -3213,7 +3212,7 @@ SOCIAL_MEDIA_FOOTER_DISPLAY = {
# translate this the way that Reddit advertises in your language.
"title": _("Reddit"),
"icon": "fa-reddit-square",
- "action": _("Subscribe to the {platform_name} subreddit"),
+ "action": _(u"Subscribe to the {platform_name} subreddit"),
},
"vk": {
# Translators: This is the website name of https://vk.com. Please
@@ -3232,7 +3231,7 @@ SOCIAL_MEDIA_FOOTER_DISPLAY = {
# translate this the way that YouTube advertises in your language.
"title": _("Youtube"),
"icon": "fa-youtube-square",
- "action": _("Subscribe to the {platform_name} YouTube channel")
+ "action": _(u"Subscribe to the {platform_name} YouTube channel")
}
}
@@ -3503,192 +3502,192 @@ VIDEO_TRANSCRIPTS_MAX_AGE = 31536000
# Note that this is used as the set of choices to the `code` field of the
# `LanguageProficiency` model.
ALL_LANGUAGES = [
- ["aa", "Afar"],
- ["ab", "Abkhazian"],
- ["af", "Afrikaans"],
- ["ak", "Akan"],
- ["sq", "Albanian"],
- ["am", "Amharic"],
- ["ar", "Arabic"],
- ["an", "Aragonese"],
- ["hy", "Armenian"],
- ["as", "Assamese"],
- ["av", "Avaric"],
- ["ae", "Avestan"],
- ["ay", "Aymara"],
- ["az", "Azerbaijani"],
- ["ba", "Bashkir"],
- ["bm", "Bambara"],
- ["eu", "Basque"],
- ["be", "Belarusian"],
- ["bn", "Bengali"],
- ["bh", "Bihari languages"],
- ["bi", "Bislama"],
- ["bs", "Bosnian"],
- ["br", "Breton"],
- ["bg", "Bulgarian"],
- ["my", "Burmese"],
- ["ca", "Catalan"],
- ["ch", "Chamorro"],
- ["ce", "Chechen"],
- ["zh", "Chinese"],
- ["zh_HANS", "Simplified Chinese"],
- ["zh_HANT", "Traditional Chinese"],
- ["cu", "Church Slavic"],
- ["cv", "Chuvash"],
- ["kw", "Cornish"],
- ["co", "Corsican"],
- ["cr", "Cree"],
- ["cs", "Czech"],
- ["da", "Danish"],
- ["dv", "Divehi"],
- ["nl", "Dutch"],
- ["dz", "Dzongkha"],
- ["en", "English"],
- ["eo", "Esperanto"],
- ["et", "Estonian"],
- ["ee", "Ewe"],
- ["fo", "Faroese"],
- ["fj", "Fijian"],
- ["fi", "Finnish"],
- ["fr", "French"],
- ["fy", "Western Frisian"],
- ["ff", "Fulah"],
- ["ka", "Georgian"],
- ["de", "German"],
- ["gd", "Gaelic"],
- ["ga", "Irish"],
- ["gl", "Galician"],
- ["gv", "Manx"],
- ["el", "Greek"],
- ["gn", "Guarani"],
- ["gu", "Gujarati"],
- ["ht", "Haitian"],
- ["ha", "Hausa"],
- ["he", "Hebrew"],
- ["hz", "Herero"],
- ["hi", "Hindi"],
- ["ho", "Hiri Motu"],
- ["hr", "Croatian"],
- ["hu", "Hungarian"],
- ["ig", "Igbo"],
- ["is", "Icelandic"],
- ["io", "Ido"],
- ["ii", "Sichuan Yi"],
- ["iu", "Inuktitut"],
- ["ie", "Interlingue"],
- ["ia", "Interlingua"],
- ["id", "Indonesian"],
- ["ik", "Inupiaq"],
- ["it", "Italian"],
- ["jv", "Javanese"],
- ["ja", "Japanese"],
- ["kl", "Kalaallisut"],
- ["kn", "Kannada"],
- ["ks", "Kashmiri"],
- ["kr", "Kanuri"],
- ["kk", "Kazakh"],
- ["km", "Central Khmer"],
- ["ki", "Kikuyu"],
- ["rw", "Kinyarwanda"],
- ["ky", "Kirghiz"],
- ["kv", "Komi"],
- ["kg", "Kongo"],
- ["ko", "Korean"],
- ["kj", "Kuanyama"],
- ["ku", "Kurdish"],
- ["lo", "Lao"],
- ["la", "Latin"],
- ["lv", "Latvian"],
- ["li", "Limburgan"],
- ["ln", "Lingala"],
- ["lt", "Lithuanian"],
- ["lb", "Luxembourgish"],
- ["lu", "Luba-Katanga"],
- ["lg", "Ganda"],
- ["mk", "Macedonian"],
- ["mh", "Marshallese"],
- ["ml", "Malayalam"],
- ["mi", "Maori"],
- ["mr", "Marathi"],
- ["ms", "Malay"],
- ["mg", "Malagasy"],
- ["mt", "Maltese"],
- ["mn", "Mongolian"],
- ["na", "Nauru"],
- ["nv", "Navajo"],
- ["nr", "Ndebele, South"],
- ["nd", "Ndebele, North"],
- ["ng", "Ndonga"],
- ["ne", "Nepali"],
- ["nn", "Norwegian Nynorsk"],
- ["nb", "Bokmål, Norwegian"],
- ["no", "Norwegian"],
- ["ny", "Chichewa"],
- ["oc", "Occitan"],
- ["oj", "Ojibwa"],
- ["or", "Oriya"],
- ["om", "Oromo"],
- ["os", "Ossetian"],
- ["pa", "Panjabi"],
- ["fa", "Persian"],
- ["pi", "Pali"],
- ["pl", "Polish"],
- ["pt", "Portuguese"],
- ["ps", "Pushto"],
- ["qu", "Quechua"],
- ["rm", "Romansh"],
- ["ro", "Romanian"],
- ["rn", "Rundi"],
- ["ru", "Russian"],
- ["sg", "Sango"],
- ["sa", "Sanskrit"],
- ["si", "Sinhala"],
- ["sk", "Slovak"],
- ["sl", "Slovenian"],
- ["se", "Northern Sami"],
- ["sm", "Samoan"],
- ["sn", "Shona"],
- ["sd", "Sindhi"],
- ["so", "Somali"],
- ["st", "Sotho, Southern"],
- ["es", "Spanish"],
- ["sc", "Sardinian"],
- ["sr", "Serbian"],
- ["ss", "Swati"],
- ["su", "Sundanese"],
- ["sw", "Swahili"],
- ["sv", "Swedish"],
- ["ty", "Tahitian"],
- ["ta", "Tamil"],
- ["tt", "Tatar"],
- ["te", "Telugu"],
- ["tg", "Tajik"],
- ["tl", "Tagalog"],
- ["th", "Thai"],
- ["bo", "Tibetan"],
- ["ti", "Tigrinya"],
- ["to", "Tonga (Tonga Islands)"],
- ["tn", "Tswana"],
- ["ts", "Tsonga"],
- ["tk", "Turkmen"],
- ["tr", "Turkish"],
- ["tw", "Twi"],
- ["ug", "Uighur"],
- ["uk", "Ukrainian"],
- ["ur", "Urdu"],
- ["uz", "Uzbek"],
- ["ve", "Venda"],
- ["vi", "Vietnamese"],
- ["vo", "Volapük"],
- ["cy", "Welsh"],
- ["wa", "Walloon"],
- ["wo", "Wolof"],
- ["xh", "Xhosa"],
- ["yi", "Yiddish"],
- ["yo", "Yoruba"],
- ["za", "Zhuang"],
- ["zu", "Zulu"]
+ [u"aa", u"Afar"],
+ [u"ab", u"Abkhazian"],
+ [u"af", u"Afrikaans"],
+ [u"ak", u"Akan"],
+ [u"sq", u"Albanian"],
+ [u"am", u"Amharic"],
+ [u"ar", u"Arabic"],
+ [u"an", u"Aragonese"],
+ [u"hy", u"Armenian"],
+ [u"as", u"Assamese"],
+ [u"av", u"Avaric"],
+ [u"ae", u"Avestan"],
+ [u"ay", u"Aymara"],
+ [u"az", u"Azerbaijani"],
+ [u"ba", u"Bashkir"],
+ [u"bm", u"Bambara"],
+ [u"eu", u"Basque"],
+ [u"be", u"Belarusian"],
+ [u"bn", u"Bengali"],
+ [u"bh", u"Bihari languages"],
+ [u"bi", u"Bislama"],
+ [u"bs", u"Bosnian"],
+ [u"br", u"Breton"],
+ [u"bg", u"Bulgarian"],
+ [u"my", u"Burmese"],
+ [u"ca", u"Catalan"],
+ [u"ch", u"Chamorro"],
+ [u"ce", u"Chechen"],
+ [u"zh", u"Chinese"],
+ [u"zh_HANS", u"Simplified Chinese"],
+ [u"zh_HANT", u"Traditional Chinese"],
+ [u"cu", u"Church Slavic"],
+ [u"cv", u"Chuvash"],
+ [u"kw", u"Cornish"],
+ [u"co", u"Corsican"],
+ [u"cr", u"Cree"],
+ [u"cs", u"Czech"],
+ [u"da", u"Danish"],
+ [u"dv", u"Divehi"],
+ [u"nl", u"Dutch"],
+ [u"dz", u"Dzongkha"],
+ [u"en", u"English"],
+ [u"eo", u"Esperanto"],
+ [u"et", u"Estonian"],
+ [u"ee", u"Ewe"],
+ [u"fo", u"Faroese"],
+ [u"fj", u"Fijian"],
+ [u"fi", u"Finnish"],
+ [u"fr", u"French"],
+ [u"fy", u"Western Frisian"],
+ [u"ff", u"Fulah"],
+ [u"ka", u"Georgian"],
+ [u"de", u"German"],
+ [u"gd", u"Gaelic"],
+ [u"ga", u"Irish"],
+ [u"gl", u"Galician"],
+ [u"gv", u"Manx"],
+ [u"el", u"Greek"],
+ [u"gn", u"Guarani"],
+ [u"gu", u"Gujarati"],
+ [u"ht", u"Haitian"],
+ [u"ha", u"Hausa"],
+ [u"he", u"Hebrew"],
+ [u"hz", u"Herero"],
+ [u"hi", u"Hindi"],
+ [u"ho", u"Hiri Motu"],
+ [u"hr", u"Croatian"],
+ [u"hu", u"Hungarian"],
+ [u"ig", u"Igbo"],
+ [u"is", u"Icelandic"],
+ [u"io", u"Ido"],
+ [u"ii", u"Sichuan Yi"],
+ [u"iu", u"Inuktitut"],
+ [u"ie", u"Interlingue"],
+ [u"ia", u"Interlingua"],
+ [u"id", u"Indonesian"],
+ [u"ik", u"Inupiaq"],
+ [u"it", u"Italian"],
+ [u"jv", u"Javanese"],
+ [u"ja", u"Japanese"],
+ [u"kl", u"Kalaallisut"],
+ [u"kn", u"Kannada"],
+ [u"ks", u"Kashmiri"],
+ [u"kr", u"Kanuri"],
+ [u"kk", u"Kazakh"],
+ [u"km", u"Central Khmer"],
+ [u"ki", u"Kikuyu"],
+ [u"rw", u"Kinyarwanda"],
+ [u"ky", u"Kirghiz"],
+ [u"kv", u"Komi"],
+ [u"kg", u"Kongo"],
+ [u"ko", u"Korean"],
+ [u"kj", u"Kuanyama"],
+ [u"ku", u"Kurdish"],
+ [u"lo", u"Lao"],
+ [u"la", u"Latin"],
+ [u"lv", u"Latvian"],
+ [u"li", u"Limburgan"],
+ [u"ln", u"Lingala"],
+ [u"lt", u"Lithuanian"],
+ [u"lb", u"Luxembourgish"],
+ [u"lu", u"Luba-Katanga"],
+ [u"lg", u"Ganda"],
+ [u"mk", u"Macedonian"],
+ [u"mh", u"Marshallese"],
+ [u"ml", u"Malayalam"],
+ [u"mi", u"Maori"],
+ [u"mr", u"Marathi"],
+ [u"ms", u"Malay"],
+ [u"mg", u"Malagasy"],
+ [u"mt", u"Maltese"],
+ [u"mn", u"Mongolian"],
+ [u"na", u"Nauru"],
+ [u"nv", u"Navajo"],
+ [u"nr", u"Ndebele, South"],
+ [u"nd", u"Ndebele, North"],
+ [u"ng", u"Ndonga"],
+ [u"ne", u"Nepali"],
+ [u"nn", u"Norwegian Nynorsk"],
+ [u"nb", u"Bokmål, Norwegian"],
+ [u"no", u"Norwegian"],
+ [u"ny", u"Chichewa"],
+ [u"oc", u"Occitan"],
+ [u"oj", u"Ojibwa"],
+ [u"or", u"Oriya"],
+ [u"om", u"Oromo"],
+ [u"os", u"Ossetian"],
+ [u"pa", u"Panjabi"],
+ [u"fa", u"Persian"],
+ [u"pi", u"Pali"],
+ [u"pl", u"Polish"],
+ [u"pt", u"Portuguese"],
+ [u"ps", u"Pushto"],
+ [u"qu", u"Quechua"],
+ [u"rm", u"Romansh"],
+ [u"ro", u"Romanian"],
+ [u"rn", u"Rundi"],
+ [u"ru", u"Russian"],
+ [u"sg", u"Sango"],
+ [u"sa", u"Sanskrit"],
+ [u"si", u"Sinhala"],
+ [u"sk", u"Slovak"],
+ [u"sl", u"Slovenian"],
+ [u"se", u"Northern Sami"],
+ [u"sm", u"Samoan"],
+ [u"sn", u"Shona"],
+ [u"sd", u"Sindhi"],
+ [u"so", u"Somali"],
+ [u"st", u"Sotho, Southern"],
+ [u"es", u"Spanish"],
+ [u"sc", u"Sardinian"],
+ [u"sr", u"Serbian"],
+ [u"ss", u"Swati"],
+ [u"su", u"Sundanese"],
+ [u"sw", u"Swahili"],
+ [u"sv", u"Swedish"],
+ [u"ty", u"Tahitian"],
+ [u"ta", u"Tamil"],
+ [u"tt", u"Tatar"],
+ [u"te", u"Telugu"],
+ [u"tg", u"Tajik"],
+ [u"tl", u"Tagalog"],
+ [u"th", u"Thai"],
+ [u"bo", u"Tibetan"],
+ [u"ti", u"Tigrinya"],
+ [u"to", u"Tonga (Tonga Islands)"],
+ [u"tn", u"Tswana"],
+ [u"ts", u"Tsonga"],
+ [u"tk", u"Turkmen"],
+ [u"tr", u"Turkish"],
+ [u"tw", u"Twi"],
+ [u"ug", u"Uighur"],
+ [u"uk", u"Ukrainian"],
+ [u"ur", u"Urdu"],
+ [u"uz", u"Uzbek"],
+ [u"ve", u"Venda"],
+ [u"vi", u"Vietnamese"],
+ [u"vo", u"Volapük"],
+ [u"cy", u"Welsh"],
+ [u"wa", u"Walloon"],
+ [u"wo", u"Wolof"],
+ [u"xh", u"Xhosa"],
+ [u"yi", u"Yiddish"],
+ [u"yo", u"Yoruba"],
+ [u"za", u"Zhuang"],
+ [u"zu", u"Zulu"]
]
@@ -3905,7 +3904,7 @@ ECOMMERCE_SERVICE_WORKER_USERNAME = 'ecommerce_worker'
ECOMMERCE_API_SIGNING_KEY = 'SET-ME-PLEASE'
COURSE_CATALOG_URL_ROOT = 'http://localhost:8008'
-COURSE_CATALOG_API_URL = f'{COURSE_CATALOG_URL_ROOT}/api/v1'
+COURSE_CATALOG_API_URL = '{}/api/v1'.format(COURSE_CATALOG_URL_ROOT)
CREDENTIALS_INTERNAL_SERVICE_URL = 'http://localhost:8005'
CREDENTIALS_PUBLIC_SERVICE_URL = 'http://localhost:8005'
@@ -4235,17 +4234,17 @@ ENTERPRISE_ALL_SERVICE_USERNAMES = [
# which are not provided by the Enterprise service. These settings provide base values
# for those features.
-ENTERPRISE_PLATFORM_WELCOME_TEMPLATE = _('Welcome to {platform_name}.')
+ENTERPRISE_PLATFORM_WELCOME_TEMPLATE = _(u'Welcome to {platform_name}.')
ENTERPRISE_SPECIFIC_BRANDED_WELCOME_TEMPLATE = _(
- 'You have left the {start_bold}{enterprise_name}{end_bold} website and are now on the {platform_name} site. '
- '{enterprise_name} has partnered with {platform_name} to offer you high-quality, always available learning '
- 'programs to help you advance your knowledge and career. '
- '{line_break}Please note that {platform_name} has a different {privacy_policy_link_start}Privacy Policy'
- '{privacy_policy_link_end} from {enterprise_name}.'
+ u'You have left the {start_bold}{enterprise_name}{end_bold} website and are now on the {platform_name} site. '
+ u'{enterprise_name} has partnered with {platform_name} to offer you high-quality, always available learning '
+ u'programs to help you advance your knowledge and career. '
+ u'{line_break}Please note that {platform_name} has a different {privacy_policy_link_start}Privacy Policy'
+ u'{privacy_policy_link_end} from {enterprise_name}.'
)
ENTERPRISE_PROXY_LOGIN_WELCOME_TEMPLATE = _(
- '{start_bold}{enterprise_name}{end_bold} has partnered with {start_bold}{platform_name}{end_bold} '
- 'to offer you high-quality learning opportunities from the world\'s best institutions and universities.'
+ u'{start_bold}{enterprise_name}{end_bold} has partnered with {start_bold}{platform_name}{end_bold} '
+ u'to offer you high-quality learning opportunities from the world\'s best institutions and universities.'
)
ENTERPRISE_TAGLINE = ''
ENTERPRISE_EXCLUDED_REGISTRATION_FIELDS = {
@@ -4545,6 +4544,8 @@ SYSTEM_WIDE_ROLE_CLASSES = []
############## Plugin Django Apps #########################
+from edx_django_utils.plugins import get_plugin_apps, add_plugins # pylint: disable=wrong-import-position,wrong-import-order
+from openedx.core.djangoapps.plugins.constants import ProjectType, SettingsType # pylint: disable=wrong-import-position
INSTALLED_APPS.extend(get_plugin_apps(ProjectType.LMS))
add_plugins(__name__, ProjectType.LMS, SettingsType.COMMON)
diff --git a/lms/envs/devstack.py b/lms/envs/devstack.py
index d12a55c6c2..f34dc185a2 100644
--- a/lms/envs/devstack.py
+++ b/lms/envs/devstack.py
@@ -8,6 +8,7 @@ import logging
from os.path import abspath, dirname, join
from corsheaders.defaults import default_headers as corsheaders_default_headers
+
# pylint: enable=unicode-format-string # lint-amnesty, pylint: disable=bad-option-value
#####################################################################
from edx_django_utils.plugins import add_plugins
@@ -33,9 +34,9 @@ SITE_NAME = LMS_BASE
CELERY_ALWAYS_EAGER = True
HTTPS = 'off'
-LMS_ROOT_URL = f'http://{LMS_BASE}'
+LMS_ROOT_URL = 'http://{}'.format(LMS_BASE)
LMS_INTERNAL_ROOT_URL = LMS_ROOT_URL
-ENTERPRISE_API_URL = f'{LMS_INTERNAL_ROOT_URL}/enterprise/api/v1/'
+ENTERPRISE_API_URL = '{}/enterprise/api/v1/'.format(LMS_INTERNAL_ROOT_URL)
IDA_LOGOUT_URI_LIST = [
'http://localhost:18130/logout/', # ecommerce
'http://localhost:18150/logout/', # credentials
@@ -279,10 +280,10 @@ LOGIN_REDIRECT_WHITELIST = [
###################### JWTs ######################
JWT_AUTH.update({
'JWT_AUDIENCE': 'lms-key',
- 'JWT_ISSUER': f'{LMS_ROOT_URL}/oauth2',
+ 'JWT_ISSUER': '{}/oauth2'.format(LMS_ROOT_URL),
'JWT_ISSUERS': [{
'AUDIENCE': 'lms-key',
- 'ISSUER': f'{LMS_ROOT_URL}/oauth2',
+ 'ISSUER': '{}/oauth2'.format(LMS_ROOT_URL),
'SECRET_KEY': 'lms-secret',
}],
'JWT_SECRET_KEY': 'lms-secret',
@@ -381,7 +382,7 @@ ENTERPRISE_MARKETING_FOOTER_QUERY_PARAMS = {}
CREDENTIALS_SERVICE_USERNAME = 'credentials_worker'
COURSE_CATALOG_URL_ROOT = 'http://edx.devstack.discovery:18381'
-COURSE_CATALOG_API_URL = f'{COURSE_CATALOG_URL_ROOT}/api/v1'
+COURSE_CATALOG_API_URL = '{}/api/v1'.format(COURSE_CATALOG_URL_ROOT)
SYSTEM_WIDE_ROLE_CLASSES = os.environ.get("SYSTEM_WIDE_ROLE_CLASSES", SYSTEM_WIDE_ROLE_CLASSES)
SYSTEM_WIDE_ROLE_CLASSES.append(
diff --git a/lms/envs/devstack_decentralized.py b/lms/envs/devstack_decentralized.py
index b570ac8994..f288787b1a 100644
--- a/lms/envs/devstack_decentralized.py
+++ b/lms/envs/devstack_decentralized.py
@@ -7,6 +7,7 @@ import logging
from os.path import abspath, dirname, join
from corsheaders.defaults import default_headers as corsheaders_default_headers
+
# pylint: enable=unicode-format-string # lint-amnesty, pylint: disable=bad-option-value
#####################################################################
from edx_django_utils.plugins import add_plugins
@@ -32,9 +33,9 @@ SITE_NAME = LMS_BASE
CELERY_ALWAYS_EAGER = True
HTTPS = 'off'
-LMS_ROOT_URL = f'http://{LMS_BASE}'
+LMS_ROOT_URL = 'http://{}'.format(LMS_BASE)
LMS_INTERNAL_ROOT_URL = LMS_ROOT_URL
-ENTERPRISE_API_URL = f'{LMS_INTERNAL_ROOT_URL}/enterprise/api/v1/'
+ENTERPRISE_API_URL = '{}/enterprise/api/v1/'.format(LMS_INTERNAL_ROOT_URL)
IDA_LOGOUT_URI_LIST = [
'http://localhost:18130/logout/', # ecommerce
'http://localhost:18150/logout/', # credentials
@@ -217,10 +218,10 @@ LOGIN_REDIRECT_WHITELIST = [CMS_BASE]
###################### JWTs ######################
JWT_AUTH.update({
'JWT_AUDIENCE': 'lms-key',
- 'JWT_ISSUER': f'{LMS_ROOT_URL}/oauth2',
+ 'JWT_ISSUER': '{}/oauth2'.format(LMS_ROOT_URL),
'JWT_ISSUERS': [{
'AUDIENCE': 'lms-key',
- 'ISSUER': f'{LMS_ROOT_URL}/oauth2',
+ 'ISSUER': '{}/oauth2'.format(LMS_ROOT_URL),
'SECRET_KEY': 'lms-secret',
}],
'JWT_SECRET_KEY': 'lms-secret',
@@ -320,7 +321,7 @@ ENTERPRISE_MARKETING_FOOTER_QUERY_PARAMS = {}
CREDENTIALS_SERVICE_USERNAME = 'credentials_worker'
COURSE_CATALOG_URL_ROOT = 'http://edx.devstack.discovery:18381'
-COURSE_CATALOG_API_URL = f'{COURSE_CATALOG_URL_ROOT}/api/v1'
+COURSE_CATALOG_API_URL = '{}/api/v1'.format(COURSE_CATALOG_URL_ROOT)
SYSTEM_WIDE_ROLE_CLASSES = os.environ.get("SYSTEM_WIDE_ROLE_CLASSES", SYSTEM_WIDE_ROLE_CLASSES)
SYSTEM_WIDE_ROLE_CLASSES.append(
diff --git a/lms/envs/devstack_optimized.py b/lms/envs/devstack_optimized.py
index bfd67b310e..b8d7cceea3 100644
--- a/lms/envs/devstack_optimized.py
+++ b/lms/envs/devstack_optimized.py
@@ -21,10 +21,9 @@ invoked each time that changes have been made.
import os # lint-amnesty, pylint: disable=unused-import
-from .devstack import * # pylint: disable=wildcard-import
-
########################## Devstack settings ###################################
+from .devstack import * # pylint: disable=wildcard-import
TEST_ROOT = REPO_ROOT / "test_root"
diff --git a/lms/envs/devstack_with_worker.py b/lms/envs/devstack_with_worker.py
index e1669f8f53..3596852757 100644
--- a/lms/envs/devstack_with_worker.py
+++ b/lms/envs/devstack_with_worker.py
@@ -14,6 +14,9 @@ In two separate processes on devstack:
import os # lint-amnesty, pylint: disable=unused-import
+# We intentionally define lots of variables that aren't used, and
+# want to import all variables from base settings files
+# pylint: disable=wildcard-import, unused-wildcard-import
from lms.envs.devstack import *
# Require a separate celery worker
diff --git a/lms/envs/production.py b/lms/envs/production.py
index 133b3e7621..f0b3ed5635 100644
--- a/lms/envs/production.py
+++ b/lms/envs/production.py
@@ -1,3 +1,5 @@
+# -*- coding: utf-8 -*-
+
"""
This is the default template for our main set of AWS servers.
@@ -41,7 +43,7 @@ def get_env_setting(setting):
try:
return os.environ[setting]
except KeyError:
- error_msg = "Set the %s env variable" % setting
+ error_msg = u"Set the %s env variable" % setting
raise ImproperlyConfigured(error_msg) # lint-amnesty, pylint: disable=raise-missing-from
################################ ALWAYS THE SAME ##############################
@@ -133,11 +135,11 @@ CELERYD_PREFETCH_MULTIPLIER = 1
QUEUE_VARIANT = CONFIG_PREFIX.lower()
-CELERY_DEFAULT_EXCHANGE = f'edx.{QUEUE_VARIANT}core'
+CELERY_DEFAULT_EXCHANGE = 'edx.{0}core'.format(QUEUE_VARIANT)
-HIGH_PRIORITY_QUEUE = f'edx.{QUEUE_VARIANT}core.high'
-DEFAULT_PRIORITY_QUEUE = f'edx.{QUEUE_VARIANT}core.default'
-HIGH_MEM_QUEUE = f'edx.{QUEUE_VARIANT}core.high_mem'
+HIGH_PRIORITY_QUEUE = 'edx.{0}core.high'.format(QUEUE_VARIANT)
+DEFAULT_PRIORITY_QUEUE = 'edx.{0}core.default'.format(QUEUE_VARIANT)
+HIGH_MEM_QUEUE = 'edx.{0}core.high_mem'.format(QUEUE_VARIANT)
CELERY_DEFAULT_QUEUE = DEFAULT_PRIORITY_QUEUE
CELERY_DEFAULT_ROUTING_KEY = DEFAULT_PRIORITY_QUEUE
@@ -358,7 +360,7 @@ if "TRACKING_IGNORE_URL_PATTERNS" in ENV_TOKENS:
SSL_AUTH_EMAIL_DOMAIN = ENV_TOKENS.get("SSL_AUTH_EMAIL_DOMAIN", "MIT.EDU")
SSL_AUTH_DN_FORMAT_STRING = ENV_TOKENS.get(
"SSL_AUTH_DN_FORMAT_STRING",
- "/C=US/ST=Massachusetts/O=Massachusetts Institute of Technology/OU=Client CA v1/CN={0}/emailAddress={1}"
+ u"/C=US/ST=Massachusetts/O=Massachusetts Institute of Technology/OU=Client CA v1/CN={0}/emailAddress={1}"
)
# Video Caching. Pairing country codes with CDN URLs.
@@ -532,11 +534,11 @@ CELERY_BROKER_VHOST = ENV_TOKENS.get("CELERY_BROKER_VHOST", "")
CELERY_BROKER_USER = AUTH_TOKENS.get("CELERY_BROKER_USER", "")
CELERY_BROKER_PASSWORD = AUTH_TOKENS.get("CELERY_BROKER_PASSWORD", "")
-BROKER_URL = "{}://{}:{}@{}/{}".format(CELERY_BROKER_TRANSPORT,
- CELERY_BROKER_USER,
- CELERY_BROKER_PASSWORD,
- CELERY_BROKER_HOSTNAME,
- CELERY_BROKER_VHOST)
+BROKER_URL = "{0}://{1}:{2}@{3}/{4}".format(CELERY_BROKER_TRANSPORT,
+ CELERY_BROKER_USER,
+ CELERY_BROKER_PASSWORD,
+ CELERY_BROKER_HOSTNAME,
+ CELERY_BROKER_VHOST)
BROKER_USE_SSL = ENV_TOKENS.get('CELERY_BROKER_USE_SSL', False)
BROKER_TRANSPORT_OPTIONS = {
diff --git a/lms/envs/test.py b/lms/envs/test.py
index d217446055..f3f1d3974b 100644
--- a/lms/envs/test.py
+++ b/lms/envs/test.py
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
"""
This config file runs the simplest dev environment using sqlite, and db-based
sessions. Assumes structure:
@@ -17,15 +18,15 @@ import logging
import os
from collections import OrderedDict
from random import choice # lint-amnesty, pylint: disable=unused-import
-from string import ascii_letters, digits, punctuation # lint-amnesty, pylint: disable=unused-import
+from string import digits, ascii_letters, punctuation # lint-amnesty, pylint: disable=unused-import
from uuid import uuid4
import openid.oidutil
from django.utils.translation import ugettext_lazy
from edx_django_utils.plugins import add_plugins
from path import Path as path
+from six.moves import range # lint-amnesty, pylint: disable=unused-import
-from common.djangoapps.util.testing import patch_sessions, patch_testcase # pylint: disable=wrong-import-order
from openedx.core.djangoapps.plugins.constants import ProjectType, SettingsType
from openedx.core.lib.derived import derive_settings
from openedx.core.lib.tempdir import mkdtemp_clean
@@ -33,6 +34,8 @@ from xmodule.modulestore.modulestore_settings import update_module_store_setting
from .common import *
+from common.djangoapps.util.testing import patch_sessions, patch_testcase # pylint: disable=wrong-import-order
+
# This patch disables the commit_on_success decorator during tests
# in TestCase subclasses.
patch_testcase()
@@ -127,7 +130,7 @@ COMMENTS_SERVICE_URL = 'http://localhost:4567'
DJFS = {
'type': 'osfs',
- 'directory_root': f'{DATA_DIR}/django-pyfs/static/django-pyfs',
+ 'directory_root': '{}/django-pyfs/static/django-pyfs'.format(DATA_DIR),
'url_root': '/static/django-pyfs',
}
@@ -165,7 +168,7 @@ update_module_store_settings(
doc_store_settings={
'host': MONGO_HOST,
'port': MONGO_PORT_NUM,
- 'db': f'test_xmodule_{THIS_UUID}',
+ 'db': 'test_xmodule_{}'.format(THIS_UUID),
'collection': 'test_modulestore',
},
)
@@ -174,7 +177,7 @@ CONTENTSTORE = {
'ENGINE': 'xmodule.contentstore.mongo.MongoContentStore',
'DOC_STORE_CONFIG': {
'host': MONGO_HOST,
- 'db': f'test_xcontent_{THIS_UUID}',
+ 'db': 'test_xcontent_{}'.format(THIS_UUID),
'port': MONGO_PORT_NUM,
}
}
@@ -381,8 +384,8 @@ openid.oidutil.log = lambda message, level=0: None
# Include a non-ascii character in PLATFORM_NAME and PLATFORM_DESCRIPTION to uncover possible
# UnicodeEncodeErrors in tests. Also use lazy text to reveal possible json dumps errors
-PLATFORM_NAME = ugettext_lazy("édX")
-PLATFORM_DESCRIPTION = ugettext_lazy("Open édX Platform")
+PLATFORM_NAME = ugettext_lazy(u"édX")
+PLATFORM_DESCRIPTION = ugettext_lazy(u"Open édX Platform")
SITE_NAME = "edx.org"
@@ -475,7 +478,7 @@ COURSE_BLOCKS_API_EXTRA_FIELDS = [
]
COURSE_CATALOG_URL_ROOT = 'https://catalog.example.com'
-COURSE_CATALOG_API_URL = f'{COURSE_CATALOG_URL_ROOT}/api/v1'
+COURSE_CATALOG_API_URL = '{}/api/v1'.format(COURSE_CATALOG_URL_ROOT)
COMPREHENSIVE_THEME_DIRS = [REPO_ROOT / "themes", REPO_ROOT / "common/test"]
COMPREHENSIVE_THEME_LOCALE_PATHS = [REPO_ROOT / "themes/conf/locale", ]
diff --git a/lms/lib/courseware_search/lms_filter_generator.py b/lms/lib/courseware_search/lms_filter_generator.py
index fe753c9269..b517c24f42 100644
--- a/lms/lib/courseware_search/lms_filter_generator.py
+++ b/lms/lib/courseware_search/lms_filter_generator.py
@@ -7,10 +7,10 @@ This file contains implementation override of SearchFilterGenerator which will a
import six
from search.filter_generator import SearchFilterGenerator
-from common.djangoapps.student.models import CourseEnrollment
from openedx.core.djangoapps.course_groups.partition_scheme import CohortPartitionScheme
from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers
from openedx.core.djangoapps.user_api.partition_schemes import RandomUserPartitionScheme
+from common.djangoapps.student.models import CourseEnrollment
INCLUDE_SCHEMES = [CohortPartitionScheme, RandomUserPartitionScheme, ]
SCHEME_SUPPORTS_ASSIGNMENT = [RandomUserPartitionScheme, ]
@@ -29,12 +29,12 @@ class LmsSearchFilterGenerator(SearchFilterGenerator):
def field_dictionary(self, **kwargs):
""" add course if provided otherwise add courses in which the user is enrolled in """
- field_dictionary = super().field_dictionary(**kwargs)
+ field_dictionary = super(LmsSearchFilterGenerator, self).field_dictionary(**kwargs) # lint-amnesty, pylint: disable=super-with-arguments
if not kwargs.get('user'):
field_dictionary['course'] = []
elif not kwargs.get('course_id'):
user_enrollments = self._enrollments_for_user(kwargs['user'])
- field_dictionary['course'] = [str(enrollment.course_id) for enrollment in user_enrollments]
+ field_dictionary['course'] = [six.text_type(enrollment.course_id) for enrollment in user_enrollments]
# if we have an org filter, only include results for this org filter
course_org_filter = configuration_helpers.get_current_site_orgs()
@@ -47,7 +47,7 @@ class LmsSearchFilterGenerator(SearchFilterGenerator):
"""
Exclude any courses defined outside the current org.
"""
- exclude_dictionary = super().exclude_dictionary(**kwargs)
+ exclude_dictionary = super(LmsSearchFilterGenerator, self).exclude_dictionary(**kwargs) # lint-amnesty, pylint: disable=super-with-arguments
course_org_filter = configuration_helpers.get_current_site_orgs()
# If we have a course filter we are ensuring that we only get those courses above
if not course_org_filter:
diff --git a/lms/lib/courseware_search/test/test_lms_filter_generator.py b/lms/lib/courseware_search/test/test_lms_filter_generator.py
index 26289e314b..46745b56f4 100644
--- a/lms/lib/courseware_search/test/test_lms_filter_generator.py
+++ b/lms/lib/courseware_search/test/test_lms_filter_generator.py
@@ -3,13 +3,12 @@ Tests for the lms_filter_generator
"""
-from unittest.mock import Mock, patch
-
import six
+from mock import Mock, patch
+from lms.lib.courseware_search.lms_filter_generator import LmsSearchFilterGenerator
from common.djangoapps.student.models import CourseEnrollment
from common.djangoapps.student.tests.factories import UserFactory
-from lms.lib.courseware_search.lms_filter_generator import LmsSearchFilterGenerator
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory
@@ -53,7 +52,7 @@ class LmsSearchFilterGeneratorTestCase(ModuleStoreTestCase):
)
def setUp(self):
- super().setUp()
+ super(LmsSearchFilterGeneratorTestCase, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.build_courses()
self.user = UserFactory.create(username="jack", email="jack@fake.edx.org", password='test')
@@ -67,8 +66,8 @@ class LmsSearchFilterGeneratorTestCase(ModuleStoreTestCase):
field_dictionary, filter_dictionary, _ = LmsSearchFilterGenerator.generate_field_filters(user=self.user)
assert 'start_date' in filter_dictionary
- assert str(self.courses[0].id) in field_dictionary['course']
- assert str(self.courses[1].id) in field_dictionary['course']
+ assert six.text_type(self.courses[0].id) in field_dictionary['course']
+ assert six.text_type(self.courses[1].id) in field_dictionary['course']
def test_course_id_provided(self):
"""
@@ -76,11 +75,11 @@ class LmsSearchFilterGeneratorTestCase(ModuleStoreTestCase):
"""
field_dictionary, filter_dictionary, _ = LmsSearchFilterGenerator.generate_field_filters(
user=self.user,
- course_id=str(self.courses[0].id)
+ course_id=six.text_type(self.courses[0].id)
)
assert 'start_date' in filter_dictionary
- assert str(self.courses[0].id) == field_dictionary['course']
+ assert six.text_type(self.courses[0].id) == field_dictionary['course']
def test_user_not_provided(self):
"""
diff --git a/lms/lib/courseware_search/test/test_lms_result_processor.py b/lms/lib/courseware_search/test/test_lms_result_processor.py
index 6464e9b037..f58ffd3577 100644
--- a/lms/lib/courseware_search/test/test_lms_result_processor.py
+++ b/lms/lib/courseware_search/test/test_lms_result_processor.py
@@ -3,6 +3,7 @@ Tests for the lms_result_processor
"""
+import six
import pytest
from lms.djangoapps.courseware.tests.factories import UserFactory
@@ -63,7 +64,7 @@ class LmsSearchResultProcessorTestCase(ModuleStoreTestCase):
)
def setUp(self):
- super().setUp()
+ super(LmsSearchResultProcessorTestCase, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.build_course()
def test_url_parameter(self):
@@ -75,15 +76,15 @@ class LmsSearchResultProcessorTestCase(ModuleStoreTestCase):
srp = LmsSearchResultProcessor(
{
- "course": str(self.course.id),
- "id": str(self.html.scope_ids.usage_id),
+ "course": six.text_type(self.course.id),
+ "id": six.text_type(self.html.scope_ids.usage_id),
"content": {"text": "This is the html text"}
},
"test"
)
- assert srp.url == '/courses/{}/jump_to/{}'.format(str(self.course.id),
- str(self.html.scope_ids.usage_id))
+ assert srp.url == '/courses/{}/jump_to/{}'.format(six.text_type(self.course.id),
+ six.text_type(self.html.scope_ids.usage_id))
def test_should_remove(self):
"""
@@ -91,8 +92,8 @@ class LmsSearchResultProcessorTestCase(ModuleStoreTestCase):
"""
srp = LmsSearchResultProcessor(
{
- "course": str(self.course.id),
- "id": str(self.html.scope_ids.usage_id),
+ "course": six.text_type(self.course.id),
+ "id": six.text_type(self.html.scope_ids.usage_id),
"content": {"text": "This is html test text"}
},
"test"
diff --git a/lms/lib/tests/test_utils.py b/lms/lib/tests/test_utils.py
index 01c2e00e2f..ef5776ecd0 100644
--- a/lms/lib/tests/test_utils.py
+++ b/lms/lib/tests/test_utils.py
@@ -18,7 +18,7 @@ class LmsUtilsTest(ModuleStoreTestCase):
"""
Setup a dummy course content.
"""
- super().setUp()
+ super(LmsUtilsTest, self).setUp()
with self.store.default_store(ModuleStoreEnum.Type.mongo):
self.course = CourseFactory.create()
diff --git a/lms/lib/xblock/test/test_mixin.py b/lms/lib/xblock/test/test_mixin.py
index 8a3a005e0b..058fd0f2aa 100644
--- a/lms/lib/xblock/test/test_mixin.py
+++ b/lms/lib/xblock/test/test_mixin.py
@@ -70,7 +70,7 @@ class XBlockValidationTest(LmsXBlockMixinTestCase):
Unit tests for XBlock validation
"""
def setUp(self):
- super().setUp()
+ super(XBlockValidationTest, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.build_course()
def verify_validation_message(self, message, expected_message, expected_message_type):
@@ -280,7 +280,7 @@ class OpenAssessmentBlockMixinTestCase(ModuleStoreTestCase):
"""
def setUp(self):
- super().setUp()
+ super(OpenAssessmentBlockMixinTestCase, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.course = CourseFactory.create()
self.section = ItemFactory.create(parent=self.course, category='chapter', display_name='Test Section')
self.open_assessment = ItemFactory.create(
@@ -378,7 +378,7 @@ def ddt_named(parent, child):
Helper to get more readable dynamically-generated test names from ddt.
"""
args = RenamedTuple([parent, child])
- args.__name__ = f'parent_{parent}_child_{child}' # pylint: disable=attribute-defined-outside-init
+ args.__name__ = 'parent_{}_child_{}'.format(parent, child) # pylint: disable=attribute-defined-outside-init
return args
@@ -406,7 +406,7 @@ class XBlockMergedGroupAccessTest(LmsXBlockMixinTestCase):
)
def setUp(self):
- super().setUp()
+ super(XBlockMergedGroupAccessTest, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.build_course()
def verify_group_access(self, block_location, expected_dict):
diff --git a/lms/tests.py b/lms/tests.py
index b02a364b87..7785abe0ba 100644
--- a/lms/tests.py
+++ b/lms/tests.py
@@ -4,6 +4,7 @@
import logging
import mimetypes
+from django.conf import settings # lint-amnesty, pylint: disable=unused-import
from django.test import TestCase
log = logging.getLogger(__name__)
diff --git a/lms/urls.py b/lms/urls.py
index 5642b9d0ba..5e9f0a523b 100644
--- a/lms/urls.py
+++ b/lms/urls.py
@@ -14,9 +14,8 @@ from edx_api_doc_tools import make_docs_urls
from edx_django_utils.plugins import get_plugin_url_patterns
from ratelimitbackend import admin
-from common.djangoapps.student import views as student_views
-from common.djangoapps.util import views as util_views
from lms.djangoapps.branding import views as branding_views
+from lms.djangoapps.debug import views as debug_views
from lms.djangoapps.certificates import views as certificates_views
from lms.djangoapps.courseware.masquerade import MasqueradeView
from lms.djangoapps.courseware.module_render import (
@@ -28,14 +27,13 @@ from lms.djangoapps.courseware.module_render import (
from lms.djangoapps.courseware.views import views as courseware_views
from lms.djangoapps.courseware.views.index import CoursewareIndex
from lms.djangoapps.courseware.views.views import CourseTabView, EnrollStaffView, StaticCourseTabView
-from lms.djangoapps.debug import views as debug_views
from lms.djangoapps.discussion import views as discussion_views
from lms.djangoapps.discussion.config.settings import is_forum_daily_digest_enabled
from lms.djangoapps.discussion.notification_prefs import views as notification_prefs_views
from lms.djangoapps.instructor.views import instructor_dashboard as instructor_dashboard_views
from lms.djangoapps.instructor_task import views as instructor_task_views
-from lms.djangoapps.static_template_view import views as static_template_view_views
from lms.djangoapps.staticbook import views as staticbook_views
+from lms.djangoapps.static_template_view import views as static_template_view_views
from openedx.core.apidocs import api_info
from openedx.core.djangoapps.auth_exchange.views import LoginWithAccessTokenView
from openedx.core.djangoapps.catalog.models import CatalogIntegration
@@ -54,6 +52,8 @@ from openedx.core.djangoapps.site_configuration import helpers as configuration_
from openedx.core.djangoapps.user_authn.views.login import redirect_to_lms_login
from openedx.core.djangoapps.verified_track_content import views as verified_track_content_views
from openedx.features.enterprise_support.api import enterprise_enabled
+from common.djangoapps.student import views as student_views
+from common.djangoapps.util import views as util_views
RESET_COURSE_DEADLINES_NAME = 'reset_course_deadlines'
RENDER_XBLOCK_NAME = 'render_xblock'
@@ -256,9 +256,9 @@ if settings.WIKI_ENABLED:
# These urls are for viewing the wiki in the context of a course. They should
# never be returned by a reverse() so they come after the other url patterns
- url(fr'^courses/{settings.COURSE_ID_PATTERN}/course_wiki/?$',
+ url(r'^courses/{}/course_wiki/?$'.format(settings.COURSE_ID_PATTERN),
course_wiki_views.course_wiki_redirect, name='course_wiki'),
- url(fr'^courses/{settings.COURSE_KEY_REGEX}/wiki/',
+ url(r'^courses/{}/wiki/'.format(settings.COURSE_KEY_REGEX),
include((wiki_url_patterns, 'course_wiki_do_not_reverse'), namespace='course_wiki_do_not_reverse')),
]
@@ -314,7 +314,7 @@ urlpatterns += [
# passed as a 'view' parameter to the URL.
# Note: This is not an API. Compare this with the xblock_view API above.
url(
- fr'^xblock/{settings.USAGE_KEY_PATTERN}$',
+ r'^xblock/{usage_key_string}$'.format(usage_key_string=settings.USAGE_KEY_PATTERN),
courseware_views.render_xblock,
name=RENDER_XBLOCK_NAME,
),
@@ -664,7 +664,7 @@ urlpatterns += [
# Calendar Sync UI in LMS
url(
- fr'^courses/{settings.COURSE_ID_PATTERN}/',
+ r'^courses/{}/'.format(settings.COURSE_ID_PATTERN,),
include('openedx.features.calendar_sync.urls'),
),
@@ -912,7 +912,7 @@ urlpatterns += [
# Custom courses on edX (CCX) URLs
if settings.FEATURES.get('CUSTOM_COURSES_EDX'):
urlpatterns += [
- url(fr'^courses/{settings.COURSE_ID_PATTERN}/',
+ url(r'^courses/{}/'.format(settings.COURSE_ID_PATTERN),
include('lms.djangoapps.ccx.urls')),
url(r'^api/ccx/', include(('lms.djangoapps.ccx.api.urls', 'lms.djangoapps.ccx'), namespace='ccx_api')),
]
diff --git a/lms/wsgi.py b/lms/wsgi.py
index 2e16f258bc..5fc9188f63 100644
--- a/lms/wsgi.py
+++ b/lms/wsgi.py
@@ -8,32 +8,28 @@ It exposes a module-level variable named ``application``. Django's
``WSGI_APPLICATION`` setting.
"""
-import os # lint-amnesty, pylint: disable=wrong-import-order, wrong-import-position
+# Patch the xml libs
+from safe_lxml import defuse_xml_libs
+defuse_xml_libs()
# Disable PyContract contract checking when running as a webserver
import contracts # lint-amnesty, pylint: disable=wrong-import-order, wrong-import-position
-# This application object is used by the development server
-# as well as any WSGI server configured to use this file.
-from django.core.wsgi import \
- get_wsgi_application # lint-amnesty, pylint: disable=wrong-import-order, wrong-import-position
-
-import lms.startup as startup # lint-amnesty, pylint: disable=wrong-import-position
-# Patch the xml libs
-from safe_lxml import defuse_xml_libs
-from xmodule.modulestore.django import modulestore # lint-amnesty, pylint: disable=wrong-import-position
-
-defuse_xml_libs()
-
contracts.disable_all()
+import os # lint-amnesty, pylint: disable=wrong-import-order, wrong-import-position
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "lms.envs.aws")
+import lms.startup as startup # lint-amnesty, pylint: disable=wrong-import-position
startup.run()
+from xmodule.modulestore.django import modulestore # lint-amnesty, pylint: disable=wrong-import-position
# Trigger a forced initialization of our modulestores since this can take a
# while to complete and we want this done before HTTP requests are accepted.
modulestore()
+# This application object is used by the development server
+# as well as any WSGI server configured to use this file.
+from django.core.wsgi import get_wsgi_application # lint-amnesty, pylint: disable=wrong-import-order, wrong-import-position
application = get_wsgi_application()
diff --git a/lms/wsgi_apache_lms.py b/lms/wsgi_apache_lms.py
index d7d63999f8..00eaac9bb0 100644
--- a/lms/wsgi_apache_lms.py
+++ b/lms/wsgi_apache_lms.py
@@ -5,23 +5,19 @@ This module contains the WSGI application used for Apache deployment.
It exposes a module-level variable named ``application``.
"""
-import os # lint-amnesty, pylint: disable=wrong-import-order, wrong-import-position
-
-# This application object is used by the development server
-# as well as any WSGI server configured to use this file.
-from django.core.wsgi import \
- get_wsgi_application # lint-amnesty, pylint: disable=wrong-import-order, wrong-import-position
-
-import lms.startup as startup # lint-amnesty, pylint: disable=wrong-import-position
# Patch the xml libs before anything else.
from safe_lxml import defuse_xml_libs
-
defuse_xml_libs()
+import os # lint-amnesty, pylint: disable=wrong-import-order, wrong-import-position
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "lms.envs.aws")
os.environ.setdefault("SERVICE_VARIANT", "lms")
+import lms.startup as startup # lint-amnesty, pylint: disable=wrong-import-position
startup.run()
+# This application object is used by the development server
+# as well as any WSGI server configured to use this file.
+from django.core.wsgi import get_wsgi_application # lint-amnesty, pylint: disable=wrong-import-order, wrong-import-position
application = get_wsgi_application() # pylint: disable=invalid-name
From 7d697cfd9c1dfa1d005b0cc480187dc54b65f95a Mon Sep 17 00:00:00 2001
From: Michael Roytman
Date: Mon, 22 Feb 2021 13:58:37 -0500
Subject: [PATCH 21/74] feat: bump version of edx-proctoring library to 3.6.2:
change "proctoring_started" to "onboarding_started" in Student Onboarding
Status panel, make time_remaining_seconds model field read only, and fix
message bug on the Django admin panel for ProctoredExamStudentAttempt model
This release changes learner onboarding status from "proctoring_started" to "onboarding_started" to more clearly describe the learner's onboarding status in the Instructor Dashboard Student Onboarding Status panel. This impacts course authors, developers, and operators.
This release adds the time_remaining_seconds field of ProctoredExamStudentAttempt model to readonly_fields in Django admin page so it is not required when editing the model. This impacts developers.
This release updates reference to Exception.message to use string representation of the exception, as message is no longer an attribute of the Exception class. This impacts developers.
---
requirements/edx/base.txt | 2 +-
requirements/edx/development.txt | 2 +-
requirements/edx/testing.txt | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt
index 60a30604cb..1f52da3c90 100644
--- a/requirements/edx/base.txt
+++ b/requirements/edx/base.txt
@@ -106,7 +106,7 @@ edx-milestones==0.3.0 # via -r requirements/edx/base.in
edx-opaque-keys[django]==2.2.0 # via -r requirements/edx/paver.txt, edx-bulk-grades, edx-ccx-keys, edx-completion, edx-drf-extensions, edx-enterprise, edx-milestones, edx-organizations, edx-proctoring, edx-user-state-client, edx-when, lti-consumer-xblock, xmodule
edx-organizations==6.9.0 # via -r requirements/edx/base.in
edx-proctoring-proctortrack==1.0.5 # via -r requirements/edx/base.in
-edx-proctoring==3.6.0 # via -r requirements/edx/base.in, edx-proctoring-proctortrack
+edx-proctoring==3.6.2 # via -r requirements/edx/base.in, edx-proctoring-proctortrack
edx-rbac==1.4.1 # via edx-enterprise
edx-rest-api-client==5.3.0 # via -r requirements/edx/base.in, edx-enterprise, edx-proctoring
edx-search==3.0.0 # via -r requirements/edx/base.in
diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt
index 18f9358e89..6c93938bca 100644
--- a/requirements/edx/development.txt
+++ b/requirements/edx/development.txt
@@ -118,7 +118,7 @@ edx-milestones==0.3.0 # via -r requirements/edx/testing.txt
edx-opaque-keys[django]==2.2.0 # via -r requirements/edx/testing.txt, edx-bulk-grades, edx-ccx-keys, edx-completion, edx-drf-extensions, edx-enterprise, edx-milestones, edx-organizations, edx-proctoring, edx-user-state-client, edx-when, lti-consumer-xblock, xmodule
edx-organizations==6.9.0 # via -r requirements/edx/testing.txt
edx-proctoring-proctortrack==1.0.5 # via -r requirements/edx/testing.txt
-edx-proctoring==3.6.0 # via -r requirements/edx/testing.txt, edx-proctoring-proctortrack
+edx-proctoring==3.6.2 # via -r requirements/edx/testing.txt, edx-proctoring-proctortrack
edx-rbac==1.4.1 # via -r requirements/edx/testing.txt, edx-enterprise
edx-rest-api-client==5.3.0 # via -r requirements/edx/testing.txt, edx-enterprise, edx-proctoring
edx-search==3.0.0 # via -r requirements/edx/testing.txt
diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt
index ffbfe8e372..5c4a1ebac3 100644
--- a/requirements/edx/testing.txt
+++ b/requirements/edx/testing.txt
@@ -115,7 +115,7 @@ edx-milestones==0.3.0 # via -r requirements/edx/base.txt
edx-opaque-keys[django]==2.2.0 # via -r requirements/edx/base.txt, edx-bulk-grades, edx-ccx-keys, edx-completion, edx-drf-extensions, edx-enterprise, edx-milestones, edx-organizations, edx-proctoring, edx-user-state-client, edx-when, lti-consumer-xblock, xmodule
edx-organizations==6.9.0 # via -r requirements/edx/base.txt
edx-proctoring-proctortrack==1.0.5 # via -r requirements/edx/base.txt
-edx-proctoring==3.6.0 # via -r requirements/edx/base.txt, edx-proctoring-proctortrack
+edx-proctoring==3.6.2 # via -r requirements/edx/base.txt, edx-proctoring-proctortrack
edx-rbac==1.4.1 # via -r requirements/edx/base.txt, edx-enterprise
edx-rest-api-client==5.3.0 # via -r requirements/edx/base.txt, edx-enterprise, edx-proctoring
edx-search==3.0.0 # via -r requirements/edx/base.txt
From 2d047b943fa2445aad44ca3473f14c7a460eed5c Mon Sep 17 00:00:00 2001
From: Binod Pant
Date: Tue, 23 Feb 2021 17:07:38 -0500
Subject: [PATCH 22/74] update edx-enterprise (#26687)
---
requirements/constraints.txt | 2 +-
requirements/edx/base.txt | 2 +-
requirements/edx/development.txt | 2 +-
requirements/edx/testing.txt | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/requirements/constraints.txt b/requirements/constraints.txt
index 11134901f8..3b6d1d560f 100644
--- a/requirements/constraints.txt
+++ b/requirements/constraints.txt
@@ -31,7 +31,7 @@ django-storages<1.9
# The team that owns this package will manually bump this package rather than having it pulled in automatically.
# This is to allow them to better control its deployment and to do it in a process that works better
# for them.
-edx-enterprise==3.17.41
+edx-enterprise==3.17.42
# Upgrading to 2.12.0 breaks several test classes due to API changes, need to update our code accordingly
factory-boy==2.8.1
diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt
index 86f49db191..6869d10620 100644
--- a/requirements/edx/base.txt
+++ b/requirements/edx/base.txt
@@ -99,7 +99,7 @@ edx-django-release-util==1.0.0 # via -r requirements/edx/base.in
edx-django-sites-extensions==3.0.0 # via -r requirements/edx/base.in
edx-django-utils==3.13.0 # via -r requirements/edx/base.in, django-config-models, edx-drf-extensions, edx-enterprise, edx-rest-api-client, edx-toggles, edx-when, ora2, super-csv
edx-drf-extensions==6.5.0 # via -r requirements/edx/base.in, edx-completion, edx-enterprise, edx-organizations, edx-proctoring, edx-rbac, edx-when, edxval
-edx-enterprise==3.17.41 # via -c requirements/edx/../constraints.txt, -r requirements/edx/base.in
+edx-enterprise==3.17.42 # via -c requirements/edx/../constraints.txt, -r requirements/edx/base.in
edx-event-routing-backends==4.0.1 # via -r requirements/edx/base.in
edx-i18n-tools==0.5.3 # via ora2
edx-milestones==0.3.0 # via -r requirements/edx/base.in
diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt
index 18a44ec614..e1ebe1224b 100644
--- a/requirements/edx/development.txt
+++ b/requirements/edx/development.txt
@@ -110,7 +110,7 @@ edx-django-release-util==1.0.0 # via -r requirements/edx/testing.txt
edx-django-sites-extensions==3.0.0 # via -r requirements/edx/testing.txt
edx-django-utils==3.13.0 # via -r requirements/edx/testing.txt, django-config-models, edx-drf-extensions, edx-enterprise, edx-rest-api-client, edx-toggles, edx-when, ora2, super-csv
edx-drf-extensions==6.5.0 # via -r requirements/edx/testing.txt, edx-completion, edx-enterprise, edx-organizations, edx-proctoring, edx-rbac, edx-when, edxval
-edx-enterprise==3.17.41 # via -c requirements/edx/../constraints.txt, -r requirements/edx/testing.txt
+edx-enterprise==3.17.42 # via -c requirements/edx/../constraints.txt, -r requirements/edx/testing.txt
edx-event-routing-backends==4.0.1 # via -r requirements/edx/testing.txt
edx-i18n-tools==0.5.3 # via -r requirements/edx/testing.txt, ora2
edx-lint==4.0.1 # via -r requirements/edx/testing.txt
diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt
index 06f6141bf9..bd8e925601 100644
--- a/requirements/edx/testing.txt
+++ b/requirements/edx/testing.txt
@@ -107,7 +107,7 @@ edx-django-release-util==1.0.0 # via -r requirements/edx/base.txt
edx-django-sites-extensions==3.0.0 # via -r requirements/edx/base.txt
edx-django-utils==3.13.0 # via -r requirements/edx/base.txt, django-config-models, edx-drf-extensions, edx-enterprise, edx-rest-api-client, edx-toggles, edx-when, ora2, super-csv
edx-drf-extensions==6.5.0 # via -r requirements/edx/base.txt, edx-completion, edx-enterprise, edx-organizations, edx-proctoring, edx-rbac, edx-when, edxval
-edx-enterprise==3.17.41 # via -c requirements/edx/../constraints.txt, -r requirements/edx/base.txt
+edx-enterprise==3.17.42 # via -c requirements/edx/../constraints.txt, -r requirements/edx/base.txt
edx-event-routing-backends==4.0.1 # via -r requirements/edx/base.txt
edx-i18n-tools==0.5.3 # via -r requirements/edx/base.txt, -r requirements/edx/testing.in, ora2
edx-lint==4.0.1 # via -r requirements/edx/testing.in
From d9ec42c425ffb270d5ccf49e81afb5f130282075 Mon Sep 17 00:00:00 2001
From: Adeel Khan
Date: Thu, 18 Feb 2021 08:20:00 +0500
Subject: [PATCH 23/74] Add throttling to validate token and reset password end
points
VAN-312
---
cms/envs/common.py | 3 ++
cms/envs/test.py | 3 +-
lms/envs/common.py | 2 +
lms/envs/production.py | 4 ++
lms/envs/test.py | 2 +
.../user_authn/views/password_reset.py | 43 +++++++++++++++++++
.../views/tests/test_reset_password.py | 41 ++++++++++++++++++
7 files changed, 97 insertions(+), 1 deletion(-)
diff --git a/cms/envs/common.py b/cms/envs/common.py
index 04c8ee5e52..746f08a5ae 100644
--- a/cms/envs/common.py
+++ b/cms/envs/common.py
@@ -2340,6 +2340,9 @@ DISABLE_DEPRECATED_SIGNUP_URL = False
LOGISTRATION_RATELIMIT_RATE = '100/5m'
LOGISTRATION_PER_EMAIL_RATELIMIT_RATE = '30/5m'
LOGISTRATION_API_RATELIMIT = '20/m'
+RESET_PASSWORD_TOKEN_VALIDATE_API_RATELIMIT = '30/7d'
+RESET_PASSWORD_API_RATELIMIT = '30/7d'
+
##### REGISTRATION RATE LIMIT SETTINGS #####
REGISTRATION_VALIDATION_RATELIMIT = '30/7d'
diff --git a/cms/envs/test.py b/cms/envs/test.py
index 4fd06839f4..09c9919a35 100644
--- a/cms/envs/test.py
+++ b/cms/envs/test.py
@@ -331,7 +331,8 @@ LOGISTRATION_PER_EMAIL_RATELIMIT_RATE = '6/5m'
LOGISTRATION_API_RATELIMIT = '5/m'
REGISTRATION_VALIDATION_RATELIMIT = '5/minute'
-
+RESET_PASSWORD_TOKEN_VALIDATE_API_RATELIMIT = '2/m'
+RESET_PASSWORD_API_RATELIMIT = '2/m'
# Don't tolerate deprecated edx-platform import usage in tests.
ERROR_ON_DEPRECATED_EDX_PLATFORM_IMPORTS = True
diff --git a/lms/envs/common.py b/lms/envs/common.py
index 91fa13247c..8dcd607b53 100644
--- a/lms/envs/common.py
+++ b/lms/envs/common.py
@@ -4370,6 +4370,8 @@ RATELIMIT_RATE = '120/m'
LOGISTRATION_RATELIMIT_RATE = '100/5m'
LOGISTRATION_PER_EMAIL_RATELIMIT_RATE = '30/5m'
LOGISTRATION_API_RATELIMIT = '20/m'
+RESET_PASSWORD_TOKEN_VALIDATE_API_RATELIMIT = '30/7d'
+RESET_PASSWORD_API_RATELIMIT = '30/7d'
##### PASSWORD RESET RATE LIMIT SETTINGS #####
PASSWORD_RESET_IP_RATE = '1/m'
diff --git a/lms/envs/production.py b/lms/envs/production.py
index f0b3ed5635..f76f774f68 100644
--- a/lms/envs/production.py
+++ b/lms/envs/production.py
@@ -605,6 +605,10 @@ MAX_FAILED_LOGIN_ATTEMPTS_LOCKOUT_PERIOD_SECS = ENV_TOKENS.get(
##### LOGISTRATION RATE LIMIT SETTINGS #####
LOGISTRATION_RATELIMIT_RATE = ENV_TOKENS.get('LOGISTRATION_RATELIMIT_RATE', LOGISTRATION_RATELIMIT_RATE)
LOGISTRATION_API_RATELIMIT = ENV_TOKENS.get('LOGISTRATION_API_RATELIMIT', LOGISTRATION_API_RATELIMIT)
+RESET_PASSWORD_TOKEN_VALIDATE_API_RATELIMIT = ENV_TOKENS.get(
+ 'RESET_PASSWORD_TOKEN_VALIDATE_API_RATELIMIT', RESET_PASSWORD_TOKEN_VALIDATE_API_RATELIMIT
+)
+RESET_PASSWORD_API_RATELIMIT = ENV_TOKENS.get('RESET_PASSWORD_API_RATELIMIT', RESET_PASSWORD_API_RATELIMIT)
##### REGISTRATION RATE LIMIT SETTINGS #####
REGISTRATION_VALIDATION_RATELIMIT = ENV_TOKENS.get(
diff --git a/lms/envs/test.py b/lms/envs/test.py
index f3f1d3974b..47583c8d0f 100644
--- a/lms/envs/test.py
+++ b/lms/envs/test.py
@@ -599,6 +599,8 @@ LOGISTRATION_PER_EMAIL_RATELIMIT_RATE = '6/5m'
LOGISTRATION_API_RATELIMIT = '5/m'
REGISTRATION_VALIDATION_RATELIMIT = '5/minute'
+RESET_PASSWORD_TOKEN_VALIDATE_API_RATELIMIT = '2/m'
+RESET_PASSWORD_API_RATELIMIT = '2/m'
# Don't tolerate deprecated edx-platform import usage in tests.
ERROR_ON_DEPRECATED_EDX_PLATFORM_IMPORTS = True
diff --git a/openedx/core/djangoapps/user_authn/views/password_reset.py b/openedx/core/djangoapps/user_authn/views/password_reset.py
index bf6c9da8b9..1f6b2dd425 100644
--- a/openedx/core/djangoapps/user_authn/views/password_reset.py
+++ b/openedx/core/djangoapps/user_authn/views/password_reset.py
@@ -26,6 +26,7 @@ from edx_ace.recipient import Recipient
from eventtracking import tracker
from ratelimit.decorators import ratelimit
from rest_framework.response import Response
+from rest_framework.throttling import AnonRateThrottle
from rest_framework.views import APIView
from common.djangoapps.edxmako.shortcuts import render_to_string
@@ -642,7 +643,35 @@ def password_change_request_handler(request):
return HttpResponseBadRequest(_("No email address provided."))
+def _get_rate(rate):
+ """
+ Given the request rate string, return a two tuple of:
+ ,
+ """
+
+ requests, duration = rate.split('/')
+ num_requests = int(requests)
+ num = int(duration[:-1] if duration[:-1] else 1)
+ symbol = duration[-1:]
+ duration = {'s': 1, 'm': 60, 'h': 3600, 'd': 86400}[symbol] * num
+ return (num_requests, duration)
+
+
+class ResetTokenValidationThrottle(AnonRateThrottle):
+ """
+ Setting rate limit for token validation
+ """
+ rate = settings.RESET_PASSWORD_TOKEN_VALIDATE_API_RATELIMIT
+
+ def parse_rate(self, rate):
+ return _get_rate(rate)
+
+
class PasswordResetTokenValidation(APIView): # lint-amnesty, pylint: disable=missing-class-docstring
+ """
+ API to validate generated password reset token
+ """
+ throttle_classes = [ResetTokenValidationThrottle]
def post(self, request):
""" HTTP end-point to validate password reset token. """
@@ -668,7 +697,21 @@ class PasswordResetTokenValidation(APIView): # lint-amnesty, pylint: disable=mi
return Response({'is_valid': is_valid})
+class PasswordResetThrottle(AnonRateThrottle):
+ """
+ Setting rate limit for password reset
+ """
+ rate = settings.RESET_PASSWORD_API_RATELIMIT
+
+ def parse_rate(self, rate):
+ return _get_rate(rate)
+
+
class LogistrationPasswordResetView(APIView): # lint-amnesty, pylint: disable=missing-class-docstring
+ """
+ API to update new password credentials for a correct token
+ """
+ throttle_classes = [PasswordResetThrottle]
def post(self, request, **kwargs):
""" Reset learner password using passed token and new credentials """
diff --git a/openedx/core/djangoapps/user_authn/views/tests/test_reset_password.py b/openedx/core/djangoapps/user_authn/views/tests/test_reset_password.py
index 0f3798a2b7..bce2154e56 100644
--- a/openedx/core/djangoapps/user_authn/views/tests/test_reset_password.py
+++ b/openedx/core/djangoapps/user_authn/views/tests/test_reset_password.py
@@ -709,6 +709,24 @@ class PasswordResetTokenValidateViewTest(UserAPITestCase):
self.user = User.objects.get(pk=self.user.pk)
assert not self.user.is_active
+ @override_settings(
+ CACHES={
+ 'default': {
+ 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
+ 'LOCATION': 'validate_token',
+ }
+ }
+ )
+ def test_reset_password_token_api_throttle(self):
+ """
+ Test that the reset password token validation endpoint is throttling
+ """
+ for _ in range(int(settings.RESET_PASSWORD_TOKEN_VALIDATE_API_RATELIMIT.split('/')[0])):
+ response = self.client.post(self.url, data={'token': self.token})
+ assert response.status_code != 429
+ response = self.client.post(self.url, data={'token': self.token})
+ assert response.status_code == 429
+
@ddt.ddt
@unittest.skipUnless(
@@ -831,3 +849,26 @@ class ResetPasswordAPITests(EventTestMixin, CacheIsolationTestCase):
assert sent_message.from_email == from_email
assert len(sent_message.to) == 1
assert updated_user.email in sent_message.to[0]
+
+ @override_settings(
+ CACHES={
+ 'default': {
+ 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
+ 'LOCATION': 'reset_password',
+ }
+ }
+ )
+ def test_password_reset_api_throttle(self):
+ """
+ Test that the reset password end point is throttling
+ """
+ path = reverse(
+ "logistration_password_reset",
+ kwargs={"uidb36": self.uidb36, "token": self.token}
+ )
+ request_param = {'new_password1': 'new_password1', 'new_password2': 'new_password1'}
+ for _ in range(int(settings.RESET_PASSWORD_API_RATELIMIT.split('/')[0])):
+ response = self.client.post(path, request_param)
+ assert response.status_code != 429
+ response = self.client.post(path, request_param)
+ assert response.status_code == 429
From 950633a9dfdf9678f253a98afd6075e93cbcecb3 Mon Sep 17 00:00:00 2001
From: Awais Jibran
Date: Wed, 24 Feb 2021 12:05:38 +0500
Subject: [PATCH 24/74] refactor: use q objects when fetching user using an
identifier #26683
---
.../management/commands/show_permissions.py | 12 +++++-------
1 file changed, 5 insertions(+), 7 deletions(-)
diff --git a/lms/djangoapps/discussion/management/commands/show_permissions.py b/lms/djangoapps/discussion/management/commands/show_permissions.py
index 3581a7b6a2..72d1450667 100644
--- a/lms/djangoapps/discussion/management/commands/show_permissions.py
+++ b/lms/djangoapps/discussion/management/commands/show_permissions.py
@@ -3,6 +3,7 @@
from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user
from django.core.management.base import BaseCommand
+from django.db.models import Q
class Command(BaseCommand): # lint-amnesty, pylint: disable=missing-class-docstring
@@ -14,19 +15,16 @@ class Command(BaseCommand): # lint-amnesty, pylint: disable=missing-class-docst
def handle(self, *args, **options):
email_or_username = options['email_or_username']
- try:
- if '@' in email_or_username:
- user = User.objects.get(email=email_or_username)
- else:
- user = User.objects.get(username=email_or_username)
- except User.DoesNotExist:
+
+ user = User.objects.filter(Q(username=email_or_username) | Q(email=email_or_username)).first()
+ if not user:
print(f'User {email_or_username} does not exist. ')
print('Available users: ')
print(User.objects.all())
return
roles = user.roles.all()
- print('{} has %d roles:'.format(user, len(roles)))
+ print(f'{user} has {len(roles)} roles:')
for role in roles:
print(f'\t{role}')
From a9e3d716cf8a1dc2921504cee7f103c58b331707 Mon Sep 17 00:00:00 2001
From: edX cache uploader bot
<35307298+edx-cache-uploader-bot@users.noreply.github.com>
Date: Wed, 24 Feb 2021 03:19:39 -0500
Subject: [PATCH 25/74] Updating Bokchoy testing database cache (#26693)
---
common/test/db_cache/bok_choy_migrations.sha1 | 2 +-
common/test/db_cache/bok_choy_migrations_data_default.sql | 2 +-
.../bok_choy_migrations_data_student_module_history.sql | 2 +-
common/test/db_cache/bok_choy_schema_default.sql | 8 +++++---
.../db_cache/bok_choy_schema_student_module_history.sql | 2 +-
5 files changed, 9 insertions(+), 7 deletions(-)
diff --git a/common/test/db_cache/bok_choy_migrations.sha1 b/common/test/db_cache/bok_choy_migrations.sha1
index 13846898d3..55c4deeabe 100644
--- a/common/test/db_cache/bok_choy_migrations.sha1
+++ b/common/test/db_cache/bok_choy_migrations.sha1
@@ -1 +1 @@
-521f88f382acecc86fb7c9b5128d858a14313b07
\ No newline at end of file
+166b96d5c9a31c3b5356694344a1521597de39cb
\ No newline at end of file
diff --git a/common/test/db_cache/bok_choy_migrations_data_default.sql b/common/test/db_cache/bok_choy_migrations_data_default.sql
index 3f07402dbe..7961b2e902 100644
--- a/common/test/db_cache/bok_choy_migrations_data_default.sql
+++ b/common/test/db_cache/bok_choy_migrations_data_default.sql
@@ -12,7 +12,7 @@
LOCK TABLES `django_migrations` WRITE;
/*!40000 ALTER TABLE `django_migrations` DISABLE KEYS */;
-INSERT INTO `django_migrations` VALUES (1,'contenttypes','0001_initial','2019-02-06 07:56:07.314317'),(2,'auth','0001_initial','2019-02-06 07:56:07.832368'),(3,'admin','0001_initial','2019-02-06 07:56:07.961256'),(4,'admin','0002_logentry_remove_auto_add','2019-02-06 07:56:08.013912'),(5,'sites','0001_initial','2019-02-06 07:56:08.072888'),(6,'contenttypes','0002_remove_content_type_name','2019-02-06 07:56:08.230528'),(7,'api_admin','0001_initial','2019-02-06 07:56:08.454101'),(8,'api_admin','0002_auto_20160325_1604','2019-02-06 07:56:08.533622'),(9,'api_admin','0003_auto_20160404_1618','2019-02-06 07:56:08.983603'),(10,'api_admin','0004_auto_20160412_1506','2019-02-06 07:56:09.311723'),(11,'api_admin','0005_auto_20160414_1232','2019-02-06 07:56:09.410291'),(12,'api_admin','0006_catalog','2019-02-06 07:56:09.439372'),(13,'api_admin','0007_delete_historical_api_records','2019-02-06 07:56:09.673117'),(14,'assessment','0001_initial','2019-02-06 07:56:11.477983'),(15,'assessment','0002_staffworkflow','2019-02-06 07:56:11.625937'),(16,'assessment','0003_expand_course_id','2019-02-06 07:56:11.815858'),(17,'auth','0002_alter_permission_name_max_length','2019-02-06 07:56:11.891156'),(18,'auth','0003_alter_user_email_max_length','2019-02-06 07:56:11.975525'),(19,'auth','0004_alter_user_username_opts','2019-02-06 07:56:12.013750'),(20,'auth','0005_alter_user_last_login_null','2019-02-06 07:56:12.096481'),(21,'auth','0006_require_contenttypes_0002','2019-02-06 07:56:12.108286'),(22,'auth','0007_alter_validators_add_error_messages','2019-02-06 07:56:12.164989'),(23,'auth','0008_alter_user_username_max_length','2019-02-06 07:56:12.240860'),(24,'instructor_task','0001_initial','2019-02-06 07:56:12.395820'),(25,'certificates','0001_initial','2019-02-06 07:56:13.480164'),(26,'certificates','0002_data__certificatehtmlviewconfiguration_data','2019-02-06 07:56:13.607503'),(27,'certificates','0003_data__default_modes','2019-02-06 07:56:13.751659'),(28,'certificates','0004_certificategenerationhistory','2019-02-06 07:56:13.904399'),(29,'certificates','0005_auto_20151208_0801','2019-02-06 07:56:13.986383'),(30,'certificates','0006_certificatetemplateasset_asset_slug','2019-02-06 07:56:14.058304'),(31,'certificates','0007_certificateinvalidation','2019-02-06 07:56:14.210453'),(32,'badges','0001_initial','2019-02-06 07:56:14.782804'),(33,'badges','0002_data__migrate_assertions','2019-02-06 07:56:15.175628'),(34,'badges','0003_schema__add_event_configuration','2019-02-06 07:56:15.324266'),(35,'block_structure','0001_config','2019-02-06 07:56:15.455000'),(36,'block_structure','0002_blockstructuremodel','2019-02-06 07:56:15.522120'),(37,'block_structure','0003_blockstructuremodel_storage','2019-02-06 07:56:15.564915'),(38,'block_structure','0004_blockstructuremodel_usagekeywithrun','2019-02-06 07:56:15.616240'),(39,'bookmarks','0001_initial','2019-02-06 07:56:16.017402'),(40,'branding','0001_initial','2019-02-06 07:56:16.267188'),(41,'course_modes','0001_initial','2019-02-06 07:56:16.438443'),(42,'course_modes','0002_coursemode_expiration_datetime_is_explicit','2019-02-06 07:56:16.519337'),(43,'course_modes','0003_auto_20151113_1443','2019-02-06 07:56:16.576659'),(44,'course_modes','0004_auto_20151113_1457','2019-02-06 07:56:16.732369'),(45,'course_modes','0005_auto_20151217_0958','2019-02-06 07:56:16.788036'),(46,'course_modes','0006_auto_20160208_1407','2019-02-06 07:56:16.883873'),(47,'course_modes','0007_coursemode_bulk_sku','2019-02-06 07:56:17.029222'),(48,'course_groups','0001_initial','2019-02-06 07:56:18.181254'),(49,'bulk_email','0001_initial','2019-02-06 07:56:18.660435'),(50,'bulk_email','0002_data__load_course_email_template','2019-02-06 07:56:18.937143'),(51,'bulk_email','0003_config_model_feature_flag','2019-02-06 07:56:19.093038'),(52,'bulk_email','0004_add_email_targets','2019-02-06 07:56:19.788595'),(53,'bulk_email','0005_move_target_data','2019-02-06 07:56:19.959402'),(54,'bulk_email','0006_course_mode_targets','2019-02-06 07:56:20.165336'),(55,'catalog','0001_initial','2019-02-06 07:56:20.308745'),(56,'catalog','0002_catalogintegration_username','2019-02-06 07:56:20.439737'),(57,'catalog','0003_catalogintegration_page_size','2019-02-06 07:56:20.584307'),(58,'catalog','0004_auto_20170616_0618','2019-02-06 07:56:20.692298'),(59,'catalog','0005_catalogintegration_long_term_cache_ttl','2019-02-06 07:56:20.821560'),(60,'django_comment_common','0001_initial','2019-02-06 07:56:21.271577'),(61,'django_comment_common','0002_forumsconfig','2019-02-06 07:56:21.463632'),(62,'verified_track_content','0001_initial','2019-02-06 07:56:21.537783'),(63,'course_overviews','0001_initial','2019-02-06 07:56:21.715657'),(64,'course_overviews','0002_add_course_catalog_fields','2019-02-06 07:56:21.984772'),(65,'course_overviews','0003_courseoverviewgeneratedhistory','2019-02-06 07:56:22.053252'),(66,'course_overviews','0004_courseoverview_org','2019-02-06 07:56:22.134954'),(67,'course_overviews','0005_delete_courseoverviewgeneratedhistory','2019-02-06 07:56:22.184071'),(68,'course_overviews','0006_courseoverviewimageset','2019-02-06 07:56:22.290455'),(69,'course_overviews','0007_courseoverviewimageconfig','2019-02-06 07:56:22.466348'),(70,'course_overviews','0008_remove_courseoverview_facebook_url','2019-02-06 07:56:22.484576'),(71,'course_overviews','0009_readd_facebook_url','2019-02-06 07:56:22.501725'),(72,'course_overviews','0010_auto_20160329_2317','2019-02-06 07:56:22.645825'),(73,'ccx','0001_initial','2019-02-06 07:56:23.183002'),(74,'ccx','0002_customcourseforedx_structure_json','2019-02-06 07:56:23.289052'),(75,'ccx','0003_add_master_course_staff_in_ccx','2019-02-06 07:56:23.840989'),(76,'ccx','0004_seed_forum_roles_in_ccx_courses','2019-02-06 07:56:23.988777'),(77,'ccx','0005_change_ccx_coach_to_staff','2019-02-06 07:56:24.160387'),(78,'ccx','0006_set_display_name_as_override','2019-02-06 07:56:24.337876'),(79,'ccxcon','0001_initial_ccxcon_model','2019-02-06 07:56:24.409092'),(80,'ccxcon','0002_auto_20160325_0407','2019-02-06 07:56:24.470172'),(81,'djcelery','0001_initial','2019-02-06 07:56:25.046777'),(82,'celery_utils','0001_initial','2019-02-06 07:56:25.165469'),(83,'celery_utils','0002_chordable_django_backend','2019-02-06 07:56:25.339734'),(84,'certificates','0008_schema__remove_badges','2019-02-06 07:56:25.535263'),(85,'certificates','0009_certificategenerationcoursesetting_language_self_generation','2019-02-06 07:56:25.851268'),(86,'certificates','0010_certificatetemplate_language','2019-02-06 07:56:25.927039'),(87,'certificates','0011_certificatetemplate_alter_unique','2019-02-06 07:56:26.154544'),(88,'certificates','0012_certificategenerationcoursesetting_include_hours_of_effort','2019-02-06 07:56:26.228554'),(89,'certificates','0013_remove_certificategenerationcoursesetting_enabled','2019-02-06 07:56:26.310926'),(90,'certificates','0014_change_eligible_certs_manager','2019-02-06 07:56:26.373051'),(91,'commerce','0001_data__add_ecommerce_service_user','2019-02-06 07:56:26.595906'),(92,'commerce','0002_commerceconfiguration','2019-02-06 07:56:26.698815'),(93,'commerce','0003_auto_20160329_0709','2019-02-06 07:56:26.761254'),(94,'commerce','0004_auto_20160531_0950','2019-02-06 07:56:27.150989'),(95,'commerce','0005_commerceconfiguration_enable_automatic_refund_approval','2019-02-06 07:56:27.241421'),(96,'commerce','0006_auto_20170424_1734','2019-02-06 07:56:27.316222'),(97,'commerce','0007_auto_20180313_0609','2019-02-06 07:56:27.466841'),(98,'completion','0001_initial','2019-02-06 07:56:27.696977'),(99,'completion','0002_auto_20180125_1510','2019-02-06 07:56:27.757853'),(100,'enterprise','0001_initial','2019-02-06 07:56:28.027244'),(101,'enterprise','0002_enterprisecustomerbrandingconfiguration','2019-02-06 07:56:28.117647'),(102,'enterprise','0003_auto_20161104_0937','2019-02-06 07:56:28.428631'),(103,'enterprise','0004_auto_20161114_0434','2019-02-06 07:56:28.594141'),(104,'enterprise','0005_pendingenterprisecustomeruser','2019-02-06 07:56:28.710577'),(105,'enterprise','0006_auto_20161121_0241','2019-02-06 07:56:28.775663'),(106,'enterprise','0007_auto_20161109_1511','2019-02-06 07:56:28.924039'),(107,'enterprise','0008_auto_20161124_2355','2019-02-06 07:56:29.200628'),(108,'enterprise','0009_auto_20161130_1651','2019-02-06 07:56:29.740933'),(109,'enterprise','0010_auto_20161222_1212','2019-02-06 07:56:29.889801'),(110,'enterprise','0011_enterprisecustomerentitlement_historicalenterprisecustomerentitlement','2019-02-06 07:56:30.134143'),(111,'enterprise','0012_auto_20170125_1033','2019-02-06 07:56:30.264122'),(112,'enterprise','0013_auto_20170125_1157','2019-02-06 07:56:30.893749'),(113,'enterprise','0014_enrollmentnotificationemailtemplate_historicalenrollmentnotificationemailtemplate','2019-02-06 07:56:31.215731'),(114,'enterprise','0015_auto_20170130_0003','2019-02-06 07:56:31.450278'),(115,'enterprise','0016_auto_20170405_0647','2019-02-06 07:56:32.231656'),(116,'enterprise','0017_auto_20170508_1341','2019-02-06 07:56:32.492394'),(117,'enterprise','0018_auto_20170511_1357','2019-02-06 07:56:32.686868'),(118,'enterprise','0019_auto_20170606_1853','2019-02-06 07:56:32.884924'),(119,'enterprise','0020_auto_20170624_2316','2019-02-06 07:56:33.722514'),(120,'enterprise','0021_auto_20170711_0712','2019-02-06 07:56:34.290994'),(121,'enterprise','0022_auto_20170720_1543','2019-02-06 07:56:34.459932'),(122,'enterprise','0023_audit_data_reporting_flag','2019-02-06 07:56:34.693710'),(123,'enterprise','0024_enterprisecustomercatalog_historicalenterprisecustomercatalog','2019-02-06 07:56:34.991211'),(124,'enterprise','0025_auto_20170828_1412','2019-02-06 07:56:35.555899'),(125,'enterprise','0026_make_require_account_level_consent_nullable','2019-02-06 07:56:35.765541'),(126,'enterprise','0027_remove_account_level_consent','2019-02-06 07:56:36.799493'),(127,'enterprise','0028_link_enterprise_to_enrollment_template','2019-02-06 07:56:37.434413'),(128,'enterprise','0029_auto_20170925_1909','2019-02-06 07:56:37.650440'),(129,'enterprise','0030_auto_20171005_1600','2019-02-06 07:56:38.219936'),(130,'enterprise','0031_auto_20171012_1249','2019-02-06 07:56:38.438979'),(131,'enterprise','0032_reporting_model','2019-02-06 07:56:38.594362'),(132,'enterprise','0033_add_history_change_reason_field','2019-02-06 07:56:39.182772'),(133,'enterprise','0034_auto_20171023_0727','2019-02-06 07:56:39.321896'),(134,'enterprise','0035_auto_20171212_1129','2019-02-06 07:56:39.517158'),(135,'enterprise','0036_sftp_reporting_support','2019-02-06 07:56:39.958256'),(136,'enterprise','0037_auto_20180110_0450','2019-02-06 07:56:40.144689'),(137,'enterprise','0038_auto_20180122_1427','2019-02-06 07:56:40.326004'),(138,'enterprise','0039_auto_20180129_1034','2019-02-06 07:56:40.539093'),(139,'enterprise','0040_auto_20180129_1428','2019-02-06 07:56:40.854288'),(140,'enterprise','0041_auto_20180212_1507','2019-02-06 07:56:41.037158'),(141,'consent','0001_initial','2019-02-06 07:56:41.608778'),(142,'consent','0002_migrate_to_new_data_sharing_consent','2019-02-06 07:56:42.267785'),(143,'consent','0003_historicaldatasharingconsent_history_change_reason','2019-02-06 07:56:42.405847'),(144,'consent','0004_datasharingconsenttextoverrides','2019-02-06 07:56:42.584250'),(145,'sites','0002_alter_domain_unique','2019-02-06 07:56:42.663878'),(146,'course_overviews','0011_courseoverview_marketing_url','2019-02-06 07:56:42.745921'),(147,'course_overviews','0012_courseoverview_eligible_for_financial_aid','2019-02-06 07:56:42.834692'),(148,'course_overviews','0013_courseoverview_language','2019-02-06 07:56:42.913480'),(149,'course_overviews','0014_courseoverview_certificate_available_date','2019-02-06 07:56:42.991669'),(150,'content_type_gating','0001_initial','2019-02-06 07:56:43.235932'),(151,'content_type_gating','0002_auto_20181119_0959','2019-02-06 07:56:43.426345'),(152,'content_type_gating','0003_auto_20181128_1407','2019-02-06 07:56:43.580657'),(153,'content_type_gating','0004_auto_20181128_1521','2019-02-06 07:56:43.695613'),(154,'contentserver','0001_initial','2019-02-06 07:56:43.851239'),(155,'contentserver','0002_cdnuseragentsconfig','2019-02-06 07:56:44.018561'),(156,'cors_csrf','0001_initial','2019-02-06 07:56:44.181287'),(157,'course_action_state','0001_initial','2019-02-06 07:56:44.503331'),(158,'course_duration_limits','0001_initial','2019-02-06 07:56:44.746279'),(159,'course_duration_limits','0002_auto_20181119_0959','2019-02-06 07:56:44.877465'),(160,'course_duration_limits','0003_auto_20181128_1407','2019-02-06 07:56:45.039785'),(161,'course_duration_limits','0004_auto_20181128_1521','2019-02-06 07:56:45.182919'),(162,'course_goals','0001_initial','2019-02-06 07:56:45.519690'),(163,'course_goals','0002_auto_20171010_1129','2019-02-06 07:56:45.644315'),(164,'course_groups','0002_change_inline_default_cohort_value','2019-02-06 07:56:45.709570'),(165,'course_groups','0003_auto_20170609_1455','2019-02-06 07:56:45.983496'),(166,'course_modes','0008_course_key_field_to_foreign_key','2019-02-06 07:56:46.593883'),(167,'course_modes','0009_suggested_prices_to_charfield','2019-02-06 07:56:46.661433'),(168,'course_modes','0010_archived_suggested_prices_to_charfield','2019-02-06 07:56:46.723034'),(169,'course_modes','0011_change_regex_for_comma_separated_ints','2019-02-06 07:56:46.829468'),(170,'courseware','0001_initial','2019-02-06 07:56:49.952932'),(171,'courseware','0002_coursedynamicupgradedeadlineconfiguration_dynamicupgradedeadlineconfiguration','2019-02-06 07:56:50.721374'),(172,'courseware','0003_auto_20170825_0935','2019-02-06 07:56:50.903279'),(173,'courseware','0004_auto_20171010_1639','2019-02-06 07:56:51.166884'),(174,'courseware','0005_orgdynamicupgradedeadlineconfiguration','2019-02-06 07:56:51.597870'),(175,'courseware','0006_remove_module_id_index','2019-02-06 07:56:51.781895'),(176,'courseware','0007_remove_done_index','2019-02-06 07:56:51.968472'),(177,'coursewarehistoryextended','0001_initial','2019-02-06 07:56:52.632278'),(178,'coursewarehistoryextended','0002_force_studentmodule_index','2019-02-06 07:56:52.709752'),(179,'crawlers','0001_initial','2019-02-06 07:56:53.074661'),(180,'crawlers','0002_auto_20170419_0018','2019-02-06 07:56:53.203552'),(181,'credentials','0001_initial','2019-02-06 07:56:53.404087'),(182,'credentials','0002_auto_20160325_0631','2019-02-06 07:56:53.531754'),(183,'credentials','0003_auto_20170525_1109','2019-02-06 07:56:53.709376'),(184,'credentials','0004_notifycredentialsconfig','2019-02-06 07:56:53.854337'),(185,'credit','0001_initial','2019-02-06 07:56:55.324738'),(186,'credit','0002_creditconfig','2019-02-06 07:56:55.478476'),(187,'credit','0003_auto_20160511_2227','2019-02-06 07:56:55.552916'),(188,'credit','0004_delete_historical_credit_records','2019-02-06 07:56:56.180340'),(189,'dark_lang','0001_initial','2019-02-06 07:56:56.341474'),(190,'dark_lang','0002_data__enable_on_install','2019-02-06 07:56:56.783194'),(191,'dark_lang','0003_auto_20180425_0359','2019-02-06 07:56:57.055067'),(192,'database_fixups','0001_initial','2019-02-06 07:56:57.627927'),(193,'degreed','0001_initial','2019-02-06 07:56:58.969941'),(194,'degreed','0002_auto_20180104_0103','2019-02-06 07:56:59.471941'),(195,'degreed','0003_auto_20180109_0712','2019-02-06 07:56:59.731040'),(196,'degreed','0004_auto_20180306_1251','2019-02-06 07:56:59.997860'),(197,'degreed','0005_auto_20180807_1302','2019-02-06 07:57:02.069830'),(198,'degreed','0006_upgrade_django_simple_history','2019-02-06 07:57:02.273708'),(199,'django_comment_common','0003_enable_forums','2019-02-06 07:57:02.626514'),(200,'django_comment_common','0004_auto_20161117_1209','2019-02-06 07:57:02.820104'),(201,'django_comment_common','0005_coursediscussionsettings','2019-02-06 07:57:02.896624'),(202,'django_comment_common','0006_coursediscussionsettings_discussions_id_map','2019-02-06 07:57:02.998038'),(203,'django_comment_common','0007_discussionsidmapping','2019-02-06 07:57:03.083783'),(204,'django_comment_common','0008_role_user_index','2019-02-06 07:57:03.168933'),(205,'django_notify','0001_initial','2019-02-06 07:57:04.348365'),(206,'django_openid_auth','0001_initial','2019-02-06 07:57:04.778823'),(207,'oauth2','0001_initial','2019-02-06 07:57:06.639640'),(208,'edx_oauth2_provider','0001_initial','2019-02-06 07:57:06.912829'),(209,'edx_proctoring','0001_initial','2019-02-06 07:57:11.833284'),(210,'edx_proctoring','0002_proctoredexamstudentattempt_is_status_acknowledged','2019-02-06 07:57:12.158509'),(211,'edx_proctoring','0003_auto_20160101_0525','2019-02-06 07:57:12.624375'),(212,'edx_proctoring','0004_auto_20160201_0523','2019-02-06 07:57:13.412490'),(213,'edx_proctoring','0005_proctoredexam_hide_after_due','2019-02-06 07:57:13.542482'),(214,'edx_proctoring','0006_allowed_time_limit_mins','2019-02-06 07:57:13.995842'),(215,'edx_proctoring','0007_proctoredexam_backend','2019-02-06 07:57:14.113562'),(216,'edx_proctoring','0008_auto_20181116_1551','2019-02-06 07:57:14.705891'),(217,'edx_proctoring','0009_proctoredexamreviewpolicy_remove_rules','2019-02-06 07:57:15.116276'),(218,'edxval','0001_initial','2019-02-06 07:57:15.863533'),(219,'edxval','0002_data__default_profiles','2019-02-06 07:57:16.818661'),(220,'edxval','0003_coursevideo_is_hidden','2019-02-06 07:57:16.918246'),(221,'edxval','0004_data__add_hls_profile','2019-02-06 07:57:17.289957'),(222,'edxval','0005_videoimage','2019-02-06 07:57:17.492770'),(223,'edxval','0006_auto_20171009_0725','2019-02-06 07:57:17.716551'),(224,'edxval','0007_transcript_credentials_state','2019-02-06 07:57:17.845730'),(225,'edxval','0008_remove_subtitles','2019-02-06 07:57:17.992131'),(226,'edxval','0009_auto_20171127_0406','2019-02-06 07:57:18.060122'),(227,'edxval','0010_add_video_as_foreign_key','2019-02-06 07:57:18.365704'),(228,'edxval','0011_data__add_audio_mp3_profile','2019-02-06 07:57:18.730704'),(229,'email_marketing','0001_initial','2019-02-06 07:57:19.051984'),(230,'email_marketing','0002_auto_20160623_1656','2019-02-06 07:57:21.789475'),(231,'email_marketing','0003_auto_20160715_1145','2019-02-06 07:57:22.963260'),(232,'email_marketing','0004_emailmarketingconfiguration_welcome_email_send_delay','2019-02-06 07:57:23.293836'),(233,'email_marketing','0005_emailmarketingconfiguration_user_registration_cookie_timeout_delay','2019-02-06 07:57:23.617029'),(234,'email_marketing','0006_auto_20170711_0615','2019-02-06 07:57:24.245380'),(235,'email_marketing','0007_auto_20170809_0653','2019-02-06 07:57:24.897713'),(236,'email_marketing','0008_auto_20170809_0539','2019-02-06 07:57:25.325581'),(237,'email_marketing','0009_remove_emailmarketingconfiguration_sailthru_activation_template','2019-02-06 07:57:25.603626'),(238,'email_marketing','0010_auto_20180425_0800','2019-02-06 07:57:26.312049'),(239,'embargo','0001_initial','2019-02-06 07:57:28.072877'),(240,'embargo','0002_data__add_countries','2019-02-06 07:57:29.877570'),(241,'enterprise','0042_replace_sensitive_sso_username','2019-02-06 07:57:30.224348'),(242,'enterprise','0043_auto_20180507_0138','2019-02-06 07:57:30.838462'),(243,'enterprise','0044_reporting_config_multiple_types','2019-02-06 07:57:31.233674'),(244,'enterprise','0045_report_type_json','2019-02-06 07:57:31.322889'),(245,'enterprise','0046_remove_unique_constraints','2019-02-06 07:57:31.424455'),(246,'enterprise','0047_auto_20180517_0457','2019-02-06 07:57:31.785098'),(247,'enterprise','0048_enterprisecustomeruser_active','2019-02-06 07:57:31.904647'),(248,'enterprise','0049_auto_20180531_0321','2019-02-06 07:57:32.509863'),(249,'enterprise','0050_progress_v2','2019-02-06 07:57:33.253255'),(250,'enterprise','0051_add_enterprise_slug','2019-02-06 07:57:34.073175'),(251,'enterprise','0052_create_unique_slugs','2019-02-06 07:57:34.414601'),(252,'enterprise','0053_pendingenrollment_cohort_name','2019-02-06 07:57:34.520875'),(253,'enterprise','0053_auto_20180911_0811','2019-02-06 07:57:34.914654'),(254,'enterprise','0054_merge_20180914_1511','2019-02-06 07:57:34.944784'),(255,'enterprise','0055_auto_20181015_1112','2019-02-06 07:57:35.409450'),(256,'enterprise','0056_enterprisecustomerreportingconfiguration_pgp_encryption_key','2019-02-06 07:57:35.545845'),(257,'enterprise','0057_enterprisecustomerreportingconfiguration_enterprise_customer_catalogs','2019-02-06 07:57:35.960406'),(258,'enterprise','0058_auto_20181212_0145','2019-02-06 07:57:37.113916'),(259,'enterprise','0059_add_code_management_portal_config','2019-02-06 07:57:37.575928'),(260,'enterprise','0060_upgrade_django_simple_history','2019-02-06 07:57:38.213269'),(261,'student','0001_initial','2019-02-06 07:57:47.588358'),(262,'student','0002_auto_20151208_1034','2019-02-06 07:57:47.836707'),(263,'student','0003_auto_20160516_0938','2019-02-06 07:57:48.149932'),(264,'student','0004_auto_20160531_1422','2019-02-06 07:57:48.286460'),(265,'student','0005_auto_20160531_1653','2019-02-06 07:57:48.431860'),(266,'student','0006_logoutviewconfiguration','2019-02-06 07:57:48.974430'),(267,'student','0007_registrationcookieconfiguration','2019-02-06 07:57:49.147001'),(268,'student','0008_auto_20161117_1209','2019-02-06 07:57:49.263656'),(269,'student','0009_auto_20170111_0422','2019-02-06 07:57:49.377186'),(270,'student','0010_auto_20170207_0458','2019-02-06 07:57:49.407334'),(271,'student','0011_course_key_field_to_foreign_key','2019-02-06 07:57:50.975260'),(272,'student','0012_sociallink','2019-02-06 07:57:51.409953'),(273,'student','0013_delete_historical_enrollment_records','2019-02-06 07:57:52.968613'),(274,'entitlements','0001_initial','2019-02-06 07:57:53.425447'),(275,'entitlements','0002_auto_20171102_0719','2019-02-06 07:57:55.014484'),(276,'entitlements','0003_auto_20171205_1431','2019-02-06 07:57:57.282703'),(277,'entitlements','0004_auto_20171206_1729','2019-02-06 07:57:57.704486'),(278,'entitlements','0005_courseentitlementsupportdetail','2019-02-06 07:57:58.400522'),(279,'entitlements','0006_courseentitlementsupportdetail_action','2019-02-06 07:57:59.000339'),(280,'entitlements','0007_change_expiration_period_default','2019-02-06 07:57:59.217527'),(281,'entitlements','0008_auto_20180328_1107','2019-02-06 07:58:00.023003'),(282,'entitlements','0009_courseentitlement_refund_locked','2019-02-06 07:58:00.552995'),(283,'entitlements','0010_backfill_refund_lock','2019-02-06 07:58:01.471558'),(284,'experiments','0001_initial','2019-02-06 07:58:02.990331'),(285,'experiments','0002_auto_20170627_1402','2019-02-06 07:58:03.207899'),(286,'experiments','0003_auto_20170713_1148','2019-02-06 07:58:03.289623'),(287,'external_auth','0001_initial','2019-02-06 07:58:04.122332'),(288,'grades','0001_initial','2019-02-06 07:58:04.449795'),(289,'grades','0002_rename_last_edited_field','2019-02-06 07:58:04.542638'),(290,'grades','0003_coursepersistentgradesflag_persistentgradesenabledflag','2019-02-06 07:58:05.727274'),(291,'grades','0004_visibleblocks_course_id','2019-02-06 07:58:05.867193'),(292,'grades','0005_multiple_course_flags','2019-02-06 07:58:06.312646'),(293,'grades','0006_persistent_course_grades','2019-02-06 07:58:06.568446'),(294,'grades','0007_add_passed_timestamp_column','2019-02-06 07:58:07.247313'),(295,'grades','0008_persistentsubsectiongrade_first_attempted','2019-02-06 07:58:07.349076'),(296,'grades','0009_auto_20170111_1507','2019-02-06 07:58:07.498641'),(297,'grades','0010_auto_20170112_1156','2019-02-06 07:58:07.583662'),(298,'grades','0011_null_edited_time','2019-02-06 07:58:07.916494'),(299,'grades','0012_computegradessetting','2019-02-06 07:58:08.432066'),(300,'grades','0013_persistentsubsectiongradeoverride','2019-02-06 07:58:08.633723'),(301,'grades','0014_persistentsubsectiongradeoverridehistory','2019-02-06 07:58:09.160210'),(302,'instructor_task','0002_gradereportsetting','2019-02-06 07:58:09.580204'),(303,'waffle','0001_initial','2019-02-06 07:58:10.444295'),(304,'sap_success_factors','0001_initial','2019-02-06 07:58:12.042509'),(305,'sap_success_factors','0002_auto_20170224_1545','2019-02-06 07:58:13.979236'),(306,'sap_success_factors','0003_auto_20170317_1402','2019-02-06 07:58:14.701821'),(307,'sap_success_factors','0004_catalogtransmissionaudit_audit_summary','2019-02-06 07:58:14.797945'),(308,'sap_success_factors','0005_historicalsapsuccessfactorsenterprisecustomerconfiguration_history_change_reason','2019-02-06 07:58:15.137352'),(309,'sap_success_factors','0006_sapsuccessfactors_use_enterprise_enrollment_page_waffle_flag','2019-02-06 07:58:15.692938'),(310,'sap_success_factors','0007_remove_historicalsapsuccessfactorsenterprisecustomerconfiguration_history_change_reason','2019-02-06 07:58:16.090806'),(311,'sap_success_factors','0008_historicalsapsuccessfactorsenterprisecustomerconfiguration_history_change_reason','2019-02-06 07:58:16.886204'),(312,'sap_success_factors','0009_sapsuccessfactors_remove_enterprise_enrollment_page_waffle_flag','2019-02-06 07:58:17.493133'),(313,'sap_success_factors','0010_move_audit_tables_to_base_integrated_channel','2019-02-06 07:58:18.256051'),(314,'integrated_channel','0001_initial','2019-02-06 07:58:18.434760'),(315,'integrated_channel','0002_delete_enterpriseintegratedchannel','2019-02-06 07:58:18.534852'),(316,'integrated_channel','0003_catalogtransmissionaudit_learnerdatatransmissionaudit','2019-02-06 07:58:18.697143'),(317,'integrated_channel','0004_catalogtransmissionaudit_channel','2019-02-06 07:58:18.821246'),(318,'integrated_channel','0005_auto_20180306_1251','2019-02-06 07:58:19.378821'),(319,'integrated_channel','0006_delete_catalogtransmissionaudit','2019-02-06 07:58:19.463872'),(320,'lms_xblock','0001_initial','2019-02-06 07:58:19.938021'),(321,'microsite_configuration','0001_initial','2019-02-06 07:58:24.417944'),(322,'microsite_configuration','0002_auto_20160202_0228','2019-02-06 07:58:24.704162'),(323,'microsite_configuration','0003_delete_historical_records','2019-02-06 07:58:27.217560'),(324,'milestones','0001_initial','2019-02-06 07:58:28.438298'),(325,'milestones','0002_data__seed_relationship_types','2019-02-06 07:58:29.074808'),(326,'milestones','0003_coursecontentmilestone_requirements','2019-02-06 07:58:29.198318'),(327,'milestones','0004_auto_20151221_1445','2019-02-06 07:58:29.608126'),(328,'mobile_api','0001_initial','2019-02-06 07:58:30.546212'),(329,'mobile_api','0002_auto_20160406_0904','2019-02-06 07:58:30.725452'),(330,'mobile_api','0003_ignore_mobile_available_flag','2019-02-06 07:58:31.637551'),(331,'notes','0001_initial','2019-02-06 07:58:32.158209'),(332,'oauth2','0002_auto_20160404_0813','2019-02-06 07:58:33.398358'),(333,'oauth2','0003_client_logout_uri','2019-02-06 07:58:33.785963'),(334,'oauth2','0004_add_index_on_grant_expires','2019-02-06 07:58:34.178788'),(335,'oauth2','0005_grant_nonce','2019-02-06 07:58:35.284863'),(336,'organizations','0001_initial','2019-02-06 07:58:35.646051'),(337,'organizations','0002_auto_20170117_1434','2019-02-06 07:58:35.750682'),(338,'organizations','0003_auto_20170221_1138','2019-02-06 07:58:35.925588'),(339,'organizations','0004_auto_20170413_2315','2019-02-06 07:58:36.060193'),(340,'organizations','0005_auto_20171116_0640','2019-02-06 07:58:36.145008'),(341,'organizations','0006_auto_20171207_0259','2019-02-06 07:58:36.257476'),(342,'oauth2_provider','0001_initial','2019-02-06 07:58:38.097999'),(343,'oauth_dispatch','0001_initial','2019-02-06 07:58:38.563660'),(344,'oauth_dispatch','0002_scopedapplication_scopedapplicationorganization','2019-02-06 07:58:40.054311'),(345,'oauth_dispatch','0003_application_data','2019-02-06 07:58:40.676680'),(346,'oauth_dispatch','0004_auto_20180626_1349','2019-02-06 07:58:43.112430'),(347,'oauth_dispatch','0005_applicationaccess_type','2019-02-06 07:58:43.714100'),(348,'oauth_dispatch','0006_drop_application_id_constraints','2019-02-06 07:58:44.030090'),(349,'oauth2_provider','0002_08_updates','2019-02-06 07:58:44.450850'),(350,'oauth2_provider','0003_auto_20160316_1503','2019-02-06 07:58:44.640899'),(351,'oauth2_provider','0004_auto_20160525_1623','2019-02-06 07:58:44.975564'),(352,'oauth2_provider','0005_auto_20170514_1141','2019-02-06 07:58:47.370031'),(353,'oauth2_provider','0006_auto_20171214_2232','2019-02-06 07:58:48.599294'),(354,'oauth_dispatch','0007_restore_application_id_constraints','2019-02-06 07:58:49.006205'),(355,'oauth_provider','0001_initial','2019-02-06 07:58:49.563238'),(356,'problem_builder','0001_initial','2019-02-06 07:58:49.794124'),(357,'problem_builder','0002_auto_20160121_1525','2019-02-06 07:58:50.200720'),(358,'problem_builder','0003_auto_20161124_0755','2019-02-06 07:58:50.413858'),(359,'problem_builder','0004_copy_course_ids','2019-02-06 07:58:51.128055'),(360,'problem_builder','0005_auto_20170112_1021','2019-02-06 07:58:51.340194'),(361,'problem_builder','0006_remove_deprecated_course_id','2019-02-06 07:58:51.564692'),(362,'programs','0001_initial','2019-02-06 07:58:51.747931'),(363,'programs','0002_programsapiconfig_cache_ttl','2019-02-06 07:58:51.898433'),(364,'programs','0003_auto_20151120_1613','2019-02-06 07:58:53.094465'),(365,'programs','0004_programsapiconfig_enable_certification','2019-02-06 07:58:53.288122'),(366,'programs','0005_programsapiconfig_max_retries','2019-02-06 07:58:53.445000'),(367,'programs','0006_programsapiconfig_xseries_ad_enabled','2019-02-06 07:58:53.602411'),(368,'programs','0007_programsapiconfig_program_listing_enabled','2019-02-06 07:58:53.755138'),(369,'programs','0008_programsapiconfig_program_details_enabled','2019-02-06 07:58:53.875763'),(370,'programs','0009_programsapiconfig_marketing_path','2019-02-06 07:58:54.018436'),(371,'programs','0010_auto_20170204_2332','2019-02-06 07:58:54.237222'),(372,'programs','0011_auto_20170301_1844','2019-02-06 07:58:55.604408'),(373,'programs','0012_auto_20170419_0018','2019-02-06 07:58:55.728622'),(374,'redirects','0001_initial','2019-02-06 07:58:56.618741'),(375,'rss_proxy','0001_initial','2019-02-06 07:58:56.722680'),(376,'sap_success_factors','0011_auto_20180104_0103','2019-02-06 07:59:01.328739'),(377,'sap_success_factors','0012_auto_20180109_0712','2019-02-06 07:59:01.778378'),(378,'sap_success_factors','0013_auto_20180306_1251','2019-02-06 07:59:02.285821'),(379,'sap_success_factors','0014_drop_historical_table','2019-02-06 07:59:02.903520'),(380,'sap_success_factors','0015_auto_20180510_1259','2019-02-06 07:59:03.734759'),(381,'sap_success_factors','0016_sapsuccessfactorsenterprisecustomerconfiguration_additional_locales','2019-02-06 07:59:03.878684'),(382,'sap_success_factors','0017_sapsuccessfactorsglobalconfiguration_search_student_api_path','2019-02-06 07:59:04.766539'),(383,'schedules','0001_initial','2019-02-06 07:59:05.179663'),(384,'schedules','0002_auto_20170816_1532','2019-02-06 07:59:05.397766'),(385,'schedules','0003_scheduleconfig','2019-02-06 07:59:05.977222'),(386,'schedules','0004_auto_20170922_1428','2019-02-06 07:59:06.791066'),(387,'schedules','0005_auto_20171010_1722','2019-02-06 07:59:07.631416'),(388,'schedules','0006_scheduleexperience','2019-02-06 07:59:08.189048'),(389,'schedules','0007_scheduleconfig_hold_back_ratio','2019-02-06 07:59:08.776239'),(390,'self_paced','0001_initial','2019-02-06 07:59:09.799050'),(391,'sessions','0001_initial','2019-02-06 07:59:09.921074'),(392,'shoppingcart','0001_initial','2019-02-06 07:59:21.053818'),(393,'shoppingcart','0002_auto_20151208_1034','2019-02-06 07:59:21.335220'),(394,'shoppingcart','0003_auto_20151217_0958','2019-02-06 07:59:21.599445'),(395,'shoppingcart','0004_change_meta_options','2019-02-06 07:59:21.823322'),(396,'site_configuration','0001_initial','2019-02-06 07:59:22.992881'),(397,'site_configuration','0002_auto_20160720_0231','2019-02-06 07:59:23.853074'),(398,'default','0001_initial','2019-02-06 07:59:25.015201'),(399,'social_auth','0001_initial','2019-02-06 07:59:25.046686'),(400,'default','0002_add_related_name','2019-02-06 07:59:25.500745'),(401,'social_auth','0002_add_related_name','2019-02-06 07:59:25.532177'),(402,'default','0003_alter_email_max_length','2019-02-06 07:59:25.652620'),(403,'social_auth','0003_alter_email_max_length','2019-02-06 07:59:25.690150'),(404,'default','0004_auto_20160423_0400','2019-02-06 07:59:26.074154'),(405,'social_auth','0004_auto_20160423_0400','2019-02-06 07:59:26.105575'),(406,'social_auth','0005_auto_20160727_2333','2019-02-06 07:59:26.241475'),(407,'social_django','0006_partial','2019-02-06 07:59:26.399875'),(408,'social_django','0007_code_timestamp','2019-02-06 07:59:26.566550'),(409,'social_django','0008_partial_timestamp','2019-02-06 07:59:26.712434'),(410,'splash','0001_initial','2019-02-06 07:59:27.288326'),(411,'static_replace','0001_initial','2019-02-06 07:59:27.851106'),(412,'static_replace','0002_assetexcludedextensionsconfig','2019-02-06 07:59:29.178463'),(413,'status','0001_initial','2019-02-06 07:59:30.834233'),(414,'status','0002_update_help_text','2019-02-06 07:59:31.259226'),(415,'student','0014_courseenrollmentallowed_user','2019-02-06 07:59:31.843553'),(416,'student','0015_manualenrollmentaudit_add_role','2019-02-06 07:59:32.339124'),(417,'student','0016_coursenrollment_course_on_delete_do_nothing','2019-02-06 07:59:33.019734'),(418,'student','0017_accountrecovery','2019-02-06 07:59:34.081866'),(419,'student','0018_remove_password_history','2019-02-06 07:59:35.360857'),(420,'student','0019_auto_20181221_0540','2019-02-06 07:59:36.450684'),(421,'submissions','0001_initial','2019-02-06 07:59:37.468217'),(422,'submissions','0002_auto_20151119_0913','2019-02-06 07:59:37.751719'),(423,'submissions','0003_submission_status','2019-02-06 07:59:37.951880'),(424,'submissions','0004_remove_django_extensions','2019-02-06 07:59:38.080449'),(425,'survey','0001_initial','2019-02-06 07:59:38.937112'),(426,'teams','0001_initial','2019-02-06 07:59:42.234272'),(427,'theming','0001_initial','2019-02-06 07:59:42.964122'),(428,'third_party_auth','0001_initial','2019-02-06 07:59:46.893944'),(429,'third_party_auth','0002_schema__provider_icon_image','2019-02-06 07:59:51.814091'),(430,'third_party_auth','0003_samlproviderconfig_debug_mode','2019-02-06 07:59:52.360263'),(431,'third_party_auth','0004_add_visible_field','2019-02-06 07:59:56.187303'),(432,'third_party_auth','0005_add_site_field','2019-02-06 08:00:00.726584'),(433,'third_party_auth','0006_samlproviderconfig_automatic_refresh_enabled','2019-02-06 08:00:01.267932'),(434,'third_party_auth','0007_auto_20170406_0912','2019-02-06 08:00:02.190874'),(435,'third_party_auth','0008_auto_20170413_1455','2019-02-06 08:00:03.658115'),(436,'third_party_auth','0009_auto_20170415_1144','2019-02-06 08:00:05.420674'),(437,'third_party_auth','0010_add_skip_hinted_login_dialog_field','2019-02-06 08:00:07.334260'),(438,'third_party_auth','0011_auto_20170616_0112','2019-02-06 08:00:07.841081'),(439,'third_party_auth','0012_auto_20170626_1135','2019-02-06 08:00:09.649831'),(440,'third_party_auth','0013_sync_learner_profile_data','2019-02-06 08:00:12.254172'),(441,'third_party_auth','0014_auto_20171222_1233','2019-02-06 08:00:13.935686'),(442,'third_party_auth','0015_samlproviderconfig_archived','2019-02-06 08:00:14.559179'),(443,'third_party_auth','0016_auto_20180130_0938','2019-02-06 08:00:15.656894'),(444,'third_party_auth','0017_remove_icon_class_image_secondary_fields','2019-02-06 08:00:17.597823'),(445,'third_party_auth','0018_auto_20180327_1631','2019-02-06 08:00:20.302724'),(446,'third_party_auth','0019_consolidate_slug','2019-02-06 08:00:23.246774'),(447,'third_party_auth','0020_cleanup_slug_fields','2019-02-06 08:00:25.498101'),(448,'third_party_auth','0021_sso_id_verification','2019-02-06 08:00:27.269685'),(449,'third_party_auth','0022_auto_20181012_0307','2019-02-06 08:00:30.475559'),(450,'thumbnail','0001_initial','2019-02-06 08:00:30.680886'),(451,'track','0001_initial','2019-02-06 08:00:30.998373'),(452,'user_api','0001_initial','2019-02-06 08:00:35.324701'),(453,'user_api','0002_retirementstate_userretirementstatus','2019-02-06 08:00:36.082707'),(454,'user_api','0003_userretirementrequest','2019-02-06 08:00:36.665229'),(455,'user_api','0004_userretirementpartnerreportingstatus','2019-02-06 08:00:37.317791'),(456,'user_authn','0001_data__add_login_service','2019-02-06 08:00:39.270679'),(457,'util','0001_initial','2019-02-06 08:00:39.822745'),(458,'util','0002_data__default_rate_limit_config','2019-02-06 08:00:40.606869'),(459,'verified_track_content','0002_verifiedtrackcohortedcourse_verified_cohort_name','2019-02-06 08:00:40.741152'),(460,'verified_track_content','0003_migrateverifiedtrackcohortssetting','2019-02-06 08:00:41.360407'),(461,'verify_student','0001_initial','2019-02-06 08:00:47.236180'),(462,'verify_student','0002_auto_20151124_1024','2019-02-06 08:00:47.481347'),(463,'verify_student','0003_auto_20151113_1443','2019-02-06 08:00:47.697474'),(464,'verify_student','0004_delete_historical_records','2019-02-06 08:00:47.928549'),(465,'verify_student','0005_remove_deprecated_models','2019-02-06 08:00:53.255639'),(466,'verify_student','0006_ssoverification','2019-02-06 08:00:53.608512'),(467,'verify_student','0007_idverificationaggregate','2019-02-06 08:00:54.126314'),(468,'verify_student','0008_populate_idverificationaggregate','2019-02-06 08:00:55.099295'),(469,'verify_student','0009_remove_id_verification_aggregate','2019-02-06 08:00:55.505989'),(470,'verify_student','0010_manualverification','2019-02-06 08:00:55.733258'),(471,'verify_student','0011_add_fields_to_sspv','2019-02-06 08:00:56.760072'),(472,'video_config','0001_initial','2019-02-06 08:00:57.094097'),(473,'video_config','0002_coursevideotranscriptenabledflag_videotranscriptenabledflag','2019-02-06 08:00:57.451972'),(474,'video_config','0003_transcriptmigrationsetting','2019-02-06 08:00:57.665251'),(475,'video_config','0004_transcriptmigrationsetting_command_run','2019-02-06 08:00:57.846477'),(476,'video_config','0005_auto_20180719_0752','2019-02-06 08:00:58.093978'),(477,'video_config','0006_videothumbnailetting_updatedcoursevideos','2019-02-06 08:00:58.479655'),(478,'video_config','0007_videothumbnailsetting_offset','2019-02-06 08:00:58.702464'),(479,'video_pipeline','0001_initial','2019-02-06 08:00:58.930134'),(480,'video_pipeline','0002_auto_20171114_0704','2019-02-06 08:00:59.248554'),(481,'video_pipeline','0003_coursevideouploadsenabledbydefault_videouploadsenabledbydefault','2019-02-06 08:00:59.639240'),(482,'waffle','0002_auto_20161201_0958','2019-02-06 08:00:59.770761'),(483,'waffle_utils','0001_initial','2019-02-06 08:01:00.120690'),(484,'wiki','0001_initial','2019-02-06 08:01:13.521825'),(485,'wiki','0002_remove_article_subscription','2019-02-06 08:01:13.635976'),(486,'wiki','0003_ip_address_conv','2019-02-06 08:01:15.191324'),(487,'wiki','0004_increase_slug_size','2019-02-06 08:01:15.438646'),(488,'wiki','0005_remove_attachments_and_images','2019-02-06 08:01:20.535437'),(489,'workflow','0001_initial','2019-02-06 08:01:20.955248'),(490,'workflow','0002_remove_django_extensions','2019-02-06 08:01:21.089005'),(491,'xapi','0001_initial','2019-02-06 08:01:21.762133'),(492,'xapi','0002_auto_20180726_0142','2019-02-06 08:01:22.140082'),(493,'xblock_django','0001_initial','2019-02-06 08:01:22.817601'),(494,'xblock_django','0002_auto_20160204_0809','2019-02-06 08:01:23.428800'),(495,'xblock_django','0003_add_new_config_models','2019-02-06 08:01:26.720065'),(496,'xblock_django','0004_delete_xblock_disable_config','2019-02-06 08:01:28.046351'),(497,'social_django','0002_add_related_name','2019-02-06 08:01:28.238120'),(498,'social_django','0003_alter_email_max_length','2019-02-06 08:01:28.295485'),(499,'social_django','0004_auto_20160423_0400','2019-02-06 08:01:28.369651'),(500,'social_django','0001_initial','2019-02-06 08:01:28.419547'),(501,'social_django','0005_auto_20160727_2333','2019-02-06 08:01:28.470149'),(502,'contentstore','0001_initial','2019-02-06 08:02:13.717472'),(503,'contentstore','0002_add_assets_page_flag','2019-02-06 08:02:14.894230'),(504,'contentstore','0003_remove_assets_page_flag','2019-02-06 08:02:15.936128'),(505,'course_creators','0001_initial','2019-02-06 08:02:16.677395'),(506,'tagging','0001_initial','2019-02-06 08:02:16.919416'),(507,'tagging','0002_auto_20170116_1541','2019-02-06 08:02:17.057789'),(508,'user_tasks','0001_initial','2019-02-06 08:02:18.095204'),(509,'user_tasks','0002_artifact_file_storage','2019-02-06 08:02:18.200132'),(510,'xblock_config','0001_initial','2019-02-06 08:02:18.497728'),(511,'xblock_config','0002_courseeditltifieldsenabledflag','2019-02-06 08:02:19.039966'),(512,'lti_provider','0001_initial','2019-02-20 13:01:39.285635'),(513,'lti_provider','0002_auto_20160325_0407','2019-02-20 13:01:39.369768'),(514,'lti_provider','0003_auto_20161118_1040','2019-02-20 13:01:39.445830'),(515,'content_type_gating','0005_auto_20190306_1547','2019-03-06 16:00:40.248896'),(516,'course_duration_limits','0005_auto_20190306_1546','2019-03-06 16:00:40.908922'),(517,'enterprise','0061_systemwideenterpriserole_systemwideenterpriseuserroleassignment','2019-03-08 15:47:17.741727'),(518,'enterprise','0062_add_system_wide_enterprise_roles','2019-03-08 15:47:17.809640'),(519,'content_type_gating','0006_auto_20190308_1447','2019-03-11 16:27:21.659554'),(520,'course_duration_limits','0006_auto_20190308_1447','2019-03-11 16:27:22.347994'),(521,'content_type_gating','0007_auto_20190311_1919','2019-03-12 16:11:14.076560'),(522,'course_duration_limits','0007_auto_20190311_1919','2019-03-12 16:11:17.332778'),(523,'announcements','0001_initial','2019-03-18 20:54:59.708245'),(524,'content_type_gating','0008_auto_20190313_1634','2019-03-18 20:55:00.145074'),(525,'course_duration_limits','0008_auto_20190313_1634','2019-03-18 20:55:00.800059'),(526,'enterprise','0063_systemwideenterpriserole_description','2019-03-21 18:40:50.646407'),(527,'enterprise','0064_enterprisefeaturerole_enterprisefeatureuserroleassignment','2019-03-28 19:29:40.049122'),(528,'enterprise','0065_add_enterprise_feature_roles','2019-03-28 19:29:40.122825'),(529,'enterprise','0066_add_system_wide_enterprise_operator_role','2019-03-28 19:29:40.190059'),(530,'student','0020_auto_20190227_2019','2019-04-01 21:47:10.285726'),(531,'certificates','0015_add_masters_choice','2019-04-05 14:56:54.180634'),(532,'enterprise','0067_add_role_based_access_control_switch','2019-04-08 20:44:56.835675'),(533,'program_enrollments','0001_initial','2019-04-10 20:25:28.810529'),(534,'program_enrollments','0002_historicalprogramcourseenrollment_programcourseenrollment','2019-04-18 16:07:31.718124'),(535,'third_party_auth','0023_auto_20190418_2033','2019-04-24 13:53:47.057323'),(536,'program_enrollments','0003_auto_20190424_1622','2019-04-24 16:34:31.400886'),(537,'courseware','0008_move_idde_to_edx_when','2019-04-25 14:14:01.833602'),(538,'edx_when','0001_initial','2019-04-25 14:14:04.077675'),(539,'edx_when','0002_auto_20190318_1736','2019-04-25 14:14:06.472260'),(540,'edx_when','0003_auto_20190402_1501','2019-04-25 14:14:08.565796'),(541,'edx_proctoring','0010_update_backend','2019-05-02 21:47:10.150692'),(542,'program_enrollments','0004_add_programcourseenrollment_relatedname','2019-05-02 21:47:10.839771'),(543,'student','0021_historicalcourseenrollment','2019-05-03 20:29:56.543955'),(544,'cornerstone','0001_initial','2019-05-29 09:32:41.107279'),(545,'cornerstone','0002_cornerstoneglobalconfiguration_subject_mapping','2019-05-29 09:32:41.540384'),(546,'third_party_auth','0024_fix_edit_disallowed','2019-05-29 14:34:07.293693'),(547,'discounts','0001_initial','2019-06-03 19:15:59.106385'),(548,'program_enrollments','0005_canceled_not_withdrawn','2019-06-03 19:15:59.936222'),(549,'entitlements','0011_historicalcourseentitlement','2019-06-04 17:56:15.038112'),(550,'organizations','0007_historicalorganization','2019-06-04 17:56:15.935805'),(551,'user_tasks','0003_url_max_length','2019-06-04 17:56:24.531329'),(552,'user_tasks','0004_url_textfield','2019-06-04 17:56:24.631710'),(553,'enterprise','0068_remove_role_based_access_control_switch','2019-06-05 10:59:25.727686'),(554,'grades','0015_historicalpersistentsubsectiongradeoverride','2019-06-10 16:42:15.294490'),(555,'bulk_grades','0001_initial','2019-06-12 14:00:05.595345'),(556,'super_csv','0001_initial','2019-06-12 14:00:05.668273'),(557,'super_csv','0002_csvoperation_user','2019-06-12 14:00:06.129086'),(558,'enterprise','0069_auto_20190613_0607','2019-06-13 20:29:34.416315'),(559,'course_modes','0012_historicalcoursemode','2019-06-20 14:16:40.384457'),(560,'student','0022_indexing_in_courseenrollment','2019-06-28 07:52:29.598606'),(561,'courseware','0009_auto_20190703_1955','2019-07-03 19:59:27.956010'),(562,'bulk_grades','0002_auto_20190703_1526','2019-07-09 16:23:49.075404'),(563,'course_overviews','0015_historicalcourseoverview','2019-07-09 16:23:49.552185'),(564,'courseware','0010_auto_20190709_1559','2019-07-09 16:23:49.959864'),(565,'grades','0016_auto_20190703_1446','2019-07-09 16:23:51.049448'),(566,'cornerstone','0003_auto_20190621_1000','2019-08-16 20:33:03.878476'),(567,'enterprise','0070_enterprise_catalog_query','2019-08-16 20:33:05.128301'),(568,'enterprise','0071_historicalpendingenrollment_historicalpendingenterprisecustomeruser','2019-08-16 20:33:06.381233'),(569,'instructor_task','0003_alter_task_input_field','2019-08-16 20:33:06.777708'),(570,'microsite_configuration','004_delete_all_tables','2019-08-16 20:33:08.216606'),(571,'sap_success_factors','0018_sapsuccessfactorsenterprisecustomerconfiguration_show_course_price','2019-08-16 20:33:08.320866'),(572,'super_csv','0003_csvoperation_original_filename','2019-08-16 20:33:08.729724'),(573,'system_wide_roles','0001_SystemWideRole_SystemWideRoleAssignment','2019-08-16 20:33:09.236280'),(574,'system_wide_roles','0002_add_system_wide_student_support_role','2019-08-16 20:33:10.100114'),(575,'contentstore','0004_remove_push_notification_configmodel_table','2019-08-16 20:33:16.971775'),(576,'xapi','0003_auto_20190807_1006','2019-08-23 11:39:26.089273'),(577,'program_enrollments','0006_add_the_correct_constraints','2019-08-23 18:08:47.891260'),(578,'video_config','0008_courseyoutubeblockedflag','2019-08-25 18:16:55.143257'),(579,'program_enrollments','0007_waiting_programcourseenrollment_constraint','2019-08-27 19:09:05.805301'),(580,'content_libraries','0001_initial','2019-08-30 19:27:59.312920'),(581,'courseware','0011_csm_id_bigint','2019-08-30 19:28:00.069282'),(582,'enterprise','0072_add_enterprise_report_config_feature_role','2019-08-30 19:28:00.572179'),(583,'enterprise','0073_enterprisecustomerreportingconfiguration_uuid','2019-08-30 19:28:01.681347'),(584,'enterprise','0074_auto_20190904_1143','2019-09-06 21:16:52.036849'),(585,'xapi','0004_auto_20190830_0710','2019-09-06 21:16:52.593883'),(586,'enterprise','0075_auto_20190916_1030','2019-09-16 21:24:18.290842'),(587,'course_overviews','0016_simulatecoursepublishconfig','2019-09-17 14:32:57.081562'),(588,'courseware','0012_adjust_fields','2019-09-19 19:47:08.473302'),(589,'enterprise','0076_auto_20190918_2037','2019-09-19 19:47:09.682209'),(590,'cornerstone','0004_cornerstoneglobalconfiguration_languages','2019-09-25 09:51:51.980971'),(591,'cornerstone','0005_auto_20190925_0730','2019-09-25 09:51:52.420065'),(592,'degreed','0007_auto_20190925_0730','2019-09-25 09:51:52.912089'),(593,'integrated_channel','0007_auto_20190925_0730','2019-09-25 09:51:52.965350'),(594,'sap_success_factors','0019_auto_20190925_0730','2019-09-25 09:51:53.387921'),(595,'course_overviews','0017_auto_20191002_0823','2019-10-03 17:35:24.874445'),(596,'courseware','0013_auto_20191001_1858','2019-10-03 17:35:25.469758'),(597,'edx_when','0004_datepolicy_rel_date','2019-10-03 17:35:25.561499'),(598,'edx_when','0005_auto_20190911_1056','2019-10-03 17:35:26.248583'),(599,'student','0023_bulkunenrollconfiguration','2019-10-08 08:54:34.630958'),(600,'program_enrollments','0008_add_ended_programenrollment_status','2019-10-15 16:54:18.793465'),(601,'enterprise','0077_auto_20191002_1529','2019-10-15 21:48:34.650220'),(602,'completion','0003_learning_context','2019-10-22 18:42:12.945705'),(603,'teams','0002_slug_field_ids','2019-10-22 18:42:13.905915'),(604,'entitlements','0012_allow_blank_order_number_values','2019-10-23 16:23:32.583686'),(605,'discounts','0002_auto_20191022_1720','2019-10-25 14:14:05.485328'),(606,'commerce','0008_auto_20191024_2048','2019-10-30 16:42:28.671238'),(607,'student','0024_fbeenrollmentexclusion','2019-10-31 16:16:17.991800'),(608,'student','0025_auto_20191101_1846','2019-11-05 14:23:09.546047'),(609,'cornerstone','0006_auto_20191001_0742','2019-11-15 09:41:31.515102'),(610,'degreed','0008_auto_20191001_0742','2019-11-15 09:41:31.985210'),(611,'enterprise','0078_auto_20191107_1536','2019-11-15 09:41:32.071798'),(612,'enterprise','0079_AddEnterpriseEnrollmentSource','2019-11-15 09:41:35.077452'),(613,'enterprise','0080_auto_20191113_1708','2019-11-15 09:41:35.165258'),(614,'sap_success_factors','0020_sapsuccessfactorsenterprisecustomerconfiguration_catalogs_to_transmit','2019-11-15 09:41:35.278200'),(615,'student','0026_allowedauthuser','2019-11-15 09:41:35.750216'),(616,'teams','0003_courseteam_organization_protected','2019-11-15 09:41:36.470845'),(617,'schedules','0008_add_new_start_date_field','2019-11-21 18:12:34.458532'),(618,'enterprise','0081_UpdateEnterpriseEnrollmentSource','2019-11-25 17:51:47.303851'),(619,'enterprise','0082_AddManagementEnterpriseEnrollmentSource','2019-12-03 20:57:24.426283'),(620,'edxval','0012_thirdpartytranscriptcredentialsstate_has_creds','2019-12-06 10:56:08.552448'),(621,'edxval','0013_thirdpartytranscriptcredentialsstate_copy_values','2019-12-13 13:13:20.308012'),(622,'edxval','0014_transcript_credentials_state_retype_exists','2019-12-13 13:13:20.408578'),(623,'programs','0013_customprogramsconfig','2019-12-13 13:13:21.067118'),(624,'verify_student','0012_sspverificationretryconfig','2019-12-13 13:13:21.515002'),(625,'assessment','0004_historicalsharedfileupload_sharedfileupload','2019-12-16 06:29:30.675880'),(626,'certificates','0016_historicalgeneratedcertificate','2019-12-17 14:29:56.935433'),(627,'entitlements','0013_historicalcourseentitlementsupportdetail','2019-12-17 14:29:57.436302'),(628,'credit','0005_creditrequirement_sort_value','2019-12-19 10:51:12.337166'),(629,'student','0027_courseenrollment_mode_callable_default','2019-12-26 15:35:57.040621'),(630,'enterprise','0083_enterprisecustomerreportingconfiguration_include_date','2019-12-26 21:47:14.728344'),(631,'schedules','0009_schedule_copy_column_values','2020-01-02 13:28:19.802979'),(632,'credit','0006_creditrequirement_alter_ordering','2020-01-03 18:18:36.334211'),(633,'credit','0007_creditrequirement_copy_values','2020-01-03 18:18:36.973921'),(634,'credit','0008_creditrequirement_remove_order','2020-01-08 11:38:24.657306'),(635,'grades','0017_delete_manual_psgoverride_table','2020-01-08 11:38:25.213640'),(636,'waffle','0003_update_strings_for_i18n','2020-01-08 14:05:29.720079'),(637,'student','0028_historicalmanualenrollmentaudit','2020-01-10 11:40:11.268574'),(638,'assessment','0005_add_filename_to_sharedupload','2020-01-13 10:35:07.847171'),(639,'course_overviews','0018_add_start_end_in_CourseOverview','2020-01-13 17:26:36.464326'),(640,'wiki','0006_auto_20200110_1003','2020-01-13 17:26:36.697919'),(641,'course_modes','0013_auto_20200115_2022','2020-01-15 20:27:50.992526'),(642,'entitlements','0014_auto_20200115_2022','2020-01-15 20:27:51.322976'),(643,'schedules','0010_remove_null_blank_from_schedules_date','2020-01-22 12:55:34.725873'),(644,'edxval','0015_remove_thirdpartytranscriptcredentialsstate_exists','2020-01-24 14:35:44.099846'),(645,'enterprise','0084_auto_20200120_1137','2020-01-24 14:35:44.172381'),(646,'enterprise','0085_enterprisecustomeruser_linked','2020-01-24 14:35:44.282887'),(647,'sap_success_factors','0021_sapsuccessfactorsenterprisecustomerconfiguration_show_total_hours','2020-01-27 10:53:31.872214'),(648,'course_overviews','0019_improve_courseoverviewtab','2020-01-28 16:51:30.714982'),(649,'enterprise','0086_auto_20200128_1726','2020-01-31 16:49:18.025706'),(650,'student','0029_add_data_researcher','2020-01-31 16:49:18.401525'),(651,'entitlements','0015_add_unique_together_constraint','2020-02-11 13:55:29.655054'),(652,'external_user_ids','0001_initial','2020-02-11 13:55:31.498884'),(653,'external_user_ids','0002_mb_coaching_20200210_1754','2020-02-11 13:55:31.894541'),(654,'sap_success_factors','0022_auto_20200206_1046','2020-02-11 13:55:32.101815'),(655,'track','0002_delete_trackinglog','2020-02-11 13:55:32.134542'),(656,'enterprise','0087_auto_20200206_1151','2020-02-18 09:55:42.697992'),(657,'site_configuration','0003_auto_20200217_1058','2020-02-18 09:55:42.825644'),(658,'student','0030_userprofile_phone_number','2020-02-20 14:48:47.685095'),(659,'course_date_signals','0001_initial','2020-02-21 16:45:43.955340'),(660,'oauth_dispatch','0008_applicationaccess_filters','2020-02-21 16:45:44.019075'),(661,'site_configuration','0004_add_site_values_field','2020-02-21 16:45:44.195027'),(662,'calendar_sync','0001_initial','2020-02-21 20:04:38.131685'),(663,'site_configuration','0005_copy_values_to_site_values','2020-02-24 18:47:53.200107'),(664,'external_user_ids','0003_auto_20200224_1836','2020-02-26 19:11:47.388528'),(665,'course_overviews','0020_courseoverviewtab_url_slug','2020-02-28 17:48:04.195272'),(666,'schedules','0011_auto_20200228_2018','2020-03-02 19:21:13.196282'),(667,'schedules','0012_auto_20200302_1914','2020-03-02 19:21:13.520829'),(668,'enterprise','0088_auto_20200224_1341','2020-03-03 20:05:46.920547'),(669,'experiments','0004_historicalexperimentkeyvalue','2020-03-03 20:05:47.277998'),(670,'program_enrollments','0009_update_course_enrollment_field_to_foreign_key','2020-03-03 20:05:47.685409'),(671,'site_configuration','0005_populate_siteconfig_history_site_values','2020-03-03 20:05:47.719133'),(672,'third_party_auth','0025_auto_20200303_1448','2020-03-03 20:05:48.252619'),(673,'oauth_dispatch','0009_delete_enable_scopes_waffle_switch','2020-03-04 16:01:48.080593'),(674,'schedules','0013_historicalschedule','2020-03-04 20:45:56.581945'),(675,'content_libraries','0002_group_permissions','2020-03-06 17:55:42.233448'),(676,'enterprise','0089_auto_20200305_0652','2020-03-06 17:55:42.297353'),(677,'site_configuration','0006_copy_values_to_site_values','2020-03-06 17:55:42.678035'),(678,'site_configuration','0007_remove_values_field','2020-03-06 17:55:42.788856'),(679,'schedules','0014_historicalschedule_drop_fk','2020-03-09 17:24:50.018834'),(680,'enterprise','0090_update_content_filter','2020-03-10 17:57:05.339287'),(681,'schedules','0015_schedules_start_nullable','2020-03-10 17:57:05.707643'),(682,'courseware','0014_fix_nan_value_for_global_speed','2020-03-11 13:49:13.615966'),(683,'enterprise','0091_add_sales_force_id_in_pendingenrollment','2020-03-12 10:54:44.467230'),(684,'enterprise','0092_auto_20200312_1650','2020-03-13 15:23:45.800175'),(685,'schedules','0016_remove_start_from_schedules','2020-03-13 15:23:45.883904'),(686,'schedules','0017_remove_start_from_historicalschedule','2020-03-13 15:23:45.976652'),(687,'schedules','0018_readd_historicalschedule_fks','2020-03-16 14:38:14.274410'),(688,'student','0031_auto_20200317_1122','2020-03-17 13:50:05.335676'),(689,'schedules','0019_auto_20200316_1935','2020-03-17 18:44:35.891013'),(690,'teams','0004_alter_defaults','2020-03-18 15:44:58.524624'),(691,'edxval','0016_add_transcript_credentials_model','2020-03-27 07:02:09.981900'),(692,'assessment','0006_TeamWorkflows','2020-03-30 19:21:36.208357'),(693,'edx_when','0006_drop_active_index','2020-03-30 19:21:36.251955'),(694,'program_enrollments','0010_add_courseaccessroleassignment','2020-03-30 19:21:36.855995'),(695,'workflow','0003_TeamWorkflows','2020-03-30 19:21:36.925096'),(696,'submissions','0005_CreateTeamModel','2020-04-01 20:57:39.372024'),(697,'third_party_auth','0026_auto_20200401_1932','2020-04-02 13:16:01.972784'),(698,'enterprise','0093_add_use_enterprise_catalog_flag','2020-04-08 18:22:44.709305'),(699,'enterprise','0094_add_use_enterprise_catalog_sample','2020-04-10 22:07:16.661282'),(700,'organizations','0001_squashed_0007_historicalorganization','2020-04-10 22:07:16.677543'),(701,'submissions','0001_squashed_0005_CreateTeamModel','2020-04-10 22:07:16.686207'),(702,'admin','0003_logentry_add_action_flag_choices','2020-04-23 18:11:46.942946'),(703,'auth','0009_alter_user_last_name_max_length','2020-04-23 18:11:47.230497'),(704,'auth','0010_alter_group_name_max_length','2020-04-23 18:11:47.298692'),(705,'auth','0011_update_proxy_permissions','2020-04-23 18:11:47.664132'),(706,'edx_when','0007_meta_tweaks','2020-04-23 18:11:47.691758'),(707,'oauth2_provider','0002_auto_20190406_1805','2020-04-23 18:11:47.818878'),(708,'student','0032_removed_logout_view_configuration','2020-04-23 18:11:48.393044'),(709,'student','0001_squashed_0031_auto_20200317_1122','2020-04-23 18:11:48.408997'),(710,'edxval','0001_squashed_0016_add_transcript_credentials_model','2020-04-23 18:11:48.416824'),(711,'enterprise','0001_squashed_0092_auto_20200312_1650','2020-04-23 18:11:48.424495'),(712,'third_party_auth','0001_squashed_0026_auto_20200401_1932','2020-04-23 18:11:48.432006'),(713,'integrated_channel','0001_squashed_0007_auto_20190925_0730','2020-04-24 16:47:34.188700'),(714,'sap_success_factors','0001_squashed_0022_auto_20200206_1046','2020-04-24 16:47:34.229718'),(715,'course_overviews','0021_courseoverviewtab_link','2020-05-04 10:59:26.420098'),(716,'course_overviews','0022_courseoverviewtab_is_hidden','2020-05-04 10:59:26.485523'),(717,'edxval','0002_add_error_description_field','2020-05-04 10:59:26.540249'),(718,'external_user_ids','0004_add_lti_type','2020-05-04 10:59:26.921830'),(719,'enterprise','0095_auto_20200507_1138','2020-05-08 20:20:32.807231'),(720,'enterprise','0096_enterprise_catalog_admin_role','2020-05-13 22:12:12.358228'),(721,'student','0033_userprofile_state','2020-05-13 22:12:12.631121'),(722,'edxval','0003_delete_transcriptcredentials','2020-05-27 10:59:38.022407'),(723,'learning_sequences','0001_initial','2020-06-04 06:05:36.384464'),(724,'video_pipeline','0004_vempipelineintegration','2020-06-04 06:05:36.976657'),(725,'social_django','0009_auto_20191118_0520','2020-06-19 00:00:47.256847'),(726,'social_django','0010_uid_db_index','2020-06-19 00:00:47.498169'),(727,'student','0034_courseenrollmentcelebration','2020-06-19 00:00:48.071380'),(728,'enterprise','0097_auto_20200619_1130','2020-06-19 19:05:07.673699'),(729,'grades','0018_add_waffle_flag_defaults','2020-06-23 18:17:18.366253'),(730,'contentstore','0005_add_enable_checklists_quality_waffle_flag','2020-06-23 18:17:25.592864'),(731,'video_pipeline','0005_add_vem_course_percentage','2020-06-26 08:11:39.037796'),(732,'enterprise','0098_auto_20200629_1756','2020-07-01 12:52:54.719532'),(733,'enterprise','0099_auto_20200702_1537','2020-07-07 20:06:11.134310'),(734,'enterprise','0100_add_licensed_enterprise_course_enrollment','2020-07-07 20:06:11.808302'),(735,'calendar_sync','0002_auto_20200709_1743','2020-07-14 15:27:25.654012'),(736,'enterprise','0101_move_data_to_saved_for_later','2020-07-14 15:27:26.028971'),(737,'enterprise','0102_auto_20200708_1615','2020-07-14 15:27:26.654246'),(738,'enterprise','0103_remove_marked_done','2020-07-14 15:27:26.971098'),(739,'learning_sequences','0002_coursesectionsequence_inaccessible_after_due','2020-07-14 15:27:27.028350'),(740,'student','0035_bulkchangeenrollmentconfiguration','2020-07-21 10:54:00.239203'),(741,'third_party_auth','0002_samlproviderconfig_country','2020-07-24 14:51:01.570496'),(742,'demographics','0001_initial','2020-07-30 15:57:11.520405'),(743,'enterprise','0104_sync_query_field','2020-07-30 15:57:11.957663'),(744,'third_party_auth','0002_auto_20200721_1650','2020-07-30 15:57:13.199831'),(745,'enterprise','0105_add_branding_config_color_fields','2020-08-03 19:13:25.409291'),(746,'learning_sequences','0003_create_course_context_for_course_specific_models','2020-08-03 19:13:25.887886'),(747,'enterprise','0106_move_branding_config_colors','2020-08-04 19:27:03.655974'),(748,'enterprise','0107_remove_branding_config_banner_fields','2020-08-04 19:27:03.807197'),(749,'canvas','0001_initial','2020-08-07 08:25:52.604328'),(750,'video_pipeline','0006_remove_vempipelineintegration_vem_enabled_courses_percentage','2020-08-07 08:25:52.893607'),(751,'enterprise','0108_add_licensed_enrollment_is_revoked','2020-08-11 13:14:32.231038'),(752,'canvas','0002_auto_20200806_1632','2020-08-19 14:56:09.877192'),(753,'canvas','0003_delete_canvasglobalconfiguration','2020-08-19 14:56:09.910000'),(754,'enterprise','0109_remove_use_enterprise_catalog_sample','2020-08-19 14:56:10.428152'),(755,'learning_sequences','0004_coursecontext_self_paced','2020-08-27 17:12:29.174838'),(756,'lti_consumer','0001_initial','2020-08-28 05:03:25.559310'),(757,'demographics','0002_clean_duplicate_entries','2020-09-01 07:21:24.104649'),(758,'demographics','0003_auto_20200827_1949','2020-09-01 07:21:24.477095'),(759,'learning_sequences','0005_coursecontext_days_early_for_beta','2020-09-01 07:21:24.529202'),(760,'enterprise','0110_add_default_contract_discount','2020-09-08 14:45:45.629482'),(761,'third_party_auth','0003_samlconfiguration_is_public','2020-09-08 14:45:45.915898'),(762,'waffle','0004_update_everyone_nullbooleanfield','2020-09-08 14:45:46.161103'),(763,'canvas','0004_adding_learner_data_to_canvas','2020-09-10 19:32:16.525589'),(764,'canvas','0005_auto_20200909_1534','2020-09-10 19:32:16.587918'),(765,'enterprise','0111_pendingenterprisecustomeradminuser','2020-09-10 19:32:17.239671'),(766,'enterprise','0112_auto_20200914_0926','2020-09-14 18:11:46.480493'),(767,'enterprise','0113_auto_20200914_2054','2020-09-15 14:00:45.509556'),(768,'third_party_auth','0004_auto_20200919_0955','2020-09-19 10:14:48.965241'),(769,'moodle','0001_initial','2020-09-21 18:48:18.856556'),(770,'content_libraries','0003_contentlibrary_type','2020-09-29 19:12:15.659496'),(771,'django_celery_results','0001_initial','2020-09-29 19:12:15.694360'),(772,'django_celery_results','0002_add_task_name_args_kwargs','2020-09-29 19:12:15.809654'),(773,'django_celery_results','0003_auto_20181106_1101','2020-09-29 19:12:15.833507'),(774,'django_celery_results','0004_auto_20190516_0412','2020-09-29 19:12:16.052986'),(775,'django_celery_results','0005_taskresult_worker','2020-09-29 19:12:16.102132'),(776,'django_celery_results','0006_taskresult_date_created','2020-09-29 19:12:16.667423'),(777,'django_celery_results','0007_remove_taskresult_hidden','2020-09-29 19:12:16.755206'),(778,'blackboard','0001_initial','2020-10-12 12:35:06.797823'),(779,'blackboard','0002_auto_20200930_1723','2020-10-12 12:35:07.366441'),(780,'content_libraries','0004_contentlibrary_license','2020-10-12 12:35:07.419331'),(781,'moodle','0002_moodlelearnerdatatransmissionaudit','2020-10-12 12:35:07.476549'),(782,'moodle','0003_auto_20201006_1706','2020-10-12 12:35:08.025527'),(783,'video_pipeline','0007_delete_videopipelineintegration','2020-10-12 12:35:08.047690'),(784,'student','0036_userpasswordtogglehistory','2020-10-16 09:07:26.265232'),(785,'blackboard','0003_blackboardlearnerdatatransmissionaudit','2020-10-16 12:50:02.047539'),(786,'blackboard','0004_blackboard_tx_chunk_size_default_1','2020-10-16 12:50:02.319652'),(787,'student','0037_linkedinaddtoprofileconfiguration_updates','2020-10-19 16:34:15.440350'),(788,'enterprise','0114_auto_20201020_0142','2020-10-20 09:17:29.433349'),(789,'enterprise','0115_enterpriseanalyticsuser_historicalenterpriseanalyticsuser','2020-11-09 17:41:00.155008'),(790,'moodle','0004_auto_20201105_1921','2020-11-09 17:41:00.540159'),(791,'student','0038_auto_20201021_1256','2020-11-09 17:41:00.735441'),(792,'verify_student','0013_add_expiration_date_field','2020-11-10 18:20:23.829015'),(793,'organizations','0002_unique_short_name','2020-11-13 16:20:21.924206'),(794,'course_overviews','0023_courseoverview_banner_image_url','2020-11-17 16:12:24.619688'),(795,'learning_sequences','0006_coursecontext_entrance_exam_id','2020-11-17 16:12:24.676411'),(796,'learning_sequences','0007_coursesequenceexam','2020-11-17 16:12:24.761211'),(797,'enterprise','0116_auto_20201116_0400','2020-11-18 11:46:02.034003'),(798,'certificates','0017_add_mode_20201118_1725','2020-11-19 06:41:36.871517'),(799,'django_celery_results','0008_chordcounter','2020-11-19 16:04:41.314566'),(800,'integrated_channel','0002_learnerdatatransmissionaudit_subsection_id','2020-12-02 12:39:14.273607'),(801,'shoppingcart','0005_drop_tables','2020-12-02 18:21:32.233383'),(802,'canvas','0006_canvaslearnerassessmentdatatransmissionaudit','2020-12-09 12:58:46.135456'),(803,'event_routing_backends','0001_initial','2020-12-09 12:58:46.473881'),(804,'workflow','0004_assessmentworkflowstep_skipped','2020-12-09 12:58:46.553747'),(805,'blackboard','0005_blackboardlearnerassessmentdatatransmissionaudit','2020-12-10 19:40:03.170018'),(806,'edx_proctoring','0011_allow_multiple_attempts','2020-12-10 19:40:03.397172'),(807,'enterprise','0116_auto_20201208_1759','2020-12-10 19:40:04.030440'),(808,'lti_consumer','0002_ltiagslineitem','2020-12-10 19:40:04.072921'),(809,'lti_consumer','0003_ltiagsscore','2020-12-10 19:40:04.153180'),(810,'lti_consumer','0004_keyset_mgmt_to_model','2020-12-10 19:40:04.413207'),(811,'lti_consumer','0005_migrate_keyset_to_model','2020-12-10 19:40:04.730102'),(812,'enterprise','0117_auto_20201215_0258','2020-12-15 14:41:12.282462'),(813,'discussions','0001_initial','2020-12-17 01:49:14.636626'),(814,'edx_proctoring','0012_proctoredexamstudentattempt_time_remaining_seconds','2021-01-06 14:38:10.168143'),(815,'enterprise','unique_constraints_pending_users','2021-01-06 14:38:11.083044'),(816,'edx_proctoring','0013_proctoredexamsoftwaresecurereview_is_active_attempt','2021-01-15 13:55:20.342878'),(817,'enterprise','0001_auto_20210111_1253','2021-01-15 13:55:20.733416'),(818,'lti_consumer','0006_add_on_model_config_for_lti_1p1','2021-01-20 05:10:46.449055'),(819,'student','0039_anon_id_context','2021-01-21 23:59:17.606730'),(820,'degreed','0009_auto_20210119_1546','2021-01-25 14:55:25.176395'),(821,'enterprise','0120_systemwiderole_applies_to_all_contexts','2021-01-25 14:55:25.606196'),(822,'system_wide_roles','0003_systemwideroleassignment_applies_to_all_contexts','2021-01-25 14:55:25.833693'),(823,'enterprise','0121_systemwiderole_add_ent_cust_field','2021-01-28 18:42:38.327352'),(824,'discussions','0002_add_provider_filter','2021-02-02 19:44:22.878954'),(825,'enterprise','0122_remove_field_sync_enterprise_catalog_query','2021-02-02 19:44:23.335474'),(826,'certificates','0018_historicalcertificateinvalidation','2021-02-04 15:15:11.607853'),(827,'organizations','0003_historicalorganizationcourse','2021-02-09 05:08:52.403058'),(828,'enterprise','0123_enterprisecustomeridentityprovider_default_provider','2021-02-16 09:07:05.975068'),(829,'certificates','0019_allowlistgenerationconfiguration','2021-02-19 08:06:31.380357'),(830,'lti_consumer','0007_ltidlcontentitem','2021-02-19 08:06:31.700218'),(831,'lti_consumer','0008_fix_uuid_backfill','2021-02-19 08:06:32.086477'),(832,'sap_success_factors','0002_sapsuccessfactorslearnerdatatransmissionaudit_credit_hours','2021-02-19 08:06:32.133969'),(833,'certificates','0020_remove_existing_mgmt_cmd_args','2021-02-22 16:22:52.441216'),(834,'credentials','0005_remove_existing_mgmt_cmd_args','2021-02-22 16:22:52.467478'),(835,'student','0040_usercelebration','2021-02-22 16:22:52.967882');
+INSERT INTO `django_migrations` VALUES (1,'contenttypes','0001_initial','2019-02-06 07:56:07.314317'),(2,'auth','0001_initial','2019-02-06 07:56:07.832368'),(3,'admin','0001_initial','2019-02-06 07:56:07.961256'),(4,'admin','0002_logentry_remove_auto_add','2019-02-06 07:56:08.013912'),(5,'sites','0001_initial','2019-02-06 07:56:08.072888'),(6,'contenttypes','0002_remove_content_type_name','2019-02-06 07:56:08.230528'),(7,'api_admin','0001_initial','2019-02-06 07:56:08.454101'),(8,'api_admin','0002_auto_20160325_1604','2019-02-06 07:56:08.533622'),(9,'api_admin','0003_auto_20160404_1618','2019-02-06 07:56:08.983603'),(10,'api_admin','0004_auto_20160412_1506','2019-02-06 07:56:09.311723'),(11,'api_admin','0005_auto_20160414_1232','2019-02-06 07:56:09.410291'),(12,'api_admin','0006_catalog','2019-02-06 07:56:09.439372'),(13,'api_admin','0007_delete_historical_api_records','2019-02-06 07:56:09.673117'),(14,'assessment','0001_initial','2019-02-06 07:56:11.477983'),(15,'assessment','0002_staffworkflow','2019-02-06 07:56:11.625937'),(16,'assessment','0003_expand_course_id','2019-02-06 07:56:11.815858'),(17,'auth','0002_alter_permission_name_max_length','2019-02-06 07:56:11.891156'),(18,'auth','0003_alter_user_email_max_length','2019-02-06 07:56:11.975525'),(19,'auth','0004_alter_user_username_opts','2019-02-06 07:56:12.013750'),(20,'auth','0005_alter_user_last_login_null','2019-02-06 07:56:12.096481'),(21,'auth','0006_require_contenttypes_0002','2019-02-06 07:56:12.108286'),(22,'auth','0007_alter_validators_add_error_messages','2019-02-06 07:56:12.164989'),(23,'auth','0008_alter_user_username_max_length','2019-02-06 07:56:12.240860'),(24,'instructor_task','0001_initial','2019-02-06 07:56:12.395820'),(25,'certificates','0001_initial','2019-02-06 07:56:13.480164'),(26,'certificates','0002_data__certificatehtmlviewconfiguration_data','2019-02-06 07:56:13.607503'),(27,'certificates','0003_data__default_modes','2019-02-06 07:56:13.751659'),(28,'certificates','0004_certificategenerationhistory','2019-02-06 07:56:13.904399'),(29,'certificates','0005_auto_20151208_0801','2019-02-06 07:56:13.986383'),(30,'certificates','0006_certificatetemplateasset_asset_slug','2019-02-06 07:56:14.058304'),(31,'certificates','0007_certificateinvalidation','2019-02-06 07:56:14.210453'),(32,'badges','0001_initial','2019-02-06 07:56:14.782804'),(33,'badges','0002_data__migrate_assertions','2019-02-06 07:56:15.175628'),(34,'badges','0003_schema__add_event_configuration','2019-02-06 07:56:15.324266'),(35,'block_structure','0001_config','2019-02-06 07:56:15.455000'),(36,'block_structure','0002_blockstructuremodel','2019-02-06 07:56:15.522120'),(37,'block_structure','0003_blockstructuremodel_storage','2019-02-06 07:56:15.564915'),(38,'block_structure','0004_blockstructuremodel_usagekeywithrun','2019-02-06 07:56:15.616240'),(39,'bookmarks','0001_initial','2019-02-06 07:56:16.017402'),(40,'branding','0001_initial','2019-02-06 07:56:16.267188'),(41,'course_modes','0001_initial','2019-02-06 07:56:16.438443'),(42,'course_modes','0002_coursemode_expiration_datetime_is_explicit','2019-02-06 07:56:16.519337'),(43,'course_modes','0003_auto_20151113_1443','2019-02-06 07:56:16.576659'),(44,'course_modes','0004_auto_20151113_1457','2019-02-06 07:56:16.732369'),(45,'course_modes','0005_auto_20151217_0958','2019-02-06 07:56:16.788036'),(46,'course_modes','0006_auto_20160208_1407','2019-02-06 07:56:16.883873'),(47,'course_modes','0007_coursemode_bulk_sku','2019-02-06 07:56:17.029222'),(48,'course_groups','0001_initial','2019-02-06 07:56:18.181254'),(49,'bulk_email','0001_initial','2019-02-06 07:56:18.660435'),(50,'bulk_email','0002_data__load_course_email_template','2019-02-06 07:56:18.937143'),(51,'bulk_email','0003_config_model_feature_flag','2019-02-06 07:56:19.093038'),(52,'bulk_email','0004_add_email_targets','2019-02-06 07:56:19.788595'),(53,'bulk_email','0005_move_target_data','2019-02-06 07:56:19.959402'),(54,'bulk_email','0006_course_mode_targets','2019-02-06 07:56:20.165336'),(55,'catalog','0001_initial','2019-02-06 07:56:20.308745'),(56,'catalog','0002_catalogintegration_username','2019-02-06 07:56:20.439737'),(57,'catalog','0003_catalogintegration_page_size','2019-02-06 07:56:20.584307'),(58,'catalog','0004_auto_20170616_0618','2019-02-06 07:56:20.692298'),(59,'catalog','0005_catalogintegration_long_term_cache_ttl','2019-02-06 07:56:20.821560'),(60,'django_comment_common','0001_initial','2019-02-06 07:56:21.271577'),(61,'django_comment_common','0002_forumsconfig','2019-02-06 07:56:21.463632'),(62,'verified_track_content','0001_initial','2019-02-06 07:56:21.537783'),(63,'course_overviews','0001_initial','2019-02-06 07:56:21.715657'),(64,'course_overviews','0002_add_course_catalog_fields','2019-02-06 07:56:21.984772'),(65,'course_overviews','0003_courseoverviewgeneratedhistory','2019-02-06 07:56:22.053252'),(66,'course_overviews','0004_courseoverview_org','2019-02-06 07:56:22.134954'),(67,'course_overviews','0005_delete_courseoverviewgeneratedhistory','2019-02-06 07:56:22.184071'),(68,'course_overviews','0006_courseoverviewimageset','2019-02-06 07:56:22.290455'),(69,'course_overviews','0007_courseoverviewimageconfig','2019-02-06 07:56:22.466348'),(70,'course_overviews','0008_remove_courseoverview_facebook_url','2019-02-06 07:56:22.484576'),(71,'course_overviews','0009_readd_facebook_url','2019-02-06 07:56:22.501725'),(72,'course_overviews','0010_auto_20160329_2317','2019-02-06 07:56:22.645825'),(73,'ccx','0001_initial','2019-02-06 07:56:23.183002'),(74,'ccx','0002_customcourseforedx_structure_json','2019-02-06 07:56:23.289052'),(75,'ccx','0003_add_master_course_staff_in_ccx','2019-02-06 07:56:23.840989'),(76,'ccx','0004_seed_forum_roles_in_ccx_courses','2019-02-06 07:56:23.988777'),(77,'ccx','0005_change_ccx_coach_to_staff','2019-02-06 07:56:24.160387'),(78,'ccx','0006_set_display_name_as_override','2019-02-06 07:56:24.337876'),(79,'ccxcon','0001_initial_ccxcon_model','2019-02-06 07:56:24.409092'),(80,'ccxcon','0002_auto_20160325_0407','2019-02-06 07:56:24.470172'),(81,'djcelery','0001_initial','2019-02-06 07:56:25.046777'),(82,'celery_utils','0001_initial','2019-02-06 07:56:25.165469'),(83,'celery_utils','0002_chordable_django_backend','2019-02-06 07:56:25.339734'),(84,'certificates','0008_schema__remove_badges','2019-02-06 07:56:25.535263'),(85,'certificates','0009_certificategenerationcoursesetting_language_self_generation','2019-02-06 07:56:25.851268'),(86,'certificates','0010_certificatetemplate_language','2019-02-06 07:56:25.927039'),(87,'certificates','0011_certificatetemplate_alter_unique','2019-02-06 07:56:26.154544'),(88,'certificates','0012_certificategenerationcoursesetting_include_hours_of_effort','2019-02-06 07:56:26.228554'),(89,'certificates','0013_remove_certificategenerationcoursesetting_enabled','2019-02-06 07:56:26.310926'),(90,'certificates','0014_change_eligible_certs_manager','2019-02-06 07:56:26.373051'),(91,'commerce','0001_data__add_ecommerce_service_user','2019-02-06 07:56:26.595906'),(92,'commerce','0002_commerceconfiguration','2019-02-06 07:56:26.698815'),(93,'commerce','0003_auto_20160329_0709','2019-02-06 07:56:26.761254'),(94,'commerce','0004_auto_20160531_0950','2019-02-06 07:56:27.150989'),(95,'commerce','0005_commerceconfiguration_enable_automatic_refund_approval','2019-02-06 07:56:27.241421'),(96,'commerce','0006_auto_20170424_1734','2019-02-06 07:56:27.316222'),(97,'commerce','0007_auto_20180313_0609','2019-02-06 07:56:27.466841'),(98,'completion','0001_initial','2019-02-06 07:56:27.696977'),(99,'completion','0002_auto_20180125_1510','2019-02-06 07:56:27.757853'),(100,'enterprise','0001_initial','2019-02-06 07:56:28.027244'),(101,'enterprise','0002_enterprisecustomerbrandingconfiguration','2019-02-06 07:56:28.117647'),(102,'enterprise','0003_auto_20161104_0937','2019-02-06 07:56:28.428631'),(103,'enterprise','0004_auto_20161114_0434','2019-02-06 07:56:28.594141'),(104,'enterprise','0005_pendingenterprisecustomeruser','2019-02-06 07:56:28.710577'),(105,'enterprise','0006_auto_20161121_0241','2019-02-06 07:56:28.775663'),(106,'enterprise','0007_auto_20161109_1511','2019-02-06 07:56:28.924039'),(107,'enterprise','0008_auto_20161124_2355','2019-02-06 07:56:29.200628'),(108,'enterprise','0009_auto_20161130_1651','2019-02-06 07:56:29.740933'),(109,'enterprise','0010_auto_20161222_1212','2019-02-06 07:56:29.889801'),(110,'enterprise','0011_enterprisecustomerentitlement_historicalenterprisecustomerentitlement','2019-02-06 07:56:30.134143'),(111,'enterprise','0012_auto_20170125_1033','2019-02-06 07:56:30.264122'),(112,'enterprise','0013_auto_20170125_1157','2019-02-06 07:56:30.893749'),(113,'enterprise','0014_enrollmentnotificationemailtemplate_historicalenrollmentnotificationemailtemplate','2019-02-06 07:56:31.215731'),(114,'enterprise','0015_auto_20170130_0003','2019-02-06 07:56:31.450278'),(115,'enterprise','0016_auto_20170405_0647','2019-02-06 07:56:32.231656'),(116,'enterprise','0017_auto_20170508_1341','2019-02-06 07:56:32.492394'),(117,'enterprise','0018_auto_20170511_1357','2019-02-06 07:56:32.686868'),(118,'enterprise','0019_auto_20170606_1853','2019-02-06 07:56:32.884924'),(119,'enterprise','0020_auto_20170624_2316','2019-02-06 07:56:33.722514'),(120,'enterprise','0021_auto_20170711_0712','2019-02-06 07:56:34.290994'),(121,'enterprise','0022_auto_20170720_1543','2019-02-06 07:56:34.459932'),(122,'enterprise','0023_audit_data_reporting_flag','2019-02-06 07:56:34.693710'),(123,'enterprise','0024_enterprisecustomercatalog_historicalenterprisecustomercatalog','2019-02-06 07:56:34.991211'),(124,'enterprise','0025_auto_20170828_1412','2019-02-06 07:56:35.555899'),(125,'enterprise','0026_make_require_account_level_consent_nullable','2019-02-06 07:56:35.765541'),(126,'enterprise','0027_remove_account_level_consent','2019-02-06 07:56:36.799493'),(127,'enterprise','0028_link_enterprise_to_enrollment_template','2019-02-06 07:56:37.434413'),(128,'enterprise','0029_auto_20170925_1909','2019-02-06 07:56:37.650440'),(129,'enterprise','0030_auto_20171005_1600','2019-02-06 07:56:38.219936'),(130,'enterprise','0031_auto_20171012_1249','2019-02-06 07:56:38.438979'),(131,'enterprise','0032_reporting_model','2019-02-06 07:56:38.594362'),(132,'enterprise','0033_add_history_change_reason_field','2019-02-06 07:56:39.182772'),(133,'enterprise','0034_auto_20171023_0727','2019-02-06 07:56:39.321896'),(134,'enterprise','0035_auto_20171212_1129','2019-02-06 07:56:39.517158'),(135,'enterprise','0036_sftp_reporting_support','2019-02-06 07:56:39.958256'),(136,'enterprise','0037_auto_20180110_0450','2019-02-06 07:56:40.144689'),(137,'enterprise','0038_auto_20180122_1427','2019-02-06 07:56:40.326004'),(138,'enterprise','0039_auto_20180129_1034','2019-02-06 07:56:40.539093'),(139,'enterprise','0040_auto_20180129_1428','2019-02-06 07:56:40.854288'),(140,'enterprise','0041_auto_20180212_1507','2019-02-06 07:56:41.037158'),(141,'consent','0001_initial','2019-02-06 07:56:41.608778'),(142,'consent','0002_migrate_to_new_data_sharing_consent','2019-02-06 07:56:42.267785'),(143,'consent','0003_historicaldatasharingconsent_history_change_reason','2019-02-06 07:56:42.405847'),(144,'consent','0004_datasharingconsenttextoverrides','2019-02-06 07:56:42.584250'),(145,'sites','0002_alter_domain_unique','2019-02-06 07:56:42.663878'),(146,'course_overviews','0011_courseoverview_marketing_url','2019-02-06 07:56:42.745921'),(147,'course_overviews','0012_courseoverview_eligible_for_financial_aid','2019-02-06 07:56:42.834692'),(148,'course_overviews','0013_courseoverview_language','2019-02-06 07:56:42.913480'),(149,'course_overviews','0014_courseoverview_certificate_available_date','2019-02-06 07:56:42.991669'),(150,'content_type_gating','0001_initial','2019-02-06 07:56:43.235932'),(151,'content_type_gating','0002_auto_20181119_0959','2019-02-06 07:56:43.426345'),(152,'content_type_gating','0003_auto_20181128_1407','2019-02-06 07:56:43.580657'),(153,'content_type_gating','0004_auto_20181128_1521','2019-02-06 07:56:43.695613'),(154,'contentserver','0001_initial','2019-02-06 07:56:43.851239'),(155,'contentserver','0002_cdnuseragentsconfig','2019-02-06 07:56:44.018561'),(156,'cors_csrf','0001_initial','2019-02-06 07:56:44.181287'),(157,'course_action_state','0001_initial','2019-02-06 07:56:44.503331'),(158,'course_duration_limits','0001_initial','2019-02-06 07:56:44.746279'),(159,'course_duration_limits','0002_auto_20181119_0959','2019-02-06 07:56:44.877465'),(160,'course_duration_limits','0003_auto_20181128_1407','2019-02-06 07:56:45.039785'),(161,'course_duration_limits','0004_auto_20181128_1521','2019-02-06 07:56:45.182919'),(162,'course_goals','0001_initial','2019-02-06 07:56:45.519690'),(163,'course_goals','0002_auto_20171010_1129','2019-02-06 07:56:45.644315'),(164,'course_groups','0002_change_inline_default_cohort_value','2019-02-06 07:56:45.709570'),(165,'course_groups','0003_auto_20170609_1455','2019-02-06 07:56:45.983496'),(166,'course_modes','0008_course_key_field_to_foreign_key','2019-02-06 07:56:46.593883'),(167,'course_modes','0009_suggested_prices_to_charfield','2019-02-06 07:56:46.661433'),(168,'course_modes','0010_archived_suggested_prices_to_charfield','2019-02-06 07:56:46.723034'),(169,'course_modes','0011_change_regex_for_comma_separated_ints','2019-02-06 07:56:46.829468'),(170,'courseware','0001_initial','2019-02-06 07:56:49.952932'),(171,'courseware','0002_coursedynamicupgradedeadlineconfiguration_dynamicupgradedeadlineconfiguration','2019-02-06 07:56:50.721374'),(172,'courseware','0003_auto_20170825_0935','2019-02-06 07:56:50.903279'),(173,'courseware','0004_auto_20171010_1639','2019-02-06 07:56:51.166884'),(174,'courseware','0005_orgdynamicupgradedeadlineconfiguration','2019-02-06 07:56:51.597870'),(175,'courseware','0006_remove_module_id_index','2019-02-06 07:56:51.781895'),(176,'courseware','0007_remove_done_index','2019-02-06 07:56:51.968472'),(177,'coursewarehistoryextended','0001_initial','2019-02-06 07:56:52.632278'),(178,'coursewarehistoryextended','0002_force_studentmodule_index','2019-02-06 07:56:52.709752'),(179,'crawlers','0001_initial','2019-02-06 07:56:53.074661'),(180,'crawlers','0002_auto_20170419_0018','2019-02-06 07:56:53.203552'),(181,'credentials','0001_initial','2019-02-06 07:56:53.404087'),(182,'credentials','0002_auto_20160325_0631','2019-02-06 07:56:53.531754'),(183,'credentials','0003_auto_20170525_1109','2019-02-06 07:56:53.709376'),(184,'credentials','0004_notifycredentialsconfig','2019-02-06 07:56:53.854337'),(185,'credit','0001_initial','2019-02-06 07:56:55.324738'),(186,'credit','0002_creditconfig','2019-02-06 07:56:55.478476'),(187,'credit','0003_auto_20160511_2227','2019-02-06 07:56:55.552916'),(188,'credit','0004_delete_historical_credit_records','2019-02-06 07:56:56.180340'),(189,'dark_lang','0001_initial','2019-02-06 07:56:56.341474'),(190,'dark_lang','0002_data__enable_on_install','2019-02-06 07:56:56.783194'),(191,'dark_lang','0003_auto_20180425_0359','2019-02-06 07:56:57.055067'),(192,'database_fixups','0001_initial','2019-02-06 07:56:57.627927'),(193,'degreed','0001_initial','2019-02-06 07:56:58.969941'),(194,'degreed','0002_auto_20180104_0103','2019-02-06 07:56:59.471941'),(195,'degreed','0003_auto_20180109_0712','2019-02-06 07:56:59.731040'),(196,'degreed','0004_auto_20180306_1251','2019-02-06 07:56:59.997860'),(197,'degreed','0005_auto_20180807_1302','2019-02-06 07:57:02.069830'),(198,'degreed','0006_upgrade_django_simple_history','2019-02-06 07:57:02.273708'),(199,'django_comment_common','0003_enable_forums','2019-02-06 07:57:02.626514'),(200,'django_comment_common','0004_auto_20161117_1209','2019-02-06 07:57:02.820104'),(201,'django_comment_common','0005_coursediscussionsettings','2019-02-06 07:57:02.896624'),(202,'django_comment_common','0006_coursediscussionsettings_discussions_id_map','2019-02-06 07:57:02.998038'),(203,'django_comment_common','0007_discussionsidmapping','2019-02-06 07:57:03.083783'),(204,'django_comment_common','0008_role_user_index','2019-02-06 07:57:03.168933'),(205,'django_notify','0001_initial','2019-02-06 07:57:04.348365'),(206,'django_openid_auth','0001_initial','2019-02-06 07:57:04.778823'),(207,'oauth2','0001_initial','2019-02-06 07:57:06.639640'),(208,'edx_oauth2_provider','0001_initial','2019-02-06 07:57:06.912829'),(209,'edx_proctoring','0001_initial','2019-02-06 07:57:11.833284'),(210,'edx_proctoring','0002_proctoredexamstudentattempt_is_status_acknowledged','2019-02-06 07:57:12.158509'),(211,'edx_proctoring','0003_auto_20160101_0525','2019-02-06 07:57:12.624375'),(212,'edx_proctoring','0004_auto_20160201_0523','2019-02-06 07:57:13.412490'),(213,'edx_proctoring','0005_proctoredexam_hide_after_due','2019-02-06 07:57:13.542482'),(214,'edx_proctoring','0006_allowed_time_limit_mins','2019-02-06 07:57:13.995842'),(215,'edx_proctoring','0007_proctoredexam_backend','2019-02-06 07:57:14.113562'),(216,'edx_proctoring','0008_auto_20181116_1551','2019-02-06 07:57:14.705891'),(217,'edx_proctoring','0009_proctoredexamreviewpolicy_remove_rules','2019-02-06 07:57:15.116276'),(218,'edxval','0001_initial','2019-02-06 07:57:15.863533'),(219,'edxval','0002_data__default_profiles','2019-02-06 07:57:16.818661'),(220,'edxval','0003_coursevideo_is_hidden','2019-02-06 07:57:16.918246'),(221,'edxval','0004_data__add_hls_profile','2019-02-06 07:57:17.289957'),(222,'edxval','0005_videoimage','2019-02-06 07:57:17.492770'),(223,'edxval','0006_auto_20171009_0725','2019-02-06 07:57:17.716551'),(224,'edxval','0007_transcript_credentials_state','2019-02-06 07:57:17.845730'),(225,'edxval','0008_remove_subtitles','2019-02-06 07:57:17.992131'),(226,'edxval','0009_auto_20171127_0406','2019-02-06 07:57:18.060122'),(227,'edxval','0010_add_video_as_foreign_key','2019-02-06 07:57:18.365704'),(228,'edxval','0011_data__add_audio_mp3_profile','2019-02-06 07:57:18.730704'),(229,'email_marketing','0001_initial','2019-02-06 07:57:19.051984'),(230,'email_marketing','0002_auto_20160623_1656','2019-02-06 07:57:21.789475'),(231,'email_marketing','0003_auto_20160715_1145','2019-02-06 07:57:22.963260'),(232,'email_marketing','0004_emailmarketingconfiguration_welcome_email_send_delay','2019-02-06 07:57:23.293836'),(233,'email_marketing','0005_emailmarketingconfiguration_user_registration_cookie_timeout_delay','2019-02-06 07:57:23.617029'),(234,'email_marketing','0006_auto_20170711_0615','2019-02-06 07:57:24.245380'),(235,'email_marketing','0007_auto_20170809_0653','2019-02-06 07:57:24.897713'),(236,'email_marketing','0008_auto_20170809_0539','2019-02-06 07:57:25.325581'),(237,'email_marketing','0009_remove_emailmarketingconfiguration_sailthru_activation_template','2019-02-06 07:57:25.603626'),(238,'email_marketing','0010_auto_20180425_0800','2019-02-06 07:57:26.312049'),(239,'embargo','0001_initial','2019-02-06 07:57:28.072877'),(240,'embargo','0002_data__add_countries','2019-02-06 07:57:29.877570'),(241,'enterprise','0042_replace_sensitive_sso_username','2019-02-06 07:57:30.224348'),(242,'enterprise','0043_auto_20180507_0138','2019-02-06 07:57:30.838462'),(243,'enterprise','0044_reporting_config_multiple_types','2019-02-06 07:57:31.233674'),(244,'enterprise','0045_report_type_json','2019-02-06 07:57:31.322889'),(245,'enterprise','0046_remove_unique_constraints','2019-02-06 07:57:31.424455'),(246,'enterprise','0047_auto_20180517_0457','2019-02-06 07:57:31.785098'),(247,'enterprise','0048_enterprisecustomeruser_active','2019-02-06 07:57:31.904647'),(248,'enterprise','0049_auto_20180531_0321','2019-02-06 07:57:32.509863'),(249,'enterprise','0050_progress_v2','2019-02-06 07:57:33.253255'),(250,'enterprise','0051_add_enterprise_slug','2019-02-06 07:57:34.073175'),(251,'enterprise','0052_create_unique_slugs','2019-02-06 07:57:34.414601'),(252,'enterprise','0053_pendingenrollment_cohort_name','2019-02-06 07:57:34.520875'),(253,'enterprise','0053_auto_20180911_0811','2019-02-06 07:57:34.914654'),(254,'enterprise','0054_merge_20180914_1511','2019-02-06 07:57:34.944784'),(255,'enterprise','0055_auto_20181015_1112','2019-02-06 07:57:35.409450'),(256,'enterprise','0056_enterprisecustomerreportingconfiguration_pgp_encryption_key','2019-02-06 07:57:35.545845'),(257,'enterprise','0057_enterprisecustomerreportingconfiguration_enterprise_customer_catalogs','2019-02-06 07:57:35.960406'),(258,'enterprise','0058_auto_20181212_0145','2019-02-06 07:57:37.113916'),(259,'enterprise','0059_add_code_management_portal_config','2019-02-06 07:57:37.575928'),(260,'enterprise','0060_upgrade_django_simple_history','2019-02-06 07:57:38.213269'),(261,'student','0001_initial','2019-02-06 07:57:47.588358'),(262,'student','0002_auto_20151208_1034','2019-02-06 07:57:47.836707'),(263,'student','0003_auto_20160516_0938','2019-02-06 07:57:48.149932'),(264,'student','0004_auto_20160531_1422','2019-02-06 07:57:48.286460'),(265,'student','0005_auto_20160531_1653','2019-02-06 07:57:48.431860'),(266,'student','0006_logoutviewconfiguration','2019-02-06 07:57:48.974430'),(267,'student','0007_registrationcookieconfiguration','2019-02-06 07:57:49.147001'),(268,'student','0008_auto_20161117_1209','2019-02-06 07:57:49.263656'),(269,'student','0009_auto_20170111_0422','2019-02-06 07:57:49.377186'),(270,'student','0010_auto_20170207_0458','2019-02-06 07:57:49.407334'),(271,'student','0011_course_key_field_to_foreign_key','2019-02-06 07:57:50.975260'),(272,'student','0012_sociallink','2019-02-06 07:57:51.409953'),(273,'student','0013_delete_historical_enrollment_records','2019-02-06 07:57:52.968613'),(274,'entitlements','0001_initial','2019-02-06 07:57:53.425447'),(275,'entitlements','0002_auto_20171102_0719','2019-02-06 07:57:55.014484'),(276,'entitlements','0003_auto_20171205_1431','2019-02-06 07:57:57.282703'),(277,'entitlements','0004_auto_20171206_1729','2019-02-06 07:57:57.704486'),(278,'entitlements','0005_courseentitlementsupportdetail','2019-02-06 07:57:58.400522'),(279,'entitlements','0006_courseentitlementsupportdetail_action','2019-02-06 07:57:59.000339'),(280,'entitlements','0007_change_expiration_period_default','2019-02-06 07:57:59.217527'),(281,'entitlements','0008_auto_20180328_1107','2019-02-06 07:58:00.023003'),(282,'entitlements','0009_courseentitlement_refund_locked','2019-02-06 07:58:00.552995'),(283,'entitlements','0010_backfill_refund_lock','2019-02-06 07:58:01.471558'),(284,'experiments','0001_initial','2019-02-06 07:58:02.990331'),(285,'experiments','0002_auto_20170627_1402','2019-02-06 07:58:03.207899'),(286,'experiments','0003_auto_20170713_1148','2019-02-06 07:58:03.289623'),(287,'external_auth','0001_initial','2019-02-06 07:58:04.122332'),(288,'grades','0001_initial','2019-02-06 07:58:04.449795'),(289,'grades','0002_rename_last_edited_field','2019-02-06 07:58:04.542638'),(290,'grades','0003_coursepersistentgradesflag_persistentgradesenabledflag','2019-02-06 07:58:05.727274'),(291,'grades','0004_visibleblocks_course_id','2019-02-06 07:58:05.867193'),(292,'grades','0005_multiple_course_flags','2019-02-06 07:58:06.312646'),(293,'grades','0006_persistent_course_grades','2019-02-06 07:58:06.568446'),(294,'grades','0007_add_passed_timestamp_column','2019-02-06 07:58:07.247313'),(295,'grades','0008_persistentsubsectiongrade_first_attempted','2019-02-06 07:58:07.349076'),(296,'grades','0009_auto_20170111_1507','2019-02-06 07:58:07.498641'),(297,'grades','0010_auto_20170112_1156','2019-02-06 07:58:07.583662'),(298,'grades','0011_null_edited_time','2019-02-06 07:58:07.916494'),(299,'grades','0012_computegradessetting','2019-02-06 07:58:08.432066'),(300,'grades','0013_persistentsubsectiongradeoverride','2019-02-06 07:58:08.633723'),(301,'grades','0014_persistentsubsectiongradeoverridehistory','2019-02-06 07:58:09.160210'),(302,'instructor_task','0002_gradereportsetting','2019-02-06 07:58:09.580204'),(303,'waffle','0001_initial','2019-02-06 07:58:10.444295'),(304,'sap_success_factors','0001_initial','2019-02-06 07:58:12.042509'),(305,'sap_success_factors','0002_auto_20170224_1545','2019-02-06 07:58:13.979236'),(306,'sap_success_factors','0003_auto_20170317_1402','2019-02-06 07:58:14.701821'),(307,'sap_success_factors','0004_catalogtransmissionaudit_audit_summary','2019-02-06 07:58:14.797945'),(308,'sap_success_factors','0005_historicalsapsuccessfactorsenterprisecustomerconfiguration_history_change_reason','2019-02-06 07:58:15.137352'),(309,'sap_success_factors','0006_sapsuccessfactors_use_enterprise_enrollment_page_waffle_flag','2019-02-06 07:58:15.692938'),(310,'sap_success_factors','0007_remove_historicalsapsuccessfactorsenterprisecustomerconfiguration_history_change_reason','2019-02-06 07:58:16.090806'),(311,'sap_success_factors','0008_historicalsapsuccessfactorsenterprisecustomerconfiguration_history_change_reason','2019-02-06 07:58:16.886204'),(312,'sap_success_factors','0009_sapsuccessfactors_remove_enterprise_enrollment_page_waffle_flag','2019-02-06 07:58:17.493133'),(313,'sap_success_factors','0010_move_audit_tables_to_base_integrated_channel','2019-02-06 07:58:18.256051'),(314,'integrated_channel','0001_initial','2019-02-06 07:58:18.434760'),(315,'integrated_channel','0002_delete_enterpriseintegratedchannel','2019-02-06 07:58:18.534852'),(316,'integrated_channel','0003_catalogtransmissionaudit_learnerdatatransmissionaudit','2019-02-06 07:58:18.697143'),(317,'integrated_channel','0004_catalogtransmissionaudit_channel','2019-02-06 07:58:18.821246'),(318,'integrated_channel','0005_auto_20180306_1251','2019-02-06 07:58:19.378821'),(319,'integrated_channel','0006_delete_catalogtransmissionaudit','2019-02-06 07:58:19.463872'),(320,'lms_xblock','0001_initial','2019-02-06 07:58:19.938021'),(321,'microsite_configuration','0001_initial','2019-02-06 07:58:24.417944'),(322,'microsite_configuration','0002_auto_20160202_0228','2019-02-06 07:58:24.704162'),(323,'microsite_configuration','0003_delete_historical_records','2019-02-06 07:58:27.217560'),(324,'milestones','0001_initial','2019-02-06 07:58:28.438298'),(325,'milestones','0002_data__seed_relationship_types','2019-02-06 07:58:29.074808'),(326,'milestones','0003_coursecontentmilestone_requirements','2019-02-06 07:58:29.198318'),(327,'milestones','0004_auto_20151221_1445','2019-02-06 07:58:29.608126'),(328,'mobile_api','0001_initial','2019-02-06 07:58:30.546212'),(329,'mobile_api','0002_auto_20160406_0904','2019-02-06 07:58:30.725452'),(330,'mobile_api','0003_ignore_mobile_available_flag','2019-02-06 07:58:31.637551'),(331,'notes','0001_initial','2019-02-06 07:58:32.158209'),(332,'oauth2','0002_auto_20160404_0813','2019-02-06 07:58:33.398358'),(333,'oauth2','0003_client_logout_uri','2019-02-06 07:58:33.785963'),(334,'oauth2','0004_add_index_on_grant_expires','2019-02-06 07:58:34.178788'),(335,'oauth2','0005_grant_nonce','2019-02-06 07:58:35.284863'),(336,'organizations','0001_initial','2019-02-06 07:58:35.646051'),(337,'organizations','0002_auto_20170117_1434','2019-02-06 07:58:35.750682'),(338,'organizations','0003_auto_20170221_1138','2019-02-06 07:58:35.925588'),(339,'organizations','0004_auto_20170413_2315','2019-02-06 07:58:36.060193'),(340,'organizations','0005_auto_20171116_0640','2019-02-06 07:58:36.145008'),(341,'organizations','0006_auto_20171207_0259','2019-02-06 07:58:36.257476'),(342,'oauth2_provider','0001_initial','2019-02-06 07:58:38.097999'),(343,'oauth_dispatch','0001_initial','2019-02-06 07:58:38.563660'),(344,'oauth_dispatch','0002_scopedapplication_scopedapplicationorganization','2019-02-06 07:58:40.054311'),(345,'oauth_dispatch','0003_application_data','2019-02-06 07:58:40.676680'),(346,'oauth_dispatch','0004_auto_20180626_1349','2019-02-06 07:58:43.112430'),(347,'oauth_dispatch','0005_applicationaccess_type','2019-02-06 07:58:43.714100'),(348,'oauth_dispatch','0006_drop_application_id_constraints','2019-02-06 07:58:44.030090'),(349,'oauth2_provider','0002_08_updates','2019-02-06 07:58:44.450850'),(350,'oauth2_provider','0003_auto_20160316_1503','2019-02-06 07:58:44.640899'),(351,'oauth2_provider','0004_auto_20160525_1623','2019-02-06 07:58:44.975564'),(352,'oauth2_provider','0005_auto_20170514_1141','2019-02-06 07:58:47.370031'),(353,'oauth2_provider','0006_auto_20171214_2232','2019-02-06 07:58:48.599294'),(354,'oauth_dispatch','0007_restore_application_id_constraints','2019-02-06 07:58:49.006205'),(355,'oauth_provider','0001_initial','2019-02-06 07:58:49.563238'),(356,'problem_builder','0001_initial','2019-02-06 07:58:49.794124'),(357,'problem_builder','0002_auto_20160121_1525','2019-02-06 07:58:50.200720'),(358,'problem_builder','0003_auto_20161124_0755','2019-02-06 07:58:50.413858'),(359,'problem_builder','0004_copy_course_ids','2019-02-06 07:58:51.128055'),(360,'problem_builder','0005_auto_20170112_1021','2019-02-06 07:58:51.340194'),(361,'problem_builder','0006_remove_deprecated_course_id','2019-02-06 07:58:51.564692'),(362,'programs','0001_initial','2019-02-06 07:58:51.747931'),(363,'programs','0002_programsapiconfig_cache_ttl','2019-02-06 07:58:51.898433'),(364,'programs','0003_auto_20151120_1613','2019-02-06 07:58:53.094465'),(365,'programs','0004_programsapiconfig_enable_certification','2019-02-06 07:58:53.288122'),(366,'programs','0005_programsapiconfig_max_retries','2019-02-06 07:58:53.445000'),(367,'programs','0006_programsapiconfig_xseries_ad_enabled','2019-02-06 07:58:53.602411'),(368,'programs','0007_programsapiconfig_program_listing_enabled','2019-02-06 07:58:53.755138'),(369,'programs','0008_programsapiconfig_program_details_enabled','2019-02-06 07:58:53.875763'),(370,'programs','0009_programsapiconfig_marketing_path','2019-02-06 07:58:54.018436'),(371,'programs','0010_auto_20170204_2332','2019-02-06 07:58:54.237222'),(372,'programs','0011_auto_20170301_1844','2019-02-06 07:58:55.604408'),(373,'programs','0012_auto_20170419_0018','2019-02-06 07:58:55.728622'),(374,'redirects','0001_initial','2019-02-06 07:58:56.618741'),(375,'rss_proxy','0001_initial','2019-02-06 07:58:56.722680'),(376,'sap_success_factors','0011_auto_20180104_0103','2019-02-06 07:59:01.328739'),(377,'sap_success_factors','0012_auto_20180109_0712','2019-02-06 07:59:01.778378'),(378,'sap_success_factors','0013_auto_20180306_1251','2019-02-06 07:59:02.285821'),(379,'sap_success_factors','0014_drop_historical_table','2019-02-06 07:59:02.903520'),(380,'sap_success_factors','0015_auto_20180510_1259','2019-02-06 07:59:03.734759'),(381,'sap_success_factors','0016_sapsuccessfactorsenterprisecustomerconfiguration_additional_locales','2019-02-06 07:59:03.878684'),(382,'sap_success_factors','0017_sapsuccessfactorsglobalconfiguration_search_student_api_path','2019-02-06 07:59:04.766539'),(383,'schedules','0001_initial','2019-02-06 07:59:05.179663'),(384,'schedules','0002_auto_20170816_1532','2019-02-06 07:59:05.397766'),(385,'schedules','0003_scheduleconfig','2019-02-06 07:59:05.977222'),(386,'schedules','0004_auto_20170922_1428','2019-02-06 07:59:06.791066'),(387,'schedules','0005_auto_20171010_1722','2019-02-06 07:59:07.631416'),(388,'schedules','0006_scheduleexperience','2019-02-06 07:59:08.189048'),(389,'schedules','0007_scheduleconfig_hold_back_ratio','2019-02-06 07:59:08.776239'),(390,'self_paced','0001_initial','2019-02-06 07:59:09.799050'),(391,'sessions','0001_initial','2019-02-06 07:59:09.921074'),(392,'shoppingcart','0001_initial','2019-02-06 07:59:21.053818'),(393,'shoppingcart','0002_auto_20151208_1034','2019-02-06 07:59:21.335220'),(394,'shoppingcart','0003_auto_20151217_0958','2019-02-06 07:59:21.599445'),(395,'shoppingcart','0004_change_meta_options','2019-02-06 07:59:21.823322'),(396,'site_configuration','0001_initial','2019-02-06 07:59:22.992881'),(397,'site_configuration','0002_auto_20160720_0231','2019-02-06 07:59:23.853074'),(398,'default','0001_initial','2019-02-06 07:59:25.015201'),(399,'social_auth','0001_initial','2019-02-06 07:59:25.046686'),(400,'default','0002_add_related_name','2019-02-06 07:59:25.500745'),(401,'social_auth','0002_add_related_name','2019-02-06 07:59:25.532177'),(402,'default','0003_alter_email_max_length','2019-02-06 07:59:25.652620'),(403,'social_auth','0003_alter_email_max_length','2019-02-06 07:59:25.690150'),(404,'default','0004_auto_20160423_0400','2019-02-06 07:59:26.074154'),(405,'social_auth','0004_auto_20160423_0400','2019-02-06 07:59:26.105575'),(406,'social_auth','0005_auto_20160727_2333','2019-02-06 07:59:26.241475'),(407,'social_django','0006_partial','2019-02-06 07:59:26.399875'),(408,'social_django','0007_code_timestamp','2019-02-06 07:59:26.566550'),(409,'social_django','0008_partial_timestamp','2019-02-06 07:59:26.712434'),(410,'splash','0001_initial','2019-02-06 07:59:27.288326'),(411,'static_replace','0001_initial','2019-02-06 07:59:27.851106'),(412,'static_replace','0002_assetexcludedextensionsconfig','2019-02-06 07:59:29.178463'),(413,'status','0001_initial','2019-02-06 07:59:30.834233'),(414,'status','0002_update_help_text','2019-02-06 07:59:31.259226'),(415,'student','0014_courseenrollmentallowed_user','2019-02-06 07:59:31.843553'),(416,'student','0015_manualenrollmentaudit_add_role','2019-02-06 07:59:32.339124'),(417,'student','0016_coursenrollment_course_on_delete_do_nothing','2019-02-06 07:59:33.019734'),(418,'student','0017_accountrecovery','2019-02-06 07:59:34.081866'),(419,'student','0018_remove_password_history','2019-02-06 07:59:35.360857'),(420,'student','0019_auto_20181221_0540','2019-02-06 07:59:36.450684'),(421,'submissions','0001_initial','2019-02-06 07:59:37.468217'),(422,'submissions','0002_auto_20151119_0913','2019-02-06 07:59:37.751719'),(423,'submissions','0003_submission_status','2019-02-06 07:59:37.951880'),(424,'submissions','0004_remove_django_extensions','2019-02-06 07:59:38.080449'),(425,'survey','0001_initial','2019-02-06 07:59:38.937112'),(426,'teams','0001_initial','2019-02-06 07:59:42.234272'),(427,'theming','0001_initial','2019-02-06 07:59:42.964122'),(428,'third_party_auth','0001_initial','2019-02-06 07:59:46.893944'),(429,'third_party_auth','0002_schema__provider_icon_image','2019-02-06 07:59:51.814091'),(430,'third_party_auth','0003_samlproviderconfig_debug_mode','2019-02-06 07:59:52.360263'),(431,'third_party_auth','0004_add_visible_field','2019-02-06 07:59:56.187303'),(432,'third_party_auth','0005_add_site_field','2019-02-06 08:00:00.726584'),(433,'third_party_auth','0006_samlproviderconfig_automatic_refresh_enabled','2019-02-06 08:00:01.267932'),(434,'third_party_auth','0007_auto_20170406_0912','2019-02-06 08:00:02.190874'),(435,'third_party_auth','0008_auto_20170413_1455','2019-02-06 08:00:03.658115'),(436,'third_party_auth','0009_auto_20170415_1144','2019-02-06 08:00:05.420674'),(437,'third_party_auth','0010_add_skip_hinted_login_dialog_field','2019-02-06 08:00:07.334260'),(438,'third_party_auth','0011_auto_20170616_0112','2019-02-06 08:00:07.841081'),(439,'third_party_auth','0012_auto_20170626_1135','2019-02-06 08:00:09.649831'),(440,'third_party_auth','0013_sync_learner_profile_data','2019-02-06 08:00:12.254172'),(441,'third_party_auth','0014_auto_20171222_1233','2019-02-06 08:00:13.935686'),(442,'third_party_auth','0015_samlproviderconfig_archived','2019-02-06 08:00:14.559179'),(443,'third_party_auth','0016_auto_20180130_0938','2019-02-06 08:00:15.656894'),(444,'third_party_auth','0017_remove_icon_class_image_secondary_fields','2019-02-06 08:00:17.597823'),(445,'third_party_auth','0018_auto_20180327_1631','2019-02-06 08:00:20.302724'),(446,'third_party_auth','0019_consolidate_slug','2019-02-06 08:00:23.246774'),(447,'third_party_auth','0020_cleanup_slug_fields','2019-02-06 08:00:25.498101'),(448,'third_party_auth','0021_sso_id_verification','2019-02-06 08:00:27.269685'),(449,'third_party_auth','0022_auto_20181012_0307','2019-02-06 08:00:30.475559'),(450,'thumbnail','0001_initial','2019-02-06 08:00:30.680886'),(451,'track','0001_initial','2019-02-06 08:00:30.998373'),(452,'user_api','0001_initial','2019-02-06 08:00:35.324701'),(453,'user_api','0002_retirementstate_userretirementstatus','2019-02-06 08:00:36.082707'),(454,'user_api','0003_userretirementrequest','2019-02-06 08:00:36.665229'),(455,'user_api','0004_userretirementpartnerreportingstatus','2019-02-06 08:00:37.317791'),(456,'user_authn','0001_data__add_login_service','2019-02-06 08:00:39.270679'),(457,'util','0001_initial','2019-02-06 08:00:39.822745'),(458,'util','0002_data__default_rate_limit_config','2019-02-06 08:00:40.606869'),(459,'verified_track_content','0002_verifiedtrackcohortedcourse_verified_cohort_name','2019-02-06 08:00:40.741152'),(460,'verified_track_content','0003_migrateverifiedtrackcohortssetting','2019-02-06 08:00:41.360407'),(461,'verify_student','0001_initial','2019-02-06 08:00:47.236180'),(462,'verify_student','0002_auto_20151124_1024','2019-02-06 08:00:47.481347'),(463,'verify_student','0003_auto_20151113_1443','2019-02-06 08:00:47.697474'),(464,'verify_student','0004_delete_historical_records','2019-02-06 08:00:47.928549'),(465,'verify_student','0005_remove_deprecated_models','2019-02-06 08:00:53.255639'),(466,'verify_student','0006_ssoverification','2019-02-06 08:00:53.608512'),(467,'verify_student','0007_idverificationaggregate','2019-02-06 08:00:54.126314'),(468,'verify_student','0008_populate_idverificationaggregate','2019-02-06 08:00:55.099295'),(469,'verify_student','0009_remove_id_verification_aggregate','2019-02-06 08:00:55.505989'),(470,'verify_student','0010_manualverification','2019-02-06 08:00:55.733258'),(471,'verify_student','0011_add_fields_to_sspv','2019-02-06 08:00:56.760072'),(472,'video_config','0001_initial','2019-02-06 08:00:57.094097'),(473,'video_config','0002_coursevideotranscriptenabledflag_videotranscriptenabledflag','2019-02-06 08:00:57.451972'),(474,'video_config','0003_transcriptmigrationsetting','2019-02-06 08:00:57.665251'),(475,'video_config','0004_transcriptmigrationsetting_command_run','2019-02-06 08:00:57.846477'),(476,'video_config','0005_auto_20180719_0752','2019-02-06 08:00:58.093978'),(477,'video_config','0006_videothumbnailetting_updatedcoursevideos','2019-02-06 08:00:58.479655'),(478,'video_config','0007_videothumbnailsetting_offset','2019-02-06 08:00:58.702464'),(479,'video_pipeline','0001_initial','2019-02-06 08:00:58.930134'),(480,'video_pipeline','0002_auto_20171114_0704','2019-02-06 08:00:59.248554'),(481,'video_pipeline','0003_coursevideouploadsenabledbydefault_videouploadsenabledbydefault','2019-02-06 08:00:59.639240'),(482,'waffle','0002_auto_20161201_0958','2019-02-06 08:00:59.770761'),(483,'waffle_utils','0001_initial','2019-02-06 08:01:00.120690'),(484,'wiki','0001_initial','2019-02-06 08:01:13.521825'),(485,'wiki','0002_remove_article_subscription','2019-02-06 08:01:13.635976'),(486,'wiki','0003_ip_address_conv','2019-02-06 08:01:15.191324'),(487,'wiki','0004_increase_slug_size','2019-02-06 08:01:15.438646'),(488,'wiki','0005_remove_attachments_and_images','2019-02-06 08:01:20.535437'),(489,'workflow','0001_initial','2019-02-06 08:01:20.955248'),(490,'workflow','0002_remove_django_extensions','2019-02-06 08:01:21.089005'),(491,'xapi','0001_initial','2019-02-06 08:01:21.762133'),(492,'xapi','0002_auto_20180726_0142','2019-02-06 08:01:22.140082'),(493,'xblock_django','0001_initial','2019-02-06 08:01:22.817601'),(494,'xblock_django','0002_auto_20160204_0809','2019-02-06 08:01:23.428800'),(495,'xblock_django','0003_add_new_config_models','2019-02-06 08:01:26.720065'),(496,'xblock_django','0004_delete_xblock_disable_config','2019-02-06 08:01:28.046351'),(497,'social_django','0002_add_related_name','2019-02-06 08:01:28.238120'),(498,'social_django','0003_alter_email_max_length','2019-02-06 08:01:28.295485'),(499,'social_django','0004_auto_20160423_0400','2019-02-06 08:01:28.369651'),(500,'social_django','0001_initial','2019-02-06 08:01:28.419547'),(501,'social_django','0005_auto_20160727_2333','2019-02-06 08:01:28.470149'),(502,'contentstore','0001_initial','2019-02-06 08:02:13.717472'),(503,'contentstore','0002_add_assets_page_flag','2019-02-06 08:02:14.894230'),(504,'contentstore','0003_remove_assets_page_flag','2019-02-06 08:02:15.936128'),(505,'course_creators','0001_initial','2019-02-06 08:02:16.677395'),(506,'tagging','0001_initial','2019-02-06 08:02:16.919416'),(507,'tagging','0002_auto_20170116_1541','2019-02-06 08:02:17.057789'),(508,'user_tasks','0001_initial','2019-02-06 08:02:18.095204'),(509,'user_tasks','0002_artifact_file_storage','2019-02-06 08:02:18.200132'),(510,'xblock_config','0001_initial','2019-02-06 08:02:18.497728'),(511,'xblock_config','0002_courseeditltifieldsenabledflag','2019-02-06 08:02:19.039966'),(512,'lti_provider','0001_initial','2019-02-20 13:01:39.285635'),(513,'lti_provider','0002_auto_20160325_0407','2019-02-20 13:01:39.369768'),(514,'lti_provider','0003_auto_20161118_1040','2019-02-20 13:01:39.445830'),(515,'content_type_gating','0005_auto_20190306_1547','2019-03-06 16:00:40.248896'),(516,'course_duration_limits','0005_auto_20190306_1546','2019-03-06 16:00:40.908922'),(517,'enterprise','0061_systemwideenterpriserole_systemwideenterpriseuserroleassignment','2019-03-08 15:47:17.741727'),(518,'enterprise','0062_add_system_wide_enterprise_roles','2019-03-08 15:47:17.809640'),(519,'content_type_gating','0006_auto_20190308_1447','2019-03-11 16:27:21.659554'),(520,'course_duration_limits','0006_auto_20190308_1447','2019-03-11 16:27:22.347994'),(521,'content_type_gating','0007_auto_20190311_1919','2019-03-12 16:11:14.076560'),(522,'course_duration_limits','0007_auto_20190311_1919','2019-03-12 16:11:17.332778'),(523,'announcements','0001_initial','2019-03-18 20:54:59.708245'),(524,'content_type_gating','0008_auto_20190313_1634','2019-03-18 20:55:00.145074'),(525,'course_duration_limits','0008_auto_20190313_1634','2019-03-18 20:55:00.800059'),(526,'enterprise','0063_systemwideenterpriserole_description','2019-03-21 18:40:50.646407'),(527,'enterprise','0064_enterprisefeaturerole_enterprisefeatureuserroleassignment','2019-03-28 19:29:40.049122'),(528,'enterprise','0065_add_enterprise_feature_roles','2019-03-28 19:29:40.122825'),(529,'enterprise','0066_add_system_wide_enterprise_operator_role','2019-03-28 19:29:40.190059'),(530,'student','0020_auto_20190227_2019','2019-04-01 21:47:10.285726'),(531,'certificates','0015_add_masters_choice','2019-04-05 14:56:54.180634'),(532,'enterprise','0067_add_role_based_access_control_switch','2019-04-08 20:44:56.835675'),(533,'program_enrollments','0001_initial','2019-04-10 20:25:28.810529'),(534,'program_enrollments','0002_historicalprogramcourseenrollment_programcourseenrollment','2019-04-18 16:07:31.718124'),(535,'third_party_auth','0023_auto_20190418_2033','2019-04-24 13:53:47.057323'),(536,'program_enrollments','0003_auto_20190424_1622','2019-04-24 16:34:31.400886'),(537,'courseware','0008_move_idde_to_edx_when','2019-04-25 14:14:01.833602'),(538,'edx_when','0001_initial','2019-04-25 14:14:04.077675'),(539,'edx_when','0002_auto_20190318_1736','2019-04-25 14:14:06.472260'),(540,'edx_when','0003_auto_20190402_1501','2019-04-25 14:14:08.565796'),(541,'edx_proctoring','0010_update_backend','2019-05-02 21:47:10.150692'),(542,'program_enrollments','0004_add_programcourseenrollment_relatedname','2019-05-02 21:47:10.839771'),(543,'student','0021_historicalcourseenrollment','2019-05-03 20:29:56.543955'),(544,'cornerstone','0001_initial','2019-05-29 09:32:41.107279'),(545,'cornerstone','0002_cornerstoneglobalconfiguration_subject_mapping','2019-05-29 09:32:41.540384'),(546,'third_party_auth','0024_fix_edit_disallowed','2019-05-29 14:34:07.293693'),(547,'discounts','0001_initial','2019-06-03 19:15:59.106385'),(548,'program_enrollments','0005_canceled_not_withdrawn','2019-06-03 19:15:59.936222'),(549,'entitlements','0011_historicalcourseentitlement','2019-06-04 17:56:15.038112'),(550,'organizations','0007_historicalorganization','2019-06-04 17:56:15.935805'),(551,'user_tasks','0003_url_max_length','2019-06-04 17:56:24.531329'),(552,'user_tasks','0004_url_textfield','2019-06-04 17:56:24.631710'),(553,'enterprise','0068_remove_role_based_access_control_switch','2019-06-05 10:59:25.727686'),(554,'grades','0015_historicalpersistentsubsectiongradeoverride','2019-06-10 16:42:15.294490'),(555,'bulk_grades','0001_initial','2019-06-12 14:00:05.595345'),(556,'super_csv','0001_initial','2019-06-12 14:00:05.668273'),(557,'super_csv','0002_csvoperation_user','2019-06-12 14:00:06.129086'),(558,'enterprise','0069_auto_20190613_0607','2019-06-13 20:29:34.416315'),(559,'course_modes','0012_historicalcoursemode','2019-06-20 14:16:40.384457'),(560,'student','0022_indexing_in_courseenrollment','2019-06-28 07:52:29.598606'),(561,'courseware','0009_auto_20190703_1955','2019-07-03 19:59:27.956010'),(562,'bulk_grades','0002_auto_20190703_1526','2019-07-09 16:23:49.075404'),(563,'course_overviews','0015_historicalcourseoverview','2019-07-09 16:23:49.552185'),(564,'courseware','0010_auto_20190709_1559','2019-07-09 16:23:49.959864'),(565,'grades','0016_auto_20190703_1446','2019-07-09 16:23:51.049448'),(566,'cornerstone','0003_auto_20190621_1000','2019-08-16 20:33:03.878476'),(567,'enterprise','0070_enterprise_catalog_query','2019-08-16 20:33:05.128301'),(568,'enterprise','0071_historicalpendingenrollment_historicalpendingenterprisecustomeruser','2019-08-16 20:33:06.381233'),(569,'instructor_task','0003_alter_task_input_field','2019-08-16 20:33:06.777708'),(570,'microsite_configuration','004_delete_all_tables','2019-08-16 20:33:08.216606'),(571,'sap_success_factors','0018_sapsuccessfactorsenterprisecustomerconfiguration_show_course_price','2019-08-16 20:33:08.320866'),(572,'super_csv','0003_csvoperation_original_filename','2019-08-16 20:33:08.729724'),(573,'system_wide_roles','0001_SystemWideRole_SystemWideRoleAssignment','2019-08-16 20:33:09.236280'),(574,'system_wide_roles','0002_add_system_wide_student_support_role','2019-08-16 20:33:10.100114'),(575,'contentstore','0004_remove_push_notification_configmodel_table','2019-08-16 20:33:16.971775'),(576,'xapi','0003_auto_20190807_1006','2019-08-23 11:39:26.089273'),(577,'program_enrollments','0006_add_the_correct_constraints','2019-08-23 18:08:47.891260'),(578,'video_config','0008_courseyoutubeblockedflag','2019-08-25 18:16:55.143257'),(579,'program_enrollments','0007_waiting_programcourseenrollment_constraint','2019-08-27 19:09:05.805301'),(580,'content_libraries','0001_initial','2019-08-30 19:27:59.312920'),(581,'courseware','0011_csm_id_bigint','2019-08-30 19:28:00.069282'),(582,'enterprise','0072_add_enterprise_report_config_feature_role','2019-08-30 19:28:00.572179'),(583,'enterprise','0073_enterprisecustomerreportingconfiguration_uuid','2019-08-30 19:28:01.681347'),(584,'enterprise','0074_auto_20190904_1143','2019-09-06 21:16:52.036849'),(585,'xapi','0004_auto_20190830_0710','2019-09-06 21:16:52.593883'),(586,'enterprise','0075_auto_20190916_1030','2019-09-16 21:24:18.290842'),(587,'course_overviews','0016_simulatecoursepublishconfig','2019-09-17 14:32:57.081562'),(588,'courseware','0012_adjust_fields','2019-09-19 19:47:08.473302'),(589,'enterprise','0076_auto_20190918_2037','2019-09-19 19:47:09.682209'),(590,'cornerstone','0004_cornerstoneglobalconfiguration_languages','2019-09-25 09:51:51.980971'),(591,'cornerstone','0005_auto_20190925_0730','2019-09-25 09:51:52.420065'),(592,'degreed','0007_auto_20190925_0730','2019-09-25 09:51:52.912089'),(593,'integrated_channel','0007_auto_20190925_0730','2019-09-25 09:51:52.965350'),(594,'sap_success_factors','0019_auto_20190925_0730','2019-09-25 09:51:53.387921'),(595,'course_overviews','0017_auto_20191002_0823','2019-10-03 17:35:24.874445'),(596,'courseware','0013_auto_20191001_1858','2019-10-03 17:35:25.469758'),(597,'edx_when','0004_datepolicy_rel_date','2019-10-03 17:35:25.561499'),(598,'edx_when','0005_auto_20190911_1056','2019-10-03 17:35:26.248583'),(599,'student','0023_bulkunenrollconfiguration','2019-10-08 08:54:34.630958'),(600,'program_enrollments','0008_add_ended_programenrollment_status','2019-10-15 16:54:18.793465'),(601,'enterprise','0077_auto_20191002_1529','2019-10-15 21:48:34.650220'),(602,'completion','0003_learning_context','2019-10-22 18:42:12.945705'),(603,'teams','0002_slug_field_ids','2019-10-22 18:42:13.905915'),(604,'entitlements','0012_allow_blank_order_number_values','2019-10-23 16:23:32.583686'),(605,'discounts','0002_auto_20191022_1720','2019-10-25 14:14:05.485328'),(606,'commerce','0008_auto_20191024_2048','2019-10-30 16:42:28.671238'),(607,'student','0024_fbeenrollmentexclusion','2019-10-31 16:16:17.991800'),(608,'student','0025_auto_20191101_1846','2019-11-05 14:23:09.546047'),(609,'cornerstone','0006_auto_20191001_0742','2019-11-15 09:41:31.515102'),(610,'degreed','0008_auto_20191001_0742','2019-11-15 09:41:31.985210'),(611,'enterprise','0078_auto_20191107_1536','2019-11-15 09:41:32.071798'),(612,'enterprise','0079_AddEnterpriseEnrollmentSource','2019-11-15 09:41:35.077452'),(613,'enterprise','0080_auto_20191113_1708','2019-11-15 09:41:35.165258'),(614,'sap_success_factors','0020_sapsuccessfactorsenterprisecustomerconfiguration_catalogs_to_transmit','2019-11-15 09:41:35.278200'),(615,'student','0026_allowedauthuser','2019-11-15 09:41:35.750216'),(616,'teams','0003_courseteam_organization_protected','2019-11-15 09:41:36.470845'),(617,'schedules','0008_add_new_start_date_field','2019-11-21 18:12:34.458532'),(618,'enterprise','0081_UpdateEnterpriseEnrollmentSource','2019-11-25 17:51:47.303851'),(619,'enterprise','0082_AddManagementEnterpriseEnrollmentSource','2019-12-03 20:57:24.426283'),(620,'edxval','0012_thirdpartytranscriptcredentialsstate_has_creds','2019-12-06 10:56:08.552448'),(621,'edxval','0013_thirdpartytranscriptcredentialsstate_copy_values','2019-12-13 13:13:20.308012'),(622,'edxval','0014_transcript_credentials_state_retype_exists','2019-12-13 13:13:20.408578'),(623,'programs','0013_customprogramsconfig','2019-12-13 13:13:21.067118'),(624,'verify_student','0012_sspverificationretryconfig','2019-12-13 13:13:21.515002'),(625,'assessment','0004_historicalsharedfileupload_sharedfileupload','2019-12-16 06:29:30.675880'),(626,'certificates','0016_historicalgeneratedcertificate','2019-12-17 14:29:56.935433'),(627,'entitlements','0013_historicalcourseentitlementsupportdetail','2019-12-17 14:29:57.436302'),(628,'credit','0005_creditrequirement_sort_value','2019-12-19 10:51:12.337166'),(629,'student','0027_courseenrollment_mode_callable_default','2019-12-26 15:35:57.040621'),(630,'enterprise','0083_enterprisecustomerreportingconfiguration_include_date','2019-12-26 21:47:14.728344'),(631,'schedules','0009_schedule_copy_column_values','2020-01-02 13:28:19.802979'),(632,'credit','0006_creditrequirement_alter_ordering','2020-01-03 18:18:36.334211'),(633,'credit','0007_creditrequirement_copy_values','2020-01-03 18:18:36.973921'),(634,'credit','0008_creditrequirement_remove_order','2020-01-08 11:38:24.657306'),(635,'grades','0017_delete_manual_psgoverride_table','2020-01-08 11:38:25.213640'),(636,'waffle','0003_update_strings_for_i18n','2020-01-08 14:05:29.720079'),(637,'student','0028_historicalmanualenrollmentaudit','2020-01-10 11:40:11.268574'),(638,'assessment','0005_add_filename_to_sharedupload','2020-01-13 10:35:07.847171'),(639,'course_overviews','0018_add_start_end_in_CourseOverview','2020-01-13 17:26:36.464326'),(640,'wiki','0006_auto_20200110_1003','2020-01-13 17:26:36.697919'),(641,'course_modes','0013_auto_20200115_2022','2020-01-15 20:27:50.992526'),(642,'entitlements','0014_auto_20200115_2022','2020-01-15 20:27:51.322976'),(643,'schedules','0010_remove_null_blank_from_schedules_date','2020-01-22 12:55:34.725873'),(644,'edxval','0015_remove_thirdpartytranscriptcredentialsstate_exists','2020-01-24 14:35:44.099846'),(645,'enterprise','0084_auto_20200120_1137','2020-01-24 14:35:44.172381'),(646,'enterprise','0085_enterprisecustomeruser_linked','2020-01-24 14:35:44.282887'),(647,'sap_success_factors','0021_sapsuccessfactorsenterprisecustomerconfiguration_show_total_hours','2020-01-27 10:53:31.872214'),(648,'course_overviews','0019_improve_courseoverviewtab','2020-01-28 16:51:30.714982'),(649,'enterprise','0086_auto_20200128_1726','2020-01-31 16:49:18.025706'),(650,'student','0029_add_data_researcher','2020-01-31 16:49:18.401525'),(651,'entitlements','0015_add_unique_together_constraint','2020-02-11 13:55:29.655054'),(652,'external_user_ids','0001_initial','2020-02-11 13:55:31.498884'),(653,'external_user_ids','0002_mb_coaching_20200210_1754','2020-02-11 13:55:31.894541'),(654,'sap_success_factors','0022_auto_20200206_1046','2020-02-11 13:55:32.101815'),(655,'track','0002_delete_trackinglog','2020-02-11 13:55:32.134542'),(656,'enterprise','0087_auto_20200206_1151','2020-02-18 09:55:42.697992'),(657,'site_configuration','0003_auto_20200217_1058','2020-02-18 09:55:42.825644'),(658,'student','0030_userprofile_phone_number','2020-02-20 14:48:47.685095'),(659,'course_date_signals','0001_initial','2020-02-21 16:45:43.955340'),(660,'oauth_dispatch','0008_applicationaccess_filters','2020-02-21 16:45:44.019075'),(661,'site_configuration','0004_add_site_values_field','2020-02-21 16:45:44.195027'),(662,'calendar_sync','0001_initial','2020-02-21 20:04:38.131685'),(663,'site_configuration','0005_copy_values_to_site_values','2020-02-24 18:47:53.200107'),(664,'external_user_ids','0003_auto_20200224_1836','2020-02-26 19:11:47.388528'),(665,'course_overviews','0020_courseoverviewtab_url_slug','2020-02-28 17:48:04.195272'),(666,'schedules','0011_auto_20200228_2018','2020-03-02 19:21:13.196282'),(667,'schedules','0012_auto_20200302_1914','2020-03-02 19:21:13.520829'),(668,'enterprise','0088_auto_20200224_1341','2020-03-03 20:05:46.920547'),(669,'experiments','0004_historicalexperimentkeyvalue','2020-03-03 20:05:47.277998'),(670,'program_enrollments','0009_update_course_enrollment_field_to_foreign_key','2020-03-03 20:05:47.685409'),(671,'site_configuration','0005_populate_siteconfig_history_site_values','2020-03-03 20:05:47.719133'),(672,'third_party_auth','0025_auto_20200303_1448','2020-03-03 20:05:48.252619'),(673,'oauth_dispatch','0009_delete_enable_scopes_waffle_switch','2020-03-04 16:01:48.080593'),(674,'schedules','0013_historicalschedule','2020-03-04 20:45:56.581945'),(675,'content_libraries','0002_group_permissions','2020-03-06 17:55:42.233448'),(676,'enterprise','0089_auto_20200305_0652','2020-03-06 17:55:42.297353'),(677,'site_configuration','0006_copy_values_to_site_values','2020-03-06 17:55:42.678035'),(678,'site_configuration','0007_remove_values_field','2020-03-06 17:55:42.788856'),(679,'schedules','0014_historicalschedule_drop_fk','2020-03-09 17:24:50.018834'),(680,'enterprise','0090_update_content_filter','2020-03-10 17:57:05.339287'),(681,'schedules','0015_schedules_start_nullable','2020-03-10 17:57:05.707643'),(682,'courseware','0014_fix_nan_value_for_global_speed','2020-03-11 13:49:13.615966'),(683,'enterprise','0091_add_sales_force_id_in_pendingenrollment','2020-03-12 10:54:44.467230'),(684,'enterprise','0092_auto_20200312_1650','2020-03-13 15:23:45.800175'),(685,'schedules','0016_remove_start_from_schedules','2020-03-13 15:23:45.883904'),(686,'schedules','0017_remove_start_from_historicalschedule','2020-03-13 15:23:45.976652'),(687,'schedules','0018_readd_historicalschedule_fks','2020-03-16 14:38:14.274410'),(688,'student','0031_auto_20200317_1122','2020-03-17 13:50:05.335676'),(689,'schedules','0019_auto_20200316_1935','2020-03-17 18:44:35.891013'),(690,'teams','0004_alter_defaults','2020-03-18 15:44:58.524624'),(691,'edxval','0016_add_transcript_credentials_model','2020-03-27 07:02:09.981900'),(692,'assessment','0006_TeamWorkflows','2020-03-30 19:21:36.208357'),(693,'edx_when','0006_drop_active_index','2020-03-30 19:21:36.251955'),(694,'program_enrollments','0010_add_courseaccessroleassignment','2020-03-30 19:21:36.855995'),(695,'workflow','0003_TeamWorkflows','2020-03-30 19:21:36.925096'),(696,'submissions','0005_CreateTeamModel','2020-04-01 20:57:39.372024'),(697,'third_party_auth','0026_auto_20200401_1932','2020-04-02 13:16:01.972784'),(698,'enterprise','0093_add_use_enterprise_catalog_flag','2020-04-08 18:22:44.709305'),(699,'enterprise','0094_add_use_enterprise_catalog_sample','2020-04-10 22:07:16.661282'),(700,'organizations','0001_squashed_0007_historicalorganization','2020-04-10 22:07:16.677543'),(701,'submissions','0001_squashed_0005_CreateTeamModel','2020-04-10 22:07:16.686207'),(702,'admin','0003_logentry_add_action_flag_choices','2020-04-23 18:11:46.942946'),(703,'auth','0009_alter_user_last_name_max_length','2020-04-23 18:11:47.230497'),(704,'auth','0010_alter_group_name_max_length','2020-04-23 18:11:47.298692'),(705,'auth','0011_update_proxy_permissions','2020-04-23 18:11:47.664132'),(706,'edx_when','0007_meta_tweaks','2020-04-23 18:11:47.691758'),(707,'oauth2_provider','0002_auto_20190406_1805','2020-04-23 18:11:47.818878'),(708,'student','0032_removed_logout_view_configuration','2020-04-23 18:11:48.393044'),(709,'student','0001_squashed_0031_auto_20200317_1122','2020-04-23 18:11:48.408997'),(710,'edxval','0001_squashed_0016_add_transcript_credentials_model','2020-04-23 18:11:48.416824'),(711,'enterprise','0001_squashed_0092_auto_20200312_1650','2020-04-23 18:11:48.424495'),(712,'third_party_auth','0001_squashed_0026_auto_20200401_1932','2020-04-23 18:11:48.432006'),(713,'integrated_channel','0001_squashed_0007_auto_20190925_0730','2020-04-24 16:47:34.188700'),(714,'sap_success_factors','0001_squashed_0022_auto_20200206_1046','2020-04-24 16:47:34.229718'),(715,'course_overviews','0021_courseoverviewtab_link','2020-05-04 10:59:26.420098'),(716,'course_overviews','0022_courseoverviewtab_is_hidden','2020-05-04 10:59:26.485523'),(717,'edxval','0002_add_error_description_field','2020-05-04 10:59:26.540249'),(718,'external_user_ids','0004_add_lti_type','2020-05-04 10:59:26.921830'),(719,'enterprise','0095_auto_20200507_1138','2020-05-08 20:20:32.807231'),(720,'enterprise','0096_enterprise_catalog_admin_role','2020-05-13 22:12:12.358228'),(721,'student','0033_userprofile_state','2020-05-13 22:12:12.631121'),(722,'edxval','0003_delete_transcriptcredentials','2020-05-27 10:59:38.022407'),(723,'learning_sequences','0001_initial','2020-06-04 06:05:36.384464'),(724,'video_pipeline','0004_vempipelineintegration','2020-06-04 06:05:36.976657'),(725,'social_django','0009_auto_20191118_0520','2020-06-19 00:00:47.256847'),(726,'social_django','0010_uid_db_index','2020-06-19 00:00:47.498169'),(727,'student','0034_courseenrollmentcelebration','2020-06-19 00:00:48.071380'),(728,'enterprise','0097_auto_20200619_1130','2020-06-19 19:05:07.673699'),(729,'grades','0018_add_waffle_flag_defaults','2020-06-23 18:17:18.366253'),(730,'contentstore','0005_add_enable_checklists_quality_waffle_flag','2020-06-23 18:17:25.592864'),(731,'video_pipeline','0005_add_vem_course_percentage','2020-06-26 08:11:39.037796'),(732,'enterprise','0098_auto_20200629_1756','2020-07-01 12:52:54.719532'),(733,'enterprise','0099_auto_20200702_1537','2020-07-07 20:06:11.134310'),(734,'enterprise','0100_add_licensed_enterprise_course_enrollment','2020-07-07 20:06:11.808302'),(735,'calendar_sync','0002_auto_20200709_1743','2020-07-14 15:27:25.654012'),(736,'enterprise','0101_move_data_to_saved_for_later','2020-07-14 15:27:26.028971'),(737,'enterprise','0102_auto_20200708_1615','2020-07-14 15:27:26.654246'),(738,'enterprise','0103_remove_marked_done','2020-07-14 15:27:26.971098'),(739,'learning_sequences','0002_coursesectionsequence_inaccessible_after_due','2020-07-14 15:27:27.028350'),(740,'student','0035_bulkchangeenrollmentconfiguration','2020-07-21 10:54:00.239203'),(741,'third_party_auth','0002_samlproviderconfig_country','2020-07-24 14:51:01.570496'),(742,'demographics','0001_initial','2020-07-30 15:57:11.520405'),(743,'enterprise','0104_sync_query_field','2020-07-30 15:57:11.957663'),(744,'third_party_auth','0002_auto_20200721_1650','2020-07-30 15:57:13.199831'),(745,'enterprise','0105_add_branding_config_color_fields','2020-08-03 19:13:25.409291'),(746,'learning_sequences','0003_create_course_context_for_course_specific_models','2020-08-03 19:13:25.887886'),(747,'enterprise','0106_move_branding_config_colors','2020-08-04 19:27:03.655974'),(748,'enterprise','0107_remove_branding_config_banner_fields','2020-08-04 19:27:03.807197'),(749,'canvas','0001_initial','2020-08-07 08:25:52.604328'),(750,'video_pipeline','0006_remove_vempipelineintegration_vem_enabled_courses_percentage','2020-08-07 08:25:52.893607'),(751,'enterprise','0108_add_licensed_enrollment_is_revoked','2020-08-11 13:14:32.231038'),(752,'canvas','0002_auto_20200806_1632','2020-08-19 14:56:09.877192'),(753,'canvas','0003_delete_canvasglobalconfiguration','2020-08-19 14:56:09.910000'),(754,'enterprise','0109_remove_use_enterprise_catalog_sample','2020-08-19 14:56:10.428152'),(755,'learning_sequences','0004_coursecontext_self_paced','2020-08-27 17:12:29.174838'),(756,'lti_consumer','0001_initial','2020-08-28 05:03:25.559310'),(757,'demographics','0002_clean_duplicate_entries','2020-09-01 07:21:24.104649'),(758,'demographics','0003_auto_20200827_1949','2020-09-01 07:21:24.477095'),(759,'learning_sequences','0005_coursecontext_days_early_for_beta','2020-09-01 07:21:24.529202'),(760,'enterprise','0110_add_default_contract_discount','2020-09-08 14:45:45.629482'),(761,'third_party_auth','0003_samlconfiguration_is_public','2020-09-08 14:45:45.915898'),(762,'waffle','0004_update_everyone_nullbooleanfield','2020-09-08 14:45:46.161103'),(763,'canvas','0004_adding_learner_data_to_canvas','2020-09-10 19:32:16.525589'),(764,'canvas','0005_auto_20200909_1534','2020-09-10 19:32:16.587918'),(765,'enterprise','0111_pendingenterprisecustomeradminuser','2020-09-10 19:32:17.239671'),(766,'enterprise','0112_auto_20200914_0926','2020-09-14 18:11:46.480493'),(767,'enterprise','0113_auto_20200914_2054','2020-09-15 14:00:45.509556'),(768,'third_party_auth','0004_auto_20200919_0955','2020-09-19 10:14:48.965241'),(769,'moodle','0001_initial','2020-09-21 18:48:18.856556'),(770,'content_libraries','0003_contentlibrary_type','2020-09-29 19:12:15.659496'),(771,'django_celery_results','0001_initial','2020-09-29 19:12:15.694360'),(772,'django_celery_results','0002_add_task_name_args_kwargs','2020-09-29 19:12:15.809654'),(773,'django_celery_results','0003_auto_20181106_1101','2020-09-29 19:12:15.833507'),(774,'django_celery_results','0004_auto_20190516_0412','2020-09-29 19:12:16.052986'),(775,'django_celery_results','0005_taskresult_worker','2020-09-29 19:12:16.102132'),(776,'django_celery_results','0006_taskresult_date_created','2020-09-29 19:12:16.667423'),(777,'django_celery_results','0007_remove_taskresult_hidden','2020-09-29 19:12:16.755206'),(778,'blackboard','0001_initial','2020-10-12 12:35:06.797823'),(779,'blackboard','0002_auto_20200930_1723','2020-10-12 12:35:07.366441'),(780,'content_libraries','0004_contentlibrary_license','2020-10-12 12:35:07.419331'),(781,'moodle','0002_moodlelearnerdatatransmissionaudit','2020-10-12 12:35:07.476549'),(782,'moodle','0003_auto_20201006_1706','2020-10-12 12:35:08.025527'),(783,'video_pipeline','0007_delete_videopipelineintegration','2020-10-12 12:35:08.047690'),(784,'student','0036_userpasswordtogglehistory','2020-10-16 09:07:26.265232'),(785,'blackboard','0003_blackboardlearnerdatatransmissionaudit','2020-10-16 12:50:02.047539'),(786,'blackboard','0004_blackboard_tx_chunk_size_default_1','2020-10-16 12:50:02.319652'),(787,'student','0037_linkedinaddtoprofileconfiguration_updates','2020-10-19 16:34:15.440350'),(788,'enterprise','0114_auto_20201020_0142','2020-10-20 09:17:29.433349'),(789,'enterprise','0115_enterpriseanalyticsuser_historicalenterpriseanalyticsuser','2020-11-09 17:41:00.155008'),(790,'moodle','0004_auto_20201105_1921','2020-11-09 17:41:00.540159'),(791,'student','0038_auto_20201021_1256','2020-11-09 17:41:00.735441'),(792,'verify_student','0013_add_expiration_date_field','2020-11-10 18:20:23.829015'),(793,'organizations','0002_unique_short_name','2020-11-13 16:20:21.924206'),(794,'course_overviews','0023_courseoverview_banner_image_url','2020-11-17 16:12:24.619688'),(795,'learning_sequences','0006_coursecontext_entrance_exam_id','2020-11-17 16:12:24.676411'),(796,'learning_sequences','0007_coursesequenceexam','2020-11-17 16:12:24.761211'),(797,'enterprise','0116_auto_20201116_0400','2020-11-18 11:46:02.034003'),(798,'certificates','0017_add_mode_20201118_1725','2020-11-19 06:41:36.871517'),(799,'django_celery_results','0008_chordcounter','2020-11-19 16:04:41.314566'),(800,'integrated_channel','0002_learnerdatatransmissionaudit_subsection_id','2020-12-02 12:39:14.273607'),(801,'shoppingcart','0005_drop_tables','2020-12-02 18:21:32.233383'),(802,'canvas','0006_canvaslearnerassessmentdatatransmissionaudit','2020-12-09 12:58:46.135456'),(803,'event_routing_backends','0001_initial','2020-12-09 12:58:46.473881'),(804,'workflow','0004_assessmentworkflowstep_skipped','2020-12-09 12:58:46.553747'),(805,'blackboard','0005_blackboardlearnerassessmentdatatransmissionaudit','2020-12-10 19:40:03.170018'),(806,'edx_proctoring','0011_allow_multiple_attempts','2020-12-10 19:40:03.397172'),(807,'enterprise','0116_auto_20201208_1759','2020-12-10 19:40:04.030440'),(808,'lti_consumer','0002_ltiagslineitem','2020-12-10 19:40:04.072921'),(809,'lti_consumer','0003_ltiagsscore','2020-12-10 19:40:04.153180'),(810,'lti_consumer','0004_keyset_mgmt_to_model','2020-12-10 19:40:04.413207'),(811,'lti_consumer','0005_migrate_keyset_to_model','2020-12-10 19:40:04.730102'),(812,'enterprise','0117_auto_20201215_0258','2020-12-15 14:41:12.282462'),(813,'discussions','0001_initial','2020-12-17 01:49:14.636626'),(814,'edx_proctoring','0012_proctoredexamstudentattempt_time_remaining_seconds','2021-01-06 14:38:10.168143'),(815,'enterprise','unique_constraints_pending_users','2021-01-06 14:38:11.083044'),(816,'edx_proctoring','0013_proctoredexamsoftwaresecurereview_is_active_attempt','2021-01-15 13:55:20.342878'),(817,'enterprise','0001_auto_20210111_1253','2021-01-15 13:55:20.733416'),(818,'lti_consumer','0006_add_on_model_config_for_lti_1p1','2021-01-20 05:10:46.449055'),(819,'student','0039_anon_id_context','2021-01-21 23:59:17.606730'),(820,'degreed','0009_auto_20210119_1546','2021-01-25 14:55:25.176395'),(821,'enterprise','0120_systemwiderole_applies_to_all_contexts','2021-01-25 14:55:25.606196'),(822,'system_wide_roles','0003_systemwideroleassignment_applies_to_all_contexts','2021-01-25 14:55:25.833693'),(823,'enterprise','0121_systemwiderole_add_ent_cust_field','2021-01-28 18:42:38.327352'),(824,'discussions','0002_add_provider_filter','2021-02-02 19:44:22.878954'),(825,'enterprise','0122_remove_field_sync_enterprise_catalog_query','2021-02-02 19:44:23.335474'),(826,'certificates','0018_historicalcertificateinvalidation','2021-02-04 15:15:11.607853'),(827,'organizations','0003_historicalorganizationcourse','2021-02-09 05:08:52.403058'),(828,'enterprise','0123_enterprisecustomeridentityprovider_default_provider','2021-02-16 09:07:05.975068'),(829,'certificates','0019_allowlistgenerationconfiguration','2021-02-19 08:06:31.380357'),(830,'lti_consumer','0007_ltidlcontentitem','2021-02-19 08:06:31.700218'),(831,'lti_consumer','0008_fix_uuid_backfill','2021-02-19 08:06:32.086477'),(832,'sap_success_factors','0002_sapsuccessfactorslearnerdatatransmissionaudit_credit_hours','2021-02-19 08:06:32.133969'),(833,'certificates','0020_remove_existing_mgmt_cmd_args','2021-02-22 16:22:52.441216'),(834,'credentials','0005_remove_existing_mgmt_cmd_args','2021-02-22 16:22:52.467478'),(835,'student','0040_usercelebration','2021-02-22 16:22:52.967882'),(836,'canvas','0007_auto_20210222_2225','2021-02-23 20:07:16.806051'),(837,'course_overviews','0024_overview_adds_has_highlights','2021-02-23 20:07:17.066552');
/*!40000 ALTER TABLE `django_migrations` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
diff --git a/common/test/db_cache/bok_choy_migrations_data_student_module_history.sql b/common/test/db_cache/bok_choy_migrations_data_student_module_history.sql
index bdd3436fcf..2763be2cca 100644
--- a/common/test/db_cache/bok_choy_migrations_data_student_module_history.sql
+++ b/common/test/db_cache/bok_choy_migrations_data_student_module_history.sql
@@ -12,7 +12,7 @@
LOCK TABLES `django_migrations` WRITE;
/*!40000 ALTER TABLE `django_migrations` DISABLE KEYS */;
-INSERT INTO `django_migrations` VALUES (1,'contenttypes','0001_initial','2019-02-06 08:03:27.973279'),(2,'auth','0001_initial','2019-02-06 08:03:28.047577'),(3,'admin','0001_initial','2019-02-06 08:03:28.084214'),(4,'admin','0002_logentry_remove_auto_add','2019-02-06 08:03:28.117004'),(5,'sites','0001_initial','2019-02-06 08:03:28.138797'),(6,'contenttypes','0002_remove_content_type_name','2019-02-06 08:03:28.216567'),(7,'api_admin','0001_initial','2019-02-06 08:03:28.285457'),(8,'api_admin','0002_auto_20160325_1604','2019-02-06 08:03:28.307547'),(9,'api_admin','0003_auto_20160404_1618','2019-02-06 08:03:28.500622'),(10,'api_admin','0004_auto_20160412_1506','2019-02-06 08:03:28.633954'),(11,'api_admin','0005_auto_20160414_1232','2019-02-06 08:03:28.673633'),(12,'api_admin','0006_catalog','2019-02-06 08:03:28.696279'),(13,'api_admin','0007_delete_historical_api_records','2019-02-06 08:03:28.816693'),(14,'assessment','0001_initial','2019-02-06 08:03:29.290939'),(15,'assessment','0002_staffworkflow','2019-02-06 08:03:29.313966'),(16,'assessment','0003_expand_course_id','2019-02-06 08:03:29.378298'),(17,'auth','0002_alter_permission_name_max_length','2019-02-06 08:03:29.412172'),(18,'auth','0003_alter_user_email_max_length','2019-02-06 08:03:29.449614'),(19,'auth','0004_alter_user_username_opts','2019-02-06 08:03:29.489793'),(20,'auth','0005_alter_user_last_login_null','2019-02-06 08:03:29.529832'),(21,'auth','0006_require_contenttypes_0002','2019-02-06 08:03:29.535701'),(22,'auth','0007_alter_validators_add_error_messages','2019-02-06 08:03:29.572495'),(23,'auth','0008_alter_user_username_max_length','2019-02-06 08:03:29.606716'),(24,'instructor_task','0001_initial','2019-02-06 08:03:29.648070'),(25,'certificates','0001_initial','2019-02-06 08:03:30.038510'),(26,'certificates','0002_data__certificatehtmlviewconfiguration_data','2019-02-06 08:03:30.060258'),(27,'certificates','0003_data__default_modes','2019-02-06 08:03:30.081042'),(28,'certificates','0004_certificategenerationhistory','2019-02-06 08:03:30.138110'),(29,'certificates','0005_auto_20151208_0801','2019-02-06 08:03:30.188489'),(30,'certificates','0006_certificatetemplateasset_asset_slug','2019-02-06 08:03:30.217197'),(31,'certificates','0007_certificateinvalidation','2019-02-06 08:03:30.269518'),(32,'badges','0001_initial','2019-02-06 08:03:30.415373'),(33,'badges','0002_data__migrate_assertions','2019-02-06 08:03:30.438183'),(34,'badges','0003_schema__add_event_configuration','2019-02-06 08:03:30.731342'),(35,'block_structure','0001_config','2019-02-06 08:03:30.788599'),(36,'block_structure','0002_blockstructuremodel','2019-02-06 08:03:30.816557'),(37,'block_structure','0003_blockstructuremodel_storage','2019-02-06 08:03:30.846376'),(38,'block_structure','0004_blockstructuremodel_usagekeywithrun','2019-02-06 08:03:30.880450'),(39,'bookmarks','0001_initial','2019-02-06 08:03:31.054199'),(40,'branding','0001_initial','2019-02-06 08:03:31.166611'),(41,'course_modes','0001_initial','2019-02-06 08:03:31.243105'),(42,'course_modes','0002_coursemode_expiration_datetime_is_explicit','2019-02-06 08:03:31.269180'),(43,'course_modes','0003_auto_20151113_1443','2019-02-06 08:03:31.298423'),(44,'course_modes','0004_auto_20151113_1457','2019-02-06 08:03:31.371839'),(45,'course_modes','0005_auto_20151217_0958','2019-02-06 08:03:31.410727'),(46,'course_modes','0006_auto_20160208_1407','2019-02-06 08:03:31.485161'),(47,'course_modes','0007_coursemode_bulk_sku','2019-02-06 08:03:31.516196'),(48,'course_groups','0001_initial','2019-02-06 08:03:32.021134'),(49,'bulk_email','0001_initial','2019-02-06 08:03:32.263160'),(50,'bulk_email','0002_data__load_course_email_template','2019-02-06 08:03:32.285972'),(51,'bulk_email','0003_config_model_feature_flag','2019-02-06 08:03:32.366594'),(52,'bulk_email','0004_add_email_targets','2019-02-06 08:03:32.873567'),(53,'bulk_email','0005_move_target_data','2019-02-06 08:03:32.900737'),(54,'bulk_email','0006_course_mode_targets','2019-02-06 08:03:33.043008'),(55,'catalog','0001_initial','2019-02-06 08:03:33.155594'),(56,'catalog','0002_catalogintegration_username','2019-02-06 08:03:33.250400'),(57,'catalog','0003_catalogintegration_page_size','2019-02-06 08:03:33.342320'),(58,'catalog','0004_auto_20170616_0618','2019-02-06 08:03:33.440389'),(59,'catalog','0005_catalogintegration_long_term_cache_ttl','2019-02-06 08:03:33.567527'),(60,'django_comment_common','0001_initial','2019-02-06 08:03:33.854539'),(61,'django_comment_common','0002_forumsconfig','2019-02-06 08:03:33.972708'),(62,'verified_track_content','0001_initial','2019-02-06 08:03:33.998702'),(63,'course_overviews','0001_initial','2019-02-06 08:03:34.057460'),(64,'course_overviews','0002_add_course_catalog_fields','2019-02-06 08:03:34.224588'),(65,'course_overviews','0003_courseoverviewgeneratedhistory','2019-02-06 08:03:34.285061'),(66,'course_overviews','0004_courseoverview_org','2019-02-06 08:03:34.361105'),(67,'course_overviews','0005_delete_courseoverviewgeneratedhistory','2019-02-06 08:03:34.421372'),(68,'course_overviews','0006_courseoverviewimageset','2019-02-06 08:03:34.487776'),(69,'course_overviews','0007_courseoverviewimageconfig','2019-02-06 08:03:34.633259'),(70,'course_overviews','0008_remove_courseoverview_facebook_url','2019-02-06 08:03:34.646695'),(71,'course_overviews','0009_readd_facebook_url','2019-02-06 08:03:34.725856'),(72,'course_overviews','0010_auto_20160329_2317','2019-02-06 08:03:34.825796'),(73,'ccx','0001_initial','2019-02-06 08:03:35.149281'),(74,'ccx','0002_customcourseforedx_structure_json','2019-02-06 08:03:35.213941'),(75,'ccx','0003_add_master_course_staff_in_ccx','2019-02-06 08:03:35.275108'),(76,'ccx','0004_seed_forum_roles_in_ccx_courses','2019-02-06 08:03:35.320321'),(77,'ccx','0005_change_ccx_coach_to_staff','2019-02-06 08:03:35.350700'),(78,'ccx','0006_set_display_name_as_override','2019-02-06 08:03:35.391529'),(79,'ccxcon','0001_initial_ccxcon_model','2019-02-06 08:03:35.425585'),(80,'ccxcon','0002_auto_20160325_0407','2019-02-06 08:03:35.481080'),(81,'djcelery','0001_initial','2019-02-06 08:03:36.180254'),(82,'celery_utils','0001_initial','2019-02-06 08:03:36.284503'),(83,'celery_utils','0002_chordable_django_backend','2019-02-06 08:03:36.366801'),(84,'certificates','0008_schema__remove_badges','2019-02-06 08:03:36.556119'),(85,'certificates','0009_certificategenerationcoursesetting_language_self_generation','2019-02-06 08:03:36.773167'),(86,'certificates','0010_certificatetemplate_language','2019-02-06 08:03:36.815500'),(87,'certificates','0011_certificatetemplate_alter_unique','2019-02-06 08:03:36.919819'),(88,'certificates','0012_certificategenerationcoursesetting_include_hours_of_effort','2019-02-06 08:03:36.957024'),(89,'certificates','0013_remove_certificategenerationcoursesetting_enabled','2019-02-06 08:03:37.024718'),(90,'certificates','0014_change_eligible_certs_manager','2019-02-06 08:03:37.104973'),(91,'commerce','0001_data__add_ecommerce_service_user','2019-02-06 08:03:37.147354'),(92,'commerce','0002_commerceconfiguration','2019-02-06 08:03:37.232132'),(93,'commerce','0003_auto_20160329_0709','2019-02-06 08:03:37.297795'),(94,'commerce','0004_auto_20160531_0950','2019-02-06 08:03:37.417586'),(95,'commerce','0005_commerceconfiguration_enable_automatic_refund_approval','2019-02-06 08:03:37.504233'),(96,'commerce','0006_auto_20170424_1734','2019-02-06 08:03:37.578243'),(97,'commerce','0007_auto_20180313_0609','2019-02-06 08:03:37.688751'),(98,'completion','0001_initial','2019-02-06 08:03:37.847750'),(99,'completion','0002_auto_20180125_1510','2019-02-06 08:03:37.917588'),(100,'enterprise','0001_initial','2019-02-06 08:03:38.090862'),(101,'enterprise','0002_enterprisecustomerbrandingconfiguration','2019-02-06 08:03:38.142785'),(102,'enterprise','0003_auto_20161104_0937','2019-02-06 08:03:38.362358'),(103,'enterprise','0004_auto_20161114_0434','2019-02-06 08:03:38.484589'),(104,'enterprise','0005_pendingenterprisecustomeruser','2019-02-06 08:03:38.565074'),(105,'enterprise','0006_auto_20161121_0241','2019-02-06 08:03:38.604288'),(106,'enterprise','0007_auto_20161109_1511','2019-02-06 08:03:38.706534'),(107,'enterprise','0008_auto_20161124_2355','2019-02-06 08:03:38.935742'),(108,'enterprise','0009_auto_20161130_1651','2019-02-06 08:03:39.582739'),(109,'enterprise','0010_auto_20161222_1212','2019-02-06 08:03:39.710110'),(110,'enterprise','0011_enterprisecustomerentitlement_historicalenterprisecustomerentitlement','2019-02-06 08:03:39.820222'),(111,'enterprise','0012_auto_20170125_1033','2019-02-06 08:03:39.921636'),(112,'enterprise','0013_auto_20170125_1157','2019-02-06 08:03:40.091299'),(113,'enterprise','0014_enrollmentnotificationemailtemplate_historicalenrollmentnotificationemailtemplate','2019-02-06 08:03:40.226864'),(114,'enterprise','0015_auto_20170130_0003','2019-02-06 08:03:40.375822'),(115,'enterprise','0016_auto_20170405_0647','2019-02-06 08:03:41.108702'),(116,'enterprise','0017_auto_20170508_1341','2019-02-06 08:03:41.558782'),(117,'enterprise','0018_auto_20170511_1357','2019-02-06 08:03:41.671248'),(118,'enterprise','0019_auto_20170606_1853','2019-02-06 08:03:41.795407'),(119,'enterprise','0020_auto_20170624_2316','2019-02-06 08:03:42.114378'),(120,'enterprise','0021_auto_20170711_0712','2019-02-06 08:03:42.443741'),(121,'enterprise','0022_auto_20170720_1543','2019-02-06 08:03:42.555544'),(122,'enterprise','0023_audit_data_reporting_flag','2019-02-06 08:03:42.667708'),(123,'enterprise','0024_enterprisecustomercatalog_historicalenterprisecustomercatalog','2019-02-06 08:03:42.823862'),(124,'enterprise','0025_auto_20170828_1412','2019-02-06 08:03:43.148897'),(125,'enterprise','0026_make_require_account_level_consent_nullable','2019-02-06 08:03:43.564302'),(126,'enterprise','0027_remove_account_level_consent','2019-02-06 08:03:44.095360'),(127,'enterprise','0028_link_enterprise_to_enrollment_template','2019-02-06 08:03:44.318418'),(128,'enterprise','0029_auto_20170925_1909','2019-02-06 08:03:44.398129'),(129,'enterprise','0030_auto_20171005_1600','2019-02-06 08:03:44.553947'),(130,'enterprise','0031_auto_20171012_1249','2019-02-06 08:03:44.725906'),(131,'enterprise','0032_reporting_model','2019-02-06 08:03:44.840167'),(132,'enterprise','0033_add_history_change_reason_field','2019-02-06 08:03:45.245971'),(133,'enterprise','0034_auto_20171023_0727','2019-02-06 08:03:45.385659'),(134,'enterprise','0035_auto_20171212_1129','2019-02-06 08:03:45.513332'),(135,'enterprise','0036_sftp_reporting_support','2019-02-06 08:03:46.086601'),(136,'enterprise','0037_auto_20180110_0450','2019-02-06 08:03:46.208354'),(137,'enterprise','0038_auto_20180122_1427','2019-02-06 08:03:46.303546'),(138,'enterprise','0039_auto_20180129_1034','2019-02-06 08:03:46.415988'),(139,'enterprise','0040_auto_20180129_1428','2019-02-06 08:03:46.564661'),(140,'enterprise','0041_auto_20180212_1507','2019-02-06 08:03:46.626003'),(141,'consent','0001_initial','2019-02-06 08:03:46.846549'),(142,'consent','0002_migrate_to_new_data_sharing_consent','2019-02-06 08:03:46.875083'),(143,'consent','0003_historicaldatasharingconsent_history_change_reason','2019-02-06 08:03:46.965702'),(144,'consent','0004_datasharingconsenttextoverrides','2019-02-06 08:03:47.065885'),(145,'sites','0002_alter_domain_unique','2019-02-06 08:03:47.113519'),(146,'course_overviews','0011_courseoverview_marketing_url','2019-02-06 08:03:47.173117'),(147,'course_overviews','0012_courseoverview_eligible_for_financial_aid','2019-02-06 08:03:47.251335'),(148,'course_overviews','0013_courseoverview_language','2019-02-06 08:03:47.323251'),(149,'course_overviews','0014_courseoverview_certificate_available_date','2019-02-06 08:03:47.375112'),(150,'content_type_gating','0001_initial','2019-02-06 08:03:47.504223'),(151,'content_type_gating','0002_auto_20181119_0959','2019-02-06 08:03:47.696167'),(152,'content_type_gating','0003_auto_20181128_1407','2019-02-06 08:03:47.802689'),(153,'content_type_gating','0004_auto_20181128_1521','2019-02-06 08:03:47.899743'),(154,'contentserver','0001_initial','2019-02-06 08:03:48.012402'),(155,'contentserver','0002_cdnuseragentsconfig','2019-02-06 08:03:48.115897'),(156,'cors_csrf','0001_initial','2019-02-06 08:03:48.228961'),(157,'course_action_state','0001_initial','2019-02-06 08:03:48.432637'),(158,'course_duration_limits','0001_initial','2019-02-06 08:03:48.561335'),(159,'course_duration_limits','0002_auto_20181119_0959','2019-02-06 08:03:49.033726'),(160,'course_duration_limits','0003_auto_20181128_1407','2019-02-06 08:03:49.154788'),(161,'course_duration_limits','0004_auto_20181128_1521','2019-02-06 08:03:49.286782'),(162,'course_goals','0001_initial','2019-02-06 08:03:49.504320'),(163,'course_goals','0002_auto_20171010_1129','2019-02-06 08:03:49.596345'),(164,'course_groups','0002_change_inline_default_cohort_value','2019-02-06 08:03:49.642049'),(165,'course_groups','0003_auto_20170609_1455','2019-02-06 08:03:50.080016'),(166,'course_modes','0008_course_key_field_to_foreign_key','2019-02-06 08:03:50.526973'),(167,'course_modes','0009_suggested_prices_to_charfield','2019-02-06 08:03:50.584282'),(168,'course_modes','0010_archived_suggested_prices_to_charfield','2019-02-06 08:03:50.629980'),(169,'course_modes','0011_change_regex_for_comma_separated_ints','2019-02-06 08:03:50.727914'),(170,'courseware','0001_initial','2019-02-06 08:03:53.237177'),(171,'courseware','0002_coursedynamicupgradedeadlineconfiguration_dynamicupgradedeadlineconfiguration','2019-02-06 08:03:53.619502'),(172,'courseware','0003_auto_20170825_0935','2019-02-06 08:03:53.747454'),(173,'courseware','0004_auto_20171010_1639','2019-02-06 08:03:53.895768'),(174,'courseware','0005_orgdynamicupgradedeadlineconfiguration','2019-02-06 08:03:54.230018'),(175,'courseware','0006_remove_module_id_index','2019-02-06 08:03:54.435353'),(176,'courseware','0007_remove_done_index','2019-02-06 08:03:55.012607'),(177,'coursewarehistoryextended','0001_initial','2019-02-06 08:03:55.303411'),(178,'coursewarehistoryextended','0002_force_studentmodule_index','2019-02-06 08:03:55.370079'),(179,'crawlers','0001_initial','2019-02-06 08:03:55.442696'),(180,'crawlers','0002_auto_20170419_0018','2019-02-06 08:03:55.510303'),(181,'credentials','0001_initial','2019-02-06 08:03:55.578783'),(182,'credentials','0002_auto_20160325_0631','2019-02-06 08:03:55.640533'),(183,'credentials','0003_auto_20170525_1109','2019-02-06 08:03:55.760811'),(184,'credentials','0004_notifycredentialsconfig','2019-02-06 08:03:55.827343'),(185,'credit','0001_initial','2019-02-06 08:03:56.379666'),(186,'credit','0002_creditconfig','2019-02-06 08:03:56.456288'),(187,'credit','0003_auto_20160511_2227','2019-02-06 08:03:56.510076'),(188,'credit','0004_delete_historical_credit_records','2019-02-06 08:03:56.908755'),(189,'dark_lang','0001_initial','2019-02-06 08:03:56.974435'),(190,'dark_lang','0002_data__enable_on_install','2019-02-06 08:03:57.008178'),(191,'dark_lang','0003_auto_20180425_0359','2019-02-06 08:03:57.123998'),(192,'database_fixups','0001_initial','2019-02-06 08:03:57.156768'),(193,'degreed','0001_initial','2019-02-06 08:03:58.035952'),(194,'degreed','0002_auto_20180104_0103','2019-02-06 08:03:58.408761'),(195,'degreed','0003_auto_20180109_0712','2019-02-06 08:03:58.616044'),(196,'degreed','0004_auto_20180306_1251','2019-02-06 08:03:58.814623'),(197,'degreed','0005_auto_20180807_1302','2019-02-06 08:04:00.635482'),(198,'degreed','0006_upgrade_django_simple_history','2019-02-06 08:04:00.815237'),(199,'django_comment_common','0003_enable_forums','2019-02-06 08:04:00.851878'),(200,'django_comment_common','0004_auto_20161117_1209','2019-02-06 08:04:01.011618'),(201,'django_comment_common','0005_coursediscussionsettings','2019-02-06 08:04:01.048387'),(202,'django_comment_common','0006_coursediscussionsettings_discussions_id_map','2019-02-06 08:04:01.092669'),(203,'django_comment_common','0007_discussionsidmapping','2019-02-06 08:04:01.135336'),(204,'django_comment_common','0008_role_user_index','2019-02-06 08:04:01.166345'),(205,'django_notify','0001_initial','2019-02-06 08:04:01.899046'),(206,'django_openid_auth','0001_initial','2019-02-06 08:04:02.148673'),(207,'oauth2','0001_initial','2019-02-06 08:04:03.447522'),(208,'edx_oauth2_provider','0001_initial','2019-02-06 08:04:03.637123'),(209,'edx_proctoring','0001_initial','2019-02-06 08:04:06.249264'),(210,'edx_proctoring','0002_proctoredexamstudentattempt_is_status_acknowledged','2019-02-06 08:04:06.453204'),(211,'edx_proctoring','0003_auto_20160101_0525','2019-02-06 08:04:06.849450'),(212,'edx_proctoring','0004_auto_20160201_0523','2019-02-06 08:04:07.035676'),(213,'edx_proctoring','0005_proctoredexam_hide_after_due','2019-02-06 08:04:07.119540'),(214,'edx_proctoring','0006_allowed_time_limit_mins','2019-02-06 08:04:07.870116'),(215,'edx_proctoring','0007_proctoredexam_backend','2019-02-06 08:04:07.931188'),(216,'edx_proctoring','0008_auto_20181116_1551','2019-02-06 08:04:08.424205'),(217,'edx_proctoring','0009_proctoredexamreviewpolicy_remove_rules','2019-02-06 08:04:08.762512'),(218,'edxval','0001_initial','2019-02-06 08:04:09.122448'),(219,'edxval','0002_data__default_profiles','2019-02-06 08:04:09.157306'),(220,'edxval','0003_coursevideo_is_hidden','2019-02-06 08:04:09.208230'),(221,'edxval','0004_data__add_hls_profile','2019-02-06 08:04:09.249124'),(222,'edxval','0005_videoimage','2019-02-06 08:04:09.314101'),(223,'edxval','0006_auto_20171009_0725','2019-02-06 08:04:09.422431'),(224,'edxval','0007_transcript_credentials_state','2019-02-06 08:04:09.502957'),(225,'edxval','0008_remove_subtitles','2019-02-06 08:04:09.597483'),(226,'edxval','0009_auto_20171127_0406','2019-02-06 08:04:09.650707'),(227,'edxval','0010_add_video_as_foreign_key','2019-02-06 08:04:09.853179'),(228,'edxval','0011_data__add_audio_mp3_profile','2019-02-06 08:04:09.888952'),(229,'email_marketing','0001_initial','2019-02-06 08:04:10.490362'),(230,'email_marketing','0002_auto_20160623_1656','2019-02-06 08:04:12.322113'),(231,'email_marketing','0003_auto_20160715_1145','2019-02-06 08:04:13.625016'),(232,'email_marketing','0004_emailmarketingconfiguration_welcome_email_send_delay','2019-02-06 08:04:13.804721'),(233,'email_marketing','0005_emailmarketingconfiguration_user_registration_cookie_timeout_delay','2019-02-06 08:04:13.987226'),(234,'email_marketing','0006_auto_20170711_0615','2019-02-06 08:04:14.175392'),(235,'email_marketing','0007_auto_20170809_0653','2019-02-06 08:04:14.743333'),(236,'email_marketing','0008_auto_20170809_0539','2019-02-06 08:04:14.781400'),(237,'email_marketing','0009_remove_emailmarketingconfiguration_sailthru_activation_template','2019-02-06 08:04:15.000262'),(238,'email_marketing','0010_auto_20180425_0800','2019-02-06 08:04:15.577846'),(239,'embargo','0001_initial','2019-02-06 08:04:16.853715'),(240,'embargo','0002_data__add_countries','2019-02-06 08:04:16.895352'),(241,'enterprise','0042_replace_sensitive_sso_username','2019-02-06 08:04:17.169747'),(242,'enterprise','0043_auto_20180507_0138','2019-02-06 08:04:17.765765'),(243,'enterprise','0044_reporting_config_multiple_types','2019-02-06 08:04:18.048084'),(244,'enterprise','0045_report_type_json','2019-02-06 08:04:18.121655'),(245,'enterprise','0046_remove_unique_constraints','2019-02-06 08:04:18.194060'),(246,'enterprise','0047_auto_20180517_0457','2019-02-06 08:04:18.519446'),(247,'enterprise','0048_enterprisecustomeruser_active','2019-02-06 08:04:18.962011'),(248,'enterprise','0049_auto_20180531_0321','2019-02-06 08:04:20.082033'),(249,'enterprise','0050_progress_v2','2019-02-06 08:04:20.186103'),(250,'enterprise','0051_add_enterprise_slug','2019-02-06 08:04:20.652158'),(251,'enterprise','0052_create_unique_slugs','2019-02-06 08:04:21.259457'),(252,'enterprise','0053_pendingenrollment_cohort_name','2019-02-06 08:04:21.457833'),(253,'enterprise','0053_auto_20180911_0811','2019-02-06 08:04:22.130573'),(254,'enterprise','0054_merge_20180914_1511','2019-02-06 08:04:22.143011'),(255,'enterprise','0055_auto_20181015_1112','2019-02-06 08:04:22.603605'),(256,'enterprise','0056_enterprisecustomerreportingconfiguration_pgp_encryption_key','2019-02-06 08:04:22.718871'),(257,'enterprise','0057_enterprisecustomerreportingconfiguration_enterprise_customer_catalogs','2019-02-06 08:04:23.004578'),(258,'enterprise','0058_auto_20181212_0145','2019-02-06 08:04:23.860134'),(259,'enterprise','0059_add_code_management_portal_config','2019-02-06 08:04:24.184355'),(260,'enterprise','0060_upgrade_django_simple_history','2019-02-06 08:04:24.698860'),(261,'student','0001_initial','2019-02-06 08:04:31.285410'),(262,'student','0002_auto_20151208_1034','2019-02-06 08:04:31.449034'),(263,'student','0003_auto_20160516_0938','2019-02-06 08:04:31.626628'),(264,'student','0004_auto_20160531_1422','2019-02-06 08:04:31.724604'),(265,'student','0005_auto_20160531_1653','2019-02-06 08:04:32.170241'),(266,'student','0006_logoutviewconfiguration','2019-02-06 08:04:32.266892'),(267,'student','0007_registrationcookieconfiguration','2019-02-06 08:04:32.366689'),(268,'student','0008_auto_20161117_1209','2019-02-06 08:04:32.463972'),(269,'student','0009_auto_20170111_0422','2019-02-06 08:04:32.558706'),(270,'student','0010_auto_20170207_0458','2019-02-06 08:04:32.564759'),(271,'student','0011_course_key_field_to_foreign_key','2019-02-06 08:04:34.027590'),(272,'student','0012_sociallink','2019-02-06 08:04:34.353842'),(273,'student','0013_delete_historical_enrollment_records','2019-02-06 08:04:35.810292'),(274,'entitlements','0001_initial','2019-02-06 08:04:36.165929'),(275,'entitlements','0002_auto_20171102_0719','2019-02-06 08:04:38.257565'),(276,'entitlements','0003_auto_20171205_1431','2019-02-06 08:04:40.470342'),(277,'entitlements','0004_auto_20171206_1729','2019-02-06 08:04:40.982538'),(278,'entitlements','0005_courseentitlementsupportdetail','2019-02-06 08:04:41.539847'),(279,'entitlements','0006_courseentitlementsupportdetail_action','2019-02-06 08:04:41.979223'),(280,'entitlements','0007_change_expiration_period_default','2019-02-06 08:04:42.159096'),(281,'entitlements','0008_auto_20180328_1107','2019-02-06 08:04:42.683695'),(282,'entitlements','0009_courseentitlement_refund_locked','2019-02-06 08:04:43.025841'),(283,'entitlements','0010_backfill_refund_lock','2019-02-06 08:04:43.067438'),(284,'experiments','0001_initial','2019-02-06 08:04:44.694218'),(285,'experiments','0002_auto_20170627_1402','2019-02-06 08:04:44.793494'),(286,'experiments','0003_auto_20170713_1148','2019-02-06 08:04:44.853420'),(287,'external_auth','0001_initial','2019-02-06 08:04:45.445694'),(288,'grades','0001_initial','2019-02-06 08:04:45.632121'),(289,'grades','0002_rename_last_edited_field','2019-02-06 08:04:45.699684'),(290,'grades','0003_coursepersistentgradesflag_persistentgradesenabledflag','2019-02-06 08:04:46.457202'),(291,'grades','0004_visibleblocks_course_id','2019-02-06 08:04:46.531908'),(292,'grades','0005_multiple_course_flags','2019-02-06 08:04:46.849592'),(293,'grades','0006_persistent_course_grades','2019-02-06 08:04:46.952796'),(294,'grades','0007_add_passed_timestamp_column','2019-02-06 08:04:47.066573'),(295,'grades','0008_persistentsubsectiongrade_first_attempted','2019-02-06 08:04:47.138816'),(296,'grades','0009_auto_20170111_1507','2019-02-06 08:04:47.259581'),(297,'grades','0010_auto_20170112_1156','2019-02-06 08:04:47.344906'),(298,'grades','0011_null_edited_time','2019-02-06 08:04:47.527358'),(299,'grades','0012_computegradessetting','2019-02-06 08:04:48.367572'),(300,'grades','0013_persistentsubsectiongradeoverride','2019-02-06 08:04:48.436380'),(301,'grades','0014_persistentsubsectiongradeoverridehistory','2019-02-06 08:04:48.767621'),(302,'instructor_task','0002_gradereportsetting','2019-02-06 08:04:49.116174'),(303,'waffle','0001_initial','2019-02-06 08:04:49.522307'),(304,'sap_success_factors','0001_initial','2019-02-06 08:04:50.784688'),(305,'sap_success_factors','0002_auto_20170224_1545','2019-02-06 08:04:52.503372'),(306,'sap_success_factors','0003_auto_20170317_1402','2019-02-06 08:04:53.057896'),(307,'sap_success_factors','0004_catalogtransmissionaudit_audit_summary','2019-02-06 08:04:53.112654'),(308,'sap_success_factors','0005_historicalsapsuccessfactorsenterprisecustomerconfiguration_history_change_reason','2019-02-06 08:04:53.414309'),(309,'sap_success_factors','0006_sapsuccessfactors_use_enterprise_enrollment_page_waffle_flag','2019-02-06 08:04:53.467401'),(310,'sap_success_factors','0007_remove_historicalsapsuccessfactorsenterprisecustomerconfiguration_history_change_reason','2019-02-06 08:04:53.753419'),(311,'sap_success_factors','0008_historicalsapsuccessfactorsenterprisecustomerconfiguration_history_change_reason','2019-02-06 08:04:54.072310'),(312,'sap_success_factors','0009_sapsuccessfactors_remove_enterprise_enrollment_page_waffle_flag','2019-02-06 08:04:54.115078'),(313,'sap_success_factors','0010_move_audit_tables_to_base_integrated_channel','2019-02-06 08:04:54.280162'),(314,'integrated_channel','0001_initial','2019-02-06 08:04:54.374204'),(315,'integrated_channel','0002_delete_enterpriseintegratedchannel','2019-02-06 08:04:54.413351'),(316,'integrated_channel','0003_catalogtransmissionaudit_learnerdatatransmissionaudit','2019-02-06 08:04:54.514947'),(317,'integrated_channel','0004_catalogtransmissionaudit_channel','2019-02-06 08:04:54.566483'),(318,'integrated_channel','0005_auto_20180306_1251','2019-02-06 08:04:55.508336'),(319,'integrated_channel','0006_delete_catalogtransmissionaudit','2019-02-06 08:04:55.564564'),(320,'lms_xblock','0001_initial','2019-02-06 08:04:55.920260'),(321,'microsite_configuration','0001_initial','2019-02-06 08:04:59.149839'),(322,'microsite_configuration','0002_auto_20160202_0228','2019-02-06 08:04:59.263415'),(323,'microsite_configuration','0003_delete_historical_records','2019-02-06 08:05:00.613558'),(324,'milestones','0001_initial','2019-02-06 08:05:01.624456'),(325,'milestones','0002_data__seed_relationship_types','2019-02-06 08:05:01.663935'),(326,'milestones','0003_coursecontentmilestone_requirements','2019-02-06 08:05:01.731497'),(327,'milestones','0004_auto_20151221_1445','2019-02-06 08:05:01.953395'),(328,'mobile_api','0001_initial','2019-02-06 08:05:02.276280'),(329,'mobile_api','0002_auto_20160406_0904','2019-02-06 08:05:02.375950'),(330,'mobile_api','0003_ignore_mobile_available_flag','2019-02-06 08:05:02.955623'),(331,'notes','0001_initial','2019-02-06 08:05:03.284134'),(332,'oauth2','0002_auto_20160404_0813','2019-02-06 08:05:04.320559'),(333,'oauth2','0003_client_logout_uri','2019-02-06 08:05:05.028463'),(334,'oauth2','0004_add_index_on_grant_expires','2019-02-06 08:05:05.320810'),(335,'oauth2','0005_grant_nonce','2019-02-06 08:05:05.628866'),(336,'organizations','0001_initial','2019-02-06 08:05:05.786592'),(337,'organizations','0002_auto_20170117_1434','2019-02-06 08:05:05.850615'),(338,'organizations','0003_auto_20170221_1138','2019-02-06 08:05:05.970702'),(339,'organizations','0004_auto_20170413_2315','2019-02-06 08:05:06.085590'),(340,'organizations','0005_auto_20171116_0640','2019-02-06 08:05:06.148448'),(341,'organizations','0006_auto_20171207_0259','2019-02-06 08:05:06.215454'),(342,'oauth2_provider','0001_initial','2019-02-06 08:05:07.961621'),(343,'oauth_dispatch','0001_initial','2019-02-06 08:05:08.350586'),(344,'oauth_dispatch','0002_scopedapplication_scopedapplicationorganization','2019-02-06 08:05:09.132604'),(345,'oauth_dispatch','0003_application_data','2019-02-06 08:05:09.196710'),(346,'oauth_dispatch','0004_auto_20180626_1349','2019-02-06 08:05:11.499019'),(347,'oauth_dispatch','0005_applicationaccess_type','2019-02-06 08:05:11.606808'),(348,'oauth_dispatch','0006_drop_application_id_constraints','2019-02-06 08:05:11.875498'),(349,'oauth2_provider','0002_08_updates','2019-02-06 08:05:12.127180'),(350,'oauth2_provider','0003_auto_20160316_1503','2019-02-06 08:05:12.219934'),(351,'oauth2_provider','0004_auto_20160525_1623','2019-02-06 08:05:12.448186'),(352,'oauth2_provider','0005_auto_20170514_1141','2019-02-06 08:05:13.676168'),(353,'oauth2_provider','0006_auto_20171214_2232','2019-02-06 08:05:14.539094'),(354,'oauth_dispatch','0007_restore_application_id_constraints','2019-02-06 08:05:14.834346'),(355,'oauth_provider','0001_initial','2019-02-06 08:05:15.171734'),(356,'problem_builder','0001_initial','2019-02-06 08:05:15.299615'),(357,'problem_builder','0002_auto_20160121_1525','2019-02-06 08:05:15.503283'),(358,'problem_builder','0003_auto_20161124_0755','2019-02-06 08:05:15.621050'),(359,'problem_builder','0004_copy_course_ids','2019-02-06 08:05:15.672698'),(360,'problem_builder','0005_auto_20170112_1021','2019-02-06 08:05:15.822489'),(361,'problem_builder','0006_remove_deprecated_course_id','2019-02-06 08:05:15.937076'),(362,'programs','0001_initial','2019-02-06 08:05:16.056792'),(363,'programs','0002_programsapiconfig_cache_ttl','2019-02-06 08:05:16.160203'),(364,'programs','0003_auto_20151120_1613','2019-02-06 08:05:16.532675'),(365,'programs','0004_programsapiconfig_enable_certification','2019-02-06 08:05:17.329411'),(366,'programs','0005_programsapiconfig_max_retries','2019-02-06 08:05:17.560011'),(367,'programs','0006_programsapiconfig_xseries_ad_enabled','2019-02-06 08:05:17.710363'),(368,'programs','0007_programsapiconfig_program_listing_enabled','2019-02-06 08:05:17.830224'),(369,'programs','0008_programsapiconfig_program_details_enabled','2019-02-06 08:05:17.950796'),(370,'programs','0009_programsapiconfig_marketing_path','2019-02-06 08:05:18.079013'),(371,'programs','0010_auto_20170204_2332','2019-02-06 08:05:18.382249'),(372,'programs','0011_auto_20170301_1844','2019-02-06 08:05:19.698119'),(373,'programs','0012_auto_20170419_0018','2019-02-06 08:05:19.800404'),(374,'redirects','0001_initial','2019-02-06 08:05:20.155019'),(375,'rss_proxy','0001_initial','2019-02-06 08:05:20.204027'),(376,'sap_success_factors','0011_auto_20180104_0103','2019-02-06 08:05:24.276543'),(377,'sap_success_factors','0012_auto_20180109_0712','2019-02-06 08:05:24.679152'),(378,'sap_success_factors','0013_auto_20180306_1251','2019-02-06 08:05:25.083064'),(379,'sap_success_factors','0014_drop_historical_table','2019-02-06 08:05:25.129347'),(380,'sap_success_factors','0015_auto_20180510_1259','2019-02-06 08:05:25.860155'),(381,'sap_success_factors','0016_sapsuccessfactorsenterprisecustomerconfiguration_additional_locales','2019-02-06 08:05:25.960191'),(382,'sap_success_factors','0017_sapsuccessfactorsglobalconfiguration_search_student_api_path','2019-02-06 08:05:26.285693'),(383,'schedules','0001_initial','2019-02-06 08:05:26.690791'),(384,'schedules','0002_auto_20170816_1532','2019-02-06 08:05:27.302276'),(385,'schedules','0003_scheduleconfig','2019-02-06 08:05:27.646134'),(386,'schedules','0004_auto_20170922_1428','2019-02-06 08:05:28.252876'),(387,'schedules','0005_auto_20171010_1722','2019-02-06 08:05:28.881956'),(388,'schedules','0006_scheduleexperience','2019-02-06 08:05:29.251797'),(389,'schedules','0007_scheduleconfig_hold_back_ratio','2019-02-06 08:05:29.617048'),(390,'self_paced','0001_initial','2019-02-06 08:05:30.027241'),(391,'sessions','0001_initial','2019-02-06 08:05:30.078048'),(392,'shoppingcart','0001_initial','2019-02-06 08:05:38.998266'),(393,'shoppingcart','0002_auto_20151208_1034','2019-02-06 08:05:39.154428'),(394,'shoppingcart','0003_auto_20151217_0958','2019-02-06 08:05:39.312762'),(395,'shoppingcart','0004_change_meta_options','2019-02-06 08:05:39.468307'),(396,'site_configuration','0001_initial','2019-02-06 08:05:40.221457'),(397,'site_configuration','0002_auto_20160720_0231','2019-02-06 08:05:40.436234'),(398,'default','0001_initial','2019-02-06 08:05:41.857778'),(399,'social_auth','0001_initial','2019-02-06 08:05:41.863663'),(400,'default','0002_add_related_name','2019-02-06 08:05:42.234168'),(401,'social_auth','0002_add_related_name','2019-02-06 08:05:42.241171'),(402,'default','0003_alter_email_max_length','2019-02-06 08:05:42.308536'),(403,'social_auth','0003_alter_email_max_length','2019-02-06 08:05:42.316793'),(404,'default','0004_auto_20160423_0400','2019-02-06 08:05:42.679083'),(405,'social_auth','0004_auto_20160423_0400','2019-02-06 08:05:42.685800'),(406,'social_auth','0005_auto_20160727_2333','2019-02-06 08:05:42.757758'),(407,'social_django','0006_partial','2019-02-06 08:05:42.816147'),(408,'social_django','0007_code_timestamp','2019-02-06 08:05:42.883285'),(409,'social_django','0008_partial_timestamp','2019-02-06 08:05:42.957758'),(410,'splash','0001_initial','2019-02-06 08:05:43.433414'),(411,'static_replace','0001_initial','2019-02-06 08:05:44.140144'),(412,'static_replace','0002_assetexcludedextensionsconfig','2019-02-06 08:05:46.566804'),(413,'status','0001_initial','2019-02-06 08:05:47.436513'),(414,'status','0002_update_help_text','2019-02-06 08:05:47.800113'),(415,'student','0014_courseenrollmentallowed_user','2019-02-06 08:05:48.264692'),(416,'student','0015_manualenrollmentaudit_add_role','2019-02-06 08:05:48.712619'),(417,'student','0016_coursenrollment_course_on_delete_do_nothing','2019-02-06 08:05:49.240041'),(418,'student','0017_accountrecovery','2019-02-06 08:05:49.748236'),(419,'student','0018_remove_password_history','2019-02-06 08:05:50.694342'),(420,'student','0019_auto_20181221_0540','2019-02-06 08:05:51.482317'),(421,'submissions','0001_initial','2019-02-06 08:05:51.980676'),(422,'submissions','0002_auto_20151119_0913','2019-02-06 08:05:52.129788'),(423,'submissions','0003_submission_status','2019-02-06 08:05:52.207556'),(424,'submissions','0004_remove_django_extensions','2019-02-06 08:05:52.285295'),(425,'survey','0001_initial','2019-02-06 08:05:53.028225'),(426,'teams','0001_initial','2019-02-06 08:05:56.392431'),(427,'theming','0001_initial','2019-02-06 08:05:57.128347'),(428,'third_party_auth','0001_initial','2019-02-06 08:06:00.383669'),(429,'third_party_auth','0002_schema__provider_icon_image','2019-02-06 08:06:04.313456'),(430,'third_party_auth','0003_samlproviderconfig_debug_mode','2019-02-06 08:06:04.721469'),(431,'third_party_auth','0004_add_visible_field','2019-02-06 08:06:08.188893'),(432,'third_party_auth','0005_add_site_field','2019-02-06 08:06:11.231121'),(433,'third_party_auth','0006_samlproviderconfig_automatic_refresh_enabled','2019-02-06 08:06:11.638402'),(434,'third_party_auth','0007_auto_20170406_0912','2019-02-06 08:06:12.463541'),(435,'third_party_auth','0008_auto_20170413_1455','2019-02-06 08:06:13.699789'),(436,'third_party_auth','0009_auto_20170415_1144','2019-02-06 08:06:15.877426'),(437,'third_party_auth','0010_add_skip_hinted_login_dialog_field','2019-02-06 08:06:17.252327'),(438,'third_party_auth','0011_auto_20170616_0112','2019-02-06 08:06:17.697662'),(439,'third_party_auth','0012_auto_20170626_1135','2019-02-06 08:06:19.014914'),(440,'third_party_auth','0013_sync_learner_profile_data','2019-02-06 08:06:21.184194'),(441,'third_party_auth','0014_auto_20171222_1233','2019-02-06 08:06:22.500576'),(442,'third_party_auth','0015_samlproviderconfig_archived','2019-02-06 08:06:22.910782'),(443,'third_party_auth','0016_auto_20180130_0938','2019-02-06 08:06:23.768574'),(444,'third_party_auth','0017_remove_icon_class_image_secondary_fields','2019-02-06 08:06:25.677996'),(445,'third_party_auth','0018_auto_20180327_1631','2019-02-06 08:06:26.945645'),(446,'third_party_auth','0019_consolidate_slug','2019-02-06 08:06:28.225165'),(447,'third_party_auth','0020_cleanup_slug_fields','2019-02-06 08:06:29.071340'),(448,'third_party_auth','0021_sso_id_verification','2019-02-06 08:06:30.920266'),(449,'third_party_auth','0022_auto_20181012_0307','2019-02-06 08:06:33.001900'),(450,'thumbnail','0001_initial','2019-02-06 08:06:33.058625'),(451,'track','0001_initial','2019-02-06 08:06:33.135878'),(452,'user_api','0001_initial','2019-02-06 08:06:36.568433'),(453,'user_api','0002_retirementstate_userretirementstatus','2019-02-06 08:06:37.067536'),(454,'user_api','0003_userretirementrequest','2019-02-06 08:06:37.538805'),(455,'user_api','0004_userretirementpartnerreportingstatus','2019-02-06 08:06:38.846620'),(456,'user_authn','0001_data__add_login_service','2019-02-06 08:06:38.924862'),(457,'util','0001_initial','2019-02-06 08:06:39.401783'),(458,'util','0002_data__default_rate_limit_config','2019-02-06 08:06:39.459887'),(459,'verified_track_content','0002_verifiedtrackcohortedcourse_verified_cohort_name','2019-02-06 08:06:39.538104'),(460,'verified_track_content','0003_migrateverifiedtrackcohortssetting','2019-02-06 08:06:40.048232'),(461,'verify_student','0001_initial','2019-02-06 08:06:45.357816'),(462,'verify_student','0002_auto_20151124_1024','2019-02-06 08:06:45.516943'),(463,'verify_student','0003_auto_20151113_1443','2019-02-06 08:06:45.673513'),(464,'verify_student','0004_delete_historical_records','2019-02-06 08:06:45.835049'),(465,'verify_student','0005_remove_deprecated_models','2019-02-06 08:06:49.679210'),(466,'verify_student','0006_ssoverification','2019-02-06 08:06:49.790644'),(467,'verify_student','0007_idverificationaggregate','2019-02-06 08:06:49.891841'),(468,'verify_student','0008_populate_idverificationaggregate','2019-02-06 08:06:49.947020'),(469,'verify_student','0009_remove_id_verification_aggregate','2019-02-06 08:06:50.183257'),(470,'verify_student','0010_manualverification','2019-02-06 08:06:50.284386'),(471,'verify_student','0011_add_fields_to_sspv','2019-02-06 08:06:50.459982'),(472,'video_config','0001_initial','2019-02-06 08:06:50.654393'),(473,'video_config','0002_coursevideotranscriptenabledflag_videotranscriptenabledflag','2019-02-06 08:06:50.846809'),(474,'video_config','0003_transcriptmigrationsetting','2019-02-06 08:06:50.952242'),(475,'video_config','0004_transcriptmigrationsetting_command_run','2019-02-06 08:06:51.053615'),(476,'video_config','0005_auto_20180719_0752','2019-02-06 08:06:51.770192'),(477,'video_config','0006_videothumbnailetting_updatedcoursevideos','2019-02-06 08:06:51.998431'),(478,'video_config','0007_videothumbnailsetting_offset','2019-02-06 08:06:52.104225'),(479,'video_pipeline','0001_initial','2019-02-06 08:06:52.217246'),(480,'video_pipeline','0002_auto_20171114_0704','2019-02-06 08:06:52.423437'),(481,'video_pipeline','0003_coursevideouploadsenabledbydefault_videouploadsenabledbydefault','2019-02-06 08:06:52.652384'),(482,'waffle','0002_auto_20161201_0958','2019-02-06 08:06:52.731546'),(483,'waffle_utils','0001_initial','2019-02-06 08:06:52.859204'),(484,'wiki','0001_initial','2019-02-06 08:07:04.002394'),(485,'wiki','0002_remove_article_subscription','2019-02-06 08:07:04.852782'),(486,'wiki','0003_ip_address_conv','2019-02-06 08:07:06.546138'),(487,'wiki','0004_increase_slug_size','2019-02-06 08:07:06.749915'),(488,'wiki','0005_remove_attachments_and_images','2019-02-06 08:07:10.711449'),(489,'workflow','0001_initial','2019-02-06 08:07:10.929774'),(490,'workflow','0002_remove_django_extensions','2019-02-06 08:07:11.016177'),(491,'xapi','0001_initial','2019-02-06 08:07:11.530173'),(492,'xapi','0002_auto_20180726_0142','2019-02-06 08:07:11.853838'),(493,'xblock_django','0001_initial','2019-02-06 08:07:12.421573'),(494,'xblock_django','0002_auto_20160204_0809','2019-02-06 08:07:12.884088'),(495,'xblock_django','0003_add_new_config_models','2019-02-06 08:07:15.322827'),(496,'xblock_django','0004_delete_xblock_disable_config','2019-02-06 08:07:15.939861'),(497,'social_django','0002_add_related_name','2019-02-06 08:07:15.955501'),(498,'social_django','0003_alter_email_max_length','2019-02-06 08:07:15.960905'),(499,'social_django','0004_auto_20160423_0400','2019-02-06 08:07:15.967703'),(500,'social_django','0001_initial','2019-02-06 08:07:15.972077'),(501,'social_django','0005_auto_20160727_2333','2019-02-06 08:07:15.978019'),(502,'contentstore','0001_initial','2019-02-06 08:07:47.027361'),(503,'contentstore','0002_add_assets_page_flag','2019-02-06 08:07:48.064450'),(504,'contentstore','0003_remove_assets_page_flag','2019-02-06 08:07:48.989553'),(505,'course_creators','0001_initial','2019-02-06 08:07:49.658930'),(506,'tagging','0001_initial','2019-02-06 08:07:49.791763'),(507,'tagging','0002_auto_20170116_1541','2019-02-06 08:07:49.890533'),(508,'user_tasks','0001_initial','2019-02-06 08:07:50.803460'),(509,'user_tasks','0002_artifact_file_storage','2019-02-06 08:07:50.865286'),(510,'xblock_config','0001_initial','2019-02-06 08:07:51.079346'),(511,'xblock_config','0002_courseeditltifieldsenabledflag','2019-02-06 08:07:51.540299'),(512,'lti_provider','0001_initial','2019-02-20 13:02:12.609875'),(513,'lti_provider','0002_auto_20160325_0407','2019-02-20 13:02:12.673092'),(514,'lti_provider','0003_auto_20161118_1040','2019-02-20 13:02:12.735420'),(515,'content_type_gating','0005_auto_20190306_1547','2019-03-06 16:01:10.563542'),(516,'course_duration_limits','0005_auto_20190306_1546','2019-03-06 16:01:11.211966'),(517,'enterprise','0061_systemwideenterpriserole_systemwideenterpriseuserroleassignment','2019-03-08 15:47:46.856657'),(518,'enterprise','0062_add_system_wide_enterprise_roles','2019-03-08 15:47:46.906778'),(519,'content_type_gating','0006_auto_20190308_1447','2019-03-11 16:27:52.135257'),(520,'course_duration_limits','0006_auto_20190308_1447','2019-03-11 16:27:52.779284'),(521,'content_type_gating','0007_auto_20190311_1919','2019-03-12 16:11:54.043782'),(522,'course_duration_limits','0007_auto_20190311_1919','2019-03-12 16:11:56.790492'),(523,'announcements','0001_initial','2019-03-18 20:55:30.988286'),(524,'content_type_gating','0008_auto_20190313_1634','2019-03-18 20:55:31.415131'),(525,'course_duration_limits','0008_auto_20190313_1634','2019-03-18 20:55:32.064734'),(526,'enterprise','0063_systemwideenterpriserole_description','2019-03-21 18:42:16.699719'),(527,'enterprise','0064_enterprisefeaturerole_enterprisefeatureuserroleassignment','2019-03-28 19:30:12.392842'),(528,'enterprise','0065_add_enterprise_feature_roles','2019-03-28 19:30:12.443188'),(529,'enterprise','0066_add_system_wide_enterprise_operator_role','2019-03-28 19:30:12.488801'),(530,'student','0020_auto_20190227_2019','2019-04-01 21:47:42.163913'),(531,'certificates','0015_add_masters_choice','2019-04-05 14:57:27.206603'),(532,'enterprise','0067_add_role_based_access_control_switch','2019-04-08 20:45:27.538157'),(533,'program_enrollments','0001_initial','2019-04-10 20:26:00.692153'),(534,'program_enrollments','0002_historicalprogramcourseenrollment_programcourseenrollment','2019-04-18 16:08:03.137722'),(535,'third_party_auth','0023_auto_20190418_2033','2019-04-24 13:54:18.834044'),(536,'program_enrollments','0003_auto_20190424_1622','2019-04-24 16:35:05.844296'),(537,'courseware','0008_move_idde_to_edx_when','2019-04-25 14:14:41.176920'),(538,'edx_when','0001_initial','2019-04-25 14:14:42.645389'),(539,'edx_when','0002_auto_20190318_1736','2019-04-25 14:14:44.336320'),(540,'edx_when','0003_auto_20190402_1501','2019-04-25 14:14:46.294533'),(541,'edx_proctoring','0010_update_backend','2019-05-02 21:47:41.213808'),(542,'program_enrollments','0004_add_programcourseenrollment_relatedname','2019-05-02 21:47:41.764379'),(543,'student','0021_historicalcourseenrollment','2019-05-03 20:30:26.687544'),(544,'cornerstone','0001_initial','2019-05-29 09:33:13.719793'),(545,'cornerstone','0002_cornerstoneglobalconfiguration_subject_mapping','2019-05-29 09:33:14.111664'),(546,'third_party_auth','0024_fix_edit_disallowed','2019-05-29 14:34:39.226961'),(547,'discounts','0001_initial','2019-06-03 19:16:30.854700'),(548,'program_enrollments','0005_canceled_not_withdrawn','2019-06-03 19:16:31.705259'),(549,'entitlements','0011_historicalcourseentitlement','2019-06-04 17:56:44.090401'),(550,'organizations','0007_historicalorganization','2019-06-04 17:56:44.882744'),(551,'user_tasks','0003_url_max_length','2019-06-04 17:56:52.649984'),(552,'user_tasks','0004_url_textfield','2019-06-04 17:56:52.708857'),(553,'enterprise','0068_remove_role_based_access_control_switch','2019-06-05 10:59:54.361142'),(554,'grades','0015_historicalpersistentsubsectiongradeoverride','2019-06-10 16:42:35.419978'),(555,'bulk_grades','0001_initial','2019-06-12 14:00:26.847460'),(556,'super_csv','0001_initial','2019-06-12 14:00:26.879762'),(557,'super_csv','0002_csvoperation_user','2019-06-12 14:00:27.257652'),(558,'enterprise','0069_auto_20190613_0607','2019-06-13 20:29:54.231876'),(559,'course_modes','0012_historicalcoursemode','2019-06-20 14:17:00.883900'),(560,'student','0022_indexing_in_courseenrollment','2019-06-28 07:52:49.937484'),(561,'courseware','0009_auto_20190703_1955','2019-07-03 19:59:48.322976'),(562,'bulk_grades','0002_auto_20190703_1526','2019-07-09 16:24:12.489841'),(563,'course_overviews','0015_historicalcourseoverview','2019-07-09 16:24:12.865655'),(564,'courseware','0010_auto_20190709_1559','2019-07-09 16:24:13.249043'),(565,'grades','0016_auto_20190703_1446','2019-07-09 16:24:14.162438'),(566,'cornerstone','0003_auto_20190621_1000','2019-08-16 20:33:30.643210'),(567,'enterprise','0070_enterprise_catalog_query','2019-08-16 20:33:31.677056'),(568,'enterprise','0071_historicalpendingenrollment_historicalpendingenterprisecustomeruser','2019-08-16 20:33:32.745997'),(569,'instructor_task','0003_alter_task_input_field','2019-08-16 20:33:33.017938'),(570,'microsite_configuration','004_delete_all_tables','2019-08-16 20:33:34.256853'),(571,'sap_success_factors','0018_sapsuccessfactorsenterprisecustomerconfiguration_show_course_price','2019-08-16 20:33:34.327113'),(572,'super_csv','0003_csvoperation_original_filename','2019-08-16 20:33:34.600410'),(573,'system_wide_roles','0001_SystemWideRole_SystemWideRoleAssignment','2019-08-16 20:33:34.993423'),(574,'system_wide_roles','0002_add_system_wide_student_support_role','2019-08-16 20:33:35.022596'),(575,'contentstore','0004_remove_push_notification_configmodel_table','2019-08-16 20:33:41.465727'),(576,'xapi','0003_auto_20190807_1006','2019-08-23 11:39:48.729878'),(577,'program_enrollments','0006_add_the_correct_constraints','2019-08-23 18:09:09.268961'),(578,'video_config','0008_courseyoutubeblockedflag','2019-08-25 18:17:15.983779'),(579,'program_enrollments','0007_waiting_programcourseenrollment_constraint','2019-08-27 19:09:27.680607'),(580,'content_libraries','0001_initial','2019-08-30 19:28:25.635235'),(581,'courseware','0011_csm_id_bigint','2019-08-30 19:28:26.395259'),(582,'enterprise','0072_add_enterprise_report_config_feature_role','2019-08-30 19:28:26.428135'),(583,'enterprise','0073_enterprisecustomerreportingconfiguration_uuid','2019-08-30 19:28:26.610136'),(584,'enterprise','0074_auto_20190904_1143','2019-09-06 21:17:13.932220'),(585,'xapi','0004_auto_20190830_0710','2019-09-06 21:17:14.456308'),(586,'enterprise','0075_auto_20190916_1030','2019-09-16 21:24:40.846129'),(587,'course_overviews','0016_simulatecoursepublishconfig','2019-09-17 14:33:18.318209'),(588,'courseware','0012_adjust_fields','2019-09-19 19:47:32.265973'),(589,'enterprise','0076_auto_20190918_2037','2019-09-19 19:47:33.356916'),(590,'cornerstone','0004_cornerstoneglobalconfiguration_languages','2019-09-25 09:52:14.183189'),(591,'cornerstone','0005_auto_20190925_0730','2019-09-25 09:52:14.554260'),(592,'degreed','0007_auto_20190925_0730','2019-09-25 09:52:14.965290'),(593,'integrated_channel','0007_auto_20190925_0730','2019-09-25 09:52:15.001578'),(594,'sap_success_factors','0019_auto_20190925_0730','2019-09-25 09:52:15.372786'),(595,'course_overviews','0017_auto_20191002_0823','2019-10-03 17:35:47.108732'),(596,'courseware','0013_auto_20191001_1858','2019-10-03 17:35:47.675913'),(597,'edx_when','0004_datepolicy_rel_date','2019-10-03 17:35:47.714137'),(598,'edx_when','0005_auto_20190911_1056','2019-10-03 17:35:48.352268'),(599,'student','0023_bulkunenrollconfiguration','2019-10-08 08:54:55.531674'),(600,'program_enrollments','0008_add_ended_programenrollment_status','2019-10-15 16:54:40.812546'),(601,'enterprise','0077_auto_20191002_1529','2019-10-15 21:48:57.015096'),(602,'completion','0003_learning_context','2019-10-22 18:42:37.071520'),(603,'teams','0002_slug_field_ids','2019-10-22 18:42:37.978486'),(604,'entitlements','0012_allow_blank_order_number_values','2019-10-23 16:23:53.619696'),(605,'discounts','0002_auto_20191022_1720','2019-10-25 14:14:29.317857'),(606,'commerce','0008_auto_20191024_2048','2019-10-30 16:42:49.876338'),(607,'student','0024_fbeenrollmentexclusion','2019-10-31 16:16:38.116056'),(608,'student','0025_auto_20191101_1846','2019-11-05 14:23:29.298316'),(609,'cornerstone','0006_auto_20191001_0742','2019-11-15 09:41:58.615907'),(610,'degreed','0008_auto_20191001_0742','2019-11-15 09:41:59.004037'),(611,'enterprise','0078_auto_20191107_1536','2019-11-15 09:41:59.081745'),(612,'enterprise','0079_AddEnterpriseEnrollmentSource','2019-11-15 09:42:01.297444'),(613,'enterprise','0080_auto_20191113_1708','2019-11-15 09:42:01.373867'),(614,'sap_success_factors','0020_sapsuccessfactorsenterprisecustomerconfiguration_catalogs_to_transmit','2019-11-15 09:42:01.448662'),(615,'student','0026_allowedauthuser','2019-11-15 09:42:01.867741'),(616,'teams','0003_courseteam_organization_protected','2019-11-15 09:42:02.160822'),(617,'schedules','0008_add_new_start_date_field','2019-11-21 18:12:54.950500'),(618,'enterprise','0081_UpdateEnterpriseEnrollmentSource','2019-11-25 17:52:07.779142'),(619,'enterprise','0082_AddManagementEnterpriseEnrollmentSource','2019-12-03 20:57:44.528593'),(620,'edxval','0012_thirdpartytranscriptcredentialsstate_has_creds','2019-12-06 10:56:28.616253'),(621,'edxval','0013_thirdpartytranscriptcredentialsstate_copy_values','2019-12-13 13:13:43.103802'),(622,'edxval','0014_transcript_credentials_state_retype_exists','2019-12-13 13:13:43.146474'),(623,'programs','0013_customprogramsconfig','2019-12-13 13:13:43.769272'),(624,'verify_student','0012_sspverificationretryconfig','2019-12-13 13:13:44.172148'),(625,'assessment','0004_historicalsharedfileupload_sharedfileupload','2019-12-16 06:29:51.457888'),(626,'certificates','0016_historicalgeneratedcertificate','2019-12-17 14:30:19.195816'),(627,'entitlements','0013_historicalcourseentitlementsupportdetail','2019-12-17 14:30:19.608404'),(628,'credit','0005_creditrequirement_sort_value','2019-12-19 10:51:33.510519'),(629,'student','0027_courseenrollment_mode_callable_default','2019-12-26 15:36:18.942310'),(630,'enterprise','0083_enterprisecustomerreportingconfiguration_include_date','2019-12-26 21:47:36.992960'),(631,'schedules','0009_schedule_copy_column_values','2020-01-02 13:28:40.924356'),(632,'credit','0006_creditrequirement_alter_ordering','2020-01-03 18:18:59.132478'),(633,'credit','0007_creditrequirement_copy_values','2020-01-03 18:18:59.153966'),(634,'credit','0008_creditrequirement_remove_order','2020-01-08 11:38:46.464661'),(635,'grades','0017_delete_manual_psgoverride_table','2020-01-08 11:38:46.979886'),(636,'waffle','0003_update_strings_for_i18n','2020-01-08 14:05:56.793699'),(637,'student','0028_historicalmanualenrollmentaudit','2020-01-10 11:40:33.721153'),(638,'assessment','0005_add_filename_to_sharedupload','2020-01-13 10:35:30.849694'),(639,'course_overviews','0018_add_start_end_in_CourseOverview','2020-01-13 17:26:59.381741'),(640,'wiki','0006_auto_20200110_1003','2020-01-13 17:26:59.580772'),(641,'course_modes','0013_auto_20200115_2022','2020-01-15 20:28:11.826240'),(642,'entitlements','0014_auto_20200115_2022','2020-01-15 20:28:12.121824'),(643,'schedules','0010_remove_null_blank_from_schedules_date','2020-01-22 12:55:55.562069'),(644,'edxval','0015_remove_thirdpartytranscriptcredentialsstate_exists','2020-01-24 14:36:05.625239'),(645,'enterprise','0084_auto_20200120_1137','2020-01-24 14:36:05.682781'),(646,'enterprise','0085_enterprisecustomeruser_linked','2020-01-24 14:36:05.737471'),(647,'sap_success_factors','0021_sapsuccessfactorsenterprisecustomerconfiguration_show_total_hours','2020-01-27 10:53:54.883903'),(648,'course_overviews','0019_improve_courseoverviewtab','2020-01-28 16:51:53.392851'),(649,'enterprise','0086_auto_20200128_1726','2020-01-31 16:49:40.116068'),(650,'student','0029_add_data_researcher','2020-01-31 16:49:40.134245'),(651,'entitlements','0015_add_unique_together_constraint','2020-02-11 13:55:54.821099'),(652,'external_user_ids','0001_initial','2020-02-11 13:55:56.286689'),(653,'external_user_ids','0002_mb_coaching_20200210_1754','2020-02-11 13:55:56.302455'),(654,'sap_success_factors','0022_auto_20200206_1046','2020-02-11 13:55:56.431451'),(655,'track','0002_delete_trackinglog','2020-02-11 13:55:56.448287'),(656,'enterprise','0087_auto_20200206_1151','2020-02-18 09:56:05.261459'),(657,'site_configuration','0003_auto_20200217_1058','2020-02-18 09:56:05.382056'),(658,'student','0030_userprofile_phone_number','2020-02-20 14:49:09.679286'),(659,'course_date_signals','0001_initial','2020-02-21 16:46:07.245424'),(660,'oauth_dispatch','0008_applicationaccess_filters','2020-02-21 16:46:07.279347'),(661,'site_configuration','0004_add_site_values_field','2020-02-21 16:46:07.400523'),(662,'calendar_sync','0001_initial','2020-02-21 20:05:00.723064'),(663,'site_configuration','0005_copy_values_to_site_values','2020-02-24 18:48:13.968250'),(664,'external_user_ids','0003_auto_20200224_1836','2020-02-26 19:12:10.225163'),(665,'course_overviews','0020_courseoverviewtab_url_slug','2020-02-28 17:48:26.402935'),(666,'schedules','0011_auto_20200228_2018','2020-03-02 19:21:35.447856'),(667,'schedules','0012_auto_20200302_1914','2020-03-02 19:21:35.760107'),(668,'enterprise','0088_auto_20200224_1341','2020-03-03 20:06:11.193549'),(669,'experiments','0004_historicalexperimentkeyvalue','2020-03-03 20:06:11.472740'),(670,'program_enrollments','0009_update_course_enrollment_field_to_foreign_key','2020-03-03 20:06:11.793880'),(671,'site_configuration','0005_populate_siteconfig_history_site_values','2020-03-03 20:06:11.809759'),(672,'third_party_auth','0025_auto_20200303_1448','2020-03-03 20:06:12.334364'),(673,'oauth_dispatch','0009_delete_enable_scopes_waffle_switch','2020-03-04 16:02:10.087753'),(674,'schedules','0013_historicalschedule','2020-03-04 20:46:18.382627'),(675,'content_libraries','0002_group_permissions','2020-03-06 17:56:06.253916'),(676,'enterprise','0089_auto_20200305_0652','2020-03-06 17:56:06.313096'),(677,'site_configuration','0006_copy_values_to_site_values','2020-03-06 17:56:06.328937'),(678,'site_configuration','0007_remove_values_field','2020-03-06 17:56:06.393334'),(679,'schedules','0014_historicalschedule_drop_fk','2020-03-09 17:25:11.320964'),(680,'enterprise','0090_update_content_filter','2020-03-10 17:57:28.234120'),(681,'schedules','0015_schedules_start_nullable','2020-03-10 17:57:28.512287'),(682,'courseware','0014_fix_nan_value_for_global_speed','2020-03-11 13:49:34.540416'),(683,'enterprise','0091_add_sales_force_id_in_pendingenrollment','2020-03-12 10:55:06.528703'),(684,'enterprise','0092_auto_20200312_1650','2020-03-13 15:24:08.871983'),(685,'schedules','0016_remove_start_from_schedules','2020-03-13 15:24:08.919319'),(686,'schedules','0017_remove_start_from_historicalschedule','2020-03-13 15:24:08.961171'),(687,'schedules','0018_readd_historicalschedule_fks','2020-03-16 14:38:37.163574'),(688,'student','0031_auto_20200317_1122','2020-03-17 13:50:29.328406'),(689,'schedules','0019_auto_20200316_1935','2020-03-17 18:44:58.495941'),(690,'teams','0004_alter_defaults','2020-03-18 15:45:23.207866'),(691,'edxval','0016_add_transcript_credentials_model','2020-03-27 07:02:32.020569'),(692,'assessment','0006_TeamWorkflows','2020-03-30 19:21:59.600633'),(693,'edx_when','0006_drop_active_index','2020-03-30 19:21:59.632637'),(694,'program_enrollments','0010_add_courseaccessroleassignment','2020-03-30 19:22:00.189635'),(695,'workflow','0003_TeamWorkflows','2020-03-30 19:22:00.217685'),(696,'submissions','0005_CreateTeamModel','2020-04-01 20:58:02.569032'),(697,'third_party_auth','0026_auto_20200401_1932','2020-04-02 13:16:24.403863'),(698,'enterprise','0093_add_use_enterprise_catalog_flag','2020-04-08 18:23:05.688441'),(699,'enterprise','0094_add_use_enterprise_catalog_sample','2020-04-10 22:07:38.597967'),(700,'submissions','0001_squashed_0005_CreateTeamModel','2020-04-10 22:07:38.604906'),(701,'organizations','0001_squashed_0007_historicalorganization','2020-04-10 22:07:38.607140'),(702,'admin','0003_logentry_add_action_flag_choices','2020-04-23 18:12:12.574100'),(703,'auth','0009_alter_user_last_name_max_length','2020-04-23 18:12:12.796012'),(704,'auth','0010_alter_group_name_max_length','2020-04-23 18:12:12.828059'),(705,'auth','0011_update_proxy_permissions','2020-04-23 18:12:12.844008'),(706,'edx_when','0007_meta_tweaks','2020-04-23 18:12:12.867316'),(707,'oauth2_provider','0002_auto_20190406_1805','2020-04-23 18:12:12.934409'),(708,'student','0032_removed_logout_view_configuration','2020-04-23 18:12:13.224802'),(709,'third_party_auth','0001_squashed_0026_auto_20200401_1932','2020-04-23 18:12:13.228610'),(710,'student','0001_squashed_0031_auto_20200317_1122','2020-04-23 18:12:13.230794'),(711,'enterprise','0001_squashed_0092_auto_20200312_1650','2020-04-23 18:12:13.231901'),(712,'edxval','0001_squashed_0016_add_transcript_credentials_model','2020-04-23 18:12:13.233806'),(713,'integrated_channel','0001_squashed_0007_auto_20190925_0730','2020-04-24 16:47:58.386734'),(714,'sap_success_factors','0001_squashed_0022_auto_20200206_1046','2020-04-24 16:47:58.389680'),(715,'course_overviews','0021_courseoverviewtab_link','2020-05-04 10:59:50.657693'),(716,'course_overviews','0022_courseoverviewtab_is_hidden','2020-05-04 10:59:50.698025'),(717,'edxval','0002_add_error_description_field','2020-05-04 10:59:50.726121'),(718,'external_user_ids','0004_add_lti_type','2020-05-04 10:59:50.742411'),(719,'enterprise','0095_auto_20200507_1138','2020-05-08 20:20:57.110248'),(720,'enterprise','0096_enterprise_catalog_admin_role','2020-05-13 22:12:35.726151'),(721,'student','0033_userprofile_state','2020-05-13 22:12:35.951058'),(722,'edxval','0003_delete_transcriptcredentials','2020-05-27 11:00:00.899989'),(723,'learning_sequences','0001_initial','2020-06-04 06:06:00.367312'),(724,'video_pipeline','0004_vempipelineintegration','2020-06-04 06:06:00.662081'),(725,'social_django','0009_auto_20191118_0520','2020-06-19 00:01:12.172817'),(726,'social_django','0010_uid_db_index','2020-06-19 00:01:12.397908'),(727,'student','0034_courseenrollmentcelebration','2020-06-19 00:01:12.953638'),(728,'enterprise','0097_auto_20200619_1130','2020-06-19 19:05:31.695995'),(729,'grades','0018_add_waffle_flag_defaults','2020-06-23 18:17:40.133076'),(730,'contentstore','0005_add_enable_checklists_quality_waffle_flag','2020-06-23 18:17:46.707561'),(731,'video_pipeline','0005_add_vem_course_percentage','2020-06-26 08:12:02.660023'),(732,'enterprise','0098_auto_20200629_1756','2020-07-01 12:53:15.837538'),(733,'enterprise','0099_auto_20200702_1537','2020-07-07 20:06:32.822100'),(734,'enterprise','0100_add_licensed_enterprise_course_enrollment','2020-07-07 20:06:33.462679'),(735,'calendar_sync','0002_auto_20200709_1743','2020-07-14 15:27:51.730354'),(736,'enterprise','0101_move_data_to_saved_for_later','2020-07-14 15:27:51.746882'),(737,'enterprise','0102_auto_20200708_1615','2020-07-14 15:27:52.063293'),(738,'enterprise','0103_remove_marked_done','2020-07-14 15:27:52.596888'),(739,'learning_sequences','0002_coursesectionsequence_inaccessible_after_due','2020-07-14 15:27:52.622881'),(740,'student','0035_bulkchangeenrollmentconfiguration','2020-07-21 10:54:23.472177'),(741,'third_party_auth','0002_samlproviderconfig_country','2020-07-24 14:51:24.977886'),(742,'demographics','0001_initial','2020-07-30 15:57:38.753511'),(743,'enterprise','0104_sync_query_field','2020-07-30 15:57:39.062774'),(744,'third_party_auth','0002_auto_20200721_1650','2020-07-30 15:57:40.314105'),(745,'enterprise','0105_add_branding_config_color_fields','2020-08-03 19:13:50.868781'),(746,'learning_sequences','0003_create_course_context_for_course_specific_models','2020-08-03 19:13:51.087958'),(747,'enterprise','0106_move_branding_config_colors','2020-08-04 19:27:28.158538'),(748,'enterprise','0107_remove_branding_config_banner_fields','2020-08-04 19:27:28.264863'),(749,'canvas','0001_initial','2020-08-07 08:26:14.629124'),(750,'video_pipeline','0006_remove_vempipelineintegration_vem_enabled_courses_percentage','2020-08-07 08:26:14.811318'),(751,'enterprise','0108_add_licensed_enrollment_is_revoked','2020-08-11 13:14:55.354317'),(752,'canvas','0002_auto_20200806_1632','2020-08-19 14:56:31.013573'),(753,'canvas','0003_delete_canvasglobalconfiguration','2020-08-19 14:56:31.025304'),(754,'enterprise','0109_remove_use_enterprise_catalog_sample','2020-08-19 14:56:31.035543'),(755,'learning_sequences','0004_coursecontext_self_paced','2020-08-27 17:12:54.572632'),(756,'lti_consumer','0001_initial','2020-08-28 05:03:46.997312'),(757,'demographics','0002_clean_duplicate_entries','2020-09-01 07:21:47.855219'),(758,'demographics','0003_auto_20200827_1949','2020-09-01 07:21:48.155899'),(759,'learning_sequences','0005_coursecontext_days_early_for_beta','2020-09-01 07:21:48.183664'),(760,'enterprise','0110_add_default_contract_discount','2020-09-08 14:46:12.171747'),(761,'third_party_auth','0003_samlconfiguration_is_public','2020-09-08 14:46:12.422216'),(762,'waffle','0004_update_everyone_nullbooleanfield','2020-09-08 14:46:12.658944'),(763,'canvas','0004_adding_learner_data_to_canvas','2020-09-10 19:32:41.207108'),(764,'canvas','0005_auto_20200909_1534','2020-09-10 19:32:41.245967'),(765,'enterprise','0111_pendingenterprisecustomeradminuser','2020-09-10 19:32:41.854150'),(766,'enterprise','0112_auto_20200914_0926','2020-09-14 18:12:08.108371'),(767,'enterprise','0113_auto_20200914_2054','2020-09-15 14:01:07.529558'),(768,'third_party_auth','0004_auto_20200919_0955','2020-09-19 10:15:11.083199'),(769,'moodle','0001_initial','2020-09-21 18:48:40.774290'),(770,'content_libraries','0003_contentlibrary_type','2020-09-29 19:12:37.463738'),(771,'django_celery_results','0001_initial','2020-09-29 19:12:37.477980'),(772,'django_celery_results','0002_add_task_name_args_kwargs','2020-09-29 19:12:37.521053'),(773,'django_celery_results','0003_auto_20181106_1101','2020-09-29 19:12:37.535419'),(774,'django_celery_results','0004_auto_20190516_0412','2020-09-29 19:12:37.690736'),(775,'django_celery_results','0005_taskresult_worker','2020-09-29 19:12:37.707829'),(776,'django_celery_results','0006_taskresult_date_created','2020-09-29 19:12:37.732208'),(777,'django_celery_results','0007_remove_taskresult_hidden','2020-09-29 19:12:37.940908'),(778,'blackboard','0001_initial','2020-10-12 12:35:30.340617'),(779,'blackboard','0002_auto_20200930_1723','2020-10-12 12:35:30.862559'),(780,'content_libraries','0004_contentlibrary_license','2020-10-12 12:35:30.887276'),(781,'moodle','0002_moodlelearnerdatatransmissionaudit','2020-10-12 12:35:30.901883'),(782,'moodle','0003_auto_20201006_1706','2020-10-12 12:35:31.451173'),(783,'video_pipeline','0007_delete_videopipelineintegration','2020-10-12 12:35:31.463858'),(784,'student','0036_userpasswordtogglehistory','2020-10-16 09:07:47.488482'),(785,'blackboard','0003_blackboardlearnerdatatransmissionaudit','2020-10-16 12:50:23.739145'),(786,'blackboard','0004_blackboard_tx_chunk_size_default_1','2020-10-16 12:50:23.986468'),(787,'student','0037_linkedinaddtoprofileconfiguration_updates','2020-10-19 16:34:38.261097'),(788,'enterprise','0114_auto_20201020_0142','2020-10-20 09:17:51.232563'),(789,'enterprise','0115_enterpriseanalyticsuser_historicalenterpriseanalyticsuser','2020-11-09 17:41:22.573420'),(790,'moodle','0004_auto_20201105_1921','2020-11-09 17:41:22.831075'),(791,'student','0038_auto_20201021_1256','2020-11-09 17:41:23.021373'),(792,'verify_student','0013_add_expiration_date_field','2020-11-10 18:20:49.309852'),(793,'organizations','0002_unique_short_name','2020-11-13 16:20:43.284752'),(794,'course_overviews','0023_courseoverview_banner_image_url','2020-11-17 16:12:50.496401'),(795,'learning_sequences','0006_coursecontext_entrance_exam_id','2020-11-17 16:12:50.525921'),(796,'learning_sequences','0007_coursesequenceexam','2020-11-17 16:12:50.555791'),(797,'enterprise','0116_auto_20201116_0400','2020-11-18 11:46:23.592647'),(798,'certificates','0017_add_mode_20201118_1725','2020-11-19 06:41:58.556203'),(799,'django_celery_results','0008_chordcounter','2020-11-19 16:05:02.832014'),(800,'integrated_channel','0002_learnerdatatransmissionaudit_subsection_id','2020-12-02 12:39:35.494746'),(801,'shoppingcart','0005_drop_tables','2020-12-02 18:22:02.730858'),(802,'canvas','0006_canvaslearnerassessmentdatatransmissionaudit','2020-12-09 12:59:08.346475'),(803,'event_routing_backends','0001_initial','2020-12-09 12:59:08.797913'),(804,'workflow','0004_assessmentworkflowstep_skipped','2020-12-09 12:59:08.817729'),(805,'blackboard','0005_blackboardlearnerassessmentdatatransmissionaudit','2020-12-10 19:40:27.010124'),(806,'edx_proctoring','0011_allow_multiple_attempts','2020-12-10 19:40:27.195957'),(807,'enterprise','0116_auto_20201208_1759','2020-12-10 19:40:27.672949'),(808,'lti_consumer','0002_ltiagslineitem','2020-12-10 19:40:27.692359'),(809,'lti_consumer','0003_ltiagsscore','2020-12-10 19:40:27.713826'),(810,'lti_consumer','0004_keyset_mgmt_to_model','2020-12-10 19:40:27.776664'),(811,'lti_consumer','0005_migrate_keyset_to_model','2020-12-10 19:40:27.788801'),(812,'enterprise','0117_auto_20201215_0258','2020-12-15 14:41:34.054708'),(813,'discussions','0001_initial','2020-12-17 01:49:36.197954'),(814,'edx_proctoring','0012_proctoredexamstudentattempt_time_remaining_seconds','2021-01-06 14:38:32.642940'),(815,'enterprise','unique_constraints_pending_users','2021-01-06 14:38:33.401574'),(816,'edx_proctoring','0013_proctoredexamsoftwaresecurereview_is_active_attempt','2021-01-15 13:55:43.486017'),(817,'enterprise','0001_auto_20210111_1253','2021-01-15 13:55:43.750804'),(818,'lti_consumer','0006_add_on_model_config_for_lti_1p1','2021-01-20 05:11:09.122132'),(819,'student','0039_anon_id_context','2021-01-21 23:59:39.621062'),(820,'degreed','0009_auto_20210119_1546','2021-01-25 14:55:50.809600'),(821,'enterprise','0120_systemwiderole_applies_to_all_contexts','2021-01-25 14:55:51.182902'),(822,'system_wide_roles','0003_systemwideroleassignment_applies_to_all_contexts','2021-01-25 14:55:51.375236'),(823,'enterprise','0121_systemwiderole_add_ent_cust_field','2021-01-28 18:43:00.476825'),(824,'discussions','0002_add_provider_filter','2021-02-02 19:44:45.410652'),(825,'enterprise','0122_remove_field_sync_enterprise_catalog_query','2021-02-02 19:44:45.633760'),(826,'certificates','0018_historicalcertificateinvalidation','2021-02-04 15:15:34.012664'),(827,'organizations','0003_historicalorganizationcourse','2021-02-09 05:09:14.985799'),(828,'enterprise','0123_enterprisecustomeridentityprovider_default_provider','2021-02-16 09:07:30.570124'),(829,'certificates','0019_allowlistgenerationconfiguration','2021-02-19 08:06:56.321773'),(830,'lti_consumer','0007_ltidlcontentitem','2021-02-19 08:06:56.599008'),(831,'lti_consumer','0008_fix_uuid_backfill','2021-02-19 08:06:56.646347'),(832,'sap_success_factors','0002_sapsuccessfactorslearnerdatatransmissionaudit_credit_hours','2021-02-19 08:06:56.662163'),(833,'certificates','0020_remove_existing_mgmt_cmd_args','2021-02-22 16:23:17.478249'),(834,'credentials','0005_remove_existing_mgmt_cmd_args','2021-02-22 16:23:17.489123'),(835,'student','0040_usercelebration','2021-02-22 16:23:17.958434');
+INSERT INTO `django_migrations` VALUES (1,'contenttypes','0001_initial','2019-02-06 08:03:27.973279'),(2,'auth','0001_initial','2019-02-06 08:03:28.047577'),(3,'admin','0001_initial','2019-02-06 08:03:28.084214'),(4,'admin','0002_logentry_remove_auto_add','2019-02-06 08:03:28.117004'),(5,'sites','0001_initial','2019-02-06 08:03:28.138797'),(6,'contenttypes','0002_remove_content_type_name','2019-02-06 08:03:28.216567'),(7,'api_admin','0001_initial','2019-02-06 08:03:28.285457'),(8,'api_admin','0002_auto_20160325_1604','2019-02-06 08:03:28.307547'),(9,'api_admin','0003_auto_20160404_1618','2019-02-06 08:03:28.500622'),(10,'api_admin','0004_auto_20160412_1506','2019-02-06 08:03:28.633954'),(11,'api_admin','0005_auto_20160414_1232','2019-02-06 08:03:28.673633'),(12,'api_admin','0006_catalog','2019-02-06 08:03:28.696279'),(13,'api_admin','0007_delete_historical_api_records','2019-02-06 08:03:28.816693'),(14,'assessment','0001_initial','2019-02-06 08:03:29.290939'),(15,'assessment','0002_staffworkflow','2019-02-06 08:03:29.313966'),(16,'assessment','0003_expand_course_id','2019-02-06 08:03:29.378298'),(17,'auth','0002_alter_permission_name_max_length','2019-02-06 08:03:29.412172'),(18,'auth','0003_alter_user_email_max_length','2019-02-06 08:03:29.449614'),(19,'auth','0004_alter_user_username_opts','2019-02-06 08:03:29.489793'),(20,'auth','0005_alter_user_last_login_null','2019-02-06 08:03:29.529832'),(21,'auth','0006_require_contenttypes_0002','2019-02-06 08:03:29.535701'),(22,'auth','0007_alter_validators_add_error_messages','2019-02-06 08:03:29.572495'),(23,'auth','0008_alter_user_username_max_length','2019-02-06 08:03:29.606716'),(24,'instructor_task','0001_initial','2019-02-06 08:03:29.648070'),(25,'certificates','0001_initial','2019-02-06 08:03:30.038510'),(26,'certificates','0002_data__certificatehtmlviewconfiguration_data','2019-02-06 08:03:30.060258'),(27,'certificates','0003_data__default_modes','2019-02-06 08:03:30.081042'),(28,'certificates','0004_certificategenerationhistory','2019-02-06 08:03:30.138110'),(29,'certificates','0005_auto_20151208_0801','2019-02-06 08:03:30.188489'),(30,'certificates','0006_certificatetemplateasset_asset_slug','2019-02-06 08:03:30.217197'),(31,'certificates','0007_certificateinvalidation','2019-02-06 08:03:30.269518'),(32,'badges','0001_initial','2019-02-06 08:03:30.415373'),(33,'badges','0002_data__migrate_assertions','2019-02-06 08:03:30.438183'),(34,'badges','0003_schema__add_event_configuration','2019-02-06 08:03:30.731342'),(35,'block_structure','0001_config','2019-02-06 08:03:30.788599'),(36,'block_structure','0002_blockstructuremodel','2019-02-06 08:03:30.816557'),(37,'block_structure','0003_blockstructuremodel_storage','2019-02-06 08:03:30.846376'),(38,'block_structure','0004_blockstructuremodel_usagekeywithrun','2019-02-06 08:03:30.880450'),(39,'bookmarks','0001_initial','2019-02-06 08:03:31.054199'),(40,'branding','0001_initial','2019-02-06 08:03:31.166611'),(41,'course_modes','0001_initial','2019-02-06 08:03:31.243105'),(42,'course_modes','0002_coursemode_expiration_datetime_is_explicit','2019-02-06 08:03:31.269180'),(43,'course_modes','0003_auto_20151113_1443','2019-02-06 08:03:31.298423'),(44,'course_modes','0004_auto_20151113_1457','2019-02-06 08:03:31.371839'),(45,'course_modes','0005_auto_20151217_0958','2019-02-06 08:03:31.410727'),(46,'course_modes','0006_auto_20160208_1407','2019-02-06 08:03:31.485161'),(47,'course_modes','0007_coursemode_bulk_sku','2019-02-06 08:03:31.516196'),(48,'course_groups','0001_initial','2019-02-06 08:03:32.021134'),(49,'bulk_email','0001_initial','2019-02-06 08:03:32.263160'),(50,'bulk_email','0002_data__load_course_email_template','2019-02-06 08:03:32.285972'),(51,'bulk_email','0003_config_model_feature_flag','2019-02-06 08:03:32.366594'),(52,'bulk_email','0004_add_email_targets','2019-02-06 08:03:32.873567'),(53,'bulk_email','0005_move_target_data','2019-02-06 08:03:32.900737'),(54,'bulk_email','0006_course_mode_targets','2019-02-06 08:03:33.043008'),(55,'catalog','0001_initial','2019-02-06 08:03:33.155594'),(56,'catalog','0002_catalogintegration_username','2019-02-06 08:03:33.250400'),(57,'catalog','0003_catalogintegration_page_size','2019-02-06 08:03:33.342320'),(58,'catalog','0004_auto_20170616_0618','2019-02-06 08:03:33.440389'),(59,'catalog','0005_catalogintegration_long_term_cache_ttl','2019-02-06 08:03:33.567527'),(60,'django_comment_common','0001_initial','2019-02-06 08:03:33.854539'),(61,'django_comment_common','0002_forumsconfig','2019-02-06 08:03:33.972708'),(62,'verified_track_content','0001_initial','2019-02-06 08:03:33.998702'),(63,'course_overviews','0001_initial','2019-02-06 08:03:34.057460'),(64,'course_overviews','0002_add_course_catalog_fields','2019-02-06 08:03:34.224588'),(65,'course_overviews','0003_courseoverviewgeneratedhistory','2019-02-06 08:03:34.285061'),(66,'course_overviews','0004_courseoverview_org','2019-02-06 08:03:34.361105'),(67,'course_overviews','0005_delete_courseoverviewgeneratedhistory','2019-02-06 08:03:34.421372'),(68,'course_overviews','0006_courseoverviewimageset','2019-02-06 08:03:34.487776'),(69,'course_overviews','0007_courseoverviewimageconfig','2019-02-06 08:03:34.633259'),(70,'course_overviews','0008_remove_courseoverview_facebook_url','2019-02-06 08:03:34.646695'),(71,'course_overviews','0009_readd_facebook_url','2019-02-06 08:03:34.725856'),(72,'course_overviews','0010_auto_20160329_2317','2019-02-06 08:03:34.825796'),(73,'ccx','0001_initial','2019-02-06 08:03:35.149281'),(74,'ccx','0002_customcourseforedx_structure_json','2019-02-06 08:03:35.213941'),(75,'ccx','0003_add_master_course_staff_in_ccx','2019-02-06 08:03:35.275108'),(76,'ccx','0004_seed_forum_roles_in_ccx_courses','2019-02-06 08:03:35.320321'),(77,'ccx','0005_change_ccx_coach_to_staff','2019-02-06 08:03:35.350700'),(78,'ccx','0006_set_display_name_as_override','2019-02-06 08:03:35.391529'),(79,'ccxcon','0001_initial_ccxcon_model','2019-02-06 08:03:35.425585'),(80,'ccxcon','0002_auto_20160325_0407','2019-02-06 08:03:35.481080'),(81,'djcelery','0001_initial','2019-02-06 08:03:36.180254'),(82,'celery_utils','0001_initial','2019-02-06 08:03:36.284503'),(83,'celery_utils','0002_chordable_django_backend','2019-02-06 08:03:36.366801'),(84,'certificates','0008_schema__remove_badges','2019-02-06 08:03:36.556119'),(85,'certificates','0009_certificategenerationcoursesetting_language_self_generation','2019-02-06 08:03:36.773167'),(86,'certificates','0010_certificatetemplate_language','2019-02-06 08:03:36.815500'),(87,'certificates','0011_certificatetemplate_alter_unique','2019-02-06 08:03:36.919819'),(88,'certificates','0012_certificategenerationcoursesetting_include_hours_of_effort','2019-02-06 08:03:36.957024'),(89,'certificates','0013_remove_certificategenerationcoursesetting_enabled','2019-02-06 08:03:37.024718'),(90,'certificates','0014_change_eligible_certs_manager','2019-02-06 08:03:37.104973'),(91,'commerce','0001_data__add_ecommerce_service_user','2019-02-06 08:03:37.147354'),(92,'commerce','0002_commerceconfiguration','2019-02-06 08:03:37.232132'),(93,'commerce','0003_auto_20160329_0709','2019-02-06 08:03:37.297795'),(94,'commerce','0004_auto_20160531_0950','2019-02-06 08:03:37.417586'),(95,'commerce','0005_commerceconfiguration_enable_automatic_refund_approval','2019-02-06 08:03:37.504233'),(96,'commerce','0006_auto_20170424_1734','2019-02-06 08:03:37.578243'),(97,'commerce','0007_auto_20180313_0609','2019-02-06 08:03:37.688751'),(98,'completion','0001_initial','2019-02-06 08:03:37.847750'),(99,'completion','0002_auto_20180125_1510','2019-02-06 08:03:37.917588'),(100,'enterprise','0001_initial','2019-02-06 08:03:38.090862'),(101,'enterprise','0002_enterprisecustomerbrandingconfiguration','2019-02-06 08:03:38.142785'),(102,'enterprise','0003_auto_20161104_0937','2019-02-06 08:03:38.362358'),(103,'enterprise','0004_auto_20161114_0434','2019-02-06 08:03:38.484589'),(104,'enterprise','0005_pendingenterprisecustomeruser','2019-02-06 08:03:38.565074'),(105,'enterprise','0006_auto_20161121_0241','2019-02-06 08:03:38.604288'),(106,'enterprise','0007_auto_20161109_1511','2019-02-06 08:03:38.706534'),(107,'enterprise','0008_auto_20161124_2355','2019-02-06 08:03:38.935742'),(108,'enterprise','0009_auto_20161130_1651','2019-02-06 08:03:39.582739'),(109,'enterprise','0010_auto_20161222_1212','2019-02-06 08:03:39.710110'),(110,'enterprise','0011_enterprisecustomerentitlement_historicalenterprisecustomerentitlement','2019-02-06 08:03:39.820222'),(111,'enterprise','0012_auto_20170125_1033','2019-02-06 08:03:39.921636'),(112,'enterprise','0013_auto_20170125_1157','2019-02-06 08:03:40.091299'),(113,'enterprise','0014_enrollmentnotificationemailtemplate_historicalenrollmentnotificationemailtemplate','2019-02-06 08:03:40.226864'),(114,'enterprise','0015_auto_20170130_0003','2019-02-06 08:03:40.375822'),(115,'enterprise','0016_auto_20170405_0647','2019-02-06 08:03:41.108702'),(116,'enterprise','0017_auto_20170508_1341','2019-02-06 08:03:41.558782'),(117,'enterprise','0018_auto_20170511_1357','2019-02-06 08:03:41.671248'),(118,'enterprise','0019_auto_20170606_1853','2019-02-06 08:03:41.795407'),(119,'enterprise','0020_auto_20170624_2316','2019-02-06 08:03:42.114378'),(120,'enterprise','0021_auto_20170711_0712','2019-02-06 08:03:42.443741'),(121,'enterprise','0022_auto_20170720_1543','2019-02-06 08:03:42.555544'),(122,'enterprise','0023_audit_data_reporting_flag','2019-02-06 08:03:42.667708'),(123,'enterprise','0024_enterprisecustomercatalog_historicalenterprisecustomercatalog','2019-02-06 08:03:42.823862'),(124,'enterprise','0025_auto_20170828_1412','2019-02-06 08:03:43.148897'),(125,'enterprise','0026_make_require_account_level_consent_nullable','2019-02-06 08:03:43.564302'),(126,'enterprise','0027_remove_account_level_consent','2019-02-06 08:03:44.095360'),(127,'enterprise','0028_link_enterprise_to_enrollment_template','2019-02-06 08:03:44.318418'),(128,'enterprise','0029_auto_20170925_1909','2019-02-06 08:03:44.398129'),(129,'enterprise','0030_auto_20171005_1600','2019-02-06 08:03:44.553947'),(130,'enterprise','0031_auto_20171012_1249','2019-02-06 08:03:44.725906'),(131,'enterprise','0032_reporting_model','2019-02-06 08:03:44.840167'),(132,'enterprise','0033_add_history_change_reason_field','2019-02-06 08:03:45.245971'),(133,'enterprise','0034_auto_20171023_0727','2019-02-06 08:03:45.385659'),(134,'enterprise','0035_auto_20171212_1129','2019-02-06 08:03:45.513332'),(135,'enterprise','0036_sftp_reporting_support','2019-02-06 08:03:46.086601'),(136,'enterprise','0037_auto_20180110_0450','2019-02-06 08:03:46.208354'),(137,'enterprise','0038_auto_20180122_1427','2019-02-06 08:03:46.303546'),(138,'enterprise','0039_auto_20180129_1034','2019-02-06 08:03:46.415988'),(139,'enterprise','0040_auto_20180129_1428','2019-02-06 08:03:46.564661'),(140,'enterprise','0041_auto_20180212_1507','2019-02-06 08:03:46.626003'),(141,'consent','0001_initial','2019-02-06 08:03:46.846549'),(142,'consent','0002_migrate_to_new_data_sharing_consent','2019-02-06 08:03:46.875083'),(143,'consent','0003_historicaldatasharingconsent_history_change_reason','2019-02-06 08:03:46.965702'),(144,'consent','0004_datasharingconsenttextoverrides','2019-02-06 08:03:47.065885'),(145,'sites','0002_alter_domain_unique','2019-02-06 08:03:47.113519'),(146,'course_overviews','0011_courseoverview_marketing_url','2019-02-06 08:03:47.173117'),(147,'course_overviews','0012_courseoverview_eligible_for_financial_aid','2019-02-06 08:03:47.251335'),(148,'course_overviews','0013_courseoverview_language','2019-02-06 08:03:47.323251'),(149,'course_overviews','0014_courseoverview_certificate_available_date','2019-02-06 08:03:47.375112'),(150,'content_type_gating','0001_initial','2019-02-06 08:03:47.504223'),(151,'content_type_gating','0002_auto_20181119_0959','2019-02-06 08:03:47.696167'),(152,'content_type_gating','0003_auto_20181128_1407','2019-02-06 08:03:47.802689'),(153,'content_type_gating','0004_auto_20181128_1521','2019-02-06 08:03:47.899743'),(154,'contentserver','0001_initial','2019-02-06 08:03:48.012402'),(155,'contentserver','0002_cdnuseragentsconfig','2019-02-06 08:03:48.115897'),(156,'cors_csrf','0001_initial','2019-02-06 08:03:48.228961'),(157,'course_action_state','0001_initial','2019-02-06 08:03:48.432637'),(158,'course_duration_limits','0001_initial','2019-02-06 08:03:48.561335'),(159,'course_duration_limits','0002_auto_20181119_0959','2019-02-06 08:03:49.033726'),(160,'course_duration_limits','0003_auto_20181128_1407','2019-02-06 08:03:49.154788'),(161,'course_duration_limits','0004_auto_20181128_1521','2019-02-06 08:03:49.286782'),(162,'course_goals','0001_initial','2019-02-06 08:03:49.504320'),(163,'course_goals','0002_auto_20171010_1129','2019-02-06 08:03:49.596345'),(164,'course_groups','0002_change_inline_default_cohort_value','2019-02-06 08:03:49.642049'),(165,'course_groups','0003_auto_20170609_1455','2019-02-06 08:03:50.080016'),(166,'course_modes','0008_course_key_field_to_foreign_key','2019-02-06 08:03:50.526973'),(167,'course_modes','0009_suggested_prices_to_charfield','2019-02-06 08:03:50.584282'),(168,'course_modes','0010_archived_suggested_prices_to_charfield','2019-02-06 08:03:50.629980'),(169,'course_modes','0011_change_regex_for_comma_separated_ints','2019-02-06 08:03:50.727914'),(170,'courseware','0001_initial','2019-02-06 08:03:53.237177'),(171,'courseware','0002_coursedynamicupgradedeadlineconfiguration_dynamicupgradedeadlineconfiguration','2019-02-06 08:03:53.619502'),(172,'courseware','0003_auto_20170825_0935','2019-02-06 08:03:53.747454'),(173,'courseware','0004_auto_20171010_1639','2019-02-06 08:03:53.895768'),(174,'courseware','0005_orgdynamicupgradedeadlineconfiguration','2019-02-06 08:03:54.230018'),(175,'courseware','0006_remove_module_id_index','2019-02-06 08:03:54.435353'),(176,'courseware','0007_remove_done_index','2019-02-06 08:03:55.012607'),(177,'coursewarehistoryextended','0001_initial','2019-02-06 08:03:55.303411'),(178,'coursewarehistoryextended','0002_force_studentmodule_index','2019-02-06 08:03:55.370079'),(179,'crawlers','0001_initial','2019-02-06 08:03:55.442696'),(180,'crawlers','0002_auto_20170419_0018','2019-02-06 08:03:55.510303'),(181,'credentials','0001_initial','2019-02-06 08:03:55.578783'),(182,'credentials','0002_auto_20160325_0631','2019-02-06 08:03:55.640533'),(183,'credentials','0003_auto_20170525_1109','2019-02-06 08:03:55.760811'),(184,'credentials','0004_notifycredentialsconfig','2019-02-06 08:03:55.827343'),(185,'credit','0001_initial','2019-02-06 08:03:56.379666'),(186,'credit','0002_creditconfig','2019-02-06 08:03:56.456288'),(187,'credit','0003_auto_20160511_2227','2019-02-06 08:03:56.510076'),(188,'credit','0004_delete_historical_credit_records','2019-02-06 08:03:56.908755'),(189,'dark_lang','0001_initial','2019-02-06 08:03:56.974435'),(190,'dark_lang','0002_data__enable_on_install','2019-02-06 08:03:57.008178'),(191,'dark_lang','0003_auto_20180425_0359','2019-02-06 08:03:57.123998'),(192,'database_fixups','0001_initial','2019-02-06 08:03:57.156768'),(193,'degreed','0001_initial','2019-02-06 08:03:58.035952'),(194,'degreed','0002_auto_20180104_0103','2019-02-06 08:03:58.408761'),(195,'degreed','0003_auto_20180109_0712','2019-02-06 08:03:58.616044'),(196,'degreed','0004_auto_20180306_1251','2019-02-06 08:03:58.814623'),(197,'degreed','0005_auto_20180807_1302','2019-02-06 08:04:00.635482'),(198,'degreed','0006_upgrade_django_simple_history','2019-02-06 08:04:00.815237'),(199,'django_comment_common','0003_enable_forums','2019-02-06 08:04:00.851878'),(200,'django_comment_common','0004_auto_20161117_1209','2019-02-06 08:04:01.011618'),(201,'django_comment_common','0005_coursediscussionsettings','2019-02-06 08:04:01.048387'),(202,'django_comment_common','0006_coursediscussionsettings_discussions_id_map','2019-02-06 08:04:01.092669'),(203,'django_comment_common','0007_discussionsidmapping','2019-02-06 08:04:01.135336'),(204,'django_comment_common','0008_role_user_index','2019-02-06 08:04:01.166345'),(205,'django_notify','0001_initial','2019-02-06 08:04:01.899046'),(206,'django_openid_auth','0001_initial','2019-02-06 08:04:02.148673'),(207,'oauth2','0001_initial','2019-02-06 08:04:03.447522'),(208,'edx_oauth2_provider','0001_initial','2019-02-06 08:04:03.637123'),(209,'edx_proctoring','0001_initial','2019-02-06 08:04:06.249264'),(210,'edx_proctoring','0002_proctoredexamstudentattempt_is_status_acknowledged','2019-02-06 08:04:06.453204'),(211,'edx_proctoring','0003_auto_20160101_0525','2019-02-06 08:04:06.849450'),(212,'edx_proctoring','0004_auto_20160201_0523','2019-02-06 08:04:07.035676'),(213,'edx_proctoring','0005_proctoredexam_hide_after_due','2019-02-06 08:04:07.119540'),(214,'edx_proctoring','0006_allowed_time_limit_mins','2019-02-06 08:04:07.870116'),(215,'edx_proctoring','0007_proctoredexam_backend','2019-02-06 08:04:07.931188'),(216,'edx_proctoring','0008_auto_20181116_1551','2019-02-06 08:04:08.424205'),(217,'edx_proctoring','0009_proctoredexamreviewpolicy_remove_rules','2019-02-06 08:04:08.762512'),(218,'edxval','0001_initial','2019-02-06 08:04:09.122448'),(219,'edxval','0002_data__default_profiles','2019-02-06 08:04:09.157306'),(220,'edxval','0003_coursevideo_is_hidden','2019-02-06 08:04:09.208230'),(221,'edxval','0004_data__add_hls_profile','2019-02-06 08:04:09.249124'),(222,'edxval','0005_videoimage','2019-02-06 08:04:09.314101'),(223,'edxval','0006_auto_20171009_0725','2019-02-06 08:04:09.422431'),(224,'edxval','0007_transcript_credentials_state','2019-02-06 08:04:09.502957'),(225,'edxval','0008_remove_subtitles','2019-02-06 08:04:09.597483'),(226,'edxval','0009_auto_20171127_0406','2019-02-06 08:04:09.650707'),(227,'edxval','0010_add_video_as_foreign_key','2019-02-06 08:04:09.853179'),(228,'edxval','0011_data__add_audio_mp3_profile','2019-02-06 08:04:09.888952'),(229,'email_marketing','0001_initial','2019-02-06 08:04:10.490362'),(230,'email_marketing','0002_auto_20160623_1656','2019-02-06 08:04:12.322113'),(231,'email_marketing','0003_auto_20160715_1145','2019-02-06 08:04:13.625016'),(232,'email_marketing','0004_emailmarketingconfiguration_welcome_email_send_delay','2019-02-06 08:04:13.804721'),(233,'email_marketing','0005_emailmarketingconfiguration_user_registration_cookie_timeout_delay','2019-02-06 08:04:13.987226'),(234,'email_marketing','0006_auto_20170711_0615','2019-02-06 08:04:14.175392'),(235,'email_marketing','0007_auto_20170809_0653','2019-02-06 08:04:14.743333'),(236,'email_marketing','0008_auto_20170809_0539','2019-02-06 08:04:14.781400'),(237,'email_marketing','0009_remove_emailmarketingconfiguration_sailthru_activation_template','2019-02-06 08:04:15.000262'),(238,'email_marketing','0010_auto_20180425_0800','2019-02-06 08:04:15.577846'),(239,'embargo','0001_initial','2019-02-06 08:04:16.853715'),(240,'embargo','0002_data__add_countries','2019-02-06 08:04:16.895352'),(241,'enterprise','0042_replace_sensitive_sso_username','2019-02-06 08:04:17.169747'),(242,'enterprise','0043_auto_20180507_0138','2019-02-06 08:04:17.765765'),(243,'enterprise','0044_reporting_config_multiple_types','2019-02-06 08:04:18.048084'),(244,'enterprise','0045_report_type_json','2019-02-06 08:04:18.121655'),(245,'enterprise','0046_remove_unique_constraints','2019-02-06 08:04:18.194060'),(246,'enterprise','0047_auto_20180517_0457','2019-02-06 08:04:18.519446'),(247,'enterprise','0048_enterprisecustomeruser_active','2019-02-06 08:04:18.962011'),(248,'enterprise','0049_auto_20180531_0321','2019-02-06 08:04:20.082033'),(249,'enterprise','0050_progress_v2','2019-02-06 08:04:20.186103'),(250,'enterprise','0051_add_enterprise_slug','2019-02-06 08:04:20.652158'),(251,'enterprise','0052_create_unique_slugs','2019-02-06 08:04:21.259457'),(252,'enterprise','0053_pendingenrollment_cohort_name','2019-02-06 08:04:21.457833'),(253,'enterprise','0053_auto_20180911_0811','2019-02-06 08:04:22.130573'),(254,'enterprise','0054_merge_20180914_1511','2019-02-06 08:04:22.143011'),(255,'enterprise','0055_auto_20181015_1112','2019-02-06 08:04:22.603605'),(256,'enterprise','0056_enterprisecustomerreportingconfiguration_pgp_encryption_key','2019-02-06 08:04:22.718871'),(257,'enterprise','0057_enterprisecustomerreportingconfiguration_enterprise_customer_catalogs','2019-02-06 08:04:23.004578'),(258,'enterprise','0058_auto_20181212_0145','2019-02-06 08:04:23.860134'),(259,'enterprise','0059_add_code_management_portal_config','2019-02-06 08:04:24.184355'),(260,'enterprise','0060_upgrade_django_simple_history','2019-02-06 08:04:24.698860'),(261,'student','0001_initial','2019-02-06 08:04:31.285410'),(262,'student','0002_auto_20151208_1034','2019-02-06 08:04:31.449034'),(263,'student','0003_auto_20160516_0938','2019-02-06 08:04:31.626628'),(264,'student','0004_auto_20160531_1422','2019-02-06 08:04:31.724604'),(265,'student','0005_auto_20160531_1653','2019-02-06 08:04:32.170241'),(266,'student','0006_logoutviewconfiguration','2019-02-06 08:04:32.266892'),(267,'student','0007_registrationcookieconfiguration','2019-02-06 08:04:32.366689'),(268,'student','0008_auto_20161117_1209','2019-02-06 08:04:32.463972'),(269,'student','0009_auto_20170111_0422','2019-02-06 08:04:32.558706'),(270,'student','0010_auto_20170207_0458','2019-02-06 08:04:32.564759'),(271,'student','0011_course_key_field_to_foreign_key','2019-02-06 08:04:34.027590'),(272,'student','0012_sociallink','2019-02-06 08:04:34.353842'),(273,'student','0013_delete_historical_enrollment_records','2019-02-06 08:04:35.810292'),(274,'entitlements','0001_initial','2019-02-06 08:04:36.165929'),(275,'entitlements','0002_auto_20171102_0719','2019-02-06 08:04:38.257565'),(276,'entitlements','0003_auto_20171205_1431','2019-02-06 08:04:40.470342'),(277,'entitlements','0004_auto_20171206_1729','2019-02-06 08:04:40.982538'),(278,'entitlements','0005_courseentitlementsupportdetail','2019-02-06 08:04:41.539847'),(279,'entitlements','0006_courseentitlementsupportdetail_action','2019-02-06 08:04:41.979223'),(280,'entitlements','0007_change_expiration_period_default','2019-02-06 08:04:42.159096'),(281,'entitlements','0008_auto_20180328_1107','2019-02-06 08:04:42.683695'),(282,'entitlements','0009_courseentitlement_refund_locked','2019-02-06 08:04:43.025841'),(283,'entitlements','0010_backfill_refund_lock','2019-02-06 08:04:43.067438'),(284,'experiments','0001_initial','2019-02-06 08:04:44.694218'),(285,'experiments','0002_auto_20170627_1402','2019-02-06 08:04:44.793494'),(286,'experiments','0003_auto_20170713_1148','2019-02-06 08:04:44.853420'),(287,'external_auth','0001_initial','2019-02-06 08:04:45.445694'),(288,'grades','0001_initial','2019-02-06 08:04:45.632121'),(289,'grades','0002_rename_last_edited_field','2019-02-06 08:04:45.699684'),(290,'grades','0003_coursepersistentgradesflag_persistentgradesenabledflag','2019-02-06 08:04:46.457202'),(291,'grades','0004_visibleblocks_course_id','2019-02-06 08:04:46.531908'),(292,'grades','0005_multiple_course_flags','2019-02-06 08:04:46.849592'),(293,'grades','0006_persistent_course_grades','2019-02-06 08:04:46.952796'),(294,'grades','0007_add_passed_timestamp_column','2019-02-06 08:04:47.066573'),(295,'grades','0008_persistentsubsectiongrade_first_attempted','2019-02-06 08:04:47.138816'),(296,'grades','0009_auto_20170111_1507','2019-02-06 08:04:47.259581'),(297,'grades','0010_auto_20170112_1156','2019-02-06 08:04:47.344906'),(298,'grades','0011_null_edited_time','2019-02-06 08:04:47.527358'),(299,'grades','0012_computegradessetting','2019-02-06 08:04:48.367572'),(300,'grades','0013_persistentsubsectiongradeoverride','2019-02-06 08:04:48.436380'),(301,'grades','0014_persistentsubsectiongradeoverridehistory','2019-02-06 08:04:48.767621'),(302,'instructor_task','0002_gradereportsetting','2019-02-06 08:04:49.116174'),(303,'waffle','0001_initial','2019-02-06 08:04:49.522307'),(304,'sap_success_factors','0001_initial','2019-02-06 08:04:50.784688'),(305,'sap_success_factors','0002_auto_20170224_1545','2019-02-06 08:04:52.503372'),(306,'sap_success_factors','0003_auto_20170317_1402','2019-02-06 08:04:53.057896'),(307,'sap_success_factors','0004_catalogtransmissionaudit_audit_summary','2019-02-06 08:04:53.112654'),(308,'sap_success_factors','0005_historicalsapsuccessfactorsenterprisecustomerconfiguration_history_change_reason','2019-02-06 08:04:53.414309'),(309,'sap_success_factors','0006_sapsuccessfactors_use_enterprise_enrollment_page_waffle_flag','2019-02-06 08:04:53.467401'),(310,'sap_success_factors','0007_remove_historicalsapsuccessfactorsenterprisecustomerconfiguration_history_change_reason','2019-02-06 08:04:53.753419'),(311,'sap_success_factors','0008_historicalsapsuccessfactorsenterprisecustomerconfiguration_history_change_reason','2019-02-06 08:04:54.072310'),(312,'sap_success_factors','0009_sapsuccessfactors_remove_enterprise_enrollment_page_waffle_flag','2019-02-06 08:04:54.115078'),(313,'sap_success_factors','0010_move_audit_tables_to_base_integrated_channel','2019-02-06 08:04:54.280162'),(314,'integrated_channel','0001_initial','2019-02-06 08:04:54.374204'),(315,'integrated_channel','0002_delete_enterpriseintegratedchannel','2019-02-06 08:04:54.413351'),(316,'integrated_channel','0003_catalogtransmissionaudit_learnerdatatransmissionaudit','2019-02-06 08:04:54.514947'),(317,'integrated_channel','0004_catalogtransmissionaudit_channel','2019-02-06 08:04:54.566483'),(318,'integrated_channel','0005_auto_20180306_1251','2019-02-06 08:04:55.508336'),(319,'integrated_channel','0006_delete_catalogtransmissionaudit','2019-02-06 08:04:55.564564'),(320,'lms_xblock','0001_initial','2019-02-06 08:04:55.920260'),(321,'microsite_configuration','0001_initial','2019-02-06 08:04:59.149839'),(322,'microsite_configuration','0002_auto_20160202_0228','2019-02-06 08:04:59.263415'),(323,'microsite_configuration','0003_delete_historical_records','2019-02-06 08:05:00.613558'),(324,'milestones','0001_initial','2019-02-06 08:05:01.624456'),(325,'milestones','0002_data__seed_relationship_types','2019-02-06 08:05:01.663935'),(326,'milestones','0003_coursecontentmilestone_requirements','2019-02-06 08:05:01.731497'),(327,'milestones','0004_auto_20151221_1445','2019-02-06 08:05:01.953395'),(328,'mobile_api','0001_initial','2019-02-06 08:05:02.276280'),(329,'mobile_api','0002_auto_20160406_0904','2019-02-06 08:05:02.375950'),(330,'mobile_api','0003_ignore_mobile_available_flag','2019-02-06 08:05:02.955623'),(331,'notes','0001_initial','2019-02-06 08:05:03.284134'),(332,'oauth2','0002_auto_20160404_0813','2019-02-06 08:05:04.320559'),(333,'oauth2','0003_client_logout_uri','2019-02-06 08:05:05.028463'),(334,'oauth2','0004_add_index_on_grant_expires','2019-02-06 08:05:05.320810'),(335,'oauth2','0005_grant_nonce','2019-02-06 08:05:05.628866'),(336,'organizations','0001_initial','2019-02-06 08:05:05.786592'),(337,'organizations','0002_auto_20170117_1434','2019-02-06 08:05:05.850615'),(338,'organizations','0003_auto_20170221_1138','2019-02-06 08:05:05.970702'),(339,'organizations','0004_auto_20170413_2315','2019-02-06 08:05:06.085590'),(340,'organizations','0005_auto_20171116_0640','2019-02-06 08:05:06.148448'),(341,'organizations','0006_auto_20171207_0259','2019-02-06 08:05:06.215454'),(342,'oauth2_provider','0001_initial','2019-02-06 08:05:07.961621'),(343,'oauth_dispatch','0001_initial','2019-02-06 08:05:08.350586'),(344,'oauth_dispatch','0002_scopedapplication_scopedapplicationorganization','2019-02-06 08:05:09.132604'),(345,'oauth_dispatch','0003_application_data','2019-02-06 08:05:09.196710'),(346,'oauth_dispatch','0004_auto_20180626_1349','2019-02-06 08:05:11.499019'),(347,'oauth_dispatch','0005_applicationaccess_type','2019-02-06 08:05:11.606808'),(348,'oauth_dispatch','0006_drop_application_id_constraints','2019-02-06 08:05:11.875498'),(349,'oauth2_provider','0002_08_updates','2019-02-06 08:05:12.127180'),(350,'oauth2_provider','0003_auto_20160316_1503','2019-02-06 08:05:12.219934'),(351,'oauth2_provider','0004_auto_20160525_1623','2019-02-06 08:05:12.448186'),(352,'oauth2_provider','0005_auto_20170514_1141','2019-02-06 08:05:13.676168'),(353,'oauth2_provider','0006_auto_20171214_2232','2019-02-06 08:05:14.539094'),(354,'oauth_dispatch','0007_restore_application_id_constraints','2019-02-06 08:05:14.834346'),(355,'oauth_provider','0001_initial','2019-02-06 08:05:15.171734'),(356,'problem_builder','0001_initial','2019-02-06 08:05:15.299615'),(357,'problem_builder','0002_auto_20160121_1525','2019-02-06 08:05:15.503283'),(358,'problem_builder','0003_auto_20161124_0755','2019-02-06 08:05:15.621050'),(359,'problem_builder','0004_copy_course_ids','2019-02-06 08:05:15.672698'),(360,'problem_builder','0005_auto_20170112_1021','2019-02-06 08:05:15.822489'),(361,'problem_builder','0006_remove_deprecated_course_id','2019-02-06 08:05:15.937076'),(362,'programs','0001_initial','2019-02-06 08:05:16.056792'),(363,'programs','0002_programsapiconfig_cache_ttl','2019-02-06 08:05:16.160203'),(364,'programs','0003_auto_20151120_1613','2019-02-06 08:05:16.532675'),(365,'programs','0004_programsapiconfig_enable_certification','2019-02-06 08:05:17.329411'),(366,'programs','0005_programsapiconfig_max_retries','2019-02-06 08:05:17.560011'),(367,'programs','0006_programsapiconfig_xseries_ad_enabled','2019-02-06 08:05:17.710363'),(368,'programs','0007_programsapiconfig_program_listing_enabled','2019-02-06 08:05:17.830224'),(369,'programs','0008_programsapiconfig_program_details_enabled','2019-02-06 08:05:17.950796'),(370,'programs','0009_programsapiconfig_marketing_path','2019-02-06 08:05:18.079013'),(371,'programs','0010_auto_20170204_2332','2019-02-06 08:05:18.382249'),(372,'programs','0011_auto_20170301_1844','2019-02-06 08:05:19.698119'),(373,'programs','0012_auto_20170419_0018','2019-02-06 08:05:19.800404'),(374,'redirects','0001_initial','2019-02-06 08:05:20.155019'),(375,'rss_proxy','0001_initial','2019-02-06 08:05:20.204027'),(376,'sap_success_factors','0011_auto_20180104_0103','2019-02-06 08:05:24.276543'),(377,'sap_success_factors','0012_auto_20180109_0712','2019-02-06 08:05:24.679152'),(378,'sap_success_factors','0013_auto_20180306_1251','2019-02-06 08:05:25.083064'),(379,'sap_success_factors','0014_drop_historical_table','2019-02-06 08:05:25.129347'),(380,'sap_success_factors','0015_auto_20180510_1259','2019-02-06 08:05:25.860155'),(381,'sap_success_factors','0016_sapsuccessfactorsenterprisecustomerconfiguration_additional_locales','2019-02-06 08:05:25.960191'),(382,'sap_success_factors','0017_sapsuccessfactorsglobalconfiguration_search_student_api_path','2019-02-06 08:05:26.285693'),(383,'schedules','0001_initial','2019-02-06 08:05:26.690791'),(384,'schedules','0002_auto_20170816_1532','2019-02-06 08:05:27.302276'),(385,'schedules','0003_scheduleconfig','2019-02-06 08:05:27.646134'),(386,'schedules','0004_auto_20170922_1428','2019-02-06 08:05:28.252876'),(387,'schedules','0005_auto_20171010_1722','2019-02-06 08:05:28.881956'),(388,'schedules','0006_scheduleexperience','2019-02-06 08:05:29.251797'),(389,'schedules','0007_scheduleconfig_hold_back_ratio','2019-02-06 08:05:29.617048'),(390,'self_paced','0001_initial','2019-02-06 08:05:30.027241'),(391,'sessions','0001_initial','2019-02-06 08:05:30.078048'),(392,'shoppingcart','0001_initial','2019-02-06 08:05:38.998266'),(393,'shoppingcart','0002_auto_20151208_1034','2019-02-06 08:05:39.154428'),(394,'shoppingcart','0003_auto_20151217_0958','2019-02-06 08:05:39.312762'),(395,'shoppingcart','0004_change_meta_options','2019-02-06 08:05:39.468307'),(396,'site_configuration','0001_initial','2019-02-06 08:05:40.221457'),(397,'site_configuration','0002_auto_20160720_0231','2019-02-06 08:05:40.436234'),(398,'default','0001_initial','2019-02-06 08:05:41.857778'),(399,'social_auth','0001_initial','2019-02-06 08:05:41.863663'),(400,'default','0002_add_related_name','2019-02-06 08:05:42.234168'),(401,'social_auth','0002_add_related_name','2019-02-06 08:05:42.241171'),(402,'default','0003_alter_email_max_length','2019-02-06 08:05:42.308536'),(403,'social_auth','0003_alter_email_max_length','2019-02-06 08:05:42.316793'),(404,'default','0004_auto_20160423_0400','2019-02-06 08:05:42.679083'),(405,'social_auth','0004_auto_20160423_0400','2019-02-06 08:05:42.685800'),(406,'social_auth','0005_auto_20160727_2333','2019-02-06 08:05:42.757758'),(407,'social_django','0006_partial','2019-02-06 08:05:42.816147'),(408,'social_django','0007_code_timestamp','2019-02-06 08:05:42.883285'),(409,'social_django','0008_partial_timestamp','2019-02-06 08:05:42.957758'),(410,'splash','0001_initial','2019-02-06 08:05:43.433414'),(411,'static_replace','0001_initial','2019-02-06 08:05:44.140144'),(412,'static_replace','0002_assetexcludedextensionsconfig','2019-02-06 08:05:46.566804'),(413,'status','0001_initial','2019-02-06 08:05:47.436513'),(414,'status','0002_update_help_text','2019-02-06 08:05:47.800113'),(415,'student','0014_courseenrollmentallowed_user','2019-02-06 08:05:48.264692'),(416,'student','0015_manualenrollmentaudit_add_role','2019-02-06 08:05:48.712619'),(417,'student','0016_coursenrollment_course_on_delete_do_nothing','2019-02-06 08:05:49.240041'),(418,'student','0017_accountrecovery','2019-02-06 08:05:49.748236'),(419,'student','0018_remove_password_history','2019-02-06 08:05:50.694342'),(420,'student','0019_auto_20181221_0540','2019-02-06 08:05:51.482317'),(421,'submissions','0001_initial','2019-02-06 08:05:51.980676'),(422,'submissions','0002_auto_20151119_0913','2019-02-06 08:05:52.129788'),(423,'submissions','0003_submission_status','2019-02-06 08:05:52.207556'),(424,'submissions','0004_remove_django_extensions','2019-02-06 08:05:52.285295'),(425,'survey','0001_initial','2019-02-06 08:05:53.028225'),(426,'teams','0001_initial','2019-02-06 08:05:56.392431'),(427,'theming','0001_initial','2019-02-06 08:05:57.128347'),(428,'third_party_auth','0001_initial','2019-02-06 08:06:00.383669'),(429,'third_party_auth','0002_schema__provider_icon_image','2019-02-06 08:06:04.313456'),(430,'third_party_auth','0003_samlproviderconfig_debug_mode','2019-02-06 08:06:04.721469'),(431,'third_party_auth','0004_add_visible_field','2019-02-06 08:06:08.188893'),(432,'third_party_auth','0005_add_site_field','2019-02-06 08:06:11.231121'),(433,'third_party_auth','0006_samlproviderconfig_automatic_refresh_enabled','2019-02-06 08:06:11.638402'),(434,'third_party_auth','0007_auto_20170406_0912','2019-02-06 08:06:12.463541'),(435,'third_party_auth','0008_auto_20170413_1455','2019-02-06 08:06:13.699789'),(436,'third_party_auth','0009_auto_20170415_1144','2019-02-06 08:06:15.877426'),(437,'third_party_auth','0010_add_skip_hinted_login_dialog_field','2019-02-06 08:06:17.252327'),(438,'third_party_auth','0011_auto_20170616_0112','2019-02-06 08:06:17.697662'),(439,'third_party_auth','0012_auto_20170626_1135','2019-02-06 08:06:19.014914'),(440,'third_party_auth','0013_sync_learner_profile_data','2019-02-06 08:06:21.184194'),(441,'third_party_auth','0014_auto_20171222_1233','2019-02-06 08:06:22.500576'),(442,'third_party_auth','0015_samlproviderconfig_archived','2019-02-06 08:06:22.910782'),(443,'third_party_auth','0016_auto_20180130_0938','2019-02-06 08:06:23.768574'),(444,'third_party_auth','0017_remove_icon_class_image_secondary_fields','2019-02-06 08:06:25.677996'),(445,'third_party_auth','0018_auto_20180327_1631','2019-02-06 08:06:26.945645'),(446,'third_party_auth','0019_consolidate_slug','2019-02-06 08:06:28.225165'),(447,'third_party_auth','0020_cleanup_slug_fields','2019-02-06 08:06:29.071340'),(448,'third_party_auth','0021_sso_id_verification','2019-02-06 08:06:30.920266'),(449,'third_party_auth','0022_auto_20181012_0307','2019-02-06 08:06:33.001900'),(450,'thumbnail','0001_initial','2019-02-06 08:06:33.058625'),(451,'track','0001_initial','2019-02-06 08:06:33.135878'),(452,'user_api','0001_initial','2019-02-06 08:06:36.568433'),(453,'user_api','0002_retirementstate_userretirementstatus','2019-02-06 08:06:37.067536'),(454,'user_api','0003_userretirementrequest','2019-02-06 08:06:37.538805'),(455,'user_api','0004_userretirementpartnerreportingstatus','2019-02-06 08:06:38.846620'),(456,'user_authn','0001_data__add_login_service','2019-02-06 08:06:38.924862'),(457,'util','0001_initial','2019-02-06 08:06:39.401783'),(458,'util','0002_data__default_rate_limit_config','2019-02-06 08:06:39.459887'),(459,'verified_track_content','0002_verifiedtrackcohortedcourse_verified_cohort_name','2019-02-06 08:06:39.538104'),(460,'verified_track_content','0003_migrateverifiedtrackcohortssetting','2019-02-06 08:06:40.048232'),(461,'verify_student','0001_initial','2019-02-06 08:06:45.357816'),(462,'verify_student','0002_auto_20151124_1024','2019-02-06 08:06:45.516943'),(463,'verify_student','0003_auto_20151113_1443','2019-02-06 08:06:45.673513'),(464,'verify_student','0004_delete_historical_records','2019-02-06 08:06:45.835049'),(465,'verify_student','0005_remove_deprecated_models','2019-02-06 08:06:49.679210'),(466,'verify_student','0006_ssoverification','2019-02-06 08:06:49.790644'),(467,'verify_student','0007_idverificationaggregate','2019-02-06 08:06:49.891841'),(468,'verify_student','0008_populate_idverificationaggregate','2019-02-06 08:06:49.947020'),(469,'verify_student','0009_remove_id_verification_aggregate','2019-02-06 08:06:50.183257'),(470,'verify_student','0010_manualverification','2019-02-06 08:06:50.284386'),(471,'verify_student','0011_add_fields_to_sspv','2019-02-06 08:06:50.459982'),(472,'video_config','0001_initial','2019-02-06 08:06:50.654393'),(473,'video_config','0002_coursevideotranscriptenabledflag_videotranscriptenabledflag','2019-02-06 08:06:50.846809'),(474,'video_config','0003_transcriptmigrationsetting','2019-02-06 08:06:50.952242'),(475,'video_config','0004_transcriptmigrationsetting_command_run','2019-02-06 08:06:51.053615'),(476,'video_config','0005_auto_20180719_0752','2019-02-06 08:06:51.770192'),(477,'video_config','0006_videothumbnailetting_updatedcoursevideos','2019-02-06 08:06:51.998431'),(478,'video_config','0007_videothumbnailsetting_offset','2019-02-06 08:06:52.104225'),(479,'video_pipeline','0001_initial','2019-02-06 08:06:52.217246'),(480,'video_pipeline','0002_auto_20171114_0704','2019-02-06 08:06:52.423437'),(481,'video_pipeline','0003_coursevideouploadsenabledbydefault_videouploadsenabledbydefault','2019-02-06 08:06:52.652384'),(482,'waffle','0002_auto_20161201_0958','2019-02-06 08:06:52.731546'),(483,'waffle_utils','0001_initial','2019-02-06 08:06:52.859204'),(484,'wiki','0001_initial','2019-02-06 08:07:04.002394'),(485,'wiki','0002_remove_article_subscription','2019-02-06 08:07:04.852782'),(486,'wiki','0003_ip_address_conv','2019-02-06 08:07:06.546138'),(487,'wiki','0004_increase_slug_size','2019-02-06 08:07:06.749915'),(488,'wiki','0005_remove_attachments_and_images','2019-02-06 08:07:10.711449'),(489,'workflow','0001_initial','2019-02-06 08:07:10.929774'),(490,'workflow','0002_remove_django_extensions','2019-02-06 08:07:11.016177'),(491,'xapi','0001_initial','2019-02-06 08:07:11.530173'),(492,'xapi','0002_auto_20180726_0142','2019-02-06 08:07:11.853838'),(493,'xblock_django','0001_initial','2019-02-06 08:07:12.421573'),(494,'xblock_django','0002_auto_20160204_0809','2019-02-06 08:07:12.884088'),(495,'xblock_django','0003_add_new_config_models','2019-02-06 08:07:15.322827'),(496,'xblock_django','0004_delete_xblock_disable_config','2019-02-06 08:07:15.939861'),(497,'social_django','0002_add_related_name','2019-02-06 08:07:15.955501'),(498,'social_django','0003_alter_email_max_length','2019-02-06 08:07:15.960905'),(499,'social_django','0004_auto_20160423_0400','2019-02-06 08:07:15.967703'),(500,'social_django','0001_initial','2019-02-06 08:07:15.972077'),(501,'social_django','0005_auto_20160727_2333','2019-02-06 08:07:15.978019'),(502,'contentstore','0001_initial','2019-02-06 08:07:47.027361'),(503,'contentstore','0002_add_assets_page_flag','2019-02-06 08:07:48.064450'),(504,'contentstore','0003_remove_assets_page_flag','2019-02-06 08:07:48.989553'),(505,'course_creators','0001_initial','2019-02-06 08:07:49.658930'),(506,'tagging','0001_initial','2019-02-06 08:07:49.791763'),(507,'tagging','0002_auto_20170116_1541','2019-02-06 08:07:49.890533'),(508,'user_tasks','0001_initial','2019-02-06 08:07:50.803460'),(509,'user_tasks','0002_artifact_file_storage','2019-02-06 08:07:50.865286'),(510,'xblock_config','0001_initial','2019-02-06 08:07:51.079346'),(511,'xblock_config','0002_courseeditltifieldsenabledflag','2019-02-06 08:07:51.540299'),(512,'lti_provider','0001_initial','2019-02-20 13:02:12.609875'),(513,'lti_provider','0002_auto_20160325_0407','2019-02-20 13:02:12.673092'),(514,'lti_provider','0003_auto_20161118_1040','2019-02-20 13:02:12.735420'),(515,'content_type_gating','0005_auto_20190306_1547','2019-03-06 16:01:10.563542'),(516,'course_duration_limits','0005_auto_20190306_1546','2019-03-06 16:01:11.211966'),(517,'enterprise','0061_systemwideenterpriserole_systemwideenterpriseuserroleassignment','2019-03-08 15:47:46.856657'),(518,'enterprise','0062_add_system_wide_enterprise_roles','2019-03-08 15:47:46.906778'),(519,'content_type_gating','0006_auto_20190308_1447','2019-03-11 16:27:52.135257'),(520,'course_duration_limits','0006_auto_20190308_1447','2019-03-11 16:27:52.779284'),(521,'content_type_gating','0007_auto_20190311_1919','2019-03-12 16:11:54.043782'),(522,'course_duration_limits','0007_auto_20190311_1919','2019-03-12 16:11:56.790492'),(523,'announcements','0001_initial','2019-03-18 20:55:30.988286'),(524,'content_type_gating','0008_auto_20190313_1634','2019-03-18 20:55:31.415131'),(525,'course_duration_limits','0008_auto_20190313_1634','2019-03-18 20:55:32.064734'),(526,'enterprise','0063_systemwideenterpriserole_description','2019-03-21 18:42:16.699719'),(527,'enterprise','0064_enterprisefeaturerole_enterprisefeatureuserroleassignment','2019-03-28 19:30:12.392842'),(528,'enterprise','0065_add_enterprise_feature_roles','2019-03-28 19:30:12.443188'),(529,'enterprise','0066_add_system_wide_enterprise_operator_role','2019-03-28 19:30:12.488801'),(530,'student','0020_auto_20190227_2019','2019-04-01 21:47:42.163913'),(531,'certificates','0015_add_masters_choice','2019-04-05 14:57:27.206603'),(532,'enterprise','0067_add_role_based_access_control_switch','2019-04-08 20:45:27.538157'),(533,'program_enrollments','0001_initial','2019-04-10 20:26:00.692153'),(534,'program_enrollments','0002_historicalprogramcourseenrollment_programcourseenrollment','2019-04-18 16:08:03.137722'),(535,'third_party_auth','0023_auto_20190418_2033','2019-04-24 13:54:18.834044'),(536,'program_enrollments','0003_auto_20190424_1622','2019-04-24 16:35:05.844296'),(537,'courseware','0008_move_idde_to_edx_when','2019-04-25 14:14:41.176920'),(538,'edx_when','0001_initial','2019-04-25 14:14:42.645389'),(539,'edx_when','0002_auto_20190318_1736','2019-04-25 14:14:44.336320'),(540,'edx_when','0003_auto_20190402_1501','2019-04-25 14:14:46.294533'),(541,'edx_proctoring','0010_update_backend','2019-05-02 21:47:41.213808'),(542,'program_enrollments','0004_add_programcourseenrollment_relatedname','2019-05-02 21:47:41.764379'),(543,'student','0021_historicalcourseenrollment','2019-05-03 20:30:26.687544'),(544,'cornerstone','0001_initial','2019-05-29 09:33:13.719793'),(545,'cornerstone','0002_cornerstoneglobalconfiguration_subject_mapping','2019-05-29 09:33:14.111664'),(546,'third_party_auth','0024_fix_edit_disallowed','2019-05-29 14:34:39.226961'),(547,'discounts','0001_initial','2019-06-03 19:16:30.854700'),(548,'program_enrollments','0005_canceled_not_withdrawn','2019-06-03 19:16:31.705259'),(549,'entitlements','0011_historicalcourseentitlement','2019-06-04 17:56:44.090401'),(550,'organizations','0007_historicalorganization','2019-06-04 17:56:44.882744'),(551,'user_tasks','0003_url_max_length','2019-06-04 17:56:52.649984'),(552,'user_tasks','0004_url_textfield','2019-06-04 17:56:52.708857'),(553,'enterprise','0068_remove_role_based_access_control_switch','2019-06-05 10:59:54.361142'),(554,'grades','0015_historicalpersistentsubsectiongradeoverride','2019-06-10 16:42:35.419978'),(555,'bulk_grades','0001_initial','2019-06-12 14:00:26.847460'),(556,'super_csv','0001_initial','2019-06-12 14:00:26.879762'),(557,'super_csv','0002_csvoperation_user','2019-06-12 14:00:27.257652'),(558,'enterprise','0069_auto_20190613_0607','2019-06-13 20:29:54.231876'),(559,'course_modes','0012_historicalcoursemode','2019-06-20 14:17:00.883900'),(560,'student','0022_indexing_in_courseenrollment','2019-06-28 07:52:49.937484'),(561,'courseware','0009_auto_20190703_1955','2019-07-03 19:59:48.322976'),(562,'bulk_grades','0002_auto_20190703_1526','2019-07-09 16:24:12.489841'),(563,'course_overviews','0015_historicalcourseoverview','2019-07-09 16:24:12.865655'),(564,'courseware','0010_auto_20190709_1559','2019-07-09 16:24:13.249043'),(565,'grades','0016_auto_20190703_1446','2019-07-09 16:24:14.162438'),(566,'cornerstone','0003_auto_20190621_1000','2019-08-16 20:33:30.643210'),(567,'enterprise','0070_enterprise_catalog_query','2019-08-16 20:33:31.677056'),(568,'enterprise','0071_historicalpendingenrollment_historicalpendingenterprisecustomeruser','2019-08-16 20:33:32.745997'),(569,'instructor_task','0003_alter_task_input_field','2019-08-16 20:33:33.017938'),(570,'microsite_configuration','004_delete_all_tables','2019-08-16 20:33:34.256853'),(571,'sap_success_factors','0018_sapsuccessfactorsenterprisecustomerconfiguration_show_course_price','2019-08-16 20:33:34.327113'),(572,'super_csv','0003_csvoperation_original_filename','2019-08-16 20:33:34.600410'),(573,'system_wide_roles','0001_SystemWideRole_SystemWideRoleAssignment','2019-08-16 20:33:34.993423'),(574,'system_wide_roles','0002_add_system_wide_student_support_role','2019-08-16 20:33:35.022596'),(575,'contentstore','0004_remove_push_notification_configmodel_table','2019-08-16 20:33:41.465727'),(576,'xapi','0003_auto_20190807_1006','2019-08-23 11:39:48.729878'),(577,'program_enrollments','0006_add_the_correct_constraints','2019-08-23 18:09:09.268961'),(578,'video_config','0008_courseyoutubeblockedflag','2019-08-25 18:17:15.983779'),(579,'program_enrollments','0007_waiting_programcourseenrollment_constraint','2019-08-27 19:09:27.680607'),(580,'content_libraries','0001_initial','2019-08-30 19:28:25.635235'),(581,'courseware','0011_csm_id_bigint','2019-08-30 19:28:26.395259'),(582,'enterprise','0072_add_enterprise_report_config_feature_role','2019-08-30 19:28:26.428135'),(583,'enterprise','0073_enterprisecustomerreportingconfiguration_uuid','2019-08-30 19:28:26.610136'),(584,'enterprise','0074_auto_20190904_1143','2019-09-06 21:17:13.932220'),(585,'xapi','0004_auto_20190830_0710','2019-09-06 21:17:14.456308'),(586,'enterprise','0075_auto_20190916_1030','2019-09-16 21:24:40.846129'),(587,'course_overviews','0016_simulatecoursepublishconfig','2019-09-17 14:33:18.318209'),(588,'courseware','0012_adjust_fields','2019-09-19 19:47:32.265973'),(589,'enterprise','0076_auto_20190918_2037','2019-09-19 19:47:33.356916'),(590,'cornerstone','0004_cornerstoneglobalconfiguration_languages','2019-09-25 09:52:14.183189'),(591,'cornerstone','0005_auto_20190925_0730','2019-09-25 09:52:14.554260'),(592,'degreed','0007_auto_20190925_0730','2019-09-25 09:52:14.965290'),(593,'integrated_channel','0007_auto_20190925_0730','2019-09-25 09:52:15.001578'),(594,'sap_success_factors','0019_auto_20190925_0730','2019-09-25 09:52:15.372786'),(595,'course_overviews','0017_auto_20191002_0823','2019-10-03 17:35:47.108732'),(596,'courseware','0013_auto_20191001_1858','2019-10-03 17:35:47.675913'),(597,'edx_when','0004_datepolicy_rel_date','2019-10-03 17:35:47.714137'),(598,'edx_when','0005_auto_20190911_1056','2019-10-03 17:35:48.352268'),(599,'student','0023_bulkunenrollconfiguration','2019-10-08 08:54:55.531674'),(600,'program_enrollments','0008_add_ended_programenrollment_status','2019-10-15 16:54:40.812546'),(601,'enterprise','0077_auto_20191002_1529','2019-10-15 21:48:57.015096'),(602,'completion','0003_learning_context','2019-10-22 18:42:37.071520'),(603,'teams','0002_slug_field_ids','2019-10-22 18:42:37.978486'),(604,'entitlements','0012_allow_blank_order_number_values','2019-10-23 16:23:53.619696'),(605,'discounts','0002_auto_20191022_1720','2019-10-25 14:14:29.317857'),(606,'commerce','0008_auto_20191024_2048','2019-10-30 16:42:49.876338'),(607,'student','0024_fbeenrollmentexclusion','2019-10-31 16:16:38.116056'),(608,'student','0025_auto_20191101_1846','2019-11-05 14:23:29.298316'),(609,'cornerstone','0006_auto_20191001_0742','2019-11-15 09:41:58.615907'),(610,'degreed','0008_auto_20191001_0742','2019-11-15 09:41:59.004037'),(611,'enterprise','0078_auto_20191107_1536','2019-11-15 09:41:59.081745'),(612,'enterprise','0079_AddEnterpriseEnrollmentSource','2019-11-15 09:42:01.297444'),(613,'enterprise','0080_auto_20191113_1708','2019-11-15 09:42:01.373867'),(614,'sap_success_factors','0020_sapsuccessfactorsenterprisecustomerconfiguration_catalogs_to_transmit','2019-11-15 09:42:01.448662'),(615,'student','0026_allowedauthuser','2019-11-15 09:42:01.867741'),(616,'teams','0003_courseteam_organization_protected','2019-11-15 09:42:02.160822'),(617,'schedules','0008_add_new_start_date_field','2019-11-21 18:12:54.950500'),(618,'enterprise','0081_UpdateEnterpriseEnrollmentSource','2019-11-25 17:52:07.779142'),(619,'enterprise','0082_AddManagementEnterpriseEnrollmentSource','2019-12-03 20:57:44.528593'),(620,'edxval','0012_thirdpartytranscriptcredentialsstate_has_creds','2019-12-06 10:56:28.616253'),(621,'edxval','0013_thirdpartytranscriptcredentialsstate_copy_values','2019-12-13 13:13:43.103802'),(622,'edxval','0014_transcript_credentials_state_retype_exists','2019-12-13 13:13:43.146474'),(623,'programs','0013_customprogramsconfig','2019-12-13 13:13:43.769272'),(624,'verify_student','0012_sspverificationretryconfig','2019-12-13 13:13:44.172148'),(625,'assessment','0004_historicalsharedfileupload_sharedfileupload','2019-12-16 06:29:51.457888'),(626,'certificates','0016_historicalgeneratedcertificate','2019-12-17 14:30:19.195816'),(627,'entitlements','0013_historicalcourseentitlementsupportdetail','2019-12-17 14:30:19.608404'),(628,'credit','0005_creditrequirement_sort_value','2019-12-19 10:51:33.510519'),(629,'student','0027_courseenrollment_mode_callable_default','2019-12-26 15:36:18.942310'),(630,'enterprise','0083_enterprisecustomerreportingconfiguration_include_date','2019-12-26 21:47:36.992960'),(631,'schedules','0009_schedule_copy_column_values','2020-01-02 13:28:40.924356'),(632,'credit','0006_creditrequirement_alter_ordering','2020-01-03 18:18:59.132478'),(633,'credit','0007_creditrequirement_copy_values','2020-01-03 18:18:59.153966'),(634,'credit','0008_creditrequirement_remove_order','2020-01-08 11:38:46.464661'),(635,'grades','0017_delete_manual_psgoverride_table','2020-01-08 11:38:46.979886'),(636,'waffle','0003_update_strings_for_i18n','2020-01-08 14:05:56.793699'),(637,'student','0028_historicalmanualenrollmentaudit','2020-01-10 11:40:33.721153'),(638,'assessment','0005_add_filename_to_sharedupload','2020-01-13 10:35:30.849694'),(639,'course_overviews','0018_add_start_end_in_CourseOverview','2020-01-13 17:26:59.381741'),(640,'wiki','0006_auto_20200110_1003','2020-01-13 17:26:59.580772'),(641,'course_modes','0013_auto_20200115_2022','2020-01-15 20:28:11.826240'),(642,'entitlements','0014_auto_20200115_2022','2020-01-15 20:28:12.121824'),(643,'schedules','0010_remove_null_blank_from_schedules_date','2020-01-22 12:55:55.562069'),(644,'edxval','0015_remove_thirdpartytranscriptcredentialsstate_exists','2020-01-24 14:36:05.625239'),(645,'enterprise','0084_auto_20200120_1137','2020-01-24 14:36:05.682781'),(646,'enterprise','0085_enterprisecustomeruser_linked','2020-01-24 14:36:05.737471'),(647,'sap_success_factors','0021_sapsuccessfactorsenterprisecustomerconfiguration_show_total_hours','2020-01-27 10:53:54.883903'),(648,'course_overviews','0019_improve_courseoverviewtab','2020-01-28 16:51:53.392851'),(649,'enterprise','0086_auto_20200128_1726','2020-01-31 16:49:40.116068'),(650,'student','0029_add_data_researcher','2020-01-31 16:49:40.134245'),(651,'entitlements','0015_add_unique_together_constraint','2020-02-11 13:55:54.821099'),(652,'external_user_ids','0001_initial','2020-02-11 13:55:56.286689'),(653,'external_user_ids','0002_mb_coaching_20200210_1754','2020-02-11 13:55:56.302455'),(654,'sap_success_factors','0022_auto_20200206_1046','2020-02-11 13:55:56.431451'),(655,'track','0002_delete_trackinglog','2020-02-11 13:55:56.448287'),(656,'enterprise','0087_auto_20200206_1151','2020-02-18 09:56:05.261459'),(657,'site_configuration','0003_auto_20200217_1058','2020-02-18 09:56:05.382056'),(658,'student','0030_userprofile_phone_number','2020-02-20 14:49:09.679286'),(659,'course_date_signals','0001_initial','2020-02-21 16:46:07.245424'),(660,'oauth_dispatch','0008_applicationaccess_filters','2020-02-21 16:46:07.279347'),(661,'site_configuration','0004_add_site_values_field','2020-02-21 16:46:07.400523'),(662,'calendar_sync','0001_initial','2020-02-21 20:05:00.723064'),(663,'site_configuration','0005_copy_values_to_site_values','2020-02-24 18:48:13.968250'),(664,'external_user_ids','0003_auto_20200224_1836','2020-02-26 19:12:10.225163'),(665,'course_overviews','0020_courseoverviewtab_url_slug','2020-02-28 17:48:26.402935'),(666,'schedules','0011_auto_20200228_2018','2020-03-02 19:21:35.447856'),(667,'schedules','0012_auto_20200302_1914','2020-03-02 19:21:35.760107'),(668,'enterprise','0088_auto_20200224_1341','2020-03-03 20:06:11.193549'),(669,'experiments','0004_historicalexperimentkeyvalue','2020-03-03 20:06:11.472740'),(670,'program_enrollments','0009_update_course_enrollment_field_to_foreign_key','2020-03-03 20:06:11.793880'),(671,'site_configuration','0005_populate_siteconfig_history_site_values','2020-03-03 20:06:11.809759'),(672,'third_party_auth','0025_auto_20200303_1448','2020-03-03 20:06:12.334364'),(673,'oauth_dispatch','0009_delete_enable_scopes_waffle_switch','2020-03-04 16:02:10.087753'),(674,'schedules','0013_historicalschedule','2020-03-04 20:46:18.382627'),(675,'content_libraries','0002_group_permissions','2020-03-06 17:56:06.253916'),(676,'enterprise','0089_auto_20200305_0652','2020-03-06 17:56:06.313096'),(677,'site_configuration','0006_copy_values_to_site_values','2020-03-06 17:56:06.328937'),(678,'site_configuration','0007_remove_values_field','2020-03-06 17:56:06.393334'),(679,'schedules','0014_historicalschedule_drop_fk','2020-03-09 17:25:11.320964'),(680,'enterprise','0090_update_content_filter','2020-03-10 17:57:28.234120'),(681,'schedules','0015_schedules_start_nullable','2020-03-10 17:57:28.512287'),(682,'courseware','0014_fix_nan_value_for_global_speed','2020-03-11 13:49:34.540416'),(683,'enterprise','0091_add_sales_force_id_in_pendingenrollment','2020-03-12 10:55:06.528703'),(684,'enterprise','0092_auto_20200312_1650','2020-03-13 15:24:08.871983'),(685,'schedules','0016_remove_start_from_schedules','2020-03-13 15:24:08.919319'),(686,'schedules','0017_remove_start_from_historicalschedule','2020-03-13 15:24:08.961171'),(687,'schedules','0018_readd_historicalschedule_fks','2020-03-16 14:38:37.163574'),(688,'student','0031_auto_20200317_1122','2020-03-17 13:50:29.328406'),(689,'schedules','0019_auto_20200316_1935','2020-03-17 18:44:58.495941'),(690,'teams','0004_alter_defaults','2020-03-18 15:45:23.207866'),(691,'edxval','0016_add_transcript_credentials_model','2020-03-27 07:02:32.020569'),(692,'assessment','0006_TeamWorkflows','2020-03-30 19:21:59.600633'),(693,'edx_when','0006_drop_active_index','2020-03-30 19:21:59.632637'),(694,'program_enrollments','0010_add_courseaccessroleassignment','2020-03-30 19:22:00.189635'),(695,'workflow','0003_TeamWorkflows','2020-03-30 19:22:00.217685'),(696,'submissions','0005_CreateTeamModel','2020-04-01 20:58:02.569032'),(697,'third_party_auth','0026_auto_20200401_1932','2020-04-02 13:16:24.403863'),(698,'enterprise','0093_add_use_enterprise_catalog_flag','2020-04-08 18:23:05.688441'),(699,'enterprise','0094_add_use_enterprise_catalog_sample','2020-04-10 22:07:38.597967'),(700,'submissions','0001_squashed_0005_CreateTeamModel','2020-04-10 22:07:38.604906'),(701,'organizations','0001_squashed_0007_historicalorganization','2020-04-10 22:07:38.607140'),(702,'admin','0003_logentry_add_action_flag_choices','2020-04-23 18:12:12.574100'),(703,'auth','0009_alter_user_last_name_max_length','2020-04-23 18:12:12.796012'),(704,'auth','0010_alter_group_name_max_length','2020-04-23 18:12:12.828059'),(705,'auth','0011_update_proxy_permissions','2020-04-23 18:12:12.844008'),(706,'edx_when','0007_meta_tweaks','2020-04-23 18:12:12.867316'),(707,'oauth2_provider','0002_auto_20190406_1805','2020-04-23 18:12:12.934409'),(708,'student','0032_removed_logout_view_configuration','2020-04-23 18:12:13.224802'),(709,'third_party_auth','0001_squashed_0026_auto_20200401_1932','2020-04-23 18:12:13.228610'),(710,'student','0001_squashed_0031_auto_20200317_1122','2020-04-23 18:12:13.230794'),(711,'enterprise','0001_squashed_0092_auto_20200312_1650','2020-04-23 18:12:13.231901'),(712,'edxval','0001_squashed_0016_add_transcript_credentials_model','2020-04-23 18:12:13.233806'),(713,'integrated_channel','0001_squashed_0007_auto_20190925_0730','2020-04-24 16:47:58.386734'),(714,'sap_success_factors','0001_squashed_0022_auto_20200206_1046','2020-04-24 16:47:58.389680'),(715,'course_overviews','0021_courseoverviewtab_link','2020-05-04 10:59:50.657693'),(716,'course_overviews','0022_courseoverviewtab_is_hidden','2020-05-04 10:59:50.698025'),(717,'edxval','0002_add_error_description_field','2020-05-04 10:59:50.726121'),(718,'external_user_ids','0004_add_lti_type','2020-05-04 10:59:50.742411'),(719,'enterprise','0095_auto_20200507_1138','2020-05-08 20:20:57.110248'),(720,'enterprise','0096_enterprise_catalog_admin_role','2020-05-13 22:12:35.726151'),(721,'student','0033_userprofile_state','2020-05-13 22:12:35.951058'),(722,'edxval','0003_delete_transcriptcredentials','2020-05-27 11:00:00.899989'),(723,'learning_sequences','0001_initial','2020-06-04 06:06:00.367312'),(724,'video_pipeline','0004_vempipelineintegration','2020-06-04 06:06:00.662081'),(725,'social_django','0009_auto_20191118_0520','2020-06-19 00:01:12.172817'),(726,'social_django','0010_uid_db_index','2020-06-19 00:01:12.397908'),(727,'student','0034_courseenrollmentcelebration','2020-06-19 00:01:12.953638'),(728,'enterprise','0097_auto_20200619_1130','2020-06-19 19:05:31.695995'),(729,'grades','0018_add_waffle_flag_defaults','2020-06-23 18:17:40.133076'),(730,'contentstore','0005_add_enable_checklists_quality_waffle_flag','2020-06-23 18:17:46.707561'),(731,'video_pipeline','0005_add_vem_course_percentage','2020-06-26 08:12:02.660023'),(732,'enterprise','0098_auto_20200629_1756','2020-07-01 12:53:15.837538'),(733,'enterprise','0099_auto_20200702_1537','2020-07-07 20:06:32.822100'),(734,'enterprise','0100_add_licensed_enterprise_course_enrollment','2020-07-07 20:06:33.462679'),(735,'calendar_sync','0002_auto_20200709_1743','2020-07-14 15:27:51.730354'),(736,'enterprise','0101_move_data_to_saved_for_later','2020-07-14 15:27:51.746882'),(737,'enterprise','0102_auto_20200708_1615','2020-07-14 15:27:52.063293'),(738,'enterprise','0103_remove_marked_done','2020-07-14 15:27:52.596888'),(739,'learning_sequences','0002_coursesectionsequence_inaccessible_after_due','2020-07-14 15:27:52.622881'),(740,'student','0035_bulkchangeenrollmentconfiguration','2020-07-21 10:54:23.472177'),(741,'third_party_auth','0002_samlproviderconfig_country','2020-07-24 14:51:24.977886'),(742,'demographics','0001_initial','2020-07-30 15:57:38.753511'),(743,'enterprise','0104_sync_query_field','2020-07-30 15:57:39.062774'),(744,'third_party_auth','0002_auto_20200721_1650','2020-07-30 15:57:40.314105'),(745,'enterprise','0105_add_branding_config_color_fields','2020-08-03 19:13:50.868781'),(746,'learning_sequences','0003_create_course_context_for_course_specific_models','2020-08-03 19:13:51.087958'),(747,'enterprise','0106_move_branding_config_colors','2020-08-04 19:27:28.158538'),(748,'enterprise','0107_remove_branding_config_banner_fields','2020-08-04 19:27:28.264863'),(749,'canvas','0001_initial','2020-08-07 08:26:14.629124'),(750,'video_pipeline','0006_remove_vempipelineintegration_vem_enabled_courses_percentage','2020-08-07 08:26:14.811318'),(751,'enterprise','0108_add_licensed_enrollment_is_revoked','2020-08-11 13:14:55.354317'),(752,'canvas','0002_auto_20200806_1632','2020-08-19 14:56:31.013573'),(753,'canvas','0003_delete_canvasglobalconfiguration','2020-08-19 14:56:31.025304'),(754,'enterprise','0109_remove_use_enterprise_catalog_sample','2020-08-19 14:56:31.035543'),(755,'learning_sequences','0004_coursecontext_self_paced','2020-08-27 17:12:54.572632'),(756,'lti_consumer','0001_initial','2020-08-28 05:03:46.997312'),(757,'demographics','0002_clean_duplicate_entries','2020-09-01 07:21:47.855219'),(758,'demographics','0003_auto_20200827_1949','2020-09-01 07:21:48.155899'),(759,'learning_sequences','0005_coursecontext_days_early_for_beta','2020-09-01 07:21:48.183664'),(760,'enterprise','0110_add_default_contract_discount','2020-09-08 14:46:12.171747'),(761,'third_party_auth','0003_samlconfiguration_is_public','2020-09-08 14:46:12.422216'),(762,'waffle','0004_update_everyone_nullbooleanfield','2020-09-08 14:46:12.658944'),(763,'canvas','0004_adding_learner_data_to_canvas','2020-09-10 19:32:41.207108'),(764,'canvas','0005_auto_20200909_1534','2020-09-10 19:32:41.245967'),(765,'enterprise','0111_pendingenterprisecustomeradminuser','2020-09-10 19:32:41.854150'),(766,'enterprise','0112_auto_20200914_0926','2020-09-14 18:12:08.108371'),(767,'enterprise','0113_auto_20200914_2054','2020-09-15 14:01:07.529558'),(768,'third_party_auth','0004_auto_20200919_0955','2020-09-19 10:15:11.083199'),(769,'moodle','0001_initial','2020-09-21 18:48:40.774290'),(770,'content_libraries','0003_contentlibrary_type','2020-09-29 19:12:37.463738'),(771,'django_celery_results','0001_initial','2020-09-29 19:12:37.477980'),(772,'django_celery_results','0002_add_task_name_args_kwargs','2020-09-29 19:12:37.521053'),(773,'django_celery_results','0003_auto_20181106_1101','2020-09-29 19:12:37.535419'),(774,'django_celery_results','0004_auto_20190516_0412','2020-09-29 19:12:37.690736'),(775,'django_celery_results','0005_taskresult_worker','2020-09-29 19:12:37.707829'),(776,'django_celery_results','0006_taskresult_date_created','2020-09-29 19:12:37.732208'),(777,'django_celery_results','0007_remove_taskresult_hidden','2020-09-29 19:12:37.940908'),(778,'blackboard','0001_initial','2020-10-12 12:35:30.340617'),(779,'blackboard','0002_auto_20200930_1723','2020-10-12 12:35:30.862559'),(780,'content_libraries','0004_contentlibrary_license','2020-10-12 12:35:30.887276'),(781,'moodle','0002_moodlelearnerdatatransmissionaudit','2020-10-12 12:35:30.901883'),(782,'moodle','0003_auto_20201006_1706','2020-10-12 12:35:31.451173'),(783,'video_pipeline','0007_delete_videopipelineintegration','2020-10-12 12:35:31.463858'),(784,'student','0036_userpasswordtogglehistory','2020-10-16 09:07:47.488482'),(785,'blackboard','0003_blackboardlearnerdatatransmissionaudit','2020-10-16 12:50:23.739145'),(786,'blackboard','0004_blackboard_tx_chunk_size_default_1','2020-10-16 12:50:23.986468'),(787,'student','0037_linkedinaddtoprofileconfiguration_updates','2020-10-19 16:34:38.261097'),(788,'enterprise','0114_auto_20201020_0142','2020-10-20 09:17:51.232563'),(789,'enterprise','0115_enterpriseanalyticsuser_historicalenterpriseanalyticsuser','2020-11-09 17:41:22.573420'),(790,'moodle','0004_auto_20201105_1921','2020-11-09 17:41:22.831075'),(791,'student','0038_auto_20201021_1256','2020-11-09 17:41:23.021373'),(792,'verify_student','0013_add_expiration_date_field','2020-11-10 18:20:49.309852'),(793,'organizations','0002_unique_short_name','2020-11-13 16:20:43.284752'),(794,'course_overviews','0023_courseoverview_banner_image_url','2020-11-17 16:12:50.496401'),(795,'learning_sequences','0006_coursecontext_entrance_exam_id','2020-11-17 16:12:50.525921'),(796,'learning_sequences','0007_coursesequenceexam','2020-11-17 16:12:50.555791'),(797,'enterprise','0116_auto_20201116_0400','2020-11-18 11:46:23.592647'),(798,'certificates','0017_add_mode_20201118_1725','2020-11-19 06:41:58.556203'),(799,'django_celery_results','0008_chordcounter','2020-11-19 16:05:02.832014'),(800,'integrated_channel','0002_learnerdatatransmissionaudit_subsection_id','2020-12-02 12:39:35.494746'),(801,'shoppingcart','0005_drop_tables','2020-12-02 18:22:02.730858'),(802,'canvas','0006_canvaslearnerassessmentdatatransmissionaudit','2020-12-09 12:59:08.346475'),(803,'event_routing_backends','0001_initial','2020-12-09 12:59:08.797913'),(804,'workflow','0004_assessmentworkflowstep_skipped','2020-12-09 12:59:08.817729'),(805,'blackboard','0005_blackboardlearnerassessmentdatatransmissionaudit','2020-12-10 19:40:27.010124'),(806,'edx_proctoring','0011_allow_multiple_attempts','2020-12-10 19:40:27.195957'),(807,'enterprise','0116_auto_20201208_1759','2020-12-10 19:40:27.672949'),(808,'lti_consumer','0002_ltiagslineitem','2020-12-10 19:40:27.692359'),(809,'lti_consumer','0003_ltiagsscore','2020-12-10 19:40:27.713826'),(810,'lti_consumer','0004_keyset_mgmt_to_model','2020-12-10 19:40:27.776664'),(811,'lti_consumer','0005_migrate_keyset_to_model','2020-12-10 19:40:27.788801'),(812,'enterprise','0117_auto_20201215_0258','2020-12-15 14:41:34.054708'),(813,'discussions','0001_initial','2020-12-17 01:49:36.197954'),(814,'edx_proctoring','0012_proctoredexamstudentattempt_time_remaining_seconds','2021-01-06 14:38:32.642940'),(815,'enterprise','unique_constraints_pending_users','2021-01-06 14:38:33.401574'),(816,'edx_proctoring','0013_proctoredexamsoftwaresecurereview_is_active_attempt','2021-01-15 13:55:43.486017'),(817,'enterprise','0001_auto_20210111_1253','2021-01-15 13:55:43.750804'),(818,'lti_consumer','0006_add_on_model_config_for_lti_1p1','2021-01-20 05:11:09.122132'),(819,'student','0039_anon_id_context','2021-01-21 23:59:39.621062'),(820,'degreed','0009_auto_20210119_1546','2021-01-25 14:55:50.809600'),(821,'enterprise','0120_systemwiderole_applies_to_all_contexts','2021-01-25 14:55:51.182902'),(822,'system_wide_roles','0003_systemwideroleassignment_applies_to_all_contexts','2021-01-25 14:55:51.375236'),(823,'enterprise','0121_systemwiderole_add_ent_cust_field','2021-01-28 18:43:00.476825'),(824,'discussions','0002_add_provider_filter','2021-02-02 19:44:45.410652'),(825,'enterprise','0122_remove_field_sync_enterprise_catalog_query','2021-02-02 19:44:45.633760'),(826,'certificates','0018_historicalcertificateinvalidation','2021-02-04 15:15:34.012664'),(827,'organizations','0003_historicalorganizationcourse','2021-02-09 05:09:14.985799'),(828,'enterprise','0123_enterprisecustomeridentityprovider_default_provider','2021-02-16 09:07:30.570124'),(829,'certificates','0019_allowlistgenerationconfiguration','2021-02-19 08:06:56.321773'),(830,'lti_consumer','0007_ltidlcontentitem','2021-02-19 08:06:56.599008'),(831,'lti_consumer','0008_fix_uuid_backfill','2021-02-19 08:06:56.646347'),(832,'sap_success_factors','0002_sapsuccessfactorslearnerdatatransmissionaudit_credit_hours','2021-02-19 08:06:56.662163'),(833,'certificates','0020_remove_existing_mgmt_cmd_args','2021-02-22 16:23:17.478249'),(834,'credentials','0005_remove_existing_mgmt_cmd_args','2021-02-22 16:23:17.489123'),(835,'student','0040_usercelebration','2021-02-22 16:23:17.958434'),(836,'canvas','0007_auto_20210222_2225','2021-02-23 20:07:41.246475'),(837,'course_overviews','0024_overview_adds_has_highlights','2021-02-23 20:07:41.461255');
/*!40000 ALTER TABLE `django_migrations` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
diff --git a/common/test/db_cache/bok_choy_schema_default.sql b/common/test/db_cache/bok_choy_schema_default.sql
index f7dc49b249..0f5a5c7137 100644
--- a/common/test/db_cache/bok_choy_schema_default.sql
+++ b/common/test/db_cache/bok_choy_schema_default.sql
@@ -967,7 +967,7 @@ CREATE TABLE `canvas_canvasenterprisecustomerconfiguration` (
`catalogs_to_transmit` longtext,
`client_id` varchar(255) DEFAULT NULL,
`client_secret` varchar(255) DEFAULT NULL,
- `canvas_account_id` int(11) DEFAULT NULL,
+ `canvas_account_id` bigint(20) DEFAULT NULL,
`canvas_base_url` varchar(255) DEFAULT NULL,
`enterprise_customer_id` char(32) NOT NULL,
`refresh_token` varchar(255) NOT NULL,
@@ -1028,7 +1028,7 @@ CREATE TABLE `canvas_historicalcanvasenterprisecustomerconfiguration` (
`catalogs_to_transmit` longtext,
`client_id` varchar(255) DEFAULT NULL,
`client_secret` varchar(255) DEFAULT NULL,
- `canvas_account_id` int(11) DEFAULT NULL,
+ `canvas_account_id` bigint(20) DEFAULT NULL,
`canvas_base_url` varchar(255) DEFAULT NULL,
`history_id` int(11) NOT NULL AUTO_INCREMENT,
`history_date` datetime(6) NOT NULL,
@@ -2084,6 +2084,7 @@ CREATE TABLE `course_overviews_courseoverview` (
`end_date` datetime(6) DEFAULT NULL,
`start_date` datetime(6) DEFAULT NULL,
`banner_image_url` longtext NOT NULL,
+ `has_highlights` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
@@ -2190,6 +2191,7 @@ CREATE TABLE `course_overviews_historicalcourseoverview` (
`end_date` datetime(6) DEFAULT NULL,
`start_date` datetime(6) DEFAULT NULL,
`banner_image_url` longtext NOT NULL,
+ `has_highlights` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`history_id`),
KEY `course_overviews_his_history_user_id_e21063d9_fk_auth_user` (`history_user_id`),
KEY `course_overviews_historicalcourseoverview_id_647043f0` (`id`),
@@ -2994,7 +2996,7 @@ CREATE TABLE `django_migrations` (
`name` varchar(255) NOT NULL,
`applied` datetime(6) NOT NULL,
PRIMARY KEY (`id`)
-) ENGINE=InnoDB AUTO_INCREMENT=836 DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB AUTO_INCREMENT=838 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `django_openid_auth_association`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
diff --git a/common/test/db_cache/bok_choy_schema_student_module_history.sql b/common/test/db_cache/bok_choy_schema_student_module_history.sql
index 01a1f8e7df..bc45880daa 100644
--- a/common/test/db_cache/bok_choy_schema_student_module_history.sql
+++ b/common/test/db_cache/bok_choy_schema_student_module_history.sql
@@ -36,7 +36,7 @@ CREATE TABLE `django_migrations` (
`name` varchar(255) NOT NULL,
`applied` datetime(6) NOT NULL,
PRIMARY KEY (`id`)
-) ENGINE=InnoDB AUTO_INCREMENT=836 DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB AUTO_INCREMENT=838 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
From 370e4263be1b997bcf8505e3543af0b7cac5fea5 Mon Sep 17 00:00:00 2001
From: edX requirements bot
<49161187+edx-requirements-bot@users.noreply.github.com>
Date: Wed, 24 Feb 2021 04:10:54 -0500
Subject: [PATCH 26/74] Updating Python Requirements (#26694)
---
requirements/edx-sandbox/py35.txt | 2 +-
requirements/edx/base.txt | 2 +-
requirements/edx/development.txt | 4 ++--
requirements/edx/testing.txt | 4 ++--
4 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/requirements/edx-sandbox/py35.txt b/requirements/edx-sandbox/py35.txt
index a051245942..b96f28fa63 100644
--- a/requirements/edx-sandbox/py35.txt
+++ b/requirements/edx-sandbox/py35.txt
@@ -20,7 +20,7 @@ matplotlib==2.2.4 # via -c requirements/edx-sandbox/../constraints.txt,
mpmath==1.2.1 # via sympy
networkx==2.2 # via -r requirements/edx-sandbox/py35.in
nltk==3.5 # via -r requirements/edx-sandbox/shared.txt, chem
-numpy==1.16.5 # via -r requirements/edx-sandbox/py35.in, chem, matplotlib, openedx-calc
+numpy==1.16.5 # via -r requirements/edx-sandbox/py35.in, chem, matplotlib, openedx-calc, scipy
openedx-calc==1.0.9 # via -r requirements/edx-sandbox/py35.in
pycparser==2.20 # via -r requirements/edx-sandbox/shared.txt, cffi
pyparsing==2.2.0 # via -r requirements/edx-sandbox/py35.in, chem, matplotlib, openedx-calc
diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt
index 6869d10620..bdc44d7c42 100644
--- a/requirements/edx/base.txt
+++ b/requirements/edx/base.txt
@@ -106,7 +106,7 @@ edx-milestones==0.3.0 # via -r requirements/edx/base.in
edx-opaque-keys[django]==2.2.0 # via -r requirements/edx/paver.txt, edx-bulk-grades, edx-ccx-keys, edx-completion, edx-drf-extensions, edx-enterprise, edx-milestones, edx-organizations, edx-proctoring, edx-user-state-client, edx-when, lti-consumer-xblock, xmodule
edx-organizations==6.9.0 # via -r requirements/edx/base.in
edx-proctoring-proctortrack==1.0.5 # via -r requirements/edx/base.in
-edx-proctoring==3.6.2 # via -r requirements/edx/base.in, edx-proctoring-proctortrack
+edx-proctoring==3.6.3 # via -r requirements/edx/base.in, edx-proctoring-proctortrack
edx-rbac==1.4.1 # via edx-enterprise
edx-rest-api-client==5.3.0 # via -r requirements/edx/base.in, edx-enterprise, edx-proctoring
edx-search==3.0.0 # via -r requirements/edx/base.in
diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt
index e1ebe1224b..6211b4c2fe 100644
--- a/requirements/edx/development.txt
+++ b/requirements/edx/development.txt
@@ -118,7 +118,7 @@ edx-milestones==0.3.0 # via -r requirements/edx/testing.txt
edx-opaque-keys[django]==2.2.0 # via -r requirements/edx/testing.txt, edx-bulk-grades, edx-ccx-keys, edx-completion, edx-drf-extensions, edx-enterprise, edx-milestones, edx-organizations, edx-proctoring, edx-user-state-client, edx-when, lti-consumer-xblock, xmodule
edx-organizations==6.9.0 # via -r requirements/edx/testing.txt
edx-proctoring-proctortrack==1.0.5 # via -r requirements/edx/testing.txt
-edx-proctoring==3.6.2 # via -r requirements/edx/testing.txt, edx-proctoring-proctortrack
+edx-proctoring==3.6.3 # via -r requirements/edx/testing.txt, edx-proctoring-proctortrack
edx-rbac==1.4.1 # via -r requirements/edx/testing.txt, edx-enterprise
edx-rest-api-client==5.3.0 # via -r requirements/edx/testing.txt, edx-enterprise, edx-proctoring
edx-search==3.0.0 # via -r requirements/edx/testing.txt
@@ -222,7 +222,7 @@ pyjwt[crypto]==1.7.1 # via -r requirements/edx/testing.txt, drf-jwt, edx-re
pylint-celery==0.3 # via -r requirements/edx/testing.txt, edx-lint
pylint-django==2.4.2 # via -r requirements/edx/testing.txt, edx-lint
pylint-plugin-utils==0.6 # via -r requirements/edx/testing.txt, pylint-celery, pylint-django
-pylint==2.7.0 # via -r requirements/edx/testing.txt, edx-lint, pylint-celery, pylint-django, pylint-plugin-utils
+pylint==2.7.1 # via -r requirements/edx/testing.txt, edx-lint, pylint-celery, pylint-django, pylint-plugin-utils
pymongo==3.10.1 # via -c requirements/edx/../constraints.txt, -r requirements/edx/testing.txt, edx-opaque-keys, event-tracking, mongodbproxy, mongoengine
pynliner==0.8.0 # via -r requirements/edx/testing.txt
pyparsing==2.4.7 # via -r requirements/edx/testing.txt, chem, openedx-calc, packaging, pycontracts
diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt
index bd8e925601..c956a9d394 100644
--- a/requirements/edx/testing.txt
+++ b/requirements/edx/testing.txt
@@ -115,7 +115,7 @@ edx-milestones==0.3.0 # via -r requirements/edx/base.txt
edx-opaque-keys[django]==2.2.0 # via -r requirements/edx/base.txt, edx-bulk-grades, edx-ccx-keys, edx-completion, edx-drf-extensions, edx-enterprise, edx-milestones, edx-organizations, edx-proctoring, edx-user-state-client, edx-when, lti-consumer-xblock, xmodule
edx-organizations==6.9.0 # via -r requirements/edx/base.txt
edx-proctoring-proctortrack==1.0.5 # via -r requirements/edx/base.txt
-edx-proctoring==3.6.2 # via -r requirements/edx/base.txt, edx-proctoring-proctortrack
+edx-proctoring==3.6.3 # via -r requirements/edx/base.txt, edx-proctoring-proctortrack
edx-rbac==1.4.1 # via -r requirements/edx/base.txt, edx-enterprise
edx-rest-api-client==5.3.0 # via -r requirements/edx/base.txt, edx-enterprise, edx-proctoring
edx-search==3.0.0 # via -r requirements/edx/base.txt
@@ -213,7 +213,7 @@ pyjwt[crypto]==1.7.1 # via -r requirements/edx/base.txt, drf-jwt, edx-rest-
pylint-celery==0.3 # via edx-lint
pylint-django==2.4.2 # via edx-lint
pylint-plugin-utils==0.6 # via pylint-celery, pylint-django
-pylint==2.7.0 # via edx-lint, pylint-celery, pylint-django, pylint-plugin-utils
+pylint==2.7.1 # via edx-lint, pylint-celery, pylint-django, pylint-plugin-utils
pymongo==3.10.1 # via -c requirements/edx/../constraints.txt, -r requirements/edx/base.txt, edx-opaque-keys, event-tracking, mongodbproxy, mongoengine
pynliner==0.8.0 # via -r requirements/edx/base.txt
pyparsing==2.4.7 # via -r requirements/edx/base.txt, chem, openedx-calc, packaging, pycontracts
From fa44c247962a1afc8e5b6edc8c8973f6aa6b9516 Mon Sep 17 00:00:00 2001
From: Awais Jibran
Date: Wed, 24 Feb 2021 15:09:21 +0500
Subject: [PATCH 27/74] refactor: use q objects when fetching user using an
identifier
---
.../discussion/management/commands/assign_role.py | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/lms/djangoapps/discussion/management/commands/assign_role.py b/lms/djangoapps/discussion/management/commands/assign_role.py
index 81427a5521..713f972640 100644
--- a/lms/djangoapps/discussion/management/commands/assign_role.py
+++ b/lms/djangoapps/discussion/management/commands/assign_role.py
@@ -1,6 +1,7 @@
# lint-amnesty, pylint: disable=imported-auth-user, missing-module-docstring
from django.contrib.auth.models import User
-from django.core.management.base import BaseCommand
+from django.core.management.base import BaseCommand, CommandError
+from django.db.models import Q
from openedx.core.djangoapps.django_comment_common.models import Role
@@ -26,10 +27,9 @@ class Command(BaseCommand): # lint-amnesty, pylint: disable=missing-class-docst
role = Role.objects.get(name=role, course_id=course_id)
- if '@' in name_or_email:
- user = User.objects.get(email=name_or_email)
- else:
- user = User.objects.get(username=name_or_email)
+ user = User.objects.filter(Q(email=name_or_email) | Q(username=name_or_email)).first()
+ if not user:
+ raise CommandError(f"User {name_or_email} does not exist.")
if options['remove']:
user.roles.remove(role)
From ac3d6359a0ee953d1fec3d3c69da2a58086e63d2 Mon Sep 17 00:00:00 2001
From: Asad
Date: Wed, 24 Feb 2021 14:35:12 +0500
Subject: [PATCH 28/74] Fixed role note
---
lms/templates/seq_module.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lms/templates/seq_module.html b/lms/templates/seq_module.html
index c27729d700..05123ab22f 100644
--- a/lms/templates/seq_module.html
+++ b/lms/templates/seq_module.html
@@ -10,7 +10,7 @@
% if not exclude_units:
% if banner_text:
-