-<% 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/course_modes/models.py b/common/djangoapps/course_modes/models.py
index 3d2cb7791c..3c9b532753 100644
--- a/common/djangoapps/course_modes/models.py
+++ b/common/djangoapps/course_modes/models.py
@@ -5,8 +5,6 @@ Add and create new modes for running courses on this particular LMS
from collections import defaultdict, namedtuple
from datetime import timedelta
-
-import inspect # lint-amnesty, pylint: disable=unused-import
import logging
import six
from config_models.models import ConfigurationModel
@@ -21,7 +19,6 @@ from django.utils.timezone import now
from django.utils.translation import ugettext_lazy as _
from edx_django_utils.cache import RequestCache
from opaque_keys.edx.django.models import CourseKeyField
-from opaque_keys.edx.keys import CourseKey # lint-amnesty, pylint: disable=unused-import
from simple_history.models import HistoricalRecords
from openedx.core.djangoapps.content.course_overviews.models import CourseOverview
diff --git a/common/djangoapps/course_modes/views.py b/common/djangoapps/course_modes/views.py
index 517d05afa6..389c5a59f7 100644
--- a/common/djangoapps/course_modes/views.py
+++ b/common/djangoapps/course_modes/views.py
@@ -21,7 +21,7 @@ from django.utils.translation import get_language, to_locale
from django.utils.translation import ugettext as _
from django.views.generic.base import View
from edx_django_utils.monitoring.utils import increment
-from ipware.ip import get_ip
+from ipware.ip import get_client_ip
from opaque_keys.edx.keys import CourseKey
from six import text_type
@@ -90,7 +90,7 @@ class ChooseModeView(View):
embargo_redirect = embargo_api.redirect_if_blocked(
course_key,
user=request.user,
- ip_address=get_ip(request),
+ ip_address=get_client_ip(request)[0],
url=request.path
)
if embargo_redirect:
diff --git a/common/djangoapps/edxmako/shortcuts.py b/common/djangoapps/edxmako/shortcuts.py
index 10b3f15918..f51b538aa7 100644
--- a/common/djangoapps/edxmako/shortcuts.py
+++ b/common/djangoapps/edxmako/shortcuts.py
@@ -17,7 +17,7 @@ import logging
import six
from django.conf import settings
-from django.http import Http404, HttpResponse # lint-amnesty, pylint: disable=unused-import
+from django.http import HttpResponse # lint-amnesty, pylint: disable=unused-import
from django.template import engines
from django.urls import reverse, NoReverseMatch
from six.moves.urllib.parse import urljoin
@@ -26,7 +26,6 @@ from django.core.exceptions import ValidationError
from edx_django_utils.monitoring import set_custom_attribute
from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers
-from openedx.core.djangoapps.theming.helpers import is_request_in_themed_site # lint-amnesty, pylint: disable=unused-import
from xmodule.util.xmodule_django import get_current_request_hostname
from . import Engines
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 b6e1b2e4f4..e3d30015ca 100644
--- a/common/djangoapps/entitlements/rest_api/v1/tests/test_views.py
+++ b/common/djangoapps/entitlements/rest_api/v1/tests/test_views.py
@@ -22,7 +22,6 @@ from common.djangoapps.student.tests.factories import TEST_PASSWORD, CourseEnrol
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 xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
@@ -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/api.py b/common/djangoapps/student/api.py
index 4ae91a43d1..6ccdcef748 100644
--- a/common/djangoapps/student/api.py
+++ b/common/djangoapps/student/api.py
@@ -45,6 +45,11 @@ TRANSITION_STATES = (
DEFAULT_TRANSITION_STATE,
)
+MANUAL_ENROLLMENT_ROLE_CHOICES = configuration_helpers.get_value(
+ 'MANUAL_ENROLLMENT_ROLE_CHOICES',
+ settings.MANUAL_ENROLLMENT_ROLE_CHOICES
+)
+
COURSE_DASHBOARD_PLUGIN_VIEW_NAME = "course_dashboard"
@@ -54,6 +59,7 @@ def create_manual_enrollment_audit(
transition_state,
reason,
course_run_key=None,
+ role=None
):
"""
Creates an audit item for a manual enrollment.
@@ -63,10 +69,13 @@ def create_manual_enrollment_audit(
transition_state: state of enrollment transition state from _TRANSITIONS_STATES
reason: Reason why user was manually enrolled
course_run_key: Used to link the audit enrollment to the actual enrollment
+ role: role of the enrolled user from MANUAL_ENROLLMENT_ROLE_CHOICES
Note: We purposefully *exclude* passing items like CourseEnrollment objects to prevent callers from needed to
know about model level code.
"""
+ if role and role not in MANUAL_ENROLLMENT_ROLE_CHOICES:
+ raise ValueError("Role `{}` not in allowed roles: `{}".format(role, MANUAL_ENROLLMENT_ROLE_CHOICES))
if transition_state not in TRANSITION_STATES:
raise ValueError("State `{}` not in allow states: `{}`".format(transition_state, TRANSITION_STATES))
@@ -86,7 +95,8 @@ def create_manual_enrollment_audit(
user_email,
transition_state,
reason,
- enrollment
+ enrollment,
+ role
)
diff --git a/common/djangoapps/student/forms.py b/common/djangoapps/student/forms.py
index b8bbd2e5e4..15f17dbc35 100644
--- a/common/djangoapps/student/forms.py
+++ b/common/djangoapps/student/forms.py
@@ -2,17 +2,10 @@
Utility functions for validating forms
"""
-
-import re # lint-amnesty, pylint: disable=unused-import
-from importlib import import_module # lint-amnesty, pylint: disable=unused-import
-
from django.conf import settings
-from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user, unused-import
from django.contrib.auth.tokens import default_token_generator
-from django.core.exceptions import ValidationError # lint-amnesty, pylint: disable=unused-import
from django.urls import reverse
from django.utils.http import int_to_base36
-from django.utils.translation import ugettext_lazy as _ # lint-amnesty, pylint: disable=unused-import
from edx_ace import ace
from edx_ace.recipient import Recipient
@@ -20,12 +13,9 @@ from openedx.core.djangoapps.ace_common.template_context import get_base_templat
from openedx.core.djangoapps.lang_pref import LANGUAGE_KEY
from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers
from openedx.core.djangoapps.theming.helpers import get_current_site
-from openedx.core.djangoapps.user_api import accounts as accounts_settings # lint-amnesty, pylint: disable=unused-import
-from openedx.core.djangoapps.user_api.accounts.utils import is_secondary_email_feature_enabled # lint-amnesty, pylint: disable=unused-import
from openedx.core.djangoapps.user_authn.toggles import should_redirect_to_authn_microfrontend
from openedx.core.djangoapps.user_api.preferences.api import get_user_preference
from common.djangoapps.student.message_types import AccountRecovery as AccountRecoveryMessage
-from common.djangoapps.student.models import CourseEnrollmentAllowed, email_exists_or_retired # lint-amnesty, pylint: disable=unused-import
def send_account_recovery_email_for_user(user, request, email=None):
diff --git a/common/djangoapps/student/management/commands/bulk_unenroll.py b/common/djangoapps/student/management/commands/bulk_unenroll.py
index 19bbf271b8..451ccefbe0 100644
--- a/common/djangoapps/student/management/commands/bulk_unenroll.py
+++ b/common/djangoapps/student/management/commands/bulk_unenroll.py
@@ -4,7 +4,6 @@ Un-enroll Bulk users course wide as well as specified in csv
import logging
import unicodecsv
-from django.core.exceptions import ObjectDoesNotExist # lint-amnesty, pylint: disable=unused-import
from django.core.management.base import BaseCommand
from opaque_keys import InvalidKeyError
from opaque_keys.edx.keys import CourseKey
diff --git a/common/djangoapps/student/management/commands/recover_account.py b/common/djangoapps/student/management/commands/recover_account.py
index a2b11e7784..55cb3ea6d8 100644
--- a/common/djangoapps/student/management/commands/recover_account.py
+++ b/common/djangoapps/student/management/commands/recover_account.py
@@ -18,6 +18,7 @@ from edx_ace import ace
from edx_ace.recipient import Recipient
from common.djangoapps.student.models import AccountRecoveryConfiguration
+from openedx.core.djangoapps.user_authn.toggles import should_redirect_to_authn_microfrontend
from openedx.core.djangoapps.ace_common.template_context import get_base_template_context
from openedx.core.djangoapps.lang_pref import LANGUAGE_KEY
from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers
@@ -104,12 +105,16 @@ class Command(BaseCommand):
"""
message_context = get_base_template_context(site)
email = user.email
+ if should_redirect_to_authn_microfrontend():
+ site_url = settings.AUTHN_MICROFRONTEND_URL
+ else:
+ site_url = configuration_helpers.get_value('SITE_NAME', settings.SITE_NAME)
message_context.update({
'email': email,
'platform_name': configuration_helpers.get_value('PLATFORM_NAME', settings.PLATFORM_NAME),
- 'reset_link': '{protocol}://{site}{link}?track=pwreset'.format(
+ 'reset_link': '{protocol}://{site_url}{link}?track=pwreset'.format(
protocol='http',
- site=configuration_helpers.get_value('SITE_NAME', settings.SITE_NAME),
+ site_url=site_url,
link=reverse('password_reset_confirm', kwargs={
'uidb36': int_to_base36(user.id),
'token': default_token_generator.make_token(user),
diff --git a/common/djangoapps/student/management/tests/test_recover_account.py b/common/djangoapps/student/management/tests/test_recover_account.py
index 15a0770fd2..cb7333f8fe 100644
--- a/common/djangoapps/student/management/tests/test_recover_account.py
+++ b/common/djangoapps/student/management/tests/test_recover_account.py
@@ -7,17 +7,24 @@ import pytest
import six
from django.core import mail
+from django.conf import settings
from django.contrib.auth import get_user_model
from django.core.management import call_command, CommandError
from django.core.files.uploadedfile import SimpleUploadedFile
-from django.test import TestCase, RequestFactory
+from django.test import TestCase, RequestFactory, override_settings
+
+from edx_toggles.toggles.testutils import override_waffle_flag
from testfixtures import LogCapture
from common.djangoapps.student.tests.factories import UserFactory
-
from common.djangoapps.student.models import AccountRecoveryConfiguration
+from openedx.core.djangolib.testing.utils import skip_unless_lms
+from openedx.core.djangoapps.user_authn.toggles import REDIRECT_TO_AUTHN_MICROFRONTEND
+
LOGGER_NAME = 'common.djangoapps.student.management.commands.recover_account'
+FEATURES_WITH_AUTHN_MFE_ENABLED = settings.FEATURES.copy()
+FEATURES_WITH_AUTHN_MFE_ENABLED['ENABLE_AUTHN_MICROFRONTEND'] = True
class RecoverAccountTests(TestCase):
@@ -65,6 +72,24 @@ class RecoverAccountTests(TestCase):
# try to login with previous password
assert not self.client.login(username=self.user.username, password='password')
+ @override_settings(FEATURES=FEATURES_WITH_AUTHN_MFE_ENABLED)
+ @override_waffle_flag(REDIRECT_TO_AUTHN_MICROFRONTEND, active=True)
+ @skip_unless_lms
+ def test_authn_mfe_url_in_reset_link(self):
+ """
+ send password reset link to learner with authn mfe.
+ :return:
+ """
+
+ with NamedTemporaryFile() as csv:
+ csv = self._write_test_csv(csv, lines=['amy,amy@edx.com,amy@newemail.com\n'])
+ call_command("recover_account", "--csv_file_path={}".format(csv.name))
+
+ assert len(mail.outbox) == 1
+
+ authn_mfe_url = re.findall(settings.AUTHN_MICROFRONTEND_URL, mail.outbox[0].body)[0]
+ self.assertEqual(authn_mfe_url, settings.AUTHN_MICROFRONTEND_URL)
+
def test_file_not_found_error(self):
"""
Test command error raised when csv path is invalid
diff --git a/common/djangoapps/student/migrations/0001_initial.py b/common/djangoapps/student/migrations/0001_initial.py
index fbb2de5736..6cabce5cdd 100644
--- a/common/djangoapps/student/migrations/0001_initial.py
+++ b/common/djangoapps/student/migrations/0001_initial.py
@@ -1,6 +1,3 @@
-# -*- coding: utf-8 -*-
-
-
import django.db.models.deletion
import django.utils.timezone
import django_countries.fields
@@ -75,7 +72,7 @@ class Migration(migrations.Migration):
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('change_date', models.DateTimeField(auto_now_add=True, verbose_name='Change date')),
('enabled', models.BooleanField(default=False, verbose_name='Enabled')),
- ('recent_enrollment_time_delta', models.PositiveIntegerField(default=0, help_text=u"The number of seconds in which a new enrollment is considered 'recent'. Used to display notifications.")),
+ ('recent_enrollment_time_delta', models.PositiveIntegerField(default=0, help_text="The number of seconds in which a new enrollment is considered 'recent'. Used to display notifications.")),
('changed_by', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, editable=False, to=settings.AUTH_USER_MODEL, null=True, verbose_name='Changed by')),
],
options={
@@ -141,9 +138,9 @@ class Migration(migrations.Migration):
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('change_date', models.DateTimeField(auto_now_add=True, verbose_name='Change date')),
('enabled', models.BooleanField(default=False, verbose_name='Enabled')),
- ('company_identifier', models.TextField(help_text=u'The company identifier for the LinkedIn Add-to-Profile button e.g 0_0dPSPyS070e0HsE9HNz_13_d11_')),
- ('dashboard_tracking_code', models.TextField(default=u'', blank=True)),
- ('trk_partner_name', models.CharField(default=u'', help_text=u"Short identifier for the LinkedIn partner used in the tracking code. (Example: 'edx') If no value is provided, tracking codes will not be sent to LinkedIn.", max_length=10, blank=True)),
+ ('company_identifier', models.TextField(help_text='The company identifier for the LinkedIn Add-to-Profile button e.g 0_0dPSPyS070e0HsE9HNz_13_d11_')),
+ ('dashboard_tracking_code', models.TextField(default='', blank=True)),
+ ('trk_partner_name', models.CharField(default='', help_text="Short identifier for the LinkedIn partner used in the tracking code. (Example: 'edx') If no value is provided, tracking codes will not be sent to LinkedIn.", max_length=10, blank=True)),
('changed_by', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, editable=False, to=settings.AUTH_USER_MODEL, null=True, verbose_name='Changed by')),
],
options={
@@ -166,7 +163,7 @@ class Migration(migrations.Migration):
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('enrolled_email', models.CharField(max_length=255, db_index=True)),
('time_stamp', models.DateTimeField(auto_now_add=True, null=True)),
- ('state_transition', models.CharField(max_length=255, choices=[(u'from unenrolled to allowed to enroll', u'from unenrolled to allowed to enroll'), (u'from allowed to enroll to enrolled', u'from allowed to enroll to enrolled'), (u'from enrolled to enrolled', u'from enrolled to enrolled'), (u'from enrolled to unenrolled', u'from enrolled to unenrolled'), (u'from unenrolled to enrolled', u'from unenrolled to enrolled'), (u'from allowed to enroll to enrolled', u'from allowed to enroll to enrolled'), (u'from unenrolled to unenrolled', u'from unenrolled to unenrolled'), (u'N/A', u'N/A')])),
+ ('state_transition', models.CharField(max_length=255, choices=[('from unenrolled to allowed to enroll', 'from unenrolled to allowed to enroll'), ('from allowed to enroll to enrolled', 'from allowed to enroll to enrolled'), ('from enrolled to enrolled', 'from enrolled to enrolled'), ('from enrolled to unenrolled', 'from enrolled to unenrolled'), ('from unenrolled to enrolled', 'from unenrolled to enrolled'), ('from allowed to enroll to enrolled', 'from allowed to enroll to enrolled'), ('from unenrolled to unenrolled', 'from unenrolled to unenrolled'), ('N/A', 'N/A')])),
('reason', models.TextField(null=True)),
('enrolled_by', models.ForeignKey(to=settings.AUTH_USER_MODEL, null=True, on_delete=models.CASCADE)),
('enrollment', models.ForeignKey(to='student.CourseEnrollment', null=True, on_delete=models.CASCADE)),
@@ -186,7 +183,7 @@ class Migration(migrations.Migration):
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('new_email', models.CharField(db_index=True, max_length=255, blank=True)),
- ('activation_key', models.CharField(unique=True, max_length=32, verbose_name=u'activation key', db_index=True)),
+ ('activation_key', models.CharField(unique=True, max_length=32, verbose_name='activation key', db_index=True)),
('user', models.OneToOneField(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)),
],
),
@@ -203,7 +200,7 @@ class Migration(migrations.Migration):
name='Registration',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
- ('activation_key', models.CharField(unique=True, max_length=32, verbose_name=u'activation key', db_index=True)),
+ ('activation_key', models.CharField(unique=True, max_length=32, verbose_name='activation key', db_index=True)),
('user', models.OneToOneField(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)),
],
options={
@@ -216,12 +213,12 @@ class Migration(migrations.Migration):
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('name', models.CharField(db_index=True, max_length=255, blank=True)),
('meta', models.TextField(blank=True)),
- ('courseware', models.CharField(default=u'course.xml', max_length=255, blank=True)),
+ ('courseware', models.CharField(default='course.xml', max_length=255, blank=True)),
('language', models.CharField(db_index=True, max_length=255, blank=True)),
('location', models.CharField(db_index=True, max_length=255, blank=True)),
('year_of_birth', models.IntegerField(db_index=True, null=True, blank=True)),
- ('gender', models.CharField(blank=True, max_length=6, null=True, db_index=True, choices=[(u'm', u'Male'), (u'f', u'Female'), (u'o', u'Other/Prefer Not to Say')])),
- ('level_of_education', models.CharField(blank=True, max_length=6, null=True, db_index=True, choices=[(u'p', u'Doctorate'), (u'm', u"Master's or professional degree"), (u'b', u"Bachelor's degree"), (u'a', u'Associate degree'), (u'hs', u'Secondary/high school'), (u'jhs', u'Junior secondary/junior high/middle school'), (u'el', u'Elementary/primary school'), (u'none', u'No Formal Education'), (u'other', u'Other Education')])),
+ ('gender', models.CharField(blank=True, max_length=6, null=True, db_index=True, choices=[('m', 'Male'), ('f', 'Female'), ('o', 'Other/Prefer Not to Say')])),
+ ('level_of_education', models.CharField(blank=True, max_length=6, null=True, db_index=True, choices=[('p', 'Doctorate'), ('m', "Master's or professional degree"), ('b', "Bachelor's degree"), ('a', 'Associate degree'), ('hs', 'Secondary/high school'), ('jhs', 'Junior secondary/junior high/middle school'), ('el', 'Elementary/primary school'), ('none', 'No Formal Education'), ('other', 'Other Education')])),
('mailing_address', models.TextField(null=True, blank=True)),
('city', models.TextField(null=True, blank=True)),
('country', django_countries.fields.CountryField(blank=True, max_length=2, null=True)),
@@ -247,7 +244,7 @@ class Migration(migrations.Migration):
name='UserStanding',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
- ('account_status', models.CharField(blank=True, max_length=31, choices=[(u'disabled', u'Account Disabled'), (u'enabled', u'Account Enabled')])),
+ ('account_status', models.CharField(blank=True, max_length=31, choices=[('disabled', 'Account Disabled'), ('enabled', 'Account Enabled')])),
('standing_last_changed_at', models.DateTimeField(auto_now=True)),
('changed_by', models.ForeignKey(to=settings.AUTH_USER_MODEL, blank=True, on_delete=models.CASCADE)),
('user', models.OneToOneField(related_name='standing', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)),
@@ -269,22 +266,22 @@ class Migration(migrations.Migration):
),
migrations.AlterUniqueTogether(
name='courseenrollmentallowed',
- unique_together=set([('email', 'course_id')]),
+ unique_together={('email', 'course_id')},
),
migrations.AlterUniqueTogether(
name='languageproficiency',
- unique_together=set([('code', 'user_profile')]),
+ unique_together={('code', 'user_profile')},
),
migrations.AlterUniqueTogether(
name='entranceexamconfiguration',
- unique_together=set([('user', 'course_id')]),
+ unique_together={('user', 'course_id')},
),
migrations.AlterUniqueTogether(
name='courseenrollment',
- unique_together=set([('user', 'course_id')]),
+ unique_together={('user', 'course_id')},
),
migrations.AlterUniqueTogether(
name='courseaccessrole',
- unique_together=set([('user', 'org', 'course_id', 'role')]),
+ unique_together={('user', 'org', 'course_id', 'role')},
),
]
diff --git a/common/djangoapps/student/migrations/0001_squashed_0031_auto_20200317_1122.py b/common/djangoapps/student/migrations/0001_squashed_0031_auto_20200317_1122.py
index c54433a088..400c74e137 100644
--- a/common/djangoapps/student/migrations/0001_squashed_0031_auto_20200317_1122.py
+++ b/common/djangoapps/student/migrations/0001_squashed_0031_auto_20200317_1122.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
# Generated by Django 1.11.29 on 2020-04-13 17:34
@@ -11,14 +10,13 @@ import opaque_keys.edx.django.models
import simple_history.models
from django.conf import settings
from django.db import migrations, models
-from lms.djangoapps.experiments.models import ExperimentData
-from common.djangoapps.student.models import CourseEnrollment, FBEEnrollmentExclusion
import openedx.core.djangolib.model_mixins
from common.djangoapps.course_modes import models as course_modes_models
+from common.djangoapps.student.models import CourseEnrollment, FBEEnrollmentExclusion
+from lms.djangoapps.experiments.models import ExperimentData
from openedx.features.course_duration_limits.config import EXPERIMENT_DATA_HOLDBACK_KEY, EXPERIMENT_ID
-
# These data migrations do not require changes when building from scratch.
# student.migrations.0029_add_data_researcher
# student.migrations.0011_course_key_field_to_foreign_key
@@ -287,15 +285,15 @@ class Migration(migrations.Migration):
),
migrations.AlterUniqueTogether(
name='courseenrollmentallowed',
- unique_together=set([('email', 'course_id')]),
+ unique_together={('email', 'course_id')},
),
migrations.AlterUniqueTogether(
name='languageproficiency',
- unique_together=set([('code', 'user_profile')]),
+ unique_together={('code', 'user_profile')},
),
migrations.AlterUniqueTogether(
name='entranceexamconfiguration',
- unique_together=set([('user', 'course_id')]),
+ unique_together={('user', 'course_id')},
),
migrations.AlterField(
model_name='courseenrollment',
@@ -304,11 +302,11 @@ class Migration(migrations.Migration):
),
migrations.AlterUniqueTogether(
name='courseenrollment',
- unique_together=set([('user', 'course_id')]),
+ unique_together={('user', 'course_id')},
),
migrations.AlterUniqueTogether(
name='courseaccessrole',
- unique_together=set([('user', 'org', 'course_id', 'role')]),
+ unique_together={('user', 'org', 'course_id', 'role')},
),
migrations.CreateModel(
name='UserAttribute',
@@ -323,7 +321,7 @@ class Migration(migrations.Migration):
),
migrations.AlterUniqueTogether(
name='userattribute',
- unique_together=set([('user', 'name')]),
+ unique_together={('user', 'name')},
),
migrations.AlterField(
model_name='userattribute',
@@ -364,7 +362,7 @@ class Migration(migrations.Migration):
),
migrations.AlterUniqueTogether(
name='courseenrollment',
- unique_together=set([('user', 'course')]),
+ unique_together={('user', 'course')},
),
migrations.CreateModel(
name='SocialLink',
diff --git a/common/djangoapps/student/migrations/0002_auto_20151208_1034.py b/common/djangoapps/student/migrations/0002_auto_20151208_1034.py
index 7c0a9519f4..8ea695fb1e 100644
--- a/common/djangoapps/student/migrations/0002_auto_20151208_1034.py
+++ b/common/djangoapps/student/migrations/0002_auto_20151208_1034.py
@@ -1,6 +1,3 @@
-# -*- coding: utf-8 -*-
-
-
from django.db import migrations, models
@@ -14,11 +11,11 @@ class Migration(migrations.Migration):
migrations.AlterField(
model_name='courseenrollment',
name='mode',
- field=models.CharField(default=u'audit', max_length=100),
+ field=models.CharField(default='audit', max_length=100),
),
migrations.AlterField(
model_name='historicalcourseenrollment',
name='mode',
- field=models.CharField(default=u'audit', max_length=100),
+ field=models.CharField(default='audit', max_length=100),
),
]
diff --git a/common/djangoapps/student/migrations/0003_auto_20160516_0938.py b/common/djangoapps/student/migrations/0003_auto_20160516_0938.py
index 73b77a7261..cc97f760e9 100644
--- a/common/djangoapps/student/migrations/0003_auto_20160516_0938.py
+++ b/common/djangoapps/student/migrations/0003_auto_20160516_0938.py
@@ -1,6 +1,3 @@
-# -*- coding: utf-8 -*-
-
-
import django.utils.timezone
import model_utils.fields
from django.conf import settings
@@ -28,6 +25,6 @@ class Migration(migrations.Migration):
),
migrations.AlterUniqueTogether(
name='userattribute',
- unique_together=set([('user', 'name')]),
+ unique_together={('user', 'name')},
),
]
diff --git a/common/djangoapps/student/migrations/0004_auto_20160531_1422.py b/common/djangoapps/student/migrations/0004_auto_20160531_1422.py
index fc43adc288..0e253f80f2 100644
--- a/common/djangoapps/student/migrations/0004_auto_20160531_1422.py
+++ b/common/djangoapps/student/migrations/0004_auto_20160531_1422.py
@@ -1,6 +1,3 @@
-# -*- coding: utf-8 -*-
-
-
from django.db import migrations, models
diff --git a/common/djangoapps/student/migrations/0005_auto_20160531_1653.py b/common/djangoapps/student/migrations/0005_auto_20160531_1653.py
index afeea332db..08ac8b7b75 100644
--- a/common/djangoapps/student/migrations/0005_auto_20160531_1653.py
+++ b/common/djangoapps/student/migrations/0005_auto_20160531_1653.py
@@ -1,6 +1,3 @@
-# -*- coding: utf-8 -*-
-
-
from django.db import migrations, models
diff --git a/common/djangoapps/student/migrations/0006_logoutviewconfiguration.py b/common/djangoapps/student/migrations/0006_logoutviewconfiguration.py
index e124c59d38..1752c6c393 100644
--- a/common/djangoapps/student/migrations/0006_logoutviewconfiguration.py
+++ b/common/djangoapps/student/migrations/0006_logoutviewconfiguration.py
@@ -1,6 +1,3 @@
-# -*- coding: utf-8 -*-
-
-
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
diff --git a/common/djangoapps/student/migrations/0007_registrationcookieconfiguration.py b/common/djangoapps/student/migrations/0007_registrationcookieconfiguration.py
index 7b491063c2..37fbb0b811 100644
--- a/common/djangoapps/student/migrations/0007_registrationcookieconfiguration.py
+++ b/common/djangoapps/student/migrations/0007_registrationcookieconfiguration.py
@@ -1,6 +1,3 @@
-# -*- coding: utf-8 -*-
-
-
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
diff --git a/common/djangoapps/student/migrations/0008_auto_20161117_1209.py b/common/djangoapps/student/migrations/0008_auto_20161117_1209.py
index 37d0cac36c..591dc99229 100644
--- a/common/djangoapps/student/migrations/0008_auto_20161117_1209.py
+++ b/common/djangoapps/student/migrations/0008_auto_20161117_1209.py
@@ -1,6 +1,3 @@
-# -*- coding: utf-8 -*-
-
-
from django.db import migrations, models
@@ -14,6 +11,6 @@ class Migration(migrations.Migration):
migrations.AlterField(
model_name='userprofile',
name='level_of_education',
- field=models.CharField(blank=True, max_length=6, null=True, db_index=True, choices=[(u'p', u'Doctorate'), (u'm', u"Master's or professional degree"), (u'b', u"Bachelor's degree"), (u'a', u'Associate degree'), (u'hs', u'Secondary/high school'), (u'jhs', u'Junior secondary/junior high/middle school'), (u'el', u'Elementary/primary school'), (u'none', u'No formal education'), (u'other', u'Other education')]),
+ field=models.CharField(blank=True, max_length=6, null=True, db_index=True, choices=[('p', 'Doctorate'), ('m', "Master's or professional degree"), ('b', "Bachelor's degree"), ('a', 'Associate degree'), ('hs', 'Secondary/high school'), ('jhs', 'Junior secondary/junior high/middle school'), ('el', 'Elementary/primary school'), ('none', 'No formal education'), ('other', 'Other education')]),
),
]
diff --git a/common/djangoapps/student/migrations/0009_auto_20170111_0422.py b/common/djangoapps/student/migrations/0009_auto_20170111_0422.py
index a093a4a108..412480e94f 100644
--- a/common/djangoapps/student/migrations/0009_auto_20170111_0422.py
+++ b/common/djangoapps/student/migrations/0009_auto_20170111_0422.py
@@ -1,6 +1,3 @@
-# -*- coding: utf-8 -*-
-
-
from django.db import migrations, models
diff --git a/common/djangoapps/student/migrations/0010_auto_20170207_0458.py b/common/djangoapps/student/migrations/0010_auto_20170207_0458.py
index 7e67311af7..93f0038f13 100644
--- a/common/djangoapps/student/migrations/0010_auto_20170207_0458.py
+++ b/common/djangoapps/student/migrations/0010_auto_20170207_0458.py
@@ -1,6 +1,3 @@
-# -*- coding: utf-8 -*-
-
-
from django.db import migrations, models
diff --git a/common/djangoapps/student/migrations/0011_course_key_field_to_foreign_key.py b/common/djangoapps/student/migrations/0011_course_key_field_to_foreign_key.py
index 7c29455628..00cd4eadf0 100644
--- a/common/djangoapps/student/migrations/0011_course_key_field_to_foreign_key.py
+++ b/common/djangoapps/student/migrations/0011_course_key_field_to_foreign_key.py
@@ -1,6 +1,3 @@
-# -*- coding: utf-8 -*-
-
-
import django.db.models.deletion
from django.db import migrations, models
from opaque_keys.edx.django.models import CourseKeyField
@@ -71,6 +68,6 @@ class Migration(migrations.Migration):
),
migrations.AlterUniqueTogether(
name='courseenrollment',
- unique_together=set([('user', 'course')]),
+ unique_together={('user', 'course')},
),
]
diff --git a/common/djangoapps/student/migrations/0012_sociallink.py b/common/djangoapps/student/migrations/0012_sociallink.py
index 73e929d130..4337d11e94 100644
--- a/common/djangoapps/student/migrations/0012_sociallink.py
+++ b/common/djangoapps/student/migrations/0012_sociallink.py
@@ -1,6 +1,3 @@
-# -*- coding: utf-8 -*-
-
-
from django.db import migrations, models
diff --git a/common/djangoapps/student/migrations/0013_delete_historical_enrollment_records.py b/common/djangoapps/student/migrations/0013_delete_historical_enrollment_records.py
index 9ad7793789..d4e924b721 100644
--- a/common/djangoapps/student/migrations/0013_delete_historical_enrollment_records.py
+++ b/common/djangoapps/student/migrations/0013_delete_historical_enrollment_records.py
@@ -1,6 +1,3 @@
-# -*- coding: utf-8 -*-
-
-
from django.db import migrations, models
diff --git a/common/djangoapps/student/migrations/0014_courseenrollmentallowed_user.py b/common/djangoapps/student/migrations/0014_courseenrollmentallowed_user.py
index 261d810127..1f8b315ef4 100644
--- a/common/djangoapps/student/migrations/0014_courseenrollmentallowed_user.py
+++ b/common/djangoapps/student/migrations/0014_courseenrollmentallowed_user.py
@@ -1,6 +1,3 @@
-# -*- coding: utf-8 -*-
-
-
from django.conf import settings
from django.db import migrations, models
diff --git a/common/djangoapps/student/migrations/0015_manualenrollmentaudit_add_role.py b/common/djangoapps/student/migrations/0015_manualenrollmentaudit_add_role.py
index 7d2c2c1dfc..a0d523c448 100644
--- a/common/djangoapps/student/migrations/0015_manualenrollmentaudit_add_role.py
+++ b/common/djangoapps/student/migrations/0015_manualenrollmentaudit_add_role.py
@@ -1,6 +1,3 @@
-# -*- coding: utf-8 -*-
-
-
from django.db import migrations, models
diff --git a/common/djangoapps/student/migrations/0016_coursenrollment_course_on_delete_do_nothing.py b/common/djangoapps/student/migrations/0016_coursenrollment_course_on_delete_do_nothing.py
index b4dc388729..1d1c39b667 100644
--- a/common/djangoapps/student/migrations/0016_coursenrollment_course_on_delete_do_nothing.py
+++ b/common/djangoapps/student/migrations/0016_coursenrollment_course_on_delete_do_nothing.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
# Generated by Django 1.11.14 on 2018-07-27 01:44
diff --git a/common/djangoapps/student/migrations/0017_accountrecovery.py b/common/djangoapps/student/migrations/0017_accountrecovery.py
index 8b505462cd..8347d04357 100644
--- a/common/djangoapps/student/migrations/0017_accountrecovery.py
+++ b/common/djangoapps/student/migrations/0017_accountrecovery.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
# Generated by Django 1.11.16 on 2018-12-10 12:15
diff --git a/common/djangoapps/student/migrations/0018_remove_password_history.py b/common/djangoapps/student/migrations/0018_remove_password_history.py
index 9a232f6124..45e8af5a08 100644
--- a/common/djangoapps/student/migrations/0018_remove_password_history.py
+++ b/common/djangoapps/student/migrations/0018_remove_password_history.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
# Generated by Django 1.11.16 on 2018-12-19 14:30
diff --git a/common/djangoapps/student/migrations/0019_auto_20181221_0540.py b/common/djangoapps/student/migrations/0019_auto_20181221_0540.py
index efe99de60d..4ee9c71e8a 100644
--- a/common/djangoapps/student/migrations/0019_auto_20181221_0540.py
+++ b/common/djangoapps/student/migrations/0019_auto_20181221_0540.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
# Generated by Django 1.11.16 on 2018-12-21 10:40
@@ -22,7 +21,7 @@ class Migration(migrations.Migration):
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('new_secondary_email', models.CharField(blank=True, db_index=True, max_length=255)),
- ('activation_key', models.CharField(db_index=True, max_length=32, unique=True, verbose_name=u'activation key')),
+ ('activation_key', models.CharField(db_index=True, max_length=32, unique=True, verbose_name='activation key')),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
bases=(openedx.core.djangolib.model_mixins.DeletableByUserValue, models.Model),
diff --git a/common/djangoapps/student/migrations/0020_auto_20190227_2019.py b/common/djangoapps/student/migrations/0020_auto_20190227_2019.py
index c670436c63..94fcb996ee 100644
--- a/common/djangoapps/student/migrations/0020_auto_20190227_2019.py
+++ b/common/djangoapps/student/migrations/0020_auto_20190227_2019.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-02-27 20:19
diff --git a/common/djangoapps/student/migrations/0021_historicalcourseenrollment.py b/common/djangoapps/student/migrations/0021_historicalcourseenrollment.py
index 6871558dc1..2c63f9cea3 100644
--- a/common/djangoapps/student/migrations/0021_historicalcourseenrollment.py
+++ b/common/djangoapps/student/migrations/0021_historicalcourseenrollment.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-04-25 20:18
@@ -25,7 +24,7 @@ class Migration(migrations.Migration):
('id', models.IntegerField(auto_created=True, blank=True, db_index=True, verbose_name='ID')),
('created', models.DateTimeField(blank=True, db_index=True, editable=False, null=True)),
('is_active', models.BooleanField(default=True)),
- ('mode', models.CharField(default=u'audit', max_length=100)),
+ ('mode', models.CharField(default='audit', max_length=100)),
('history_id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('history_date', models.DateTimeField()),
('history_change_reason', models.CharField(max_length=100, null=True)),
diff --git a/common/djangoapps/student/migrations/0022_indexing_in_courseenrollment.py b/common/djangoapps/student/migrations/0022_indexing_in_courseenrollment.py
index 5a17f586fd..634725e153 100644
--- a/common/djangoapps/student/migrations/0022_indexing_in_courseenrollment.py
+++ b/common/djangoapps/student/migrations/0022_indexing_in_courseenrollment.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-06-24 19:01
diff --git a/common/djangoapps/student/migrations/0023_bulkunenrollconfiguration.py b/common/djangoapps/student/migrations/0023_bulkunenrollconfiguration.py
index 476fa1b7aa..9ff534d159 100644
--- a/common/djangoapps/student/migrations/0023_bulkunenrollconfiguration.py
+++ b/common/djangoapps/student/migrations/0023_bulkunenrollconfiguration.py
@@ -1,11 +1,10 @@
-# -*- coding: utf-8 -*-
# Generated by Django 1.11.24 on 2019-09-19 19:51
-from django.conf import settings
import django.core.validators
-from django.db import migrations, models
import django.db.models.deletion
+from django.conf import settings
+from django.db import migrations, models
class Migration(migrations.Migration):
@@ -22,7 +21,7 @@ class Migration(migrations.Migration):
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('change_date', models.DateTimeField(auto_now_add=True, verbose_name='Change date')),
('enabled', models.BooleanField(default=False, verbose_name='Enabled')),
- ('csv_file', models.FileField(help_text='It expect that the data will be provided in a csv file format with first row being the header and columns will be as follows: user_id, username, email, course_id, is_verified, verification_date', upload_to=u'', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=[u'csv'])])),
+ ('csv_file', models.FileField(help_text='It expect that the data will be provided in a csv file format with first row being the header and columns will be as follows: user_id, username, email, course_id, is_verified, verification_date', upload_to='', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['csv'])])),
('changed_by', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL, verbose_name='Changed by')),
],
options={
diff --git a/common/djangoapps/student/migrations/0024_fbeenrollmentexclusion.py b/common/djangoapps/student/migrations/0024_fbeenrollmentexclusion.py
index 8448dad173..72316d8e4a 100644
--- a/common/djangoapps/student/migrations/0024_fbeenrollmentexclusion.py
+++ b/common/djangoapps/student/migrations/0024_fbeenrollmentexclusion.py
@@ -1,9 +1,8 @@
-# -*- coding: utf-8 -*-
# Generated by Django 1.11.25 on 2019-11-01 15:56
-from django.db import migrations, models
import django.db.models.deletion
+from django.db import migrations, models
class Migration(migrations.Migration):
diff --git a/common/djangoapps/student/migrations/0025_auto_20191101_1846.py b/common/djangoapps/student/migrations/0025_auto_20191101_1846.py
index 1bdfaee558..d3dfb8dd21 100644
--- a/common/djangoapps/student/migrations/0025_auto_20191101_1846.py
+++ b/common/djangoapps/student/migrations/0025_auto_20191101_1846.py
@@ -1,12 +1,11 @@
-# -*- coding: utf-8 -*-
# Generated by Django 1.11.25 on 2019-11-01 18:46
from django.db import migrations
+from common.djangoapps.student.models import CourseEnrollment, FBEEnrollmentExclusion
from lms.djangoapps.experiments.models import ExperimentData
from openedx.features.course_duration_limits.config import EXPERIMENT_DATA_HOLDBACK_KEY, EXPERIMENT_ID
-from common.djangoapps.student.models import CourseEnrollment, FBEEnrollmentExclusion
def populate_fbeenrollmentexclusion(apps, schema_editor):
diff --git a/common/djangoapps/student/migrations/0026_allowedauthuser.py b/common/djangoapps/student/migrations/0026_allowedauthuser.py
index 4c88e0e424..7d08c1ab23 100644
--- a/common/djangoapps/student/migrations/0026_allowedauthuser.py
+++ b/common/djangoapps/student/migrations/0026_allowedauthuser.py
@@ -1,11 +1,10 @@
-# -*- coding: utf-8 -*-
# Generated by Django 1.11.26 on 2019-11-14 14:12
-from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
import model_utils.fields
+from django.db import migrations, models
class Migration(migrations.Migration):
diff --git a/common/djangoapps/student/migrations/0027_courseenrollment_mode_callable_default.py b/common/djangoapps/student/migrations/0027_courseenrollment_mode_callable_default.py
index aceb9b6acc..b83e4277d0 100644
--- a/common/djangoapps/student/migrations/0027_courseenrollment_mode_callable_default.py
+++ b/common/djangoapps/student/migrations/0027_courseenrollment_mode_callable_default.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
# Generated by Django 1.11.22 on 2019-07-19 13:06
diff --git a/common/djangoapps/student/migrations/0028_historicalmanualenrollmentaudit.py b/common/djangoapps/student/migrations/0028_historicalmanualenrollmentaudit.py
index abf8df2d53..9efaed2703 100644
--- a/common/djangoapps/student/migrations/0028_historicalmanualenrollmentaudit.py
+++ b/common/djangoapps/student/migrations/0028_historicalmanualenrollmentaudit.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
# Generated by Django 1.11.27 on 2019-12-27 20:44
diff --git a/common/djangoapps/student/migrations/0029_add_data_researcher.py b/common/djangoapps/student/migrations/0029_add_data_researcher.py
index 90f9ff98ac..2f5f7fc87a 100644
--- a/common/djangoapps/student/migrations/0029_add_data_researcher.py
+++ b/common/djangoapps/student/migrations/0029_add_data_researcher.py
@@ -1,8 +1,8 @@
-# -*- coding: utf-8 -*-
# Generated by Django 1.11.27 on 2020-01-27 19:02
from django.db import migrations
+
from common.djangoapps.student.models import CourseAccessRole
diff --git a/common/djangoapps/student/migrations/0030_userprofile_phone_number.py b/common/djangoapps/student/migrations/0030_userprofile_phone_number.py
index 81732fc5f8..9b6662dfe2 100644
--- a/common/djangoapps/student/migrations/0030_userprofile_phone_number.py
+++ b/common/djangoapps/student/migrations/0030_userprofile_phone_number.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
# Generated by Django 1.11.28 on 2020-02-18 18:36
diff --git a/common/djangoapps/student/migrations/0031_auto_20200317_1122.py b/common/djangoapps/student/migrations/0031_auto_20200317_1122.py
index 4e9ba1866a..b09eb4aa2a 100644
--- a/common/djangoapps/student/migrations/0031_auto_20200317_1122.py
+++ b/common/djangoapps/student/migrations/0031_auto_20200317_1122.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
# Generated by Django 1.11.29 on 2020-03-17 11:22
diff --git a/common/djangoapps/student/migrations/0032_removed_logout_view_configuration.py b/common/djangoapps/student/migrations/0032_removed_logout_view_configuration.py
index 151968ead5..6c58e370df 100644
--- a/common/djangoapps/student/migrations/0032_removed_logout_view_configuration.py
+++ b/common/djangoapps/student/migrations/0032_removed_logout_view_configuration.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
# Generated by Django 1.11.29 on 2020-03-25 14:28
diff --git a/common/djangoapps/student/migrations/0034_courseenrollmentcelebration.py b/common/djangoapps/student/migrations/0034_courseenrollmentcelebration.py
index 7bf6f3c857..1b420df022 100644
--- a/common/djangoapps/student/migrations/0034_courseenrollmentcelebration.py
+++ b/common/djangoapps/student/migrations/0034_courseenrollmentcelebration.py
@@ -1,9 +1,9 @@
# Generated by Django 2.2.12 on 2020-06-08 15:12
-from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
import model_utils.fields
+from django.db import migrations, models
class Migration(migrations.Migration):
diff --git a/common/djangoapps/student/migrations/0035_bulkchangeenrollmentconfiguration.py b/common/djangoapps/student/migrations/0035_bulkchangeenrollmentconfiguration.py
index d7f2fac075..0f61b03b7b 100644
--- a/common/djangoapps/student/migrations/0035_bulkchangeenrollmentconfiguration.py
+++ b/common/djangoapps/student/migrations/0035_bulkchangeenrollmentconfiguration.py
@@ -1,9 +1,9 @@
# Generated by Django 2.2.14 on 2020-07-16 10:33
-from django.conf import settings
import django.core.validators
-from django.db import migrations, models
import django.db.models.deletion
+from django.conf import settings
+from django.db import migrations, models
class Migration(migrations.Migration):
diff --git a/common/djangoapps/student/migrations/0036_userpasswordtogglehistory.py b/common/djangoapps/student/migrations/0036_userpasswordtogglehistory.py
index 2bcef73f76..2a35dffd58 100644
--- a/common/djangoapps/student/migrations/0036_userpasswordtogglehistory.py
+++ b/common/djangoapps/student/migrations/0036_userpasswordtogglehistory.py
@@ -1,10 +1,10 @@
# Generated by Django 2.2.16 on 2020-10-15 10:19
-from django.conf import settings
-from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
import model_utils.fields
+from django.conf import settings
+from django.db import migrations, models
class Migration(migrations.Migration):
diff --git a/common/djangoapps/student/migrations/0039_anon_id_context.py b/common/djangoapps/student/migrations/0039_anon_id_context.py
index f241d3623c..a646c4e3e4 100644
--- a/common/djangoapps/student/migrations/0039_anon_id_context.py
+++ b/common/djangoapps/student/migrations/0039_anon_id_context.py
@@ -3,8 +3,8 @@
#
# This migration does not produce any changes at the database level.
-from django.db import migrations
import opaque_keys.edx.django.models
+from django.db import migrations
class Migration(migrations.Migration):
diff --git a/common/djangoapps/student/migrations/0040_usercelebration.py b/common/djangoapps/student/migrations/0040_usercelebration.py
index aea99c39c8..3fc75618c2 100644
--- a/common/djangoapps/student/migrations/0040_usercelebration.py
+++ b/common/djangoapps/student/migrations/0040_usercelebration.py
@@ -1,10 +1,10 @@
# Generated by Django 2.2.18 on 2021-02-18 22:49
-from django.conf import settings
-from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
import model_utils.fields
+from django.conf import settings
+from django.db import migrations, models
class Migration(migrations.Migration):
diff --git a/common/djangoapps/student/models.py b/common/djangoapps/student/models.py
index d4d4012e0a..f1ffc97b70 100644
--- a/common/djangoapps/student/models.py
+++ b/common/djangoapps/student/models.py
@@ -76,7 +76,7 @@ from lms.djangoapps.courseware.models import (
OrgDynamicUpgradeDeadlineConfiguration,
)
from lms.djangoapps.courseware.toggles import (
- courseware_mfe_streak_celebration_is_active,
+ streak_celebration_is_active,
COURSEWARE_PROCTORING_IMPROVEMENTS,
)
from lms.djangoapps.verify_student.models import SoftwareSecurePhotoVerification
@@ -2555,9 +2555,10 @@ def log_successful_logout(sender, request, user, **kwargs): # lint-amnesty, pyl
"""Handler to log when logouts have occurred successfully."""
if hasattr(request, 'user'):
if settings.FEATURES['SQUELCH_PII_IN_LOGS']:
- AUDIT_LOG.info(u"Logout - user.id: {0}".format(request.user.id)) # pylint: disable=logging-format-interpolation
+ AUDIT_LOG.info('Logout - user.id: {0}'.format(request.user.id)) # pylint: disable=logging-format-interpolation
else:
- AUDIT_LOG.info(u"Logout - {0}".format(request.user)) # pylint: disable=logging-format-interpolation
+ AUDIT_LOG.info('Logout - {0}'.format(request.user)) # pylint: disable=logging-format-interpolation
+ segment.track(request.user.id, 'edx.bi.user.account.logout')
@receiver(user_logged_in)
@@ -3210,9 +3211,8 @@ class UserCelebration(TimeStampedModel):
def _get_celebration(cls, user, course_key):
""" Retrieve (or create) the celebration for the provided user and course_key """
try:
- # The UI for celebrations is only supported on the MFE right now, so don't turn on
- # celebrations unless this enrollment's course is MFE-enabled and has milestones enabled.
- if not courseware_mfe_streak_celebration_is_active(course_key):
+ # Only enable the streak if milestones and the streak are enabled for this course
+ if not streak_celebration_is_active(course_key):
return None
return user.celebration
except (cls.DoesNotExist, User.celebration.RelatedObjectDoesNotExist): # pylint: disable=no-member
diff --git a/common/djangoapps/student/models_api.py b/common/djangoapps/student/models_api.py
index 20e0363f46..e5a7e51ce5 100644
--- a/common/djangoapps/student/models_api.py
+++ b/common/djangoapps/student/models_api.py
@@ -35,7 +35,8 @@ def create_manual_enrollment_audit( # lint-amnesty, pylint: disable=missing-fun
user_email,
state_transition,
reason,
- course_enrollment
+ course_enrollment,
+ role
):
_ManualEnrollmentAudit.create_manual_enrollment_audit(
user=enrolled_by,
@@ -43,6 +44,7 @@ def create_manual_enrollment_audit( # lint-amnesty, pylint: disable=missing-fun
state_transition=state_transition,
reason=reason,
enrollment=course_enrollment,
+ role=role,
)
diff --git a/common/djangoapps/student/tests/test_admin_views.py b/common/djangoapps/student/tests/test_admin_views.py
index 7e986e32e3..c03cdf840e 100644
--- a/common/djangoapps/student/tests/test_admin_views.py
+++ b/common/djangoapps/student/tests/test_admin_views.py
@@ -9,7 +9,6 @@ import datetime
import ddt
import pytest
import six
-from django.conf import settings # lint-amnesty, pylint: disable=unused-import
from django.contrib.admin.sites import AdminSite
from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user
from django.forms import ValidationError
diff --git a/common/djangoapps/student/tests/test_course_listing.py b/common/djangoapps/student/tests/test_course_listing.py
index 7314be6678..ceaf25f30c 100644
--- a/common/djangoapps/student/tests/test_course_listing.py
+++ b/common/djangoapps/student/tests/test_course_listing.py
@@ -13,7 +13,7 @@ from django.test.client import Client
from milestones.tests.utils import MilestonesTestCaseMixin
from openedx.core.djangoapps.content.course_overviews.models import CourseOverview
-from common.djangoapps.student.models import CourseEnrollment, DashboardConfiguration # lint-amnesty, pylint: disable=unused-import
+from common.djangoapps.student.models import CourseEnrollment # lint-amnesty, pylint: disable=unused-import
from common.djangoapps.student.roles import GlobalStaff
from common.djangoapps.student.tests.factories import UserFactory
from common.djangoapps.student.views import get_course_enrollments
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_password_policy.py b/common/djangoapps/student/tests/test_password_policy.py
index 62980aa7b3..11bbf38b5a 100644
--- a/common/djangoapps/student/tests/test_password_policy.py
+++ b/common/djangoapps/student/tests/test_password_policy.py
@@ -5,15 +5,10 @@ This test file will verify proper password policy enforcement, which is an optio
import json
-
-from django.contrib.auth.models import AnonymousUser # lint-amnesty, pylint: disable=unused-import
from django.test import TestCase
from django.test.client import RequestFactory
from django.test.utils import override_settings
from django.urls import reverse
-from mock import patch # lint-amnesty, pylint: disable=unused-import
-
-from openedx.core.djangoapps.site_configuration.tests.factories import SiteFactory # lint-amnesty, pylint: disable=unused-import
from common.djangoapps.util.password_policy_validators import create_validator_config
diff --git a/common/djangoapps/student/tests/test_recent_enrollments.py b/common/djangoapps/student/tests/test_recent_enrollments.py
index bfc0016631..bc0d71ac0d 100644
--- a/common/djangoapps/student/tests/test_recent_enrollments.py
+++ b/common/djangoapps/student/tests/test_recent_enrollments.py
@@ -15,8 +15,6 @@ from pytz import UTC
from six.moves import range, zip
from common.test.utils import XssTestMixin
-from common.djangoapps.course_modes.tests.factories import CourseModeFactory # lint-amnesty, pylint: disable=unused-import
-from openedx.core.djangoapps.site_configuration.tests.test_util import with_site_configuration_context # lint-amnesty, pylint: disable=unused-import
from common.djangoapps.student.models import CourseEnrollment, DashboardConfiguration
from common.djangoapps.student.tests.factories import UserFactory
from common.djangoapps.student.views import get_course_enrollments
diff --git a/common/djangoapps/student/tests/test_views.py b/common/djangoapps/student/tests/test_views.py
index 7f26e201fc..132eafb3f3 100644
--- a/common/djangoapps/student/tests/test_views.py
+++ b/common/djangoapps/student/tests/test_views.py
@@ -7,7 +7,7 @@ import itertools
import json
import re
import unittest
-from datetime import datetime, timedelta # lint-amnesty, pylint: disable=unused-import
+from datetime import timedelta # lint-amnesty, pylint: disable=unused-import
import ddt
import six
@@ -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/common/djangoapps/student/views/management.py b/common/djangoapps/student/views/management.py
index 0a62a604de..5e5f4c1f2f 100644
--- a/common/djangoapps/student/views/management.py
+++ b/common/djangoapps/student/views/management.py
@@ -29,7 +29,7 @@ from edx_ace import ace
from edx_ace.recipient import Recipient
from edx_django_utils import monitoring as monitoring_utils
from eventtracking import tracker
-from ipware.ip import get_ip
+from ipware.ip import get_client_ip
# Note that this lives in LMS, so this dependency should be refactored.
from opaque_keys import InvalidKeyError
from opaque_keys.edx.keys import CourseKey
@@ -58,7 +58,7 @@ from common.djangoapps.student.message_types import AccountActivation, EmailChan
from common.djangoapps.student.models import ( # lint-amnesty, pylint: disable=unused-import
AccountRecovery,
CourseEnrollment,
- PendingEmailChange,
+ PendingEmailChange, # unimport:skip
PendingSecondaryEmailChange,
Registration,
RegistrationCookieConfiguration,
@@ -94,6 +94,7 @@ REGISTRATION_UTM_PARAMETERS = {
'utm_content': 'registration_utm_content',
}
REGISTRATION_UTM_CREATED_AT = 'registration_utm_created_at'
+USER_ACCOUNT_ACTIVATED = 'edx.user.account.activated'
def csrf_token(context):
@@ -340,7 +341,7 @@ def change_enrollment(request, check_access=True):
# or if the user is enrolling in a country in which the course
# is not available.
redirect_url = embargo_api.redirect_if_blocked(
- course_id, user=user, ip_address=get_ip(request),
+ course_id, user=user, ip_address=get_client_ip(request)[0],
url=request.path
)
if redirect_url:
@@ -529,6 +530,13 @@ def activate_account(request, key):
# Success message for logged in users.
message = _('{html_start}Success{html_end} You have activated your account.')
+ tracker.emit(
+ USER_ACCOUNT_ACTIVATED,
+ {
+ "user_id": registration.user.id,
+ }
+ )
+
if not request.user.is_authenticated:
# Success message for logged out users
message = _(
diff --git a/common/djangoapps/third_party_auth/api/tests/test_permissions.py b/common/djangoapps/third_party_auth/api/tests/test_permissions.py
index 87528cf0e0..4120b06fc5 100644
--- a/common/djangoapps/third_party_auth/api/tests/test_permissions.py
+++ b/common/djangoapps/third_party_auth/api/tests/test_permissions.py
@@ -10,7 +10,6 @@ from django.conf import settings
from django.test import RequestFactory, TestCase
from edx_rest_framework_extensions.auth.jwt.authentication import JwtAuthentication
from edx_rest_framework_extensions.auth.jwt.tests.utils import generate_jwt
-from mock import patch # lint-amnesty, pylint: disable=unused-import
from rest_framework.authentication import SessionAuthentication
from rest_framework.response import Response
from rest_framework.views import APIView
diff --git a/common/djangoapps/third_party_auth/decorators.py b/common/djangoapps/third_party_auth/decorators.py
index 0ac563d902..1cab617795 100644
--- a/common/djangoapps/third_party_auth/decorators.py
+++ b/common/djangoapps/third_party_auth/decorators.py
@@ -6,12 +6,10 @@ Decorators that can be used to interact with third_party_auth.
from functools import wraps
from django.conf import settings
-from django.shortcuts import redirect # lint-amnesty, pylint: disable=unused-import
from django.utils.decorators import available_attrs
-from six.moves.urllib.parse import urlencode, urlparse # lint-amnesty, pylint: disable=unused-import
+from six.moves.urllib.parse import urlparse # lint-amnesty, pylint: disable=unused-import
from common.djangoapps.third_party_auth.models import LTIProviderConfig
-from common.djangoapps.third_party_auth.provider import Registry # lint-amnesty, pylint: disable=unused-import
def xframe_allow_whitelisted(view_func):
diff --git a/common/djangoapps/third_party_auth/saml_configuration/tests/test_saml_configuration.py b/common/djangoapps/third_party_auth/saml_configuration/tests/test_saml_configuration.py
index 49e57ca546..540d73ad86 100644
--- a/common/djangoapps/third_party_auth/saml_configuration/tests/test_saml_configuration.py
+++ b/common/djangoapps/third_party_auth/saml_configuration/tests/test_saml_configuration.py
@@ -1,8 +1,6 @@
"""
Tests for SAMLConfiguration endpoints
"""
-
-import unittest # lint-amnesty, pylint: disable=unused-import
from django.urls import reverse
from django.contrib.sites.models import Site
from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user
@@ -10,7 +8,6 @@ from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imp
from rest_framework import status
from rest_framework.test import APITestCase
from common.djangoapps.third_party_auth.models import SAMLConfiguration
-from common.djangoapps.third_party_auth.tests import testutil # lint-amnesty, pylint: disable=unused-import
from common.djangoapps.third_party_auth.tests.utils import skip_unless_thirdpartyauth
SAML_CONFIGURATIONS = [
{
diff --git a/common/djangoapps/third_party_auth/samlproviderconfig/tests/test_samlproviderconfig.py b/common/djangoapps/third_party_auth/samlproviderconfig/tests/test_samlproviderconfig.py
index 91ef4c2b2a..29ccf53bb1 100644
--- a/common/djangoapps/third_party_auth/samlproviderconfig/tests/test_samlproviderconfig.py
+++ b/common/djangoapps/third_party_auth/samlproviderconfig/tests/test_samlproviderconfig.py
@@ -1,8 +1,6 @@
"""
Tests for SAMLProviderConfig endpoints
"""
-
-import unittest
import copy
from uuid import uuid4
from django.urls import reverse
@@ -16,7 +14,6 @@ from enterprise.models import EnterpriseCustomerIdentityProvider, EnterpriseCust
from enterprise.constants import ENTERPRISE_ADMIN_ROLE, ENTERPRISE_LEARNER_ROLE
from common.djangoapps.third_party_auth.tests.samlutils import set_jwt_cookie
from common.djangoapps.third_party_auth.models import SAMLProviderConfig, SAMLConfiguration
-from common.djangoapps.third_party_auth.tests import testutil
from common.djangoapps.third_party_auth.tests.utils import skip_unless_thirdpartyauth
from common.djangoapps.third_party_auth.utils import convert_saml_slug_provider_id
diff --git a/common/djangoapps/third_party_auth/samlproviderdata/tests/test_samlproviderdata.py b/common/djangoapps/third_party_auth/samlproviderdata/tests/test_samlproviderdata.py
index ad9d14770f..8208d8ae88 100644
--- a/common/djangoapps/third_party_auth/samlproviderdata/tests/test_samlproviderdata.py
+++ b/common/djangoapps/third_party_auth/samlproviderdata/tests/test_samlproviderdata.py
@@ -1,4 +1,3 @@
-import unittest
import copy
import pytz
from uuid import uuid4
@@ -12,8 +11,6 @@ from rest_framework.test import APITestCase
from enterprise.models import EnterpriseCustomer, EnterpriseCustomerIdentityProvider
from enterprise.constants import ENTERPRISE_ADMIN_ROLE, ENTERPRISE_LEARNER_ROLE
-
-from common.djangoapps.third_party_auth.tests import testutil
from common.djangoapps.third_party_auth.models import SAMLProviderData, SAMLProviderConfig
from common.djangoapps.third_party_auth.tests.samlutils import set_jwt_cookie
from common.djangoapps.third_party_auth.tests.utils import skip_unless_thirdpartyauth
diff --git a/common/djangoapps/third_party_auth/tests/specs/test_generic.py b/common/djangoapps/third_party_auth/tests/specs/test_generic.py
index bb05947e63..f02ccd54d2 100644
--- a/common/djangoapps/third_party_auth/tests/specs/test_generic.py
+++ b/common/djangoapps/third_party_auth/tests/specs/test_generic.py
@@ -1,9 +1,6 @@
"""
Use the 'Dummy' auth provider for generic integration tests of third_party_auth.
"""
-
-
-import unittest # lint-amnesty, pylint: disable=unused-import
from common.djangoapps.third_party_auth.tests import testutil
from common.djangoapps.third_party_auth.tests.utils import skip_unless_thirdpartyauth
from .base import IntegrationTestMixin
diff --git a/common/djangoapps/third_party_auth/tests/specs/test_testshib.py b/common/djangoapps/third_party_auth/tests/specs/test_testshib.py
index 12290c4ada..30c8c7c391 100644
--- a/common/djangoapps/third_party_auth/tests/specs/test_testshib.py
+++ b/common/djangoapps/third_party_auth/tests/specs/test_testshib.py
@@ -7,7 +7,6 @@ import datetime
import json
import logging
import os
-import unittest # lint-amnesty, pylint: disable=unused-import
from unittest import skip
import ddt
diff --git a/common/djangoapps/third_party_auth/tests/test_admin.py b/common/djangoapps/third_party_auth/tests/test_admin.py
index 102bba22df..7099911e55 100644
--- a/common/djangoapps/third_party_auth/tests/test_admin.py
+++ b/common/djangoapps/third_party_auth/tests/test_admin.py
@@ -2,9 +2,6 @@
Tests third_party_auth admin views
"""
-
-import unittest # lint-amnesty, pylint: disable=unused-import
-
from django.contrib.admin.sites import AdminSite
from django.core.files.uploadedfile import SimpleUploadedFile
from django.forms import models
diff --git a/common/djangoapps/third_party_auth/tests/test_decorators.py b/common/djangoapps/third_party_auth/tests/test_decorators.py
index 97d6945f22..0a2c732c4d 100644
--- a/common/djangoapps/third_party_auth/tests/test_decorators.py
+++ b/common/djangoapps/third_party_auth/tests/test_decorators.py
@@ -2,11 +2,7 @@
Tests for third_party_auth decorators.
"""
-
-import unittest # lint-amnesty, pylint: disable=unused-import
-
import ddt
-from django.conf import settings # lint-amnesty, pylint: disable=unused-import
from django.http import HttpResponse
from django.test import RequestFactory
diff --git a/common/djangoapps/third_party_auth/tests/test_identityserver3.py b/common/djangoapps/third_party_auth/tests/test_identityserver3.py
index c64f4f1d80..40796070d2 100644
--- a/common/djangoapps/third_party_auth/tests/test_identityserver3.py
+++ b/common/djangoapps/third_party_auth/tests/test_identityserver3.py
@@ -3,8 +3,6 @@ Unit tests for the IdentityServer3 OAuth2 Backend
"""
import json
import ddt
-import pytest # pylint: disable=unused-import
-
from common.djangoapps.third_party_auth.identityserver3 import IdentityServer3
from common.djangoapps.third_party_auth.tests import testutil
from common.djangoapps.third_party_auth.tests.utils import skip_unless_thirdpartyauth
diff --git a/common/djangoapps/third_party_auth/tests/test_pipeline.py b/common/djangoapps/third_party_auth/tests/test_pipeline.py
index be85047d8d..9c3c265de9 100644
--- a/common/djangoapps/third_party_auth/tests/test_pipeline.py
+++ b/common/djangoapps/third_party_auth/tests/test_pipeline.py
@@ -2,7 +2,6 @@
import json
-import unittest # lint-amnesty, pylint: disable=unused-import
import ddt
import mock
diff --git a/common/djangoapps/third_party_auth/tests/test_settings.py b/common/djangoapps/third_party_auth/tests/test_settings.py
index af3d280a3c..a56273759b 100644
--- a/common/djangoapps/third_party_auth/tests/test_settings.py
+++ b/common/djangoapps/third_party_auth/tests/test_settings.py
@@ -1,8 +1,5 @@
"""Unit tests for settings.py."""
-
-import unittest # lint-amnesty, pylint: disable=unused-import
-
from mock import patch
from common.djangoapps.third_party_auth import provider, settings
from common.djangoapps.third_party_auth.tests import testutil
diff --git a/common/djangoapps/third_party_auth/tests/utils.py b/common/djangoapps/third_party_auth/tests/utils.py
index c0f4232d3e..ec3811e9f3 100644
--- a/common/djangoapps/third_party_auth/tests/utils.py
+++ b/common/djangoapps/third_party_auth/tests/utils.py
@@ -36,7 +36,7 @@ class ThirdPartyOAuthTestMixin(ThirdPartyAuthTestMixin):
def setUp(self): # lint-amnesty, pylint: disable=arguments-differ
super(ThirdPartyOAuthTestMixin, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
if self.CREATE_USER:
- self.user = UserFactory()
+ self.user = UserFactory.create(password='secret')
UserSocialAuth.objects.create(user=self.user, provider=self.BACKEND, uid=self.social_uid)
self.oauth_client = self._create_client()
if self.BACKEND == 'google-oauth2':
diff --git a/common/djangoapps/track/middleware.py b/common/djangoapps/track/middleware.py
index 20a84f104a..df125afea3 100644
--- a/common/djangoapps/track/middleware.py
+++ b/common/djangoapps/track/middleware.py
@@ -16,7 +16,7 @@ import six
from django.conf import settings
from django.utils.deprecation import MiddlewareMixin
from eventtracking import tracker
-from ipware.ip import get_ip
+from ipware.ip import get_client_ip
from common.djangoapps.track import contexts, views
@@ -229,7 +229,7 @@ class TrackMiddleware(MiddlewareMixin):
def get_request_ip_address(self, request):
"""Gets the IP address of the request"""
- ip_address = get_ip(request)
+ ip_address = get_client_ip(request)[0]
if ip_address is not None:
return ip_address
else:
diff --git a/common/djangoapps/track/urls.py b/common/djangoapps/track/urls.py
index c74b8e46ba..ed7877f252 100644
--- a/common/djangoapps/track/urls.py
+++ b/common/djangoapps/track/urls.py
@@ -1,9 +1,6 @@
"""
URLs for track app
"""
-
-
-from django.conf import settings # lint-amnesty, pylint: disable=unused-import
from django.conf.urls import url
from . import views
diff --git a/common/djangoapps/track/views/__init__.py b/common/djangoapps/track/views/__init__.py
index 011bb9cc4d..0d6552b527 100644
--- a/common/djangoapps/track/views/__init__.py
+++ b/common/djangoapps/track/views/__init__.py
@@ -6,7 +6,7 @@ import six
from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user
from django.http import HttpResponse
from eventtracking import tracker as eventtracker
-from ipware.ip import get_ip
+from ipware.ip import get_client_ip
from common.djangoapps.track import contexts, shim, tracker
@@ -22,7 +22,7 @@ def _get_request_header(request, header_name, default=''):
def _get_request_ip(request, default=''):
"""Helper method to get IP from a request's META dict, if present."""
if request is not None and hasattr(request, 'META'):
- return get_ip(request)
+ return get_client_ip(request)[0]
else:
return default
diff --git a/common/djangoapps/util/cache.py b/common/djangoapps/util/cache.py
index 5f697c2c23..2dcb18bb51 100644
--- a/common/djangoapps/util/cache.py
+++ b/common/djangoapps/util/cache.py
@@ -10,7 +10,6 @@ not migrating so as not to inconvenience users by logging them all out.
from functools import wraps
import six
-from django.conf import settings # lint-amnesty, pylint: disable=unused-import
from django.core import cache
# If we can't find a 'general' CACHE defined in settings.py, we simply fall back
# to returning the default cache. This will happen with dev machines.
diff --git a/common/djangoapps/util/db.py b/common/djangoapps/util/db.py
index 422b8219bd..594a4d16dd 100644
--- a/common/djangoapps/util/db.py
+++ b/common/djangoapps/util/db.py
@@ -8,9 +8,8 @@ import random
# TransactionManagementError used below actually *does* derive from the standard "Exception" class.
# lint-amnesty, pylint: disable=bad-option-value, nonstandard-exception
from contextlib import contextmanager
-from functools import wraps # lint-amnesty, pylint: disable=unused-import
-from django.db import DEFAULT_DB_ALIAS, DatabaseError, Error, transaction # lint-amnesty, pylint: disable=unused-import
+from django.db import DEFAULT_DB_ALIAS, transaction # lint-amnesty, pylint: disable=unused-import
from openedx.core.lib.cache_utils import get_cache
diff --git a/common/djangoapps/util/memcache.py b/common/djangoapps/util/memcache.py
index 27c3a2b700..9cf7b21bd9 100644
--- a/common/djangoapps/util/memcache.py
+++ b/common/djangoapps/util/memcache.py
@@ -5,10 +5,7 @@ so that we can cache any keys, not just ones that memcache would ordinarily acce
import hashlib
-
-import six.moves.urllib.error
import six.moves.urllib.parse
-import six.moves.urllib.request
from django.utils.encoding import smart_str
diff --git a/common/lib/capa/capa/tests/test_html_render.py b/common/lib/capa/capa/tests/test_html_render.py
index 4bfe49ccae..47638cc19f 100644
--- a/common/lib/capa/capa/tests/test_html_render.py
+++ b/common/lib/capa/capa/tests/test_html_render.py
@@ -10,9 +10,6 @@ import unittest
import ddt
import mock
from lxml import etree
-
-# Changes formatting of empty elements; import here to avoid test order dependence
-import xmodule.modulestore.xml # pylint: disable=unused-import
from capa.tests.helpers import new_loncapa_problem, test_capa_system
from openedx.core.djangolib.markup import HTML
diff --git a/common/lib/capa/capa/tests/test_targeted_feedback.py b/common/lib/capa/capa/tests/test_targeted_feedback.py
index 628279df9a..9161fc18cd 100644
--- a/common/lib/capa/capa/tests/test_targeted_feedback.py
+++ b/common/lib/capa/capa/tests/test_targeted_feedback.py
@@ -6,9 +6,6 @@ i.e. those with the element
import textwrap
import unittest
-
-# Changes formatting of empty elements; import here to avoid test order dependence
-import xmodule.modulestore.xml # pylint: disable=unused-import
from capa.tests.helpers import load_fixture, new_loncapa_problem, test_capa_system
diff --git a/common/lib/conftest.py b/common/lib/conftest.py
index 03bd8596e5..daab9ba264 100644
--- a/common/lib/conftest.py
+++ b/common/lib/conftest.py
@@ -7,8 +7,6 @@ import pytest
from safe_lxml import defuse_xml_libs
-from openedx.core.pytest_hooks import pytest_configure # pylint: disable=unused-import
-
defuse_xml_libs()
diff --git a/common/lib/symmath/symmath/formula.py b/common/lib/symmath/symmath/formula.py
index d72389b72c..1169113251 100644
--- a/common/lib/symmath/symmath/formula.py
+++ b/common/lib/symmath/symmath/formula.py
@@ -21,7 +21,6 @@ import unicodedata
#import subprocess
from copy import deepcopy
from functools import reduce
-from xml.sax.saxutils import unescape # lint-amnesty, pylint: disable=unused-import
import six
import sympy
diff --git a/common/test/acceptance/fixtures/base.py b/common/test/acceptance/fixtures/base.py
index f415e11f48..6b4a3b15f2 100644
--- a/common/test/acceptance/fixtures/base.py
+++ b/common/test/acceptance/fixtures/base.py
@@ -6,7 +6,6 @@ Common code shared by course and library fixtures.
import json
import requests
-import six # lint-amnesty, pylint: disable=unused-import
from lazy import lazy
from common.test.acceptance.fixtures import STUDIO_BASE_URL
diff --git a/common/test/acceptance/pages/lms/video/video.py b/common/test/acceptance/pages/lms/video/video.py
index 55ce59e76f..91a234d0c2 100644
--- a/common/test/acceptance/pages/lms/video/video.py
+++ b/common/test/acceptance/pages/lms/video/video.py
@@ -7,7 +7,7 @@ import logging
from bok_choy.javascript import js_defined, wait_for_js
from bok_choy.page_object import PageObject
-from bok_choy.promise import EmptyPromise, Promise # lint-amnesty, pylint: disable=unused-import
+from bok_choy.promise import EmptyPromise # lint-amnesty, pylint: disable=unused-import
log = logging.getLogger('VideoPage')
diff --git a/common/test/acceptance/pages/studio/overview.py b/common/test/acceptance/pages/studio/overview.py
index 409e5e12cb..bc6d7b5ff0 100644
--- a/common/test/acceptance/pages/studio/overview.py
+++ b/common/test/acceptance/pages/studio/overview.py
@@ -3,7 +3,7 @@ Course Outline page in Studio.
"""
-from bok_choy.javascript import js_defined, wait_for_js # lint-amnesty, pylint: disable=unused-import
+from bok_choy.javascript import js_defined # lint-amnesty, pylint: disable=unused-import
from bok_choy.page_object import PageObject
from bok_choy.promise import EmptyPromise
from selenium.webdriver.support.ui import Select
diff --git a/common/test/acceptance/tests/discussion/test_discussion.py b/common/test/acceptance/tests/discussion/test_discussion.py
index b37ae7180a..a0cbd83e49 100644
--- a/common/test/acceptance/tests/discussion/test_discussion.py
+++ b/common/test/acceptance/tests/discussion/test_discussion.py
@@ -7,17 +7,19 @@ from uuid import uuid4
import pytest
-from common.test.acceptance.fixtures.course import CourseFixture, XBlockFixtureDesc # lint-amnesty, pylint: disable=unused-import
+from common.test.acceptance.fixtures.course import CourseFixture # lint-amnesty, pylint: disable=unused-import
from common.test.acceptance.fixtures.discussion import (
Comment,
Response,
SingleThreadViewFixture,
Thread,
+
)
from common.test.acceptance.pages.common.auto_auth import AutoAuthPage
from common.test.acceptance.pages.lms.discussion import (
DiscussionTabHomePage,
DiscussionTabSingleThreadPage,
+
)
from common.test.acceptance.tests.discussion.helpers import BaseDiscussionMixin, BaseDiscussionTestCase
from common.test.acceptance.tests.helpers import UniqueCourseTest
diff --git a/common/test/acceptance/tests/helpers.py b/common/test/acceptance/tests/helpers.py
index de03eef29d..f3f4c8cff7 100644
--- a/common/test/acceptance/tests/helpers.py
+++ b/common/test/acceptance/tests/helpers.py
@@ -19,12 +19,12 @@ from bok_choy.promise import EmptyPromise, Promise
from bok_choy.web_app_test import WebAppTest
from opaque_keys.edx.locator import CourseLocator
from path import Path as path
-from pymongo import ASCENDING, MongoClient # lint-amnesty, pylint: disable=unused-import
+from pymongo import MongoClient # lint-amnesty, pylint: disable=unused-import
from selenium.common.exceptions import StaleElementReferenceException
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.ui import WebDriverWait
-from six.moves import range, zip # lint-amnesty, pylint: disable=unused-import
+from six.moves import range # lint-amnesty, pylint: disable=unused-import
from capa.tests.response_xml_factory import MultipleChoiceResponseXMLFactory
from common.test.acceptance.fixtures.course import XBlockFixtureDesc
diff --git a/common/test/conftest.py b/common/test/conftest.py
index 055da4ea8a..32b122bbca 100644
--- a/common/test/conftest.py
+++ b/common/test/conftest.py
@@ -1,9 +1,4 @@
"""Code run by pylint before running any tests."""
-
-# Patch the xml libs before anything else.
-
-
-from openedx.core.pytest_hooks import pytest_configure # pylint: disable=unused-import
from safe_lxml import defuse_xml_libs
defuse_xml_libs()
diff --git a/common/test/db_cache/bok_choy_migrations.sha1 b/common/test/db_cache/bok_choy_migrations.sha1
index 13846898d3..141d3a1759 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
+c4a7790413ee6ca1e3eabb9de0024a0b5c2a3ac7
\ 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..fec8bbb1ea 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'),(838,'lti_consumer','0009_backfill-empty-string-config-id','2021-02-25 00:39:43.357746');
/*!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..1a66540040 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'),(838,'lti_consumer','0009_backfill-empty-string-config-id','2021-02-25 00:40:07.152334');
/*!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..1ddf7b47e4 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=839 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..94c00c8bcc 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=839 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
diff --git a/common/test/utils.py b/common/test/utils.py
index f1744f3f51..54a03b7d8f 100644
--- a/common/test/utils.py
+++ b/common/test/utils.py
@@ -6,8 +6,6 @@ General testing utilities.
import functools
import sys
from contextlib import contextmanager
-
-import pytest # lint-amnesty, pylint: disable=unused-import
from django.dispatch import Signal
from markupsafe import escape
from mock import Mock, patch
diff --git a/import_shims/lms/course_home_api/utils.py b/import_shims/lms/course_home_api/utils.py
deleted file mode 100644
index 3d80ec6b1f..0000000000
--- a/import_shims/lms/course_home_api/utils.py
+++ /dev/null
@@ -1,8 +0,0 @@
-"""Deprecated import support. Auto-generated by import_shims/generate_shims.sh."""
-# pylint: disable=redefined-builtin,wrong-import-position,wildcard-import,useless-suppression,line-too-long
-
-from import_shims.warn import warn_deprecated_import
-
-warn_deprecated_import('course_home_api.utils', 'lms.djangoapps.course_home_api.utils')
-
-from lms.djangoapps.course_home_api.utils import *
diff --git a/import_shims/lms/courseware/url_helpers.py b/import_shims/lms/courseware/url_helpers.py
deleted file mode 100644
index c70e3cd9c4..0000000000
--- a/import_shims/lms/courseware/url_helpers.py
+++ /dev/null
@@ -1,8 +0,0 @@
-"""Deprecated import support. Auto-generated by import_shims/generate_shims.sh."""
-# pylint: disable=redefined-builtin,wrong-import-position,wildcard-import,useless-suppression,line-too-long
-
-from import_shims.warn import warn_deprecated_import
-
-warn_deprecated_import('courseware.url_helpers', 'lms.djangoapps.courseware.url_helpers')
-
-from lms.djangoapps.courseware.url_helpers import *
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/djangoapps/badges/admin.py b/lms/djangoapps/badges/admin.py
index 0d87f3bb7f..fc8e40d263 100644
--- a/lms/djangoapps/badges/admin.py
+++ b/lms/djangoapps/badges/admin.py
@@ -3,7 +3,7 @@ Admin registration for Badge Models
"""
-from config_models.admin import ConfigurationModelAdmin # lint-amnesty, pylint: disable=import-error
+from config_models.admin import ConfigurationModelAdmin
from django.contrib import admin
from lms.djangoapps.badges.models import BadgeClass, CourseCompleteImageConfiguration, CourseEventBadgesConfiguration
diff --git a/lms/djangoapps/badges/api/serializers.py b/lms/djangoapps/badges/api/serializers.py
index 5639954285..2bcdd740eb 100644
--- a/lms/djangoapps/badges/api/serializers.py
+++ b/lms/djangoapps/badges/api/serializers.py
@@ -3,7 +3,7 @@ Serializers for Badges
"""
-from rest_framework import serializers # lint-amnesty, pylint: disable=import-error
+from rest_framework import serializers
from lms.djangoapps.badges.models import BadgeAssertion, BadgeClass
@@ -14,7 +14,7 @@ class BadgeClassSerializer(serializers.ModelSerializer):
"""
image_url = serializers.ImageField(source='image')
- class Meta(object):
+ class Meta:
model = BadgeClass
fields = ('slug', 'issuing_component', 'display_name', 'course_id', 'description', 'criteria', 'image_url')
@@ -25,6 +25,6 @@ class BadgeAssertionSerializer(serializers.ModelSerializer):
"""
badge_class = BadgeClassSerializer(read_only=True)
- class Meta(object):
+ class Meta:
model = BadgeAssertion
fields = ('badge_class', 'image_url', 'assertion_url', 'created')
diff --git a/lms/djangoapps/badges/api/tests.py b/lms/djangoapps/badges/api/tests.py
index 8a91327b42..5529f83120 100644
--- a/lms/djangoapps/badges/api/tests.py
+++ b/lms/djangoapps/badges/api/tests.py
@@ -3,18 +3,16 @@ Tests for the badges API views.
"""
-import six
-from ddt import data, ddt, unpack # lint-amnesty, pylint: disable=import-error
+from ddt import data, ddt, unpack
from django.conf import settings
from django.test.utils import override_settings
-from six.moves import range
-from lms.djangoapps.badges.tests.factories import BadgeAssertionFactory, BadgeClassFactory, RandomBadgeClassFactory
-from openedx.core.lib.api.test_utils import ApiTestCase
from common.djangoapps.student.tests.factories import UserFactory
from common.djangoapps.util.testing import UrlResetMixin
-from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase # lint-amnesty, pylint: disable=import-error, wrong-import-order
-from xmodule.modulestore.tests.factories import CourseFactory # lint-amnesty, pylint: disable=import-error, wrong-import-order
+from lms.djangoapps.badges.tests.factories import BadgeAssertionFactory, BadgeClassFactory, RandomBadgeClassFactory
+from openedx.core.lib.api.test_utils import ApiTestCase
+from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
+from xmodule.modulestore.tests.factories import CourseFactory
FEATURES_WITH_BADGES_ENABLED = settings.FEATURES.copy()
FEATURES_WITH_BADGES_ENABLED['ENABLE_OPENBADGES'] = True
@@ -27,7 +25,7 @@ class UserAssertionTestCase(UrlResetMixin, ModuleStoreTestCase, ApiTestCase):
"""
def setUp(self):
- super(UserAssertionTestCase, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
+ super().setUp()
self.course = CourseFactory.create()
self.user = UserFactory.create()
# Password defined by factory.
@@ -37,7 +35,7 @@ class UserAssertionTestCase(UrlResetMixin, ModuleStoreTestCase, ApiTestCase):
"""
Return the URL to look up the current user's assertions.
"""
- return '/api/badges/v1/assertions/user/{}/'.format(self.user.username)
+ return f'/api/badges/v1/assertions/user/{self.user.username}/'
def check_class_structure(self, badge_class, json_class):
"""
@@ -48,7 +46,7 @@ class UserAssertionTestCase(UrlResetMixin, ModuleStoreTestCase, ApiTestCase):
assert badge_class.image.url in json_class['image_url']
assert badge_class.description == json_class['description']
assert badge_class.criteria == json_class['criteria']
- assert (badge_class.course_id and six.text_type(badge_class.course_id)) == json_class['course_id']
+ assert (badge_class.course_id and str(badge_class.course_id)) == json_class['course_id']
def check_assertion_structure(self, assertion, json_assertion):
"""
@@ -65,7 +63,7 @@ class UserAssertionTestCase(UrlResetMixin, ModuleStoreTestCase, ApiTestCase):
if wildcard:
return '*'
else:
- return six.text_type(badge_class.course_id)
+ return str(badge_class.course_id)
def create_badge_class(self, check_course, **kwargs):
"""
diff --git a/lms/djangoapps/badges/api/views.py b/lms/djangoapps/badges/api/views.py
index f568e99c13..b5b5b9cac4 100644
--- a/lms/djangoapps/badges/api/views.py
+++ b/lms/djangoapps/badges/api/views.py
@@ -3,12 +3,13 @@ API views for badges
"""
-from edx_rest_framework_extensions.auth.session.authentication import SessionAuthenticationAllowInactiveUser # lint-amnesty, pylint: disable=import-error
-from opaque_keys import InvalidKeyError # lint-amnesty, pylint: disable=import-error
-from opaque_keys.edx.django.models import CourseKeyField # lint-amnesty, pylint: disable=import-error
-from opaque_keys.edx.keys import CourseKey # lint-amnesty, pylint: disable=import-error
-from rest_framework import generics # lint-amnesty, pylint: disable=import-error
-from rest_framework.exceptions import APIException # lint-amnesty, pylint: disable=import-error
+from edx_rest_framework_extensions.auth.session.authentication import \
+ SessionAuthenticationAllowInactiveUser
+from opaque_keys import InvalidKeyError
+from opaque_keys.edx.django.models import CourseKeyField
+from opaque_keys.edx.keys import CourseKey
+from rest_framework import generics
+from rest_framework.exceptions import APIException
from lms.djangoapps.badges.models import BadgeAssertion
from openedx.core.djangoapps.user_api.permissions import is_field_shared_factory
diff --git a/lms/djangoapps/badges/apps.py b/lms/djangoapps/badges/apps.py
index f76094a905..4380a609b2 100644
--- a/lms/djangoapps/badges/apps.py
+++ b/lms/djangoapps/badges/apps.py
@@ -12,7 +12,7 @@ class BadgesConfig(AppConfig):
"""
Application Configuration for Badges.
"""
- name = u'lms.djangoapps.badges'
+ name = 'lms.djangoapps.badges'
def ready(self):
"""
diff --git a/lms/djangoapps/badges/backends/badgr.py b/lms/djangoapps/badges/backends/badgr.py
index 64e15474cc..829d1d7514 100644
--- a/lms/djangoapps/badges/backends/badgr.py
+++ b/lms/djangoapps/badges/backends/badgr.py
@@ -7,11 +7,10 @@ import hashlib
import logging
import mimetypes
-import requests # lint-amnesty, pylint: disable=import-error
-import six
+import requests
from django.conf import settings
from django.core.exceptions import ImproperlyConfigured
-from eventtracking import tracker # lint-amnesty, pylint: disable=import-error
+from eventtracking import tracker
from lazy import lazy # lint-amnesty, pylint: disable=no-name-in-module
from requests.packages.urllib3.exceptions import HTTPError # lint-amnesty, pylint: disable=import-error
@@ -29,7 +28,7 @@ class BadgrBackend(BadgeBackend):
badges = []
def __init__(self):
- super(BadgrBackend, self).__init__() # lint-amnesty, pylint: disable=super-with-arguments
+ super().__init__()
if not settings.BADGR_API_TOKEN:
raise ImproperlyConfigured("BADGR_API_TOKEN not set.")
@@ -38,20 +37,20 @@ class BadgrBackend(BadgeBackend):
"""
Base URL for all API requests.
"""
- return "{}/v1/issuer/issuers/{}".format(settings.BADGR_BASE_URL, settings.BADGR_ISSUER_SLUG)
+ return f"{settings.BADGR_BASE_URL}/v1/issuer/issuers/{settings.BADGR_ISSUER_SLUG}"
@lazy
def _badge_create_url(self):
"""
URL for generating a new Badge specification
"""
- return "{}/badges".format(self._base_url)
+ return f"{self._base_url}/badges"
def _badge_url(self, slug):
"""
Get the URL for a course's badge in a given mode.
"""
- return "{}/{}".format(self._badge_create_url, slug)
+ return f"{self._badge_create_url}/{slug}"
def _assertion_url(self, slug):
"""
@@ -67,7 +66,7 @@ class BadgrBackend(BadgeBackend):
if badge_class.issuing_component and badge_class.course_id:
# Make this unique to the course, and down to 64 characters.
# We don't do this to badges without issuing_component set for backwards compatibility.
- slug = hashlib.sha256((slug + six.text_type(badge_class.course_id)).encode('utf-8')).hexdigest()
+ slug = hashlib.sha256((slug + str(badge_class.course_id)).encode('utf-8')).hexdigest()
if len(slug) > MAX_SLUG_LENGTH:
# Will be 64 characters.
slug = hashlib.sha256(slug).hexdigest()
@@ -81,9 +80,9 @@ class BadgrBackend(BadgeBackend):
response.raise_for_status()
except HTTPError:
LOGGER.error(
- u"Encountered an error when contacting the Badgr-Server. Request sent to %r with headers %r.\n"
- u"and data values %r\n"
- u"Response status was %s.\n%s",
+ "Encountered an error when contacting the Badgr-Server. Request sent to %r with headers %r.\n"
+ "and data values %r\n"
+ "Response status was %s.\n%s",
response.request.url, response.request.headers,
data,
response.status_code, response.content
@@ -100,8 +99,8 @@ class BadgrBackend(BadgeBackend):
content_type, __ = mimetypes.guess_type(image.name)
if not content_type:
raise ValueError(
- u"Could not determine content-type of image! Make sure it is a properly named .png file. "
- u"Filename was: {}".format(image.name)
+ "Could not determine content-type of image! Make sure it is a properly named .png file. "
+ "Filename was: {}".format(image.name)
)
files = {'image': (image.name, image, content_type)}
data = {
@@ -126,7 +125,7 @@ class BadgrBackend(BadgeBackend):
'badge_slug': assertion.badge_class.slug,
'badge_name': assertion.badge_class.display_name,
'issuing_component': assertion.badge_class.issuing_component,
- 'course_id': six.text_type(assertion.badge_class.course_id),
+ 'course_id': str(assertion.badge_class.course_id),
'enrollment_mode': assertion.badge_class.mode,
'assertion_id': assertion.id,
'assertion_image_url': assertion.image_url,
@@ -162,7 +161,7 @@ class BadgrBackend(BadgeBackend):
"""
Headers to send along with the request-- used for authentication.
"""
- return {'Authorization': u'Token {}'.format(settings.BADGR_API_TOKEN)}
+ return {'Authorization': f'Token {settings.BADGR_API_TOKEN}'}
def _ensure_badge_created(self, badge_class):
"""
diff --git a/lms/djangoapps/badges/backends/base.py b/lms/djangoapps/badges/backends/base.py
index 7aae363a99..868ef0df74 100644
--- a/lms/djangoapps/badges/backends/base.py
+++ b/lms/djangoapps/badges/backends/base.py
@@ -5,10 +5,8 @@ Base class for badge backends.
from abc import ABCMeta, abstractmethod
-import six
-
-class BadgeBackend(six.with_metaclass(ABCMeta, object)):
+class BadgeBackend(metaclass=ABCMeta):
"""
Defines the interface for badging backends.
"""
diff --git a/lms/djangoapps/badges/backends/tests/test_badgr_backend.py b/lms/djangoapps/badges/backends/tests/test_badgr_backend.py
index 39a09bf428..f970d6f5ef 100644
--- a/lms/djangoapps/badges/backends/tests/test_badgr_backend.py
+++ b/lms/djangoapps/badges/backends/tests/test_badgr_backend.py
@@ -4,22 +4,21 @@ Tests for BadgrBackend
from datetime import datetime
+from unittest.mock import Mock, call, patch
-import ddt # lint-amnesty, pylint: disable=import-error
-import six
+import ddt
from django.db.models.fields.files import ImageFieldFile
from django.test.utils import override_settings
-from lazy.lazy import lazy # lint-amnesty, pylint: disable=import-error, no-name-in-module
-from mock import Mock, call, patch # lint-amnesty, pylint: disable=import-error
+from lazy.lazy import lazy # lint-amnesty, pylint: disable=no-name-in-module
+from common.djangoapps.student.tests.factories import CourseEnrollmentFactory, UserFactory
+from common.djangoapps.track.tests import EventTrackingTestCase
from lms.djangoapps.badges.backends.badgr import BadgrBackend
from lms.djangoapps.badges.models import BadgeAssertion
from lms.djangoapps.badges.tests.factories import BadgeClassFactory
from openedx.core.lib.tests.assertions.events import assert_event_matches
-from common.djangoapps.student.tests.factories import CourseEnrollmentFactory, UserFactory
-from common.djangoapps.track.tests import EventTrackingTestCase
-from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase # lint-amnesty, pylint: disable=import-error, wrong-import-order
-from xmodule.modulestore.tests.factories import CourseFactory # lint-amnesty, pylint: disable=import-error, wrong-import-order
+from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
+from xmodule.modulestore.tests.factories import CourseFactory
BADGR_SETTINGS = {
'BADGR_API_TOKEN': '12345',
@@ -43,7 +42,7 @@ class BadgrBackendTestCase(ModuleStoreTestCase, EventTrackingTestCase):
"""
Create a course and user to test with.
"""
- super(BadgrBackendTestCase, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
+ super().setUp()
# Need key to be deterministic to test slugs.
self.course = CourseFactory.create(
org='edX', course='course_test', run='test_run', display_name='Badged',
@@ -182,7 +181,7 @@ class BadgrBackendTestCase(ModuleStoreTestCase, EventTrackingTestCase):
'name': 'edx.badge.assertion.created',
'data': {
'user_id': self.user.id,
- 'course_id': six.text_type(self.course.location.course_key),
+ 'course_id': str(self.course.location.course_key),
'enrollment_mode': 'honor',
'assertion_id': assertion.id,
'badge_name': 'Test Badge',
diff --git a/lms/djangoapps/badges/events/course_complete.py b/lms/djangoapps/badges/events/course_complete.py
index 945711645f..5551e7330d 100644
--- a/lms/djangoapps/badges/events/course_complete.py
+++ b/lms/djangoapps/badges/events/course_complete.py
@@ -6,16 +6,13 @@ Helper functions for the course complete event that was originally included with
import hashlib
import logging
-import six
-
from django.urls import reverse
from django.utils.text import slugify
from django.utils.translation import ugettext_lazy as _
from lms.djangoapps.badges.models import BadgeAssertion, BadgeClass, CourseCompleteImageConfiguration
from lms.djangoapps.badges.utils import requires_badges_enabled, site_prefix
-from xmodule.modulestore.django import modulestore # lint-amnesty, pylint: disable=import-error, wrong-import-order
-
+from xmodule.modulestore.django import modulestore
LOGGER = logging.getLogger(__name__)
@@ -35,9 +32,9 @@ def course_slug(course_key, mode):
"""
# Seven digits should be enough to realistically avoid collisions. That's what git services use.
digest = hashlib.sha256(
- u"{}{}".format(six.text_type(course_key), six.text_type(mode)).encode('utf-8')
+ "{}{}".format(str(course_key), str(mode)).encode('utf-8')
).hexdigest()[:7]
- base_slug = slugify(six.text_type(course_key) + u'_{}_'.format(mode))[:248]
+ base_slug = slugify(str(course_key) + f'_{mode}_')[:248]
return base_slug + digest
@@ -46,14 +43,14 @@ def badge_description(course, mode):
Returns a description for the earned badge.
"""
if course.end:
- return _(u'Completed the course "{course_name}" ({course_mode}, {start_date} - {end_date})').format(
+ return _('Completed the course "{course_name}" ({course_mode}, {start_date} - {end_date})').format(
start_date=course.start.date(),
end_date=course.end.date(),
course_name=course.display_name,
course_mode=mode,
)
else:
- return _(u'Completed the course "{course_name}" ({course_mode})').format(
+ return _('Completed the course "{course_name}" ({course_mode})').format(
course_name=course.display_name,
course_mode=mode,
)
@@ -64,7 +61,7 @@ def evidence_url(user_id, course_key):
Generates a URL to the user's Certificate HTML view, along with a GET variable that will signal the evidence visit
event.
"""
- course_id = six.text_type(course_key)
+ course_id = str(course_key)
# avoid circular import problems
from lms.djangoapps.certificates.models import GeneratedCertificate
cert = GeneratedCertificate.eligible_certificates.get(user__id=int(user_id), course_id=course_id)
@@ -76,8 +73,8 @@ def criteria(course_key):
"""
Constructs the 'criteria' URL from the course about page.
"""
- about_path = reverse('about_course', kwargs={'course_id': six.text_type(course_key)})
- return u'{}{}'.format(site_prefix(), about_path)
+ about_path = reverse('about_course', kwargs={'course_id': str(course_key)})
+ return f'{site_prefix()}{about_path}'
def get_completion_badge(course_id, user):
diff --git a/lms/djangoapps/badges/events/tests/test_course_complete.py b/lms/djangoapps/badges/events/tests/test_course_complete.py
index 6506b10de4..73f449e014 100644
--- a/lms/djangoapps/badges/events/tests/test_course_complete.py
+++ b/lms/djangoapps/badges/events/tests/test_course_complete.py
@@ -4,11 +4,11 @@ Tests for the course completion helper functions.
from datetime import datetime
from uuid import uuid4
+from common.djangoapps.student.tests.factories import UserFactory
from lms.djangoapps.badges.events import course_complete
from lms.djangoapps.certificates.models import GeneratedCertificate
-from common.djangoapps.student.tests.factories import UserFactory
-from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase # lint-amnesty, pylint: disable=import-error, wrong-import-order
-from xmodule.modulestore.tests.factories import CourseFactory # lint-amnesty, pylint: disable=import-error, wrong-import-order
+from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
+from xmodule.modulestore.tests.factories import CourseFactory
class CourseCompleteTestCase(ModuleStoreTestCase):
@@ -17,7 +17,7 @@ class CourseCompleteTestCase(ModuleStoreTestCase):
"""
def setUp(self):
- super(CourseCompleteTestCase, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
+ super().setUp()
# Need key to be deterministic to test slugs.
self.course = CourseFactory.create(
org='edX', course='course_test', run='test_run', display_name='Badged',
diff --git a/lms/djangoapps/badges/events/tests/test_course_meta.py b/lms/djangoapps/badges/events/tests/test_course_meta.py
index e1007b5fcb..d21b166d88 100644
--- a/lms/djangoapps/badges/events/tests/test_course_meta.py
+++ b/lms/djangoapps/badges/events/tests/test_course_meta.py
@@ -3,19 +3,18 @@ Tests the course meta badging events
"""
-import six
-from six.moves import range, zip
-from ddt import data, ddt, unpack # lint-amnesty, pylint: disable=import-error
+from unittest.mock import patch
+
+from ddt import data, ddt, unpack
from django.conf import settings
from django.test.utils import override_settings
-from mock import patch # lint-amnesty, pylint: disable=import-error
-from lms.djangoapps.badges.tests.factories import CourseEventBadgesConfigurationFactory, RandomBadgeClassFactory
-from lms.djangoapps.certificates.models import CertificateStatuses, GeneratedCertificate
from common.djangoapps.student.models import CourseEnrollment
from common.djangoapps.student.tests.factories import UserFactory
-from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase # lint-amnesty, pylint: disable=import-error, wrong-import-order
-from xmodule.modulestore.tests.factories import CourseFactory # lint-amnesty, pylint: disable=import-error, wrong-import-order
+from lms.djangoapps.badges.tests.factories import CourseEventBadgesConfigurationFactory, RandomBadgeClassFactory
+from lms.djangoapps.certificates.models import CertificateStatuses, GeneratedCertificate
+from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
+from xmodule.modulestore.tests.factories import CourseFactory
@ddt
@@ -27,7 +26,7 @@ class CourseEnrollmentBadgeTest(ModuleStoreTestCase):
"""
def setUp(self):
- super(CourseEnrollmentBadgeTest, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
+ super().setUp()
self.badge_classes = [
RandomBadgeClassFactory(
issuing_component='openedx__course'
@@ -77,7 +76,7 @@ class CourseCompletionBadgeTest(ModuleStoreTestCase):
"""
def setUp(self):
- super(CourseCompletionBadgeTest, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
+ super().setUp()
self.badge_classes = [
RandomBadgeClassFactory(
issuing_component='openedx__course'
@@ -131,7 +130,7 @@ class CourseGroupBadgeTest(ModuleStoreTestCase):
"""
def setUp(self):
- super(CourseGroupBadgeTest, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
+ super().setUp()
self.badge_classes = [
RandomBadgeClassFactory(
issuing_component='openedx__course'
@@ -145,8 +144,8 @@ class CourseGroupBadgeTest(ModuleStoreTestCase):
]
self.courses = []
for _badge_class in self.badge_classes:
- self.courses.append([CourseFactory().location.course_key for _i in range(3)])
- lines = [badge_class.slug + ',' + ','.join([six.text_type(course_key) for course_key in keys])
+ self.courses.append([CourseFactory().location.course_key for _i in range(3)]) # lint-amnesty, pylint: disable=no-member
+ lines = [badge_class.slug + ',' + ','.join([str(course_key) for course_key in keys])
for badge_class, keys in zip(self.badge_classes, self.courses)]
config = '\r'.join(lines)
self.config = CourseEventBadgesConfigurationFactory(course_groups=config)
diff --git a/lms/djangoapps/badges/handlers.py b/lms/djangoapps/badges/handlers.py
index 4af4c58adb..d65448128a 100644
--- a/lms/djangoapps/badges/handlers.py
+++ b/lms/djangoapps/badges/handlers.py
@@ -5,10 +5,10 @@ Badges related signal handlers.
from django.dispatch import receiver
-from lms.djangoapps.badges.events.course_meta import award_enrollment_badge
-from lms.djangoapps.badges.utils import badges_enabled
from common.djangoapps.student.models import EnrollStatusChange
from common.djangoapps.student.signals import ENROLL_STATUS_CHANGE
+from lms.djangoapps.badges.events.course_meta import award_enrollment_badge
+from lms.djangoapps.badges.utils import badges_enabled
@receiver(ENROLL_STATUS_CHANGE)
diff --git a/lms/djangoapps/badges/migrations/0001_initial.py b/lms/djangoapps/badges/migrations/0001_initial.py
index 2d6e3af68f..edb7dc4cf8 100644
--- a/lms/djangoapps/badges/migrations/0001_initial.py
+++ b/lms/djangoapps/badges/migrations/0001_initial.py
@@ -1,6 +1,3 @@
-# -*- coding: utf-8 -*-
-
-
import django.utils.timezone
import jsonfield.fields
from django.conf import settings
@@ -35,13 +32,13 @@ class Migration(migrations.Migration):
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('slug', models.SlugField(max_length=255, validators=[badges_models.validate_lowercase])),
- ('issuing_component', models.SlugField(default=u'', blank=True, validators=[badges_models.validate_lowercase])),
+ ('issuing_component', models.SlugField(default='', blank=True, validators=[badges_models.validate_lowercase])),
('display_name', models.CharField(max_length=255)),
('course_id', CourseKeyField(default=None, max_length=255, blank=True)),
('description', models.TextField()),
('criteria', models.TextField()),
- ('mode', models.CharField(default=u'', max_length=100, blank=True)),
- ('image', models.ImageField(upload_to=u'badge_classes', validators=[badges_models.validate_badge_image])),
+ ('mode', models.CharField(default='', max_length=100, blank=True)),
+ ('image', models.ImageField(upload_to='badge_classes', validators=[badges_models.validate_badge_image])),
],
),
migrations.CreateModel(
@@ -49,13 +46,13 @@ class Migration(migrations.Migration):
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('mode', models.CharField(help_text='The course mode for this badge image. For example, "verified" or "honor".', unique=True, max_length=125)),
- ('icon', models.ImageField(help_text='Badge images must be square PNG files. The file size should be under 250KB.', upload_to=u'course_complete_badges', validators=[badges_models.validate_badge_image])),
+ ('icon', models.ImageField(help_text='Badge images must be square PNG files. The file size should be under 250KB.', upload_to='course_complete_badges', validators=[badges_models.validate_badge_image])),
('default', models.BooleanField(default=False, help_text='Set this value to True if you want this image to be the default image for any course modes that do not have a specified badge image. You can have only one default image.')),
],
),
migrations.AlterUniqueTogether(
name='badgeclass',
- unique_together=set([('slug', 'issuing_component', 'course_id')]),
+ unique_together={('slug', 'issuing_component', 'course_id')},
),
migrations.AddField(
model_name='badgeassertion',
diff --git a/lms/djangoapps/badges/migrations/0002_data__migrate_assertions.py b/lms/djangoapps/badges/migrations/0002_data__migrate_assertions.py
index 01c185226a..ae6a88cca3 100644
--- a/lms/djangoapps/badges/migrations/0002_data__migrate_assertions.py
+++ b/lms/djangoapps/badges/migrations/0002_data__migrate_assertions.py
@@ -1,6 +1,3 @@
-# -*- coding: utf-8 -*-
-
-
import json
import os
import time
@@ -45,7 +42,7 @@ def forwards(apps, schema_editor):
badge_class.image.name = icon.name
badge_class.save()
classes[(badge.course_id, badge.mode)] = badge_class
- if isinstance(badge.data, six.string_types):
+ if isinstance(badge.data, str):
data = badge.data
else:
data = json.dumps(badge.data)
@@ -83,7 +80,7 @@ def backwards(apps, schema_editor):
if not badge.badge_class.mode:
# Can't preserve old badges without modes.
continue
- if isinstance(badge.data, six.string_types):
+ if isinstance(badge.data, str):
data = badge.data
else:
data = json.dumps(badge.data)
diff --git a/lms/djangoapps/badges/migrations/0003_schema__add_event_configuration.py b/lms/djangoapps/badges/migrations/0003_schema__add_event_configuration.py
index 002a318839..667925fc25 100644
--- a/lms/djangoapps/badges/migrations/0003_schema__add_event_configuration.py
+++ b/lms/djangoapps/badges/migrations/0003_schema__add_event_configuration.py
@@ -1,6 +1,3 @@
-# -*- coding: utf-8 -*-
-
-
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
@@ -20,9 +17,9 @@ class Migration(migrations.Migration):
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('change_date', models.DateTimeField(auto_now_add=True, verbose_name='Change date')),
('enabled', models.BooleanField(default=False, verbose_name='Enabled')),
- ('courses_completed', models.TextField(default=u'', help_text="On each line, put the number of completed courses to award a badge for, a comma, and the slug of a badge class you have created that has the issuing component 'openedx__course'. For example: 3,enrolled_3_courses", blank=True)),
- ('courses_enrolled', models.TextField(default=u'', help_text="On each line, put the number of enrolled courses to award a badge for, a comma, and the slug of a badge class you have created that has the issuing component 'openedx__course'. For example: 3,enrolled_3_courses", blank=True)),
- ('course_groups', models.TextField(default=u'', help_text="Each line is a comma-separated list. The first item in each line is the slug of a badge class you have created that has an issuing component of 'openedx__course'. The remaining items in each line are the course keys the learner needs to complete to be awarded the badge. For example: slug_for_compsci_courses_group_badge,course-v1:CompSci+Course+First,course-v1:CompsSci+Course+Second", blank=True)),
+ ('courses_completed', models.TextField(default='', help_text="On each line, put the number of completed courses to award a badge for, a comma, and the slug of a badge class you have created that has the issuing component 'openedx__course'. For example: 3,enrolled_3_courses", blank=True)),
+ ('courses_enrolled', models.TextField(default='', help_text="On each line, put the number of enrolled courses to award a badge for, a comma, and the slug of a badge class you have created that has the issuing component 'openedx__course'. For example: 3,enrolled_3_courses", blank=True)),
+ ('course_groups', models.TextField(default='', help_text="Each line is a comma-separated list. The first item in each line is the slug of a badge class you have created that has an issuing component of 'openedx__course'. The remaining items in each line are the course keys the learner needs to complete to be awarded the badge. For example: slug_for_compsci_courses_group_badge,course-v1:CompSci+Course+First,course-v1:CompsSci+Course+Second", blank=True)),
('changed_by', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, editable=False, to=settings.AUTH_USER_MODEL, null=True, verbose_name='Changed by')),
],
),
diff --git a/lms/djangoapps/badges/models.py b/lms/djangoapps/badges/models.py
index 96673197fb..fcfd7c01c9 100644
--- a/lms/djangoapps/badges/models.py
+++ b/lms/djangoapps/badges/models.py
@@ -5,24 +5,23 @@ Database models for the badges app
from importlib import import_module
-import six
-from config_models.models import ConfigurationModel # lint-amnesty, pylint: disable=import-error
+from config_models.models import ConfigurationModel
from django.conf import settings
from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user
from django.core.exceptions import ValidationError
from django.db import models
from django.utils.encoding import python_2_unicode_compatible # lint-amnesty, pylint: disable=no-name-in-module
from django.utils.translation import ugettext_lazy as _
-from jsonfield import JSONField # lint-amnesty, pylint: disable=import-error
+from jsonfield import JSONField
from lazy import lazy # lint-amnesty, pylint: disable=no-name-in-module
-from model_utils.models import TimeStampedModel # lint-amnesty, pylint: disable=import-error
-from opaque_keys import InvalidKeyError # lint-amnesty, pylint: disable=import-error
-from opaque_keys.edx.django.models import CourseKeyField # lint-amnesty, pylint: disable=import-error
-from opaque_keys.edx.keys import CourseKey # lint-amnesty, pylint: disable=import-error
+from model_utils.models import TimeStampedModel
+from opaque_keys import InvalidKeyError
+from opaque_keys.edx.django.models import CourseKeyField
+from opaque_keys.edx.keys import CourseKey
from lms.djangoapps.badges.utils import deserialize_count_specs
from openedx.core.djangolib.markup import HTML, Text
-from xmodule.modulestore.django import modulestore # lint-amnesty, pylint: disable=import-error, wrong-import-order
+from xmodule.modulestore.django import modulestore
def validate_badge_image(image):
@@ -30,9 +29,9 @@ def validate_badge_image(image):
Validates that a particular image is small enough to be a badge and square.
"""
if image.width != image.height:
- raise ValidationError(_(u"The badge image must be square."))
+ raise ValidationError(_("The badge image must be square."))
if not image.size < (250 * 1024):
- raise ValidationError(_(u"The badge image file size must be less than 250KB."))
+ raise ValidationError(_("The badge image file size must be less than 250KB."))
def validate_lowercase(string):
@@ -40,7 +39,7 @@ def validate_lowercase(string):
Validates that a string is lowercase.
"""
if not string.islower():
- raise ValidationError(_(u"This value must be all lowercase."))
+ raise ValidationError(_("This value must be all lowercase."))
class CourseBadgesDisabledError(Exception):
@@ -57,17 +56,17 @@ class BadgeClass(models.Model):
.. no_pii:
"""
slug = models.SlugField(max_length=255, validators=[validate_lowercase])
- issuing_component = models.SlugField(max_length=50, default=u'', blank=True, validators=[validate_lowercase])
+ issuing_component = models.SlugField(max_length=50, default='', blank=True, validators=[validate_lowercase])
display_name = models.CharField(max_length=255)
course_id = CourseKeyField(max_length=255, blank=True, default=None)
description = models.TextField()
criteria = models.TextField()
# Mode a badge was awarded for. Included for legacy/migration purposes.
- mode = models.CharField(max_length=100, default=u'', blank=True)
- image = models.ImageField(upload_to=u'badge_classes', validators=[validate_badge_image])
+ mode = models.CharField(max_length=100, default='', blank=True)
+ image = models.ImageField(upload_to='badge_classes', validators=[validate_badge_image])
def __str__(self): # lint-amnesty, pylint: disable=invalid-str-returned
- return HTML(u"").format(
+ return HTML("").format(
slug=HTML(self.slug), issuing_component=HTML(self.issuing_component)
)
@@ -138,9 +137,9 @@ class BadgeClass(models.Model):
"""
self.slug = self.slug and self.slug.lower()
self.issuing_component = self.issuing_component and self.issuing_component.lower()
- super(BadgeClass, self).save(**kwargs) # lint-amnesty, pylint: disable=super-with-arguments
+ super().save(**kwargs)
- class Meta(object):
+ class Meta:
app_label = "badges"
unique_together = (('slug', 'issuing_component', 'course_id'),)
verbose_name_plural = "Badge Classes"
@@ -161,7 +160,7 @@ class BadgeAssertion(TimeStampedModel):
assertion_url = models.URLField()
def __str__(self): # lint-amnesty, pylint: disable=invalid-str-returned
- return HTML(u"<{username} Badge Assertion for {slug} for {issuing_component}").format(
+ return HTML("<{username} Badge Assertion for {slug} for {issuing_component}").format(
username=HTML(self.user.username),
slug=HTML(self.badge_class.slug),
issuing_component=HTML(self.badge_class.issuing_component),
@@ -176,7 +175,7 @@ class BadgeAssertion(TimeStampedModel):
return cls.objects.filter(user=user, badge_class__course_id=course_id)
return cls.objects.filter(user=user)
- class Meta(object):
+ class Meta:
app_label = "badges"
@@ -193,29 +192,29 @@ class CourseCompleteImageConfiguration(models.Model):
"""
mode = models.CharField(
max_length=125,
- help_text=_(u'The course mode for this badge image. For example, "verified" or "honor".'),
+ help_text=_('The course mode for this badge image. For example, "verified" or "honor".'),
unique=True,
)
icon = models.ImageField(
# Actual max is 256KB, but need overhead for badge baking. This should be more than enough.
help_text=_(
- u"Badge images must be square PNG files. The file size should be under 250KB."
+ "Badge images must be square PNG files. The file size should be under 250KB."
),
- upload_to=u'course_complete_badges',
+ upload_to='course_complete_badges',
validators=[validate_badge_image]
)
default = models.BooleanField(
help_text=_(
- u"Set this value to True if you want this image to be the default image for any course modes "
- u"that do not have a specified badge image. You can have only one default image."
+ "Set this value to True if you want this image to be the default image for any course modes "
+ "that do not have a specified badge image. You can have only one default image."
),
default=False,
)
def __str__(self): # lint-amnesty, pylint: disable=invalid-str-returned
- return HTML(u"").format(
+ return HTML("").format(
mode=HTML(self.mode),
- default=HTML(u" (default)") if self.default else HTML(u'')
+ default=HTML(" (default)") if self.default else HTML('')
)
def clean(self):
@@ -223,7 +222,7 @@ class CourseCompleteImageConfiguration(models.Model):
Make sure there's not more than one default.
"""
if self.default and CourseCompleteImageConfiguration.objects.filter(default=True).exclude(id=self.id):
- raise ValidationError(_(u"There can be only one default image."))
+ raise ValidationError(_("There can be only one default image."))
@classmethod
def image_for_mode(cls, mode):
@@ -236,7 +235,7 @@ class CourseCompleteImageConfiguration(models.Model):
# Fall back to default, if there is one.
return cls.objects.get(default=True).icon
- class Meta(object):
+ class Meta:
app_label = "badges"
@@ -249,34 +248,34 @@ class CourseEventBadgesConfiguration(ConfigurationModel):
.. no_pii:
"""
courses_completed = models.TextField(
- blank=True, default=u'',
+ blank=True, default='',
help_text=_(
- u"On each line, put the number of completed courses to award a badge for, a comma, and the slug of a "
- u"badge class you have created that has the issuing component 'openedx__course'. "
- u"For example: 3,enrolled_3_courses"
+ "On each line, put the number of completed courses to award a badge for, a comma, and the slug of a "
+ "badge class you have created that has the issuing component 'openedx__course'. "
+ "For example: 3,enrolled_3_courses"
)
)
courses_enrolled = models.TextField(
- blank=True, default=u'',
+ blank=True, default='',
help_text=_(
- u"On each line, put the number of enrolled courses to award a badge for, a comma, and the slug of a "
- u"badge class you have created that has the issuing component 'openedx__course'. "
- u"For example: 3,enrolled_3_courses"
+ "On each line, put the number of enrolled courses to award a badge for, a comma, and the slug of a "
+ "badge class you have created that has the issuing component 'openedx__course'. "
+ "For example: 3,enrolled_3_courses"
)
)
course_groups = models.TextField(
- blank=True, default=u'',
+ blank=True, default='',
help_text=_(
- u"Each line is a comma-separated list. The first item in each line is the slug of a badge class you "
- u"have created that has an issuing component of 'openedx__course'. The remaining items in each line are "
- u"the course keys the learner needs to complete to be awarded the badge. For example: "
- u"slug_for_compsci_courses_group_badge,course-v1:CompSci+Course+First,course-v1:CompsSci+Course+Second"
+ "Each line is a comma-separated list. The first item in each line is the slug of a badge class you "
+ "have created that has an issuing component of 'openedx__course'. The remaining items in each line are "
+ "the course keys the learner needs to complete to be awarded the badge. For example: "
+ "slug_for_compsci_courses_group_badge,course-v1:CompSci+Course+First,course-v1:CompsSci+Course+Second"
)
)
def __str__(self): # lint-amnesty, pylint: disable=invalid-str-returned
- return HTML(u"").format(
- Text(u"Enabled") if self.enabled else Text(u"Disabled")
+ return HTML("").format(
+ Text("Enabled") if self.enabled else Text("Disabled")
)
@property
@@ -314,28 +313,28 @@ class CourseEventBadgesConfiguration(ConfigurationModel):
Verify the settings are parseable.
"""
errors = {}
- error_message = _(u"Please check the syntax of your entry.")
+ error_message = _("Please check the syntax of your entry.")
if 'courses_completed' not in exclude:
try:
self.completed_settings
except (ValueError, InvalidKeyError):
- errors['courses_completed'] = [six.text_type(error_message)]
+ errors['courses_completed'] = [str(error_message)]
if 'courses_enrolled' not in exclude:
try:
self.enrolled_settings
except (ValueError, InvalidKeyError):
- errors['courses_enrolled'] = [six.text_type(error_message)]
+ errors['courses_enrolled'] = [str(error_message)]
if 'course_groups' not in exclude:
store = modulestore()
try:
for key_list in self.course_group_settings.values():
for course_key in key_list:
if not store.get_course(course_key):
- ValueError(u"The course {course_key} does not exist.".format(course_key=course_key))
+ ValueError(f"The course {course_key} does not exist.")
except (ValueError, InvalidKeyError):
- errors['course_groups'] = [six.text_type(error_message)]
+ errors['course_groups'] = [str(error_message)]
if errors:
raise ValidationError(errors)
- class Meta(object):
+ class Meta:
app_label = "badges"
diff --git a/lms/djangoapps/badges/service.py b/lms/djangoapps/badges/service.py
index bd69914dcd..2870ac7df4 100644
--- a/lms/djangoapps/badges/service.py
+++ b/lms/djangoapps/badges/service.py
@@ -6,7 +6,7 @@ Badging service for XBlocks
from lms.djangoapps.badges.models import BadgeClass
-class BadgingService(object):
+class BadgingService:
"""
A class that provides functions for managing badges which XBlocks can use.
diff --git a/lms/djangoapps/badges/tests/factories.py b/lms/djangoapps/badges/tests/factories.py
index 5042fb8c09..7fca1fe397 100644
--- a/lms/djangoapps/badges/tests/factories.py
+++ b/lms/djangoapps/badges/tests/factories.py
@@ -5,13 +5,18 @@ Factories for Badge tests
from random import random
-import factory # lint-amnesty, pylint: disable=import-error
+import factory
from django.core.files.base import ContentFile
-from factory import DjangoModelFactory # lint-amnesty, pylint: disable=import-error
-from factory.django import ImageField # lint-amnesty, pylint: disable=import-error
+from factory import DjangoModelFactory
+from factory.django import ImageField
-from lms.djangoapps.badges.models import BadgeAssertion, BadgeClass, CourseCompleteImageConfiguration, CourseEventBadgesConfiguration # lint-amnesty, pylint: disable=line-too-long
from common.djangoapps.student.tests.factories import UserFactory
+from lms.djangoapps.badges.models import ( # lint-amnesty, pylint: disable=line-too-long
+ BadgeAssertion,
+ BadgeClass,
+ CourseCompleteImageConfiguration,
+ CourseEventBadgesConfiguration
+)
def generate_dummy_image(_unused):
@@ -29,7 +34,7 @@ class CourseCompleteImageConfigurationFactory(DjangoModelFactory):
"""
Factory for BadgeImageConfigurations
"""
- class Meta(object):
+ class Meta:
model = CourseCompleteImageConfiguration
mode = 'honor'
@@ -40,7 +45,7 @@ class BadgeClassFactory(DjangoModelFactory):
"""
Factory for BadgeClass
"""
- class Meta(object):
+ class Meta:
model = BadgeClass
slug = 'test_slug'
@@ -63,7 +68,7 @@ class BadgeAssertionFactory(DjangoModelFactory):
"""
Factory for BadgeAssertions
"""
- class Meta(object):
+ class Meta:
model = BadgeAssertion
user = factory.SubFactory(UserFactory)
@@ -77,7 +82,7 @@ class CourseEventBadgesConfigurationFactory(DjangoModelFactory):
"""
Factory for CourseEventsBadgesConfiguration
"""
- class Meta(object):
+ class Meta:
model = CourseEventBadgesConfiguration
enabled = True
diff --git a/lms/djangoapps/badges/tests/test_models.py b/lms/djangoapps/badges/tests/test_models.py
index 3e9ae7f7de..e6469dc6a5 100644
--- a/lms/djangoapps/badges/tests/test_models.py
+++ b/lms/djangoapps/badges/tests/test_models.py
@@ -2,6 +2,9 @@
Tests for the Badges app models.
"""
+
+from unittest.mock import Mock, patch
+
import pytest
from django.core.exceptions import ValidationError
from django.core.files.images import ImageFile
@@ -9,10 +12,9 @@ from django.core.files.storage import default_storage
from django.db.utils import IntegrityError
from django.test import TestCase
from django.test.utils import override_settings
-from mock import Mock, patch # lint-amnesty, pylint: disable=import-error
-from path import Path # lint-amnesty, pylint: disable=import-error
-from six.moves import range
+from path import Path
+from common.djangoapps.student.tests.factories import UserFactory
from lms.djangoapps.badges.models import (
BadgeAssertion,
BadgeClass,
@@ -22,9 +24,8 @@ from lms.djangoapps.badges.models import (
)
from lms.djangoapps.badges.tests.factories import BadgeAssertionFactory, BadgeClassFactory, RandomBadgeClassFactory
from lms.djangoapps.certificates.tests.test_models import TEST_DATA_ROOT
-from common.djangoapps.student.tests.factories import UserFactory
-from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase # lint-amnesty, pylint: disable=import-error, wrong-import-order
-from xmodule.modulestore.tests.factories import CourseFactory # lint-amnesty, pylint: disable=import-error, wrong-import-order
+from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
+from xmodule.modulestore.tests.factories import CourseFactory
def get_image(name):
@@ -60,7 +61,7 @@ class BadgeImageConfigurationTest(TestCase):
.full_clean)
-class DummyBackend(object):
+class DummyBackend:
"""
Dummy badge backend, used for testing.
"""
@@ -74,7 +75,7 @@ class BadgeClassTest(ModuleStoreTestCase):
"""
def setUp(self):
- super(BadgeClassTest, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
+ super().setUp()
self.addCleanup(self.cleanup_uploads)
def cleanup_uploads(self):
diff --git a/lms/djangoapps/badges/utils.py b/lms/djangoapps/badges/utils.py
index e6ade5f536..150834e04c 100644
--- a/lms/djangoapps/badges/utils.py
+++ b/lms/djangoapps/badges/utils.py
@@ -10,8 +10,8 @@ def site_prefix():
"""
Get the prefix for the site URL-- protocol and server name.
"""
- scheme = u"https" if settings.HTTPS == "on" else u"http"
- return u'{}://{}'.format(scheme, settings.SITE_NAME)
+ scheme = "https" if settings.HTTPS == "on" else "http"
+ return f'{scheme}://{settings.SITE_NAME}'
def requires_badges_enabled(function):
diff --git a/lms/djangoapps/bulk_email/admin.py b/lms/djangoapps/bulk_email/admin.py
index 99f28b5abf..2599e5f334 100644
--- a/lms/djangoapps/bulk_email/admin.py
+++ b/lms/djangoapps/bulk_email/admin.py
@@ -7,7 +7,13 @@ from config_models.admin import ConfigurationModelAdmin
from django.contrib import admin
from lms.djangoapps.bulk_email.forms import CourseAuthorizationAdminForm, CourseEmailTemplateForm
-from lms.djangoapps.bulk_email.models import BulkEmailFlag, CourseAuthorization, CourseEmail, CourseEmailTemplate, Optout # lint-amnesty, pylint: disable=line-too-long
+from lms.djangoapps.bulk_email.models import (
+ BulkEmailFlag,
+ CourseAuthorization,
+ CourseEmail,
+ CourseEmailTemplate,
+ Optout
+)
class CourseEmailAdmin(admin.ModelAdmin):
@@ -27,7 +33,7 @@ class CourseEmailTemplateAdmin(admin.ModelAdmin):
(None, {
# make the HTML template display above the plain template:
'fields': ('html_template', 'plain_template', 'name'),
- 'description': u'''
+ 'description': '''
Enter template to be used by course staff when sending emails to enrolled students.
The HTML template is for HTML email, and may contain HTML markup. The plain template is
diff --git a/lms/djangoapps/bulk_email/api.py b/lms/djangoapps/bulk_email/api.py
index 2ce973f5d0..35ca38eb6c 100644
--- a/lms/djangoapps/bulk_email/api.py
+++ b/lms/djangoapps/bulk_email/api.py
@@ -45,5 +45,5 @@ def get_unsubscribed_link(username, course_id):
lms_root_url = configuration_helpers.get_value('LMS_ROOT_URL', settings.LMS_ROOT_URL)
token = UsernameCipher.encrypt(username)
optout_url = reverse('bulk_email_opt_out', kwargs={'token': token, 'course_id': course_id})
- url = '{base_url}{optout_url}'.format(base_url=lms_root_url, optout_url=optout_url)
+ url = f'{lms_root_url}{optout_url}'
return url
diff --git a/lms/djangoapps/bulk_email/apps.py b/lms/djangoapps/bulk_email/apps.py
index c70ee9c53f..2cfb725ba8 100644
--- a/lms/djangoapps/bulk_email/apps.py
+++ b/lms/djangoapps/bulk_email/apps.py
@@ -6,4 +6,4 @@ class BulkEmailConfig(AppConfig):
"""
Application Configuration for bulk_email.
"""
- name = u'lms.djangoapps.bulk_email'
+ name = 'lms.djangoapps.bulk_email'
diff --git a/lms/djangoapps/bulk_email/forms.py b/lms/djangoapps/bulk_email/forms.py
index ea3d12082c..c730216f2b 100644
--- a/lms/djangoapps/bulk_email/forms.py
+++ b/lms/djangoapps/bulk_email/forms.py
@@ -19,7 +19,7 @@ class CourseEmailTemplateForm(forms.ModelForm):
name = forms.CharField(required=False)
- class Meta(object):
+ class Meta:
model = CourseEmailTemplate
fields = ('html_template', 'plain_template', 'name')
@@ -27,11 +27,11 @@ class CourseEmailTemplateForm(forms.ModelForm):
"""Check the template for required tags."""
index = template.find(COURSE_EMAIL_MESSAGE_BODY_TAG)
if index < 0:
- msg = u'Missing tag: "{}"'.format(COURSE_EMAIL_MESSAGE_BODY_TAG)
+ msg = f'Missing tag: "{COURSE_EMAIL_MESSAGE_BODY_TAG}"'
log.warning(msg)
raise ValidationError(msg)
if template.find(COURSE_EMAIL_MESSAGE_BODY_TAG, index + 1) >= 0:
- msg = u'Multiple instances of tag: "{}"'.format(COURSE_EMAIL_MESSAGE_BODY_TAG)
+ msg = f'Multiple instances of tag: "{COURSE_EMAIL_MESSAGE_BODY_TAG}"'
log.warning(msg)
raise ValidationError(msg)
# TODO: add more validation here, including the set of known tags
@@ -63,7 +63,7 @@ class CourseEmailTemplateForm(forms.ModelForm):
try:
CourseEmailTemplate.get_template(name)
# already exists, this is no good
- raise ValidationError(u'Name of "{}" already exists, this must be unique.'.format(name))
+ raise ValidationError(f'Name of "{name}" already exists, this must be unique.')
except CourseEmailTemplate.DoesNotExist:
# this is actually the successful validation
pass
@@ -73,7 +73,7 @@ class CourseEmailTemplateForm(forms.ModelForm):
class CourseAuthorizationAdminForm(forms.ModelForm):
"""Input form for email enabling, allowing us to verify data."""
- class Meta(object):
+ class Meta:
model = CourseAuthorization
fields = '__all__'
diff --git a/lms/djangoapps/bulk_email/migrations/0001_initial.py b/lms/djangoapps/bulk_email/migrations/0001_initial.py
index 4d5e70b14b..ab315c063e 100644
--- a/lms/djangoapps/bulk_email/migrations/0001_initial.py
+++ b/lms/djangoapps/bulk_email/migrations/0001_initial.py
@@ -1,6 +1,3 @@
-# -*- coding: utf-8 -*-
-
-
from django.conf import settings
from django.db import migrations, models
from opaque_keys.edx.django.models import CourseKeyField
@@ -32,7 +29,7 @@ class Migration(migrations.Migration):
('created', models.DateTimeField(auto_now_add=True)),
('modified', models.DateTimeField(auto_now=True)),
('course_id', CourseKeyField(max_length=255, db_index=True)),
- ('to_option', models.CharField(default=u'myself', max_length=64, choices=[(u'myself', u'Myself'), (u'staff', u'Staff and instructors'), (u'all', u'All')])),
+ ('to_option', models.CharField(default='myself', max_length=64, choices=[('myself', 'Myself'), ('staff', 'Staff and instructors'), ('all', 'All')])),
('template_name', models.CharField(max_length=255, null=True)),
('from_addr', models.CharField(max_length=255, null=True)),
('sender', models.ForeignKey(default=1, blank=True, to=settings.AUTH_USER_MODEL, null=True, on_delete=models.CASCADE)),
@@ -57,6 +54,6 @@ class Migration(migrations.Migration):
),
migrations.AlterUniqueTogether(
name='optout',
- unique_together=set([('user', 'course_id')]),
+ unique_together={('user', 'course_id')},
),
]
diff --git a/lms/djangoapps/bulk_email/migrations/0002_data__load_course_email_template.py b/lms/djangoapps/bulk_email/migrations/0002_data__load_course_email_template.py
index 6433bcb47e..7c93dc0fcc 100644
--- a/lms/djangoapps/bulk_email/migrations/0002_data__load_course_email_template.py
+++ b/lms/djangoapps/bulk_email/migrations/0002_data__load_course_email_template.py
@@ -1,6 +1,3 @@
-# -*- coding: utf-8 -*-
-
-
from django.core.management import call_command
from django.db import migrations, models
diff --git a/lms/djangoapps/bulk_email/migrations/0003_config_model_feature_flag.py b/lms/djangoapps/bulk_email/migrations/0003_config_model_feature_flag.py
index 8ed77141a6..558550f6b1 100644
--- a/lms/djangoapps/bulk_email/migrations/0003_config_model_feature_flag.py
+++ b/lms/djangoapps/bulk_email/migrations/0003_config_model_feature_flag.py
@@ -1,6 +1,3 @@
-# -*- coding: utf-8 -*-
-
-
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
diff --git a/lms/djangoapps/bulk_email/migrations/0004_add_email_targets.py b/lms/djangoapps/bulk_email/migrations/0004_add_email_targets.py
index 2b4c287258..d77b8411b7 100644
--- a/lms/djangoapps/bulk_email/migrations/0004_add_email_targets.py
+++ b/lms/djangoapps/bulk_email/migrations/0004_add_email_targets.py
@@ -1,6 +1,3 @@
-# -*- coding: utf-8 -*-
-
-
from django.db import migrations, models
@@ -16,13 +13,13 @@ class Migration(migrations.Migration):
name='Target',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
- ('target_type', models.CharField(max_length=64, choices=[(u'myself', u'Myself'), (u'staff', u'Staff and instructors'), (u'learners', u'All students'), (u'cohort', u'Specific cohort')])),
+ ('target_type', models.CharField(max_length=64, choices=[('myself', 'Myself'), ('staff', 'Staff and instructors'), ('learners', 'All students'), ('cohort', 'Specific cohort')])),
],
),
migrations.AlterField(
model_name='courseemail',
name='to_option',
- field=models.CharField(max_length=64, choices=[(u'deprecated', u'deprecated')]),
+ field=models.CharField(max_length=64, choices=[('deprecated', 'deprecated')]),
),
migrations.CreateModel(
name='CohortTarget',
diff --git a/lms/djangoapps/bulk_email/migrations/0005_move_target_data.py b/lms/djangoapps/bulk_email/migrations/0005_move_target_data.py
index 67c4af1c72..41e9449c74 100644
--- a/lms/djangoapps/bulk_email/migrations/0005_move_target_data.py
+++ b/lms/djangoapps/bulk_email/migrations/0005_move_target_data.py
@@ -1,6 +1,3 @@
-# -*- coding: utf-
-
-
from django.db import migrations, models
from django.db.utils import DatabaseError
diff --git a/lms/djangoapps/bulk_email/migrations/0006_course_mode_targets.py b/lms/djangoapps/bulk_email/migrations/0006_course_mode_targets.py
index 1c7c91375b..f7263deac9 100644
--- a/lms/djangoapps/bulk_email/migrations/0006_course_mode_targets.py
+++ b/lms/djangoapps/bulk_email/migrations/0006_course_mode_targets.py
@@ -1,6 +1,3 @@
-# -*- coding: utf-8 -*-
-
-
from django.db import migrations, models
@@ -23,6 +20,6 @@ class Migration(migrations.Migration):
migrations.AlterField(
model_name='target',
name='target_type',
- field=models.CharField(max_length=64, choices=[(u'myself', u'Myself'), (u'staff', u'Staff and instructors'), (u'learners', u'All students'), (u'cohort', u'Specific cohort'), (u'track', u'Specific course mode')]),
+ field=models.CharField(max_length=64, choices=[('myself', 'Myself'), ('staff', 'Staff and instructors'), ('learners', 'All students'), ('cohort', 'Specific cohort'), ('track', 'Specific course mode')]),
),
]
diff --git a/lms/djangoapps/bulk_email/models.py b/lms/djangoapps/bulk_email/models.py
index de03fa46c6..f8ac2cbd56 100644
--- a/lms/djangoapps/bulk_email/models.py
+++ b/lms/djangoapps/bulk_email/models.py
@@ -6,25 +6,22 @@ Models for bulk email
import logging
import markupsafe
-import six
-from config_models.models import ConfigurationModel # lint-amnesty, pylint: disable=import-error
+from config_models.models import ConfigurationModel
from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user
from django.db import models
from django.utils.encoding import python_2_unicode_compatible
-from opaque_keys.edx.django.models import CourseKeyField # lint-amnesty, pylint: disable=import-error
-from six import text_type
-from six.moves import zip
+from opaque_keys.edx.django.models import CourseKeyField
from common.djangoapps.course_modes.models import CourseMode
+from common.djangoapps.student.roles import CourseInstructorRole, CourseStaffRole
+from common.djangoapps.util.keyword_substitution import substitute_keywords_with_data
+from common.djangoapps.util.query import use_read_replica_if_available
from openedx.core.djangoapps.course_groups.cohorts import get_cohort_by_name
from openedx.core.djangoapps.course_groups.models import CourseUserGroup
from openedx.core.djangoapps.enrollments.api import validate_course_mode
from openedx.core.djangoapps.enrollments.errors import CourseModeNotFoundError
from openedx.core.lib.html_to_text import html_to_text
from openedx.core.lib.mail_utils import wrap_message
-from common.djangoapps.student.roles import CourseInstructorRole, CourseStaffRole
-from common.djangoapps.util.keyword_substitution import substitute_keywords_with_data
-from common.djangoapps.util.query import use_read_replica_if_available
log = logging.getLogger(__name__)
@@ -43,20 +40,20 @@ class Email(models.Model):
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
- class Meta(object):
+ class Meta:
app_label = "bulk_email"
abstract = True
# Bulk email targets - the send to options that users can select from when they send email.
-SEND_TO_MYSELF = u'myself'
-SEND_TO_STAFF = u'staff'
-SEND_TO_LEARNERS = u'learners'
-SEND_TO_COHORT = u'cohort'
-SEND_TO_TRACK = u'track'
+SEND_TO_MYSELF = 'myself'
+SEND_TO_STAFF = 'staff'
+SEND_TO_LEARNERS = 'learners'
+SEND_TO_COHORT = 'cohort'
+SEND_TO_TRACK = 'track'
EMAIL_TARGET_CHOICES = list(zip(
[SEND_TO_MYSELF, SEND_TO_STAFF, SEND_TO_LEARNERS, SEND_TO_COHORT, SEND_TO_TRACK],
- [u'Myself', u'Staff and instructors', u'All students', u'Specific cohort', u'Specific course mode']
+ ['Myself', 'Staff and instructors', 'All students', 'Specific cohort', 'Specific course mode']
))
EMAIL_TARGETS = {target[0] for target in EMAIL_TARGET_CHOICES}
@@ -78,11 +75,11 @@ class Target(models.Model):
"""
target_type = models.CharField(max_length=64, choices=EMAIL_TARGET_CHOICES)
- class Meta(object):
+ class Meta:
app_label = "bulk_email"
def __str__(self):
- return "CourseEmail Target: {}".format(self.short_display())
+ return f"CourseEmail Target: {self.short_display()}"
def short_display(self):
"""
@@ -142,7 +139,7 @@ class Target(models.Model):
)
)
else:
- raise ValueError(u"Unrecognized target type {}".format(self.target_type))
+ raise ValueError(f"Unrecognized target type {self.target_type}")
@python_2_unicode_compatible
@@ -159,16 +156,16 @@ class CohortTarget(Target):
def __init__(self, *args, **kwargs):
kwargs['target_type'] = SEND_TO_COHORT
- super(CohortTarget, self).__init__(*args, **kwargs) # lint-amnesty, pylint: disable=super-with-arguments
+ super().__init__(*args, **kwargs)
def __str__(self):
return self.short_display()
def short_display(self):
- return "{}-{}".format(self.target_type, self.cohort.name)
+ return f"{self.target_type}-{self.cohort.name}"
def long_display(self):
- return "Cohort: {}".format(self.cohort.name)
+ return f"Cohort: {self.cohort.name}"
@classmethod
def ensure_valid_cohort(cls, cohort_name, course_id):
@@ -183,7 +180,7 @@ class CohortTarget(Target):
cohort = get_cohort_by_name(name=cohort_name, course_key=course_id)
except CourseUserGroup.DoesNotExist:
raise ValueError( # lint-amnesty, pylint: disable=raise-missing-from
- u"Cohort {cohort} does not exist in course {course_id}".format(
+ "Cohort {cohort} does not exist in course {course_id}".format(
cohort=cohort_name,
course_id=course_id
).encode('utf8')
@@ -205,20 +202,20 @@ class CourseModeTarget(Target):
def __init__(self, *args, **kwargs):
kwargs['target_type'] = SEND_TO_TRACK
- super(CourseModeTarget, self).__init__(*args, **kwargs) # lint-amnesty, pylint: disable=super-with-arguments
+ super().__init__(*args, **kwargs)
def __str__(self):
return self.short_display()
def short_display(self):
- return "{}-{}".format(self.target_type, self.track.mode_slug) # pylint: disable=no-member
+ return f"{self.target_type}-{self.track.mode_slug}" # pylint: disable=no-member
def long_display(self):
course_mode = self.track
- long_course_mode_display = u'Course mode: {}'.format(course_mode.mode_display_name)
+ long_course_mode_display = f'Course mode: {course_mode.mode_display_name}'
if course_mode.mode_slug not in CourseMode.AUDIT_MODES:
- mode_currency = u'Currency: {}'.format(course_mode.currency)
- long_course_mode_display = u'{}, {}'.format(long_course_mode_display, mode_currency)
+ mode_currency = f'Currency: {course_mode.currency}'
+ long_course_mode_display = f'{long_course_mode_display}, {mode_currency}'
return long_course_mode_display
@classmethod
@@ -229,10 +226,10 @@ class CourseModeTarget(Target):
if mode_slug is None:
raise ValueError("Cannot create a CourseModeTarget without specifying a mode_slug.")
try:
- validate_course_mode(six.text_type(course_id), mode_slug, include_expired=True)
+ validate_course_mode(str(course_id), mode_slug, include_expired=True)
except CourseModeNotFoundError:
raise ValueError( # lint-amnesty, pylint: disable=raise-missing-from
- u"Track {track} does not exist in course {course_id}".format(
+ "Track {track} does not exist in course {course_id}".format(
track=mode_slug,
course_id=course_id
).encode('utf8')
@@ -246,12 +243,12 @@ class CourseEmail(Email):
.. no_pii:
"""
- class Meta(object):
+ class Meta:
app_label = "bulk_email"
course_id = CourseKeyField(max_length=255, db_index=True)
# to_option is deprecated and unused, but dropping db columns is hard so it's still here for legacy reasons
- to_option = models.CharField(max_length=64, choices=[(u"deprecated", u"deprecated")])
+ to_option = models.CharField(max_length=64, choices=[("deprecated", "deprecated")])
targets = models.ManyToManyField(Target)
template_name = models.CharField(null=True, max_length=255)
from_addr = models.CharField(null=True, max_length=255)
@@ -276,7 +273,7 @@ class CourseEmail(Email):
target_split = target.split(':', 1)
# Ensure our desired target exists
if target_split[0] not in EMAIL_TARGETS: # lint-amnesty, pylint: disable=no-else-raise
- fmt = u'Course email being sent to unrecognized target: "{target}" for "{course}", subject "{subject}"'
+ fmt = 'Course email being sent to unrecognized target: "{target}" for "{course}", subject "{subject}"'
msg = fmt.format(target=target, course=course_id, subject=subject).encode('utf8')
raise ValueError(msg)
elif target_split[0] == SEND_TO_COHORT:
@@ -330,7 +327,7 @@ class Optout(models.Model):
user = models.ForeignKey(User, db_index=True, null=True, on_delete=models.CASCADE)
course_id = CourseKeyField(max_length=255, db_index=True)
- class Meta(object):
+ class Meta:
app_label = "bulk_email"
unique_together = ('user', 'course_id')
@@ -358,7 +355,7 @@ class CourseEmailTemplate(models.Model):
.. no_pii:
"""
- class Meta(object):
+ class Meta:
app_label = "bulk_email"
html_template = models.TextField(null=True, blank=True)
@@ -428,8 +425,8 @@ class CourseEmailTemplate(models.Model):
stored HTML template and the provided `context` dict.
"""
# HTML-escape string values in the context (used for keyword substitution).
- for key, value in six.iteritems(context):
- if isinstance(value, six.string_types):
+ for key, value in context.items():
+ if isinstance(value, str):
context[key] = markupsafe.escape(value)
return CourseEmailTemplate._render(self.html_template, htmltext, context)
@@ -441,7 +438,7 @@ class CourseAuthorization(models.Model):
.. no_pii:
"""
- class Meta(object):
+ class Meta:
app_label = "bulk_email"
# The course that these features are attached to.
@@ -465,7 +462,7 @@ class CourseAuthorization(models.Model):
not_en = "Not "
if self.email_enabled:
not_en = ""
- return u"Course '{}': Instructor Email {}Enabled".format(text_type(self.course_id), not_en)
+ return "Course '{}': Instructor Email {}Enabled".format(str(self.course_id), not_en)
@python_2_unicode_compatible
@@ -516,12 +513,12 @@ class BulkEmailFlag(ConfigurationModel):
else: # implies enabled == True and require_course_email == False, so email is globally enabled
return True
- class Meta(object):
+ class Meta:
app_label = "bulk_email"
def __str__(self):
current_model = BulkEmailFlag.current()
- return u"BulkEmailFlag: enabled {}, require_course_email_auth: {}".format(
+ return "BulkEmailFlag: enabled {}, require_course_email_auth: {}".format(
current_model.is_enabled(),
current_model.require_course_email_auth
)
diff --git a/lms/djangoapps/bulk_email/signals.py b/lms/djangoapps/bulk_email/signals.py
index 4d3f1c3ce1..818d222b7a 100644
--- a/lms/djangoapps/bulk_email/signals.py
+++ b/lms/djangoapps/bulk_email/signals.py
@@ -5,8 +5,8 @@ Signal handlers for the bulk_email app
from django.dispatch import receiver
-from openedx.core.djangoapps.user_api.accounts.signals import USER_RETIRE_MAILINGS
from common.djangoapps.student.models import CourseEnrollment
+from openedx.core.djangoapps.user_api.accounts.signals import USER_RETIRE_MAILINGS
from .models import Optout
diff --git a/lms/djangoapps/bulk_email/tasks.py b/lms/djangoapps/bulk_email/tasks.py
index 34cb395e73..a0725ed51f 100644
--- a/lms/djangoapps/bulk_email/tasks.py
+++ b/lms/djangoapps/bulk_email/tasks.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
"""
This module contains celery task functions for handling the sending of bulk email
to a course.
@@ -26,23 +25,24 @@ from boto.ses.exceptions import (
SESLocalAddressCharacterError,
SESMaxSendingRateExceededError
)
-from celery import current_task, shared_task # lint-amnesty, pylint: disable=import-error
-from celery.exceptions import RetryTaskError # lint-amnesty, pylint: disable=import-error
-from celery.states import FAILURE, RETRY, SUCCESS # lint-amnesty, pylint: disable=import-error
-from django.conf import settings # lint-amnesty, pylint: disable=wrong-import-order
-from django.core.mail import EmailMultiAlternatives, get_connection # lint-amnesty, pylint: disable=wrong-import-order
-from django.core.mail.message import forbid_multi_line_headers # lint-amnesty, pylint: disable=wrong-import-order
-from django.urls import reverse # lint-amnesty, pylint: disable=wrong-import-order
-from django.utils import timezone # lint-amnesty, pylint: disable=wrong-import-order
-from django.utils.translation import override as override_language # lint-amnesty, pylint: disable=wrong-import-order
-from django.utils.translation import ugettext as _ # lint-amnesty, pylint: disable=wrong-import-order
-from edx_django_utils.monitoring import set_code_owner_attribute # lint-amnesty, pylint: disable=wrong-import-order
-from markupsafe import escape # lint-amnesty, pylint: disable=wrong-import-order
-from six import text_type # lint-amnesty, pylint: disable=wrong-import-order
+from celery import current_task, shared_task
+from celery.exceptions import RetryTaskError
+from celery.states import FAILURE, RETRY, SUCCESS
+from django.conf import settings
+from django.core.mail import EmailMultiAlternatives, get_connection
+from django.core.mail.message import forbid_multi_line_headers
+from django.urls import reverse
+from django.utils import timezone
+from django.utils.translation import override as override_language
+from django.utils.translation import ugettext as _
+from edx_django_utils.monitoring import set_code_owner_attribute
+from markupsafe import escape
+from common.djangoapps.util.date_utils import get_default_time_display
+from common.djangoapps.util.string_utils import _has_non_ascii_characters
from lms.djangoapps.branding.api import get_logo_url_for_email
-from lms.djangoapps.bulk_email.models import CourseEmail, Optout
from lms.djangoapps.bulk_email.api import get_unsubscribed_link
+from lms.djangoapps.bulk_email.models import CourseEmail, Optout
from lms.djangoapps.courseware.courses import get_course
from lms.djangoapps.instructor_task.models import InstructorTask
from lms.djangoapps.instructor_task.subtasks import (
@@ -53,8 +53,6 @@ from lms.djangoapps.instructor_task.subtasks import (
)
from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers
from openedx.core.lib.courses import course_image_url
-from common.djangoapps.util.date_utils import get_default_time_display
-from common.djangoapps.util.string_utils import _has_non_ascii_characters
log = logging.getLogger('edx.celery.task')
@@ -103,7 +101,7 @@ def _get_course_email_context(course):
"""
Returns context arguments to apply to all emails, independent of recipient.
"""
- course_id = text_type(course.id)
+ course_id = str(course.id)
course_title = course.display_name
course_end_date = get_default_time_display(course.end)
course_root = reverse('course_root', kwargs={'course_id': course_id})
@@ -111,7 +109,7 @@ def _get_course_email_context(course):
settings.LMS_ROOT_URL,
course_root
)
- image_url = u'{}{}'.format(settings.LMS_ROOT_URL, course_image_url(course))
+ image_url = '{}{}'.format(settings.LMS_ROOT_URL, course_image_url(course))
lms_root_url = configuration_helpers.get_value('LMS_ROOT_URL', settings.LMS_ROOT_URL)
email_context = {
'course_title': course_title,
@@ -143,8 +141,8 @@ def perform_delegate_email_batches(entry_id, course_id, task_input, action_name)
# Perfunctory check, since expansion is made for convenience of other task
# code that doesn't need the entry_id.
if course_id != entry.course_id:
- format_msg = u"Course id conflict: explicit value %r does not match task value %r"
- log.warning(u"Task %s: " + format_msg, task_id, course_id, entry.course_id) # lint-amnesty, pylint: disable=logging-not-lazy
+ format_msg = "Course id conflict: explicit value %r does not match task value %r"
+ log.warning("Task %s: " + format_msg, task_id, course_id, entry.course_id) # lint-amnesty, pylint: disable=logging-not-lazy
raise ValueError(format_msg % (course_id, entry.course_id))
# Fetch the CourseEmail.
@@ -154,7 +152,7 @@ def perform_delegate_email_batches(entry_id, course_id, task_input, action_name)
except CourseEmail.DoesNotExist:
# The CourseEmail object should be committed in the view function before the task
# is submitted and reaches this point.
- log.warning(u"Task %s: Failed to get CourseEmail with id %s", task_id, email_id)
+ log.warning("Task %s: Failed to get CourseEmail with id %s", task_id, email_id)
raise
# Check to see if email batches have already been defined. This seems to
@@ -165,14 +163,14 @@ def perform_delegate_email_batches(entry_id, course_id, task_input, action_name)
# So we just return right away. We don't raise an exception, because we want
# the current task to be marked with whatever it had been marked with before.
if len(entry.subtasks) > 0 and len(entry.task_output) > 0:
- log.warning(u"Task %s has already been processed for email %s! InstructorTask = %s", task_id, email_id, entry)
+ log.warning("Task %s has already been processed for email %s! InstructorTask = %s", task_id, email_id, entry)
progress = json.loads(entry.task_output)
return progress
# Sanity check that course for email_obj matches that of the task referencing it.
if course_id != email_obj.course_id:
- format_msg = u"Course id conflict: explicit value %r does not match email value %r"
- log.warning(u"Task %s: " + format_msg, task_id, course_id, email_obj.course_id) # lint-amnesty, pylint: disable=logging-not-lazy
+ format_msg = "Course id conflict: explicit value %r does not match email value %r"
+ log.warning("Task %s: " + format_msg, task_id, course_id, email_obj.course_id) # lint-amnesty, pylint: disable=logging-not-lazy
raise ValueError(format_msg % (course_id, email_obj.course_id))
# Fetch the course object.
@@ -192,7 +190,7 @@ def perform_delegate_email_batches(entry_id, course_id, task_input, action_name)
else recipient_qsets[0]
recipient_fields = ['profile__name', 'email', 'username']
- log.info(u"Task %s: Preparing to queue subtasks for sending emails for course %s, email %s",
+ log.info("Task %s: Preparing to queue subtasks for sending emails for course %s, email %s",
task_id, course_id, email_id)
total_recipients = combined_set.count()
@@ -200,7 +198,7 @@ def perform_delegate_email_batches(entry_id, course_id, task_input, action_name)
# Weird things happen if we allow empty querysets as input to emailing subtasks
# The task appears to hang at "0 out of 0 completed" and never finishes.
if total_recipients == 0:
- msg = u"Bulk Email Task: Empty recipient set"
+ msg = "Bulk Email Task: Empty recipient set"
log.warning(msg)
raise ValueError(msg)
@@ -276,8 +274,8 @@ def send_course_email(entry_id, email_id, to_list, global_email_context, subtask
subtask_status = SubtaskStatus.from_dict(subtask_status_dict)
current_task_id = subtask_status.task_id
num_to_send = len(to_list)
- log.info((u"Preparing to send email %s to %d recipients as subtask %s "
- u"for instructor task %d: context = %s, status=%s, time=%s"),
+ log.info(("Preparing to send email %s to %d recipients as subtask %s "
+ "for instructor task %d: context = %s, status=%s, time=%s"),
email_id, num_to_send, current_task_id, entry_id, global_email_context, subtask_status, datetime.now())
# Check that the requested subtask is actually known to the current InstructorTask entry.
@@ -303,14 +301,14 @@ def send_course_email(entry_id, email_id, to_list, global_email_context, subtask
subtask_status,
)
log.info(
- u"BulkEmail ==> _send_course_email completed in : %s for task : %s with recipient count: %s",
+ "BulkEmail ==> _send_course_email completed in : %s for task : %s with recipient count: %s",
time.time() - start_time,
subtask_status.task_id,
len(to_list)
)
except Exception:
# Unexpected exception. Try to write out the failure to the entry before failing.
- log.exception(u"Send-email task %s for email %s: failed unexpectedly!", current_task_id, email_id)
+ log.exception("Send-email task %s for email %s: failed unexpectedly!", current_task_id, email_id)
# We got here for really unexpected reasons. Since we don't know how far
# the task got in emailing, we count all recipients as having failed.
# It at least keeps the counts consistent.
@@ -320,22 +318,22 @@ def send_course_email(entry_id, email_id, to_list, global_email_context, subtask
if send_exception is None:
# Update the InstructorTask object that is storing its progress.
- log.info(u"Send-email task %s for email %s: succeeded", current_task_id, email_id)
+ log.info("Send-email task %s for email %s: succeeded", current_task_id, email_id)
update_subtask_status(entry_id, current_task_id, new_subtask_status)
elif isinstance(send_exception, RetryTaskError):
# If retrying, a RetryTaskError needs to be returned to Celery.
# We assume that the the progress made before the retry condition
# was encountered has already been updated before the retry call was made,
# so we only log here.
- log.warning(u"Send-email task %s for email %s: being retried", current_task_id, email_id)
+ log.warning("Send-email task %s for email %s: being retried", current_task_id, email_id)
raise send_exception # pylint: disable=raising-bad-type
else:
- log.error(u"Send-email task %s for email %s: failed: %s", current_task_id, email_id, send_exception)
+ log.error("Send-email task %s for email %s: failed: %s", current_task_id, email_id, send_exception)
update_subtask_status(entry_id, current_task_id, new_subtask_status)
raise send_exception # pylint: disable=raising-bad-type
# return status in a form that can be serialized by Celery into JSON:
- log.info(u"Send-email task %s for email %s: returning status %s", current_task_id, email_id, new_subtask_status)
+ log.info("Send-email task %s for email %s: returning status %s", current_task_id, email_id, new_subtask_status)
return new_subtask_status.to_dict()
@@ -388,10 +386,10 @@ def _get_source_address(course_id, course_title, course_language, truncate=True)
# RFC2821 requires the byte order of the email address to be the name then email
# e.g. "John Doe "
# Although the display will be flipped in RTL languages, the byte order is still the same.
- from_addr_format = u'{name} {email}'.format(
+ from_addr_format = '{name} {email}'.format(
# Translators: Bulk email from address e.g. ("Physics 101" Course Staff)
- name=_(u'"{course_title}" Course Staff'),
- email=u'<{course_name}-{from_email}>', # xss-lint: disable=python-wrap-html
+ name=_('"{course_title}" Course Staff'),
+ email='<{course_name}-{from_email}>', # xss-lint: disable=python-wrap-html
)
def format_address(course_title_no_quotes):
@@ -465,7 +463,7 @@ def _send_course_email(entry_id, email_id, to_list, global_email_context, subtas
recipients_info = Counter()
log.info(
- u"BulkEmail ==> Task: %s, SubTask: %s, EmailId: %s, TotalRecipients: %s",
+ "BulkEmail ==> Task: %s, SubTask: %s, EmailId: %s, TotalRecipients: %s",
parent_task_id,
task_id,
email_id,
@@ -476,7 +474,7 @@ def _send_course_email(entry_id, email_id, to_list, global_email_context, subtas
course_email = CourseEmail.objects.get(id=email_id)
except CourseEmail.DoesNotExist as exc:
log.exception(
- u"BulkEmail ==> Task: %s, SubTask: %s, EmailId: %s, Could not find email to send.",
+ "BulkEmail ==> Task: %s, SubTask: %s, EmailId: %s, Could not find email to send.",
parent_task_id,
task_id,
email_id
@@ -525,8 +523,8 @@ def _send_course_email(entry_id, email_id, to_list, global_email_context, subtas
to_list.pop()
total_recipients_failed += 1
log.info(
- u"BulkEmail ==> Email address %s contains non-ascii characters. Skipping sending "
- u"email to %s, EmailId: %s ",
+ "BulkEmail ==> Email address %s contains non-ascii characters. Skipping sending "
+ "email to %s, EmailId: %s ",
email,
current_recipient['profile__name'],
email_id
@@ -539,7 +537,7 @@ def _send_course_email(entry_id, email_id, to_list, global_email_context, subtas
email_context['user_id'] = current_recipient['pk']
email_context['course_id'] = course_email.course_id
email_context['unsubscribe_link'] = get_unsubscribed_link(current_recipient['username'],
- text_type(course_email.course_id))
+ str(course_email.course_id))
# Construct message content using templates and context:
plaintext_msg = course_email_template.render_plaintext(course_email.text_message, email_context)
@@ -565,7 +563,7 @@ def _send_course_email(entry_id, email_id, to_list, global_email_context, subtas
try:
log.info(
- u"BulkEmail ==> Task: %s, SubTask: %s, EmailId: %s, Recipient num: %s/%s, \
+ "BulkEmail ==> Task: %s, SubTask: %s, EmailId: %s, Recipient num: %s/%s, \
Recipient name: %s, Email address: %s",
parent_task_id,
task_id,
@@ -581,7 +579,7 @@ def _send_course_email(entry_id, email_id, to_list, global_email_context, subtas
# According to SMTP spec, we'll retry error codes in the 4xx range. 5xx range indicates hard failure.
total_recipients_failed += 1
log.error(
- u"BulkEmail ==> Status: Failed(SMTPDataError), Task: %s, SubTask: %s, EmailId: %s, \
+ "BulkEmail ==> Status: Failed(SMTPDataError), Task: %s, SubTask: %s, EmailId: %s, \
Recipient num: %s/%s, Email address: %s",
parent_task_id,
task_id,
@@ -596,7 +594,7 @@ def _send_course_email(entry_id, email_id, to_list, global_email_context, subtas
else:
# This will fall through and not retry the message.
log.warning(
- u'BulkEmail ==> Task: %s, SubTask: %s, EmailId: %s, Recipient num: %s/%s, \
+ 'BulkEmail ==> Task: %s, SubTask: %s, EmailId: %s, Recipient num: %s/%s, \
Email not delivered to %s due to error %s',
parent_task_id,
task_id,
@@ -612,7 +610,7 @@ def _send_course_email(entry_id, email_id, to_list, global_email_context, subtas
# This will fall through and not retry the message.
total_recipients_failed += 1
log.error(
- u"BulkEmail ==> Status: Failed(SINGLE_EMAIL_FAILURE_ERRORS), Task: %s, SubTask: %s, \
+ "BulkEmail ==> Status: Failed(SINGLE_EMAIL_FAILURE_ERRORS), Task: %s, SubTask: %s, \
EmailId: %s, Recipient num: %s/%s, Email address: %s, Exception: %s",
parent_task_id,
task_id,
@@ -627,7 +625,7 @@ def _send_course_email(entry_id, email_id, to_list, global_email_context, subtas
else:
total_recipients_successful += 1
log.info(
- u"BulkEmail ==> Status: Success, Task: %s, SubTask: %s, EmailId: %s, \
+ "BulkEmail ==> Status: Success, Task: %s, SubTask: %s, EmailId: %s, \
Recipient num: %s/%s, Email address: %s,",
parent_task_id,
task_id,
@@ -637,9 +635,9 @@ def _send_course_email(entry_id, email_id, to_list, global_email_context, subtas
email
)
if settings.BULK_EMAIL_LOG_SENT_EMAILS:
- log.info(u'Email with id %s sent to %s', email_id, email)
+ log.info('Email with id %s sent to %s', email_id, email)
else:
- log.debug(u'Email with id %s sent to %s', email_id, email)
+ log.debug('Email with id %s sent to %s', email_id, email)
subtask_status.increment(succeeded=1)
# Pop the user that was emailed off the end of the list only once they have
@@ -649,7 +647,7 @@ def _send_course_email(entry_id, email_id, to_list, global_email_context, subtas
to_list.pop()
log.info(
- u"BulkEmail ==> Task: %s, SubTask: %s, EmailId: %s, Total Successful Recipients: %s/%s, \
+ "BulkEmail ==> Task: %s, SubTask: %s, EmailId: %s, Total Successful Recipients: %s/%s, \
Failed Recipients: %s/%s, Time Taken: %s",
parent_task_id,
task_id,
@@ -660,11 +658,11 @@ def _send_course_email(entry_id, email_id, to_list, global_email_context, subtas
total_recipients,
time.time() - start_time
)
- duplicate_recipients = [u"{0} ({1})".format(email, repetition)
+ duplicate_recipients = [f"{email} ({repetition})"
for email, repetition in recipients_info.most_common() if repetition > 1]
if duplicate_recipients:
log.info(
- u"BulkEmail ==> Task: %s, SubTask: %s, EmailId: %s, Total Duplicate Recipients [%s]: [%s]",
+ "BulkEmail ==> Task: %s, SubTask: %s, EmailId: %s, Total Duplicate Recipients [%s]: [%s]",
parent_task_id,
task_id,
email_id,
@@ -693,8 +691,8 @@ def _send_course_email(entry_id, email_id, to_list, global_email_context, subtas
except BULK_EMAIL_FAILURE_ERRORS as exc:
num_pending = len(to_list)
- log.exception((u'Task %s: email with id %d caused send_course_email task to fail '
- u'with u"fatal" exception. %d emails unsent.'),
+ log.exception(('Task %s: email with id %d caused send_course_email task to fail '
+ 'with u"fatal" exception. %d emails unsent.'),
task_id, email_id, num_pending)
# Update counters with progress to date, counting unsent emails as failures,
# and set the state to FAILURE:
@@ -706,7 +704,7 @@ def _send_course_email(entry_id, email_id, to_list, global_email_context, subtas
# without popping the current recipient off of the existing list.
# These are unexpected errors. Since they might be due to a temporary condition that might
# succeed on retry, we give them a retry.
- log.exception((u'Task %s: email with id %d caused send_course_email task to fail '
+ log.exception(('Task %s: email with id %d caused send_course_email task to fail '
'with unexpected exception. Generating retry.'),
task_id, email_id)
# Increment the "retried_withmax" counter, update other counters with progress to date,
@@ -769,7 +767,7 @@ def _submit_for_retry(entry_id, email_id, to_list, global_email_context,
Otherwise, it (ought to be) the current_exception passed in.
"""
task_id = subtask_status.task_id
- log.info(u"Task %s: Successfully sent to %s users; failed to send to %s users (and skipped %s users)",
+ log.info("Task %s: Successfully sent to %s users; failed to send to %s users (and skipped %s users)",
task_id, subtask_status.succeeded, subtask_status.failed, subtask_status.skipped)
# Calculate time until we retry this task (in seconds):
@@ -794,8 +792,8 @@ def _submit_for_retry(entry_id, email_id, to_list, global_email_context,
# retries are deferred by the same amount.
countdown = ((2 ** retry_index) * base_delay) * random.uniform(.75, 1.25)
- log.warning((u'Task %s: email with id %d not delivered due to %s error %s, '
- u'retrying send to %d recipients in %s seconds (with max_retry=%s)'),
+ log.warning(('Task %s: email with id %d not delivered due to %s error %s, '
+ 'retrying send to %d recipients in %s seconds (with max_retry=%s)'),
task_id, email_id, exception_type, current_exception, len(to_list), countdown, max_retries)
# we make sure that we update the InstructorTask with the current subtask status
@@ -824,7 +822,7 @@ def _submit_for_retry(entry_id, email_id, to_list, global_email_context,
except RetryTaskError as retry_error:
# If the retry call is successful, update with the current progress:
log.info(
- u'Task %s: email with id %d caused send_course_email task to retry again.',
+ 'Task %s: email with id %d caused send_course_email task to retry again.',
task_id,
email_id
)
@@ -835,7 +833,7 @@ def _submit_for_retry(entry_id, email_id, to_list, global_email_context,
# (and put it in retry_exc just in case it's different, but it shouldn't be),
# and update status as if it were any other failure. That means that
# the recipients still in the to_list are counted as failures.
- log.exception(u'Task %s: email with id %d caused send_course_email task to fail to retry. To list: %s',
+ log.exception('Task %s: email with id %d caused send_course_email task to fail to retry. To list: %s',
task_id, email_id, [i['email'] for i in to_list])
num_failed = len(to_list)
subtask_status.increment(failed=num_failed, state=FAILURE)
diff --git a/lms/djangoapps/bulk_email/tests/test_course_optout.py b/lms/djangoapps/bulk_email/tests/test_course_optout.py
index 81d1a6ed1c..9e32863d5b 100644
--- a/lms/djangoapps/bulk_email/tests/test_course_optout.py
+++ b/lms/djangoapps/bulk_email/tests/test_course_optout.py
@@ -1,10 +1,10 @@
-# -*- coding: utf-8 -*-
"""
Unit tests for student optouts from course email
"""
import json
+from unittest.mock import Mock, patch
from django.core import mail
from django.core.management import call_command
@@ -13,18 +13,15 @@ from edx_ace.channel import ChannelType
from edx_ace.message import Message
from edx_ace.policy import PolicyResult
from edx_ace.recipient import Recipient
-from mock import Mock, patch
-from six import text_type
-from lms.djangoapps.bulk_email.models import BulkEmailFlag
-from lms.djangoapps.bulk_email.policies import CourseEmailOptout
from common.djangoapps.student.models import CourseEnrollment
from common.djangoapps.student.tests.factories import AdminFactory, CourseEnrollmentFactory, UserFactory
+from lms.djangoapps.bulk_email.api import get_unsubscribed_link
+from lms.djangoapps.bulk_email.models import BulkEmailFlag
+from lms.djangoapps.bulk_email.policies import CourseEmailOptout
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
from xmodule.modulestore.tests.factories import CourseFactory
-from lms.djangoapps.bulk_email.api import get_unsubscribed_link
-
@patch('lms.djangoapps.bulk_email.models.html_to_text', Mock(return_value='Mocking CourseEmail.text_message', autospec=True)) # lint-amnesty, pylint: disable=line-too-long
class TestOptoutCourseEmails(ModuleStoreTestCase):
@@ -33,8 +30,8 @@ class TestOptoutCourseEmails(ModuleStoreTestCase):
"""
def setUp(self):
- super(TestOptoutCourseEmails, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
- course_title = u"ẗëṡẗ title イ乇丂イ ᄊ乇丂丂ムg乇 キo尺 ムレレ тэѕт мэѕѕаБэ"
+ super().setUp()
+ course_title = "ẗëṡẗ title イ乇丂イ ᄊ乇丂丂ムg乇 キo尺 ムレレ тэѕт мэѕѕаБэ"
self.course = CourseFactory.create(run='testcourse1', display_name=course_title)
self.instructor = AdminFactory.create()
self.student = UserFactory.create()
@@ -45,9 +42,9 @@ class TestOptoutCourseEmails(ModuleStoreTestCase):
self.client.login(username=self.student.username, password="test")
- self.send_mail_url = reverse('send_email', kwargs={'course_id': text_type(self.course.id)})
+ self.send_mail_url = reverse('send_email', kwargs={'course_id': str(self.course.id)})
self.success_content = {
- 'course_id': text_type(self.course.id),
+ 'course_id': str(self.course.id),
'success': True,
}
BulkEmailFlag.objects.create(enabled=True, require_course_email_auth=False)
@@ -55,7 +52,7 @@ class TestOptoutCourseEmails(ModuleStoreTestCase):
def navigate_to_email_view(self):
"""Navigate to the instructor dash's email view"""
# Pull up email view on instructor dashboard
- url = reverse('instructor_dashboard', kwargs={'course_id': text_type(self.course.id)})
+ url = reverse('instructor_dashboard', kwargs={'course_id': str(self.course.id)})
response = self.client.get(url)
email_section = ''
# If this fails, it is likely because BulkEmailFlag.is_enabled() is set to False
@@ -68,7 +65,7 @@ class TestOptoutCourseEmails(ModuleStoreTestCase):
url = reverse('change_email_settings')
# This is a checkbox, so on the post of opting out (that is, an Un-check of the box),
# the Post that is sent will not contain 'receive_emails'
- response = self.client.post(url, {'course_id': text_type(self.course.id)})
+ response = self.client.post(url, {'course_id': str(self.course.id)})
assert json.loads(response.content.decode('utf-8')) == {'success': True}
self.client.logout()
@@ -97,7 +94,7 @@ class TestOptoutCourseEmails(ModuleStoreTestCase):
self.client.login(username=self.instructor.username, password="test")
- unsubscribe_link = get_unsubscribed_link(self.student.username, text_type(self.course.id))
+ unsubscribe_link = get_unsubscribed_link(self.student.username, str(self.course.id))
response = self.client.post(unsubscribe_link, {'unsubscribe': True})
assert response.status_code == 200
@@ -118,7 +115,7 @@ class TestOptoutCourseEmails(ModuleStoreTestCase):
Make sure student receives course email after opting in.
"""
url = reverse('change_email_settings')
- response = self.client.post(url, {'course_id': text_type(self.course.id), 'receive_emails': 'on'})
+ response = self.client.post(url, {'course_id': str(self.course.id), 'receive_emails': 'on'})
assert json.loads(response.content.decode('utf-8')) == {'success': True}
self.client.logout()
@@ -151,8 +148,8 @@ class TestACEOptoutCourseEmails(ModuleStoreTestCase):
"""
def setUp(self):
- super(TestACEOptoutCourseEmails, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
- course_title = u"ẗëṡẗ title イ乇丂イ ᄊ乇丂丂ムg乇 キo尺 ムレレ тэѕт мэѕѕаБэ"
+ super().setUp()
+ course_title = "ẗëṡẗ title イ乇丂イ ᄊ乇丂丂ムg乇 キo尺 ムレレ тэѕт мэѕѕаБэ"
self.course = CourseFactory.create(run='testcourse1', display_name=course_title)
self.instructor = AdminFactory.create()
self.student = UserFactory.create()
@@ -167,7 +164,7 @@ class TestACEOptoutCourseEmails(ModuleStoreTestCase):
url = reverse('change_email_settings')
# This is a checkbox, so on the post of opting out (that is, an Un-check of the box),
# the Post that is sent will not contain 'receive_emails'
- post_data = {'course_id': text_type(self.course.id)}
+ post_data = {'course_id': str(self.course.id)}
if not opted_out:
post_data['receive_emails'] = 'on'
diff --git a/lms/djangoapps/bulk_email/tests/test_email.py b/lms/djangoapps/bulk_email/tests/test_email.py
index bcde7a1d8c..56f5faea27 100644
--- a/lms/djangoapps/bulk_email/tests/test_email.py
+++ b/lms/djangoapps/bulk_email/tests/test_email.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
"""
Unit tests for sending course email
"""
@@ -7,10 +6,9 @@ Unit tests for sending course email
import json
import os
from unittest import skipIf
+from unittest.mock import Mock, patch
import ddt
-import six
-from six.moves import range
from django.conf import settings
from django.core import mail
from django.core.mail.message import forbid_multi_line_headers
@@ -19,30 +17,29 @@ from django.test.utils import override_settings
from django.urls import reverse
from django.utils.translation import get_language
from markupsafe import escape
-from mock import Mock, patch
+
+from common.djangoapps.course_modes.models import CourseMode
+from common.djangoapps.student.models import CourseEnrollment
+from common.djangoapps.student.roles import CourseStaffRole
+from common.djangoapps.student.tests.factories import CourseEnrollmentFactory, UserFactory
+from lms.djangoapps.bulk_email.tasks import _get_course_email_context, _get_source_address
+from lms.djangoapps.courseware.tests.factories import InstructorFactory, StaffFactory
+from lms.djangoapps.instructor_task.subtasks import update_subtask_status
+from openedx.core.djangoapps.course_groups.cohorts import add_user_to_cohort
+from openedx.core.djangoapps.course_groups.models import CourseCohort
+from openedx.core.djangoapps.enrollments.api import update_enrollment
+from xmodule.modulestore import ModuleStoreEnum
+from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase
+from xmodule.modulestore.tests.factories import CourseFactory
from ..models import BulkEmailFlag, Optout
-from lms.djangoapps.bulk_email.tasks import _get_course_email_context, _get_source_address # lint-amnesty, pylint: disable=wrong-import-order
-from common.djangoapps.course_modes.models import CourseMode # lint-amnesty, pylint: disable=wrong-import-order
-
-from lms.djangoapps.courseware.tests.factories import InstructorFactory, StaffFactory # lint-amnesty, pylint: disable=wrong-import-order
-from lms.djangoapps.instructor_task.subtasks import update_subtask_status # lint-amnesty, pylint: disable=wrong-import-order
-from openedx.core.djangoapps.course_groups.cohorts import add_user_to_cohort # lint-amnesty, pylint: disable=wrong-import-order
-from openedx.core.djangoapps.course_groups.models import CourseCohort # lint-amnesty, pylint: disable=wrong-import-order
-from openedx.core.djangoapps.enrollments.api import update_enrollment # lint-amnesty, pylint: disable=wrong-import-order
-from common.djangoapps.student.models import CourseEnrollment # lint-amnesty, pylint: disable=wrong-import-order
-from common.djangoapps.student.roles import CourseStaffRole # lint-amnesty, pylint: disable=wrong-import-order
-from common.djangoapps.student.tests.factories import CourseEnrollmentFactory, UserFactory # lint-amnesty, pylint: disable=wrong-import-order
-from xmodule.modulestore import ModuleStoreEnum # lint-amnesty, pylint: disable=wrong-import-order
-from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase # lint-amnesty, pylint: disable=wrong-import-order
-from xmodule.modulestore.tests.factories import CourseFactory # lint-amnesty, pylint: disable=wrong-import-order
STAFF_COUNT = 3
STUDENT_COUNT = 10
LARGE_NUM_EMAILS = 137
-class MockCourseEmailResult(object):
+class MockCourseEmailResult:
"""
A small closure-like class to keep count of emails sent over all tasks, recorded
by mock object side effects
@@ -95,7 +92,7 @@ class EmailSendFromDashboardTestCase(SharedModuleStoreTestCase):
Goes to the instructor dashboard to verify that the email section is
there.
"""
- url = reverse('instructor_dashboard', kwargs={'course_id': six.text_type(self.course.id)})
+ url = reverse('instructor_dashboard', kwargs={'course_id': str(self.course.id)})
# Response loads the whole instructor dashboard, so no need to explicitly
# navigate to a particular email section
response = self.client.get(url)
@@ -105,15 +102,15 @@ class EmailSendFromDashboardTestCase(SharedModuleStoreTestCase):
@classmethod
def setUpClass(cls):
- super(EmailSendFromDashboardTestCase, cls).setUpClass()
- course_title = u"ẗëṡẗ title イ乇丂イ ᄊ乇丂丂ムg乇 キo尺 ムレレ тэѕт мэѕѕаБэ"
+ super().setUpClass()
+ course_title = "ẗëṡẗ title イ乇丂イ ᄊ乇丂丂ムg乇 キo尺 ムレレ тэѕт мэѕѕаБэ"
cls.course = CourseFactory.create(
display_name=course_title,
default_store=ModuleStoreEnum.Type.split
)
def setUp(self):
- super(EmailSendFromDashboardTestCase, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
+ super().setUp()
BulkEmailFlag.objects.create(enabled=True, require_course_email_auth=False)
self.create_staff_and_instructor()
self.create_students()
@@ -126,19 +123,19 @@ class EmailSendFromDashboardTestCase(SharedModuleStoreTestCase):
# Pulling up the instructor dash email view here allows us to test sending emails in tests
self.goto_instructor_dash_email_view()
self.send_mail_url = reverse(
- 'send_email', kwargs={'course_id': six.text_type(self.course.id)}
+ 'send_email', kwargs={'course_id': str(self.course.id)}
)
self.success_content = {
- 'course_id': six.text_type(self.course.id),
+ 'course_id': str(self.course.id),
'success': True,
}
def tearDown(self):
- super(EmailSendFromDashboardTestCase, self).tearDown() # lint-amnesty, pylint: disable=super-with-arguments
+ super().tearDown()
BulkEmailFlag.objects.all().delete()
-class SendEmailWithMockedUgettextMixin(object):
+class SendEmailWithMockedUgettextMixin:
"""
Mock uggetext for EmailSendFromDashboardTestCase.
"""
@@ -161,7 +158,7 @@ class SendEmailWithMockedUgettextMixin(object):
>>> mock_ugettext('Hello') == 'AR Hello'
"""
- return u'{lang} {text}'.format(
+ return '{lang} {text}'.format(
lang=get_language().upper(),
text=text,
)
@@ -214,8 +211,8 @@ class LocalizedFromAddressCourseLangTestCase(SendEmailWithMockedUgettextMixin, E
"""
Creates a different course.
"""
- super(LocalizedFromAddressCourseLangTestCase, cls).setUpClass()
- course_title = u"ẗëṡẗ イэ"
+ super().setUpClass()
+ course_title = "ẗëṡẗ イэ"
cls.course = CourseFactory.create(
display_name=course_title,
language='ar',
@@ -288,11 +285,7 @@ class TestEmailSendFromDashboardMockedHtmlToText(EmailSendFromDashboardTestCase)
# the 1 is for the instructor in this test and others
assert len(mail.outbox) == (1 + len(self.staff))
- six.assertCountEqual(
- self,
- [e.to[0] for e in mail.outbox],
- [self.instructor.email] + [s.email for s in self.staff]
- )
+ assert len([e.to[0] for e in mail.outbox]) == len([self.instructor.email] + [s.email for s in self.staff])
def test_send_to_cohort(self):
"""
@@ -303,18 +296,14 @@ class TestEmailSendFromDashboardMockedHtmlToText(EmailSendFromDashboardTestCase)
add_user_to_cohort(cohort.course_user_group, student.username)
test_email = {
'action': 'Send email',
- 'send_to': '["cohort:{}"]'.format(cohort.course_user_group.name),
+ 'send_to': f'["cohort:{cohort.course_user_group.name}"]',
'subject': 'test subject for cohort',
'message': 'test message for cohort'
}
response = self.client.post(self.send_mail_url, test_email)
assert json.loads(response.content.decode('utf-8')) == self.success_content
- six.assertCountEqual(
- self,
- [e.to[0] for e in mail.outbox],
- [s.email for s in self.students]
- )
+ assert len([e.to[0] for e in mail.outbox]) == len([s.email for s in self.students])
def test_send_to_cohort_unenrolled(self):
"""
@@ -326,7 +315,7 @@ class TestEmailSendFromDashboardMockedHtmlToText(EmailSendFromDashboardTestCase)
add_user_to_cohort(cohort.course_user_group, student.username)
test_email = {
'action': 'Send email',
- 'send_to': '["cohort:{}"]'.format(cohort.course_user_group.name),
+ 'send_to': f'["cohort:{cohort.course_user_group.name}"]',
'subject': 'test subject for cohort',
'message': 'test message for cohort'
}
@@ -342,7 +331,7 @@ class TestEmailSendFromDashboardMockedHtmlToText(EmailSendFromDashboardTestCase)
"""
CourseMode.objects.create(mode_slug='test', course_id=self.course.id)
for student in self.students:
- update_enrollment(student, six.text_type(self.course.id), 'test')
+ update_enrollment(student, str(self.course.id), 'test')
test_email = {
'action': 'Send email',
'send_to': '["track:test"]',
@@ -352,11 +341,7 @@ class TestEmailSendFromDashboardMockedHtmlToText(EmailSendFromDashboardTestCase)
response = self.client.post(self.send_mail_url, test_email)
assert json.loads(response.content.decode('utf-8')) == self.success_content
- six.assertCountEqual(
- self,
- [e.to[0] for e in mail.outbox],
- [s.email for s in self.students]
- )
+ assert len([e.to[0] for e in mail.outbox]) == len([s.email for s in self.students])
def test_send_to_track_other_enrollments(self):
"""
@@ -367,7 +352,7 @@ class TestEmailSendFromDashboardMockedHtmlToText(EmailSendFromDashboardTestCase)
# Create a mode and designate an enrolled user to be placed in that mode
CourseMode.objects.create(mode_slug='test_mode', course_id=self.course.id)
test_mode_student = self.students[0]
- update_enrollment(test_mode_student, six.text_type(self.course.id), 'test_mode')
+ update_enrollment(test_mode_student, str(self.course.id), 'test_mode')
# Take another user already enrolled in the course, then enroll them in
# another course but in that same test mode
@@ -378,7 +363,7 @@ class TestEmailSendFromDashboardMockedHtmlToText(EmailSendFromDashboardTestCase)
user=test_mode_student_other_course,
course_id=other_course.id
)
- update_enrollment(test_mode_student_other_course, six.text_type(other_course.id), 'test_mode')
+ update_enrollment(test_mode_student_other_course, str(other_course.id), 'test_mode')
# Send the emails...
test_email = {
@@ -411,11 +396,8 @@ class TestEmailSendFromDashboardMockedHtmlToText(EmailSendFromDashboardTestCase)
# the 1 is for the instructor
assert len(mail.outbox) == ((1 + len(self.staff)) + len(self.students))
- six.assertCountEqual(
- self,
- [e.to[0] for e in mail.outbox],
- [self.instructor.email] + [s.email for s in self.staff] + [s.email for s in self.students]
- )
+ assert len([e.to[0] for e in mail.outbox]) == \
+ len([self.instructor.email] + [s.email for s in self.staff] + [s.email for s in self.students])
@override_settings(BULK_EMAIL_JOB_SIZE_THRESHOLD=1)
def test_send_to_all_high_queue(self):
@@ -458,7 +440,7 @@ class TestEmailSendFromDashboardMockedHtmlToText(EmailSendFromDashboardTestCase)
Make sure email (with Unicode characters) send to all goes there.
"""
- uni_subject = u'téśt śúbjéćt főŕ áĺĺ'
+ uni_subject = 'téśt śúbjéćt főŕ áĺĺ'
test_email = {
'action': 'Send email',
'send_to': '["myself", "staff", "learners"]',
@@ -469,11 +451,8 @@ class TestEmailSendFromDashboardMockedHtmlToText(EmailSendFromDashboardTestCase)
assert json.loads(response.content.decode('utf-8')) == self.success_content
assert len(mail.outbox) == ((1 + len(self.staff)) + len(self.students))
- six.assertCountEqual(
- self,
- [e.to[0] for e in mail.outbox],
- [self.instructor.email] + [s.email for s in self.staff] + [s.email for s in self.students]
- )
+ assert len([e.to[0] for e in mail.outbox]) ==\
+ len([self.instructor.email] + [s.email for s in self.staff] + [s.email for s in self.students])
assert mail.outbox[0].subject == uni_subject
def test_unicode_students_send_to_all(self):
@@ -482,7 +461,7 @@ class TestEmailSendFromDashboardMockedHtmlToText(EmailSendFromDashboardTestCase)
"""
# Create a student with Unicode in their first & last names
- unicode_user = UserFactory(first_name=u'Ⓡⓞⓑⓞⓣ', last_name=u'ՇﻉรՇ')
+ unicode_user = UserFactory(first_name='Ⓡⓞⓑⓞⓣ', last_name='ՇﻉรՇ')
CourseEnrollmentFactory.create(user=unicode_user, course_id=self.course.id)
self.students.append(unicode_user)
@@ -497,11 +476,8 @@ class TestEmailSendFromDashboardMockedHtmlToText(EmailSendFromDashboardTestCase)
assert len(mail.outbox) == ((1 + len(self.staff)) + len(self.students))
- six.assertCountEqual(
- self,
- [e.to[0] for e in mail.outbox],
- [self.instructor.email] + [s.email for s in self.staff] + [s.email for s in self.students]
- )
+ assert len([e.to[0] for e in mail.outbox]) ==\
+ len([self.instructor.email] + [s.email for s in self.staff] + [s.email for s in self.students])
@override_settings(BULK_EMAIL_DEFAULT_FROM_EMAIL="no-reply@courseupdates.edx.org")
def test_long_course_display_name(self):
@@ -519,7 +495,7 @@ class TestEmailSendFromDashboardMockedHtmlToText(EmailSendFromDashboardTestCase)
# make display_name that's longer than 320 characters when encoded
# to ascii and escaped, but shorter than 320 unicode characters
- long_name = u"Финансовое программирование и политика, часть 1: макроэкономические счета и анализ"
+ long_name = "Финансовое программирование и политика, часть 1: макроэкономические счета и анализ"
course = CourseFactory.create(
display_name=long_name,
@@ -545,7 +521,7 @@ class TestEmailSendFromDashboardMockedHtmlToText(EmailSendFromDashboardTestCase)
assert len(unexpected_from_addr) == 137
self.login_as_user(instructor)
- send_mail_url = reverse('send_email', kwargs={'course_id': six.text_type(course.id)})
+ send_mail_url = reverse('send_email', kwargs={'course_id': str(course.id)})
response = self.client.post(send_mail_url, test_email)
assert json.loads(response.content.decode('utf-8'))['success']
@@ -553,7 +529,7 @@ class TestEmailSendFromDashboardMockedHtmlToText(EmailSendFromDashboardTestCase)
from_email = mail.outbox[0].from_email
expected_from_addr = (
- u'"{course_name}" Course Staff <{course_name}-no-reply@courseupdates.edx.org>'
+ '"{course_name}" Course Staff <{course_name}-no-reply@courseupdates.edx.org>'
).format(course_name=course.id.course)
assert from_email == expected_from_addr
@@ -596,7 +572,7 @@ class TestEmailSendFromDashboardMockedHtmlToText(EmailSendFromDashboardTestCase)
[s.email for s in self.staff] +
[s.email for s in self.students] +
[s.email for s in added_users if s not in optouts])
- six.assertCountEqual(self, outbox_contents, should_send_contents)
+ assert len(outbox_contents) == len(should_send_contents)
def test_unsubscribe_link_in_email(self):
"""
@@ -617,8 +593,8 @@ class TestEmailSendFromDashboardMockedHtmlToText(EmailSendFromDashboardTestCase)
plain_template = m.body
html_template = m.alternatives[0][0]
- assert u'bulk_email/email/optout/' in plain_template
- assert u'bulk_email/email/optout/' in html_template
+ assert 'bulk_email/email/optout/' in plain_template
+ assert 'bulk_email/email/optout/' in html_template
@skipIf(os.environ.get("TRAVIS") == 'true', "Skip this test in Travis CI.")
@@ -635,7 +611,7 @@ class TestEmailSendFromDashboard(EmailSendFromDashboardTestCase):
Make sure email (with Unicode characters) send to all goes there.
"""
- uni_message = u'ẗëṡẗ ṁëṡṡäġë ḟöṛ äḷḷ イ乇丂イ ᄊ乇丂丂ムg乇 キo尺 ムレレ тэѕт мэѕѕаБэ fоѓ аll'
+ uni_message = 'ẗëṡẗ ṁëṡṡäġë ḟöṛ äḷḷ イ乇丂イ ᄊ乇丂丂ムg乇 キo尺 ムレレ тэѕт мэѕѕаБэ fоѓ аll'
test_email = {
'action': 'Send email',
'send_to': '["myself", "staff", "learners"]',
@@ -646,11 +622,8 @@ class TestEmailSendFromDashboard(EmailSendFromDashboardTestCase):
assert json.loads(response.content.decode('utf-8')) == self.success_content
assert len(mail.outbox) == ((1 + len(self.staff)) + len(self.students))
- six.assertCountEqual(
- self,
- [e.to[0] for e in mail.outbox],
- [self.instructor.email] + [s.email for s in self.staff] + [s.email for s in self.students]
- )
+ assert len([e.to[0] for e in mail.outbox]) ==\
+ len([self.instructor.email] + [s.email for s in self.staff] + [s.email for s in self.students])
message_body = mail.outbox[0].body
assert uni_message in message_body
@@ -666,8 +639,8 @@ class TestCourseEmailContext(SharedModuleStoreTestCase):
"""
Create a course shared by all tests.
"""
- super(TestCourseEmailContext, cls).setUpClass()
- cls.course_title = u"Финансовое программирование и политика, часть 1: макроэкономические счета и анализ"
+ super().setUpClass()
+ cls.course_title = "Финансовое программирование и политика, часть 1: макроэкономические счета и анализ"
cls.course_org = 'IMF'
cls.course_number = "FPP.1x"
cls.course_run = "2016"
diff --git a/lms/djangoapps/bulk_email/tests/test_err_handling.py b/lms/djangoapps/bulk_email/tests/test_err_handling.py
index 89f2ebad81..b54f41ac0e 100644
--- a/lms/djangoapps/bulk_email/tests/test_err_handling.py
+++ b/lms/djangoapps/bulk_email/tests/test_err_handling.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
"""
Unit tests for handling email sending errors
"""
@@ -7,6 +6,8 @@ Unit tests for handling email sending errors
import json
from itertools import cycle
from smtplib import SMTPConnectError, SMTPDataError, SMTPServerDisconnected
+from unittest.mock import Mock, patch
+
import pytest
import ddt
from celery.states import RETRY, SUCCESS
@@ -14,11 +15,9 @@ from django.conf import settings
from django.core.management import call_command
from django.db import DatabaseError
from django.urls import reverse
-from mock import Mock, patch
from opaque_keys.edx.locator import CourseLocator
-from six import text_type
-from six.moves import range
+from common.djangoapps.student.tests.factories import AdminFactory, CourseEnrollmentFactory, UserFactory
from lms.djangoapps.bulk_email.models import SEND_TO_MYSELF, BulkEmailFlag, CourseEmail
from lms.djangoapps.bulk_email.tasks import perform_delegate_email_batches, send_course_email
from lms.djangoapps.courseware.exceptions import CourseRunNotFound
@@ -31,7 +30,6 @@ from lms.djangoapps.instructor_task.subtasks import (
initialize_subtask_info,
update_subtask_status
)
-from common.djangoapps.student.tests.factories import AdminFactory, CourseEnrollmentFactory, UserFactory
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
from xmodule.modulestore.tests.factories import CourseFactory
@@ -51,29 +49,29 @@ class TestEmailErrors(ModuleStoreTestCase):
ENABLED_CACHES = ['default', 'mongo_metadata_inheritance', 'loc_cache']
def setUp(self):
- super(TestEmailErrors, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
- course_title = u"ẗëṡẗ title イ乇丂イ ᄊ乇丂丂ムg乇 キo尺 ムレレ тэѕт мэѕѕаБэ"
+ super().setUp()
+ course_title = "ẗëṡẗ title イ乇丂イ ᄊ乇丂丂ムg乇 キo尺 ムレレ тэѕт мэѕѕаБэ"
self.course = CourseFactory.create(display_name=course_title)
self.instructor = AdminFactory.create()
self.client.login(username=self.instructor.username, password="test")
# load initial content (since we don't run migrations as part of tests):
call_command("loaddata", "course_email_template.json")
- self.url = reverse('instructor_dashboard', kwargs={'course_id': text_type(self.course.id)})
- self.send_mail_url = reverse('send_email', kwargs={'course_id': text_type(self.course.id)})
+ self.url = reverse('instructor_dashboard', kwargs={'course_id': str(self.course.id)})
+ self.send_mail_url = reverse('send_email', kwargs={'course_id': str(self.course.id)})
self.success_content = {
- 'course_id': text_type(self.course.id),
+ 'course_id': str(self.course.id),
'success': True,
}
@classmethod
def setUpClass(cls):
- super(TestEmailErrors, cls).setUpClass()
+ super().setUpClass()
BulkEmailFlag.objects.create(enabled=True, require_course_email_auth=False)
@classmethod
def tearDownClass(cls):
- super(TestEmailErrors, cls).tearDownClass()
+ super().tearDownClass()
BulkEmailFlag.objects.all().delete()
@patch('lms.djangoapps.bulk_email.tasks.get_connection', autospec=True)
@@ -226,7 +224,7 @@ class TestEmailErrors(ModuleStoreTestCase):
email = CourseEmail.create( # pylint: disable=unused-variable
self.course.id,
self.instructor,
- [u"{}:IDONTEXIST".format(target_type)],
+ [f"{target_type}:IDONTEXIST"],
"re: subject",
"dummy body goes here"
)
diff --git a/lms/djangoapps/bulk_email/tests/test_forms.py b/lms/djangoapps/bulk_email/tests/test_forms.py
index 7f9bee54f6..6000b179d6 100644
--- a/lms/djangoapps/bulk_email/tests/test_forms.py
+++ b/lms/djangoapps/bulk_email/tests/test_forms.py
@@ -1,11 +1,9 @@
-# -*- coding: utf-8 -*-
"""
Unit tests for bulk-email-related forms.
"""
from opaque_keys.edx.locator import CourseLocator
-from six import text_type
from lms.djangoapps.bulk_email.api import is_bulk_email_feature_enabled
from lms.djangoapps.bulk_email.forms import CourseAuthorizationAdminForm, CourseEmailTemplateForm
@@ -18,20 +16,20 @@ class CourseAuthorizationFormTest(ModuleStoreTestCase):
"""Test the CourseAuthorizationAdminForm form for Mongo-backed courses."""
def setUp(self):
- super(CourseAuthorizationFormTest, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
- course_title = u"ẗëṡẗ title イ乇丂イ ᄊ乇丂丂ムg乇 キo尺 ムレレ тэѕт мэѕѕаБэ"
+ super().setUp()
+ course_title = "ẗëṡẗ title イ乇丂イ ᄊ乇丂丂ムg乇 キo尺 ムレレ тэѕт мэѕѕаБэ"
self.course = CourseFactory.create(display_name=course_title)
BulkEmailFlag.objects.create(enabled=True, require_course_email_auth=True)
def tearDown(self):
- super(CourseAuthorizationFormTest, self).tearDown() # lint-amnesty, pylint: disable=super-with-arguments
+ super().tearDown()
BulkEmailFlag.objects.all().delete()
def test_authorize_mongo_course(self):
# Initially course shouldn't be authorized
assert not is_bulk_email_feature_enabled(self.course.id)
# Test authorizing the course, which should totally work
- form_data = {'course_id': text_type(self.course.id), 'email_enabled': True}
+ form_data = {'course_id': str(self.course.id), 'email_enabled': True}
form = CourseAuthorizationAdminForm(data=form_data)
# Validation should work
assert form.is_valid()
@@ -43,7 +41,7 @@ class CourseAuthorizationFormTest(ModuleStoreTestCase):
# Initially course shouldn't be authorized
assert not is_bulk_email_feature_enabled(self.course.id)
# Test authorizing the course, which should totally work
- form_data = {'course_id': text_type(self.course.id), 'email_enabled': True}
+ form_data = {'course_id': str(self.course.id), 'email_enabled': True}
form = CourseAuthorizationAdminForm(data=form_data)
# Validation should work
assert form.is_valid()
@@ -52,7 +50,7 @@ class CourseAuthorizationFormTest(ModuleStoreTestCase):
assert is_bulk_email_feature_enabled(self.course.id)
# Now make a new course authorization with the same course id that tries to turn email off
- form_data = {'course_id': text_type(self.course.id), 'email_enabled': False}
+ form_data = {'course_id': str(self.course.id), 'email_enabled': False}
form = CourseAuthorizationAdminForm(data=form_data)
# Validation should not work because course_id field is unique
assert not form.is_valid()
@@ -69,15 +67,15 @@ class CourseAuthorizationFormTest(ModuleStoreTestCase):
def test_form_typo(self):
# Munge course id
- bad_id = CourseLocator(u'Broken{}'.format(self.course.id.org), 'hello', self.course.id.run + '_typo')
+ bad_id = CourseLocator(f'Broken{self.course.id.org}', 'hello', self.course.id.run + '_typo')
- form_data = {'course_id': text_type(bad_id), 'email_enabled': True}
+ form_data = {'course_id': str(bad_id), 'email_enabled': True}
form = CourseAuthorizationAdminForm(data=form_data)
# Validation shouldn't work
assert not form.is_valid()
- msg = u'Course not found.'
- msg += u' Entered course id was: "{0}".'.format(text_type(bad_id))
+ msg = 'Course not found.'
+ msg += ' Entered course id was: "{}".'.format(str(bad_id))
assert msg == form._errors['course_id'][0] # pylint: disable=protected-access
with self.assertRaisesRegex(
@@ -92,8 +90,8 @@ class CourseAuthorizationFormTest(ModuleStoreTestCase):
# Validation shouldn't work
assert not form.is_valid()
- msg = u'Course id invalid.'
- msg += u' Entered course id was: "asd::**!@#$%^&*())//foobar!!".'
+ msg = 'Course id invalid.'
+ msg += ' Entered course id was: "asd::**!@#$%^&*())//foobar!!".'
assert msg == form._errors['course_id'][0] # pylint: disable=protected-access
with self.assertRaisesRegex(
@@ -110,7 +108,7 @@ class CourseAuthorizationFormTest(ModuleStoreTestCase):
assert not form.is_valid()
error_msg = form._errors['course_id'][0] # pylint: disable=protected-access
- assert u'Entered course id was: "{0}".'.format(self.course.id.run) in error_msg
+ assert f'Entered course id was: "{self.course.id.run}".' in error_msg
with self.assertRaisesRegex(
ValueError,
diff --git a/lms/djangoapps/bulk_email/tests/test_models.py b/lms/djangoapps/bulk_email/tests/test_models.py
index 1adabc9c20..4940b5e472 100644
--- a/lms/djangoapps/bulk_email/tests/test_models.py
+++ b/lms/djangoapps/bulk_email/tests/test_models.py
@@ -4,15 +4,17 @@ Unit tests for bulk-email-related models.
import datetime
+from unittest.mock import Mock, patch
import pytest
import ddt
from django.core.management import call_command
from django.test import TestCase
-from mock import Mock, patch
from opaque_keys.edx.keys import CourseKey
from pytz import UTC
+from common.djangoapps.course_modes.models import CourseMode
+from common.djangoapps.student.tests.factories import UserFactory
from lms.djangoapps.bulk_email.api import is_bulk_email_feature_enabled
from lms.djangoapps.bulk_email.models import (
SEND_TO_COHORT,
@@ -22,11 +24,9 @@ from lms.djangoapps.bulk_email.models import (
CourseAuthorization,
CourseEmail,
CourseEmailTemplate,
- Optout,
+ Optout
)
-from common.djangoapps.course_modes.models import CourseMode
from openedx.core.djangoapps.course_groups.models import CourseCohort
-from common.djangoapps.student.tests.factories import UserFactory
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
from xmodule.modulestore.tests.factories import CourseFactory
@@ -118,7 +118,7 @@ class CourseEmailTest(ModuleStoreTestCase):
mode_display_name = free_mode.capitalize
course_id = course.id
sender = UserFactory.create()
- to_option = 'track:{}'.format(free_mode)
+ to_option = f'track:{free_mode}'
subject = "dummy subject"
html_message = "dummy message"
CourseMode.objects.create(
@@ -131,8 +131,8 @@ class CourseEmailTest(ModuleStoreTestCase):
assert len(email.targets.all()) == 1
target = email.targets.all()[0]
assert target.target_type == SEND_TO_TRACK
- assert target.short_display() == 'track-{}'.format(free_mode)
- assert target.long_display() == u'Course mode: {}'.format(mode_display_name)
+ assert target.short_display() == f'track-{free_mode}'
+ assert target.long_display() == f'Course mode: {mode_display_name}'
def test_cohort_target(self):
course_id = CourseKey.from_string('abc/123/doremi')
@@ -176,7 +176,7 @@ class CourseEmailTemplateTest(TestCase):
"""Test the CourseEmailTemplate model."""
def setUp(self):
- super(CourseEmailTemplateTest, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
+ super().setUp()
# load initial content (since we don't run migrations as part of tests):
call_command("loaddata", "course_email_template.json")
@@ -219,8 +219,8 @@ class CourseEmailTemplateTest(TestCase):
template = CourseEmailTemplate.get_template(name="branded.template")
assert template.html_template is not None
assert template.plain_template is not None
- assert u'THIS IS A BRANDED HTML TEMPLATE' in template.html_template
- assert u'THIS IS A BRANDED TEXT TEMPLATE' in template.plain_template
+ assert 'THIS IS A BRANDED HTML TEMPLATE' in template.html_template
+ assert 'THIS IS A BRANDED TEXT TEMPLATE' in template.plain_template
def test_render_html_without_context(self):
template = CourseEmailTemplate.get_template()
@@ -249,7 +249,7 @@ class CourseEmailTemplateTest(TestCase):
template = CourseEmailTemplate.get_template()
context = self._add_xss_fields(self._get_sample_html_context())
message = template.render_htmltext(
- u"Dear %%USER_FULLNAME%%, thanks for enrolling in %%COURSE_DISPLAY_NAME%%.", context
+ "Dear %%USER_FULLNAME%%, thanks for enrolling in %%COURSE_DISPLAY_NAME%%.", context
)
assert '
+
%block>
<%block name="js_extra">
@@ -66,10 +74,6 @@ ${static.get_page_title_breadcrumbs(course_name())}
<%include file="xqa_interface.html"/>
% endif
-
-
${HTML(fragment.foot_html())}
%block>
diff --git a/lms/templates/instructor/instructor_dashboard_2/data_download.html b/lms/templates/instructor/instructor_dashboard_2/data_download.html
index 4170763439..fefcfef668 100644
--- a/lms/templates/instructor/instructor_dashboard_2/data_download.html
+++ b/lms/templates/instructor/instructor_dashboard_2/data_download.html
@@ -95,6 +95,7 @@ from openedx.core.djangolib.markup import HTML, Text
+
${_("Click to generate a ZIP file that contains all submission texts and attachments.")}
diff --git a/lms/templates/instructor/instructor_dashboard_2/membership.html b/lms/templates/instructor/instructor_dashboard_2/membership.html
index baa11767a9..7945827b67 100644
--- a/lms/templates/instructor/instructor_dashboard_2/membership.html
+++ b/lms/templates/instructor/instructor_dashboard_2/membership.html
@@ -13,6 +13,17 @@ from openedx.core.djangolib.markup import HTML, Text
+
+
+ ${_("Role of the users being enrolled.")}
+
+ % for role in section_data['enrollment_role_choices']:
+ ${role}
+ % endfor
+
+
+
+
% if section_data['is_reason_field_enabled']:
${_("Enter the reason why the students are to be manually enrolled or unenrolled.")}
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:
-