diff --git a/cms/envs/acceptance.py b/cms/envs/acceptance.py index 20bdeb0270d4502a358c9ea58b71ecb0d7c5ef7d..3bb18399f3deab9916c9910b64a02e29520a0a36 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/common/lib/xmodule/xmodule/capa_module.py b/common/lib/xmodule/xmodule/capa_module.py index d44a82276c6fb626bc46939285ac465bce3be110..ff9af91c0d0d1250998ba83b9a60252378ee8758 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/test/db_cache/bok_choy_data.json b/common/test/db_cache/bok_choy_data.json deleted file mode 100644 index 3c64c3e6a565c245c8ece327831504025d683660..0000000000000000000000000000000000000000 --- 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": "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'><html xmlns:fb='http://www.facebook.com/2008/fbml' xmlns:og='http://opengraph.org/schema/'> <head><meta property='og:title' content='Update from {course_title}'/><meta property='fb:page_id' content='43929265776' /> <meta http-equiv='Content-Type' content='text/html; charset=UTF-8'> <title>Update from {course_title}</title> </head> <body leftmargin='0' marginwidth='0' topmargin='0' marginheight='0' offset='0' style='margin: 0;padding: 0;background-color: #ffffff;'> <center> <table align='center' border='0' cellpadding='0' cellspacing='0' height='100%' width='100%' id='bodyTable' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;margin: 0;padding: 0;background-color: #ffffff;height: 100% !important;width: 100% !important;'> <tr> <td align='center' valign='top' id='bodyCell' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;margin: 0;padding: 0;border-top: 0;height: 100% !important;width: 100% !important;'> <!-- BEGIN TEMPLATE // --> <table border='0' cellpadding='0' cellspacing='0' width='100%' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tr> <td align='center' valign='top' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <!-- BEGIN PREHEADER // --> <table border='0' cellpadding='0' cellspacing='0' width='100%' id='templatePreheader' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;background-color: #fcfcfc;border-top: 0;border-bottom: 0;'> <tr> <td align='center' valign='top' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table border='0' cellpadding='0' cellspacing='0' width='600' class='templateContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tr> <td valign='top' class='preheaderContainer' style='padding-top: 9px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'><table border='0' cellpadding='0' cellspacing='0' width='100%' class='mcnTextBlock' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody class='mcnTextBlockOuter'> <tr> <td valign='top' class='mcnTextBlockInner' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table align='left' border='0' cellpadding='0' cellspacing='0' width='366' class='mcnTextContentContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td valign='top' class='mcnTextContent' style='padding-top: 9px;padding-left: 18px;padding-bottom: 9px;padding-right: 0;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;color: #606060;font-family: Helvetica;font-size: 11px;line-height: 125%;text-align: left;'> <br> </td> </tr> </tbody></table> </td> </tr> </tbody></table></td> </tr> </table> </td> </tr> </table> <!-- // END PREHEADER --> </td> </tr> <tr> <td align='center' valign='top' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <!-- BEGIN HEADER // --> <table border='0' cellpadding='0' cellspacing='0' width='100%' id='templateHeader' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;background-color: #fcfcfc;border-top: 0;border-bottom: 0;'> <tr> <td align='center' valign='top' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table border='0' cellpadding='0' cellspacing='0' width='600' class='templateContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tr> <td valign='top' class='headerContainer' style='padding-top: 10px;padding-right: 18px;padding-bottom: 10px;padding-left: 18px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'><table border='0' cellpadding='0' cellspacing='0' width='100%' class='mcnImageBlock' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody class='mcnImageBlockOuter'> <tr> <td valign='top' style='padding: 9px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;' class='mcnImageBlockInner'> <table align='left' width='100%' border='0' cellpadding='0' cellspacing='0' class='mcnImageContentContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td class='mcnImageContent' valign='top' style='padding-right: 9px;padding-left: 9px;padding-top: 0;padding-bottom: 0;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <a href='http://edx.org' title='' class='' target='_self' style='word-wrap: break-word !important;'> <img align='left' alt='edX' src='http://courses.edx.org/static/images/bulk_email/edXHeaderImage.jpg' width='564.0000152587891' style='max-width: 600px;padding-bottom: 0;display: inline !important;vertical-align: bottom;border: 0;line-height: 100%;outline: none;text-decoration: none;height: auto !important;' class='mcnImage'> </a> </td> </tr> </tbody></table> </td> </tr> </tbody></table><table border='0' cellpadding='0' cellspacing='0' width='100%' class='mcnTextBlock' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody class='mcnTextBlockOuter'> <tr> <td valign='top' class='mcnTextBlockInner' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table align='left' border='0' cellpadding='0' cellspacing='0' width='599' class='mcnTextContentContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td valign='top' class='mcnTextContent' style='padding-top: 9px;padding-right: 18px;padding-bottom: 9px;padding-left: 18px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;color: #606060;font-family: Helvetica;font-size: 15px;line-height: 150%;text-align: left;'> <div style='text-align: right;'><span style='font-size:11px;'><span style='color:#00a0e3;'>Connect with edX:</span></span> <a href='http://facebook.com/edxonline' target='_blank' style='color: #6DC6DD;font-weight: normal;text-decoration: underline;word-wrap: break-word !important;'><img align='none' height='16' src='http://courses.edx.org/static/images/bulk_email/FacebookIcon.png' style='width: 16px;height: 16px;border: 0;line-height: 100%;outline: none;text-decoration: none;' width='16'></a> <a href='http://twitter.com/edxonline' target='_blank' style='color: #6DC6DD;font-weight: normal;text-decoration: underline;word-wrap: break-word !important;'><img align='none' height='16' src='http://courses.edx.org/static/images/bulk_email/TwitterIcon.png' style='width: 16px;height: 16px;border: 0;line-height: 100%;outline: none;text-decoration: none;' width='16'></a> <a href='https://plus.google.com/108235383044095082735' target='_blank' style='color: #6DC6DD;font-weight: normal;text-decoration: underline;word-wrap: break-word !important;'><img align='none' height='16' src='http://courses.edx.org/static/images/bulk_email/GooglePlusIcon.png' style='width: 16px;height: 16px;border: 0;line-height: 100%;outline: none;text-decoration: none;' width='16'></a> <a href='http://www.meetup.com/edX-Communities/' target='_blank' style='color: #6DC6DD;font-weight: normal;text-decoration: underline;word-wrap: break-word !important;'><img align='none' height='16' src='http://courses.edx.org/static/images/bulk_email/MeetupIcon.png' style='width: 16px;height: 16px;border: 0;line-height: 100%;outline: none;text-decoration: none;' width='16'></a></div> </td> </tr> </tbody></table> </td> </tr> </tbody></table></td> </tr> </table> </td> </tr> </table> <!-- // END HEADER --> </td> </tr> <tr> <td align='center' valign='top' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <!-- BEGIN BODY // --> <table border='0' cellpadding='0' cellspacing='0' width='100%' id='templateBody' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;background-color: #fcfcfc;border-top: 0;border-bottom: 0;'> <tr> <td align='center' valign='top' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table border='0' cellpadding='0' cellspacing='0' width='600' class='templateContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tr> <td valign='top' class='bodyContainer' style='padding-top: 10px;padding-right: 18px;padding-bottom: 10px;padding-left: 18px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'><table border='0' cellpadding='0' cellspacing='0' width='100%' class='mcnCaptionBlock' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody class='mcnCaptionBlockOuter'> <tr> <td class='mcnCaptionBlockInner' valign='top' style='padding: 9px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table border='0' cellpadding='0' cellspacing='0' class='mcnCaptionLeftContentOuter' width='100%' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td valign='top' class='mcnCaptionLeftContentInner' style='padding: 0 9px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table align='right' border='0' cellpadding='0' cellspacing='0' class='mcnCaptionLeftImageContentContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td class='mcnCaptionLeftImageContent' valign='top' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <img alt='' src='{course_image_url}' width='176' style='max-width: 180px;border: 0;line-height: 100%;outline: none;text-decoration: none;vertical-align: bottom;height: auto !important;' class='mcnImage'> </td> </tr> </tbody></table> <table class='mcnCaptionLeftTextContentContainer' align='left' border='0' cellpadding='0' cellspacing='0' width='352' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td valign='top' class='mcnTextContent' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;color: #606060;font-family: Helvetica;font-size: 14px;line-height: 150%;text-align: left;'> <h3 class='null' style='display: block;font-family: Helvetica;font-size: 18px;font-style: normal;font-weight: bold;line-height: 125%;letter-spacing: -.5px;margin: 0;text-align: left;color: #606060 !important;'><strong style='font-size: 22px;'>{course_title}</strong><br></h3><br> </td> </tr> </tbody></table> </td> </tr></tbody></table> </td> </tr> </tbody></table><table border='0' cellpadding='0' cellspacing='0' width='100%' class='mcnTextBlock' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody class='mcnTextBlockOuter'> <tr> <td valign='top' class='mcnTextBlockInner' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table align='left' border='0' cellpadding='0' cellspacing='0' width='600' class='mcnTextContentContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td valign='top' class='mcnTextContent' style='padding-top: 9px;padding-right: 18px;padding-bottom: 9px;padding-left: 18px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;color: #606060;font-family: Helvetica;font-size: 14px;line-height: 150%;text-align: left;'> {{message_body}} </td> </tr> </tbody></table> </td> </tr> </tbody></table><table border='0' cellpadding='0' cellspacing='0' width='100%' class='mcnDividerBlock' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody class='mcnDividerBlockOuter'> <tr> <td class='mcnDividerBlockInner' style='padding: 18px 18px 3px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table class='mcnDividerContent' border='0' cellpadding='0' cellspacing='0' width='100%' style='border-top-width: 1px;border-top-style: solid;border-top-color: #666666;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <span></span> </td> </tr> </tbody></table> </td> </tr> </tbody></table><table border='0' cellpadding='0' cellspacing='0' width='100%' class='mcnTextBlock' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody class='mcnTextBlockOuter'> <tr> <td valign='top' class='mcnTextBlockInner' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table align='left' border='0' cellpadding='0' cellspacing='0' width='600' class='mcnTextContentContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td valign='top' class='mcnTextContent' style='padding-top: 9px;padding-right: 18px;padding-bottom: 9px;padding-left: 18px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;color: #606060;font-family: Helvetica;font-size: 14px;line-height: 150%;text-align: left;'> <div style='text-align: right;'><a href='http://facebook.com/edxonline' target='_blank' style='color: #2f73bc;font-weight: normal;text-decoration: underline;word-wrap: break-word !important;'><img align='none' height='16' src='http://courses.edx.org/static/images/bulk_email/FacebookIcon.png' style='width: 16px;height: 16px;border: 0;line-height: 100%;outline: none;text-decoration: none;' width='16'></a> <a href='http://twitter.com/edxonline' target='_blank' style='color: #2f73bc;font-weight: normal;text-decoration: underline;word-wrap: break-word !important;'><img align='none' height='16' src='http://courses.edx.org/static/images/bulk_email/TwitterIcon.png' style='width: 16px;height: 16px;border: 0;line-height: 100%;outline: none;text-decoration: none;' width='16'></a> <a href='https://plus.google.com/108235383044095082735' target='_blank' style='color: #2f73bc;font-weight: normal;text-decoration: underline;word-wrap: break-word !important;'><img align='none' height='16' src='http://courses.edx.org/static/images/bulk_email/GooglePlusIcon.png' style='width: 16px;height: 16px;border: 0;line-height: 100%;outline: none;text-decoration: none;' width='16'></a> <a href='http://www.meetup.com/edX-Communities/' target='_blank' style='color: #2f73bc;font-weight: normal;text-decoration: underline;word-wrap: break-word !important;'><img align='none' height='16' src='http://courses.edx.org/static/images/bulk_email/MeetupIcon.png' style='width: 16px;height: 16px;border: 0;line-height: 100%;outline: none;text-decoration: none;' width='16'></a></div> </td> </tr> </tbody></table> </td> </tr> </tbody></table></td> </tr> </table> </td> </tr> </table> <!-- // END BODY --> </td> </tr> <tr> <td align='center' valign='top' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <!-- BEGIN FOOTER // --> <table border='0' cellpadding='0' cellspacing='0' width='100%' id='templateFooter' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;background-color: #9FCFE8;border-top: 0;border-bottom: 0;'> <tr> <td align='center' valign='top' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table border='0' cellpadding='0' cellspacing='0' width='600' class='templateContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tr> <td valign='top' class='footerContainer' style='padding-top: 10px;padding-right: 18px;padding-bottom: 10px;padding-left: 18px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'><table border='0' cellpadding='0' cellspacing='0' width='100%' class='mcnTextBlock' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody class='mcnTextBlockOuter'> <tr> <td valign='top' class='mcnTextBlockInner' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table align='left' border='0' cellpadding='0' cellspacing='0' width='600' class='mcnTextContentContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td valign='top' class='mcnTextContent' style='padding-top: 9px;padding-right: 18px;padding-bottom: 9px;padding-left: 18px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;color: #f2f2f2;font-family: Helvetica;font-size: 11px;line-height: 125%;text-align: left;'> <em>Copyright \u00a9 2013 edX, All rights reserved.</em><br><br><br> <b>Our mailing address is:</b><br> edX<br> 11 Cambridge Center, Suite 101<br> Cambridge, MA, USA 02142<br><br><br>This email was automatically sent from {platform_name}. <br>You are receiving this email at address {email} because you are enrolled in <a href='{course_url}'>{course_title}</a>.<br>To stop receiving email like this, update your course email settings <a href='{email_settings_url}'>here</a>. <br> </td> </tr> </tbody></table> </td> </tr> </tbody></table></td> </tr> </table> </td> </tr> </table> <!-- // END FOOTER --> </td> </tr> </table> <!-- // END TEMPLATE --> </td> </tr> </table> </center> </body> </body> </html>", "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": "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'><html xmlns:fb='http://www.facebook.com/2008/fbml' xmlns:og='http://opengraph.org/schema/'> <head><meta property='og:title' content='Update from {course_title}'/><meta property='fb:page_id' content='43929265776' /> <meta http-equiv='Content-Type' content='text/html; charset=UTF-8'> THIS IS A BRANDED HTML TEMPLATE <title>Update from {course_title}</title> </head> <body leftmargin='0' marginwidth='0' topmargin='0' marginheight='0' offset='0' style='margin: 0;padding: 0;background-color: #ffffff;'> <center> <table align='center' border='0' cellpadding='0' cellspacing='0' height='100%' width='100%' id='bodyTable' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;margin: 0;padding: 0;background-color: #ffffff;height: 100% !important;width: 100% !important;'> <tr> <td align='center' valign='top' id='bodyCell' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;margin: 0;padding: 0;border-top: 0;height: 100% !important;width: 100% !important;'> <!-- BEGIN TEMPLATE // --> <table border='0' cellpadding='0' cellspacing='0' width='100%' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tr> <td align='center' valign='top' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <!-- BEGIN PREHEADER // --> <table border='0' cellpadding='0' cellspacing='0' width='100%' id='templatePreheader' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;background-color: #fcfcfc;border-top: 0;border-bottom: 0;'> <tr> <td align='center' valign='top' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table border='0' cellpadding='0' cellspacing='0' width='600' class='templateContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tr> <td valign='top' class='preheaderContainer' style='padding-top: 9px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'><table border='0' cellpadding='0' cellspacing='0' width='100%' class='mcnTextBlock' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody class='mcnTextBlockOuter'> <tr> <td valign='top' class='mcnTextBlockInner' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table align='left' border='0' cellpadding='0' cellspacing='0' width='366' class='mcnTextContentContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td valign='top' class='mcnTextContent' style='padding-top: 9px;padding-left: 18px;padding-bottom: 9px;padding-right: 0;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;color: #606060;font-family: Helvetica;font-size: 11px;line-height: 125%;text-align: left;'> <br> </td> </tr> </tbody></table> </td> </tr> </tbody></table></td> </tr> </table> </td> </tr> </table> <!-- // END PREHEADER --> </td> </tr> <tr> <td align='center' valign='top' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <!-- BEGIN HEADER // --> <table border='0' cellpadding='0' cellspacing='0' width='100%' id='templateHeader' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;background-color: #fcfcfc;border-top: 0;border-bottom: 0;'> <tr> <td align='center' valign='top' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table border='0' cellpadding='0' cellspacing='0' width='600' class='templateContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tr> <td valign='top' class='headerContainer' style='padding-top: 10px;padding-right: 18px;padding-bottom: 10px;padding-left: 18px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'><table border='0' cellpadding='0' cellspacing='0' width='100%' class='mcnImageBlock' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody class='mcnImageBlockOuter'> <tr> <td valign='top' style='padding: 9px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;' class='mcnImageBlockInner'> <table align='left' width='100%' border='0' cellpadding='0' cellspacing='0' class='mcnImageContentContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td class='mcnImageContent' valign='top' style='padding-right: 9px;padding-left: 9px;padding-top: 0;padding-bottom: 0;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <a href='http://edx.org' title='' class='' target='_self' style='word-wrap: break-word !important;'> <img align='left' alt='edX' src='http://courses.edx.org/static/images/bulk_email/edXHeaderImage.jpg' width='564.0000152587891' style='max-width: 600px;padding-bottom: 0;display: inline !important;vertical-align: bottom;border: 0;line-height: 100%;outline: none;text-decoration: none;height: auto !important;' class='mcnImage'> </a> </td> </tr> </tbody></table> </td> </tr> </tbody></table><table border='0' cellpadding='0' cellspacing='0' width='100%' class='mcnTextBlock' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody class='mcnTextBlockOuter'> <tr> <td valign='top' class='mcnTextBlockInner' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table align='left' border='0' cellpadding='0' cellspacing='0' width='599' class='mcnTextContentContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td valign='top' class='mcnTextContent' style='padding-top: 9px;padding-right: 18px;padding-bottom: 9px;padding-left: 18px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;color: #606060;font-family: Helvetica;font-size: 15px;line-height: 150%;text-align: left;'> <div style='text-align: right;'><span style='font-size:11px;'><span style='color:#00a0e3;'>Connect with edX:</span></span> <a href='http://facebook.com/edxonline' target='_blank' style='color: #6DC6DD;font-weight: normal;text-decoration: underline;word-wrap: break-word !important;'><img align='none' height='16' src='http://courses.edx.org/static/images/bulk_email/FacebookIcon.png' style='width: 16px;height: 16px;border: 0;line-height: 100%;outline: none;text-decoration: none;' width='16'></a> <a href='http://twitter.com/edxonline' target='_blank' style='color: #6DC6DD;font-weight: normal;text-decoration: underline;word-wrap: break-word !important;'><img align='none' height='16' src='http://courses.edx.org/static/images/bulk_email/TwitterIcon.png' style='width: 16px;height: 16px;border: 0;line-height: 100%;outline: none;text-decoration: none;' width='16'></a> <a href='https://plus.google.com/108235383044095082735' target='_blank' style='color: #6DC6DD;font-weight: normal;text-decoration: underline;word-wrap: break-word !important;'><img align='none' height='16' src='http://courses.edx.org/static/images/bulk_email/GooglePlusIcon.png' style='width: 16px;height: 16px;border: 0;line-height: 100%;outline: none;text-decoration: none;' width='16'></a> <a href='http://www.meetup.com/edX-Communities/' target='_blank' style='color: #6DC6DD;font-weight: normal;text-decoration: underline;word-wrap: break-word !important;'><img align='none' height='16' src='http://courses.edx.org/static/images/bulk_email/MeetupIcon.png' style='width: 16px;height: 16px;border: 0;line-height: 100%;outline: none;text-decoration: none;' width='16'></a></div> </td> </tr> </tbody></table> </td> </tr> </tbody></table></td> </tr> </table> </td> </tr> </table> <!-- // END HEADER --> </td> </tr> <tr> <td align='center' valign='top' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <!-- BEGIN BODY // --> <table border='0' cellpadding='0' cellspacing='0' width='100%' id='templateBody' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;background-color: #fcfcfc;border-top: 0;border-bottom: 0;'> <tr> <td align='center' valign='top' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table border='0' cellpadding='0' cellspacing='0' width='600' class='templateContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tr> <td valign='top' class='bodyContainer' style='padding-top: 10px;padding-right: 18px;padding-bottom: 10px;padding-left: 18px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'><table border='0' cellpadding='0' cellspacing='0' width='100%' class='mcnCaptionBlock' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody class='mcnCaptionBlockOuter'> <tr> <td class='mcnCaptionBlockInner' valign='top' style='padding: 9px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table border='0' cellpadding='0' cellspacing='0' class='mcnCaptionLeftContentOuter' width='100%' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td valign='top' class='mcnCaptionLeftContentInner' style='padding: 0 9px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table align='right' border='0' cellpadding='0' cellspacing='0' class='mcnCaptionLeftImageContentContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td class='mcnCaptionLeftImageContent' valign='top' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <img alt='' src='{course_image_url}' width='176' style='max-width: 180px;border: 0;line-height: 100%;outline: none;text-decoration: none;vertical-align: bottom;height: auto !important;' class='mcnImage'> </td> </tr> </tbody></table> <table class='mcnCaptionLeftTextContentContainer' align='left' border='0' cellpadding='0' cellspacing='0' width='352' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td valign='top' class='mcnTextContent' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;color: #606060;font-family: Helvetica;font-size: 14px;line-height: 150%;text-align: left;'> <h3 class='null' style='display: block;font-family: Helvetica;font-size: 18px;font-style: normal;font-weight: bold;line-height: 125%;letter-spacing: -.5px;margin: 0;text-align: left;color: #606060 !important;'><strong style='font-size: 22px;'>{course_title}</strong><br></h3><br> </td> </tr> </tbody></table> </td> </tr></tbody></table> </td> </tr> </tbody></table><table border='0' cellpadding='0' cellspacing='0' width='100%' class='mcnTextBlock' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody class='mcnTextBlockOuter'> <tr> <td valign='top' class='mcnTextBlockInner' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table align='left' border='0' cellpadding='0' cellspacing='0' width='600' class='mcnTextContentContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td valign='top' class='mcnTextContent' style='padding-top: 9px;padding-right: 18px;padding-bottom: 9px;padding-left: 18px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;color: #606060;font-family: Helvetica;font-size: 14px;line-height: 150%;text-align: left;'> {{message_body}} </td> </tr> </tbody></table> </td> </tr> </tbody></table><table border='0' cellpadding='0' cellspacing='0' width='100%' class='mcnDividerBlock' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody class='mcnDividerBlockOuter'> <tr> <td class='mcnDividerBlockInner' style='padding: 18px 18px 3px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table class='mcnDividerContent' border='0' cellpadding='0' cellspacing='0' width='100%' style='border-top-width: 1px;border-top-style: solid;border-top-color: #666666;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <span></span> </td> </tr> </tbody></table> </td> </tr> </tbody></table><table border='0' cellpadding='0' cellspacing='0' width='100%' class='mcnTextBlock' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody class='mcnTextBlockOuter'> <tr> <td valign='top' class='mcnTextBlockInner' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table align='left' border='0' cellpadding='0' cellspacing='0' width='600' class='mcnTextContentContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td valign='top' class='mcnTextContent' style='padding-top: 9px;padding-right: 18px;padding-bottom: 9px;padding-left: 18px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;color: #606060;font-family: Helvetica;font-size: 14px;line-height: 150%;text-align: left;'> <div style='text-align: right;'><a href='http://facebook.com/edxonline' target='_blank' style='color: #2f73bc;font-weight: normal;text-decoration: underline;word-wrap: break-word !important;'><img align='none' height='16' src='http://courses.edx.org/static/images/bulk_email/FacebookIcon.png' style='width: 16px;height: 16px;border: 0;line-height: 100%;outline: none;text-decoration: none;' width='16'></a> <a href='http://twitter.com/edxonline' target='_blank' style='color: #2f73bc;font-weight: normal;text-decoration: underline;word-wrap: break-word !important;'><img align='none' height='16' src='http://courses.edx.org/static/images/bulk_email/TwitterIcon.png' style='width: 16px;height: 16px;border: 0;line-height: 100%;outline: none;text-decoration: none;' width='16'></a> <a href='https://plus.google.com/108235383044095082735' target='_blank' style='color: #2f73bc;font-weight: normal;text-decoration: underline;word-wrap: break-word !important;'><img align='none' height='16' src='http://courses.edx.org/static/images/bulk_email/GooglePlusIcon.png' style='width: 16px;height: 16px;border: 0;line-height: 100%;outline: none;text-decoration: none;' width='16'></a> <a href='http://www.meetup.com/edX-Communities/' target='_blank' style='color: #2f73bc;font-weight: normal;text-decoration: underline;word-wrap: break-word !important;'><img align='none' height='16' src='http://courses.edx.org/static/images/bulk_email/MeetupIcon.png' style='width: 16px;height: 16px;border: 0;line-height: 100%;outline: none;text-decoration: none;' width='16'></a></div> </td> </tr> </tbody></table> </td> </tr> </tbody></table></td> </tr> </table> </td> </tr> </table> <!-- // END BODY --> </td> </tr> <tr> <td align='center' valign='top' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <!-- BEGIN FOOTER // --> <table border='0' cellpadding='0' cellspacing='0' width='100%' id='templateFooter' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;background-color: #9FCFE8;border-top: 0;border-bottom: 0;'> <tr> <td align='center' valign='top' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table border='0' cellpadding='0' cellspacing='0' width='600' class='templateContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tr> <td valign='top' class='footerContainer' style='padding-top: 10px;padding-right: 18px;padding-bottom: 10px;padding-left: 18px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'><table border='0' cellpadding='0' cellspacing='0' width='100%' class='mcnTextBlock' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody class='mcnTextBlockOuter'> <tr> <td valign='top' class='mcnTextBlockInner' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table align='left' border='0' cellpadding='0' cellspacing='0' width='600' class='mcnTextContentContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td valign='top' class='mcnTextContent' style='padding-top: 9px;padding-right: 18px;padding-bottom: 9px;padding-left: 18px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;color: #f2f2f2;font-family: Helvetica;font-size: 11px;line-height: 125%;text-align: left;'> <em>Copyright \u00a9 2013 edX, All rights reserved.</em><br><br><br> <b>Our mailing address is:</b><br> edX<br> 11 Cambridge Center, Suite 101<br> Cambridge, MA, USA 02142<br><br><br>This email was automatically sent from {platform_name}. <br>You are receiving this email at address {email} because you are enrolled in <a href='{course_url}'>{course_title}</a>.<br>To stop receiving email like this, update your course email settings <a href='{email_settings_url}'>here</a>. <br> </td> </tr> </tbody></table> </td> </tr> </tbody></table></td> </tr> </table> </td> </tr> </table> <!-- // END FOOTER --> </td> </tr> </table> <!-- // END TEMPLATE --> </td> </tr> </table> </center> </body> </body> </html>", "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 0000000000000000000000000000000000000000..0663d2134f94325431aa7e7f87a5356c129da3d1 --- /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": "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": "studentitem", "app_label": "submissions"}, "model": "contenttypes.contenttype", "pk": 195}, {"fields": {"model": "submission", "app_label": "submissions"}, "model": "contenttypes.contenttype", "pk": 196}, {"fields": {"model": "score", "app_label": "submissions"}, "model": "contenttypes.contenttype", "pk": 197}, {"fields": {"model": "scoresummary", "app_label": "submissions"}, "model": "contenttypes.contenttype", "pk": 198}, {"fields": {"model": "scoreannotation", "app_label": "submissions"}, "model": "contenttypes.contenttype", "pk": 199}, {"fields": {"model": "rubric", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 200}, {"fields": {"model": "criterion", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 201}, {"fields": {"model": "criterionoption", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 202}, {"fields": {"model": "assessment", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 203}, {"fields": {"model": "assessmentpart", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 204}, {"fields": {"model": "assessmentfeedbackoption", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 205}, {"fields": {"model": "assessmentfeedback", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 206}, {"fields": {"model": "peerworkflow", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 207}, {"fields": {"model": "peerworkflowitem", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 208}, {"fields": {"model": "trainingexample", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 209}, {"fields": {"model": "studenttrainingworkflow", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 210}, {"fields": {"model": "studenttrainingworkflowitem", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 211}, {"fields": {"model": "aiclassifierset", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 212}, {"fields": {"model": "aiclassifier", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 213}, {"fields": {"model": "aitrainingworkflow", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 214}, {"fields": {"model": "aigradingworkflow", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 215}, {"fields": {"model": "staffworkflow", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 216}, {"fields": {"model": "assessmentworkflow", "app_label": "workflow"}, "model": "contenttypes.contenttype", "pk": 217}, {"fields": {"model": "assessmentworkflowstep", "app_label": "workflow"}, "model": "contenttypes.contenttype", "pk": 218}, {"fields": {"model": "assessmentworkflowcancellation", "app_label": "workflow"}, "model": "contenttypes.contenttype", "pk": 219}, {"fields": {"model": "profile", "app_label": "edxval"}, "model": "contenttypes.contenttype", "pk": 220}, {"fields": {"model": "video", "app_label": "edxval"}, "model": "contenttypes.contenttype", "pk": 221}, {"fields": {"model": "coursevideo", "app_label": "edxval"}, "model": "contenttypes.contenttype", "pk": 222}, {"fields": {"model": "encodedvideo", "app_label": "edxval"}, "model": "contenttypes.contenttype", "pk": 223}, {"fields": {"model": "subtitle", "app_label": "edxval"}, "model": "contenttypes.contenttype", "pk": 224}, {"fields": {"model": "milestone", "app_label": "milestones"}, "model": "contenttypes.contenttype", "pk": 225}, {"fields": {"model": "milestonerelationshiptype", "app_label": "milestones"}, "model": "contenttypes.contenttype", "pk": 226}, {"fields": {"model": "coursemilestone", "app_label": "milestones"}, "model": "contenttypes.contenttype", "pk": 227}, {"fields": {"model": "coursecontentmilestone", "app_label": "milestones"}, "model": "contenttypes.contenttype", "pk": 228}, {"fields": {"model": "usermilestone", "app_label": "milestones"}, "model": "contenttypes.contenttype", "pk": 229}, {"fields": {"model": "proctoredexam", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 230}, {"fields": {"model": "proctoredexamreviewpolicy", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 231}, {"fields": {"model": "proctoredexamreviewpolicyhistory", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 232}, {"fields": {"model": "proctoredexamstudentattempt", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 233}, {"fields": {"model": "proctoredexamstudentattempthistory", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 234}, {"fields": {"model": "proctoredexamstudentallowance", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 235}, {"fields": {"model": "proctoredexamstudentallowancehistory", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 236}, {"fields": {"model": "proctoredexamsoftwaresecurereview", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 237}, {"fields": {"model": "proctoredexamsoftwaresecurereviewhistory", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 238}, {"fields": {"model": "proctoredexamsoftwaresecurecomment", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 239}, {"fields": {"model": "organization", "app_label": "organizations"}, "model": "contenttypes.contenttype", "pk": 240}, {"fields": {"model": "organizationcourse", "app_label": "organizations"}, "model": "contenttypes.contenttype", "pk": 241}, {"fields": {"model": "videouploadconfig", "app_label": "contentstore"}, "model": "contenttypes.contenttype", "pk": 242}, {"fields": {"model": "pushnotificationconfig", "app_label": "contentstore"}, "model": "contenttypes.contenttype", "pk": 243}, {"fields": {"model": "coursecreator", "app_label": "course_creators"}, "model": "contenttypes.contenttype", "pk": 244}, {"fields": {"model": "studioconfig", "app_label": "xblock_config"}, "model": "contenttypes.contenttype", "pk": 245}, {"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": "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'><html xmlns:fb='http://www.facebook.com/2008/fbml' xmlns:og='http://opengraph.org/schema/'> <head><meta property='og:title' content='Update from {course_title}'/><meta property='fb:page_id' content='43929265776' /> <meta http-equiv='Content-Type' content='text/html; charset=UTF-8'> <title>Update from {course_title}</title> </head> <body leftmargin='0' marginwidth='0' topmargin='0' marginheight='0' offset='0' style='margin: 0;padding: 0;background-color: #ffffff;'> <center> <table align='center' border='0' cellpadding='0' cellspacing='0' height='100%' width='100%' id='bodyTable' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;margin: 0;padding: 0;background-color: #ffffff;height: 100% !important;width: 100% !important;'> <tr> <td align='center' valign='top' id='bodyCell' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;margin: 0;padding: 0;border-top: 0;height: 100% !important;width: 100% !important;'> <!-- BEGIN TEMPLATE // --> <table border='0' cellpadding='0' cellspacing='0' width='100%' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tr> <td align='center' valign='top' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <!-- BEGIN PREHEADER // --> <table border='0' cellpadding='0' cellspacing='0' width='100%' id='templatePreheader' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;background-color: #fcfcfc;border-top: 0;border-bottom: 0;'> <tr> <td align='center' valign='top' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table border='0' cellpadding='0' cellspacing='0' width='600' class='templateContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tr> <td valign='top' class='preheaderContainer' style='padding-top: 9px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'><table border='0' cellpadding='0' cellspacing='0' width='100%' class='mcnTextBlock' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody class='mcnTextBlockOuter'> <tr> <td valign='top' class='mcnTextBlockInner' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table align='left' border='0' cellpadding='0' cellspacing='0' width='366' class='mcnTextContentContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td valign='top' class='mcnTextContent' style='padding-top: 9px;padding-left: 18px;padding-bottom: 9px;padding-right: 0;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;color: #606060;font-family: Helvetica;font-size: 11px;line-height: 125%;text-align: left;'> <br> </td> </tr> </tbody></table> </td> </tr> </tbody></table></td> </tr> </table> </td> </tr> </table> <!-- // END PREHEADER --> </td> </tr> <tr> <td align='center' valign='top' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <!-- BEGIN HEADER // --> <table border='0' cellpadding='0' cellspacing='0' width='100%' id='templateHeader' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;background-color: #fcfcfc;border-top: 0;border-bottom: 0;'> <tr> <td align='center' valign='top' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table border='0' cellpadding='0' cellspacing='0' width='600' class='templateContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tr> <td valign='top' class='headerContainer' style='padding-top: 10px;padding-right: 18px;padding-bottom: 10px;padding-left: 18px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'><table border='0' cellpadding='0' cellspacing='0' width='100%' class='mcnImageBlock' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody class='mcnImageBlockOuter'> <tr> <td valign='top' style='padding: 9px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;' class='mcnImageBlockInner'> <table align='left' width='100%' border='0' cellpadding='0' cellspacing='0' class='mcnImageContentContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td class='mcnImageContent' valign='top' style='padding-right: 9px;padding-left: 9px;padding-top: 0;padding-bottom: 0;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <a href='http://edx.org' title='' class='' target='_self' style='word-wrap: break-word !important;'> <img align='left' alt='edX' src='http://courses.edx.org/static/images/bulk_email/edXHeaderImage.jpg' width='564.0000152587891' style='max-width: 600px;padding-bottom: 0;display: inline !important;vertical-align: bottom;border: 0;line-height: 100%;outline: none;text-decoration: none;height: auto !important;' class='mcnImage'> </a> </td> </tr> </tbody></table> </td> </tr> </tbody></table><table border='0' cellpadding='0' cellspacing='0' width='100%' class='mcnTextBlock' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody class='mcnTextBlockOuter'> <tr> <td valign='top' class='mcnTextBlockInner' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table align='left' border='0' cellpadding='0' cellspacing='0' width='599' class='mcnTextContentContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td valign='top' class='mcnTextContent' style='padding-top: 9px;padding-right: 18px;padding-bottom: 9px;padding-left: 18px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;color: #606060;font-family: Helvetica;font-size: 15px;line-height: 150%;text-align: left;'> <div style='text-align: right;'><span style='font-size:11px;'><span style='color:#00a0e3;'>Connect with edX:</span></span> <a href='http://facebook.com/edxonline' target='_blank' style='color: #6DC6DD;font-weight: normal;text-decoration: underline;word-wrap: break-word !important;'><img align='none' height='16' src='http://courses.edx.org/static/images/bulk_email/FacebookIcon.png' style='width: 16px;height: 16px;border: 0;line-height: 100%;outline: none;text-decoration: none;' width='16'></a> <a href='http://twitter.com/edxonline' target='_blank' style='color: #6DC6DD;font-weight: normal;text-decoration: underline;word-wrap: break-word !important;'><img align='none' height='16' src='http://courses.edx.org/static/images/bulk_email/TwitterIcon.png' style='width: 16px;height: 16px;border: 0;line-height: 100%;outline: none;text-decoration: none;' width='16'></a> <a href='https://plus.google.com/108235383044095082735' target='_blank' style='color: #6DC6DD;font-weight: normal;text-decoration: underline;word-wrap: break-word !important;'><img align='none' height='16' src='http://courses.edx.org/static/images/bulk_email/GooglePlusIcon.png' style='width: 16px;height: 16px;border: 0;line-height: 100%;outline: none;text-decoration: none;' width='16'></a> <a href='http://www.meetup.com/edX-Communities/' target='_blank' style='color: #6DC6DD;font-weight: normal;text-decoration: underline;word-wrap: break-word !important;'><img align='none' height='16' src='http://courses.edx.org/static/images/bulk_email/MeetupIcon.png' style='width: 16px;height: 16px;border: 0;line-height: 100%;outline: none;text-decoration: none;' width='16'></a></div> </td> </tr> </tbody></table> </td> </tr> </tbody></table></td> </tr> </table> </td> </tr> </table> <!-- // END HEADER --> </td> </tr> <tr> <td align='center' valign='top' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <!-- BEGIN BODY // --> <table border='0' cellpadding='0' cellspacing='0' width='100%' id='templateBody' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;background-color: #fcfcfc;border-top: 0;border-bottom: 0;'> <tr> <td align='center' valign='top' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table border='0' cellpadding='0' cellspacing='0' width='600' class='templateContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tr> <td valign='top' class='bodyContainer' style='padding-top: 10px;padding-right: 18px;padding-bottom: 10px;padding-left: 18px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'><table border='0' cellpadding='0' cellspacing='0' width='100%' class='mcnCaptionBlock' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody class='mcnCaptionBlockOuter'> <tr> <td class='mcnCaptionBlockInner' valign='top' style='padding: 9px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table border='0' cellpadding='0' cellspacing='0' class='mcnCaptionLeftContentOuter' width='100%' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td valign='top' class='mcnCaptionLeftContentInner' style='padding: 0 9px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table align='right' border='0' cellpadding='0' cellspacing='0' class='mcnCaptionLeftImageContentContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td class='mcnCaptionLeftImageContent' valign='top' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <img alt='' src='{course_image_url}' width='176' style='max-width: 180px;border: 0;line-height: 100%;outline: none;text-decoration: none;vertical-align: bottom;height: auto !important;' class='mcnImage'> </td> </tr> </tbody></table> <table class='mcnCaptionLeftTextContentContainer' align='left' border='0' cellpadding='0' cellspacing='0' width='352' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td valign='top' class='mcnTextContent' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;color: #606060;font-family: Helvetica;font-size: 14px;line-height: 150%;text-align: left;'> <h3 class='null' style='display: block;font-family: Helvetica;font-size: 18px;font-style: normal;font-weight: bold;line-height: 125%;letter-spacing: -.5px;margin: 0;text-align: left;color: #606060 !important;'><strong style='font-size: 22px;'>{course_title}</strong><br></h3><br> </td> </tr> </tbody></table> </td> </tr></tbody></table> </td> </tr> </tbody></table><table border='0' cellpadding='0' cellspacing='0' width='100%' class='mcnTextBlock' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody class='mcnTextBlockOuter'> <tr> <td valign='top' class='mcnTextBlockInner' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table align='left' border='0' cellpadding='0' cellspacing='0' width='600' class='mcnTextContentContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td valign='top' class='mcnTextContent' style='padding-top: 9px;padding-right: 18px;padding-bottom: 9px;padding-left: 18px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;color: #606060;font-family: Helvetica;font-size: 14px;line-height: 150%;text-align: left;'> {{message_body}} </td> </tr> </tbody></table> </td> </tr> </tbody></table><table border='0' cellpadding='0' cellspacing='0' width='100%' class='mcnDividerBlock' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody class='mcnDividerBlockOuter'> <tr> <td class='mcnDividerBlockInner' style='padding: 18px 18px 3px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table class='mcnDividerContent' border='0' cellpadding='0' cellspacing='0' width='100%' style='border-top-width: 1px;border-top-style: solid;border-top-color: #666666;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <span></span> </td> </tr> </tbody></table> </td> </tr> </tbody></table><table border='0' cellpadding='0' cellspacing='0' width='100%' class='mcnTextBlock' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody class='mcnTextBlockOuter'> <tr> <td valign='top' class='mcnTextBlockInner' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table align='left' border='0' cellpadding='0' cellspacing='0' width='600' class='mcnTextContentContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td valign='top' class='mcnTextContent' style='padding-top: 9px;padding-right: 18px;padding-bottom: 9px;padding-left: 18px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;color: #606060;font-family: Helvetica;font-size: 14px;line-height: 150%;text-align: left;'> <div style='text-align: right;'><a href='http://facebook.com/edxonline' target='_blank' style='color: #2f73bc;font-weight: normal;text-decoration: underline;word-wrap: break-word !important;'><img align='none' height='16' src='http://courses.edx.org/static/images/bulk_email/FacebookIcon.png' style='width: 16px;height: 16px;border: 0;line-height: 100%;outline: none;text-decoration: none;' width='16'></a> <a href='http://twitter.com/edxonline' target='_blank' style='color: #2f73bc;font-weight: normal;text-decoration: underline;word-wrap: break-word !important;'><img align='none' height='16' src='http://courses.edx.org/static/images/bulk_email/TwitterIcon.png' style='width: 16px;height: 16px;border: 0;line-height: 100%;outline: none;text-decoration: none;' width='16'></a> <a href='https://plus.google.com/108235383044095082735' target='_blank' style='color: #2f73bc;font-weight: normal;text-decoration: underline;word-wrap: break-word !important;'><img align='none' height='16' src='http://courses.edx.org/static/images/bulk_email/GooglePlusIcon.png' style='width: 16px;height: 16px;border: 0;line-height: 100%;outline: none;text-decoration: none;' width='16'></a> <a href='http://www.meetup.com/edX-Communities/' target='_blank' style='color: #2f73bc;font-weight: normal;text-decoration: underline;word-wrap: break-word !important;'><img align='none' height='16' src='http://courses.edx.org/static/images/bulk_email/MeetupIcon.png' style='width: 16px;height: 16px;border: 0;line-height: 100%;outline: none;text-decoration: none;' width='16'></a></div> </td> </tr> </tbody></table> </td> </tr> </tbody></table></td> </tr> </table> </td> </tr> </table> <!-- // END BODY --> </td> </tr> <tr> <td align='center' valign='top' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <!-- BEGIN FOOTER // --> <table border='0' cellpadding='0' cellspacing='0' width='100%' id='templateFooter' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;background-color: #9FCFE8;border-top: 0;border-bottom: 0;'> <tr> <td align='center' valign='top' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table border='0' cellpadding='0' cellspacing='0' width='600' class='templateContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tr> <td valign='top' class='footerContainer' style='padding-top: 10px;padding-right: 18px;padding-bottom: 10px;padding-left: 18px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'><table border='0' cellpadding='0' cellspacing='0' width='100%' class='mcnTextBlock' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody class='mcnTextBlockOuter'> <tr> <td valign='top' class='mcnTextBlockInner' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table align='left' border='0' cellpadding='0' cellspacing='0' width='600' class='mcnTextContentContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td valign='top' class='mcnTextContent' style='padding-top: 9px;padding-right: 18px;padding-bottom: 9px;padding-left: 18px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;color: #f2f2f2;font-family: Helvetica;font-size: 11px;line-height: 125%;text-align: left;'> <em>Copyright \u00a9 2013 edX, All rights reserved.</em><br><br><br> <b>Our mailing address is:</b><br> edX<br> 11 Cambridge Center, Suite 101<br> Cambridge, MA, USA 02142<br><br><br>This email was automatically sent from {platform_name}. <br>You are receiving this email at address {email} because you are enrolled in <a href='{course_url}'>{course_title}</a>.<br>To stop receiving email like this, update your course email settings <a href='{email_settings_url}'>here</a>. <br> </td> </tr> </tbody></table> </td> </tr> </tbody></table></td> </tr> </table> </td> </tr> </table> <!-- // END FOOTER --> </td> </tr> </table> <!-- // END TEMPLATE --> </td> </tr> </table> </center> </body> </body> </html>", "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": "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'><html xmlns:fb='http://www.facebook.com/2008/fbml' xmlns:og='http://opengraph.org/schema/'> <head><meta property='og:title' content='Update from {course_title}'/><meta property='fb:page_id' content='43929265776' /> <meta http-equiv='Content-Type' content='text/html; charset=UTF-8'> THIS IS A BRANDED HTML TEMPLATE <title>Update from {course_title}</title> </head> <body leftmargin='0' marginwidth='0' topmargin='0' marginheight='0' offset='0' style='margin: 0;padding: 0;background-color: #ffffff;'> <center> <table align='center' border='0' cellpadding='0' cellspacing='0' height='100%' width='100%' id='bodyTable' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;margin: 0;padding: 0;background-color: #ffffff;height: 100% !important;width: 100% !important;'> <tr> <td align='center' valign='top' id='bodyCell' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;margin: 0;padding: 0;border-top: 0;height: 100% !important;width: 100% !important;'> <!-- BEGIN TEMPLATE // --> <table border='0' cellpadding='0' cellspacing='0' width='100%' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tr> <td align='center' valign='top' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <!-- BEGIN PREHEADER // --> <table border='0' cellpadding='0' cellspacing='0' width='100%' id='templatePreheader' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;background-color: #fcfcfc;border-top: 0;border-bottom: 0;'> <tr> <td align='center' valign='top' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table border='0' cellpadding='0' cellspacing='0' width='600' class='templateContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tr> <td valign='top' class='preheaderContainer' style='padding-top: 9px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'><table border='0' cellpadding='0' cellspacing='0' width='100%' class='mcnTextBlock' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody class='mcnTextBlockOuter'> <tr> <td valign='top' class='mcnTextBlockInner' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table align='left' border='0' cellpadding='0' cellspacing='0' width='366' class='mcnTextContentContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td valign='top' class='mcnTextContent' style='padding-top: 9px;padding-left: 18px;padding-bottom: 9px;padding-right: 0;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;color: #606060;font-family: Helvetica;font-size: 11px;line-height: 125%;text-align: left;'> <br> </td> </tr> </tbody></table> </td> </tr> </tbody></table></td> </tr> </table> </td> </tr> </table> <!-- // END PREHEADER --> </td> </tr> <tr> <td align='center' valign='top' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <!-- BEGIN HEADER // --> <table border='0' cellpadding='0' cellspacing='0' width='100%' id='templateHeader' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;background-color: #fcfcfc;border-top: 0;border-bottom: 0;'> <tr> <td align='center' valign='top' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table border='0' cellpadding='0' cellspacing='0' width='600' class='templateContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tr> <td valign='top' class='headerContainer' style='padding-top: 10px;padding-right: 18px;padding-bottom: 10px;padding-left: 18px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'><table border='0' cellpadding='0' cellspacing='0' width='100%' class='mcnImageBlock' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody class='mcnImageBlockOuter'> <tr> <td valign='top' style='padding: 9px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;' class='mcnImageBlockInner'> <table align='left' width='100%' border='0' cellpadding='0' cellspacing='0' class='mcnImageContentContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td class='mcnImageContent' valign='top' style='padding-right: 9px;padding-left: 9px;padding-top: 0;padding-bottom: 0;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <a href='http://edx.org' title='' class='' target='_self' style='word-wrap: break-word !important;'> <img align='left' alt='edX' src='http://courses.edx.org/static/images/bulk_email/edXHeaderImage.jpg' width='564.0000152587891' style='max-width: 600px;padding-bottom: 0;display: inline !important;vertical-align: bottom;border: 0;line-height: 100%;outline: none;text-decoration: none;height: auto !important;' class='mcnImage'> </a> </td> </tr> </tbody></table> </td> </tr> </tbody></table><table border='0' cellpadding='0' cellspacing='0' width='100%' class='mcnTextBlock' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody class='mcnTextBlockOuter'> <tr> <td valign='top' class='mcnTextBlockInner' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table align='left' border='0' cellpadding='0' cellspacing='0' width='599' class='mcnTextContentContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td valign='top' class='mcnTextContent' style='padding-top: 9px;padding-right: 18px;padding-bottom: 9px;padding-left: 18px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;color: #606060;font-family: Helvetica;font-size: 15px;line-height: 150%;text-align: left;'> <div style='text-align: right;'><span style='font-size:11px;'><span style='color:#00a0e3;'>Connect with edX:</span></span> <a href='http://facebook.com/edxonline' target='_blank' style='color: #6DC6DD;font-weight: normal;text-decoration: underline;word-wrap: break-word !important;'><img align='none' height='16' src='http://courses.edx.org/static/images/bulk_email/FacebookIcon.png' style='width: 16px;height: 16px;border: 0;line-height: 100%;outline: none;text-decoration: none;' width='16'></a> <a href='http://twitter.com/edxonline' target='_blank' style='color: #6DC6DD;font-weight: normal;text-decoration: underline;word-wrap: break-word !important;'><img align='none' height='16' src='http://courses.edx.org/static/images/bulk_email/TwitterIcon.png' style='width: 16px;height: 16px;border: 0;line-height: 100%;outline: none;text-decoration: none;' width='16'></a> <a href='https://plus.google.com/108235383044095082735' target='_blank' style='color: #6DC6DD;font-weight: normal;text-decoration: underline;word-wrap: break-word !important;'><img align='none' height='16' src='http://courses.edx.org/static/images/bulk_email/GooglePlusIcon.png' style='width: 16px;height: 16px;border: 0;line-height: 100%;outline: none;text-decoration: none;' width='16'></a> <a href='http://www.meetup.com/edX-Communities/' target='_blank' style='color: #6DC6DD;font-weight: normal;text-decoration: underline;word-wrap: break-word !important;'><img align='none' height='16' src='http://courses.edx.org/static/images/bulk_email/MeetupIcon.png' style='width: 16px;height: 16px;border: 0;line-height: 100%;outline: none;text-decoration: none;' width='16'></a></div> </td> </tr> </tbody></table> </td> </tr> </tbody></table></td> </tr> </table> </td> </tr> </table> <!-- // END HEADER --> </td> </tr> <tr> <td align='center' valign='top' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <!-- BEGIN BODY // --> <table border='0' cellpadding='0' cellspacing='0' width='100%' id='templateBody' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;background-color: #fcfcfc;border-top: 0;border-bottom: 0;'> <tr> <td align='center' valign='top' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table border='0' cellpadding='0' cellspacing='0' width='600' class='templateContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tr> <td valign='top' class='bodyContainer' style='padding-top: 10px;padding-right: 18px;padding-bottom: 10px;padding-left: 18px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'><table border='0' cellpadding='0' cellspacing='0' width='100%' class='mcnCaptionBlock' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody class='mcnCaptionBlockOuter'> <tr> <td class='mcnCaptionBlockInner' valign='top' style='padding: 9px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table border='0' cellpadding='0' cellspacing='0' class='mcnCaptionLeftContentOuter' width='100%' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td valign='top' class='mcnCaptionLeftContentInner' style='padding: 0 9px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table align='right' border='0' cellpadding='0' cellspacing='0' class='mcnCaptionLeftImageContentContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td class='mcnCaptionLeftImageContent' valign='top' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <img alt='' src='{course_image_url}' width='176' style='max-width: 180px;border: 0;line-height: 100%;outline: none;text-decoration: none;vertical-align: bottom;height: auto !important;' class='mcnImage'> </td> </tr> </tbody></table> <table class='mcnCaptionLeftTextContentContainer' align='left' border='0' cellpadding='0' cellspacing='0' width='352' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td valign='top' class='mcnTextContent' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;color: #606060;font-family: Helvetica;font-size: 14px;line-height: 150%;text-align: left;'> <h3 class='null' style='display: block;font-family: Helvetica;font-size: 18px;font-style: normal;font-weight: bold;line-height: 125%;letter-spacing: -.5px;margin: 0;text-align: left;color: #606060 !important;'><strong style='font-size: 22px;'>{course_title}</strong><br></h3><br> </td> </tr> </tbody></table> </td> </tr></tbody></table> </td> </tr> </tbody></table><table border='0' cellpadding='0' cellspacing='0' width='100%' class='mcnTextBlock' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody class='mcnTextBlockOuter'> <tr> <td valign='top' class='mcnTextBlockInner' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table align='left' border='0' cellpadding='0' cellspacing='0' width='600' class='mcnTextContentContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td valign='top' class='mcnTextContent' style='padding-top: 9px;padding-right: 18px;padding-bottom: 9px;padding-left: 18px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;color: #606060;font-family: Helvetica;font-size: 14px;line-height: 150%;text-align: left;'> {{message_body}} </td> </tr> </tbody></table> </td> </tr> </tbody></table><table border='0' cellpadding='0' cellspacing='0' width='100%' class='mcnDividerBlock' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody class='mcnDividerBlockOuter'> <tr> <td class='mcnDividerBlockInner' style='padding: 18px 18px 3px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table class='mcnDividerContent' border='0' cellpadding='0' cellspacing='0' width='100%' style='border-top-width: 1px;border-top-style: solid;border-top-color: #666666;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <span></span> </td> </tr> </tbody></table> </td> </tr> </tbody></table><table border='0' cellpadding='0' cellspacing='0' width='100%' class='mcnTextBlock' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody class='mcnTextBlockOuter'> <tr> <td valign='top' class='mcnTextBlockInner' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table align='left' border='0' cellpadding='0' cellspacing='0' width='600' class='mcnTextContentContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td valign='top' class='mcnTextContent' style='padding-top: 9px;padding-right: 18px;padding-bottom: 9px;padding-left: 18px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;color: #606060;font-family: Helvetica;font-size: 14px;line-height: 150%;text-align: left;'> <div style='text-align: right;'><a href='http://facebook.com/edxonline' target='_blank' style='color: #2f73bc;font-weight: normal;text-decoration: underline;word-wrap: break-word !important;'><img align='none' height='16' src='http://courses.edx.org/static/images/bulk_email/FacebookIcon.png' style='width: 16px;height: 16px;border: 0;line-height: 100%;outline: none;text-decoration: none;' width='16'></a> <a href='http://twitter.com/edxonline' target='_blank' style='color: #2f73bc;font-weight: normal;text-decoration: underline;word-wrap: break-word !important;'><img align='none' height='16' src='http://courses.edx.org/static/images/bulk_email/TwitterIcon.png' style='width: 16px;height: 16px;border: 0;line-height: 100%;outline: none;text-decoration: none;' width='16'></a> <a href='https://plus.google.com/108235383044095082735' target='_blank' style='color: #2f73bc;font-weight: normal;text-decoration: underline;word-wrap: break-word !important;'><img align='none' height='16' src='http://courses.edx.org/static/images/bulk_email/GooglePlusIcon.png' style='width: 16px;height: 16px;border: 0;line-height: 100%;outline: none;text-decoration: none;' width='16'></a> <a href='http://www.meetup.com/edX-Communities/' target='_blank' style='color: #2f73bc;font-weight: normal;text-decoration: underline;word-wrap: break-word !important;'><img align='none' height='16' src='http://courses.edx.org/static/images/bulk_email/MeetupIcon.png' style='width: 16px;height: 16px;border: 0;line-height: 100%;outline: none;text-decoration: none;' width='16'></a></div> </td> </tr> </tbody></table> </td> </tr> </tbody></table></td> </tr> </table> </td> </tr> </table> <!-- // END BODY --> </td> </tr> <tr> <td align='center' valign='top' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <!-- BEGIN FOOTER // --> <table border='0' cellpadding='0' cellspacing='0' width='100%' id='templateFooter' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;background-color: #9FCFE8;border-top: 0;border-bottom: 0;'> <tr> <td align='center' valign='top' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table border='0' cellpadding='0' cellspacing='0' width='600' class='templateContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tr> <td valign='top' class='footerContainer' style='padding-top: 10px;padding-right: 18px;padding-bottom: 10px;padding-left: 18px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'><table border='0' cellpadding='0' cellspacing='0' width='100%' class='mcnTextBlock' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody class='mcnTextBlockOuter'> <tr> <td valign='top' class='mcnTextBlockInner' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <table align='left' border='0' cellpadding='0' cellspacing='0' width='600' class='mcnTextContentContainer' style='border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;'> <tbody><tr> <td valign='top' class='mcnTextContent' style='padding-top: 9px;padding-right: 18px;padding-bottom: 9px;padding-left: 18px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;color: #f2f2f2;font-family: Helvetica;font-size: 11px;line-height: 125%;text-align: left;'> <em>Copyright \u00a9 2013 edX, All rights reserved.</em><br><br><br> <b>Our mailing address is:</b><br> edX<br> 11 Cambridge Center, Suite 101<br> Cambridge, MA, USA 02142<br><br><br>This email was automatically sent from {platform_name}. <br>You are receiving this email at address {email} because you are enrolled in <a href='{course_url}'>{course_title}</a>.<br>To stop receiving email like this, update your course email settings <a href='{email_settings_url}'>here</a>. <br> </td> </tr> </tbody></table> </td> </tr> </tbody></table></td> </tr> </table> </td> </tr> </table> <!-- // END FOOTER --> </td> </tr> </table> <!-- // END TEMPLATE --> </td> </tr> </table> </center> </body> </body> </html>", "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-21T18:53:35.745Z", "name": "fulfills", "created": "2016-01-21T18:53:35.744Z"}, "model": "milestones.milestonerelationshiptype", "pk": 1}, {"fields": {"active": true, "description": "Autogenerated milestone relationship type \"requires\"", "modified": "2016-01-21T18:53:35.747Z", "name": "requires", "created": "2016-01-21T18:53:35.747Z"}, "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_studentitem", "name": "Can add student item", "content_type": 195}, "model": "auth.permission", "pk": 587}, {"fields": {"codename": "change_studentitem", "name": "Can change student item", "content_type": 195}, "model": "auth.permission", "pk": 588}, {"fields": {"codename": "delete_studentitem", "name": "Can delete student item", "content_type": 195}, "model": "auth.permission", "pk": 589}, {"fields": {"codename": "add_submission", "name": "Can add submission", "content_type": 196}, "model": "auth.permission", "pk": 590}, {"fields": {"codename": "change_submission", "name": "Can change submission", "content_type": 196}, "model": "auth.permission", "pk": 591}, {"fields": {"codename": "delete_submission", "name": "Can delete submission", "content_type": 196}, "model": "auth.permission", "pk": 592}, {"fields": {"codename": "add_score", "name": "Can add score", "content_type": 197}, "model": "auth.permission", "pk": 593}, {"fields": {"codename": "change_score", "name": "Can change score", "content_type": 197}, "model": "auth.permission", "pk": 594}, {"fields": {"codename": "delete_score", "name": "Can delete score", "content_type": 197}, "model": "auth.permission", "pk": 595}, {"fields": {"codename": "add_scoresummary", "name": "Can add score summary", "content_type": 198}, "model": "auth.permission", "pk": 596}, {"fields": {"codename": "change_scoresummary", "name": "Can change score summary", "content_type": 198}, "model": "auth.permission", "pk": 597}, {"fields": {"codename": "delete_scoresummary", "name": "Can delete score summary", "content_type": 198}, "model": "auth.permission", "pk": 598}, {"fields": {"codename": "add_scoreannotation", "name": "Can add score annotation", "content_type": 199}, "model": "auth.permission", "pk": 599}, {"fields": {"codename": "change_scoreannotation", "name": "Can change score annotation", "content_type": 199}, "model": "auth.permission", "pk": 600}, {"fields": {"codename": "delete_scoreannotation", "name": "Can delete score annotation", "content_type": 199}, "model": "auth.permission", "pk": 601}, {"fields": {"codename": "add_rubric", "name": "Can add rubric", "content_type": 200}, "model": "auth.permission", "pk": 602}, {"fields": {"codename": "change_rubric", "name": "Can change rubric", "content_type": 200}, "model": "auth.permission", "pk": 603}, {"fields": {"codename": "delete_rubric", "name": "Can delete rubric", "content_type": 200}, "model": "auth.permission", "pk": 604}, {"fields": {"codename": "add_criterion", "name": "Can add criterion", "content_type": 201}, "model": "auth.permission", "pk": 605}, {"fields": {"codename": "change_criterion", "name": "Can change criterion", "content_type": 201}, "model": "auth.permission", "pk": 606}, {"fields": {"codename": "delete_criterion", "name": "Can delete criterion", "content_type": 201}, "model": "auth.permission", "pk": 607}, {"fields": {"codename": "add_criterionoption", "name": "Can add criterion option", "content_type": 202}, "model": "auth.permission", "pk": 608}, {"fields": {"codename": "change_criterionoption", "name": "Can change criterion option", "content_type": 202}, "model": "auth.permission", "pk": 609}, {"fields": {"codename": "delete_criterionoption", "name": "Can delete criterion option", "content_type": 202}, "model": "auth.permission", "pk": 610}, {"fields": {"codename": "add_assessment", "name": "Can add assessment", "content_type": 203}, "model": "auth.permission", "pk": 611}, {"fields": {"codename": "change_assessment", "name": "Can change assessment", "content_type": 203}, "model": "auth.permission", "pk": 612}, {"fields": {"codename": "delete_assessment", "name": "Can delete assessment", "content_type": 203}, "model": "auth.permission", "pk": 613}, {"fields": {"codename": "add_assessmentpart", "name": "Can add assessment part", "content_type": 204}, "model": "auth.permission", "pk": 614}, {"fields": {"codename": "change_assessmentpart", "name": "Can change assessment part", "content_type": 204}, "model": "auth.permission", "pk": 615}, {"fields": {"codename": "delete_assessmentpart", "name": "Can delete assessment part", "content_type": 204}, "model": "auth.permission", "pk": 616}, {"fields": {"codename": "add_assessmentfeedbackoption", "name": "Can add assessment feedback option", "content_type": 205}, "model": "auth.permission", "pk": 617}, {"fields": {"codename": "change_assessmentfeedbackoption", "name": "Can change assessment feedback option", "content_type": 205}, "model": "auth.permission", "pk": 618}, {"fields": {"codename": "delete_assessmentfeedbackoption", "name": "Can delete assessment feedback option", "content_type": 205}, "model": "auth.permission", "pk": 619}, {"fields": {"codename": "add_assessmentfeedback", "name": "Can add assessment feedback", "content_type": 206}, "model": "auth.permission", "pk": 620}, {"fields": {"codename": "change_assessmentfeedback", "name": "Can change assessment feedback", "content_type": 206}, "model": "auth.permission", "pk": 621}, {"fields": {"codename": "delete_assessmentfeedback", "name": "Can delete assessment feedback", "content_type": 206}, "model": "auth.permission", "pk": 622}, {"fields": {"codename": "add_peerworkflow", "name": "Can add peer workflow", "content_type": 207}, "model": "auth.permission", "pk": 623}, {"fields": {"codename": "change_peerworkflow", "name": "Can change peer workflow", "content_type": 207}, "model": "auth.permission", "pk": 624}, {"fields": {"codename": "delete_peerworkflow", "name": "Can delete peer workflow", "content_type": 207}, "model": "auth.permission", "pk": 625}, {"fields": {"codename": "add_peerworkflowitem", "name": "Can add peer workflow item", "content_type": 208}, "model": "auth.permission", "pk": 626}, {"fields": {"codename": "change_peerworkflowitem", "name": "Can change peer workflow item", "content_type": 208}, "model": "auth.permission", "pk": 627}, {"fields": {"codename": "delete_peerworkflowitem", "name": "Can delete peer workflow item", "content_type": 208}, "model": "auth.permission", "pk": 628}, {"fields": {"codename": "add_trainingexample", "name": "Can add training example", "content_type": 209}, "model": "auth.permission", "pk": 629}, {"fields": {"codename": "change_trainingexample", "name": "Can change training example", "content_type": 209}, "model": "auth.permission", "pk": 630}, {"fields": {"codename": "delete_trainingexample", "name": "Can delete training example", "content_type": 209}, "model": "auth.permission", "pk": 631}, {"fields": {"codename": "add_studenttrainingworkflow", "name": "Can add student training workflow", "content_type": 210}, "model": "auth.permission", "pk": 632}, {"fields": {"codename": "change_studenttrainingworkflow", "name": "Can change student training workflow", "content_type": 210}, "model": "auth.permission", "pk": 633}, {"fields": {"codename": "delete_studenttrainingworkflow", "name": "Can delete student training workflow", "content_type": 210}, "model": "auth.permission", "pk": 634}, {"fields": {"codename": "add_studenttrainingworkflowitem", "name": "Can add student training workflow item", "content_type": 211}, "model": "auth.permission", "pk": 635}, {"fields": {"codename": "change_studenttrainingworkflowitem", "name": "Can change student training workflow item", "content_type": 211}, "model": "auth.permission", "pk": 636}, {"fields": {"codename": "delete_studenttrainingworkflowitem", "name": "Can delete student training workflow item", "content_type": 211}, "model": "auth.permission", "pk": 637}, {"fields": {"codename": "add_aiclassifierset", "name": "Can add ai classifier set", "content_type": 212}, "model": "auth.permission", "pk": 638}, {"fields": {"codename": "change_aiclassifierset", "name": "Can change ai classifier set", "content_type": 212}, "model": "auth.permission", "pk": 639}, {"fields": {"codename": "delete_aiclassifierset", "name": "Can delete ai classifier set", "content_type": 212}, "model": "auth.permission", "pk": 640}, {"fields": {"codename": "add_aiclassifier", "name": "Can add ai classifier", "content_type": 213}, "model": "auth.permission", "pk": 641}, {"fields": {"codename": "change_aiclassifier", "name": "Can change ai classifier", "content_type": 213}, "model": "auth.permission", "pk": 642}, {"fields": {"codename": "delete_aiclassifier", "name": "Can delete ai classifier", "content_type": 213}, "model": "auth.permission", "pk": 643}, {"fields": {"codename": "add_aitrainingworkflow", "name": "Can add ai training workflow", "content_type": 214}, "model": "auth.permission", "pk": 644}, {"fields": {"codename": "change_aitrainingworkflow", "name": "Can change ai training workflow", "content_type": 214}, "model": "auth.permission", "pk": 645}, {"fields": {"codename": "delete_aitrainingworkflow", "name": "Can delete ai training workflow", "content_type": 214}, "model": "auth.permission", "pk": 646}, {"fields": {"codename": "add_aigradingworkflow", "name": "Can add ai grading workflow", "content_type": 215}, "model": "auth.permission", "pk": 647}, {"fields": {"codename": "change_aigradingworkflow", "name": "Can change ai grading workflow", "content_type": 215}, "model": "auth.permission", "pk": 648}, {"fields": {"codename": "delete_aigradingworkflow", "name": "Can delete ai grading workflow", "content_type": 215}, "model": "auth.permission", "pk": 649}, {"fields": {"codename": "add_staffworkflow", "name": "Can add staff workflow", "content_type": 216}, "model": "auth.permission", "pk": 650}, {"fields": {"codename": "change_staffworkflow", "name": "Can change staff workflow", "content_type": 216}, "model": "auth.permission", "pk": 651}, {"fields": {"codename": "delete_staffworkflow", "name": "Can delete staff workflow", "content_type": 216}, "model": "auth.permission", "pk": 652}, {"fields": {"codename": "add_assessmentworkflow", "name": "Can add assessment workflow", "content_type": 217}, "model": "auth.permission", "pk": 653}, {"fields": {"codename": "change_assessmentworkflow", "name": "Can change assessment workflow", "content_type": 217}, "model": "auth.permission", "pk": 654}, {"fields": {"codename": "delete_assessmentworkflow", "name": "Can delete assessment workflow", "content_type": 217}, "model": "auth.permission", "pk": 655}, {"fields": {"codename": "add_assessmentworkflowstep", "name": "Can add assessment workflow step", "content_type": 218}, "model": "auth.permission", "pk": 656}, {"fields": {"codename": "change_assessmentworkflowstep", "name": "Can change assessment workflow step", "content_type": 218}, "model": "auth.permission", "pk": 657}, {"fields": {"codename": "delete_assessmentworkflowstep", "name": "Can delete assessment workflow step", "content_type": 218}, "model": "auth.permission", "pk": 658}, {"fields": {"codename": "add_assessmentworkflowcancellation", "name": "Can add assessment workflow cancellation", "content_type": 219}, "model": "auth.permission", "pk": 659}, {"fields": {"codename": "change_assessmentworkflowcancellation", "name": "Can change assessment workflow cancellation", "content_type": 219}, "model": "auth.permission", "pk": 660}, {"fields": {"codename": "delete_assessmentworkflowcancellation", "name": "Can delete assessment workflow cancellation", "content_type": 219}, "model": "auth.permission", "pk": 661}, {"fields": {"codename": "add_profile", "name": "Can add profile", "content_type": 220}, "model": "auth.permission", "pk": 662}, {"fields": {"codename": "change_profile", "name": "Can change profile", "content_type": 220}, "model": "auth.permission", "pk": 663}, {"fields": {"codename": "delete_profile", "name": "Can delete profile", "content_type": 220}, "model": "auth.permission", "pk": 664}, {"fields": {"codename": "add_video", "name": "Can add video", "content_type": 221}, "model": "auth.permission", "pk": 665}, {"fields": {"codename": "change_video", "name": "Can change video", "content_type": 221}, "model": "auth.permission", "pk": 666}, {"fields": {"codename": "delete_video", "name": "Can delete video", "content_type": 221}, "model": "auth.permission", "pk": 667}, {"fields": {"codename": "add_coursevideo", "name": "Can add course video", "content_type": 222}, "model": "auth.permission", "pk": 668}, {"fields": {"codename": "change_coursevideo", "name": "Can change course video", "content_type": 222}, "model": "auth.permission", "pk": 669}, {"fields": {"codename": "delete_coursevideo", "name": "Can delete course video", "content_type": 222}, "model": "auth.permission", "pk": 670}, {"fields": {"codename": "add_encodedvideo", "name": "Can add encoded video", "content_type": 223}, "model": "auth.permission", "pk": 671}, {"fields": {"codename": "change_encodedvideo", "name": "Can change encoded video", "content_type": 223}, "model": "auth.permission", "pk": 672}, {"fields": {"codename": "delete_encodedvideo", "name": "Can delete encoded video", "content_type": 223}, "model": "auth.permission", "pk": 673}, {"fields": {"codename": "add_subtitle", "name": "Can add subtitle", "content_type": 224}, "model": "auth.permission", "pk": 674}, {"fields": {"codename": "change_subtitle", "name": "Can change subtitle", "content_type": 224}, "model": "auth.permission", "pk": 675}, {"fields": {"codename": "delete_subtitle", "name": "Can delete subtitle", "content_type": 224}, "model": "auth.permission", "pk": 676}, {"fields": {"codename": "add_milestone", "name": "Can add milestone", "content_type": 225}, "model": "auth.permission", "pk": 677}, {"fields": {"codename": "change_milestone", "name": "Can change milestone", "content_type": 225}, "model": "auth.permission", "pk": 678}, {"fields": {"codename": "delete_milestone", "name": "Can delete milestone", "content_type": 225}, "model": "auth.permission", "pk": 679}, {"fields": {"codename": "add_milestonerelationshiptype", "name": "Can add milestone relationship type", "content_type": 226}, "model": "auth.permission", "pk": 680}, {"fields": {"codename": "change_milestonerelationshiptype", "name": "Can change milestone relationship type", "content_type": 226}, "model": "auth.permission", "pk": 681}, {"fields": {"codename": "delete_milestonerelationshiptype", "name": "Can delete milestone relationship type", "content_type": 226}, "model": "auth.permission", "pk": 682}, {"fields": {"codename": "add_coursemilestone", "name": "Can add course milestone", "content_type": 227}, "model": "auth.permission", "pk": 683}, {"fields": {"codename": "change_coursemilestone", "name": "Can change course milestone", "content_type": 227}, "model": "auth.permission", "pk": 684}, {"fields": {"codename": "delete_coursemilestone", "name": "Can delete course milestone", "content_type": 227}, "model": "auth.permission", "pk": 685}, {"fields": {"codename": "add_coursecontentmilestone", "name": "Can add course content milestone", "content_type": 228}, "model": "auth.permission", "pk": 686}, {"fields": {"codename": "change_coursecontentmilestone", "name": "Can change course content milestone", "content_type": 228}, "model": "auth.permission", "pk": 687}, {"fields": {"codename": "delete_coursecontentmilestone", "name": "Can delete course content milestone", "content_type": 228}, "model": "auth.permission", "pk": 688}, {"fields": {"codename": "add_usermilestone", "name": "Can add user milestone", "content_type": 229}, "model": "auth.permission", "pk": 689}, {"fields": {"codename": "change_usermilestone", "name": "Can change user milestone", "content_type": 229}, "model": "auth.permission", "pk": 690}, {"fields": {"codename": "delete_usermilestone", "name": "Can delete user milestone", "content_type": 229}, "model": "auth.permission", "pk": 691}, {"fields": {"codename": "add_proctoredexam", "name": "Can add proctored exam", "content_type": 230}, "model": "auth.permission", "pk": 692}, {"fields": {"codename": "change_proctoredexam", "name": "Can change proctored exam", "content_type": 230}, "model": "auth.permission", "pk": 693}, {"fields": {"codename": "delete_proctoredexam", "name": "Can delete proctored exam", "content_type": 230}, "model": "auth.permission", "pk": 694}, {"fields": {"codename": "add_proctoredexamreviewpolicy", "name": "Can add Proctored exam review policy", "content_type": 231}, "model": "auth.permission", "pk": 695}, {"fields": {"codename": "change_proctoredexamreviewpolicy", "name": "Can change Proctored exam review policy", "content_type": 231}, "model": "auth.permission", "pk": 696}, {"fields": {"codename": "delete_proctoredexamreviewpolicy", "name": "Can delete Proctored exam review policy", "content_type": 231}, "model": "auth.permission", "pk": 697}, {"fields": {"codename": "add_proctoredexamreviewpolicyhistory", "name": "Can add proctored exam review policy history", "content_type": 232}, "model": "auth.permission", "pk": 698}, {"fields": {"codename": "change_proctoredexamreviewpolicyhistory", "name": "Can change proctored exam review policy history", "content_type": 232}, "model": "auth.permission", "pk": 699}, {"fields": {"codename": "delete_proctoredexamreviewpolicyhistory", "name": "Can delete proctored exam review policy history", "content_type": 232}, "model": "auth.permission", "pk": 700}, {"fields": {"codename": "add_proctoredexamstudentattempt", "name": "Can add proctored exam attempt", "content_type": 233}, "model": "auth.permission", "pk": 701}, {"fields": {"codename": "change_proctoredexamstudentattempt", "name": "Can change proctored exam attempt", "content_type": 233}, "model": "auth.permission", "pk": 702}, {"fields": {"codename": "delete_proctoredexamstudentattempt", "name": "Can delete proctored exam attempt", "content_type": 233}, "model": "auth.permission", "pk": 703}, {"fields": {"codename": "add_proctoredexamstudentattempthistory", "name": "Can add proctored exam attempt history", "content_type": 234}, "model": "auth.permission", "pk": 704}, {"fields": {"codename": "change_proctoredexamstudentattempthistory", "name": "Can change proctored exam attempt history", "content_type": 234}, "model": "auth.permission", "pk": 705}, {"fields": {"codename": "delete_proctoredexamstudentattempthistory", "name": "Can delete proctored exam attempt history", "content_type": 234}, "model": "auth.permission", "pk": 706}, {"fields": {"codename": "add_proctoredexamstudentallowance", "name": "Can add proctored allowance", "content_type": 235}, "model": "auth.permission", "pk": 707}, {"fields": {"codename": "change_proctoredexamstudentallowance", "name": "Can change proctored allowance", "content_type": 235}, "model": "auth.permission", "pk": 708}, {"fields": {"codename": "delete_proctoredexamstudentallowance", "name": "Can delete proctored allowance", "content_type": 235}, "model": "auth.permission", "pk": 709}, {"fields": {"codename": "add_proctoredexamstudentallowancehistory", "name": "Can add proctored allowance history", "content_type": 236}, "model": "auth.permission", "pk": 710}, {"fields": {"codename": "change_proctoredexamstudentallowancehistory", "name": "Can change proctored allowance history", "content_type": 236}, "model": "auth.permission", "pk": 711}, {"fields": {"codename": "delete_proctoredexamstudentallowancehistory", "name": "Can delete proctored allowance history", "content_type": 236}, "model": "auth.permission", "pk": 712}, {"fields": {"codename": "add_proctoredexamsoftwaresecurereview", "name": "Can add Proctored exam software secure review", "content_type": 237}, "model": "auth.permission", "pk": 713}, {"fields": {"codename": "change_proctoredexamsoftwaresecurereview", "name": "Can change Proctored exam software secure review", "content_type": 237}, "model": "auth.permission", "pk": 714}, {"fields": {"codename": "delete_proctoredexamsoftwaresecurereview", "name": "Can delete Proctored exam software secure review", "content_type": 237}, "model": "auth.permission", "pk": 715}, {"fields": {"codename": "add_proctoredexamsoftwaresecurereviewhistory", "name": "Can add Proctored exam review archive", "content_type": 238}, "model": "auth.permission", "pk": 716}, {"fields": {"codename": "change_proctoredexamsoftwaresecurereviewhistory", "name": "Can change Proctored exam review archive", "content_type": 238}, "model": "auth.permission", "pk": 717}, {"fields": {"codename": "delete_proctoredexamsoftwaresecurereviewhistory", "name": "Can delete Proctored exam review archive", "content_type": 238}, "model": "auth.permission", "pk": 718}, {"fields": {"codename": "add_proctoredexamsoftwaresecurecomment", "name": "Can add proctored exam software secure comment", "content_type": 239}, "model": "auth.permission", "pk": 719}, {"fields": {"codename": "change_proctoredexamsoftwaresecurecomment", "name": "Can change proctored exam software secure comment", "content_type": 239}, "model": "auth.permission", "pk": 720}, {"fields": {"codename": "delete_proctoredexamsoftwaresecurecomment", "name": "Can delete proctored exam software secure comment", "content_type": 239}, "model": "auth.permission", "pk": 721}, {"fields": {"codename": "add_organization", "name": "Can add organization", "content_type": 240}, "model": "auth.permission", "pk": 722}, {"fields": {"codename": "change_organization", "name": "Can change organization", "content_type": 240}, "model": "auth.permission", "pk": 723}, {"fields": {"codename": "delete_organization", "name": "Can delete organization", "content_type": 240}, "model": "auth.permission", "pk": 724}, {"fields": {"codename": "add_organizationcourse", "name": "Can add Link Course", "content_type": 241}, "model": "auth.permission", "pk": 725}, {"fields": {"codename": "change_organizationcourse", "name": "Can change Link Course", "content_type": 241}, "model": "auth.permission", "pk": 726}, {"fields": {"codename": "delete_organizationcourse", "name": "Can delete Link Course", "content_type": 241}, "model": "auth.permission", "pk": 727}, {"fields": {"codename": "add_videouploadconfig", "name": "Can add video upload config", "content_type": 242}, "model": "auth.permission", "pk": 728}, {"fields": {"codename": "change_videouploadconfig", "name": "Can change video upload config", "content_type": 242}, "model": "auth.permission", "pk": 729}, {"fields": {"codename": "delete_videouploadconfig", "name": "Can delete video upload config", "content_type": 242}, "model": "auth.permission", "pk": 730}, {"fields": {"codename": "add_pushnotificationconfig", "name": "Can add push notification config", "content_type": 243}, "model": "auth.permission", "pk": 731}, {"fields": {"codename": "change_pushnotificationconfig", "name": "Can change push notification config", "content_type": 243}, "model": "auth.permission", "pk": 732}, {"fields": {"codename": "delete_pushnotificationconfig", "name": "Can delete push notification config", "content_type": 243}, "model": "auth.permission", "pk": 733}, {"fields": {"codename": "add_coursecreator", "name": "Can add course creator", "content_type": 244}, "model": "auth.permission", "pk": 734}, {"fields": {"codename": "change_coursecreator", "name": "Can change course creator", "content_type": 244}, "model": "auth.permission", "pk": 735}, {"fields": {"codename": "delete_coursecreator", "name": "Can delete course creator", "content_type": 244}, "model": "auth.permission", "pk": 736}, {"fields": {"codename": "add_studioconfig", "name": "Can add studio config", "content_type": 245}, "model": "auth.permission", "pk": 737}, {"fields": {"codename": "change_studioconfig", "name": "Can change studio config", "content_type": 245}, "model": "auth.permission", "pk": 738}, {"fields": {"codename": "delete_studioconfig", "name": "Can delete studio config", "content_type": 245}, "model": "auth.permission", "pk": 739}, {"fields": {"username": "ecommerce_worker", "first_name": "", "last_name": "", "is_active": true, "is_superuser": false, "is_staff": false, "last_login": null, "groups": [], "user_permissions": [], "password": "!a7SudZ8tSftyXEVQPKpBHG2rj6ZOmcr0VCpboorI", "email": "ecommerce_worker@fake.email", "date_joined": "2016-01-21T18:53:18.229Z"}, "model": "auth.user", "pk": 1}, {"fields": {"change_date": "2016-01-21T18:54:25.176Z", "changed_by": null, "enabled": true}, "model": "util.ratelimitconfiguration", "pk": 1}, {"fields": {"change_date": "2016-01-21T18:53:13.524Z", "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-21T18:53:24.176Z", "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 0000000000000000000000000000000000000000..8e2f0bef135ba8e52e4110b6a5b0ebf19a528ca4 --- /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_schema.sql b/common/test/db_cache/bok_choy_schema_default.sql similarity index 99% rename from common/test/db_cache/bok_choy_schema.sql rename to common/test/db_cache/bok_choy_schema_default.sql index 26d6fc5574f13abbe43934d7ba57fbd1c2a1ba9d..df3174a46bd4e5d804df5b11d39109e360e01fae 100644 --- a/common/test/db_cache/bok_choy_schema.sql +++ b/common/test/db_cache/bok_choy_schema_default.sql @@ -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=740 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 */; @@ -1353,24 +1353,6 @@ CREATE TABLE `courseware_xmoduleuserstatesummaryfield` ( KEY `courseware_xmoduleuserstatesummaryfield_0528eb2a` (`usage_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `credentials_credentialsapiconfig`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `credentials_credentialsapiconfig` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `change_date` datetime(6) NOT NULL, - `enabled` tinyint(1) NOT NULL, - `internal_service_url` varchar(200) NOT NULL, - `public_service_url` varchar(200) NOT NULL, - `enable_learner_issuance` tinyint(1) NOT NULL, - `enable_studio_authoring` tinyint(1) NOT NULL, - `cache_ttl` int(10) unsigned NOT NULL, - `changed_by_id` int(11) DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `credentials_crede_changed_by_id_273a2e6b0649c861_fk_auth_user_id` (`changed_by_id`), - CONSTRAINT `credentials_crede_changed_by_id_273a2e6b0649c861_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 `credit_creditcourse`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; @@ -1618,7 +1600,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=246 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 +1611,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=103 DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `django_openid_auth_association`; /*!40101 SET @saved_cs_client = @@character_set_client */; diff --git a/common/test/db_cache/bok_choy_schema_student_module_history.sql b/common/test/db_cache/bok_choy_schema_student_module_history.sql new file mode 100644 index 0000000000000000000000000000000000000000..696b1bdf435f2787cd6bf8ced24e80d895abbe2f --- /dev/null +++ b/common/test/db_cache/bok_choy_schema_student_module_history.sql @@ -0,0 +1,21 @@ + +/*!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 */; +/*!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/lms/djangoapps/ccx/tests/test_field_override_performance.py b/lms/djangoapps/ccx/tests/test_field_override_performance.py index d6a88b300b776c8beaaaf3a2750e1cbf1cff9b49..ffad914bee5cc6d55574ab1ca80fd1adc2b55c9d 100644 --- a/lms/djangoapps/ccx/tests/test_field_override_performance.py +++ b/lms/djangoapps/ccx/tests/test_field_override_performance.py @@ -151,7 +151,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 +176,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 +205,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 +221,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): (23, 1, 6, 13), + ('no_overrides', 2, True, False): (53, 16, 6, 84), + ('no_overrides', 3, True, False): (183, 81, 6, 335), + ('ccx', 1, True, False): (23, 1, 6, 13), + ('ccx', 2, True, False): (53, 16, 6, 84), + ('ccx', 3, True, False): (183, 81, 6, 335), + ('ccx', 1, True, True): (23, 1, 6, 13), + ('ccx', 2, True, True): (53, 16, 6, 84), + ('ccx', 3, True, True): (183, 81, 6, 335), + ('no_overrides', 1, False, False): (23, 1, 6, 13), + ('no_overrides', 2, False, False): (53, 16, 6, 84), + ('no_overrides', 3, False, False): (183, 81, 6, 335), + ('ccx', 1, False, False): (23, 1, 6, 13), + ('ccx', 2, False, False): (53, 16, 6, 84), + ('ccx', 3, False, False): (183, 81, 6, 335), + ('ccx', 1, False, True): (23, 1, 6, 13), + ('ccx', 2, False, True): (53, 16, 6, 84), + ('ccx', 3, False, True): (183, 81, 6, 335), } @@ -243,22 +256,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): (23, 1, 4, 9), + ('no_overrides', 2, True, False): (53, 16, 19, 54), + ('no_overrides', 3, True, False): (183, 81, 84, 215), + ('ccx', 1, True, False): (23, 1, 4, 9), + ('ccx', 2, True, False): (53, 16, 19, 54), + ('ccx', 3, True, False): (183, 81, 84, 215), + ('ccx', 1, True, True): (25, 1, 4, 13), + ('ccx', 2, True, True): (55, 16, 19, 84), + ('ccx', 3, True, True): (185, 81, 84, 335), + ('no_overrides', 1, False, False): (23, 1, 4, 9), + ('no_overrides', 2, False, False): (53, 16, 19, 54), + ('no_overrides', 3, False, False): (183, 81, 84, 215), + ('ccx', 1, False, False): (23, 1, 4, 9), + ('ccx', 2, False, False): (53, 16, 19, 54), + ('ccx', 3, False, False): (183, 81, 84, 215), + ('ccx', 1, False, True): (23, 1, 4, 9), + ('ccx', 2, False, True): (53, 16, 19, 54), + ('ccx', 3, False, True): (183, 81, 84, 215), } diff --git a/lms/djangoapps/courseware/fields.py b/lms/djangoapps/courseware/fields.py new file mode 100644 index 0000000000000000000000000000000000000000..6e34c4e635f756a45df43d482a7bf285628a3854 --- /dev/null +++ b/lms/djangoapps/courseware/fields.py @@ -0,0 +1,21 @@ +""" +Custom fields for use in the courseware 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" + else: + return None 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 d4f22a0e3e5c7643b54ed3739e19006360810865..0000000000000000000000000000000000000000 --- 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 e0c7da7af9815b7f16bd8330df768dbd96ab5353..0000000000000000000000000000000000000000 --- 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/migrations/0002_csmh-extended-keyspace.py b/lms/djangoapps/courseware/migrations/0002_csmh-extended-keyspace.py new file mode 100644 index 0000000000000000000000000000000000000000..8ee63b6f3b88abd6d094111bcffc1a835ad3a03a --- /dev/null +++ b/lms/djangoapps/courseware/migrations/0002_csmh-extended-keyspace.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models +import courseware.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") + initial_id = settings.STUDENTMODULEHISTORYEXTENDED_OFFSET + StudentModuleHistory.objects.all().latest('id').id + + if schema_editor.connection.vendor == 'mysql': + schema_editor.execute('ALTER TABLE courseware_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() + + +class Migration(migrations.Migration): + + dependencies = [ + ('courseware', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='StudentModuleHistoryExtended', + fields=[ + ('id', courseware.fields.UnsignedBigIntAutoField(serialize=False, primary_key=True)), + ('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)), + ('student_module', models.ForeignKey(to='courseware.StudentModule', db_constraint=False)), + ], + options={ + 'get_latest_by': 'created', + }, + ), + migrations.RunPython(bump_pk_start, reverse_code=migrations.RunPython.noop), + ] diff --git a/lms/djangoapps/courseware/models.py b/lms/djangoapps/courseware/models.py index 5dff6ea01d2099915545e835e8e6622f9723cce7..c67bb1fd16cc1147505b99347e502012f2894117 100644 --- a/lms/djangoapps/courseware/models.py +++ b/lms/djangoapps/courseware/models.py @@ -26,7 +26,7 @@ from student.models import user_by_anonymous_id from submissions.models import score_set, score_reset from xmodule_django.models import CourseKeyField, LocationKeyField, BlockTypeKeyField -log = logging.getLogger(__name__) +from courseware.fields import UnsignedBigIntAutoField log = logging.getLogger("edx.courseware") @@ -188,6 +188,50 @@ class StudentModuleHistory(models.Model): def __unicode__(self): return unicode(repr(self)) +class StudentModuleHistoryExtended(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. + + This new extended CSMH has a larger primary key that won't run out of space + so quickly.""" + objects = ChunkingManager() + HISTORY_SAVING_TYPES = {'problem'} + + class Meta(object): + app_label = "courseware" + get_latest_by = "created" + + id = UnsignedBigIntAutoField(primary_key=True) # pylint: disable=invalid-name + + student_module = models.ForeignKey(StudentModule, db_index=True, db_constraint=False) + version = models.CharField(max_length=255, null=True, blank=True, db_index=True) + + # This should be populated from the modified field in StudentModule + 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) + + @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 + StudentModuleHistory 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() + + def __unicode__(self): + return unicode(repr(self)) + class XBlockFieldBase(models.Model): """ diff --git a/lms/djangoapps/courseware/routers.py b/lms/djangoapps/courseware/routers.py new file mode 100644 index 0000000000000000000000000000000000000000..1514c1025972f3992a9f281ea52aaa1c0b4f0c43 --- /dev/null +++ b/lms/djangoapps/courseware/routers.py @@ -0,0 +1,57 @@ +""" +Database Routers for use with the courseware django app. +""" + + +class StudentModuleHistoryRouter(object): + """ + A Database Router that separates StudentModuleHistory into its own database. + """ + + DATABASE_NAME = 'student_module_history' + + def _is_csmh(self, model): + """ + Return True if ``model`` is courseware.StudentModuleHistory. + """ + return ( + model._meta.app_label == 'courseware' and # pylint: disable=protected-access + model.__name__ == 'StudentModuleHistory' + ) + + def db_for_read(self, model, **hints): # pylint: disable=unused-argument + """ + Use the StudentModuleHistoryRouter.DATABASE_NAME if the model is StudentModuleHistory. + """ + 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 StudentModuleHistoryRouter.DATABASE_NAME if the model is StudentModuleHistory. + """ + 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 StudentModuleHistory. + """ + 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 StudentModuleHistory to StudentModuleHistoryRouter.DATABASE_Name + """ + if self._is_csmh(model): + return db == self.DATABASE_NAME + elif db == self.DATABASE_NAME: + return False + + return None diff --git a/lms/djangoapps/courseware/tests/test_model_data.py b/lms/djangoapps/courseware/tests/test_model_data.py index e8c2a275f13794b2f7442e3045794fe9cc618172..b80f05d2a12612a5d2d74a02da87e1abaff4c47c 100644 --- a/lms/djangoapps/courseware/tests/test_model_data.py +++ b/lms/djangoapps/courseware/tests/test_model_data.py @@ -249,8 +249,9 @@ class TestMissingStudentModule(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(5): - self.kvs.set(user_state_key('a_field'), 'a_value') + with self.assertNumQueries(2, 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/envs/acceptance.py b/lms/envs/acceptance.py index 7a8b3bee5576d3691f87cd409a4169788d198ae6..41c64afe56d3e1f921f8181b2221bf516018e3c4 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, + }, } } diff --git a/lms/envs/aws.py b/lms/envs/aws.py index 5e9327376d1ba89f1ea1ec1a9c3ac1ae36353bb7..6f593d139c0ba60b826cd3e40fe51fe26a9463ca 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')) diff --git a/lms/envs/aws_migrate.py b/lms/envs/aws_migrate.py index e14834ec2d1e2335036c2f6a7c04a987c49ca71a..6dff6973395894cf7b63392c03bcf50167719f37 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 c8b83d25bd886f01cfdb018595436891103c310a..a25ec6fb09913a26cd8d3de5051ce4fa3fa8828c 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/common.py b/lms/envs/common.py index e58e58395359dd5f424500f746a1e690357da92d..fa7cbe68fc61f7f4eff5bb93e304f95e42daf398 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -413,6 +413,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 = [ + 'courseware.routers.StudentModuleHistoryRouter', +] + ############################ OpenID Provider ################################## OPENID_PROVIDER_TRUSTED_ROOTS = ['cs50.net', '*.cs50.net'] @@ -2759,6 +2765,10 @@ 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. +STUDENTMODULEHISTORYEXTENDED_OFFSET = 10000 + # Deprecated xblock types DEPRECATED_ADVANCED_COMPONENT_TYPES = [] diff --git a/lms/envs/dev.py b/lms/envs/dev.py index 065ed74b2851bdeea3921431433442996f11e426..024bb630ea3d3beae327bb0dda7350a6583dd1da 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 86800d8847916327511b3b363459d76f6f05798d..c06c698730386c2970e9027b5a613e4f0dd95374 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 f0da488e75b2626c39de739c02ab3581dbb0bcfb..2229850f89634f2d3232969f62705c0b52f83fd2 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 c16ac9d37eefc7920e455dc3d6de81d105205dc9..111de79ca9f2498b50a9e475d9f797c4b4b6cb71 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'): diff --git a/lms/envs/test_static_optimized.py b/lms/envs/test_static_optimized.py index 19eaa2814ed3f4f3627752140cad32f4ca646bab..f8ed5a9bb116b0e53320a819ab9ff1249d47632b 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/scripts/reset-test-db.sh b/scripts/reset-test-db.sh index 41eefdedf46db4532a1daa043a276bfc67285617..b5f186e5b3290902596101b01f4d4ac0850e502b 100755 --- a/scripts/reset-test-db.sh +++ b/scripts/reset-test-db.sh @@ -24,29 +24,54 @@ DB_CACHE_DIR="common/test/db_cache" +declare -A databases +databases=(["default"]="edxtest" ["student_module_history"]="student_module_history_test") + + # Ensure the test database exists. -echo "CREATE DATABASE IF NOT EXISTS edxtest;" | mysql -u root +for db in "${!databases[@]}"; 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 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 ]]; then + echo "Missing $DB_CACHE_DIR/bok_choy_schema_$db.sql or $DB_CACHE_DIR/bok_choy_data_$db.json, rebuilding cache" + REBUILD_CACHE=true + fi + +done + +# migrations are only stored in the default database +if [[ ! -f $DB_CACHE_DIR/bok_choy_migrations_data.sql ]]; then + REBUILD_CACHE=true +fi + -# 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 # 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 + + for db in "${!databases[@]}"; do + # Load the schema, then the data (including the migration history) + echo "Loading the schema from the filesystem into the 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 MySQL DB." + ./manage.py lms --settings bok_choy loaddata --database $db $DB_CACHE_DIR/bok_choy_data_$db.json + done + + # Migrations are stored in the default database 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 + mysql -u root "${databases['default']}" < $DB_CACHE_DIR/bok_choy_migrations_data.sql # Re-run migrations to ensure we are up-to-date echo "Running the lms migrations on the bok_choy DB." @@ -66,13 +91,15 @@ else 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 - # 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 + for db in "${!databases[@]}"; do + # 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 --database $db > $DB_CACHE_DIR/bok_choy_data_$db.json + echo "Saving the schema of the 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 + done + # 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 + mysqldump -u root --no-create-info "${databases['default']}" django_migrations > $DB_CACHE_DIR/bok_choy_migrations_data.sql fi -