From ca3d84a5d48d75b71be930fba047c0aa37b161e6 Mon Sep 17 00:00:00 2001 From: Zia Fazal <zia.fazal@arbisoft.com> Date: Fri, 21 Nov 2014 16:38:13 +0500 Subject: [PATCH] New pre-requisite course feature via milestones app --- .../tests/test_course_settings.py | 54 ++++ cms/djangoapps/contentstore/views/course.py | 114 ++++++--- .../models/settings/course_details.py | 7 + .../models/settings/course_metadata.py | 1 + cms/envs/bok_choy.py | 6 + cms/envs/common.py | 9 +- cms/envs/test.py | 3 + .../js/models/settings/course_details.js | 3 +- .../js/spec/views/settings/main_spec.js | 25 +- cms/static/js/views/settings/main.js | 12 +- .../js/mock/mock-settings-page.underscore | 13 + cms/templates/settings.html | 15 ++ .../student/tests/test_course_listing.py | 48 +++- common/djangoapps/student/views.py | 19 +- common/djangoapps/util/milestones_helpers.py | 167 ++++++++++++ common/lib/xmodule/xmodule/course_module.py | 5 + .../xmodule/templates/about/overview.yaml | 4 +- common/test/acceptance/pages/lms/dashboard.py | 6 + .../test/acceptance/pages/studio/settings.py | 20 ++ common/test/acceptance/tests/helpers.py | 25 ++ common/test/acceptance/tests/lms/test_lms.py | 93 ++++++- .../studio/test_studio_settings_details.py | 84 ++++++ common/test/db_cache/bok_choy_data.json | 2 +- common/test/db_cache/bok_choy_schema.sql | 240 ++++++++++++++++-- common/test/db_cache/lettuce.db | Bin 604160 -> 653312 bytes .../en_us/platform_api/source/course_info.rst | 4 +- lms/djangoapps/branding/tests.py | 52 ++++ lms/djangoapps/certificates/models.py | 15 ++ lms/djangoapps/certificates/tests/tests.py | 32 +++ lms/djangoapps/courseware/access.py | 17 ++ lms/djangoapps/courseware/tests/test_about.py | 59 ++++- .../courseware/tests/test_access.py | 86 ++++++- lms/djangoapps/courseware/views.py | 25 +- lms/envs/bok_choy.py | 6 + lms/envs/common.py | 10 +- lms/envs/test.py | 4 + .../sass/multicourse/_course_about.scss | 14 + lms/static/sass/multicourse/_dashboard.scss | 11 + lms/templates/courseware/course_about.html | 11 +- lms/templates/dashboard.html | 3 +- .../dashboard/_dashboard_course_listing.html | 15 +- requirements/edx/github.txt | 1 + 42 files changed, 1254 insertions(+), 86 deletions(-) create mode 100644 common/djangoapps/util/milestones_helpers.py create mode 100644 common/test/acceptance/tests/studio/test_studio_settings_details.py diff --git a/cms/djangoapps/contentstore/tests/test_course_settings.py b/cms/djangoapps/contentstore/tests/test_course_settings.py index df34ee26883..584a4820c08 100644 --- a/cms/djangoapps/contentstore/tests/test_course_settings.py +++ b/cms/djangoapps/contentstore/tests/test_course_settings.py @@ -25,6 +25,8 @@ from contentstore.views.component import ADVANCED_COMPONENT_POLICY_KEY import ddt from xmodule.modulestore import ModuleStoreEnum +from util.milestones_helpers import seed_milestone_relationship_types + def get_url(course_id, handler_name='settings_handler'): return reverse_course_url(handler_name, course_id) @@ -171,6 +173,9 @@ class CourseDetailsViewTest(CourseTestCase): """ Tests for modifying content on the first course settings page (course dates, overview, etc.). """ + def setUp(self): + super(CourseDetailsViewTest, self).setUp() + def alter_field(self, url, details, field, val): """ Change the one field to the given value and then invoke the update post to see if it worked. @@ -243,6 +248,55 @@ class CourseDetailsViewTest(CourseTestCase): elif field in encoded and encoded[field] is not None: self.fail(field + " included in encoding but missing from details at " + context) + @mock.patch.dict("django.conf.settings.FEATURES", {'ENABLE_PREREQUISITE_COURSES': True, 'MILESTONES_APP': True}) + def test_pre_requisite_course_list_present(self): + seed_milestone_relationship_types() + settings_details_url = get_url(self.course.id) + response = self.client.get_html(settings_details_url) + self.assertContains(response, "Prerequisite Course") + + @mock.patch.dict("django.conf.settings.FEATURES", {'ENABLE_PREREQUISITE_COURSES': True, 'MILESTONES_APP': True}) + def test_pre_requisite_course_update_and_fetch(self): + seed_milestone_relationship_types() + url = get_url(self.course.id) + resp = self.client.get_json(url) + course_detail_json = json.loads(resp.content) + # assert pre_requisite_courses is initialized + self.assertEqual([], course_detail_json['pre_requisite_courses']) + + # update pre requisite courses with a new course keys + pre_requisite_course = CourseFactory.create(org='edX', course='900', run='test_run') + pre_requisite_course2 = CourseFactory.create(org='edX', course='902', run='test_run') + pre_requisite_course_keys = [unicode(pre_requisite_course.id), unicode(pre_requisite_course2.id)] + course_detail_json['pre_requisite_courses'] = pre_requisite_course_keys + self.client.ajax_post(url, course_detail_json) + + # fetch updated course to assert pre_requisite_courses has new values + resp = self.client.get_json(url) + course_detail_json = json.loads(resp.content) + self.assertEqual(pre_requisite_course_keys, course_detail_json['pre_requisite_courses']) + + # remove pre requisite course + course_detail_json['pre_requisite_courses'] = [] + self.client.ajax_post(url, course_detail_json) + resp = self.client.get_json(url) + course_detail_json = json.loads(resp.content) + self.assertEqual([], course_detail_json['pre_requisite_courses']) + + @mock.patch.dict("django.conf.settings.FEATURES", {'ENABLE_PREREQUISITE_COURSES': True, 'MILESTONES_APP': True}) + def test_invalid_pre_requisite_course(self): + seed_milestone_relationship_types() + url = get_url(self.course.id) + resp = self.client.get_json(url) + course_detail_json = json.loads(resp.content) + + # update pre requisite courses one valid and one invalid key + pre_requisite_course = CourseFactory.create(org='edX', course='900', run='test_run') + pre_requisite_course_keys = [unicode(pre_requisite_course.id), 'invalid_key'] + course_detail_json['pre_requisite_courses'] = pre_requisite_course_keys + response = self.client.ajax_post(url, course_detail_json) + self.assertEqual(400, response.status_code) + @ddt.ddt class CourseGradingTest(CourseTestCase): diff --git a/cms/djangoapps/contentstore/views/course.py b/cms/djangoapps/contentstore/views/course.py index b25cf6895f4..e13f1f1a870 100644 --- a/cms/djangoapps/contentstore/views/course.py +++ b/cms/djangoapps/contentstore/views/course.py @@ -74,6 +74,11 @@ from microsite_configuration import microsite from xmodule.course_module import CourseFields from xmodule.split_test_module import get_split_user_partitions +from util.milestones_helpers import ( + set_prerequisite_courses, + is_valid_course_key +) + MINIMUM_GROUP_ID = 100 # Note: the following content group configuration strings are not @@ -368,37 +373,10 @@ def _accessible_libraries_list(user): def course_listing(request): """ List all courses available to the logged in user - Try to get all courses by first reversing django groups and fallback to old method if it fails - Note: overhead of pymongo reads will increase if getting courses from django groups fails """ - if GlobalStaff().has_user(request.user): - # user has global access so no need to get courses from django groups - courses, in_process_course_actions = _accessible_courses_list(request) - else: - try: - courses, in_process_course_actions = _accessible_courses_list_from_groups(request) - except AccessListFallback: - # user have some old groups or there was some error getting courses from django groups - # so fallback to iterating through all courses - courses, in_process_course_actions = _accessible_courses_list(request) - + courses, in_process_course_actions = get_courses_accessible_to_user(request) libraries = _accessible_libraries_list(request.user) if LIBRARIES_ENABLED else [] - def format_course_for_view(course): - """ - Return a dict of the data which the view requires for each course - """ - return { - 'display_name': course.display_name, - 'course_key': unicode(course.location.course_key), - 'url': reverse_course_url('course_handler', course.id), - 'lms_link': get_lms_link_for_item(course.location), - 'rerun_link': _get_rerun_link_for_item(course.id), - 'org': course.display_org_with_default, - 'number': course.display_number_with_default, - 'run': course.location.run - } - def format_in_process_course_view(uca): """ Return a dict of the data which the view requires for each unsucceeded course @@ -433,14 +411,7 @@ def course_listing(request): 'can_edit': has_studio_write_access(request.user, library.location.library_key), } - # remove any courses in courses that are also in the in_process_course_actions list - in_process_action_course_keys = [uca.course_key for uca in in_process_course_actions] - courses = [ - format_course_for_view(c) - for c in courses - if not isinstance(c, ErrorDescriptor) and (c.id not in in_process_action_course_keys) - ] - + courses = _remove_in_process_courses(courses, in_process_course_actions) in_process_course_actions = [format_in_process_course_view(uca) for uca in in_process_course_actions] return render_to_response('index.html', { @@ -508,6 +479,53 @@ def course_index(request, course_key): }) +def get_courses_accessible_to_user(request): + """ + Try to get all courses by first reversing django groups and fallback to old method if it fails + Note: overhead of pymongo reads will increase if getting courses from django groups fails + """ + if GlobalStaff().has_user(request.user): + # user has global access so no need to get courses from django groups + courses, in_process_course_actions = _accessible_courses_list(request) + else: + try: + courses, in_process_course_actions = _accessible_courses_list_from_groups(request) + except AccessListFallback: + # user have some old groups or there was some error getting courses from django groups + # so fallback to iterating through all courses + courses, in_process_course_actions = _accessible_courses_list(request) + return courses, in_process_course_actions + + +def _remove_in_process_courses(courses, in_process_course_actions): + """ + removes any in-process courses in courses list. in-process actually refers to courses + that are in the process of being generated for re-run + """ + def format_course_for_view(course): + """ + Return a dict of the data which the view requires for each course + """ + return { + 'display_name': course.display_name, + 'course_key': unicode(course.location.course_key), + 'url': reverse_course_url('course_handler', course.id), + 'lms_link': get_lms_link_for_item(course.location), + 'rerun_link': _get_rerun_link_for_item(course.id), + 'org': course.display_org_with_default, + 'number': course.display_number_with_default, + 'run': course.location.run + } + + in_process_action_course_keys = [uca.course_key for uca in in_process_course_actions] + courses = [ + format_course_for_view(c) + for c in courses + if not isinstance(c, ErrorDescriptor) and (c.id not in in_process_action_course_keys) + ] + return courses + + def course_outline_initial_state(locator_to_show, course_structure): """ Returns the desired initial state for the course outline view. If the 'show' request parameter @@ -783,6 +801,7 @@ def settings_handler(request, course_key_string): json: update the Course and About xblocks through the CourseDetails model """ course_key = CourseKey.from_string(course_key_string) + prerequisite_course_enabled = settings.FEATURES.get('ENABLE_PREREQUISITE_COURSES', False) with modulestore().bulk_operations(course_key): course_module = get_course_and_check_access(course_key, request.user) if 'text/html' in request.META.get('HTTP_ACCEPT', '') and request.method == 'GET': @@ -797,8 +816,7 @@ def settings_handler(request, course_key_string): ) short_description_editable = settings.FEATURES.get('EDITABLE_SHORT_DESCRIPTION', True) - - return render_to_response('settings.html', { + settings_context = { 'context_course': course_module, 'course_locator': course_key, 'lms_link_for_about_page': utils.get_lms_link_for_about_page(course_key), @@ -807,15 +825,31 @@ def settings_handler(request, course_key_string): 'about_page_editable': about_page_editable, 'short_description_editable': short_description_editable, 'upload_asset_url': upload_asset_url - }) + } + if prerequisite_course_enabled: + courses, in_process_course_actions = get_courses_accessible_to_user(request) + # exclude current course from the list of available courses + courses = [course for course in courses if course.id != course_key] + if courses: + courses = _remove_in_process_courses(courses, in_process_course_actions) + settings_context.update({'possible_pre_requisite_courses': courses}) + + return render_to_response('settings.html', settings_context) elif 'application/json' in request.META.get('HTTP_ACCEPT', ''): if request.method == 'GET': + course_details = CourseDetails.fetch(course_key) return JsonResponse( - CourseDetails.fetch(course_key), + course_details, # encoder serializes dates, old locations, and instances encoder=CourseSettingsEncoder ) else: # post or put, doesn't matter. + # if pre-requisite course feature is enabled set pre-requisite course + if prerequisite_course_enabled: + prerequisite_course_keys = request.json.get('pre_requisite_courses', []) + if not all(is_valid_course_key(course_key) for course_key in prerequisite_course_keys): + return JsonResponseBadRequest({"error": _("Invalid prerequisite course key")}) + set_prerequisite_courses(course_key, prerequisite_course_keys) return JsonResponse( CourseDetails.update_from_json(course_key, request.json, request.user), encoder=CourseSettingsEncoder diff --git a/cms/djangoapps/models/settings/course_details.py b/cms/djangoapps/models/settings/course_details.py index 21f344f706b..509c2df6a26 100644 --- a/cms/djangoapps/models/settings/course_details.py +++ b/cms/djangoapps/models/settings/course_details.py @@ -39,6 +39,7 @@ class CourseDetails(object): self.effort = None # int hours/week self.course_image_name = "" self.course_image_asset_path = "" # URL of the course image + self.pre_requisite_courses = [] # pre-requisite courses @classmethod def _fetch_about_attribute(cls, course_key, attribute): @@ -64,6 +65,7 @@ class CourseDetails(object): course_details.end_date = descriptor.end course_details.enrollment_start = descriptor.enrollment_start course_details.enrollment_end = descriptor.enrollment_end + course_details.pre_requisite_courses = descriptor.pre_requisite_courses course_details.course_image_name = descriptor.course_image course_details.course_image_asset_path = course_image_url(descriptor) @@ -155,6 +157,11 @@ class CourseDetails(object): descriptor.course_image = jsondict['course_image_name'] dirty = True + if 'pre_requisite_courses' in jsondict \ + and sorted(jsondict['pre_requisite_courses']) != sorted(descriptor.pre_requisite_courses): + descriptor.pre_requisite_courses = jsondict['pre_requisite_courses'] + dirty = True + if dirty: module_store.update_item(descriptor, user.id) diff --git a/cms/djangoapps/models/settings/course_metadata.py b/cms/djangoapps/models/settings/course_metadata.py index 23320d1580d..f7b63570afa 100644 --- a/cms/djangoapps/models/settings/course_metadata.py +++ b/cms/djangoapps/models/settings/course_metadata.py @@ -33,6 +33,7 @@ class CourseMetadata(object): 'tags', # from xblock 'visible_to_staff_only', 'group_access', + 'pre_requisite_courses' ] @classmethod diff --git a/cms/envs/bok_choy.py b/cms/envs/bok_choy.py index f6235715338..6b6470e78b1 100644 --- a/cms/envs/bok_choy.py +++ b/cms/envs/bok_choy.py @@ -54,6 +54,12 @@ for log_name, log_level in LOG_OVERRIDES: # Use the auto_auth workflow for creating users and logging them in FEATURES['AUTOMATIC_AUTH_FOR_TESTING'] = True +# Enable milestones app +FEATURES['MILESTONES_APP'] = True + +# Enable pre-requisite course +FEATURES['ENABLE_PREREQUISITE_COURSES'] = True + # Unfortunately, we need to use debug mode to serve staticfiles DEBUG = True diff --git a/cms/envs/common.py b/cms/envs/common.py index 3aea5b983ba..2f5a676e410 100644 --- a/cms/envs/common.py +++ b/cms/envs/common.py @@ -128,6 +128,12 @@ FEATURES = { # DEFAULT_STORE_FOR_NEW_COURSE to be 'split' to have future courses # and libraries created with split. 'ENABLE_CONTENT_LIBRARIES': False, + + # Milestones application flag + 'MILESTONES_APP': False, + + # Prerequisite courses feature flag + 'ENABLE_PREREQUISITE_COURSES': False, } ENABLE_JASMINE = False @@ -744,7 +750,8 @@ OPTIONAL_APPS = ( 'openassessment.xblock', # edxval - 'edxval' + 'edxval', + 'milestones' ) diff --git a/cms/envs/test.py b/cms/envs/test.py index 58c361c0b53..e3a32943603 100644 --- a/cms/envs/test.py +++ b/cms/envs/test.py @@ -155,6 +155,9 @@ CACHES = { # Add external_auth to Installed apps for testing INSTALLED_APPS += ('external_auth', ) +# Add milestones to Installed apps for testing +INSTALLED_APPS += ('milestones', ) + # hide ratelimit warnings while running tests filterwarnings('ignore', message='No request passed to the backend, unable to rate-limit') diff --git a/cms/static/js/models/settings/course_details.js b/cms/static/js/models/settings/course_details.js index 3957940b5dc..58b58fb7af6 100644 --- a/cms/static/js/models/settings/course_details.js +++ b/cms/static/js/models/settings/course_details.js @@ -15,7 +15,8 @@ var CourseDetails = Backbone.Model.extend({ intro_video: null, effort: null, // an int or null, course_image_name: '', // the filename - course_image_asset_path: '' // the full URL (/c4x/org/course/num/asset/filename) + course_image_asset_path: '', // the full URL (/c4x/org/course/num/asset/filename) + pre_requisite_courses: [] }, validate: function(newattrs) { diff --git a/cms/static/js/spec/views/settings/main_spec.js b/cms/static/js/spec/views/settings/main_spec.js index c3066f4fa61..7fea35e8483 100644 --- a/cms/static/js/spec/views/settings/main_spec.js +++ b/cms/static/js/spec/views/settings/main_spec.js @@ -4,7 +4,7 @@ define([ ], function($, CourseDetailsModel, MainView, AjaxHelpers) { 'use strict'; describe('Settings/Main', function () { - var urlRoot = '/course-details', + var urlRoot = '/course/settings/org/DemoX/Demo_Course', modelData = { start_date: "2014-10-05T00:00:00Z", end_date: "2014-11-05T20:00:00Z", @@ -19,7 +19,8 @@ define([ intro_video : null, effort : null, course_image_name : '', - course_image_asset_path : '' + course_image_asset_path : '', + pre_requisite_courses : [] }, mockSettingsPage = readFixtures('mock/mock-settings-page.underscore'); @@ -47,7 +48,6 @@ define([ // Expect to see changes just in `start_date` field. start_date: "2014-10-05T22:00:00.000Z" }); - this.view.$el.find('#course-start-time') .val('22:00') .trigger('input'); @@ -56,8 +56,25 @@ define([ // It sends `POST` request, because the model doesn't have `id`. In // this case, it is considered to be new according to Backbone documentation. AjaxHelpers.expectJsonRequest( - requests, 'POST', '/course-details', expectedJson + requests, 'POST', urlRoot, expectedJson + ); + }); + + it('Selecting a course in pre-requisite drop down should save it as part of course details', function () { + var pre_requisite_courses = ['test/CSS101/2012_T1']; + var requests = AjaxHelpers.requests(this), + expectedJson = $.extend(true, {}, modelData, { + pre_requisite_courses: pre_requisite_courses + }); + this.view.$el.find('#pre-requisite-course') + .val(pre_requisite_courses[0]) + .trigger('change'); + + this.view.saveView(); + AjaxHelpers.expectJsonRequest( + requests, 'POST', urlRoot, expectedJson ); + AjaxHelpers.respondWithJson(requests, expectedJson); }); }); }); diff --git a/cms/static/js/views/settings/main.js b/cms/static/js/views/settings/main.js index 594a9689923..8e10e49221b 100644 --- a/cms/static/js/views/settings/main.js +++ b/cms/static/js/views/settings/main.js @@ -10,6 +10,7 @@ var DetailsView = ValidatingView.extend({ // Leaving change in as fallback for older browsers "change input" : "updateModel", "change textarea" : "updateModel", + "change select" : "updateModel", 'click .remove-course-introduction-video' : "removeVideo", 'focus #course-overview' : "codeMirrorize", 'mouseover .timezone' : "updateTime", @@ -63,6 +64,9 @@ var DetailsView = ValidatingView.extend({ var imageURL = this.model.get('course_image_asset_path'); this.$el.find('#course-image-url').val(imageURL); this.$el.find('#course-image').attr('src', imageURL); + var pre_requisite_courses = this.model.get('pre_requisite_courses'); + pre_requisite_courses = pre_requisite_courses.length > 0 ? pre_requisite_courses : ''; + this.$el.find('#' + this.fieldToSelectorMap['pre_requisite_courses']).val(pre_requisite_courses); return this; }, @@ -75,7 +79,8 @@ var DetailsView = ValidatingView.extend({ 'short_description' : 'course-short-description', 'intro_video' : 'course-introduction-video', 'effort' : "course-effort", - 'course_image_asset_path': 'course-image-url' + 'course_image_asset_path': 'course-image-url', + 'pre_requisite_courses': 'pre-requisite-course' }, updateTime : function(e) { @@ -154,6 +159,11 @@ var DetailsView = ValidatingView.extend({ case 'course-short-description': this.setField(event); break; + case 'pre-requisite-course': + var value = $(event.currentTarget).val(); + value = value == "" ? [] : [value]; + this.model.set('pre_requisite_courses', value); + break; // Don't make the user reload the page to check the Youtube ID. // Wait for a second to load the video, avoiding egregious AJAX calls. case 'course-introduction-video': diff --git a/cms/templates/js/mock/mock-settings-page.underscore b/cms/templates/js/mock/mock-settings-page.underscore index 67835a9ee73..be45253da1f 100644 --- a/cms/templates/js/mock/mock-settings-page.underscore +++ b/cms/templates/js/mock/mock-settings-page.underscore @@ -62,6 +62,19 @@ <span class="tip tip-stacked timezone">(UTC)</span> </div> </li> + <li> + <li class="field field-select" id="field-pre-requisite-course"> + <label for="pre-requisite-course" class="">Prerequisite Course</label> + <select class="input" id="pre-requisite-course"> + <option value="">None</option> + <option value="test/CSS101/2012_T1">[Test] Communicating for Impact</option> + <option value="Test/3423/2014_T2">CohortAverageTesting</option> + <option value="edX/Open_DemoX/edx_demo_course">edX Demonstration Course</option> + </select> + <span class="tip tip-inline">Course that students must complete before beginning this course</span> + <button type="submit" class="sr" name="submit" value="submit">set pre-requisite course</button> + </li> + </li> </ol> </section> </form> diff --git a/cms/templates/settings.html b/cms/templates/settings.html index 72ed7e2cf8d..280a71b7bd8 100644 --- a/cms/templates/settings.html +++ b/cms/templates/settings.html @@ -307,6 +307,21 @@ CMS.URL.UPLOAD_ASSET = '${upload_asset_url}'; <input type="text" class="short time" id="course-effort" placeholder="HH:MM" /> <span class="tip tip-inline">${_("Time spent on all course work")}</span> </li> + % if settings.FEATURES.get('ENABLE_PREREQUISITE_COURSES'): + <li class="field field-select" id="field-pre-requisite-course"> + <form action="#" class="pre-requisite-course-form" method="post"> + <label for="pre-requisite-course">${_("Prerequisite Course")}</label> + <select class="input" id="pre-requisite-course"> + <option value="">${_("None")}</option> + % for course_info in sorted(possible_pre_requisite_courses, key=lambda s: s['display_name'].lower() if s['display_name'] is not None else ''): + <option value="${course_info['course_key']}">${course_info['display_name']}</option> + % endfor + </select> + <span class="tip tip-inline">${_("Course that students must complete before beginning this course")}</span> + <button type="submit" class="sr" name="submit" value="submit">${_("set pre-requisite course")}</button> + </form> + </li> + % endif </ol> </section> % endif diff --git a/common/djangoapps/student/tests/test_course_listing.py b/common/djangoapps/student/tests/test_course_listing.py index b73067cbd08..35dd4b1b80b 100644 --- a/common/djangoapps/student/tests/test_course_listing.py +++ b/common/djangoapps/student/tests/test_course_listing.py @@ -2,6 +2,7 @@ Unit tests for getting the list of courses for a user through iterating all courses and by reversing group name formats. """ +import mock from mock import patch, Mock from student.tests.factories import UserFactory @@ -15,6 +16,12 @@ from xmodule.error_module import ErrorDescriptor from django.test.client import Client from student.models import CourseEnrollment from student.views import get_course_enrollment_pairs +from opaque_keys.edx.keys import CourseKey +from util.milestones_helpers import ( + get_pre_requisite_courses_not_completed, + set_prerequisite_courses, + seed_milestone_relationship_types +) import unittest from django.conf import settings @@ -35,14 +42,16 @@ class TestCourseListing(ModuleStoreTestCase): self.client = Client() self.client.login(username=self.teacher.username, password='test') - def _create_course_with_access_groups(self, course_location): + def _create_course_with_access_groups(self, course_location, metadata=None): """ Create dummy course with 'CourseFactory' and enroll the student """ + metadata = {} if not metadata else metadata course = CourseFactory.create( org=course_location.org, number=course_location.course, - run=course_location.run + run=course_location.run, + metadata=metadata ) CourseEnrollment.enroll(self.student, course.id) @@ -119,3 +128,38 @@ class TestCourseListing(ModuleStoreTestCase): courses_list = list(get_course_enrollment_pairs(self.student, None, [])) self.assertEqual(len(courses_list), 1, courses_list) self.assertEqual(courses_list[0][0].id, good_location) + + @mock.patch.dict("django.conf.settings.FEATURES", {'ENABLE_PREREQUISITE_COURSES': True, 'MILESTONES_APP': True}) + def test_course_listing_has_pre_requisite_courses(self): + """ + Creates four courses. Enroll test user in all courses + Sets two of them as pre-requisites of another course. + Checks course where pre-requisite course is set has appropriate info. + """ + seed_milestone_relationship_types() + course_location2 = CourseKey.from_string('Org1/Course2/Run2') + self._create_course_with_access_groups(course_location2) + pre_requisite_course_location = CourseKey.from_string('Org1/Course3/Run3') + self._create_course_with_access_groups(pre_requisite_course_location) + pre_requisite_course_location2 = CourseKey.from_string('Org1/Course4/Run4') + self._create_course_with_access_groups(pre_requisite_course_location2) + # create a course with pre_requisite_courses + pre_requisite_courses = [ + unicode(pre_requisite_course_location), + unicode(pre_requisite_course_location2), + ] + course_location = CourseKey.from_string('Org1/Course1/Run1') + self._create_course_with_access_groups(course_location, { + 'pre_requisite_courses': pre_requisite_courses + }) + + set_prerequisite_courses(course_location, pre_requisite_courses) + # get dashboard + course_enrollment_pairs = list(get_course_enrollment_pairs(self.student, None, [])) + courses_having_prerequisites = frozenset(course.id for course, _enrollment in course_enrollment_pairs + if course.pre_requisite_courses) + courses_requirements_not_met = get_pre_requisite_courses_not_completed( + self.student, + courses_having_prerequisites + ) + self.assertEqual(len(courses_requirements_not_met[course_location]['courses']), len(pre_requisite_courses)) diff --git a/common/djangoapps/student/views.py b/common/djangoapps/student/views.py index 0cfae37aee2..9cebd02dcc7 100644 --- a/common/djangoapps/student/views.py +++ b/common/djangoapps/student/views.py @@ -89,7 +89,9 @@ import dogstats_wrapper as dog_stats_api from util.db import commit_on_success_with_read_committed from util.json_request import JsonResponse from util.bad_request_rate_limiter import BadRequestRateLimiter - +from util.milestones_helpers import ( + get_pre_requisite_courses_not_completed, +) from microsite_configuration import microsite from util.password_policy_validators import ( @@ -540,8 +542,11 @@ def dashboard(request): staff_access = True errored_courses = modulestore().get_errored_courses() - show_courseware_links_for = frozenset(course.id for course, _enrollment in course_enrollment_pairs - if has_access(request.user, 'load', course)) + show_courseware_links_for = frozenset( + course.id for course, _enrollment in course_enrollment_pairs + if has_access(request.user, 'load', course) + and has_access(request.user, 'view_courseware_with_prerequisites', course) + ) # Construct a dictionary of course mode information # used to render the course list. We re-use the course modes dict @@ -652,6 +657,11 @@ def dashboard(request): # Populate the Order History for the side-bar. order_history_list = order_history(user, course_org_filter=course_org_filter, org_filter_out_set=org_filter_out_set) + # get list of courses having pre-requisites yet to be completed + courses_having_prerequisites = frozenset(course.id for course, _enrollment in course_enrollment_pairs + if course.pre_requisite_courses) + courses_requirements_not_met = get_pre_requisite_courses_not_completed(user, courses_having_prerequisites) + context = { 'enrollment_message': enrollment_message, 'course_enrollment_pairs': course_enrollment_pairs, @@ -681,7 +691,8 @@ def dashboard(request): 'platform_name': settings.PLATFORM_NAME, 'enrolled_courses_either_paid': enrolled_courses_either_paid, 'provider_states': [], - 'order_history_list': order_history_list + 'order_history_list': order_history_list, + 'courses_requirements_not_met': courses_requirements_not_met, } if third_party_auth.is_enabled(): diff --git a/common/djangoapps/util/milestones_helpers.py b/common/djangoapps/util/milestones_helpers.py new file mode 100644 index 00000000000..8668c472ced --- /dev/null +++ b/common/djangoapps/util/milestones_helpers.py @@ -0,0 +1,167 @@ +# pylint: disable=invalid-name +""" +Helper methods for milestones api calls. +""" + +from django.conf import settings +from django.utils.translation import ugettext as _ +from opaque_keys import InvalidKeyError +from opaque_keys.edx.keys import CourseKey +from xmodule.modulestore.django import modulestore + +from milestones.api import ( + get_course_milestones, + add_milestone, + add_course_milestone, + remove_course_milestone, + get_course_milestones_fulfillment_paths, + add_user_milestone, + get_user_milestones, +) +from milestones.models import MilestoneRelationshipType + + +def add_prerequisite_course(course_key, prerequisite_course_key): + """ + It would create a milestone, then it would set newly created + milestones as requirement for course referred by `course_key` + and it would set newly created milestone as fulfilment + milestone for course referred by `prerequisite_course_key`. + """ + if settings.FEATURES.get('MILESTONES_APP', False): + # create a milestone + milestone = add_milestone({ + 'name': _('Course {} requires {}'.format(unicode(course_key), unicode(prerequisite_course_key))), + 'namespace': unicode(prerequisite_course_key), + 'description': _('System defined milestone'), + }) + # add requirement course milestone + add_course_milestone(course_key, 'requires', milestone) + + # add fulfillment course milestone + add_course_milestone(prerequisite_course_key, 'fulfills', milestone) + + +def remove_prerequisite_course(course_key, milestone): + """ + It would remove pre-requisite course milestone for course + referred by `course_key`. + """ + if settings.FEATURES.get('MILESTONES_APP', False): + remove_course_milestone( + course_key, + milestone, + ) + + +def set_prerequisite_courses(course_key, prerequisite_course_keys): + """ + It would remove any existing requirement milestones for the given `course_key` + and create new milestones for each pre-requisite course in `prerequisite_course_keys`. + To only remove course milestones pass `course_key` and empty list or + None as `prerequisite_course_keys` . + """ + if settings.FEATURES.get('MILESTONES_APP', False): + #remove any existing requirement milestones with this pre-requisite course as requirement + course_milestones = get_course_milestones(course_key=course_key, relationship="requires") + if course_milestones: + for milestone in course_milestones: + remove_prerequisite_course(course_key, milestone) + + # add milestones if pre-requisite course is selected + if prerequisite_course_keys: + for prerequisite_course_key_string in prerequisite_course_keys: + prerequisite_course_key = CourseKey.from_string(prerequisite_course_key_string) + add_prerequisite_course(course_key, prerequisite_course_key) + + +def get_pre_requisite_courses_not_completed(user, enrolled_courses): + """ + It would make dict of prerequisite courses not completed by user among courses + user has enrolled in. It calls the fulfilment api of milestones app and + iterates over all fulfilment milestones not achieved to make dict of + prerequisite courses yet to be completed. + """ + pre_requisite_courses = {} + if settings.FEATURES.get('ENABLE_PREREQUISITE_COURSES'): + for course_key in enrolled_courses: + required_courses = [] + fulfilment_paths = get_course_milestones_fulfillment_paths(course_key, {'id': user.id}) + for milestone_key, milestone_value in fulfilment_paths.items(): # pylint: disable=unused-variable + for key, value in milestone_value.items(): + if key == 'courses' and value: + for required_course in value: + required_course_key = CourseKey.from_string(required_course) + required_course_descriptor = modulestore().get_course(required_course_key) + required_courses.append({ + 'key': required_course_key, + 'display': get_course_display_name(required_course_descriptor) + }) + + # if there are required courses add to dict + if required_courses: + pre_requisite_courses[course_key] = {'courses': required_courses} + return pre_requisite_courses + + +def get_prerequisite_courses_display(course_descriptor): + """ + It would retrieve pre-requisite courses, make display strings + and return them as list + """ + pre_requisite_courses = [] + if settings.FEATURES.get('ENABLE_PREREQUISITE_COURSES', False) and course_descriptor.pre_requisite_courses: + for course_id in course_descriptor.pre_requisite_courses: + course_key = CourseKey.from_string(course_id) + required_course_descriptor = modulestore().get_course(course_key) + pre_requisite_courses.append(get_course_display_name(required_course_descriptor)) + return pre_requisite_courses + + +def get_course_display_name(descriptor): + """ + It would return display name from given course descriptor + """ + return ' '.join([ + descriptor.display_org_with_default, + descriptor.display_number_with_default + ]) + + +def fulfill_course_milestone(course_key, user): + """ + Marks the course specified by the given course_key as complete for the given user. + If any other courses require this course as a prerequisite, their milestones will be appropriately updated. + """ + if settings.FEATURES.get('MILESTONES_APP', False): + course_milestones = get_course_milestones(course_key=course_key, relationship="fulfills") + for milestone in course_milestones: + add_user_milestone({'id': user.id}, milestone) + + +def milestones_achieved_by_user(user, namespace): + """ + It would fetch list of milestones completed by user + """ + if settings.FEATURES.get('MILESTONES_APP', False): + return get_user_milestones({'id': user.id}, namespace) + + +def is_valid_course_key(key): + """ + validates course key. returns True if valid else False. + """ + try: + course_key = CourseKey.from_string(key) + except InvalidKeyError: + course_key = key + return isinstance(course_key, CourseKey) + + +def seed_milestone_relationship_types(): + """ + Helper method to pre-populate MRTs so the tests can run + """ + if settings.FEATURES.get('MILESTONES_APP', False): + MilestoneRelationshipType.objects.create(name='requires') + MilestoneRelationshipType.objects.create(name='fulfills') diff --git a/common/lib/xmodule/xmodule/course_module.py b/common/lib/xmodule/xmodule/course_module.py index e51b6e7d3e9..cb445883e10 100644 --- a/common/lib/xmodule/xmodule/course_module.py +++ b/common/lib/xmodule/xmodule/course_module.py @@ -184,6 +184,11 @@ class CourseFields(object): help=_("Enter the date you want to advertise as the course start date, if this date is different from the set start date. To advertise the set start date, enter null."), scope=Scope.settings ) + pre_requisite_courses = List( + display_name=_("Pre-Requisite Courses"), + help=_("Pre-Requisite Course key if this course has a pre-requisite course"), + scope=Scope.settings + ) grading_policy = Dict( help="Grading policy definition for this class", default={ diff --git a/common/lib/xmodule/xmodule/templates/about/overview.yaml b/common/lib/xmodule/xmodule/templates/about/overview.yaml index ac64f3eb785..6eba22fb652 100644 --- a/common/lib/xmodule/xmodule/templates/about/overview.yaml +++ b/common/lib/xmodule/xmodule/templates/about/overview.yaml @@ -11,8 +11,8 @@ data: | </section> <section class="prerequisites"> - <h2>Prerequisites</h2> - <p>Add information about course prerequisites here.</p> + <h2>Requirements</h2> + <p>Add information about the skills and knowledge students need to take this course.</p> </section> <section class="course-staff"> diff --git a/common/test/acceptance/pages/lms/dashboard.py b/common/test/acceptance/pages/lms/dashboard.py index 4d810c98a91..dd7706adaed 100644 --- a/common/test/acceptance/pages/lms/dashboard.py +++ b/common/test/acceptance/pages/lms/dashboard.py @@ -95,3 +95,9 @@ class DashboardPage(PageObject): modal_is_visible = self.q(css='section#change_language.modal').visible return (language_is_selected and not modal_is_visible) return EmptyPromise(_check_func, "language changed and modal hidden") + + def pre_requisite_message_displayed(self): + """ + Verify if pre-requisite course messages are being displayed. + """ + return self.q(css='section.prerequisites > .tip').visible diff --git a/common/test/acceptance/pages/studio/settings.py b/common/test/acceptance/pages/studio/settings.py index 2af5c0c3783..96d5bd23016 100644 --- a/common/test/acceptance/pages/studio/settings.py +++ b/common/test/acceptance/pages/studio/settings.py @@ -3,6 +3,7 @@ Course Schedule and Details Settings page. """ from .course_page import CoursePage +from .utils import press_the_notification_button class SettingsPage(CoursePage): @@ -14,3 +15,22 @@ class SettingsPage(CoursePage): def is_browser_on_page(self): return self.q(css='body.view-settings').present + + @property + def pre_requisite_course(self): + """ + Returns the pre-requisite course drop down field. + """ + return self.q(css='#pre-requisite-course') + + def save_changes(self): + """ + Clicks save button. + """ + press_the_notification_button(self, "save") + + def refresh_page(self): + """ + Reload the page. + """ + self.browser.refresh() diff --git a/common/test/acceptance/tests/helpers.py b/common/test/acceptance/tests/helpers.py index 83eb53a03a1..b0851c4d3e8 100644 --- a/common/test/acceptance/tests/helpers.py +++ b/common/test/acceptance/tests/helpers.py @@ -196,6 +196,31 @@ def get_options(select_browser_query): return Select(select_browser_query.first.results[0]).options +def generate_course_key(org, number, run): + """ + Makes a CourseLocator from org, number and run + """ + default_store = os.environ.get('DEFAULT_STORE', 'draft') + return CourseLocator(org, number, run, deprecated=(default_store == 'draft')) + + +def select_option_by_value(browser_query, value): + """ + Selects a html select element by matching value attribute + """ + select = Select(browser_query.first.results[0]) + select.select_by_value(value) + + +def is_option_value_selected(browser_query, value): + """ + return true if given value is selected in html select element, else return false. + """ + select = Select(browser_query.first.results[0]) + ddl_selected_value = select.first_selected_option.get_attribute('value') + return ddl_selected_value == value + + class UniqueCourseTest(WebAppTest): """ Test that provides a unique course ID. diff --git a/common/test/acceptance/tests/lms/test_lms.py b/common/test/acceptance/tests/lms/test_lms.py index cf3be2d1938..307d973d640 100644 --- a/common/test/acceptance/tests/lms/test_lms.py +++ b/common/test/acceptance/tests/lms/test_lms.py @@ -8,7 +8,13 @@ from unittest import skip from nose.plugins.attrib import attr from bok_choy.web_app_test import WebAppTest -from ..helpers import UniqueCourseTest, load_data_str +from bok_choy.promise import EmptyPromise +from ..helpers import ( + UniqueCourseTest, + load_data_str, + generate_course_key, + select_option_by_value, +) from ...pages.lms.auto_auth import AutoAuthPage from ...pages.common.logout import LogoutPage from ...pages.lms.find_courses import FindCoursesPage @@ -22,6 +28,7 @@ from ...pages.lms.problem import ProblemPage from ...pages.lms.video.video import VideoPage from ...pages.lms.courseware import CoursewarePage from ...pages.lms.login_and_register import CombinedLoginAndRegisterPage +from ...pages.studio.settings import SettingsPage from ...fixtures.course import CourseFixture, XBlockFixtureDesc, CourseUpdateDesc @@ -604,6 +611,90 @@ class TooltipTest(UniqueCourseTest): self.assertTrue(self.courseware_page.tooltips_displayed()) +class PreRequisiteCourseTest(UniqueCourseTest): + """ + Tests that pre-requisite course messages are displayed + """ + + def setUp(self): + """ + Initialize pages and install a course fixture. + """ + super(PreRequisiteCourseTest, self).setUp() + + CourseFixture( + self.course_info['org'], self.course_info['number'], + self.course_info['run'], self.course_info['display_name'] + ).install() + + self.prc_info = { + 'org': 'test_org', + 'number': self.unique_id, + 'run': 'prc_test_run', + 'display_name': 'PR Test Course' + self.unique_id + } + + CourseFixture( + self.prc_info['org'], self.prc_info['number'], + self.prc_info['run'], self.prc_info['display_name'] + ).install() + + pre_requisite_course_key = generate_course_key( + self.prc_info['org'], + self.prc_info['number'], + self.prc_info['run'] + ) + self.pre_requisite_course_id = unicode(pre_requisite_course_key) + + self.dashboard_page = DashboardPage(self.browser) + self.settings_page = SettingsPage( + self.browser, + self.course_info['org'], + self.course_info['number'], + self.course_info['run'] + + ) + # Auto-auth register for the course + AutoAuthPage(self.browser, course_id=self.course_id).visit() + + def test_dashboard_message(self): + """ + Scenario: Any course where there is a Pre-Requisite course Student dashboard should have + appropriate messaging. + Given that I am on the Student dashboard + When I view a course with a pre-requisite course set + Then At the bottom of course I should see course requirements message.' + """ + + # visit dashboard page and make sure there is not pre-requisite course message + self.dashboard_page.visit() + self.assertFalse(self.dashboard_page.pre_requisite_message_displayed()) + + # Logout and login as a staff. + LogoutPage(self.browser).visit() + AutoAuthPage(self.browser, course_id=self.course_id, staff=True).visit() + + # visit course settings page and set pre-requisite course + self.settings_page.visit() + self._set_pre_requisite_course() + + # Logout and login as a student. + LogoutPage(self.browser).visit() + AutoAuthPage(self.browser, course_id=self.course_id, staff=False).visit() + + # visit dashboard page again now it should have pre-requisite course message + self.dashboard_page.visit() + EmptyPromise(lambda: self.dashboard_page.available_courses > 0, 'Dashboard page loaded').fulfill() + self.assertTrue(self.dashboard_page.pre_requisite_message_displayed()) + + def _set_pre_requisite_course(self): + """ + set pre-requisite course + """ + select_option_by_value(self.settings_page.pre_requisite_course, self.pre_requisite_course_id) + self.settings_page.save_changes() + + class ProblemExecutionTest(UniqueCourseTest): """ Tests of problems. diff --git a/common/test/acceptance/tests/studio/test_studio_settings_details.py b/common/test/acceptance/tests/studio/test_studio_settings_details.py new file mode 100644 index 00000000000..6fd0225ca62 --- /dev/null +++ b/common/test/acceptance/tests/studio/test_studio_settings_details.py @@ -0,0 +1,84 @@ +""" +Acceptance tests for Studio's Settings Details pages +""" +from acceptance.tests.studio.base_studio_test import StudioCourseTest +from ...fixtures.course import CourseFixture +from ..helpers import ( + generate_course_key, + select_option_by_value, + is_option_value_selected +) + +from ...pages.studio.settings import SettingsPage + + +class SettingsMilestonesTest(StudioCourseTest): + """ + Tests for milestones feature in Studio's settings tab + """ + def setUp(self, is_staff=True): + super(SettingsMilestonesTest, self).setUp(is_staff=is_staff) + self.settings_detail = SettingsPage( + self.browser, + self.course_info['org'], + self.course_info['number'], + self.course_info['run'] + ) + + # Before every test, make sure to visit the page first + self.settings_detail.visit() + self.assertTrue(self.settings_detail.is_browser_on_page()) + + def test_page_has_prerequisite_field(self): + """ + Test to make sure page has pre-requisite course field if milestones app is enabled. + """ + + self.assertTrue(self.settings_detail.pre_requisite_course.present) + + def test_prerequisite_course_save_successfully(self): + """ + Scenario: Selecting course from Pre-Requisite course drop down save the selected course as pre-requisite + course. + Given that I am on the Schedule & Details page on studio + When I select an item in pre-requisite course drop down and click Save Changes button + Then My selected item should be saved as pre-requisite course + And My selected item should be selected after refreshing the page.' + """ + course_number = self.unique_id + CourseFixture( + org='test_org', + number=course_number, + run='test_run', + display_name='Test Course' + course_number + ).install() + + pre_requisite_course_key = generate_course_key( + org='test_org', + number=course_number, + run='test_run' + ) + pre_requisite_course_id = unicode(pre_requisite_course_key) + + # refreshing the page after creating a course fixture, in order reload the pre requisite course drop down. + self.settings_detail.refresh_page() + select_option_by_value( + browser_query=self.settings_detail.pre_requisite_course, + value=pre_requisite_course_id + ) + + # trigger the save changes button. + self.settings_detail.save_changes() + + self.assertTrue('Your changes have been saved.' in self.settings_detail.browser.page_source) + self.settings_detail.refresh_page() + self.assertTrue(is_option_value_selected(browser_query=self.settings_detail.pre_requisite_course, + value=pre_requisite_course_id)) + + # now reset/update the pre requisite course to none + select_option_by_value(browser_query=self.settings_detail.pre_requisite_course, value='') + + # trigger the save changes button. + self.settings_detail.save_changes() + self.assertTrue('Your changes have been saved.' in self.settings_detail.browser.page_source) + self.assertTrue(is_option_value_selected(browser_query=self.settings_detail.pre_requisite_course, value='')) diff --git a/common/test/db_cache/bok_choy_data.json b/common/test/db_cache/bok_choy_data.json index ac7cb2495ca..091f4ca99d9 100644 --- a/common/test/db_cache/bok_choy_data.json +++ b/common/test/db_cache/bok_choy_data.json @@ -1 +1 @@ -[{"pk": 62, "model": "contenttypes.contenttype", "fields": {"model": "accesstoken", "name": "access token", "app_label": "oauth2"}}, {"pk": 128, "model": "contenttypes.contenttype", "fields": {"model": "aiclassifier", "name": "ai classifier", "app_label": "assessment"}}, {"pk": 127, "model": "contenttypes.contenttype", "fields": {"model": "aiclassifierset", "name": "ai classifier set", "app_label": "assessment"}}, {"pk": 130, "model": "contenttypes.contenttype", "fields": {"model": "aigradingworkflow", "name": "ai grading workflow", "app_label": "assessment"}}, {"pk": 129, "model": "contenttypes.contenttype", "fields": {"model": "aitrainingworkflow", "name": "ai training workflow", "app_label": "assessment"}}, {"pk": 33, "model": "contenttypes.contenttype", "fields": {"model": "anonymoususerid", "name": "anonymous user id", "app_label": "student"}}, {"pk": 65, "model": "contenttypes.contenttype", "fields": {"model": "article", "name": "article", "app_label": "wiki"}}, {"pk": 66, "model": "contenttypes.contenttype", "fields": {"model": "articleforobject", "name": "Article for object", "app_label": "wiki"}}, {"pk": 69, "model": "contenttypes.contenttype", "fields": {"model": "articleplugin", "name": "article plugin", "app_label": "wiki"}}, {"pk": 67, "model": "contenttypes.contenttype", "fields": {"model": "articlerevision", "name": "article revision", "app_label": "wiki"}}, {"pk": 74, "model": "contenttypes.contenttype", "fields": {"model": "articlesubscription", "name": "article subscription", "app_label": "wiki"}}, {"pk": 118, "model": "contenttypes.contenttype", "fields": {"model": "assessment", "name": "assessment", "app_label": "assessment"}}, {"pk": 121, "model": "contenttypes.contenttype", "fields": {"model": "assessmentfeedback", "name": "assessment feedback", "app_label": "assessment"}}, {"pk": 120, "model": "contenttypes.contenttype", "fields": {"model": "assessmentfeedbackoption", "name": "assessment feedback option", "app_label": "assessment"}}, {"pk": 119, "model": "contenttypes.contenttype", "fields": {"model": "assessmentpart", "name": "assessment part", "app_label": "assessment"}}, {"pk": 131, "model": "contenttypes.contenttype", "fields": {"model": "assessmentworkflow", "name": "assessment workflow", "app_label": "workflow"}}, {"pk": 132, "model": "contenttypes.contenttype", "fields": {"model": "assessmentworkflowstep", "name": "assessment workflow step", "app_label": "workflow"}}, {"pk": 19, "model": "contenttypes.contenttype", "fields": {"model": "association", "name": "association", "app_label": "django_openid_auth"}}, {"pk": 24, "model": "contenttypes.contenttype", "fields": {"model": "association", "name": "association", "app_label": "default"}}, {"pk": 96, "model": "contenttypes.contenttype", "fields": {"model": "certificateitem", "name": "certificate item", "app_label": "shoppingcart"}}, {"pk": 48, "model": "contenttypes.contenttype", "fields": {"model": "certificatewhitelist", "name": "certificate whitelist", "app_label": "certificates"}}, {"pk": 60, "model": "contenttypes.contenttype", "fields": {"model": "client", "name": "client", "app_label": "oauth2"}}, {"pk": 25, "model": "contenttypes.contenttype", "fields": {"model": "code", "name": "code", "app_label": "default"}}, {"pk": 4, "model": "contenttypes.contenttype", "fields": {"model": "contenttype", "name": "content type", "app_label": "contenttypes"}}, {"pk": 90, "model": "contenttypes.contenttype", "fields": {"model": "coupon", "name": "coupon", "app_label": "shoppingcart"}}, {"pk": 91, "model": "contenttypes.contenttype", "fields": {"model": "couponredemption", "name": "coupon redemption", "app_label": "shoppingcart"}}, {"pk": 45, "model": "contenttypes.contenttype", "fields": {"model": "courseaccessrole", "name": "course access role", "app_label": "student"}}, {"pk": 58, "model": "contenttypes.contenttype", "fields": {"model": "courseauthorization", "name": "course authorization", "app_label": "bulk_email"}}, {"pk": 55, "model": "contenttypes.contenttype", "fields": {"model": "courseemail", "name": "course email", "app_label": "bulk_email"}}, {"pk": 57, "model": "contenttypes.contenttype", "fields": {"model": "courseemailtemplate", "name": "course email template", "app_label": "bulk_email"}}, {"pk": 43, "model": "contenttypes.contenttype", "fields": {"model": "courseenrollment", "name": "course enrollment", "app_label": "student"}}, {"pk": 44, "model": "contenttypes.contenttype", "fields": {"model": "courseenrollmentallowed", "name": "course enrollment allowed", "app_label": "student"}}, {"pk": 99, "model": "contenttypes.contenttype", "fields": {"model": "coursemode", "name": "course mode", "app_label": "course_modes"}}, {"pk": 100, "model": "contenttypes.contenttype", "fields": {"model": "coursemodesarchive", "name": "course modes archive", "app_label": "course_modes"}}, {"pk": 93, "model": "contenttypes.contenttype", "fields": {"model": "courseregcodeitem", "name": "course reg code item", "app_label": "shoppingcart"}}, {"pk": 94, "model": "contenttypes.contenttype", "fields": {"model": "courseregcodeitemannotation", "name": "course reg code item annotation", "app_label": "shoppingcart"}}, {"pk": 88, "model": "contenttypes.contenttype", "fields": {"model": "courseregistrationcode", "name": "course registration code", "app_label": "shoppingcart"}}, {"pk": 107, "model": "contenttypes.contenttype", "fields": {"model": "coursererunstate", "name": "course rerun state", "app_label": "course_action_state"}}, {"pk": 51, "model": "contenttypes.contenttype", "fields": {"model": "coursesoftware", "name": "course software", "app_label": "licenses"}}, {"pk": 53, "model": "contenttypes.contenttype", "fields": {"model": "courseusergroup", "name": "course user group", "app_label": "course_groups"}}, {"pk": 54, "model": "contenttypes.contenttype", "fields": {"model": "courseusergrouppartitiongroup", "name": "course user group partition group", "app_label": "course_groups"}}, {"pk": 135, "model": "contenttypes.contenttype", "fields": {"model": "coursevideo", "name": "course video", "app_label": "edxval"}}, {"pk": 116, "model": "contenttypes.contenttype", "fields": {"model": "criterion", "name": "criterion", "app_label": "assessment"}}, {"pk": 117, "model": "contenttypes.contenttype", "fields": {"model": "criterionoption", "name": "criterion option", "app_label": "assessment"}}, {"pk": 10, "model": "contenttypes.contenttype", "fields": {"model": "crontabschedule", "name": "crontab", "app_label": "djcelery"}}, {"pk": 102, "model": "contenttypes.contenttype", "fields": {"model": "darklangconfig", "name": "dark lang config", "app_label": "dark_lang"}}, {"pk": 46, "model": "contenttypes.contenttype", "fields": {"model": "dashboardconfiguration", "name": "dashboard configuration", "app_label": "student"}}, {"pk": 98, "model": "contenttypes.contenttype", "fields": {"model": "donation", "name": "donation", "app_label": "shoppingcart"}}, {"pk": 97, "model": "contenttypes.contenttype", "fields": {"model": "donationconfiguration", "name": "donation configuration", "app_label": "shoppingcart"}}, {"pk": 104, "model": "contenttypes.contenttype", "fields": {"model": "embargoedcourse", "name": "embargoed course", "app_label": "embargo"}}, {"pk": 105, "model": "contenttypes.contenttype", "fields": {"model": "embargoedstate", "name": "embargoed state", "app_label": "embargo"}}, {"pk": 136, "model": "contenttypes.contenttype", "fields": {"model": "encodedvideo", "name": "encoded video", "app_label": "edxval"}}, {"pk": 59, "model": "contenttypes.contenttype", "fields": {"model": "externalauthmap", "name": "external auth map", "app_label": "external_auth"}}, {"pk": 49, "model": "contenttypes.contenttype", "fields": {"model": "generatedcertificate", "name": "generated certificate", "app_label": "certificates"}}, {"pk": 61, "model": "contenttypes.contenttype", "fields": {"model": "grant", "name": "grant", "app_label": "oauth2"}}, {"pk": 2, "model": "contenttypes.contenttype", "fields": {"model": "group", "name": "group", "app_label": "auth"}}, {"pk": 50, "model": "contenttypes.contenttype", "fields": {"model": "instructortask", "name": "instructor task", "app_label": "instructor_task"}}, {"pk": 9, "model": "contenttypes.contenttype", "fields": {"model": "intervalschedule", "name": "interval", "app_label": "djcelery"}}, {"pk": 87, "model": "contenttypes.contenttype", "fields": {"model": "invoice", "name": "invoice", "app_label": "shoppingcart"}}, {"pk": 106, "model": "contenttypes.contenttype", "fields": {"model": "ipfilter", "name": "ip filter", "app_label": "embargo"}}, {"pk": 110, "model": "contenttypes.contenttype", "fields": {"model": "linkedin", "name": "linked in", "app_label": "linkedin"}}, {"pk": 21, "model": "contenttypes.contenttype", "fields": {"model": "logentry", "name": "log entry", "app_label": "admin"}}, {"pk": 42, "model": "contenttypes.contenttype", "fields": {"model": "loginfailures", "name": "login failures", "app_label": "student"}}, {"pk": 103, "model": "contenttypes.contenttype", "fields": {"model": "midcoursereverificationwindow", "name": "midcourse reverification window", "app_label": "reverification"}}, {"pk": 15, "model": "contenttypes.contenttype", "fields": {"model": "migrationhistory", "name": "migration history", "app_label": "south"}}, {"pk": 18, "model": "contenttypes.contenttype", "fields": {"model": "nonce", "name": "nonce", "app_label": "django_openid_auth"}}, {"pk": 23, "model": "contenttypes.contenttype", "fields": {"model": "nonce", "name": "nonce", "app_label": "default"}}, {"pk": 81, "model": "contenttypes.contenttype", "fields": {"model": "note", "name": "note", "app_label": "notes"}}, {"pk": 78, "model": "contenttypes.contenttype", "fields": {"model": "notification", "name": "notification", "app_label": "django_notify"}}, {"pk": 31, "model": "contenttypes.contenttype", "fields": {"model": "offlinecomputedgrade", "name": "offline computed grade", "app_label": "courseware"}}, {"pk": 32, "model": "contenttypes.contenttype", "fields": {"model": "offlinecomputedgradelog", "name": "offline computed grade log", "app_label": "courseware"}}, {"pk": 56, "model": "contenttypes.contenttype", "fields": {"model": "optout", "name": "optout", "app_label": "bulk_email"}}, {"pk": 85, "model": "contenttypes.contenttype", "fields": {"model": "order", "name": "order", "app_label": "shoppingcart"}}, {"pk": 86, "model": "contenttypes.contenttype", "fields": {"model": "orderitem", "name": "order item", "app_label": "shoppingcart"}}, {"pk": 92, "model": "contenttypes.contenttype", "fields": {"model": "paidcourseregistration", "name": "paid course registration", "app_label": "shoppingcart"}}, {"pk": 95, "model": "contenttypes.contenttype", "fields": {"model": "paidcourseregistrationannotation", "name": "paid course registration annotation", "app_label": "shoppingcart"}}, {"pk": 41, "model": "contenttypes.contenttype", "fields": {"model": "passwordhistory", "name": "password history", "app_label": "student"}}, {"pk": 122, "model": "contenttypes.contenttype", "fields": {"model": "peerworkflow", "name": "peer workflow", "app_label": "assessment"}}, {"pk": 123, "model": "contenttypes.contenttype", "fields": {"model": "peerworkflowitem", "name": "peer workflow item", "app_label": "assessment"}}, {"pk": 40, "model": "contenttypes.contenttype", "fields": {"model": "pendingemailchange", "name": "pending email change", "app_label": "student"}}, {"pk": 39, "model": "contenttypes.contenttype", "fields": {"model": "pendingnamechange", "name": "pending name change", "app_label": "student"}}, {"pk": 12, "model": "contenttypes.contenttype", "fields": {"model": "periodictask", "name": "periodic task", "app_label": "djcelery"}}, {"pk": 11, "model": "contenttypes.contenttype", "fields": {"model": "periodictasks", "name": "periodic tasks", "app_label": "djcelery"}}, {"pk": 1, "model": "contenttypes.contenttype", "fields": {"model": "permission", "name": "permission", "app_label": "auth"}}, {"pk": 133, "model": "contenttypes.contenttype", "fields": {"model": "profile", "name": "profile", "app_label": "edxval"}}, {"pk": 17, "model": "contenttypes.contenttype", "fields": {"model": "psychometricdata", "name": "psychometric data", "app_label": "psychometrics"}}, {"pk": 80, "model": "contenttypes.contenttype", "fields": {"model": "puzzlecomplete", "name": "puzzle complete", "app_label": "foldit"}}, {"pk": 63, "model": "contenttypes.contenttype", "fields": {"model": "refreshtoken", "name": "refresh token", "app_label": "oauth2"}}, {"pk": 38, "model": "contenttypes.contenttype", "fields": {"model": "registration", "name": "registration", "app_label": "student"}}, {"pk": 89, "model": "contenttypes.contenttype", "fields": {"model": "registrationcoderedemption", "name": "registration code redemption", "app_label": "shoppingcart"}}, {"pk": 70, "model": "contenttypes.contenttype", "fields": {"model": "reusableplugin", "name": "reusable plugin", "app_label": "wiki"}}, {"pk": 72, "model": "contenttypes.contenttype", "fields": {"model": "revisionplugin", "name": "revision plugin", "app_label": "wiki"}}, {"pk": 73, "model": "contenttypes.contenttype", "fields": {"model": "revisionpluginrevision", "name": "revision plugin revision", "app_label": "wiki"}}, {"pk": 115, "model": "contenttypes.contenttype", "fields": {"model": "rubric", "name": "rubric", "app_label": "assessment"}}, {"pk": 8, "model": "contenttypes.contenttype", "fields": {"model": "tasksetmeta", "name": "saved group result", "app_label": "djcelery"}}, {"pk": 79, "model": "contenttypes.contenttype", "fields": {"model": "score", "name": "score", "app_label": "foldit"}}, {"pk": 113, "model": "contenttypes.contenttype", "fields": {"model": "score", "name": "score", "app_label": "submissions"}}, {"pk": 114, "model": "contenttypes.contenttype", "fields": {"model": "scoresummary", "name": "score summary", "app_label": "submissions"}}, {"pk": 16, "model": "contenttypes.contenttype", "fields": {"model": "servercircuit", "name": "server circuit", "app_label": "circuit"}}, {"pk": 5, "model": "contenttypes.contenttype", "fields": {"model": "session", "name": "session", "app_label": "sessions"}}, {"pk": 76, "model": "contenttypes.contenttype", "fields": {"model": "settings", "name": "settings", "app_label": "django_notify"}}, {"pk": 71, "model": "contenttypes.contenttype", "fields": {"model": "simpleplugin", "name": "simple plugin", "app_label": "wiki"}}, {"pk": 6, "model": "contenttypes.contenttype", "fields": {"model": "site", "name": "site", "app_label": "sites"}}, {"pk": 101, "model": "contenttypes.contenttype", "fields": {"model": "softwaresecurephotoverification", "name": "software secure photo verification", "app_label": "verify_student"}}, {"pk": 82, "model": "contenttypes.contenttype", "fields": {"model": "splashconfig", "name": "splash config", "app_label": "splash"}}, {"pk": 111, "model": "contenttypes.contenttype", "fields": {"model": "studentitem", "name": "student item", "app_label": "submissions"}}, {"pk": 26, "model": "contenttypes.contenttype", "fields": {"model": "studentmodule", "name": "student module", "app_label": "courseware"}}, {"pk": 27, "model": "contenttypes.contenttype", "fields": {"model": "studentmodulehistory", "name": "student module history", "app_label": "courseware"}}, {"pk": 125, "model": "contenttypes.contenttype", "fields": {"model": "studenttrainingworkflow", "name": "student training workflow", "app_label": "assessment"}}, {"pk": 126, "model": "contenttypes.contenttype", "fields": {"model": "studenttrainingworkflowitem", "name": "student training workflow item", "app_label": "assessment"}}, {"pk": 112, "model": "contenttypes.contenttype", "fields": {"model": "submission", "name": "submission", "app_label": "submissions"}}, {"pk": 77, "model": "contenttypes.contenttype", "fields": {"model": "subscription", "name": "subscription", "app_label": "django_notify"}}, {"pk": 137, "model": "contenttypes.contenttype", "fields": {"model": "subtitle", "name": "subtitle", "app_label": "edxval"}}, {"pk": 109, "model": "contenttypes.contenttype", "fields": {"model": "surveyanswer", "name": "survey answer", "app_label": "survey"}}, {"pk": 108, "model": "contenttypes.contenttype", "fields": {"model": "surveyform", "name": "survey form", "app_label": "survey"}}, {"pk": 14, "model": "contenttypes.contenttype", "fields": {"model": "taskstate", "name": "task", "app_label": "djcelery"}}, {"pk": 7, "model": "contenttypes.contenttype", "fields": {"model": "taskmeta", "name": "task state", "app_label": "djcelery"}}, {"pk": 47, "model": "contenttypes.contenttype", "fields": {"model": "trackinglog", "name": "tracking log", "app_label": "track"}}, {"pk": 124, "model": "contenttypes.contenttype", "fields": {"model": "trainingexample", "name": "training example", "app_label": "assessment"}}, {"pk": 64, "model": "contenttypes.contenttype", "fields": {"model": "trustedclient", "name": "trusted client", "app_label": "oauth2_provider"}}, {"pk": 75, "model": "contenttypes.contenttype", "fields": {"model": "notificationtype", "name": "type", "app_label": "django_notify"}}, {"pk": 68, "model": "contenttypes.contenttype", "fields": {"model": "urlpath", "name": "URL path", "app_label": "wiki"}}, {"pk": 3, "model": "contenttypes.contenttype", "fields": {"model": "user", "name": "user", "app_label": "auth"}}, {"pk": 84, "model": "contenttypes.contenttype", "fields": {"model": "usercoursetag", "name": "user course tag", "app_label": "user_api"}}, {"pk": 52, "model": "contenttypes.contenttype", "fields": {"model": "userlicense", "name": "user license", "app_label": "licenses"}}, {"pk": 20, "model": "contenttypes.contenttype", "fields": {"model": "useropenid", "name": "user open id", "app_label": "django_openid_auth"}}, {"pk": 83, "model": "contenttypes.contenttype", "fields": {"model": "userpreference", "name": "user preference", "app_label": "user_api"}}, {"pk": 35, "model": "contenttypes.contenttype", "fields": {"model": "userprofile", "name": "user profile", "app_label": "student"}}, {"pk": 36, "model": "contenttypes.contenttype", "fields": {"model": "usersignupsource", "name": "user signup source", "app_label": "student"}}, {"pk": 22, "model": "contenttypes.contenttype", "fields": {"model": "usersocialauth", "name": "user social auth", "app_label": "default"}}, {"pk": 34, "model": "contenttypes.contenttype", "fields": {"model": "userstanding", "name": "user standing", "app_label": "student"}}, {"pk": 37, "model": "contenttypes.contenttype", "fields": {"model": "usertestgroup", "name": "user test group", "app_label": "student"}}, {"pk": 134, "model": "contenttypes.contenttype", "fields": {"model": "video", "name": "video", "app_label": "edxval"}}, {"pk": 13, "model": "contenttypes.contenttype", "fields": {"model": "workerstate", "name": "worker", "app_label": "djcelery"}}, {"pk": 30, "model": "contenttypes.contenttype", "fields": {"model": "xmodulestudentinfofield", "name": "x module student info field", "app_label": "courseware"}}, {"pk": 29, "model": "contenttypes.contenttype", "fields": {"model": "xmodulestudentprefsfield", "name": "x module student prefs field", "app_label": "courseware"}}, {"pk": 28, "model": "contenttypes.contenttype", "fields": {"model": "xmoduleuserstatesummaryfield", "name": "x module user state summary field", "app_label": "courseware"}}, {"pk": 1, "model": "sites.site", "fields": {"domain": "example.com", "name": "example.com"}}, {"pk": 1, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:27Z", "app_name": "courseware", "migration": "0001_initial"}}, {"pk": 2, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:27Z", "app_name": "courseware", "migration": "0002_add_indexes"}}, {"pk": 3, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:27Z", "app_name": "courseware", "migration": "0003_done_grade_cache"}}, {"pk": 4, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:27Z", "app_name": "courseware", "migration": "0004_add_field_studentmodule_course_id"}}, {"pk": 5, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:27Z", "app_name": "courseware", "migration": "0005_auto__add_offlinecomputedgrade__add_unique_offlinecomputedgrade_user_c"}}, {"pk": 6, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:27Z", "app_name": "courseware", "migration": "0006_create_student_module_history"}}, {"pk": 7, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:27Z", "app_name": "courseware", "migration": "0007_allow_null_version_in_history"}}, {"pk": 8, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:28Z", "app_name": "courseware", "migration": "0008_add_xmodule_storage"}}, {"pk": 9, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:28Z", "app_name": "courseware", "migration": "0009_add_field_default"}}, {"pk": 10, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:28Z", "app_name": "courseware", "migration": "0010_rename_xblock_field_content_to_user_state_summary"}}, {"pk": 11, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:28Z", "app_name": "student", "migration": "0001_initial"}}, {"pk": 12, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:28Z", "app_name": "student", "migration": "0002_text_to_varchar_and_indexes"}}, {"pk": 13, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:28Z", "app_name": "student", "migration": "0003_auto__add_usertestgroup"}}, {"pk": 14, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:28Z", "app_name": "student", "migration": "0004_add_email_index"}}, {"pk": 15, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:28Z", "app_name": "student", "migration": "0005_name_change"}}, {"pk": 16, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:28Z", "app_name": "student", "migration": "0006_expand_meta_field"}}, {"pk": 17, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:28Z", "app_name": "student", "migration": "0007_convert_to_utf8"}}, {"pk": 18, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:28Z", "app_name": "student", "migration": "0008__auto__add_courseregistration"}}, {"pk": 19, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:29Z", "app_name": "student", "migration": "0009_auto__del_courseregistration__add_courseenrollment"}}, {"pk": 20, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:29Z", "app_name": "student", "migration": "0010_auto__chg_field_courseenrollment_course_id"}}, {"pk": 21, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:29Z", "app_name": "student", "migration": "0011_auto__chg_field_courseenrollment_user__del_unique_courseenrollment_use"}}, {"pk": 22, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:29Z", "app_name": "student", "migration": "0012_auto__add_field_userprofile_gender__add_field_userprofile_date_of_birt"}}, {"pk": 23, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:29Z", "app_name": "student", "migration": "0013_auto__chg_field_userprofile_meta"}}, {"pk": 24, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:29Z", "app_name": "student", "migration": "0014_auto__del_courseenrollment"}}, {"pk": 25, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:29Z", "app_name": "student", "migration": "0015_auto__add_courseenrollment__add_unique_courseenrollment_user_course_id"}}, {"pk": 26, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:29Z", "app_name": "student", "migration": "0016_auto__add_field_courseenrollment_date__chg_field_userprofile_country"}}, {"pk": 27, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:29Z", "app_name": "student", "migration": "0017_rename_date_to_created"}}, {"pk": 28, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:29Z", "app_name": "student", "migration": "0018_auto"}}, {"pk": 29, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:29Z", "app_name": "student", "migration": "0019_create_approved_demographic_fields_fall_2012"}}, {"pk": 30, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:29Z", "app_name": "student", "migration": "0020_add_test_center_user"}}, {"pk": 31, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:29Z", "app_name": "student", "migration": "0021_remove_askbot"}}, {"pk": 32, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:29Z", "app_name": "student", "migration": "0022_auto__add_courseenrollmentallowed__add_unique_courseenrollmentallowed_"}}, {"pk": 33, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:30Z", "app_name": "student", "migration": "0023_add_test_center_registration"}}, {"pk": 34, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:30Z", "app_name": "student", "migration": "0024_add_allow_certificate"}}, {"pk": 35, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:30Z", "app_name": "student", "migration": "0025_auto__add_field_courseenrollmentallowed_auto_enroll"}}, {"pk": 36, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:30Z", "app_name": "student", "migration": "0026_auto__remove_index_student_testcenterregistration_accommodation_request"}}, {"pk": 37, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:30Z", "app_name": "student", "migration": "0027_add_active_flag_and_mode_to_courseware_enrollment"}}, {"pk": 38, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:30Z", "app_name": "student", "migration": "0028_auto__add_userstanding"}}, {"pk": 39, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:30Z", "app_name": "student", "migration": "0029_add_lookup_table_between_user_and_anonymous_student_id"}}, {"pk": 40, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:30Z", "app_name": "student", "migration": "0029_remove_pearson"}}, {"pk": 41, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:30Z", "app_name": "student", "migration": "0030_auto__chg_field_anonymoususerid_anonymous_user_id"}}, {"pk": 42, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:30Z", "app_name": "student", "migration": "0031_drop_student_anonymoususerid_temp_archive"}}, {"pk": 43, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:30Z", "app_name": "student", "migration": "0032_add_field_UserProfile_country_add_field_UserProfile_city"}}, {"pk": 44, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:30Z", "app_name": "student", "migration": "0032_auto__add_loginfailures"}}, {"pk": 45, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:30Z", "app_name": "student", "migration": "0033_auto__add_passwordhistory"}}, {"pk": 46, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:30Z", "app_name": "student", "migration": "0034_auto__add_courseaccessrole"}}, {"pk": 47, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:31Z", "app_name": "student", "migration": "0035_access_roles"}}, {"pk": 48, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:31Z", "app_name": "student", "migration": "0036_access_roles_orgless"}}, {"pk": 49, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:31Z", "app_name": "student", "migration": "0037_auto__add_courseregistrationcode"}}, {"pk": 50, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:31Z", "app_name": "student", "migration": "0038_auto__add_usersignupsource"}}, {"pk": 51, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:31Z", "app_name": "student", "migration": "0039_auto__del_courseregistrationcode"}}, {"pk": 52, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:31Z", "app_name": "student", "migration": "0040_auto__del_field_usersignupsource_user_id__add_field_usersignupsource_u"}}, {"pk": 53, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:31Z", "app_name": "student", "migration": "0041_add_dashboard_config"}}, {"pk": 54, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:32Z", "app_name": "track", "migration": "0001_initial"}}, {"pk": 55, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:32Z", "app_name": "track", "migration": "0002_auto__add_field_trackinglog_host__chg_field_trackinglog_event_type__ch"}}, {"pk": 56, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:32Z", "app_name": "certificates", "migration": "0001_added_generatedcertificates"}}, {"pk": 57, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:32Z", "app_name": "certificates", "migration": "0002_auto__add_field_generatedcertificate_download_url"}}, {"pk": 58, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:32Z", "app_name": "certificates", "migration": "0003_auto__add_field_generatedcertificate_enabled"}}, {"pk": 59, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:32Z", "app_name": "certificates", "migration": "0004_auto__add_field_generatedcertificate_graded_certificate_id__add_field_"}}, {"pk": 60, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:32Z", "app_name": "certificates", "migration": "0005_auto__add_field_generatedcertificate_name"}}, {"pk": 61, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:32Z", "app_name": "certificates", "migration": "0006_auto__chg_field_generatedcertificate_certificate_id"}}, {"pk": 62, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:32Z", "app_name": "certificates", "migration": "0007_auto__add_revokedcertificate"}}, {"pk": 63, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:32Z", "app_name": "certificates", "migration": "0008_auto__del_revokedcertificate__del_field_generatedcertificate_name__add"}}, {"pk": 64, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:32Z", "app_name": "certificates", "migration": "0009_auto__del_field_generatedcertificate_graded_download_url__del_field_ge"}}, {"pk": 65, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:32Z", "app_name": "certificates", "migration": "0010_auto__del_field_generatedcertificate_enabled__add_field_generatedcerti"}}, {"pk": 66, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:33Z", "app_name": "certificates", "migration": "0011_auto__del_field_generatedcertificate_certificate_id__add_field_generat"}}, {"pk": 67, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:33Z", "app_name": "certificates", "migration": "0012_auto__add_field_generatedcertificate_name__add_field_generatedcertific"}}, {"pk": 68, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:33Z", "app_name": "certificates", "migration": "0013_auto__add_field_generatedcertificate_error_reason"}}, {"pk": 69, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:33Z", "app_name": "certificates", "migration": "0014_adding_whitelist"}}, {"pk": 70, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:33Z", "app_name": "certificates", "migration": "0015_adding_mode_for_verified_certs"}}, {"pk": 71, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:33Z", "app_name": "instructor_task", "migration": "0001_initial"}}, {"pk": 72, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:33Z", "app_name": "instructor_task", "migration": "0002_add_subtask_field"}}, {"pk": 73, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:33Z", "app_name": "licenses", "migration": "0001_initial"}}, {"pk": 74, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:34Z", "app_name": "course_groups", "migration": "0001_initial"}}, {"pk": 75, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:34Z", "app_name": "course_groups", "migration": "0002_add_model_CourseUserGroupPartitionGroup"}}, {"pk": 76, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:34Z", "app_name": "bulk_email", "migration": "0001_initial"}}, {"pk": 77, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:34Z", "app_name": "bulk_email", "migration": "0002_change_field_names"}}, {"pk": 78, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:34Z", "app_name": "bulk_email", "migration": "0003_add_optout_user"}}, {"pk": 79, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:34Z", "app_name": "bulk_email", "migration": "0004_migrate_optout_user"}}, {"pk": 80, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:34Z", "app_name": "bulk_email", "migration": "0005_remove_optout_email"}}, {"pk": 81, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:34Z", "app_name": "bulk_email", "migration": "0006_add_course_email_template"}}, {"pk": 82, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:34Z", "app_name": "bulk_email", "migration": "0007_load_course_email_template"}}, {"pk": 83, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:34Z", "app_name": "bulk_email", "migration": "0008_add_course_authorizations"}}, {"pk": 84, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:34Z", "app_name": "bulk_email", "migration": "0009_force_unique_course_ids"}}, {"pk": 85, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:35Z", "app_name": "bulk_email", "migration": "0010_auto__chg_field_optout_course_id__add_field_courseemail_template_name_"}}, {"pk": 86, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:35Z", "app_name": "external_auth", "migration": "0001_initial"}}, {"pk": 87, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:35Z", "app_name": "oauth2", "migration": "0001_initial"}}, {"pk": 88, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:35Z", "app_name": "oauth2", "migration": "0002_auto__chg_field_client_user"}}, {"pk": 89, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:35Z", "app_name": "oauth2", "migration": "0003_auto__add_field_client_name"}}, {"pk": 90, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:35Z", "app_name": "oauth2", "migration": "0004_auto__add_index_accesstoken_token"}}, {"pk": 91, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:36Z", "app_name": "oauth2_provider", "migration": "0001_initial"}}, {"pk": 92, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:36Z", "app_name": "wiki", "migration": "0001_initial"}}, {"pk": 93, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:36Z", "app_name": "wiki", "migration": "0002_auto__add_field_articleplugin_created"}}, {"pk": 94, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:36Z", "app_name": "wiki", "migration": "0003_auto__add_field_urlpath_article"}}, {"pk": 95, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:36Z", "app_name": "wiki", "migration": "0004_populate_urlpath__article"}}, {"pk": 96, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:36Z", "app_name": "wiki", "migration": "0005_auto__chg_field_urlpath_article"}}, {"pk": 97, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:37Z", "app_name": "wiki", "migration": "0006_auto__add_attachmentrevision__add_image__add_attachment"}}, {"pk": 98, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:37Z", "app_name": "wiki", "migration": "0007_auto__add_articlesubscription"}}, {"pk": 99, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:37Z", "app_name": "wiki", "migration": "0008_auto__add_simpleplugin__add_revisionpluginrevision__add_imagerevision_"}}, {"pk": 100, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:37Z", "app_name": "wiki", "migration": "0009_auto__add_field_imagerevision_width__add_field_imagerevision_height"}}, {"pk": 101, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:37Z", "app_name": "wiki", "migration": "0010_auto__chg_field_imagerevision_image"}}, {"pk": 102, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:37Z", "app_name": "wiki", "migration": "0011_auto__chg_field_imagerevision_width__chg_field_imagerevision_height"}}, {"pk": 103, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:38Z", "app_name": "django_notify", "migration": "0001_initial"}}, {"pk": 104, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:38Z", "app_name": "notifications", "migration": "0001_initial"}}, {"pk": 105, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:38Z", "app_name": "foldit", "migration": "0001_initial"}}, {"pk": 106, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:39Z", "app_name": "django_comment_client", "migration": "0001_initial"}}, {"pk": 107, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:39Z", "app_name": "django_comment_common", "migration": "0001_initial"}}, {"pk": 108, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:39Z", "app_name": "notes", "migration": "0001_initial"}}, {"pk": 109, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:39Z", "app_name": "splash", "migration": "0001_initial"}}, {"pk": 110, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:39Z", "app_name": "splash", "migration": "0002_auto__add_field_splashconfig_unaffected_url_paths"}}, {"pk": 111, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:40Z", "app_name": "user_api", "migration": "0001_initial"}}, {"pk": 112, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:40Z", "app_name": "user_api", "migration": "0002_auto__add_usercoursetags__add_unique_usercoursetags_user_course_id_key"}}, {"pk": 113, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:40Z", "app_name": "user_api", "migration": "0003_rename_usercoursetags"}}, {"pk": 114, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:40Z", "app_name": "shoppingcart", "migration": "0001_initial"}}, {"pk": 115, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:40Z", "app_name": "shoppingcart", "migration": "0002_auto__add_field_paidcourseregistration_mode"}}, {"pk": 116, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:40Z", "app_name": "shoppingcart", "migration": "0003_auto__del_field_orderitem_line_cost"}}, {"pk": 117, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:40Z", "app_name": "shoppingcart", "migration": "0004_auto__add_field_orderitem_fulfilled_time"}}, {"pk": 118, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:40Z", "app_name": "shoppingcart", "migration": "0005_auto__add_paidcourseregistrationannotation__add_field_orderitem_report"}}, {"pk": 119, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:40Z", "app_name": "shoppingcart", "migration": "0006_auto__add_field_order_refunded_time__add_field_orderitem_refund_reques"}}, {"pk": 120, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:40Z", "app_name": "shoppingcart", "migration": "0007_auto__add_field_orderitem_service_fee"}}, {"pk": 121, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:41Z", "app_name": "shoppingcart", "migration": "0008_auto__add_coupons__add_couponredemption__chg_field_certificateitem_cou"}}, {"pk": 122, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:41Z", "app_name": "shoppingcart", "migration": "0009_auto__del_coupons__add_courseregistrationcode__add_coupon__chg_field_c"}}, {"pk": 123, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:41Z", "app_name": "shoppingcart", "migration": "0010_auto__add_registrationcoderedemption__del_field_courseregistrationcode"}}, {"pk": 124, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:41Z", "app_name": "shoppingcart", "migration": "0011_auto__add_invoice__add_field_courseregistrationcode_invoice"}}, {"pk": 125, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:41Z", "app_name": "shoppingcart", "migration": "0012_auto__del_field_courseregistrationcode_transaction_group_name__del_fie"}}, {"pk": 126, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:41Z", "app_name": "shoppingcart", "migration": "0013_auto__add_field_invoice_is_valid"}}, {"pk": 127, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:42Z", "app_name": "shoppingcart", "migration": "0014_auto__del_field_invoice_tax_id__add_field_invoice_address_line_1__add_"}}, {"pk": 128, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:42Z", "app_name": "shoppingcart", "migration": "0015_auto__del_field_invoice_purchase_order_number__del_field_invoice_compa"}}, {"pk": 129, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:42Z", "app_name": "shoppingcart", "migration": "0016_auto__del_field_invoice_company_email__del_field_invoice_company_refer"}}, {"pk": 130, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:42Z", "app_name": "shoppingcart", "migration": "0017_auto__add_field_courseregistrationcode_order__chg_field_registrationco"}}, {"pk": 131, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:42Z", "app_name": "shoppingcart", "migration": "0018_auto__add_donation"}}, {"pk": 132, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:42Z", "app_name": "shoppingcart", "migration": "0019_auto__add_donationconfiguration"}}, {"pk": 133, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:42Z", "app_name": "shoppingcart", "migration": "0020_auto__add_courseregcodeitem__add_courseregcodeitemannotation__add_fiel"}}, {"pk": 134, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:42Z", "app_name": "shoppingcart", "migration": "0021_auto__add_field_orderitem_created__add_field_orderitem_modified"}}, {"pk": 135, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:42Z", "app_name": "course_modes", "migration": "0001_initial"}}, {"pk": 136, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:42Z", "app_name": "course_modes", "migration": "0002_auto__add_field_coursemode_currency"}}, {"pk": 137, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:43Z", "app_name": "course_modes", "migration": "0003_auto__add_unique_coursemode_course_id_currency_mode_slug"}}, {"pk": 138, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:43Z", "app_name": "course_modes", "migration": "0004_auto__add_field_coursemode_expiration_date"}}, {"pk": 139, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:43Z", "app_name": "course_modes", "migration": "0005_auto__add_field_coursemode_expiration_datetime"}}, {"pk": 140, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:43Z", "app_name": "course_modes", "migration": "0006_expiration_date_to_datetime"}}, {"pk": 141, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:43Z", "app_name": "course_modes", "migration": "0007_add_description"}}, {"pk": 142, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:43Z", "app_name": "course_modes", "migration": "0007_auto__add_coursemodesarchive__chg_field_coursemode_course_id"}}, {"pk": 143, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:43Z", "app_name": "verify_student", "migration": "0001_initial"}}, {"pk": 144, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:43Z", "app_name": "verify_student", "migration": "0002_auto__add_field_softwaresecurephotoverification_window"}}, {"pk": 145, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:43Z", "app_name": "verify_student", "migration": "0003_auto__add_field_softwaresecurephotoverification_display"}}, {"pk": 146, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:43Z", "app_name": "dark_lang", "migration": "0001_initial"}}, {"pk": 147, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:43Z", "app_name": "dark_lang", "migration": "0002_enable_on_install"}}, {"pk": 148, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:44Z", "app_name": "reverification", "migration": "0001_initial"}}, {"pk": 149, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:44Z", "app_name": "embargo", "migration": "0001_initial"}}, {"pk": 150, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:44Z", "app_name": "course_action_state", "migration": "0001_initial"}}, {"pk": 151, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:44Z", "app_name": "course_action_state", "migration": "0002_add_rerun_display_name"}}, {"pk": 152, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:45Z", "app_name": "survey", "migration": "0001_initial"}}, {"pk": 153, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:45Z", "app_name": "linkedin", "migration": "0001_initial"}}, {"pk": 154, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:45Z", "app_name": "submissions", "migration": "0001_initial"}}, {"pk": 155, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:46Z", "app_name": "submissions", "migration": "0002_auto__add_scoresummary"}}, {"pk": 156, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:46Z", "app_name": "submissions", "migration": "0003_auto__del_field_submission_answer__add_field_submission_raw_answer"}}, {"pk": 157, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:46Z", "app_name": "submissions", "migration": "0004_auto__add_field_score_reset"}}, {"pk": 158, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:46Z", "app_name": "assessment", "migration": "0001_initial"}}, {"pk": 159, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:46Z", "app_name": "assessment", "migration": "0002_auto__add_assessmentfeedbackoption__del_field_assessmentfeedback_feedb"}}, {"pk": 160, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:46Z", "app_name": "assessment", "migration": "0003_add_index_pw_course_item_student"}}, {"pk": 161, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:46Z", "app_name": "assessment", "migration": "0004_auto__add_field_peerworkflow_graded_count"}}, {"pk": 162, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:47Z", "app_name": "assessment", "migration": "0005_auto__del_field_peerworkflow_graded_count__add_field_peerworkflow_grad"}}, {"pk": 163, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:47Z", "app_name": "assessment", "migration": "0006_auto__add_field_assessmentpart_feedback"}}, {"pk": 164, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:47Z", "app_name": "assessment", "migration": "0007_auto__chg_field_assessmentpart_feedback"}}, {"pk": 165, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:47Z", "app_name": "assessment", "migration": "0008_student_training"}}, {"pk": 166, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:47Z", "app_name": "assessment", "migration": "0009_auto__add_unique_studenttrainingworkflowitem_order_num_workflow"}}, {"pk": 167, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:47Z", "app_name": "assessment", "migration": "0010_auto__add_unique_studenttrainingworkflow_submission_uuid"}}, {"pk": 168, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:47Z", "app_name": "assessment", "migration": "0011_ai_training"}}, {"pk": 169, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:47Z", "app_name": "assessment", "migration": "0012_move_algorithm_id_to_classifier_set"}}, {"pk": 170, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:47Z", "app_name": "assessment", "migration": "0013_auto__add_field_aigradingworkflow_essay_text"}}, {"pk": 171, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:48Z", "app_name": "assessment", "migration": "0014_auto__add_field_aitrainingworkflow_item_id__add_field_aitrainingworkfl"}}, {"pk": 172, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:48Z", "app_name": "assessment", "migration": "0015_auto__add_unique_aitrainingworkflow_uuid__add_unique_aigradingworkflow"}}, {"pk": 173, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:48Z", "app_name": "assessment", "migration": "0016_auto__add_field_aiclassifierset_course_id__add_field_aiclassifierset_i"}}, {"pk": 174, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:48Z", "app_name": "assessment", "migration": "0016_auto__add_field_rubric_structure_hash"}}, {"pk": 175, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:48Z", "app_name": "assessment", "migration": "0017_rubric_structure_hash"}}, {"pk": 176, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:48Z", "app_name": "assessment", "migration": "0018_auto__add_field_assessmentpart_criterion"}}, {"pk": 177, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:48Z", "app_name": "assessment", "migration": "0019_assessmentpart_criterion_field"}}, {"pk": 178, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:48Z", "app_name": "assessment", "migration": "0020_assessmentpart_criterion_not_null"}}, {"pk": 179, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:48Z", "app_name": "assessment", "migration": "0021_assessmentpart_option_nullable"}}, {"pk": 180, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:48Z", "app_name": "assessment", "migration": "0022__add_label_fields"}}, {"pk": 181, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:48Z", "app_name": "assessment", "migration": "0023_assign_criteria_and_option_labels"}}, {"pk": 182, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:49Z", "app_name": "workflow", "migration": "0001_initial"}}, {"pk": 183, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:49Z", "app_name": "workflow", "migration": "0002_auto__add_field_assessmentworkflow_course_id__add_field_assessmentwork"}}, {"pk": 184, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:49Z", "app_name": "workflow", "migration": "0003_auto__add_assessmentworkflowstep"}}, {"pk": 185, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:49Z", "app_name": "edxval", "migration": "0001_initial"}}, {"pk": 186, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:49Z", "app_name": "edxval", "migration": "0002_default_profiles"}}, {"pk": 187, "model": "south.migrationhistory", "fields": {"applied": "2014-11-13T22:49:49Z", "app_name": "django_extensions", "migration": "0001_empty"}}, {"pk": 1, "model": "edxval.profile", "fields": {"width": 1280, "profile_name": "desktop_mp4", "extension": "mp4", "height": 720}}, {"pk": 2, "model": "edxval.profile", "fields": {"width": 1280, "profile_name": "desktop_webm", "extension": "webm", "height": 720}}, {"pk": 3, "model": "edxval.profile", "fields": {"width": 960, "profile_name": "mobile_high", "extension": "mp4", "height": 540}}, {"pk": 4, "model": "edxval.profile", "fields": {"width": 640, "profile_name": "mobile_low", "extension": "mp4", "height": 360}}, {"pk": 5, "model": "edxval.profile", "fields": {"width": 1920, "profile_name": "youtube", "extension": "mp4", "height": 1080}}, {"pk": 61, "model": "auth.permission", "fields": {"codename": "add_logentry", "name": "Can add log entry", "content_type": 21}}, {"pk": 62, "model": "auth.permission", "fields": {"codename": "change_logentry", "name": "Can change log entry", "content_type": 21}}, {"pk": 63, "model": "auth.permission", "fields": {"codename": "delete_logentry", "name": "Can delete log entry", "content_type": 21}}, {"pk": 385, "model": "auth.permission", "fields": {"codename": "add_aiclassifier", "name": "Can add ai classifier", "content_type": 128}}, {"pk": 386, "model": "auth.permission", "fields": {"codename": "change_aiclassifier", "name": "Can change ai classifier", "content_type": 128}}, {"pk": 387, "model": "auth.permission", "fields": {"codename": "delete_aiclassifier", "name": "Can delete ai classifier", "content_type": 128}}, {"pk": 382, "model": "auth.permission", "fields": {"codename": "add_aiclassifierset", "name": "Can add ai classifier set", "content_type": 127}}, {"pk": 383, "model": "auth.permission", "fields": {"codename": "change_aiclassifierset", "name": "Can change ai classifier set", "content_type": 127}}, {"pk": 384, "model": "auth.permission", "fields": {"codename": "delete_aiclassifierset", "name": "Can delete ai classifier set", "content_type": 127}}, {"pk": 391, "model": "auth.permission", "fields": {"codename": "add_aigradingworkflow", "name": "Can add ai grading workflow", "content_type": 130}}, {"pk": 392, "model": "auth.permission", "fields": {"codename": "change_aigradingworkflow", "name": "Can change ai grading workflow", "content_type": 130}}, {"pk": 393, "model": "auth.permission", "fields": {"codename": "delete_aigradingworkflow", "name": "Can delete ai grading workflow", "content_type": 130}}, {"pk": 388, "model": "auth.permission", "fields": {"codename": "add_aitrainingworkflow", "name": "Can add ai training workflow", "content_type": 129}}, {"pk": 389, "model": "auth.permission", "fields": {"codename": "change_aitrainingworkflow", "name": "Can change ai training workflow", "content_type": 129}}, {"pk": 390, "model": "auth.permission", "fields": {"codename": "delete_aitrainingworkflow", "name": "Can delete ai training workflow", "content_type": 129}}, {"pk": 355, "model": "auth.permission", "fields": {"codename": "add_assessment", "name": "Can add assessment", "content_type": 118}}, {"pk": 356, "model": "auth.permission", "fields": {"codename": "change_assessment", "name": "Can change assessment", "content_type": 118}}, {"pk": 357, "model": "auth.permission", "fields": {"codename": "delete_assessment", "name": "Can delete assessment", "content_type": 118}}, {"pk": 364, "model": "auth.permission", "fields": {"codename": "add_assessmentfeedback", "name": "Can add assessment feedback", "content_type": 121}}, {"pk": 365, "model": "auth.permission", "fields": {"codename": "change_assessmentfeedback", "name": "Can change assessment feedback", "content_type": 121}}, {"pk": 366, "model": "auth.permission", "fields": {"codename": "delete_assessmentfeedback", "name": "Can delete assessment feedback", "content_type": 121}}, {"pk": 361, "model": "auth.permission", "fields": {"codename": "add_assessmentfeedbackoption", "name": "Can add assessment feedback option", "content_type": 120}}, {"pk": 362, "model": "auth.permission", "fields": {"codename": "change_assessmentfeedbackoption", "name": "Can change assessment feedback option", "content_type": 120}}, {"pk": 363, "model": "auth.permission", "fields": {"codename": "delete_assessmentfeedbackoption", "name": "Can delete assessment feedback option", "content_type": 120}}, {"pk": 358, "model": "auth.permission", "fields": {"codename": "add_assessmentpart", "name": "Can add assessment part", "content_type": 119}}, {"pk": 359, "model": "auth.permission", "fields": {"codename": "change_assessmentpart", "name": "Can change assessment part", "content_type": 119}}, {"pk": 360, "model": "auth.permission", "fields": {"codename": "delete_assessmentpart", "name": "Can delete assessment part", "content_type": 119}}, {"pk": 349, "model": "auth.permission", "fields": {"codename": "add_criterion", "name": "Can add criterion", "content_type": 116}}, {"pk": 350, "model": "auth.permission", "fields": {"codename": "change_criterion", "name": "Can change criterion", "content_type": 116}}, {"pk": 351, "model": "auth.permission", "fields": {"codename": "delete_criterion", "name": "Can delete criterion", "content_type": 116}}, {"pk": 352, "model": "auth.permission", "fields": {"codename": "add_criterionoption", "name": "Can add criterion option", "content_type": 117}}, {"pk": 353, "model": "auth.permission", "fields": {"codename": "change_criterionoption", "name": "Can change criterion option", "content_type": 117}}, {"pk": 354, "model": "auth.permission", "fields": {"codename": "delete_criterionoption", "name": "Can delete criterion option", "content_type": 117}}, {"pk": 367, "model": "auth.permission", "fields": {"codename": "add_peerworkflow", "name": "Can add peer workflow", "content_type": 122}}, {"pk": 368, "model": "auth.permission", "fields": {"codename": "change_peerworkflow", "name": "Can change peer workflow", "content_type": 122}}, {"pk": 369, "model": "auth.permission", "fields": {"codename": "delete_peerworkflow", "name": "Can delete peer workflow", "content_type": 122}}, {"pk": 370, "model": "auth.permission", "fields": {"codename": "add_peerworkflowitem", "name": "Can add peer workflow item", "content_type": 123}}, {"pk": 371, "model": "auth.permission", "fields": {"codename": "change_peerworkflowitem", "name": "Can change peer workflow item", "content_type": 123}}, {"pk": 372, "model": "auth.permission", "fields": {"codename": "delete_peerworkflowitem", "name": "Can delete peer workflow item", "content_type": 123}}, {"pk": 346, "model": "auth.permission", "fields": {"codename": "add_rubric", "name": "Can add rubric", "content_type": 115}}, {"pk": 347, "model": "auth.permission", "fields": {"codename": "change_rubric", "name": "Can change rubric", "content_type": 115}}, {"pk": 348, "model": "auth.permission", "fields": {"codename": "delete_rubric", "name": "Can delete rubric", "content_type": 115}}, {"pk": 376, "model": "auth.permission", "fields": {"codename": "add_studenttrainingworkflow", "name": "Can add student training workflow", "content_type": 125}}, {"pk": 377, "model": "auth.permission", "fields": {"codename": "change_studenttrainingworkflow", "name": "Can change student training workflow", "content_type": 125}}, {"pk": 378, "model": "auth.permission", "fields": {"codename": "delete_studenttrainingworkflow", "name": "Can delete student training workflow", "content_type": 125}}, {"pk": 379, "model": "auth.permission", "fields": {"codename": "add_studenttrainingworkflowitem", "name": "Can add student training workflow item", "content_type": 126}}, {"pk": 380, "model": "auth.permission", "fields": {"codename": "change_studenttrainingworkflowitem", "name": "Can change student training workflow item", "content_type": 126}}, {"pk": 381, "model": "auth.permission", "fields": {"codename": "delete_studenttrainingworkflowitem", "name": "Can delete student training workflow item", "content_type": 126}}, {"pk": 373, "model": "auth.permission", "fields": {"codename": "add_trainingexample", "name": "Can add training example", "content_type": 124}}, {"pk": 374, "model": "auth.permission", "fields": {"codename": "change_trainingexample", "name": "Can change training example", "content_type": 124}}, {"pk": 375, "model": "auth.permission", "fields": {"codename": "delete_trainingexample", "name": "Can delete training example", "content_type": 124}}, {"pk": 4, "model": "auth.permission", "fields": {"codename": "add_group", "name": "Can add group", "content_type": 2}}, {"pk": 5, "model": "auth.permission", "fields": {"codename": "change_group", "name": "Can change group", "content_type": 2}}, {"pk": 6, "model": "auth.permission", "fields": {"codename": "delete_group", "name": "Can delete group", "content_type": 2}}, {"pk": 1, "model": "auth.permission", "fields": {"codename": "add_permission", "name": "Can add permission", "content_type": 1}}, {"pk": 2, "model": "auth.permission", "fields": {"codename": "change_permission", "name": "Can change permission", "content_type": 1}}, {"pk": 3, "model": "auth.permission", "fields": {"codename": "delete_permission", "name": "Can delete permission", "content_type": 1}}, {"pk": 7, "model": "auth.permission", "fields": {"codename": "add_user", "name": "Can add user", "content_type": 3}}, {"pk": 8, "model": "auth.permission", "fields": {"codename": "change_user", "name": "Can change user", "content_type": 3}}, {"pk": 9, "model": "auth.permission", "fields": {"codename": "delete_user", "name": "Can delete user", "content_type": 3}}, {"pk": 172, "model": "auth.permission", "fields": {"codename": "add_courseauthorization", "name": "Can add course authorization", "content_type": 58}}, {"pk": 173, "model": "auth.permission", "fields": {"codename": "change_courseauthorization", "name": "Can change course authorization", "content_type": 58}}, {"pk": 174, "model": "auth.permission", "fields": {"codename": "delete_courseauthorization", "name": "Can delete course authorization", "content_type": 58}}, {"pk": 163, "model": "auth.permission", "fields": {"codename": "add_courseemail", "name": "Can add course email", "content_type": 55}}, {"pk": 164, "model": "auth.permission", "fields": {"codename": "change_courseemail", "name": "Can change course email", "content_type": 55}}, {"pk": 165, "model": "auth.permission", "fields": {"codename": "delete_courseemail", "name": "Can delete course email", "content_type": 55}}, {"pk": 169, "model": "auth.permission", "fields": {"codename": "add_courseemailtemplate", "name": "Can add course email template", "content_type": 57}}, {"pk": 170, "model": "auth.permission", "fields": {"codename": "change_courseemailtemplate", "name": "Can change course email template", "content_type": 57}}, {"pk": 171, "model": "auth.permission", "fields": {"codename": "delete_courseemailtemplate", "name": "Can delete course email template", "content_type": 57}}, {"pk": 166, "model": "auth.permission", "fields": {"codename": "add_optout", "name": "Can add optout", "content_type": 56}}, {"pk": 167, "model": "auth.permission", "fields": {"codename": "change_optout", "name": "Can change optout", "content_type": 56}}, {"pk": 168, "model": "auth.permission", "fields": {"codename": "delete_optout", "name": "Can delete optout", "content_type": 56}}, {"pk": 142, "model": "auth.permission", "fields": {"codename": "add_certificatewhitelist", "name": "Can add certificate whitelist", "content_type": 48}}, {"pk": 143, "model": "auth.permission", "fields": {"codename": "change_certificatewhitelist", "name": "Can change certificate whitelist", "content_type": 48}}, {"pk": 144, "model": "auth.permission", "fields": {"codename": "delete_certificatewhitelist", "name": "Can delete certificate whitelist", "content_type": 48}}, {"pk": 145, "model": "auth.permission", "fields": {"codename": "add_generatedcertificate", "name": "Can add generated certificate", "content_type": 49}}, {"pk": 146, "model": "auth.permission", "fields": {"codename": "change_generatedcertificate", "name": "Can change generated certificate", "content_type": 49}}, {"pk": 147, "model": "auth.permission", "fields": {"codename": "delete_generatedcertificate", "name": "Can delete generated certificate", "content_type": 49}}, {"pk": 46, "model": "auth.permission", "fields": {"codename": "add_servercircuit", "name": "Can add server circuit", "content_type": 16}}, {"pk": 47, "model": "auth.permission", "fields": {"codename": "change_servercircuit", "name": "Can change server circuit", "content_type": 16}}, {"pk": 48, "model": "auth.permission", "fields": {"codename": "delete_servercircuit", "name": "Can delete server circuit", "content_type": 16}}, {"pk": 10, "model": "auth.permission", "fields": {"codename": "add_contenttype", "name": "Can add content type", "content_type": 4}}, {"pk": 11, "model": "auth.permission", "fields": {"codename": "change_contenttype", "name": "Can change content type", "content_type": 4}}, {"pk": 12, "model": "auth.permission", "fields": {"codename": "delete_contenttype", "name": "Can delete content type", "content_type": 4}}, {"pk": 91, "model": "auth.permission", "fields": {"codename": "add_offlinecomputedgrade", "name": "Can add offline computed grade", "content_type": 31}}, {"pk": 92, "model": "auth.permission", "fields": {"codename": "change_offlinecomputedgrade", "name": "Can change offline computed grade", "content_type": 31}}, {"pk": 93, "model": "auth.permission", "fields": {"codename": "delete_offlinecomputedgrade", "name": "Can delete offline computed grade", "content_type": 31}}, {"pk": 94, "model": "auth.permission", "fields": {"codename": "add_offlinecomputedgradelog", "name": "Can add offline computed grade log", "content_type": 32}}, {"pk": 95, "model": "auth.permission", "fields": {"codename": "change_offlinecomputedgradelog", "name": "Can change offline computed grade log", "content_type": 32}}, {"pk": 96, "model": "auth.permission", "fields": {"codename": "delete_offlinecomputedgradelog", "name": "Can delete offline computed grade log", "content_type": 32}}, {"pk": 76, "model": "auth.permission", "fields": {"codename": "add_studentmodule", "name": "Can add student module", "content_type": 26}}, {"pk": 77, "model": "auth.permission", "fields": {"codename": "change_studentmodule", "name": "Can change student module", "content_type": 26}}, {"pk": 78, "model": "auth.permission", "fields": {"codename": "delete_studentmodule", "name": "Can delete student module", "content_type": 26}}, {"pk": 79, "model": "auth.permission", "fields": {"codename": "add_studentmodulehistory", "name": "Can add student module history", "content_type": 27}}, {"pk": 80, "model": "auth.permission", "fields": {"codename": "change_studentmodulehistory", "name": "Can change student module history", "content_type": 27}}, {"pk": 81, "model": "auth.permission", "fields": {"codename": "delete_studentmodulehistory", "name": "Can delete student module history", "content_type": 27}}, {"pk": 88, "model": "auth.permission", "fields": {"codename": "add_xmodulestudentinfofield", "name": "Can add x module student info field", "content_type": 30}}, {"pk": 89, "model": "auth.permission", "fields": {"codename": "change_xmodulestudentinfofield", "name": "Can change x module student info field", "content_type": 30}}, {"pk": 90, "model": "auth.permission", "fields": {"codename": "delete_xmodulestudentinfofield", "name": "Can delete x module student info field", "content_type": 30}}, {"pk": 85, "model": "auth.permission", "fields": {"codename": "add_xmodulestudentprefsfield", "name": "Can add x module student prefs field", "content_type": 29}}, {"pk": 86, "model": "auth.permission", "fields": {"codename": "change_xmodulestudentprefsfield", "name": "Can change x module student prefs field", "content_type": 29}}, {"pk": 87, "model": "auth.permission", "fields": {"codename": "delete_xmodulestudentprefsfield", "name": "Can delete x module student prefs field", "content_type": 29}}, {"pk": 82, "model": "auth.permission", "fields": {"codename": "add_xmoduleuserstatesummaryfield", "name": "Can add x module user state summary field", "content_type": 28}}, {"pk": 83, "model": "auth.permission", "fields": {"codename": "change_xmoduleuserstatesummaryfield", "name": "Can change x module user state summary field", "content_type": 28}}, {"pk": 84, "model": "auth.permission", "fields": {"codename": "delete_xmoduleuserstatesummaryfield", "name": "Can delete x module user state summary field", "content_type": 28}}, {"pk": 322, "model": "auth.permission", "fields": {"codename": "add_coursererunstate", "name": "Can add course rerun state", "content_type": 107}}, {"pk": 323, "model": "auth.permission", "fields": {"codename": "change_coursererunstate", "name": "Can change course rerun state", "content_type": 107}}, {"pk": 324, "model": "auth.permission", "fields": {"codename": "delete_coursererunstate", "name": "Can delete course rerun state", "content_type": 107}}, {"pk": 157, "model": "auth.permission", "fields": {"codename": "add_courseusergroup", "name": "Can add course user group", "content_type": 53}}, {"pk": 158, "model": "auth.permission", "fields": {"codename": "change_courseusergroup", "name": "Can change course user group", "content_type": 53}}, {"pk": 159, "model": "auth.permission", "fields": {"codename": "delete_courseusergroup", "name": "Can delete course user group", "content_type": 53}}, {"pk": 160, "model": "auth.permission", "fields": {"codename": "add_courseusergrouppartitiongroup", "name": "Can add course user group partition group", "content_type": 54}}, {"pk": 161, "model": "auth.permission", "fields": {"codename": "change_courseusergrouppartitiongroup", "name": "Can change course user group partition group", "content_type": 54}}, {"pk": 162, "model": "auth.permission", "fields": {"codename": "delete_courseusergrouppartitiongroup", "name": "Can delete course user group partition group", "content_type": 54}}, {"pk": 298, "model": "auth.permission", "fields": {"codename": "add_coursemode", "name": "Can add course mode", "content_type": 99}}, {"pk": 299, "model": "auth.permission", "fields": {"codename": "change_coursemode", "name": "Can change course mode", "content_type": 99}}, {"pk": 300, "model": "auth.permission", "fields": {"codename": "delete_coursemode", "name": "Can delete course mode", "content_type": 99}}, {"pk": 301, "model": "auth.permission", "fields": {"codename": "add_coursemodesarchive", "name": "Can add course modes archive", "content_type": 100}}, {"pk": 302, "model": "auth.permission", "fields": {"codename": "change_coursemodesarchive", "name": "Can change course modes archive", "content_type": 100}}, {"pk": 303, "model": "auth.permission", "fields": {"codename": "delete_coursemodesarchive", "name": "Can delete course modes archive", "content_type": 100}}, {"pk": 307, "model": "auth.permission", "fields": {"codename": "add_darklangconfig", "name": "Can add dark lang config", "content_type": 102}}, {"pk": 308, "model": "auth.permission", "fields": {"codename": "change_darklangconfig", "name": "Can change dark lang config", "content_type": 102}}, {"pk": 309, "model": "auth.permission", "fields": {"codename": "delete_darklangconfig", "name": "Can delete dark lang config", "content_type": 102}}, {"pk": 70, "model": "auth.permission", "fields": {"codename": "add_association", "name": "Can add association", "content_type": 24}}, {"pk": 71, "model": "auth.permission", "fields": {"codename": "change_association", "name": "Can change association", "content_type": 24}}, {"pk": 72, "model": "auth.permission", "fields": {"codename": "delete_association", "name": "Can delete association", "content_type": 24}}, {"pk": 73, "model": "auth.permission", "fields": {"codename": "add_code", "name": "Can add code", "content_type": 25}}, {"pk": 74, "model": "auth.permission", "fields": {"codename": "change_code", "name": "Can change code", "content_type": 25}}, {"pk": 75, "model": "auth.permission", "fields": {"codename": "delete_code", "name": "Can delete code", "content_type": 25}}, {"pk": 67, "model": "auth.permission", "fields": {"codename": "add_nonce", "name": "Can add nonce", "content_type": 23}}, {"pk": 68, "model": "auth.permission", "fields": {"codename": "change_nonce", "name": "Can change nonce", "content_type": 23}}, {"pk": 69, "model": "auth.permission", "fields": {"codename": "delete_nonce", "name": "Can delete nonce", "content_type": 23}}, {"pk": 64, "model": "auth.permission", "fields": {"codename": "add_usersocialauth", "name": "Can add user social auth", "content_type": 22}}, {"pk": 65, "model": "auth.permission", "fields": {"codename": "change_usersocialauth", "name": "Can change user social auth", "content_type": 22}}, {"pk": 66, "model": "auth.permission", "fields": {"codename": "delete_usersocialauth", "name": "Can delete user social auth", "content_type": 22}}, {"pk": 235, "model": "auth.permission", "fields": {"codename": "add_notification", "name": "Can add notification", "content_type": 78}}, {"pk": 236, "model": "auth.permission", "fields": {"codename": "change_notification", "name": "Can change notification", "content_type": 78}}, {"pk": 237, "model": "auth.permission", "fields": {"codename": "delete_notification", "name": "Can delete notification", "content_type": 78}}, {"pk": 226, "model": "auth.permission", "fields": {"codename": "add_notificationtype", "name": "Can add type", "content_type": 75}}, {"pk": 227, "model": "auth.permission", "fields": {"codename": "change_notificationtype", "name": "Can change type", "content_type": 75}}, {"pk": 228, "model": "auth.permission", "fields": {"codename": "delete_notificationtype", "name": "Can delete type", "content_type": 75}}, {"pk": 229, "model": "auth.permission", "fields": {"codename": "add_settings", "name": "Can add settings", "content_type": 76}}, {"pk": 230, "model": "auth.permission", "fields": {"codename": "change_settings", "name": "Can change settings", "content_type": 76}}, {"pk": 231, "model": "auth.permission", "fields": {"codename": "delete_settings", "name": "Can delete settings", "content_type": 76}}, {"pk": 232, "model": "auth.permission", "fields": {"codename": "add_subscription", "name": "Can add subscription", "content_type": 77}}, {"pk": 233, "model": "auth.permission", "fields": {"codename": "change_subscription", "name": "Can change subscription", "content_type": 77}}, {"pk": 234, "model": "auth.permission", "fields": {"codename": "delete_subscription", "name": "Can delete subscription", "content_type": 77}}, {"pk": 55, "model": "auth.permission", "fields": {"codename": "add_association", "name": "Can add association", "content_type": 19}}, {"pk": 56, "model": "auth.permission", "fields": {"codename": "change_association", "name": "Can change association", "content_type": 19}}, {"pk": 57, "model": "auth.permission", "fields": {"codename": "delete_association", "name": "Can delete association", "content_type": 19}}, {"pk": 52, "model": "auth.permission", "fields": {"codename": "add_nonce", "name": "Can add nonce", "content_type": 18}}, {"pk": 53, "model": "auth.permission", "fields": {"codename": "change_nonce", "name": "Can change nonce", "content_type": 18}}, {"pk": 54, "model": "auth.permission", "fields": {"codename": "delete_nonce", "name": "Can delete nonce", "content_type": 18}}, {"pk": 58, "model": "auth.permission", "fields": {"codename": "add_useropenid", "name": "Can add user open id", "content_type": 20}}, {"pk": 59, "model": "auth.permission", "fields": {"codename": "change_useropenid", "name": "Can change user open id", "content_type": 20}}, {"pk": 60, "model": "auth.permission", "fields": {"codename": "delete_useropenid", "name": "Can delete user open id", "content_type": 20}}, {"pk": 28, "model": "auth.permission", "fields": {"codename": "add_crontabschedule", "name": "Can add crontab", "content_type": 10}}, {"pk": 29, "model": "auth.permission", "fields": {"codename": "change_crontabschedule", "name": "Can change crontab", "content_type": 10}}, {"pk": 30, "model": "auth.permission", "fields": {"codename": "delete_crontabschedule", "name": "Can delete crontab", "content_type": 10}}, {"pk": 25, "model": "auth.permission", "fields": {"codename": "add_intervalschedule", "name": "Can add interval", "content_type": 9}}, {"pk": 26, "model": "auth.permission", "fields": {"codename": "change_intervalschedule", "name": "Can change interval", "content_type": 9}}, {"pk": 27, "model": "auth.permission", "fields": {"codename": "delete_intervalschedule", "name": "Can delete interval", "content_type": 9}}, {"pk": 34, "model": "auth.permission", "fields": {"codename": "add_periodictask", "name": "Can add periodic task", "content_type": 12}}, {"pk": 35, "model": "auth.permission", "fields": {"codename": "change_periodictask", "name": "Can change periodic task", "content_type": 12}}, {"pk": 36, "model": "auth.permission", "fields": {"codename": "delete_periodictask", "name": "Can delete periodic task", "content_type": 12}}, {"pk": 31, "model": "auth.permission", "fields": {"codename": "add_periodictasks", "name": "Can add periodic tasks", "content_type": 11}}, {"pk": 32, "model": "auth.permission", "fields": {"codename": "change_periodictasks", "name": "Can change periodic tasks", "content_type": 11}}, {"pk": 33, "model": "auth.permission", "fields": {"codename": "delete_periodictasks", "name": "Can delete periodic tasks", "content_type": 11}}, {"pk": 19, "model": "auth.permission", "fields": {"codename": "add_taskmeta", "name": "Can add task state", "content_type": 7}}, {"pk": 20, "model": "auth.permission", "fields": {"codename": "change_taskmeta", "name": "Can change task state", "content_type": 7}}, {"pk": 21, "model": "auth.permission", "fields": {"codename": "delete_taskmeta", "name": "Can delete task state", "content_type": 7}}, {"pk": 22, "model": "auth.permission", "fields": {"codename": "add_tasksetmeta", "name": "Can add saved group result", "content_type": 8}}, {"pk": 23, "model": "auth.permission", "fields": {"codename": "change_tasksetmeta", "name": "Can change saved group result", "content_type": 8}}, {"pk": 24, "model": "auth.permission", "fields": {"codename": "delete_tasksetmeta", "name": "Can delete saved group result", "content_type": 8}}, {"pk": 40, "model": "auth.permission", "fields": {"codename": "add_taskstate", "name": "Can add task", "content_type": 14}}, {"pk": 41, "model": "auth.permission", "fields": {"codename": "change_taskstate", "name": "Can change task", "content_type": 14}}, {"pk": 42, "model": "auth.permission", "fields": {"codename": "delete_taskstate", "name": "Can delete task", "content_type": 14}}, {"pk": 37, "model": "auth.permission", "fields": {"codename": "add_workerstate", "name": "Can add worker", "content_type": 13}}, {"pk": 38, "model": "auth.permission", "fields": {"codename": "change_workerstate", "name": "Can change worker", "content_type": 13}}, {"pk": 39, "model": "auth.permission", "fields": {"codename": "delete_workerstate", "name": "Can delete worker", "content_type": 13}}, {"pk": 406, "model": "auth.permission", "fields": {"codename": "add_coursevideo", "name": "Can add course video", "content_type": 135}}, {"pk": 407, "model": "auth.permission", "fields": {"codename": "change_coursevideo", "name": "Can change course video", "content_type": 135}}, {"pk": 408, "model": "auth.permission", "fields": {"codename": "delete_coursevideo", "name": "Can delete course video", "content_type": 135}}, {"pk": 409, "model": "auth.permission", "fields": {"codename": "add_encodedvideo", "name": "Can add encoded video", "content_type": 136}}, {"pk": 410, "model": "auth.permission", "fields": {"codename": "change_encodedvideo", "name": "Can change encoded video", "content_type": 136}}, {"pk": 411, "model": "auth.permission", "fields": {"codename": "delete_encodedvideo", "name": "Can delete encoded video", "content_type": 136}}, {"pk": 400, "model": "auth.permission", "fields": {"codename": "add_profile", "name": "Can add profile", "content_type": 133}}, {"pk": 401, "model": "auth.permission", "fields": {"codename": "change_profile", "name": "Can change profile", "content_type": 133}}, {"pk": 402, "model": "auth.permission", "fields": {"codename": "delete_profile", "name": "Can delete profile", "content_type": 133}}, {"pk": 412, "model": "auth.permission", "fields": {"codename": "add_subtitle", "name": "Can add subtitle", "content_type": 137}}, {"pk": 413, "model": "auth.permission", "fields": {"codename": "change_subtitle", "name": "Can change subtitle", "content_type": 137}}, {"pk": 414, "model": "auth.permission", "fields": {"codename": "delete_subtitle", "name": "Can delete subtitle", "content_type": 137}}, {"pk": 403, "model": "auth.permission", "fields": {"codename": "add_video", "name": "Can add video", "content_type": 134}}, {"pk": 404, "model": "auth.permission", "fields": {"codename": "change_video", "name": "Can change video", "content_type": 134}}, {"pk": 405, "model": "auth.permission", "fields": {"codename": "delete_video", "name": "Can delete video", "content_type": 134}}, {"pk": 313, "model": "auth.permission", "fields": {"codename": "add_embargoedcourse", "name": "Can add embargoed course", "content_type": 104}}, {"pk": 314, "model": "auth.permission", "fields": {"codename": "change_embargoedcourse", "name": "Can change embargoed course", "content_type": 104}}, {"pk": 315, "model": "auth.permission", "fields": {"codename": "delete_embargoedcourse", "name": "Can delete embargoed course", "content_type": 104}}, {"pk": 316, "model": "auth.permission", "fields": {"codename": "add_embargoedstate", "name": "Can add embargoed state", "content_type": 105}}, {"pk": 317, "model": "auth.permission", "fields": {"codename": "change_embargoedstate", "name": "Can change embargoed state", "content_type": 105}}, {"pk": 318, "model": "auth.permission", "fields": {"codename": "delete_embargoedstate", "name": "Can delete embargoed state", "content_type": 105}}, {"pk": 319, "model": "auth.permission", "fields": {"codename": "add_ipfilter", "name": "Can add ip filter", "content_type": 106}}, {"pk": 320, "model": "auth.permission", "fields": {"codename": "change_ipfilter", "name": "Can change ip filter", "content_type": 106}}, {"pk": 321, "model": "auth.permission", "fields": {"codename": "delete_ipfilter", "name": "Can delete ip filter", "content_type": 106}}, {"pk": 175, "model": "auth.permission", "fields": {"codename": "add_externalauthmap", "name": "Can add external auth map", "content_type": 59}}, {"pk": 176, "model": "auth.permission", "fields": {"codename": "change_externalauthmap", "name": "Can change external auth map", "content_type": 59}}, {"pk": 177, "model": "auth.permission", "fields": {"codename": "delete_externalauthmap", "name": "Can delete external auth map", "content_type": 59}}, {"pk": 241, "model": "auth.permission", "fields": {"codename": "add_puzzlecomplete", "name": "Can add puzzle complete", "content_type": 80}}, {"pk": 242, "model": "auth.permission", "fields": {"codename": "change_puzzlecomplete", "name": "Can change puzzle complete", "content_type": 80}}, {"pk": 243, "model": "auth.permission", "fields": {"codename": "delete_puzzlecomplete", "name": "Can delete puzzle complete", "content_type": 80}}, {"pk": 238, "model": "auth.permission", "fields": {"codename": "add_score", "name": "Can add score", "content_type": 79}}, {"pk": 239, "model": "auth.permission", "fields": {"codename": "change_score", "name": "Can change score", "content_type": 79}}, {"pk": 240, "model": "auth.permission", "fields": {"codename": "delete_score", "name": "Can delete score", "content_type": 79}}, {"pk": 148, "model": "auth.permission", "fields": {"codename": "add_instructortask", "name": "Can add instructor task", "content_type": 50}}, {"pk": 149, "model": "auth.permission", "fields": {"codename": "change_instructortask", "name": "Can change instructor task", "content_type": 50}}, {"pk": 150, "model": "auth.permission", "fields": {"codename": "delete_instructortask", "name": "Can delete instructor task", "content_type": 50}}, {"pk": 151, "model": "auth.permission", "fields": {"codename": "add_coursesoftware", "name": "Can add course software", "content_type": 51}}, {"pk": 152, "model": "auth.permission", "fields": {"codename": "change_coursesoftware", "name": "Can change course software", "content_type": 51}}, {"pk": 153, "model": "auth.permission", "fields": {"codename": "delete_coursesoftware", "name": "Can delete course software", "content_type": 51}}, {"pk": 154, "model": "auth.permission", "fields": {"codename": "add_userlicense", "name": "Can add user license", "content_type": 52}}, {"pk": 155, "model": "auth.permission", "fields": {"codename": "change_userlicense", "name": "Can change user license", "content_type": 52}}, {"pk": 156, "model": "auth.permission", "fields": {"codename": "delete_userlicense", "name": "Can delete user license", "content_type": 52}}, {"pk": 331, "model": "auth.permission", "fields": {"codename": "add_linkedin", "name": "Can add linked in", "content_type": 110}}, {"pk": 332, "model": "auth.permission", "fields": {"codename": "change_linkedin", "name": "Can change linked in", "content_type": 110}}, {"pk": 333, "model": "auth.permission", "fields": {"codename": "delete_linkedin", "name": "Can delete linked in", "content_type": 110}}, {"pk": 244, "model": "auth.permission", "fields": {"codename": "add_note", "name": "Can add note", "content_type": 81}}, {"pk": 245, "model": "auth.permission", "fields": {"codename": "change_note", "name": "Can change note", "content_type": 81}}, {"pk": 246, "model": "auth.permission", "fields": {"codename": "delete_note", "name": "Can delete note", "content_type": 81}}, {"pk": 184, "model": "auth.permission", "fields": {"codename": "add_accesstoken", "name": "Can add access token", "content_type": 62}}, {"pk": 185, "model": "auth.permission", "fields": {"codename": "change_accesstoken", "name": "Can change access token", "content_type": 62}}, {"pk": 186, "model": "auth.permission", "fields": {"codename": "delete_accesstoken", "name": "Can delete access token", "content_type": 62}}, {"pk": 178, "model": "auth.permission", "fields": {"codename": "add_client", "name": "Can add client", "content_type": 60}}, {"pk": 179, "model": "auth.permission", "fields": {"codename": "change_client", "name": "Can change client", "content_type": 60}}, {"pk": 180, "model": "auth.permission", "fields": {"codename": "delete_client", "name": "Can delete client", "content_type": 60}}, {"pk": 181, "model": "auth.permission", "fields": {"codename": "add_grant", "name": "Can add grant", "content_type": 61}}, {"pk": 182, "model": "auth.permission", "fields": {"codename": "change_grant", "name": "Can change grant", "content_type": 61}}, {"pk": 183, "model": "auth.permission", "fields": {"codename": "delete_grant", "name": "Can delete grant", "content_type": 61}}, {"pk": 187, "model": "auth.permission", "fields": {"codename": "add_refreshtoken", "name": "Can add refresh token", "content_type": 63}}, {"pk": 188, "model": "auth.permission", "fields": {"codename": "change_refreshtoken", "name": "Can change refresh token", "content_type": 63}}, {"pk": 189, "model": "auth.permission", "fields": {"codename": "delete_refreshtoken", "name": "Can delete refresh token", "content_type": 63}}, {"pk": 190, "model": "auth.permission", "fields": {"codename": "add_trustedclient", "name": "Can add trusted client", "content_type": 64}}, {"pk": 191, "model": "auth.permission", "fields": {"codename": "change_trustedclient", "name": "Can change trusted client", "content_type": 64}}, {"pk": 192, "model": "auth.permission", "fields": {"codename": "delete_trustedclient", "name": "Can delete trusted client", "content_type": 64}}, {"pk": 49, "model": "auth.permission", "fields": {"codename": "add_psychometricdata", "name": "Can add psychometric data", "content_type": 17}}, {"pk": 50, "model": "auth.permission", "fields": {"codename": "change_psychometricdata", "name": "Can change psychometric data", "content_type": 17}}, {"pk": 51, "model": "auth.permission", "fields": {"codename": "delete_psychometricdata", "name": "Can delete psychometric data", "content_type": 17}}, {"pk": 310, "model": "auth.permission", "fields": {"codename": "add_midcoursereverificationwindow", "name": "Can add midcourse reverification window", "content_type": 103}}, {"pk": 311, "model": "auth.permission", "fields": {"codename": "change_midcoursereverificationwindow", "name": "Can change midcourse reverification window", "content_type": 103}}, {"pk": 312, "model": "auth.permission", "fields": {"codename": "delete_midcoursereverificationwindow", "name": "Can delete midcourse reverification window", "content_type": 103}}, {"pk": 13, "model": "auth.permission", "fields": {"codename": "add_session", "name": "Can add session", "content_type": 5}}, {"pk": 14, "model": "auth.permission", "fields": {"codename": "change_session", "name": "Can change session", "content_type": 5}}, {"pk": 15, "model": "auth.permission", "fields": {"codename": "delete_session", "name": "Can delete session", "content_type": 5}}, {"pk": 289, "model": "auth.permission", "fields": {"codename": "add_certificateitem", "name": "Can add certificate item", "content_type": 96}}, {"pk": 290, "model": "auth.permission", "fields": {"codename": "change_certificateitem", "name": "Can change certificate item", "content_type": 96}}, {"pk": 291, "model": "auth.permission", "fields": {"codename": "delete_certificateitem", "name": "Can delete certificate item", "content_type": 96}}, {"pk": 271, "model": "auth.permission", "fields": {"codename": "add_coupon", "name": "Can add coupon", "content_type": 90}}, {"pk": 272, "model": "auth.permission", "fields": {"codename": "change_coupon", "name": "Can change coupon", "content_type": 90}}, {"pk": 273, "model": "auth.permission", "fields": {"codename": "delete_coupon", "name": "Can delete coupon", "content_type": 90}}, {"pk": 274, "model": "auth.permission", "fields": {"codename": "add_couponredemption", "name": "Can add coupon redemption", "content_type": 91}}, {"pk": 275, "model": "auth.permission", "fields": {"codename": "change_couponredemption", "name": "Can change coupon redemption", "content_type": 91}}, {"pk": 276, "model": "auth.permission", "fields": {"codename": "delete_couponredemption", "name": "Can delete coupon redemption", "content_type": 91}}, {"pk": 280, "model": "auth.permission", "fields": {"codename": "add_courseregcodeitem", "name": "Can add course reg code item", "content_type": 93}}, {"pk": 281, "model": "auth.permission", "fields": {"codename": "change_courseregcodeitem", "name": "Can change course reg code item", "content_type": 93}}, {"pk": 282, "model": "auth.permission", "fields": {"codename": "delete_courseregcodeitem", "name": "Can delete course reg code item", "content_type": 93}}, {"pk": 283, "model": "auth.permission", "fields": {"codename": "add_courseregcodeitemannotation", "name": "Can add course reg code item annotation", "content_type": 94}}, {"pk": 284, "model": "auth.permission", "fields": {"codename": "change_courseregcodeitemannotation", "name": "Can change course reg code item annotation", "content_type": 94}}, {"pk": 285, "model": "auth.permission", "fields": {"codename": "delete_courseregcodeitemannotation", "name": "Can delete course reg code item annotation", "content_type": 94}}, {"pk": 265, "model": "auth.permission", "fields": {"codename": "add_courseregistrationcode", "name": "Can add course registration code", "content_type": 88}}, {"pk": 266, "model": "auth.permission", "fields": {"codename": "change_courseregistrationcode", "name": "Can change course registration code", "content_type": 88}}, {"pk": 267, "model": "auth.permission", "fields": {"codename": "delete_courseregistrationcode", "name": "Can delete course registration code", "content_type": 88}}, {"pk": 295, "model": "auth.permission", "fields": {"codename": "add_donation", "name": "Can add donation", "content_type": 98}}, {"pk": 296, "model": "auth.permission", "fields": {"codename": "change_donation", "name": "Can change donation", "content_type": 98}}, {"pk": 297, "model": "auth.permission", "fields": {"codename": "delete_donation", "name": "Can delete donation", "content_type": 98}}, {"pk": 292, "model": "auth.permission", "fields": {"codename": "add_donationconfiguration", "name": "Can add donation configuration", "content_type": 97}}, {"pk": 293, "model": "auth.permission", "fields": {"codename": "change_donationconfiguration", "name": "Can change donation configuration", "content_type": 97}}, {"pk": 294, "model": "auth.permission", "fields": {"codename": "delete_donationconfiguration", "name": "Can delete donation configuration", "content_type": 97}}, {"pk": 262, "model": "auth.permission", "fields": {"codename": "add_invoice", "name": "Can add invoice", "content_type": 87}}, {"pk": 263, "model": "auth.permission", "fields": {"codename": "change_invoice", "name": "Can change invoice", "content_type": 87}}, {"pk": 264, "model": "auth.permission", "fields": {"codename": "delete_invoice", "name": "Can delete invoice", "content_type": 87}}, {"pk": 256, "model": "auth.permission", "fields": {"codename": "add_order", "name": "Can add order", "content_type": 85}}, {"pk": 257, "model": "auth.permission", "fields": {"codename": "change_order", "name": "Can change order", "content_type": 85}}, {"pk": 258, "model": "auth.permission", "fields": {"codename": "delete_order", "name": "Can delete order", "content_type": 85}}, {"pk": 259, "model": "auth.permission", "fields": {"codename": "add_orderitem", "name": "Can add order item", "content_type": 86}}, {"pk": 260, "model": "auth.permission", "fields": {"codename": "change_orderitem", "name": "Can change order item", "content_type": 86}}, {"pk": 261, "model": "auth.permission", "fields": {"codename": "delete_orderitem", "name": "Can delete order item", "content_type": 86}}, {"pk": 277, "model": "auth.permission", "fields": {"codename": "add_paidcourseregistration", "name": "Can add paid course registration", "content_type": 92}}, {"pk": 278, "model": "auth.permission", "fields": {"codename": "change_paidcourseregistration", "name": "Can change paid course registration", "content_type": 92}}, {"pk": 279, "model": "auth.permission", "fields": {"codename": "delete_paidcourseregistration", "name": "Can delete paid course registration", "content_type": 92}}, {"pk": 286, "model": "auth.permission", "fields": {"codename": "add_paidcourseregistrationannotation", "name": "Can add paid course registration annotation", "content_type": 95}}, {"pk": 287, "model": "auth.permission", "fields": {"codename": "change_paidcourseregistrationannotation", "name": "Can change paid course registration annotation", "content_type": 95}}, {"pk": 288, "model": "auth.permission", "fields": {"codename": "delete_paidcourseregistrationannotation", "name": "Can delete paid course registration annotation", "content_type": 95}}, {"pk": 268, "model": "auth.permission", "fields": {"codename": "add_registrationcoderedemption", "name": "Can add registration code redemption", "content_type": 89}}, {"pk": 269, "model": "auth.permission", "fields": {"codename": "change_registrationcoderedemption", "name": "Can change registration code redemption", "content_type": 89}}, {"pk": 270, "model": "auth.permission", "fields": {"codename": "delete_registrationcoderedemption", "name": "Can delete registration code redemption", "content_type": 89}}, {"pk": 16, "model": "auth.permission", "fields": {"codename": "add_site", "name": "Can add site", "content_type": 6}}, {"pk": 17, "model": "auth.permission", "fields": {"codename": "change_site", "name": "Can change site", "content_type": 6}}, {"pk": 18, "model": "auth.permission", "fields": {"codename": "delete_site", "name": "Can delete site", "content_type": 6}}, {"pk": 43, "model": "auth.permission", "fields": {"codename": "add_migrationhistory", "name": "Can add migration history", "content_type": 15}}, {"pk": 44, "model": "auth.permission", "fields": {"codename": "change_migrationhistory", "name": "Can change migration history", "content_type": 15}}, {"pk": 45, "model": "auth.permission", "fields": {"codename": "delete_migrationhistory", "name": "Can delete migration history", "content_type": 15}}, {"pk": 247, "model": "auth.permission", "fields": {"codename": "add_splashconfig", "name": "Can add splash config", "content_type": 82}}, {"pk": 248, "model": "auth.permission", "fields": {"codename": "change_splashconfig", "name": "Can change splash config", "content_type": 82}}, {"pk": 249, "model": "auth.permission", "fields": {"codename": "delete_splashconfig", "name": "Can delete splash config", "content_type": 82}}, {"pk": 97, "model": "auth.permission", "fields": {"codename": "add_anonymoususerid", "name": "Can add anonymous user id", "content_type": 33}}, {"pk": 98, "model": "auth.permission", "fields": {"codename": "change_anonymoususerid", "name": "Can change anonymous user id", "content_type": 33}}, {"pk": 99, "model": "auth.permission", "fields": {"codename": "delete_anonymoususerid", "name": "Can delete anonymous user id", "content_type": 33}}, {"pk": 133, "model": "auth.permission", "fields": {"codename": "add_courseaccessrole", "name": "Can add course access role", "content_type": 45}}, {"pk": 134, "model": "auth.permission", "fields": {"codename": "change_courseaccessrole", "name": "Can change course access role", "content_type": 45}}, {"pk": 135, "model": "auth.permission", "fields": {"codename": "delete_courseaccessrole", "name": "Can delete course access role", "content_type": 45}}, {"pk": 127, "model": "auth.permission", "fields": {"codename": "add_courseenrollment", "name": "Can add course enrollment", "content_type": 43}}, {"pk": 128, "model": "auth.permission", "fields": {"codename": "change_courseenrollment", "name": "Can change course enrollment", "content_type": 43}}, {"pk": 129, "model": "auth.permission", "fields": {"codename": "delete_courseenrollment", "name": "Can delete course enrollment", "content_type": 43}}, {"pk": 130, "model": "auth.permission", "fields": {"codename": "add_courseenrollmentallowed", "name": "Can add course enrollment allowed", "content_type": 44}}, {"pk": 131, "model": "auth.permission", "fields": {"codename": "change_courseenrollmentallowed", "name": "Can change course enrollment allowed", "content_type": 44}}, {"pk": 132, "model": "auth.permission", "fields": {"codename": "delete_courseenrollmentallowed", "name": "Can delete course enrollment allowed", "content_type": 44}}, {"pk": 136, "model": "auth.permission", "fields": {"codename": "add_dashboardconfiguration", "name": "Can add dashboard configuration", "content_type": 46}}, {"pk": 137, "model": "auth.permission", "fields": {"codename": "change_dashboardconfiguration", "name": "Can change dashboard configuration", "content_type": 46}}, {"pk": 138, "model": "auth.permission", "fields": {"codename": "delete_dashboardconfiguration", "name": "Can delete dashboard configuration", "content_type": 46}}, {"pk": 124, "model": "auth.permission", "fields": {"codename": "add_loginfailures", "name": "Can add login failures", "content_type": 42}}, {"pk": 125, "model": "auth.permission", "fields": {"codename": "change_loginfailures", "name": "Can change login failures", "content_type": 42}}, {"pk": 126, "model": "auth.permission", "fields": {"codename": "delete_loginfailures", "name": "Can delete login failures", "content_type": 42}}, {"pk": 121, "model": "auth.permission", "fields": {"codename": "add_passwordhistory", "name": "Can add password history", "content_type": 41}}, {"pk": 122, "model": "auth.permission", "fields": {"codename": "change_passwordhistory", "name": "Can change password history", "content_type": 41}}, {"pk": 123, "model": "auth.permission", "fields": {"codename": "delete_passwordhistory", "name": "Can delete password history", "content_type": 41}}, {"pk": 118, "model": "auth.permission", "fields": {"codename": "add_pendingemailchange", "name": "Can add pending email change", "content_type": 40}}, {"pk": 119, "model": "auth.permission", "fields": {"codename": "change_pendingemailchange", "name": "Can change pending email change", "content_type": 40}}, {"pk": 120, "model": "auth.permission", "fields": {"codename": "delete_pendingemailchange", "name": "Can delete pending email change", "content_type": 40}}, {"pk": 115, "model": "auth.permission", "fields": {"codename": "add_pendingnamechange", "name": "Can add pending name change", "content_type": 39}}, {"pk": 116, "model": "auth.permission", "fields": {"codename": "change_pendingnamechange", "name": "Can change pending name change", "content_type": 39}}, {"pk": 117, "model": "auth.permission", "fields": {"codename": "delete_pendingnamechange", "name": "Can delete pending name change", "content_type": 39}}, {"pk": 112, "model": "auth.permission", "fields": {"codename": "add_registration", "name": "Can add registration", "content_type": 38}}, {"pk": 113, "model": "auth.permission", "fields": {"codename": "change_registration", "name": "Can change registration", "content_type": 38}}, {"pk": 114, "model": "auth.permission", "fields": {"codename": "delete_registration", "name": "Can delete registration", "content_type": 38}}, {"pk": 103, "model": "auth.permission", "fields": {"codename": "add_userprofile", "name": "Can add user profile", "content_type": 35}}, {"pk": 104, "model": "auth.permission", "fields": {"codename": "change_userprofile", "name": "Can change user profile", "content_type": 35}}, {"pk": 105, "model": "auth.permission", "fields": {"codename": "delete_userprofile", "name": "Can delete user profile", "content_type": 35}}, {"pk": 106, "model": "auth.permission", "fields": {"codename": "add_usersignupsource", "name": "Can add user signup source", "content_type": 36}}, {"pk": 107, "model": "auth.permission", "fields": {"codename": "change_usersignupsource", "name": "Can change user signup source", "content_type": 36}}, {"pk": 108, "model": "auth.permission", "fields": {"codename": "delete_usersignupsource", "name": "Can delete user signup source", "content_type": 36}}, {"pk": 100, "model": "auth.permission", "fields": {"codename": "add_userstanding", "name": "Can add user standing", "content_type": 34}}, {"pk": 101, "model": "auth.permission", "fields": {"codename": "change_userstanding", "name": "Can change user standing", "content_type": 34}}, {"pk": 102, "model": "auth.permission", "fields": {"codename": "delete_userstanding", "name": "Can delete user standing", "content_type": 34}}, {"pk": 109, "model": "auth.permission", "fields": {"codename": "add_usertestgroup", "name": "Can add user test group", "content_type": 37}}, {"pk": 110, "model": "auth.permission", "fields": {"codename": "change_usertestgroup", "name": "Can change user test group", "content_type": 37}}, {"pk": 111, "model": "auth.permission", "fields": {"codename": "delete_usertestgroup", "name": "Can delete user test group", "content_type": 37}}, {"pk": 340, "model": "auth.permission", "fields": {"codename": "add_score", "name": "Can add score", "content_type": 113}}, {"pk": 341, "model": "auth.permission", "fields": {"codename": "change_score", "name": "Can change score", "content_type": 113}}, {"pk": 342, "model": "auth.permission", "fields": {"codename": "delete_score", "name": "Can delete score", "content_type": 113}}, {"pk": 343, "model": "auth.permission", "fields": {"codename": "add_scoresummary", "name": "Can add score summary", "content_type": 114}}, {"pk": 344, "model": "auth.permission", "fields": {"codename": "change_scoresummary", "name": "Can change score summary", "content_type": 114}}, {"pk": 345, "model": "auth.permission", "fields": {"codename": "delete_scoresummary", "name": "Can delete score summary", "content_type": 114}}, {"pk": 334, "model": "auth.permission", "fields": {"codename": "add_studentitem", "name": "Can add student item", "content_type": 111}}, {"pk": 335, "model": "auth.permission", "fields": {"codename": "change_studentitem", "name": "Can change student item", "content_type": 111}}, {"pk": 336, "model": "auth.permission", "fields": {"codename": "delete_studentitem", "name": "Can delete student item", "content_type": 111}}, {"pk": 337, "model": "auth.permission", "fields": {"codename": "add_submission", "name": "Can add submission", "content_type": 112}}, {"pk": 338, "model": "auth.permission", "fields": {"codename": "change_submission", "name": "Can change submission", "content_type": 112}}, {"pk": 339, "model": "auth.permission", "fields": {"codename": "delete_submission", "name": "Can delete submission", "content_type": 112}}, {"pk": 328, "model": "auth.permission", "fields": {"codename": "add_surveyanswer", "name": "Can add survey answer", "content_type": 109}}, {"pk": 329, "model": "auth.permission", "fields": {"codename": "change_surveyanswer", "name": "Can change survey answer", "content_type": 109}}, {"pk": 330, "model": "auth.permission", "fields": {"codename": "delete_surveyanswer", "name": "Can delete survey answer", "content_type": 109}}, {"pk": 325, "model": "auth.permission", "fields": {"codename": "add_surveyform", "name": "Can add survey form", "content_type": 108}}, {"pk": 326, "model": "auth.permission", "fields": {"codename": "change_surveyform", "name": "Can change survey form", "content_type": 108}}, {"pk": 327, "model": "auth.permission", "fields": {"codename": "delete_surveyform", "name": "Can delete survey form", "content_type": 108}}, {"pk": 139, "model": "auth.permission", "fields": {"codename": "add_trackinglog", "name": "Can add tracking log", "content_type": 47}}, {"pk": 140, "model": "auth.permission", "fields": {"codename": "change_trackinglog", "name": "Can change tracking log", "content_type": 47}}, {"pk": 141, "model": "auth.permission", "fields": {"codename": "delete_trackinglog", "name": "Can delete tracking log", "content_type": 47}}, {"pk": 253, "model": "auth.permission", "fields": {"codename": "add_usercoursetag", "name": "Can add user course tag", "content_type": 84}}, {"pk": 254, "model": "auth.permission", "fields": {"codename": "change_usercoursetag", "name": "Can change user course tag", "content_type": 84}}, {"pk": 255, "model": "auth.permission", "fields": {"codename": "delete_usercoursetag", "name": "Can delete user course tag", "content_type": 84}}, {"pk": 250, "model": "auth.permission", "fields": {"codename": "add_userpreference", "name": "Can add user preference", "content_type": 83}}, {"pk": 251, "model": "auth.permission", "fields": {"codename": "change_userpreference", "name": "Can change user preference", "content_type": 83}}, {"pk": 252, "model": "auth.permission", "fields": {"codename": "delete_userpreference", "name": "Can delete user preference", "content_type": 83}}, {"pk": 304, "model": "auth.permission", "fields": {"codename": "add_softwaresecurephotoverification", "name": "Can add software secure photo verification", "content_type": 101}}, {"pk": 305, "model": "auth.permission", "fields": {"codename": "change_softwaresecurephotoverification", "name": "Can change software secure photo verification", "content_type": 101}}, {"pk": 306, "model": "auth.permission", "fields": {"codename": "delete_softwaresecurephotoverification", "name": "Can delete software secure photo verification", "content_type": 101}}, {"pk": 193, "model": "auth.permission", "fields": {"codename": "add_article", "name": "Can add article", "content_type": 65}}, {"pk": 197, "model": "auth.permission", "fields": {"codename": "assign", "name": "Can change ownership of any article", "content_type": 65}}, {"pk": 194, "model": "auth.permission", "fields": {"codename": "change_article", "name": "Can change article", "content_type": 65}}, {"pk": 195, "model": "auth.permission", "fields": {"codename": "delete_article", "name": "Can delete article", "content_type": 65}}, {"pk": 198, "model": "auth.permission", "fields": {"codename": "grant", "name": "Can assign permissions to other users", "content_type": 65}}, {"pk": 196, "model": "auth.permission", "fields": {"codename": "moderate", "name": "Can edit all articles and lock/unlock/restore", "content_type": 65}}, {"pk": 199, "model": "auth.permission", "fields": {"codename": "add_articleforobject", "name": "Can add Article for object", "content_type": 66}}, {"pk": 200, "model": "auth.permission", "fields": {"codename": "change_articleforobject", "name": "Can change Article for object", "content_type": 66}}, {"pk": 201, "model": "auth.permission", "fields": {"codename": "delete_articleforobject", "name": "Can delete Article for object", "content_type": 66}}, {"pk": 208, "model": "auth.permission", "fields": {"codename": "add_articleplugin", "name": "Can add article plugin", "content_type": 69}}, {"pk": 209, "model": "auth.permission", "fields": {"codename": "change_articleplugin", "name": "Can change article plugin", "content_type": 69}}, {"pk": 210, "model": "auth.permission", "fields": {"codename": "delete_articleplugin", "name": "Can delete article plugin", "content_type": 69}}, {"pk": 202, "model": "auth.permission", "fields": {"codename": "add_articlerevision", "name": "Can add article revision", "content_type": 67}}, {"pk": 203, "model": "auth.permission", "fields": {"codename": "change_articlerevision", "name": "Can change article revision", "content_type": 67}}, {"pk": 204, "model": "auth.permission", "fields": {"codename": "delete_articlerevision", "name": "Can delete article revision", "content_type": 67}}, {"pk": 223, "model": "auth.permission", "fields": {"codename": "add_articlesubscription", "name": "Can add article subscription", "content_type": 74}}, {"pk": 224, "model": "auth.permission", "fields": {"codename": "change_articlesubscription", "name": "Can change article subscription", "content_type": 74}}, {"pk": 225, "model": "auth.permission", "fields": {"codename": "delete_articlesubscription", "name": "Can delete article subscription", "content_type": 74}}, {"pk": 211, "model": "auth.permission", "fields": {"codename": "add_reusableplugin", "name": "Can add reusable plugin", "content_type": 70}}, {"pk": 212, "model": "auth.permission", "fields": {"codename": "change_reusableplugin", "name": "Can change reusable plugin", "content_type": 70}}, {"pk": 213, "model": "auth.permission", "fields": {"codename": "delete_reusableplugin", "name": "Can delete reusable plugin", "content_type": 70}}, {"pk": 217, "model": "auth.permission", "fields": {"codename": "add_revisionplugin", "name": "Can add revision plugin", "content_type": 72}}, {"pk": 218, "model": "auth.permission", "fields": {"codename": "change_revisionplugin", "name": "Can change revision plugin", "content_type": 72}}, {"pk": 219, "model": "auth.permission", "fields": {"codename": "delete_revisionplugin", "name": "Can delete revision plugin", "content_type": 72}}, {"pk": 220, "model": "auth.permission", "fields": {"codename": "add_revisionpluginrevision", "name": "Can add revision plugin revision", "content_type": 73}}, {"pk": 221, "model": "auth.permission", "fields": {"codename": "change_revisionpluginrevision", "name": "Can change revision plugin revision", "content_type": 73}}, {"pk": 222, "model": "auth.permission", "fields": {"codename": "delete_revisionpluginrevision", "name": "Can delete revision plugin revision", "content_type": 73}}, {"pk": 214, "model": "auth.permission", "fields": {"codename": "add_simpleplugin", "name": "Can add simple plugin", "content_type": 71}}, {"pk": 215, "model": "auth.permission", "fields": {"codename": "change_simpleplugin", "name": "Can change simple plugin", "content_type": 71}}, {"pk": 216, "model": "auth.permission", "fields": {"codename": "delete_simpleplugin", "name": "Can delete simple plugin", "content_type": 71}}, {"pk": 205, "model": "auth.permission", "fields": {"codename": "add_urlpath", "name": "Can add URL path", "content_type": 68}}, {"pk": 206, "model": "auth.permission", "fields": {"codename": "change_urlpath", "name": "Can change URL path", "content_type": 68}}, {"pk": 207, "model": "auth.permission", "fields": {"codename": "delete_urlpath", "name": "Can delete URL path", "content_type": 68}}, {"pk": 394, "model": "auth.permission", "fields": {"codename": "add_assessmentworkflow", "name": "Can add assessment workflow", "content_type": 131}}, {"pk": 395, "model": "auth.permission", "fields": {"codename": "change_assessmentworkflow", "name": "Can change assessment workflow", "content_type": 131}}, {"pk": 396, "model": "auth.permission", "fields": {"codename": "delete_assessmentworkflow", "name": "Can delete assessment workflow", "content_type": 131}}, {"pk": 397, "model": "auth.permission", "fields": {"codename": "add_assessmentworkflowstep", "name": "Can add assessment workflow step", "content_type": 132}}, {"pk": 398, "model": "auth.permission", "fields": {"codename": "change_assessmentworkflowstep", "name": "Can change assessment workflow step", "content_type": 132}}, {"pk": 399, "model": "auth.permission", "fields": {"codename": "delete_assessmentworkflowstep", "name": "Can delete assessment workflow step", "content_type": 132}}, {"pk": 1, "model": "dark_lang.darklangconfig", "fields": {"change_date": "2014-11-13T22:49:43Z", "changed_by": null, "enabled": true, "released_languages": ""}}] \ No newline at end of file +[{"pk": 62, "model": "contenttypes.contenttype", "fields": {"model": "accesstoken", "name": "access token", "app_label": "oauth2"}}, {"pk": 131, "model": "contenttypes.contenttype", "fields": {"model": "aiclassifier", "name": "ai classifier", "app_label": "assessment"}}, {"pk": 130, "model": "contenttypes.contenttype", "fields": {"model": "aiclassifierset", "name": "ai classifier set", "app_label": "assessment"}}, {"pk": 133, "model": "contenttypes.contenttype", "fields": {"model": "aigradingworkflow", "name": "ai grading workflow", "app_label": "assessment"}}, {"pk": 132, "model": "contenttypes.contenttype", "fields": {"model": "aitrainingworkflow", "name": "ai training workflow", "app_label": "assessment"}}, {"pk": 33, "model": "contenttypes.contenttype", "fields": {"model": "anonymoususerid", "name": "anonymous user id", "app_label": "student"}}, {"pk": 112, "model": "contenttypes.contenttype", "fields": {"model": "answer", "name": "answer", "app_label": "mentoring"}}, {"pk": 65, "model": "contenttypes.contenttype", "fields": {"model": "article", "name": "article", "app_label": "wiki"}}, {"pk": 66, "model": "contenttypes.contenttype", "fields": {"model": "articleforobject", "name": "Article for object", "app_label": "wiki"}}, {"pk": 69, "model": "contenttypes.contenttype", "fields": {"model": "articleplugin", "name": "article plugin", "app_label": "wiki"}}, {"pk": 67, "model": "contenttypes.contenttype", "fields": {"model": "articlerevision", "name": "article revision", "app_label": "wiki"}}, {"pk": 74, "model": "contenttypes.contenttype", "fields": {"model": "articlesubscription", "name": "article subscription", "app_label": "wiki"}}, {"pk": 121, "model": "contenttypes.contenttype", "fields": {"model": "assessment", "name": "assessment", "app_label": "assessment"}}, {"pk": 124, "model": "contenttypes.contenttype", "fields": {"model": "assessmentfeedback", "name": "assessment feedback", "app_label": "assessment"}}, {"pk": 123, "model": "contenttypes.contenttype", "fields": {"model": "assessmentfeedbackoption", "name": "assessment feedback option", "app_label": "assessment"}}, {"pk": 122, "model": "contenttypes.contenttype", "fields": {"model": "assessmentpart", "name": "assessment part", "app_label": "assessment"}}, {"pk": 134, "model": "contenttypes.contenttype", "fields": {"model": "assessmentworkflow", "name": "assessment workflow", "app_label": "workflow"}}, {"pk": 135, "model": "contenttypes.contenttype", "fields": {"model": "assessmentworkflowstep", "name": "assessment workflow step", "app_label": "workflow"}}, {"pk": 19, "model": "contenttypes.contenttype", "fields": {"model": "association", "name": "association", "app_label": "django_openid_auth"}}, {"pk": 24, "model": "contenttypes.contenttype", "fields": {"model": "association", "name": "association", "app_label": "default"}}, {"pk": 97, "model": "contenttypes.contenttype", "fields": {"model": "certificateitem", "name": "certificate item", "app_label": "shoppingcart"}}, {"pk": 48, "model": "contenttypes.contenttype", "fields": {"model": "certificatewhitelist", "name": "certificate whitelist", "app_label": "certificates"}}, {"pk": 60, "model": "contenttypes.contenttype", "fields": {"model": "client", "name": "client", "app_label": "oauth2"}}, {"pk": 25, "model": "contenttypes.contenttype", "fields": {"model": "code", "name": "code", "app_label": "default"}}, {"pk": 4, "model": "contenttypes.contenttype", "fields": {"model": "contenttype", "name": "content type", "app_label": "contenttypes"}}, {"pk": 91, "model": "contenttypes.contenttype", "fields": {"model": "coupon", "name": "coupon", "app_label": "shoppingcart"}}, {"pk": 92, "model": "contenttypes.contenttype", "fields": {"model": "couponredemption", "name": "coupon redemption", "app_label": "shoppingcart"}}, {"pk": 45, "model": "contenttypes.contenttype", "fields": {"model": "courseaccessrole", "name": "course access role", "app_label": "student"}}, {"pk": 58, "model": "contenttypes.contenttype", "fields": {"model": "courseauthorization", "name": "course authorization", "app_label": "bulk_email"}}, {"pk": 144, "model": "contenttypes.contenttype", "fields": {"model": "coursecontentmilestone", "name": "course content milestone", "app_label": "milestones"}}, {"pk": 147, "model": "contenttypes.contenttype", "fields": {"model": "coursecreator", "name": "course creator", "app_label": "course_creators"}}, {"pk": 55, "model": "contenttypes.contenttype", "fields": {"model": "courseemail", "name": "course email", "app_label": "bulk_email"}}, {"pk": 57, "model": "contenttypes.contenttype", "fields": {"model": "courseemailtemplate", "name": "course email template", "app_label": "bulk_email"}}, {"pk": 43, "model": "contenttypes.contenttype", "fields": {"model": "courseenrollment", "name": "course enrollment", "app_label": "student"}}, {"pk": 44, "model": "contenttypes.contenttype", "fields": {"model": "courseenrollmentallowed", "name": "course enrollment allowed", "app_label": "student"}}, {"pk": 143, "model": "contenttypes.contenttype", "fields": {"model": "coursemilestone", "name": "course milestone", "app_label": "milestones"}}, {"pk": 100, "model": "contenttypes.contenttype", "fields": {"model": "coursemode", "name": "course mode", "app_label": "course_modes"}}, {"pk": 101, "model": "contenttypes.contenttype", "fields": {"model": "coursemodesarchive", "name": "course modes archive", "app_label": "course_modes"}}, {"pk": 94, "model": "contenttypes.contenttype", "fields": {"model": "courseregcodeitem", "name": "course reg code item", "app_label": "shoppingcart"}}, {"pk": 95, "model": "contenttypes.contenttype", "fields": {"model": "courseregcodeitemannotation", "name": "course reg code item annotation", "app_label": "shoppingcart"}}, {"pk": 89, "model": "contenttypes.contenttype", "fields": {"model": "courseregistrationcode", "name": "course registration code", "app_label": "shoppingcart"}}, {"pk": 108, "model": "contenttypes.contenttype", "fields": {"model": "coursererunstate", "name": "course rerun state", "app_label": "course_action_state"}}, {"pk": 51, "model": "contenttypes.contenttype", "fields": {"model": "coursesoftware", "name": "course software", "app_label": "licenses"}}, {"pk": 53, "model": "contenttypes.contenttype", "fields": {"model": "courseusergroup", "name": "course user group", "app_label": "course_groups"}}, {"pk": 54, "model": "contenttypes.contenttype", "fields": {"model": "courseusergrouppartitiongroup", "name": "course user group partition group", "app_label": "course_groups"}}, {"pk": 138, "model": "contenttypes.contenttype", "fields": {"model": "coursevideo", "name": "course video", "app_label": "edxval"}}, {"pk": 119, "model": "contenttypes.contenttype", "fields": {"model": "criterion", "name": "criterion", "app_label": "assessment"}}, {"pk": 120, "model": "contenttypes.contenttype", "fields": {"model": "criterionoption", "name": "criterion option", "app_label": "assessment"}}, {"pk": 10, "model": "contenttypes.contenttype", "fields": {"model": "crontabschedule", "name": "crontab", "app_label": "djcelery"}}, {"pk": 103, "model": "contenttypes.contenttype", "fields": {"model": "darklangconfig", "name": "dark lang config", "app_label": "dark_lang"}}, {"pk": 46, "model": "contenttypes.contenttype", "fields": {"model": "dashboardconfiguration", "name": "dashboard configuration", "app_label": "student"}}, {"pk": 99, "model": "contenttypes.contenttype", "fields": {"model": "donation", "name": "donation", "app_label": "shoppingcart"}}, {"pk": 98, "model": "contenttypes.contenttype", "fields": {"model": "donationconfiguration", "name": "donation configuration", "app_label": "shoppingcart"}}, {"pk": 105, "model": "contenttypes.contenttype", "fields": {"model": "embargoedcourse", "name": "embargoed course", "app_label": "embargo"}}, {"pk": 106, "model": "contenttypes.contenttype", "fields": {"model": "embargoedstate", "name": "embargoed state", "app_label": "embargo"}}, {"pk": 139, "model": "contenttypes.contenttype", "fields": {"model": "encodedvideo", "name": "encoded video", "app_label": "edxval"}}, {"pk": 59, "model": "contenttypes.contenttype", "fields": {"model": "externalauthmap", "name": "external auth map", "app_label": "external_auth"}}, {"pk": 49, "model": "contenttypes.contenttype", "fields": {"model": "generatedcertificate", "name": "generated certificate", "app_label": "certificates"}}, {"pk": 61, "model": "contenttypes.contenttype", "fields": {"model": "grant", "name": "grant", "app_label": "oauth2"}}, {"pk": 2, "model": "contenttypes.contenttype", "fields": {"model": "group", "name": "group", "app_label": "auth"}}, {"pk": 50, "model": "contenttypes.contenttype", "fields": {"model": "instructortask", "name": "instructor task", "app_label": "instructor_task"}}, {"pk": 9, "model": "contenttypes.contenttype", "fields": {"model": "intervalschedule", "name": "interval", "app_label": "djcelery"}}, {"pk": 88, "model": "contenttypes.contenttype", "fields": {"model": "invoice", "name": "invoice", "app_label": "shoppingcart"}}, {"pk": 107, "model": "contenttypes.contenttype", "fields": {"model": "ipfilter", "name": "ip filter", "app_label": "embargo"}}, {"pk": 113, "model": "contenttypes.contenttype", "fields": {"model": "lightchild", "name": "light child", "app_label": "mentoring"}}, {"pk": 21, "model": "contenttypes.contenttype", "fields": {"model": "logentry", "name": "log entry", "app_label": "admin"}}, {"pk": 42, "model": "contenttypes.contenttype", "fields": {"model": "loginfailures", "name": "login failures", "app_label": "student"}}, {"pk": 104, "model": "contenttypes.contenttype", "fields": {"model": "midcoursereverificationwindow", "name": "midcourse reverification window", "app_label": "reverification"}}, {"pk": 15, "model": "contenttypes.contenttype", "fields": {"model": "migrationhistory", "name": "migration history", "app_label": "south"}}, {"pk": 141, "model": "contenttypes.contenttype", "fields": {"model": "milestone", "name": "milestone", "app_label": "milestones"}}, {"pk": 142, "model": "contenttypes.contenttype", "fields": {"model": "milestonerelationshiptype", "name": "milestone relationship type", "app_label": "milestones"}}, {"pk": 18, "model": "contenttypes.contenttype", "fields": {"model": "nonce", "name": "nonce", "app_label": "django_openid_auth"}}, {"pk": 23, "model": "contenttypes.contenttype", "fields": {"model": "nonce", "name": "nonce", "app_label": "default"}}, {"pk": 81, "model": "contenttypes.contenttype", "fields": {"model": "note", "name": "note", "app_label": "notes"}}, {"pk": 78, "model": "contenttypes.contenttype", "fields": {"model": "notification", "name": "notification", "app_label": "django_notify"}}, {"pk": 31, "model": "contenttypes.contenttype", "fields": {"model": "offlinecomputedgrade", "name": "offline computed grade", "app_label": "courseware"}}, {"pk": 32, "model": "contenttypes.contenttype", "fields": {"model": "offlinecomputedgradelog", "name": "offline computed grade log", "app_label": "courseware"}}, {"pk": 56, "model": "contenttypes.contenttype", "fields": {"model": "optout", "name": "optout", "app_label": "bulk_email"}}, {"pk": 86, "model": "contenttypes.contenttype", "fields": {"model": "order", "name": "order", "app_label": "shoppingcart"}}, {"pk": 87, "model": "contenttypes.contenttype", "fields": {"model": "orderitem", "name": "order item", "app_label": "shoppingcart"}}, {"pk": 93, "model": "contenttypes.contenttype", "fields": {"model": "paidcourseregistration", "name": "paid course registration", "app_label": "shoppingcart"}}, {"pk": 96, "model": "contenttypes.contenttype", "fields": {"model": "paidcourseregistrationannotation", "name": "paid course registration annotation", "app_label": "shoppingcart"}}, {"pk": 41, "model": "contenttypes.contenttype", "fields": {"model": "passwordhistory", "name": "password history", "app_label": "student"}}, {"pk": 125, "model": "contenttypes.contenttype", "fields": {"model": "peerworkflow", "name": "peer workflow", "app_label": "assessment"}}, {"pk": 126, "model": "contenttypes.contenttype", "fields": {"model": "peerworkflowitem", "name": "peer workflow item", "app_label": "assessment"}}, {"pk": 40, "model": "contenttypes.contenttype", "fields": {"model": "pendingemailchange", "name": "pending email change", "app_label": "student"}}, {"pk": 39, "model": "contenttypes.contenttype", "fields": {"model": "pendingnamechange", "name": "pending name change", "app_label": "student"}}, {"pk": 12, "model": "contenttypes.contenttype", "fields": {"model": "periodictask", "name": "periodic task", "app_label": "djcelery"}}, {"pk": 11, "model": "contenttypes.contenttype", "fields": {"model": "periodictasks", "name": "periodic tasks", "app_label": "djcelery"}}, {"pk": 1, "model": "contenttypes.contenttype", "fields": {"model": "permission", "name": "permission", "app_label": "auth"}}, {"pk": 136, "model": "contenttypes.contenttype", "fields": {"model": "profile", "name": "profile", "app_label": "edxval"}}, {"pk": 17, "model": "contenttypes.contenttype", "fields": {"model": "psychometricdata", "name": "psychometric data", "app_label": "psychometrics"}}, {"pk": 80, "model": "contenttypes.contenttype", "fields": {"model": "puzzlecomplete", "name": "puzzle complete", "app_label": "foldit"}}, {"pk": 63, "model": "contenttypes.contenttype", "fields": {"model": "refreshtoken", "name": "refresh token", "app_label": "oauth2"}}, {"pk": 38, "model": "contenttypes.contenttype", "fields": {"model": "registration", "name": "registration", "app_label": "student"}}, {"pk": 90, "model": "contenttypes.contenttype", "fields": {"model": "registrationcoderedemption", "name": "registration code redemption", "app_label": "shoppingcart"}}, {"pk": 70, "model": "contenttypes.contenttype", "fields": {"model": "reusableplugin", "name": "reusable plugin", "app_label": "wiki"}}, {"pk": 72, "model": "contenttypes.contenttype", "fields": {"model": "revisionplugin", "name": "revision plugin", "app_label": "wiki"}}, {"pk": 73, "model": "contenttypes.contenttype", "fields": {"model": "revisionpluginrevision", "name": "revision plugin revision", "app_label": "wiki"}}, {"pk": 118, "model": "contenttypes.contenttype", "fields": {"model": "rubric", "name": "rubric", "app_label": "assessment"}}, {"pk": 8, "model": "contenttypes.contenttype", "fields": {"model": "tasksetmeta", "name": "saved group result", "app_label": "djcelery"}}, {"pk": 79, "model": "contenttypes.contenttype", "fields": {"model": "score", "name": "score", "app_label": "foldit"}}, {"pk": 116, "model": "contenttypes.contenttype", "fields": {"model": "score", "name": "score", "app_label": "submissions"}}, {"pk": 117, "model": "contenttypes.contenttype", "fields": {"model": "scoresummary", "name": "score summary", "app_label": "submissions"}}, {"pk": 16, "model": "contenttypes.contenttype", "fields": {"model": "servercircuit", "name": "server circuit", "app_label": "circuit"}}, {"pk": 5, "model": "contenttypes.contenttype", "fields": {"model": "session", "name": "session", "app_label": "sessions"}}, {"pk": 76, "model": "contenttypes.contenttype", "fields": {"model": "settings", "name": "settings", "app_label": "django_notify"}}, {"pk": 71, "model": "contenttypes.contenttype", "fields": {"model": "simpleplugin", "name": "simple plugin", "app_label": "wiki"}}, {"pk": 6, "model": "contenttypes.contenttype", "fields": {"model": "site", "name": "site", "app_label": "sites"}}, {"pk": 102, "model": "contenttypes.contenttype", "fields": {"model": "softwaresecurephotoverification", "name": "software secure photo verification", "app_label": "verify_student"}}, {"pk": 82, "model": "contenttypes.contenttype", "fields": {"model": "splashconfig", "name": "splash config", "app_label": "splash"}}, {"pk": 114, "model": "contenttypes.contenttype", "fields": {"model": "studentitem", "name": "student item", "app_label": "submissions"}}, {"pk": 26, "model": "contenttypes.contenttype", "fields": {"model": "studentmodule", "name": "student module", "app_label": "courseware"}}, {"pk": 27, "model": "contenttypes.contenttype", "fields": {"model": "studentmodulehistory", "name": "student module history", "app_label": "courseware"}}, {"pk": 128, "model": "contenttypes.contenttype", "fields": {"model": "studenttrainingworkflow", "name": "student training workflow", "app_label": "assessment"}}, {"pk": 129, "model": "contenttypes.contenttype", "fields": {"model": "studenttrainingworkflowitem", "name": "student training workflow item", "app_label": "assessment"}}, {"pk": 148, "model": "contenttypes.contenttype", "fields": {"model": "studioconfig", "name": "studio config", "app_label": "xblock_config"}}, {"pk": 115, "model": "contenttypes.contenttype", "fields": {"model": "submission", "name": "submission", "app_label": "submissions"}}, {"pk": 77, "model": "contenttypes.contenttype", "fields": {"model": "subscription", "name": "subscription", "app_label": "django_notify"}}, {"pk": 140, "model": "contenttypes.contenttype", "fields": {"model": "subtitle", "name": "subtitle", "app_label": "edxval"}}, {"pk": 110, "model": "contenttypes.contenttype", "fields": {"model": "surveyanswer", "name": "survey answer", "app_label": "survey"}}, {"pk": 109, "model": "contenttypes.contenttype", "fields": {"model": "surveyform", "name": "survey form", "app_label": "survey"}}, {"pk": 14, "model": "contenttypes.contenttype", "fields": {"model": "taskstate", "name": "task", "app_label": "djcelery"}}, {"pk": 7, "model": "contenttypes.contenttype", "fields": {"model": "taskmeta", "name": "task state", "app_label": "djcelery"}}, {"pk": 47, "model": "contenttypes.contenttype", "fields": {"model": "trackinglog", "name": "tracking log", "app_label": "track"}}, {"pk": 127, "model": "contenttypes.contenttype", "fields": {"model": "trainingexample", "name": "training example", "app_label": "assessment"}}, {"pk": 64, "model": "contenttypes.contenttype", "fields": {"model": "trustedclient", "name": "trusted client", "app_label": "oauth2_provider"}}, {"pk": 75, "model": "contenttypes.contenttype", "fields": {"model": "notificationtype", "name": "type", "app_label": "django_notify"}}, {"pk": 68, "model": "contenttypes.contenttype", "fields": {"model": "urlpath", "name": "URL path", "app_label": "wiki"}}, {"pk": 3, "model": "contenttypes.contenttype", "fields": {"model": "user", "name": "user", "app_label": "auth"}}, {"pk": 84, "model": "contenttypes.contenttype", "fields": {"model": "usercoursetag", "name": "user course tag", "app_label": "user_api"}}, {"pk": 52, "model": "contenttypes.contenttype", "fields": {"model": "userlicense", "name": "user license", "app_label": "licenses"}}, {"pk": 145, "model": "contenttypes.contenttype", "fields": {"model": "usermilestone", "name": "user milestone", "app_label": "milestones"}}, {"pk": 20, "model": "contenttypes.contenttype", "fields": {"model": "useropenid", "name": "user open id", "app_label": "django_openid_auth"}}, {"pk": 85, "model": "contenttypes.contenttype", "fields": {"model": "userorgtag", "name": "user org tag", "app_label": "user_api"}}, {"pk": 83, "model": "contenttypes.contenttype", "fields": {"model": "userpreference", "name": "user preference", "app_label": "user_api"}}, {"pk": 35, "model": "contenttypes.contenttype", "fields": {"model": "userprofile", "name": "user profile", "app_label": "student"}}, {"pk": 36, "model": "contenttypes.contenttype", "fields": {"model": "usersignupsource", "name": "user signup source", "app_label": "student"}}, {"pk": 22, "model": "contenttypes.contenttype", "fields": {"model": "usersocialauth", "name": "user social auth", "app_label": "default"}}, {"pk": 34, "model": "contenttypes.contenttype", "fields": {"model": "userstanding", "name": "user standing", "app_label": "student"}}, {"pk": 37, "model": "contenttypes.contenttype", "fields": {"model": "usertestgroup", "name": "user test group", "app_label": "student"}}, {"pk": 137, "model": "contenttypes.contenttype", "fields": {"model": "video", "name": "video", "app_label": "edxval"}}, {"pk": 146, "model": "contenttypes.contenttype", "fields": {"model": "videouploadconfig", "name": "video upload config", "app_label": "contentstore"}}, {"pk": 13, "model": "contenttypes.contenttype", "fields": {"model": "workerstate", "name": "worker", "app_label": "djcelery"}}, {"pk": 111, "model": "contenttypes.contenttype", "fields": {"model": "xblockasidesconfig", "name": "x block asides config", "app_label": "lms_xblock"}}, {"pk": 30, "model": "contenttypes.contenttype", "fields": {"model": "xmodulestudentinfofield", "name": "x module student info field", "app_label": "courseware"}}, {"pk": 29, "model": "contenttypes.contenttype", "fields": {"model": "xmodulestudentprefsfield", "name": "x module student prefs field", "app_label": "courseware"}}, {"pk": 28, "model": "contenttypes.contenttype", "fields": {"model": "xmoduleuserstatesummaryfield", "name": "x module user state summary field", "app_label": "courseware"}}, {"pk": 1, "model": "sites.site", "fields": {"domain": "example.com", "name": "example.com"}}, {"pk": 1, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:15Z", "app_name": "courseware", "migration": "0001_initial"}}, {"pk": 2, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:15Z", "app_name": "courseware", "migration": "0002_add_indexes"}}, {"pk": 3, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:15Z", "app_name": "courseware", "migration": "0003_done_grade_cache"}}, {"pk": 4, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:15Z", "app_name": "courseware", "migration": "0004_add_field_studentmodule_course_id"}}, {"pk": 5, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:15Z", "app_name": "courseware", "migration": "0005_auto__add_offlinecomputedgrade__add_unique_offlinecomputedgrade_user_c"}}, {"pk": 6, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:15Z", "app_name": "courseware", "migration": "0006_create_student_module_history"}}, {"pk": 7, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:15Z", "app_name": "courseware", "migration": "0007_allow_null_version_in_history"}}, {"pk": 8, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:16Z", "app_name": "courseware", "migration": "0008_add_xmodule_storage"}}, {"pk": 9, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:16Z", "app_name": "courseware", "migration": "0009_add_field_default"}}, {"pk": 10, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:16Z", "app_name": "courseware", "migration": "0010_rename_xblock_field_content_to_user_state_summary"}}, {"pk": 11, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:16Z", "app_name": "student", "migration": "0001_initial"}}, {"pk": 12, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:16Z", "app_name": "student", "migration": "0002_text_to_varchar_and_indexes"}}, {"pk": 13, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:17Z", "app_name": "student", "migration": "0003_auto__add_usertestgroup"}}, {"pk": 14, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:17Z", "app_name": "student", "migration": "0004_add_email_index"}}, {"pk": 15, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:17Z", "app_name": "student", "migration": "0005_name_change"}}, {"pk": 16, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:17Z", "app_name": "student", "migration": "0006_expand_meta_field"}}, {"pk": 17, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:17Z", "app_name": "student", "migration": "0007_convert_to_utf8"}}, {"pk": 18, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:17Z", "app_name": "student", "migration": "0008__auto__add_courseregistration"}}, {"pk": 19, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:17Z", "app_name": "student", "migration": "0009_auto__del_courseregistration__add_courseenrollment"}}, {"pk": 20, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:17Z", "app_name": "student", "migration": "0010_auto__chg_field_courseenrollment_course_id"}}, {"pk": 21, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:17Z", "app_name": "student", "migration": "0011_auto__chg_field_courseenrollment_user__del_unique_courseenrollment_use"}}, {"pk": 22, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:17Z", "app_name": "student", "migration": "0012_auto__add_field_userprofile_gender__add_field_userprofile_date_of_birt"}}, {"pk": 23, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:17Z", "app_name": "student", "migration": "0013_auto__chg_field_userprofile_meta"}}, {"pk": 24, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:17Z", "app_name": "student", "migration": "0014_auto__del_courseenrollment"}}, {"pk": 25, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:17Z", "app_name": "student", "migration": "0015_auto__add_courseenrollment__add_unique_courseenrollment_user_course_id"}}, {"pk": 26, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:17Z", "app_name": "student", "migration": "0016_auto__add_field_courseenrollment_date__chg_field_userprofile_country"}}, {"pk": 27, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:17Z", "app_name": "student", "migration": "0017_rename_date_to_created"}}, {"pk": 28, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:17Z", "app_name": "student", "migration": "0018_auto"}}, {"pk": 29, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:17Z", "app_name": "student", "migration": "0019_create_approved_demographic_fields_fall_2012"}}, {"pk": 30, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:18Z", "app_name": "student", "migration": "0020_add_test_center_user"}}, {"pk": 31, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:18Z", "app_name": "student", "migration": "0021_remove_askbot"}}, {"pk": 32, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:18Z", "app_name": "student", "migration": "0022_auto__add_courseenrollmentallowed__add_unique_courseenrollmentallowed_"}}, {"pk": 33, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:18Z", "app_name": "student", "migration": "0023_add_test_center_registration"}}, {"pk": 34, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:18Z", "app_name": "student", "migration": "0024_add_allow_certificate"}}, {"pk": 35, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:18Z", "app_name": "student", "migration": "0025_auto__add_field_courseenrollmentallowed_auto_enroll"}}, {"pk": 36, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:18Z", "app_name": "student", "migration": "0026_auto__remove_index_student_testcenterregistration_accommodation_request"}}, {"pk": 37, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:18Z", "app_name": "student", "migration": "0027_add_active_flag_and_mode_to_courseware_enrollment"}}, {"pk": 38, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:19Z", "app_name": "student", "migration": "0028_auto__add_userstanding"}}, {"pk": 39, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:19Z", "app_name": "student", "migration": "0029_add_lookup_table_between_user_and_anonymous_student_id"}}, {"pk": 40, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:19Z", "app_name": "student", "migration": "0029_remove_pearson"}}, {"pk": 41, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:19Z", "app_name": "student", "migration": "0030_auto__chg_field_anonymoususerid_anonymous_user_id"}}, {"pk": 42, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:19Z", "app_name": "student", "migration": "0031_drop_student_anonymoususerid_temp_archive"}}, {"pk": 43, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:19Z", "app_name": "student", "migration": "0032_add_field_UserProfile_country_add_field_UserProfile_city"}}, {"pk": 44, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:19Z", "app_name": "student", "migration": "0032_auto__add_loginfailures"}}, {"pk": 45, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:19Z", "app_name": "student", "migration": "0033_auto__add_passwordhistory"}}, {"pk": 46, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:19Z", "app_name": "student", "migration": "0034_auto__add_courseaccessrole"}}, {"pk": 47, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:20Z", "app_name": "student", "migration": "0035_access_roles"}}, {"pk": 48, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:20Z", "app_name": "student", "migration": "0036_access_roles_orgless"}}, {"pk": 49, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:20Z", "app_name": "student", "migration": "0037_auto__add_courseregistrationcode"}}, {"pk": 50, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:20Z", "app_name": "student", "migration": "0038_auto__add_usersignupsource"}}, {"pk": 51, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:20Z", "app_name": "student", "migration": "0039_auto__del_courseregistrationcode"}}, {"pk": 52, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:20Z", "app_name": "student", "migration": "0040_auto__del_field_usersignupsource_user_id__add_field_usersignupsource_u"}}, {"pk": 53, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:20Z", "app_name": "student", "migration": "0041_add_dashboard_config"}}, {"pk": 54, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:20Z", "app_name": "student", "migration": "0042_grant_sales_admin_roles"}}, {"pk": 55, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:20Z", "app_name": "track", "migration": "0001_initial"}}, {"pk": 56, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:20Z", "app_name": "track", "migration": "0002_auto__add_field_trackinglog_host__chg_field_trackinglog_event_type__ch"}}, {"pk": 57, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:21Z", "app_name": "certificates", "migration": "0001_added_generatedcertificates"}}, {"pk": 58, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:21Z", "app_name": "certificates", "migration": "0002_auto__add_field_generatedcertificate_download_url"}}, {"pk": 59, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:21Z", "app_name": "certificates", "migration": "0003_auto__add_field_generatedcertificate_enabled"}}, {"pk": 60, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:21Z", "app_name": "certificates", "migration": "0004_auto__add_field_generatedcertificate_graded_certificate_id__add_field_"}}, {"pk": 61, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:21Z", "app_name": "certificates", "migration": "0005_auto__add_field_generatedcertificate_name"}}, {"pk": 62, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:21Z", "app_name": "certificates", "migration": "0006_auto__chg_field_generatedcertificate_certificate_id"}}, {"pk": 63, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:21Z", "app_name": "certificates", "migration": "0007_auto__add_revokedcertificate"}}, {"pk": 64, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:21Z", "app_name": "certificates", "migration": "0008_auto__del_revokedcertificate__del_field_generatedcertificate_name__add"}}, {"pk": 65, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:21Z", "app_name": "certificates", "migration": "0009_auto__del_field_generatedcertificate_graded_download_url__del_field_ge"}}, {"pk": 66, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:21Z", "app_name": "certificates", "migration": "0010_auto__del_field_generatedcertificate_enabled__add_field_generatedcerti"}}, {"pk": 67, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:21Z", "app_name": "certificates", "migration": "0011_auto__del_field_generatedcertificate_certificate_id__add_field_generat"}}, {"pk": 68, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:21Z", "app_name": "certificates", "migration": "0012_auto__add_field_generatedcertificate_name__add_field_generatedcertific"}}, {"pk": 69, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:21Z", "app_name": "certificates", "migration": "0013_auto__add_field_generatedcertificate_error_reason"}}, {"pk": 70, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:21Z", "app_name": "certificates", "migration": "0014_adding_whitelist"}}, {"pk": 71, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:21Z", "app_name": "certificates", "migration": "0015_adding_mode_for_verified_certs"}}, {"pk": 72, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:22Z", "app_name": "instructor_task", "migration": "0001_initial"}}, {"pk": 73, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:22Z", "app_name": "instructor_task", "migration": "0002_add_subtask_field"}}, {"pk": 74, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:22Z", "app_name": "licenses", "migration": "0001_initial"}}, {"pk": 75, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:22Z", "app_name": "course_groups", "migration": "0001_initial"}}, {"pk": 76, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:22Z", "app_name": "course_groups", "migration": "0002_add_model_CourseUserGroupPartitionGroup"}}, {"pk": 77, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:23Z", "app_name": "bulk_email", "migration": "0001_initial"}}, {"pk": 78, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:23Z", "app_name": "bulk_email", "migration": "0002_change_field_names"}}, {"pk": 79, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:23Z", "app_name": "bulk_email", "migration": "0003_add_optout_user"}}, {"pk": 80, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:23Z", "app_name": "bulk_email", "migration": "0004_migrate_optout_user"}}, {"pk": 81, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:23Z", "app_name": "bulk_email", "migration": "0005_remove_optout_email"}}, {"pk": 82, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:23Z", "app_name": "bulk_email", "migration": "0006_add_course_email_template"}}, {"pk": 83, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:23Z", "app_name": "bulk_email", "migration": "0007_load_course_email_template"}}, {"pk": 84, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:23Z", "app_name": "bulk_email", "migration": "0008_add_course_authorizations"}}, {"pk": 85, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:23Z", "app_name": "bulk_email", "migration": "0009_force_unique_course_ids"}}, {"pk": 86, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:23Z", "app_name": "bulk_email", "migration": "0010_auto__chg_field_optout_course_id__add_field_courseemail_template_name_"}}, {"pk": 87, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:23Z", "app_name": "external_auth", "migration": "0001_initial"}}, {"pk": 88, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:24Z", "app_name": "oauth2", "migration": "0001_initial"}}, {"pk": 89, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:24Z", "app_name": "oauth2", "migration": "0002_auto__chg_field_client_user"}}, {"pk": 90, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:24Z", "app_name": "oauth2", "migration": "0003_auto__add_field_client_name"}}, {"pk": 91, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:24Z", "app_name": "oauth2", "migration": "0004_auto__add_index_accesstoken_token"}}, {"pk": 92, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:24Z", "app_name": "oauth2_provider", "migration": "0001_initial"}}, {"pk": 93, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:25Z", "app_name": "wiki", "migration": "0001_initial"}}, {"pk": 94, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:25Z", "app_name": "wiki", "migration": "0002_auto__add_field_articleplugin_created"}}, {"pk": 95, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:25Z", "app_name": "wiki", "migration": "0003_auto__add_field_urlpath_article"}}, {"pk": 96, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:25Z", "app_name": "wiki", "migration": "0004_populate_urlpath__article"}}, {"pk": 97, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:25Z", "app_name": "wiki", "migration": "0005_auto__chg_field_urlpath_article"}}, {"pk": 98, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:26Z", "app_name": "wiki", "migration": "0006_auto__add_attachmentrevision__add_image__add_attachment"}}, {"pk": 99, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:26Z", "app_name": "wiki", "migration": "0007_auto__add_articlesubscription"}}, {"pk": 100, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:26Z", "app_name": "wiki", "migration": "0008_auto__add_simpleplugin__add_revisionpluginrevision__add_imagerevision_"}}, {"pk": 101, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:26Z", "app_name": "wiki", "migration": "0009_auto__add_field_imagerevision_width__add_field_imagerevision_height"}}, {"pk": 102, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:26Z", "app_name": "wiki", "migration": "0010_auto__chg_field_imagerevision_image"}}, {"pk": 103, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:26Z", "app_name": "wiki", "migration": "0011_auto__chg_field_imagerevision_width__chg_field_imagerevision_height"}}, {"pk": 104, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:27Z", "app_name": "django_notify", "migration": "0001_initial"}}, {"pk": 105, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:27Z", "app_name": "notifications", "migration": "0001_initial"}}, {"pk": 106, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:27Z", "app_name": "foldit", "migration": "0001_initial"}}, {"pk": 107, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:28Z", "app_name": "django_comment_client", "migration": "0001_initial"}}, {"pk": 108, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:28Z", "app_name": "django_comment_common", "migration": "0001_initial"}}, {"pk": 109, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:29Z", "app_name": "notes", "migration": "0001_initial"}}, {"pk": 110, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:29Z", "app_name": "splash", "migration": "0001_initial"}}, {"pk": 111, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:29Z", "app_name": "splash", "migration": "0002_auto__add_field_splashconfig_unaffected_url_paths"}}, {"pk": 112, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:29Z", "app_name": "user_api", "migration": "0001_initial"}}, {"pk": 113, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:30Z", "app_name": "user_api", "migration": "0002_auto__add_usercoursetags__add_unique_usercoursetags_user_course_id_key"}}, {"pk": 114, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:30Z", "app_name": "user_api", "migration": "0003_rename_usercoursetags"}}, {"pk": 115, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:30Z", "app_name": "user_api", "migration": "0004_auto__add_userorgtag__add_unique_userorgtag_user_org_key__chg_field_us"}}, {"pk": 116, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:30Z", "app_name": "shoppingcart", "migration": "0001_initial"}}, {"pk": 117, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:30Z", "app_name": "shoppingcart", "migration": "0002_auto__add_field_paidcourseregistration_mode"}}, {"pk": 118, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:30Z", "app_name": "shoppingcart", "migration": "0003_auto__del_field_orderitem_line_cost"}}, {"pk": 119, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:30Z", "app_name": "shoppingcart", "migration": "0004_auto__add_field_orderitem_fulfilled_time"}}, {"pk": 120, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:30Z", "app_name": "shoppingcart", "migration": "0005_auto__add_paidcourseregistrationannotation__add_field_orderitem_report"}}, {"pk": 121, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:30Z", "app_name": "shoppingcart", "migration": "0006_auto__add_field_order_refunded_time__add_field_orderitem_refund_reques"}}, {"pk": 122, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:30Z", "app_name": "shoppingcart", "migration": "0007_auto__add_field_orderitem_service_fee"}}, {"pk": 123, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:31Z", "app_name": "shoppingcart", "migration": "0008_auto__add_coupons__add_couponredemption__chg_field_certificateitem_cou"}}, {"pk": 124, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:31Z", "app_name": "shoppingcart", "migration": "0009_auto__del_coupons__add_courseregistrationcode__add_coupon__chg_field_c"}}, {"pk": 125, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:31Z", "app_name": "shoppingcart", "migration": "0010_auto__add_registrationcoderedemption__del_field_courseregistrationcode"}}, {"pk": 126, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:31Z", "app_name": "shoppingcart", "migration": "0011_auto__add_invoice__add_field_courseregistrationcode_invoice"}}, {"pk": 127, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:31Z", "app_name": "shoppingcart", "migration": "0012_auto__del_field_courseregistrationcode_transaction_group_name__del_fie"}}, {"pk": 128, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:32Z", "app_name": "shoppingcart", "migration": "0013_auto__add_field_invoice_is_valid"}}, {"pk": 129, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:32Z", "app_name": "shoppingcart", "migration": "0014_auto__del_field_invoice_tax_id__add_field_invoice_address_line_1__add_"}}, {"pk": 130, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:32Z", "app_name": "shoppingcart", "migration": "0015_auto__del_field_invoice_purchase_order_number__del_field_invoice_compa"}}, {"pk": 131, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:32Z", "app_name": "shoppingcart", "migration": "0016_auto__del_field_invoice_company_email__del_field_invoice_company_refer"}}, {"pk": 132, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:32Z", "app_name": "shoppingcart", "migration": "0017_auto__add_field_courseregistrationcode_order__chg_field_registrationco"}}, {"pk": 133, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:32Z", "app_name": "shoppingcart", "migration": "0018_auto__add_donation"}}, {"pk": 134, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:32Z", "app_name": "shoppingcart", "migration": "0019_auto__add_donationconfiguration"}}, {"pk": 135, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:33Z", "app_name": "shoppingcart", "migration": "0020_auto__add_courseregcodeitem__add_courseregcodeitemannotation__add_fiel"}}, {"pk": 136, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:33Z", "app_name": "shoppingcart", "migration": "0021_auto__add_field_orderitem_created__add_field_orderitem_modified"}}, {"pk": 137, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:33Z", "app_name": "shoppingcart", "migration": "0022_auto__add_field_registrationcoderedemption_course_enrollment__add_fiel"}}, {"pk": 138, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:33Z", "app_name": "shoppingcart", "migration": "0023_auto__add_field_coupon_expiration_date"}}, {"pk": 139, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:33Z", "app_name": "shoppingcart", "migration": "0024_auto__add_field_courseregistrationcode_mode_slug"}}, {"pk": 140, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:33Z", "app_name": "course_modes", "migration": "0001_initial"}}, {"pk": 141, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:33Z", "app_name": "course_modes", "migration": "0002_auto__add_field_coursemode_currency"}}, {"pk": 142, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:33Z", "app_name": "course_modes", "migration": "0003_auto__add_unique_coursemode_course_id_currency_mode_slug"}}, {"pk": 143, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:34Z", "app_name": "course_modes", "migration": "0004_auto__add_field_coursemode_expiration_date"}}, {"pk": 144, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:34Z", "app_name": "course_modes", "migration": "0005_auto__add_field_coursemode_expiration_datetime"}}, {"pk": 145, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:34Z", "app_name": "course_modes", "migration": "0006_expiration_date_to_datetime"}}, {"pk": 146, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:34Z", "app_name": "course_modes", "migration": "0007_add_description"}}, {"pk": 147, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:34Z", "app_name": "course_modes", "migration": "0007_auto__add_coursemodesarchive__chg_field_coursemode_course_id"}}, {"pk": 148, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:34Z", "app_name": "verify_student", "migration": "0001_initial"}}, {"pk": 149, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:34Z", "app_name": "verify_student", "migration": "0002_auto__add_field_softwaresecurephotoverification_window"}}, {"pk": 150, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:34Z", "app_name": "verify_student", "migration": "0003_auto__add_field_softwaresecurephotoverification_display"}}, {"pk": 151, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:35Z", "app_name": "dark_lang", "migration": "0001_initial"}}, {"pk": 152, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:35Z", "app_name": "dark_lang", "migration": "0002_enable_on_install"}}, {"pk": 153, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:35Z", "app_name": "reverification", "migration": "0001_initial"}}, {"pk": 154, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:35Z", "app_name": "embargo", "migration": "0001_initial"}}, {"pk": 155, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:36Z", "app_name": "course_action_state", "migration": "0001_initial"}}, {"pk": 156, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:36Z", "app_name": "course_action_state", "migration": "0002_add_rerun_display_name"}}, {"pk": 157, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:36Z", "app_name": "survey", "migration": "0001_initial"}}, {"pk": 158, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:37Z", "app_name": "lms_xblock", "migration": "0001_initial"}}, {"pk": 159, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:37Z", "app_name": "mentoring", "migration": "0001_initial"}}, {"pk": 160, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:37Z", "app_name": "mentoring", "migration": "0002_auto__add_field_answer_course_id__chg_field_answer_student_id"}}, {"pk": 161, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:37Z", "app_name": "mentoring", "migration": "0003_auto__del_unique_answer_student_id_name__add_unique_answer_course_id_s"}}, {"pk": 162, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:37Z", "app_name": "mentoring", "migration": "0004_auto__add_lightchild__add_unique_lightchild_student_id_course_id_name"}}, {"pk": 163, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:37Z", "app_name": "mentoring", "migration": "0005_auto__chg_field_lightchild_name"}}, {"pk": 164, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:38Z", "app_name": "submissions", "migration": "0001_initial"}}, {"pk": 165, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:38Z", "app_name": "submissions", "migration": "0002_auto__add_scoresummary"}}, {"pk": 166, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:38Z", "app_name": "submissions", "migration": "0003_auto__del_field_submission_answer__add_field_submission_raw_answer"}}, {"pk": 167, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:38Z", "app_name": "submissions", "migration": "0004_auto__add_field_score_reset"}}, {"pk": 168, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:39Z", "app_name": "assessment", "migration": "0001_initial"}}, {"pk": 169, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:39Z", "app_name": "assessment", "migration": "0002_auto__add_assessmentfeedbackoption__del_field_assessmentfeedback_feedb"}}, {"pk": 170, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:39Z", "app_name": "assessment", "migration": "0003_add_index_pw_course_item_student"}}, {"pk": 171, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:39Z", "app_name": "assessment", "migration": "0004_auto__add_field_peerworkflow_graded_count"}}, {"pk": 172, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:39Z", "app_name": "assessment", "migration": "0005_auto__del_field_peerworkflow_graded_count__add_field_peerworkflow_grad"}}, {"pk": 173, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:39Z", "app_name": "assessment", "migration": "0006_auto__add_field_assessmentpart_feedback"}}, {"pk": 174, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:39Z", "app_name": "assessment", "migration": "0007_auto__chg_field_assessmentpart_feedback"}}, {"pk": 175, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:40Z", "app_name": "assessment", "migration": "0008_student_training"}}, {"pk": 176, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:40Z", "app_name": "assessment", "migration": "0009_auto__add_unique_studenttrainingworkflowitem_order_num_workflow"}}, {"pk": 177, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:40Z", "app_name": "assessment", "migration": "0010_auto__add_unique_studenttrainingworkflow_submission_uuid"}}, {"pk": 178, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:40Z", "app_name": "assessment", "migration": "0011_ai_training"}}, {"pk": 179, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:40Z", "app_name": "assessment", "migration": "0012_move_algorithm_id_to_classifier_set"}}, {"pk": 180, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:40Z", "app_name": "assessment", "migration": "0013_auto__add_field_aigradingworkflow_essay_text"}}, {"pk": 181, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:40Z", "app_name": "assessment", "migration": "0014_auto__add_field_aitrainingworkflow_item_id__add_field_aitrainingworkfl"}}, {"pk": 182, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:40Z", "app_name": "assessment", "migration": "0015_auto__add_unique_aitrainingworkflow_uuid__add_unique_aigradingworkflow"}}, {"pk": 183, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:41Z", "app_name": "assessment", "migration": "0016_auto__add_field_aiclassifierset_course_id__add_field_aiclassifierset_i"}}, {"pk": 184, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:41Z", "app_name": "assessment", "migration": "0016_auto__add_field_rubric_structure_hash"}}, {"pk": 185, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:41Z", "app_name": "assessment", "migration": "0017_rubric_structure_hash"}}, {"pk": 186, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:41Z", "app_name": "assessment", "migration": "0018_auto__add_field_assessmentpart_criterion"}}, {"pk": 187, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:41Z", "app_name": "assessment", "migration": "0019_assessmentpart_criterion_field"}}, {"pk": 188, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:41Z", "app_name": "assessment", "migration": "0020_assessmentpart_criterion_not_null"}}, {"pk": 189, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:41Z", "app_name": "assessment", "migration": "0021_assessmentpart_option_nullable"}}, {"pk": 190, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:41Z", "app_name": "assessment", "migration": "0022__add_label_fields"}}, {"pk": 191, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:41Z", "app_name": "assessment", "migration": "0023_assign_criteria_and_option_labels"}}, {"pk": 192, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:42Z", "app_name": "assessment", "migration": "0024_auto__chg_field_assessmentpart_criterion"}}, {"pk": 193, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:42Z", "app_name": "workflow", "migration": "0001_initial"}}, {"pk": 194, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:42Z", "app_name": "workflow", "migration": "0002_auto__add_field_assessmentworkflow_course_id__add_field_assessmentwork"}}, {"pk": 195, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:42Z", "app_name": "workflow", "migration": "0003_auto__add_assessmentworkflowstep"}}, {"pk": 196, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:42Z", "app_name": "edxval", "migration": "0001_initial"}}, {"pk": 197, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:43Z", "app_name": "edxval", "migration": "0002_default_profiles"}}, {"pk": 198, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:43Z", "app_name": "edxval", "migration": "0003_status_and_created_fields"}}, {"pk": 199, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:43Z", "app_name": "milestones", "migration": "0001_initial"}}, {"pk": 200, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:43Z", "app_name": "milestones", "migration": "0002_seed_relationship_types"}}, {"pk": 201, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:43Z", "app_name": "django_extensions", "migration": "0001_empty"}}, {"pk": 202, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:46Z", "app_name": "contentstore", "migration": "0001_initial"}}, {"pk": 203, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:46Z", "app_name": "course_creators", "migration": "0001_initial"}}, {"pk": 204, "model": "south.migrationhistory", "fields": {"applied": "2015-01-15T03:15:46Z", "app_name": "xblock_config", "migration": "0001_initial"}}, {"pk": 1, "model": "edxval.profile", "fields": {"width": 1280, "profile_name": "desktop_mp4", "extension": "mp4", "height": 720}}, {"pk": 2, "model": "edxval.profile", "fields": {"width": 1280, "profile_name": "desktop_webm", "extension": "webm", "height": 720}}, {"pk": 3, "model": "edxval.profile", "fields": {"width": 960, "profile_name": "mobile_high", "extension": "mp4", "height": 540}}, {"pk": 4, "model": "edxval.profile", "fields": {"width": 640, "profile_name": "mobile_low", "extension": "mp4", "height": 360}}, {"pk": 5, "model": "edxval.profile", "fields": {"width": 1920, "profile_name": "youtube", "extension": "mp4", "height": 1080}}, {"pk": 1, "model": "milestones.milestonerelationshiptype", "fields": {"active": true, "description": "Autogenerated milestone relationship type \"fulfills\"", "modified": "2015-01-15T03:15:43Z", "name": "fulfills", "created": "2015-01-15T03:15:43Z"}}, {"pk": 2, "model": "milestones.milestonerelationshiptype", "fields": {"active": true, "description": "Autogenerated milestone relationship type \"requires\"", "modified": "2015-01-15T03:15:43Z", "name": "requires", "created": "2015-01-15T03:15:43Z"}}, {"pk": 61, "model": "auth.permission", "fields": {"codename": "add_logentry", "name": "Can add log entry", "content_type": 21}}, {"pk": 62, "model": "auth.permission", "fields": {"codename": "change_logentry", "name": "Can change log entry", "content_type": 21}}, {"pk": 63, "model": "auth.permission", "fields": {"codename": "delete_logentry", "name": "Can delete log entry", "content_type": 21}}, {"pk": 394, "model": "auth.permission", "fields": {"codename": "add_aiclassifier", "name": "Can add ai classifier", "content_type": 131}}, {"pk": 395, "model": "auth.permission", "fields": {"codename": "change_aiclassifier", "name": "Can change ai classifier", "content_type": 131}}, {"pk": 396, "model": "auth.permission", "fields": {"codename": "delete_aiclassifier", "name": "Can delete ai classifier", "content_type": 131}}, {"pk": 391, "model": "auth.permission", "fields": {"codename": "add_aiclassifierset", "name": "Can add ai classifier set", "content_type": 130}}, {"pk": 392, "model": "auth.permission", "fields": {"codename": "change_aiclassifierset", "name": "Can change ai classifier set", "content_type": 130}}, {"pk": 393, "model": "auth.permission", "fields": {"codename": "delete_aiclassifierset", "name": "Can delete ai classifier set", "content_type": 130}}, {"pk": 400, "model": "auth.permission", "fields": {"codename": "add_aigradingworkflow", "name": "Can add ai grading workflow", "content_type": 133}}, {"pk": 401, "model": "auth.permission", "fields": {"codename": "change_aigradingworkflow", "name": "Can change ai grading workflow", "content_type": 133}}, {"pk": 402, "model": "auth.permission", "fields": {"codename": "delete_aigradingworkflow", "name": "Can delete ai grading workflow", "content_type": 133}}, {"pk": 397, "model": "auth.permission", "fields": {"codename": "add_aitrainingworkflow", "name": "Can add ai training workflow", "content_type": 132}}, {"pk": 398, "model": "auth.permission", "fields": {"codename": "change_aitrainingworkflow", "name": "Can change ai training workflow", "content_type": 132}}, {"pk": 399, "model": "auth.permission", "fields": {"codename": "delete_aitrainingworkflow", "name": "Can delete ai training workflow", "content_type": 132}}, {"pk": 364, "model": "auth.permission", "fields": {"codename": "add_assessment", "name": "Can add assessment", "content_type": 121}}, {"pk": 365, "model": "auth.permission", "fields": {"codename": "change_assessment", "name": "Can change assessment", "content_type": 121}}, {"pk": 366, "model": "auth.permission", "fields": {"codename": "delete_assessment", "name": "Can delete assessment", "content_type": 121}}, {"pk": 373, "model": "auth.permission", "fields": {"codename": "add_assessmentfeedback", "name": "Can add assessment feedback", "content_type": 124}}, {"pk": 374, "model": "auth.permission", "fields": {"codename": "change_assessmentfeedback", "name": "Can change assessment feedback", "content_type": 124}}, {"pk": 375, "model": "auth.permission", "fields": {"codename": "delete_assessmentfeedback", "name": "Can delete assessment feedback", "content_type": 124}}, {"pk": 370, "model": "auth.permission", "fields": {"codename": "add_assessmentfeedbackoption", "name": "Can add assessment feedback option", "content_type": 123}}, {"pk": 371, "model": "auth.permission", "fields": {"codename": "change_assessmentfeedbackoption", "name": "Can change assessment feedback option", "content_type": 123}}, {"pk": 372, "model": "auth.permission", "fields": {"codename": "delete_assessmentfeedbackoption", "name": "Can delete assessment feedback option", "content_type": 123}}, {"pk": 367, "model": "auth.permission", "fields": {"codename": "add_assessmentpart", "name": "Can add assessment part", "content_type": 122}}, {"pk": 368, "model": "auth.permission", "fields": {"codename": "change_assessmentpart", "name": "Can change assessment part", "content_type": 122}}, {"pk": 369, "model": "auth.permission", "fields": {"codename": "delete_assessmentpart", "name": "Can delete assessment part", "content_type": 122}}, {"pk": 358, "model": "auth.permission", "fields": {"codename": "add_criterion", "name": "Can add criterion", "content_type": 119}}, {"pk": 359, "model": "auth.permission", "fields": {"codename": "change_criterion", "name": "Can change criterion", "content_type": 119}}, {"pk": 360, "model": "auth.permission", "fields": {"codename": "delete_criterion", "name": "Can delete criterion", "content_type": 119}}, {"pk": 361, "model": "auth.permission", "fields": {"codename": "add_criterionoption", "name": "Can add criterion option", "content_type": 120}}, {"pk": 362, "model": "auth.permission", "fields": {"codename": "change_criterionoption", "name": "Can change criterion option", "content_type": 120}}, {"pk": 363, "model": "auth.permission", "fields": {"codename": "delete_criterionoption", "name": "Can delete criterion option", "content_type": 120}}, {"pk": 376, "model": "auth.permission", "fields": {"codename": "add_peerworkflow", "name": "Can add peer workflow", "content_type": 125}}, {"pk": 377, "model": "auth.permission", "fields": {"codename": "change_peerworkflow", "name": "Can change peer workflow", "content_type": 125}}, {"pk": 378, "model": "auth.permission", "fields": {"codename": "delete_peerworkflow", "name": "Can delete peer workflow", "content_type": 125}}, {"pk": 379, "model": "auth.permission", "fields": {"codename": "add_peerworkflowitem", "name": "Can add peer workflow item", "content_type": 126}}, {"pk": 380, "model": "auth.permission", "fields": {"codename": "change_peerworkflowitem", "name": "Can change peer workflow item", "content_type": 126}}, {"pk": 381, "model": "auth.permission", "fields": {"codename": "delete_peerworkflowitem", "name": "Can delete peer workflow item", "content_type": 126}}, {"pk": 355, "model": "auth.permission", "fields": {"codename": "add_rubric", "name": "Can add rubric", "content_type": 118}}, {"pk": 356, "model": "auth.permission", "fields": {"codename": "change_rubric", "name": "Can change rubric", "content_type": 118}}, {"pk": 357, "model": "auth.permission", "fields": {"codename": "delete_rubric", "name": "Can delete rubric", "content_type": 118}}, {"pk": 385, "model": "auth.permission", "fields": {"codename": "add_studenttrainingworkflow", "name": "Can add student training workflow", "content_type": 128}}, {"pk": 386, "model": "auth.permission", "fields": {"codename": "change_studenttrainingworkflow", "name": "Can change student training workflow", "content_type": 128}}, {"pk": 387, "model": "auth.permission", "fields": {"codename": "delete_studenttrainingworkflow", "name": "Can delete student training workflow", "content_type": 128}}, {"pk": 388, "model": "auth.permission", "fields": {"codename": "add_studenttrainingworkflowitem", "name": "Can add student training workflow item", "content_type": 129}}, {"pk": 389, "model": "auth.permission", "fields": {"codename": "change_studenttrainingworkflowitem", "name": "Can change student training workflow item", "content_type": 129}}, {"pk": 390, "model": "auth.permission", "fields": {"codename": "delete_studenttrainingworkflowitem", "name": "Can delete student training workflow item", "content_type": 129}}, {"pk": 382, "model": "auth.permission", "fields": {"codename": "add_trainingexample", "name": "Can add training example", "content_type": 127}}, {"pk": 383, "model": "auth.permission", "fields": {"codename": "change_trainingexample", "name": "Can change training example", "content_type": 127}}, {"pk": 384, "model": "auth.permission", "fields": {"codename": "delete_trainingexample", "name": "Can delete training example", "content_type": 127}}, {"pk": 4, "model": "auth.permission", "fields": {"codename": "add_group", "name": "Can add group", "content_type": 2}}, {"pk": 5, "model": "auth.permission", "fields": {"codename": "change_group", "name": "Can change group", "content_type": 2}}, {"pk": 6, "model": "auth.permission", "fields": {"codename": "delete_group", "name": "Can delete group", "content_type": 2}}, {"pk": 1, "model": "auth.permission", "fields": {"codename": "add_permission", "name": "Can add permission", "content_type": 1}}, {"pk": 2, "model": "auth.permission", "fields": {"codename": "change_permission", "name": "Can change permission", "content_type": 1}}, {"pk": 3, "model": "auth.permission", "fields": {"codename": "delete_permission", "name": "Can delete permission", "content_type": 1}}, {"pk": 7, "model": "auth.permission", "fields": {"codename": "add_user", "name": "Can add user", "content_type": 3}}, {"pk": 8, "model": "auth.permission", "fields": {"codename": "change_user", "name": "Can change user", "content_type": 3}}, {"pk": 9, "model": "auth.permission", "fields": {"codename": "delete_user", "name": "Can delete user", "content_type": 3}}, {"pk": 172, "model": "auth.permission", "fields": {"codename": "add_courseauthorization", "name": "Can add course authorization", "content_type": 58}}, {"pk": 173, "model": "auth.permission", "fields": {"codename": "change_courseauthorization", "name": "Can change course authorization", "content_type": 58}}, {"pk": 174, "model": "auth.permission", "fields": {"codename": "delete_courseauthorization", "name": "Can delete course authorization", "content_type": 58}}, {"pk": 163, "model": "auth.permission", "fields": {"codename": "add_courseemail", "name": "Can add course email", "content_type": 55}}, {"pk": 164, "model": "auth.permission", "fields": {"codename": "change_courseemail", "name": "Can change course email", "content_type": 55}}, {"pk": 165, "model": "auth.permission", "fields": {"codename": "delete_courseemail", "name": "Can delete course email", "content_type": 55}}, {"pk": 169, "model": "auth.permission", "fields": {"codename": "add_courseemailtemplate", "name": "Can add course email template", "content_type": 57}}, {"pk": 170, "model": "auth.permission", "fields": {"codename": "change_courseemailtemplate", "name": "Can change course email template", "content_type": 57}}, {"pk": 171, "model": "auth.permission", "fields": {"codename": "delete_courseemailtemplate", "name": "Can delete course email template", "content_type": 57}}, {"pk": 166, "model": "auth.permission", "fields": {"codename": "add_optout", "name": "Can add optout", "content_type": 56}}, {"pk": 167, "model": "auth.permission", "fields": {"codename": "change_optout", "name": "Can change optout", "content_type": 56}}, {"pk": 168, "model": "auth.permission", "fields": {"codename": "delete_optout", "name": "Can delete optout", "content_type": 56}}, {"pk": 142, "model": "auth.permission", "fields": {"codename": "add_certificatewhitelist", "name": "Can add certificate whitelist", "content_type": 48}}, {"pk": 143, "model": "auth.permission", "fields": {"codename": "change_certificatewhitelist", "name": "Can change certificate whitelist", "content_type": 48}}, {"pk": 144, "model": "auth.permission", "fields": {"codename": "delete_certificatewhitelist", "name": "Can delete certificate whitelist", "content_type": 48}}, {"pk": 145, "model": "auth.permission", "fields": {"codename": "add_generatedcertificate", "name": "Can add generated certificate", "content_type": 49}}, {"pk": 146, "model": "auth.permission", "fields": {"codename": "change_generatedcertificate", "name": "Can change generated certificate", "content_type": 49}}, {"pk": 147, "model": "auth.permission", "fields": {"codename": "delete_generatedcertificate", "name": "Can delete generated certificate", "content_type": 49}}, {"pk": 46, "model": "auth.permission", "fields": {"codename": "add_servercircuit", "name": "Can add server circuit", "content_type": 16}}, {"pk": 47, "model": "auth.permission", "fields": {"codename": "change_servercircuit", "name": "Can change server circuit", "content_type": 16}}, {"pk": 48, "model": "auth.permission", "fields": {"codename": "delete_servercircuit", "name": "Can delete server circuit", "content_type": 16}}, {"pk": 439, "model": "auth.permission", "fields": {"codename": "add_videouploadconfig", "name": "Can add video upload config", "content_type": 146}}, {"pk": 440, "model": "auth.permission", "fields": {"codename": "change_videouploadconfig", "name": "Can change video upload config", "content_type": 146}}, {"pk": 441, "model": "auth.permission", "fields": {"codename": "delete_videouploadconfig", "name": "Can delete video upload config", "content_type": 146}}, {"pk": 10, "model": "auth.permission", "fields": {"codename": "add_contenttype", "name": "Can add content type", "content_type": 4}}, {"pk": 11, "model": "auth.permission", "fields": {"codename": "change_contenttype", "name": "Can change content type", "content_type": 4}}, {"pk": 12, "model": "auth.permission", "fields": {"codename": "delete_contenttype", "name": "Can delete content type", "content_type": 4}}, {"pk": 91, "model": "auth.permission", "fields": {"codename": "add_offlinecomputedgrade", "name": "Can add offline computed grade", "content_type": 31}}, {"pk": 92, "model": "auth.permission", "fields": {"codename": "change_offlinecomputedgrade", "name": "Can change offline computed grade", "content_type": 31}}, {"pk": 93, "model": "auth.permission", "fields": {"codename": "delete_offlinecomputedgrade", "name": "Can delete offline computed grade", "content_type": 31}}, {"pk": 94, "model": "auth.permission", "fields": {"codename": "add_offlinecomputedgradelog", "name": "Can add offline computed grade log", "content_type": 32}}, {"pk": 95, "model": "auth.permission", "fields": {"codename": "change_offlinecomputedgradelog", "name": "Can change offline computed grade log", "content_type": 32}}, {"pk": 96, "model": "auth.permission", "fields": {"codename": "delete_offlinecomputedgradelog", "name": "Can delete offline computed grade log", "content_type": 32}}, {"pk": 76, "model": "auth.permission", "fields": {"codename": "add_studentmodule", "name": "Can add student module", "content_type": 26}}, {"pk": 77, "model": "auth.permission", "fields": {"codename": "change_studentmodule", "name": "Can change student module", "content_type": 26}}, {"pk": 78, "model": "auth.permission", "fields": {"codename": "delete_studentmodule", "name": "Can delete student module", "content_type": 26}}, {"pk": 79, "model": "auth.permission", "fields": {"codename": "add_studentmodulehistory", "name": "Can add student module history", "content_type": 27}}, {"pk": 80, "model": "auth.permission", "fields": {"codename": "change_studentmodulehistory", "name": "Can change student module history", "content_type": 27}}, {"pk": 81, "model": "auth.permission", "fields": {"codename": "delete_studentmodulehistory", "name": "Can delete student module history", "content_type": 27}}, {"pk": 88, "model": "auth.permission", "fields": {"codename": "add_xmodulestudentinfofield", "name": "Can add x module student info field", "content_type": 30}}, {"pk": 89, "model": "auth.permission", "fields": {"codename": "change_xmodulestudentinfofield", "name": "Can change x module student info field", "content_type": 30}}, {"pk": 90, "model": "auth.permission", "fields": {"codename": "delete_xmodulestudentinfofield", "name": "Can delete x module student info field", "content_type": 30}}, {"pk": 85, "model": "auth.permission", "fields": {"codename": "add_xmodulestudentprefsfield", "name": "Can add x module student prefs field", "content_type": 29}}, {"pk": 86, "model": "auth.permission", "fields": {"codename": "change_xmodulestudentprefsfield", "name": "Can change x module student prefs field", "content_type": 29}}, {"pk": 87, "model": "auth.permission", "fields": {"codename": "delete_xmodulestudentprefsfield", "name": "Can delete x module student prefs field", "content_type": 29}}, {"pk": 82, "model": "auth.permission", "fields": {"codename": "add_xmoduleuserstatesummaryfield", "name": "Can add x module user state summary field", "content_type": 28}}, {"pk": 83, "model": "auth.permission", "fields": {"codename": "change_xmoduleuserstatesummaryfield", "name": "Can change x module user state summary field", "content_type": 28}}, {"pk": 84, "model": "auth.permission", "fields": {"codename": "delete_xmoduleuserstatesummaryfield", "name": "Can delete x module user state summary field", "content_type": 28}}, {"pk": 325, "model": "auth.permission", "fields": {"codename": "add_coursererunstate", "name": "Can add course rerun state", "content_type": 108}}, {"pk": 326, "model": "auth.permission", "fields": {"codename": "change_coursererunstate", "name": "Can change course rerun state", "content_type": 108}}, {"pk": 327, "model": "auth.permission", "fields": {"codename": "delete_coursererunstate", "name": "Can delete course rerun state", "content_type": 108}}, {"pk": 442, "model": "auth.permission", "fields": {"codename": "add_coursecreator", "name": "Can add course creator", "content_type": 147}}, {"pk": 443, "model": "auth.permission", "fields": {"codename": "change_coursecreator", "name": "Can change course creator", "content_type": 147}}, {"pk": 444, "model": "auth.permission", "fields": {"codename": "delete_coursecreator", "name": "Can delete course creator", "content_type": 147}}, {"pk": 157, "model": "auth.permission", "fields": {"codename": "add_courseusergroup", "name": "Can add course user group", "content_type": 53}}, {"pk": 158, "model": "auth.permission", "fields": {"codename": "change_courseusergroup", "name": "Can change course user group", "content_type": 53}}, {"pk": 159, "model": "auth.permission", "fields": {"codename": "delete_courseusergroup", "name": "Can delete course user group", "content_type": 53}}, {"pk": 160, "model": "auth.permission", "fields": {"codename": "add_courseusergrouppartitiongroup", "name": "Can add course user group partition group", "content_type": 54}}, {"pk": 161, "model": "auth.permission", "fields": {"codename": "change_courseusergrouppartitiongroup", "name": "Can change course user group partition group", "content_type": 54}}, {"pk": 162, "model": "auth.permission", "fields": {"codename": "delete_courseusergrouppartitiongroup", "name": "Can delete course user group partition group", "content_type": 54}}, {"pk": 301, "model": "auth.permission", "fields": {"codename": "add_coursemode", "name": "Can add course mode", "content_type": 100}}, {"pk": 302, "model": "auth.permission", "fields": {"codename": "change_coursemode", "name": "Can change course mode", "content_type": 100}}, {"pk": 303, "model": "auth.permission", "fields": {"codename": "delete_coursemode", "name": "Can delete course mode", "content_type": 100}}, {"pk": 304, "model": "auth.permission", "fields": {"codename": "add_coursemodesarchive", "name": "Can add course modes archive", "content_type": 101}}, {"pk": 305, "model": "auth.permission", "fields": {"codename": "change_coursemodesarchive", "name": "Can change course modes archive", "content_type": 101}}, {"pk": 306, "model": "auth.permission", "fields": {"codename": "delete_coursemodesarchive", "name": "Can delete course modes archive", "content_type": 101}}, {"pk": 310, "model": "auth.permission", "fields": {"codename": "add_darklangconfig", "name": "Can add dark lang config", "content_type": 103}}, {"pk": 311, "model": "auth.permission", "fields": {"codename": "change_darklangconfig", "name": "Can change dark lang config", "content_type": 103}}, {"pk": 312, "model": "auth.permission", "fields": {"codename": "delete_darklangconfig", "name": "Can delete dark lang config", "content_type": 103}}, {"pk": 70, "model": "auth.permission", "fields": {"codename": "add_association", "name": "Can add association", "content_type": 24}}, {"pk": 71, "model": "auth.permission", "fields": {"codename": "change_association", "name": "Can change association", "content_type": 24}}, {"pk": 72, "model": "auth.permission", "fields": {"codename": "delete_association", "name": "Can delete association", "content_type": 24}}, {"pk": 73, "model": "auth.permission", "fields": {"codename": "add_code", "name": "Can add code", "content_type": 25}}, {"pk": 74, "model": "auth.permission", "fields": {"codename": "change_code", "name": "Can change code", "content_type": 25}}, {"pk": 75, "model": "auth.permission", "fields": {"codename": "delete_code", "name": "Can delete code", "content_type": 25}}, {"pk": 67, "model": "auth.permission", "fields": {"codename": "add_nonce", "name": "Can add nonce", "content_type": 23}}, {"pk": 68, "model": "auth.permission", "fields": {"codename": "change_nonce", "name": "Can change nonce", "content_type": 23}}, {"pk": 69, "model": "auth.permission", "fields": {"codename": "delete_nonce", "name": "Can delete nonce", "content_type": 23}}, {"pk": 64, "model": "auth.permission", "fields": {"codename": "add_usersocialauth", "name": "Can add user social auth", "content_type": 22}}, {"pk": 65, "model": "auth.permission", "fields": {"codename": "change_usersocialauth", "name": "Can change user social auth", "content_type": 22}}, {"pk": 66, "model": "auth.permission", "fields": {"codename": "delete_usersocialauth", "name": "Can delete user social auth", "content_type": 22}}, {"pk": 235, "model": "auth.permission", "fields": {"codename": "add_notification", "name": "Can add notification", "content_type": 78}}, {"pk": 236, "model": "auth.permission", "fields": {"codename": "change_notification", "name": "Can change notification", "content_type": 78}}, {"pk": 237, "model": "auth.permission", "fields": {"codename": "delete_notification", "name": "Can delete notification", "content_type": 78}}, {"pk": 226, "model": "auth.permission", "fields": {"codename": "add_notificationtype", "name": "Can add type", "content_type": 75}}, {"pk": 227, "model": "auth.permission", "fields": {"codename": "change_notificationtype", "name": "Can change type", "content_type": 75}}, {"pk": 228, "model": "auth.permission", "fields": {"codename": "delete_notificationtype", "name": "Can delete type", "content_type": 75}}, {"pk": 229, "model": "auth.permission", "fields": {"codename": "add_settings", "name": "Can add settings", "content_type": 76}}, {"pk": 230, "model": "auth.permission", "fields": {"codename": "change_settings", "name": "Can change settings", "content_type": 76}}, {"pk": 231, "model": "auth.permission", "fields": {"codename": "delete_settings", "name": "Can delete settings", "content_type": 76}}, {"pk": 232, "model": "auth.permission", "fields": {"codename": "add_subscription", "name": "Can add subscription", "content_type": 77}}, {"pk": 233, "model": "auth.permission", "fields": {"codename": "change_subscription", "name": "Can change subscription", "content_type": 77}}, {"pk": 234, "model": "auth.permission", "fields": {"codename": "delete_subscription", "name": "Can delete subscription", "content_type": 77}}, {"pk": 55, "model": "auth.permission", "fields": {"codename": "add_association", "name": "Can add association", "content_type": 19}}, {"pk": 56, "model": "auth.permission", "fields": {"codename": "change_association", "name": "Can change association", "content_type": 19}}, {"pk": 57, "model": "auth.permission", "fields": {"codename": "delete_association", "name": "Can delete association", "content_type": 19}}, {"pk": 52, "model": "auth.permission", "fields": {"codename": "add_nonce", "name": "Can add nonce", "content_type": 18}}, {"pk": 53, "model": "auth.permission", "fields": {"codename": "change_nonce", "name": "Can change nonce", "content_type": 18}}, {"pk": 54, "model": "auth.permission", "fields": {"codename": "delete_nonce", "name": "Can delete nonce", "content_type": 18}}, {"pk": 58, "model": "auth.permission", "fields": {"codename": "add_useropenid", "name": "Can add user open id", "content_type": 20}}, {"pk": 59, "model": "auth.permission", "fields": {"codename": "change_useropenid", "name": "Can change user open id", "content_type": 20}}, {"pk": 60, "model": "auth.permission", "fields": {"codename": "delete_useropenid", "name": "Can delete user open id", "content_type": 20}}, {"pk": 28, "model": "auth.permission", "fields": {"codename": "add_crontabschedule", "name": "Can add crontab", "content_type": 10}}, {"pk": 29, "model": "auth.permission", "fields": {"codename": "change_crontabschedule", "name": "Can change crontab", "content_type": 10}}, {"pk": 30, "model": "auth.permission", "fields": {"codename": "delete_crontabschedule", "name": "Can delete crontab", "content_type": 10}}, {"pk": 25, "model": "auth.permission", "fields": {"codename": "add_intervalschedule", "name": "Can add interval", "content_type": 9}}, {"pk": 26, "model": "auth.permission", "fields": {"codename": "change_intervalschedule", "name": "Can change interval", "content_type": 9}}, {"pk": 27, "model": "auth.permission", "fields": {"codename": "delete_intervalschedule", "name": "Can delete interval", "content_type": 9}}, {"pk": 34, "model": "auth.permission", "fields": {"codename": "add_periodictask", "name": "Can add periodic task", "content_type": 12}}, {"pk": 35, "model": "auth.permission", "fields": {"codename": "change_periodictask", "name": "Can change periodic task", "content_type": 12}}, {"pk": 36, "model": "auth.permission", "fields": {"codename": "delete_periodictask", "name": "Can delete periodic task", "content_type": 12}}, {"pk": 31, "model": "auth.permission", "fields": {"codename": "add_periodictasks", "name": "Can add periodic tasks", "content_type": 11}}, {"pk": 32, "model": "auth.permission", "fields": {"codename": "change_periodictasks", "name": "Can change periodic tasks", "content_type": 11}}, {"pk": 33, "model": "auth.permission", "fields": {"codename": "delete_periodictasks", "name": "Can delete periodic tasks", "content_type": 11}}, {"pk": 19, "model": "auth.permission", "fields": {"codename": "add_taskmeta", "name": "Can add task state", "content_type": 7}}, {"pk": 20, "model": "auth.permission", "fields": {"codename": "change_taskmeta", "name": "Can change task state", "content_type": 7}}, {"pk": 21, "model": "auth.permission", "fields": {"codename": "delete_taskmeta", "name": "Can delete task state", "content_type": 7}}, {"pk": 22, "model": "auth.permission", "fields": {"codename": "add_tasksetmeta", "name": "Can add saved group result", "content_type": 8}}, {"pk": 23, "model": "auth.permission", "fields": {"codename": "change_tasksetmeta", "name": "Can change saved group result", "content_type": 8}}, {"pk": 24, "model": "auth.permission", "fields": {"codename": "delete_tasksetmeta", "name": "Can delete saved group result", "content_type": 8}}, {"pk": 40, "model": "auth.permission", "fields": {"codename": "add_taskstate", "name": "Can add task", "content_type": 14}}, {"pk": 41, "model": "auth.permission", "fields": {"codename": "change_taskstate", "name": "Can change task", "content_type": 14}}, {"pk": 42, "model": "auth.permission", "fields": {"codename": "delete_taskstate", "name": "Can delete task", "content_type": 14}}, {"pk": 37, "model": "auth.permission", "fields": {"codename": "add_workerstate", "name": "Can add worker", "content_type": 13}}, {"pk": 38, "model": "auth.permission", "fields": {"codename": "change_workerstate", "name": "Can change worker", "content_type": 13}}, {"pk": 39, "model": "auth.permission", "fields": {"codename": "delete_workerstate", "name": "Can delete worker", "content_type": 13}}, {"pk": 415, "model": "auth.permission", "fields": {"codename": "add_coursevideo", "name": "Can add course video", "content_type": 138}}, {"pk": 416, "model": "auth.permission", "fields": {"codename": "change_coursevideo", "name": "Can change course video", "content_type": 138}}, {"pk": 417, "model": "auth.permission", "fields": {"codename": "delete_coursevideo", "name": "Can delete course video", "content_type": 138}}, {"pk": 418, "model": "auth.permission", "fields": {"codename": "add_encodedvideo", "name": "Can add encoded video", "content_type": 139}}, {"pk": 419, "model": "auth.permission", "fields": {"codename": "change_encodedvideo", "name": "Can change encoded video", "content_type": 139}}, {"pk": 420, "model": "auth.permission", "fields": {"codename": "delete_encodedvideo", "name": "Can delete encoded video", "content_type": 139}}, {"pk": 409, "model": "auth.permission", "fields": {"codename": "add_profile", "name": "Can add profile", "content_type": 136}}, {"pk": 410, "model": "auth.permission", "fields": {"codename": "change_profile", "name": "Can change profile", "content_type": 136}}, {"pk": 411, "model": "auth.permission", "fields": {"codename": "delete_profile", "name": "Can delete profile", "content_type": 136}}, {"pk": 421, "model": "auth.permission", "fields": {"codename": "add_subtitle", "name": "Can add subtitle", "content_type": 140}}, {"pk": 422, "model": "auth.permission", "fields": {"codename": "change_subtitle", "name": "Can change subtitle", "content_type": 140}}, {"pk": 423, "model": "auth.permission", "fields": {"codename": "delete_subtitle", "name": "Can delete subtitle", "content_type": 140}}, {"pk": 412, "model": "auth.permission", "fields": {"codename": "add_video", "name": "Can add video", "content_type": 137}}, {"pk": 413, "model": "auth.permission", "fields": {"codename": "change_video", "name": "Can change video", "content_type": 137}}, {"pk": 414, "model": "auth.permission", "fields": {"codename": "delete_video", "name": "Can delete video", "content_type": 137}}, {"pk": 316, "model": "auth.permission", "fields": {"codename": "add_embargoedcourse", "name": "Can add embargoed course", "content_type": 105}}, {"pk": 317, "model": "auth.permission", "fields": {"codename": "change_embargoedcourse", "name": "Can change embargoed course", "content_type": 105}}, {"pk": 318, "model": "auth.permission", "fields": {"codename": "delete_embargoedcourse", "name": "Can delete embargoed course", "content_type": 105}}, {"pk": 319, "model": "auth.permission", "fields": {"codename": "add_embargoedstate", "name": "Can add embargoed state", "content_type": 106}}, {"pk": 320, "model": "auth.permission", "fields": {"codename": "change_embargoedstate", "name": "Can change embargoed state", "content_type": 106}}, {"pk": 321, "model": "auth.permission", "fields": {"codename": "delete_embargoedstate", "name": "Can delete embargoed state", "content_type": 106}}, {"pk": 322, "model": "auth.permission", "fields": {"codename": "add_ipfilter", "name": "Can add ip filter", "content_type": 107}}, {"pk": 323, "model": "auth.permission", "fields": {"codename": "change_ipfilter", "name": "Can change ip filter", "content_type": 107}}, {"pk": 324, "model": "auth.permission", "fields": {"codename": "delete_ipfilter", "name": "Can delete ip filter", "content_type": 107}}, {"pk": 175, "model": "auth.permission", "fields": {"codename": "add_externalauthmap", "name": "Can add external auth map", "content_type": 59}}, {"pk": 176, "model": "auth.permission", "fields": {"codename": "change_externalauthmap", "name": "Can change external auth map", "content_type": 59}}, {"pk": 177, "model": "auth.permission", "fields": {"codename": "delete_externalauthmap", "name": "Can delete external auth map", "content_type": 59}}, {"pk": 241, "model": "auth.permission", "fields": {"codename": "add_puzzlecomplete", "name": "Can add puzzle complete", "content_type": 80}}, {"pk": 242, "model": "auth.permission", "fields": {"codename": "change_puzzlecomplete", "name": "Can change puzzle complete", "content_type": 80}}, {"pk": 243, "model": "auth.permission", "fields": {"codename": "delete_puzzlecomplete", "name": "Can delete puzzle complete", "content_type": 80}}, {"pk": 238, "model": "auth.permission", "fields": {"codename": "add_score", "name": "Can add score", "content_type": 79}}, {"pk": 239, "model": "auth.permission", "fields": {"codename": "change_score", "name": "Can change score", "content_type": 79}}, {"pk": 240, "model": "auth.permission", "fields": {"codename": "delete_score", "name": "Can delete score", "content_type": 79}}, {"pk": 148, "model": "auth.permission", "fields": {"codename": "add_instructortask", "name": "Can add instructor task", "content_type": 50}}, {"pk": 149, "model": "auth.permission", "fields": {"codename": "change_instructortask", "name": "Can change instructor task", "content_type": 50}}, {"pk": 150, "model": "auth.permission", "fields": {"codename": "delete_instructortask", "name": "Can delete instructor task", "content_type": 50}}, {"pk": 151, "model": "auth.permission", "fields": {"codename": "add_coursesoftware", "name": "Can add course software", "content_type": 51}}, {"pk": 152, "model": "auth.permission", "fields": {"codename": "change_coursesoftware", "name": "Can change course software", "content_type": 51}}, {"pk": 153, "model": "auth.permission", "fields": {"codename": "delete_coursesoftware", "name": "Can delete course software", "content_type": 51}}, {"pk": 154, "model": "auth.permission", "fields": {"codename": "add_userlicense", "name": "Can add user license", "content_type": 52}}, {"pk": 155, "model": "auth.permission", "fields": {"codename": "change_userlicense", "name": "Can change user license", "content_type": 52}}, {"pk": 156, "model": "auth.permission", "fields": {"codename": "delete_userlicense", "name": "Can delete user license", "content_type": 52}}, {"pk": 334, "model": "auth.permission", "fields": {"codename": "add_xblockasidesconfig", "name": "Can add x block asides config", "content_type": 111}}, {"pk": 335, "model": "auth.permission", "fields": {"codename": "change_xblockasidesconfig", "name": "Can change x block asides config", "content_type": 111}}, {"pk": 336, "model": "auth.permission", "fields": {"codename": "delete_xblockasidesconfig", "name": "Can delete x block asides config", "content_type": 111}}, {"pk": 337, "model": "auth.permission", "fields": {"codename": "add_answer", "name": "Can add answer", "content_type": 112}}, {"pk": 338, "model": "auth.permission", "fields": {"codename": "change_answer", "name": "Can change answer", "content_type": 112}}, {"pk": 339, "model": "auth.permission", "fields": {"codename": "delete_answer", "name": "Can delete answer", "content_type": 112}}, {"pk": 340, "model": "auth.permission", "fields": {"codename": "add_lightchild", "name": "Can add light child", "content_type": 113}}, {"pk": 341, "model": "auth.permission", "fields": {"codename": "change_lightchild", "name": "Can change light child", "content_type": 113}}, {"pk": 342, "model": "auth.permission", "fields": {"codename": "delete_lightchild", "name": "Can delete light child", "content_type": 113}}, {"pk": 433, "model": "auth.permission", "fields": {"codename": "add_coursecontentmilestone", "name": "Can add course content milestone", "content_type": 144}}, {"pk": 434, "model": "auth.permission", "fields": {"codename": "change_coursecontentmilestone", "name": "Can change course content milestone", "content_type": 144}}, {"pk": 435, "model": "auth.permission", "fields": {"codename": "delete_coursecontentmilestone", "name": "Can delete course content milestone", "content_type": 144}}, {"pk": 430, "model": "auth.permission", "fields": {"codename": "add_coursemilestone", "name": "Can add course milestone", "content_type": 143}}, {"pk": 431, "model": "auth.permission", "fields": {"codename": "change_coursemilestone", "name": "Can change course milestone", "content_type": 143}}, {"pk": 432, "model": "auth.permission", "fields": {"codename": "delete_coursemilestone", "name": "Can delete course milestone", "content_type": 143}}, {"pk": 424, "model": "auth.permission", "fields": {"codename": "add_milestone", "name": "Can add milestone", "content_type": 141}}, {"pk": 425, "model": "auth.permission", "fields": {"codename": "change_milestone", "name": "Can change milestone", "content_type": 141}}, {"pk": 426, "model": "auth.permission", "fields": {"codename": "delete_milestone", "name": "Can delete milestone", "content_type": 141}}, {"pk": 427, "model": "auth.permission", "fields": {"codename": "add_milestonerelationshiptype", "name": "Can add milestone relationship type", "content_type": 142}}, {"pk": 428, "model": "auth.permission", "fields": {"codename": "change_milestonerelationshiptype", "name": "Can change milestone relationship type", "content_type": 142}}, {"pk": 429, "model": "auth.permission", "fields": {"codename": "delete_milestonerelationshiptype", "name": "Can delete milestone relationship type", "content_type": 142}}, {"pk": 436, "model": "auth.permission", "fields": {"codename": "add_usermilestone", "name": "Can add user milestone", "content_type": 145}}, {"pk": 437, "model": "auth.permission", "fields": {"codename": "change_usermilestone", "name": "Can change user milestone", "content_type": 145}}, {"pk": 438, "model": "auth.permission", "fields": {"codename": "delete_usermilestone", "name": "Can delete user milestone", "content_type": 145}}, {"pk": 244, "model": "auth.permission", "fields": {"codename": "add_note", "name": "Can add note", "content_type": 81}}, {"pk": 245, "model": "auth.permission", "fields": {"codename": "change_note", "name": "Can change note", "content_type": 81}}, {"pk": 246, "model": "auth.permission", "fields": {"codename": "delete_note", "name": "Can delete note", "content_type": 81}}, {"pk": 184, "model": "auth.permission", "fields": {"codename": "add_accesstoken", "name": "Can add access token", "content_type": 62}}, {"pk": 185, "model": "auth.permission", "fields": {"codename": "change_accesstoken", "name": "Can change access token", "content_type": 62}}, {"pk": 186, "model": "auth.permission", "fields": {"codename": "delete_accesstoken", "name": "Can delete access token", "content_type": 62}}, {"pk": 178, "model": "auth.permission", "fields": {"codename": "add_client", "name": "Can add client", "content_type": 60}}, {"pk": 179, "model": "auth.permission", "fields": {"codename": "change_client", "name": "Can change client", "content_type": 60}}, {"pk": 180, "model": "auth.permission", "fields": {"codename": "delete_client", "name": "Can delete client", "content_type": 60}}, {"pk": 181, "model": "auth.permission", "fields": {"codename": "add_grant", "name": "Can add grant", "content_type": 61}}, {"pk": 182, "model": "auth.permission", "fields": {"codename": "change_grant", "name": "Can change grant", "content_type": 61}}, {"pk": 183, "model": "auth.permission", "fields": {"codename": "delete_grant", "name": "Can delete grant", "content_type": 61}}, {"pk": 187, "model": "auth.permission", "fields": {"codename": "add_refreshtoken", "name": "Can add refresh token", "content_type": 63}}, {"pk": 188, "model": "auth.permission", "fields": {"codename": "change_refreshtoken", "name": "Can change refresh token", "content_type": 63}}, {"pk": 189, "model": "auth.permission", "fields": {"codename": "delete_refreshtoken", "name": "Can delete refresh token", "content_type": 63}}, {"pk": 190, "model": "auth.permission", "fields": {"codename": "add_trustedclient", "name": "Can add trusted client", "content_type": 64}}, {"pk": 191, "model": "auth.permission", "fields": {"codename": "change_trustedclient", "name": "Can change trusted client", "content_type": 64}}, {"pk": 192, "model": "auth.permission", "fields": {"codename": "delete_trustedclient", "name": "Can delete trusted client", "content_type": 64}}, {"pk": 49, "model": "auth.permission", "fields": {"codename": "add_psychometricdata", "name": "Can add psychometric data", "content_type": 17}}, {"pk": 50, "model": "auth.permission", "fields": {"codename": "change_psychometricdata", "name": "Can change psychometric data", "content_type": 17}}, {"pk": 51, "model": "auth.permission", "fields": {"codename": "delete_psychometricdata", "name": "Can delete psychometric data", "content_type": 17}}, {"pk": 313, "model": "auth.permission", "fields": {"codename": "add_midcoursereverificationwindow", "name": "Can add midcourse reverification window", "content_type": 104}}, {"pk": 314, "model": "auth.permission", "fields": {"codename": "change_midcoursereverificationwindow", "name": "Can change midcourse reverification window", "content_type": 104}}, {"pk": 315, "model": "auth.permission", "fields": {"codename": "delete_midcoursereverificationwindow", "name": "Can delete midcourse reverification window", "content_type": 104}}, {"pk": 13, "model": "auth.permission", "fields": {"codename": "add_session", "name": "Can add session", "content_type": 5}}, {"pk": 14, "model": "auth.permission", "fields": {"codename": "change_session", "name": "Can change session", "content_type": 5}}, {"pk": 15, "model": "auth.permission", "fields": {"codename": "delete_session", "name": "Can delete session", "content_type": 5}}, {"pk": 292, "model": "auth.permission", "fields": {"codename": "add_certificateitem", "name": "Can add certificate item", "content_type": 97}}, {"pk": 293, "model": "auth.permission", "fields": {"codename": "change_certificateitem", "name": "Can change certificate item", "content_type": 97}}, {"pk": 294, "model": "auth.permission", "fields": {"codename": "delete_certificateitem", "name": "Can delete certificate item", "content_type": 97}}, {"pk": 274, "model": "auth.permission", "fields": {"codename": "add_coupon", "name": "Can add coupon", "content_type": 91}}, {"pk": 275, "model": "auth.permission", "fields": {"codename": "change_coupon", "name": "Can change coupon", "content_type": 91}}, {"pk": 276, "model": "auth.permission", "fields": {"codename": "delete_coupon", "name": "Can delete coupon", "content_type": 91}}, {"pk": 277, "model": "auth.permission", "fields": {"codename": "add_couponredemption", "name": "Can add coupon redemption", "content_type": 92}}, {"pk": 278, "model": "auth.permission", "fields": {"codename": "change_couponredemption", "name": "Can change coupon redemption", "content_type": 92}}, {"pk": 279, "model": "auth.permission", "fields": {"codename": "delete_couponredemption", "name": "Can delete coupon redemption", "content_type": 92}}, {"pk": 283, "model": "auth.permission", "fields": {"codename": "add_courseregcodeitem", "name": "Can add course reg code item", "content_type": 94}}, {"pk": 284, "model": "auth.permission", "fields": {"codename": "change_courseregcodeitem", "name": "Can change course reg code item", "content_type": 94}}, {"pk": 285, "model": "auth.permission", "fields": {"codename": "delete_courseregcodeitem", "name": "Can delete course reg code item", "content_type": 94}}, {"pk": 286, "model": "auth.permission", "fields": {"codename": "add_courseregcodeitemannotation", "name": "Can add course reg code item annotation", "content_type": 95}}, {"pk": 287, "model": "auth.permission", "fields": {"codename": "change_courseregcodeitemannotation", "name": "Can change course reg code item annotation", "content_type": 95}}, {"pk": 288, "model": "auth.permission", "fields": {"codename": "delete_courseregcodeitemannotation", "name": "Can delete course reg code item annotation", "content_type": 95}}, {"pk": 268, "model": "auth.permission", "fields": {"codename": "add_courseregistrationcode", "name": "Can add course registration code", "content_type": 89}}, {"pk": 269, "model": "auth.permission", "fields": {"codename": "change_courseregistrationcode", "name": "Can change course registration code", "content_type": 89}}, {"pk": 270, "model": "auth.permission", "fields": {"codename": "delete_courseregistrationcode", "name": "Can delete course registration code", "content_type": 89}}, {"pk": 298, "model": "auth.permission", "fields": {"codename": "add_donation", "name": "Can add donation", "content_type": 99}}, {"pk": 299, "model": "auth.permission", "fields": {"codename": "change_donation", "name": "Can change donation", "content_type": 99}}, {"pk": 300, "model": "auth.permission", "fields": {"codename": "delete_donation", "name": "Can delete donation", "content_type": 99}}, {"pk": 295, "model": "auth.permission", "fields": {"codename": "add_donationconfiguration", "name": "Can add donation configuration", "content_type": 98}}, {"pk": 296, "model": "auth.permission", "fields": {"codename": "change_donationconfiguration", "name": "Can change donation configuration", "content_type": 98}}, {"pk": 297, "model": "auth.permission", "fields": {"codename": "delete_donationconfiguration", "name": "Can delete donation configuration", "content_type": 98}}, {"pk": 265, "model": "auth.permission", "fields": {"codename": "add_invoice", "name": "Can add invoice", "content_type": 88}}, {"pk": 266, "model": "auth.permission", "fields": {"codename": "change_invoice", "name": "Can change invoice", "content_type": 88}}, {"pk": 267, "model": "auth.permission", "fields": {"codename": "delete_invoice", "name": "Can delete invoice", "content_type": 88}}, {"pk": 259, "model": "auth.permission", "fields": {"codename": "add_order", "name": "Can add order", "content_type": 86}}, {"pk": 260, "model": "auth.permission", "fields": {"codename": "change_order", "name": "Can change order", "content_type": 86}}, {"pk": 261, "model": "auth.permission", "fields": {"codename": "delete_order", "name": "Can delete order", "content_type": 86}}, {"pk": 262, "model": "auth.permission", "fields": {"codename": "add_orderitem", "name": "Can add order item", "content_type": 87}}, {"pk": 263, "model": "auth.permission", "fields": {"codename": "change_orderitem", "name": "Can change order item", "content_type": 87}}, {"pk": 264, "model": "auth.permission", "fields": {"codename": "delete_orderitem", "name": "Can delete order item", "content_type": 87}}, {"pk": 280, "model": "auth.permission", "fields": {"codename": "add_paidcourseregistration", "name": "Can add paid course registration", "content_type": 93}}, {"pk": 281, "model": "auth.permission", "fields": {"codename": "change_paidcourseregistration", "name": "Can change paid course registration", "content_type": 93}}, {"pk": 282, "model": "auth.permission", "fields": {"codename": "delete_paidcourseregistration", "name": "Can delete paid course registration", "content_type": 93}}, {"pk": 289, "model": "auth.permission", "fields": {"codename": "add_paidcourseregistrationannotation", "name": "Can add paid course registration annotation", "content_type": 96}}, {"pk": 290, "model": "auth.permission", "fields": {"codename": "change_paidcourseregistrationannotation", "name": "Can change paid course registration annotation", "content_type": 96}}, {"pk": 291, "model": "auth.permission", "fields": {"codename": "delete_paidcourseregistrationannotation", "name": "Can delete paid course registration annotation", "content_type": 96}}, {"pk": 271, "model": "auth.permission", "fields": {"codename": "add_registrationcoderedemption", "name": "Can add registration code redemption", "content_type": 90}}, {"pk": 272, "model": "auth.permission", "fields": {"codename": "change_registrationcoderedemption", "name": "Can change registration code redemption", "content_type": 90}}, {"pk": 273, "model": "auth.permission", "fields": {"codename": "delete_registrationcoderedemption", "name": "Can delete registration code redemption", "content_type": 90}}, {"pk": 16, "model": "auth.permission", "fields": {"codename": "add_site", "name": "Can add site", "content_type": 6}}, {"pk": 17, "model": "auth.permission", "fields": {"codename": "change_site", "name": "Can change site", "content_type": 6}}, {"pk": 18, "model": "auth.permission", "fields": {"codename": "delete_site", "name": "Can delete site", "content_type": 6}}, {"pk": 43, "model": "auth.permission", "fields": {"codename": "add_migrationhistory", "name": "Can add migration history", "content_type": 15}}, {"pk": 44, "model": "auth.permission", "fields": {"codename": "change_migrationhistory", "name": "Can change migration history", "content_type": 15}}, {"pk": 45, "model": "auth.permission", "fields": {"codename": "delete_migrationhistory", "name": "Can delete migration history", "content_type": 15}}, {"pk": 247, "model": "auth.permission", "fields": {"codename": "add_splashconfig", "name": "Can add splash config", "content_type": 82}}, {"pk": 248, "model": "auth.permission", "fields": {"codename": "change_splashconfig", "name": "Can change splash config", "content_type": 82}}, {"pk": 249, "model": "auth.permission", "fields": {"codename": "delete_splashconfig", "name": "Can delete splash config", "content_type": 82}}, {"pk": 97, "model": "auth.permission", "fields": {"codename": "add_anonymoususerid", "name": "Can add anonymous user id", "content_type": 33}}, {"pk": 98, "model": "auth.permission", "fields": {"codename": "change_anonymoususerid", "name": "Can change anonymous user id", "content_type": 33}}, {"pk": 99, "model": "auth.permission", "fields": {"codename": "delete_anonymoususerid", "name": "Can delete anonymous user id", "content_type": 33}}, {"pk": 133, "model": "auth.permission", "fields": {"codename": "add_courseaccessrole", "name": "Can add course access role", "content_type": 45}}, {"pk": 134, "model": "auth.permission", "fields": {"codename": "change_courseaccessrole", "name": "Can change course access role", "content_type": 45}}, {"pk": 135, "model": "auth.permission", "fields": {"codename": "delete_courseaccessrole", "name": "Can delete course access role", "content_type": 45}}, {"pk": 127, "model": "auth.permission", "fields": {"codename": "add_courseenrollment", "name": "Can add course enrollment", "content_type": 43}}, {"pk": 128, "model": "auth.permission", "fields": {"codename": "change_courseenrollment", "name": "Can change course enrollment", "content_type": 43}}, {"pk": 129, "model": "auth.permission", "fields": {"codename": "delete_courseenrollment", "name": "Can delete course enrollment", "content_type": 43}}, {"pk": 130, "model": "auth.permission", "fields": {"codename": "add_courseenrollmentallowed", "name": "Can add course enrollment allowed", "content_type": 44}}, {"pk": 131, "model": "auth.permission", "fields": {"codename": "change_courseenrollmentallowed", "name": "Can change course enrollment allowed", "content_type": 44}}, {"pk": 132, "model": "auth.permission", "fields": {"codename": "delete_courseenrollmentallowed", "name": "Can delete course enrollment allowed", "content_type": 44}}, {"pk": 136, "model": "auth.permission", "fields": {"codename": "add_dashboardconfiguration", "name": "Can add dashboard configuration", "content_type": 46}}, {"pk": 137, "model": "auth.permission", "fields": {"codename": "change_dashboardconfiguration", "name": "Can change dashboard configuration", "content_type": 46}}, {"pk": 138, "model": "auth.permission", "fields": {"codename": "delete_dashboardconfiguration", "name": "Can delete dashboard configuration", "content_type": 46}}, {"pk": 124, "model": "auth.permission", "fields": {"codename": "add_loginfailures", "name": "Can add login failures", "content_type": 42}}, {"pk": 125, "model": "auth.permission", "fields": {"codename": "change_loginfailures", "name": "Can change login failures", "content_type": 42}}, {"pk": 126, "model": "auth.permission", "fields": {"codename": "delete_loginfailures", "name": "Can delete login failures", "content_type": 42}}, {"pk": 121, "model": "auth.permission", "fields": {"codename": "add_passwordhistory", "name": "Can add password history", "content_type": 41}}, {"pk": 122, "model": "auth.permission", "fields": {"codename": "change_passwordhistory", "name": "Can change password history", "content_type": 41}}, {"pk": 123, "model": "auth.permission", "fields": {"codename": "delete_passwordhistory", "name": "Can delete password history", "content_type": 41}}, {"pk": 118, "model": "auth.permission", "fields": {"codename": "add_pendingemailchange", "name": "Can add pending email change", "content_type": 40}}, {"pk": 119, "model": "auth.permission", "fields": {"codename": "change_pendingemailchange", "name": "Can change pending email change", "content_type": 40}}, {"pk": 120, "model": "auth.permission", "fields": {"codename": "delete_pendingemailchange", "name": "Can delete pending email change", "content_type": 40}}, {"pk": 115, "model": "auth.permission", "fields": {"codename": "add_pendingnamechange", "name": "Can add pending name change", "content_type": 39}}, {"pk": 116, "model": "auth.permission", "fields": {"codename": "change_pendingnamechange", "name": "Can change pending name change", "content_type": 39}}, {"pk": 117, "model": "auth.permission", "fields": {"codename": "delete_pendingnamechange", "name": "Can delete pending name change", "content_type": 39}}, {"pk": 112, "model": "auth.permission", "fields": {"codename": "add_registration", "name": "Can add registration", "content_type": 38}}, {"pk": 113, "model": "auth.permission", "fields": {"codename": "change_registration", "name": "Can change registration", "content_type": 38}}, {"pk": 114, "model": "auth.permission", "fields": {"codename": "delete_registration", "name": "Can delete registration", "content_type": 38}}, {"pk": 103, "model": "auth.permission", "fields": {"codename": "add_userprofile", "name": "Can add user profile", "content_type": 35}}, {"pk": 104, "model": "auth.permission", "fields": {"codename": "change_userprofile", "name": "Can change user profile", "content_type": 35}}, {"pk": 105, "model": "auth.permission", "fields": {"codename": "delete_userprofile", "name": "Can delete user profile", "content_type": 35}}, {"pk": 106, "model": "auth.permission", "fields": {"codename": "add_usersignupsource", "name": "Can add user signup source", "content_type": 36}}, {"pk": 107, "model": "auth.permission", "fields": {"codename": "change_usersignupsource", "name": "Can change user signup source", "content_type": 36}}, {"pk": 108, "model": "auth.permission", "fields": {"codename": "delete_usersignupsource", "name": "Can delete user signup source", "content_type": 36}}, {"pk": 100, "model": "auth.permission", "fields": {"codename": "add_userstanding", "name": "Can add user standing", "content_type": 34}}, {"pk": 101, "model": "auth.permission", "fields": {"codename": "change_userstanding", "name": "Can change user standing", "content_type": 34}}, {"pk": 102, "model": "auth.permission", "fields": {"codename": "delete_userstanding", "name": "Can delete user standing", "content_type": 34}}, {"pk": 109, "model": "auth.permission", "fields": {"codename": "add_usertestgroup", "name": "Can add user test group", "content_type": 37}}, {"pk": 110, "model": "auth.permission", "fields": {"codename": "change_usertestgroup", "name": "Can change user test group", "content_type": 37}}, {"pk": 111, "model": "auth.permission", "fields": {"codename": "delete_usertestgroup", "name": "Can delete user test group", "content_type": 37}}, {"pk": 349, "model": "auth.permission", "fields": {"codename": "add_score", "name": "Can add score", "content_type": 116}}, {"pk": 350, "model": "auth.permission", "fields": {"codename": "change_score", "name": "Can change score", "content_type": 116}}, {"pk": 351, "model": "auth.permission", "fields": {"codename": "delete_score", "name": "Can delete score", "content_type": 116}}, {"pk": 352, "model": "auth.permission", "fields": {"codename": "add_scoresummary", "name": "Can add score summary", "content_type": 117}}, {"pk": 353, "model": "auth.permission", "fields": {"codename": "change_scoresummary", "name": "Can change score summary", "content_type": 117}}, {"pk": 354, "model": "auth.permission", "fields": {"codename": "delete_scoresummary", "name": "Can delete score summary", "content_type": 117}}, {"pk": 343, "model": "auth.permission", "fields": {"codename": "add_studentitem", "name": "Can add student item", "content_type": 114}}, {"pk": 344, "model": "auth.permission", "fields": {"codename": "change_studentitem", "name": "Can change student item", "content_type": 114}}, {"pk": 345, "model": "auth.permission", "fields": {"codename": "delete_studentitem", "name": "Can delete student item", "content_type": 114}}, {"pk": 346, "model": "auth.permission", "fields": {"codename": "add_submission", "name": "Can add submission", "content_type": 115}}, {"pk": 347, "model": "auth.permission", "fields": {"codename": "change_submission", "name": "Can change submission", "content_type": 115}}, {"pk": 348, "model": "auth.permission", "fields": {"codename": "delete_submission", "name": "Can delete submission", "content_type": 115}}, {"pk": 331, "model": "auth.permission", "fields": {"codename": "add_surveyanswer", "name": "Can add survey answer", "content_type": 110}}, {"pk": 332, "model": "auth.permission", "fields": {"codename": "change_surveyanswer", "name": "Can change survey answer", "content_type": 110}}, {"pk": 333, "model": "auth.permission", "fields": {"codename": "delete_surveyanswer", "name": "Can delete survey answer", "content_type": 110}}, {"pk": 328, "model": "auth.permission", "fields": {"codename": "add_surveyform", "name": "Can add survey form", "content_type": 109}}, {"pk": 329, "model": "auth.permission", "fields": {"codename": "change_surveyform", "name": "Can change survey form", "content_type": 109}}, {"pk": 330, "model": "auth.permission", "fields": {"codename": "delete_surveyform", "name": "Can delete survey form", "content_type": 109}}, {"pk": 139, "model": "auth.permission", "fields": {"codename": "add_trackinglog", "name": "Can add tracking log", "content_type": 47}}, {"pk": 140, "model": "auth.permission", "fields": {"codename": "change_trackinglog", "name": "Can change tracking log", "content_type": 47}}, {"pk": 141, "model": "auth.permission", "fields": {"codename": "delete_trackinglog", "name": "Can delete tracking log", "content_type": 47}}, {"pk": 253, "model": "auth.permission", "fields": {"codename": "add_usercoursetag", "name": "Can add user course tag", "content_type": 84}}, {"pk": 254, "model": "auth.permission", "fields": {"codename": "change_usercoursetag", "name": "Can change user course tag", "content_type": 84}}, {"pk": 255, "model": "auth.permission", "fields": {"codename": "delete_usercoursetag", "name": "Can delete user course tag", "content_type": 84}}, {"pk": 256, "model": "auth.permission", "fields": {"codename": "add_userorgtag", "name": "Can add user org tag", "content_type": 85}}, {"pk": 257, "model": "auth.permission", "fields": {"codename": "change_userorgtag", "name": "Can change user org tag", "content_type": 85}}, {"pk": 258, "model": "auth.permission", "fields": {"codename": "delete_userorgtag", "name": "Can delete user org tag", "content_type": 85}}, {"pk": 250, "model": "auth.permission", "fields": {"codename": "add_userpreference", "name": "Can add user preference", "content_type": 83}}, {"pk": 251, "model": "auth.permission", "fields": {"codename": "change_userpreference", "name": "Can change user preference", "content_type": 83}}, {"pk": 252, "model": "auth.permission", "fields": {"codename": "delete_userpreference", "name": "Can delete user preference", "content_type": 83}}, {"pk": 307, "model": "auth.permission", "fields": {"codename": "add_softwaresecurephotoverification", "name": "Can add software secure photo verification", "content_type": 102}}, {"pk": 308, "model": "auth.permission", "fields": {"codename": "change_softwaresecurephotoverification", "name": "Can change software secure photo verification", "content_type": 102}}, {"pk": 309, "model": "auth.permission", "fields": {"codename": "delete_softwaresecurephotoverification", "name": "Can delete software secure photo verification", "content_type": 102}}, {"pk": 193, "model": "auth.permission", "fields": {"codename": "add_article", "name": "Can add article", "content_type": 65}}, {"pk": 197, "model": "auth.permission", "fields": {"codename": "assign", "name": "Can change ownership of any article", "content_type": 65}}, {"pk": 194, "model": "auth.permission", "fields": {"codename": "change_article", "name": "Can change article", "content_type": 65}}, {"pk": 195, "model": "auth.permission", "fields": {"codename": "delete_article", "name": "Can delete article", "content_type": 65}}, {"pk": 198, "model": "auth.permission", "fields": {"codename": "grant", "name": "Can assign permissions to other users", "content_type": 65}}, {"pk": 196, "model": "auth.permission", "fields": {"codename": "moderate", "name": "Can edit all articles and lock/unlock/restore", "content_type": 65}}, {"pk": 199, "model": "auth.permission", "fields": {"codename": "add_articleforobject", "name": "Can add Article for object", "content_type": 66}}, {"pk": 200, "model": "auth.permission", "fields": {"codename": "change_articleforobject", "name": "Can change Article for object", "content_type": 66}}, {"pk": 201, "model": "auth.permission", "fields": {"codename": "delete_articleforobject", "name": "Can delete Article for object", "content_type": 66}}, {"pk": 208, "model": "auth.permission", "fields": {"codename": "add_articleplugin", "name": "Can add article plugin", "content_type": 69}}, {"pk": 209, "model": "auth.permission", "fields": {"codename": "change_articleplugin", "name": "Can change article plugin", "content_type": 69}}, {"pk": 210, "model": "auth.permission", "fields": {"codename": "delete_articleplugin", "name": "Can delete article plugin", "content_type": 69}}, {"pk": 202, "model": "auth.permission", "fields": {"codename": "add_articlerevision", "name": "Can add article revision", "content_type": 67}}, {"pk": 203, "model": "auth.permission", "fields": {"codename": "change_articlerevision", "name": "Can change article revision", "content_type": 67}}, {"pk": 204, "model": "auth.permission", "fields": {"codename": "delete_articlerevision", "name": "Can delete article revision", "content_type": 67}}, {"pk": 223, "model": "auth.permission", "fields": {"codename": "add_articlesubscription", "name": "Can add article subscription", "content_type": 74}}, {"pk": 224, "model": "auth.permission", "fields": {"codename": "change_articlesubscription", "name": "Can change article subscription", "content_type": 74}}, {"pk": 225, "model": "auth.permission", "fields": {"codename": "delete_articlesubscription", "name": "Can delete article subscription", "content_type": 74}}, {"pk": 211, "model": "auth.permission", "fields": {"codename": "add_reusableplugin", "name": "Can add reusable plugin", "content_type": 70}}, {"pk": 212, "model": "auth.permission", "fields": {"codename": "change_reusableplugin", "name": "Can change reusable plugin", "content_type": 70}}, {"pk": 213, "model": "auth.permission", "fields": {"codename": "delete_reusableplugin", "name": "Can delete reusable plugin", "content_type": 70}}, {"pk": 217, "model": "auth.permission", "fields": {"codename": "add_revisionplugin", "name": "Can add revision plugin", "content_type": 72}}, {"pk": 218, "model": "auth.permission", "fields": {"codename": "change_revisionplugin", "name": "Can change revision plugin", "content_type": 72}}, {"pk": 219, "model": "auth.permission", "fields": {"codename": "delete_revisionplugin", "name": "Can delete revision plugin", "content_type": 72}}, {"pk": 220, "model": "auth.permission", "fields": {"codename": "add_revisionpluginrevision", "name": "Can add revision plugin revision", "content_type": 73}}, {"pk": 221, "model": "auth.permission", "fields": {"codename": "change_revisionpluginrevision", "name": "Can change revision plugin revision", "content_type": 73}}, {"pk": 222, "model": "auth.permission", "fields": {"codename": "delete_revisionpluginrevision", "name": "Can delete revision plugin revision", "content_type": 73}}, {"pk": 214, "model": "auth.permission", "fields": {"codename": "add_simpleplugin", "name": "Can add simple plugin", "content_type": 71}}, {"pk": 215, "model": "auth.permission", "fields": {"codename": "change_simpleplugin", "name": "Can change simple plugin", "content_type": 71}}, {"pk": 216, "model": "auth.permission", "fields": {"codename": "delete_simpleplugin", "name": "Can delete simple plugin", "content_type": 71}}, {"pk": 205, "model": "auth.permission", "fields": {"codename": "add_urlpath", "name": "Can add URL path", "content_type": 68}}, {"pk": 206, "model": "auth.permission", "fields": {"codename": "change_urlpath", "name": "Can change URL path", "content_type": 68}}, {"pk": 207, "model": "auth.permission", "fields": {"codename": "delete_urlpath", "name": "Can delete URL path", "content_type": 68}}, {"pk": 403, "model": "auth.permission", "fields": {"codename": "add_assessmentworkflow", "name": "Can add assessment workflow", "content_type": 134}}, {"pk": 404, "model": "auth.permission", "fields": {"codename": "change_assessmentworkflow", "name": "Can change assessment workflow", "content_type": 134}}, {"pk": 405, "model": "auth.permission", "fields": {"codename": "delete_assessmentworkflow", "name": "Can delete assessment workflow", "content_type": 134}}, {"pk": 406, "model": "auth.permission", "fields": {"codename": "add_assessmentworkflowstep", "name": "Can add assessment workflow step", "content_type": 135}}, {"pk": 407, "model": "auth.permission", "fields": {"codename": "change_assessmentworkflowstep", "name": "Can change assessment workflow step", "content_type": 135}}, {"pk": 408, "model": "auth.permission", "fields": {"codename": "delete_assessmentworkflowstep", "name": "Can delete assessment workflow step", "content_type": 135}}, {"pk": 445, "model": "auth.permission", "fields": {"codename": "add_studioconfig", "name": "Can add studio config", "content_type": 148}}, {"pk": 446, "model": "auth.permission", "fields": {"codename": "change_studioconfig", "name": "Can change studio config", "content_type": 148}}, {"pk": 447, "model": "auth.permission", "fields": {"codename": "delete_studioconfig", "name": "Can delete studio config", "content_type": 148}}, {"pk": 1, "model": "dark_lang.darklangconfig", "fields": {"change_date": "2015-01-15T03:15:35Z", "changed_by": null, "enabled": true, "released_languages": ""}}] \ 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.sql index 94ceb085394..80b3c25e003 100644 --- a/common/test/db_cache/bok_choy_schema.sql +++ b/common/test/db_cache/bok_choy_schema.sql @@ -200,9 +200,9 @@ CREATE TABLE `assessment_assessmentpart` ( KEY `assessment_assessmentpart_c168f2dc` (`assessment_id`), KEY `assessment_assessmentpart_2f3b0dc9` (`option_id`), KEY `assessment_assessmentpart_a36470e4` (`criterion_id`), - CONSTRAINT `option_id_refs_id_5353f6b204439dd5` FOREIGN KEY (`option_id`) REFERENCES `assessment_criterionoption` (`id`), + CONSTRAINT `criterion_id_refs_id_507d3ff2eeb3dc44` FOREIGN KEY (`criterion_id`) REFERENCES `assessment_criterion` (`id`), CONSTRAINT `assessment_id_refs_id_5cb07795bff26444` FOREIGN KEY (`assessment_id`) REFERENCES `assessment_assessment` (`id`), - CONSTRAINT `criterion_id_refs_id_5353f6b204439dd5` FOREIGN KEY (`criterion_id`) REFERENCES `assessment_criterionoption` (`id`) + CONSTRAINT `option_id_refs_id_5353f6b204439dd5` FOREIGN KEY (`option_id`) REFERENCES `assessment_criterionoption` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `assessment_criterion`; @@ -394,7 +394,7 @@ CREATE TABLE `auth_permission` ( UNIQUE KEY `content_type_id` (`content_type_id`,`codename`), KEY `auth_permission_e4470c6e` (`content_type_id`), CONSTRAINT `content_type_id_refs_id_728de91f` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=415 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=448 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 */; @@ -630,6 +630,21 @@ CREATE TABLE `circuit_servercircuit` ( UNIQUE KEY `name` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `contentstore_videouploadconfig`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `contentstore_videouploadconfig` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `change_date` datetime NOT NULL, + `changed_by_id` int(11) DEFAULT NULL, + `enabled` tinyint(1) NOT NULL, + `profile_whitelist` longtext NOT NULL, + `status_whitelist` longtext NOT NULL, + PRIMARY KEY (`id`), + KEY `contentstore_videouploadconfig_16905482` (`changed_by_id`), + CONSTRAINT `changed_by_id_refs_id_31e0e2c8209c438f` FOREIGN KEY (`changed_by_id`) REFERENCES `auth_user` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `course_action_state_coursererunstate`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; @@ -657,6 +672,20 @@ CREATE TABLE `course_action_state_coursererunstate` ( CONSTRAINT `updated_user_id_refs_id_1334640c1744bdeb` FOREIGN KEY (`updated_user_id`) REFERENCES `auth_user` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `course_creators_coursecreator`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `course_creators_coursecreator` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` int(11) NOT NULL, + `state_changed` datetime NOT NULL, + `state` varchar(24) NOT NULL, + `note` varchar(512) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `user_id` (`user_id`), + CONSTRAINT `user_id_refs_id_22dd4a06a0e6044` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `course_groups_courseusergroup`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; @@ -902,8 +931,8 @@ CREATE TABLE `django_admin_log` ( PRIMARY KEY (`id`), KEY `django_admin_log_fbfc09f1` (`user_id`), KEY `django_admin_log_e4470c6e` (`content_type_id`), - CONSTRAINT `user_id_refs_id_c8665aa` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`), - CONSTRAINT `content_type_id_refs_id_288599e6` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`) + CONSTRAINT `content_type_id_refs_id_288599e6` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`), + CONSTRAINT `user_id_refs_id_c8665aa` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `django_comment_client_permission`; @@ -965,7 +994,7 @@ CREATE TABLE `django_content_type` ( `model` varchar(100) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `app_label` (`app_label`,`model`) -) ENGINE=InnoDB AUTO_INCREMENT=138 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=149 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 */; @@ -1195,12 +1224,15 @@ DROP TABLE IF EXISTS `edxval_video`; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `edxval_video` ( `id` int(11) NOT NULL AUTO_INCREMENT, - `edx_video_id` varchar(50) NOT NULL, + `edx_video_id` varchar(100) NOT NULL, `client_video_id` varchar(255) NOT NULL, `duration` double NOT NULL, + `created` datetime NOT NULL, + `status` varchar(255) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `edx_video_id` (`edx_video_id`), - KEY `edxval_video_de3f5709` (`client_video_id`) + KEY `edxval_video_de3f5709` (`client_video_id`), + KEY `edxval_video_c9ad71dd` (`status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `embargo_embargoedcourse`; @@ -1360,15 +1392,147 @@ CREATE TABLE `licenses_userlicense` ( CONSTRAINT `software_id_refs_id_78738fcdf9e27be8` FOREIGN KEY (`software_id`) REFERENCES `licenses_coursesoftware` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `linkedin_linkedin`; +DROP TABLE IF EXISTS `lms_xblock_xblockasidesconfig`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `lms_xblock_xblockasidesconfig` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `change_date` datetime NOT NULL, + `changed_by_id` int(11) DEFAULT NULL, + `enabled` tinyint(1) NOT NULL, + `disabled_blocks` longtext NOT NULL, + PRIMARY KEY (`id`), + KEY `lms_xblock_xblockasidesconfig_16905482` (`changed_by_id`), + CONSTRAINT `changed_by_id_refs_id_40c91094552627bc` 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 `mentoring_answer`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `mentoring_answer` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL, + `student_id` varchar(32) NOT NULL, + `student_input` longtext NOT NULL, + `created_on` datetime NOT NULL, + `modified_on` datetime NOT NULL, + `course_id` varchar(50) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `mentoring_answer_course_id_7f581fd43d0d1f77_uniq` (`course_id`,`student_id`,`name`), + KEY `mentoring_answer_52094d6e` (`name`), + KEY `mentoring_answer_42ff452e` (`student_id`), + KEY `mentoring_answer_ff48d8e5` (`course_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `mentoring_lightchild`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `mentoring_lightchild` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(100) NOT NULL, + `student_id` varchar(32) NOT NULL, + `course_id` varchar(50) NOT NULL, + `student_data` longtext NOT NULL, + `created_on` datetime NOT NULL, + `modified_on` datetime NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `mentoring_lightchild_student_id_2d3f2d211f8b8d41_uniq` (`student_id`,`course_id`,`name`), + KEY `mentoring_lightchild_52094d6e` (`name`), + KEY `mentoring_lightchild_42ff452e` (`student_id`), + KEY `mentoring_lightchild_ff48d8e5` (`course_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `milestones_coursecontentmilestone`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; -CREATE TABLE `linkedin_linkedin` ( +CREATE TABLE `milestones_coursecontentmilestone` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `created` datetime NOT NULL, + `modified` datetime NOT NULL, + `course_id` varchar(255) NOT NULL, + `content_id` varchar(255) NOT NULL, + `milestone_id` int(11) NOT NULL, + `milestone_relationship_type_id` int(11) NOT NULL, + `active` tinyint(1) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `milestones_coursecontentmilesto_course_id_68d1457cd52d6dff_uniq` (`course_id`,`content_id`,`milestone_id`), + KEY `milestones_coursecontentmilestone_ff48d8e5` (`course_id`), + KEY `milestones_coursecontentmilestone_cc8ff3c` (`content_id`), + KEY `milestones_coursecontentmilestone_9cfa291f` (`milestone_id`), + KEY `milestones_coursecontentmilestone_595c57ff` (`milestone_relationship_type_id`), + CONSTRAINT `milestone_relationship_type_id_refs_id_57f7e3570d7ab186` FOREIGN KEY (`milestone_relationship_type_id`) REFERENCES `milestones_milestonerelationshiptype` (`id`), + CONSTRAINT `milestone_id_refs_id_5c1b1e8cd7fabedc` FOREIGN KEY (`milestone_id`) REFERENCES `milestones_milestone` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `milestones_coursemilestone`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `milestones_coursemilestone` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `created` datetime NOT NULL, + `modified` datetime NOT NULL, + `course_id` varchar(255) NOT NULL, + `milestone_id` int(11) NOT NULL, + `milestone_relationship_type_id` int(11) NOT NULL, + `active` tinyint(1) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `milestones_coursemilestone_course_id_5a06e10579eab3b7_uniq` (`course_id`,`milestone_id`), + KEY `milestones_coursemilestone_ff48d8e5` (`course_id`), + KEY `milestones_coursemilestone_9cfa291f` (`milestone_id`), + KEY `milestones_coursemilestone_595c57ff` (`milestone_relationship_type_id`), + CONSTRAINT `milestone_relationship_type_id_refs_id_2c1c593f874a03b6` FOREIGN KEY (`milestone_relationship_type_id`) REFERENCES `milestones_milestonerelationshiptype` (`id`), + CONSTRAINT `milestone_id_refs_id_540108c1cd764354` FOREIGN KEY (`milestone_id`) REFERENCES `milestones_milestone` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `milestones_milestone`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `milestones_milestone` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `created` datetime NOT NULL, + `modified` datetime NOT NULL, + `namespace` varchar(255) NOT NULL, + `name` varchar(255) NOT NULL, + `display_name` varchar(255) NOT NULL, + `description` longtext NOT NULL, + `active` tinyint(1) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `milestones_milestone_namespace_460a2f6943016c0b_uniq` (`namespace`,`name`), + KEY `milestones_milestone_eb040977` (`namespace`), + KEY `milestones_milestone_52094d6e` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `milestones_milestonerelationshiptype`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `milestones_milestonerelationshiptype` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `created` datetime NOT NULL, + `modified` datetime NOT NULL, + `name` varchar(25) NOT NULL, + `description` longtext NOT NULL, + `active` tinyint(1) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `milestones_usermilestone`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `milestones_usermilestone` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `created` datetime NOT NULL, + `modified` datetime NOT NULL, `user_id` int(11) NOT NULL, - `has_linkedin_account` tinyint(1) DEFAULT NULL, - `emailed_courses` longtext NOT NULL, - PRIMARY KEY (`user_id`), - CONSTRAINT `user_id_refs_id_7b29e97d72e31bb2` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) + `milestone_id` int(11) NOT NULL, + `source` longtext NOT NULL, + `collected` datetime DEFAULT NULL, + `active` tinyint(1) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `milestones_usermilestone_user_id_10206aa452468351_uniq` (`user_id`,`milestone_id`), + KEY `milestones_usermilestone_fbfc09f1` (`user_id`), + KEY `milestones_usermilestone_9cfa291f` (`milestone_id`), + CONSTRAINT `milestone_id_refs_id_1a7fbf83af7fa460` FOREIGN KEY (`milestone_id`) REFERENCES `milestones_milestone` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `notes_note`; @@ -1601,6 +1765,7 @@ CREATE TABLE `shoppingcart_coupon` ( `created_by_id` int(11) NOT NULL, `created_at` datetime NOT NULL, `is_active` tinyint(1) NOT NULL, + `expiration_date` datetime, PRIMARY KEY (`id`), KEY `shoppingcart_coupon_65da3d2c` (`code`), KEY `shoppingcart_coupon_b5de30be` (`created_by_id`), @@ -1659,6 +1824,7 @@ CREATE TABLE `shoppingcart_courseregistrationcode` ( `created_at` datetime NOT NULL, `invoice_id` int(11), `order_id` int(11), + `mode_slug` varchar(100), PRIMARY KEY (`id`), UNIQUE KEY `shoppingcart_courseregistrationcode_code_6614bad3cae62199_uniq` (`code`), KEY `shoppingcart_courseregistrationcode_65da3d2c` (`code`), @@ -1666,9 +1832,9 @@ CREATE TABLE `shoppingcart_courseregistrationcode` ( KEY `shoppingcart_courseregistrationcode_b5de30be` (`created_by_id`), KEY `shoppingcart_courseregistrationcode_59f72b12` (`invoice_id`), KEY `shoppingcart_courseregistrationcode_8337030b` (`order_id`), - CONSTRAINT `order_id_refs_id_6378d414be36d837` FOREIGN KEY (`order_id`) REFERENCES `shoppingcart_order` (`id`), CONSTRAINT `created_by_id_refs_id_7eaaed0838397037` FOREIGN KEY (`created_by_id`) REFERENCES `auth_user` (`id`), - CONSTRAINT `invoice_id_refs_id_6e8c54da995f0ae8` FOREIGN KEY (`invoice_id`) REFERENCES `shoppingcart_invoice` (`id`) + CONSTRAINT `invoice_id_refs_id_6e8c54da995f0ae8` FOREIGN KEY (`invoice_id`) REFERENCES `shoppingcart_invoice` (`id`), + CONSTRAINT `order_id_refs_id_6378d414be36d837` FOREIGN KEY (`order_id`) REFERENCES `shoppingcart_order` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `shoppingcart_donation`; @@ -1792,9 +1958,12 @@ CREATE TABLE `shoppingcart_paidcourseregistration` ( `orderitem_ptr_id` int(11) NOT NULL, `course_id` varchar(128) NOT NULL, `mode` varchar(50) NOT NULL, + `course_enrollment_id` int(11), PRIMARY KEY (`orderitem_ptr_id`), KEY `shoppingcart_paidcourseregistration_ff48d8e5` (`course_id`), KEY `shoppingcart_paidcourseregistration_4160619e` (`mode`), + KEY `shoppingcart_paidcourseregistration_9e513f0b` (`course_enrollment_id`), + CONSTRAINT `course_enrollment_id_refs_id_50077099dc061be6` FOREIGN KEY (`course_enrollment_id`) REFERENCES `student_courseenrollment` (`id`), CONSTRAINT `orderitem_ptr_id_refs_id_c5c6141d8709d99` FOREIGN KEY (`orderitem_ptr_id`) REFERENCES `shoppingcart_orderitem` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; @@ -1818,10 +1987,13 @@ CREATE TABLE `shoppingcart_registrationcoderedemption` ( `registration_code_id` int(11) NOT NULL, `redeemed_by_id` int(11) NOT NULL, `redeemed_at` datetime DEFAULT NULL, + `course_enrollment_id` int(11), PRIMARY KEY (`id`), KEY `shoppingcart_registrationcoderedemption_8337030b` (`order_id`), KEY `shoppingcart_registrationcoderedemption_d25b37dc` (`registration_code_id`), KEY `shoppingcart_registrationcoderedemption_e151467a` (`redeemed_by_id`), + KEY `shoppingcart_registrationcoderedemption_9e513f0b` (`course_enrollment_id`), + CONSTRAINT `course_enrollment_id_refs_id_6d4e7d1dc9486127` FOREIGN KEY (`course_enrollment_id`) REFERENCES `student_courseenrollment` (`id`), CONSTRAINT `order_id_refs_id_3e4c388753a8a5c9` FOREIGN KEY (`order_id`) REFERENCES `shoppingcart_order` (`id`), CONSTRAINT `redeemed_by_id_refs_id_2c29fd0d4e320dc9` FOREIGN KEY (`redeemed_by_id`) REFERENCES `auth_user` (`id`), CONSTRAINT `registration_code_id_refs_id_2b7812ae4d01e47b` FOREIGN KEY (`registration_code_id`) REFERENCES `shoppingcart_courseregistrationcode` (`id`) @@ -1889,7 +2061,7 @@ CREATE TABLE `south_migrationhistory` ( `migration` varchar(255) NOT NULL, `applied` datetime NOT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=188 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=205 DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `splash_splashconfig`; /*!40101 SET @saved_cs_client = @@character_set_client */; @@ -2237,6 +2409,26 @@ CREATE TABLE `user_api_usercoursetag` ( CONSTRAINT `user_id_refs_id_1d26ef6c47a9a367` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `user_api_userorgtag`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `user_api_userorgtag` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `created` datetime NOT NULL, + `modified` datetime NOT NULL, + `user_id` int(11) NOT NULL, + `key` varchar(255) NOT NULL, + `org` varchar(255) NOT NULL, + `value` longtext NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `user_api_userorgtag_user_id_694f9e3322120c6f_uniq` (`user_id`,`org`,`key`), + KEY `user_api_userorgtag_user_id_694f9e3322120c6f` (`user_id`,`org`,`key`), + KEY `user_api_userorgtag_fbfc09f1` (`user_id`), + KEY `user_api_userorgtag_45544485` (`key`), + KEY `user_api_userorgtag_4f5f82e2` (`org`), + CONSTRAINT `user_id_refs_id_4fedbcc0e54b717f` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `user_api_userpreference`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; @@ -2579,6 +2771,20 @@ CREATE TABLE `workflow_assessmentworkflowstep` ( CONSTRAINT `workflow_id_refs_id_4e31588b69d0b483` FOREIGN KEY (`workflow_id`) REFERENCES `workflow_assessmentworkflow` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `xblock_config_studioconfig`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `xblock_config_studioconfig` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `change_date` datetime NOT NULL, + `changed_by_id` int(11) DEFAULT NULL, + `enabled` tinyint(1) NOT NULL, + `disabled_blocks` longtext NOT NULL, + PRIMARY KEY (`id`), + KEY `xblock_config_studioconfig_16905482` (`changed_by_id`), + CONSTRAINT `changed_by_id_refs_id_3d4ae52c6ef7f7d7` FOREIGN KEY (`changed_by_id`) REFERENCES `auth_user` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; diff --git a/common/test/db_cache/lettuce.db b/common/test/db_cache/lettuce.db index fc6081441e176bef35a035d80ef30c3fcd2cc0b6..5060b4b2eed66834b6d12a0b0ddd3fccb4776757 100644 GIT binary patch delta 37618 zcmbV#2YeGp_VCW^YIkjHurcmUa={ok^#TE72oQQT9gMMMFc{moU<gH#WNZ>b&*h~D z(t8LAC_UsZJr_cHx%Av6cd3wEF1fpu@6GN?mL)^(|M}<NtajeaoBrm_dvD%ebh_Z8 z(?$C-hDuo+N4ImKKV8rMQZtJ!`^2DQu>uR|*82_P_VIBnCY^6(F`Ey@3FQL6k#9wi zm7hd6_(x&%M1Ki}WBsWdN51h(7=G*9gyAXQY78Ip&B5>%-&hRy`ivNQe0mI9eM2!E z>-8LbP@0|>PnWV1X7Hc!FY<TuetsTb#T)n-`VM`V-as#;OR-1?EuoGKfto0HN!^;- z=GE?+x|YticK61{dUp#sg!ulNFVG2;yQsFl9?rzbX_JT-V;@NpNFnXe^0e2rw7JO& zjQ3>-#6lY}agBTZs@k^IE$(_1BRLPj8%qRIO;<8pPd=^7OEqBJ7zNdWdUun%!(G$T zR_|`RKX=gItSJ)z9&5oS{=fXc_%r-h{O9~9{CoE&)<4DDsLjh7`=AGdo<<Cc7h~FE zRTyk3#b84Q<&Sa#zn&uO4*p&Kaeh4?NPJ!P(}Tuw4+{v)-d~kT$q4xQIw7xu)&1jC zAv2$}cXZafn>#w&-EFOHEe(xL?tH|@adAqh2KU0tkI+=zCHQs^+!LUAN8<$fMq#!r z59P1JNZPf(HF?N${2%#8`Q!W%{to^o{yOaLR(?D^&pQJXRC>o@IM{2)a-a2Ljmcpz z>x`?t!!SJHjm7XHFTwCU9C+@(>o9n~27?FZ-v7zcyk!Xj|2n?W?btP6@*nZ9BlbV? zCFE6!r<Cg^yD{fXktcKwabda#*w4w_oA~p79Z$&c*4X<=954HYrvk!LWPMhOt;}dD zGuiY;%P6yTl*w3bvluN_=>3S4q(;H4R+GzUgy%mZrO`mM%WkonA?{;hj|Q4d7MIxu zixC)Iq|t7&S>fi7No{mSBZ6EG$o_<kiU1m2<t~fOX}3W0C!{zU=rlPUP6yoc2`PvM z+Uz!m*#iIggy;tVnrwEL3-q6oyl9}wWwtnsuy|mg)#);s;lO}Eqr>H}nBc`vNlqkM zXSvH^cUl~m|COwbfSD}iM!U;oHG%i9#2ndq2sBw;R(SreWJP2~bGgIhbUJM?_HQIV zGNZZNj(ul_uD?YOw7J~uavB{Lc<66r`~?xSz+7&^R#@y6dL5UUTcs@<qtWE7sqO4& zG2?*spHilBm(^^sTVcXy(bEQjCZh#MqUSTRG_nDvawiUi$q7GwMwUkd9S)b#WPzs7 ziE#j++2+8Jxc~F$31=#|yNoVJ;J44oa|7hGTO3#?_#llAP^Q&vbKw}yO{e3c%e1&$ zcAE)qPp20Q0JIrhPAkY6)G`3jWVJE08MH7OXm;YNbHSbrS~LLAW^*_#@aGI_7yxL* zwPOb%b0D-Piv#-s#%0p7=$s~#$!;-2cP2GO1C3UP&FFwXXVUDnh`~0NJDo@fjIjaI z%Ik!HsHd$_eQYUr869S`33ktpF56O$)6$5Y@ycvEE3#|^8tqP-3mkK3Wi-&isEh-4 z&!Ll}fi|bfY_q|ab7&+zz$IogxlFj^htH)mqH|j9CKrzDC39&M*|U^eoK~a52`|kZ zs7#B=gnb1i^JvuSw3M6dPNUfjhvv~Kk==+u3(g2@e1Oa+{IL6lxSvyRnNJdq4in^n za0R7V7a%V%hpXqj++prd+-HO%d1NYCL%ie=d6c|IzM~m*5_QuKx|3c`AEK|*ANhFR z!Y}6AdEg)5-^VRM`GZLhP_xdTD;P>(<pa38wYxhwA6)SOHIN<f@B=iDbi?}(&~)8q zgJ3Yh#}CkCNH|7i-PR((FsAPvF1lC}$rh+OMzhI<P;-o?kuKPDjOOHR$`lNRq_(}? z-QK<)H`!LVyRECGZCyiCOV>6mxs1TiZ;KgO+mi)DdRV%)&Q)!VbsMpq(G<QpMhy~o zQHfxfpuWJVy^=sVFN{7;bBHIf<TxEn3i5@*3R>6F+=1n^cOZYFur!^mO)a&^ku*0n zuI3KFngE@+rYTP-DZ-?T@2RP4bJt>O<Y?Hd_QoB={g}()kkM%5uH=q!?{L460#ZfX z<Wlkg`H1{Nlj(5kr1NMS{R2HhU#8#jLwFNElW*dC_``gFKgEB3&`?karvlWd%M=O? z1X`-a6tN!bX;OaYi0*vBU?cF#7bNG_7aydAtPcG7A<EO^k5VBa&rPOtWICBk7LgUC zo~$LUWFy&1d}JrtLoOp%kwbyfKhr_vps^q`;CP8XK#!lILR@AXSIzOg{9t+~ZKUbs zeF9_^8Nr?8fP=(CvYn2b3#U%g;@J^P*jaA1TXE;G&Czj&!m3rBP3w@St8HvDB9X6Y zY;NpmtZj-W^UiXM-EMIj7tMw#XJ}P=1Xf46%Vse<ZO&P6;~8og0Bp9|O%}^cc>fH| ziU!*qW|P%^{tOuU9W9FnTdlYim`6>AMc>i<Xt2fQaG0$#r@>|4QAae`Xfj(Z=5bTu zuiw$)NU*)!Wj7)E+9@#ndpdOhu-W0TIJ+)@i@&EUqrncl!|JkhO$OITbY<k`Xvb~X zVX-^oah}C+GdTWQzLGve*HMu?NGiE!xEVNmEa3Qvroyuy(P@#y$zE==*(??#9QlZ* zK;_4DdUOS>NcbG4uJhrhj|Zxs#o@3UjngL}k40_Kxv}YHo270%tovjj<R+upVRkI8 zf>WQ+@zJ@BHdcDqI4Jpapt6m~6FIHRD&eM2>BPv~HnvUJEY8}ou<$E7HL~e8+$fM$ zbshgJk~s2s;Ns8dHeE&s$3Mhhgq`>u&ifVQ3vxRyRtxte*MS{5pH3SC4}V3i(M35; z4!h0TdLBq$)5V^M$!jY|UdiTg7)R^4)WWKcw%WRN=UxrAa^%YFCj0nN$R$ne<C3iA zn$>N!%^fxEwN38!n%esHjm<S}E%-ZpMGaP&aT{`eIJJy$``2`2bn|hOWV`zpU(@B0 z+?}=D<+MAUu>2e9h|GvE>^9uL@BD@uqcb8yZ8yT10W;!IT9JpT{FaW4&gifrR|uYO zX?}Ex4kM106(0JQMll1{aw8r&td8UVqz{uwtoCvTo++GxQ$Nr)61hnt&}g<>twnI8 zS(gtd-VkFU{zn=E`+lSyHws1}ApArRFDD<si(C0zxW1a#1zxD;M`h&1bBj6tNq##& z8mGx^v<7#o!(=tFa$j?|aEo!GIOwz*c)x>>nkcSvhs)x!I3})uk)3>b<UB&K9T%i| z;&Rx4;OP<b2*JoaJB_AgIxfAiss$P5HRf|qBv(07Rg1&wTnb-y@=<itRgRPk4=bHZ zpl~C<BC<Ysu0ZzCYMi(juGtt}U1zz&X+~CV@*?<jBX5k(?XV$HwqCFhO1pT|0ARBj zPeYRzz{akDa@(!Q^O~xv;fXGOWOQ!is*tm-nh!Hi(*eMEKy#RkW9GsB({y;`*gKK# znUT9i21%egIUsK3n`_C>FvlTe1opnqHxlv-{QCobH2GDHoAn`oOdc7>m2&)3{6YSF z`d|7WZK3hx8B)!C&RvCou)n5taCL%E9Z_eqsoZMC9x+Z^3o(g8<m5oG1-U(&tEmwd zBo36@>|lqImNoEHqOd3$IiA)`M$^RAU>hn#PAxNX)>b1fqm>P?b*L~UGPe;YCi0=q z$!_>ys1P}nnA>4=xva*jdMHW~B6}ObcBBX{+vGY}n>0{vyU~GkVa6)BKS{7hmu<6} z@Hkyj3#}b|S~S?|bXZ)rQ7hqa2Omituxum%HnRz3DG9h@`N4$z28lP2WVq<Rybfxz z1qpu35n^HNzxmxnV#ApPAO4%)L*&r!!SGS85D(Y<hd)VTmCOOm+&%18p@Sg9oF+`x z!HH}k3sz?fi%C2@nJx5^!R(Qt;$EL4bdiKm#APH040fR;@I<aqn?m#fe5oKLFMx%= zoKCU>hB?BgG$1SzZYEe!R;9pWi-i@0@L^Ryxm1v0>{4MX(J{<P0gN!m9bF>|Ag&SG ziO4bz3+!1Vr1K;b5a;l~$#uf9SVF?EC>?N32co)rqp+6@QX4(HOSqRL9v?v&vaP~> zgepZKsT2MHiQ9z|IBy$fIk-*O4llFUui5LYIl>^AwOzP~41?Nj!pOjXwhLm+@k<3E zVUmH{f<iRzGVV6+G45sVOCpj?GKMU~L&Yv~D>*?vAwSXt>Yxkh26{CfDW0Pr(lb2e zGx+oP8h#&tGye?#0TNHs{4^oGkh<$PZNyEkxvr(&U9T|V+^!@cJyQc{LN;#aFd;o# zi)-&()zR3|<mN6-6w*_*NHy!laL+YDCTWBht`Ra))(#Ugvxz2YY-~koU5C4E9sK7S z;bspzrI4oe?KPWLHMP{OQ^VSJ6l@}M&-nkAVM1;?Vds#Rw#Mewwax8aDDz7bat(cv zO^vJ9pp>(*seZ$7!Qi6nQ67k=iDrgFIUuM9j8HVUj~$>`GEcvBeF^ra3x?b<JbjSe z#e$)7AV{0LskWoBrMZ1gV{6CeRyVgNTQC%brDVd&K0Nye3#rKj9==w1g{*-~uM=$P zwW&g3I%!|i(%OnGt*dS8!0NZQG%tmBuM-UNGRAhMaZ^D$B#e;0<zD6P;&y?)UK~a% z7sG}_!nnLe$iEb3Ha2f;X{>XHBhsP@7Q$<XghH|a{(VTuEX=RgafR6iRxy1`+iHDB z?P~VBrna?_JuwPn0>cgqcV9p%VZ)QSl;8M=@EI8gkA5K(ld8aHUkDk*!0HvxZQ^i7 zU5ZE6RQd+Jk+#w#@&Rci!@2wL1XDnY@x)W^acsg83#-DbcFrBuY%RALaocjVcZpoK zH@_-aKg?xSL|8S*metqvRabj&Zrsr64v$tcny^VV>)e}bYU<Xku4!m=H?geY%$&l@ zVW}t~vpOtQ8{rz0E{Xu7NW@}9IcR$)d}z`wo7tanFf)mX&1H63I&@riVR)6#ej>w6 zP8%{_#-;6Wu~~P11XGJ(J8rNRo2gA<M%r7OYTMVGyX#O+;<VUpM&kyB4{mPhaJT<n z4iuI;t+sKkI+$+JjfmVE%qaLY+KuLMEwJ07i#&UoQH1HlUbCB;;bn_1BRV&7*?4|& zu7{!o6dgqLnz`I)MQN17*#xx+u8RPpc+rTvxrLqa^YDa#{~vL`kt8w_Pxy;T2ic2c z?~izJ{)SSTLXC6=U5omY-SiN$4zJN~c$qKc$MZ}1E@UWfN1^{;_^*)sbq1dMN_dre zk_A#stNTwS!lenMf>vw#lfF4dhziiOAz=WTAdp<TfZ<VeB!pM>CK?JgPGAdW7(4L4 z#9zg4;TP~G7<yXBg?yu~fVX-*aQXyI4y->d3>iko2et{i4TPMpZZbD#>r&uOovsWf zi@I(y5jJG$GU0Pkw+J4VbXl-e($zp~mM$ysrlh-S7`cEYxD+nW))m5sSvna;X6u^3 zo`bKCWb3xTtL)d(99<Wg!BQr}UD>)Jfgf{pF^LBf1Ys4K%LNjwy5US<QIM=EDBe;Z zZ?ne*+&clgO?M?d{+u8pXE#pw>%usJm^osmarBRT9jZL?NWgi8?j${4%9CM3u<ZiZ z$#I?JYC4x6f@9!b?91zJmQpPi>Tm3*UDf1P7AsPrumwCo6xlFg?!>D36ZP|}#!sK9 z&l?~KJQ+`m;ES)s(XiqhF$+GrLYK`W5r9{&)>TaPTDn`L)P)x6UESDR@7^>30;L8u zjrBD+o~vsZ?HC{tX;TJAKLDs-et7?gF3qEo)w~gEeH-iZO7(dd#~z42uh{GAZk1Bq zSS$DM*2?a(Hn`jt3(9BB#yWe$05u>TS}#qRdH%#j`aH<JN*BLOtwgAHk$Cd-vt|z1 zp?UhSdaKpeYQ4UDgOuuWQC~YGUad37cZLrR+=nfPBlqb9_~xiC7RsK{#lVSXWa56g zLN^SicOtu!uwP6CPYed{<0u7w%heJ2z%XHE5?9XgZ=iCnouAKF@Uiq0l$!O>Iy#Cb zl9OZy>MYN2hqzf>d5&+Wjw>dH3AN37T!MOS`(&$8{W;T@2)`~9OUV*A^B7Hnz01YH z{7hd0%v!EQdTK=je}QiZ99k|G3rjE~Jb7A|DNphZ)^YR5WFQS<GBnkTv4a?+v{)qo zaC)VfifQ82G*v9k%oXBbvKWTcirM@)UmR>(Ar|8MndfyG{BYkOII%)Z^(@i|h_*Wq z_r>Zs6DelZR|$q*gDleMhxV%X#pt*ak{@hmFcoX4_PfL<>o^A~V@cFfaEC{wt-i6t zy?&t@Gg_rlET+UKg_3JUhb0fEUMzK?PlWw7*nowsL?t1M&hzPXTp1~hEVG~1IL{}9 z5`~wvAiR()AFtzzNN%u!N)dfjwcJN_+-Oqa2`h=s{2&ukt@SI5Qzv@4k0?1<2CdY7 z8MMOtGK}zXI?kq!1vXMy+9C9;)hwx`BG-<!v70$=Gnq*~q)m`;MCU+?X&&UA)7>Ve zHsZ1v1jY9usct@^t03!CV%~8d5_615gDbAoCBca!xF~)-qBG>hcehKa6OjUxos9y( zw^!;?WVL+K1c_JaGDY<bcHO7Tva7$tS8K61rn^JMT6k8h`>xWZDD<)RKAk>@aO6>4 z*0er^Dv^rm?))8OHP!}OgVXFbv#w%1rP61J=klXEy-mdzN^?$vgK6`Mef$oj7Dsgx z$u96Z#mvBp`*k-6sACaEWpa;m`2QLngLslcO38Q>y<bf3A+Mv%pGo{@&{cFhy_P;o zKj3+O1V52?^E>#v_&0I)xyUn2AVswQR3>7oK+5RC@JY$0IFZzNZGwfSK9PqCB%dw{ zTY)4-;VB}PE{RoRH3V$64nkg?3^E9$imC)cCUFG<nT&5pK62vY)fY7fqcv%<g9`;R zg(~#v%xPVgG-QN8X3-^p^eazF&|X3m&O;It1!AB}S?yFpNQNqnUaGZEi%e1@wYq7M z!!iY8qs#j8wz=!w>s#4Tha~3+WHepY4@($0MFqp%tHsnoBvonRazw<;N>XK#rZj9h zc<aS%nWSrPA2x{DBFV@Shy%*&kg$@>T!D<CE1<SPOcO~Kdjn6Mm?4ww;R2aPYrt41 z>ZP1wfy}`dmhAFEF;*tIT8y_&%um!au1jFn6>pOF=~8~;LBqIb1e{fgu=Q!(YSe|X zSp}`n;+j11BJNSS&*)Z(L#0%2{A#EjOw-}eGrDCuueV`G7G!*>n~VxKCC7FD(uuI= zN6fMNOI`aQuVcq>DRuE=>Rk+TX5m(F(U-b-X!}uDL@tHef9VWr+NXcijXvH%n1(Qc z{5<3+GF$q=+*Xc%hd;`1<;U>?eUfgX732qUjCA5L>J@G)&elcpTp#N4Ysnn87v;i9 zw>XH@0Jbm>A-O69cc2i2^#&Yri*YC<x!aAqoYGsl{1{(0{OlGB$O<qth#4dc&TCNK zFhd5)H?}s22B@eLQ}{`~3^?8(jv&hc$0nDg!*A-FGH&C1X*zBOse&W*q8^hpuNJdN zD(qS<8ptv>^64Z6p2fG!vrQ9=FBuju6LZoAoMQ#PVX$|Zm@;c=ziC<EOVV)_q$rG_ ztMj%0lxAZd!;R(m8~K^^pL7eQ<W6KxALPbjUlu^!b4YvZp4Uywh&XN7%2EA=wgp{Y z4#vHJZ1H=TDDuQ&D>tL5gxTKZVQC_jNoG_CSkdIgTD=_}dO<ffGPkwdiAN=eqiY)^ zycnGu!A3hO;kve}6}axj=n7cN9cGuyY+kel78-StT0A_(+8wBqan8FC?lbDni>`p( zWH#GOOE-gP(w!e6v}Gr6lqTEkiVc$B%;2u!@c%{bKO~u0$Q;r}E+-Eo|MfTWGaZT+ zYUd-3_0yYBtNIIHf)sWY@8NIbU&nr4DV7UlDP74HdXY@>v^TcUm6cXS@)d)$T7|~A z+d3K>8tZC1+zP=h$QFo;)&@yT1hi0vLe4rdMJB`b0;!~{;N!Jox=f1l1u_xe3>S;p z@gvk1jfl=J6jMB;SUH>3u~O?>nib&<8JQxG5?ZGf7m6-XqqQj*iY`@%dA&v(Q5C%& zxk6H=oDS=QRaQh$3ZPsCs8~`oBR&OEp|r!zXrtF74wH;ZOWcrniI@>@QeU*XGkC0d zq(J7;2A1A%P}IxBQYMhav;nqXA{I$j?d2|f8EZ=yh>5ONT3Oq+t_kf2RmmE$Ga5@* z2iw{o=um->xJyitoXVE62FiDddGRjAJaCPg4NSYlTxpaV1>U>Gg27~TJP#Z}$s~6h z4@hON5q7NGQ4Ptz=xk)0N;AuU(Mf^zzvvE9W^~zzlf-@bK2a1aIIe;o#n*hH+q0ty zyo*H_nkOKg)x%#Fix)<&Q#;DpEoPUss8kR8zSQNw?j>SdPQ+ryL};$%bYh~s4IP_- z{6k8CuRD=O&Rr_rGsrh}$9gGs=~6s=!k}1jKDkD%W6c@FcQjVahr63ml7034NGmEn z;Kf8`*T*wq9<t{h?$z!#_###;g*Rf6(*E;qni}}cA`t<PE+EVoXQ32y{(PjnYrs2S zoK054tMkP&(r|gTSS`Ad$1F6#i8bOdW@wO0>S1rSSQJyo1V`C8&ERykm@b{SO2@eh z9Z<DaOo1P&#XM3AX$wRXSqW1Yh}B5a4=oU<BPIWOf#?vI>$ow6E||3dt22I~n2%(* zVWDUtOW~@8Vve{($4xA(f|})c9NxN6jDrg&Ng0<f5>Wwngb-m6>E%c-uH|3oFF1C$ zkykN1DR>v|SPHw&=p5u?wRb)^qw8guztfE)d)U5~2^b~A3*YJNxDAl+b#ve%CzjFt zz3%cGg}4L|oFdx1z$_<L{E7e$sfWL1w$e|I1kTAJv6xD~LSfBzBqaiQoNOZV&;sHY zWb1C^+A%@IpVNnm&o!b!2(FqWzRXtvrHx`{a=o@taZAt^Wtp!WmMNg9Wm)7agG(F5 zv@sFuc!aN1$5}{8*dZgh@arN7!3bXoe2gfZk%S}9H!^hE!4;?vAyAg1Msz0liovv2 z94@WWmN+9%`~=?!=)zc{P_QiAu#4cawK$v#eaj@n;g_|z<JL0TmnIhKxCz7s@Bf{q z<}kW>7J_N=6~KmdVm4;myG~3N^L1P!PK-wyaF(B{M^<7b+v8QT%rEuj!HjyGISS>* zb2Z#qFB*lQVX)!yQt=c{x>riYCFC-73gBQT!*8Wx47kh0vAP;5b;=ajdj=yPD-(@y z%`8!dolczX_?ieA<>E#}zQ0^tPA*rc6^m!g8x&TEjjWaxVk?2;)5S|DE~H&E#kph? zD=G(0l!=2Oc9vL4*22_T7=Kk*{PVL!M~1rjPvrRhD3gAQP9>+v0`5Jus6p1RpoE|0 zjRjMo=!~W*Haps$nZ|o#z+Whq3;<`AYxXX$%(muX@Lr)fJvxyUP2bG6F0Z5}S}=T| zM5rq^*)Wl)COU<QBJ}ZQd%4--LgO>29F7ZmT9FvVtk}zqW;6ga&Grg#q)2o{*2Pxt zK;5pz)aB*XVlI467gb>!+F6>6PD_)Q!bi{Psw1m`HWEe$+7#Uo7k7LZ5#nNb633A^ zYUT5gK>V8EE7*Y|ym|Aezf2L~f$>>X^J7pzdexyt&Uy@d^s*F2N};V>%z#0^A@BUk zv$~2w-nBbWAh&)g^`*j*)4DR*<+hnD4aQZF5Gxi@vR$2JNSQOF8Wjdp&*&_})rDT; zZbs{jCZ;T6<hj_pWCxR^&7(d^Iq@oWiqSG6Ql)m+sW`EADe)l?JB~u_vpVCD2$V;S zf{+)><#T8;mPD_l<51#!BbmW{%yna=`nSS645nNtPL3Q02g>lR$Pg~^CczySiW8#Y zHm4aaiyOT|LE0kD9RQBIn8`NJn+WY&#PbG#o6Tq)<nSiI^IJrHdBi^GD7WH9Xtl5O z4nZwUSA-VE43A%k6YT2ebqSst#+1~wH+8O#){QvO+7Z<V<^^7qi51pGVzGp2WmE-= z%9q!;H?=mlDNI&PJu-I#AvU7%gwfUIMV&8OSaD`^A2LW7j%TS;r*-kp=)qQWK&-TA ztY{F1wrmb-t2YkLFAx_;b{aAVE*I)+y1awb#qnanKx@!xLIJDe_z@xs^6eaVJJl<! z&DDc^?K@EJiK6QrgTU}5vIuYdLpO|EuTFV98V&)+7djK@yTml1qj9|(PFSR3`1K22 zD(w40R|@wulVYfk5iPNZ2}MP?g1TY<859TIE#q##UdBV&W)&Moj5UTvCQrYywhcG4 zwh<<yu~<K|dir!lkc>jUe!K~Z5w9TaF#8!P3$A|#kD?0RcVcj7*{U2sLFf>7(;f~E zc8Jr+je!q4#1=w(2+ZCnjwUw)z841W+bGT>Xo@q2!{ccy&mlcsM7~6`%68%)6qPX> zxG{KD!(sB`T^h8OY42>?=-zxzb(6(djz)rb1exL0!^Ou%d*sl#&^#HHVwSPqTzKcW zSTq3KVsx7AW^WE;1jNi}xYdYfESJlh4YLAbUL@Sfm`9V%G}fC1y8_Ypo#l3;(}@Ow z-c0y&K+KNLkL%TLcdhkifOV5NFB)#aI~aCLqc<H6Z;D>ePPE*&pyj^Hn+EZl2dW=Z zel%ZN?@fg%o5cl@_#NfUPSRzm^rpZ=o5c|Wz;Sc2Sf+WC;lG<jYa~fWdW6<d7NaJH z*ecGTC|8Gh+i^d?1U9^d%-fwFF#+D)F1l$C4^<vyj&Fb`$MMMwP<{Db6q&~N2o;7G zaQqW!p*4d385O@{kbQfRTuAb{KXX@bE4TuOZ>-9mocd5qUZO5v)bJ};i6Sl_IecT3 zq+#d!Pzol`M|Q4J<KRN^YP89B9%SDwW~UBxuW7z-G|ahMtYBRD-8l0{!EN{^g&ksY zP!HgO-|kj8bv)-7c)QODv+qF`Yc*`RM@&U=)W!Jb82G$o^x2W^CMH&Ih0(*)l%Acn zu+q$oVKsbok2s9j;D>ueGid-knhoa{`>ZhMUgaInZNvF_J`3D^uUH|34tD%lpBY-# zhy@Y~-B^FI<6#oUn&1e=66J)LPM86|h`JSVpE#KI#6!wHWS(vhT(nQzfkQeNq=RA` zxixU%LGcnHE0dIPv>5HpYfwVEpL|H3BLAgHbTi#c?|_^u#B^ONnMO)*SO2;oS12l^ zs!;|WS6M^Y6_Uml^*47}fspNjORp3&#r6(&E7uD<uN3uSPnM8hNMPT)Vrpt<vXGxj z&{kx9V|zO@k3gG@Hg^ZSccqvytvyr7$IDz{K=oc1<6zrT(JlpHjE<<GYWvZgETkLy z#W%FHtzQpSSBc)VR3Y0yg7RkeRK?8I@W-pfnb_@#SBu|+a1(Yp(&d}PG2|}jyh(fk z^-$w(7AKK=p!a66jwHgDH;Zm^FU+|`e1r^z_*=zhas;;CDt4=L{*d@rK2lzSMs6<L zO3dW)6L@A#f>9@sdfo>cPl)@`e&@F*(VnT`Nffjk^>IDPu;fWhbU%aU!u?N*cc74L z#UJrp_yAn`NAYzOpw<3K91r_nM{U@{e-bAhzfBYbcCjGoxDlBz5MCD-kTh8Ox@afI z;lS%iob~Y8>v$IY6QkG3@WNYSPN3xtB>l*?%WsKm$ir+!A2g<LOPDt8IDa9(h&R*! z&=1f!XdmjzXVQGMWB!!fkA~_iNj93<J;q(aEkRa!I4$?UvA1#cY=^(SjeWNb(%un^ z$yONuj%X9N=(sApS}^3GlmYM#9#AfXN8S<3#LZ}tZZN<__0ll7q+W`p<(pveyNIO= z#=eVZ*o{#8F3Ji!Vf(w{NYVkfzbj_qM)mZ&s3~iMFW(i5Jo#w4ke_Q%?0Zmeg9bh! zL!dsJpNv-AadOku*%5-Pul5#HYZ*+N^on(nUNtPzmgKptjtZJl|CA2Szn~OzJuG35 zCfNEH9MN^~;9tZXJafGD7qQHv=q69{m-8!lCm%;YqPNo~T0wQ>4RSN-A`{3EJihMd z6x}3R=!fYhHA5zL4pe_u`erjhYGv4QbHHjNXQmKNwkkb!>%wiNDt)s;C{!Y;9~gy3 zL8Gm$T)vq)ZZdHN$=JZzS*4Y{3H^#U`DVb@_mKjlE?uc&__8(mro#~gdYZMu!+|Bf zX(9C^qn;{EuXao`D=s{BnQtn}Lr6tfPiYwxO3<%x7E|V%5=vh;Te(0REJ4Z8uR<)Q z$aeud`74Upu<9s@`zpg;NBJhhH6P$)Zh|L15Yxp;toKGkRRhZC+B%!{?H$PKHo?yb zLtBlM55?THCWb-XvfA93MoCiaJ0E6zD5ksDX|)fU$rbx1Fg>IqgwTexu~n~`&}kJ9 zrp@<_XEO1^;NbNoWJLy3*?d*-B31;a@Ds9>%-ek9pz<!|z2+`4)lkV4rJ;Q+w8^SX zS&NtgXFe2%2$vs`#q*DI+;Q%8?mH4kipeChglxcjE;o@sq4nWUG?9*^<LPo#Vq8uG z^lkbD{f!^SkK`xt%TSfSo4=KRjDM5=770w#GDZA(mW`c^QK4GTgleSrAsMU4H(AB{ zE;B2AN-7l*=32mJCCg--_J)m4@l+|I-*w^rLdGjH-gOb3N+zh$5#vJ6SJYwy4knqX z=)IaWOp#+vCgtdu+Dw@;sU9*}5hAZ=by24=n^@!mMOM6C!x09Uq5`63Ihm@cCZkph znWhNW2U>PydWPV^o8SYjS29ECb-ahAt@VCOoy=5Z(k)u`q6rC^r6$m-IY5HhicYfC z!wOIrI+>&BA6qq~TI5_cQbVLg&Qtnq1IydD5fC(GMSHCcTK+IVwF=O1gaH<$*qOY) zP3inT-h(VuCKWqgvD^0AwOK_Uu}Fo0H&#kovRJ7`yOKM^#E>OQY3;$xeSoDZAT)GA zo`~R0aWot2Q1B?X^p|Vf{8xAs%Y%-uaMyek{_-{IC!hFAJWTST_G__9_qfl|QvkPq zEn48-Z&9-L$=Bj<q!2#&Mm!I`JdGl~s&7%&Ivm=+70)Aogd^XI^8><s)HWVy5@VNf z+%oPfO6Un(fzt(VTu%|)cUl}p9%BjfVDK5S!sAQq86l-ko=p9@id3g>&(sWd!?&Mv z0?E_i_CWf)b0%hX3rxNa&&ShTXuX#%^3*rBGt0308f7PM&(n9fH+AS|&YG{Be2cxK zdx}-9Ypo*cIVbuW6W*o8yH4hFrXtUT8BR??%c*mw4&hWS8P1XxPTnkL)STC2ky6Xb zXm_#FsUe<4TL+Qv<fZ;y7YS#*rA<*Z|7q=n{hes3yKSR93@*Ky#=+R{P^JCz4{|)j z{icgau6H-ob~be|ZHRJn68jVt4QIX*b9nZn_8{`2Cn`w>ytt4beDK3LNZXm`gp5I4 z6URS?!qj|v7qyem@$}GumRC1%O*nyOj<$JGT#i=|`!0^2`}B`j)A4X>vrhGvz<Upf zmWb1<1+Q;7@%(FS^Nxh#W8%^Q;OrW<W1_bht~(}{N5d@+8&lAFN5E&t#M}srTEuU$ zn(#v0bZ?Q4%dM^o^(t1|rpcZ9tc3e$Mon|=`e^ADqQiSyD9>p34i~vxuc044W~%Jz zXi;sG!%(TV%c`w%SafJGgNy<*KpePOBZ{|7Ca1l_TgZyd?^kS47Ka3<rqiPqqY}^{ zNed$GXEm)QQTHvDBHBV4WjAQci>IA+-U3!`V!v|3#CDpIHKO#O-M+^6Fq~l)*iluA zlH#%A@cxj~ZuO$ZBDb(#X=gX8#%y?F%4K!hym>k+o1A^i^4yctSdRDYaq=C%j2C6O zfFlLuYrg1y!#KQN;+@!IMX7Qb_3;X+2~8Yr`NFl|i)krrxFR9sImPZPAu?Xck->7P z#3Ks+&i7)DTY(q*>^-BTRGW=<$43y4z6sQqzb}rwayBB;mj($5{C2aP3o~vcax6+| zYgIA}8#c;%m6ojS6bAK?iTA(I$uvkaP)nM`$V?nua+qXQSNDuYQNE4(k|KJkue|VC z7(O-n_g!Cl^1RZ2Ed#ahT(}~8wGSg&;r1;yW`P@;^z23L@%S5wQHZBUIm+G3arcs^ zn1XuTVFCBX^MHJZXTlfZTeFl2#%w7TR%S~A{PdEP57*~NF~EOLGvPyt*TbO~cmXEu zmJ{H^=aCdEuit%#$K^4Q@;yr2PQr%o#l1Yo;dP?f!n0^S*sUm9@Weh#wF=saC-xEa zXZixY0x!djL+jV?$V=oll(bDELy;1{fQr(s+$<Es8b|t8vtxr|{;BdI`nopcU)oRt z)1@&cp@;%s10;->Qk-3k0SSvn^|WSUqp~b|?TWv~z^HEpzIs@Jxf?cWc-80}A1blK z&bwMxR)YG|<U_6Y7-9)O#WCIok7n!F*S2l$46;cqQj0VBYT@1SQg&)*khuy2miSh} z;0aQOt24w$Y1#68H6bmm))G|;6<$Q14=v0lNXedl{*tnMs7?>FL{;;J3MlpA<xoe& zQ8dWbwFl9MIKWch(ok}3Si*!~YK#L<0YMDIeW<P1EP}C2?3y4Xg6FL8Er#az#H<vw z@l}uBeaviyZxI|qm}dZXw%E5Ybi7mwP_rpk!jVjInQuYp7_If9vXE54%m%ICzO_~6 z!|O%bF`YHdv)Zi>&!7!qUxp&z{C>yo@Wiag`%)J8=0#3TbrWgTYN5Ur_~wR^)vZAZ z5!OIUrxmWgA$ucu=8=0jaxXbf9z%iXi{w@E4!Vr^oP2`@ct4|ihgdw%rqNt9CoQ8^ zIvP*5Q|N5GUAF?=b~Mp;ylUdbo9%n?ta~jQLETA@qFC(&eU_fY+feV(Px177hW>;n zU=baA4C6ETJieGW@(zA1no3Paw_hbo_*#Aq--2$&w(;HkF8%<2C4UHwB98D6@+Xk* zI>o<@E~Ng>pXPtUeF!fdzUk17l-M1NwPajiQ=_D(muE>OcsZ*yOFEytj@LP)6=;`t zioLzT-iE{IY{?;ymr`eprrt4-{XJ^>KggD3xISA-BX6o{Fv1o;RZ1N*22J@@RqlPc zQW`jOq;&Ejqjb42D;Kr6r*o0gZOxH(k!kSjTqfSkl`OiCyaheeVOg#;iG0EkW(FS5 zmBz;%UrF$QA{wQ~;%7*yv&K;GL{%k=xYOYuM#(@vRgwcHj{~zwa*|oF&Lp|W%PMs} zVUm6&v*8J|R6*VfU^NoS@tcT%MmF_Qy<9D&IvljS5T1Mn#gHg&Od%fx4%bUV2wL6W z=ay>7=aASS-HDd}k2Od;$lp~9?Ac#RgJ9o{*rb0pNCj}qYH0~UbM6kp%eM*-@NvUZ zNjXQ#$x`Ac*W$c*pZt>!3CQOoddR(AVAhn=uNR6k7pDt_*(Cg0TgcJ__FOLv&sdcv z6ryx9>~3GsXdg~qFQjBG$Pfy1`@uuD#S0HMO)k<cHwlF^4z^CltMh1_idGYilW?$? z1pY8dT1S`yz=(DB<l$X;{9n)Qz#9>da4&J6a6h7OrhuG>S3^6=L3FV2NAef)16u4= zpdXYA>0$Z={fH-gI&bA?@$2|Y@NU#o{3rcvZ4_BaN06{Eic4w~Swj?|^^lc{uwfwb zOlnn7I3A5YlU0f=U?W@P>gGV|lv98IErrypks1aqrCW(qw=Pd`k0T9A1*5h)vRaMT zP=xk6vPP-gCRT$`WQ%I#+^7gbHfa<i61rA}stCbWB_+%z>lCrTW`?ZqG(?(|)Bolm z<q7%MA?sCuR;REW&5EqyLNM%>lFn~Y<X0C)WpBlMqNG&?MxjuE8x-5eEm$4!u9lJ% z*FW*3O|hNcqTmC=0Tj|Rmq0RUSL5NtZb={8p|oymFl#*NRKz-4`*O)-qZ-9Br0YqS z(!twU+ru3PkxfbmZ-e{xNJ*7sv-+mhw_m~w6~Wr}NCb-TWs4$M+s=@rNn5p-Q~0uI zn}SdgCZWR*^m~J}epBuG)+RUEuC&3UbzCIWqe8WsL_#k*8i%?evPmjMo3`>z(ggAq zAXQ0+vZtj4IQ^O=1g_sCjiB;Mv~+SHQ3Jza<OIvMAW{A9LZlL>;mJc%A(U^CMxixR z#$hQBPBP%ZEeJfrfCT}Jcr8xehSx+EQnboO3>omz^HL(bzEdhEaV$~38sWHDT0naR z*n6=wntTzeNnGIc#nMnhdv&UwNxw@n#r@YivR70|{X#hT6l(uZ>_Udrw+l)AmtcAo zYlRWxJj_aJ2xsQ_Kl4}M7F0k#r}v{Wu#)_n+)Zkcv3!hMgW#|~i(k@ll~m!}aG3P9 zjruygj@pi9yLbmj@kqr+uePx-79;2SMIBc|=Y;cn$ZbH}9q45Z{X*^CE9EFoqNKTg z9ZLzb?~q3_$a{OGJbAhw?+q=c)8OJeWkamOpm1I+hPk`UlBf829al}Kz%RGU1?UG; z!G^JTPl(0NxkHUbOgYj7Ki&nJMPcWia-NR6NW+oFJNz6xf2XXU?-_V9IDDQ+)pT&W z=(V|amPuyvZHI09kZm1kevb0tqSz<pp>hppaw<Q{w-vro-xK%amb(Q?_Di|;0T+bH zcVQ$C&DN4W<gN=Y+Ak&Nq9#sbwADqRk4VJUWEGnSiJXh$U*oUG>oFzhqVhH5WZLkW z9VL&DW@12<;H}(hOw#|a#D|x<@v0dZv8=SHl|RPUrQ@a$n0Z`Ig_jOUGU^Q(sgTF` zHZnjZJb6q`2||_~kTS(i)mmWAK`B!R(H?oK5ARbiL}p{waW(xA>>I?C%TM*S!*2(q zkzyn@<InfC!SsVtk<g#|$u=Kq7OPOD&v4~2DtY06wA1E8<swVR>ZqpE=tv)#X1ObT zsAxpB31FR*aus~a5(p7_7FFs)ts)*4SfR-oo1+RW^{rRoSXeR|{k$?xN*dYJ?*PzO zYQ*m1@U4TvRgxa9BP*(Kg|CGR@XdLaUCZQa3{45FXW!XSukLx9;82y6T)HN7hE(g? zm##~zd}ud}y%iadI3R~44;rX?4@s5eJ4Uz`kvc~8#*u%jw9a!_+DlLoKjcPfHTh8` zZN?jsI6eF#@?T>bq#=QS+$g=8j7AraJ|wLnKZTMc!}5ov?@=2&=MiZdx=&>!Y-HfM zN2Fh6vH_lbibV=6vII^)h3x61rzHpKk+(lB&81Xi%wLJJ!!gU!A{hCMgvJHTDym+j zlDDyE6FmHkG>KAKO<DG=v`M#FOkF>j-Tg@eB&mborDr7*r7@R3C*6xm?jz4h3(4PD z@=~a{7)u=eyyU|v`S|n55`Wg8zf58&WZ3b7bR|yz+!v7_9i+Bw+>26L02_Y?iRq0& z3HD;zoer;@l!_Eu2v@u$6_FoQO8;vauAtK|NpI8MSa{*2G>7~v956^00<&M14pP$0 z`e+2iy(;D7+GTy>CM^K3O4EQ`jN8*MuS#=CE6je4^%<{r<g>3yzG1X?5KQ~KR7L)y zBHmLW4}oKUmoBBfaj<+a%~Jbe>))jzu=yWSwl3C}&>Ig||3j)ng9>G1JXs|dz<FOt z8))xfxc3X}iUg%A0?2Al$d2h9BBicdOnn6Qm&sZiOJn31I3>$PXn28BCLNT9GJk=9 zpbKJp6VyD3VR_<XG0%N5m}h8Y9t6#%y@^m0D=&eq6J!~lJ0uNdNYh|XEWW0^hI?y8 zxts~PgXE-`UcBQ~H-~y#82S-#Vh|=-H%QJ$tBqi7(pc>Isj=L0j^D{U==*r+i^qFe zcuqi1gOGSaEJS%tHt+J<;q3%D($dU=j$hF;s>8n8YlC5l^6W@iH9A(XnNb?u?6t!7 zM0w!=aCB<vaE$d@;M+tw(h|;MMoT$|&1J9ln!z|!9vhvXIl8i1tGy=JiSP(ZFwAc^ z+Rf;@HQ`w~8NM4TN16v?3U(XFX<6v4fJI62xabnlFCN}PpXn`!qe-%30Jss|avD3m zWl;Kn80laW@td9K9?o@3DL?FZf&7R}dz0X?QXIk3J#vORcwd#`$h>w?)&_4|nLLR0 zqHReTrn=_RuyI~Yd+|zHxjYq3WRxMqd7J<jm1B}Ox8T?-)B1;UIg$3JAk~zeFs?$j z;>9+WIDpXY2uWp-CRBq2F&N-jl{}C3ra|m@c>`XUQ`{aYC&<1D`$VEV2rd|pLeP`r z<!Q7x9Wp1#weZzG*`PLJ>I8X6;He4n7YVdC8;;DE*P((BS55{zzE{RsT8+(HTrF>k z>CKT-y_M^zAIMtS4hak7#i;k|EAzKKauQ2EI`H-aIcX?bk$$yC?!Yamwo$&4jD-I- z;+vVhjSbwhR-PV<JM@1$<k5H!P$}-7{aDjwo$_8ZhWn~ho``}2C4TUJIU%rYqx@4c zIS;BYl_#SCQLuiAa2lx$tlTJP!#^&SzeCyOd%NY?@ZAA93!d1ERS%9)5_?4snI*@8 zisc=>W8n{b<k_TvRjCx7*n^{ygJS@Xv34s7r<Ticys@_uX781!quw&2v8VRRuf&f- z>A^(moux_-#%;ucU)U$-k)p8F@%!cT<Ht*>RaLZGvqmQeaTaabFK1%U1e^bFG68No zfU~5SRVfqh-H&qFlLwHnWbDPh#n+)Q<)9po$NkiKRn$8L?md8V@a+eYHk5>A*>+Hl z3E;dm#i8emDh}`Q4#u<frzoW{5y3m9cOpD=NUk8Itl)GQbAybN;;`IECNV9pMpExO zENAG-ym7sg;l;zUlf11?yX+g}QGzeMcP2{TWg9W7DE@M@{KDl;M2O+JUpekqx)^Er zILUxM(@zP$g}t-j_FLpC@?I!$3|g?s-w*P3_Rf}4D=Vq5OBIuBy+O_)@3Un2@c0cl z9)~s}XVrQg9}myniY<+~5qsd;`FsY9x>3%G9oaiaN}W@Qov)lx;u%j<Q;W``9Y(hm z5-*mLMHWTgWp&Sw3kSp4i*b*~GLp-R8KarRE#%PKdpml&PeBW`+faaJqv_~O^*yAj zfJVh-+|S&j+}?x62a5L37Ch)k9z}zN6^eT)z3LxUGvh*2#It*k9qCO(DYT)8nF8uV z&X+<z+F5+)ZHzYoxgvv0)d4W{3^B{5xrqv;Jd0nca%NaxW+>4Rgp!ATX!%0#6POMC z1Vd#gLLcr$O3&O#DWHjpGpkUl@I)+)!HcdZat*nm1fd`8p<kKaIQZZtIUD(opI?%P zqvN&wlX5{iI+93DPgS~AbpfXQOvkG&D^KELkzngdd5nlBH%m79G(U;U;?<LK7P?6L z_M~hR@knMvFT<|{P}My4Wt>brEPq)pMo}pAzAPIhFP^lf7$(5}J8{nc__jC%emaJ} zQQ6imS9;OILZxA}3dG#8aLwCjW~<&e9hQTJ!}z}gom{=n{f1tCCZVzG;3IPB{;CXV zxPa1EJms<TTnzCAU-1Z;JIG%o&}n#V)XsHTF{FE>K<8)&$$WW7@GW@Y)D`q(3e-Y5 zpTe^DKedwH9D%wJ1~c!IQ{|n(x0c)Gl(FREGy%oIoIf%nxkSb24;~i6kdj>*3{Ko9 z4;yr;im{tjmmHOc$-4~#t;DYbz_Q!q^cb=y_?mrG&XD(J3+U60+X0nF<rI0JUO;1O zd|Q50PM7xw-?p>211jDg(7z?8#E^q3njScEoMF8z`1%pU`iDG$R#CLx#k3hQ<nls+ zPG+wxZ9FsVB@m3l^ywZY>WU-*Ek?PWtnHe6IC5o*fR@GFPOaI&=&Q77?a&a6zB*Ar zfjW0F!=Ow%a?LP-7GjK+UyZz0i_~&&Y|Lg~y|^w_z)Q#6B`mYL-qh6BqvZ@<Y80Q7 zZzGG~-sj{A@y>9~Cp`J0YzXL|mnSjF@QD|2^S}NDIa_co=v~5It97Hi4ZTYt<3)J| zvBN9x$s=L+TR1uIeo<bC7a$gK{Cy~;&&CT7d(ac<^W+cc>Uk*lE_Z-igmw^ikHb4d z@o^STm(Hzh#(N0Je7S5Bz0=WxVq#Tj%`$gg=9+dlT4;nX`5Lz72hho*k6nk|gZ{g0 zUNomfZFfIJ=TMVlMw`)Ow@vV(VP*Q1DwPso;TF`Y*5X$-P_xbCqUdxRtD@ZM8L)V~ z++@}{T%&NOgg52<2)}3+cB$TKbXiSaG_S-vBB5f=SvCB^g~{of?wyQg%(5+#uVlV+ zEp~^q-8%^uz9lak0FGWf(GePo=3aVB&T{m>6J=3u;iISP1>W<q%U1WZUNHwf%%K?w z{ORdvw%&?&;w(0oYnFEc<UJ)v-Xuii=)~S?GFN)XL&sBc<OL0c<NXqg#W~$u1;?L~ zZINs_I+8;#pe`r7bXJ_ejbz?XccO>A0{Sh==r)9$LyY47jV=v3FabB&p9+s2lZ)}v z9b3Kd+c8-bQ_w1yR>3RBk;(ZGBM`_|IzQH*3{#KG1*8Yqx|YZKhatVDibN)datg7? zM5X?pkIM#3!zc+q#*dfN0+?q9Ae~9W_e7Yiz9SW4QnUo<4PbhOMkVu={vq&WKrSTR zfD|kp-v@*JHsu`&Tqa)i+H{+oCn)qUajl%>H2dRl7gnW<n%JSAfRXcSgdkkLX!Z|+ zf7~YLqz*)JOZ~BsbGw|G7DcCBe%${iQkZkQoXu!Fqw2EDkFJv@QWt!4o17-9@=Qkk zQ?eN65{r)f(R0i!`WD`w_#E#~Oyj;oz55(o`!>8%Iu3MCM^6MCNOrt2PWM*A!l$EW zG5d^y(Pp+U@Q#IBo|Y>kXEDOfcBjKN0kw9&JuR0;+;GS9C0eUE%+7h<^Kcf|qNft% z-Ws2g)1ndKjUkKO)ae}!S3e`Kh=$wkX1vAF=^X`0&kh7fj}R^g!d<XyV7L*#&fr+$ zb)u6$Ir54lRunJzp%>ygUI%n1$fF`IQ6L<BR-;p1)WKaw*@c$(<ZbdYDYbe6_09nU zl5V)`J)C@F7-4qH%T>q>6;ks)LdL5k8-L4i{C(Mk7nJ}0zC0~{LgXfp4a+}}KSl*! z<%jZobgzd9ivy2+C{K<n9meiR97hf88dT5bpxX9TdNT?_D`^7i&Tb(W;b$I3;8%ZM zMcX%aKVqb3vcCj<f6>W7%j*!~jppaLJ#5DcB?zbMjI5XV@xr)`hWqUbrR8>OGd~nl z;xA^YJ>hm9At1L~+eSk%h5iw!52uRL6s$!bL(J{&SE*uu5i)#KF*?_lAX*-1&R(@T z1S5+5!*wOW#A<=eOhHSm)gTy=?=OT8>@g`5FJ<KgW6l18$Q7?SqSY&VI=4$JGu%C` z*`E(CM@&xYF0G7kV5vV3njJBj!*;Q9!XZY#0j_n#WT#xB;SA#)jD9_wQeYa&FxW_c zF4R6CXCy^39Qpnn*z<s#;<;Eus8l)MpN%I0s+i(youW3SA8V8C&qCu88gg@{C1G_| zeir#NQTj`jdk89aeaI27R+{!+<e#4rN~#qYN~*O+dpG#g(Rm!r56;z4GFGhiGTDz# zeQ-WANp((e%V1lCz*xWIU&(@u2N!h0U5ZlQ7PRyK7`bx6$Mvp+^ZtpO&m>435|a#D z{we>7)I#MC@@U;;ucNmf4*UyO<TMrf&cEb#<mqSph_Z+2VA{c_!0kWE3k6?h?`rtl z;FuCJD}ZRem6<KHJU$n-+W5Z{KcVs%e%j+3^mv>@tYijhz|VUeLtnH1!2_g|F2%#g zt>`-G1NvW7YL7yPpPjgn??nTOzv5CY@@U^tiynP)SY_s;rVP13W!MLrXyir>rr`^p zYUC!BaqTzPJ>+JUalKR<mEa;Ew`lPircnH?$pS5+5i6A3rdBp;iIdwkfQBZt_Q@Rz z3-9?I`a|v<A)vc7ZjV;IQ2t0lMefoPMivy6@NTt>_Okg^=TSX!1RXS!d(>mfUadHF z#f1tb_iA9RkVx<m_29BkL9Jlcxb8j-_o*kBeOdt?6-89Cqgt|l1x2O0KV3k(32r|t zub=3EJdh=z1cTeJ71JMhOamfv5Bq#xf9P@bOm~1GRhE7D=Wj?rJ=Go15Jx9?P)nfI zJUYQcYNZc`^}qJT9P+SQv4j13KL~t81NQF{^~*ctQFWSK#*i`#%HWky@|Zf>muV>b z!5+^P%Gp8tG7V)v;1i6y61f%*|9>IdaXD|{pT;G-RPe_3Ho_-)F{9AwSz;d2m3x0g z`RdsGm~wu5ZxhTl#8^qS3eg*4VxZX&gYMT2G5P%F-u3XN9>EJjU=wObs#(;+P*e=u zrjIEZ<eSusUKa}sY4;51`2mF)ixfIFSm{yK#vac?@Jc6oNnoF^7(5AQv3^1eGcxFK z7eVdwC>6c?2bwg<p*Pw_8IAZ~1VjEMPZ)x>q<Gj-M;DEs;nXdtQp(!K7YW7A-VS*3 z13nAd{)OD|VrGgaQ~ooK|DOL0zoPgqpApArlQ#E;&PFtYr0k`kvk5PNHMNtYMqQl5 z$1z_NaW@*q@t#do;;O2$J4v(!HTwVy`lL3V1!A|@f@M_Uhv8Pco89QF!5zjUM6)vb zykM3*bk>6<d(K`oY7fp*G=4wK8En!2q3B?iJi<IetKaSn#Lg%GNs1G=G7kNa`p6Ib zjQv&FgM4#((N`t9Xy~2{d*WkC$rN=1Iu#$20Q-i-WCPkUOK?%6kOE@|<Lj-1V{&1A zr;r0n2ggi@-G@n9No(&$G%+ir-XV(QSv|XIBU<OGt#_Ev>5$??zXoFSVzNBSw5bV# zR1@UzT%j4&j=nAD_jaj9-BVPf?jU_^@8c9hBrPnC&JE{k^?6}w<lt}EFocd^E|4pQ z_SV`uIJ_Tk5#9CyD)#nC{1CYI4ZJ5*yjIBOagtvCr7m?!MeinLt8LVamr2kmau5%G z04MZQxs1TDxoec4AwXCfI!}?vdj^6<=GP3g2WT}KXfrEprK~WMY-Pj~I4*%ylM{Tl zuc~)5*14Mc>mvKFul&f3X`qTlrlIrC+QFghk$Kp__BjWGi-w@<NbLS;@Z>*HO#13i zBtz@!6lqQGg<|TKYDLA|SJALejKp1I3Ke^fRCKm)aqkvY|1mnULn8Lj5WZ3Enj9?@ zLzkVk@%@p6rr2oaDlI=IgaP*do1|riUZbU0;B7#a2>DW%vb?5utCYH-3SIw1PP_hv z1wVePTq5a1-H0D&3V!t=sv*mxrsDsIGiqW+<iqKy#$avO^bFO3y(^jyl`=6B#oa$7 z?#!SATSf7Fj+{^5Mg5SIc>F_q(ei87EV?6c;E{@CLPA9Z$15@cUGY1^7M_7e%|id- zD-cz^2awNc_W#dNCVPB&z1vZFnL3O5RLAPSTW4*=lrhz+_xs};-VUZ9p)1vfL+TA= zNceJ6hbS`n|5D~z#y=8O<TOBdI@28uI4jWIiYUh%<+!8xrGmG3Fm&)U(0X9OYTxu; zk79QnycgIvq5E-+VZGTep4Ogq;KS2}4L9?NA2GzbcI2b$@OrC|B-WubEq5K9YSAUL zonhgeog5k|qFuP^PU~#-Q25((4PSU|+_WxgarT1`j4f(l`sKm#VDAHVzc*<odU2kN z`<pGC(0K4`F*TtU)wov~QS$0=gkr*gv|j6H&7=N6X+j91DjG`7_KCi|%~R|hypyUG zD+#Yy|9atfv|QGDyQ&scw1Rz=rtbftUO@zr^%~ZPCs?t(;^SNKo0fRepTyz+59C(5 zj<+LAZuNLecJiuHd`4tlBPe7|Lxa^>?{wQj?GDndPy}r_YrW5c%wvnJek93fZRn%S z#oqFrf?D5szgJ&ZT|=$eWoigjFS@>KJpXfrgV_F;`i4qm^S0PKZl_MIa#vK9BTmsZ zHkYl==4d!qog4q>DhH9BqspiOM0(5mxUbIPtcs$cQd=>3rzoY?&Z6GNs8$SkU_bkO z2_w2{`E>2?v?(lyQsEHpvotL-edHvXv{RB&Yp^Yz|Fto7b<TzcOI@g!f^#XdB)abZ z)Rghf$OWmW|4&U(3>uViL3>TKv>L+rXtZHNxB0Ko`}hTTukm}2cj``A9kQ1Hama#` z{P&yL^!v^9u#Gc>sV0c~|Ip69%*r}iwiE3taRvr2qW0~o1M&qP_t}?I)UY-GetY^i z=XVwt7SO-_|I->X?2J|KR8>U|SifDdreRe>ozc}0eun6mfVN<BJnV})(K}negdt2( zqtY)Kt2~QPDZ%iagVb71J7+CDp&<{AV|#yz8ErjlulFlHgy{Ec87iu#Q9#<OUZ;x7 z8^X=w@B-dSzJ#8p$57*1gg3zM!i!X6iNHO@b#wD@H!Sm%`$yqTN2)j^LV*}s4lzG< zXf3ULrJ7SEZz{D@qsI7MOwl?f>@I{NF6eLB#2q-BOmB?e8OmR`#-m(p91y|Tq=pW^ z0}YR;Bd7!zFf)_wDS&W+q}7j(?kcG*tm+=t>tV{I{aUsA4TjZk3*}R5rG8T-)bj(& zPRsq)eq9?`6sx0BehANGza^xLQ!5f0k3NGg^|OE6KCPw$5(4*Rzd3|St8#E;`(bLv zy^sqEm<L8x<u@rh_+Wnzh(|%g8Z<Btr{BoN%mt=KF=<4QigA1UwIS3EPJe}(x)xJ= z`ci8%LM<Yc+Uze6so=t9a0t$+(tBkNhazYA%h;8i8DUc)1nVy?^f1*Xw@0gKC{Z}e zz*5ZcqYDuYq1NG{wEYpP__Vf!(nR885@o{UN2W;!9=6x=9&ZehIkeEM^YYPhQ05Ml zeSDk4Z%?l4Xlbok-)b!l{_b+GT3@=pWfgX0O;bx(>E@Qsj?Pu?YUNAyc-gFUO0#}; zTgz&c(YBWcWx}PC@I&nGdW7M(H5=>one$uLxtmL?o7XkBbTzZu@!Y2z_bFOIeS%x> z8y=r?XB=~x9sCZOw%;K0(&mm{isy#XHjPSZUq?H4YDTIX;hA`vr?}fm&=i3+U2E{- zT~lMb;!_6MF2x!s7}*i!g{N|7Ji5}K68v=8xyuZ>%sF>58v20QH1!K+=T08Ns#5*4 zC00D~Ov~6gSaok?QiLz+s!%PRTG~R)no6|K38eTbNc6jyqS5?_tn4#%Q)zn#Twh5H z2E{vBpZi|36}|UrevFvYiIxt~-%ry5zuk&1J<)T%jQW6`9RDYNCr;w6yvON9FMmaa zRjN-dBo@pq=eaG+T;=FS+wQcF^3FuvZ(&tLQ+_YA5x<3Ecd_|O`9nI6Kgl1$s$9l< zO1x+=R8&-`DsnV~+<x^6SMgMM@tZBhB}HoK!R;}kF6yh+jjTu={Wr%yk2>5sz8rss z|3U5%-H7{*<Bn2~*^hqf`dbb4tJHuxC$k^@(rTGBdJ~aJqcGvEDD|U<T8C<(!APY7 z^R#G<=b|)XRzKS0^xrW1cK~;=9|hN%ZuR5m>$PlJ-6FGTm1EH{?QSg}x~SF(G32it z1^Q3&R~)A|iN{;9Gf_QDRx7+$zai?UzYDFNvnQe3`m<kWPZ>m(X;#<bKq=WeOqZ7I z91^-~<x$&tmQ`3|IwzQJ^vOH%z7U%J`_q**Jy4<QnmG%k43`tVus`uUOHxd!eqoZi zD4X>=F3NN`bvwy?4CxlMAX-dTkUIQa^LqS}P8Zoqyrc&|-MkO&Nv|T;qZ7s31N!HX z-}J<?e1n*hD`7AO$-^+nO2a^(fk8nw21R)om`7mXGGQ=|-O!vm4ujd}V=#XP220%- zENjGI<$4U<_yJC?(VL86vzH;;=tbi}4krqR-Ci4pm--mi+dRI7__)=#9K+jvwHV&v zW4P}0t;O&z-zE(2_HD!PVgGOpAM+Ps_(wmh$kTp1hR^s%Vfc!FE{1RVmtgpjzXrok z{B;=q-M<>cul&sze(z`1`pLf;w{5PQVi?oy!S<3N-KiL+c4K2nRyWp*q;z93MCis^ zliY5sH8FJKCqjs+`#cP7-BlQl?w*L@gzl*rPU)VF;hgSj3>S7U#&B6TdcY$qyX!Gr z-Mt1w{DLKh?K@DfM7nlhV~BspLJvN6?!eZQeLJxAWcLo1bpH-)J?Y+oeMzp|(Td@< zJK8Zk)Pr_m<fb0x#^<&k94~Tb&rl5S?qLlG^cXOFqKBb=s>g!i3q7MT{BzG(3}5S+ zj^R5!tfGJE!G0qD=&9vA9QnSd0bl;z!wUPYhZXj759^{|dbVQtb+3rwuf4H2uXMdw zB#rOIB56u*3Wk}z=@{yJu}E6jixxX{L@y2pE$^+wu%Z_y2(|Ri#L(J12gA|5OEIkK z#Q~xh^y1J|(3!m*__CxIN186}#Ug1<?{*AV?ZgqHt9MEmuHQKb!}gtnRqK7bnYME1 z349a12%VzrLw`kw@Q%k3{J6^r{1EvmbO!nn{W~71e&RX&E^h*##_RE`d`8&0MlvJC z67cSKqojkI*GWq~5?(~+c9N^K=he#dVsef4yjFW&r#vqq*K5y1+VimT+(mBCo;PaG zo0R9J<Yw)8i}t)#dG02+X;07X+K)Sw=N@vW_Pk4b-mN_Ml6$o0z1s7L^4v%6)1F7Q y=l#laKY2iV9@C!3mFEEx(4G&fPcwN)`EigutUVvmo{uWe%gAHe^KtF@#Qy{THYQX6 delta 25396 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 diff --git a/docs/en_us/platform_api/source/course_info.rst b/docs/en_us/platform_api/source/course_info.rst index 6e72e0c5374..82c525be958 100644 --- a/docs/en_us/platform_api/source/course_info.rst +++ b/docs/en_us/platform_api/source/course_info.rst @@ -138,8 +138,8 @@ Get the HTML for the course about page. <p>This is paragraph 2 of the long course description. Add more paragraphs as needed. Make sure to enclose them in paragraph tags.</p> </section>\n\n <section class=\"prerequisites\">\n - <h2>Prerequisites</h2>\n - <p>Add information about course prerequisites here.</p>\n </section>\n\n + <h2>Requirements</h2>\n + <p>Add information about the skills and knowledge students need to take this course.</p>\n </section>\n\n <section class=\"course-staff\">\n <h2>Course Staff</h2>\n <article class=\"teacher\">\n diff --git a/lms/djangoapps/branding/tests.py b/lms/djangoapps/branding/tests.py index e0228d9d026..100148e421e 100644 --- a/lms/djangoapps/branding/tests.py +++ b/lms/djangoapps/branding/tests.py @@ -19,6 +19,12 @@ from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase from xmodule.modulestore.tests.factories import CourseFactory from django.core.urlresolvers import reverse +from courseware.tests.helpers import LoginEnrollmentTestCase + +from util.milestones_helpers import ( + seed_milestone_relationship_types, + set_prerequisite_courses, +) FEATURES_WITH_STARTDATE = settings.FEATURES.copy() FEATURES_WITH_STARTDATE['DISABLE_START_DATES'] = False @@ -109,6 +115,52 @@ class AnonymousIndexPageTest(ModuleStoreTestCase): self.assertEqual(response._headers.get("location")[1], "/login") +@override_settings(MODULESTORE=TEST_DATA_MOCK_MODULESTORE) +class PreRequisiteCourseCatalog(ModuleStoreTestCase, LoginEnrollmentTestCase): + """ + Test to simulate and verify fix for disappearing courses in + course catalog when using pre-requisite courses + """ + @patch.dict(settings.FEATURES, {'ENABLE_PREREQUISITE_COURSES': True, 'MILESTONES_APP': True}) + def setUp(self): + seed_milestone_relationship_types() + + @patch.dict(settings.FEATURES, {'ENABLE_PREREQUISITE_COURSES': True, 'MILESTONES_APP': True}) + def test_course_with_prereq(self): + """ + Simulate having a course which has closed enrollments that has + a pre-req course + """ + pre_requisite_course = CourseFactory.create( + org='edX', + course='900', + display_name='pre requisite course', + ) + + pre_requisite_courses = [unicode(pre_requisite_course.id)] + + # for this failure to occur, the enrollment window needs to be in the past + course = CourseFactory.create( + org='edX', + course='1000', + display_name='course that has pre requisite', + # closed enrollment + enrollment_start=datetime.datetime(2013, 1, 1), + enrollment_end=datetime.datetime(2014, 1, 1), + start=datetime.datetime(2013, 1, 1), + end=datetime.datetime(2030, 1, 1), + pre_requisite_courses=pre_requisite_courses, + ) + set_prerequisite_courses(course.id, pre_requisite_courses) + + resp = self.client.get('/') + self.assertEqual(resp.status_code, 200) + + # make sure both courses are visible in the catalog + self.assertIn('pre requisite course', resp.content) + self.assertIn('course that has pre requisite', resp.content) + + @override_settings(MODULESTORE=TEST_DATA_MOCK_MODULESTORE) class IndexPageCourseCardsSortingTests(ModuleStoreTestCase): """ diff --git a/lms/djangoapps/certificates/models.py b/lms/djangoapps/certificates/models.py index 0b02ed37284..0476579da59 100644 --- a/lms/djangoapps/certificates/models.py +++ b/lms/djangoapps/certificates/models.py @@ -1,8 +1,12 @@ from django.contrib.auth.models import User from django.db import models +from django.db.models.signals import post_save +from django.dispatch import receiver +from django.conf import settings from datetime import datetime from model_utils import Choices from xmodule_django.models import CourseKeyField, NoneToEmptyManager +from util.milestones_helpers import fulfill_course_milestone """ Certificates are created for a student and an offering of a course. @@ -118,6 +122,17 @@ class GeneratedCertificate(models.Model): return None +@receiver(post_save, sender=GeneratedCertificate) +def handle_post_cert_generated(sender, instance, **kwargs): # pylint: disable=no-self-argument, unused-argument + """ + Handles post_save signal of GeneratedCertificate, and mark user collected + course milestone entry if user has passed the course + or certificate status is 'generating'. + """ + if settings.FEATURES.get('ENABLE_PREREQUISITE_COURSES') and instance.status == CertificateStatuses.generating: + fulfill_course_milestone(instance.course_id, instance.user) + + def certificate_status_for_student(student, course_id): ''' This returns a dictionary with a key for status, and other information. diff --git a/lms/djangoapps/certificates/tests/tests.py b/lms/djangoapps/certificates/tests/tests.py index 52d73f42e95..eeb68976d1b 100644 --- a/lms/djangoapps/certificates/tests/tests.py +++ b/lms/djangoapps/certificates/tests/tests.py @@ -2,6 +2,8 @@ Tests for the certificates models. """ +from mock import patch +from django.conf import settings from django.test import TestCase from xmodule.modulestore.tests.factories import CourseFactory @@ -9,6 +11,13 @@ from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase from student.tests.factories import UserFactory from certificates.models import CertificateStatuses, GeneratedCertificate, certificate_status_for_student +from certificates.tests.factories import GeneratedCertificateFactory + +from util.milestones_helpers import ( + set_prerequisite_courses, + milestones_achieved_by_user, + seed_milestone_relationship_types, +) class CertificatesModelTest(ModuleStoreTestCase): @@ -23,3 +32,26 @@ class CertificatesModelTest(ModuleStoreTestCase): certificate_status = certificate_status_for_student(student, course.id) self.assertEqual(certificate_status['status'], CertificateStatuses.unavailable) self.assertEqual(certificate_status['mode'], GeneratedCertificate.MODES.honor) + + @patch.dict(settings.FEATURES, {'ENABLE_PREREQUISITE_COURSES': True, 'MILESTONES_APP': True}) + def test_course_milestone_collected(self): + seed_milestone_relationship_types() + student = UserFactory() + course = CourseFactory.create(org='edx', number='998', display_name='Test Course') + pre_requisite_course = CourseFactory.create(org='edx', number='999', display_name='Pre requisite Course') + # set pre-requisite course + set_prerequisite_courses(course.id, [unicode(pre_requisite_course.id)]) + # get milestones collected by user before completing the pre-requisite course + completed_milestones = milestones_achieved_by_user(student, unicode(pre_requisite_course.id)) + self.assertEqual(len(completed_milestones), 0) + + GeneratedCertificateFactory.create( + user=student, + course_id=pre_requisite_course.id, + status=CertificateStatuses.generating, + mode='verified' + ) + # get milestones collected by user after user has completed the pre-requisite course + completed_milestones = milestones_achieved_by_user(student, unicode(pre_requisite_course.id)) + self.assertEqual(len(completed_milestones), 1) + self.assertEqual(completed_milestones[0]['namespace'], unicode(pre_requisite_course.id)) diff --git a/lms/djangoapps/courseware/access.py b/lms/djangoapps/courseware/access.py index 6ea9528d36f..4f369b4c4b5 100644 --- a/lms/djangoapps/courseware/access.py +++ b/lms/djangoapps/courseware/access.py @@ -28,6 +28,7 @@ from student.roles import ( ) from student.models import CourseEnrollment, CourseEnrollmentAllowed from opaque_keys.edx.keys import CourseKey, UsageKey +from util.milestones_helpers import get_pre_requisite_courses_not_completed DEBUG_ACCESS = False log = logging.getLogger(__name__) @@ -267,8 +268,24 @@ def _has_access_course_desc(user, action, course): _has_staff_access_to_descriptor(user, course, course.id) ) + def can_view_courseware_with_prerequisites(): # pylint: disable=invalid-name + """ + Checks if prerequisite courses feature is enabled and course has prerequisites + and user is neither staff nor anonymous then it returns False if user has not + passed prerequisite courses otherwise return True. + """ + if settings.FEATURES['ENABLE_PREREQUISITE_COURSES'] \ + and not _has_staff_access_to_descriptor(user, course, course.id) \ + and course.pre_requisite_courses \ + and not user.is_anonymous() \ + and get_pre_requisite_courses_not_completed(user, [course.id]): + return False + else: + return True + checkers = { 'load': can_load, + 'view_courseware_with_prerequisites': can_view_courseware_with_prerequisites, 'load_forum': can_load_forum, 'load_mobile': can_load_mobile, 'load_mobile_no_enrollment_check': can_load_mobile_no_enroll_check, diff --git a/lms/djangoapps/courseware/tests/test_about.py b/lms/djangoapps/courseware/tests/test_about.py index b9bdb1233d9..46232c361b2 100644 --- a/lms/djangoapps/courseware/tests/test_about.py +++ b/lms/djangoapps/courseware/tests/test_about.py @@ -20,6 +20,10 @@ from shoppingcart.models import Order, PaidCourseRegistration from xmodule.course_module import CATALOG_VISIBILITY_ABOUT, CATALOG_VISIBILITY_NONE from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory +from util.milestones_helpers import ( + set_prerequisite_courses, + seed_milestone_relationship_types, +) from .helpers import LoginEnrollmentTestCase @@ -33,7 +37,6 @@ class AboutTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase): """ Tests about xblock. """ - def setUp(self): self.course = CourseFactory.create() self.about = ItemFactory.create( @@ -120,6 +123,60 @@ class AboutTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase): info_url = reverse('info', args=[self.course.id.to_deprecated_string()]) self.assertTrue(target_url.endswith(info_url)) + @patch.dict(settings.FEATURES, {'ENABLE_PREREQUISITE_COURSES': True, 'MILESTONES_APP': True}) + def test_pre_requisite_course(self): + seed_milestone_relationship_types() + pre_requisite_course = CourseFactory.create(org='edX', course='900', display_name='pre requisite course') + course = CourseFactory.create(pre_requisite_courses=[unicode(pre_requisite_course.id)]) + self.setup_user() + url = reverse('about_course', args=[unicode(course.id)]) + resp = self.client.get(url) + self.assertEqual(resp.status_code, 200) + self.assertIn("<span class=\"important-dates-item-text pre-requisite\">{} {}</span>" + .format(pre_requisite_course.display_org_with_default, + pre_requisite_course.display_number_with_default), + resp.content.strip('\n')) + + @patch.dict(settings.FEATURES, {'ENABLE_PREREQUISITE_COURSES': True, 'MILESTONES_APP': True}) + def test_about_page_unfulfilled_prereqs(self): + seed_milestone_relationship_types() + pre_requisite_course = CourseFactory.create( + org='edX', + course='900', + display_name='pre requisite course', + ) + + pre_requisite_courses = [unicode(pre_requisite_course.id)] + + # for this failure to occur, the enrollment window needs to be in the past + course = CourseFactory.create( + org='edX', + course='1000', + # closed enrollment + enrollment_start=datetime.datetime(2013, 1, 1), + enrollment_end=datetime.datetime(2014, 1, 1), + start=datetime.datetime(2013, 1, 1), + end=datetime.datetime(2030, 1, 1), + pre_requisite_courses=pre_requisite_courses, + ) + set_prerequisite_courses(course.id, pre_requisite_courses) + + self.setup_user() + self.enroll(self.course, True) + self.enroll(pre_requisite_course, True) + + url = reverse('about_course', args=[unicode(course.id)]) + resp = self.client.get(url) + self.assertEqual(resp.status_code, 200) + self.assertIn("<span class=\"important-dates-item-text pre-requisite\">{} {}</span>" + .format(pre_requisite_course.display_org_with_default, + pre_requisite_course.display_number_with_default), + resp.content.strip('\n')) + + url = reverse('about_course', args=[unicode(pre_requisite_course.id)]) + resp = self.client.get(url) + self.assertEqual(resp.status_code, 200) + @override_settings(MODULESTORE=TEST_DATA_MIXED_CLOSED_MODULESTORE) class AboutTestCaseXML(LoginEnrollmentTestCase, ModuleStoreTestCase): diff --git a/lms/djangoapps/courseware/tests/test_access.py b/lms/djangoapps/courseware/tests/test_access.py index f7a51786858..2ac279013bf 100644 --- a/lms/djangoapps/courseware/tests/test_access.py +++ b/lms/djangoapps/courseware/tests/test_access.py @@ -2,27 +2,35 @@ import datetime import pytz from django.test import TestCase +from django.core.urlresolvers import reverse from mock import Mock, patch from opaque_keys.edx.locations import SlashSeparatedCourseKey import courseware.access as access from courseware.masquerade import CourseMasquerade from courseware.tests.factories import UserFactory, StaffFactory, InstructorFactory -from student.tests.factories import AnonymousUserFactory, CourseEnrollmentAllowedFactory +from courseware.tests.helpers import LoginEnrollmentTestCase +from student.tests.factories import AnonymousUserFactory, CourseEnrollmentAllowedFactory, CourseEnrollmentFactory from xmodule.course_module import ( CATALOG_VISIBILITY_CATALOG_AND_ABOUT, CATALOG_VISIBILITY_ABOUT, CATALOG_VISIBILITY_NONE ) +from xmodule.modulestore.tests.factories import CourseFactory + +from util.milestones_helpers import ( + set_prerequisite_courses, + fulfill_course_milestone, + seed_milestone_relationship_types, +) # pylint: disable=missing-docstring # pylint: disable=protected-access -class AccessTestCase(TestCase): +class AccessTestCase(LoginEnrollmentTestCase): """ Tests for the various access controls on the student dashboard """ - def setUp(self): course_key = SlashSeparatedCourseKey('edX', 'toy', '2012_Fall') self.course = course_key.make_usage_key('course', course_key.run) @@ -243,6 +251,78 @@ class AccessTestCase(TestCase): self.assertTrue(access._has_access_course_desc(staff, 'see_in_catalog', course)) self.assertTrue(access._has_access_course_desc(staff, 'see_about_page', course)) + @patch.dict("django.conf.settings.FEATURES", {'ENABLE_PREREQUISITE_COURSES': True, 'MILESTONES_APP': True}) + def test_access_on_course_with_pre_requisites(self): + """ + Test course access when a course has pre-requisite course yet to be completed + """ + seed_milestone_relationship_types() + user = UserFactory.create() + + pre_requisite_course = CourseFactory.create( + org='test_org', number='788', run='test_run' + ) + + pre_requisite_courses = [unicode(pre_requisite_course.id)] + course = CourseFactory.create( + org='test_org', number='786', run='test_run', pre_requisite_courses=pre_requisite_courses + ) + set_prerequisite_courses(course.id, pre_requisite_courses) + + #user should not be able to load course even if enrolled + CourseEnrollmentFactory(user=user, course_id=course.id) + self.assertFalse(access._has_access_course_desc(user, 'view_courseware_with_prerequisites', course)) + + # Staff can always access course + staff = StaffFactory.create(course_key=course.id) + self.assertTrue(access._has_access_course_desc(staff, 'view_courseware_with_prerequisites', course)) + + # User should be able access after completing required course + fulfill_course_milestone(pre_requisite_course.id, user) + self.assertTrue(access._has_access_course_desc(user, 'view_courseware_with_prerequisites', course)) + + @patch.dict("django.conf.settings.FEATURES", {'ENABLE_PREREQUISITE_COURSES': True, 'MILESTONES_APP': True}) + def test_courseware_page_unfulfilled_prereqs(self): + """ + Test courseware access when a course has pre-requisite course yet to be completed + """ + seed_milestone_relationship_types() + pre_requisite_course = CourseFactory.create( + org='edX', + course='900', + run='test_run', + ) + + pre_requisite_courses = [unicode(pre_requisite_course.id)] + course = CourseFactory.create( + org='edX', + course='1000', + run='test_run', + pre_requisite_courses=pre_requisite_courses, + ) + set_prerequisite_courses(course.id, pre_requisite_courses) + + test_password = 't3stp4ss.!' + user = UserFactory.create() + user.set_password(test_password) + user.save() + self.login(user.email, test_password) + CourseEnrollmentFactory(user=user, course_id=course.id) + + url = reverse('courseware', args=[unicode(course.id)]) + response = self.client.get(url) + self.assertRedirects( + response, + reverse( + 'dashboard' + ) + ) + self.assertEqual(response.status_code, 302) + + fulfill_course_milestone(pre_requisite_course.id, user) + response = self.client.get(url) + self.assertEqual(response.status_code, 200) + class UserRoleTestCase(TestCase): """ diff --git a/lms/djangoapps/courseware/views.py b/lms/djangoapps/courseware/views.py index 5ef7596b8cd..8c16e8b2d1e 100644 --- a/lms/djangoapps/courseware/views.py +++ b/lms/djangoapps/courseware/views.py @@ -56,6 +56,7 @@ import shoppingcart from shoppingcart.models import CourseRegistrationCode from shoppingcart.utils import is_shopping_cart_enabled from opaque_keys import InvalidKeyError +from util.milestones_helpers import get_prerequisite_courses_display from microsite_configuration import microsite from opaque_keys.edx.locations import SlashSeparatedCourseKey @@ -349,6 +350,17 @@ def _index_bulk_op(request, course_key, chapter, section, position): log.debug(u'User %s tried to view course %s but is not enrolled', user, course.location.to_deprecated_string()) return redirect(reverse('about_course', args=[course_key.to_deprecated_string()])) + # see if all pre-requisites (as per the milestones app feature) have been fulfilled + # Note that if the pre-requisite feature flag has been turned off (default) then this check will + # always pass + if not has_access(user, 'view_courseware_with_prerequisites', course): + # prerequisites have not been fulfilled therefore redirect to the Dashboard + log.info( + u'User %d tried to view course %s ' + u'without fulfilling prerequisites', + user.id, unicode(course.id)) + return redirect(reverse('dashboard')) + # check to see if there is a required survey that must be taken before # the user can access the course. if survey.utils.must_answer_survey(course, user): @@ -757,8 +769,13 @@ def course_about(request, course_id): else: course_target = reverse('about_course', args=[course.id.to_deprecated_string()]) - show_courseware_link = (has_access(request.user, 'load', course) or - settings.FEATURES.get('ENABLE_LMS_MIGRATION')) + show_courseware_link = ( + ( + has_access(request.user, 'load', course) + and has_access(request.user, 'view_courseware_with_prerequisites', course) + ) + or settings.FEATURES.get('ENABLE_LMS_MIGRATION') + ) # Note: this is a flow for payment for course registration, not the Verified Certificate flow. registration_price = 0 @@ -790,6 +807,9 @@ def course_about(request, course_id): is_shib_course = uses_shib(course) + # get prerequisite courses display names + pre_requisite_courses = get_prerequisite_courses_display(course) + return render_to_response('courseware/course_about.html', { 'course': course, 'staff_access': staff_access, @@ -811,6 +831,7 @@ def course_about(request, course_id): 'disable_courseware_header': True, 'is_shopping_cart_enabled': _is_shopping_cart_enabled, 'cart_link': reverse('shoppingcart.views.show_cart'), + 'pre_requisite_courses': pre_requisite_courses }) diff --git a/lms/envs/bok_choy.py b/lms/envs/bok_choy.py index 541c7f44072..a3fc1bbce05 100644 --- a/lms/envs/bok_choy.py +++ b/lms/envs/bok_choy.py @@ -83,6 +83,12 @@ LOG_OVERRIDES = [ for log_name, log_level in LOG_OVERRIDES: logging.getLogger(log_name).setLevel(log_level) +# Enable milestones app +FEATURES['MILESTONES_APP'] = True + +# Enable pre-requisite course +FEATURES['ENABLE_PREREQUISITE_COURSES'] = True + # Unfortunately, we need to use debug mode to serve staticfiles DEBUG = True diff --git a/lms/envs/common.py b/lms/envs/common.py index 179a9a82e0a..9b884f1bdff 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -314,6 +314,12 @@ FEATURES = { # let students save and manage their annotations 'ENABLE_EDXNOTES': False, + + # Milestones application flag + 'MILESTONES_APP': False, + + # Prerequisite courses feature flag + 'ENABLE_PREREQUISITE_COURSES': False, } # Ignore static asset files on import which match this pattern @@ -1643,6 +1649,7 @@ if FEATURES.get('AUTH_USE_CAS'): INSTALLED_APPS += ('django_cas',) MIDDLEWARE_CLASSES += ('django_cas.middleware.CASMiddleware',) + ###################### Registration ################################## # For each of the fields, give one of the following values: @@ -1912,7 +1919,8 @@ OPTIONAL_APPS = ( 'openassessment.xblock', # edxval - 'edxval' + 'edxval', + 'milestones' ) for app_name in OPTIONAL_APPS: diff --git a/lms/envs/test.py b/lms/envs/test.py index a259ef3d2b4..06148c40b76 100644 --- a/lms/envs/test.py +++ b/lms/envs/test.py @@ -437,5 +437,9 @@ MONGODB_LOG = { 'db': 'xlog', } + # Enable EdxNotes for tests. FEATURES['ENABLE_EDXNOTES'] = True + +# Add milestones to Installed apps for testing +INSTALLED_APPS += ('milestones', ) diff --git a/lms/static/sass/multicourse/_course_about.scss b/lms/static/sass/multicourse/_course_about.scss index 2ba01bcb201..43fc3e639e6 100644 --- a/lms/static/sass/multicourse/_course_about.scss +++ b/lms/static/sass/multicourse/_course_about.scss @@ -564,6 +564,20 @@ font-weight: 700; } } + + .prerequisite-course { + .pre-requisite { + max-width: 39%; + @extend %text-truncated; + } + .tip { + float: left; + margin: $baseline 0 ($baseline/2); + font-size: 0.8em; + color: $lighter-base-font-color; + font-family: $sans-serif; + } + } } } } diff --git a/lms/static/sass/multicourse/_dashboard.scss b/lms/static/sass/multicourse/_dashboard.scss index 58d1908ca87..a3533ea5592 100644 --- a/lms/static/sass/multicourse/_dashboard.scss +++ b/lms/static/sass/multicourse/_dashboard.scss @@ -482,6 +482,17 @@ } } + .prerequisites { + @include clearfix; + + .tip { + font-family: $sans-serif; + font-size: 1em; + color: $lighter-base-font-color; + margin-top: ($baseline/2); + } + } + // "enrolled as" status .sts-enrollment { position: absolute; diff --git a/lms/templates/courseware/course_about.html b/lms/templates/courseware/course_about.html index 2ed5cd1b113..ae0de962b8e 100644 --- a/lms/templates/courseware/course_about.html +++ b/lms/templates/courseware/course_about.html @@ -319,8 +319,17 @@ </li> % endif + % if pre_requisite_courses: + <li class="prerequisite-course important-dates-item"> + <i class="icon fa fa-list-ul"></i> + <p class="important-dates-item-title">${_("Prerequisites")}</p> + ## Multiple pre-requisite courses are not supported on frontend that's why we are pulling first element + <span class="important-dates-item-text pre-requisite">${pre_requisite_courses[0]}</span> + <p class="tip">${_("You must successfully complete {course} before you begin this course").format(course=pre_requisite_courses[0])}.</p> + </li> + % endif % if get_course_about_section(course, "prerequisites"): - <li class="important-dates-item"><i class="icon fa fa-book"></i><p class="important-dates-item-title">${_("Prerequisites")}</p><span class="important-dates-item-text prerequisites">${get_course_about_section(course, "prerequisites")}</span></li> + <li class="important-dates-item"><i class="icon fa fa-book"></i><p class="important-dates-item-title">${_("Requirements")}</p><span class="important-dates-item-text prerequisites">${get_course_about_section(course, "prerequisites")}</span></li> % endif </ol> </section> diff --git a/lms/templates/dashboard.html b/lms/templates/dashboard.html index 82ee5817cfa..2f488e9637c 100644 --- a/lms/templates/dashboard.html +++ b/lms/templates/dashboard.html @@ -190,7 +190,8 @@ <% is_paid_course = (course.id in enrolled_courses_either_paid) %> <% is_course_blocked = (course.id in block_courses) %> <% course_verification_status = verification_status_by_course.get(course.id, {}) %> - <%include file='dashboard/_dashboard_course_listing.html' args="course=course, enrollment=enrollment, show_courseware_link=show_courseware_link, cert_status=cert_status, show_email_settings=show_email_settings, course_mode_info=course_mode_info, show_refund_option = show_refund_option, is_paid_course = is_paid_course, is_course_blocked = is_course_blocked, verification_status=course_verification_status" /> + <% course_requirements = courses_requirements_not_met.get(course.id) %> + <%include file='dashboard/_dashboard_course_listing.html' args="course=course, enrollment=enrollment, show_courseware_link=show_courseware_link, cert_status=cert_status, show_email_settings=show_email_settings, course_mode_info=course_mode_info, show_refund_option = show_refund_option, is_paid_course = is_paid_course, is_course_blocked = is_course_blocked, verification_status=course_verification_status, course_requirements=course_requirements" /> % endfor </ul> diff --git a/lms/templates/dashboard/_dashboard_course_listing.html b/lms/templates/dashboard/_dashboard_course_listing.html index 558dbe3024b..1b794bdc616 100644 --- a/lms/templates/dashboard/_dashboard_course_listing.html +++ b/lms/templates/dashboard/_dashboard_course_listing.html @@ -1,4 +1,4 @@ -<%page args="course, enrollment, show_courseware_link, cert_status, show_email_settings, course_mode_info, show_refund_option, is_paid_course, is_course_blocked, verification_status" /> +<%page args="course, enrollment, show_courseware_link, cert_status, show_email_settings, course_mode_info, show_refund_option, is_paid_course, is_course_blocked, verification_status, course_requirements" /> <%! from django.utils.translation import ugettext as _ @@ -324,6 +324,19 @@ from student.helpers import ( </section> + % if course_requirements: + ## Multiple pre-requisite courses are not supported on frontend that's why we are pulling first element + <% prc_target = reverse('about_course', args=[unicode(course_requirements['courses'][0]['key'])]) %> + <section class="prerequisites"> + <p class="tip"> + ${_("You must successfully complete {link_start}{prc_display}{link_end} before you begin this course.").format( + link_start='<a href="{}">'.format(prc_target), + link_end='</a>', + prc_display=course_requirements['courses'][0]['display'], + )} + </p> + </section> + % endif </article> </article> </li> diff --git a/requirements/edx/github.txt b/requirements/edx/github.txt index 607517c332b..29712ea48ed 100644 --- a/requirements/edx/github.txt +++ b/requirements/edx/github.txt @@ -36,3 +36,4 @@ git+https://github.com/mitocw/django-cas.git@60a5b8e5a62e63e0d5d224a87f0b489201a -e git+https://github.com/edx/edx-oauth2-provider.git@0.4.0#egg=oauth2-provider -e git+https://github.com/edx/edx-val.git@ba00a5f2e0571e9a3f37d293a98efe4cbca850d5#egg=edx-val -e git+https://github.com/pmitros/RecommenderXBlock.git@b41ba8778b98da0ea680ffb8bbc59492d669df2d#egg=recommender-xblock +-e git+https://github.com/edx/edx-milestones.git@4dfe78a2aae9559ccc979746d13a9b67f0ec311e#egg=edx-milestones -- GitLab