diff --git a/cms/envs/acceptance.py b/cms/envs/acceptance.py index 20bdeb0270..3bb18399f3 100644 --- a/cms/envs/acceptance.py +++ b/cms/envs/acceptance.py @@ -80,6 +80,14 @@ DATABASES = { 'timeout': 30, }, 'ATOMIC_REQUESTS': True, + }, + 'student_module_history': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': TEST_ROOT / "db" / "test_student_module_history.db", + 'TEST_NAME': TEST_ROOT / "db" / "test_student_module_history.db", + 'OPTIONS': { + 'timeout': 30, + }, } } diff --git a/cms/envs/aws_migrate.py b/cms/envs/aws_migrate.py index e14834ec2d..92b2d51c9e 100644 --- a/cms/envs/aws_migrate.py +++ b/cms/envs/aws_migrate.py @@ -26,5 +26,5 @@ if DB_OVERRIDES['PASSWORD'] is None: raise ImproperlyConfigured("No database password was provided for running " "migrations. This is fatal.") -for override, value in DB_OVERRIDES.iteritems(): - DATABASES['default'][override] = value +DATABASES['default'].update(DB_OVERRIDES) +DATABASES['student_module_history'].update(DB_OVERRIDES) diff --git a/cms/envs/bok_choy.auth.json b/cms/envs/bok_choy.auth.json index 79dbf904c1..44eac070f6 100644 --- a/cms/envs/bok_choy.auth.json +++ b/cms/envs/bok_choy.auth.json @@ -30,6 +30,14 @@ "PASSWORD": "", "PORT": "3306", "USER": "root" + }, + "student_module_history": { + "ENGINE": "django.db.backends.mysql", + "HOST": "localhost", + "NAME": "student_module_history_test", + "PASSWORD": "", + "PORT": "3306", + "USER": "root" } }, "DOC_STORE_CONFIG": { diff --git a/cms/envs/common.py b/cms/envs/common.py index bb99b01a98..40dd6c5ac0 100644 --- a/cms/envs/common.py +++ b/cms/envs/common.py @@ -1114,6 +1114,11 @@ PROCTORING_BACKEND_PROVIDER = { } PROCTORING_SETTINGS = {} +############################ Global Database Configuration ##################### + +DATABASE_ROUTERS = [ + 'openedx.core.lib.django_courseware_routers.StudentModuleHistoryExtendedRouter', +] ############################ OAUTH2 Provider ################################### diff --git a/common/lib/xmodule/xmodule/capa_module.py b/common/lib/xmodule/xmodule/capa_module.py index d44a82276c..ff9af91c0d 100644 --- a/common/lib/xmodule/xmodule/capa_module.py +++ b/common/lib/xmodule/xmodule/capa_module.py @@ -93,11 +93,23 @@ class CapaModule(CapaMixin, XModule): result = handlers[dispatch](data) except NotFoundError as err: - _, _, traceback_obj = sys.exc_info() + log.exception( + "Unable to find data when dispatching %s to %s for user %s", + dispatch, + self.scope_ids.usage_id, + self.scope_ids.user_id + ) + _, _, traceback_obj = sys.exc_info() # pylint: disable=redefined-outer-name raise ProcessingError(not_found_error_message), None, traceback_obj except Exception as err: - _, _, traceback_obj = sys.exc_info() + log.exception( + "Unknown error when dispatching %s to %s for user %s", + dispatch, + self.scope_ids.usage_id, + self.scope_ids.user_id + ) + _, _, traceback_obj = sys.exc_info() # pylint: disable=redefined-outer-name raise ProcessingError(generic_error_message), None, traceback_obj after = self.get_progress() diff --git a/common/lib/xmodule/xmodule/modulestore/tests/django_utils.py b/common/lib/xmodule/xmodule/modulestore/tests/django_utils.py index 5ed4ce201e..8120590122 100644 --- a/common/lib/xmodule/xmodule/modulestore/tests/django_utils.py +++ b/common/lib/xmodule/xmodule/modulestore/tests/django_utils.py @@ -265,6 +265,8 @@ class SharedModuleStoreTestCase(TestCase): for Django ORM models that will get cleaned up properly. """ MODULESTORE = mixed_store_config(mkdtemp_clean(), {}, include_xml=False) + # Tell Django to clean out all databases, not just default + multi_db = True @classmethod def setUpClass(cls): @@ -392,6 +394,8 @@ class ModuleStoreTestCase(TestCase): """ MODULESTORE = mixed_store_config(mkdtemp_clean(), {}, include_xml=False) + # Tell Django to clean out all databases, not just default + multi_db = True def setUp(self, **kwargs): """ diff --git a/common/test/db_cache/bok_choy_data.json b/common/test/db_cache/bok_choy_data.json deleted file mode 100644 index 3c64c3e6a5..0000000000 --- a/common/test/db_cache/bok_choy_data.json +++ /dev/null @@ -1 +0,0 @@ -[{"fields": {"model": "permission", "app_label": "auth"}, "model": "contenttypes.contenttype", "pk": 1}, {"fields": {"model": "group", "app_label": "auth"}, "model": "contenttypes.contenttype", "pk": 2}, {"fields": {"model": "user", "app_label": "auth"}, "model": "contenttypes.contenttype", "pk": 3}, {"fields": {"model": "contenttype", "app_label": "contenttypes"}, "model": "contenttypes.contenttype", "pk": 4}, {"fields": {"model": "session", "app_label": "sessions"}, "model": "contenttypes.contenttype", "pk": 5}, {"fields": {"model": "site", "app_label": "sites"}, "model": "contenttypes.contenttype", "pk": 6}, {"fields": {"model": "taskmeta", "app_label": "djcelery"}, "model": "contenttypes.contenttype", "pk": 7}, {"fields": {"model": "tasksetmeta", "app_label": "djcelery"}, "model": "contenttypes.contenttype", "pk": 8}, {"fields": {"model": "intervalschedule", "app_label": "djcelery"}, "model": "contenttypes.contenttype", "pk": 9}, {"fields": {"model": "crontabschedule", "app_label": "djcelery"}, "model": "contenttypes.contenttype", "pk": 10}, {"fields": {"model": "periodictasks", "app_label": "djcelery"}, "model": "contenttypes.contenttype", "pk": 11}, {"fields": {"model": "periodictask", "app_label": "djcelery"}, "model": "contenttypes.contenttype", "pk": 12}, {"fields": {"model": "workerstate", "app_label": "djcelery"}, "model": "contenttypes.contenttype", "pk": 13}, {"fields": {"model": "taskstate", "app_label": "djcelery"}, "model": "contenttypes.contenttype", "pk": 14}, {"fields": {"model": "globalstatusmessage", "app_label": "status"}, "model": "contenttypes.contenttype", "pk": 15}, {"fields": {"model": "coursemessage", "app_label": "status"}, "model": "contenttypes.contenttype", "pk": 16}, {"fields": {"model": "assetbaseurlconfig", "app_label": "static_replace"}, "model": "contenttypes.contenttype", "pk": 17}, {"fields": {"model": "studentmodule", "app_label": "courseware"}, "model": "contenttypes.contenttype", "pk": 18}, {"fields": {"model": "studentmodulehistory", "app_label": "courseware"}, "model": "contenttypes.contenttype", "pk": 19}, {"fields": {"model": "xmoduleuserstatesummaryfield", "app_label": "courseware"}, "model": "contenttypes.contenttype", "pk": 20}, {"fields": {"model": "xmodulestudentprefsfield", "app_label": "courseware"}, "model": "contenttypes.contenttype", "pk": 21}, {"fields": {"model": "xmodulestudentinfofield", "app_label": "courseware"}, "model": "contenttypes.contenttype", "pk": 22}, {"fields": {"model": "offlinecomputedgrade", "app_label": "courseware"}, "model": "contenttypes.contenttype", "pk": 23}, {"fields": {"model": "offlinecomputedgradelog", "app_label": "courseware"}, "model": "contenttypes.contenttype", "pk": 24}, {"fields": {"model": "studentfieldoverride", "app_label": "courseware"}, "model": "contenttypes.contenttype", "pk": 25}, {"fields": {"model": "anonymoususerid", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 26}, {"fields": {"model": "userstanding", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 27}, {"fields": {"model": "userprofile", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 28}, {"fields": {"model": "usersignupsource", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 29}, {"fields": {"model": "usertestgroup", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 30}, {"fields": {"model": "registration", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 31}, {"fields": {"model": "pendingnamechange", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 32}, {"fields": {"model": "pendingemailchange", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 33}, {"fields": {"model": "passwordhistory", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 34}, {"fields": {"model": "loginfailures", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 35}, {"fields": {"model": "historicalcourseenrollment", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 36}, {"fields": {"model": "courseenrollment", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 37}, {"fields": {"model": "manualenrollmentaudit", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 38}, {"fields": {"model": "courseenrollmentallowed", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 39}, {"fields": {"model": "courseaccessrole", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 40}, {"fields": {"model": "dashboardconfiguration", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 41}, {"fields": {"model": "linkedinaddtoprofileconfiguration", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 42}, {"fields": {"model": "entranceexamconfiguration", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 43}, {"fields": {"model": "languageproficiency", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 44}, {"fields": {"model": "courseenrollmentattribute", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 45}, {"fields": {"model": "enrollmentrefundconfiguration", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 46}, {"fields": {"model": "trackinglog", "app_label": "track"}, "model": "contenttypes.contenttype", "pk": 47}, {"fields": {"model": "ratelimitconfiguration", "app_label": "util"}, "model": "contenttypes.contenttype", "pk": 48}, {"fields": {"model": "certificatewhitelist", "app_label": "certificates"}, "model": "contenttypes.contenttype", "pk": 49}, {"fields": {"model": "generatedcertificate", "app_label": "certificates"}, "model": "contenttypes.contenttype", "pk": 50}, {"fields": {"model": "certificategenerationhistory", "app_label": "certificates"}, "model": "contenttypes.contenttype", "pk": 51}, {"fields": {"model": "certificateinvalidation", "app_label": "certificates"}, "model": "contenttypes.contenttype", "pk": 52}, {"fields": {"model": "examplecertificateset", "app_label": "certificates"}, "model": "contenttypes.contenttype", "pk": 53}, {"fields": {"model": "examplecertificate", "app_label": "certificates"}, "model": "contenttypes.contenttype", "pk": 54}, {"fields": {"model": "certificategenerationcoursesetting", "app_label": "certificates"}, "model": "contenttypes.contenttype", "pk": 55}, {"fields": {"model": "certificategenerationconfiguration", "app_label": "certificates"}, "model": "contenttypes.contenttype", "pk": 56}, {"fields": {"model": "certificatehtmlviewconfiguration", "app_label": "certificates"}, "model": "contenttypes.contenttype", "pk": 57}, {"fields": {"model": "badgeassertion", "app_label": "certificates"}, "model": "contenttypes.contenttype", "pk": 58}, {"fields": {"model": "badgeimageconfiguration", "app_label": "certificates"}, "model": "contenttypes.contenttype", "pk": 59}, {"fields": {"model": "certificatetemplate", "app_label": "certificates"}, "model": "contenttypes.contenttype", "pk": 60}, {"fields": {"model": "certificatetemplateasset", "app_label": "certificates"}, "model": "contenttypes.contenttype", "pk": 61}, {"fields": {"model": "instructortask", "app_label": "instructor_task"}, "model": "contenttypes.contenttype", "pk": 62}, {"fields": {"model": "courseusergroup", "app_label": "course_groups"}, "model": "contenttypes.contenttype", "pk": 63}, {"fields": {"model": "cohortmembership", "app_label": "course_groups"}, "model": "contenttypes.contenttype", "pk": 64}, {"fields": {"model": "courseusergrouppartitiongroup", "app_label": "course_groups"}, "model": "contenttypes.contenttype", "pk": 65}, {"fields": {"model": "coursecohortssettings", "app_label": "course_groups"}, "model": "contenttypes.contenttype", "pk": 66}, {"fields": {"model": "coursecohort", "app_label": "course_groups"}, "model": "contenttypes.contenttype", "pk": 67}, {"fields": {"model": "courseemail", "app_label": "bulk_email"}, "model": "contenttypes.contenttype", "pk": 68}, {"fields": {"model": "optout", "app_label": "bulk_email"}, "model": "contenttypes.contenttype", "pk": 69}, {"fields": {"model": "courseemailtemplate", "app_label": "bulk_email"}, "model": "contenttypes.contenttype", "pk": 70}, {"fields": {"model": "courseauthorization", "app_label": "bulk_email"}, "model": "contenttypes.contenttype", "pk": 71}, {"fields": {"model": "brandinginfoconfig", "app_label": "branding"}, "model": "contenttypes.contenttype", "pk": 72}, {"fields": {"model": "brandingapiconfig", "app_label": "branding"}, "model": "contenttypes.contenttype", "pk": 73}, {"fields": {"model": "externalauthmap", "app_label": "external_auth"}, "model": "contenttypes.contenttype", "pk": 74}, {"fields": {"model": "nonce", "app_label": "django_openid_auth"}, "model": "contenttypes.contenttype", "pk": 75}, {"fields": {"model": "association", "app_label": "django_openid_auth"}, "model": "contenttypes.contenttype", "pk": 76}, {"fields": {"model": "useropenid", "app_label": "django_openid_auth"}, "model": "contenttypes.contenttype", "pk": 77}, {"fields": {"model": "client", "app_label": "oauth2"}, "model": "contenttypes.contenttype", "pk": 78}, {"fields": {"model": "grant", "app_label": "oauth2"}, "model": "contenttypes.contenttype", "pk": 79}, {"fields": {"model": "accesstoken", "app_label": "oauth2"}, "model": "contenttypes.contenttype", "pk": 80}, {"fields": {"model": "refreshtoken", "app_label": "oauth2"}, "model": "contenttypes.contenttype", "pk": 81}, {"fields": {"model": "trustedclient", "app_label": "oauth2_provider"}, "model": "contenttypes.contenttype", "pk": 82}, {"fields": {"model": "oauth2providerconfig", "app_label": "third_party_auth"}, "model": "contenttypes.contenttype", "pk": 83}, {"fields": {"model": "samlproviderconfig", "app_label": "third_party_auth"}, "model": "contenttypes.contenttype", "pk": 84}, {"fields": {"model": "samlconfiguration", "app_label": "third_party_auth"}, "model": "contenttypes.contenttype", "pk": 85}, {"fields": {"model": "samlproviderdata", "app_label": "third_party_auth"}, "model": "contenttypes.contenttype", "pk": 86}, {"fields": {"model": "ltiproviderconfig", "app_label": "third_party_auth"}, "model": "contenttypes.contenttype", "pk": 87}, {"fields": {"model": "providerapipermissions", "app_label": "third_party_auth"}, "model": "contenttypes.contenttype", "pk": 88}, {"fields": {"model": "nonce", "app_label": "oauth_provider"}, "model": "contenttypes.contenttype", "pk": 89}, {"fields": {"model": "scope", "app_label": "oauth_provider"}, "model": "contenttypes.contenttype", "pk": 90}, {"fields": {"model": "consumer", "app_label": "oauth_provider"}, "model": "contenttypes.contenttype", "pk": 91}, {"fields": {"model": "token", "app_label": "oauth_provider"}, "model": "contenttypes.contenttype", "pk": 92}, {"fields": {"model": "resource", "app_label": "oauth_provider"}, "model": "contenttypes.contenttype", "pk": 93}, {"fields": {"model": "article", "app_label": "wiki"}, "model": "contenttypes.contenttype", "pk": 94}, {"fields": {"model": "articleforobject", "app_label": "wiki"}, "model": "contenttypes.contenttype", "pk": 95}, {"fields": {"model": "articlerevision", "app_label": "wiki"}, "model": "contenttypes.contenttype", "pk": 96}, {"fields": {"model": "urlpath", "app_label": "wiki"}, "model": "contenttypes.contenttype", "pk": 97}, {"fields": {"model": "articleplugin", "app_label": "wiki"}, "model": "contenttypes.contenttype", "pk": 98}, {"fields": {"model": "reusableplugin", "app_label": "wiki"}, "model": "contenttypes.contenttype", "pk": 99}, {"fields": {"model": "simpleplugin", "app_label": "wiki"}, "model": "contenttypes.contenttype", "pk": 100}, {"fields": {"model": "revisionplugin", "app_label": "wiki"}, "model": "contenttypes.contenttype", "pk": 101}, {"fields": {"model": "revisionpluginrevision", "app_label": "wiki"}, "model": "contenttypes.contenttype", "pk": 102}, {"fields": {"model": "image", "app_label": "wiki"}, "model": "contenttypes.contenttype", "pk": 103}, {"fields": {"model": "imagerevision", "app_label": "wiki"}, "model": "contenttypes.contenttype", "pk": 104}, {"fields": {"model": "attachment", "app_label": "wiki"}, "model": "contenttypes.contenttype", "pk": 105}, {"fields": {"model": "attachmentrevision", "app_label": "wiki"}, "model": "contenttypes.contenttype", "pk": 106}, {"fields": {"model": "notificationtype", "app_label": "django_notify"}, "model": "contenttypes.contenttype", "pk": 107}, {"fields": {"model": "settings", "app_label": "django_notify"}, "model": "contenttypes.contenttype", "pk": 108}, {"fields": {"model": "subscription", "app_label": "django_notify"}, "model": "contenttypes.contenttype", "pk": 109}, {"fields": {"model": "notification", "app_label": "django_notify"}, "model": "contenttypes.contenttype", "pk": 110}, {"fields": {"model": "logentry", "app_label": "admin"}, "model": "contenttypes.contenttype", "pk": 111}, {"fields": {"model": "role", "app_label": "django_comment_common"}, "model": "contenttypes.contenttype", "pk": 112}, {"fields": {"model": "permission", "app_label": "django_comment_common"}, "model": "contenttypes.contenttype", "pk": 113}, {"fields": {"model": "note", "app_label": "notes"}, "model": "contenttypes.contenttype", "pk": 114}, {"fields": {"model": "splashconfig", "app_label": "splash"}, "model": "contenttypes.contenttype", "pk": 115}, {"fields": {"model": "userpreference", "app_label": "user_api"}, "model": "contenttypes.contenttype", "pk": 116}, {"fields": {"model": "usercoursetag", "app_label": "user_api"}, "model": "contenttypes.contenttype", "pk": 117}, {"fields": {"model": "userorgtag", "app_label": "user_api"}, "model": "contenttypes.contenttype", "pk": 118}, {"fields": {"model": "order", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 119}, {"fields": {"model": "orderitem", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 120}, {"fields": {"model": "invoice", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 121}, {"fields": {"model": "invoicetransaction", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 122}, {"fields": {"model": "invoiceitem", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 123}, {"fields": {"model": "courseregistrationcodeinvoiceitem", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 124}, {"fields": {"model": "invoicehistory", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 125}, {"fields": {"model": "courseregistrationcode", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 126}, {"fields": {"model": "registrationcoderedemption", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 127}, {"fields": {"model": "coupon", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 128}, {"fields": {"model": "couponredemption", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 129}, {"fields": {"model": "paidcourseregistration", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 130}, {"fields": {"model": "courseregcodeitem", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 131}, {"fields": {"model": "courseregcodeitemannotation", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 132}, {"fields": {"model": "paidcourseregistrationannotation", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 133}, {"fields": {"model": "certificateitem", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 134}, {"fields": {"model": "donationconfiguration", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 135}, {"fields": {"model": "donation", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 136}, {"fields": {"model": "coursemode", "app_label": "course_modes"}, "model": "contenttypes.contenttype", "pk": 137}, {"fields": {"model": "coursemodesarchive", "app_label": "course_modes"}, "model": "contenttypes.contenttype", "pk": 138}, {"fields": {"model": "coursemodeexpirationconfig", "app_label": "course_modes"}, "model": "contenttypes.contenttype", "pk": 139}, {"fields": {"model": "softwaresecurephotoverification", "app_label": "verify_student"}, "model": "contenttypes.contenttype", "pk": 140}, {"fields": {"model": "historicalverificationdeadline", "app_label": "verify_student"}, "model": "contenttypes.contenttype", "pk": 141}, {"fields": {"model": "verificationdeadline", "app_label": "verify_student"}, "model": "contenttypes.contenttype", "pk": 142}, {"fields": {"model": "verificationcheckpoint", "app_label": "verify_student"}, "model": "contenttypes.contenttype", "pk": 143}, {"fields": {"model": "verificationstatus", "app_label": "verify_student"}, "model": "contenttypes.contenttype", "pk": 144}, {"fields": {"model": "incoursereverificationconfiguration", "app_label": "verify_student"}, "model": "contenttypes.contenttype", "pk": 145}, {"fields": {"model": "icrvstatusemailsconfiguration", "app_label": "verify_student"}, "model": "contenttypes.contenttype", "pk": 146}, {"fields": {"model": "skippedreverification", "app_label": "verify_student"}, "model": "contenttypes.contenttype", "pk": 147}, {"fields": {"model": "darklangconfig", "app_label": "dark_lang"}, "model": "contenttypes.contenttype", "pk": 148}, {"fields": {"model": "microsite", "app_label": "microsite_configuration"}, "model": "contenttypes.contenttype", "pk": 149}, {"fields": {"model": "micrositehistory", "app_label": "microsite_configuration"}, "model": "contenttypes.contenttype", "pk": 150}, {"fields": {"model": "historicalmicrositeorganizationmapping", "app_label": "microsite_configuration"}, "model": "contenttypes.contenttype", "pk": 151}, {"fields": {"model": "micrositeorganizationmapping", "app_label": "microsite_configuration"}, "model": "contenttypes.contenttype", "pk": 152}, {"fields": {"model": "historicalmicrositetemplate", "app_label": "microsite_configuration"}, "model": "contenttypes.contenttype", "pk": 153}, {"fields": {"model": "micrositetemplate", "app_label": "microsite_configuration"}, "model": "contenttypes.contenttype", "pk": 154}, {"fields": {"model": "whitelistedrssurl", "app_label": "rss_proxy"}, "model": "contenttypes.contenttype", "pk": 155}, {"fields": {"model": "embargoedcourse", "app_label": "embargo"}, "model": "contenttypes.contenttype", "pk": 156}, {"fields": {"model": "embargoedstate", "app_label": "embargo"}, "model": "contenttypes.contenttype", "pk": 157}, {"fields": {"model": "restrictedcourse", "app_label": "embargo"}, "model": "contenttypes.contenttype", "pk": 158}, {"fields": {"model": "country", "app_label": "embargo"}, "model": "contenttypes.contenttype", "pk": 159}, {"fields": {"model": "countryaccessrule", "app_label": "embargo"}, "model": "contenttypes.contenttype", "pk": 160}, {"fields": {"model": "courseaccessrulehistory", "app_label": "embargo"}, "model": "contenttypes.contenttype", "pk": 161}, {"fields": {"model": "ipfilter", "app_label": "embargo"}, "model": "contenttypes.contenttype", "pk": 162}, {"fields": {"model": "coursererunstate", "app_label": "course_action_state"}, "model": "contenttypes.contenttype", "pk": 163}, {"fields": {"model": "mobileapiconfig", "app_label": "mobile_api"}, "model": "contenttypes.contenttype", "pk": 164}, {"fields": {"model": "usersocialauth", "app_label": "default"}, "model": "contenttypes.contenttype", "pk": 165}, {"fields": {"model": "nonce", "app_label": "default"}, "model": "contenttypes.contenttype", "pk": 166}, {"fields": {"model": "association", "app_label": "default"}, "model": "contenttypes.contenttype", "pk": 167}, {"fields": {"model": "code", "app_label": "default"}, "model": "contenttypes.contenttype", "pk": 168}, {"fields": {"model": "surveyform", "app_label": "survey"}, "model": "contenttypes.contenttype", "pk": 169}, {"fields": {"model": "surveyanswer", "app_label": "survey"}, "model": "contenttypes.contenttype", "pk": 170}, {"fields": {"model": "xblockasidesconfig", "app_label": "lms_xblock"}, "model": "contenttypes.contenttype", "pk": 171}, {"fields": {"model": "courseoverview", "app_label": "course_overviews"}, "model": "contenttypes.contenttype", "pk": 172}, {"fields": {"model": "courseoverviewtab", "app_label": "course_overviews"}, "model": "contenttypes.contenttype", "pk": 173}, {"fields": {"model": "courseoverviewimageset", "app_label": "course_overviews"}, "model": "contenttypes.contenttype", "pk": 174}, {"fields": {"model": "courseoverviewimageconfig", "app_label": "course_overviews"}, "model": "contenttypes.contenttype", "pk": 175}, {"fields": {"model": "coursestructure", "app_label": "course_structures"}, "model": "contenttypes.contenttype", "pk": 176}, {"fields": {"model": "corsmodel", "app_label": "corsheaders"}, "model": "contenttypes.contenttype", "pk": 177}, {"fields": {"model": "xdomainproxyconfiguration", "app_label": "cors_csrf"}, "model": "contenttypes.contenttype", "pk": 178}, {"fields": {"model": "creditprovider", "app_label": "credit"}, "model": "contenttypes.contenttype", "pk": 179}, {"fields": {"model": "creditcourse", "app_label": "credit"}, "model": "contenttypes.contenttype", "pk": 180}, {"fields": {"model": "creditrequirement", "app_label": "credit"}, "model": "contenttypes.contenttype", "pk": 181}, {"fields": {"model": "historicalcreditrequirementstatus", "app_label": "credit"}, "model": "contenttypes.contenttype", "pk": 182}, {"fields": {"model": "creditrequirementstatus", "app_label": "credit"}, "model": "contenttypes.contenttype", "pk": 183}, {"fields": {"model": "crediteligibility", "app_label": "credit"}, "model": "contenttypes.contenttype", "pk": 184}, {"fields": {"model": "historicalcreditrequest", "app_label": "credit"}, "model": "contenttypes.contenttype", "pk": 185}, {"fields": {"model": "creditrequest", "app_label": "credit"}, "model": "contenttypes.contenttype", "pk": 186}, {"fields": {"model": "courseteam", "app_label": "teams"}, "model": "contenttypes.contenttype", "pk": 187}, {"fields": {"model": "courseteammembership", "app_label": "teams"}, "model": "contenttypes.contenttype", "pk": 188}, {"fields": {"model": "xblockdisableconfig", "app_label": "xblock_django"}, "model": "contenttypes.contenttype", "pk": 189}, {"fields": {"model": "bookmark", "app_label": "bookmarks"}, "model": "contenttypes.contenttype", "pk": 190}, {"fields": {"model": "xblockcache", "app_label": "bookmarks"}, "model": "contenttypes.contenttype", "pk": 191}, {"fields": {"model": "programsapiconfig", "app_label": "programs"}, "model": "contenttypes.contenttype", "pk": 192}, {"fields": {"model": "selfpacedconfiguration", "app_label": "self_paced"}, "model": "contenttypes.contenttype", "pk": 193}, {"fields": {"model": "kvstore", "app_label": "thumbnail"}, "model": "contenttypes.contenttype", "pk": 194}, {"fields": {"model": "credentialsapiconfig", "app_label": "credentials"}, "model": "contenttypes.contenttype", "pk": 195}, {"fields": {"model": "answer", "app_label": "problem_builder"}, "model": "contenttypes.contenttype", "pk": 196}, {"fields": {"model": "studentitem", "app_label": "submissions"}, "model": "contenttypes.contenttype", "pk": 197}, {"fields": {"model": "submission", "app_label": "submissions"}, "model": "contenttypes.contenttype", "pk": 198}, {"fields": {"model": "score", "app_label": "submissions"}, "model": "contenttypes.contenttype", "pk": 199}, {"fields": {"model": "scoresummary", "app_label": "submissions"}, "model": "contenttypes.contenttype", "pk": 200}, {"fields": {"model": "scoreannotation", "app_label": "submissions"}, "model": "contenttypes.contenttype", "pk": 201}, {"fields": {"model": "rubric", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 202}, {"fields": {"model": "criterion", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 203}, {"fields": {"model": "criterionoption", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 204}, {"fields": {"model": "assessment", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 205}, {"fields": {"model": "assessmentpart", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 206}, {"fields": {"model": "assessmentfeedbackoption", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 207}, {"fields": {"model": "assessmentfeedback", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 208}, {"fields": {"model": "peerworkflow", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 209}, {"fields": {"model": "peerworkflowitem", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 210}, {"fields": {"model": "trainingexample", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 211}, {"fields": {"model": "studenttrainingworkflow", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 212}, {"fields": {"model": "studenttrainingworkflowitem", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 213}, {"fields": {"model": "aiclassifierset", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 214}, {"fields": {"model": "aiclassifier", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 215}, {"fields": {"model": "aitrainingworkflow", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 216}, {"fields": {"model": "aigradingworkflow", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 217}, {"fields": {"model": "staffworkflow", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 218}, {"fields": {"model": "assessmentworkflow", "app_label": "workflow"}, "model": "contenttypes.contenttype", "pk": 219}, {"fields": {"model": "assessmentworkflowstep", "app_label": "workflow"}, "model": "contenttypes.contenttype", "pk": 220}, {"fields": {"model": "assessmentworkflowcancellation", "app_label": "workflow"}, "model": "contenttypes.contenttype", "pk": 221}, {"fields": {"model": "profile", "app_label": "edxval"}, "model": "contenttypes.contenttype", "pk": 222}, {"fields": {"model": "video", "app_label": "edxval"}, "model": "contenttypes.contenttype", "pk": 223}, {"fields": {"model": "coursevideo", "app_label": "edxval"}, "model": "contenttypes.contenttype", "pk": 224}, {"fields": {"model": "encodedvideo", "app_label": "edxval"}, "model": "contenttypes.contenttype", "pk": 225}, {"fields": {"model": "subtitle", "app_label": "edxval"}, "model": "contenttypes.contenttype", "pk": 226}, {"fields": {"model": "milestone", "app_label": "milestones"}, "model": "contenttypes.contenttype", "pk": 227}, {"fields": {"model": "milestonerelationshiptype", "app_label": "milestones"}, "model": "contenttypes.contenttype", "pk": 228}, {"fields": {"model": "coursemilestone", "app_label": "milestones"}, "model": "contenttypes.contenttype", "pk": 229}, {"fields": {"model": "coursecontentmilestone", "app_label": "milestones"}, "model": "contenttypes.contenttype", "pk": 230}, {"fields": {"model": "usermilestone", "app_label": "milestones"}, "model": "contenttypes.contenttype", "pk": 231}, {"fields": {"model": "proctoredexam", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 232}, {"fields": {"model": "proctoredexamreviewpolicy", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 233}, {"fields": {"model": "proctoredexamreviewpolicyhistory", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 234}, {"fields": {"model": "proctoredexamstudentattempt", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 235}, {"fields": {"model": "proctoredexamstudentattempthistory", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 236}, {"fields": {"model": "proctoredexamstudentallowance", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 237}, {"fields": {"model": "proctoredexamstudentallowancehistory", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 238}, {"fields": {"model": "proctoredexamsoftwaresecurereview", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 239}, {"fields": {"model": "proctoredexamsoftwaresecurereviewhistory", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 240}, {"fields": {"model": "proctoredexamsoftwaresecurecomment", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 241}, {"fields": {"model": "organization", "app_label": "organizations"}, "model": "contenttypes.contenttype", "pk": 242}, {"fields": {"model": "organizationcourse", "app_label": "organizations"}, "model": "contenttypes.contenttype", "pk": 243}, {"fields": {"model": "videouploadconfig", "app_label": "contentstore"}, "model": "contenttypes.contenttype", "pk": 244}, {"fields": {"model": "pushnotificationconfig", "app_label": "contentstore"}, "model": "contenttypes.contenttype", "pk": 245}, {"fields": {"model": "coursecreator", "app_label": "course_creators"}, "model": "contenttypes.contenttype", "pk": 246}, {"fields": {"model": "studioconfig", "app_label": "xblock_config"}, "model": "contenttypes.contenttype", "pk": 247}, {"fields": {"domain": "example.com", "name": "example.com"}, "model": "sites.site", "pk": 1}, {"fields": {"default": false, "mode": "honor", "icon": "badges/honor.png"}, "model": "certificates.badgeimageconfiguration", "pk": 1}, {"fields": {"default": false, "mode": "verified", "icon": "badges/verified.png"}, "model": "certificates.badgeimageconfiguration", "pk": 2}, {"fields": {"default": false, "mode": "professional", "icon": "badges/professional.png"}, "model": "certificates.badgeimageconfiguration", "pk": 3}, {"fields": {"plain_template": "{course_title}\n\n{{message_body}}\r\n----\r\nCopyright 2013 edX, All rights reserved.\r\n----\r\nConnect with edX:\r\nFacebook (http://facebook.com/edxonline)\r\nTwitter (http://twitter.com/edxonline)\r\nGoogle+ (https://plus.google.com/108235383044095082735)\r\nMeetup (http://www.meetup.com/edX-Communities/)\r\n----\r\nThis email was automatically sent from {platform_name}.\r\nYou are receiving this email at address {email} because you are enrolled in {course_title}\r\n(URL: {course_url} ).\r\nTo stop receiving email like this, update your course email settings at {email_settings_url}.\r\n", "html_template": " Update from {course_title}

edX
Connect with edX:        

{course_title}


{{message_body}}
       
Copyright \u00a9 2013 edX, All rights reserved.


Our mailing address is:
edX
11 Cambridge Center, Suite 101
Cambridge, MA, USA 02142


This email was automatically sent from {platform_name}.
You are receiving this email at address {email} because you are enrolled in {course_title}.
To stop receiving email like this, update your course email settings here.
", "name": null}, "model": "bulk_email.courseemailtemplate", "pk": 1}, {"fields": {"plain_template": "THIS IS A BRANDED TEXT TEMPLATE. {course_title}\n\n{{message_body}}\r\n----\r\nCopyright 2013 edX, All rights reserved.\r\n----\r\nConnect with edX:\r\nFacebook (http://facebook.com/edxonline)\r\nTwitter (http://twitter.com/edxonline)\r\nGoogle+ (https://plus.google.com/108235383044095082735)\r\nMeetup (http://www.meetup.com/edX-Communities/)\r\n----\r\nThis email was automatically sent from {platform_name}.\r\nYou are receiving this email at address {email} because you are enrolled in {course_title}\r\n(URL: {course_url} ).\r\nTo stop receiving email like this, update your course email settings at {email_settings_url}.\r\n", "html_template": " THIS IS A BRANDED HTML TEMPLATE Update from {course_title}

edX
Connect with edX:        

{course_title}


{{message_body}}
       
Copyright \u00a9 2013 edX, All rights reserved.


Our mailing address is:
edX
11 Cambridge Center, Suite 101
Cambridge, MA, USA 02142


This email was automatically sent from {platform_name}.
You are receiving this email at address {email} because you are enrolled in {course_title}.
To stop receiving email like this, update your course email settings here.
", "name": "branded.template"}, "model": "bulk_email.courseemailtemplate", "pk": 2}, {"fields": {"country": "AF"}, "model": "embargo.country", "pk": 1}, {"fields": {"country": "AX"}, "model": "embargo.country", "pk": 2}, {"fields": {"country": "AL"}, "model": "embargo.country", "pk": 3}, {"fields": {"country": "DZ"}, "model": "embargo.country", "pk": 4}, {"fields": {"country": "AS"}, "model": "embargo.country", "pk": 5}, {"fields": {"country": "AD"}, "model": "embargo.country", "pk": 6}, {"fields": {"country": "AO"}, "model": "embargo.country", "pk": 7}, {"fields": {"country": "AI"}, "model": "embargo.country", "pk": 8}, {"fields": {"country": "AQ"}, "model": "embargo.country", "pk": 9}, {"fields": {"country": "AG"}, "model": "embargo.country", "pk": 10}, {"fields": {"country": "AR"}, "model": "embargo.country", "pk": 11}, {"fields": {"country": "AM"}, "model": "embargo.country", "pk": 12}, {"fields": {"country": "AW"}, "model": "embargo.country", "pk": 13}, {"fields": {"country": "AU"}, "model": "embargo.country", "pk": 14}, {"fields": {"country": "AT"}, "model": "embargo.country", "pk": 15}, {"fields": {"country": "AZ"}, "model": "embargo.country", "pk": 16}, {"fields": {"country": "BS"}, "model": "embargo.country", "pk": 17}, {"fields": {"country": "BH"}, "model": "embargo.country", "pk": 18}, {"fields": {"country": "BD"}, "model": "embargo.country", "pk": 19}, {"fields": {"country": "BB"}, "model": "embargo.country", "pk": 20}, {"fields": {"country": "BY"}, "model": "embargo.country", "pk": 21}, {"fields": {"country": "BE"}, "model": "embargo.country", "pk": 22}, {"fields": {"country": "BZ"}, "model": "embargo.country", "pk": 23}, {"fields": {"country": "BJ"}, "model": "embargo.country", "pk": 24}, {"fields": {"country": "BM"}, "model": "embargo.country", "pk": 25}, {"fields": {"country": "BT"}, "model": "embargo.country", "pk": 26}, {"fields": {"country": "BO"}, "model": "embargo.country", "pk": 27}, {"fields": {"country": "BQ"}, "model": "embargo.country", "pk": 28}, {"fields": {"country": "BA"}, "model": "embargo.country", "pk": 29}, {"fields": {"country": "BW"}, "model": "embargo.country", "pk": 30}, {"fields": {"country": "BV"}, "model": "embargo.country", "pk": 31}, {"fields": {"country": "BR"}, "model": "embargo.country", "pk": 32}, {"fields": {"country": "IO"}, "model": "embargo.country", "pk": 33}, {"fields": {"country": "BN"}, "model": "embargo.country", "pk": 34}, {"fields": {"country": "BG"}, "model": "embargo.country", "pk": 35}, {"fields": {"country": "BF"}, "model": "embargo.country", "pk": 36}, {"fields": {"country": "BI"}, "model": "embargo.country", "pk": 37}, {"fields": {"country": "CV"}, "model": "embargo.country", "pk": 38}, {"fields": {"country": "KH"}, "model": "embargo.country", "pk": 39}, {"fields": {"country": "CM"}, "model": "embargo.country", "pk": 40}, {"fields": {"country": "CA"}, "model": "embargo.country", "pk": 41}, {"fields": {"country": "KY"}, "model": "embargo.country", "pk": 42}, {"fields": {"country": "CF"}, "model": "embargo.country", "pk": 43}, {"fields": {"country": "TD"}, "model": "embargo.country", "pk": 44}, {"fields": {"country": "CL"}, "model": "embargo.country", "pk": 45}, {"fields": {"country": "CN"}, "model": "embargo.country", "pk": 46}, {"fields": {"country": "CX"}, "model": "embargo.country", "pk": 47}, {"fields": {"country": "CC"}, "model": "embargo.country", "pk": 48}, {"fields": {"country": "CO"}, "model": "embargo.country", "pk": 49}, {"fields": {"country": "KM"}, "model": "embargo.country", "pk": 50}, {"fields": {"country": "CG"}, "model": "embargo.country", "pk": 51}, {"fields": {"country": "CD"}, "model": "embargo.country", "pk": 52}, {"fields": {"country": "CK"}, "model": "embargo.country", "pk": 53}, {"fields": {"country": "CR"}, "model": "embargo.country", "pk": 54}, {"fields": {"country": "CI"}, "model": "embargo.country", "pk": 55}, {"fields": {"country": "HR"}, "model": "embargo.country", "pk": 56}, {"fields": {"country": "CU"}, "model": "embargo.country", "pk": 57}, {"fields": {"country": "CW"}, "model": "embargo.country", "pk": 58}, {"fields": {"country": "CY"}, "model": "embargo.country", "pk": 59}, {"fields": {"country": "CZ"}, "model": "embargo.country", "pk": 60}, {"fields": {"country": "DK"}, "model": "embargo.country", "pk": 61}, {"fields": {"country": "DJ"}, "model": "embargo.country", "pk": 62}, {"fields": {"country": "DM"}, "model": "embargo.country", "pk": 63}, {"fields": {"country": "DO"}, "model": "embargo.country", "pk": 64}, {"fields": {"country": "EC"}, "model": "embargo.country", "pk": 65}, {"fields": {"country": "EG"}, "model": "embargo.country", "pk": 66}, {"fields": {"country": "SV"}, "model": "embargo.country", "pk": 67}, {"fields": {"country": "GQ"}, "model": "embargo.country", "pk": 68}, {"fields": {"country": "ER"}, "model": "embargo.country", "pk": 69}, {"fields": {"country": "EE"}, "model": "embargo.country", "pk": 70}, {"fields": {"country": "ET"}, "model": "embargo.country", "pk": 71}, {"fields": {"country": "FK"}, "model": "embargo.country", "pk": 72}, {"fields": {"country": "FO"}, "model": "embargo.country", "pk": 73}, {"fields": {"country": "FJ"}, "model": "embargo.country", "pk": 74}, {"fields": {"country": "FI"}, "model": "embargo.country", "pk": 75}, {"fields": {"country": "FR"}, "model": "embargo.country", "pk": 76}, {"fields": {"country": "GF"}, "model": "embargo.country", "pk": 77}, {"fields": {"country": "PF"}, "model": "embargo.country", "pk": 78}, {"fields": {"country": "TF"}, "model": "embargo.country", "pk": 79}, {"fields": {"country": "GA"}, "model": "embargo.country", "pk": 80}, {"fields": {"country": "GM"}, "model": "embargo.country", "pk": 81}, {"fields": {"country": "GE"}, "model": "embargo.country", "pk": 82}, {"fields": {"country": "DE"}, "model": "embargo.country", "pk": 83}, {"fields": {"country": "GH"}, "model": "embargo.country", "pk": 84}, {"fields": {"country": "GI"}, "model": "embargo.country", "pk": 85}, {"fields": {"country": "GR"}, "model": "embargo.country", "pk": 86}, {"fields": {"country": "GL"}, "model": "embargo.country", "pk": 87}, {"fields": {"country": "GD"}, "model": "embargo.country", "pk": 88}, {"fields": {"country": "GP"}, "model": "embargo.country", "pk": 89}, {"fields": {"country": "GU"}, "model": "embargo.country", "pk": 90}, {"fields": {"country": "GT"}, "model": "embargo.country", "pk": 91}, {"fields": {"country": "GG"}, "model": "embargo.country", "pk": 92}, {"fields": {"country": "GN"}, "model": "embargo.country", "pk": 93}, {"fields": {"country": "GW"}, "model": "embargo.country", "pk": 94}, {"fields": {"country": "GY"}, "model": "embargo.country", "pk": 95}, {"fields": {"country": "HT"}, "model": "embargo.country", "pk": 96}, {"fields": {"country": "HM"}, "model": "embargo.country", "pk": 97}, {"fields": {"country": "VA"}, "model": "embargo.country", "pk": 98}, {"fields": {"country": "HN"}, "model": "embargo.country", "pk": 99}, {"fields": {"country": "HK"}, "model": "embargo.country", "pk": 100}, {"fields": {"country": "HU"}, "model": "embargo.country", "pk": 101}, {"fields": {"country": "IS"}, "model": "embargo.country", "pk": 102}, {"fields": {"country": "IN"}, "model": "embargo.country", "pk": 103}, {"fields": {"country": "ID"}, "model": "embargo.country", "pk": 104}, {"fields": {"country": "IR"}, "model": "embargo.country", "pk": 105}, {"fields": {"country": "IQ"}, "model": "embargo.country", "pk": 106}, {"fields": {"country": "IE"}, "model": "embargo.country", "pk": 107}, {"fields": {"country": "IM"}, "model": "embargo.country", "pk": 108}, {"fields": {"country": "IL"}, "model": "embargo.country", "pk": 109}, {"fields": {"country": "IT"}, "model": "embargo.country", "pk": 110}, {"fields": {"country": "JM"}, "model": "embargo.country", "pk": 111}, {"fields": {"country": "JP"}, "model": "embargo.country", "pk": 112}, {"fields": {"country": "JE"}, "model": "embargo.country", "pk": 113}, {"fields": {"country": "JO"}, "model": "embargo.country", "pk": 114}, {"fields": {"country": "KZ"}, "model": "embargo.country", "pk": 115}, {"fields": {"country": "KE"}, "model": "embargo.country", "pk": 116}, {"fields": {"country": "KI"}, "model": "embargo.country", "pk": 117}, {"fields": {"country": "KW"}, "model": "embargo.country", "pk": 118}, {"fields": {"country": "KG"}, "model": "embargo.country", "pk": 119}, {"fields": {"country": "LA"}, "model": "embargo.country", "pk": 120}, {"fields": {"country": "LV"}, "model": "embargo.country", "pk": 121}, {"fields": {"country": "LB"}, "model": "embargo.country", "pk": 122}, {"fields": {"country": "LS"}, "model": "embargo.country", "pk": 123}, {"fields": {"country": "LR"}, "model": "embargo.country", "pk": 124}, {"fields": {"country": "LY"}, "model": "embargo.country", "pk": 125}, {"fields": {"country": "LI"}, "model": "embargo.country", "pk": 126}, {"fields": {"country": "LT"}, "model": "embargo.country", "pk": 127}, {"fields": {"country": "LU"}, "model": "embargo.country", "pk": 128}, {"fields": {"country": "MO"}, "model": "embargo.country", "pk": 129}, {"fields": {"country": "MK"}, "model": "embargo.country", "pk": 130}, {"fields": {"country": "MG"}, "model": "embargo.country", "pk": 131}, {"fields": {"country": "MW"}, "model": "embargo.country", "pk": 132}, {"fields": {"country": "MY"}, "model": "embargo.country", "pk": 133}, {"fields": {"country": "MV"}, "model": "embargo.country", "pk": 134}, {"fields": {"country": "ML"}, "model": "embargo.country", "pk": 135}, {"fields": {"country": "MT"}, "model": "embargo.country", "pk": 136}, {"fields": {"country": "MH"}, "model": "embargo.country", "pk": 137}, {"fields": {"country": "MQ"}, "model": "embargo.country", "pk": 138}, {"fields": {"country": "MR"}, "model": "embargo.country", "pk": 139}, {"fields": {"country": "MU"}, "model": "embargo.country", "pk": 140}, {"fields": {"country": "YT"}, "model": "embargo.country", "pk": 141}, {"fields": {"country": "MX"}, "model": "embargo.country", "pk": 142}, {"fields": {"country": "FM"}, "model": "embargo.country", "pk": 143}, {"fields": {"country": "MD"}, "model": "embargo.country", "pk": 144}, {"fields": {"country": "MC"}, "model": "embargo.country", "pk": 145}, {"fields": {"country": "MN"}, "model": "embargo.country", "pk": 146}, {"fields": {"country": "ME"}, "model": "embargo.country", "pk": 147}, {"fields": {"country": "MS"}, "model": "embargo.country", "pk": 148}, {"fields": {"country": "MA"}, "model": "embargo.country", "pk": 149}, {"fields": {"country": "MZ"}, "model": "embargo.country", "pk": 150}, {"fields": {"country": "MM"}, "model": "embargo.country", "pk": 151}, {"fields": {"country": "NA"}, "model": "embargo.country", "pk": 152}, {"fields": {"country": "NR"}, "model": "embargo.country", "pk": 153}, {"fields": {"country": "NP"}, "model": "embargo.country", "pk": 154}, {"fields": {"country": "NL"}, "model": "embargo.country", "pk": 155}, {"fields": {"country": "NC"}, "model": "embargo.country", "pk": 156}, {"fields": {"country": "NZ"}, "model": "embargo.country", "pk": 157}, {"fields": {"country": "NI"}, "model": "embargo.country", "pk": 158}, {"fields": {"country": "NE"}, "model": "embargo.country", "pk": 159}, {"fields": {"country": "NG"}, "model": "embargo.country", "pk": 160}, {"fields": {"country": "NU"}, "model": "embargo.country", "pk": 161}, {"fields": {"country": "NF"}, "model": "embargo.country", "pk": 162}, {"fields": {"country": "KP"}, "model": "embargo.country", "pk": 163}, {"fields": {"country": "MP"}, "model": "embargo.country", "pk": 164}, {"fields": {"country": "NO"}, "model": "embargo.country", "pk": 165}, {"fields": {"country": "OM"}, "model": "embargo.country", "pk": 166}, {"fields": {"country": "PK"}, "model": "embargo.country", "pk": 167}, {"fields": {"country": "PW"}, "model": "embargo.country", "pk": 168}, {"fields": {"country": "PS"}, "model": "embargo.country", "pk": 169}, {"fields": {"country": "PA"}, "model": "embargo.country", "pk": 170}, {"fields": {"country": "PG"}, "model": "embargo.country", "pk": 171}, {"fields": {"country": "PY"}, "model": "embargo.country", "pk": 172}, {"fields": {"country": "PE"}, "model": "embargo.country", "pk": 173}, {"fields": {"country": "PH"}, "model": "embargo.country", "pk": 174}, {"fields": {"country": "PN"}, "model": "embargo.country", "pk": 175}, {"fields": {"country": "PL"}, "model": "embargo.country", "pk": 176}, {"fields": {"country": "PT"}, "model": "embargo.country", "pk": 177}, {"fields": {"country": "PR"}, "model": "embargo.country", "pk": 178}, {"fields": {"country": "QA"}, "model": "embargo.country", "pk": 179}, {"fields": {"country": "RE"}, "model": "embargo.country", "pk": 180}, {"fields": {"country": "RO"}, "model": "embargo.country", "pk": 181}, {"fields": {"country": "RU"}, "model": "embargo.country", "pk": 182}, {"fields": {"country": "RW"}, "model": "embargo.country", "pk": 183}, {"fields": {"country": "BL"}, "model": "embargo.country", "pk": 184}, {"fields": {"country": "SH"}, "model": "embargo.country", "pk": 185}, {"fields": {"country": "KN"}, "model": "embargo.country", "pk": 186}, {"fields": {"country": "LC"}, "model": "embargo.country", "pk": 187}, {"fields": {"country": "MF"}, "model": "embargo.country", "pk": 188}, {"fields": {"country": "PM"}, "model": "embargo.country", "pk": 189}, {"fields": {"country": "VC"}, "model": "embargo.country", "pk": 190}, {"fields": {"country": "WS"}, "model": "embargo.country", "pk": 191}, {"fields": {"country": "SM"}, "model": "embargo.country", "pk": 192}, {"fields": {"country": "ST"}, "model": "embargo.country", "pk": 193}, {"fields": {"country": "SA"}, "model": "embargo.country", "pk": 194}, {"fields": {"country": "SN"}, "model": "embargo.country", "pk": 195}, {"fields": {"country": "RS"}, "model": "embargo.country", "pk": 196}, {"fields": {"country": "SC"}, "model": "embargo.country", "pk": 197}, {"fields": {"country": "SL"}, "model": "embargo.country", "pk": 198}, {"fields": {"country": "SG"}, "model": "embargo.country", "pk": 199}, {"fields": {"country": "SX"}, "model": "embargo.country", "pk": 200}, {"fields": {"country": "SK"}, "model": "embargo.country", "pk": 201}, {"fields": {"country": "SI"}, "model": "embargo.country", "pk": 202}, {"fields": {"country": "SB"}, "model": "embargo.country", "pk": 203}, {"fields": {"country": "SO"}, "model": "embargo.country", "pk": 204}, {"fields": {"country": "ZA"}, "model": "embargo.country", "pk": 205}, {"fields": {"country": "GS"}, "model": "embargo.country", "pk": 206}, {"fields": {"country": "KR"}, "model": "embargo.country", "pk": 207}, {"fields": {"country": "SS"}, "model": "embargo.country", "pk": 208}, {"fields": {"country": "ES"}, "model": "embargo.country", "pk": 209}, {"fields": {"country": "LK"}, "model": "embargo.country", "pk": 210}, {"fields": {"country": "SD"}, "model": "embargo.country", "pk": 211}, {"fields": {"country": "SR"}, "model": "embargo.country", "pk": 212}, {"fields": {"country": "SJ"}, "model": "embargo.country", "pk": 213}, {"fields": {"country": "SZ"}, "model": "embargo.country", "pk": 214}, {"fields": {"country": "SE"}, "model": "embargo.country", "pk": 215}, {"fields": {"country": "CH"}, "model": "embargo.country", "pk": 216}, {"fields": {"country": "SY"}, "model": "embargo.country", "pk": 217}, {"fields": {"country": "TW"}, "model": "embargo.country", "pk": 218}, {"fields": {"country": "TJ"}, "model": "embargo.country", "pk": 219}, {"fields": {"country": "TZ"}, "model": "embargo.country", "pk": 220}, {"fields": {"country": "TH"}, "model": "embargo.country", "pk": 221}, {"fields": {"country": "TL"}, "model": "embargo.country", "pk": 222}, {"fields": {"country": "TG"}, "model": "embargo.country", "pk": 223}, {"fields": {"country": "TK"}, "model": "embargo.country", "pk": 224}, {"fields": {"country": "TO"}, "model": "embargo.country", "pk": 225}, {"fields": {"country": "TT"}, "model": "embargo.country", "pk": 226}, {"fields": {"country": "TN"}, "model": "embargo.country", "pk": 227}, {"fields": {"country": "TR"}, "model": "embargo.country", "pk": 228}, {"fields": {"country": "TM"}, "model": "embargo.country", "pk": 229}, {"fields": {"country": "TC"}, "model": "embargo.country", "pk": 230}, {"fields": {"country": "TV"}, "model": "embargo.country", "pk": 231}, {"fields": {"country": "UG"}, "model": "embargo.country", "pk": 232}, {"fields": {"country": "UA"}, "model": "embargo.country", "pk": 233}, {"fields": {"country": "AE"}, "model": "embargo.country", "pk": 234}, {"fields": {"country": "GB"}, "model": "embargo.country", "pk": 235}, {"fields": {"country": "UM"}, "model": "embargo.country", "pk": 236}, {"fields": {"country": "US"}, "model": "embargo.country", "pk": 237}, {"fields": {"country": "UY"}, "model": "embargo.country", "pk": 238}, {"fields": {"country": "UZ"}, "model": "embargo.country", "pk": 239}, {"fields": {"country": "VU"}, "model": "embargo.country", "pk": 240}, {"fields": {"country": "VE"}, "model": "embargo.country", "pk": 241}, {"fields": {"country": "VN"}, "model": "embargo.country", "pk": 242}, {"fields": {"country": "VG"}, "model": "embargo.country", "pk": 243}, {"fields": {"country": "VI"}, "model": "embargo.country", "pk": 244}, {"fields": {"country": "WF"}, "model": "embargo.country", "pk": 245}, {"fields": {"country": "EH"}, "model": "embargo.country", "pk": 246}, {"fields": {"country": "YE"}, "model": "embargo.country", "pk": 247}, {"fields": {"country": "ZM"}, "model": "embargo.country", "pk": 248}, {"fields": {"country": "ZW"}, "model": "embargo.country", "pk": 249}, {"fields": {"profile_name": "desktop_mp4"}, "model": "edxval.profile", "pk": 1}, {"fields": {"profile_name": "desktop_webm"}, "model": "edxval.profile", "pk": 2}, {"fields": {"profile_name": "mobile_high"}, "model": "edxval.profile", "pk": 3}, {"fields": {"profile_name": "mobile_low"}, "model": "edxval.profile", "pk": 4}, {"fields": {"profile_name": "youtube"}, "model": "edxval.profile", "pk": 5}, {"fields": {"active": true, "description": "Autogenerated milestone relationship type \"fulfills\"", "modified": "2016-01-22T20:04:36.731Z", "name": "fulfills", "created": "2016-01-22T20:04:36.730Z"}, "model": "milestones.milestonerelationshiptype", "pk": 1}, {"fields": {"active": true, "description": "Autogenerated milestone relationship type \"requires\"", "modified": "2016-01-22T20:04:36.733Z", "name": "requires", "created": "2016-01-22T20:04:36.733Z"}, "model": "milestones.milestonerelationshiptype", "pk": 2}, {"fields": {"codename": "add_permission", "name": "Can add permission", "content_type": 1}, "model": "auth.permission", "pk": 1}, {"fields": {"codename": "change_permission", "name": "Can change permission", "content_type": 1}, "model": "auth.permission", "pk": 2}, {"fields": {"codename": "delete_permission", "name": "Can delete permission", "content_type": 1}, "model": "auth.permission", "pk": 3}, {"fields": {"codename": "add_group", "name": "Can add group", "content_type": 2}, "model": "auth.permission", "pk": 4}, {"fields": {"codename": "change_group", "name": "Can change group", "content_type": 2}, "model": "auth.permission", "pk": 5}, {"fields": {"codename": "delete_group", "name": "Can delete group", "content_type": 2}, "model": "auth.permission", "pk": 6}, {"fields": {"codename": "add_user", "name": "Can add user", "content_type": 3}, "model": "auth.permission", "pk": 7}, {"fields": {"codename": "change_user", "name": "Can change user", "content_type": 3}, "model": "auth.permission", "pk": 8}, {"fields": {"codename": "delete_user", "name": "Can delete user", "content_type": 3}, "model": "auth.permission", "pk": 9}, {"fields": {"codename": "add_contenttype", "name": "Can add content type", "content_type": 4}, "model": "auth.permission", "pk": 10}, {"fields": {"codename": "change_contenttype", "name": "Can change content type", "content_type": 4}, "model": "auth.permission", "pk": 11}, {"fields": {"codename": "delete_contenttype", "name": "Can delete content type", "content_type": 4}, "model": "auth.permission", "pk": 12}, {"fields": {"codename": "add_session", "name": "Can add session", "content_type": 5}, "model": "auth.permission", "pk": 13}, {"fields": {"codename": "change_session", "name": "Can change session", "content_type": 5}, "model": "auth.permission", "pk": 14}, {"fields": {"codename": "delete_session", "name": "Can delete session", "content_type": 5}, "model": "auth.permission", "pk": 15}, {"fields": {"codename": "add_site", "name": "Can add site", "content_type": 6}, "model": "auth.permission", "pk": 16}, {"fields": {"codename": "change_site", "name": "Can change site", "content_type": 6}, "model": "auth.permission", "pk": 17}, {"fields": {"codename": "delete_site", "name": "Can delete site", "content_type": 6}, "model": "auth.permission", "pk": 18}, {"fields": {"codename": "add_taskmeta", "name": "Can add task state", "content_type": 7}, "model": "auth.permission", "pk": 19}, {"fields": {"codename": "change_taskmeta", "name": "Can change task state", "content_type": 7}, "model": "auth.permission", "pk": 20}, {"fields": {"codename": "delete_taskmeta", "name": "Can delete task state", "content_type": 7}, "model": "auth.permission", "pk": 21}, {"fields": {"codename": "add_tasksetmeta", "name": "Can add saved group result", "content_type": 8}, "model": "auth.permission", "pk": 22}, {"fields": {"codename": "change_tasksetmeta", "name": "Can change saved group result", "content_type": 8}, "model": "auth.permission", "pk": 23}, {"fields": {"codename": "delete_tasksetmeta", "name": "Can delete saved group result", "content_type": 8}, "model": "auth.permission", "pk": 24}, {"fields": {"codename": "add_intervalschedule", "name": "Can add interval", "content_type": 9}, "model": "auth.permission", "pk": 25}, {"fields": {"codename": "change_intervalschedule", "name": "Can change interval", "content_type": 9}, "model": "auth.permission", "pk": 26}, {"fields": {"codename": "delete_intervalschedule", "name": "Can delete interval", "content_type": 9}, "model": "auth.permission", "pk": 27}, {"fields": {"codename": "add_crontabschedule", "name": "Can add crontab", "content_type": 10}, "model": "auth.permission", "pk": 28}, {"fields": {"codename": "change_crontabschedule", "name": "Can change crontab", "content_type": 10}, "model": "auth.permission", "pk": 29}, {"fields": {"codename": "delete_crontabschedule", "name": "Can delete crontab", "content_type": 10}, "model": "auth.permission", "pk": 30}, {"fields": {"codename": "add_periodictasks", "name": "Can add periodic tasks", "content_type": 11}, "model": "auth.permission", "pk": 31}, {"fields": {"codename": "change_periodictasks", "name": "Can change periodic tasks", "content_type": 11}, "model": "auth.permission", "pk": 32}, {"fields": {"codename": "delete_periodictasks", "name": "Can delete periodic tasks", "content_type": 11}, "model": "auth.permission", "pk": 33}, {"fields": {"codename": "add_periodictask", "name": "Can add periodic task", "content_type": 12}, "model": "auth.permission", "pk": 34}, {"fields": {"codename": "change_periodictask", "name": "Can change periodic task", "content_type": 12}, "model": "auth.permission", "pk": 35}, {"fields": {"codename": "delete_periodictask", "name": "Can delete periodic task", "content_type": 12}, "model": "auth.permission", "pk": 36}, {"fields": {"codename": "add_workerstate", "name": "Can add worker", "content_type": 13}, "model": "auth.permission", "pk": 37}, {"fields": {"codename": "change_workerstate", "name": "Can change worker", "content_type": 13}, "model": "auth.permission", "pk": 38}, {"fields": {"codename": "delete_workerstate", "name": "Can delete worker", "content_type": 13}, "model": "auth.permission", "pk": 39}, {"fields": {"codename": "add_taskstate", "name": "Can add task", "content_type": 14}, "model": "auth.permission", "pk": 40}, {"fields": {"codename": "change_taskstate", "name": "Can change task", "content_type": 14}, "model": "auth.permission", "pk": 41}, {"fields": {"codename": "delete_taskstate", "name": "Can delete task", "content_type": 14}, "model": "auth.permission", "pk": 42}, {"fields": {"codename": "add_globalstatusmessage", "name": "Can add global status message", "content_type": 15}, "model": "auth.permission", "pk": 43}, {"fields": {"codename": "change_globalstatusmessage", "name": "Can change global status message", "content_type": 15}, "model": "auth.permission", "pk": 44}, {"fields": {"codename": "delete_globalstatusmessage", "name": "Can delete global status message", "content_type": 15}, "model": "auth.permission", "pk": 45}, {"fields": {"codename": "add_coursemessage", "name": "Can add course message", "content_type": 16}, "model": "auth.permission", "pk": 46}, {"fields": {"codename": "change_coursemessage", "name": "Can change course message", "content_type": 16}, "model": "auth.permission", "pk": 47}, {"fields": {"codename": "delete_coursemessage", "name": "Can delete course message", "content_type": 16}, "model": "auth.permission", "pk": 48}, {"fields": {"codename": "add_assetbaseurlconfig", "name": "Can add asset base url config", "content_type": 17}, "model": "auth.permission", "pk": 49}, {"fields": {"codename": "change_assetbaseurlconfig", "name": "Can change asset base url config", "content_type": 17}, "model": "auth.permission", "pk": 50}, {"fields": {"codename": "delete_assetbaseurlconfig", "name": "Can delete asset base url config", "content_type": 17}, "model": "auth.permission", "pk": 51}, {"fields": {"codename": "add_studentmodule", "name": "Can add student module", "content_type": 18}, "model": "auth.permission", "pk": 52}, {"fields": {"codename": "change_studentmodule", "name": "Can change student module", "content_type": 18}, "model": "auth.permission", "pk": 53}, {"fields": {"codename": "delete_studentmodule", "name": "Can delete student module", "content_type": 18}, "model": "auth.permission", "pk": 54}, {"fields": {"codename": "add_studentmodulehistory", "name": "Can add student module history", "content_type": 19}, "model": "auth.permission", "pk": 55}, {"fields": {"codename": "change_studentmodulehistory", "name": "Can change student module history", "content_type": 19}, "model": "auth.permission", "pk": 56}, {"fields": {"codename": "delete_studentmodulehistory", "name": "Can delete student module history", "content_type": 19}, "model": "auth.permission", "pk": 57}, {"fields": {"codename": "add_xmoduleuserstatesummaryfield", "name": "Can add x module user state summary field", "content_type": 20}, "model": "auth.permission", "pk": 58}, {"fields": {"codename": "change_xmoduleuserstatesummaryfield", "name": "Can change x module user state summary field", "content_type": 20}, "model": "auth.permission", "pk": 59}, {"fields": {"codename": "delete_xmoduleuserstatesummaryfield", "name": "Can delete x module user state summary field", "content_type": 20}, "model": "auth.permission", "pk": 60}, {"fields": {"codename": "add_xmodulestudentprefsfield", "name": "Can add x module student prefs field", "content_type": 21}, "model": "auth.permission", "pk": 61}, {"fields": {"codename": "change_xmodulestudentprefsfield", "name": "Can change x module student prefs field", "content_type": 21}, "model": "auth.permission", "pk": 62}, {"fields": {"codename": "delete_xmodulestudentprefsfield", "name": "Can delete x module student prefs field", "content_type": 21}, "model": "auth.permission", "pk": 63}, {"fields": {"codename": "add_xmodulestudentinfofield", "name": "Can add x module student info field", "content_type": 22}, "model": "auth.permission", "pk": 64}, {"fields": {"codename": "change_xmodulestudentinfofield", "name": "Can change x module student info field", "content_type": 22}, "model": "auth.permission", "pk": 65}, {"fields": {"codename": "delete_xmodulestudentinfofield", "name": "Can delete x module student info field", "content_type": 22}, "model": "auth.permission", "pk": 66}, {"fields": {"codename": "add_offlinecomputedgrade", "name": "Can add offline computed grade", "content_type": 23}, "model": "auth.permission", "pk": 67}, {"fields": {"codename": "change_offlinecomputedgrade", "name": "Can change offline computed grade", "content_type": 23}, "model": "auth.permission", "pk": 68}, {"fields": {"codename": "delete_offlinecomputedgrade", "name": "Can delete offline computed grade", "content_type": 23}, "model": "auth.permission", "pk": 69}, {"fields": {"codename": "add_offlinecomputedgradelog", "name": "Can add offline computed grade log", "content_type": 24}, "model": "auth.permission", "pk": 70}, {"fields": {"codename": "change_offlinecomputedgradelog", "name": "Can change offline computed grade log", "content_type": 24}, "model": "auth.permission", "pk": 71}, {"fields": {"codename": "delete_offlinecomputedgradelog", "name": "Can delete offline computed grade log", "content_type": 24}, "model": "auth.permission", "pk": 72}, {"fields": {"codename": "add_studentfieldoverride", "name": "Can add student field override", "content_type": 25}, "model": "auth.permission", "pk": 73}, {"fields": {"codename": "change_studentfieldoverride", "name": "Can change student field override", "content_type": 25}, "model": "auth.permission", "pk": 74}, {"fields": {"codename": "delete_studentfieldoverride", "name": "Can delete student field override", "content_type": 25}, "model": "auth.permission", "pk": 75}, {"fields": {"codename": "add_anonymoususerid", "name": "Can add anonymous user id", "content_type": 26}, "model": "auth.permission", "pk": 76}, {"fields": {"codename": "change_anonymoususerid", "name": "Can change anonymous user id", "content_type": 26}, "model": "auth.permission", "pk": 77}, {"fields": {"codename": "delete_anonymoususerid", "name": "Can delete anonymous user id", "content_type": 26}, "model": "auth.permission", "pk": 78}, {"fields": {"codename": "add_userstanding", "name": "Can add user standing", "content_type": 27}, "model": "auth.permission", "pk": 79}, {"fields": {"codename": "change_userstanding", "name": "Can change user standing", "content_type": 27}, "model": "auth.permission", "pk": 80}, {"fields": {"codename": "delete_userstanding", "name": "Can delete user standing", "content_type": 27}, "model": "auth.permission", "pk": 81}, {"fields": {"codename": "add_userprofile", "name": "Can add user profile", "content_type": 28}, "model": "auth.permission", "pk": 82}, {"fields": {"codename": "change_userprofile", "name": "Can change user profile", "content_type": 28}, "model": "auth.permission", "pk": 83}, {"fields": {"codename": "delete_userprofile", "name": "Can delete user profile", "content_type": 28}, "model": "auth.permission", "pk": 84}, {"fields": {"codename": "add_usersignupsource", "name": "Can add user signup source", "content_type": 29}, "model": "auth.permission", "pk": 85}, {"fields": {"codename": "change_usersignupsource", "name": "Can change user signup source", "content_type": 29}, "model": "auth.permission", "pk": 86}, {"fields": {"codename": "delete_usersignupsource", "name": "Can delete user signup source", "content_type": 29}, "model": "auth.permission", "pk": 87}, {"fields": {"codename": "add_usertestgroup", "name": "Can add user test group", "content_type": 30}, "model": "auth.permission", "pk": 88}, {"fields": {"codename": "change_usertestgroup", "name": "Can change user test group", "content_type": 30}, "model": "auth.permission", "pk": 89}, {"fields": {"codename": "delete_usertestgroup", "name": "Can delete user test group", "content_type": 30}, "model": "auth.permission", "pk": 90}, {"fields": {"codename": "add_registration", "name": "Can add registration", "content_type": 31}, "model": "auth.permission", "pk": 91}, {"fields": {"codename": "change_registration", "name": "Can change registration", "content_type": 31}, "model": "auth.permission", "pk": 92}, {"fields": {"codename": "delete_registration", "name": "Can delete registration", "content_type": 31}, "model": "auth.permission", "pk": 93}, {"fields": {"codename": "add_pendingnamechange", "name": "Can add pending name change", "content_type": 32}, "model": "auth.permission", "pk": 94}, {"fields": {"codename": "change_pendingnamechange", "name": "Can change pending name change", "content_type": 32}, "model": "auth.permission", "pk": 95}, {"fields": {"codename": "delete_pendingnamechange", "name": "Can delete pending name change", "content_type": 32}, "model": "auth.permission", "pk": 96}, {"fields": {"codename": "add_pendingemailchange", "name": "Can add pending email change", "content_type": 33}, "model": "auth.permission", "pk": 97}, {"fields": {"codename": "change_pendingemailchange", "name": "Can change pending email change", "content_type": 33}, "model": "auth.permission", "pk": 98}, {"fields": {"codename": "delete_pendingemailchange", "name": "Can delete pending email change", "content_type": 33}, "model": "auth.permission", "pk": 99}, {"fields": {"codename": "add_passwordhistory", "name": "Can add password history", "content_type": 34}, "model": "auth.permission", "pk": 100}, {"fields": {"codename": "change_passwordhistory", "name": "Can change password history", "content_type": 34}, "model": "auth.permission", "pk": 101}, {"fields": {"codename": "delete_passwordhistory", "name": "Can delete password history", "content_type": 34}, "model": "auth.permission", "pk": 102}, {"fields": {"codename": "add_loginfailures", "name": "Can add login failures", "content_type": 35}, "model": "auth.permission", "pk": 103}, {"fields": {"codename": "change_loginfailures", "name": "Can change login failures", "content_type": 35}, "model": "auth.permission", "pk": 104}, {"fields": {"codename": "delete_loginfailures", "name": "Can delete login failures", "content_type": 35}, "model": "auth.permission", "pk": 105}, {"fields": {"codename": "add_historicalcourseenrollment", "name": "Can add historical course enrollment", "content_type": 36}, "model": "auth.permission", "pk": 106}, {"fields": {"codename": "change_historicalcourseenrollment", "name": "Can change historical course enrollment", "content_type": 36}, "model": "auth.permission", "pk": 107}, {"fields": {"codename": "delete_historicalcourseenrollment", "name": "Can delete historical course enrollment", "content_type": 36}, "model": "auth.permission", "pk": 108}, {"fields": {"codename": "add_courseenrollment", "name": "Can add course enrollment", "content_type": 37}, "model": "auth.permission", "pk": 109}, {"fields": {"codename": "change_courseenrollment", "name": "Can change course enrollment", "content_type": 37}, "model": "auth.permission", "pk": 110}, {"fields": {"codename": "delete_courseenrollment", "name": "Can delete course enrollment", "content_type": 37}, "model": "auth.permission", "pk": 111}, {"fields": {"codename": "add_manualenrollmentaudit", "name": "Can add manual enrollment audit", "content_type": 38}, "model": "auth.permission", "pk": 112}, {"fields": {"codename": "change_manualenrollmentaudit", "name": "Can change manual enrollment audit", "content_type": 38}, "model": "auth.permission", "pk": 113}, {"fields": {"codename": "delete_manualenrollmentaudit", "name": "Can delete manual enrollment audit", "content_type": 38}, "model": "auth.permission", "pk": 114}, {"fields": {"codename": "add_courseenrollmentallowed", "name": "Can add course enrollment allowed", "content_type": 39}, "model": "auth.permission", "pk": 115}, {"fields": {"codename": "change_courseenrollmentallowed", "name": "Can change course enrollment allowed", "content_type": 39}, "model": "auth.permission", "pk": 116}, {"fields": {"codename": "delete_courseenrollmentallowed", "name": "Can delete course enrollment allowed", "content_type": 39}, "model": "auth.permission", "pk": 117}, {"fields": {"codename": "add_courseaccessrole", "name": "Can add course access role", "content_type": 40}, "model": "auth.permission", "pk": 118}, {"fields": {"codename": "change_courseaccessrole", "name": "Can change course access role", "content_type": 40}, "model": "auth.permission", "pk": 119}, {"fields": {"codename": "delete_courseaccessrole", "name": "Can delete course access role", "content_type": 40}, "model": "auth.permission", "pk": 120}, {"fields": {"codename": "add_dashboardconfiguration", "name": "Can add dashboard configuration", "content_type": 41}, "model": "auth.permission", "pk": 121}, {"fields": {"codename": "change_dashboardconfiguration", "name": "Can change dashboard configuration", "content_type": 41}, "model": "auth.permission", "pk": 122}, {"fields": {"codename": "delete_dashboardconfiguration", "name": "Can delete dashboard configuration", "content_type": 41}, "model": "auth.permission", "pk": 123}, {"fields": {"codename": "add_linkedinaddtoprofileconfiguration", "name": "Can add linked in add to profile configuration", "content_type": 42}, "model": "auth.permission", "pk": 124}, {"fields": {"codename": "change_linkedinaddtoprofileconfiguration", "name": "Can change linked in add to profile configuration", "content_type": 42}, "model": "auth.permission", "pk": 125}, {"fields": {"codename": "delete_linkedinaddtoprofileconfiguration", "name": "Can delete linked in add to profile configuration", "content_type": 42}, "model": "auth.permission", "pk": 126}, {"fields": {"codename": "add_entranceexamconfiguration", "name": "Can add entrance exam configuration", "content_type": 43}, "model": "auth.permission", "pk": 127}, {"fields": {"codename": "change_entranceexamconfiguration", "name": "Can change entrance exam configuration", "content_type": 43}, "model": "auth.permission", "pk": 128}, {"fields": {"codename": "delete_entranceexamconfiguration", "name": "Can delete entrance exam configuration", "content_type": 43}, "model": "auth.permission", "pk": 129}, {"fields": {"codename": "add_languageproficiency", "name": "Can add language proficiency", "content_type": 44}, "model": "auth.permission", "pk": 130}, {"fields": {"codename": "change_languageproficiency", "name": "Can change language proficiency", "content_type": 44}, "model": "auth.permission", "pk": 131}, {"fields": {"codename": "delete_languageproficiency", "name": "Can delete language proficiency", "content_type": 44}, "model": "auth.permission", "pk": 132}, {"fields": {"codename": "add_courseenrollmentattribute", "name": "Can add course enrollment attribute", "content_type": 45}, "model": "auth.permission", "pk": 133}, {"fields": {"codename": "change_courseenrollmentattribute", "name": "Can change course enrollment attribute", "content_type": 45}, "model": "auth.permission", "pk": 134}, {"fields": {"codename": "delete_courseenrollmentattribute", "name": "Can delete course enrollment attribute", "content_type": 45}, "model": "auth.permission", "pk": 135}, {"fields": {"codename": "add_enrollmentrefundconfiguration", "name": "Can add enrollment refund configuration", "content_type": 46}, "model": "auth.permission", "pk": 136}, {"fields": {"codename": "change_enrollmentrefundconfiguration", "name": "Can change enrollment refund configuration", "content_type": 46}, "model": "auth.permission", "pk": 137}, {"fields": {"codename": "delete_enrollmentrefundconfiguration", "name": "Can delete enrollment refund configuration", "content_type": 46}, "model": "auth.permission", "pk": 138}, {"fields": {"codename": "add_trackinglog", "name": "Can add tracking log", "content_type": 47}, "model": "auth.permission", "pk": 139}, {"fields": {"codename": "change_trackinglog", "name": "Can change tracking log", "content_type": 47}, "model": "auth.permission", "pk": 140}, {"fields": {"codename": "delete_trackinglog", "name": "Can delete tracking log", "content_type": 47}, "model": "auth.permission", "pk": 141}, {"fields": {"codename": "add_ratelimitconfiguration", "name": "Can add rate limit configuration", "content_type": 48}, "model": "auth.permission", "pk": 142}, {"fields": {"codename": "change_ratelimitconfiguration", "name": "Can change rate limit configuration", "content_type": 48}, "model": "auth.permission", "pk": 143}, {"fields": {"codename": "delete_ratelimitconfiguration", "name": "Can delete rate limit configuration", "content_type": 48}, "model": "auth.permission", "pk": 144}, {"fields": {"codename": "add_certificatewhitelist", "name": "Can add certificate whitelist", "content_type": 49}, "model": "auth.permission", "pk": 145}, {"fields": {"codename": "change_certificatewhitelist", "name": "Can change certificate whitelist", "content_type": 49}, "model": "auth.permission", "pk": 146}, {"fields": {"codename": "delete_certificatewhitelist", "name": "Can delete certificate whitelist", "content_type": 49}, "model": "auth.permission", "pk": 147}, {"fields": {"codename": "add_generatedcertificate", "name": "Can add generated certificate", "content_type": 50}, "model": "auth.permission", "pk": 148}, {"fields": {"codename": "change_generatedcertificate", "name": "Can change generated certificate", "content_type": 50}, "model": "auth.permission", "pk": 149}, {"fields": {"codename": "delete_generatedcertificate", "name": "Can delete generated certificate", "content_type": 50}, "model": "auth.permission", "pk": 150}, {"fields": {"codename": "add_certificategenerationhistory", "name": "Can add certificate generation history", "content_type": 51}, "model": "auth.permission", "pk": 151}, {"fields": {"codename": "change_certificategenerationhistory", "name": "Can change certificate generation history", "content_type": 51}, "model": "auth.permission", "pk": 152}, {"fields": {"codename": "delete_certificategenerationhistory", "name": "Can delete certificate generation history", "content_type": 51}, "model": "auth.permission", "pk": 153}, {"fields": {"codename": "add_certificateinvalidation", "name": "Can add certificate invalidation", "content_type": 52}, "model": "auth.permission", "pk": 154}, {"fields": {"codename": "change_certificateinvalidation", "name": "Can change certificate invalidation", "content_type": 52}, "model": "auth.permission", "pk": 155}, {"fields": {"codename": "delete_certificateinvalidation", "name": "Can delete certificate invalidation", "content_type": 52}, "model": "auth.permission", "pk": 156}, {"fields": {"codename": "add_examplecertificateset", "name": "Can add example certificate set", "content_type": 53}, "model": "auth.permission", "pk": 157}, {"fields": {"codename": "change_examplecertificateset", "name": "Can change example certificate set", "content_type": 53}, "model": "auth.permission", "pk": 158}, {"fields": {"codename": "delete_examplecertificateset", "name": "Can delete example certificate set", "content_type": 53}, "model": "auth.permission", "pk": 159}, {"fields": {"codename": "add_examplecertificate", "name": "Can add example certificate", "content_type": 54}, "model": "auth.permission", "pk": 160}, {"fields": {"codename": "change_examplecertificate", "name": "Can change example certificate", "content_type": 54}, "model": "auth.permission", "pk": 161}, {"fields": {"codename": "delete_examplecertificate", "name": "Can delete example certificate", "content_type": 54}, "model": "auth.permission", "pk": 162}, {"fields": {"codename": "add_certificategenerationcoursesetting", "name": "Can add certificate generation course setting", "content_type": 55}, "model": "auth.permission", "pk": 163}, {"fields": {"codename": "change_certificategenerationcoursesetting", "name": "Can change certificate generation course setting", "content_type": 55}, "model": "auth.permission", "pk": 164}, {"fields": {"codename": "delete_certificategenerationcoursesetting", "name": "Can delete certificate generation course setting", "content_type": 55}, "model": "auth.permission", "pk": 165}, {"fields": {"codename": "add_certificategenerationconfiguration", "name": "Can add certificate generation configuration", "content_type": 56}, "model": "auth.permission", "pk": 166}, {"fields": {"codename": "change_certificategenerationconfiguration", "name": "Can change certificate generation configuration", "content_type": 56}, "model": "auth.permission", "pk": 167}, {"fields": {"codename": "delete_certificategenerationconfiguration", "name": "Can delete certificate generation configuration", "content_type": 56}, "model": "auth.permission", "pk": 168}, {"fields": {"codename": "add_certificatehtmlviewconfiguration", "name": "Can add certificate html view configuration", "content_type": 57}, "model": "auth.permission", "pk": 169}, {"fields": {"codename": "change_certificatehtmlviewconfiguration", "name": "Can change certificate html view configuration", "content_type": 57}, "model": "auth.permission", "pk": 170}, {"fields": {"codename": "delete_certificatehtmlviewconfiguration", "name": "Can delete certificate html view configuration", "content_type": 57}, "model": "auth.permission", "pk": 171}, {"fields": {"codename": "add_badgeassertion", "name": "Can add badge assertion", "content_type": 58}, "model": "auth.permission", "pk": 172}, {"fields": {"codename": "change_badgeassertion", "name": "Can change badge assertion", "content_type": 58}, "model": "auth.permission", "pk": 173}, {"fields": {"codename": "delete_badgeassertion", "name": "Can delete badge assertion", "content_type": 58}, "model": "auth.permission", "pk": 174}, {"fields": {"codename": "add_badgeimageconfiguration", "name": "Can add badge image configuration", "content_type": 59}, "model": "auth.permission", "pk": 175}, {"fields": {"codename": "change_badgeimageconfiguration", "name": "Can change badge image configuration", "content_type": 59}, "model": "auth.permission", "pk": 176}, {"fields": {"codename": "delete_badgeimageconfiguration", "name": "Can delete badge image configuration", "content_type": 59}, "model": "auth.permission", "pk": 177}, {"fields": {"codename": "add_certificatetemplate", "name": "Can add certificate template", "content_type": 60}, "model": "auth.permission", "pk": 178}, {"fields": {"codename": "change_certificatetemplate", "name": "Can change certificate template", "content_type": 60}, "model": "auth.permission", "pk": 179}, {"fields": {"codename": "delete_certificatetemplate", "name": "Can delete certificate template", "content_type": 60}, "model": "auth.permission", "pk": 180}, {"fields": {"codename": "add_certificatetemplateasset", "name": "Can add certificate template asset", "content_type": 61}, "model": "auth.permission", "pk": 181}, {"fields": {"codename": "change_certificatetemplateasset", "name": "Can change certificate template asset", "content_type": 61}, "model": "auth.permission", "pk": 182}, {"fields": {"codename": "delete_certificatetemplateasset", "name": "Can delete certificate template asset", "content_type": 61}, "model": "auth.permission", "pk": 183}, {"fields": {"codename": "add_instructortask", "name": "Can add instructor task", "content_type": 62}, "model": "auth.permission", "pk": 184}, {"fields": {"codename": "change_instructortask", "name": "Can change instructor task", "content_type": 62}, "model": "auth.permission", "pk": 185}, {"fields": {"codename": "delete_instructortask", "name": "Can delete instructor task", "content_type": 62}, "model": "auth.permission", "pk": 186}, {"fields": {"codename": "add_courseusergroup", "name": "Can add course user group", "content_type": 63}, "model": "auth.permission", "pk": 187}, {"fields": {"codename": "change_courseusergroup", "name": "Can change course user group", "content_type": 63}, "model": "auth.permission", "pk": 188}, {"fields": {"codename": "delete_courseusergroup", "name": "Can delete course user group", "content_type": 63}, "model": "auth.permission", "pk": 189}, {"fields": {"codename": "add_cohortmembership", "name": "Can add cohort membership", "content_type": 64}, "model": "auth.permission", "pk": 190}, {"fields": {"codename": "change_cohortmembership", "name": "Can change cohort membership", "content_type": 64}, "model": "auth.permission", "pk": 191}, {"fields": {"codename": "delete_cohortmembership", "name": "Can delete cohort membership", "content_type": 64}, "model": "auth.permission", "pk": 192}, {"fields": {"codename": "add_courseusergrouppartitiongroup", "name": "Can add course user group partition group", "content_type": 65}, "model": "auth.permission", "pk": 193}, {"fields": {"codename": "change_courseusergrouppartitiongroup", "name": "Can change course user group partition group", "content_type": 65}, "model": "auth.permission", "pk": 194}, {"fields": {"codename": "delete_courseusergrouppartitiongroup", "name": "Can delete course user group partition group", "content_type": 65}, "model": "auth.permission", "pk": 195}, {"fields": {"codename": "add_coursecohortssettings", "name": "Can add course cohorts settings", "content_type": 66}, "model": "auth.permission", "pk": 196}, {"fields": {"codename": "change_coursecohortssettings", "name": "Can change course cohorts settings", "content_type": 66}, "model": "auth.permission", "pk": 197}, {"fields": {"codename": "delete_coursecohortssettings", "name": "Can delete course cohorts settings", "content_type": 66}, "model": "auth.permission", "pk": 198}, {"fields": {"codename": "add_coursecohort", "name": "Can add course cohort", "content_type": 67}, "model": "auth.permission", "pk": 199}, {"fields": {"codename": "change_coursecohort", "name": "Can change course cohort", "content_type": 67}, "model": "auth.permission", "pk": 200}, {"fields": {"codename": "delete_coursecohort", "name": "Can delete course cohort", "content_type": 67}, "model": "auth.permission", "pk": 201}, {"fields": {"codename": "add_courseemail", "name": "Can add course email", "content_type": 68}, "model": "auth.permission", "pk": 202}, {"fields": {"codename": "change_courseemail", "name": "Can change course email", "content_type": 68}, "model": "auth.permission", "pk": 203}, {"fields": {"codename": "delete_courseemail", "name": "Can delete course email", "content_type": 68}, "model": "auth.permission", "pk": 204}, {"fields": {"codename": "add_optout", "name": "Can add optout", "content_type": 69}, "model": "auth.permission", "pk": 205}, {"fields": {"codename": "change_optout", "name": "Can change optout", "content_type": 69}, "model": "auth.permission", "pk": 206}, {"fields": {"codename": "delete_optout", "name": "Can delete optout", "content_type": 69}, "model": "auth.permission", "pk": 207}, {"fields": {"codename": "add_courseemailtemplate", "name": "Can add course email template", "content_type": 70}, "model": "auth.permission", "pk": 208}, {"fields": {"codename": "change_courseemailtemplate", "name": "Can change course email template", "content_type": 70}, "model": "auth.permission", "pk": 209}, {"fields": {"codename": "delete_courseemailtemplate", "name": "Can delete course email template", "content_type": 70}, "model": "auth.permission", "pk": 210}, {"fields": {"codename": "add_courseauthorization", "name": "Can add course authorization", "content_type": 71}, "model": "auth.permission", "pk": 211}, {"fields": {"codename": "change_courseauthorization", "name": "Can change course authorization", "content_type": 71}, "model": "auth.permission", "pk": 212}, {"fields": {"codename": "delete_courseauthorization", "name": "Can delete course authorization", "content_type": 71}, "model": "auth.permission", "pk": 213}, {"fields": {"codename": "add_brandinginfoconfig", "name": "Can add branding info config", "content_type": 72}, "model": "auth.permission", "pk": 214}, {"fields": {"codename": "change_brandinginfoconfig", "name": "Can change branding info config", "content_type": 72}, "model": "auth.permission", "pk": 215}, {"fields": {"codename": "delete_brandinginfoconfig", "name": "Can delete branding info config", "content_type": 72}, "model": "auth.permission", "pk": 216}, {"fields": {"codename": "add_brandingapiconfig", "name": "Can add branding api config", "content_type": 73}, "model": "auth.permission", "pk": 217}, {"fields": {"codename": "change_brandingapiconfig", "name": "Can change branding api config", "content_type": 73}, "model": "auth.permission", "pk": 218}, {"fields": {"codename": "delete_brandingapiconfig", "name": "Can delete branding api config", "content_type": 73}, "model": "auth.permission", "pk": 219}, {"fields": {"codename": "add_externalauthmap", "name": "Can add external auth map", "content_type": 74}, "model": "auth.permission", "pk": 220}, {"fields": {"codename": "change_externalauthmap", "name": "Can change external auth map", "content_type": 74}, "model": "auth.permission", "pk": 221}, {"fields": {"codename": "delete_externalauthmap", "name": "Can delete external auth map", "content_type": 74}, "model": "auth.permission", "pk": 222}, {"fields": {"codename": "add_nonce", "name": "Can add nonce", "content_type": 75}, "model": "auth.permission", "pk": 223}, {"fields": {"codename": "change_nonce", "name": "Can change nonce", "content_type": 75}, "model": "auth.permission", "pk": 224}, {"fields": {"codename": "delete_nonce", "name": "Can delete nonce", "content_type": 75}, "model": "auth.permission", "pk": 225}, {"fields": {"codename": "add_association", "name": "Can add association", "content_type": 76}, "model": "auth.permission", "pk": 226}, {"fields": {"codename": "change_association", "name": "Can change association", "content_type": 76}, "model": "auth.permission", "pk": 227}, {"fields": {"codename": "delete_association", "name": "Can delete association", "content_type": 76}, "model": "auth.permission", "pk": 228}, {"fields": {"codename": "add_useropenid", "name": "Can add user open id", "content_type": 77}, "model": "auth.permission", "pk": 229}, {"fields": {"codename": "change_useropenid", "name": "Can change user open id", "content_type": 77}, "model": "auth.permission", "pk": 230}, {"fields": {"codename": "delete_useropenid", "name": "Can delete user open id", "content_type": 77}, "model": "auth.permission", "pk": 231}, {"fields": {"codename": "account_verified", "name": "The OpenID has been verified", "content_type": 77}, "model": "auth.permission", "pk": 232}, {"fields": {"codename": "add_client", "name": "Can add client", "content_type": 78}, "model": "auth.permission", "pk": 233}, {"fields": {"codename": "change_client", "name": "Can change client", "content_type": 78}, "model": "auth.permission", "pk": 234}, {"fields": {"codename": "delete_client", "name": "Can delete client", "content_type": 78}, "model": "auth.permission", "pk": 235}, {"fields": {"codename": "add_grant", "name": "Can add grant", "content_type": 79}, "model": "auth.permission", "pk": 236}, {"fields": {"codename": "change_grant", "name": "Can change grant", "content_type": 79}, "model": "auth.permission", "pk": 237}, {"fields": {"codename": "delete_grant", "name": "Can delete grant", "content_type": 79}, "model": "auth.permission", "pk": 238}, {"fields": {"codename": "add_accesstoken", "name": "Can add access token", "content_type": 80}, "model": "auth.permission", "pk": 239}, {"fields": {"codename": "change_accesstoken", "name": "Can change access token", "content_type": 80}, "model": "auth.permission", "pk": 240}, {"fields": {"codename": "delete_accesstoken", "name": "Can delete access token", "content_type": 80}, "model": "auth.permission", "pk": 241}, {"fields": {"codename": "add_refreshtoken", "name": "Can add refresh token", "content_type": 81}, "model": "auth.permission", "pk": 242}, {"fields": {"codename": "change_refreshtoken", "name": "Can change refresh token", "content_type": 81}, "model": "auth.permission", "pk": 243}, {"fields": {"codename": "delete_refreshtoken", "name": "Can delete refresh token", "content_type": 81}, "model": "auth.permission", "pk": 244}, {"fields": {"codename": "add_trustedclient", "name": "Can add trusted client", "content_type": 82}, "model": "auth.permission", "pk": 245}, {"fields": {"codename": "change_trustedclient", "name": "Can change trusted client", "content_type": 82}, "model": "auth.permission", "pk": 246}, {"fields": {"codename": "delete_trustedclient", "name": "Can delete trusted client", "content_type": 82}, "model": "auth.permission", "pk": 247}, {"fields": {"codename": "add_oauth2providerconfig", "name": "Can add Provider Configuration (OAuth)", "content_type": 83}, "model": "auth.permission", "pk": 248}, {"fields": {"codename": "change_oauth2providerconfig", "name": "Can change Provider Configuration (OAuth)", "content_type": 83}, "model": "auth.permission", "pk": 249}, {"fields": {"codename": "delete_oauth2providerconfig", "name": "Can delete Provider Configuration (OAuth)", "content_type": 83}, "model": "auth.permission", "pk": 250}, {"fields": {"codename": "add_samlproviderconfig", "name": "Can add Provider Configuration (SAML IdP)", "content_type": 84}, "model": "auth.permission", "pk": 251}, {"fields": {"codename": "change_samlproviderconfig", "name": "Can change Provider Configuration (SAML IdP)", "content_type": 84}, "model": "auth.permission", "pk": 252}, {"fields": {"codename": "delete_samlproviderconfig", "name": "Can delete Provider Configuration (SAML IdP)", "content_type": 84}, "model": "auth.permission", "pk": 253}, {"fields": {"codename": "add_samlconfiguration", "name": "Can add SAML Configuration", "content_type": 85}, "model": "auth.permission", "pk": 254}, {"fields": {"codename": "change_samlconfiguration", "name": "Can change SAML Configuration", "content_type": 85}, "model": "auth.permission", "pk": 255}, {"fields": {"codename": "delete_samlconfiguration", "name": "Can delete SAML Configuration", "content_type": 85}, "model": "auth.permission", "pk": 256}, {"fields": {"codename": "add_samlproviderdata", "name": "Can add SAML Provider Data", "content_type": 86}, "model": "auth.permission", "pk": 257}, {"fields": {"codename": "change_samlproviderdata", "name": "Can change SAML Provider Data", "content_type": 86}, "model": "auth.permission", "pk": 258}, {"fields": {"codename": "delete_samlproviderdata", "name": "Can delete SAML Provider Data", "content_type": 86}, "model": "auth.permission", "pk": 259}, {"fields": {"codename": "add_ltiproviderconfig", "name": "Can add Provider Configuration (LTI)", "content_type": 87}, "model": "auth.permission", "pk": 260}, {"fields": {"codename": "change_ltiproviderconfig", "name": "Can change Provider Configuration (LTI)", "content_type": 87}, "model": "auth.permission", "pk": 261}, {"fields": {"codename": "delete_ltiproviderconfig", "name": "Can delete Provider Configuration (LTI)", "content_type": 87}, "model": "auth.permission", "pk": 262}, {"fields": {"codename": "add_providerapipermissions", "name": "Can add Provider API Permission", "content_type": 88}, "model": "auth.permission", "pk": 263}, {"fields": {"codename": "change_providerapipermissions", "name": "Can change Provider API Permission", "content_type": 88}, "model": "auth.permission", "pk": 264}, {"fields": {"codename": "delete_providerapipermissions", "name": "Can delete Provider API Permission", "content_type": 88}, "model": "auth.permission", "pk": 265}, {"fields": {"codename": "add_nonce", "name": "Can add nonce", "content_type": 89}, "model": "auth.permission", "pk": 266}, {"fields": {"codename": "change_nonce", "name": "Can change nonce", "content_type": 89}, "model": "auth.permission", "pk": 267}, {"fields": {"codename": "delete_nonce", "name": "Can delete nonce", "content_type": 89}, "model": "auth.permission", "pk": 268}, {"fields": {"codename": "add_scope", "name": "Can add scope", "content_type": 90}, "model": "auth.permission", "pk": 269}, {"fields": {"codename": "change_scope", "name": "Can change scope", "content_type": 90}, "model": "auth.permission", "pk": 270}, {"fields": {"codename": "delete_scope", "name": "Can delete scope", "content_type": 90}, "model": "auth.permission", "pk": 271}, {"fields": {"codename": "add_resource", "name": "Can add resource", "content_type": 90}, "model": "auth.permission", "pk": 272}, {"fields": {"codename": "change_resource", "name": "Can change resource", "content_type": 90}, "model": "auth.permission", "pk": 273}, {"fields": {"codename": "delete_resource", "name": "Can delete resource", "content_type": 90}, "model": "auth.permission", "pk": 274}, {"fields": {"codename": "add_consumer", "name": "Can add consumer", "content_type": 91}, "model": "auth.permission", "pk": 275}, {"fields": {"codename": "change_consumer", "name": "Can change consumer", "content_type": 91}, "model": "auth.permission", "pk": 276}, {"fields": {"codename": "delete_consumer", "name": "Can delete consumer", "content_type": 91}, "model": "auth.permission", "pk": 277}, {"fields": {"codename": "add_token", "name": "Can add token", "content_type": 92}, "model": "auth.permission", "pk": 278}, {"fields": {"codename": "change_token", "name": "Can change token", "content_type": 92}, "model": "auth.permission", "pk": 279}, {"fields": {"codename": "delete_token", "name": "Can delete token", "content_type": 92}, "model": "auth.permission", "pk": 280}, {"fields": {"codename": "add_article", "name": "Can add article", "content_type": 94}, "model": "auth.permission", "pk": 281}, {"fields": {"codename": "change_article", "name": "Can change article", "content_type": 94}, "model": "auth.permission", "pk": 282}, {"fields": {"codename": "delete_article", "name": "Can delete article", "content_type": 94}, "model": "auth.permission", "pk": 283}, {"fields": {"codename": "moderate", "name": "Can edit all articles and lock/unlock/restore", "content_type": 94}, "model": "auth.permission", "pk": 284}, {"fields": {"codename": "assign", "name": "Can change ownership of any article", "content_type": 94}, "model": "auth.permission", "pk": 285}, {"fields": {"codename": "grant", "name": "Can assign permissions to other users", "content_type": 94}, "model": "auth.permission", "pk": 286}, {"fields": {"codename": "add_articleforobject", "name": "Can add Article for object", "content_type": 95}, "model": "auth.permission", "pk": 287}, {"fields": {"codename": "change_articleforobject", "name": "Can change Article for object", "content_type": 95}, "model": "auth.permission", "pk": 288}, {"fields": {"codename": "delete_articleforobject", "name": "Can delete Article for object", "content_type": 95}, "model": "auth.permission", "pk": 289}, {"fields": {"codename": "add_articlerevision", "name": "Can add article revision", "content_type": 96}, "model": "auth.permission", "pk": 290}, {"fields": {"codename": "change_articlerevision", "name": "Can change article revision", "content_type": 96}, "model": "auth.permission", "pk": 291}, {"fields": {"codename": "delete_articlerevision", "name": "Can delete article revision", "content_type": 96}, "model": "auth.permission", "pk": 292}, {"fields": {"codename": "add_urlpath", "name": "Can add URL path", "content_type": 97}, "model": "auth.permission", "pk": 293}, {"fields": {"codename": "change_urlpath", "name": "Can change URL path", "content_type": 97}, "model": "auth.permission", "pk": 294}, {"fields": {"codename": "delete_urlpath", "name": "Can delete URL path", "content_type": 97}, "model": "auth.permission", "pk": 295}, {"fields": {"codename": "add_articleplugin", "name": "Can add article plugin", "content_type": 98}, "model": "auth.permission", "pk": 296}, {"fields": {"codename": "change_articleplugin", "name": "Can change article plugin", "content_type": 98}, "model": "auth.permission", "pk": 297}, {"fields": {"codename": "delete_articleplugin", "name": "Can delete article plugin", "content_type": 98}, "model": "auth.permission", "pk": 298}, {"fields": {"codename": "add_reusableplugin", "name": "Can add reusable plugin", "content_type": 99}, "model": "auth.permission", "pk": 299}, {"fields": {"codename": "change_reusableplugin", "name": "Can change reusable plugin", "content_type": 99}, "model": "auth.permission", "pk": 300}, {"fields": {"codename": "delete_reusableplugin", "name": "Can delete reusable plugin", "content_type": 99}, "model": "auth.permission", "pk": 301}, {"fields": {"codename": "add_simpleplugin", "name": "Can add simple plugin", "content_type": 100}, "model": "auth.permission", "pk": 302}, {"fields": {"codename": "change_simpleplugin", "name": "Can change simple plugin", "content_type": 100}, "model": "auth.permission", "pk": 303}, {"fields": {"codename": "delete_simpleplugin", "name": "Can delete simple plugin", "content_type": 100}, "model": "auth.permission", "pk": 304}, {"fields": {"codename": "add_revisionplugin", "name": "Can add revision plugin", "content_type": 101}, "model": "auth.permission", "pk": 305}, {"fields": {"codename": "change_revisionplugin", "name": "Can change revision plugin", "content_type": 101}, "model": "auth.permission", "pk": 306}, {"fields": {"codename": "delete_revisionplugin", "name": "Can delete revision plugin", "content_type": 101}, "model": "auth.permission", "pk": 307}, {"fields": {"codename": "add_revisionpluginrevision", "name": "Can add revision plugin revision", "content_type": 102}, "model": "auth.permission", "pk": 308}, {"fields": {"codename": "change_revisionpluginrevision", "name": "Can change revision plugin revision", "content_type": 102}, "model": "auth.permission", "pk": 309}, {"fields": {"codename": "delete_revisionpluginrevision", "name": "Can delete revision plugin revision", "content_type": 102}, "model": "auth.permission", "pk": 310}, {"fields": {"codename": "add_image", "name": "Can add image", "content_type": 103}, "model": "auth.permission", "pk": 311}, {"fields": {"codename": "change_image", "name": "Can change image", "content_type": 103}, "model": "auth.permission", "pk": 312}, {"fields": {"codename": "delete_image", "name": "Can delete image", "content_type": 103}, "model": "auth.permission", "pk": 313}, {"fields": {"codename": "add_imagerevision", "name": "Can add image revision", "content_type": 104}, "model": "auth.permission", "pk": 314}, {"fields": {"codename": "change_imagerevision", "name": "Can change image revision", "content_type": 104}, "model": "auth.permission", "pk": 315}, {"fields": {"codename": "delete_imagerevision", "name": "Can delete image revision", "content_type": 104}, "model": "auth.permission", "pk": 316}, {"fields": {"codename": "add_attachment", "name": "Can add attachment", "content_type": 105}, "model": "auth.permission", "pk": 317}, {"fields": {"codename": "change_attachment", "name": "Can change attachment", "content_type": 105}, "model": "auth.permission", "pk": 318}, {"fields": {"codename": "delete_attachment", "name": "Can delete attachment", "content_type": 105}, "model": "auth.permission", "pk": 319}, {"fields": {"codename": "add_attachmentrevision", "name": "Can add attachment revision", "content_type": 106}, "model": "auth.permission", "pk": 320}, {"fields": {"codename": "change_attachmentrevision", "name": "Can change attachment revision", "content_type": 106}, "model": "auth.permission", "pk": 321}, {"fields": {"codename": "delete_attachmentrevision", "name": "Can delete attachment revision", "content_type": 106}, "model": "auth.permission", "pk": 322}, {"fields": {"codename": "add_notificationtype", "name": "Can add type", "content_type": 107}, "model": "auth.permission", "pk": 323}, {"fields": {"codename": "change_notificationtype", "name": "Can change type", "content_type": 107}, "model": "auth.permission", "pk": 324}, {"fields": {"codename": "delete_notificationtype", "name": "Can delete type", "content_type": 107}, "model": "auth.permission", "pk": 325}, {"fields": {"codename": "add_settings", "name": "Can add settings", "content_type": 108}, "model": "auth.permission", "pk": 326}, {"fields": {"codename": "change_settings", "name": "Can change settings", "content_type": 108}, "model": "auth.permission", "pk": 327}, {"fields": {"codename": "delete_settings", "name": "Can delete settings", "content_type": 108}, "model": "auth.permission", "pk": 328}, {"fields": {"codename": "add_subscription", "name": "Can add subscription", "content_type": 109}, "model": "auth.permission", "pk": 329}, {"fields": {"codename": "change_subscription", "name": "Can change subscription", "content_type": 109}, "model": "auth.permission", "pk": 330}, {"fields": {"codename": "delete_subscription", "name": "Can delete subscription", "content_type": 109}, "model": "auth.permission", "pk": 331}, {"fields": {"codename": "add_notification", "name": "Can add notification", "content_type": 110}, "model": "auth.permission", "pk": 332}, {"fields": {"codename": "change_notification", "name": "Can change notification", "content_type": 110}, "model": "auth.permission", "pk": 333}, {"fields": {"codename": "delete_notification", "name": "Can delete notification", "content_type": 110}, "model": "auth.permission", "pk": 334}, {"fields": {"codename": "add_logentry", "name": "Can add log entry", "content_type": 111}, "model": "auth.permission", "pk": 335}, {"fields": {"codename": "change_logentry", "name": "Can change log entry", "content_type": 111}, "model": "auth.permission", "pk": 336}, {"fields": {"codename": "delete_logentry", "name": "Can delete log entry", "content_type": 111}, "model": "auth.permission", "pk": 337}, {"fields": {"codename": "add_role", "name": "Can add role", "content_type": 112}, "model": "auth.permission", "pk": 338}, {"fields": {"codename": "change_role", "name": "Can change role", "content_type": 112}, "model": "auth.permission", "pk": 339}, {"fields": {"codename": "delete_role", "name": "Can delete role", "content_type": 112}, "model": "auth.permission", "pk": 340}, {"fields": {"codename": "add_permission", "name": "Can add permission", "content_type": 113}, "model": "auth.permission", "pk": 341}, {"fields": {"codename": "change_permission", "name": "Can change permission", "content_type": 113}, "model": "auth.permission", "pk": 342}, {"fields": {"codename": "delete_permission", "name": "Can delete permission", "content_type": 113}, "model": "auth.permission", "pk": 343}, {"fields": {"codename": "add_note", "name": "Can add note", "content_type": 114}, "model": "auth.permission", "pk": 344}, {"fields": {"codename": "change_note", "name": "Can change note", "content_type": 114}, "model": "auth.permission", "pk": 345}, {"fields": {"codename": "delete_note", "name": "Can delete note", "content_type": 114}, "model": "auth.permission", "pk": 346}, {"fields": {"codename": "add_splashconfig", "name": "Can add splash config", "content_type": 115}, "model": "auth.permission", "pk": 347}, {"fields": {"codename": "change_splashconfig", "name": "Can change splash config", "content_type": 115}, "model": "auth.permission", "pk": 348}, {"fields": {"codename": "delete_splashconfig", "name": "Can delete splash config", "content_type": 115}, "model": "auth.permission", "pk": 349}, {"fields": {"codename": "add_userpreference", "name": "Can add user preference", "content_type": 116}, "model": "auth.permission", "pk": 350}, {"fields": {"codename": "change_userpreference", "name": "Can change user preference", "content_type": 116}, "model": "auth.permission", "pk": 351}, {"fields": {"codename": "delete_userpreference", "name": "Can delete user preference", "content_type": 116}, "model": "auth.permission", "pk": 352}, {"fields": {"codename": "add_usercoursetag", "name": "Can add user course tag", "content_type": 117}, "model": "auth.permission", "pk": 353}, {"fields": {"codename": "change_usercoursetag", "name": "Can change user course tag", "content_type": 117}, "model": "auth.permission", "pk": 354}, {"fields": {"codename": "delete_usercoursetag", "name": "Can delete user course tag", "content_type": 117}, "model": "auth.permission", "pk": 355}, {"fields": {"codename": "add_userorgtag", "name": "Can add user org tag", "content_type": 118}, "model": "auth.permission", "pk": 356}, {"fields": {"codename": "change_userorgtag", "name": "Can change user org tag", "content_type": 118}, "model": "auth.permission", "pk": 357}, {"fields": {"codename": "delete_userorgtag", "name": "Can delete user org tag", "content_type": 118}, "model": "auth.permission", "pk": 358}, {"fields": {"codename": "add_order", "name": "Can add order", "content_type": 119}, "model": "auth.permission", "pk": 359}, {"fields": {"codename": "change_order", "name": "Can change order", "content_type": 119}, "model": "auth.permission", "pk": 360}, {"fields": {"codename": "delete_order", "name": "Can delete order", "content_type": 119}, "model": "auth.permission", "pk": 361}, {"fields": {"codename": "add_orderitem", "name": "Can add order item", "content_type": 120}, "model": "auth.permission", "pk": 362}, {"fields": {"codename": "change_orderitem", "name": "Can change order item", "content_type": 120}, "model": "auth.permission", "pk": 363}, {"fields": {"codename": "delete_orderitem", "name": "Can delete order item", "content_type": 120}, "model": "auth.permission", "pk": 364}, {"fields": {"codename": "add_invoice", "name": "Can add invoice", "content_type": 121}, "model": "auth.permission", "pk": 365}, {"fields": {"codename": "change_invoice", "name": "Can change invoice", "content_type": 121}, "model": "auth.permission", "pk": 366}, {"fields": {"codename": "delete_invoice", "name": "Can delete invoice", "content_type": 121}, "model": "auth.permission", "pk": 367}, {"fields": {"codename": "add_invoicetransaction", "name": "Can add invoice transaction", "content_type": 122}, "model": "auth.permission", "pk": 368}, {"fields": {"codename": "change_invoicetransaction", "name": "Can change invoice transaction", "content_type": 122}, "model": "auth.permission", "pk": 369}, {"fields": {"codename": "delete_invoicetransaction", "name": "Can delete invoice transaction", "content_type": 122}, "model": "auth.permission", "pk": 370}, {"fields": {"codename": "add_invoiceitem", "name": "Can add invoice item", "content_type": 123}, "model": "auth.permission", "pk": 371}, {"fields": {"codename": "change_invoiceitem", "name": "Can change invoice item", "content_type": 123}, "model": "auth.permission", "pk": 372}, {"fields": {"codename": "delete_invoiceitem", "name": "Can delete invoice item", "content_type": 123}, "model": "auth.permission", "pk": 373}, {"fields": {"codename": "add_courseregistrationcodeinvoiceitem", "name": "Can add course registration code invoice item", "content_type": 124}, "model": "auth.permission", "pk": 374}, {"fields": {"codename": "change_courseregistrationcodeinvoiceitem", "name": "Can change course registration code invoice item", "content_type": 124}, "model": "auth.permission", "pk": 375}, {"fields": {"codename": "delete_courseregistrationcodeinvoiceitem", "name": "Can delete course registration code invoice item", "content_type": 124}, "model": "auth.permission", "pk": 376}, {"fields": {"codename": "add_invoicehistory", "name": "Can add invoice history", "content_type": 125}, "model": "auth.permission", "pk": 377}, {"fields": {"codename": "change_invoicehistory", "name": "Can change invoice history", "content_type": 125}, "model": "auth.permission", "pk": 378}, {"fields": {"codename": "delete_invoicehistory", "name": "Can delete invoice history", "content_type": 125}, "model": "auth.permission", "pk": 379}, {"fields": {"codename": "add_courseregistrationcode", "name": "Can add course registration code", "content_type": 126}, "model": "auth.permission", "pk": 380}, {"fields": {"codename": "change_courseregistrationcode", "name": "Can change course registration code", "content_type": 126}, "model": "auth.permission", "pk": 381}, {"fields": {"codename": "delete_courseregistrationcode", "name": "Can delete course registration code", "content_type": 126}, "model": "auth.permission", "pk": 382}, {"fields": {"codename": "add_registrationcoderedemption", "name": "Can add registration code redemption", "content_type": 127}, "model": "auth.permission", "pk": 383}, {"fields": {"codename": "change_registrationcoderedemption", "name": "Can change registration code redemption", "content_type": 127}, "model": "auth.permission", "pk": 384}, {"fields": {"codename": "delete_registrationcoderedemption", "name": "Can delete registration code redemption", "content_type": 127}, "model": "auth.permission", "pk": 385}, {"fields": {"codename": "add_coupon", "name": "Can add coupon", "content_type": 128}, "model": "auth.permission", "pk": 386}, {"fields": {"codename": "change_coupon", "name": "Can change coupon", "content_type": 128}, "model": "auth.permission", "pk": 387}, {"fields": {"codename": "delete_coupon", "name": "Can delete coupon", "content_type": 128}, "model": "auth.permission", "pk": 388}, {"fields": {"codename": "add_couponredemption", "name": "Can add coupon redemption", "content_type": 129}, "model": "auth.permission", "pk": 389}, {"fields": {"codename": "change_couponredemption", "name": "Can change coupon redemption", "content_type": 129}, "model": "auth.permission", "pk": 390}, {"fields": {"codename": "delete_couponredemption", "name": "Can delete coupon redemption", "content_type": 129}, "model": "auth.permission", "pk": 391}, {"fields": {"codename": "add_paidcourseregistration", "name": "Can add paid course registration", "content_type": 130}, "model": "auth.permission", "pk": 392}, {"fields": {"codename": "change_paidcourseregistration", "name": "Can change paid course registration", "content_type": 130}, "model": "auth.permission", "pk": 393}, {"fields": {"codename": "delete_paidcourseregistration", "name": "Can delete paid course registration", "content_type": 130}, "model": "auth.permission", "pk": 394}, {"fields": {"codename": "add_courseregcodeitem", "name": "Can add course reg code item", "content_type": 131}, "model": "auth.permission", "pk": 395}, {"fields": {"codename": "change_courseregcodeitem", "name": "Can change course reg code item", "content_type": 131}, "model": "auth.permission", "pk": 396}, {"fields": {"codename": "delete_courseregcodeitem", "name": "Can delete course reg code item", "content_type": 131}, "model": "auth.permission", "pk": 397}, {"fields": {"codename": "add_courseregcodeitemannotation", "name": "Can add course reg code item annotation", "content_type": 132}, "model": "auth.permission", "pk": 398}, {"fields": {"codename": "change_courseregcodeitemannotation", "name": "Can change course reg code item annotation", "content_type": 132}, "model": "auth.permission", "pk": 399}, {"fields": {"codename": "delete_courseregcodeitemannotation", "name": "Can delete course reg code item annotation", "content_type": 132}, "model": "auth.permission", "pk": 400}, {"fields": {"codename": "add_paidcourseregistrationannotation", "name": "Can add paid course registration annotation", "content_type": 133}, "model": "auth.permission", "pk": 401}, {"fields": {"codename": "change_paidcourseregistrationannotation", "name": "Can change paid course registration annotation", "content_type": 133}, "model": "auth.permission", "pk": 402}, {"fields": {"codename": "delete_paidcourseregistrationannotation", "name": "Can delete paid course registration annotation", "content_type": 133}, "model": "auth.permission", "pk": 403}, {"fields": {"codename": "add_certificateitem", "name": "Can add certificate item", "content_type": 134}, "model": "auth.permission", "pk": 404}, {"fields": {"codename": "change_certificateitem", "name": "Can change certificate item", "content_type": 134}, "model": "auth.permission", "pk": 405}, {"fields": {"codename": "delete_certificateitem", "name": "Can delete certificate item", "content_type": 134}, "model": "auth.permission", "pk": 406}, {"fields": {"codename": "add_donationconfiguration", "name": "Can add donation configuration", "content_type": 135}, "model": "auth.permission", "pk": 407}, {"fields": {"codename": "change_donationconfiguration", "name": "Can change donation configuration", "content_type": 135}, "model": "auth.permission", "pk": 408}, {"fields": {"codename": "delete_donationconfiguration", "name": "Can delete donation configuration", "content_type": 135}, "model": "auth.permission", "pk": 409}, {"fields": {"codename": "add_donation", "name": "Can add donation", "content_type": 136}, "model": "auth.permission", "pk": 410}, {"fields": {"codename": "change_donation", "name": "Can change donation", "content_type": 136}, "model": "auth.permission", "pk": 411}, {"fields": {"codename": "delete_donation", "name": "Can delete donation", "content_type": 136}, "model": "auth.permission", "pk": 412}, {"fields": {"codename": "add_coursemode", "name": "Can add course mode", "content_type": 137}, "model": "auth.permission", "pk": 413}, {"fields": {"codename": "change_coursemode", "name": "Can change course mode", "content_type": 137}, "model": "auth.permission", "pk": 414}, {"fields": {"codename": "delete_coursemode", "name": "Can delete course mode", "content_type": 137}, "model": "auth.permission", "pk": 415}, {"fields": {"codename": "add_coursemodesarchive", "name": "Can add course modes archive", "content_type": 138}, "model": "auth.permission", "pk": 416}, {"fields": {"codename": "change_coursemodesarchive", "name": "Can change course modes archive", "content_type": 138}, "model": "auth.permission", "pk": 417}, {"fields": {"codename": "delete_coursemodesarchive", "name": "Can delete course modes archive", "content_type": 138}, "model": "auth.permission", "pk": 418}, {"fields": {"codename": "add_coursemodeexpirationconfig", "name": "Can add course mode expiration config", "content_type": 139}, "model": "auth.permission", "pk": 419}, {"fields": {"codename": "change_coursemodeexpirationconfig", "name": "Can change course mode expiration config", "content_type": 139}, "model": "auth.permission", "pk": 420}, {"fields": {"codename": "delete_coursemodeexpirationconfig", "name": "Can delete course mode expiration config", "content_type": 139}, "model": "auth.permission", "pk": 421}, {"fields": {"codename": "add_softwaresecurephotoverification", "name": "Can add software secure photo verification", "content_type": 140}, "model": "auth.permission", "pk": 422}, {"fields": {"codename": "change_softwaresecurephotoverification", "name": "Can change software secure photo verification", "content_type": 140}, "model": "auth.permission", "pk": 423}, {"fields": {"codename": "delete_softwaresecurephotoverification", "name": "Can delete software secure photo verification", "content_type": 140}, "model": "auth.permission", "pk": 424}, {"fields": {"codename": "add_historicalverificationdeadline", "name": "Can add historical verification deadline", "content_type": 141}, "model": "auth.permission", "pk": 425}, {"fields": {"codename": "change_historicalverificationdeadline", "name": "Can change historical verification deadline", "content_type": 141}, "model": "auth.permission", "pk": 426}, {"fields": {"codename": "delete_historicalverificationdeadline", "name": "Can delete historical verification deadline", "content_type": 141}, "model": "auth.permission", "pk": 427}, {"fields": {"codename": "add_verificationdeadline", "name": "Can add verification deadline", "content_type": 142}, "model": "auth.permission", "pk": 428}, {"fields": {"codename": "change_verificationdeadline", "name": "Can change verification deadline", "content_type": 142}, "model": "auth.permission", "pk": 429}, {"fields": {"codename": "delete_verificationdeadline", "name": "Can delete verification deadline", "content_type": 142}, "model": "auth.permission", "pk": 430}, {"fields": {"codename": "add_verificationcheckpoint", "name": "Can add verification checkpoint", "content_type": 143}, "model": "auth.permission", "pk": 431}, {"fields": {"codename": "change_verificationcheckpoint", "name": "Can change verification checkpoint", "content_type": 143}, "model": "auth.permission", "pk": 432}, {"fields": {"codename": "delete_verificationcheckpoint", "name": "Can delete verification checkpoint", "content_type": 143}, "model": "auth.permission", "pk": 433}, {"fields": {"codename": "add_verificationstatus", "name": "Can add Verification Status", "content_type": 144}, "model": "auth.permission", "pk": 434}, {"fields": {"codename": "change_verificationstatus", "name": "Can change Verification Status", "content_type": 144}, "model": "auth.permission", "pk": 435}, {"fields": {"codename": "delete_verificationstatus", "name": "Can delete Verification Status", "content_type": 144}, "model": "auth.permission", "pk": 436}, {"fields": {"codename": "add_incoursereverificationconfiguration", "name": "Can add in course reverification configuration", "content_type": 145}, "model": "auth.permission", "pk": 437}, {"fields": {"codename": "change_incoursereverificationconfiguration", "name": "Can change in course reverification configuration", "content_type": 145}, "model": "auth.permission", "pk": 438}, {"fields": {"codename": "delete_incoursereverificationconfiguration", "name": "Can delete in course reverification configuration", "content_type": 145}, "model": "auth.permission", "pk": 439}, {"fields": {"codename": "add_icrvstatusemailsconfiguration", "name": "Can add icrv status emails configuration", "content_type": 146}, "model": "auth.permission", "pk": 440}, {"fields": {"codename": "change_icrvstatusemailsconfiguration", "name": "Can change icrv status emails configuration", "content_type": 146}, "model": "auth.permission", "pk": 441}, {"fields": {"codename": "delete_icrvstatusemailsconfiguration", "name": "Can delete icrv status emails configuration", "content_type": 146}, "model": "auth.permission", "pk": 442}, {"fields": {"codename": "add_skippedreverification", "name": "Can add skipped reverification", "content_type": 147}, "model": "auth.permission", "pk": 443}, {"fields": {"codename": "change_skippedreverification", "name": "Can change skipped reverification", "content_type": 147}, "model": "auth.permission", "pk": 444}, {"fields": {"codename": "delete_skippedreverification", "name": "Can delete skipped reverification", "content_type": 147}, "model": "auth.permission", "pk": 445}, {"fields": {"codename": "add_darklangconfig", "name": "Can add dark lang config", "content_type": 148}, "model": "auth.permission", "pk": 446}, {"fields": {"codename": "change_darklangconfig", "name": "Can change dark lang config", "content_type": 148}, "model": "auth.permission", "pk": 447}, {"fields": {"codename": "delete_darklangconfig", "name": "Can delete dark lang config", "content_type": 148}, "model": "auth.permission", "pk": 448}, {"fields": {"codename": "add_microsite", "name": "Can add microsite", "content_type": 149}, "model": "auth.permission", "pk": 449}, {"fields": {"codename": "change_microsite", "name": "Can change microsite", "content_type": 149}, "model": "auth.permission", "pk": 450}, {"fields": {"codename": "delete_microsite", "name": "Can delete microsite", "content_type": 149}, "model": "auth.permission", "pk": 451}, {"fields": {"codename": "add_micrositehistory", "name": "Can add microsite history", "content_type": 150}, "model": "auth.permission", "pk": 452}, {"fields": {"codename": "change_micrositehistory", "name": "Can change microsite history", "content_type": 150}, "model": "auth.permission", "pk": 453}, {"fields": {"codename": "delete_micrositehistory", "name": "Can delete microsite history", "content_type": 150}, "model": "auth.permission", "pk": 454}, {"fields": {"codename": "add_historicalmicrositeorganizationmapping", "name": "Can add historical microsite organization mapping", "content_type": 151}, "model": "auth.permission", "pk": 455}, {"fields": {"codename": "change_historicalmicrositeorganizationmapping", "name": "Can change historical microsite organization mapping", "content_type": 151}, "model": "auth.permission", "pk": 456}, {"fields": {"codename": "delete_historicalmicrositeorganizationmapping", "name": "Can delete historical microsite organization mapping", "content_type": 151}, "model": "auth.permission", "pk": 457}, {"fields": {"codename": "add_micrositeorganizationmapping", "name": "Can add microsite organization mapping", "content_type": 152}, "model": "auth.permission", "pk": 458}, {"fields": {"codename": "change_micrositeorganizationmapping", "name": "Can change microsite organization mapping", "content_type": 152}, "model": "auth.permission", "pk": 459}, {"fields": {"codename": "delete_micrositeorganizationmapping", "name": "Can delete microsite organization mapping", "content_type": 152}, "model": "auth.permission", "pk": 460}, {"fields": {"codename": "add_historicalmicrositetemplate", "name": "Can add historical microsite template", "content_type": 153}, "model": "auth.permission", "pk": 461}, {"fields": {"codename": "change_historicalmicrositetemplate", "name": "Can change historical microsite template", "content_type": 153}, "model": "auth.permission", "pk": 462}, {"fields": {"codename": "delete_historicalmicrositetemplate", "name": "Can delete historical microsite template", "content_type": 153}, "model": "auth.permission", "pk": 463}, {"fields": {"codename": "add_micrositetemplate", "name": "Can add microsite template", "content_type": 154}, "model": "auth.permission", "pk": 464}, {"fields": {"codename": "change_micrositetemplate", "name": "Can change microsite template", "content_type": 154}, "model": "auth.permission", "pk": 465}, {"fields": {"codename": "delete_micrositetemplate", "name": "Can delete microsite template", "content_type": 154}, "model": "auth.permission", "pk": 466}, {"fields": {"codename": "add_whitelistedrssurl", "name": "Can add whitelisted rss url", "content_type": 155}, "model": "auth.permission", "pk": 467}, {"fields": {"codename": "change_whitelistedrssurl", "name": "Can change whitelisted rss url", "content_type": 155}, "model": "auth.permission", "pk": 468}, {"fields": {"codename": "delete_whitelistedrssurl", "name": "Can delete whitelisted rss url", "content_type": 155}, "model": "auth.permission", "pk": 469}, {"fields": {"codename": "add_embargoedcourse", "name": "Can add embargoed course", "content_type": 156}, "model": "auth.permission", "pk": 470}, {"fields": {"codename": "change_embargoedcourse", "name": "Can change embargoed course", "content_type": 156}, "model": "auth.permission", "pk": 471}, {"fields": {"codename": "delete_embargoedcourse", "name": "Can delete embargoed course", "content_type": 156}, "model": "auth.permission", "pk": 472}, {"fields": {"codename": "add_embargoedstate", "name": "Can add embargoed state", "content_type": 157}, "model": "auth.permission", "pk": 473}, {"fields": {"codename": "change_embargoedstate", "name": "Can change embargoed state", "content_type": 157}, "model": "auth.permission", "pk": 474}, {"fields": {"codename": "delete_embargoedstate", "name": "Can delete embargoed state", "content_type": 157}, "model": "auth.permission", "pk": 475}, {"fields": {"codename": "add_restrictedcourse", "name": "Can add restricted course", "content_type": 158}, "model": "auth.permission", "pk": 476}, {"fields": {"codename": "change_restrictedcourse", "name": "Can change restricted course", "content_type": 158}, "model": "auth.permission", "pk": 477}, {"fields": {"codename": "delete_restrictedcourse", "name": "Can delete restricted course", "content_type": 158}, "model": "auth.permission", "pk": 478}, {"fields": {"codename": "add_country", "name": "Can add country", "content_type": 159}, "model": "auth.permission", "pk": 479}, {"fields": {"codename": "change_country", "name": "Can change country", "content_type": 159}, "model": "auth.permission", "pk": 480}, {"fields": {"codename": "delete_country", "name": "Can delete country", "content_type": 159}, "model": "auth.permission", "pk": 481}, {"fields": {"codename": "add_countryaccessrule", "name": "Can add country access rule", "content_type": 160}, "model": "auth.permission", "pk": 482}, {"fields": {"codename": "change_countryaccessrule", "name": "Can change country access rule", "content_type": 160}, "model": "auth.permission", "pk": 483}, {"fields": {"codename": "delete_countryaccessrule", "name": "Can delete country access rule", "content_type": 160}, "model": "auth.permission", "pk": 484}, {"fields": {"codename": "add_courseaccessrulehistory", "name": "Can add course access rule history", "content_type": 161}, "model": "auth.permission", "pk": 485}, {"fields": {"codename": "change_courseaccessrulehistory", "name": "Can change course access rule history", "content_type": 161}, "model": "auth.permission", "pk": 486}, {"fields": {"codename": "delete_courseaccessrulehistory", "name": "Can delete course access rule history", "content_type": 161}, "model": "auth.permission", "pk": 487}, {"fields": {"codename": "add_ipfilter", "name": "Can add ip filter", "content_type": 162}, "model": "auth.permission", "pk": 488}, {"fields": {"codename": "change_ipfilter", "name": "Can change ip filter", "content_type": 162}, "model": "auth.permission", "pk": 489}, {"fields": {"codename": "delete_ipfilter", "name": "Can delete ip filter", "content_type": 162}, "model": "auth.permission", "pk": 490}, {"fields": {"codename": "add_coursererunstate", "name": "Can add course rerun state", "content_type": 163}, "model": "auth.permission", "pk": 491}, {"fields": {"codename": "change_coursererunstate", "name": "Can change course rerun state", "content_type": 163}, "model": "auth.permission", "pk": 492}, {"fields": {"codename": "delete_coursererunstate", "name": "Can delete course rerun state", "content_type": 163}, "model": "auth.permission", "pk": 493}, {"fields": {"codename": "add_mobileapiconfig", "name": "Can add mobile api config", "content_type": 164}, "model": "auth.permission", "pk": 494}, {"fields": {"codename": "change_mobileapiconfig", "name": "Can change mobile api config", "content_type": 164}, "model": "auth.permission", "pk": 495}, {"fields": {"codename": "delete_mobileapiconfig", "name": "Can delete mobile api config", "content_type": 164}, "model": "auth.permission", "pk": 496}, {"fields": {"codename": "add_usersocialauth", "name": "Can add user social auth", "content_type": 165}, "model": "auth.permission", "pk": 497}, {"fields": {"codename": "change_usersocialauth", "name": "Can change user social auth", "content_type": 165}, "model": "auth.permission", "pk": 498}, {"fields": {"codename": "delete_usersocialauth", "name": "Can delete user social auth", "content_type": 165}, "model": "auth.permission", "pk": 499}, {"fields": {"codename": "add_nonce", "name": "Can add nonce", "content_type": 166}, "model": "auth.permission", "pk": 500}, {"fields": {"codename": "change_nonce", "name": "Can change nonce", "content_type": 166}, "model": "auth.permission", "pk": 501}, {"fields": {"codename": "delete_nonce", "name": "Can delete nonce", "content_type": 166}, "model": "auth.permission", "pk": 502}, {"fields": {"codename": "add_association", "name": "Can add association", "content_type": 167}, "model": "auth.permission", "pk": 503}, {"fields": {"codename": "change_association", "name": "Can change association", "content_type": 167}, "model": "auth.permission", "pk": 504}, {"fields": {"codename": "delete_association", "name": "Can delete association", "content_type": 167}, "model": "auth.permission", "pk": 505}, {"fields": {"codename": "add_code", "name": "Can add code", "content_type": 168}, "model": "auth.permission", "pk": 506}, {"fields": {"codename": "change_code", "name": "Can change code", "content_type": 168}, "model": "auth.permission", "pk": 507}, {"fields": {"codename": "delete_code", "name": "Can delete code", "content_type": 168}, "model": "auth.permission", "pk": 508}, {"fields": {"codename": "add_surveyform", "name": "Can add survey form", "content_type": 169}, "model": "auth.permission", "pk": 509}, {"fields": {"codename": "change_surveyform", "name": "Can change survey form", "content_type": 169}, "model": "auth.permission", "pk": 510}, {"fields": {"codename": "delete_surveyform", "name": "Can delete survey form", "content_type": 169}, "model": "auth.permission", "pk": 511}, {"fields": {"codename": "add_surveyanswer", "name": "Can add survey answer", "content_type": 170}, "model": "auth.permission", "pk": 512}, {"fields": {"codename": "change_surveyanswer", "name": "Can change survey answer", "content_type": 170}, "model": "auth.permission", "pk": 513}, {"fields": {"codename": "delete_surveyanswer", "name": "Can delete survey answer", "content_type": 170}, "model": "auth.permission", "pk": 514}, {"fields": {"codename": "add_xblockasidesconfig", "name": "Can add x block asides config", "content_type": 171}, "model": "auth.permission", "pk": 515}, {"fields": {"codename": "change_xblockasidesconfig", "name": "Can change x block asides config", "content_type": 171}, "model": "auth.permission", "pk": 516}, {"fields": {"codename": "delete_xblockasidesconfig", "name": "Can delete x block asides config", "content_type": 171}, "model": "auth.permission", "pk": 517}, {"fields": {"codename": "add_courseoverview", "name": "Can add course overview", "content_type": 172}, "model": "auth.permission", "pk": 518}, {"fields": {"codename": "change_courseoverview", "name": "Can change course overview", "content_type": 172}, "model": "auth.permission", "pk": 519}, {"fields": {"codename": "delete_courseoverview", "name": "Can delete course overview", "content_type": 172}, "model": "auth.permission", "pk": 520}, {"fields": {"codename": "add_courseoverviewtab", "name": "Can add course overview tab", "content_type": 173}, "model": "auth.permission", "pk": 521}, {"fields": {"codename": "change_courseoverviewtab", "name": "Can change course overview tab", "content_type": 173}, "model": "auth.permission", "pk": 522}, {"fields": {"codename": "delete_courseoverviewtab", "name": "Can delete course overview tab", "content_type": 173}, "model": "auth.permission", "pk": 523}, {"fields": {"codename": "add_courseoverviewimageset", "name": "Can add course overview image set", "content_type": 174}, "model": "auth.permission", "pk": 524}, {"fields": {"codename": "change_courseoverviewimageset", "name": "Can change course overview image set", "content_type": 174}, "model": "auth.permission", "pk": 525}, {"fields": {"codename": "delete_courseoverviewimageset", "name": "Can delete course overview image set", "content_type": 174}, "model": "auth.permission", "pk": 526}, {"fields": {"codename": "add_courseoverviewimageconfig", "name": "Can add course overview image config", "content_type": 175}, "model": "auth.permission", "pk": 527}, {"fields": {"codename": "change_courseoverviewimageconfig", "name": "Can change course overview image config", "content_type": 175}, "model": "auth.permission", "pk": 528}, {"fields": {"codename": "delete_courseoverviewimageconfig", "name": "Can delete course overview image config", "content_type": 175}, "model": "auth.permission", "pk": 529}, {"fields": {"codename": "add_coursestructure", "name": "Can add course structure", "content_type": 176}, "model": "auth.permission", "pk": 530}, {"fields": {"codename": "change_coursestructure", "name": "Can change course structure", "content_type": 176}, "model": "auth.permission", "pk": 531}, {"fields": {"codename": "delete_coursestructure", "name": "Can delete course structure", "content_type": 176}, "model": "auth.permission", "pk": 532}, {"fields": {"codename": "add_corsmodel", "name": "Can add cors model", "content_type": 177}, "model": "auth.permission", "pk": 533}, {"fields": {"codename": "change_corsmodel", "name": "Can change cors model", "content_type": 177}, "model": "auth.permission", "pk": 534}, {"fields": {"codename": "delete_corsmodel", "name": "Can delete cors model", "content_type": 177}, "model": "auth.permission", "pk": 535}, {"fields": {"codename": "add_xdomainproxyconfiguration", "name": "Can add x domain proxy configuration", "content_type": 178}, "model": "auth.permission", "pk": 536}, {"fields": {"codename": "change_xdomainproxyconfiguration", "name": "Can change x domain proxy configuration", "content_type": 178}, "model": "auth.permission", "pk": 537}, {"fields": {"codename": "delete_xdomainproxyconfiguration", "name": "Can delete x domain proxy configuration", "content_type": 178}, "model": "auth.permission", "pk": 538}, {"fields": {"codename": "add_creditprovider", "name": "Can add credit provider", "content_type": 179}, "model": "auth.permission", "pk": 539}, {"fields": {"codename": "change_creditprovider", "name": "Can change credit provider", "content_type": 179}, "model": "auth.permission", "pk": 540}, {"fields": {"codename": "delete_creditprovider", "name": "Can delete credit provider", "content_type": 179}, "model": "auth.permission", "pk": 541}, {"fields": {"codename": "add_creditcourse", "name": "Can add credit course", "content_type": 180}, "model": "auth.permission", "pk": 542}, {"fields": {"codename": "change_creditcourse", "name": "Can change credit course", "content_type": 180}, "model": "auth.permission", "pk": 543}, {"fields": {"codename": "delete_creditcourse", "name": "Can delete credit course", "content_type": 180}, "model": "auth.permission", "pk": 544}, {"fields": {"codename": "add_creditrequirement", "name": "Can add credit requirement", "content_type": 181}, "model": "auth.permission", "pk": 545}, {"fields": {"codename": "change_creditrequirement", "name": "Can change credit requirement", "content_type": 181}, "model": "auth.permission", "pk": 546}, {"fields": {"codename": "delete_creditrequirement", "name": "Can delete credit requirement", "content_type": 181}, "model": "auth.permission", "pk": 547}, {"fields": {"codename": "add_historicalcreditrequirementstatus", "name": "Can add historical credit requirement status", "content_type": 182}, "model": "auth.permission", "pk": 548}, {"fields": {"codename": "change_historicalcreditrequirementstatus", "name": "Can change historical credit requirement status", "content_type": 182}, "model": "auth.permission", "pk": 549}, {"fields": {"codename": "delete_historicalcreditrequirementstatus", "name": "Can delete historical credit requirement status", "content_type": 182}, "model": "auth.permission", "pk": 550}, {"fields": {"codename": "add_creditrequirementstatus", "name": "Can add credit requirement status", "content_type": 183}, "model": "auth.permission", "pk": 551}, {"fields": {"codename": "change_creditrequirementstatus", "name": "Can change credit requirement status", "content_type": 183}, "model": "auth.permission", "pk": 552}, {"fields": {"codename": "delete_creditrequirementstatus", "name": "Can delete credit requirement status", "content_type": 183}, "model": "auth.permission", "pk": 553}, {"fields": {"codename": "add_crediteligibility", "name": "Can add credit eligibility", "content_type": 184}, "model": "auth.permission", "pk": 554}, {"fields": {"codename": "change_crediteligibility", "name": "Can change credit eligibility", "content_type": 184}, "model": "auth.permission", "pk": 555}, {"fields": {"codename": "delete_crediteligibility", "name": "Can delete credit eligibility", "content_type": 184}, "model": "auth.permission", "pk": 556}, {"fields": {"codename": "add_historicalcreditrequest", "name": "Can add historical credit request", "content_type": 185}, "model": "auth.permission", "pk": 557}, {"fields": {"codename": "change_historicalcreditrequest", "name": "Can change historical credit request", "content_type": 185}, "model": "auth.permission", "pk": 558}, {"fields": {"codename": "delete_historicalcreditrequest", "name": "Can delete historical credit request", "content_type": 185}, "model": "auth.permission", "pk": 559}, {"fields": {"codename": "add_creditrequest", "name": "Can add credit request", "content_type": 186}, "model": "auth.permission", "pk": 560}, {"fields": {"codename": "change_creditrequest", "name": "Can change credit request", "content_type": 186}, "model": "auth.permission", "pk": 561}, {"fields": {"codename": "delete_creditrequest", "name": "Can delete credit request", "content_type": 186}, "model": "auth.permission", "pk": 562}, {"fields": {"codename": "add_courseteam", "name": "Can add course team", "content_type": 187}, "model": "auth.permission", "pk": 563}, {"fields": {"codename": "change_courseteam", "name": "Can change course team", "content_type": 187}, "model": "auth.permission", "pk": 564}, {"fields": {"codename": "delete_courseteam", "name": "Can delete course team", "content_type": 187}, "model": "auth.permission", "pk": 565}, {"fields": {"codename": "add_courseteammembership", "name": "Can add course team membership", "content_type": 188}, "model": "auth.permission", "pk": 566}, {"fields": {"codename": "change_courseteammembership", "name": "Can change course team membership", "content_type": 188}, "model": "auth.permission", "pk": 567}, {"fields": {"codename": "delete_courseteammembership", "name": "Can delete course team membership", "content_type": 188}, "model": "auth.permission", "pk": 568}, {"fields": {"codename": "add_xblockdisableconfig", "name": "Can add x block disable config", "content_type": 189}, "model": "auth.permission", "pk": 569}, {"fields": {"codename": "change_xblockdisableconfig", "name": "Can change x block disable config", "content_type": 189}, "model": "auth.permission", "pk": 570}, {"fields": {"codename": "delete_xblockdisableconfig", "name": "Can delete x block disable config", "content_type": 189}, "model": "auth.permission", "pk": 571}, {"fields": {"codename": "add_bookmark", "name": "Can add bookmark", "content_type": 190}, "model": "auth.permission", "pk": 572}, {"fields": {"codename": "change_bookmark", "name": "Can change bookmark", "content_type": 190}, "model": "auth.permission", "pk": 573}, {"fields": {"codename": "delete_bookmark", "name": "Can delete bookmark", "content_type": 190}, "model": "auth.permission", "pk": 574}, {"fields": {"codename": "add_xblockcache", "name": "Can add x block cache", "content_type": 191}, "model": "auth.permission", "pk": 575}, {"fields": {"codename": "change_xblockcache", "name": "Can change x block cache", "content_type": 191}, "model": "auth.permission", "pk": 576}, {"fields": {"codename": "delete_xblockcache", "name": "Can delete x block cache", "content_type": 191}, "model": "auth.permission", "pk": 577}, {"fields": {"codename": "add_programsapiconfig", "name": "Can add programs api config", "content_type": 192}, "model": "auth.permission", "pk": 578}, {"fields": {"codename": "change_programsapiconfig", "name": "Can change programs api config", "content_type": 192}, "model": "auth.permission", "pk": 579}, {"fields": {"codename": "delete_programsapiconfig", "name": "Can delete programs api config", "content_type": 192}, "model": "auth.permission", "pk": 580}, {"fields": {"codename": "add_selfpacedconfiguration", "name": "Can add self paced configuration", "content_type": 193}, "model": "auth.permission", "pk": 581}, {"fields": {"codename": "change_selfpacedconfiguration", "name": "Can change self paced configuration", "content_type": 193}, "model": "auth.permission", "pk": 582}, {"fields": {"codename": "delete_selfpacedconfiguration", "name": "Can delete self paced configuration", "content_type": 193}, "model": "auth.permission", "pk": 583}, {"fields": {"codename": "add_kvstore", "name": "Can add kv store", "content_type": 194}, "model": "auth.permission", "pk": 584}, {"fields": {"codename": "change_kvstore", "name": "Can change kv store", "content_type": 194}, "model": "auth.permission", "pk": 585}, {"fields": {"codename": "delete_kvstore", "name": "Can delete kv store", "content_type": 194}, "model": "auth.permission", "pk": 586}, {"fields": {"codename": "add_credentialsapiconfig", "name": "Can add credentials api config", "content_type": 195}, "model": "auth.permission", "pk": 587}, {"fields": {"codename": "change_credentialsapiconfig", "name": "Can change credentials api config", "content_type": 195}, "model": "auth.permission", "pk": 588}, {"fields": {"codename": "delete_credentialsapiconfig", "name": "Can delete credentials api config", "content_type": 195}, "model": "auth.permission", "pk": 589}, {"fields": {"codename": "add_answer", "name": "Can add answer", "content_type": 196}, "model": "auth.permission", "pk": 590}, {"fields": {"codename": "change_answer", "name": "Can change answer", "content_type": 196}, "model": "auth.permission", "pk": 591}, {"fields": {"codename": "delete_answer", "name": "Can delete answer", "content_type": 196}, "model": "auth.permission", "pk": 592}, {"fields": {"codename": "add_studentitem", "name": "Can add student item", "content_type": 197}, "model": "auth.permission", "pk": 593}, {"fields": {"codename": "change_studentitem", "name": "Can change student item", "content_type": 197}, "model": "auth.permission", "pk": 594}, {"fields": {"codename": "delete_studentitem", "name": "Can delete student item", "content_type": 197}, "model": "auth.permission", "pk": 595}, {"fields": {"codename": "add_submission", "name": "Can add submission", "content_type": 198}, "model": "auth.permission", "pk": 596}, {"fields": {"codename": "change_submission", "name": "Can change submission", "content_type": 198}, "model": "auth.permission", "pk": 597}, {"fields": {"codename": "delete_submission", "name": "Can delete submission", "content_type": 198}, "model": "auth.permission", "pk": 598}, {"fields": {"codename": "add_score", "name": "Can add score", "content_type": 199}, "model": "auth.permission", "pk": 599}, {"fields": {"codename": "change_score", "name": "Can change score", "content_type": 199}, "model": "auth.permission", "pk": 600}, {"fields": {"codename": "delete_score", "name": "Can delete score", "content_type": 199}, "model": "auth.permission", "pk": 601}, {"fields": {"codename": "add_scoresummary", "name": "Can add score summary", "content_type": 200}, "model": "auth.permission", "pk": 602}, {"fields": {"codename": "change_scoresummary", "name": "Can change score summary", "content_type": 200}, "model": "auth.permission", "pk": 603}, {"fields": {"codename": "delete_scoresummary", "name": "Can delete score summary", "content_type": 200}, "model": "auth.permission", "pk": 604}, {"fields": {"codename": "add_scoreannotation", "name": "Can add score annotation", "content_type": 201}, "model": "auth.permission", "pk": 605}, {"fields": {"codename": "change_scoreannotation", "name": "Can change score annotation", "content_type": 201}, "model": "auth.permission", "pk": 606}, {"fields": {"codename": "delete_scoreannotation", "name": "Can delete score annotation", "content_type": 201}, "model": "auth.permission", "pk": 607}, {"fields": {"codename": "add_rubric", "name": "Can add rubric", "content_type": 202}, "model": "auth.permission", "pk": 608}, {"fields": {"codename": "change_rubric", "name": "Can change rubric", "content_type": 202}, "model": "auth.permission", "pk": 609}, {"fields": {"codename": "delete_rubric", "name": "Can delete rubric", "content_type": 202}, "model": "auth.permission", "pk": 610}, {"fields": {"codename": "add_criterion", "name": "Can add criterion", "content_type": 203}, "model": "auth.permission", "pk": 611}, {"fields": {"codename": "change_criterion", "name": "Can change criterion", "content_type": 203}, "model": "auth.permission", "pk": 612}, {"fields": {"codename": "delete_criterion", "name": "Can delete criterion", "content_type": 203}, "model": "auth.permission", "pk": 613}, {"fields": {"codename": "add_criterionoption", "name": "Can add criterion option", "content_type": 204}, "model": "auth.permission", "pk": 614}, {"fields": {"codename": "change_criterionoption", "name": "Can change criterion option", "content_type": 204}, "model": "auth.permission", "pk": 615}, {"fields": {"codename": "delete_criterionoption", "name": "Can delete criterion option", "content_type": 204}, "model": "auth.permission", "pk": 616}, {"fields": {"codename": "add_assessment", "name": "Can add assessment", "content_type": 205}, "model": "auth.permission", "pk": 617}, {"fields": {"codename": "change_assessment", "name": "Can change assessment", "content_type": 205}, "model": "auth.permission", "pk": 618}, {"fields": {"codename": "delete_assessment", "name": "Can delete assessment", "content_type": 205}, "model": "auth.permission", "pk": 619}, {"fields": {"codename": "add_assessmentpart", "name": "Can add assessment part", "content_type": 206}, "model": "auth.permission", "pk": 620}, {"fields": {"codename": "change_assessmentpart", "name": "Can change assessment part", "content_type": 206}, "model": "auth.permission", "pk": 621}, {"fields": {"codename": "delete_assessmentpart", "name": "Can delete assessment part", "content_type": 206}, "model": "auth.permission", "pk": 622}, {"fields": {"codename": "add_assessmentfeedbackoption", "name": "Can add assessment feedback option", "content_type": 207}, "model": "auth.permission", "pk": 623}, {"fields": {"codename": "change_assessmentfeedbackoption", "name": "Can change assessment feedback option", "content_type": 207}, "model": "auth.permission", "pk": 624}, {"fields": {"codename": "delete_assessmentfeedbackoption", "name": "Can delete assessment feedback option", "content_type": 207}, "model": "auth.permission", "pk": 625}, {"fields": {"codename": "add_assessmentfeedback", "name": "Can add assessment feedback", "content_type": 208}, "model": "auth.permission", "pk": 626}, {"fields": {"codename": "change_assessmentfeedback", "name": "Can change assessment feedback", "content_type": 208}, "model": "auth.permission", "pk": 627}, {"fields": {"codename": "delete_assessmentfeedback", "name": "Can delete assessment feedback", "content_type": 208}, "model": "auth.permission", "pk": 628}, {"fields": {"codename": "add_peerworkflow", "name": "Can add peer workflow", "content_type": 209}, "model": "auth.permission", "pk": 629}, {"fields": {"codename": "change_peerworkflow", "name": "Can change peer workflow", "content_type": 209}, "model": "auth.permission", "pk": 630}, {"fields": {"codename": "delete_peerworkflow", "name": "Can delete peer workflow", "content_type": 209}, "model": "auth.permission", "pk": 631}, {"fields": {"codename": "add_peerworkflowitem", "name": "Can add peer workflow item", "content_type": 210}, "model": "auth.permission", "pk": 632}, {"fields": {"codename": "change_peerworkflowitem", "name": "Can change peer workflow item", "content_type": 210}, "model": "auth.permission", "pk": 633}, {"fields": {"codename": "delete_peerworkflowitem", "name": "Can delete peer workflow item", "content_type": 210}, "model": "auth.permission", "pk": 634}, {"fields": {"codename": "add_trainingexample", "name": "Can add training example", "content_type": 211}, "model": "auth.permission", "pk": 635}, {"fields": {"codename": "change_trainingexample", "name": "Can change training example", "content_type": 211}, "model": "auth.permission", "pk": 636}, {"fields": {"codename": "delete_trainingexample", "name": "Can delete training example", "content_type": 211}, "model": "auth.permission", "pk": 637}, {"fields": {"codename": "add_studenttrainingworkflow", "name": "Can add student training workflow", "content_type": 212}, "model": "auth.permission", "pk": 638}, {"fields": {"codename": "change_studenttrainingworkflow", "name": "Can change student training workflow", "content_type": 212}, "model": "auth.permission", "pk": 639}, {"fields": {"codename": "delete_studenttrainingworkflow", "name": "Can delete student training workflow", "content_type": 212}, "model": "auth.permission", "pk": 640}, {"fields": {"codename": "add_studenttrainingworkflowitem", "name": "Can add student training workflow item", "content_type": 213}, "model": "auth.permission", "pk": 641}, {"fields": {"codename": "change_studenttrainingworkflowitem", "name": "Can change student training workflow item", "content_type": 213}, "model": "auth.permission", "pk": 642}, {"fields": {"codename": "delete_studenttrainingworkflowitem", "name": "Can delete student training workflow item", "content_type": 213}, "model": "auth.permission", "pk": 643}, {"fields": {"codename": "add_aiclassifierset", "name": "Can add ai classifier set", "content_type": 214}, "model": "auth.permission", "pk": 644}, {"fields": {"codename": "change_aiclassifierset", "name": "Can change ai classifier set", "content_type": 214}, "model": "auth.permission", "pk": 645}, {"fields": {"codename": "delete_aiclassifierset", "name": "Can delete ai classifier set", "content_type": 214}, "model": "auth.permission", "pk": 646}, {"fields": {"codename": "add_aiclassifier", "name": "Can add ai classifier", "content_type": 215}, "model": "auth.permission", "pk": 647}, {"fields": {"codename": "change_aiclassifier", "name": "Can change ai classifier", "content_type": 215}, "model": "auth.permission", "pk": 648}, {"fields": {"codename": "delete_aiclassifier", "name": "Can delete ai classifier", "content_type": 215}, "model": "auth.permission", "pk": 649}, {"fields": {"codename": "add_aitrainingworkflow", "name": "Can add ai training workflow", "content_type": 216}, "model": "auth.permission", "pk": 650}, {"fields": {"codename": "change_aitrainingworkflow", "name": "Can change ai training workflow", "content_type": 216}, "model": "auth.permission", "pk": 651}, {"fields": {"codename": "delete_aitrainingworkflow", "name": "Can delete ai training workflow", "content_type": 216}, "model": "auth.permission", "pk": 652}, {"fields": {"codename": "add_aigradingworkflow", "name": "Can add ai grading workflow", "content_type": 217}, "model": "auth.permission", "pk": 653}, {"fields": {"codename": "change_aigradingworkflow", "name": "Can change ai grading workflow", "content_type": 217}, "model": "auth.permission", "pk": 654}, {"fields": {"codename": "delete_aigradingworkflow", "name": "Can delete ai grading workflow", "content_type": 217}, "model": "auth.permission", "pk": 655}, {"fields": {"codename": "add_staffworkflow", "name": "Can add staff workflow", "content_type": 218}, "model": "auth.permission", "pk": 656}, {"fields": {"codename": "change_staffworkflow", "name": "Can change staff workflow", "content_type": 218}, "model": "auth.permission", "pk": 657}, {"fields": {"codename": "delete_staffworkflow", "name": "Can delete staff workflow", "content_type": 218}, "model": "auth.permission", "pk": 658}, {"fields": {"codename": "add_assessmentworkflow", "name": "Can add assessment workflow", "content_type": 219}, "model": "auth.permission", "pk": 659}, {"fields": {"codename": "change_assessmentworkflow", "name": "Can change assessment workflow", "content_type": 219}, "model": "auth.permission", "pk": 660}, {"fields": {"codename": "delete_assessmentworkflow", "name": "Can delete assessment workflow", "content_type": 219}, "model": "auth.permission", "pk": 661}, {"fields": {"codename": "add_assessmentworkflowstep", "name": "Can add assessment workflow step", "content_type": 220}, "model": "auth.permission", "pk": 662}, {"fields": {"codename": "change_assessmentworkflowstep", "name": "Can change assessment workflow step", "content_type": 220}, "model": "auth.permission", "pk": 663}, {"fields": {"codename": "delete_assessmentworkflowstep", "name": "Can delete assessment workflow step", "content_type": 220}, "model": "auth.permission", "pk": 664}, {"fields": {"codename": "add_assessmentworkflowcancellation", "name": "Can add assessment workflow cancellation", "content_type": 221}, "model": "auth.permission", "pk": 665}, {"fields": {"codename": "change_assessmentworkflowcancellation", "name": "Can change assessment workflow cancellation", "content_type": 221}, "model": "auth.permission", "pk": 666}, {"fields": {"codename": "delete_assessmentworkflowcancellation", "name": "Can delete assessment workflow cancellation", "content_type": 221}, "model": "auth.permission", "pk": 667}, {"fields": {"codename": "add_profile", "name": "Can add profile", "content_type": 222}, "model": "auth.permission", "pk": 668}, {"fields": {"codename": "change_profile", "name": "Can change profile", "content_type": 222}, "model": "auth.permission", "pk": 669}, {"fields": {"codename": "delete_profile", "name": "Can delete profile", "content_type": 222}, "model": "auth.permission", "pk": 670}, {"fields": {"codename": "add_video", "name": "Can add video", "content_type": 223}, "model": "auth.permission", "pk": 671}, {"fields": {"codename": "change_video", "name": "Can change video", "content_type": 223}, "model": "auth.permission", "pk": 672}, {"fields": {"codename": "delete_video", "name": "Can delete video", "content_type": 223}, "model": "auth.permission", "pk": 673}, {"fields": {"codename": "add_coursevideo", "name": "Can add course video", "content_type": 224}, "model": "auth.permission", "pk": 674}, {"fields": {"codename": "change_coursevideo", "name": "Can change course video", "content_type": 224}, "model": "auth.permission", "pk": 675}, {"fields": {"codename": "delete_coursevideo", "name": "Can delete course video", "content_type": 224}, "model": "auth.permission", "pk": 676}, {"fields": {"codename": "add_encodedvideo", "name": "Can add encoded video", "content_type": 225}, "model": "auth.permission", "pk": 677}, {"fields": {"codename": "change_encodedvideo", "name": "Can change encoded video", "content_type": 225}, "model": "auth.permission", "pk": 678}, {"fields": {"codename": "delete_encodedvideo", "name": "Can delete encoded video", "content_type": 225}, "model": "auth.permission", "pk": 679}, {"fields": {"codename": "add_subtitle", "name": "Can add subtitle", "content_type": 226}, "model": "auth.permission", "pk": 680}, {"fields": {"codename": "change_subtitle", "name": "Can change subtitle", "content_type": 226}, "model": "auth.permission", "pk": 681}, {"fields": {"codename": "delete_subtitle", "name": "Can delete subtitle", "content_type": 226}, "model": "auth.permission", "pk": 682}, {"fields": {"codename": "add_milestone", "name": "Can add milestone", "content_type": 227}, "model": "auth.permission", "pk": 683}, {"fields": {"codename": "change_milestone", "name": "Can change milestone", "content_type": 227}, "model": "auth.permission", "pk": 684}, {"fields": {"codename": "delete_milestone", "name": "Can delete milestone", "content_type": 227}, "model": "auth.permission", "pk": 685}, {"fields": {"codename": "add_milestonerelationshiptype", "name": "Can add milestone relationship type", "content_type": 228}, "model": "auth.permission", "pk": 686}, {"fields": {"codename": "change_milestonerelationshiptype", "name": "Can change milestone relationship type", "content_type": 228}, "model": "auth.permission", "pk": 687}, {"fields": {"codename": "delete_milestonerelationshiptype", "name": "Can delete milestone relationship type", "content_type": 228}, "model": "auth.permission", "pk": 688}, {"fields": {"codename": "add_coursemilestone", "name": "Can add course milestone", "content_type": 229}, "model": "auth.permission", "pk": 689}, {"fields": {"codename": "change_coursemilestone", "name": "Can change course milestone", "content_type": 229}, "model": "auth.permission", "pk": 690}, {"fields": {"codename": "delete_coursemilestone", "name": "Can delete course milestone", "content_type": 229}, "model": "auth.permission", "pk": 691}, {"fields": {"codename": "add_coursecontentmilestone", "name": "Can add course content milestone", "content_type": 230}, "model": "auth.permission", "pk": 692}, {"fields": {"codename": "change_coursecontentmilestone", "name": "Can change course content milestone", "content_type": 230}, "model": "auth.permission", "pk": 693}, {"fields": {"codename": "delete_coursecontentmilestone", "name": "Can delete course content milestone", "content_type": 230}, "model": "auth.permission", "pk": 694}, {"fields": {"codename": "add_usermilestone", "name": "Can add user milestone", "content_type": 231}, "model": "auth.permission", "pk": 695}, {"fields": {"codename": "change_usermilestone", "name": "Can change user milestone", "content_type": 231}, "model": "auth.permission", "pk": 696}, {"fields": {"codename": "delete_usermilestone", "name": "Can delete user milestone", "content_type": 231}, "model": "auth.permission", "pk": 697}, {"fields": {"codename": "add_proctoredexam", "name": "Can add proctored exam", "content_type": 232}, "model": "auth.permission", "pk": 698}, {"fields": {"codename": "change_proctoredexam", "name": "Can change proctored exam", "content_type": 232}, "model": "auth.permission", "pk": 699}, {"fields": {"codename": "delete_proctoredexam", "name": "Can delete proctored exam", "content_type": 232}, "model": "auth.permission", "pk": 700}, {"fields": {"codename": "add_proctoredexamreviewpolicy", "name": "Can add Proctored exam review policy", "content_type": 233}, "model": "auth.permission", "pk": 701}, {"fields": {"codename": "change_proctoredexamreviewpolicy", "name": "Can change Proctored exam review policy", "content_type": 233}, "model": "auth.permission", "pk": 702}, {"fields": {"codename": "delete_proctoredexamreviewpolicy", "name": "Can delete Proctored exam review policy", "content_type": 233}, "model": "auth.permission", "pk": 703}, {"fields": {"codename": "add_proctoredexamreviewpolicyhistory", "name": "Can add proctored exam review policy history", "content_type": 234}, "model": "auth.permission", "pk": 704}, {"fields": {"codename": "change_proctoredexamreviewpolicyhistory", "name": "Can change proctored exam review policy history", "content_type": 234}, "model": "auth.permission", "pk": 705}, {"fields": {"codename": "delete_proctoredexamreviewpolicyhistory", "name": "Can delete proctored exam review policy history", "content_type": 234}, "model": "auth.permission", "pk": 706}, {"fields": {"codename": "add_proctoredexamstudentattempt", "name": "Can add proctored exam attempt", "content_type": 235}, "model": "auth.permission", "pk": 707}, {"fields": {"codename": "change_proctoredexamstudentattempt", "name": "Can change proctored exam attempt", "content_type": 235}, "model": "auth.permission", "pk": 708}, {"fields": {"codename": "delete_proctoredexamstudentattempt", "name": "Can delete proctored exam attempt", "content_type": 235}, "model": "auth.permission", "pk": 709}, {"fields": {"codename": "add_proctoredexamstudentattempthistory", "name": "Can add proctored exam attempt history", "content_type": 236}, "model": "auth.permission", "pk": 710}, {"fields": {"codename": "change_proctoredexamstudentattempthistory", "name": "Can change proctored exam attempt history", "content_type": 236}, "model": "auth.permission", "pk": 711}, {"fields": {"codename": "delete_proctoredexamstudentattempthistory", "name": "Can delete proctored exam attempt history", "content_type": 236}, "model": "auth.permission", "pk": 712}, {"fields": {"codename": "add_proctoredexamstudentallowance", "name": "Can add proctored allowance", "content_type": 237}, "model": "auth.permission", "pk": 713}, {"fields": {"codename": "change_proctoredexamstudentallowance", "name": "Can change proctored allowance", "content_type": 237}, "model": "auth.permission", "pk": 714}, {"fields": {"codename": "delete_proctoredexamstudentallowance", "name": "Can delete proctored allowance", "content_type": 237}, "model": "auth.permission", "pk": 715}, {"fields": {"codename": "add_proctoredexamstudentallowancehistory", "name": "Can add proctored allowance history", "content_type": 238}, "model": "auth.permission", "pk": 716}, {"fields": {"codename": "change_proctoredexamstudentallowancehistory", "name": "Can change proctored allowance history", "content_type": 238}, "model": "auth.permission", "pk": 717}, {"fields": {"codename": "delete_proctoredexamstudentallowancehistory", "name": "Can delete proctored allowance history", "content_type": 238}, "model": "auth.permission", "pk": 718}, {"fields": {"codename": "add_proctoredexamsoftwaresecurereview", "name": "Can add Proctored exam software secure review", "content_type": 239}, "model": "auth.permission", "pk": 719}, {"fields": {"codename": "change_proctoredexamsoftwaresecurereview", "name": "Can change Proctored exam software secure review", "content_type": 239}, "model": "auth.permission", "pk": 720}, {"fields": {"codename": "delete_proctoredexamsoftwaresecurereview", "name": "Can delete Proctored exam software secure review", "content_type": 239}, "model": "auth.permission", "pk": 721}, {"fields": {"codename": "add_proctoredexamsoftwaresecurereviewhistory", "name": "Can add Proctored exam review archive", "content_type": 240}, "model": "auth.permission", "pk": 722}, {"fields": {"codename": "change_proctoredexamsoftwaresecurereviewhistory", "name": "Can change Proctored exam review archive", "content_type": 240}, "model": "auth.permission", "pk": 723}, {"fields": {"codename": "delete_proctoredexamsoftwaresecurereviewhistory", "name": "Can delete Proctored exam review archive", "content_type": 240}, "model": "auth.permission", "pk": 724}, {"fields": {"codename": "add_proctoredexamsoftwaresecurecomment", "name": "Can add proctored exam software secure comment", "content_type": 241}, "model": "auth.permission", "pk": 725}, {"fields": {"codename": "change_proctoredexamsoftwaresecurecomment", "name": "Can change proctored exam software secure comment", "content_type": 241}, "model": "auth.permission", "pk": 726}, {"fields": {"codename": "delete_proctoredexamsoftwaresecurecomment", "name": "Can delete proctored exam software secure comment", "content_type": 241}, "model": "auth.permission", "pk": 727}, {"fields": {"codename": "add_organization", "name": "Can add organization", "content_type": 242}, "model": "auth.permission", "pk": 728}, {"fields": {"codename": "change_organization", "name": "Can change organization", "content_type": 242}, "model": "auth.permission", "pk": 729}, {"fields": {"codename": "delete_organization", "name": "Can delete organization", "content_type": 242}, "model": "auth.permission", "pk": 730}, {"fields": {"codename": "add_organizationcourse", "name": "Can add Link Course", "content_type": 243}, "model": "auth.permission", "pk": 731}, {"fields": {"codename": "change_organizationcourse", "name": "Can change Link Course", "content_type": 243}, "model": "auth.permission", "pk": 732}, {"fields": {"codename": "delete_organizationcourse", "name": "Can delete Link Course", "content_type": 243}, "model": "auth.permission", "pk": 733}, {"fields": {"codename": "add_videouploadconfig", "name": "Can add video upload config", "content_type": 244}, "model": "auth.permission", "pk": 734}, {"fields": {"codename": "change_videouploadconfig", "name": "Can change video upload config", "content_type": 244}, "model": "auth.permission", "pk": 735}, {"fields": {"codename": "delete_videouploadconfig", "name": "Can delete video upload config", "content_type": 244}, "model": "auth.permission", "pk": 736}, {"fields": {"codename": "add_pushnotificationconfig", "name": "Can add push notification config", "content_type": 245}, "model": "auth.permission", "pk": 737}, {"fields": {"codename": "change_pushnotificationconfig", "name": "Can change push notification config", "content_type": 245}, "model": "auth.permission", "pk": 738}, {"fields": {"codename": "delete_pushnotificationconfig", "name": "Can delete push notification config", "content_type": 245}, "model": "auth.permission", "pk": 739}, {"fields": {"codename": "add_coursecreator", "name": "Can add course creator", "content_type": 246}, "model": "auth.permission", "pk": 740}, {"fields": {"codename": "change_coursecreator", "name": "Can change course creator", "content_type": 246}, "model": "auth.permission", "pk": 741}, {"fields": {"codename": "delete_coursecreator", "name": "Can delete course creator", "content_type": 246}, "model": "auth.permission", "pk": 742}, {"fields": {"codename": "add_studioconfig", "name": "Can add studio config", "content_type": 247}, "model": "auth.permission", "pk": 743}, {"fields": {"codename": "change_studioconfig", "name": "Can change studio config", "content_type": 247}, "model": "auth.permission", "pk": 744}, {"fields": {"codename": "delete_studioconfig", "name": "Can delete studio config", "content_type": 247}, "model": "auth.permission", "pk": 745}, {"fields": {"username": "ecommerce_worker", "first_name": "", "last_name": "", "is_active": true, "is_superuser": false, "is_staff": false, "last_login": null, "groups": [], "user_permissions": [], "password": "!Bz0IiD8f4rtGAXbkt0fXqWWITFuRNaZZzqYQnUI0", "email": "ecommerce_worker@fake.email", "date_joined": "2016-01-22T20:04:10.525Z"}, "model": "auth.user", "pk": 1}, {"fields": {"username": "credentials_service_user", "first_name": "", "last_name": "", "is_active": true, "is_superuser": false, "is_staff": true, "last_login": null, "groups": [], "user_permissions": [], "password": "!U0fWlB5kZ85Dzw37oIwkHTsSCJkJ0bvMijQM4Vyg", "email": "", "date_joined": "2016-01-22T20:04:17.478Z"}, "model": "auth.user", "pk": 2}, {"fields": {"change_date": "2016-01-22T20:05:45.554Z", "changed_by": null, "enabled": true}, "model": "util.ratelimitconfiguration", "pk": 1}, {"fields": {"change_date": "2016-01-22T20:04:09.858Z", "changed_by": null, "configuration": "{\"default\": {\"accomplishment_class_append\": \"accomplishment-certificate\", \"platform_name\": \"Your Platform Name Here\", \"logo_src\": \"/static/certificates/images/logo.png\", \"logo_url\": \"http://www.example.com\", \"company_verified_certificate_url\": \"http://www.example.com/verified-certificate\", \"company_privacy_url\": \"http://www.example.com/privacy-policy\", \"company_tos_url\": \"http://www.example.com/terms-service\", \"company_about_url\": \"http://www.example.com/about-us\"}, \"verified\": {\"certificate_type\": \"Verified\", \"certificate_title\": \"Verified Certificate of Achievement\"}, \"honor\": {\"certificate_type\": \"Honor Code\", \"certificate_title\": \"Certificate of Achievement\"}}", "enabled": false}, "model": "certificates.certificatehtmlviewconfiguration", "pk": 1}, {"fields": {"change_date": "2016-01-22T20:04:19.877Z", "changed_by": null, "enabled": true, "released_languages": ""}, "model": "dark_lang.darklangconfig", "pk": 1}] \ No newline at end of file diff --git a/common/test/db_cache/bok_choy_data_default.json b/common/test/db_cache/bok_choy_data_default.json new file mode 100644 index 0000000000..aebe847da7 --- /dev/null +++ b/common/test/db_cache/bok_choy_data_default.json @@ -0,0 +1 @@ +[{"fields": {"model": "permission", "app_label": "auth"}, "model": "contenttypes.contenttype", "pk": 1}, {"fields": {"model": "group", "app_label": "auth"}, "model": "contenttypes.contenttype", "pk": 2}, {"fields": {"model": "user", "app_label": "auth"}, "model": "contenttypes.contenttype", "pk": 3}, {"fields": {"model": "contenttype", "app_label": "contenttypes"}, "model": "contenttypes.contenttype", "pk": 4}, {"fields": {"model": "session", "app_label": "sessions"}, "model": "contenttypes.contenttype", "pk": 5}, {"fields": {"model": "site", "app_label": "sites"}, "model": "contenttypes.contenttype", "pk": 6}, {"fields": {"model": "taskmeta", "app_label": "djcelery"}, "model": "contenttypes.contenttype", "pk": 7}, {"fields": {"model": "tasksetmeta", "app_label": "djcelery"}, "model": "contenttypes.contenttype", "pk": 8}, {"fields": {"model": "intervalschedule", "app_label": "djcelery"}, "model": "contenttypes.contenttype", "pk": 9}, {"fields": {"model": "crontabschedule", "app_label": "djcelery"}, "model": "contenttypes.contenttype", "pk": 10}, {"fields": {"model": "periodictasks", "app_label": "djcelery"}, "model": "contenttypes.contenttype", "pk": 11}, {"fields": {"model": "periodictask", "app_label": "djcelery"}, "model": "contenttypes.contenttype", "pk": 12}, {"fields": {"model": "workerstate", "app_label": "djcelery"}, "model": "contenttypes.contenttype", "pk": 13}, {"fields": {"model": "taskstate", "app_label": "djcelery"}, "model": "contenttypes.contenttype", "pk": 14}, {"fields": {"model": "globalstatusmessage", "app_label": "status"}, "model": "contenttypes.contenttype", "pk": 15}, {"fields": {"model": "coursemessage", "app_label": "status"}, "model": "contenttypes.contenttype", "pk": 16}, {"fields": {"model": "assetbaseurlconfig", "app_label": "static_replace"}, "model": "contenttypes.contenttype", "pk": 17}, {"fields": {"model": "assetexcludedextensionsconfig", "app_label": "static_replace"}, "model": "contenttypes.contenttype", "pk": 18}, {"fields": {"model": "courseassetcachettlconfig", "app_label": "contentserver"}, "model": "contenttypes.contenttype", "pk": 19}, {"fields": {"model": "studentmodule", "app_label": "courseware"}, "model": "contenttypes.contenttype", "pk": 20}, {"fields": {"model": "studentmodulehistory", "app_label": "courseware"}, "model": "contenttypes.contenttype", "pk": 21}, {"fields": {"model": "xmoduleuserstatesummaryfield", "app_label": "courseware"}, "model": "contenttypes.contenttype", "pk": 22}, {"fields": {"model": "xmodulestudentprefsfield", "app_label": "courseware"}, "model": "contenttypes.contenttype", "pk": 23}, {"fields": {"model": "xmodulestudentinfofield", "app_label": "courseware"}, "model": "contenttypes.contenttype", "pk": 24}, {"fields": {"model": "offlinecomputedgrade", "app_label": "courseware"}, "model": "contenttypes.contenttype", "pk": 25}, {"fields": {"model": "offlinecomputedgradelog", "app_label": "courseware"}, "model": "contenttypes.contenttype", "pk": 26}, {"fields": {"model": "studentfieldoverride", "app_label": "courseware"}, "model": "contenttypes.contenttype", "pk": 27}, {"fields": {"model": "anonymoususerid", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 28}, {"fields": {"model": "userstanding", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 29}, {"fields": {"model": "userprofile", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 30}, {"fields": {"model": "usersignupsource", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 31}, {"fields": {"model": "usertestgroup", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 32}, {"fields": {"model": "registration", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 33}, {"fields": {"model": "pendingnamechange", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 34}, {"fields": {"model": "pendingemailchange", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 35}, {"fields": {"model": "passwordhistory", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 36}, {"fields": {"model": "loginfailures", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 37}, {"fields": {"model": "historicalcourseenrollment", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 38}, {"fields": {"model": "courseenrollment", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 39}, {"fields": {"model": "manualenrollmentaudit", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 40}, {"fields": {"model": "courseenrollmentallowed", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 41}, {"fields": {"model": "courseaccessrole", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 42}, {"fields": {"model": "dashboardconfiguration", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 43}, {"fields": {"model": "linkedinaddtoprofileconfiguration", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 44}, {"fields": {"model": "entranceexamconfiguration", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 45}, {"fields": {"model": "languageproficiency", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 46}, {"fields": {"model": "courseenrollmentattribute", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 47}, {"fields": {"model": "enrollmentrefundconfiguration", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 48}, {"fields": {"model": "trackinglog", "app_label": "track"}, "model": "contenttypes.contenttype", "pk": 49}, {"fields": {"model": "ratelimitconfiguration", "app_label": "util"}, "model": "contenttypes.contenttype", "pk": 50}, {"fields": {"model": "certificatewhitelist", "app_label": "certificates"}, "model": "contenttypes.contenttype", "pk": 51}, {"fields": {"model": "generatedcertificate", "app_label": "certificates"}, "model": "contenttypes.contenttype", "pk": 52}, {"fields": {"model": "certificategenerationhistory", "app_label": "certificates"}, "model": "contenttypes.contenttype", "pk": 53}, {"fields": {"model": "certificateinvalidation", "app_label": "certificates"}, "model": "contenttypes.contenttype", "pk": 54}, {"fields": {"model": "examplecertificateset", "app_label": "certificates"}, "model": "contenttypes.contenttype", "pk": 55}, {"fields": {"model": "examplecertificate", "app_label": "certificates"}, "model": "contenttypes.contenttype", "pk": 56}, {"fields": {"model": "certificategenerationcoursesetting", "app_label": "certificates"}, "model": "contenttypes.contenttype", "pk": 57}, {"fields": {"model": "certificategenerationconfiguration", "app_label": "certificates"}, "model": "contenttypes.contenttype", "pk": 58}, {"fields": {"model": "certificatehtmlviewconfiguration", "app_label": "certificates"}, "model": "contenttypes.contenttype", "pk": 59}, {"fields": {"model": "badgeassertion", "app_label": "certificates"}, "model": "contenttypes.contenttype", "pk": 60}, {"fields": {"model": "badgeimageconfiguration", "app_label": "certificates"}, "model": "contenttypes.contenttype", "pk": 61}, {"fields": {"model": "certificatetemplate", "app_label": "certificates"}, "model": "contenttypes.contenttype", "pk": 62}, {"fields": {"model": "certificatetemplateasset", "app_label": "certificates"}, "model": "contenttypes.contenttype", "pk": 63}, {"fields": {"model": "instructortask", "app_label": "instructor_task"}, "model": "contenttypes.contenttype", "pk": 64}, {"fields": {"model": "courseusergroup", "app_label": "course_groups"}, "model": "contenttypes.contenttype", "pk": 65}, {"fields": {"model": "cohortmembership", "app_label": "course_groups"}, "model": "contenttypes.contenttype", "pk": 66}, {"fields": {"model": "courseusergrouppartitiongroup", "app_label": "course_groups"}, "model": "contenttypes.contenttype", "pk": 67}, {"fields": {"model": "coursecohortssettings", "app_label": "course_groups"}, "model": "contenttypes.contenttype", "pk": 68}, {"fields": {"model": "coursecohort", "app_label": "course_groups"}, "model": "contenttypes.contenttype", "pk": 69}, {"fields": {"model": "courseemail", "app_label": "bulk_email"}, "model": "contenttypes.contenttype", "pk": 70}, {"fields": {"model": "optout", "app_label": "bulk_email"}, "model": "contenttypes.contenttype", "pk": 71}, {"fields": {"model": "courseemailtemplate", "app_label": "bulk_email"}, "model": "contenttypes.contenttype", "pk": 72}, {"fields": {"model": "courseauthorization", "app_label": "bulk_email"}, "model": "contenttypes.contenttype", "pk": 73}, {"fields": {"model": "brandinginfoconfig", "app_label": "branding"}, "model": "contenttypes.contenttype", "pk": 74}, {"fields": {"model": "brandingapiconfig", "app_label": "branding"}, "model": "contenttypes.contenttype", "pk": 75}, {"fields": {"model": "externalauthmap", "app_label": "external_auth"}, "model": "contenttypes.contenttype", "pk": 76}, {"fields": {"model": "nonce", "app_label": "django_openid_auth"}, "model": "contenttypes.contenttype", "pk": 77}, {"fields": {"model": "association", "app_label": "django_openid_auth"}, "model": "contenttypes.contenttype", "pk": 78}, {"fields": {"model": "useropenid", "app_label": "django_openid_auth"}, "model": "contenttypes.contenttype", "pk": 79}, {"fields": {"model": "client", "app_label": "oauth2"}, "model": "contenttypes.contenttype", "pk": 80}, {"fields": {"model": "grant", "app_label": "oauth2"}, "model": "contenttypes.contenttype", "pk": 81}, {"fields": {"model": "accesstoken", "app_label": "oauth2"}, "model": "contenttypes.contenttype", "pk": 82}, {"fields": {"model": "refreshtoken", "app_label": "oauth2"}, "model": "contenttypes.contenttype", "pk": 83}, {"fields": {"model": "trustedclient", "app_label": "oauth2_provider"}, "model": "contenttypes.contenttype", "pk": 84}, {"fields": {"model": "oauth2providerconfig", "app_label": "third_party_auth"}, "model": "contenttypes.contenttype", "pk": 85}, {"fields": {"model": "samlproviderconfig", "app_label": "third_party_auth"}, "model": "contenttypes.contenttype", "pk": 86}, {"fields": {"model": "samlconfiguration", "app_label": "third_party_auth"}, "model": "contenttypes.contenttype", "pk": 87}, {"fields": {"model": "samlproviderdata", "app_label": "third_party_auth"}, "model": "contenttypes.contenttype", "pk": 88}, {"fields": {"model": "ltiproviderconfig", "app_label": "third_party_auth"}, "model": "contenttypes.contenttype", "pk": 89}, {"fields": {"model": "providerapipermissions", "app_label": "third_party_auth"}, "model": "contenttypes.contenttype", "pk": 90}, {"fields": {"model": "nonce", "app_label": "oauth_provider"}, "model": "contenttypes.contenttype", "pk": 91}, {"fields": {"model": "scope", "app_label": "oauth_provider"}, "model": "contenttypes.contenttype", "pk": 92}, {"fields": {"model": "consumer", "app_label": "oauth_provider"}, "model": "contenttypes.contenttype", "pk": 93}, {"fields": {"model": "token", "app_label": "oauth_provider"}, "model": "contenttypes.contenttype", "pk": 94}, {"fields": {"model": "resource", "app_label": "oauth_provider"}, "model": "contenttypes.contenttype", "pk": 95}, {"fields": {"model": "article", "app_label": "wiki"}, "model": "contenttypes.contenttype", "pk": 96}, {"fields": {"model": "articleforobject", "app_label": "wiki"}, "model": "contenttypes.contenttype", "pk": 97}, {"fields": {"model": "articlerevision", "app_label": "wiki"}, "model": "contenttypes.contenttype", "pk": 98}, {"fields": {"model": "urlpath", "app_label": "wiki"}, "model": "contenttypes.contenttype", "pk": 99}, {"fields": {"model": "articleplugin", "app_label": "wiki"}, "model": "contenttypes.contenttype", "pk": 100}, {"fields": {"model": "reusableplugin", "app_label": "wiki"}, "model": "contenttypes.contenttype", "pk": 101}, {"fields": {"model": "simpleplugin", "app_label": "wiki"}, "model": "contenttypes.contenttype", "pk": 102}, {"fields": {"model": "revisionplugin", "app_label": "wiki"}, "model": "contenttypes.contenttype", "pk": 103}, {"fields": {"model": "revisionpluginrevision", "app_label": "wiki"}, "model": "contenttypes.contenttype", "pk": 104}, {"fields": {"model": "image", "app_label": "wiki"}, "model": "contenttypes.contenttype", "pk": 105}, {"fields": {"model": "imagerevision", "app_label": "wiki"}, "model": "contenttypes.contenttype", "pk": 106}, {"fields": {"model": "attachment", "app_label": "wiki"}, "model": "contenttypes.contenttype", "pk": 107}, {"fields": {"model": "attachmentrevision", "app_label": "wiki"}, "model": "contenttypes.contenttype", "pk": 108}, {"fields": {"model": "notificationtype", "app_label": "django_notify"}, "model": "contenttypes.contenttype", "pk": 109}, {"fields": {"model": "settings", "app_label": "django_notify"}, "model": "contenttypes.contenttype", "pk": 110}, {"fields": {"model": "subscription", "app_label": "django_notify"}, "model": "contenttypes.contenttype", "pk": 111}, {"fields": {"model": "notification", "app_label": "django_notify"}, "model": "contenttypes.contenttype", "pk": 112}, {"fields": {"model": "logentry", "app_label": "admin"}, "model": "contenttypes.contenttype", "pk": 113}, {"fields": {"model": "role", "app_label": "django_comment_common"}, "model": "contenttypes.contenttype", "pk": 114}, {"fields": {"model": "permission", "app_label": "django_comment_common"}, "model": "contenttypes.contenttype", "pk": 115}, {"fields": {"model": "note", "app_label": "notes"}, "model": "contenttypes.contenttype", "pk": 116}, {"fields": {"model": "splashconfig", "app_label": "splash"}, "model": "contenttypes.contenttype", "pk": 117}, {"fields": {"model": "userpreference", "app_label": "user_api"}, "model": "contenttypes.contenttype", "pk": 118}, {"fields": {"model": "usercoursetag", "app_label": "user_api"}, "model": "contenttypes.contenttype", "pk": 119}, {"fields": {"model": "userorgtag", "app_label": "user_api"}, "model": "contenttypes.contenttype", "pk": 120}, {"fields": {"model": "order", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 121}, {"fields": {"model": "orderitem", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 122}, {"fields": {"model": "invoice", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 123}, {"fields": {"model": "invoicetransaction", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 124}, {"fields": {"model": "invoiceitem", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 125}, {"fields": {"model": "courseregistrationcodeinvoiceitem", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 126}, {"fields": {"model": "invoicehistory", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 127}, {"fields": {"model": "courseregistrationcode", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 128}, {"fields": {"model": "registrationcoderedemption", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 129}, {"fields": {"model": "coupon", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 130}, {"fields": {"model": "couponredemption", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 131}, {"fields": {"model": "paidcourseregistration", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 132}, {"fields": {"model": "courseregcodeitem", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 133}, {"fields": {"model": "courseregcodeitemannotation", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 134}, {"fields": {"model": "paidcourseregistrationannotation", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 135}, {"fields": {"model": "certificateitem", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 136}, {"fields": {"model": "donationconfiguration", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 137}, {"fields": {"model": "donation", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 138}, {"fields": {"model": "coursemode", "app_label": "course_modes"}, "model": "contenttypes.contenttype", "pk": 139}, {"fields": {"model": "coursemodesarchive", "app_label": "course_modes"}, "model": "contenttypes.contenttype", "pk": 140}, {"fields": {"model": "coursemodeexpirationconfig", "app_label": "course_modes"}, "model": "contenttypes.contenttype", "pk": 141}, {"fields": {"model": "softwaresecurephotoverification", "app_label": "verify_student"}, "model": "contenttypes.contenttype", "pk": 142}, {"fields": {"model": "historicalverificationdeadline", "app_label": "verify_student"}, "model": "contenttypes.contenttype", "pk": 143}, {"fields": {"model": "verificationdeadline", "app_label": "verify_student"}, "model": "contenttypes.contenttype", "pk": 144}, {"fields": {"model": "verificationcheckpoint", "app_label": "verify_student"}, "model": "contenttypes.contenttype", "pk": 145}, {"fields": {"model": "verificationstatus", "app_label": "verify_student"}, "model": "contenttypes.contenttype", "pk": 146}, {"fields": {"model": "incoursereverificationconfiguration", "app_label": "verify_student"}, "model": "contenttypes.contenttype", "pk": 147}, {"fields": {"model": "icrvstatusemailsconfiguration", "app_label": "verify_student"}, "model": "contenttypes.contenttype", "pk": 148}, {"fields": {"model": "skippedreverification", "app_label": "verify_student"}, "model": "contenttypes.contenttype", "pk": 149}, {"fields": {"model": "darklangconfig", "app_label": "dark_lang"}, "model": "contenttypes.contenttype", "pk": 150}, {"fields": {"model": "microsite", "app_label": "microsite_configuration"}, "model": "contenttypes.contenttype", "pk": 151}, {"fields": {"model": "micrositehistory", "app_label": "microsite_configuration"}, "model": "contenttypes.contenttype", "pk": 152}, {"fields": {"model": "historicalmicrositeorganizationmapping", "app_label": "microsite_configuration"}, "model": "contenttypes.contenttype", "pk": 153}, {"fields": {"model": "micrositeorganizationmapping", "app_label": "microsite_configuration"}, "model": "contenttypes.contenttype", "pk": 154}, {"fields": {"model": "historicalmicrositetemplate", "app_label": "microsite_configuration"}, "model": "contenttypes.contenttype", "pk": 155}, {"fields": {"model": "micrositetemplate", "app_label": "microsite_configuration"}, "model": "contenttypes.contenttype", "pk": 156}, {"fields": {"model": "whitelistedrssurl", "app_label": "rss_proxy"}, "model": "contenttypes.contenttype", "pk": 157}, {"fields": {"model": "embargoedcourse", "app_label": "embargo"}, "model": "contenttypes.contenttype", "pk": 158}, {"fields": {"model": "embargoedstate", "app_label": "embargo"}, "model": "contenttypes.contenttype", "pk": 159}, {"fields": {"model": "restrictedcourse", "app_label": "embargo"}, "model": "contenttypes.contenttype", "pk": 160}, {"fields": {"model": "country", "app_label": "embargo"}, "model": "contenttypes.contenttype", "pk": 161}, {"fields": {"model": "countryaccessrule", "app_label": "embargo"}, "model": "contenttypes.contenttype", "pk": 162}, {"fields": {"model": "courseaccessrulehistory", "app_label": "embargo"}, "model": "contenttypes.contenttype", "pk": 163}, {"fields": {"model": "ipfilter", "app_label": "embargo"}, "model": "contenttypes.contenttype", "pk": 164}, {"fields": {"model": "coursererunstate", "app_label": "course_action_state"}, "model": "contenttypes.contenttype", "pk": 165}, {"fields": {"model": "mobileapiconfig", "app_label": "mobile_api"}, "model": "contenttypes.contenttype", "pk": 166}, {"fields": {"model": "usersocialauth", "app_label": "default"}, "model": "contenttypes.contenttype", "pk": 167}, {"fields": {"model": "nonce", "app_label": "default"}, "model": "contenttypes.contenttype", "pk": 168}, {"fields": {"model": "association", "app_label": "default"}, "model": "contenttypes.contenttype", "pk": 169}, {"fields": {"model": "code", "app_label": "default"}, "model": "contenttypes.contenttype", "pk": 170}, {"fields": {"model": "surveyform", "app_label": "survey"}, "model": "contenttypes.contenttype", "pk": 171}, {"fields": {"model": "surveyanswer", "app_label": "survey"}, "model": "contenttypes.contenttype", "pk": 172}, {"fields": {"model": "xblockasidesconfig", "app_label": "lms_xblock"}, "model": "contenttypes.contenttype", "pk": 173}, {"fields": {"model": "courseoverview", "app_label": "course_overviews"}, "model": "contenttypes.contenttype", "pk": 174}, {"fields": {"model": "courseoverviewtab", "app_label": "course_overviews"}, "model": "contenttypes.contenttype", "pk": 175}, {"fields": {"model": "courseoverviewimageset", "app_label": "course_overviews"}, "model": "contenttypes.contenttype", "pk": 176}, {"fields": {"model": "courseoverviewimageconfig", "app_label": "course_overviews"}, "model": "contenttypes.contenttype", "pk": 177}, {"fields": {"model": "coursestructure", "app_label": "course_structures"}, "model": "contenttypes.contenttype", "pk": 178}, {"fields": {"model": "corsmodel", "app_label": "corsheaders"}, "model": "contenttypes.contenttype", "pk": 179}, {"fields": {"model": "xdomainproxyconfiguration", "app_label": "cors_csrf"}, "model": "contenttypes.contenttype", "pk": 180}, {"fields": {"model": "commerceconfiguration", "app_label": "commerce"}, "model": "contenttypes.contenttype", "pk": 181}, {"fields": {"model": "creditprovider", "app_label": "credit"}, "model": "contenttypes.contenttype", "pk": 182}, {"fields": {"model": "creditcourse", "app_label": "credit"}, "model": "contenttypes.contenttype", "pk": 183}, {"fields": {"model": "creditrequirement", "app_label": "credit"}, "model": "contenttypes.contenttype", "pk": 184}, {"fields": {"model": "historicalcreditrequirementstatus", "app_label": "credit"}, "model": "contenttypes.contenttype", "pk": 185}, {"fields": {"model": "creditrequirementstatus", "app_label": "credit"}, "model": "contenttypes.contenttype", "pk": 186}, {"fields": {"model": "crediteligibility", "app_label": "credit"}, "model": "contenttypes.contenttype", "pk": 187}, {"fields": {"model": "historicalcreditrequest", "app_label": "credit"}, "model": "contenttypes.contenttype", "pk": 188}, {"fields": {"model": "creditrequest", "app_label": "credit"}, "model": "contenttypes.contenttype", "pk": 189}, {"fields": {"model": "courseteam", "app_label": "teams"}, "model": "contenttypes.contenttype", "pk": 190}, {"fields": {"model": "courseteammembership", "app_label": "teams"}, "model": "contenttypes.contenttype", "pk": 191}, {"fields": {"model": "xblockdisableconfig", "app_label": "xblock_django"}, "model": "contenttypes.contenttype", "pk": 192}, {"fields": {"model": "bookmark", "app_label": "bookmarks"}, "model": "contenttypes.contenttype", "pk": 193}, {"fields": {"model": "xblockcache", "app_label": "bookmarks"}, "model": "contenttypes.contenttype", "pk": 194}, {"fields": {"model": "programsapiconfig", "app_label": "programs"}, "model": "contenttypes.contenttype", "pk": 195}, {"fields": {"model": "selfpacedconfiguration", "app_label": "self_paced"}, "model": "contenttypes.contenttype", "pk": 196}, {"fields": {"model": "kvstore", "app_label": "thumbnail"}, "model": "contenttypes.contenttype", "pk": 197}, {"fields": {"model": "credentialsapiconfig", "app_label": "credentials"}, "model": "contenttypes.contenttype", "pk": 198}, {"fields": {"model": "milestone", "app_label": "milestones"}, "model": "contenttypes.contenttype", "pk": 199}, {"fields": {"model": "milestonerelationshiptype", "app_label": "milestones"}, "model": "contenttypes.contenttype", "pk": 200}, {"fields": {"model": "coursemilestone", "app_label": "milestones"}, "model": "contenttypes.contenttype", "pk": 201}, {"fields": {"model": "coursecontentmilestone", "app_label": "milestones"}, "model": "contenttypes.contenttype", "pk": 202}, {"fields": {"model": "usermilestone", "app_label": "milestones"}, "model": "contenttypes.contenttype", "pk": 203}, {"fields": {"model": "studentitem", "app_label": "submissions"}, "model": "contenttypes.contenttype", "pk": 204}, {"fields": {"model": "submission", "app_label": "submissions"}, "model": "contenttypes.contenttype", "pk": 205}, {"fields": {"model": "score", "app_label": "submissions"}, "model": "contenttypes.contenttype", "pk": 206}, {"fields": {"model": "scoresummary", "app_label": "submissions"}, "model": "contenttypes.contenttype", "pk": 207}, {"fields": {"model": "scoreannotation", "app_label": "submissions"}, "model": "contenttypes.contenttype", "pk": 208}, {"fields": {"model": "rubric", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 209}, {"fields": {"model": "criterion", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 210}, {"fields": {"model": "criterionoption", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 211}, {"fields": {"model": "assessment", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 212}, {"fields": {"model": "assessmentpart", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 213}, {"fields": {"model": "assessmentfeedbackoption", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 214}, {"fields": {"model": "assessmentfeedback", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 215}, {"fields": {"model": "peerworkflow", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 216}, {"fields": {"model": "peerworkflowitem", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 217}, {"fields": {"model": "trainingexample", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 218}, {"fields": {"model": "studenttrainingworkflow", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 219}, {"fields": {"model": "studenttrainingworkflowitem", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 220}, {"fields": {"model": "aiclassifierset", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 221}, {"fields": {"model": "aiclassifier", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 222}, {"fields": {"model": "aitrainingworkflow", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 223}, {"fields": {"model": "aigradingworkflow", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 224}, {"fields": {"model": "staffworkflow", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 225}, {"fields": {"model": "assessmentworkflow", "app_label": "workflow"}, "model": "contenttypes.contenttype", "pk": 226}, {"fields": {"model": "assessmentworkflowstep", "app_label": "workflow"}, "model": "contenttypes.contenttype", "pk": 227}, {"fields": {"model": "assessmentworkflowcancellation", "app_label": "workflow"}, "model": "contenttypes.contenttype", "pk": 228}, {"fields": {"model": "profile", "app_label": "edxval"}, "model": "contenttypes.contenttype", "pk": 229}, {"fields": {"model": "video", "app_label": "edxval"}, "model": "contenttypes.contenttype", "pk": 230}, {"fields": {"model": "coursevideo", "app_label": "edxval"}, "model": "contenttypes.contenttype", "pk": 231}, {"fields": {"model": "encodedvideo", "app_label": "edxval"}, "model": "contenttypes.contenttype", "pk": 232}, {"fields": {"model": "subtitle", "app_label": "edxval"}, "model": "contenttypes.contenttype", "pk": 233}, {"fields": {"model": "proctoredexam", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 234}, {"fields": {"model": "proctoredexamreviewpolicy", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 235}, {"fields": {"model": "proctoredexamreviewpolicyhistory", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 236}, {"fields": {"model": "proctoredexamstudentattempt", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 237}, {"fields": {"model": "proctoredexamstudentattempthistory", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 238}, {"fields": {"model": "proctoredexamstudentallowance", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 239}, {"fields": {"model": "proctoredexamstudentallowancehistory", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 240}, {"fields": {"model": "proctoredexamsoftwaresecurereview", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 241}, {"fields": {"model": "proctoredexamsoftwaresecurereviewhistory", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 242}, {"fields": {"model": "proctoredexamsoftwaresecurecomment", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 243}, {"fields": {"model": "organization", "app_label": "organizations"}, "model": "contenttypes.contenttype", "pk": 244}, {"fields": {"model": "organizationcourse", "app_label": "organizations"}, "model": "contenttypes.contenttype", "pk": 245}, {"fields": {"model": "studentmodulehistoryextended", "app_label": "coursewarehistoryextended"}, "model": "contenttypes.contenttype", "pk": 246}, {"fields": {"model": "videouploadconfig", "app_label": "contentstore"}, "model": "contenttypes.contenttype", "pk": 247}, {"fields": {"model": "pushnotificationconfig", "app_label": "contentstore"}, "model": "contenttypes.contenttype", "pk": 248}, {"fields": {"model": "coursecreator", "app_label": "course_creators"}, "model": "contenttypes.contenttype", "pk": 249}, {"fields": {"model": "studioconfig", "app_label": "xblock_config"}, "model": "contenttypes.contenttype", "pk": 250}, {"fields": {"domain": "example.com", "name": "example.com"}, "model": "sites.site", "pk": 1}, {"fields": {"default": false, "mode": "honor", "icon": "badges/honor.png"}, "model": "certificates.badgeimageconfiguration", "pk": 1}, {"fields": {"default": false, "mode": "verified", "icon": "badges/verified.png"}, "model": "certificates.badgeimageconfiguration", "pk": 2}, {"fields": {"default": false, "mode": "professional", "icon": "badges/professional.png"}, "model": "certificates.badgeimageconfiguration", "pk": 3}, {"fields": {"plain_template": "{course_title}\n\n{{message_body}}\r\n----\r\nCopyright 2013 edX, All rights reserved.\r\n----\r\nConnect with edX:\r\nFacebook (http://facebook.com/edxonline)\r\nTwitter (http://twitter.com/edxonline)\r\nGoogle+ (https://plus.google.com/108235383044095082735)\r\nMeetup (http://www.meetup.com/edX-Communities/)\r\n----\r\nThis email was automatically sent from {platform_name}.\r\nYou are receiving this email at address {email} because you are enrolled in {course_title}\r\n(URL: {course_url} ).\r\nTo stop receiving email like this, update your course email settings at {email_settings_url}.\r\n", "html_template": " Update from {course_title}

edX
Connect with edX:        

{course_title}


{{message_body}}
       
Copyright \u00a9 2013 edX, All rights reserved.


Our mailing address is:
edX
11 Cambridge Center, Suite 101
Cambridge, MA, USA 02142


This email was automatically sent from {platform_name}.
You are receiving this email at address {email} because you are enrolled in {course_title}.
To stop receiving email like this, update your course email settings here.
", "name": null}, "model": "bulk_email.courseemailtemplate", "pk": 1}, {"fields": {"plain_template": "THIS IS A BRANDED TEXT TEMPLATE. {course_title}\n\n{{message_body}}\r\n----\r\nCopyright 2013 edX, All rights reserved.\r\n----\r\nConnect with edX:\r\nFacebook (http://facebook.com/edxonline)\r\nTwitter (http://twitter.com/edxonline)\r\nGoogle+ (https://plus.google.com/108235383044095082735)\r\nMeetup (http://www.meetup.com/edX-Communities/)\r\n----\r\nThis email was automatically sent from {platform_name}.\r\nYou are receiving this email at address {email} because you are enrolled in {course_title}\r\n(URL: {course_url} ).\r\nTo stop receiving email like this, update your course email settings at {email_settings_url}.\r\n", "html_template": " THIS IS A BRANDED HTML TEMPLATE Update from {course_title}

edX
Connect with edX:        

{course_title}


{{message_body}}
       
Copyright \u00a9 2013 edX, All rights reserved.


Our mailing address is:
edX
11 Cambridge Center, Suite 101
Cambridge, MA, USA 02142


This email was automatically sent from {platform_name}.
You are receiving this email at address {email} because you are enrolled in {course_title}.
To stop receiving email like this, update your course email settings here.
", "name": "branded.template"}, "model": "bulk_email.courseemailtemplate", "pk": 2}, {"fields": {"country": "AF"}, "model": "embargo.country", "pk": 1}, {"fields": {"country": "AX"}, "model": "embargo.country", "pk": 2}, {"fields": {"country": "AL"}, "model": "embargo.country", "pk": 3}, {"fields": {"country": "DZ"}, "model": "embargo.country", "pk": 4}, {"fields": {"country": "AS"}, "model": "embargo.country", "pk": 5}, {"fields": {"country": "AD"}, "model": "embargo.country", "pk": 6}, {"fields": {"country": "AO"}, "model": "embargo.country", "pk": 7}, {"fields": {"country": "AI"}, "model": "embargo.country", "pk": 8}, {"fields": {"country": "AQ"}, "model": "embargo.country", "pk": 9}, {"fields": {"country": "AG"}, "model": "embargo.country", "pk": 10}, {"fields": {"country": "AR"}, "model": "embargo.country", "pk": 11}, {"fields": {"country": "AM"}, "model": "embargo.country", "pk": 12}, {"fields": {"country": "AW"}, "model": "embargo.country", "pk": 13}, {"fields": {"country": "AU"}, "model": "embargo.country", "pk": 14}, {"fields": {"country": "AT"}, "model": "embargo.country", "pk": 15}, {"fields": {"country": "AZ"}, "model": "embargo.country", "pk": 16}, {"fields": {"country": "BS"}, "model": "embargo.country", "pk": 17}, {"fields": {"country": "BH"}, "model": "embargo.country", "pk": 18}, {"fields": {"country": "BD"}, "model": "embargo.country", "pk": 19}, {"fields": {"country": "BB"}, "model": "embargo.country", "pk": 20}, {"fields": {"country": "BY"}, "model": "embargo.country", "pk": 21}, {"fields": {"country": "BE"}, "model": "embargo.country", "pk": 22}, {"fields": {"country": "BZ"}, "model": "embargo.country", "pk": 23}, {"fields": {"country": "BJ"}, "model": "embargo.country", "pk": 24}, {"fields": {"country": "BM"}, "model": "embargo.country", "pk": 25}, {"fields": {"country": "BT"}, "model": "embargo.country", "pk": 26}, {"fields": {"country": "BO"}, "model": "embargo.country", "pk": 27}, {"fields": {"country": "BQ"}, "model": "embargo.country", "pk": 28}, {"fields": {"country": "BA"}, "model": "embargo.country", "pk": 29}, {"fields": {"country": "BW"}, "model": "embargo.country", "pk": 30}, {"fields": {"country": "BV"}, "model": "embargo.country", "pk": 31}, {"fields": {"country": "BR"}, "model": "embargo.country", "pk": 32}, {"fields": {"country": "IO"}, "model": "embargo.country", "pk": 33}, {"fields": {"country": "BN"}, "model": "embargo.country", "pk": 34}, {"fields": {"country": "BG"}, "model": "embargo.country", "pk": 35}, {"fields": {"country": "BF"}, "model": "embargo.country", "pk": 36}, {"fields": {"country": "BI"}, "model": "embargo.country", "pk": 37}, {"fields": {"country": "CV"}, "model": "embargo.country", "pk": 38}, {"fields": {"country": "KH"}, "model": "embargo.country", "pk": 39}, {"fields": {"country": "CM"}, "model": "embargo.country", "pk": 40}, {"fields": {"country": "CA"}, "model": "embargo.country", "pk": 41}, {"fields": {"country": "KY"}, "model": "embargo.country", "pk": 42}, {"fields": {"country": "CF"}, "model": "embargo.country", "pk": 43}, {"fields": {"country": "TD"}, "model": "embargo.country", "pk": 44}, {"fields": {"country": "CL"}, "model": "embargo.country", "pk": 45}, {"fields": {"country": "CN"}, "model": "embargo.country", "pk": 46}, {"fields": {"country": "CX"}, "model": "embargo.country", "pk": 47}, {"fields": {"country": "CC"}, "model": "embargo.country", "pk": 48}, {"fields": {"country": "CO"}, "model": "embargo.country", "pk": 49}, {"fields": {"country": "KM"}, "model": "embargo.country", "pk": 50}, {"fields": {"country": "CG"}, "model": "embargo.country", "pk": 51}, {"fields": {"country": "CD"}, "model": "embargo.country", "pk": 52}, {"fields": {"country": "CK"}, "model": "embargo.country", "pk": 53}, {"fields": {"country": "CR"}, "model": "embargo.country", "pk": 54}, {"fields": {"country": "CI"}, "model": "embargo.country", "pk": 55}, {"fields": {"country": "HR"}, "model": "embargo.country", "pk": 56}, {"fields": {"country": "CU"}, "model": "embargo.country", "pk": 57}, {"fields": {"country": "CW"}, "model": "embargo.country", "pk": 58}, {"fields": {"country": "CY"}, "model": "embargo.country", "pk": 59}, {"fields": {"country": "CZ"}, "model": "embargo.country", "pk": 60}, {"fields": {"country": "DK"}, "model": "embargo.country", "pk": 61}, {"fields": {"country": "DJ"}, "model": "embargo.country", "pk": 62}, {"fields": {"country": "DM"}, "model": "embargo.country", "pk": 63}, {"fields": {"country": "DO"}, "model": "embargo.country", "pk": 64}, {"fields": {"country": "EC"}, "model": "embargo.country", "pk": 65}, {"fields": {"country": "EG"}, "model": "embargo.country", "pk": 66}, {"fields": {"country": "SV"}, "model": "embargo.country", "pk": 67}, {"fields": {"country": "GQ"}, "model": "embargo.country", "pk": 68}, {"fields": {"country": "ER"}, "model": "embargo.country", "pk": 69}, {"fields": {"country": "EE"}, "model": "embargo.country", "pk": 70}, {"fields": {"country": "ET"}, "model": "embargo.country", "pk": 71}, {"fields": {"country": "FK"}, "model": "embargo.country", "pk": 72}, {"fields": {"country": "FO"}, "model": "embargo.country", "pk": 73}, {"fields": {"country": "FJ"}, "model": "embargo.country", "pk": 74}, {"fields": {"country": "FI"}, "model": "embargo.country", "pk": 75}, {"fields": {"country": "FR"}, "model": "embargo.country", "pk": 76}, {"fields": {"country": "GF"}, "model": "embargo.country", "pk": 77}, {"fields": {"country": "PF"}, "model": "embargo.country", "pk": 78}, {"fields": {"country": "TF"}, "model": "embargo.country", "pk": 79}, {"fields": {"country": "GA"}, "model": "embargo.country", "pk": 80}, {"fields": {"country": "GM"}, "model": "embargo.country", "pk": 81}, {"fields": {"country": "GE"}, "model": "embargo.country", "pk": 82}, {"fields": {"country": "DE"}, "model": "embargo.country", "pk": 83}, {"fields": {"country": "GH"}, "model": "embargo.country", "pk": 84}, {"fields": {"country": "GI"}, "model": "embargo.country", "pk": 85}, {"fields": {"country": "GR"}, "model": "embargo.country", "pk": 86}, {"fields": {"country": "GL"}, "model": "embargo.country", "pk": 87}, {"fields": {"country": "GD"}, "model": "embargo.country", "pk": 88}, {"fields": {"country": "GP"}, "model": "embargo.country", "pk": 89}, {"fields": {"country": "GU"}, "model": "embargo.country", "pk": 90}, {"fields": {"country": "GT"}, "model": "embargo.country", "pk": 91}, {"fields": {"country": "GG"}, "model": "embargo.country", "pk": 92}, {"fields": {"country": "GN"}, "model": "embargo.country", "pk": 93}, {"fields": {"country": "GW"}, "model": "embargo.country", "pk": 94}, {"fields": {"country": "GY"}, "model": "embargo.country", "pk": 95}, {"fields": {"country": "HT"}, "model": "embargo.country", "pk": 96}, {"fields": {"country": "HM"}, "model": "embargo.country", "pk": 97}, {"fields": {"country": "VA"}, "model": "embargo.country", "pk": 98}, {"fields": {"country": "HN"}, "model": "embargo.country", "pk": 99}, {"fields": {"country": "HK"}, "model": "embargo.country", "pk": 100}, {"fields": {"country": "HU"}, "model": "embargo.country", "pk": 101}, {"fields": {"country": "IS"}, "model": "embargo.country", "pk": 102}, {"fields": {"country": "IN"}, "model": "embargo.country", "pk": 103}, {"fields": {"country": "ID"}, "model": "embargo.country", "pk": 104}, {"fields": {"country": "IR"}, "model": "embargo.country", "pk": 105}, {"fields": {"country": "IQ"}, "model": "embargo.country", "pk": 106}, {"fields": {"country": "IE"}, "model": "embargo.country", "pk": 107}, {"fields": {"country": "IM"}, "model": "embargo.country", "pk": 108}, {"fields": {"country": "IL"}, "model": "embargo.country", "pk": 109}, {"fields": {"country": "IT"}, "model": "embargo.country", "pk": 110}, {"fields": {"country": "JM"}, "model": "embargo.country", "pk": 111}, {"fields": {"country": "JP"}, "model": "embargo.country", "pk": 112}, {"fields": {"country": "JE"}, "model": "embargo.country", "pk": 113}, {"fields": {"country": "JO"}, "model": "embargo.country", "pk": 114}, {"fields": {"country": "KZ"}, "model": "embargo.country", "pk": 115}, {"fields": {"country": "KE"}, "model": "embargo.country", "pk": 116}, {"fields": {"country": "KI"}, "model": "embargo.country", "pk": 117}, {"fields": {"country": "KW"}, "model": "embargo.country", "pk": 118}, {"fields": {"country": "KG"}, "model": "embargo.country", "pk": 119}, {"fields": {"country": "LA"}, "model": "embargo.country", "pk": 120}, {"fields": {"country": "LV"}, "model": "embargo.country", "pk": 121}, {"fields": {"country": "LB"}, "model": "embargo.country", "pk": 122}, {"fields": {"country": "LS"}, "model": "embargo.country", "pk": 123}, {"fields": {"country": "LR"}, "model": "embargo.country", "pk": 124}, {"fields": {"country": "LY"}, "model": "embargo.country", "pk": 125}, {"fields": {"country": "LI"}, "model": "embargo.country", "pk": 126}, {"fields": {"country": "LT"}, "model": "embargo.country", "pk": 127}, {"fields": {"country": "LU"}, "model": "embargo.country", "pk": 128}, {"fields": {"country": "MO"}, "model": "embargo.country", "pk": 129}, {"fields": {"country": "MK"}, "model": "embargo.country", "pk": 130}, {"fields": {"country": "MG"}, "model": "embargo.country", "pk": 131}, {"fields": {"country": "MW"}, "model": "embargo.country", "pk": 132}, {"fields": {"country": "MY"}, "model": "embargo.country", "pk": 133}, {"fields": {"country": "MV"}, "model": "embargo.country", "pk": 134}, {"fields": {"country": "ML"}, "model": "embargo.country", "pk": 135}, {"fields": {"country": "MT"}, "model": "embargo.country", "pk": 136}, {"fields": {"country": "MH"}, "model": "embargo.country", "pk": 137}, {"fields": {"country": "MQ"}, "model": "embargo.country", "pk": 138}, {"fields": {"country": "MR"}, "model": "embargo.country", "pk": 139}, {"fields": {"country": "MU"}, "model": "embargo.country", "pk": 140}, {"fields": {"country": "YT"}, "model": "embargo.country", "pk": 141}, {"fields": {"country": "MX"}, "model": "embargo.country", "pk": 142}, {"fields": {"country": "FM"}, "model": "embargo.country", "pk": 143}, {"fields": {"country": "MD"}, "model": "embargo.country", "pk": 144}, {"fields": {"country": "MC"}, "model": "embargo.country", "pk": 145}, {"fields": {"country": "MN"}, "model": "embargo.country", "pk": 146}, {"fields": {"country": "ME"}, "model": "embargo.country", "pk": 147}, {"fields": {"country": "MS"}, "model": "embargo.country", "pk": 148}, {"fields": {"country": "MA"}, "model": "embargo.country", "pk": 149}, {"fields": {"country": "MZ"}, "model": "embargo.country", "pk": 150}, {"fields": {"country": "MM"}, "model": "embargo.country", "pk": 151}, {"fields": {"country": "NA"}, "model": "embargo.country", "pk": 152}, {"fields": {"country": "NR"}, "model": "embargo.country", "pk": 153}, {"fields": {"country": "NP"}, "model": "embargo.country", "pk": 154}, {"fields": {"country": "NL"}, "model": "embargo.country", "pk": 155}, {"fields": {"country": "NC"}, "model": "embargo.country", "pk": 156}, {"fields": {"country": "NZ"}, "model": "embargo.country", "pk": 157}, {"fields": {"country": "NI"}, "model": "embargo.country", "pk": 158}, {"fields": {"country": "NE"}, "model": "embargo.country", "pk": 159}, {"fields": {"country": "NG"}, "model": "embargo.country", "pk": 160}, {"fields": {"country": "NU"}, "model": "embargo.country", "pk": 161}, {"fields": {"country": "NF"}, "model": "embargo.country", "pk": 162}, {"fields": {"country": "KP"}, "model": "embargo.country", "pk": 163}, {"fields": {"country": "MP"}, "model": "embargo.country", "pk": 164}, {"fields": {"country": "NO"}, "model": "embargo.country", "pk": 165}, {"fields": {"country": "OM"}, "model": "embargo.country", "pk": 166}, {"fields": {"country": "PK"}, "model": "embargo.country", "pk": 167}, {"fields": {"country": "PW"}, "model": "embargo.country", "pk": 168}, {"fields": {"country": "PS"}, "model": "embargo.country", "pk": 169}, {"fields": {"country": "PA"}, "model": "embargo.country", "pk": 170}, {"fields": {"country": "PG"}, "model": "embargo.country", "pk": 171}, {"fields": {"country": "PY"}, "model": "embargo.country", "pk": 172}, {"fields": {"country": "PE"}, "model": "embargo.country", "pk": 173}, {"fields": {"country": "PH"}, "model": "embargo.country", "pk": 174}, {"fields": {"country": "PN"}, "model": "embargo.country", "pk": 175}, {"fields": {"country": "PL"}, "model": "embargo.country", "pk": 176}, {"fields": {"country": "PT"}, "model": "embargo.country", "pk": 177}, {"fields": {"country": "PR"}, "model": "embargo.country", "pk": 178}, {"fields": {"country": "QA"}, "model": "embargo.country", "pk": 179}, {"fields": {"country": "RE"}, "model": "embargo.country", "pk": 180}, {"fields": {"country": "RO"}, "model": "embargo.country", "pk": 181}, {"fields": {"country": "RU"}, "model": "embargo.country", "pk": 182}, {"fields": {"country": "RW"}, "model": "embargo.country", "pk": 183}, {"fields": {"country": "BL"}, "model": "embargo.country", "pk": 184}, {"fields": {"country": "SH"}, "model": "embargo.country", "pk": 185}, {"fields": {"country": "KN"}, "model": "embargo.country", "pk": 186}, {"fields": {"country": "LC"}, "model": "embargo.country", "pk": 187}, {"fields": {"country": "MF"}, "model": "embargo.country", "pk": 188}, {"fields": {"country": "PM"}, "model": "embargo.country", "pk": 189}, {"fields": {"country": "VC"}, "model": "embargo.country", "pk": 190}, {"fields": {"country": "WS"}, "model": "embargo.country", "pk": 191}, {"fields": {"country": "SM"}, "model": "embargo.country", "pk": 192}, {"fields": {"country": "ST"}, "model": "embargo.country", "pk": 193}, {"fields": {"country": "SA"}, "model": "embargo.country", "pk": 194}, {"fields": {"country": "SN"}, "model": "embargo.country", "pk": 195}, {"fields": {"country": "RS"}, "model": "embargo.country", "pk": 196}, {"fields": {"country": "SC"}, "model": "embargo.country", "pk": 197}, {"fields": {"country": "SL"}, "model": "embargo.country", "pk": 198}, {"fields": {"country": "SG"}, "model": "embargo.country", "pk": 199}, {"fields": {"country": "SX"}, "model": "embargo.country", "pk": 200}, {"fields": {"country": "SK"}, "model": "embargo.country", "pk": 201}, {"fields": {"country": "SI"}, "model": "embargo.country", "pk": 202}, {"fields": {"country": "SB"}, "model": "embargo.country", "pk": 203}, {"fields": {"country": "SO"}, "model": "embargo.country", "pk": 204}, {"fields": {"country": "ZA"}, "model": "embargo.country", "pk": 205}, {"fields": {"country": "GS"}, "model": "embargo.country", "pk": 206}, {"fields": {"country": "KR"}, "model": "embargo.country", "pk": 207}, {"fields": {"country": "SS"}, "model": "embargo.country", "pk": 208}, {"fields": {"country": "ES"}, "model": "embargo.country", "pk": 209}, {"fields": {"country": "LK"}, "model": "embargo.country", "pk": 210}, {"fields": {"country": "SD"}, "model": "embargo.country", "pk": 211}, {"fields": {"country": "SR"}, "model": "embargo.country", "pk": 212}, {"fields": {"country": "SJ"}, "model": "embargo.country", "pk": 213}, {"fields": {"country": "SZ"}, "model": "embargo.country", "pk": 214}, {"fields": {"country": "SE"}, "model": "embargo.country", "pk": 215}, {"fields": {"country": "CH"}, "model": "embargo.country", "pk": 216}, {"fields": {"country": "SY"}, "model": "embargo.country", "pk": 217}, {"fields": {"country": "TW"}, "model": "embargo.country", "pk": 218}, {"fields": {"country": "TJ"}, "model": "embargo.country", "pk": 219}, {"fields": {"country": "TZ"}, "model": "embargo.country", "pk": 220}, {"fields": {"country": "TH"}, "model": "embargo.country", "pk": 221}, {"fields": {"country": "TL"}, "model": "embargo.country", "pk": 222}, {"fields": {"country": "TG"}, "model": "embargo.country", "pk": 223}, {"fields": {"country": "TK"}, "model": "embargo.country", "pk": 224}, {"fields": {"country": "TO"}, "model": "embargo.country", "pk": 225}, {"fields": {"country": "TT"}, "model": "embargo.country", "pk": 226}, {"fields": {"country": "TN"}, "model": "embargo.country", "pk": 227}, {"fields": {"country": "TR"}, "model": "embargo.country", "pk": 228}, {"fields": {"country": "TM"}, "model": "embargo.country", "pk": 229}, {"fields": {"country": "TC"}, "model": "embargo.country", "pk": 230}, {"fields": {"country": "TV"}, "model": "embargo.country", "pk": 231}, {"fields": {"country": "UG"}, "model": "embargo.country", "pk": 232}, {"fields": {"country": "UA"}, "model": "embargo.country", "pk": 233}, {"fields": {"country": "AE"}, "model": "embargo.country", "pk": 234}, {"fields": {"country": "GB"}, "model": "embargo.country", "pk": 235}, {"fields": {"country": "UM"}, "model": "embargo.country", "pk": 236}, {"fields": {"country": "US"}, "model": "embargo.country", "pk": 237}, {"fields": {"country": "UY"}, "model": "embargo.country", "pk": 238}, {"fields": {"country": "UZ"}, "model": "embargo.country", "pk": 239}, {"fields": {"country": "VU"}, "model": "embargo.country", "pk": 240}, {"fields": {"country": "VE"}, "model": "embargo.country", "pk": 241}, {"fields": {"country": "VN"}, "model": "embargo.country", "pk": 242}, {"fields": {"country": "VG"}, "model": "embargo.country", "pk": 243}, {"fields": {"country": "VI"}, "model": "embargo.country", "pk": 244}, {"fields": {"country": "WF"}, "model": "embargo.country", "pk": 245}, {"fields": {"country": "EH"}, "model": "embargo.country", "pk": 246}, {"fields": {"country": "YE"}, "model": "embargo.country", "pk": 247}, {"fields": {"country": "ZM"}, "model": "embargo.country", "pk": 248}, {"fields": {"country": "ZW"}, "model": "embargo.country", "pk": 249}, {"fields": {"active": true, "description": "Autogenerated milestone relationship type \"fulfills\"", "modified": "2016-02-29T17:58:32.233Z", "name": "fulfills", "created": "2016-02-29T17:58:32.232Z"}, "model": "milestones.milestonerelationshiptype", "pk": 1}, {"fields": {"active": true, "description": "Autogenerated milestone relationship type \"requires\"", "modified": "2016-02-29T17:58:32.234Z", "name": "requires", "created": "2016-02-29T17:58:32.234Z"}, "model": "milestones.milestonerelationshiptype", "pk": 2}, {"fields": {"profile_name": "desktop_mp4"}, "model": "edxval.profile", "pk": 1}, {"fields": {"profile_name": "desktop_webm"}, "model": "edxval.profile", "pk": 2}, {"fields": {"profile_name": "mobile_high"}, "model": "edxval.profile", "pk": 3}, {"fields": {"profile_name": "mobile_low"}, "model": "edxval.profile", "pk": 4}, {"fields": {"profile_name": "youtube"}, "model": "edxval.profile", "pk": 5}, {"fields": {"codename": "add_permission", "name": "Can add permission", "content_type": 1}, "model": "auth.permission", "pk": 1}, {"fields": {"codename": "change_permission", "name": "Can change permission", "content_type": 1}, "model": "auth.permission", "pk": 2}, {"fields": {"codename": "delete_permission", "name": "Can delete permission", "content_type": 1}, "model": "auth.permission", "pk": 3}, {"fields": {"codename": "add_group", "name": "Can add group", "content_type": 2}, "model": "auth.permission", "pk": 4}, {"fields": {"codename": "change_group", "name": "Can change group", "content_type": 2}, "model": "auth.permission", "pk": 5}, {"fields": {"codename": "delete_group", "name": "Can delete group", "content_type": 2}, "model": "auth.permission", "pk": 6}, {"fields": {"codename": "add_user", "name": "Can add user", "content_type": 3}, "model": "auth.permission", "pk": 7}, {"fields": {"codename": "change_user", "name": "Can change user", "content_type": 3}, "model": "auth.permission", "pk": 8}, {"fields": {"codename": "delete_user", "name": "Can delete user", "content_type": 3}, "model": "auth.permission", "pk": 9}, {"fields": {"codename": "add_contenttype", "name": "Can add content type", "content_type": 4}, "model": "auth.permission", "pk": 10}, {"fields": {"codename": "change_contenttype", "name": "Can change content type", "content_type": 4}, "model": "auth.permission", "pk": 11}, {"fields": {"codename": "delete_contenttype", "name": "Can delete content type", "content_type": 4}, "model": "auth.permission", "pk": 12}, {"fields": {"codename": "add_session", "name": "Can add session", "content_type": 5}, "model": "auth.permission", "pk": 13}, {"fields": {"codename": "change_session", "name": "Can change session", "content_type": 5}, "model": "auth.permission", "pk": 14}, {"fields": {"codename": "delete_session", "name": "Can delete session", "content_type": 5}, "model": "auth.permission", "pk": 15}, {"fields": {"codename": "add_site", "name": "Can add site", "content_type": 6}, "model": "auth.permission", "pk": 16}, {"fields": {"codename": "change_site", "name": "Can change site", "content_type": 6}, "model": "auth.permission", "pk": 17}, {"fields": {"codename": "delete_site", "name": "Can delete site", "content_type": 6}, "model": "auth.permission", "pk": 18}, {"fields": {"codename": "add_taskmeta", "name": "Can add task state", "content_type": 7}, "model": "auth.permission", "pk": 19}, {"fields": {"codename": "change_taskmeta", "name": "Can change task state", "content_type": 7}, "model": "auth.permission", "pk": 20}, {"fields": {"codename": "delete_taskmeta", "name": "Can delete task state", "content_type": 7}, "model": "auth.permission", "pk": 21}, {"fields": {"codename": "add_tasksetmeta", "name": "Can add saved group result", "content_type": 8}, "model": "auth.permission", "pk": 22}, {"fields": {"codename": "change_tasksetmeta", "name": "Can change saved group result", "content_type": 8}, "model": "auth.permission", "pk": 23}, {"fields": {"codename": "delete_tasksetmeta", "name": "Can delete saved group result", "content_type": 8}, "model": "auth.permission", "pk": 24}, {"fields": {"codename": "add_intervalschedule", "name": "Can add interval", "content_type": 9}, "model": "auth.permission", "pk": 25}, {"fields": {"codename": "change_intervalschedule", "name": "Can change interval", "content_type": 9}, "model": "auth.permission", "pk": 26}, {"fields": {"codename": "delete_intervalschedule", "name": "Can delete interval", "content_type": 9}, "model": "auth.permission", "pk": 27}, {"fields": {"codename": "add_crontabschedule", "name": "Can add crontab", "content_type": 10}, "model": "auth.permission", "pk": 28}, {"fields": {"codename": "change_crontabschedule", "name": "Can change crontab", "content_type": 10}, "model": "auth.permission", "pk": 29}, {"fields": {"codename": "delete_crontabschedule", "name": "Can delete crontab", "content_type": 10}, "model": "auth.permission", "pk": 30}, {"fields": {"codename": "add_periodictasks", "name": "Can add periodic tasks", "content_type": 11}, "model": "auth.permission", "pk": 31}, {"fields": {"codename": "change_periodictasks", "name": "Can change periodic tasks", "content_type": 11}, "model": "auth.permission", "pk": 32}, {"fields": {"codename": "delete_periodictasks", "name": "Can delete periodic tasks", "content_type": 11}, "model": "auth.permission", "pk": 33}, {"fields": {"codename": "add_periodictask", "name": "Can add periodic task", "content_type": 12}, "model": "auth.permission", "pk": 34}, {"fields": {"codename": "change_periodictask", "name": "Can change periodic task", "content_type": 12}, "model": "auth.permission", "pk": 35}, {"fields": {"codename": "delete_periodictask", "name": "Can delete periodic task", "content_type": 12}, "model": "auth.permission", "pk": 36}, {"fields": {"codename": "add_workerstate", "name": "Can add worker", "content_type": 13}, "model": "auth.permission", "pk": 37}, {"fields": {"codename": "change_workerstate", "name": "Can change worker", "content_type": 13}, "model": "auth.permission", "pk": 38}, {"fields": {"codename": "delete_workerstate", "name": "Can delete worker", "content_type": 13}, "model": "auth.permission", "pk": 39}, {"fields": {"codename": "add_taskstate", "name": "Can add task", "content_type": 14}, "model": "auth.permission", "pk": 40}, {"fields": {"codename": "change_taskstate", "name": "Can change task", "content_type": 14}, "model": "auth.permission", "pk": 41}, {"fields": {"codename": "delete_taskstate", "name": "Can delete task", "content_type": 14}, "model": "auth.permission", "pk": 42}, {"fields": {"codename": "add_globalstatusmessage", "name": "Can add global status message", "content_type": 15}, "model": "auth.permission", "pk": 43}, {"fields": {"codename": "change_globalstatusmessage", "name": "Can change global status message", "content_type": 15}, "model": "auth.permission", "pk": 44}, {"fields": {"codename": "delete_globalstatusmessage", "name": "Can delete global status message", "content_type": 15}, "model": "auth.permission", "pk": 45}, {"fields": {"codename": "add_coursemessage", "name": "Can add course message", "content_type": 16}, "model": "auth.permission", "pk": 46}, {"fields": {"codename": "change_coursemessage", "name": "Can change course message", "content_type": 16}, "model": "auth.permission", "pk": 47}, {"fields": {"codename": "delete_coursemessage", "name": "Can delete course message", "content_type": 16}, "model": "auth.permission", "pk": 48}, {"fields": {"codename": "add_assetbaseurlconfig", "name": "Can add asset base url config", "content_type": 17}, "model": "auth.permission", "pk": 49}, {"fields": {"codename": "change_assetbaseurlconfig", "name": "Can change asset base url config", "content_type": 17}, "model": "auth.permission", "pk": 50}, {"fields": {"codename": "delete_assetbaseurlconfig", "name": "Can delete asset base url config", "content_type": 17}, "model": "auth.permission", "pk": 51}, {"fields": {"codename": "add_assetexcludedextensionsconfig", "name": "Can add asset excluded extensions config", "content_type": 18}, "model": "auth.permission", "pk": 52}, {"fields": {"codename": "change_assetexcludedextensionsconfig", "name": "Can change asset excluded extensions config", "content_type": 18}, "model": "auth.permission", "pk": 53}, {"fields": {"codename": "delete_assetexcludedextensionsconfig", "name": "Can delete asset excluded extensions config", "content_type": 18}, "model": "auth.permission", "pk": 54}, {"fields": {"codename": "add_courseassetcachettlconfig", "name": "Can add course asset cache ttl config", "content_type": 19}, "model": "auth.permission", "pk": 55}, {"fields": {"codename": "change_courseassetcachettlconfig", "name": "Can change course asset cache ttl config", "content_type": 19}, "model": "auth.permission", "pk": 56}, {"fields": {"codename": "delete_courseassetcachettlconfig", "name": "Can delete course asset cache ttl config", "content_type": 19}, "model": "auth.permission", "pk": 57}, {"fields": {"codename": "add_studentmodule", "name": "Can add student module", "content_type": 20}, "model": "auth.permission", "pk": 58}, {"fields": {"codename": "change_studentmodule", "name": "Can change student module", "content_type": 20}, "model": "auth.permission", "pk": 59}, {"fields": {"codename": "delete_studentmodule", "name": "Can delete student module", "content_type": 20}, "model": "auth.permission", "pk": 60}, {"fields": {"codename": "add_studentmodulehistory", "name": "Can add student module history", "content_type": 21}, "model": "auth.permission", "pk": 61}, {"fields": {"codename": "change_studentmodulehistory", "name": "Can change student module history", "content_type": 21}, "model": "auth.permission", "pk": 62}, {"fields": {"codename": "delete_studentmodulehistory", "name": "Can delete student module history", "content_type": 21}, "model": "auth.permission", "pk": 63}, {"fields": {"codename": "add_xmoduleuserstatesummaryfield", "name": "Can add x module user state summary field", "content_type": 22}, "model": "auth.permission", "pk": 64}, {"fields": {"codename": "change_xmoduleuserstatesummaryfield", "name": "Can change x module user state summary field", "content_type": 22}, "model": "auth.permission", "pk": 65}, {"fields": {"codename": "delete_xmoduleuserstatesummaryfield", "name": "Can delete x module user state summary field", "content_type": 22}, "model": "auth.permission", "pk": 66}, {"fields": {"codename": "add_xmodulestudentprefsfield", "name": "Can add x module student prefs field", "content_type": 23}, "model": "auth.permission", "pk": 67}, {"fields": {"codename": "change_xmodulestudentprefsfield", "name": "Can change x module student prefs field", "content_type": 23}, "model": "auth.permission", "pk": 68}, {"fields": {"codename": "delete_xmodulestudentprefsfield", "name": "Can delete x module student prefs field", "content_type": 23}, "model": "auth.permission", "pk": 69}, {"fields": {"codename": "add_xmodulestudentinfofield", "name": "Can add x module student info field", "content_type": 24}, "model": "auth.permission", "pk": 70}, {"fields": {"codename": "change_xmodulestudentinfofield", "name": "Can change x module student info field", "content_type": 24}, "model": "auth.permission", "pk": 71}, {"fields": {"codename": "delete_xmodulestudentinfofield", "name": "Can delete x module student info field", "content_type": 24}, "model": "auth.permission", "pk": 72}, {"fields": {"codename": "add_offlinecomputedgrade", "name": "Can add offline computed grade", "content_type": 25}, "model": "auth.permission", "pk": 73}, {"fields": {"codename": "change_offlinecomputedgrade", "name": "Can change offline computed grade", "content_type": 25}, "model": "auth.permission", "pk": 74}, {"fields": {"codename": "delete_offlinecomputedgrade", "name": "Can delete offline computed grade", "content_type": 25}, "model": "auth.permission", "pk": 75}, {"fields": {"codename": "add_offlinecomputedgradelog", "name": "Can add offline computed grade log", "content_type": 26}, "model": "auth.permission", "pk": 76}, {"fields": {"codename": "change_offlinecomputedgradelog", "name": "Can change offline computed grade log", "content_type": 26}, "model": "auth.permission", "pk": 77}, {"fields": {"codename": "delete_offlinecomputedgradelog", "name": "Can delete offline computed grade log", "content_type": 26}, "model": "auth.permission", "pk": 78}, {"fields": {"codename": "add_studentfieldoverride", "name": "Can add student field override", "content_type": 27}, "model": "auth.permission", "pk": 79}, {"fields": {"codename": "change_studentfieldoverride", "name": "Can change student field override", "content_type": 27}, "model": "auth.permission", "pk": 80}, {"fields": {"codename": "delete_studentfieldoverride", "name": "Can delete student field override", "content_type": 27}, "model": "auth.permission", "pk": 81}, {"fields": {"codename": "add_anonymoususerid", "name": "Can add anonymous user id", "content_type": 28}, "model": "auth.permission", "pk": 82}, {"fields": {"codename": "change_anonymoususerid", "name": "Can change anonymous user id", "content_type": 28}, "model": "auth.permission", "pk": 83}, {"fields": {"codename": "delete_anonymoususerid", "name": "Can delete anonymous user id", "content_type": 28}, "model": "auth.permission", "pk": 84}, {"fields": {"codename": "add_userstanding", "name": "Can add user standing", "content_type": 29}, "model": "auth.permission", "pk": 85}, {"fields": {"codename": "change_userstanding", "name": "Can change user standing", "content_type": 29}, "model": "auth.permission", "pk": 86}, {"fields": {"codename": "delete_userstanding", "name": "Can delete user standing", "content_type": 29}, "model": "auth.permission", "pk": 87}, {"fields": {"codename": "add_userprofile", "name": "Can add user profile", "content_type": 30}, "model": "auth.permission", "pk": 88}, {"fields": {"codename": "change_userprofile", "name": "Can change user profile", "content_type": 30}, "model": "auth.permission", "pk": 89}, {"fields": {"codename": "delete_userprofile", "name": "Can delete user profile", "content_type": 30}, "model": "auth.permission", "pk": 90}, {"fields": {"codename": "add_usersignupsource", "name": "Can add user signup source", "content_type": 31}, "model": "auth.permission", "pk": 91}, {"fields": {"codename": "change_usersignupsource", "name": "Can change user signup source", "content_type": 31}, "model": "auth.permission", "pk": 92}, {"fields": {"codename": "delete_usersignupsource", "name": "Can delete user signup source", "content_type": 31}, "model": "auth.permission", "pk": 93}, {"fields": {"codename": "add_usertestgroup", "name": "Can add user test group", "content_type": 32}, "model": "auth.permission", "pk": 94}, {"fields": {"codename": "change_usertestgroup", "name": "Can change user test group", "content_type": 32}, "model": "auth.permission", "pk": 95}, {"fields": {"codename": "delete_usertestgroup", "name": "Can delete user test group", "content_type": 32}, "model": "auth.permission", "pk": 96}, {"fields": {"codename": "add_registration", "name": "Can add registration", "content_type": 33}, "model": "auth.permission", "pk": 97}, {"fields": {"codename": "change_registration", "name": "Can change registration", "content_type": 33}, "model": "auth.permission", "pk": 98}, {"fields": {"codename": "delete_registration", "name": "Can delete registration", "content_type": 33}, "model": "auth.permission", "pk": 99}, {"fields": {"codename": "add_pendingnamechange", "name": "Can add pending name change", "content_type": 34}, "model": "auth.permission", "pk": 100}, {"fields": {"codename": "change_pendingnamechange", "name": "Can change pending name change", "content_type": 34}, "model": "auth.permission", "pk": 101}, {"fields": {"codename": "delete_pendingnamechange", "name": "Can delete pending name change", "content_type": 34}, "model": "auth.permission", "pk": 102}, {"fields": {"codename": "add_pendingemailchange", "name": "Can add pending email change", "content_type": 35}, "model": "auth.permission", "pk": 103}, {"fields": {"codename": "change_pendingemailchange", "name": "Can change pending email change", "content_type": 35}, "model": "auth.permission", "pk": 104}, {"fields": {"codename": "delete_pendingemailchange", "name": "Can delete pending email change", "content_type": 35}, "model": "auth.permission", "pk": 105}, {"fields": {"codename": "add_passwordhistory", "name": "Can add password history", "content_type": 36}, "model": "auth.permission", "pk": 106}, {"fields": {"codename": "change_passwordhistory", "name": "Can change password history", "content_type": 36}, "model": "auth.permission", "pk": 107}, {"fields": {"codename": "delete_passwordhistory", "name": "Can delete password history", "content_type": 36}, "model": "auth.permission", "pk": 108}, {"fields": {"codename": "add_loginfailures", "name": "Can add login failures", "content_type": 37}, "model": "auth.permission", "pk": 109}, {"fields": {"codename": "change_loginfailures", "name": "Can change login failures", "content_type": 37}, "model": "auth.permission", "pk": 110}, {"fields": {"codename": "delete_loginfailures", "name": "Can delete login failures", "content_type": 37}, "model": "auth.permission", "pk": 111}, {"fields": {"codename": "add_historicalcourseenrollment", "name": "Can add historical course enrollment", "content_type": 38}, "model": "auth.permission", "pk": 112}, {"fields": {"codename": "change_historicalcourseenrollment", "name": "Can change historical course enrollment", "content_type": 38}, "model": "auth.permission", "pk": 113}, {"fields": {"codename": "delete_historicalcourseenrollment", "name": "Can delete historical course enrollment", "content_type": 38}, "model": "auth.permission", "pk": 114}, {"fields": {"codename": "add_courseenrollment", "name": "Can add course enrollment", "content_type": 39}, "model": "auth.permission", "pk": 115}, {"fields": {"codename": "change_courseenrollment", "name": "Can change course enrollment", "content_type": 39}, "model": "auth.permission", "pk": 116}, {"fields": {"codename": "delete_courseenrollment", "name": "Can delete course enrollment", "content_type": 39}, "model": "auth.permission", "pk": 117}, {"fields": {"codename": "add_manualenrollmentaudit", "name": "Can add manual enrollment audit", "content_type": 40}, "model": "auth.permission", "pk": 118}, {"fields": {"codename": "change_manualenrollmentaudit", "name": "Can change manual enrollment audit", "content_type": 40}, "model": "auth.permission", "pk": 119}, {"fields": {"codename": "delete_manualenrollmentaudit", "name": "Can delete manual enrollment audit", "content_type": 40}, "model": "auth.permission", "pk": 120}, {"fields": {"codename": "add_courseenrollmentallowed", "name": "Can add course enrollment allowed", "content_type": 41}, "model": "auth.permission", "pk": 121}, {"fields": {"codename": "change_courseenrollmentallowed", "name": "Can change course enrollment allowed", "content_type": 41}, "model": "auth.permission", "pk": 122}, {"fields": {"codename": "delete_courseenrollmentallowed", "name": "Can delete course enrollment allowed", "content_type": 41}, "model": "auth.permission", "pk": 123}, {"fields": {"codename": "add_courseaccessrole", "name": "Can add course access role", "content_type": 42}, "model": "auth.permission", "pk": 124}, {"fields": {"codename": "change_courseaccessrole", "name": "Can change course access role", "content_type": 42}, "model": "auth.permission", "pk": 125}, {"fields": {"codename": "delete_courseaccessrole", "name": "Can delete course access role", "content_type": 42}, "model": "auth.permission", "pk": 126}, {"fields": {"codename": "add_dashboardconfiguration", "name": "Can add dashboard configuration", "content_type": 43}, "model": "auth.permission", "pk": 127}, {"fields": {"codename": "change_dashboardconfiguration", "name": "Can change dashboard configuration", "content_type": 43}, "model": "auth.permission", "pk": 128}, {"fields": {"codename": "delete_dashboardconfiguration", "name": "Can delete dashboard configuration", "content_type": 43}, "model": "auth.permission", "pk": 129}, {"fields": {"codename": "add_linkedinaddtoprofileconfiguration", "name": "Can add linked in add to profile configuration", "content_type": 44}, "model": "auth.permission", "pk": 130}, {"fields": {"codename": "change_linkedinaddtoprofileconfiguration", "name": "Can change linked in add to profile configuration", "content_type": 44}, "model": "auth.permission", "pk": 131}, {"fields": {"codename": "delete_linkedinaddtoprofileconfiguration", "name": "Can delete linked in add to profile configuration", "content_type": 44}, "model": "auth.permission", "pk": 132}, {"fields": {"codename": "add_entranceexamconfiguration", "name": "Can add entrance exam configuration", "content_type": 45}, "model": "auth.permission", "pk": 133}, {"fields": {"codename": "change_entranceexamconfiguration", "name": "Can change entrance exam configuration", "content_type": 45}, "model": "auth.permission", "pk": 134}, {"fields": {"codename": "delete_entranceexamconfiguration", "name": "Can delete entrance exam configuration", "content_type": 45}, "model": "auth.permission", "pk": 135}, {"fields": {"codename": "add_languageproficiency", "name": "Can add language proficiency", "content_type": 46}, "model": "auth.permission", "pk": 136}, {"fields": {"codename": "change_languageproficiency", "name": "Can change language proficiency", "content_type": 46}, "model": "auth.permission", "pk": 137}, {"fields": {"codename": "delete_languageproficiency", "name": "Can delete language proficiency", "content_type": 46}, "model": "auth.permission", "pk": 138}, {"fields": {"codename": "add_courseenrollmentattribute", "name": "Can add course enrollment attribute", "content_type": 47}, "model": "auth.permission", "pk": 139}, {"fields": {"codename": "change_courseenrollmentattribute", "name": "Can change course enrollment attribute", "content_type": 47}, "model": "auth.permission", "pk": 140}, {"fields": {"codename": "delete_courseenrollmentattribute", "name": "Can delete course enrollment attribute", "content_type": 47}, "model": "auth.permission", "pk": 141}, {"fields": {"codename": "add_enrollmentrefundconfiguration", "name": "Can add enrollment refund configuration", "content_type": 48}, "model": "auth.permission", "pk": 142}, {"fields": {"codename": "change_enrollmentrefundconfiguration", "name": "Can change enrollment refund configuration", "content_type": 48}, "model": "auth.permission", "pk": 143}, {"fields": {"codename": "delete_enrollmentrefundconfiguration", "name": "Can delete enrollment refund configuration", "content_type": 48}, "model": "auth.permission", "pk": 144}, {"fields": {"codename": "add_trackinglog", "name": "Can add tracking log", "content_type": 49}, "model": "auth.permission", "pk": 145}, {"fields": {"codename": "change_trackinglog", "name": "Can change tracking log", "content_type": 49}, "model": "auth.permission", "pk": 146}, {"fields": {"codename": "delete_trackinglog", "name": "Can delete tracking log", "content_type": 49}, "model": "auth.permission", "pk": 147}, {"fields": {"codename": "add_ratelimitconfiguration", "name": "Can add rate limit configuration", "content_type": 50}, "model": "auth.permission", "pk": 148}, {"fields": {"codename": "change_ratelimitconfiguration", "name": "Can change rate limit configuration", "content_type": 50}, "model": "auth.permission", "pk": 149}, {"fields": {"codename": "delete_ratelimitconfiguration", "name": "Can delete rate limit configuration", "content_type": 50}, "model": "auth.permission", "pk": 150}, {"fields": {"codename": "add_certificatewhitelist", "name": "Can add certificate whitelist", "content_type": 51}, "model": "auth.permission", "pk": 151}, {"fields": {"codename": "change_certificatewhitelist", "name": "Can change certificate whitelist", "content_type": 51}, "model": "auth.permission", "pk": 152}, {"fields": {"codename": "delete_certificatewhitelist", "name": "Can delete certificate whitelist", "content_type": 51}, "model": "auth.permission", "pk": 153}, {"fields": {"codename": "add_generatedcertificate", "name": "Can add generated certificate", "content_type": 52}, "model": "auth.permission", "pk": 154}, {"fields": {"codename": "change_generatedcertificate", "name": "Can change generated certificate", "content_type": 52}, "model": "auth.permission", "pk": 155}, {"fields": {"codename": "delete_generatedcertificate", "name": "Can delete generated certificate", "content_type": 52}, "model": "auth.permission", "pk": 156}, {"fields": {"codename": "add_certificategenerationhistory", "name": "Can add certificate generation history", "content_type": 53}, "model": "auth.permission", "pk": 157}, {"fields": {"codename": "change_certificategenerationhistory", "name": "Can change certificate generation history", "content_type": 53}, "model": "auth.permission", "pk": 158}, {"fields": {"codename": "delete_certificategenerationhistory", "name": "Can delete certificate generation history", "content_type": 53}, "model": "auth.permission", "pk": 159}, {"fields": {"codename": "add_certificateinvalidation", "name": "Can add certificate invalidation", "content_type": 54}, "model": "auth.permission", "pk": 160}, {"fields": {"codename": "change_certificateinvalidation", "name": "Can change certificate invalidation", "content_type": 54}, "model": "auth.permission", "pk": 161}, {"fields": {"codename": "delete_certificateinvalidation", "name": "Can delete certificate invalidation", "content_type": 54}, "model": "auth.permission", "pk": 162}, {"fields": {"codename": "add_examplecertificateset", "name": "Can add example certificate set", "content_type": 55}, "model": "auth.permission", "pk": 163}, {"fields": {"codename": "change_examplecertificateset", "name": "Can change example certificate set", "content_type": 55}, "model": "auth.permission", "pk": 164}, {"fields": {"codename": "delete_examplecertificateset", "name": "Can delete example certificate set", "content_type": 55}, "model": "auth.permission", "pk": 165}, {"fields": {"codename": "add_examplecertificate", "name": "Can add example certificate", "content_type": 56}, "model": "auth.permission", "pk": 166}, {"fields": {"codename": "change_examplecertificate", "name": "Can change example certificate", "content_type": 56}, "model": "auth.permission", "pk": 167}, {"fields": {"codename": "delete_examplecertificate", "name": "Can delete example certificate", "content_type": 56}, "model": "auth.permission", "pk": 168}, {"fields": {"codename": "add_certificategenerationcoursesetting", "name": "Can add certificate generation course setting", "content_type": 57}, "model": "auth.permission", "pk": 169}, {"fields": {"codename": "change_certificategenerationcoursesetting", "name": "Can change certificate generation course setting", "content_type": 57}, "model": "auth.permission", "pk": 170}, {"fields": {"codename": "delete_certificategenerationcoursesetting", "name": "Can delete certificate generation course setting", "content_type": 57}, "model": "auth.permission", "pk": 171}, {"fields": {"codename": "add_certificategenerationconfiguration", "name": "Can add certificate generation configuration", "content_type": 58}, "model": "auth.permission", "pk": 172}, {"fields": {"codename": "change_certificategenerationconfiguration", "name": "Can change certificate generation configuration", "content_type": 58}, "model": "auth.permission", "pk": 173}, {"fields": {"codename": "delete_certificategenerationconfiguration", "name": "Can delete certificate generation configuration", "content_type": 58}, "model": "auth.permission", "pk": 174}, {"fields": {"codename": "add_certificatehtmlviewconfiguration", "name": "Can add certificate html view configuration", "content_type": 59}, "model": "auth.permission", "pk": 175}, {"fields": {"codename": "change_certificatehtmlviewconfiguration", "name": "Can change certificate html view configuration", "content_type": 59}, "model": "auth.permission", "pk": 176}, {"fields": {"codename": "delete_certificatehtmlviewconfiguration", "name": "Can delete certificate html view configuration", "content_type": 59}, "model": "auth.permission", "pk": 177}, {"fields": {"codename": "add_badgeassertion", "name": "Can add badge assertion", "content_type": 60}, "model": "auth.permission", "pk": 178}, {"fields": {"codename": "change_badgeassertion", "name": "Can change badge assertion", "content_type": 60}, "model": "auth.permission", "pk": 179}, {"fields": {"codename": "delete_badgeassertion", "name": "Can delete badge assertion", "content_type": 60}, "model": "auth.permission", "pk": 180}, {"fields": {"codename": "add_badgeimageconfiguration", "name": "Can add badge image configuration", "content_type": 61}, "model": "auth.permission", "pk": 181}, {"fields": {"codename": "change_badgeimageconfiguration", "name": "Can change badge image configuration", "content_type": 61}, "model": "auth.permission", "pk": 182}, {"fields": {"codename": "delete_badgeimageconfiguration", "name": "Can delete badge image configuration", "content_type": 61}, "model": "auth.permission", "pk": 183}, {"fields": {"codename": "add_certificatetemplate", "name": "Can add certificate template", "content_type": 62}, "model": "auth.permission", "pk": 184}, {"fields": {"codename": "change_certificatetemplate", "name": "Can change certificate template", "content_type": 62}, "model": "auth.permission", "pk": 185}, {"fields": {"codename": "delete_certificatetemplate", "name": "Can delete certificate template", "content_type": 62}, "model": "auth.permission", "pk": 186}, {"fields": {"codename": "add_certificatetemplateasset", "name": "Can add certificate template asset", "content_type": 63}, "model": "auth.permission", "pk": 187}, {"fields": {"codename": "change_certificatetemplateasset", "name": "Can change certificate template asset", "content_type": 63}, "model": "auth.permission", "pk": 188}, {"fields": {"codename": "delete_certificatetemplateasset", "name": "Can delete certificate template asset", "content_type": 63}, "model": "auth.permission", "pk": 189}, {"fields": {"codename": "add_instructortask", "name": "Can add instructor task", "content_type": 64}, "model": "auth.permission", "pk": 190}, {"fields": {"codename": "change_instructortask", "name": "Can change instructor task", "content_type": 64}, "model": "auth.permission", "pk": 191}, {"fields": {"codename": "delete_instructortask", "name": "Can delete instructor task", "content_type": 64}, "model": "auth.permission", "pk": 192}, {"fields": {"codename": "add_courseusergroup", "name": "Can add course user group", "content_type": 65}, "model": "auth.permission", "pk": 193}, {"fields": {"codename": "change_courseusergroup", "name": "Can change course user group", "content_type": 65}, "model": "auth.permission", "pk": 194}, {"fields": {"codename": "delete_courseusergroup", "name": "Can delete course user group", "content_type": 65}, "model": "auth.permission", "pk": 195}, {"fields": {"codename": "add_cohortmembership", "name": "Can add cohort membership", "content_type": 66}, "model": "auth.permission", "pk": 196}, {"fields": {"codename": "change_cohortmembership", "name": "Can change cohort membership", "content_type": 66}, "model": "auth.permission", "pk": 197}, {"fields": {"codename": "delete_cohortmembership", "name": "Can delete cohort membership", "content_type": 66}, "model": "auth.permission", "pk": 198}, {"fields": {"codename": "add_courseusergrouppartitiongroup", "name": "Can add course user group partition group", "content_type": 67}, "model": "auth.permission", "pk": 199}, {"fields": {"codename": "change_courseusergrouppartitiongroup", "name": "Can change course user group partition group", "content_type": 67}, "model": "auth.permission", "pk": 200}, {"fields": {"codename": "delete_courseusergrouppartitiongroup", "name": "Can delete course user group partition group", "content_type": 67}, "model": "auth.permission", "pk": 201}, {"fields": {"codename": "add_coursecohortssettings", "name": "Can add course cohorts settings", "content_type": 68}, "model": "auth.permission", "pk": 202}, {"fields": {"codename": "change_coursecohortssettings", "name": "Can change course cohorts settings", "content_type": 68}, "model": "auth.permission", "pk": 203}, {"fields": {"codename": "delete_coursecohortssettings", "name": "Can delete course cohorts settings", "content_type": 68}, "model": "auth.permission", "pk": 204}, {"fields": {"codename": "add_coursecohort", "name": "Can add course cohort", "content_type": 69}, "model": "auth.permission", "pk": 205}, {"fields": {"codename": "change_coursecohort", "name": "Can change course cohort", "content_type": 69}, "model": "auth.permission", "pk": 206}, {"fields": {"codename": "delete_coursecohort", "name": "Can delete course cohort", "content_type": 69}, "model": "auth.permission", "pk": 207}, {"fields": {"codename": "add_courseemail", "name": "Can add course email", "content_type": 70}, "model": "auth.permission", "pk": 208}, {"fields": {"codename": "change_courseemail", "name": "Can change course email", "content_type": 70}, "model": "auth.permission", "pk": 209}, {"fields": {"codename": "delete_courseemail", "name": "Can delete course email", "content_type": 70}, "model": "auth.permission", "pk": 210}, {"fields": {"codename": "add_optout", "name": "Can add optout", "content_type": 71}, "model": "auth.permission", "pk": 211}, {"fields": {"codename": "change_optout", "name": "Can change optout", "content_type": 71}, "model": "auth.permission", "pk": 212}, {"fields": {"codename": "delete_optout", "name": "Can delete optout", "content_type": 71}, "model": "auth.permission", "pk": 213}, {"fields": {"codename": "add_courseemailtemplate", "name": "Can add course email template", "content_type": 72}, "model": "auth.permission", "pk": 214}, {"fields": {"codename": "change_courseemailtemplate", "name": "Can change course email template", "content_type": 72}, "model": "auth.permission", "pk": 215}, {"fields": {"codename": "delete_courseemailtemplate", "name": "Can delete course email template", "content_type": 72}, "model": "auth.permission", "pk": 216}, {"fields": {"codename": "add_courseauthorization", "name": "Can add course authorization", "content_type": 73}, "model": "auth.permission", "pk": 217}, {"fields": {"codename": "change_courseauthorization", "name": "Can change course authorization", "content_type": 73}, "model": "auth.permission", "pk": 218}, {"fields": {"codename": "delete_courseauthorization", "name": "Can delete course authorization", "content_type": 73}, "model": "auth.permission", "pk": 219}, {"fields": {"codename": "add_brandinginfoconfig", "name": "Can add branding info config", "content_type": 74}, "model": "auth.permission", "pk": 220}, {"fields": {"codename": "change_brandinginfoconfig", "name": "Can change branding info config", "content_type": 74}, "model": "auth.permission", "pk": 221}, {"fields": {"codename": "delete_brandinginfoconfig", "name": "Can delete branding info config", "content_type": 74}, "model": "auth.permission", "pk": 222}, {"fields": {"codename": "add_brandingapiconfig", "name": "Can add branding api config", "content_type": 75}, "model": "auth.permission", "pk": 223}, {"fields": {"codename": "change_brandingapiconfig", "name": "Can change branding api config", "content_type": 75}, "model": "auth.permission", "pk": 224}, {"fields": {"codename": "delete_brandingapiconfig", "name": "Can delete branding api config", "content_type": 75}, "model": "auth.permission", "pk": 225}, {"fields": {"codename": "add_externalauthmap", "name": "Can add external auth map", "content_type": 76}, "model": "auth.permission", "pk": 226}, {"fields": {"codename": "change_externalauthmap", "name": "Can change external auth map", "content_type": 76}, "model": "auth.permission", "pk": 227}, {"fields": {"codename": "delete_externalauthmap", "name": "Can delete external auth map", "content_type": 76}, "model": "auth.permission", "pk": 228}, {"fields": {"codename": "add_nonce", "name": "Can add nonce", "content_type": 77}, "model": "auth.permission", "pk": 229}, {"fields": {"codename": "change_nonce", "name": "Can change nonce", "content_type": 77}, "model": "auth.permission", "pk": 230}, {"fields": {"codename": "delete_nonce", "name": "Can delete nonce", "content_type": 77}, "model": "auth.permission", "pk": 231}, {"fields": {"codename": "add_association", "name": "Can add association", "content_type": 78}, "model": "auth.permission", "pk": 232}, {"fields": {"codename": "change_association", "name": "Can change association", "content_type": 78}, "model": "auth.permission", "pk": 233}, {"fields": {"codename": "delete_association", "name": "Can delete association", "content_type": 78}, "model": "auth.permission", "pk": 234}, {"fields": {"codename": "add_useropenid", "name": "Can add user open id", "content_type": 79}, "model": "auth.permission", "pk": 235}, {"fields": {"codename": "change_useropenid", "name": "Can change user open id", "content_type": 79}, "model": "auth.permission", "pk": 236}, {"fields": {"codename": "delete_useropenid", "name": "Can delete user open id", "content_type": 79}, "model": "auth.permission", "pk": 237}, {"fields": {"codename": "account_verified", "name": "The OpenID has been verified", "content_type": 79}, "model": "auth.permission", "pk": 238}, {"fields": {"codename": "add_client", "name": "Can add client", "content_type": 80}, "model": "auth.permission", "pk": 239}, {"fields": {"codename": "change_client", "name": "Can change client", "content_type": 80}, "model": "auth.permission", "pk": 240}, {"fields": {"codename": "delete_client", "name": "Can delete client", "content_type": 80}, "model": "auth.permission", "pk": 241}, {"fields": {"codename": "add_grant", "name": "Can add grant", "content_type": 81}, "model": "auth.permission", "pk": 242}, {"fields": {"codename": "change_grant", "name": "Can change grant", "content_type": 81}, "model": "auth.permission", "pk": 243}, {"fields": {"codename": "delete_grant", "name": "Can delete grant", "content_type": 81}, "model": "auth.permission", "pk": 244}, {"fields": {"codename": "add_accesstoken", "name": "Can add access token", "content_type": 82}, "model": "auth.permission", "pk": 245}, {"fields": {"codename": "change_accesstoken", "name": "Can change access token", "content_type": 82}, "model": "auth.permission", "pk": 246}, {"fields": {"codename": "delete_accesstoken", "name": "Can delete access token", "content_type": 82}, "model": "auth.permission", "pk": 247}, {"fields": {"codename": "add_refreshtoken", "name": "Can add refresh token", "content_type": 83}, "model": "auth.permission", "pk": 248}, {"fields": {"codename": "change_refreshtoken", "name": "Can change refresh token", "content_type": 83}, "model": "auth.permission", "pk": 249}, {"fields": {"codename": "delete_refreshtoken", "name": "Can delete refresh token", "content_type": 83}, "model": "auth.permission", "pk": 250}, {"fields": {"codename": "add_trustedclient", "name": "Can add trusted client", "content_type": 84}, "model": "auth.permission", "pk": 251}, {"fields": {"codename": "change_trustedclient", "name": "Can change trusted client", "content_type": 84}, "model": "auth.permission", "pk": 252}, {"fields": {"codename": "delete_trustedclient", "name": "Can delete trusted client", "content_type": 84}, "model": "auth.permission", "pk": 253}, {"fields": {"codename": "add_oauth2providerconfig", "name": "Can add Provider Configuration (OAuth)", "content_type": 85}, "model": "auth.permission", "pk": 254}, {"fields": {"codename": "change_oauth2providerconfig", "name": "Can change Provider Configuration (OAuth)", "content_type": 85}, "model": "auth.permission", "pk": 255}, {"fields": {"codename": "delete_oauth2providerconfig", "name": "Can delete Provider Configuration (OAuth)", "content_type": 85}, "model": "auth.permission", "pk": 256}, {"fields": {"codename": "add_samlproviderconfig", "name": "Can add Provider Configuration (SAML IdP)", "content_type": 86}, "model": "auth.permission", "pk": 257}, {"fields": {"codename": "change_samlproviderconfig", "name": "Can change Provider Configuration (SAML IdP)", "content_type": 86}, "model": "auth.permission", "pk": 258}, {"fields": {"codename": "delete_samlproviderconfig", "name": "Can delete Provider Configuration (SAML IdP)", "content_type": 86}, "model": "auth.permission", "pk": 259}, {"fields": {"codename": "add_samlconfiguration", "name": "Can add SAML Configuration", "content_type": 87}, "model": "auth.permission", "pk": 260}, {"fields": {"codename": "change_samlconfiguration", "name": "Can change SAML Configuration", "content_type": 87}, "model": "auth.permission", "pk": 261}, {"fields": {"codename": "delete_samlconfiguration", "name": "Can delete SAML Configuration", "content_type": 87}, "model": "auth.permission", "pk": 262}, {"fields": {"codename": "add_samlproviderdata", "name": "Can add SAML Provider Data", "content_type": 88}, "model": "auth.permission", "pk": 263}, {"fields": {"codename": "change_samlproviderdata", "name": "Can change SAML Provider Data", "content_type": 88}, "model": "auth.permission", "pk": 264}, {"fields": {"codename": "delete_samlproviderdata", "name": "Can delete SAML Provider Data", "content_type": 88}, "model": "auth.permission", "pk": 265}, {"fields": {"codename": "add_ltiproviderconfig", "name": "Can add Provider Configuration (LTI)", "content_type": 89}, "model": "auth.permission", "pk": 266}, {"fields": {"codename": "change_ltiproviderconfig", "name": "Can change Provider Configuration (LTI)", "content_type": 89}, "model": "auth.permission", "pk": 267}, {"fields": {"codename": "delete_ltiproviderconfig", "name": "Can delete Provider Configuration (LTI)", "content_type": 89}, "model": "auth.permission", "pk": 268}, {"fields": {"codename": "add_providerapipermissions", "name": "Can add Provider API Permission", "content_type": 90}, "model": "auth.permission", "pk": 269}, {"fields": {"codename": "change_providerapipermissions", "name": "Can change Provider API Permission", "content_type": 90}, "model": "auth.permission", "pk": 270}, {"fields": {"codename": "delete_providerapipermissions", "name": "Can delete Provider API Permission", "content_type": 90}, "model": "auth.permission", "pk": 271}, {"fields": {"codename": "add_nonce", "name": "Can add nonce", "content_type": 91}, "model": "auth.permission", "pk": 272}, {"fields": {"codename": "change_nonce", "name": "Can change nonce", "content_type": 91}, "model": "auth.permission", "pk": 273}, {"fields": {"codename": "delete_nonce", "name": "Can delete nonce", "content_type": 91}, "model": "auth.permission", "pk": 274}, {"fields": {"codename": "add_scope", "name": "Can add scope", "content_type": 92}, "model": "auth.permission", "pk": 275}, {"fields": {"codename": "change_scope", "name": "Can change scope", "content_type": 92}, "model": "auth.permission", "pk": 276}, {"fields": {"codename": "delete_scope", "name": "Can delete scope", "content_type": 92}, "model": "auth.permission", "pk": 277}, {"fields": {"codename": "add_resource", "name": "Can add resource", "content_type": 92}, "model": "auth.permission", "pk": 278}, {"fields": {"codename": "change_resource", "name": "Can change resource", "content_type": 92}, "model": "auth.permission", "pk": 279}, {"fields": {"codename": "delete_resource", "name": "Can delete resource", "content_type": 92}, "model": "auth.permission", "pk": 280}, {"fields": {"codename": "add_consumer", "name": "Can add consumer", "content_type": 93}, "model": "auth.permission", "pk": 281}, {"fields": {"codename": "change_consumer", "name": "Can change consumer", "content_type": 93}, "model": "auth.permission", "pk": 282}, {"fields": {"codename": "delete_consumer", "name": "Can delete consumer", "content_type": 93}, "model": "auth.permission", "pk": 283}, {"fields": {"codename": "add_token", "name": "Can add token", "content_type": 94}, "model": "auth.permission", "pk": 284}, {"fields": {"codename": "change_token", "name": "Can change token", "content_type": 94}, "model": "auth.permission", "pk": 285}, {"fields": {"codename": "delete_token", "name": "Can delete token", "content_type": 94}, "model": "auth.permission", "pk": 286}, {"fields": {"codename": "add_article", "name": "Can add article", "content_type": 96}, "model": "auth.permission", "pk": 287}, {"fields": {"codename": "change_article", "name": "Can change article", "content_type": 96}, "model": "auth.permission", "pk": 288}, {"fields": {"codename": "delete_article", "name": "Can delete article", "content_type": 96}, "model": "auth.permission", "pk": 289}, {"fields": {"codename": "moderate", "name": "Can edit all articles and lock/unlock/restore", "content_type": 96}, "model": "auth.permission", "pk": 290}, {"fields": {"codename": "assign", "name": "Can change ownership of any article", "content_type": 96}, "model": "auth.permission", "pk": 291}, {"fields": {"codename": "grant", "name": "Can assign permissions to other users", "content_type": 96}, "model": "auth.permission", "pk": 292}, {"fields": {"codename": "add_articleforobject", "name": "Can add Article for object", "content_type": 97}, "model": "auth.permission", "pk": 293}, {"fields": {"codename": "change_articleforobject", "name": "Can change Article for object", "content_type": 97}, "model": "auth.permission", "pk": 294}, {"fields": {"codename": "delete_articleforobject", "name": "Can delete Article for object", "content_type": 97}, "model": "auth.permission", "pk": 295}, {"fields": {"codename": "add_articlerevision", "name": "Can add article revision", "content_type": 98}, "model": "auth.permission", "pk": 296}, {"fields": {"codename": "change_articlerevision", "name": "Can change article revision", "content_type": 98}, "model": "auth.permission", "pk": 297}, {"fields": {"codename": "delete_articlerevision", "name": "Can delete article revision", "content_type": 98}, "model": "auth.permission", "pk": 298}, {"fields": {"codename": "add_urlpath", "name": "Can add URL path", "content_type": 99}, "model": "auth.permission", "pk": 299}, {"fields": {"codename": "change_urlpath", "name": "Can change URL path", "content_type": 99}, "model": "auth.permission", "pk": 300}, {"fields": {"codename": "delete_urlpath", "name": "Can delete URL path", "content_type": 99}, "model": "auth.permission", "pk": 301}, {"fields": {"codename": "add_articleplugin", "name": "Can add article plugin", "content_type": 100}, "model": "auth.permission", "pk": 302}, {"fields": {"codename": "change_articleplugin", "name": "Can change article plugin", "content_type": 100}, "model": "auth.permission", "pk": 303}, {"fields": {"codename": "delete_articleplugin", "name": "Can delete article plugin", "content_type": 100}, "model": "auth.permission", "pk": 304}, {"fields": {"codename": "add_reusableplugin", "name": "Can add reusable plugin", "content_type": 101}, "model": "auth.permission", "pk": 305}, {"fields": {"codename": "change_reusableplugin", "name": "Can change reusable plugin", "content_type": 101}, "model": "auth.permission", "pk": 306}, {"fields": {"codename": "delete_reusableplugin", "name": "Can delete reusable plugin", "content_type": 101}, "model": "auth.permission", "pk": 307}, {"fields": {"codename": "add_simpleplugin", "name": "Can add simple plugin", "content_type": 102}, "model": "auth.permission", "pk": 308}, {"fields": {"codename": "change_simpleplugin", "name": "Can change simple plugin", "content_type": 102}, "model": "auth.permission", "pk": 309}, {"fields": {"codename": "delete_simpleplugin", "name": "Can delete simple plugin", "content_type": 102}, "model": "auth.permission", "pk": 310}, {"fields": {"codename": "add_revisionplugin", "name": "Can add revision plugin", "content_type": 103}, "model": "auth.permission", "pk": 311}, {"fields": {"codename": "change_revisionplugin", "name": "Can change revision plugin", "content_type": 103}, "model": "auth.permission", "pk": 312}, {"fields": {"codename": "delete_revisionplugin", "name": "Can delete revision plugin", "content_type": 103}, "model": "auth.permission", "pk": 313}, {"fields": {"codename": "add_revisionpluginrevision", "name": "Can add revision plugin revision", "content_type": 104}, "model": "auth.permission", "pk": 314}, {"fields": {"codename": "change_revisionpluginrevision", "name": "Can change revision plugin revision", "content_type": 104}, "model": "auth.permission", "pk": 315}, {"fields": {"codename": "delete_revisionpluginrevision", "name": "Can delete revision plugin revision", "content_type": 104}, "model": "auth.permission", "pk": 316}, {"fields": {"codename": "add_image", "name": "Can add image", "content_type": 105}, "model": "auth.permission", "pk": 317}, {"fields": {"codename": "change_image", "name": "Can change image", "content_type": 105}, "model": "auth.permission", "pk": 318}, {"fields": {"codename": "delete_image", "name": "Can delete image", "content_type": 105}, "model": "auth.permission", "pk": 319}, {"fields": {"codename": "add_imagerevision", "name": "Can add image revision", "content_type": 106}, "model": "auth.permission", "pk": 320}, {"fields": {"codename": "change_imagerevision", "name": "Can change image revision", "content_type": 106}, "model": "auth.permission", "pk": 321}, {"fields": {"codename": "delete_imagerevision", "name": "Can delete image revision", "content_type": 106}, "model": "auth.permission", "pk": 322}, {"fields": {"codename": "add_attachment", "name": "Can add attachment", "content_type": 107}, "model": "auth.permission", "pk": 323}, {"fields": {"codename": "change_attachment", "name": "Can change attachment", "content_type": 107}, "model": "auth.permission", "pk": 324}, {"fields": {"codename": "delete_attachment", "name": "Can delete attachment", "content_type": 107}, "model": "auth.permission", "pk": 325}, {"fields": {"codename": "add_attachmentrevision", "name": "Can add attachment revision", "content_type": 108}, "model": "auth.permission", "pk": 326}, {"fields": {"codename": "change_attachmentrevision", "name": "Can change attachment revision", "content_type": 108}, "model": "auth.permission", "pk": 327}, {"fields": {"codename": "delete_attachmentrevision", "name": "Can delete attachment revision", "content_type": 108}, "model": "auth.permission", "pk": 328}, {"fields": {"codename": "add_notificationtype", "name": "Can add type", "content_type": 109}, "model": "auth.permission", "pk": 329}, {"fields": {"codename": "change_notificationtype", "name": "Can change type", "content_type": 109}, "model": "auth.permission", "pk": 330}, {"fields": {"codename": "delete_notificationtype", "name": "Can delete type", "content_type": 109}, "model": "auth.permission", "pk": 331}, {"fields": {"codename": "add_settings", "name": "Can add settings", "content_type": 110}, "model": "auth.permission", "pk": 332}, {"fields": {"codename": "change_settings", "name": "Can change settings", "content_type": 110}, "model": "auth.permission", "pk": 333}, {"fields": {"codename": "delete_settings", "name": "Can delete settings", "content_type": 110}, "model": "auth.permission", "pk": 334}, {"fields": {"codename": "add_subscription", "name": "Can add subscription", "content_type": 111}, "model": "auth.permission", "pk": 335}, {"fields": {"codename": "change_subscription", "name": "Can change subscription", "content_type": 111}, "model": "auth.permission", "pk": 336}, {"fields": {"codename": "delete_subscription", "name": "Can delete subscription", "content_type": 111}, "model": "auth.permission", "pk": 337}, {"fields": {"codename": "add_notification", "name": "Can add notification", "content_type": 112}, "model": "auth.permission", "pk": 338}, {"fields": {"codename": "change_notification", "name": "Can change notification", "content_type": 112}, "model": "auth.permission", "pk": 339}, {"fields": {"codename": "delete_notification", "name": "Can delete notification", "content_type": 112}, "model": "auth.permission", "pk": 340}, {"fields": {"codename": "add_logentry", "name": "Can add log entry", "content_type": 113}, "model": "auth.permission", "pk": 341}, {"fields": {"codename": "change_logentry", "name": "Can change log entry", "content_type": 113}, "model": "auth.permission", "pk": 342}, {"fields": {"codename": "delete_logentry", "name": "Can delete log entry", "content_type": 113}, "model": "auth.permission", "pk": 343}, {"fields": {"codename": "add_role", "name": "Can add role", "content_type": 114}, "model": "auth.permission", "pk": 344}, {"fields": {"codename": "change_role", "name": "Can change role", "content_type": 114}, "model": "auth.permission", "pk": 345}, {"fields": {"codename": "delete_role", "name": "Can delete role", "content_type": 114}, "model": "auth.permission", "pk": 346}, {"fields": {"codename": "add_permission", "name": "Can add permission", "content_type": 115}, "model": "auth.permission", "pk": 347}, {"fields": {"codename": "change_permission", "name": "Can change permission", "content_type": 115}, "model": "auth.permission", "pk": 348}, {"fields": {"codename": "delete_permission", "name": "Can delete permission", "content_type": 115}, "model": "auth.permission", "pk": 349}, {"fields": {"codename": "add_note", "name": "Can add note", "content_type": 116}, "model": "auth.permission", "pk": 350}, {"fields": {"codename": "change_note", "name": "Can change note", "content_type": 116}, "model": "auth.permission", "pk": 351}, {"fields": {"codename": "delete_note", "name": "Can delete note", "content_type": 116}, "model": "auth.permission", "pk": 352}, {"fields": {"codename": "add_splashconfig", "name": "Can add splash config", "content_type": 117}, "model": "auth.permission", "pk": 353}, {"fields": {"codename": "change_splashconfig", "name": "Can change splash config", "content_type": 117}, "model": "auth.permission", "pk": 354}, {"fields": {"codename": "delete_splashconfig", "name": "Can delete splash config", "content_type": 117}, "model": "auth.permission", "pk": 355}, {"fields": {"codename": "add_userpreference", "name": "Can add user preference", "content_type": 118}, "model": "auth.permission", "pk": 356}, {"fields": {"codename": "change_userpreference", "name": "Can change user preference", "content_type": 118}, "model": "auth.permission", "pk": 357}, {"fields": {"codename": "delete_userpreference", "name": "Can delete user preference", "content_type": 118}, "model": "auth.permission", "pk": 358}, {"fields": {"codename": "add_usercoursetag", "name": "Can add user course tag", "content_type": 119}, "model": "auth.permission", "pk": 359}, {"fields": {"codename": "change_usercoursetag", "name": "Can change user course tag", "content_type": 119}, "model": "auth.permission", "pk": 360}, {"fields": {"codename": "delete_usercoursetag", "name": "Can delete user course tag", "content_type": 119}, "model": "auth.permission", "pk": 361}, {"fields": {"codename": "add_userorgtag", "name": "Can add user org tag", "content_type": 120}, "model": "auth.permission", "pk": 362}, {"fields": {"codename": "change_userorgtag", "name": "Can change user org tag", "content_type": 120}, "model": "auth.permission", "pk": 363}, {"fields": {"codename": "delete_userorgtag", "name": "Can delete user org tag", "content_type": 120}, "model": "auth.permission", "pk": 364}, {"fields": {"codename": "add_order", "name": "Can add order", "content_type": 121}, "model": "auth.permission", "pk": 365}, {"fields": {"codename": "change_order", "name": "Can change order", "content_type": 121}, "model": "auth.permission", "pk": 366}, {"fields": {"codename": "delete_order", "name": "Can delete order", "content_type": 121}, "model": "auth.permission", "pk": 367}, {"fields": {"codename": "add_orderitem", "name": "Can add order item", "content_type": 122}, "model": "auth.permission", "pk": 368}, {"fields": {"codename": "change_orderitem", "name": "Can change order item", "content_type": 122}, "model": "auth.permission", "pk": 369}, {"fields": {"codename": "delete_orderitem", "name": "Can delete order item", "content_type": 122}, "model": "auth.permission", "pk": 370}, {"fields": {"codename": "add_invoice", "name": "Can add invoice", "content_type": 123}, "model": "auth.permission", "pk": 371}, {"fields": {"codename": "change_invoice", "name": "Can change invoice", "content_type": 123}, "model": "auth.permission", "pk": 372}, {"fields": {"codename": "delete_invoice", "name": "Can delete invoice", "content_type": 123}, "model": "auth.permission", "pk": 373}, {"fields": {"codename": "add_invoicetransaction", "name": "Can add invoice transaction", "content_type": 124}, "model": "auth.permission", "pk": 374}, {"fields": {"codename": "change_invoicetransaction", "name": "Can change invoice transaction", "content_type": 124}, "model": "auth.permission", "pk": 375}, {"fields": {"codename": "delete_invoicetransaction", "name": "Can delete invoice transaction", "content_type": 124}, "model": "auth.permission", "pk": 376}, {"fields": {"codename": "add_invoiceitem", "name": "Can add invoice item", "content_type": 125}, "model": "auth.permission", "pk": 377}, {"fields": {"codename": "change_invoiceitem", "name": "Can change invoice item", "content_type": 125}, "model": "auth.permission", "pk": 378}, {"fields": {"codename": "delete_invoiceitem", "name": "Can delete invoice item", "content_type": 125}, "model": "auth.permission", "pk": 379}, {"fields": {"codename": "add_courseregistrationcodeinvoiceitem", "name": "Can add course registration code invoice item", "content_type": 126}, "model": "auth.permission", "pk": 380}, {"fields": {"codename": "change_courseregistrationcodeinvoiceitem", "name": "Can change course registration code invoice item", "content_type": 126}, "model": "auth.permission", "pk": 381}, {"fields": {"codename": "delete_courseregistrationcodeinvoiceitem", "name": "Can delete course registration code invoice item", "content_type": 126}, "model": "auth.permission", "pk": 382}, {"fields": {"codename": "add_invoicehistory", "name": "Can add invoice history", "content_type": 127}, "model": "auth.permission", "pk": 383}, {"fields": {"codename": "change_invoicehistory", "name": "Can change invoice history", "content_type": 127}, "model": "auth.permission", "pk": 384}, {"fields": {"codename": "delete_invoicehistory", "name": "Can delete invoice history", "content_type": 127}, "model": "auth.permission", "pk": 385}, {"fields": {"codename": "add_courseregistrationcode", "name": "Can add course registration code", "content_type": 128}, "model": "auth.permission", "pk": 386}, {"fields": {"codename": "change_courseregistrationcode", "name": "Can change course registration code", "content_type": 128}, "model": "auth.permission", "pk": 387}, {"fields": {"codename": "delete_courseregistrationcode", "name": "Can delete course registration code", "content_type": 128}, "model": "auth.permission", "pk": 388}, {"fields": {"codename": "add_registrationcoderedemption", "name": "Can add registration code redemption", "content_type": 129}, "model": "auth.permission", "pk": 389}, {"fields": {"codename": "change_registrationcoderedemption", "name": "Can change registration code redemption", "content_type": 129}, "model": "auth.permission", "pk": 390}, {"fields": {"codename": "delete_registrationcoderedemption", "name": "Can delete registration code redemption", "content_type": 129}, "model": "auth.permission", "pk": 391}, {"fields": {"codename": "add_coupon", "name": "Can add coupon", "content_type": 130}, "model": "auth.permission", "pk": 392}, {"fields": {"codename": "change_coupon", "name": "Can change coupon", "content_type": 130}, "model": "auth.permission", "pk": 393}, {"fields": {"codename": "delete_coupon", "name": "Can delete coupon", "content_type": 130}, "model": "auth.permission", "pk": 394}, {"fields": {"codename": "add_couponredemption", "name": "Can add coupon redemption", "content_type": 131}, "model": "auth.permission", "pk": 395}, {"fields": {"codename": "change_couponredemption", "name": "Can change coupon redemption", "content_type": 131}, "model": "auth.permission", "pk": 396}, {"fields": {"codename": "delete_couponredemption", "name": "Can delete coupon redemption", "content_type": 131}, "model": "auth.permission", "pk": 397}, {"fields": {"codename": "add_paidcourseregistration", "name": "Can add paid course registration", "content_type": 132}, "model": "auth.permission", "pk": 398}, {"fields": {"codename": "change_paidcourseregistration", "name": "Can change paid course registration", "content_type": 132}, "model": "auth.permission", "pk": 399}, {"fields": {"codename": "delete_paidcourseregistration", "name": "Can delete paid course registration", "content_type": 132}, "model": "auth.permission", "pk": 400}, {"fields": {"codename": "add_courseregcodeitem", "name": "Can add course reg code item", "content_type": 133}, "model": "auth.permission", "pk": 401}, {"fields": {"codename": "change_courseregcodeitem", "name": "Can change course reg code item", "content_type": 133}, "model": "auth.permission", "pk": 402}, {"fields": {"codename": "delete_courseregcodeitem", "name": "Can delete course reg code item", "content_type": 133}, "model": "auth.permission", "pk": 403}, {"fields": {"codename": "add_courseregcodeitemannotation", "name": "Can add course reg code item annotation", "content_type": 134}, "model": "auth.permission", "pk": 404}, {"fields": {"codename": "change_courseregcodeitemannotation", "name": "Can change course reg code item annotation", "content_type": 134}, "model": "auth.permission", "pk": 405}, {"fields": {"codename": "delete_courseregcodeitemannotation", "name": "Can delete course reg code item annotation", "content_type": 134}, "model": "auth.permission", "pk": 406}, {"fields": {"codename": "add_paidcourseregistrationannotation", "name": "Can add paid course registration annotation", "content_type": 135}, "model": "auth.permission", "pk": 407}, {"fields": {"codename": "change_paidcourseregistrationannotation", "name": "Can change paid course registration annotation", "content_type": 135}, "model": "auth.permission", "pk": 408}, {"fields": {"codename": "delete_paidcourseregistrationannotation", "name": "Can delete paid course registration annotation", "content_type": 135}, "model": "auth.permission", "pk": 409}, {"fields": {"codename": "add_certificateitem", "name": "Can add certificate item", "content_type": 136}, "model": "auth.permission", "pk": 410}, {"fields": {"codename": "change_certificateitem", "name": "Can change certificate item", "content_type": 136}, "model": "auth.permission", "pk": 411}, {"fields": {"codename": "delete_certificateitem", "name": "Can delete certificate item", "content_type": 136}, "model": "auth.permission", "pk": 412}, {"fields": {"codename": "add_donationconfiguration", "name": "Can add donation configuration", "content_type": 137}, "model": "auth.permission", "pk": 413}, {"fields": {"codename": "change_donationconfiguration", "name": "Can change donation configuration", "content_type": 137}, "model": "auth.permission", "pk": 414}, {"fields": {"codename": "delete_donationconfiguration", "name": "Can delete donation configuration", "content_type": 137}, "model": "auth.permission", "pk": 415}, {"fields": {"codename": "add_donation", "name": "Can add donation", "content_type": 138}, "model": "auth.permission", "pk": 416}, {"fields": {"codename": "change_donation", "name": "Can change donation", "content_type": 138}, "model": "auth.permission", "pk": 417}, {"fields": {"codename": "delete_donation", "name": "Can delete donation", "content_type": 138}, "model": "auth.permission", "pk": 418}, {"fields": {"codename": "add_coursemode", "name": "Can add course mode", "content_type": 139}, "model": "auth.permission", "pk": 419}, {"fields": {"codename": "change_coursemode", "name": "Can change course mode", "content_type": 139}, "model": "auth.permission", "pk": 420}, {"fields": {"codename": "delete_coursemode", "name": "Can delete course mode", "content_type": 139}, "model": "auth.permission", "pk": 421}, {"fields": {"codename": "add_coursemodesarchive", "name": "Can add course modes archive", "content_type": 140}, "model": "auth.permission", "pk": 422}, {"fields": {"codename": "change_coursemodesarchive", "name": "Can change course modes archive", "content_type": 140}, "model": "auth.permission", "pk": 423}, {"fields": {"codename": "delete_coursemodesarchive", "name": "Can delete course modes archive", "content_type": 140}, "model": "auth.permission", "pk": 424}, {"fields": {"codename": "add_coursemodeexpirationconfig", "name": "Can add course mode expiration config", "content_type": 141}, "model": "auth.permission", "pk": 425}, {"fields": {"codename": "change_coursemodeexpirationconfig", "name": "Can change course mode expiration config", "content_type": 141}, "model": "auth.permission", "pk": 426}, {"fields": {"codename": "delete_coursemodeexpirationconfig", "name": "Can delete course mode expiration config", "content_type": 141}, "model": "auth.permission", "pk": 427}, {"fields": {"codename": "add_softwaresecurephotoverification", "name": "Can add software secure photo verification", "content_type": 142}, "model": "auth.permission", "pk": 428}, {"fields": {"codename": "change_softwaresecurephotoverification", "name": "Can change software secure photo verification", "content_type": 142}, "model": "auth.permission", "pk": 429}, {"fields": {"codename": "delete_softwaresecurephotoverification", "name": "Can delete software secure photo verification", "content_type": 142}, "model": "auth.permission", "pk": 430}, {"fields": {"codename": "add_historicalverificationdeadline", "name": "Can add historical verification deadline", "content_type": 143}, "model": "auth.permission", "pk": 431}, {"fields": {"codename": "change_historicalverificationdeadline", "name": "Can change historical verification deadline", "content_type": 143}, "model": "auth.permission", "pk": 432}, {"fields": {"codename": "delete_historicalverificationdeadline", "name": "Can delete historical verification deadline", "content_type": 143}, "model": "auth.permission", "pk": 433}, {"fields": {"codename": "add_verificationdeadline", "name": "Can add verification deadline", "content_type": 144}, "model": "auth.permission", "pk": 434}, {"fields": {"codename": "change_verificationdeadline", "name": "Can change verification deadline", "content_type": 144}, "model": "auth.permission", "pk": 435}, {"fields": {"codename": "delete_verificationdeadline", "name": "Can delete verification deadline", "content_type": 144}, "model": "auth.permission", "pk": 436}, {"fields": {"codename": "add_verificationcheckpoint", "name": "Can add verification checkpoint", "content_type": 145}, "model": "auth.permission", "pk": 437}, {"fields": {"codename": "change_verificationcheckpoint", "name": "Can change verification checkpoint", "content_type": 145}, "model": "auth.permission", "pk": 438}, {"fields": {"codename": "delete_verificationcheckpoint", "name": "Can delete verification checkpoint", "content_type": 145}, "model": "auth.permission", "pk": 439}, {"fields": {"codename": "add_verificationstatus", "name": "Can add Verification Status", "content_type": 146}, "model": "auth.permission", "pk": 440}, {"fields": {"codename": "change_verificationstatus", "name": "Can change Verification Status", "content_type": 146}, "model": "auth.permission", "pk": 441}, {"fields": {"codename": "delete_verificationstatus", "name": "Can delete Verification Status", "content_type": 146}, "model": "auth.permission", "pk": 442}, {"fields": {"codename": "add_incoursereverificationconfiguration", "name": "Can add in course reverification configuration", "content_type": 147}, "model": "auth.permission", "pk": 443}, {"fields": {"codename": "change_incoursereverificationconfiguration", "name": "Can change in course reverification configuration", "content_type": 147}, "model": "auth.permission", "pk": 444}, {"fields": {"codename": "delete_incoursereverificationconfiguration", "name": "Can delete in course reverification configuration", "content_type": 147}, "model": "auth.permission", "pk": 445}, {"fields": {"codename": "add_icrvstatusemailsconfiguration", "name": "Can add icrv status emails configuration", "content_type": 148}, "model": "auth.permission", "pk": 446}, {"fields": {"codename": "change_icrvstatusemailsconfiguration", "name": "Can change icrv status emails configuration", "content_type": 148}, "model": "auth.permission", "pk": 447}, {"fields": {"codename": "delete_icrvstatusemailsconfiguration", "name": "Can delete icrv status emails configuration", "content_type": 148}, "model": "auth.permission", "pk": 448}, {"fields": {"codename": "add_skippedreverification", "name": "Can add skipped reverification", "content_type": 149}, "model": "auth.permission", "pk": 449}, {"fields": {"codename": "change_skippedreverification", "name": "Can change skipped reverification", "content_type": 149}, "model": "auth.permission", "pk": 450}, {"fields": {"codename": "delete_skippedreverification", "name": "Can delete skipped reverification", "content_type": 149}, "model": "auth.permission", "pk": 451}, {"fields": {"codename": "add_darklangconfig", "name": "Can add dark lang config", "content_type": 150}, "model": "auth.permission", "pk": 452}, {"fields": {"codename": "change_darklangconfig", "name": "Can change dark lang config", "content_type": 150}, "model": "auth.permission", "pk": 453}, {"fields": {"codename": "delete_darklangconfig", "name": "Can delete dark lang config", "content_type": 150}, "model": "auth.permission", "pk": 454}, {"fields": {"codename": "add_microsite", "name": "Can add microsite", "content_type": 151}, "model": "auth.permission", "pk": 455}, {"fields": {"codename": "change_microsite", "name": "Can change microsite", "content_type": 151}, "model": "auth.permission", "pk": 456}, {"fields": {"codename": "delete_microsite", "name": "Can delete microsite", "content_type": 151}, "model": "auth.permission", "pk": 457}, {"fields": {"codename": "add_micrositehistory", "name": "Can add microsite history", "content_type": 152}, "model": "auth.permission", "pk": 458}, {"fields": {"codename": "change_micrositehistory", "name": "Can change microsite history", "content_type": 152}, "model": "auth.permission", "pk": 459}, {"fields": {"codename": "delete_micrositehistory", "name": "Can delete microsite history", "content_type": 152}, "model": "auth.permission", "pk": 460}, {"fields": {"codename": "add_historicalmicrositeorganizationmapping", "name": "Can add historical microsite organization mapping", "content_type": 153}, "model": "auth.permission", "pk": 461}, {"fields": {"codename": "change_historicalmicrositeorganizationmapping", "name": "Can change historical microsite organization mapping", "content_type": 153}, "model": "auth.permission", "pk": 462}, {"fields": {"codename": "delete_historicalmicrositeorganizationmapping", "name": "Can delete historical microsite organization mapping", "content_type": 153}, "model": "auth.permission", "pk": 463}, {"fields": {"codename": "add_micrositeorganizationmapping", "name": "Can add microsite organization mapping", "content_type": 154}, "model": "auth.permission", "pk": 464}, {"fields": {"codename": "change_micrositeorganizationmapping", "name": "Can change microsite organization mapping", "content_type": 154}, "model": "auth.permission", "pk": 465}, {"fields": {"codename": "delete_micrositeorganizationmapping", "name": "Can delete microsite organization mapping", "content_type": 154}, "model": "auth.permission", "pk": 466}, {"fields": {"codename": "add_historicalmicrositetemplate", "name": "Can add historical microsite template", "content_type": 155}, "model": "auth.permission", "pk": 467}, {"fields": {"codename": "change_historicalmicrositetemplate", "name": "Can change historical microsite template", "content_type": 155}, "model": "auth.permission", "pk": 468}, {"fields": {"codename": "delete_historicalmicrositetemplate", "name": "Can delete historical microsite template", "content_type": 155}, "model": "auth.permission", "pk": 469}, {"fields": {"codename": "add_micrositetemplate", "name": "Can add microsite template", "content_type": 156}, "model": "auth.permission", "pk": 470}, {"fields": {"codename": "change_micrositetemplate", "name": "Can change microsite template", "content_type": 156}, "model": "auth.permission", "pk": 471}, {"fields": {"codename": "delete_micrositetemplate", "name": "Can delete microsite template", "content_type": 156}, "model": "auth.permission", "pk": 472}, {"fields": {"codename": "add_whitelistedrssurl", "name": "Can add whitelisted rss url", "content_type": 157}, "model": "auth.permission", "pk": 473}, {"fields": {"codename": "change_whitelistedrssurl", "name": "Can change whitelisted rss url", "content_type": 157}, "model": "auth.permission", "pk": 474}, {"fields": {"codename": "delete_whitelistedrssurl", "name": "Can delete whitelisted rss url", "content_type": 157}, "model": "auth.permission", "pk": 475}, {"fields": {"codename": "add_embargoedcourse", "name": "Can add embargoed course", "content_type": 158}, "model": "auth.permission", "pk": 476}, {"fields": {"codename": "change_embargoedcourse", "name": "Can change embargoed course", "content_type": 158}, "model": "auth.permission", "pk": 477}, {"fields": {"codename": "delete_embargoedcourse", "name": "Can delete embargoed course", "content_type": 158}, "model": "auth.permission", "pk": 478}, {"fields": {"codename": "add_embargoedstate", "name": "Can add embargoed state", "content_type": 159}, "model": "auth.permission", "pk": 479}, {"fields": {"codename": "change_embargoedstate", "name": "Can change embargoed state", "content_type": 159}, "model": "auth.permission", "pk": 480}, {"fields": {"codename": "delete_embargoedstate", "name": "Can delete embargoed state", "content_type": 159}, "model": "auth.permission", "pk": 481}, {"fields": {"codename": "add_restrictedcourse", "name": "Can add restricted course", "content_type": 160}, "model": "auth.permission", "pk": 482}, {"fields": {"codename": "change_restrictedcourse", "name": "Can change restricted course", "content_type": 160}, "model": "auth.permission", "pk": 483}, {"fields": {"codename": "delete_restrictedcourse", "name": "Can delete restricted course", "content_type": 160}, "model": "auth.permission", "pk": 484}, {"fields": {"codename": "add_country", "name": "Can add country", "content_type": 161}, "model": "auth.permission", "pk": 485}, {"fields": {"codename": "change_country", "name": "Can change country", "content_type": 161}, "model": "auth.permission", "pk": 486}, {"fields": {"codename": "delete_country", "name": "Can delete country", "content_type": 161}, "model": "auth.permission", "pk": 487}, {"fields": {"codename": "add_countryaccessrule", "name": "Can add country access rule", "content_type": 162}, "model": "auth.permission", "pk": 488}, {"fields": {"codename": "change_countryaccessrule", "name": "Can change country access rule", "content_type": 162}, "model": "auth.permission", "pk": 489}, {"fields": {"codename": "delete_countryaccessrule", "name": "Can delete country access rule", "content_type": 162}, "model": "auth.permission", "pk": 490}, {"fields": {"codename": "add_courseaccessrulehistory", "name": "Can add course access rule history", "content_type": 163}, "model": "auth.permission", "pk": 491}, {"fields": {"codename": "change_courseaccessrulehistory", "name": "Can change course access rule history", "content_type": 163}, "model": "auth.permission", "pk": 492}, {"fields": {"codename": "delete_courseaccessrulehistory", "name": "Can delete course access rule history", "content_type": 163}, "model": "auth.permission", "pk": 493}, {"fields": {"codename": "add_ipfilter", "name": "Can add ip filter", "content_type": 164}, "model": "auth.permission", "pk": 494}, {"fields": {"codename": "change_ipfilter", "name": "Can change ip filter", "content_type": 164}, "model": "auth.permission", "pk": 495}, {"fields": {"codename": "delete_ipfilter", "name": "Can delete ip filter", "content_type": 164}, "model": "auth.permission", "pk": 496}, {"fields": {"codename": "add_coursererunstate", "name": "Can add course rerun state", "content_type": 165}, "model": "auth.permission", "pk": 497}, {"fields": {"codename": "change_coursererunstate", "name": "Can change course rerun state", "content_type": 165}, "model": "auth.permission", "pk": 498}, {"fields": {"codename": "delete_coursererunstate", "name": "Can delete course rerun state", "content_type": 165}, "model": "auth.permission", "pk": 499}, {"fields": {"codename": "add_mobileapiconfig", "name": "Can add mobile api config", "content_type": 166}, "model": "auth.permission", "pk": 500}, {"fields": {"codename": "change_mobileapiconfig", "name": "Can change mobile api config", "content_type": 166}, "model": "auth.permission", "pk": 501}, {"fields": {"codename": "delete_mobileapiconfig", "name": "Can delete mobile api config", "content_type": 166}, "model": "auth.permission", "pk": 502}, {"fields": {"codename": "add_usersocialauth", "name": "Can add user social auth", "content_type": 167}, "model": "auth.permission", "pk": 503}, {"fields": {"codename": "change_usersocialauth", "name": "Can change user social auth", "content_type": 167}, "model": "auth.permission", "pk": 504}, {"fields": {"codename": "delete_usersocialauth", "name": "Can delete user social auth", "content_type": 167}, "model": "auth.permission", "pk": 505}, {"fields": {"codename": "add_nonce", "name": "Can add nonce", "content_type": 168}, "model": "auth.permission", "pk": 506}, {"fields": {"codename": "change_nonce", "name": "Can change nonce", "content_type": 168}, "model": "auth.permission", "pk": 507}, {"fields": {"codename": "delete_nonce", "name": "Can delete nonce", "content_type": 168}, "model": "auth.permission", "pk": 508}, {"fields": {"codename": "add_association", "name": "Can add association", "content_type": 169}, "model": "auth.permission", "pk": 509}, {"fields": {"codename": "change_association", "name": "Can change association", "content_type": 169}, "model": "auth.permission", "pk": 510}, {"fields": {"codename": "delete_association", "name": "Can delete association", "content_type": 169}, "model": "auth.permission", "pk": 511}, {"fields": {"codename": "add_code", "name": "Can add code", "content_type": 170}, "model": "auth.permission", "pk": 512}, {"fields": {"codename": "change_code", "name": "Can change code", "content_type": 170}, "model": "auth.permission", "pk": 513}, {"fields": {"codename": "delete_code", "name": "Can delete code", "content_type": 170}, "model": "auth.permission", "pk": 514}, {"fields": {"codename": "add_surveyform", "name": "Can add survey form", "content_type": 171}, "model": "auth.permission", "pk": 515}, {"fields": {"codename": "change_surveyform", "name": "Can change survey form", "content_type": 171}, "model": "auth.permission", "pk": 516}, {"fields": {"codename": "delete_surveyform", "name": "Can delete survey form", "content_type": 171}, "model": "auth.permission", "pk": 517}, {"fields": {"codename": "add_surveyanswer", "name": "Can add survey answer", "content_type": 172}, "model": "auth.permission", "pk": 518}, {"fields": {"codename": "change_surveyanswer", "name": "Can change survey answer", "content_type": 172}, "model": "auth.permission", "pk": 519}, {"fields": {"codename": "delete_surveyanswer", "name": "Can delete survey answer", "content_type": 172}, "model": "auth.permission", "pk": 520}, {"fields": {"codename": "add_xblockasidesconfig", "name": "Can add x block asides config", "content_type": 173}, "model": "auth.permission", "pk": 521}, {"fields": {"codename": "change_xblockasidesconfig", "name": "Can change x block asides config", "content_type": 173}, "model": "auth.permission", "pk": 522}, {"fields": {"codename": "delete_xblockasidesconfig", "name": "Can delete x block asides config", "content_type": 173}, "model": "auth.permission", "pk": 523}, {"fields": {"codename": "add_courseoverview", "name": "Can add course overview", "content_type": 174}, "model": "auth.permission", "pk": 524}, {"fields": {"codename": "change_courseoverview", "name": "Can change course overview", "content_type": 174}, "model": "auth.permission", "pk": 525}, {"fields": {"codename": "delete_courseoverview", "name": "Can delete course overview", "content_type": 174}, "model": "auth.permission", "pk": 526}, {"fields": {"codename": "add_courseoverviewtab", "name": "Can add course overview tab", "content_type": 175}, "model": "auth.permission", "pk": 527}, {"fields": {"codename": "change_courseoverviewtab", "name": "Can change course overview tab", "content_type": 175}, "model": "auth.permission", "pk": 528}, {"fields": {"codename": "delete_courseoverviewtab", "name": "Can delete course overview tab", "content_type": 175}, "model": "auth.permission", "pk": 529}, {"fields": {"codename": "add_courseoverviewimageset", "name": "Can add course overview image set", "content_type": 176}, "model": "auth.permission", "pk": 530}, {"fields": {"codename": "change_courseoverviewimageset", "name": "Can change course overview image set", "content_type": 176}, "model": "auth.permission", "pk": 531}, {"fields": {"codename": "delete_courseoverviewimageset", "name": "Can delete course overview image set", "content_type": 176}, "model": "auth.permission", "pk": 532}, {"fields": {"codename": "add_courseoverviewimageconfig", "name": "Can add course overview image config", "content_type": 177}, "model": "auth.permission", "pk": 533}, {"fields": {"codename": "change_courseoverviewimageconfig", "name": "Can change course overview image config", "content_type": 177}, "model": "auth.permission", "pk": 534}, {"fields": {"codename": "delete_courseoverviewimageconfig", "name": "Can delete course overview image config", "content_type": 177}, "model": "auth.permission", "pk": 535}, {"fields": {"codename": "add_coursestructure", "name": "Can add course structure", "content_type": 178}, "model": "auth.permission", "pk": 536}, {"fields": {"codename": "change_coursestructure", "name": "Can change course structure", "content_type": 178}, "model": "auth.permission", "pk": 537}, {"fields": {"codename": "delete_coursestructure", "name": "Can delete course structure", "content_type": 178}, "model": "auth.permission", "pk": 538}, {"fields": {"codename": "add_corsmodel", "name": "Can add cors model", "content_type": 179}, "model": "auth.permission", "pk": 539}, {"fields": {"codename": "change_corsmodel", "name": "Can change cors model", "content_type": 179}, "model": "auth.permission", "pk": 540}, {"fields": {"codename": "delete_corsmodel", "name": "Can delete cors model", "content_type": 179}, "model": "auth.permission", "pk": 541}, {"fields": {"codename": "add_xdomainproxyconfiguration", "name": "Can add x domain proxy configuration", "content_type": 180}, "model": "auth.permission", "pk": 542}, {"fields": {"codename": "change_xdomainproxyconfiguration", "name": "Can change x domain proxy configuration", "content_type": 180}, "model": "auth.permission", "pk": 543}, {"fields": {"codename": "delete_xdomainproxyconfiguration", "name": "Can delete x domain proxy configuration", "content_type": 180}, "model": "auth.permission", "pk": 544}, {"fields": {"codename": "add_commerceconfiguration", "name": "Can add commerce configuration", "content_type": 181}, "model": "auth.permission", "pk": 545}, {"fields": {"codename": "change_commerceconfiguration", "name": "Can change commerce configuration", "content_type": 181}, "model": "auth.permission", "pk": 546}, {"fields": {"codename": "delete_commerceconfiguration", "name": "Can delete commerce configuration", "content_type": 181}, "model": "auth.permission", "pk": 547}, {"fields": {"codename": "add_creditprovider", "name": "Can add credit provider", "content_type": 182}, "model": "auth.permission", "pk": 548}, {"fields": {"codename": "change_creditprovider", "name": "Can change credit provider", "content_type": 182}, "model": "auth.permission", "pk": 549}, {"fields": {"codename": "delete_creditprovider", "name": "Can delete credit provider", "content_type": 182}, "model": "auth.permission", "pk": 550}, {"fields": {"codename": "add_creditcourse", "name": "Can add credit course", "content_type": 183}, "model": "auth.permission", "pk": 551}, {"fields": {"codename": "change_creditcourse", "name": "Can change credit course", "content_type": 183}, "model": "auth.permission", "pk": 552}, {"fields": {"codename": "delete_creditcourse", "name": "Can delete credit course", "content_type": 183}, "model": "auth.permission", "pk": 553}, {"fields": {"codename": "add_creditrequirement", "name": "Can add credit requirement", "content_type": 184}, "model": "auth.permission", "pk": 554}, {"fields": {"codename": "change_creditrequirement", "name": "Can change credit requirement", "content_type": 184}, "model": "auth.permission", "pk": 555}, {"fields": {"codename": "delete_creditrequirement", "name": "Can delete credit requirement", "content_type": 184}, "model": "auth.permission", "pk": 556}, {"fields": {"codename": "add_historicalcreditrequirementstatus", "name": "Can add historical credit requirement status", "content_type": 185}, "model": "auth.permission", "pk": 557}, {"fields": {"codename": "change_historicalcreditrequirementstatus", "name": "Can change historical credit requirement status", "content_type": 185}, "model": "auth.permission", "pk": 558}, {"fields": {"codename": "delete_historicalcreditrequirementstatus", "name": "Can delete historical credit requirement status", "content_type": 185}, "model": "auth.permission", "pk": 559}, {"fields": {"codename": "add_creditrequirementstatus", "name": "Can add credit requirement status", "content_type": 186}, "model": "auth.permission", "pk": 560}, {"fields": {"codename": "change_creditrequirementstatus", "name": "Can change credit requirement status", "content_type": 186}, "model": "auth.permission", "pk": 561}, {"fields": {"codename": "delete_creditrequirementstatus", "name": "Can delete credit requirement status", "content_type": 186}, "model": "auth.permission", "pk": 562}, {"fields": {"codename": "add_crediteligibility", "name": "Can add credit eligibility", "content_type": 187}, "model": "auth.permission", "pk": 563}, {"fields": {"codename": "change_crediteligibility", "name": "Can change credit eligibility", "content_type": 187}, "model": "auth.permission", "pk": 564}, {"fields": {"codename": "delete_crediteligibility", "name": "Can delete credit eligibility", "content_type": 187}, "model": "auth.permission", "pk": 565}, {"fields": {"codename": "add_historicalcreditrequest", "name": "Can add historical credit request", "content_type": 188}, "model": "auth.permission", "pk": 566}, {"fields": {"codename": "change_historicalcreditrequest", "name": "Can change historical credit request", "content_type": 188}, "model": "auth.permission", "pk": 567}, {"fields": {"codename": "delete_historicalcreditrequest", "name": "Can delete historical credit request", "content_type": 188}, "model": "auth.permission", "pk": 568}, {"fields": {"codename": "add_creditrequest", "name": "Can add credit request", "content_type": 189}, "model": "auth.permission", "pk": 569}, {"fields": {"codename": "change_creditrequest", "name": "Can change credit request", "content_type": 189}, "model": "auth.permission", "pk": 570}, {"fields": {"codename": "delete_creditrequest", "name": "Can delete credit request", "content_type": 189}, "model": "auth.permission", "pk": 571}, {"fields": {"codename": "add_courseteam", "name": "Can add course team", "content_type": 190}, "model": "auth.permission", "pk": 572}, {"fields": {"codename": "change_courseteam", "name": "Can change course team", "content_type": 190}, "model": "auth.permission", "pk": 573}, {"fields": {"codename": "delete_courseteam", "name": "Can delete course team", "content_type": 190}, "model": "auth.permission", "pk": 574}, {"fields": {"codename": "add_courseteammembership", "name": "Can add course team membership", "content_type": 191}, "model": "auth.permission", "pk": 575}, {"fields": {"codename": "change_courseteammembership", "name": "Can change course team membership", "content_type": 191}, "model": "auth.permission", "pk": 576}, {"fields": {"codename": "delete_courseteammembership", "name": "Can delete course team membership", "content_type": 191}, "model": "auth.permission", "pk": 577}, {"fields": {"codename": "add_xblockdisableconfig", "name": "Can add x block disable config", "content_type": 192}, "model": "auth.permission", "pk": 578}, {"fields": {"codename": "change_xblockdisableconfig", "name": "Can change x block disable config", "content_type": 192}, "model": "auth.permission", "pk": 579}, {"fields": {"codename": "delete_xblockdisableconfig", "name": "Can delete x block disable config", "content_type": 192}, "model": "auth.permission", "pk": 580}, {"fields": {"codename": "add_bookmark", "name": "Can add bookmark", "content_type": 193}, "model": "auth.permission", "pk": 581}, {"fields": {"codename": "change_bookmark", "name": "Can change bookmark", "content_type": 193}, "model": "auth.permission", "pk": 582}, {"fields": {"codename": "delete_bookmark", "name": "Can delete bookmark", "content_type": 193}, "model": "auth.permission", "pk": 583}, {"fields": {"codename": "add_xblockcache", "name": "Can add x block cache", "content_type": 194}, "model": "auth.permission", "pk": 584}, {"fields": {"codename": "change_xblockcache", "name": "Can change x block cache", "content_type": 194}, "model": "auth.permission", "pk": 585}, {"fields": {"codename": "delete_xblockcache", "name": "Can delete x block cache", "content_type": 194}, "model": "auth.permission", "pk": 586}, {"fields": {"codename": "add_programsapiconfig", "name": "Can add programs api config", "content_type": 195}, "model": "auth.permission", "pk": 587}, {"fields": {"codename": "change_programsapiconfig", "name": "Can change programs api config", "content_type": 195}, "model": "auth.permission", "pk": 588}, {"fields": {"codename": "delete_programsapiconfig", "name": "Can delete programs api config", "content_type": 195}, "model": "auth.permission", "pk": 589}, {"fields": {"codename": "add_selfpacedconfiguration", "name": "Can add self paced configuration", "content_type": 196}, "model": "auth.permission", "pk": 590}, {"fields": {"codename": "change_selfpacedconfiguration", "name": "Can change self paced configuration", "content_type": 196}, "model": "auth.permission", "pk": 591}, {"fields": {"codename": "delete_selfpacedconfiguration", "name": "Can delete self paced configuration", "content_type": 196}, "model": "auth.permission", "pk": 592}, {"fields": {"codename": "add_kvstore", "name": "Can add kv store", "content_type": 197}, "model": "auth.permission", "pk": 593}, {"fields": {"codename": "change_kvstore", "name": "Can change kv store", "content_type": 197}, "model": "auth.permission", "pk": 594}, {"fields": {"codename": "delete_kvstore", "name": "Can delete kv store", "content_type": 197}, "model": "auth.permission", "pk": 595}, {"fields": {"codename": "add_credentialsapiconfig", "name": "Can add credentials api config", "content_type": 198}, "model": "auth.permission", "pk": 596}, {"fields": {"codename": "change_credentialsapiconfig", "name": "Can change credentials api config", "content_type": 198}, "model": "auth.permission", "pk": 597}, {"fields": {"codename": "delete_credentialsapiconfig", "name": "Can delete credentials api config", "content_type": 198}, "model": "auth.permission", "pk": 598}, {"fields": {"codename": "add_milestone", "name": "Can add milestone", "content_type": 199}, "model": "auth.permission", "pk": 599}, {"fields": {"codename": "change_milestone", "name": "Can change milestone", "content_type": 199}, "model": "auth.permission", "pk": 600}, {"fields": {"codename": "delete_milestone", "name": "Can delete milestone", "content_type": 199}, "model": "auth.permission", "pk": 601}, {"fields": {"codename": "add_milestonerelationshiptype", "name": "Can add milestone relationship type", "content_type": 200}, "model": "auth.permission", "pk": 602}, {"fields": {"codename": "change_milestonerelationshiptype", "name": "Can change milestone relationship type", "content_type": 200}, "model": "auth.permission", "pk": 603}, {"fields": {"codename": "delete_milestonerelationshiptype", "name": "Can delete milestone relationship type", "content_type": 200}, "model": "auth.permission", "pk": 604}, {"fields": {"codename": "add_coursemilestone", "name": "Can add course milestone", "content_type": 201}, "model": "auth.permission", "pk": 605}, {"fields": {"codename": "change_coursemilestone", "name": "Can change course milestone", "content_type": 201}, "model": "auth.permission", "pk": 606}, {"fields": {"codename": "delete_coursemilestone", "name": "Can delete course milestone", "content_type": 201}, "model": "auth.permission", "pk": 607}, {"fields": {"codename": "add_coursecontentmilestone", "name": "Can add course content milestone", "content_type": 202}, "model": "auth.permission", "pk": 608}, {"fields": {"codename": "change_coursecontentmilestone", "name": "Can change course content milestone", "content_type": 202}, "model": "auth.permission", "pk": 609}, {"fields": {"codename": "delete_coursecontentmilestone", "name": "Can delete course content milestone", "content_type": 202}, "model": "auth.permission", "pk": 610}, {"fields": {"codename": "add_usermilestone", "name": "Can add user milestone", "content_type": 203}, "model": "auth.permission", "pk": 611}, {"fields": {"codename": "change_usermilestone", "name": "Can change user milestone", "content_type": 203}, "model": "auth.permission", "pk": 612}, {"fields": {"codename": "delete_usermilestone", "name": "Can delete user milestone", "content_type": 203}, "model": "auth.permission", "pk": 613}, {"fields": {"codename": "add_studentitem", "name": "Can add student item", "content_type": 204}, "model": "auth.permission", "pk": 614}, {"fields": {"codename": "change_studentitem", "name": "Can change student item", "content_type": 204}, "model": "auth.permission", "pk": 615}, {"fields": {"codename": "delete_studentitem", "name": "Can delete student item", "content_type": 204}, "model": "auth.permission", "pk": 616}, {"fields": {"codename": "add_submission", "name": "Can add submission", "content_type": 205}, "model": "auth.permission", "pk": 617}, {"fields": {"codename": "change_submission", "name": "Can change submission", "content_type": 205}, "model": "auth.permission", "pk": 618}, {"fields": {"codename": "delete_submission", "name": "Can delete submission", "content_type": 205}, "model": "auth.permission", "pk": 619}, {"fields": {"codename": "add_score", "name": "Can add score", "content_type": 206}, "model": "auth.permission", "pk": 620}, {"fields": {"codename": "change_score", "name": "Can change score", "content_type": 206}, "model": "auth.permission", "pk": 621}, {"fields": {"codename": "delete_score", "name": "Can delete score", "content_type": 206}, "model": "auth.permission", "pk": 622}, {"fields": {"codename": "add_scoresummary", "name": "Can add score summary", "content_type": 207}, "model": "auth.permission", "pk": 623}, {"fields": {"codename": "change_scoresummary", "name": "Can change score summary", "content_type": 207}, "model": "auth.permission", "pk": 624}, {"fields": {"codename": "delete_scoresummary", "name": "Can delete score summary", "content_type": 207}, "model": "auth.permission", "pk": 625}, {"fields": {"codename": "add_scoreannotation", "name": "Can add score annotation", "content_type": 208}, "model": "auth.permission", "pk": 626}, {"fields": {"codename": "change_scoreannotation", "name": "Can change score annotation", "content_type": 208}, "model": "auth.permission", "pk": 627}, {"fields": {"codename": "delete_scoreannotation", "name": "Can delete score annotation", "content_type": 208}, "model": "auth.permission", "pk": 628}, {"fields": {"codename": "add_rubric", "name": "Can add rubric", "content_type": 209}, "model": "auth.permission", "pk": 629}, {"fields": {"codename": "change_rubric", "name": "Can change rubric", "content_type": 209}, "model": "auth.permission", "pk": 630}, {"fields": {"codename": "delete_rubric", "name": "Can delete rubric", "content_type": 209}, "model": "auth.permission", "pk": 631}, {"fields": {"codename": "add_criterion", "name": "Can add criterion", "content_type": 210}, "model": "auth.permission", "pk": 632}, {"fields": {"codename": "change_criterion", "name": "Can change criterion", "content_type": 210}, "model": "auth.permission", "pk": 633}, {"fields": {"codename": "delete_criterion", "name": "Can delete criterion", "content_type": 210}, "model": "auth.permission", "pk": 634}, {"fields": {"codename": "add_criterionoption", "name": "Can add criterion option", "content_type": 211}, "model": "auth.permission", "pk": 635}, {"fields": {"codename": "change_criterionoption", "name": "Can change criterion option", "content_type": 211}, "model": "auth.permission", "pk": 636}, {"fields": {"codename": "delete_criterionoption", "name": "Can delete criterion option", "content_type": 211}, "model": "auth.permission", "pk": 637}, {"fields": {"codename": "add_assessment", "name": "Can add assessment", "content_type": 212}, "model": "auth.permission", "pk": 638}, {"fields": {"codename": "change_assessment", "name": "Can change assessment", "content_type": 212}, "model": "auth.permission", "pk": 639}, {"fields": {"codename": "delete_assessment", "name": "Can delete assessment", "content_type": 212}, "model": "auth.permission", "pk": 640}, {"fields": {"codename": "add_assessmentpart", "name": "Can add assessment part", "content_type": 213}, "model": "auth.permission", "pk": 641}, {"fields": {"codename": "change_assessmentpart", "name": "Can change assessment part", "content_type": 213}, "model": "auth.permission", "pk": 642}, {"fields": {"codename": "delete_assessmentpart", "name": "Can delete assessment part", "content_type": 213}, "model": "auth.permission", "pk": 643}, {"fields": {"codename": "add_assessmentfeedbackoption", "name": "Can add assessment feedback option", "content_type": 214}, "model": "auth.permission", "pk": 644}, {"fields": {"codename": "change_assessmentfeedbackoption", "name": "Can change assessment feedback option", "content_type": 214}, "model": "auth.permission", "pk": 645}, {"fields": {"codename": "delete_assessmentfeedbackoption", "name": "Can delete assessment feedback option", "content_type": 214}, "model": "auth.permission", "pk": 646}, {"fields": {"codename": "add_assessmentfeedback", "name": "Can add assessment feedback", "content_type": 215}, "model": "auth.permission", "pk": 647}, {"fields": {"codename": "change_assessmentfeedback", "name": "Can change assessment feedback", "content_type": 215}, "model": "auth.permission", "pk": 648}, {"fields": {"codename": "delete_assessmentfeedback", "name": "Can delete assessment feedback", "content_type": 215}, "model": "auth.permission", "pk": 649}, {"fields": {"codename": "add_peerworkflow", "name": "Can add peer workflow", "content_type": 216}, "model": "auth.permission", "pk": 650}, {"fields": {"codename": "change_peerworkflow", "name": "Can change peer workflow", "content_type": 216}, "model": "auth.permission", "pk": 651}, {"fields": {"codename": "delete_peerworkflow", "name": "Can delete peer workflow", "content_type": 216}, "model": "auth.permission", "pk": 652}, {"fields": {"codename": "add_peerworkflowitem", "name": "Can add peer workflow item", "content_type": 217}, "model": "auth.permission", "pk": 653}, {"fields": {"codename": "change_peerworkflowitem", "name": "Can change peer workflow item", "content_type": 217}, "model": "auth.permission", "pk": 654}, {"fields": {"codename": "delete_peerworkflowitem", "name": "Can delete peer workflow item", "content_type": 217}, "model": "auth.permission", "pk": 655}, {"fields": {"codename": "add_trainingexample", "name": "Can add training example", "content_type": 218}, "model": "auth.permission", "pk": 656}, {"fields": {"codename": "change_trainingexample", "name": "Can change training example", "content_type": 218}, "model": "auth.permission", "pk": 657}, {"fields": {"codename": "delete_trainingexample", "name": "Can delete training example", "content_type": 218}, "model": "auth.permission", "pk": 658}, {"fields": {"codename": "add_studenttrainingworkflow", "name": "Can add student training workflow", "content_type": 219}, "model": "auth.permission", "pk": 659}, {"fields": {"codename": "change_studenttrainingworkflow", "name": "Can change student training workflow", "content_type": 219}, "model": "auth.permission", "pk": 660}, {"fields": {"codename": "delete_studenttrainingworkflow", "name": "Can delete student training workflow", "content_type": 219}, "model": "auth.permission", "pk": 661}, {"fields": {"codename": "add_studenttrainingworkflowitem", "name": "Can add student training workflow item", "content_type": 220}, "model": "auth.permission", "pk": 662}, {"fields": {"codename": "change_studenttrainingworkflowitem", "name": "Can change student training workflow item", "content_type": 220}, "model": "auth.permission", "pk": 663}, {"fields": {"codename": "delete_studenttrainingworkflowitem", "name": "Can delete student training workflow item", "content_type": 220}, "model": "auth.permission", "pk": 664}, {"fields": {"codename": "add_aiclassifierset", "name": "Can add ai classifier set", "content_type": 221}, "model": "auth.permission", "pk": 665}, {"fields": {"codename": "change_aiclassifierset", "name": "Can change ai classifier set", "content_type": 221}, "model": "auth.permission", "pk": 666}, {"fields": {"codename": "delete_aiclassifierset", "name": "Can delete ai classifier set", "content_type": 221}, "model": "auth.permission", "pk": 667}, {"fields": {"codename": "add_aiclassifier", "name": "Can add ai classifier", "content_type": 222}, "model": "auth.permission", "pk": 668}, {"fields": {"codename": "change_aiclassifier", "name": "Can change ai classifier", "content_type": 222}, "model": "auth.permission", "pk": 669}, {"fields": {"codename": "delete_aiclassifier", "name": "Can delete ai classifier", "content_type": 222}, "model": "auth.permission", "pk": 670}, {"fields": {"codename": "add_aitrainingworkflow", "name": "Can add ai training workflow", "content_type": 223}, "model": "auth.permission", "pk": 671}, {"fields": {"codename": "change_aitrainingworkflow", "name": "Can change ai training workflow", "content_type": 223}, "model": "auth.permission", "pk": 672}, {"fields": {"codename": "delete_aitrainingworkflow", "name": "Can delete ai training workflow", "content_type": 223}, "model": "auth.permission", "pk": 673}, {"fields": {"codename": "add_aigradingworkflow", "name": "Can add ai grading workflow", "content_type": 224}, "model": "auth.permission", "pk": 674}, {"fields": {"codename": "change_aigradingworkflow", "name": "Can change ai grading workflow", "content_type": 224}, "model": "auth.permission", "pk": 675}, {"fields": {"codename": "delete_aigradingworkflow", "name": "Can delete ai grading workflow", "content_type": 224}, "model": "auth.permission", "pk": 676}, {"fields": {"codename": "add_staffworkflow", "name": "Can add staff workflow", "content_type": 225}, "model": "auth.permission", "pk": 677}, {"fields": {"codename": "change_staffworkflow", "name": "Can change staff workflow", "content_type": 225}, "model": "auth.permission", "pk": 678}, {"fields": {"codename": "delete_staffworkflow", "name": "Can delete staff workflow", "content_type": 225}, "model": "auth.permission", "pk": 679}, {"fields": {"codename": "add_assessmentworkflow", "name": "Can add assessment workflow", "content_type": 226}, "model": "auth.permission", "pk": 680}, {"fields": {"codename": "change_assessmentworkflow", "name": "Can change assessment workflow", "content_type": 226}, "model": "auth.permission", "pk": 681}, {"fields": {"codename": "delete_assessmentworkflow", "name": "Can delete assessment workflow", "content_type": 226}, "model": "auth.permission", "pk": 682}, {"fields": {"codename": "add_assessmentworkflowstep", "name": "Can add assessment workflow step", "content_type": 227}, "model": "auth.permission", "pk": 683}, {"fields": {"codename": "change_assessmentworkflowstep", "name": "Can change assessment workflow step", "content_type": 227}, "model": "auth.permission", "pk": 684}, {"fields": {"codename": "delete_assessmentworkflowstep", "name": "Can delete assessment workflow step", "content_type": 227}, "model": "auth.permission", "pk": 685}, {"fields": {"codename": "add_assessmentworkflowcancellation", "name": "Can add assessment workflow cancellation", "content_type": 228}, "model": "auth.permission", "pk": 686}, {"fields": {"codename": "change_assessmentworkflowcancellation", "name": "Can change assessment workflow cancellation", "content_type": 228}, "model": "auth.permission", "pk": 687}, {"fields": {"codename": "delete_assessmentworkflowcancellation", "name": "Can delete assessment workflow cancellation", "content_type": 228}, "model": "auth.permission", "pk": 688}, {"fields": {"codename": "add_profile", "name": "Can add profile", "content_type": 229}, "model": "auth.permission", "pk": 689}, {"fields": {"codename": "change_profile", "name": "Can change profile", "content_type": 229}, "model": "auth.permission", "pk": 690}, {"fields": {"codename": "delete_profile", "name": "Can delete profile", "content_type": 229}, "model": "auth.permission", "pk": 691}, {"fields": {"codename": "add_video", "name": "Can add video", "content_type": 230}, "model": "auth.permission", "pk": 692}, {"fields": {"codename": "change_video", "name": "Can change video", "content_type": 230}, "model": "auth.permission", "pk": 693}, {"fields": {"codename": "delete_video", "name": "Can delete video", "content_type": 230}, "model": "auth.permission", "pk": 694}, {"fields": {"codename": "add_coursevideo", "name": "Can add course video", "content_type": 231}, "model": "auth.permission", "pk": 695}, {"fields": {"codename": "change_coursevideo", "name": "Can change course video", "content_type": 231}, "model": "auth.permission", "pk": 696}, {"fields": {"codename": "delete_coursevideo", "name": "Can delete course video", "content_type": 231}, "model": "auth.permission", "pk": 697}, {"fields": {"codename": "add_encodedvideo", "name": "Can add encoded video", "content_type": 232}, "model": "auth.permission", "pk": 698}, {"fields": {"codename": "change_encodedvideo", "name": "Can change encoded video", "content_type": 232}, "model": "auth.permission", "pk": 699}, {"fields": {"codename": "delete_encodedvideo", "name": "Can delete encoded video", "content_type": 232}, "model": "auth.permission", "pk": 700}, {"fields": {"codename": "add_subtitle", "name": "Can add subtitle", "content_type": 233}, "model": "auth.permission", "pk": 701}, {"fields": {"codename": "change_subtitle", "name": "Can change subtitle", "content_type": 233}, "model": "auth.permission", "pk": 702}, {"fields": {"codename": "delete_subtitle", "name": "Can delete subtitle", "content_type": 233}, "model": "auth.permission", "pk": 703}, {"fields": {"codename": "add_proctoredexam", "name": "Can add proctored exam", "content_type": 234}, "model": "auth.permission", "pk": 704}, {"fields": {"codename": "change_proctoredexam", "name": "Can change proctored exam", "content_type": 234}, "model": "auth.permission", "pk": 705}, {"fields": {"codename": "delete_proctoredexam", "name": "Can delete proctored exam", "content_type": 234}, "model": "auth.permission", "pk": 706}, {"fields": {"codename": "add_proctoredexamreviewpolicy", "name": "Can add Proctored exam review policy", "content_type": 235}, "model": "auth.permission", "pk": 707}, {"fields": {"codename": "change_proctoredexamreviewpolicy", "name": "Can change Proctored exam review policy", "content_type": 235}, "model": "auth.permission", "pk": 708}, {"fields": {"codename": "delete_proctoredexamreviewpolicy", "name": "Can delete Proctored exam review policy", "content_type": 235}, "model": "auth.permission", "pk": 709}, {"fields": {"codename": "add_proctoredexamreviewpolicyhistory", "name": "Can add proctored exam review policy history", "content_type": 236}, "model": "auth.permission", "pk": 710}, {"fields": {"codename": "change_proctoredexamreviewpolicyhistory", "name": "Can change proctored exam review policy history", "content_type": 236}, "model": "auth.permission", "pk": 711}, {"fields": {"codename": "delete_proctoredexamreviewpolicyhistory", "name": "Can delete proctored exam review policy history", "content_type": 236}, "model": "auth.permission", "pk": 712}, {"fields": {"codename": "add_proctoredexamstudentattempt", "name": "Can add proctored exam attempt", "content_type": 237}, "model": "auth.permission", "pk": 713}, {"fields": {"codename": "change_proctoredexamstudentattempt", "name": "Can change proctored exam attempt", "content_type": 237}, "model": "auth.permission", "pk": 714}, {"fields": {"codename": "delete_proctoredexamstudentattempt", "name": "Can delete proctored exam attempt", "content_type": 237}, "model": "auth.permission", "pk": 715}, {"fields": {"codename": "add_proctoredexamstudentattempthistory", "name": "Can add proctored exam attempt history", "content_type": 238}, "model": "auth.permission", "pk": 716}, {"fields": {"codename": "change_proctoredexamstudentattempthistory", "name": "Can change proctored exam attempt history", "content_type": 238}, "model": "auth.permission", "pk": 717}, {"fields": {"codename": "delete_proctoredexamstudentattempthistory", "name": "Can delete proctored exam attempt history", "content_type": 238}, "model": "auth.permission", "pk": 718}, {"fields": {"codename": "add_proctoredexamstudentallowance", "name": "Can add proctored allowance", "content_type": 239}, "model": "auth.permission", "pk": 719}, {"fields": {"codename": "change_proctoredexamstudentallowance", "name": "Can change proctored allowance", "content_type": 239}, "model": "auth.permission", "pk": 720}, {"fields": {"codename": "delete_proctoredexamstudentallowance", "name": "Can delete proctored allowance", "content_type": 239}, "model": "auth.permission", "pk": 721}, {"fields": {"codename": "add_proctoredexamstudentallowancehistory", "name": "Can add proctored allowance history", "content_type": 240}, "model": "auth.permission", "pk": 722}, {"fields": {"codename": "change_proctoredexamstudentallowancehistory", "name": "Can change proctored allowance history", "content_type": 240}, "model": "auth.permission", "pk": 723}, {"fields": {"codename": "delete_proctoredexamstudentallowancehistory", "name": "Can delete proctored allowance history", "content_type": 240}, "model": "auth.permission", "pk": 724}, {"fields": {"codename": "add_proctoredexamsoftwaresecurereview", "name": "Can add Proctored exam software secure review", "content_type": 241}, "model": "auth.permission", "pk": 725}, {"fields": {"codename": "change_proctoredexamsoftwaresecurereview", "name": "Can change Proctored exam software secure review", "content_type": 241}, "model": "auth.permission", "pk": 726}, {"fields": {"codename": "delete_proctoredexamsoftwaresecurereview", "name": "Can delete Proctored exam software secure review", "content_type": 241}, "model": "auth.permission", "pk": 727}, {"fields": {"codename": "add_proctoredexamsoftwaresecurereviewhistory", "name": "Can add Proctored exam review archive", "content_type": 242}, "model": "auth.permission", "pk": 728}, {"fields": {"codename": "change_proctoredexamsoftwaresecurereviewhistory", "name": "Can change Proctored exam review archive", "content_type": 242}, "model": "auth.permission", "pk": 729}, {"fields": {"codename": "delete_proctoredexamsoftwaresecurereviewhistory", "name": "Can delete Proctored exam review archive", "content_type": 242}, "model": "auth.permission", "pk": 730}, {"fields": {"codename": "add_proctoredexamsoftwaresecurecomment", "name": "Can add proctored exam software secure comment", "content_type": 243}, "model": "auth.permission", "pk": 731}, {"fields": {"codename": "change_proctoredexamsoftwaresecurecomment", "name": "Can change proctored exam software secure comment", "content_type": 243}, "model": "auth.permission", "pk": 732}, {"fields": {"codename": "delete_proctoredexamsoftwaresecurecomment", "name": "Can delete proctored exam software secure comment", "content_type": 243}, "model": "auth.permission", "pk": 733}, {"fields": {"codename": "add_organization", "name": "Can add organization", "content_type": 244}, "model": "auth.permission", "pk": 734}, {"fields": {"codename": "change_organization", "name": "Can change organization", "content_type": 244}, "model": "auth.permission", "pk": 735}, {"fields": {"codename": "delete_organization", "name": "Can delete organization", "content_type": 244}, "model": "auth.permission", "pk": 736}, {"fields": {"codename": "add_organizationcourse", "name": "Can add Link Course", "content_type": 245}, "model": "auth.permission", "pk": 737}, {"fields": {"codename": "change_organizationcourse", "name": "Can change Link Course", "content_type": 245}, "model": "auth.permission", "pk": 738}, {"fields": {"codename": "delete_organizationcourse", "name": "Can delete Link Course", "content_type": 245}, "model": "auth.permission", "pk": 739}, {"fields": {"codename": "add_studentmodulehistoryextended", "name": "Can add student module history extended", "content_type": 246}, "model": "auth.permission", "pk": 740}, {"fields": {"codename": "change_studentmodulehistoryextended", "name": "Can change student module history extended", "content_type": 246}, "model": "auth.permission", "pk": 741}, {"fields": {"codename": "delete_studentmodulehistoryextended", "name": "Can delete student module history extended", "content_type": 246}, "model": "auth.permission", "pk": 742}, {"fields": {"codename": "add_videouploadconfig", "name": "Can add video upload config", "content_type": 247}, "model": "auth.permission", "pk": 743}, {"fields": {"codename": "change_videouploadconfig", "name": "Can change video upload config", "content_type": 247}, "model": "auth.permission", "pk": 744}, {"fields": {"codename": "delete_videouploadconfig", "name": "Can delete video upload config", "content_type": 247}, "model": "auth.permission", "pk": 745}, {"fields": {"codename": "add_pushnotificationconfig", "name": "Can add push notification config", "content_type": 248}, "model": "auth.permission", "pk": 746}, {"fields": {"codename": "change_pushnotificationconfig", "name": "Can change push notification config", "content_type": 248}, "model": "auth.permission", "pk": 747}, {"fields": {"codename": "delete_pushnotificationconfig", "name": "Can delete push notification config", "content_type": 248}, "model": "auth.permission", "pk": 748}, {"fields": {"codename": "add_coursecreator", "name": "Can add course creator", "content_type": 249}, "model": "auth.permission", "pk": 749}, {"fields": {"codename": "change_coursecreator", "name": "Can change course creator", "content_type": 249}, "model": "auth.permission", "pk": 750}, {"fields": {"codename": "delete_coursecreator", "name": "Can delete course creator", "content_type": 249}, "model": "auth.permission", "pk": 751}, {"fields": {"codename": "add_studioconfig", "name": "Can add studio config", "content_type": 250}, "model": "auth.permission", "pk": 752}, {"fields": {"codename": "change_studioconfig", "name": "Can change studio config", "content_type": 250}, "model": "auth.permission", "pk": 753}, {"fields": {"codename": "delete_studioconfig", "name": "Can delete studio config", "content_type": 250}, "model": "auth.permission", "pk": 754}, {"fields": {"username": "ecommerce_worker", "first_name": "", "last_name": "", "is_active": true, "is_superuser": false, "is_staff": false, "last_login": null, "groups": [], "user_permissions": [], "password": "!kHqA96LDdPlv3krtpEd7SmmmMgKeHRD9X7bHq5CD", "email": "ecommerce_worker@fake.email", "date_joined": "2016-02-29T17:58:11.176Z"}, "model": "auth.user", "pk": 1}, {"fields": {"change_date": "2016-02-29T17:59:25.006Z", "changed_by": null, "enabled": true}, "model": "util.ratelimitconfiguration", "pk": 1}, {"fields": {"change_date": "2016-02-29T17:58:10.732Z", "changed_by": null, "configuration": "{\"default\": {\"accomplishment_class_append\": \"accomplishment-certificate\", \"platform_name\": \"Your Platform Name Here\", \"logo_src\": \"/static/certificates/images/logo.png\", \"logo_url\": \"http://www.example.com\", \"company_verified_certificate_url\": \"http://www.example.com/verified-certificate\", \"company_privacy_url\": \"http://www.example.com/privacy-policy\", \"company_tos_url\": \"http://www.example.com/terms-service\", \"company_about_url\": \"http://www.example.com/about-us\"}, \"verified\": {\"certificate_type\": \"Verified\", \"certificate_title\": \"Verified Certificate of Achievement\"}, \"honor\": {\"certificate_type\": \"Honor Code\", \"certificate_title\": \"Certificate of Achievement\"}}", "enabled": false}, "model": "certificates.certificatehtmlviewconfiguration", "pk": 1}, {"fields": {"change_date": "2016-02-29T17:58:18.649Z", "changed_by": null, "enabled": true, "released_languages": ""}, "model": "dark_lang.darklangconfig", "pk": 1}] \ No newline at end of file diff --git a/common/test/db_cache/bok_choy_data_student_module_history.json b/common/test/db_cache/bok_choy_data_student_module_history.json new file mode 100644 index 0000000000..0637a088a0 --- /dev/null +++ b/common/test/db_cache/bok_choy_data_student_module_history.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/common/test/db_cache/bok_choy_migrations_data.sql b/common/test/db_cache/bok_choy_migrations_data.sql deleted file mode 100644 index 140f9c96c7..0000000000 --- a/common/test/db_cache/bok_choy_migrations_data.sql +++ /dev/null @@ -1,37 +0,0 @@ --- MySQL dump 10.13 Distrib 5.6.24, for debian-linux-gnu (x86_64) --- --- Host: localhost Database: edxtest --- ------------------------------------------------------ --- Server version 5.6.24-2+deb.sury.org~precise+2 - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!40101 SET NAMES utf8 */; -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -/*!40103 SET TIME_ZONE='+00:00' */; -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; - --- --- Dumping data for table `django_migrations` --- - -LOCK TABLES `django_migrations` WRITE; -/*!40000 ALTER TABLE `django_migrations` DISABLE KEYS */; -INSERT INTO `django_migrations` VALUES (1,'contenttypes','0001_initial','2016-01-22 20:04:03.218179'),(2,'auth','0001_initial','2016-01-22 20:04:03.554767'),(3,'admin','0001_initial','2016-01-22 20:04:03.665239'),(4,'assessment','0001_initial','2016-01-22 20:04:06.917971'),(5,'assessment','0002_staffworkflow','2016-01-22 20:04:07.125841'),(6,'contenttypes','0002_remove_content_type_name','2016-01-22 20:04:07.307570'),(7,'auth','0002_alter_permission_name_max_length','2016-01-22 20:04:07.383568'),(8,'auth','0003_alter_user_email_max_length','2016-01-22 20:04:07.464880'),(9,'auth','0004_alter_user_username_opts','2016-01-22 20:04:07.496608'),(10,'auth','0005_alter_user_last_login_null','2016-01-22 20:04:07.584818'),(11,'auth','0006_require_contenttypes_0002','2016-01-22 20:04:07.591565'),(12,'bookmarks','0001_initial','2016-01-22 20:04:07.932691'),(13,'branding','0001_initial','2016-01-22 20:04:08.105513'),(14,'bulk_email','0001_initial','2016-01-22 20:04:08.469986'),(15,'bulk_email','0002_data__load_course_email_template','2016-01-22 20:04:08.538284'),(16,'instructor_task','0001_initial','2016-01-22 20:04:08.743012'),(17,'certificates','0001_initial','2016-01-22 20:04:09.838773'),(18,'certificates','0002_data__certificatehtmlviewconfiguration_data','2016-01-22 20:04:09.865157'),(19,'certificates','0003_data__default_modes','2016-01-22 20:04:09.943086'),(20,'certificates','0004_certificategenerationhistory','2016-01-22 20:04:10.116067'),(21,'certificates','0005_auto_20151208_0801','2016-01-22 20:04:10.232215'),(22,'certificates','0006_certificatetemplateasset_asset_slug','2016-01-22 20:04:10.307271'),(23,'certificates','0007_certificateinvalidation','2016-01-22 20:04:10.510089'),(24,'commerce','0001_data__add_ecommerce_service_user','2016-01-22 20:04:10.538558'),(25,'cors_csrf','0001_initial','2016-01-22 20:04:10.680353'),(26,'course_action_state','0001_initial','2016-01-22 20:04:11.030484'),(27,'course_groups','0001_initial','2016-01-22 20:04:12.283946'),(28,'course_modes','0001_initial','2016-01-22 20:04:12.452546'),(29,'course_modes','0002_coursemode_expiration_datetime_is_explicit','2016-01-22 20:04:12.534953'),(30,'course_modes','0003_auto_20151113_1443','2016-01-22 20:04:12.569936'),(31,'course_modes','0004_auto_20151113_1457','2016-01-22 20:04:12.776505'),(32,'course_modes','0005_auto_20151217_0958','2016-01-22 20:04:12.807317'),(33,'course_overviews','0001_initial','2016-01-22 20:04:12.927012'),(34,'course_overviews','0002_add_course_catalog_fields','2016-01-22 20:04:13.220589'),(35,'course_overviews','0003_courseoverviewgeneratedhistory','2016-01-22 20:04:13.258023'),(36,'course_overviews','0004_courseoverview_org','2016-01-22 20:04:13.346700'),(37,'course_overviews','0005_delete_courseoverviewgeneratedhistory','2016-01-22 20:04:13.375580'),(38,'course_overviews','0006_courseoverviewimageset','2016-01-22 20:04:13.464516'),(39,'course_overviews','0007_courseoverviewimageconfig','2016-01-22 20:04:13.651285'),(40,'course_structures','0001_initial','2016-01-22 20:04:13.689179'),(41,'courseware','0001_initial','2016-01-22 20:04:17.245019'),(42,'credentials','0001_initial','2016-01-22 20:04:17.454975'),(43,'credentials','0002_data__add_service_user','2016-01-22 20:04:17.494478'),(44,'credit','0001_initial','2016-01-22 20:04:19.593607'),(45,'dark_lang','0001_initial','2016-01-22 20:04:19.851812'),(46,'dark_lang','0002_data__enable_on_install','2016-01-22 20:04:19.886816'),(47,'default','0001_initial','2016-01-22 20:04:20.656170'),(48,'default','0002_add_related_name','2016-01-22 20:04:20.920330'),(49,'default','0003_alter_email_max_length','2016-01-22 20:04:21.038154'),(50,'django_comment_common','0001_initial','2016-01-22 20:04:21.777797'),(51,'django_notify','0001_initial','2016-01-22 20:04:23.074494'),(52,'django_openid_auth','0001_initial','2016-01-22 20:04:23.435834'),(53,'edx_proctoring','0001_initial','2016-01-22 20:04:28.470618'),(54,'edx_proctoring','0002_proctoredexamstudentattempt_is_status_acknowledged','2016-01-22 20:04:28.834557'),(55,'edx_proctoring','0003_auto_20160101_0525','2016-01-22 20:04:29.402026'),(56,'edxval','0001_initial','2016-01-22 20:04:30.249661'),(57,'edxval','0002_data__default_profiles','2016-01-22 20:04:30.307115'),(58,'embargo','0001_initial','2016-01-22 20:04:31.462353'),(59,'embargo','0002_data__add_countries','2016-01-22 20:04:32.017366'),(60,'external_auth','0001_initial','2016-01-22 20:04:32.753375'),(61,'lms_xblock','0001_initial','2016-01-22 20:04:33.090177'),(62,'sites','0001_initial','2016-01-22 20:04:33.156273'),(63,'microsite_configuration','0001_initial','2016-01-22 20:04:35.468782'),(64,'milestones','0001_initial','2016-01-22 20:04:36.698849'),(65,'milestones','0002_data__seed_relationship_types','2016-01-22 20:04:36.760089'),(66,'mobile_api','0001_initial','2016-01-22 20:04:38.189431'),(67,'notes','0001_initial','2016-01-22 20:04:38.639288'),(68,'oauth2','0001_initial','2016-01-22 20:04:40.968535'),(69,'oauth2_provider','0001_initial','2016-01-22 20:04:41.475836'),(70,'oauth_provider','0001_initial','2016-01-22 20:04:42.704759'),(71,'organizations','0001_initial','2016-01-22 20:04:42.985226'),(72,'organizations','0002_auto_20151119_2048','2016-01-22 20:04:43.049898'),(73,'problem_builder','0001_initial','2016-01-22 20:04:43.244682'),(74,'programs','0001_initial','2016-01-22 20:04:43.776265'),(75,'programs','0002_programsapiconfig_cache_ttl','2016-01-22 20:04:44.329122'),(76,'programs','0003_auto_20151120_1613','2016-01-22 20:04:46.494468'),(77,'rss_proxy','0001_initial','2016-01-22 20:04:46.572259'),(78,'self_paced','0001_initial','2016-01-22 20:04:47.142336'),(79,'sessions','0001_initial','2016-01-22 20:04:47.246566'),(80,'student','0001_initial','2016-01-22 20:05:04.804775'),(81,'shoppingcart','0001_initial','2016-01-22 20:05:20.059855'),(82,'shoppingcart','0002_auto_20151208_1034','2016-01-22 20:05:21.457216'),(83,'shoppingcart','0003_auto_20151217_0958','2016-01-22 20:05:22.922754'),(84,'splash','0001_initial','2016-01-22 20:05:23.712228'),(85,'static_replace','0001_initial','2016-01-22 20:05:24.489567'),(86,'status','0001_initial','2016-01-22 20:05:26.131108'),(87,'student','0002_auto_20151208_1034','2016-01-22 20:05:27.780831'),(88,'submissions','0001_initial','2016-01-22 20:05:29.846153'),(89,'submissions','0002_auto_20151119_0913','2016-01-22 20:05:30.098711'),(90,'survey','0001_initial','2016-01-22 20:05:31.137171'),(91,'teams','0001_initial','2016-01-22 20:05:33.436431'),(92,'third_party_auth','0001_initial','2016-01-22 20:05:38.010830'),(93,'track','0001_initial','2016-01-22 20:05:38.097314'),(94,'user_api','0001_initial','2016-01-22 20:05:44.556502'),(95,'util','0001_initial','2016-01-22 20:05:45.512595'),(96,'util','0002_data__default_rate_limit_config','2016-01-22 20:05:45.583331'),(97,'verify_student','0001_initial','2016-01-22 20:05:56.456343'),(98,'verify_student','0002_auto_20151124_1024','2016-01-22 20:05:58.780629'),(99,'verify_student','0003_auto_20151113_1443','2016-01-22 20:05:59.622634'),(100,'wiki','0001_initial','2016-01-22 20:06:30.273480'),(101,'wiki','0002_remove_article_subscription','2016-01-22 20:06:30.358472'),(102,'workflow','0001_initial','2016-01-22 20:06:30.741041'),(103,'xblock_django','0001_initial','2016-01-22 20:06:31.645852'),(104,'contentstore','0001_initial','2016-01-22 20:07:00.042399'),(105,'course_creators','0001_initial','2016-01-22 20:07:00.153769'),(106,'xblock_config','0001_initial','2016-01-22 20:07:00.552942'); -/*!40000 ALTER TABLE `django_migrations` ENABLE KEYS */; -UNLOCK TABLES; -/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; - -/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; -/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; -/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; -/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; - --- Dump completed on 2016-01-22 20:07:05 diff --git a/common/test/db_cache/bok_choy_migrations_data_default.sql b/common/test/db_cache/bok_choy_migrations_data_default.sql new file mode 100644 index 0000000000..ab80457f1d --- /dev/null +++ b/common/test/db_cache/bok_choy_migrations_data_default.sql @@ -0,0 +1,37 @@ +-- MySQL dump 10.13 Distrib 5.6.14, for debian-linux-gnu (x86_64) +-- +-- Host: localhost Database: edxtest +-- ------------------------------------------------------ +-- Server version 5.6.14-1+debphp.org~precise+1 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Dumping data for table `django_migrations` +-- + +LOCK TABLES `django_migrations` WRITE; +/*!40000 ALTER TABLE `django_migrations` DISABLE KEYS */; +INSERT INTO `django_migrations` VALUES (1,'contenttypes','0001_initial','2016-02-29 17:58:04.910265'),(2,'auth','0001_initial','2016-02-29 17:58:05.155297'),(3,'admin','0001_initial','2016-02-29 17:58:05.261098'),(4,'assessment','0001_initial','2016-02-29 17:58:08.458980'),(5,'assessment','0002_staffworkflow','2016-02-29 17:58:08.659081'),(6,'contenttypes','0002_remove_content_type_name','2016-02-29 17:58:08.818265'),(7,'auth','0002_alter_permission_name_max_length','2016-02-29 17:58:08.855835'),(8,'auth','0003_alter_user_email_max_length','2016-02-29 17:58:08.894682'),(9,'auth','0004_alter_user_username_opts','2016-02-29 17:58:08.918567'),(10,'auth','0005_alter_user_last_login_null','2016-02-29 17:58:08.971615'),(11,'auth','0006_require_contenttypes_0002','2016-02-29 17:58:08.976069'),(12,'bookmarks','0001_initial','2016-02-29 17:58:09.243246'),(13,'branding','0001_initial','2016-02-29 17:58:09.364920'),(14,'bulk_email','0001_initial','2016-02-29 17:58:09.630882'),(15,'bulk_email','0002_data__load_course_email_template','2016-02-29 17:58:09.715512'),(16,'instructor_task','0001_initial','2016-02-29 17:58:09.872596'),(17,'certificates','0001_initial','2016-02-29 17:58:10.722743'),(18,'certificates','0002_data__certificatehtmlviewconfiguration_data','2016-02-29 17:58:10.736641'),(19,'certificates','0003_data__default_modes','2016-02-29 17:58:10.775334'),(20,'certificates','0004_certificategenerationhistory','2016-02-29 17:58:10.911498'),(21,'certificates','0005_auto_20151208_0801','2016-02-29 17:58:11.002303'),(22,'certificates','0006_certificatetemplateasset_asset_slug','2016-02-29 17:58:11.050549'),(23,'certificates','0007_certificateinvalidation','2016-02-29 17:58:11.166297'),(24,'commerce','0001_data__add_ecommerce_service_user','2016-02-29 17:58:11.198023'),(25,'commerce','0002_commerceconfiguration','2016-02-29 17:58:11.291907'),(26,'contentserver','0001_initial','2016-02-29 17:58:11.375676'),(27,'cors_csrf','0001_initial','2016-02-29 17:58:11.462189'),(28,'course_action_state','0001_initial','2016-02-29 17:58:11.783744'),(29,'course_groups','0001_initial','2016-02-29 17:58:12.790006'),(30,'course_modes','0001_initial','2016-02-29 17:58:12.902796'),(31,'course_modes','0002_coursemode_expiration_datetime_is_explicit','2016-02-29 17:58:12.957209'),(32,'course_modes','0003_auto_20151113_1443','2016-02-29 17:58:12.979234'),(33,'course_modes','0004_auto_20151113_1457','2016-02-29 17:58:13.095320'),(34,'course_modes','0005_auto_20151217_0958','2016-02-29 17:58:13.116644'),(35,'course_modes','0006_auto_20160208_1407','2016-02-29 17:58:13.208193'),(36,'course_overviews','0001_initial','2016-02-29 17:58:13.283088'),(37,'course_overviews','0002_add_course_catalog_fields','2016-02-29 17:58:13.499090'),(38,'course_overviews','0003_courseoverviewgeneratedhistory','2016-02-29 17:58:13.525866'),(39,'course_overviews','0004_courseoverview_org','2016-02-29 17:58:13.567577'),(40,'course_overviews','0005_delete_courseoverviewgeneratedhistory','2016-02-29 17:58:13.585458'),(41,'course_overviews','0006_courseoverviewimageset','2016-02-29 17:58:13.636894'),(42,'course_overviews','0007_courseoverviewimageconfig','2016-02-29 17:58:13.764616'),(43,'course_overviews','0008_remove_courseoverview_facebook_url','2016-02-29 17:58:13.815867'),(44,'course_overviews','0009_readd_facebook_url','2016-02-29 17:58:13.872971'),(45,'course_structures','0001_initial','2016-02-29 17:58:13.899706'),(46,'courseware','0001_initial','2016-02-29 17:58:16.765503'),(47,'coursewarehistoryextended','0001_initial','2016-02-29 17:58:16.912454'),(48,'credentials','0001_initial','2016-02-29 17:58:17.072454'),(49,'credit','0001_initial','2016-02-29 17:58:18.478297'),(50,'dark_lang','0001_initial','2016-02-29 17:58:18.635638'),(51,'dark_lang','0002_data__enable_on_install','2016-02-29 17:58:18.654315'),(52,'default','0001_initial','2016-02-29 17:58:19.121037'),(53,'default','0002_add_related_name','2016-02-29 17:58:19.287646'),(54,'default','0003_alter_email_max_length','2016-02-29 17:58:19.355367'),(55,'django_comment_common','0001_initial','2016-02-29 17:58:19.826406'),(56,'django_notify','0001_initial','2016-02-29 17:58:20.691115'),(57,'django_openid_auth','0001_initial','2016-02-29 17:58:20.948196'),(58,'edx_proctoring','0001_initial','2016-02-29 17:58:25.028310'),(59,'edx_proctoring','0002_proctoredexamstudentattempt_is_status_acknowledged','2016-02-29 17:58:25.270722'),(60,'edx_proctoring','0003_auto_20160101_0525','2016-02-29 17:58:25.651659'),(61,'edx_proctoring','0004_auto_20160201_0523','2016-02-29 17:58:25.881209'),(62,'edxval','0001_initial','2016-02-29 17:58:26.490038'),(63,'edxval','0002_data__default_profiles','2016-02-29 17:58:26.519947'),(64,'embargo','0001_initial','2016-02-29 17:58:27.388295'),(65,'embargo','0002_data__add_countries','2016-02-29 17:58:27.716022'),(66,'external_auth','0001_initial','2016-02-29 17:58:28.339793'),(67,'lms_xblock','0001_initial','2016-02-29 17:58:28.600358'),(68,'sites','0001_initial','2016-02-29 17:58:28.639305'),(69,'microsite_configuration','0001_initial','2016-02-29 17:58:30.470563'),(70,'microsite_configuration','0002_auto_20160202_0228','2016-02-29 17:58:31.089884'),(71,'milestones','0001_initial','2016-02-29 17:58:32.206321'),(72,'milestones','0002_data__seed_relationship_types','2016-02-29 17:58:32.242905'),(73,'milestones','0003_coursecontentmilestone_requirements','2016-02-29 17:58:33.317573'),(74,'milestones','0004_auto_20151221_1445','2016-02-29 17:58:33.593210'),(75,'mobile_api','0001_initial','2016-02-29 17:58:33.849089'),(76,'notes','0001_initial','2016-02-29 17:58:34.185220'),(77,'oauth2','0001_initial','2016-02-29 17:58:35.892898'),(78,'oauth2_provider','0001_initial','2016-02-29 17:58:36.227236'),(79,'oauth_provider','0001_initial','2016-02-29 17:58:37.052991'),(80,'organizations','0001_initial','2016-02-29 17:58:37.290331'),(81,'programs','0001_initial','2016-02-29 17:58:37.667708'),(82,'programs','0002_programsapiconfig_cache_ttl','2016-02-29 17:58:38.067119'),(83,'programs','0003_auto_20151120_1613','2016-02-29 17:58:39.752602'),(84,'programs','0004_programsapiconfig_enable_certification','2016-02-29 17:58:40.179508'),(85,'programs','0005_programsapiconfig_max_retries','2016-02-29 17:58:40.596412'),(86,'rss_proxy','0001_initial','2016-02-29 17:58:40.641620'),(87,'self_paced','0001_initial','2016-02-29 17:58:41.078194'),(88,'sessions','0001_initial','2016-02-29 17:58:41.133704'),(89,'student','0001_initial','2016-02-29 17:58:53.980867'),(90,'shoppingcart','0001_initial','2016-02-29 17:59:06.233175'),(91,'shoppingcart','0002_auto_20151208_1034','2016-02-29 17:59:07.059000'),(92,'shoppingcart','0003_auto_20151217_0958','2016-02-29 17:59:07.907660'),(93,'splash','0001_initial','2016-02-29 17:59:08.351083'),(94,'static_replace','0001_initial','2016-02-29 17:59:08.818049'),(95,'static_replace','0002_assetexcludedextensionsconfig','2016-02-29 17:59:09.319193'),(96,'status','0001_initial','2016-02-29 17:59:10.500113'),(97,'student','0002_auto_20151208_1034','2016-02-29 17:59:11.650009'),(98,'submissions','0001_initial','2016-02-29 17:59:12.491480'),(99,'submissions','0002_auto_20151119_0913','2016-02-29 17:59:12.683289'),(100,'submissions','0003_submission_status','2016-02-29 17:59:12.811034'),(101,'survey','0001_initial','2016-02-29 17:59:13.767659'),(102,'teams','0001_initial','2016-02-29 17:59:16.603866'),(103,'third_party_auth','0001_initial','2016-02-29 17:59:19.924001'),(104,'track','0001_initial','2016-02-29 17:59:19.974203'),(105,'user_api','0001_initial','2016-02-29 17:59:24.197607'),(106,'util','0001_initial','2016-02-29 17:59:24.978364'),(107,'util','0002_data__default_rate_limit_config','2016-02-29 17:59:25.017205'),(108,'verify_student','0001_initial','2016-02-29 17:59:33.329519'),(109,'verify_student','0002_auto_20151124_1024','2016-02-29 17:59:34.238392'),(110,'verify_student','0003_auto_20151113_1443','2016-02-29 17:59:35.001393'),(111,'wiki','0001_initial','2016-02-29 17:59:56.418517'),(112,'wiki','0002_remove_article_subscription','2016-02-29 17:59:56.476734'),(113,'workflow','0001_initial','2016-02-29 17:59:56.760505'),(114,'xblock_django','0001_initial','2016-02-29 17:59:57.572216'),(115,'xblock_django','0002_auto_20160204_0809','2016-02-29 17:59:58.380438'),(116,'contentstore','0001_initial','2016-02-29 18:00:19.534458'),(117,'course_creators','0001_initial','2016-02-29 18:00:19.597219'),(118,'xblock_config','0001_initial','2016-02-29 18:00:19.855097'); +/*!40000 ALTER TABLE `django_migrations` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2016-02-29 18:00:23 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 new file mode 100644 index 0000000000..be9faad011 --- /dev/null +++ b/common/test/db_cache/bok_choy_migrations_data_student_module_history.sql @@ -0,0 +1,37 @@ +-- MySQL dump 10.13 Distrib 5.6.14, for debian-linux-gnu (x86_64) +-- +-- Host: localhost Database: student_module_history_test +-- ------------------------------------------------------ +-- Server version 5.6.14-1+debphp.org~precise+1 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Dumping data for table `django_migrations` +-- + +LOCK TABLES `django_migrations` WRITE; +/*!40000 ALTER TABLE `django_migrations` DISABLE KEYS */; +INSERT INTO `django_migrations` VALUES (1,'contenttypes','0001_initial','2016-02-29 18:01:39.511327'),(2,'auth','0001_initial','2016-02-29 18:01:39.547129'),(3,'admin','0001_initial','2016-02-29 18:01:39.568351'),(4,'assessment','0001_initial','2016-02-29 18:01:40.149754'),(5,'assessment','0002_staffworkflow','2016-02-29 18:01:40.160082'),(6,'contenttypes','0002_remove_content_type_name','2016-02-29 18:01:40.231907'),(7,'auth','0002_alter_permission_name_max_length','2016-02-29 18:01:40.251926'),(8,'auth','0003_alter_user_email_max_length','2016-02-29 18:01:40.276419'),(9,'auth','0004_alter_user_username_opts','2016-02-29 18:01:40.297224'),(10,'auth','0005_alter_user_last_login_null','2016-02-29 18:01:40.317098'),(11,'auth','0006_require_contenttypes_0002','2016-02-29 18:01:40.319374'),(12,'bookmarks','0001_initial','2016-02-29 18:01:40.396366'),(13,'branding','0001_initial','2016-02-29 18:01:40.453783'),(14,'bulk_email','0001_initial','2016-02-29 18:01:40.565081'),(15,'bulk_email','0002_data__load_course_email_template','2016-02-29 18:01:40.574000'),(16,'instructor_task','0001_initial','2016-02-29 18:01:40.613011'),(17,'certificates','0001_initial','2016-02-29 18:01:40.980762'),(18,'certificates','0002_data__certificatehtmlviewconfiguration_data','2016-02-29 18:01:40.991190'),(19,'certificates','0003_data__default_modes','2016-02-29 18:01:41.003742'),(20,'certificates','0004_certificategenerationhistory','2016-02-29 18:01:41.061308'),(21,'certificates','0005_auto_20151208_0801','2016-02-29 18:01:41.113837'),(22,'certificates','0006_certificatetemplateasset_asset_slug','2016-02-29 18:01:41.131141'),(23,'certificates','0007_certificateinvalidation','2016-02-29 18:01:41.189247'),(24,'commerce','0001_data__add_ecommerce_service_user','2016-02-29 18:01:41.200385'),(25,'commerce','0002_commerceconfiguration','2016-02-29 18:01:41.260287'),(26,'contentserver','0001_initial','2016-02-29 18:01:41.323580'),(27,'cors_csrf','0001_initial','2016-02-29 18:01:41.388714'),(28,'course_action_state','0001_initial','2016-02-29 18:01:41.514544'),(29,'course_groups','0001_initial','2016-02-29 18:01:42.036647'),(30,'course_modes','0001_initial','2016-02-29 18:01:42.068946'),(31,'course_modes','0002_coursemode_expiration_datetime_is_explicit','2016-02-29 18:01:42.084746'),(32,'course_modes','0003_auto_20151113_1443','2016-02-29 18:01:42.100516'),(33,'course_modes','0004_auto_20151113_1457','2016-02-29 18:01:42.187139'),(34,'course_modes','0005_auto_20151217_0958','2016-02-29 18:01:42.205556'),(35,'course_modes','0006_auto_20160208_1407','2016-02-29 18:01:42.289731'),(36,'course_overviews','0001_initial','2016-02-29 18:01:42.319879'),(37,'course_overviews','0002_add_course_catalog_fields','2016-02-29 18:01:42.402948'),(38,'course_overviews','0003_courseoverviewgeneratedhistory','2016-02-29 18:01:42.417563'),(39,'course_overviews','0004_courseoverview_org','2016-02-29 18:01:42.435373'),(40,'course_overviews','0005_delete_courseoverviewgeneratedhistory','2016-02-29 18:01:42.448847'),(41,'course_overviews','0006_courseoverviewimageset','2016-02-29 18:01:42.472337'),(42,'course_overviews','0007_courseoverviewimageconfig','2016-02-29 18:01:42.561497'),(43,'course_overviews','0008_remove_courseoverview_facebook_url','2016-02-29 18:01:42.582078'),(44,'course_overviews','0009_readd_facebook_url','2016-02-29 18:01:42.608691'),(45,'course_structures','0001_initial','2016-02-29 18:01:42.625296'),(46,'courseware','0001_initial','2016-02-29 18:01:44.499738'),(47,'coursewarehistoryextended','0001_initial','2016-02-29 18:01:44.691094'),(48,'credentials','0001_initial','2016-02-29 18:01:44.788912'),(49,'credit','0001_initial','2016-02-29 18:01:45.621214'),(50,'dark_lang','0001_initial','2016-02-29 18:01:45.752882'),(51,'dark_lang','0002_data__enable_on_install','2016-02-29 18:01:45.765638'),(52,'default','0001_initial','2016-02-29 18:01:46.107319'),(53,'default','0002_add_related_name','2016-02-29 18:01:46.247368'),(54,'default','0003_alter_email_max_length','2016-02-29 18:01:46.265241'),(55,'django_comment_common','0001_initial','2016-02-29 18:01:46.569556'),(56,'django_notify','0001_initial','2016-02-29 18:01:47.200935'),(57,'django_openid_auth','0001_initial','2016-02-29 18:01:47.399851'),(58,'edx_proctoring','0001_initial','2016-02-29 18:01:50.659784'),(59,'edx_proctoring','0002_proctoredexamstudentattempt_is_status_acknowledged','2016-02-29 18:01:50.845795'),(60,'edx_proctoring','0003_auto_20160101_0525','2016-02-29 18:01:51.213992'),(61,'edx_proctoring','0004_auto_20160201_0523','2016-02-29 18:01:51.397904'),(62,'edxval','0001_initial','2016-02-29 18:01:51.631665'),(63,'edxval','0002_data__default_profiles','2016-02-29 18:01:51.651781'),(64,'embargo','0001_initial','2016-02-29 18:01:52.230500'),(65,'embargo','0002_data__add_countries','2016-02-29 18:01:52.401900'),(66,'external_auth','0001_initial','2016-02-29 18:01:52.851531'),(67,'lms_xblock','0001_initial','2016-02-29 18:01:53.081369'),(68,'sites','0001_initial','2016-02-29 18:01:53.104608'),(69,'microsite_configuration','0001_initial','2016-02-29 18:01:54.497782'),(70,'microsite_configuration','0002_auto_20160202_0228','2016-02-29 18:01:55.048275'),(71,'milestones','0001_initial','2016-02-29 18:01:55.459781'),(72,'milestones','0002_data__seed_relationship_types','2016-02-29 18:01:55.481439'),(73,'milestones','0003_coursecontentmilestone_requirements','2016-02-29 18:01:55.522487'),(74,'milestones','0004_auto_20151221_1445','2016-02-29 18:01:55.688330'),(75,'mobile_api','0001_initial','2016-02-29 18:01:56.844055'),(76,'notes','0001_initial','2016-02-29 18:01:57.066857'),(77,'oauth2','0001_initial','2016-02-29 18:01:58.412080'),(78,'oauth2_provider','0001_initial','2016-02-29 18:01:58.699157'),(79,'oauth_provider','0001_initial','2016-02-29 18:01:59.448662'),(80,'organizations','0001_initial','2016-02-29 18:01:59.538595'),(81,'programs','0001_initial','2016-02-29 18:01:59.922304'),(82,'programs','0002_programsapiconfig_cache_ttl','2016-02-29 18:02:00.317781'),(83,'programs','0003_auto_20151120_1613','2016-02-29 18:02:01.977886'),(84,'programs','0004_programsapiconfig_enable_certification','2016-02-29 18:02:02.413721'),(85,'programs','0005_programsapiconfig_max_retries','2016-02-29 18:02:02.799700'),(86,'rss_proxy','0001_initial','2016-02-29 18:02:02.828648'),(87,'self_paced','0001_initial','2016-02-29 18:02:03.260889'),(88,'sessions','0001_initial','2016-02-29 18:02:03.285722'),(89,'student','0001_initial','2016-02-29 18:02:14.964735'),(90,'shoppingcart','0001_initial','2016-02-29 18:02:26.167709'),(91,'shoppingcart','0002_auto_20151208_1034','2016-02-29 18:02:26.959607'),(92,'shoppingcart','0003_auto_20151217_0958','2016-02-29 18:02:27.772373'),(93,'splash','0001_initial','2016-02-29 18:02:28.180056'),(94,'static_replace','0001_initial','2016-02-29 18:02:28.600901'),(95,'static_replace','0002_assetexcludedextensionsconfig','2016-02-29 18:02:29.072670'),(96,'status','0001_initial','2016-02-29 18:02:30.149381'),(97,'student','0002_auto_20151208_1034','2016-02-29 18:02:31.383085'),(98,'submissions','0001_initial','2016-02-29 18:02:31.704655'),(99,'submissions','0002_auto_20151119_0913','2016-02-29 18:02:31.818741'),(100,'submissions','0003_submission_status','2016-02-29 18:02:31.875924'),(101,'survey','0001_initial','2016-02-29 18:02:32.613867'),(102,'teams','0001_initial','2016-02-29 18:02:35.208964'),(103,'third_party_auth','0001_initial','2016-02-29 18:02:38.385039'),(104,'track','0001_initial','2016-02-29 18:02:38.420093'),(105,'user_api','0001_initial','2016-02-29 18:02:42.631297'),(106,'util','0001_initial','2016-02-29 18:02:43.444988'),(107,'util','0002_data__default_rate_limit_config','2016-02-29 18:02:43.472520'),(108,'verify_student','0001_initial','2016-02-29 18:02:51.517974'),(109,'verify_student','0002_auto_20151124_1024','2016-02-29 18:02:52.305832'),(110,'verify_student','0003_auto_20151113_1443','2016-02-29 18:02:53.133517'),(111,'wiki','0001_initial','2016-02-29 18:03:14.972792'),(112,'wiki','0002_remove_article_subscription','2016-02-29 18:03:15.007100'),(113,'workflow','0001_initial','2016-02-29 18:03:15.147297'),(114,'xblock_django','0001_initial','2016-02-29 18:03:15.981916'),(115,'xblock_django','0002_auto_20160204_0809','2016-02-29 18:03:16.844433'),(116,'contentstore','0001_initial','2016-02-29 18:03:37.119213'),(117,'course_creators','0001_initial','2016-02-29 18:03:37.149132'),(118,'xblock_config','0001_initial','2016-02-29 18:03:37.381904'); +/*!40000 ALTER TABLE `django_migrations` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2016-02-29 18:03:40 diff --git a/common/test/db_cache/bok_choy_schema.sql b/common/test/db_cache/bok_choy_schema_default.sql similarity index 98% rename from common/test/db_cache/bok_choy_schema.sql rename to common/test/db_cache/bok_choy_schema_default.sql index 26d6fc5574..2a09404f56 100644 --- a/common/test/db_cache/bok_choy_schema.sql +++ b/common/test/db_cache/bok_choy_schema_default.sql @@ -20,8 +20,8 @@ CREATE TABLE `assessment_aiclassifier` ( PRIMARY KEY (`id`), KEY `assessment_aiclassifier_962f069f` (`classifier_set_id`), KEY `assessment_aiclassifier_385b00a3` (`criterion_id`), - CONSTRAINT `D3bd45d5e3c9cfdc4f3b442119adebe8` FOREIGN KEY (`classifier_set_id`) REFERENCES `assessment_aiclassifierset` (`id`), - CONSTRAINT `assessm_criterion_id_275db29f2a0e1711_fk_assessment_criterion_id` FOREIGN KEY (`criterion_id`) REFERENCES `assessment_criterion` (`id`) + CONSTRAINT `assessm_criterion_id_275db29f2a0e1711_fk_assessment_criterion_id` FOREIGN KEY (`criterion_id`) REFERENCES `assessment_criterion` (`id`), + CONSTRAINT `D3bd45d5e3c9cfdc4f3b442119adebe8` FOREIGN KEY (`classifier_set_id`) REFERENCES `assessment_aiclassifierset` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `assessment_aiclassifierset`; @@ -72,9 +72,9 @@ CREATE TABLE `assessment_aigradingworkflow` ( KEY `assessment_aigradingworkflow_a4079fcf` (`assessment_id`), KEY `assessment_aigradingworkflow_962f069f` (`classifier_set_id`), KEY `assessment_aigradingworkflow_8980b7ae` (`rubric_id`), - CONSTRAINT `D4d9bca115376aeb07fd970155499db3` FOREIGN KEY (`classifier_set_id`) REFERENCES `assessment_aiclassifierset` (`id`), + CONSTRAINT `assessment_ai_rubric_id_3fc938e9e3ae7b2d_fk_assessment_rubric_id` FOREIGN KEY (`rubric_id`) REFERENCES `assessment_rubric` (`id`), CONSTRAINT `asses_assessment_id_68b86880a7f62f1c_fk_assessment_assessment_id` FOREIGN KEY (`assessment_id`) REFERENCES `assessment_assessment` (`id`), - CONSTRAINT `assessment_ai_rubric_id_3fc938e9e3ae7b2d_fk_assessment_rubric_id` FOREIGN KEY (`rubric_id`) REFERENCES `assessment_rubric` (`id`) + CONSTRAINT `D4d9bca115376aeb07fd970155499db3` FOREIGN KEY (`classifier_set_id`) REFERENCES `assessment_aiclassifierset` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `assessment_aitrainingworkflow`; @@ -110,8 +110,8 @@ CREATE TABLE `assessment_aitrainingworkflow_training_examples` ( PRIMARY KEY (`id`), UNIQUE KEY `aitrainingworkflow_id` (`aitrainingworkflow_id`,`trainingexample_id`), KEY `ff4ddecc43bd06c0d85785a61e955133` (`trainingexample_id`), - CONSTRAINT `da55be90caee21d95136e40c53e5c754` FOREIGN KEY (`aitrainingworkflow_id`) REFERENCES `assessment_aitrainingworkflow` (`id`), - CONSTRAINT `ff4ddecc43bd06c0d85785a61e955133` FOREIGN KEY (`trainingexample_id`) REFERENCES `assessment_trainingexample` (`id`) + CONSTRAINT `ff4ddecc43bd06c0d85785a61e955133` FOREIGN KEY (`trainingexample_id`) REFERENCES `assessment_trainingexample` (`id`), + CONSTRAINT `da55be90caee21d95136e40c53e5c754` FOREIGN KEY (`aitrainingworkflow_id`) REFERENCES `assessment_aitrainingworkflow` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `assessment_assessment`; @@ -154,8 +154,8 @@ CREATE TABLE `assessment_assessmentfeedback_assessments` ( PRIMARY KEY (`id`), UNIQUE KEY `assessmentfeedback_id` (`assessmentfeedback_id`,`assessment_id`), KEY `asses_assessment_id_392d354eca2e0c87_fk_assessment_assessment_id` (`assessment_id`), - CONSTRAINT `D1fc3fa7cd7be79d20561668a95a9fc1` FOREIGN KEY (`assessmentfeedback_id`) REFERENCES `assessment_assessmentfeedback` (`id`), - CONSTRAINT `asses_assessment_id_392d354eca2e0c87_fk_assessment_assessment_id` FOREIGN KEY (`assessment_id`) REFERENCES `assessment_assessment` (`id`) + CONSTRAINT `asses_assessment_id_392d354eca2e0c87_fk_assessment_assessment_id` FOREIGN KEY (`assessment_id`) REFERENCES `assessment_assessment` (`id`), + CONSTRAINT `D1fc3fa7cd7be79d20561668a95a9fc1` FOREIGN KEY (`assessmentfeedback_id`) REFERENCES `assessment_assessmentfeedback` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `assessment_assessmentfeedback_options`; @@ -168,8 +168,8 @@ CREATE TABLE `assessment_assessmentfeedback_options` ( PRIMARY KEY (`id`), UNIQUE KEY `assessmentfeedback_id` (`assessmentfeedback_id`,`assessmentfeedbackoption_id`), KEY `cc7028abc88c431df3172c9b2d6422e4` (`assessmentfeedbackoption_id`), - CONSTRAINT `cba12ac98c4a04d67d5edaa2223f4fe5` FOREIGN KEY (`assessmentfeedback_id`) REFERENCES `assessment_assessmentfeedback` (`id`), - CONSTRAINT `cc7028abc88c431df3172c9b2d6422e4` FOREIGN KEY (`assessmentfeedbackoption_id`) REFERENCES `assessment_assessmentfeedbackoption` (`id`) + CONSTRAINT `cc7028abc88c431df3172c9b2d6422e4` FOREIGN KEY (`assessmentfeedbackoption_id`) REFERENCES `assessment_assessmentfeedbackoption` (`id`), + CONSTRAINT `cba12ac98c4a04d67d5edaa2223f4fe5` FOREIGN KEY (`assessmentfeedback_id`) REFERENCES `assessment_assessmentfeedback` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `assessment_assessmentfeedbackoption`; @@ -196,8 +196,8 @@ CREATE TABLE `assessment_assessmentpart` ( KEY `assessment_assessmentpart_385b00a3` (`criterion_id`), KEY `assessment_assessmentpart_28df3725` (`option_id`), CONSTRAINT `asse_option_id_2508a14feeabf4ce_fk_assessment_criterionoption_id` FOREIGN KEY (`option_id`) REFERENCES `assessment_criterionoption` (`id`), - CONSTRAINT `asses_assessment_id_1d752290138ce479_fk_assessment_assessment_id` FOREIGN KEY (`assessment_id`) REFERENCES `assessment_assessment` (`id`), - CONSTRAINT `assessm_criterion_id_2061f2359fd292bf_fk_assessment_criterion_id` FOREIGN KEY (`criterion_id`) REFERENCES `assessment_criterion` (`id`) + CONSTRAINT `assessm_criterion_id_2061f2359fd292bf_fk_assessment_criterion_id` FOREIGN KEY (`criterion_id`) REFERENCES `assessment_criterion` (`id`), + CONSTRAINT `asses_assessment_id_1d752290138ce479_fk_assessment_assessment_id` FOREIGN KEY (`assessment_id`) REFERENCES `assessment_assessment` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `assessment_criterion`; @@ -272,9 +272,9 @@ CREATE TABLE `assessment_peerworkflowitem` ( KEY `assessm_scorer_id_2d803ee2d52c0e2c_fk_assessment_peerworkflow_id` (`scorer_id`), KEY `assessment_peerworkflowitem_ab5b2b73` (`submission_uuid`), KEY `assessment_peerworkflowitem_ff1ae11b` (`started_at`), - CONSTRAINT `asses_assessment_id_15cadfae90ddcc2a_fk_assessment_assessment_id` FOREIGN KEY (`assessment_id`) REFERENCES `assessment_assessment` (`id`), + CONSTRAINT `assessm_scorer_id_2d803ee2d52c0e2c_fk_assessment_peerworkflow_id` FOREIGN KEY (`scorer_id`) REFERENCES `assessment_peerworkflow` (`id`), CONSTRAINT `assessm_author_id_1948f89dea6d2b5f_fk_assessment_peerworkflow_id` FOREIGN KEY (`author_id`) REFERENCES `assessment_peerworkflow` (`id`), - CONSTRAINT `assessm_scorer_id_2d803ee2d52c0e2c_fk_assessment_peerworkflow_id` FOREIGN KEY (`scorer_id`) REFERENCES `assessment_peerworkflow` (`id`) + CONSTRAINT `asses_assessment_id_15cadfae90ddcc2a_fk_assessment_assessment_id` FOREIGN KEY (`assessment_id`) REFERENCES `assessment_assessment` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `assessment_rubric`; @@ -345,8 +345,8 @@ CREATE TABLE `assessment_studenttrainingworkflowitem` ( UNIQUE KEY `assessment_studenttrainingwork_workflow_id_484e930feb86ad74_uniq` (`workflow_id`,`order_num`), KEY `assessment_studenttrainingworkflowitem_9cc97abc` (`training_example_id`), KEY `assessment_studenttrainingworkflowitem_846c77cf` (`workflow_id`), - CONSTRAINT `D74ce3e30635de397fef41ac869640c7` FOREIGN KEY (`training_example_id`) REFERENCES `assessment_trainingexample` (`id`), - CONSTRAINT `f9c080ebc7ad16394edda963ed3f280f` FOREIGN KEY (`workflow_id`) REFERENCES `assessment_studenttrainingworkflow` (`id`) + CONSTRAINT `f9c080ebc7ad16394edda963ed3f280f` FOREIGN KEY (`workflow_id`) REFERENCES `assessment_studenttrainingworkflow` (`id`), + CONSTRAINT `D74ce3e30635de397fef41ac869640c7` FOREIGN KEY (`training_example_id`) REFERENCES `assessment_trainingexample` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `assessment_trainingexample`; @@ -412,7 +412,7 @@ CREATE TABLE `auth_permission` ( PRIMARY KEY (`id`), UNIQUE KEY `content_type_id` (`content_type_id`,`codename`), CONSTRAINT `auth__content_type_id_508cf46651277a81_fk_django_content_type_id` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=746 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=755 DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `auth_registration`; /*!40101 SET @saved_cs_client = @@character_set_client */; @@ -444,7 +444,7 @@ CREATE TABLE `auth_user` ( `date_joined` datetime(6) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`) -) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `auth_user_groups`; /*!40101 SET @saved_cs_client = @@character_set_client */; @@ -872,6 +872,35 @@ CREATE TABLE `certificates_generatedcertificate` ( CONSTRAINT `certificates_generatedc_user_id_77ed5f7a53121815_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `commerce_commerceconfiguration`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `commerce_commerceconfiguration` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `change_date` datetime(6) NOT NULL, + `enabled` tinyint(1) NOT NULL, + `checkout_on_ecommerce_service` tinyint(1) NOT NULL, + `single_course_checkout_page` varchar(255) NOT NULL, + `changed_by_id` int(11) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `commerce_commerce_changed_by_id_7441951d1c97c1d7_fk_auth_user_id` (`changed_by_id`), + CONSTRAINT `commerce_commerce_changed_by_id_7441951d1c97c1d7_fk_auth_user_id` FOREIGN KEY (`changed_by_id`) REFERENCES `auth_user` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `contentserver_courseassetcachettlconfig`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `contentserver_courseassetcachettlconfig` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `change_date` datetime(6) NOT NULL, + `enabled` tinyint(1) NOT NULL, + `cache_ttl` int(10) unsigned NOT NULL, + `changed_by_id` int(11) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `contentserver_cou_changed_by_id_3b5e5ff6c6df495d_fk_auth_user_id` (`changed_by_id`), + CONSTRAINT `contentserver_cou_changed_by_id_3b5e5ff6c6df495d_fk_auth_user_id` FOREIGN KEY (`changed_by_id`) REFERENCES `auth_user` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `contentstore_pushnotificationconfig`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; @@ -945,8 +974,8 @@ CREATE TABLE `course_action_state_coursererunstate` ( KEY `course_action_state_coursererunstate_c8235886` (`course_key`), KEY `course_action_state_coursererunstate_418c5509` (`action`), KEY `course_action_state_coursererunstate_a9bd7343` (`source_course_key`), - CONSTRAINT `course_action_s_created_user_id_7f53088ef8dccd0b_fk_auth_user_id` FOREIGN KEY (`created_user_id`) REFERENCES `auth_user` (`id`), - CONSTRAINT `course_action_s_updated_user_id_4fab18012332c9a4_fk_auth_user_id` FOREIGN KEY (`updated_user_id`) REFERENCES `auth_user` (`id`) + CONSTRAINT `course_action_s_updated_user_id_4fab18012332c9a4_fk_auth_user_id` FOREIGN KEY (`updated_user_id`) REFERENCES `auth_user` (`id`), + CONSTRAINT `course_action_s_created_user_id_7f53088ef8dccd0b_fk_auth_user_id` FOREIGN KEY (`created_user_id`) REFERENCES `auth_user` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `course_creators_coursecreator`; @@ -975,8 +1004,8 @@ CREATE TABLE `course_groups_cohortmembership` ( UNIQUE KEY `course_groups_cohortmembership_user_id_395bddd0389ed7da_uniq` (`user_id`,`course_id`), KEY `course_groups_cohortmembership_6e438ee3` (`course_user_group_id`), KEY `course_groups_cohortmembership_e8701ad4` (`user_id`), - CONSTRAINT `D004e77c965054d46217a8bd48bcaec8` FOREIGN KEY (`course_user_group_id`) REFERENCES `course_groups_courseusergroup` (`id`), - CONSTRAINT `course_groups_cohortmem_user_id_15d408bf736398bf_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) + CONSTRAINT `course_groups_cohortmem_user_id_15d408bf736398bf_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`), + CONSTRAINT `D004e77c965054d46217a8bd48bcaec8` FOREIGN KEY (`course_user_group_id`) REFERENCES `course_groups_courseusergroup` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `course_groups_coursecohort`; @@ -1114,7 +1143,6 @@ CREATE TABLE `course_overviews_courseoverview` ( `end` datetime(6) DEFAULT NULL, `advertised_start` longtext, `course_image_url` longtext NOT NULL, - `facebook_url` longtext, `social_sharing_url` longtext, `end_of_course_survey_url` longtext, `certificates_display_behavior` longtext, @@ -1139,6 +1167,7 @@ CREATE TABLE `course_overviews_courseoverview` ( `effort` longtext, `short_description` longtext, `org` longtext NOT NULL, + `facebook_url` longtext, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; @@ -1558,8 +1587,8 @@ CREATE TABLE `django_admin_log` ( PRIMARY KEY (`id`), KEY `djang_content_type_id_697914295151027a_fk_django_content_type_id` (`content_type_id`), KEY `django_admin_log_user_id_52fdd58701c5f563_fk_auth_user_id` (`user_id`), - CONSTRAINT `djang_content_type_id_697914295151027a_fk_django_content_type_id` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`), - CONSTRAINT `django_admin_log_user_id_52fdd58701c5f563_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) + CONSTRAINT `django_admin_log_user_id_52fdd58701c5f563_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`), + CONSTRAINT `djang_content_type_id_697914295151027a_fk_django_content_type_id` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `django_comment_client_permission`; @@ -1580,8 +1609,8 @@ CREATE TABLE `django_comment_client_permission_roles` ( PRIMARY KEY (`id`), UNIQUE KEY `permission_id` (`permission_id`,`role_id`), KEY `django_role_id_558412c96ef7ba87_fk_django_comment_client_role_id` (`role_id`), - CONSTRAINT `D4e9a4067c1db9041491363f5e032121` FOREIGN KEY (`permission_id`) REFERENCES `django_comment_client_permission` (`name`), - CONSTRAINT `django_role_id_558412c96ef7ba87_fk_django_comment_client_role_id` FOREIGN KEY (`role_id`) REFERENCES `django_comment_client_role` (`id`) + CONSTRAINT `django_role_id_558412c96ef7ba87_fk_django_comment_client_role_id` FOREIGN KEY (`role_id`) REFERENCES `django_comment_client_role` (`id`), + CONSTRAINT `D4e9a4067c1db9041491363f5e032121` FOREIGN KEY (`permission_id`) REFERENCES `django_comment_client_permission` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `django_comment_client_role`; @@ -1618,7 +1647,7 @@ CREATE TABLE `django_content_type` ( `model` varchar(100) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `django_content_type_app_label_45f3b1d93ec8c61c_uniq` (`app_label`,`model`) -) ENGINE=InnoDB AUTO_INCREMENT=248 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=251 DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `django_migrations`; /*!40101 SET @saved_cs_client = @@character_set_client */; @@ -1629,7 +1658,7 @@ CREATE TABLE `django_migrations` ( `name` varchar(255) NOT NULL, `applied` datetime(6) NOT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=107 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=119 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 */; @@ -1737,8 +1766,8 @@ CREATE TABLE `djcelery_periodictask` ( UNIQUE KEY `name` (`name`), KEY `djc_interval_id_20cfc1cad060dfad_fk_djcelery_intervalschedule_id` (`interval_id`), KEY `djcel_crontab_id_1d8228f5b44b680a_fk_djcelery_crontabschedule_id` (`crontab_id`), - CONSTRAINT `djc_interval_id_20cfc1cad060dfad_fk_djcelery_intervalschedule_id` FOREIGN KEY (`interval_id`) REFERENCES `djcelery_intervalschedule` (`id`), - CONSTRAINT `djcel_crontab_id_1d8228f5b44b680a_fk_djcelery_crontabschedule_id` FOREIGN KEY (`crontab_id`) REFERENCES `djcelery_crontabschedule` (`id`) + CONSTRAINT `djcel_crontab_id_1d8228f5b44b680a_fk_djcelery_crontabschedule_id` FOREIGN KEY (`crontab_id`) REFERENCES `djcelery_crontabschedule` (`id`), + CONSTRAINT `djc_interval_id_20cfc1cad060dfad_fk_djcelery_intervalschedule_id` FOREIGN KEY (`interval_id`) REFERENCES `djcelery_intervalschedule` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `djcelery_periodictasks`; @@ -1819,8 +1848,8 @@ CREATE TABLE `edxval_encodedvideo` ( PRIMARY KEY (`id`), KEY `edxval_encodedvideo_83a0eb3f` (`profile_id`), KEY `edxval_encodedvideo_b58b747e` (`video_id`), - CONSTRAINT `edxval_encodedv_profile_id_484a111092acafb3_fk_edxval_profile_id` FOREIGN KEY (`profile_id`) REFERENCES `edxval_profile` (`id`), - CONSTRAINT `edxval_encodedvideo_video_id_56934bca09fc3b13_fk_edxval_video_id` FOREIGN KEY (`video_id`) REFERENCES `edxval_video` (`id`) + CONSTRAINT `edxval_encodedvideo_video_id_56934bca09fc3b13_fk_edxval_video_id` FOREIGN KEY (`video_id`) REFERENCES `edxval_video` (`id`), + CONSTRAINT `edxval_encodedv_profile_id_484a111092acafb3_fk_edxval_profile_id` FOREIGN KEY (`profile_id`) REFERENCES `edxval_profile` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `edxval_profile`; @@ -2087,8 +2116,7 @@ CREATE TABLE `microsite_configuration_micrositehistory` ( `values` longtext NOT NULL, `site_id` int(11) NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `key` (`key`), - UNIQUE KEY `site_id` (`site_id`), + KEY `microsite_configurati_site_id_6977a04d3625a533_fk_django_site_id` (`site_id`), CONSTRAINT `microsite_configurati_site_id_6977a04d3625a533_fk_django_site_id` FOREIGN KEY (`site_id`) REFERENCES `django_site` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; @@ -2131,12 +2159,14 @@ CREATE TABLE `milestones_coursecontentmilestone` ( `active` tinyint(1) NOT NULL, `milestone_id` int(11) NOT NULL, `milestone_relationship_type_id` int(11) NOT NULL, + `requirements` varchar(255), PRIMARY KEY (`id`), UNIQUE KEY `milestones_coursecontentmileston_course_id_68d1457cd52d6dff_uniq` (`course_id`,`content_id`,`milestone_id`), KEY `milestones_coursecontentmilestone_ea134da7` (`course_id`), KEY `milestones_coursecontentmilestone_e14f02ad` (`content_id`), KEY `milestones_coursecontentmilestone_dbb5cd1e` (`milestone_id`), KEY `milestones_coursecontentmilestone_db6866e3` (`milestone_relationship_type_id`), + KEY `milestones_coursecontentmilestone_active_39b5c645fa33bfee_uniq` (`active`), CONSTRAINT `D84e404851bc6d6b9fe0d60955e8729c` FOREIGN KEY (`milestone_relationship_type_id`) REFERENCES `milestones_milestonerelationshiptype` (`id`), CONSTRAINT `milesto_milestone_id_73b6eddde5b205a8_fk_milestones_milestone_id` FOREIGN KEY (`milestone_id`) REFERENCES `milestones_milestone` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; @@ -2157,6 +2187,7 @@ CREATE TABLE `milestones_coursemilestone` ( KEY `milestones_coursemilestone_ea134da7` (`course_id`), KEY `milestones_coursemilestone_dbb5cd1e` (`milestone_id`), KEY `milestones_coursemilestone_db6866e3` (`milestone_relationship_type_id`), + KEY `milestones_coursemilestone_active_5c3a925f8cc4bde2_uniq` (`active`), CONSTRAINT `D69536d0d313008147c5daf5341090e1` FOREIGN KEY (`milestone_relationship_type_id`) REFERENCES `milestones_milestonerelationshiptype` (`id`), CONSTRAINT `milesto_milestone_id_284153799c54d7d8_fk_milestones_milestone_id` FOREIGN KEY (`milestone_id`) REFERENCES `milestones_milestone` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; @@ -2176,7 +2207,8 @@ CREATE TABLE `milestones_milestone` ( PRIMARY KEY (`id`), UNIQUE KEY `milestones_milestone_namespace_460a2f6943016c0b_uniq` (`namespace`,`name`), KEY `milestones_milestone_89801e9e` (`namespace`), - KEY `milestones_milestone_b068931c` (`name`) + KEY `milestones_milestone_b068931c` (`name`), + KEY `milestones_milestone_active_1182ba3c09d42c35_uniq` (`active`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `milestones_milestonerelationshiptype`; @@ -2209,6 +2241,7 @@ CREATE TABLE `milestones_usermilestone` ( UNIQUE KEY `milestones_usermilestone_user_id_10206aa452468351_uniq` (`user_id`,`milestone_id`), KEY `milesto_milestone_id_4fe38e3e9994f15c_fk_milestones_milestone_id` (`milestone_id`), KEY `milestones_usermilestone_e8701ad4` (`user_id`), + KEY `milestones_usermilestone_active_1827f467fe87a8ea_uniq` (`active`), CONSTRAINT `milesto_milestone_id_4fe38e3e9994f15c_fk_milestones_milestone_id` FOREIGN KEY (`milestone_id`) REFERENCES `milestones_milestone` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; @@ -2304,8 +2337,8 @@ CREATE TABLE `notify_subscription` ( PRIMARY KEY (`subscription_id`), KEY `a2462650bbefc26547210b80dec61069` (`notification_type_id`), KEY `notify_subscr_settings_id_64d594d127e8ca95_fk_notify_settings_id` (`settings_id`), - CONSTRAINT `a2462650bbefc26547210b80dec61069` FOREIGN KEY (`notification_type_id`) REFERENCES `notify_notificationtype` (`key`), - CONSTRAINT `notify_subscr_settings_id_64d594d127e8ca95_fk_notify_settings_id` FOREIGN KEY (`settings_id`) REFERENCES `notify_settings` (`id`) + CONSTRAINT `notify_subscr_settings_id_64d594d127e8ca95_fk_notify_settings_id` FOREIGN KEY (`settings_id`) REFERENCES `notify_settings` (`id`), + CONSTRAINT `a2462650bbefc26547210b80dec61069` FOREIGN KEY (`notification_type_id`) REFERENCES `notify_notificationtype` (`key`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `oauth2_accesstoken`; @@ -2322,8 +2355,8 @@ CREATE TABLE `oauth2_accesstoken` ( KEY `oauth2_accesstoken_94a08da1` (`token`), KEY `oauth2_accesstoken_2bfe9d72` (`client_id`), KEY `oauth2_accesstoken_e8701ad4` (`user_id`), - CONSTRAINT `oauth2_accesstoke_client_id_20c73b03a7c139a2_fk_oauth2_client_id` FOREIGN KEY (`client_id`) REFERENCES `oauth2_client` (`id`), - CONSTRAINT `oauth2_accesstoken_user_id_7a865c7085722378_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) + CONSTRAINT `oauth2_accesstoken_user_id_7a865c7085722378_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`), + CONSTRAINT `oauth2_accesstoke_client_id_20c73b03a7c139a2_fk_oauth2_client_id` FOREIGN KEY (`client_id`) REFERENCES `oauth2_client` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `oauth2_client`; @@ -2357,8 +2390,8 @@ CREATE TABLE `oauth2_grant` ( PRIMARY KEY (`id`), KEY `oauth2_grant_client_id_fbfc174fbc856af_fk_oauth2_client_id` (`client_id`), KEY `oauth2_grant_user_id_3de96a461bb76819_fk_auth_user_id` (`user_id`), - CONSTRAINT `oauth2_grant_client_id_fbfc174fbc856af_fk_oauth2_client_id` FOREIGN KEY (`client_id`) REFERENCES `oauth2_client` (`id`), - CONSTRAINT `oauth2_grant_user_id_3de96a461bb76819_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) + CONSTRAINT `oauth2_grant_user_id_3de96a461bb76819_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`), + CONSTRAINT `oauth2_grant_client_id_fbfc174fbc856af_fk_oauth2_client_id` FOREIGN KEY (`client_id`) REFERENCES `oauth2_client` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `oauth2_provider_trustedclient`; @@ -2386,9 +2419,9 @@ CREATE TABLE `oauth2_refreshtoken` ( UNIQUE KEY `access_token_id` (`access_token_id`), KEY `oauth2_refreshtok_client_id_2f55036ac9aa614e_fk_oauth2_client_id` (`client_id`), KEY `oauth2_refreshtoken_user_id_acecf94460b787c_fk_auth_user_id` (`user_id`), - CONSTRAINT `oauth2__access_token_id_f99377d503a000b_fk_oauth2_accesstoken_id` FOREIGN KEY (`access_token_id`) REFERENCES `oauth2_accesstoken` (`id`), + CONSTRAINT `oauth2_refreshtoken_user_id_acecf94460b787c_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`), CONSTRAINT `oauth2_refreshtok_client_id_2f55036ac9aa614e_fk_oauth2_client_id` FOREIGN KEY (`client_id`) REFERENCES `oauth2_client` (`id`), - CONSTRAINT `oauth2_refreshtoken_user_id_acecf94460b787c_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) + CONSTRAINT `oauth2__access_token_id_f99377d503a000b_fk_oauth2_accesstoken_id` FOREIGN KEY (`access_token_id`) REFERENCES `oauth2_accesstoken` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `oauth_provider_consumer`; @@ -2452,9 +2485,9 @@ CREATE TABLE `oauth_provider_token` ( KEY `oauth_consumer_id_1b9915b5bcf1ee5b_fk_oauth_provider_consumer_id` (`consumer_id`), KEY `oauth_provi_scope_id_459821b6fecbc02a_fk_oauth_provider_scope_id` (`scope_id`), KEY `oauth_provider_token_user_id_588adbcffc892186_fk_auth_user_id` (`user_id`), + CONSTRAINT `oauth_provider_token_user_id_588adbcffc892186_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`), CONSTRAINT `oauth_consumer_id_1b9915b5bcf1ee5b_fk_oauth_provider_consumer_id` FOREIGN KEY (`consumer_id`) REFERENCES `oauth_provider_consumer` (`id`), - CONSTRAINT `oauth_provi_scope_id_459821b6fecbc02a_fk_oauth_provider_scope_id` FOREIGN KEY (`scope_id`) REFERENCES `oauth_provider_scope` (`id`), - CONSTRAINT `oauth_provider_token_user_id_588adbcffc892186_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) + CONSTRAINT `oauth_provi_scope_id_459821b6fecbc02a_fk_oauth_provider_scope_id` FOREIGN KEY (`scope_id`) REFERENCES `oauth_provider_scope` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `organizations_organization`; @@ -2491,24 +2524,6 @@ CREATE TABLE `organizations_organizationcourse` ( CONSTRAINT `a7b04b16eba98e518fbe21d390bd8e3e` FOREIGN KEY (`organization_id`) REFERENCES `organizations_organization` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `problem_builder_answer`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `problem_builder_answer` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `name` varchar(50) NOT NULL, - `student_id` varchar(32) NOT NULL, - `course_id` varchar(50) NOT NULL, - `student_input` longtext NOT NULL, - `created_on` datetime(6) NOT NULL, - `modified_on` datetime(6) NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `problem_builder_answer_student_id_2f6847a9fb3e9385_uniq` (`student_id`,`course_id`,`name`), - KEY `problem_builder_answer_b068931c` (`name`), - KEY `problem_builder_answer_30a811f6` (`student_id`), - KEY `problem_builder_answer_ea134da7` (`course_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `proctoring_proctoredexam`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; @@ -2545,8 +2560,8 @@ CREATE TABLE `proctoring_proctoredexamreviewpolicy` ( PRIMARY KEY (`id`), KEY `D32bab97500954b362d3f768dd89b6da` (`proctored_exam_id`), KEY `proctoring_proct_set_by_user_id_75a66580aa44cd84_fk_auth_user_id` (`set_by_user_id`), - CONSTRAINT `D32bab97500954b362d3f768dd89b6da` FOREIGN KEY (`proctored_exam_id`) REFERENCES `proctoring_proctoredexam` (`id`), - CONSTRAINT `proctoring_proct_set_by_user_id_75a66580aa44cd84_fk_auth_user_id` FOREIGN KEY (`set_by_user_id`) REFERENCES `auth_user` (`id`) + CONSTRAINT `proctoring_proct_set_by_user_id_75a66580aa44cd84_fk_auth_user_id` FOREIGN KEY (`set_by_user_id`) REFERENCES `auth_user` (`id`), + CONSTRAINT `D32bab97500954b362d3f768dd89b6da` FOREIGN KEY (`proctored_exam_id`) REFERENCES `proctoring_proctoredexam` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `proctoring_proctoredexamreviewpolicyhistory`; @@ -2564,8 +2579,8 @@ CREATE TABLE `proctoring_proctoredexamreviewpolicyhistory` ( KEY `d9965d8af87bebd0587414ca1ba4826f` (`proctored_exam_id`), KEY `proctoring_procto_set_by_user_id_31fae610848d90f_fk_auth_user_id` (`set_by_user_id`), KEY `proctoring_proctoredexamreviewpolicyhistory_524b09d0` (`original_id`), - CONSTRAINT `d9965d8af87bebd0587414ca1ba4826f` FOREIGN KEY (`proctored_exam_id`) REFERENCES `proctoring_proctoredexam` (`id`), - CONSTRAINT `proctoring_procto_set_by_user_id_31fae610848d90f_fk_auth_user_id` FOREIGN KEY (`set_by_user_id`) REFERENCES `auth_user` (`id`) + CONSTRAINT `proctoring_procto_set_by_user_id_31fae610848d90f_fk_auth_user_id` FOREIGN KEY (`set_by_user_id`) REFERENCES `auth_user` (`id`), + CONSTRAINT `d9965d8af87bebd0587414ca1ba4826f` FOREIGN KEY (`proctored_exam_id`) REFERENCES `proctoring_proctoredexam` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `proctoring_proctoredexamsoftwaresecurereview`; @@ -2583,13 +2598,14 @@ CREATE TABLE `proctoring_proctoredexamsoftwaresecurereview` ( `reviewed_by_id` int(11) DEFAULT NULL, `student_id` int(11) DEFAULT NULL, PRIMARY KEY (`id`), + UNIQUE KEY `proctoring_proctoredexamsoftw_attempt_code_69b9866a54964afb_uniq` (`attempt_code`), KEY `proctori_exam_id_635059f5fe2cc392_fk_proctoring_proctoredexam_id` (`exam_id`), KEY `proctoring_proct_reviewed_by_id_4cff67b7de094f65_fk_auth_user_id` (`reviewed_by_id`), KEY `proctoring_proctored_student_id_14c182517b0cbb5b_fk_auth_user_id` (`student_id`), KEY `proctoring_proctoredexamsoftwaresecurereview_b38e5b0e` (`attempt_code`), - CONSTRAINT `proctori_exam_id_635059f5fe2cc392_fk_proctoring_proctoredexam_id` FOREIGN KEY (`exam_id`) REFERENCES `proctoring_proctoredexam` (`id`), + CONSTRAINT `proctoring_proctored_student_id_14c182517b0cbb5b_fk_auth_user_id` FOREIGN KEY (`student_id`) REFERENCES `auth_user` (`id`), CONSTRAINT `proctoring_proct_reviewed_by_id_4cff67b7de094f65_fk_auth_user_id` FOREIGN KEY (`reviewed_by_id`) REFERENCES `auth_user` (`id`), - CONSTRAINT `proctoring_proctored_student_id_14c182517b0cbb5b_fk_auth_user_id` FOREIGN KEY (`student_id`) REFERENCES `auth_user` (`id`) + CONSTRAINT `proctori_exam_id_635059f5fe2cc392_fk_proctoring_proctoredexam_id` FOREIGN KEY (`exam_id`) REFERENCES `proctoring_proctoredexam` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `proctoring_proctoredexamsoftwaresecurereviewhistory`; @@ -2611,9 +2627,9 @@ CREATE TABLE `proctoring_proctoredexamsoftwaresecurereviewhistory` ( KEY `proctoring_proct_reviewed_by_id_139568d0bf423998_fk_auth_user_id` (`reviewed_by_id`), KEY `proctoring_proctored_student_id_6922ba3b791462d8_fk_auth_user_id` (`student_id`), KEY `proctoring_proctoredexamsoftwaresecurereviewhistory_b38e5b0e` (`attempt_code`), - CONSTRAINT `proctori_exam_id_73969ae423813477_fk_proctoring_proctoredexam_id` FOREIGN KEY (`exam_id`) REFERENCES `proctoring_proctoredexam` (`id`), + CONSTRAINT `proctoring_proctored_student_id_6922ba3b791462d8_fk_auth_user_id` FOREIGN KEY (`student_id`) REFERENCES `auth_user` (`id`), CONSTRAINT `proctoring_proct_reviewed_by_id_139568d0bf423998_fk_auth_user_id` FOREIGN KEY (`reviewed_by_id`) REFERENCES `auth_user` (`id`), - CONSTRAINT `proctoring_proctored_student_id_6922ba3b791462d8_fk_auth_user_id` FOREIGN KEY (`student_id`) REFERENCES `auth_user` (`id`) + CONSTRAINT `proctori_exam_id_73969ae423813477_fk_proctoring_proctoredexam_id` FOREIGN KEY (`exam_id`) REFERENCES `proctoring_proctoredexam` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `proctoring_proctoredexamstudentallowance`; @@ -2630,8 +2646,8 @@ CREATE TABLE `proctoring_proctoredexamstudentallowance` ( PRIMARY KEY (`id`), UNIQUE KEY `proctoring_proctoredexamstudentall_user_id_665ed945152c2f60_uniq` (`user_id`,`proctored_exam_id`,`key`), KEY `db55b83a7875e70b3a0ebd1f81a898d8` (`proctored_exam_id`), - CONSTRAINT `db55b83a7875e70b3a0ebd1f81a898d8` FOREIGN KEY (`proctored_exam_id`) REFERENCES `proctoring_proctoredexam` (`id`), - CONSTRAINT `proctoring_proctoredexam_user_id_a0a0681d4a01661_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) + CONSTRAINT `proctoring_proctoredexam_user_id_a0a0681d4a01661_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`), + CONSTRAINT `db55b83a7875e70b3a0ebd1f81a898d8` FOREIGN KEY (`proctored_exam_id`) REFERENCES `proctoring_proctoredexam` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `proctoring_proctoredexamstudentallowancehistory`; @@ -2649,8 +2665,8 @@ CREATE TABLE `proctoring_proctoredexamstudentallowancehistory` ( PRIMARY KEY (`id`), KEY `D169ec97a7fca1dbf6b0bb2929d41ccc` (`proctored_exam_id`), KEY `proctoring_proctoredexa_user_id_68e25e3abb187580_fk_auth_user_id` (`user_id`), - CONSTRAINT `D169ec97a7fca1dbf6b0bb2929d41ccc` FOREIGN KEY (`proctored_exam_id`) REFERENCES `proctoring_proctoredexam` (`id`), - CONSTRAINT `proctoring_proctoredexa_user_id_68e25e3abb187580_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) + CONSTRAINT `proctoring_proctoredexa_user_id_68e25e3abb187580_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`), + CONSTRAINT `D169ec97a7fca1dbf6b0bb2929d41ccc` FOREIGN KEY (`proctored_exam_id`) REFERENCES `proctoring_proctoredexam` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `proctoring_proctoredexamstudentattempt`; @@ -2729,8 +2745,8 @@ CREATE TABLE `proctoring_proctoredexamstudentattempthistory` ( KEY `proctoring_proctoredexa_user_id_59ce75db7c4fc769_fk_auth_user_id` (`user_id`), KEY `proctoring_proctoredexamstudentattempthistory_b38e5b0e` (`attempt_code`), KEY `proctoring_proctoredexamstudentattempthistory_0e684294` (`external_id`), - CONSTRAINT `cbccbfd5c4c427541fdce96e77e6bf6c` FOREIGN KEY (`proctored_exam_id`) REFERENCES `proctoring_proctoredexam` (`id`), - CONSTRAINT `proctoring_proctoredexa_user_id_59ce75db7c4fc769_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) + CONSTRAINT `proctoring_proctoredexa_user_id_59ce75db7c4fc769_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`), + CONSTRAINT `cbccbfd5c4c427541fdce96e77e6bf6c` FOREIGN KEY (`proctored_exam_id`) REFERENCES `proctoring_proctoredexam` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `programs_programsapiconfig`; @@ -2749,6 +2765,8 @@ CREATE TABLE `programs_programsapiconfig` ( `authoring_app_css_path` varchar(255) NOT NULL, `authoring_app_js_path` varchar(255) NOT NULL, `enable_studio_tab` tinyint(1) NOT NULL, + `enable_certification` tinyint(1) NOT NULL, + `max_retries` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), KEY `programs_programsa_changed_by_id_b7c3b49d5c0dcd3_fk_auth_user_id` (`changed_by_id`), CONSTRAINT `programs_programsa_changed_by_id_b7c3b49d5c0dcd3_fk_auth_user_id` FOREIGN KEY (`changed_by_id`) REFERENCES `auth_user` (`id`) @@ -2827,9 +2845,9 @@ CREATE TABLE `shoppingcart_couponredemption` ( KEY `shoppingcar_coupon_id_1afa016627ac44bb_fk_shoppingcart_coupon_id` (`coupon_id`), KEY `shoppingcart_couponredemption_69dfcb07` (`order_id`), KEY `shoppingcart_couponredemption_e8701ad4` (`user_id`), - CONSTRAINT `shoppingcar_coupon_id_1afa016627ac44bb_fk_shoppingcart_coupon_id` FOREIGN KEY (`coupon_id`) REFERENCES `shoppingcart_coupon` (`id`), + CONSTRAINT `shoppingcart_couponredemp_user_id_f5b814b7d92666_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`), CONSTRAINT `shoppingcart__order_id_5ba031c3bfaf643a_fk_shoppingcart_order_id` FOREIGN KEY (`order_id`) REFERENCES `shoppingcart_order` (`id`), - CONSTRAINT `shoppingcart_couponredemp_user_id_f5b814b7d92666_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) + CONSTRAINT `shoppingcar_coupon_id_1afa016627ac44bb_fk_shoppingcart_coupon_id` FOREIGN KEY (`coupon_id`) REFERENCES `shoppingcart_coupon` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `shoppingcart_courseregcodeitem`; @@ -2878,9 +2896,9 @@ CREATE TABLE `shoppingcart_courseregistrationcode` ( KEY `shoppingcart_courseregistrationcode_69dfcb07` (`order_id`), KEY `shoppingcart_courseregistrationcode_7a471658` (`invoice_item_id`), CONSTRAINT `f040030b6361304bd87eb40c09a82094` FOREIGN KEY (`invoice_item_id`) REFERENCES `shoppingcart_courseregistrationcodeinvoiceitem` (`invoiceitem_ptr_id`), - CONSTRAINT `shoppingc_invoice_id_422f26bdc7c5cb99_fk_shoppingcart_invoice_id` FOREIGN KEY (`invoice_id`) REFERENCES `shoppingcart_invoice` (`id`), + CONSTRAINT `shoppingcart_cour_created_by_id_11125a9667aa01c9_fk_auth_user_id` FOREIGN KEY (`created_by_id`) REFERENCES `auth_user` (`id`), CONSTRAINT `shoppingcart__order_id_279d7e2df3fe6b6a_fk_shoppingcart_order_id` FOREIGN KEY (`order_id`) REFERENCES `shoppingcart_order` (`id`), - CONSTRAINT `shoppingcart_cour_created_by_id_11125a9667aa01c9_fk_auth_user_id` FOREIGN KEY (`created_by_id`) REFERENCES `auth_user` (`id`) + CONSTRAINT `shoppingc_invoice_id_422f26bdc7c5cb99_fk_shoppingcart_invoice_id` FOREIGN KEY (`invoice_id`) REFERENCES `shoppingcart_invoice` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `shoppingcart_courseregistrationcodeinvoiceitem`; @@ -2996,9 +3014,9 @@ CREATE TABLE `shoppingcart_invoicetransaction` ( KEY `shoppingcart_invoi_created_by_id_f5f3d90ce55a145_fk_auth_user_id` (`created_by_id`), KEY `shoppingc_invoice_id_66bdbfa6f029288b_fk_shoppingcart_invoice_id` (`invoice_id`), KEY `shoppingcar_last_modified_by_id_5e10e433f9576d91_fk_auth_user_id` (`last_modified_by_id`), - CONSTRAINT `shoppingc_invoice_id_66bdbfa6f029288b_fk_shoppingcart_invoice_id` FOREIGN KEY (`invoice_id`) REFERENCES `shoppingcart_invoice` (`id`), CONSTRAINT `shoppingcar_last_modified_by_id_5e10e433f9576d91_fk_auth_user_id` FOREIGN KEY (`last_modified_by_id`) REFERENCES `auth_user` (`id`), - CONSTRAINT `shoppingcart_invoi_created_by_id_f5f3d90ce55a145_fk_auth_user_id` FOREIGN KEY (`created_by_id`) REFERENCES `auth_user` (`id`) + CONSTRAINT `shoppingcart_invoi_created_by_id_f5f3d90ce55a145_fk_auth_user_id` FOREIGN KEY (`created_by_id`) REFERENCES `auth_user` (`id`), + CONSTRAINT `shoppingc_invoice_id_66bdbfa6f029288b_fk_shoppingcart_invoice_id` FOREIGN KEY (`invoice_id`) REFERENCES `shoppingcart_invoice` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `shoppingcart_order`; @@ -3059,8 +3077,8 @@ CREATE TABLE `shoppingcart_orderitem` ( KEY `shoppingcart_orderitem_76ed2946` (`refund_requested_time`), KEY `shoppingcart_orderitem_69dfcb07` (`order_id`), KEY `shoppingcart_orderitem_e8701ad4` (`user_id`), - CONSTRAINT `shoppingcart__order_id_325e5347f18743e3_fk_shoppingcart_order_id` FOREIGN KEY (`order_id`) REFERENCES `shoppingcart_order` (`id`), - CONSTRAINT `shoppingcart_orderitem_user_id_5708ec7aabe24a31_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) + CONSTRAINT `shoppingcart_orderitem_user_id_5708ec7aabe24a31_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`), + CONSTRAINT `shoppingcart__order_id_325e5347f18743e3_fk_shoppingcart_order_id` FOREIGN KEY (`order_id`) REFERENCES `shoppingcart_order` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `shoppingcart_paidcourseregistration`; @@ -3107,8 +3125,8 @@ CREATE TABLE `shoppingcart_registrationcoderedemption` ( KEY `D1ed44c4be114e424571929bce972f54` (`registration_code_id`), CONSTRAINT `D1ed44c4be114e424571929bce972f54` FOREIGN KEY (`registration_code_id`) REFERENCES `shoppingcart_courseregistrationcode` (`id`), CONSTRAINT `D6654a8efe686d45804b6116dfc6bee1` FOREIGN KEY (`course_enrollment_id`) REFERENCES `student_courseenrollment` (`id`), - CONSTRAINT `shoppingcart_r_order_id_752ddc3003afe96_fk_shoppingcart_order_id` FOREIGN KEY (`order_id`) REFERENCES `shoppingcart_order` (`id`), - CONSTRAINT `shoppingcart_reg_redeemed_by_id_455df2dd74004fff_fk_auth_user_id` FOREIGN KEY (`redeemed_by_id`) REFERENCES `auth_user` (`id`) + CONSTRAINT `shoppingcart_reg_redeemed_by_id_455df2dd74004fff_fk_auth_user_id` FOREIGN KEY (`redeemed_by_id`) REFERENCES `auth_user` (`id`), + CONSTRAINT `shoppingcart_r_order_id_752ddc3003afe96_fk_shoppingcart_order_id` FOREIGN KEY (`order_id`) REFERENCES `shoppingcart_order` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `social_auth_association`; @@ -3197,6 +3215,20 @@ CREATE TABLE `static_replace_assetbaseurlconfig` ( CONSTRAINT `static_replace_as_changed_by_id_796c2e5b1bee7027_fk_auth_user_id` FOREIGN KEY (`changed_by_id`) REFERENCES `auth_user` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `static_replace_assetexcludedextensionsconfig`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `static_replace_assetexcludedextensionsconfig` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `change_date` datetime(6) NOT NULL, + `enabled` tinyint(1) NOT NULL, + `excluded_extensions` longtext NOT NULL, + `changed_by_id` int(11) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `static_replace_as_changed_by_id_5885827de4f271dc_fk_auth_user_id` (`changed_by_id`), + CONSTRAINT `static_replace_as_changed_by_id_5885827de4f271dc_fk_auth_user_id` FOREIGN KEY (`changed_by_id`) REFERENCES `auth_user` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `status_coursemessage`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; @@ -3499,8 +3531,8 @@ CREATE TABLE `student_userstanding` ( PRIMARY KEY (`id`), UNIQUE KEY `user_id` (`user_id`), KEY `student_userstand_changed_by_id_23784b83f2849aff_fk_auth_user_id` (`changed_by_id`), - CONSTRAINT `student_userstand_changed_by_id_23784b83f2849aff_fk_auth_user_id` FOREIGN KEY (`changed_by_id`) REFERENCES `auth_user` (`id`), - CONSTRAINT `student_userstanding_user_id_6bb90abaaa05d42e_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) + CONSTRAINT `student_userstanding_user_id_6bb90abaaa05d42e_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`), + CONSTRAINT `student_userstand_changed_by_id_23784b83f2849aff_fk_auth_user_id` FOREIGN KEY (`changed_by_id`) REFERENCES `auth_user` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `student_usertestgroup`; @@ -3524,8 +3556,8 @@ CREATE TABLE `student_usertestgroup_users` ( PRIMARY KEY (`id`), UNIQUE KEY `usertestgroup_id` (`usertestgroup_id`,`user_id`), KEY `student_usertestgroup_u_user_id_26c886de60cceacb_fk_auth_user_id` (`user_id`), - CONSTRAINT `st_usertestgroup_id_3d634741f1dd4e4f_fk_student_usertestgroup_id` FOREIGN KEY (`usertestgroup_id`) REFERENCES `student_usertestgroup` (`id`), - CONSTRAINT `student_usertestgroup_u_user_id_26c886de60cceacb_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) + CONSTRAINT `student_usertestgroup_u_user_id_26c886de60cceacb_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`), + CONSTRAINT `st_usertestgroup_id_3d634741f1dd4e4f_fk_student_usertestgroup_id` FOREIGN KEY (`usertestgroup_id`) REFERENCES `student_usertestgroup` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `submissions_score`; @@ -3543,8 +3575,8 @@ CREATE TABLE `submissions_score` ( KEY `submissions_score_fde81f11` (`created_at`), KEY `submissions_score_02d5e83e` (`student_item_id`), KEY `submissions_score_1dd9cfcc` (`submission_id`), - CONSTRAINT `s_student_item_id_7d4d4bb6a7dd0642_fk_submissions_studentitem_id` FOREIGN KEY (`student_item_id`) REFERENCES `submissions_studentitem` (`id`), - CONSTRAINT `subm_submission_id_3fc975fe88442ff7_fk_submissions_submission_id` FOREIGN KEY (`submission_id`) REFERENCES `submissions_submission` (`id`) + CONSTRAINT `subm_submission_id_3fc975fe88442ff7_fk_submissions_submission_id` FOREIGN KEY (`submission_id`) REFERENCES `submissions_submission` (`id`), + CONSTRAINT `s_student_item_id_7d4d4bb6a7dd0642_fk_submissions_studentitem_id` FOREIGN KEY (`student_item_id`) REFERENCES `submissions_studentitem` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `submissions_scoreannotation`; @@ -3576,8 +3608,8 @@ CREATE TABLE `submissions_scoresummary` ( KEY `submissions__highest_id_7fd91b8eb312c175_fk_submissions_score_id` (`highest_id`), KEY `submissions_s_latest_id_2b352506a35fd569_fk_submissions_score_id` (`latest_id`), CONSTRAINT `s_student_item_id_32fa0a425a149b1b_fk_submissions_studentitem_id` FOREIGN KEY (`student_item_id`) REFERENCES `submissions_studentitem` (`id`), - CONSTRAINT `submissions__highest_id_7fd91b8eb312c175_fk_submissions_score_id` FOREIGN KEY (`highest_id`) REFERENCES `submissions_score` (`id`), - CONSTRAINT `submissions_s_latest_id_2b352506a35fd569_fk_submissions_score_id` FOREIGN KEY (`latest_id`) REFERENCES `submissions_score` (`id`) + CONSTRAINT `submissions_s_latest_id_2b352506a35fd569_fk_submissions_score_id` FOREIGN KEY (`latest_id`) REFERENCES `submissions_score` (`id`), + CONSTRAINT `submissions__highest_id_7fd91b8eb312c175_fk_submissions_score_id` FOREIGN KEY (`highest_id`) REFERENCES `submissions_score` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `submissions_studentitem`; @@ -3607,6 +3639,7 @@ CREATE TABLE `submissions_submission` ( `created_at` datetime(6) NOT NULL, `raw_answer` longtext NOT NULL, `student_item_id` int(11) NOT NULL, + `status` varchar(1) NOT NULL, PRIMARY KEY (`id`), KEY `su_student_item_id_d3801ff833d05b1_fk_submissions_studentitem_id` (`student_item_id`), KEY `submissions_submission_ef7c876f` (`uuid`), @@ -3632,8 +3665,8 @@ CREATE TABLE `survey_surveyanswer` ( KEY `survey_surveyanswer_c8235886` (`course_key`), KEY `survey_surveyanswer_d6cba1ad` (`form_id`), KEY `survey_surveyanswer_e8701ad4` (`user_id`), - CONSTRAINT `survey_surveyan_form_id_1c835afe12a54912_fk_survey_surveyform_id` FOREIGN KEY (`form_id`) REFERENCES `survey_surveyform` (`id`), - CONSTRAINT `survey_surveyanswer_user_id_4e77d83a82fd0b2b_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) + CONSTRAINT `survey_surveyanswer_user_id_4e77d83a82fd0b2b_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`), + CONSTRAINT `survey_surveyan_form_id_1c835afe12a54912_fk_survey_surveyform_id` FOREIGN KEY (`form_id`) REFERENCES `survey_surveyform` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `survey_surveyform`; @@ -3687,8 +3720,8 @@ CREATE TABLE `teams_courseteammembership` ( PRIMARY KEY (`id`), UNIQUE KEY `teams_courseteammembership_user_id_48efa8e8971947c3_uniq` (`user_id`,`team_id`), KEY `teams_courseteam_team_id_594700d19b04f922_fk_teams_courseteam_id` (`team_id`), - CONSTRAINT `teams_courseteam_team_id_594700d19b04f922_fk_teams_courseteam_id` FOREIGN KEY (`team_id`) REFERENCES `teams_courseteam` (`id`), - CONSTRAINT `teams_courseteammembers_user_id_2d93b28be22c3c40_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) + CONSTRAINT `teams_courseteammembers_user_id_2d93b28be22c3c40_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`), + CONSTRAINT `teams_courseteam_team_id_594700d19b04f922_fk_teams_courseteam_id` FOREIGN KEY (`team_id`) REFERENCES `teams_courseteam` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `third_party_auth_ltiproviderconfig`; @@ -3962,8 +3995,8 @@ CREATE TABLE `verify_student_skippedreverification` ( KEY `verify_student_skippedreverification_ea134da7` (`course_id`), KEY `verify_student_skippedreverification_bef2d98a` (`checkpoint_id`), KEY `verify_student_skippedreverification_e8701ad4` (`user_id`), - CONSTRAINT `D759ffa5ca66ef1a2c8c200f7a21365b` FOREIGN KEY (`checkpoint_id`) REFERENCES `verify_student_verificationcheckpoint` (`id`), - CONSTRAINT `verify_student_skippedr_user_id_6752b392e3d3c501_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) + CONSTRAINT `verify_student_skippedr_user_id_6752b392e3d3c501_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`), + CONSTRAINT `D759ffa5ca66ef1a2c8c200f7a21365b` FOREIGN KEY (`checkpoint_id`) REFERENCES `verify_student_verificationcheckpoint` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `verify_student_softwaresecurephotoverification`; @@ -3997,9 +4030,9 @@ CREATE TABLE `verify_student_softwaresecurephotoverification` ( KEY `verify_student_softwaresecurephotoverification_afd1a1a8` (`updated_at`), KEY `verify_student_softwaresecurephotoverification_ebf78b51` (`display`), KEY `verify_student_softwaresecurephotoverification_22bb6ff9` (`submitted_at`), + CONSTRAINT `verify_student_software_user_id_61ffab9c12020106_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`), CONSTRAINT `D01dce17b91c9382bd80d4be23a3e0cf` FOREIGN KEY (`copy_id_photo_from_id`) REFERENCES `verify_student_softwaresecurephotoverification` (`id`), - CONSTRAINT `verify_studen_reviewing_user_id_727fae1d0bcf8aaf_fk_auth_user_id` FOREIGN KEY (`reviewing_user_id`) REFERENCES `auth_user` (`id`), - CONSTRAINT `verify_student_software_user_id_61ffab9c12020106_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) + CONSTRAINT `verify_studen_reviewing_user_id_727fae1d0bcf8aaf_fk_auth_user_id` FOREIGN KEY (`reviewing_user_id`) REFERENCES `auth_user` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `verify_student_verificationcheckpoint`; @@ -4057,8 +4090,8 @@ CREATE TABLE `verify_student_verificationstatus` ( KEY `D4cefb6d3d71c9b26af2a5ece4c37277` (`checkpoint_id`), KEY `verify_student_verifica_user_id_5c19fcd6dc05f211_fk_auth_user_id` (`user_id`), KEY `verify_student_verificationstatus_9acb4454` (`status`), - CONSTRAINT `D4cefb6d3d71c9b26af2a5ece4c37277` FOREIGN KEY (`checkpoint_id`) REFERENCES `verify_student_verificationcheckpoint` (`id`), - CONSTRAINT `verify_student_verifica_user_id_5c19fcd6dc05f211_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) + CONSTRAINT `verify_student_verifica_user_id_5c19fcd6dc05f211_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`), + CONSTRAINT `D4cefb6d3d71c9b26af2a5ece4c37277` FOREIGN KEY (`checkpoint_id`) REFERENCES `verify_student_verificationcheckpoint` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `wiki_article`; @@ -4079,9 +4112,9 @@ CREATE TABLE `wiki_article` ( UNIQUE KEY `current_revision_id` (`current_revision_id`), KEY `wiki_article_0e939a4f` (`group_id`), KEY `wiki_article_5e7b1936` (`owner_id`), + CONSTRAINT `wiki_article_owner_id_b1c1e44609a378f_fk_auth_user_id` FOREIGN KEY (`owner_id`) REFERENCES `auth_user` (`id`), CONSTRAINT `current_revision_id_42a9dbec1e0dd15c_fk_wiki_articlerevision_id` FOREIGN KEY (`current_revision_id`) REFERENCES `wiki_articlerevision` (`id`), - CONSTRAINT `wiki_article_group_id_2b38601b6aa39f3d_fk_auth_group_id` FOREIGN KEY (`group_id`) REFERENCES `auth_group` (`id`), - CONSTRAINT `wiki_article_owner_id_b1c1e44609a378f_fk_auth_user_id` FOREIGN KEY (`owner_id`) REFERENCES `auth_user` (`id`) + CONSTRAINT `wiki_article_group_id_2b38601b6aa39f3d_fk_auth_group_id` FOREIGN KEY (`group_id`) REFERENCES `auth_group` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `wiki_articleforobject`; @@ -4135,9 +4168,9 @@ CREATE TABLE `wiki_articlerevision` ( UNIQUE KEY `wiki_articlerevision_article_id_4b4e7910c8e7b2d0_uniq` (`article_id`,`revision_number`), KEY `fae2b1c6e892c699844d5dda69aeb89e` (`previous_revision_id`), KEY `wiki_articlerevision_user_id_183520686b6ead55_fk_auth_user_id` (`user_id`), + CONSTRAINT `wiki_articlerevision_user_id_183520686b6ead55_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`), CONSTRAINT `fae2b1c6e892c699844d5dda69aeb89e` FOREIGN KEY (`previous_revision_id`) REFERENCES `wiki_articlerevision` (`id`), - CONSTRAINT `wiki_articlerevis_article_id_1f2c587981af1463_fk_wiki_article_id` FOREIGN KEY (`article_id`) REFERENCES `wiki_article` (`id`), - CONSTRAINT `wiki_articlerevision_user_id_183520686b6ead55_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) + CONSTRAINT `wiki_articlerevis_article_id_1f2c587981af1463_fk_wiki_article_id` FOREIGN KEY (`article_id`) REFERENCES `wiki_article` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `wiki_attachment`; @@ -4175,9 +4208,9 @@ CREATE TABLE `wiki_attachmentrevision` ( KEY `wiki_attachmentrevision_07ba63f5` (`attachment_id`), KEY `wiki_attachmentrevision_e8680b8a` (`previous_revision_id`), KEY `wiki_attachmentrevision_e8701ad4` (`user_id`), + CONSTRAINT `wiki_attachmentrevision_user_id_427e3f452b4bfdcd_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`), CONSTRAINT `D68d5cd540b66f536228137e518081f8` FOREIGN KEY (`attachment_id`) REFERENCES `wiki_attachment` (`reusableplugin_ptr_id`), - CONSTRAINT `D8c1f0a8f0ddceb9c3ebc94379fe22c9` FOREIGN KEY (`previous_revision_id`) REFERENCES `wiki_attachmentrevision` (`id`), - CONSTRAINT `wiki_attachmentrevision_user_id_427e3f452b4bfdcd_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) + CONSTRAINT `D8c1f0a8f0ddceb9c3ebc94379fe22c9` FOREIGN KEY (`previous_revision_id`) REFERENCES `wiki_attachmentrevision` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `wiki_image`; @@ -4220,8 +4253,8 @@ CREATE TABLE `wiki_reusableplugin_articles` ( PRIMARY KEY (`id`), UNIQUE KEY `reusableplugin_id` (`reusableplugin_id`,`article_id`), KEY `wiki_reusableplug_article_id_5e893d3b3fb4f7fa_fk_wiki_article_id` (`article_id`), - CONSTRAINT `a9f9f50fd4e8fdafe7ffc0c1a145fee3` FOREIGN KEY (`reusableplugin_id`) REFERENCES `wiki_reusableplugin` (`articleplugin_ptr_id`), - CONSTRAINT `wiki_reusableplug_article_id_5e893d3b3fb4f7fa_fk_wiki_article_id` FOREIGN KEY (`article_id`) REFERENCES `wiki_article` (`id`) + CONSTRAINT `wiki_reusableplug_article_id_5e893d3b3fb4f7fa_fk_wiki_article_id` FOREIGN KEY (`article_id`) REFERENCES `wiki_article` (`id`), + CONSTRAINT `a9f9f50fd4e8fdafe7ffc0c1a145fee3` FOREIGN KEY (`reusableplugin_id`) REFERENCES `wiki_reusableplugin` (`articleplugin_ptr_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `wiki_revisionplugin`; @@ -4256,9 +4289,9 @@ CREATE TABLE `wiki_revisionpluginrevision` ( KEY `wiki_revisionpluginrevision_b25eaab4` (`plugin_id`), KEY `wiki_revisionpluginrevision_e8680b8a` (`previous_revision_id`), KEY `wiki_revisionpluginrevision_e8701ad4` (`user_id`), + CONSTRAINT `wiki_revisionpluginrevi_user_id_55a00bd0e2532762_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`), CONSTRAINT `D9574e2f57b828a85a24838761473871` FOREIGN KEY (`plugin_id`) REFERENCES `wiki_revisionplugin` (`articleplugin_ptr_id`), - CONSTRAINT `e524c4f887e857f93c39356f7cf7d4df` FOREIGN KEY (`previous_revision_id`) REFERENCES `wiki_revisionpluginrevision` (`id`), - CONSTRAINT `wiki_revisionpluginrevi_user_id_55a00bd0e2532762_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) + CONSTRAINT `e524c4f887e857f93c39356f7cf7d4df` FOREIGN KEY (`previous_revision_id`) REFERENCES `wiki_revisionpluginrevision` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `wiki_simpleplugin`; @@ -4295,9 +4328,9 @@ CREATE TABLE `wiki_urlpath` ( KEY `wiki_urlpath_656442a0` (`tree_id`), KEY `wiki_urlpath_c9e9a848` (`level`), KEY `wiki_urlpath_6be37982` (`parent_id`), + CONSTRAINT `wiki_urlpath_site_id_4f30e731b0464e80_fk_django_site_id` FOREIGN KEY (`site_id`) REFERENCES `django_site` (`id`), CONSTRAINT `wiki_urlpath_article_id_1d1c5eb9a64e1390_fk_wiki_article_id` FOREIGN KEY (`article_id`) REFERENCES `wiki_article` (`id`), - CONSTRAINT `wiki_urlpath_parent_id_24eab80cd168595f_fk_wiki_urlpath_id` FOREIGN KEY (`parent_id`) REFERENCES `wiki_urlpath` (`id`), - CONSTRAINT `wiki_urlpath_site_id_4f30e731b0464e80_fk_django_site_id` FOREIGN KEY (`site_id`) REFERENCES `django_site` (`id`) + CONSTRAINT `wiki_urlpath_parent_id_24eab80cd168595f_fk_wiki_urlpath_id` FOREIGN KEY (`parent_id`) REFERENCES `wiki_urlpath` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `workflow_assessmentworkflow`; @@ -4374,6 +4407,7 @@ CREATE TABLE `xblock_django_xblockdisableconfig` ( `enabled` tinyint(1) NOT NULL, `disabled_blocks` longtext NOT NULL, `changed_by_id` int(11) DEFAULT NULL, + `disabled_create_blocks` longtext NOT NULL, PRIMARY KEY (`id`), KEY `xblock_django_xbl_changed_by_id_429bdccb9201831c_fk_auth_user_id` (`changed_by_id`), CONSTRAINT `xblock_django_xbl_changed_by_id_429bdccb9201831c_fk_auth_user_id` FOREIGN KEY (`changed_by_id`) REFERENCES `auth_user` (`id`) 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 new file mode 100644 index 0000000000..5a30d5a35c --- /dev/null +++ b/common/test/db_cache/bok_choy_schema_student_module_history.sql @@ -0,0 +1,48 @@ + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; +DROP TABLE IF EXISTS `coursewarehistoryextended_studentmodulehistoryextended`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `coursewarehistoryextended_studentmodulehistoryextended` ( + `version` varchar(255) DEFAULT NULL, + `created` datetime(6) NOT NULL, + `state` longtext, + `grade` double DEFAULT NULL, + `max_grade` double DEFAULT NULL, + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `student_module_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + KEY `coursewarehistoryextended_studentmodulehistoryextended_2af72f10` (`version`), + KEY `coursewarehistoryextended_studentmodulehistoryextended_e2fa5388` (`created`) +) ENGINE=InnoDB AUTO_INCREMENT=10000 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `django_migrations`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `django_migrations` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `app` varchar(255) NOT NULL, + `name` varchar(255) NOT NULL, + `applied` datetime(6) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=119 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + diff --git a/common/test/db_cache/lettuce.db b/common/test/db_cache/lettuce.db index f61ab66ad9..7b1e650713 100644 Binary files a/common/test/db_cache/lettuce.db and b/common/test/db_cache/lettuce.db differ diff --git a/common/test/db_cache/lettuce_student_module_history.db b/common/test/db_cache/lettuce_student_module_history.db new file mode 100644 index 0000000000..1ffe74a76e Binary files /dev/null and b/common/test/db_cache/lettuce_student_module_history.db differ diff --git a/lms/djangoapps/ccx/tests/test_field_override_performance.py b/lms/djangoapps/ccx/tests/test_field_override_performance.py index d6a88b300b..f8c58ff6c5 100644 --- a/lms/djangoapps/ccx/tests/test_field_override_performance.py +++ b/lms/djangoapps/ccx/tests/test_field_override_performance.py @@ -46,6 +46,8 @@ class FieldOverridePerformanceTestCase(ProceduralCourseTestMixin, providers. """ __test__ = False + # Tell Django to clean out all databases, not just default + multi_db = True # TEST_DATA must be overridden by subclasses TEST_DATA = None @@ -151,7 +153,10 @@ class FieldOverridePerformanceTestCase(ProceduralCourseTestMixin, """ return check_sum_of_calls(XBlock, ['__init__'], instantiations, instantiations, include_arguments=False) - def instrument_course_progress_render(self, course_width, enable_ccx, view_as_ccx, queries, reads, xblocks): + def instrument_course_progress_render( + self, course_width, enable_ccx, view_as_ccx, + default_queries, history_queries, reads, xblocks + ): """ Renders the progress page, instrumenting Mongo reads and SQL queries. """ @@ -173,10 +178,11 @@ class FieldOverridePerformanceTestCase(ProceduralCourseTestMixin, # can actually take affect. OverrideFieldData.provider_classes = None - with self.assertNumQueries(queries): - with self.assertMongoCallCount(reads): - with self.assertXBlockInstantiations(xblocks): - self.grade_course(self.course, view_as_ccx) + with self.assertNumQueries(default_queries, using='default'): + with self.assertNumQueries(history_queries, using='student_module_history'): + with self.assertMongoCallCount(reads): + with self.assertXBlockInstantiations(xblocks): + self.grade_course(self.course, view_as_ccx) @ddt.data(*itertools.product(('no_overrides', 'ccx'), range(1, 4), (True, False), (True, False))) @ddt.unpack @@ -201,8 +207,12 @@ class FieldOverridePerformanceTestCase(ProceduralCourseTestMixin, raise SkipTest("Can't use a MongoModulestore test as a CCX course") with self.settings(FIELD_OVERRIDE_PROVIDERS=providers[overrides]): - queries, reads, xblocks = self.TEST_DATA[(overrides, course_width, enable_ccx, view_as_ccx)] - self.instrument_course_progress_render(course_width, enable_ccx, view_as_ccx, queries, reads, xblocks) + default_queries, history_queries, reads, xblocks = self.TEST_DATA[ + (overrides, course_width, enable_ccx, view_as_ccx) + ] + self.instrument_course_progress_render( + course_width, enable_ccx, view_as_ccx, default_queries, history_queries, reads, xblocks + ) class TestFieldOverrideMongoPerformance(FieldOverridePerformanceTestCase): @@ -213,25 +223,30 @@ class TestFieldOverrideMongoPerformance(FieldOverridePerformanceTestCase): __test__ = True TEST_DATA = { - # (providers, course_width, enable_ccx, view_as_ccx): # of sql queries, # of mongo queries, # of xblocks - ('no_overrides', 1, True, False): (48, 6, 13), - ('no_overrides', 2, True, False): (135, 6, 84), - ('no_overrides', 3, True, False): (480, 6, 335), - ('ccx', 1, True, False): (48, 6, 13), - ('ccx', 2, True, False): (135, 6, 84), - ('ccx', 3, True, False): (480, 6, 335), - ('ccx', 1, True, True): (48, 6, 13), - ('ccx', 2, True, True): (135, 6, 84), - ('ccx', 3, True, True): (480, 6, 335), - ('no_overrides', 1, False, False): (48, 6, 13), - ('no_overrides', 2, False, False): (135, 6, 84), - ('no_overrides', 3, False, False): (480, 6, 335), - ('ccx', 1, False, False): (48, 6, 13), - ('ccx', 2, False, False): (135, 6, 84), - ('ccx', 3, False, False): (480, 6, 335), - ('ccx', 1, False, True): (48, 6, 13), - ('ccx', 2, False, True): (135, 6, 84), - ('ccx', 3, False, True): (480, 6, 335), + # (providers, course_width, enable_ccx, view_as_ccx): ( + # # of sql queries to default, + # # sql queries to student_module_history, + # # of mongo queries, + # # of xblocks + # ) + ('no_overrides', 1, True, False): (47, 1, 6, 13), + ('no_overrides', 2, True, False): (119, 16, 6, 84), + ('no_overrides', 3, True, False): (399, 81, 6, 335), + ('ccx', 1, True, False): (47, 1, 6, 13), + ('ccx', 2, True, False): (119, 16, 6, 84), + ('ccx', 3, True, False): (399, 81, 6, 335), + ('ccx', 1, True, True): (47, 1, 6, 13), + ('ccx', 2, True, True): (119, 16, 6, 84), + ('ccx', 3, True, True): (399, 81, 6, 335), + ('no_overrides', 1, False, False): (47, 1, 6, 13), + ('no_overrides', 2, False, False): (119, 16, 6, 84), + ('no_overrides', 3, False, False): (399, 81, 6, 335), + ('ccx', 1, False, False): (47, 1, 6, 13), + ('ccx', 2, False, False): (119, 16, 6, 84), + ('ccx', 3, False, False): (399, 81, 6, 335), + ('ccx', 1, False, True): (47, 1, 6, 13), + ('ccx', 2, False, True): (119, 16, 6, 84), + ('ccx', 3, False, True): (399, 81, 6, 335), } @@ -243,22 +258,22 @@ class TestFieldOverrideSplitPerformance(FieldOverridePerformanceTestCase): __test__ = True TEST_DATA = { - ('no_overrides', 1, True, False): (48, 4, 9), - ('no_overrides', 2, True, False): (135, 19, 54), - ('no_overrides', 3, True, False): (480, 84, 215), - ('ccx', 1, True, False): (48, 4, 9), - ('ccx', 2, True, False): (135, 19, 54), - ('ccx', 3, True, False): (480, 84, 215), - ('ccx', 1, True, True): (50, 4, 13), - ('ccx', 2, True, True): (137, 19, 84), - ('ccx', 3, True, True): (482, 84, 335), - ('no_overrides', 1, False, False): (48, 4, 9), - ('no_overrides', 2, False, False): (135, 19, 54), - ('no_overrides', 3, False, False): (480, 84, 215), - ('ccx', 1, False, False): (48, 4, 9), - ('ccx', 2, False, False): (135, 19, 54), - ('ccx', 3, False, False): (480, 84, 215), - ('ccx', 1, False, True): (48, 4, 9), - ('ccx', 2, False, True): (135, 19, 54), - ('ccx', 3, False, True): (480, 84, 215), + ('no_overrides', 1, True, False): (47, 1, 4, 9), + ('no_overrides', 2, True, False): (119, 16, 19, 54), + ('no_overrides', 3, True, False): (399, 81, 84, 215), + ('ccx', 1, True, False): (47, 1, 4, 9), + ('ccx', 2, True, False): (119, 16, 19, 54), + ('ccx', 3, True, False): (399, 81, 84, 215), + ('ccx', 1, True, True): (49, 1, 4, 13), + ('ccx', 2, True, True): (121, 16, 19, 84), + ('ccx', 3, True, True): (401, 81, 84, 335), + ('no_overrides', 1, False, False): (47, 1, 4, 9), + ('no_overrides', 2, False, False): (119, 16, 19, 54), + ('no_overrides', 3, False, False): (399, 81, 84, 215), + ('ccx', 1, False, False): (47, 1, 4, 9), + ('ccx', 2, False, False): (119, 16, 19, 54), + ('ccx', 3, False, False): (399, 81, 84, 215), + ('ccx', 1, False, True): (47, 1, 4, 9), + ('ccx', 2, False, True): (119, 16, 19, 54), + ('ccx', 3, False, True): (399, 81, 84, 215), } diff --git a/lms/djangoapps/courseware/management/commands/clean_history.py b/lms/djangoapps/courseware/management/commands/clean_history.py deleted file mode 100644 index d4f22a0e3e..0000000000 --- a/lms/djangoapps/courseware/management/commands/clean_history.py +++ /dev/null @@ -1,222 +0,0 @@ -"""A command to clean the StudentModuleHistory table. - -When we added XBlock storage, each field modification wrote a new history row -to the db. Now that we have bulk saves to avoid that database hammering, we -need to clean out the unnecessary rows from the database. - -This command that does that. - -""" - -import datetime -import json -import logging -import optparse -import time -import traceback - -from django.core.management.base import NoArgsCommand -from django.db import transaction -from django.db.models import Max -from courseware.models import StudentModuleHistory - - -class Command(NoArgsCommand): - """The actual clean_history command to clean history rows.""" - - help = "Deletes unneeded rows from the StudentModuleHistory table." - - option_list = NoArgsCommand.option_list + ( - optparse.make_option( - '--batch', - type='int', - default=100, - help="Batch size, number of module_ids to examine in a transaction.", - ), - optparse.make_option( - '--dry-run', - action='store_true', - default=False, - help="Don't change the database, just show what would be done.", - ), - optparse.make_option( - '--sleep', - type='float', - default=0, - help="Seconds to sleep between batches.", - ), - ) - - def handle_noargs(self, **options): - # We don't want to see the SQL output from the db layer. - logging.getLogger("django.db.backends").setLevel(logging.INFO) - - smhc = StudentModuleHistoryCleaner( - dry_run=options["dry_run"], - ) - smhc.main(batch_size=options["batch"], sleep=options["sleep"]) - - -class StudentModuleHistoryCleaner(object): - """Logic to clean rows from the StudentModuleHistory table.""" - - DELETE_GAP_SECS = 0.5 # Rows this close can be discarded. - STATE_FILE = "clean_history.json" - BATCH_SIZE = 100 - - def __init__(self, dry_run=False): - self.dry_run = dry_run - self.next_student_module_id = 0 - self.last_student_module_id = 0 - - def main(self, batch_size=None, sleep=0): - """Invoked from the management command to do all the work.""" - - batch_size = batch_size or self.BATCH_SIZE - - self.last_student_module_id = self.get_last_student_module_id() - self.load_state() - - while self.next_student_module_id <= self.last_student_module_id: - with transaction.atomic(): - for smid in self.module_ids_to_check(batch_size): - try: - self.clean_one_student_module(smid) - except Exception: # pylint: disable=broad-except - trace = traceback.format_exc() - self.say("Couldn't clean student_module_id {}:\n{}".format(smid, trace)) - if self.dry_run: - transaction.set_rollback(True) - else: - self.say("Committing") - self.save_state() - if sleep: - time.sleep(sleep) - - def say(self, message): - """ - Display a message to the user. - - The message will have a trailing newline added to it. - - """ - print message - - def load_state(self): - """ - Load the latest state from disk. - """ - try: - state_file = open(self.STATE_FILE) - except IOError: - self.say("No stored state") - self.next_student_module_id = 0 - else: - with state_file: - state = json.load(state_file) - self.say( - "Loaded stored state: {}".format( - json.dumps(state, sort_keys=True) - ) - ) - self.next_student_module_id = state['next_student_module_id'] - - def save_state(self): - """ - Save the state to disk. - """ - state = { - 'next_student_module_id': self.next_student_module_id, - } - with open(self.STATE_FILE, "w") as state_file: - json.dump(state, state_file) - self.say("Saved state: {}".format(json.dumps(state, sort_keys=True))) - - def get_last_student_module_id(self): - """ - Return the id of the last student_module. - """ - last = StudentModuleHistory.objects.all() \ - .aggregate(Max('student_module'))['student_module__max'] - self.say("Last student_module_id is {}".format(last)) - return last - - def module_ids_to_check(self, batch_size): - """Produce a sequence of student module ids to check. - - `batch_size` is how many module ids to produce, max. - - The sequence starts with `next_student_module_id`, and goes up to - and including `last_student_module_id`. - - `next_student_module_id` is updated as each id is yielded. - - """ - start = self.next_student_module_id - for smid in range(start, start + batch_size): - if smid > self.last_student_module_id: - break - yield smid - self.next_student_module_id = smid + 1 - - def get_history_for_student_modules(self, student_module_id): - """ - Get the history rows for a student module. - - ```student_module_id```: the id of the student module we're - interested in. - - Return a list: [(id, created), ...], all the rows of history. - - """ - history = StudentModuleHistory.objects \ - .filter(student_module=student_module_id) \ - .order_by('created', 'id') - - return [(row.id, row.created) for row in history] - - def delete_history(self, ids_to_delete): - """ - Delete history rows. - - ```ids_to_delete```: a non-empty list (or set...) of history row ids to delete. - - """ - assert ids_to_delete - StudentModuleHistory.objects.filter(id__in=ids_to_delete).delete() - - def clean_one_student_module(self, student_module_id): - """Clean one StudentModule's-worth of history. - - `student_module_id`: the id of the StudentModule to process. - - """ - delete_gap = datetime.timedelta(seconds=self.DELETE_GAP_SECS) - - history = self.get_history_for_student_modules(student_module_id) - if not history: - self.say("No history for student_module_id {}".format(student_module_id)) - return - - ids_to_delete = [] - next_created = None - for history_id, created in reversed(history): - if next_created is not None: - # Compare this timestamp with the next one. - if (next_created - created) < delete_gap: - # This row is followed closely by another, we can discard - # this one. - ids_to_delete.append(history_id) - - next_created = created - - verb = "Would have deleted" if self.dry_run else "Deleting" - self.say("{verb} {to_delete} rows of {total} for student_module_id {id}".format( - verb=verb, - to_delete=len(ids_to_delete), - total=len(history), - id=student_module_id, - )) - - if ids_to_delete and not self.dry_run: - self.delete_history(ids_to_delete) diff --git a/lms/djangoapps/courseware/management/commands/tests/test_clean_history.py b/lms/djangoapps/courseware/management/commands/tests/test_clean_history.py deleted file mode 100644 index e0c7da7af9..0000000000 --- a/lms/djangoapps/courseware/management/commands/tests/test_clean_history.py +++ /dev/null @@ -1,491 +0,0 @@ -"""Test the clean_history management command.""" - -import fnmatch -from mock import Mock -from nose.plugins.attrib import attr -import os.path -import textwrap - -import dateutil.parser - -from django.test import TransactionTestCase -from django.db import connection - -from courseware.management.commands.clean_history import StudentModuleHistoryCleaner - -# In lots of places in this file, smhc == StudentModuleHistoryCleaner - - -def parse_date(sdate): - """Parse a string date into a datetime.""" - parsed = dateutil.parser.parse(sdate) - parsed = parsed.replace(tzinfo=dateutil.tz.gettz('UTC')) - return parsed - - -class SmhcSayStubbed(StudentModuleHistoryCleaner): - """StudentModuleHistoryCleaner, but with .say() stubbed for testing.""" - def __init__(self, **kwargs): - super(SmhcSayStubbed, self).__init__(**kwargs) - self.said_lines = [] - - def say(self, msg): - self.said_lines.append(msg) - - -class SmhcDbMocked(SmhcSayStubbed): - """StudentModuleHistoryCleaner, but with db access mocked.""" - def __init__(self, **kwargs): - super(SmhcDbMocked, self).__init__(**kwargs) - self.get_history_for_student_modules = Mock() - self.delete_history = Mock() - - def set_rows(self, rows): - """Set the mocked history rows.""" - rows = [(row_id, parse_date(created)) for row_id, created in rows] - self.get_history_for_student_modules.return_value = rows - - -class HistoryCleanerTest(TransactionTestCase): - """Base class for all history cleaner tests.""" - - maxDiff = None - - def setUp(self): - super(HistoryCleanerTest, self).setUp() - self.addCleanup(self.clean_up_state_file) - - def write_state_file(self, state): - """Write the string `state` into the state file read by StudentModuleHistoryCleaner.""" - with open(StudentModuleHistoryCleaner.STATE_FILE, "w") as state_file: - state_file.write(state) - - def read_state_file(self): - """Return the string contents of the state file read by StudentModuleHistoryCleaner.""" - with open(StudentModuleHistoryCleaner.STATE_FILE) as state_file: - return state_file.read() - - def clean_up_state_file(self): - """Remove any state file lying around.""" - if os.path.exists(StudentModuleHistoryCleaner.STATE_FILE): - os.remove(StudentModuleHistoryCleaner.STATE_FILE) - - def assert_said(self, smhc, *msgs): - """Fail if the `smhc` didn't say `msgs`. - - The messages passed here are `fnmatch`-style patterns: "*" means anything. - - """ - for said, pattern in zip(smhc.said_lines, msgs): - if not fnmatch.fnmatch(said, pattern): - fmt = textwrap.dedent("""\ - Messages: - - {msgs} - - don't match patterns: - - {patterns} - - Failed at {said!r} and {pattern!r} - """) - - msg = fmt.format( - msgs="\n".join(smhc.said_lines), - patterns="\n".join(msgs), - said=said, - pattern=pattern - ) - self.fail(msg) - - def parse_rows(self, rows): - """Parse convenient rows into real data.""" - rows = [ - (row_id, parse_date(created), student_module_id) - for row_id, created, student_module_id in rows - ] - return rows - - def write_history(self, rows): - """Write history rows to the db. - - Each row should be (id, created, student_module_id). - - """ - cursor = connection.cursor() - cursor.executemany( - """ - INSERT INTO courseware_studentmodulehistory - (id, created, student_module_id) - VALUES (%s, %s, %s) - """, - self.parse_rows(rows), - ) - - def read_history(self): - """Read the history from the db, and return it as a list of tuples. - - Returns [(id, created, student_module_id), ...] - - """ - cursor = connection.cursor() - cursor.execute(""" - SELECT id, created, student_module_id FROM courseware_studentmodulehistory - """) - return cursor.fetchall() - - def assert_history(self, rows): - """Assert that the history rows are the same as `rows`.""" - self.assertEqual(self.parse_rows(rows), self.read_history()) - - -@attr('shard_1') -class HistoryCleanerNoDbTest(HistoryCleanerTest): - """Tests of StudentModuleHistoryCleaner with db access mocked.""" - - def test_empty(self): - smhc = SmhcDbMocked() - smhc.set_rows([]) - - smhc.clean_one_student_module(1) - self.assert_said(smhc, "No history for student_module_id 1") - - # Nothing to delete, so delete_history wasn't called. - self.assertFalse(smhc.delete_history.called) - - def test_one_row(self): - smhc = SmhcDbMocked() - smhc.set_rows([ - (1, "2013-07-13 12:11:10.987"), - ]) - smhc.clean_one_student_module(1) - self.assert_said(smhc, "Deleting 0 rows of 1 for student_module_id 1") - # Nothing to delete, so delete_history wasn't called. - self.assertFalse(smhc.delete_history.called) - - def test_one_row_dry_run(self): - smhc = SmhcDbMocked(dry_run=True) - smhc.set_rows([ - (1, "2013-07-13 12:11:10.987"), - ]) - smhc.clean_one_student_module(1) - self.assert_said(smhc, "Would have deleted 0 rows of 1 for student_module_id 1") - # Nothing to delete, so delete_history wasn't called. - self.assertFalse(smhc.delete_history.called) - - def test_two_rows_close(self): - smhc = SmhcDbMocked() - smhc.set_rows([ - (7, "2013-07-13 12:34:56.789"), - (9, "2013-07-13 12:34:56.987"), - ]) - smhc.clean_one_student_module(1) - self.assert_said(smhc, "Deleting 1 rows of 2 for student_module_id 1") - smhc.delete_history.assert_called_once_with([7]) - - def test_two_rows_far(self): - smhc = SmhcDbMocked() - smhc.set_rows([ - (7, "2013-07-13 12:34:56.789"), - (9, "2013-07-13 12:34:57.890"), - ]) - smhc.clean_one_student_module(1) - self.assert_said(smhc, "Deleting 0 rows of 2 for student_module_id 1") - self.assertFalse(smhc.delete_history.called) - - def test_a_bunch_of_rows(self): - smhc = SmhcDbMocked() - smhc.set_rows([ - (4, "2013-07-13 16:30:00.000"), # keep - (8, "2013-07-13 16:30:01.100"), - (15, "2013-07-13 16:30:01.200"), - (16, "2013-07-13 16:30:01.300"), # keep - (23, "2013-07-13 16:30:02.400"), - (42, "2013-07-13 16:30:02.500"), - (98, "2013-07-13 16:30:02.600"), # keep - (99, "2013-07-13 16:30:59.000"), # keep - ]) - smhc.clean_one_student_module(17) - self.assert_said(smhc, "Deleting 4 rows of 8 for student_module_id 17") - smhc.delete_history.assert_called_once_with([42, 23, 15, 8]) - - -@attr('shard_1') -class HistoryCleanerWitDbTest(HistoryCleanerTest): - """Tests of StudentModuleHistoryCleaner with a real db.""" - - def test_no_history(self): - # Cleaning a student_module_id with no history leaves the db unchanged. - smhc = SmhcSayStubbed() - self.write_history([ - (4, "2013-07-13 16:30:00.000", 11), # keep - (8, "2013-07-13 16:30:01.100", 11), - (15, "2013-07-13 16:30:01.200", 11), - (16, "2013-07-13 16:30:01.300", 11), # keep - (23, "2013-07-13 16:30:02.400", 11), - (42, "2013-07-13 16:30:02.500", 11), - (98, "2013-07-13 16:30:02.600", 11), # keep - (99, "2013-07-13 16:30:59.000", 11), # keep - ]) - - smhc.clean_one_student_module(22) - self.assert_said(smhc, "No history for student_module_id 22") - self.assert_history([ - (4, "2013-07-13 16:30:00.000", 11), # keep - (8, "2013-07-13 16:30:01.100", 11), - (15, "2013-07-13 16:30:01.200", 11), - (16, "2013-07-13 16:30:01.300", 11), # keep - (23, "2013-07-13 16:30:02.400", 11), - (42, "2013-07-13 16:30:02.500", 11), - (98, "2013-07-13 16:30:02.600", 11), # keep - (99, "2013-07-13 16:30:59.000", 11), # keep - ]) - - def test_a_bunch_of_rows(self): - # Cleaning a student_module_id with 8 records, 4 to delete. - smhc = SmhcSayStubbed() - self.write_history([ - (4, "2013-07-13 16:30:00.000", 11), # keep - (8, "2013-07-13 16:30:01.100", 11), - (15, "2013-07-13 16:30:01.200", 11), - (16, "2013-07-13 16:30:01.300", 11), # keep - (17, "2013-07-13 16:30:01.310", 22), # other student_module_id! - (23, "2013-07-13 16:30:02.400", 11), - (42, "2013-07-13 16:30:02.500", 11), - (98, "2013-07-13 16:30:02.600", 11), # keep - (99, "2013-07-13 16:30:59.000", 11), # keep - ]) - - smhc.clean_one_student_module(11) - self.assert_said(smhc, "Deleting 4 rows of 8 for student_module_id 11") - self.assert_history([ - (4, "2013-07-13 16:30:00.000", 11), # keep - (16, "2013-07-13 16:30:01.300", 11), # keep - (17, "2013-07-13 16:30:01.310", 22), # other student_module_id! - (98, "2013-07-13 16:30:02.600", 11), # keep - (99, "2013-07-13 16:30:59.000", 11), # keep - ]) - - def test_a_bunch_of_rows_dry_run(self): - # Cleaning a student_module_id with 8 records, 4 to delete, - # but don't really do it. - smhc = SmhcSayStubbed(dry_run=True) - self.write_history([ - (4, "2013-07-13 16:30:00.000", 11), # keep - (8, "2013-07-13 16:30:01.100", 11), - (15, "2013-07-13 16:30:01.200", 11), - (16, "2013-07-13 16:30:01.300", 11), # keep - (23, "2013-07-13 16:30:02.400", 11), - (42, "2013-07-13 16:30:02.500", 11), - (98, "2013-07-13 16:30:02.600", 11), # keep - (99, "2013-07-13 16:30:59.000", 11), # keep - ]) - - smhc.clean_one_student_module(11) - self.assert_said(smhc, "Would have deleted 4 rows of 8 for student_module_id 11") - self.assert_history([ - (4, "2013-07-13 16:30:00.000", 11), # keep - (8, "2013-07-13 16:30:01.100", 11), - (15, "2013-07-13 16:30:01.200", 11), - (16, "2013-07-13 16:30:01.300", 11), # keep - (23, "2013-07-13 16:30:02.400", 11), - (42, "2013-07-13 16:30:02.500", 11), - (98, "2013-07-13 16:30:02.600", 11), # keep - (99, "2013-07-13 16:30:59.000", 11), # keep - ]) - - def test_a_bunch_of_rows_in_jumbled_order(self): - # Cleaning a student_module_id with 8 records, 4 to delete. - smhc = SmhcSayStubbed() - self.write_history([ - (23, "2013-07-13 16:30:01.100", 11), - (24, "2013-07-13 16:30:01.300", 11), # keep - (27, "2013-07-13 16:30:02.500", 11), - (30, "2013-07-13 16:30:01.350", 22), # other student_module_id! - (32, "2013-07-13 16:30:59.000", 11), # keep - (50, "2013-07-13 16:30:02.400", 11), - (51, "2013-07-13 16:30:02.600", 11), # keep - (56, "2013-07-13 16:30:00.000", 11), # keep - (57, "2013-07-13 16:30:01.200", 11), - ]) - - smhc.clean_one_student_module(11) - self.assert_said(smhc, "Deleting 4 rows of 8 for student_module_id 11") - self.assert_history([ - (24, "2013-07-13 16:30:01.300", 11), # keep - (30, "2013-07-13 16:30:01.350", 22), # other student_module_id! - (32, "2013-07-13 16:30:59.000", 11), # keep - (51, "2013-07-13 16:30:02.600", 11), # keep - (56, "2013-07-13 16:30:00.000", 11), # keep - ]) - - def test_a_bunch_of_rows_with_timestamp_ties(self): - # Sometimes rows are written with identical timestamps. The one with - # the greater id is the winner in that case. - smhc = SmhcSayStubbed() - self.write_history([ - (21, "2013-07-13 16:30:01.100", 11), - (24, "2013-07-13 16:30:01.100", 11), # keep - (22, "2013-07-13 16:30:01.100", 11), - (23, "2013-07-13 16:30:01.100", 11), - (27, "2013-07-13 16:30:02.500", 11), - (30, "2013-07-13 16:30:01.350", 22), # other student_module_id! - (32, "2013-07-13 16:30:59.000", 11), # keep - (50, "2013-07-13 16:30:02.500", 11), # keep - ]) - - smhc.clean_one_student_module(11) - self.assert_said(smhc, "Deleting 4 rows of 7 for student_module_id 11") - self.assert_history([ - (24, "2013-07-13 16:30:01.100", 11), # keep - (30, "2013-07-13 16:30:01.350", 22), # other student_module_id! - (32, "2013-07-13 16:30:59.000", 11), # keep - (50, "2013-07-13 16:30:02.500", 11), # keep - ]) - - def test_get_last_student_module(self): - # Can we find the last student_module_id properly? - smhc = SmhcSayStubbed() - self.write_history([ - (23, "2013-07-13 16:30:01.100", 11), - (24, "2013-07-13 16:30:01.300", 44), - (27, "2013-07-13 16:30:02.500", 11), - (30, "2013-07-13 16:30:01.350", 22), - (32, "2013-07-13 16:30:59.000", 11), - (51, "2013-07-13 16:30:02.600", 33), - (56, "2013-07-13 16:30:00.000", 11), - ]) - last = smhc.get_last_student_module_id() - self.assertEqual(last, 44) - self.assert_said(smhc, "Last student_module_id is 44") - - def test_load_state_with_no_stored_state(self): - smhc = SmhcSayStubbed() - self.assertFalse(os.path.exists(smhc.STATE_FILE)) - smhc.load_state() - self.assertEqual(smhc.next_student_module_id, 0) - self.assert_said(smhc, "No stored state") - - def test_load_stored_state(self): - self.write_state_file('{"next_student_module_id": 23}') - smhc = SmhcSayStubbed() - smhc.load_state() - self.assertEqual(smhc.next_student_module_id, 23) - self.assert_said(smhc, 'Loaded stored state: {"next_student_module_id": 23}') - - def test_save_state(self): - smhc = SmhcSayStubbed() - smhc.next_student_module_id = 47 - smhc.save_state() - state = self.read_state_file() - self.assertEqual(state, '{"next_student_module_id": 47}') - - -class SmhcForTestingMain(SmhcSayStubbed): - """A StudentModuleHistoryCleaner with a few function stubbed for testing main.""" - - def __init__(self, *args, **kwargs): - self.exception_smids = kwargs.pop('exception_smids', ()) - super(SmhcForTestingMain, self).__init__(*args, **kwargs) - - def clean_one_student_module(self, smid): - self.say("(not really cleaning {})".format(smid)) - if smid in self.exception_smids: - raise Exception("Something went wrong!") - - -@attr('shard_1') -class HistoryCleanerMainTest(HistoryCleanerTest): - """Tests of StudentModuleHistoryCleaner.main(), using SmhcForTestingMain.""" - - def test_only_one_record(self): - smhc = SmhcForTestingMain() - self.write_history([ - (1, "2013-07-15 11:47:00.000", 1), - ]) - smhc.main() - self.assert_said( - smhc, - 'Last student_module_id is 1', - 'No stored state', - '(not really cleaning 0)', - '(not really cleaning 1)', - 'Committing', - 'Saved state: {"next_student_module_id": 2}', - ) - - def test_already_processed_some(self): - smhc = SmhcForTestingMain() - self.write_state_file('{"next_student_module_id": 25}') - self.write_history([ - (1, "2013-07-15 15:04:00.000", 23), - (2, "2013-07-15 15:04:11.000", 23), - (3, "2013-07-15 15:04:01.000", 24), - (4, "2013-07-15 15:04:00.000", 25), - (5, "2013-07-15 15:04:00.000", 26), - ]) - smhc.main() - self.assert_said( - smhc, - 'Last student_module_id is 26', - 'Loaded stored state: {"next_student_module_id": 25}', - '(not really cleaning 25)', - '(not really cleaning 26)', - 'Committing', - 'Saved state: {"next_student_module_id": 27}' - ) - - def test_working_in_batches(self): - smhc = SmhcForTestingMain() - self.write_state_file('{"next_student_module_id": 25}') - self.write_history([ - (3, "2013-07-15 15:04:01.000", 24), - (4, "2013-07-15 15:04:00.000", 25), - (5, "2013-07-15 15:04:00.000", 26), - (6, "2013-07-15 15:04:00.000", 27), - (7, "2013-07-15 15:04:00.000", 28), - (8, "2013-07-15 15:04:00.000", 29), - ]) - smhc.main(batch_size=3) - self.assert_said( - smhc, - 'Last student_module_id is 29', - 'Loaded stored state: {"next_student_module_id": 25}', - '(not really cleaning 25)', - '(not really cleaning 26)', - '(not really cleaning 27)', - 'Committing', - 'Saved state: {"next_student_module_id": 28}', - '(not really cleaning 28)', - '(not really cleaning 29)', - 'Committing', - 'Saved state: {"next_student_module_id": 30}', - ) - - def test_something_failing_while_cleaning(self): - smhc = SmhcForTestingMain(exception_smids=[26]) - self.write_state_file('{"next_student_module_id": 25}') - self.write_history([ - (3, "2013-07-15 15:04:01.000", 24), - (4, "2013-07-15 15:04:00.000", 25), - (5, "2013-07-15 15:04:00.000", 26), - (6, "2013-07-15 15:04:00.000", 27), - (7, "2013-07-15 15:04:00.000", 28), - (8, "2013-07-15 15:04:00.000", 29), - ]) - smhc.main(batch_size=3) - self.assert_said( - smhc, - 'Last student_module_id is 29', - 'Loaded stored state: {"next_student_module_id": 25}', - '(not really cleaning 25)', - '(not really cleaning 26)', - "Couldn't clean student_module_id 26:\nTraceback*Exception: Something went wrong!\n", - '(not really cleaning 27)', - 'Committing', - 'Saved state: {"next_student_module_id": 28}', - '(not really cleaning 28)', - '(not really cleaning 29)', - 'Committing', - 'Saved state: {"next_student_module_id": 30}', - ) diff --git a/lms/djangoapps/courseware/models.py b/lms/djangoapps/courseware/models.py index 5dff6ea01d..b6581f2817 100644 --- a/lms/djangoapps/courseware/models.py +++ b/lms/djangoapps/courseware/models.py @@ -24,9 +24,9 @@ from django.dispatch import receiver, Signal from model_utils.models import TimeStampedModel from student.models import user_by_anonymous_id from submissions.models import score_set, score_reset +import coursewarehistoryextended from xmodule_django.models import CourseKeyField, LocationKeyField, BlockTypeKeyField -log = logging.getLogger(__name__) log = logging.getLogger("edx.courseware") @@ -149,18 +149,15 @@ class StudentModule(models.Model): return unicode(repr(self)) -class StudentModuleHistory(models.Model): - """Keeps a complete history of state changes for a given XModule for a given - Student. Right now, we restrict this to problems so that the table doesn't - explode in size.""" +class BaseStudentModuleHistory(models.Model): + """Abstract class containing most fields used by any class + storing Student Module History""" objects = ChunkingManager() HISTORY_SAVING_TYPES = {'problem'} class Meta(object): - app_label = "courseware" - get_latest_by = "created" + abstract = True - student_module = models.ForeignKey(StudentModule, db_index=True) version = models.CharField(max_length=255, null=True, blank=True, db_index=True) # This should be populated from the modified field in StudentModule @@ -169,11 +166,59 @@ class StudentModuleHistory(models.Model): grade = models.FloatField(null=True, blank=True) max_grade = models.FloatField(null=True, blank=True) - @receiver(post_save, sender=StudentModule) + @property + def csm(self): + """ + Finds the StudentModule object for this history record, even if our data is split + across multiple data stores. Django does not handle this correctly with the built-in + student_module property. + """ + return StudentModule.objects.get(pk=self.student_module_id) + + @staticmethod + def get_history(student_modules): + """ + Find history objects across multiple backend stores for a given StudentModule + """ + + history_entries = [] + + if settings.FEATURES.get('ENABLE_CSMH_EXTENDED'): + history_entries += coursewarehistoryextended.models.StudentModuleHistoryExtended.objects.filter( + # Django will sometimes try to join to courseware_studentmodule + # so just do an in query + student_module__in=[module.id for module in student_modules] + ).order_by('-id') + + # If we turn off reading from multiple history tables, then we don't want to read from + # StudentModuleHistory anymore, we believe that all history is in the Extended table. + if settings.FEATURES.get('ENABLE_READING_FROM_MULTIPLE_HISTORY_TABLES'): + # we want to save later SQL queries on the model which allows us to prefetch + history_entries += StudentModuleHistory.objects.prefetch_related('student_module').filter( + student_module__in=student_modules + ).order_by('-id') + + return history_entries + + +class StudentModuleHistory(BaseStudentModuleHistory): + """Keeps a complete history of state changes for a given XModule for a given + Student. Right now, we restrict this to problems so that the table doesn't + explode in size.""" + + class Meta(object): + app_label = "courseware" + get_latest_by = "created" + + student_module = models.ForeignKey(StudentModule, db_index=True) + + def __unicode__(self): + return unicode(repr(self)) + def save_history(sender, instance, **kwargs): # pylint: disable=no-self-argument, unused-argument """ Checks the instance's module_type, and creates & saves a - StudentModuleHistory entry if the module_type is one that + StudentModuleHistoryExtended entry if the module_type is one that we save. """ if instance.module_type in StudentModuleHistory.HISTORY_SAVING_TYPES: @@ -185,8 +230,11 @@ class StudentModuleHistory(models.Model): max_grade=instance.max_grade) history_entry.save() - def __unicode__(self): - return unicode(repr(self)) + # When the extended studentmodulehistory table exists, don't save + # duplicate history into courseware_studentmodulehistory, just retain + # data for reading. + if not settings.FEATURES.get('ENABLE_CSMH_EXTENDED'): + post_save.connect(save_history, sender=StudentModule) class XBlockFieldBase(models.Model): diff --git a/lms/djangoapps/courseware/tests/test_access.py b/lms/djangoapps/courseware/tests/test_access.py index 67566fd3f1..add8c738ee 100644 --- a/lms/djangoapps/courseware/tests/test_access.py +++ b/lms/djangoapps/courseware/tests/test_access.py @@ -520,6 +520,7 @@ class UserRoleTestCase(TestCase): """ Tests for user roles. """ + def setUp(self): super(UserRoleTestCase, self).setUp() self.course_key = SlashSeparatedCourseKey('edX', 'toy', '2012_Fall') diff --git a/lms/djangoapps/courseware/tests/test_grades.py b/lms/djangoapps/courseware/tests/test_grades.py index 84ef2498f6..5fce957284 100644 --- a/lms/djangoapps/courseware/tests/test_grades.py +++ b/lms/djangoapps/courseware/tests/test_grades.py @@ -240,6 +240,9 @@ class TestProgressSummary(TestCase): (2/5) (3/5) (0/1) - (1/3) - (3/10) """ + # Tell Django to clean out all databases, not just default + multi_db = True + def setUp(self): super(TestProgressSummary, self).setUp() self.course_key = CourseLocator( diff --git a/lms/djangoapps/courseware/tests/test_i18n.py b/lms/djangoapps/courseware/tests/test_i18n.py index e5ae1b6f19..345dc21dda 100644 --- a/lms/djangoapps/courseware/tests/test_i18n.py +++ b/lms/djangoapps/courseware/tests/test_i18n.py @@ -20,6 +20,7 @@ class BaseI18nTestCase(TestCase): """ Base utilities for i18n test classes to derive from """ + def assert_tag_has_attr(self, content, tag, attname, value): """Assert that a tag in `content` has a certain value in a certain attribute.""" regex = r"""<{tag} [^>]*\b{attname}=['"]([\w\d\- ]+)['"][^>]*>""".format(tag=tag, attname=attname) diff --git a/lms/djangoapps/courseware/tests/test_model_data.py b/lms/djangoapps/courseware/tests/test_model_data.py index e8c2a275f1..9f62de0875 100644 --- a/lms/djangoapps/courseware/tests/test_model_data.py +++ b/lms/djangoapps/courseware/tests/test_model_data.py @@ -103,6 +103,8 @@ class TestStudentModuleStorage(OtherUserFailureTestMixin, TestCase): """Tests for user_state storage via StudentModule""" other_key_factory = partial(DjangoKeyValueStore.Key, Scope.user_state, 2, location('usage_id')) # user_id=2, not 1 existing_field_name = "a_field" + # Tell Django to clean out all databases, not just default + multi_db = True def setUp(self): super(TestStudentModuleStorage, self).setUp() @@ -137,8 +139,9 @@ class TestStudentModuleStorage(OtherUserFailureTestMixin, TestCase): # to discover if something other than the DjangoXBlockUserStateClient # has written to the StudentModule (such as UserStateCache setting the score # on the StudentModule). - with self.assertNumQueries(3): - self.kvs.set(user_state_key('a_field'), 'new_value') + with self.assertNumQueries(2, using='default'): + with self.assertNumQueries(1, using='student_module_history'): + self.kvs.set(user_state_key('a_field'), 'new_value') self.assertEquals(1, StudentModule.objects.all().count()) self.assertEquals({'b_field': 'b_value', 'a_field': 'new_value'}, json.loads(StudentModule.objects.all()[0].state)) @@ -149,8 +152,9 @@ class TestStudentModuleStorage(OtherUserFailureTestMixin, TestCase): # to discover if something other than the DjangoXBlockUserStateClient # has written to the StudentModule (such as UserStateCache setting the score # on the StudentModule). - with self.assertNumQueries(3): - self.kvs.set(user_state_key('not_a_field'), 'new_value') + with self.assertNumQueries(2, using='default'): + with self.assertNumQueries(1, using='student_module_history'): + self.kvs.set(user_state_key('not_a_field'), 'new_value') self.assertEquals(1, StudentModule.objects.all().count()) self.assertEquals({'b_field': 'b_value', 'a_field': 'a_value', 'not_a_field': 'new_value'}, json.loads(StudentModule.objects.all()[0].state)) @@ -161,8 +165,9 @@ class TestStudentModuleStorage(OtherUserFailureTestMixin, TestCase): # to discover if something other than the DjangoXBlockUserStateClient # has written to the StudentModule (such as UserStateCache setting the score # on the StudentModule). - with self.assertNumQueries(3): - self.kvs.delete(user_state_key('a_field')) + with self.assertNumQueries(2, using='default'): + with self.assertNumQueries(1, using='student_module_history'): + self.kvs.delete(user_state_key('a_field')) self.assertEquals(1, StudentModule.objects.all().count()) self.assertRaises(KeyError, self.kvs.get, user_state_key('not_a_field')) @@ -201,8 +206,9 @@ class TestStudentModuleStorage(OtherUserFailureTestMixin, TestCase): # We also need to read the database to discover if something other than the # DjangoXBlockUserStateClient has written to the StudentModule (such as # UserStateCache setting the score on the StudentModule). - with self.assertNumQueries(3): - self.kvs.set_many(kv_dict) + with self.assertNumQueries(2, using="default"): + with self.assertNumQueries(1, using="student_module_history"): + self.kvs.set_many(kv_dict) for key in kv_dict: self.assertEquals(self.kvs.get(key), kv_dict[key]) @@ -223,6 +229,9 @@ class TestStudentModuleStorage(OtherUserFailureTestMixin, TestCase): @attr('shard_1') class TestMissingStudentModule(TestCase): + # Tell Django to clean out all databases, not just default + multi_db = True + def setUp(self): super(TestMissingStudentModule, self).setUp() @@ -244,13 +253,15 @@ class TestMissingStudentModule(TestCase): self.assertEquals(0, len(self.field_data_cache)) self.assertEquals(0, StudentModule.objects.all().count()) - # We are updating a problem, so we write to courseware_studentmodulehistory + # We are updating a problem, so we write to courseware_studentmodulehistoryextended # as well as courseware_studentmodule. We also need to read the database # to discover if something other than the DjangoXBlockUserStateClient # has written to the StudentModule (such as UserStateCache setting the score # on the StudentModule). - with self.assertNumQueries(5): - self.kvs.set(user_state_key('a_field'), 'a_value') + # Django 1.8 also has a number of other BEGIN and SAVESTATE queries. + with self.assertNumQueries(4, using='default'): + with self.assertNumQueries(1, using='student_module_history'): + self.kvs.set(user_state_key('a_field'), 'a_value') self.assertEquals(1, sum(len(cache) for cache in self.field_data_cache.cache.values())) self.assertEquals(1, StudentModule.objects.all().count()) diff --git a/lms/djangoapps/courseware/tests/test_submitting_problems.py b/lms/djangoapps/courseware/tests/test_submitting_problems.py index 23a7ae2aa6..8a7761a322 100644 --- a/lms/djangoapps/courseware/tests/test_submitting_problems.py +++ b/lms/djangoapps/courseware/tests/test_submitting_problems.py @@ -19,7 +19,7 @@ from capa.tests.response_xml_factory import ( CodeResponseXMLFactory, ) from courseware import grades -from courseware.models import StudentModule, StudentModuleHistory +from courseware.models import StudentModule, BaseStudentModuleHistory from courseware.tests.helpers import LoginEnrollmentTestCase from lms.djangoapps.lms_xblock.runtime import quote_slashes from student.tests.factories import UserFactory @@ -121,6 +121,8 @@ class TestSubmittingProblems(ModuleStoreTestCase, LoginEnrollmentTestCase, Probl Check that a course gets graded properly. """ + # Tell Django to clean out all databases, not just default + multi_db = True # arbitrary constant COURSE_SLUG = "100" COURSE_NAME = "test_course" @@ -319,6 +321,9 @@ class TestCourseGrader(TestSubmittingProblems): """ Suite of tests for the course grader. """ + # Tell Django to clean out all databases, not just default + multi_db = True + def basic_setup(self, late=False, reset=False, showanswer=False): """ Set up a simple course for testing basic grading functionality. @@ -451,26 +456,20 @@ class TestCourseGrader(TestSubmittingProblems): self.submit_question_answer('p1', {'2_1': u'Correct'}) # Now fetch the state entry for that problem. - student_module = StudentModule.objects.get( + student_module = StudentModule.objects.filter( course_id=self.course.id, student=self.student_user ) # count how many state history entries there are - baseline = StudentModuleHistory.objects.filter( - student_module=student_module - ) - baseline_count = baseline.count() - self.assertEqual(baseline_count, 3) + baseline = BaseStudentModuleHistory.get_history(student_module) + self.assertEqual(len(baseline), 3) # now click "show answer" self.show_question_answer('p1') # check that we don't have more state history entries - csmh = StudentModuleHistory.objects.filter( - student_module=student_module - ) - current_count = csmh.count() - self.assertEqual(current_count, 3) + csmh = BaseStudentModuleHistory.get_history(student_module) + self.assertEqual(len(csmh), 3) def test_grade_with_max_score_cache(self): """ @@ -713,6 +712,8 @@ class TestCourseGrader(TestSubmittingProblems): @attr('shard_1') class ProblemWithUploadedFilesTest(TestSubmittingProblems): """Tests of problems with uploaded files.""" + # Tell Django to clean out all databases, not just default + multi_db = True def setUp(self): super(ProblemWithUploadedFilesTest, self).setUp() @@ -768,6 +769,8 @@ class TestPythonGradedResponse(TestSubmittingProblems): """ Check that we can submit a schematic and custom response, and it answers properly. """ + # Tell Django to clean out all databases, not just default + multi_db = True SCHEMATIC_SCRIPT = dedent(""" # for a schematic response, submission[i] is the json representation diff --git a/lms/djangoapps/courseware/tests/test_user_state_client.py b/lms/djangoapps/courseware/tests/test_user_state_client.py index 5bb9a0682b..143bd7f644 100644 --- a/lms/djangoapps/courseware/tests/test_user_state_client.py +++ b/lms/djangoapps/courseware/tests/test_user_state_client.py @@ -18,6 +18,8 @@ class TestDjangoUserStateClient(UserStateClientTestBase, TestCase): Tests of the DjangoUserStateClient backend. """ __test__ = True + # Tell Django to clean out all databases, not just default + multi_db = True def _user(self, user_idx): return self.users[user_idx].username diff --git a/lms/djangoapps/courseware/user_state_client.py b/lms/djangoapps/courseware/user_state_client.py index e90eeb8f47..b965a15ebe 100644 --- a/lms/djangoapps/courseware/user_state_client.py +++ b/lms/djangoapps/courseware/user_state_client.py @@ -15,7 +15,7 @@ except ImportError: import dogstats_wrapper as dog_stats_api from django.contrib.auth.models import User from xblock.fields import Scope, ScopeBase -from courseware.models import StudentModule, StudentModuleHistory +from courseware.models import StudentModule, BaseStudentModuleHistory from edx_user_state_client.interface import XBlockUserStateClient, XBlockUserState @@ -312,9 +312,7 @@ class DjangoXBlockUserStateClient(XBlockUserStateClient): if len(student_modules) == 0: raise self.DoesNotExist() - history_entries = StudentModuleHistory.objects.prefetch_related('student_module').filter( - student_module__in=student_modules - ).order_by('-id') + history_entries = BaseStudentModuleHistory.get_history(student_modules) # If no history records exist, raise an error if not history_entries: @@ -332,9 +330,9 @@ class DjangoXBlockUserStateClient(XBlockUserStateClient): if state == {}: state = None - block_key = history_entry.student_module.module_state_key + block_key = history_entry.csm.module_state_key block_key = block_key.map_into_course( - history_entry.student_module.course_id + history_entry.csm.course_id ) yield XBlockUserState(username, block_key, state, history_entry.created, scope) diff --git a/lms/djangoapps/courseware/views.py b/lms/djangoapps/courseware/views.py index 73a43345c1..7d4cde32ab 100644 --- a/lms/djangoapps/courseware/views.py +++ b/lms/djangoapps/courseware/views.py @@ -59,7 +59,7 @@ from courseware.courses import ( ) from courseware.masquerade import setup_masquerade from courseware.model_data import FieldDataCache, ScoresClient -from courseware.models import StudentModuleHistory +from courseware.models import StudentModule, BaseStudentModuleHistory from courseware.url_helpers import get_redirect_url from courseware.user_state_client import DjangoXBlockUserStateClient from edxmako.shortcuts import render_to_response, render_to_string, marketing_link @@ -1173,11 +1173,12 @@ def submission_history(request, course_id, student_username, location): # This is ugly, but until we have a proper submissions API that we can use to provide # the scores instead, it will have to do. - scores = list(StudentModuleHistory.objects.filter( - student_module__module_state_key=usage_key, - student_module__student__username=student_username, - student_module__course_id=course_key - ).order_by('-id')) + csm = StudentModule.objects.filter( + module_state_key=usage_key, + student__username=student_username, + course_id=course_key) + + scores = BaseStudentModuleHistory.get_history(csm) if len(scores) != len(history_entries): log.warning( diff --git a/lms/djangoapps/coursewarehistoryextended/__init__.py b/lms/djangoapps/coursewarehistoryextended/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lms/djangoapps/coursewarehistoryextended/fields.py b/lms/djangoapps/coursewarehistoryextended/fields.py new file mode 100644 index 0000000000..a001543d31 --- /dev/null +++ b/lms/djangoapps/coursewarehistoryextended/fields.py @@ -0,0 +1,25 @@ +""" +Custom fields for use in the coursewarehistoryextended django app. +""" + +from django.db.models.fields import AutoField + + +class UnsignedBigIntAutoField(AutoField): + """ + An unsigned 8-byte integer for auto-incrementing primary keys. + """ + def db_type(self, connection): + if connection.settings_dict['ENGINE'] == 'django.db.backends.mysql': + return "bigint UNSIGNED AUTO_INCREMENT" + elif connection.settings_dict['ENGINE'] == 'django.db.backends.sqlite3': + # Sqlite will only auto-increment the ROWID column. Any INTEGER PRIMARY KEY column + # is an alias for that (https://www.sqlite.org/autoinc.html). An unsigned integer + # isn't an alias for ROWID, so we have to give up on the unsigned part. + return "integer" + elif connection.settings_dict['ENGINE'] == 'django.db.backends.postgresql_psycopg2': + # Pg's bigserial is implicitly unsigned (doesn't allow negative numbers) and + # goes 1-9.2x10^18 + return "BIGSERIAL" + else: + return None diff --git a/lms/djangoapps/coursewarehistoryextended/migrations/0001_initial.py b/lms/djangoapps/coursewarehistoryextended/migrations/0001_initial.py new file mode 100644 index 0000000000..74bbcb778a --- /dev/null +++ b/lms/djangoapps/coursewarehistoryextended/migrations/0001_initial.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion +import coursewarehistoryextended.fields +from django.conf import settings + +def bump_pk_start(apps, schema_editor): + if not schema_editor.connection.alias == 'student_module_history': + return + StudentModuleHistory = apps.get_model("courseware", "StudentModuleHistory") + biggest_id = StudentModuleHistory.objects.all().order_by('-id').first() + initial_id = settings.STUDENTMODULEHISTORYEXTENDED_OFFSET + if biggest_id is not None: + initial_id += biggest_id.id + + if schema_editor.connection.vendor == 'mysql': + schema_editor.execute('ALTER TABLE coursewarehistoryextended_studentmodulehistoryextended AUTO_INCREMENT=%s', [initial_id]) + elif schema_editor.connection.vendor == 'sqlite3': + # This is a hack to force sqlite to add new rows after the earlier rows we + # want to migrate. + StudentModuleHistory( + id=initial_id, + course_key=None, + usage_key=None, + username="", + version="", + created=datetime.datetime.now(), + ).save() + elif schema_editor.connection.vendor == 'postgresql': + schema_editor.execute("SELECT setval('coursewarehistoryextended_studentmodulehistoryextended_seq', %s)", [initial_id]) + +class Migration(migrations.Migration): + + dependencies = [ + ('courseware', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='StudentModuleHistoryExtended', + fields=[ + ('version', models.CharField(db_index=True, max_length=255, null=True, blank=True)), + ('created', models.DateTimeField(db_index=True)), + ('state', models.TextField(null=True, blank=True)), + ('grade', models.FloatField(null=True, blank=True)), + ('max_grade', models.FloatField(null=True, blank=True)), + ('id', coursewarehistoryextended.fields.UnsignedBigIntAutoField(serialize=False, primary_key=True)), + ('student_module', models.ForeignKey(to='courseware.StudentModule', on_delete=django.db.models.deletion.DO_NOTHING, db_constraint=False)), + ], + options={ + 'get_latest_by': 'created', + }, + ), + migrations.RunPython(bump_pk_start, reverse_code=migrations.RunPython.noop), + ] diff --git a/lms/djangoapps/coursewarehistoryextended/migrations/__init__.py b/lms/djangoapps/coursewarehistoryextended/migrations/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lms/djangoapps/coursewarehistoryextended/models.py b/lms/djangoapps/coursewarehistoryextended/models.py new file mode 100644 index 0000000000..8c3630b0e3 --- /dev/null +++ b/lms/djangoapps/coursewarehistoryextended/models.py @@ -0,0 +1,64 @@ +""" +WE'RE USING MIGRATIONS! + +If you make changes to this model, be sure to create an appropriate migration +file and check it in at the same time as your model changes. To do that, + +1. Go to the edx-platform dir +2. ./manage.py schemamigration courseware --auto description_of_your_change +3. Add the migration file created in edx-platform/lms/djangoapps/coursewarehistoryextended/migrations/ + + +ASSUMPTIONS: modules have unique IDs, even across different module_types + +""" +from django.db import models +from django.db.models.signals import post_save, post_delete +from django.dispatch import receiver + +from coursewarehistoryextended.fields import UnsignedBigIntAutoField +from courseware.models import StudentModule, BaseStudentModuleHistory + + +class StudentModuleHistoryExtended(BaseStudentModuleHistory): + """Keeps a complete history of state changes for a given XModule for a given + Student. Right now, we restrict this to problems so that the table doesn't + explode in size. + + This new extended CSMH has a larger primary key that won't run out of space + so quickly.""" + + class Meta(object): + app_label = 'coursewarehistoryextended' + get_latest_by = "created" + + id = UnsignedBigIntAutoField(primary_key=True) # pylint: disable=invalid-name + + student_module = models.ForeignKey(StudentModule, db_index=True, db_constraint=False, on_delete=models.DO_NOTHING) + + @receiver(post_save, sender=StudentModule) + def save_history(sender, instance, **kwargs): # pylint: disable=no-self-argument, unused-argument + """ + Checks the instance's module_type, and creates & saves a + StudentModuleHistoryExtended entry if the module_type is one that + we save. + """ + if instance.module_type in StudentModuleHistoryExtended.HISTORY_SAVING_TYPES: + history_entry = StudentModuleHistoryExtended(student_module=instance, + version=None, + created=instance.modified, + state=instance.state, + grade=instance.grade, + max_grade=instance.max_grade) + history_entry.save() + + @receiver(post_delete, sender=StudentModule) + def delete_history(sender, instance, **kwargs): # pylint: disable=no-self-argument, unused-argument + """ + Django can't cascade delete across databases, so we tell it at the model level to + on_delete=DO_NOTHING and then listen for post_delete so we can clean up the CSMHE rows. + """ + StudentModuleHistoryExtended.objects.filter(student_module=instance).all().delete() + + def __unicode__(self): + return unicode(repr(self)) diff --git a/lms/djangoapps/coursewarehistoryextended/tests.py b/lms/djangoapps/coursewarehistoryextended/tests.py new file mode 100644 index 0000000000..759fdfe4be --- /dev/null +++ b/lms/djangoapps/coursewarehistoryextended/tests.py @@ -0,0 +1,81 @@ +""" +Tests for coursewarehistoryextended +Many aspects of this app are covered by the courseware tests, +but these are specific to the new storage model with multiple +backend tables. +""" + +import json +from mock import patch +from django.test import TestCase +from django.conf import settings +from unittest import skipUnless +from nose.plugins.attrib import attr + +from courseware.models import BaseStudentModuleHistory, StudentModuleHistory, StudentModule + +from courseware.tests.factories import StudentModuleFactory, location, course_id + + +@attr('shard_1') +@skipUnless(settings.FEATURES["ENABLE_CSMH_EXTENDED"], "CSMH Extended needs to be enabled") +class TestStudentModuleHistoryBackends(TestCase): + """ Tests of data in CSMH and CSMHE """ + # Tell Django to clean out all databases, not just default + multi_db = True + + def setUp(self): + super(TestStudentModuleHistoryBackends, self).setUp() + for record in (1, 2, 3): + # This will store into CSMHE via the post_save signal + csm = StudentModuleFactory.create(module_state_key=location('usage_id'), + course_id=course_id, + state=json.dumps({'type': 'csmhe', 'order': record})) + # This manually gets us a CSMH record to compare + csmh = StudentModuleHistory(student_module=csm, + version=None, + created=csm.modified, + state=json.dumps({'type': 'csmh', 'order': record}), + grade=csm.grade, + max_grade=csm.max_grade) + csmh.save() + + @patch.dict("django.conf.settings.FEATURES", {"ENABLE_CSMH_EXTENDED": True}) + @patch.dict("django.conf.settings.FEATURES", {"ENABLE_READING_FROM_MULTIPLE_HISTORY_TABLES": True}) + def test_get_history_true_true(self): + student_module = StudentModule.objects.all() + history = BaseStudentModuleHistory.get_history(student_module) + self.assertEquals(len(history), 6) + self.assertEquals({'type': 'csmhe', 'order': 3}, json.loads(history[0].state)) + self.assertEquals({'type': 'csmhe', 'order': 2}, json.loads(history[1].state)) + self.assertEquals({'type': 'csmhe', 'order': 1}, json.loads(history[2].state)) + self.assertEquals({'type': 'csmh', 'order': 3}, json.loads(history[3].state)) + self.assertEquals({'type': 'csmh', 'order': 2}, json.loads(history[4].state)) + self.assertEquals({'type': 'csmh', 'order': 1}, json.loads(history[5].state)) + + @patch.dict("django.conf.settings.FEATURES", {"ENABLE_CSMH_EXTENDED": True}) + @patch.dict("django.conf.settings.FEATURES", {"ENABLE_READING_FROM_MULTIPLE_HISTORY_TABLES": False}) + def test_get_history_true_false(self): + student_module = StudentModule.objects.all() + history = BaseStudentModuleHistory.get_history(student_module) + self.assertEquals(len(history), 3) + self.assertEquals({'type': 'csmhe', 'order': 3}, json.loads(history[0].state)) + self.assertEquals({'type': 'csmhe', 'order': 2}, json.loads(history[1].state)) + self.assertEquals({'type': 'csmhe', 'order': 1}, json.loads(history[2].state)) + + @patch.dict("django.conf.settings.FEATURES", {"ENABLE_CSMH_EXTENDED": False}) + @patch.dict("django.conf.settings.FEATURES", {"ENABLE_READING_FROM_MULTIPLE_HISTORY_TABLES": True}) + def test_get_history_false_true(self): + student_module = StudentModule.objects.all() + history = BaseStudentModuleHistory.get_history(student_module) + self.assertEquals(len(history), 3) + self.assertEquals({'type': 'csmh', 'order': 3}, json.loads(history[0].state)) + self.assertEquals({'type': 'csmh', 'order': 2}, json.loads(history[1].state)) + self.assertEquals({'type': 'csmh', 'order': 1}, json.loads(history[2].state)) + + @patch.dict("django.conf.settings.FEATURES", {"ENABLE_CSMH_EXTENDED": False}) + @patch.dict("django.conf.settings.FEATURES", {"ENABLE_READING_FROM_MULTIPLE_HISTORY_TABLES": False}) + def test_get_history_false_false(self): + student_module = StudentModule.objects.all() + history = BaseStudentModuleHistory.get_history(student_module) + self.assertEquals(len(history), 0) diff --git a/lms/envs/acceptance.py b/lms/envs/acceptance.py index 7a8b3bee55..101e7bb7ec 100644 --- a/lms/envs/acceptance.py +++ b/lms/envs/acceptance.py @@ -72,6 +72,14 @@ DATABASES = { 'timeout': 30, }, 'ATOMIC_REQUESTS': True, + }, + 'student_module_history': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': TEST_ROOT / "db" / "test_student_module_history.db", + 'TEST_NAME': TEST_ROOT / "db" / "test_student_module_history.db", + 'OPTIONS': { + 'timeout': 30, + }, } } @@ -145,7 +153,9 @@ LETTUCE_APPS = ('courseware', 'instructor') # This causes some pretty cryptic errors as lettuce tries # to parse files in `instructor_task` as features. # As a quick workaround, explicitly exclude the `instructor_task` app. -LETTUCE_AVOID_APPS = ('instructor_task',) +# The coursewarehistoryextended app also falls prey to this fuzzy +# for the courseware app. +LETTUCE_AVOID_APPS = ('instructor_task', 'coursewarehistoryextended') LETTUCE_BROWSER = os.environ.get('LETTUCE_BROWSER', 'chrome') diff --git a/lms/envs/aws.py b/lms/envs/aws.py index 5e9327376d..d5935394af 100644 --- a/lms/envs/aws.py +++ b/lms/envs/aws.py @@ -759,6 +759,11 @@ MICROSITE_DATABASE_TEMPLATE_CACHE_TTL = ENV_TOKENS.get( # Course Content Bookmarks Settings MAX_BOOKMARKS_PER_COURSE = ENV_TOKENS.get('MAX_BOOKMARKS_PER_COURSE', MAX_BOOKMARKS_PER_COURSE) +# Offset for pk of courseware.StudentModuleHistoryExtended +STUDENTMODULEHISTORYEXTENDED_OFFSET = ENV_TOKENS.get( + 'STUDENTMODULEHISTORYEXTENDED_OFFSET', STUDENTMODULEHISTORYEXTENDED_OFFSET +) + # Cutoff date for granting audit certificates if ENV_TOKENS.get('AUDIT_CERT_CUTOFF_DATE', None): AUDIT_CERT_CUTOFF_DATE = dateutil.parser.parse(ENV_TOKENS.get('AUDIT_CERT_CUTOFF_DATE')) @@ -766,3 +771,7 @@ if ENV_TOKENS.get('AUDIT_CERT_CUTOFF_DATE', None): ################################ Settings for Credentials Service ################################ CREDENTIALS_GENERATION_ROUTING_KEY = HIGH_PRIORITY_QUEUE + +# The extended StudentModule history table +if FEATURES.get('ENABLE_CSMH_EXTENDED'): + INSTALLED_APPS += ('coursewarehistoryextended',) diff --git a/lms/envs/aws_migrate.py b/lms/envs/aws_migrate.py index e14834ec2d..6dff697339 100644 --- a/lms/envs/aws_migrate.py +++ b/lms/envs/aws_migrate.py @@ -13,18 +13,25 @@ from .aws import * import os from django.core.exceptions import ImproperlyConfigured -DB_OVERRIDES = dict( - PASSWORD=os.environ.get('DB_MIGRATION_PASS', None), - ENGINE=os.environ.get('DB_MIGRATION_ENGINE', DATABASES['default']['ENGINE']), - USER=os.environ.get('DB_MIGRATION_USER', DATABASES['default']['USER']), - NAME=os.environ.get('DB_MIGRATION_NAME', DATABASES['default']['NAME']), - HOST=os.environ.get('DB_MIGRATION_HOST', DATABASES['default']['HOST']), - PORT=os.environ.get('DB_MIGRATION_PORT', DATABASES['default']['PORT']), -) -if DB_OVERRIDES['PASSWORD'] is None: - raise ImproperlyConfigured("No database password was provided for running " - "migrations. This is fatal.") +def get_db_overrides(db_name): + """ + Now that we have multiple databases, we want to look up from the environment + for both databases. + """ + db_overrides = dict( + PASSWORD=os.environ.get('DB_MIGRATION_PASS', None), + ENGINE=os.environ.get('DB_MIGRATION_ENGINE', DATABASES[db_name]['ENGINE']), + USER=os.environ.get('DB_MIGRATION_USER', DATABASES[db_name]['USER']), + NAME=os.environ.get('DB_MIGRATION_NAME', DATABASES[db_name]['NAME']), + HOST=os.environ.get('DB_MIGRATION_HOST', DATABASES[db_name]['HOST']), + PORT=os.environ.get('DB_MIGRATION_PORT', DATABASES[db_name]['PORT']), + ) -for override, value in DB_OVERRIDES.iteritems(): - DATABASES['default'][override] = value + if db_overrides['PASSWORD'] is None: + raise ImproperlyConfigured("No database password was provided for running " + "migrations. This is fatal.") + return db_overrides + +for db in ['default', 'student_module_history']: + DATABASES[db].update(get_db_overrides(db)) diff --git a/lms/envs/bok_choy.auth.json b/lms/envs/bok_choy.auth.json index c8b83d25bd..a25ec6fb09 100644 --- a/lms/envs/bok_choy.auth.json +++ b/lms/envs/bok_choy.auth.json @@ -39,6 +39,14 @@ "PASSWORD": "", "PORT": "3306", "USER": "root" + }, + "student_module_history": { + "ENGINE": "django.db.backends.mysql", + "HOST": "localhost", + "NAME": "student_module_history_test", + "PASSWORD": "", + "PORT": "3306", + "USER": "root" } }, "DOC_STORE_CONFIG": { diff --git a/lms/envs/bok_choy.py b/lms/envs/bok_choy.py index 1990473417..cb74f9a87f 100644 --- a/lms/envs/bok_choy.py +++ b/lms/envs/bok_choy.py @@ -178,6 +178,11 @@ PROFILE_IMAGE_BACKEND = { 'base_url': os.path.join(MEDIA_URL, 'profile-images/'), }, } + +# Make sure we test with the extended history table +FEATURES['ENABLE_CSMH_EXTENDED'] = True +INSTALLED_APPS += ('coursewarehistoryextended',) + ##################################################################### # Lastly, see if the developer has any local overrides. try: diff --git a/lms/envs/common.py b/lms/envs/common.py index e58e583953..c73eaae451 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -363,6 +363,18 @@ FEATURES = { # Show Language selector. 'SHOW_LANGUAGE_SELECTOR': False, + + # Write new CSM history to the extended table. + # This will eventually default to True and may be + # removed since all installs should have the separate + # extended history table. + 'ENABLE_CSMH_EXTENDED': False, + + # Read from both the CSMH and CSMHE history tables. + # This is the default, but can be disabled if all history + # lives in the Extended table, saving the frontend from + # making multiple queries. + 'ENABLE_READING_FROM_MULTIPLE_HISTORY_TABLES': True } # Ignore static asset files on import which match this pattern @@ -413,6 +425,12 @@ GEOIPV6_PATH = REPO_ROOT / "common/static/data/geoip/GeoIPv6.dat" # Where to look for a status message STATUS_MESSAGE_PATH = ENV_ROOT / "status_message.json" +############################ Global Database Configuration ##################### + +DATABASE_ROUTERS = [ + 'openedx.core.lib.django_courseware_routers.StudentModuleHistoryExtendedRouter', +] + ############################ OpenID Provider ################################## OPENID_PROVIDER_TRUSTED_ROOTS = ['cs50.net', '*.cs50.net'] @@ -2759,6 +2777,13 @@ MOBILE_APP_USER_AGENT_REGEXES = [ r'edX/org.edx.mobile', ] +# Offset for courseware.StudentModuleHistoryExtended which is used to +# calculate the starting primary key for the underlying table. This gap +# should be large enough that you do not generate more than N courseware.StudentModuleHistory +# records before you have deployed the app to write to coursewarehistoryextended.StudentModuleHistoryExtended +# if you want to avoid an overlap in ids while searching for history across the two tables. +STUDENTMODULEHISTORYEXTENDED_OFFSET = 10000 + # Deprecated xblock types DEPRECATED_ADVANCED_COMPONENT_TYPES = [] diff --git a/lms/envs/dev.py b/lms/envs/dev.py index 065ed74b28..024bb630ea 100644 --- a/lms/envs/dev.py +++ b/lms/envs/dev.py @@ -48,6 +48,11 @@ DATABASES = { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': ENV_ROOT / "db" / "edx.db", 'ATOMIC_REQUESTS': True, + }, + 'student_module_history': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': ENV_ROOT / "db" / "student_module_history.db", + 'ATOMIC_REQUESTS': True, } } diff --git a/lms/envs/devplus.py b/lms/envs/devplus.py index 86800d8847..c06c698730 100644 --- a/lms/envs/devplus.py +++ b/lms/envs/devplus.py @@ -31,6 +31,15 @@ DATABASES = { 'HOST': '127.0.0.1', 'PORT': '3306', 'ATOMIC_REQUESTS': True, + }, + 'student_module_history': { + 'ENGINE': 'django.db.backends.mysql', + 'NAME': 'student_module_history', + 'USER': 'root', + 'PASSWORD': '', + 'HOST': '127.0.0.1', + 'PORT': '3306', + 'ATOMIC_REQUESTS': True, } } diff --git a/lms/envs/static.py b/lms/envs/static.py index f0da488e75..2229850f89 100644 --- a/lms/envs/static.py +++ b/lms/envs/static.py @@ -27,6 +27,11 @@ DATABASES = { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': ENV_ROOT / "db" / "edx.db", 'ATOMIC_REQUESTS': True, + }, + 'student_module_history': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': ENV_ROOT / "db" / "student_module_history.db", + 'ATOMIC_REQUESTS': True, } } diff --git a/lms/envs/test.py b/lms/envs/test.py index c16ac9d37e..83f55c337c 100644 --- a/lms/envs/test.py +++ b/lms/envs/test.py @@ -186,7 +186,10 @@ DATABASES = { 'NAME': TEST_ROOT / 'db' / 'edx.db', 'ATOMIC_REQUESTS': True, }, - + 'student_module_history': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': TEST_ROOT / 'db' / 'student_module_history.db' + }, } if os.environ.get('DISABLE_MIGRATIONS'): @@ -194,6 +197,10 @@ if os.environ.get('DISABLE_MIGRATIONS'): # to Django 1.9, which allows setting MIGRATION_MODULES to None in order to skip migrations. MIGRATION_MODULES = NoOpMigrationModules() +# Make sure we test with the extended history table +FEATURES['ENABLE_CSMH_EXTENDED'] = True +INSTALLED_APPS += ('coursewarehistoryextended',) + CACHES = { # This is the cache used for most things. # In staging/prod envs, the sessions also live here. diff --git a/lms/envs/test_static_optimized.py b/lms/envs/test_static_optimized.py index 19eaa2814e..f8ed5a9bb1 100644 --- a/lms/envs/test_static_optimized.py +++ b/lms/envs/test_static_optimized.py @@ -19,7 +19,9 @@ DATABASES = { 'ENGINE': 'django.db.backends.sqlite3', 'ATOMIC_REQUESTS': True, }, - + 'student_module_history': { + 'ENGINE': 'django.db.backends.sqlite3', + }, } # Provide a dummy XQUEUE_INTERFACE setting as LMS expects it to exist on start up diff --git a/openedx/core/lib/django_courseware_routers.py b/openedx/core/lib/django_courseware_routers.py new file mode 100644 index 0000000000..4665efe47f --- /dev/null +++ b/openedx/core/lib/django_courseware_routers.py @@ -0,0 +1,57 @@ +""" +Database Routers for use with the coursewarehistoryextended django app. +""" + + +class StudentModuleHistoryExtendedRouter(object): + """ + A Database Router that separates StudentModuleHistoryExtended into its own database. + """ + + DATABASE_NAME = 'student_module_history' + + def _is_csmh(self, model): + """ + Return True if ``model`` is courseware.StudentModuleHistoryExtended. + """ + return ( + model._meta.app_label == 'coursewarehistoryextended' and # pylint: disable=protected-access + model.__name__ == 'StudentModuleHistoryExtended' + ) + + def db_for_read(self, model, **hints): # pylint: disable=unused-argument + """ + Use the StudentModuleHistoryExtendedRouter.DATABASE_NAME if the model is StudentModuleHistoryExtended. + """ + if self._is_csmh(model): + return self.DATABASE_NAME + else: + return None + + def db_for_write(self, model, **hints): # pylint: disable=unused-argument + """ + Use the StudentModuleHistoryExtendedRouter.DATABASE_NAME if the model is StudentModuleHistoryExtended. + """ + if self._is_csmh(model): + return self.DATABASE_NAME + else: + return None + + def allow_relation(self, obj1, obj2, **hints): # pylint: disable=unused-argument + """ + Disable relations if the model is StudentModuleHistoryExtended. + """ + if self._is_csmh(obj1) or self._is_csmh(obj2): + return False + return None + + def allow_migrate(self, db, model): # pylint: disable=unused-argument + """ + Only sync StudentModuleHistoryExtended to StudentModuleHistoryExtendedRouter.DATABASE_Name + """ + if self._is_csmh(model): + return db == self.DATABASE_NAME + elif db == self.DATABASE_NAME: + return False + + return None diff --git a/pavelib/utils/test/suites/acceptance_suite.py b/pavelib/utils/test/suites/acceptance_suite.py index 70c226dd06..a9081acb9a 100644 --- a/pavelib/utils/test/suites/acceptance_suite.py +++ b/pavelib/utils/test/suites/acceptance_suite.py @@ -69,8 +69,14 @@ class AcceptanceTestSuite(TestSuite): def __init__(self, *args, **kwargs): super(AcceptanceTestSuite, self).__init__(*args, **kwargs) self.root = 'acceptance' - self.db = Env.REPO_ROOT / 'test_root/db/test_edx.db' - self.db_cache = Env.REPO_ROOT / 'common/test/db_cache/lettuce.db' + self.dbs = { + 'default': Env.REPO_ROOT / 'test_root/db/test_edx.db', + 'student_module_history': Env.REPO_ROOT / 'test_root/db/test_student_module_history.db' + } + self.db_caches = { + 'default': Env.REPO_ROOT / 'common/test/db_cache/lettuce.db', + 'student_module_history': Env.REPO_ROOT / 'common/test/db_cache/lettuce_student_module_history.db' + } self.fasttest = kwargs.get('fasttest', False) if kwargs.get('system'): @@ -114,24 +120,30 @@ class AcceptanceTestSuite(TestSuite): definitions to sync and migrate. """ - if self.db.isfile(): - # Since we are using SQLLite, we can reset the database by deleting it on disk. - self.db.remove() + for db in self.dbs.keys(): + if self.dbs[db].isfile(): + # Since we are using SQLLite, we can reset the database by deleting it on disk. + self.dbs[db].remove() - if self.db_cache.isfile(): + if all(self.db_caches[cache].isfile() for cache in self.db_caches.keys()): # To speed up migrations, we check for a cached database file and start from that. # The cached database file should be checked into the repo # Copy the cached database to the test root directory - sh("cp {db_cache} {db}".format(db_cache=self.db_cache, db=self.db)) + for db_alias in self.dbs.keys(): + sh("cp {db_cache} {db}".format(db_cache=self.db_caches[db_alias], db=self.dbs[db_alias])) # Run migrations to update the db, starting from its cached state - sh("./manage.py lms --settings acceptance migrate --traceback --noinput --fake-initial") - sh("./manage.py cms --settings acceptance migrate --traceback --noinput --fake-initial") + for db_alias in sorted(self.dbs.keys()): + # pylint: disable=line-too-long + sh("./manage.py lms --settings acceptance migrate --traceback --noinput --fake-initial --database {}".format(db_alias)) + sh("./manage.py cms --settings acceptance migrate --traceback --noinput --fake-initial --database {}".format(db_alias)) else: # If no cached database exists, syncdb before migrating, then create the cache - sh("./manage.py lms --settings acceptance migrate --traceback --noinput") - sh("./manage.py cms --settings acceptance migrate --traceback --noinput") + for db_alias in sorted(self.dbs.keys()): + sh("./manage.py lms --settings acceptance migrate --traceback --noinput --database {}".format(db_alias)) + sh("./manage.py cms --settings acceptance migrate --traceback --noinput --database {}".format(db_alias)) # Create the cache if it doesn't already exist - sh("cp {db} {db_cache}".format(db_cache=self.db_cache, db=self.db)) + for db_alias in self.dbs.keys(): + sh("cp {db} {db_cache}".format(db_cache=self.db_caches[db_alias], db=self.dbs[db_alias])) diff --git a/scripts/reset-test-db.sh b/scripts/reset-test-db.sh index 41eefdedf4..cd04081909 100755 --- a/scripts/reset-test-db.sh +++ b/scripts/reset-test-db.sh @@ -24,35 +24,55 @@ DB_CACHE_DIR="common/test/db_cache" -# Ensure the test database exists. -echo "CREATE DATABASE IF NOT EXISTS edxtest;" | mysql -u root +declare -A databases +declare -a database_order +databases=(["default"]="edxtest" ["student_module_history"]="student_module_history_test") +database_order=("default" "student_module_history") -# Clear out the test database -# -# We are using the django-extensions's reset_db command which uses "DROP DATABASE" and -# "CREATE DATABASE" in case the tests are being run in an environment (e.g. devstack -# or a jenkins worker environment) that already ran tests on another commit that had -# different migrations that created, dropped, or altered tables. -echo "Issuing a reset_db command to the bok_choy MySQL database." -./manage.py lms --settings bok_choy reset_db --traceback --noinput +# Ensure the test database exists. +for db in "${database_order[@]}"; do + echo "CREATE DATABASE IF NOT EXISTS ${databases[$db]};" | mysql -u root + + # Clear out the test database + # + # We are using the django-extensions's reset_db command which uses "DROP DATABASE" and + # "CREATE DATABASE" in case the tests are being run in an environment (e.g. devstack + # or a jenkins worker environment) that already ran tests on another commit that had + # different migrations that created, dropped, or altered tables. + echo "Issuing a reset_db command to the $db bok_choy MySQL database." + ./manage.py lms --settings bok_choy reset_db --traceback --noinput --router $db + + # If there are cached database schemas/data, load them + if [[ ! -f $DB_CACHE_DIR/bok_choy_schema_$db.sql || ! -f $DB_CACHE_DIR/bok_choy_data_$db.json || ! -f $DB_CACHE_DIR/bok_choy_migrations_data_$db.sql ]]; then + echo "Missing $DB_CACHE_DIR/bok_choy_schema_$db.sql or $DB_CACHE_DIR/bok_choy_data_$db.json, or $DB_CACHE_DIR/bok_choy_migrations_data_$db.sql rebuilding cache" + REBUILD_CACHE=true + fi + +done # If there are cached database schemas/data, load them -if [[ -f $DB_CACHE_DIR/bok_choy_schema.sql && -f $DB_CACHE_DIR/bok_choy_migrations_data.sql && -f $DB_CACHE_DIR/bok_choy_data.json ]]; then +if [[ -z $REBUILD_CACHE ]]; then echo "Found the bok_choy DB cache files. Loading them into the database..." - # Load the schema, then the data (including the migration history) - echo "Loading the schema from the filesystem into the MySQL DB." - mysql -u root edxtest < $DB_CACHE_DIR/bok_choy_schema.sql - echo "Loading the migration data from the filesystem into the MySQL DB." - mysql -u root edxtest < $DB_CACHE_DIR/bok_choy_migrations_data.sql - echo "Loading the fixture data from the filesystem into the MySQL DB." - ./manage.py lms --settings bok_choy loaddata $DB_CACHE_DIR/bok_choy_data.json - # Re-run migrations to ensure we are up-to-date - echo "Running the lms migrations on the bok_choy DB." - ./manage.py lms --settings bok_choy migrate --traceback --noinput - echo "Running the cms migrations on the bok_choy DB." - ./manage.py cms --settings bok_choy migrate --traceback --noinput + for db in "${database_order[@]}"; do + # Load the schema, then the data (including the migration history) + echo "Loading the schema from the filesystem into the $db MySQL DB." + mysql -u root "${databases["$db"]}" < $DB_CACHE_DIR/bok_choy_schema_$db.sql + echo "Loading the fixture data from the filesystem into the $db MySQL DB." + ./manage.py lms --settings bok_choy loaddata --database $db $DB_CACHE_DIR/bok_choy_data_$db.json + + # Migrations are stored in the default database + echo "Loading the migration data from the filesystem into the $db MySQL DB." + mysql -u root "${databases["$db"]}" < $DB_CACHE_DIR/bok_choy_migrations_data_$db.sql + + # Re-run migrations to ensure we are up-to-date + echo "Running the lms migrations on the $db bok_choy DB." + ./manage.py lms --settings bok_choy migrate --database $db --traceback --noinput + echo "Running the cms migrations on the $db bok_choy DB." + ./manage.py cms --settings bok_choy migrate --database $db --traceback --noinput + + done # Otherwise, update the test database and update the cache else @@ -60,19 +80,21 @@ else # Clean the cache directory mkdir -p $DB_CACHE_DIR && rm -f $DB_CACHE_DIR/bok_choy* - # Re-run migrations on the test database - echo "Issuing a migrate command to the bok_choy MySQL database for the lms django apps." - ./manage.py lms --settings bok_choy migrate --traceback --noinput - echo "Issuing a migrate command to the bok_choy MySQL database for the cms django apps." - ./manage.py cms --settings bok_choy migrate --traceback --noinput + for db in "${database_order[@]}"; do + # Re-run migrations on the test database + echo "Issuing a migrate command to the $db bok_choy MySQL database for the lms django apps." + ./manage.py lms --settings bok_choy migrate --database $db --traceback --noinput + echo "Issuing a migrate command to the $db bok_choy MySQL database for the cms django apps." + ./manage.py cms --settings bok_choy migrate --database $db --traceback --noinput - # Dump the schema and data to the cache - echo "Using the dumpdata command to save the fixture data to the filesystem." - ./manage.py lms --settings bok_choy dumpdata > $DB_CACHE_DIR/bok_choy_data.json - # dump_data does not dump the django_migrations table so we do it separately. - echo "Saving the django_migrations table of the bok_choy DB to the filesystem." - mysqldump -u root --no-create-info edxtest django_migrations > $DB_CACHE_DIR/bok_choy_migrations_data.sql - echo "Saving the schema of the bok_choy DB to the filesystem." - mysqldump -u root --no-data --skip-comments --skip-dump-date edxtest > $DB_CACHE_DIR/bok_choy_schema.sql + # Dump the schema and data to the cache + echo "Using the dumpdata command to save the $db fixture data to the filesystem." + ./manage.py lms --settings bok_choy dumpdata --database $db > $DB_CACHE_DIR/bok_choy_data_$db.json + echo "Saving the schema of the $dh bok_choy DB to the filesystem." + mysqldump -u root --no-data --skip-comments --skip-dump-date "${databases[$db]}" > $DB_CACHE_DIR/bok_choy_schema_$db.sql + + # dump_data does not dump the django_migrations table so we do it separately. + echo "Saving the django_migrations table of the $db bok_choy DB to the filesystem." + mysqldump -u root --no-create-info "${databases["$db"]}" django_migrations > $DB_CACHE_DIR/bok_choy_migrations_data_$db.sql + done fi -