diff --git a/cms/djangoapps/contentstore/tests/test_course_settings.py b/cms/djangoapps/contentstore/tests/test_course_settings.py index df34ee26883c082554244580ce9b216e7adcdeb6..584a4820c086bb8a6740e173689470c6bbc1af6a 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 b25cf6895f412bffb7c5e2d7e1dfe9fde46517de..e13f1f1a8708900d0b1635057bd3f5855d4ac4cb 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 21f344f706b4faf12b3f25f7f6704559b5c00532..509c2df6a26e51699a7b0556dc7d0a21c08fabce 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 23320d1580d0f16e1824c8543b9ff1e1c8cba833..f7b63570afa1b651b67f3d095799dd95d964b6ea 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 f6235715338937bd7a4e8cf24c93d9128239f192..6b6470e78b1c3b3466012ad8fbef63e77b879dc6 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 3aea5b983baf89800ffa18462992a206bec97e34..2f5a676e410669efa21c21637ed505bdca8bd051 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 58c361c0b53d10a12eaa448862374d04f7debf0d..e3a329436030689f03a8f820b1d176e8beb052c0 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 3957940b5dc26693cef7c6a215662a6c3277a968..58b58fb7af6f4d144c8083ce762e37ad38be9e51 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 c3066f4fa61427ecb5bbcff229dea8787a613fd3..7fea35e84839ceefd4745b43c4916eab892c90cb 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 594a96899232bf22a59a903fbecd58bdb0ce2f4a..8e10e49221ba21c50d9c1c89d96c1815c420507b 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 67835a9ee7357642f8d217ea1a50b1b88d57bb92..be45253da1f228b28203842c91d9448697219fcd 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 72ed7e2cf8ddcc042bf440b59e1b8fc60ed19ced..280a71b7bd866f0acce947f901f19297db49a962 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 b73067cbd082695f38af803c29a3078b4194284b..35dd4b1b80bb77e7ee0341045bd5d48d472e863f 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 0cfae37aee2c2a4d81b60632cc7d713b548a5f1f..9cebd02dcc748dfa8ec3136f3abae865aefd1b1b 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 0000000000000000000000000000000000000000..8668c472cedce38d4668c95bf70c8cd56c467d1b --- /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 e51b6e7d3e9892bc5df3d049a67bc030e227db27..cb445883e108008e177b576511ad0174ebedeb9c 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 ac64f3eb785f2c3a198fa9c213da1246952c3f53..6eba22fb65237ce8d51e4aacafb84f78de8d2d53 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 4d810c98a913f5dafc582c973b7632ae43e295d9..dd7706adaedb289331000fa8c477498b448842ce 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 2af5c0c37838c3346aeba3153678b1538e1cc4af..96d5bd23016dcb0343ae6bbe1ea3b2b457110c30 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 83eb53a03a1aaa4aa52e17f4cd296882407e8205..b0851c4d3e8fe5c4960a0382a75544e9d071d843 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 cf3be2d1938552b3dbe21a3770e18f68cc108d1a..307d973d6403aff5ee180f355a6ebe6c1f2e53d4 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 0000000000000000000000000000000000000000..6fd0225ca62f448703b1f37892cfc600f784c3b1 --- /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 ac7cb2495cac0086c9861e5f616b45abccb16d1c..091f4ca99d90c76f62284e4251553830b6e5e0ed 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 94ceb085394ec5362cd16020f41aff594bec1684..80b3c25e003bd579c15698778cc5ae7c63faeb0e 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 Binary files a/common/test/db_cache/lettuce.db and b/common/test/db_cache/lettuce.db differ diff --git a/docs/en_us/platform_api/source/course_info.rst b/docs/en_us/platform_api/source/course_info.rst index 6e72e0c53746caa26140146a1afb58ef77037fd9..82c525be958dfe79599ab62261a497e3011a20d4 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 e0228d9d0267922fe7b3edda3e319596c81bacae..100148e421e03b13c4245ea669ff1f74ee48782c 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 0b02ed37284f90313f6103a9cb59bc5cdb80266f..0476579da59745a86ce2a15eb74fca749b17aa48 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 52d73f42e95c6e782b56ee3d35a10ec9f0ca98fb..eeb68976d1b13235ddc9903f51dd356a4b450924 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 6ea9528d36ffa4c09f5e0b6607b6be7c7c893b1d..4f369b4c4b586fb13e92d68d44aa86dc5efb7a24 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 b9bdb1233d994f4cc27c02636ca45efb58966828..46232c361b2ff74e9367c2d312e3bea832c3aac2 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 f7a51786858fe70a21bb807e2a63a0c348752df8..2ac279013bfeae3c1a352098cda4d527358cad1c 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 5ef7596b8cdbeda1354d48b0d3f58ea2d45d2240..8c16e8b2d1e9f4b83629295894d9049488874088 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 541c7f44072036dc2735ab77a2bd57f7ffa3478d..a3fc1bbce058b9ac31edf2619948654a169fde9d 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 179a9a82e0a20c1a8422503829a51d95c3853275..9b884f1bdffd29c1cda3e0ffc87ffe2d57691a02 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 a259ef3d2b4c66b482bf5510baf81f60423f61ce..06148c40b768decaa2de3144350ed7b1a72d244d 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 2ba01bcb2013c36163fe8f21d56724ff0ca28d89..43fc3e639e612968dc02829ab17b2a8475c7c7f6 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 58d1908ca8778d58f851fdc684a86d8217c1fdca..a3533ea559216629f5a560c09c7e98fad4ae09d4 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 2ed5cd1b1130a1e78ca48f5549c85d15479dda3f..ae0de962b8ed71c42b143a9b2e7488733ea9a168 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 82ee5817cfafa59b5285e146faea9651775c8c38..2f488e9637ca10daddae83fba8cea72baf4567b5 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 558dbe3024bbde2e533e3bcbb8afaced8a4711e8..1b794bdc616affcc729361921e7ad7ffd291d250 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 607517c332bded3bf57173442d26abe71d9b4a7e..29712ea48ed60b2d1d9308a9ba70e6d66b96ecc6 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