diff --git a/cms/djangoapps/contentstore/views/tests/test_programs.py b/cms/djangoapps/contentstore/views/tests/test_programs.py index fc5f2df2d2..1f3042170e 100644 --- a/cms/djangoapps/contentstore/views/tests/test_programs.py +++ b/cms/djangoapps/contentstore/views/tests/test_programs.py @@ -5,7 +5,7 @@ from django.conf import settings from django.core.urlresolvers import reverse import httpretty import mock -from oauth2_provider.tests.factories import ClientFactory +from edx_oauth2_provider.tests.factories import ClientFactory from provider.constants import CONFIDENTIAL from openedx.core.djangoapps.programs.models import ProgramsApiConfig diff --git a/cms/envs/common.py b/cms/envs/common.py index face8e67d9..71389ff714 100644 --- a/cms/envs/common.py +++ b/cms/envs/common.py @@ -876,9 +876,12 @@ INSTALLED_APPS = ( # Self-paced course configuration 'openedx.core.djangoapps.self_paced', - # OAuth2 Provider + # django-oauth2-provider (deprecated) 'provider', 'provider.oauth2', + 'edx_oauth2_provider', + + # django-oauth-toolkit 'oauth2_provider', # These are apps that aren't strictly needed by Studio, but are imported by diff --git a/common/djangoapps/auth_exchange/forms.py b/common/djangoapps/auth_exchange/forms.py index cad3db1e1b..8caf61799d 100644 --- a/common/djangoapps/auth_exchange/forms.py +++ b/common/djangoapps/auth_exchange/forms.py @@ -3,11 +3,12 @@ Forms to support third-party to first-party OAuth 2.0 access token exchange """ from django.contrib.auth.models import User from django.forms import CharField -from oauth2_provider.constants import SCOPE_NAMES +from edx_oauth2_provider.constants import SCOPE_NAMES import provider.constants from provider.forms import OAuthForm, OAuthValidationError from provider.oauth2.forms import ScopeChoiceField, ScopeMixin from provider.oauth2.models import Client +from oauth2_provider.models import Application from requests import HTTPError from social.backends import oauth as social_oauth from social.exceptions import AuthException @@ -21,9 +22,10 @@ class AccessTokenExchangeForm(ScopeMixin, OAuthForm): scope = ScopeChoiceField(choices=SCOPE_NAMES, required=False) client_id = CharField(required=False) - def __init__(self, request, *args, **kwargs): + def __init__(self, request, oauth2_adapter, *args, **kwargs): super(AccessTokenExchangeForm, self).__init__(*args, **kwargs) self.request = request + self.oauth2_adapter = oauth2_adapter def _require_oauth_field(self, field_name): """ @@ -68,15 +70,15 @@ class AccessTokenExchangeForm(ScopeMixin, OAuthForm): client_id = self.cleaned_data["client_id"] try: - client = Client.objects.get(client_id=client_id) - except Client.DoesNotExist: + client = self.oauth2_adapter.get_client(client_id=client_id) + except (Client.DoesNotExist, Application.DoesNotExist): raise OAuthValidationError( { "error": "invalid_client", "error_description": "{} is not a valid client_id".format(client_id), } ) - if client.client_type != provider.constants.PUBLIC: + if client.client_type not in [provider.constants.PUBLIC, Application.CLIENT_PUBLIC]: raise OAuthValidationError( { # invalid_client isn't really the right code, but this mirrors diff --git a/common/djangoapps/auth_exchange/tests/mixins.py b/common/djangoapps/auth_exchange/tests/mixins.py new file mode 100644 index 0000000000..450f789657 --- /dev/null +++ b/common/djangoapps/auth_exchange/tests/mixins.py @@ -0,0 +1,111 @@ +""" +Mixins to facilitate testing OAuth connections to Django-OAuth-Toolkit or +Django-OAuth2-Provider. +""" + +# pylint: disable=protected-access + +from unittest import skip, expectedFailure +from django.test.client import RequestFactory + +from lms.djangoapps.oauth_dispatch import adapters +from lms.djangoapps.oauth_dispatch.tests.constants import DUMMY_REDIRECT_URL + +from ..views import DOTAccessTokenExchangeView + + +class DOPAdapterMixin(object): + """ + Mixin to rewire existing tests to use django-oauth2-provider (DOP) backend + + Overwrites self.client_id, self.access_token, self.oauth2_adapter + """ + client_id = 'dop_test_client_id' + access_token = 'dop_test_access_token' + oauth2_adapter = adapters.DOPAdapter() + + def create_public_client(self, user, client_id=None): + """ + Create an oauth client application that is public. + """ + return self.oauth2_adapter.create_public_client( + name='Test Public Client', + user=user, + client_id=client_id, + redirect_uri=DUMMY_REDIRECT_URL, + ) + + def create_confidential_client(self, user, client_id=None): + """ + Create an oauth client application that is confidential. + """ + return self.oauth2_adapter.create_confidential_client( + name='Test Confidential Client', + user=user, + client_id=client_id, + redirect_uri=DUMMY_REDIRECT_URL, + ) + + def get_token_response_keys(self): + """ + Return the set of keys provided when requesting an access token + """ + return {'access_token', 'token_type', 'expires_in', 'scope'} + + +class DOTAdapterMixin(object): + """ + Mixin to rewire existing tests to use django-oauth-toolkit (DOT) backend + + Overwrites self.client_id, self.access_token, self.oauth2_adapter + """ + + client_id = 'dot_test_client_id' + access_token = 'dot_test_access_token' + oauth2_adapter = adapters.DOTAdapter() + + def create_public_client(self, user, client_id=None): + """ + Create an oauth client application that is public. + """ + return self.oauth2_adapter.create_public_client( + name='Test Public Application', + user=user, + client_id=client_id, + redirect_uri=DUMMY_REDIRECT_URL, + ) + + def create_confidential_client(self, user, client_id=None): + """ + Create an oauth client application that is confidential. + """ + return self.oauth2_adapter.create_confidential_client( + name='Test Confidential Application', + user=user, + client_id=client_id, + redirect_uri=DUMMY_REDIRECT_URL, + ) + + def get_token_response_keys(self): + """ + Return the set of keys provided when requesting an access token + """ + return {'access_token', 'refresh_token', 'token_type', 'expires_in', 'scope'} + + def test_get_method(self): + # Dispatch routes all get methods to DOP, so we test this on the view + request_factory = RequestFactory() + request = request_factory.get('/oauth2/exchange_access_token/') + request.session = {} + view = DOTAccessTokenExchangeView.as_view() + response = view(request, backend='facebook') + self.assertEqual(response.status_code, 400) + + @expectedFailure + def test_single_access_token(self): + # TODO: Single access tokens not supported yet for DOT (See MA-2122) + super(DOTAdapterMixin, self).test_single_access_token() + + @skip("Not supported yet (See MA-2123)") + def test_scopes(self): + super(DOTAdapterMixin, self).test_scopes() diff --git a/common/djangoapps/auth_exchange/tests/test_forms.py b/common/djangoapps/auth_exchange/tests/test_forms.py index ffeffb4e22..490628f868 100644 --- a/common/djangoapps/auth_exchange/tests/test_forms.py +++ b/common/djangoapps/auth_exchange/tests/test_forms.py @@ -12,10 +12,12 @@ import httpretty from provider import scope import social.apps.django_app.utils as social_utils -from auth_exchange.forms import AccessTokenExchangeForm -from auth_exchange.tests.utils import AccessTokenExchangeTestMixin from third_party_auth.tests.utils import ThirdPartyOAuthTestMixinFacebook, ThirdPartyOAuthTestMixinGoogle +from ..forms import AccessTokenExchangeForm +from .utils import AccessTokenExchangeTestMixin +from .mixins import DOPAdapterMixin, DOTAdapterMixin + class AccessTokenExchangeFormTest(AccessTokenExchangeTestMixin): """ @@ -31,7 +33,7 @@ class AccessTokenExchangeFormTest(AccessTokenExchangeTestMixin): self.request.backend = social_utils.load_backend(self.request.social_strategy, self.BACKEND, redirect_uri) def _assert_error(self, data, expected_error, expected_error_description): - form = AccessTokenExchangeForm(request=self.request, data=data) + form = AccessTokenExchangeForm(request=self.request, oauth2_adapter=self.oauth2_adapter, data=data) self.assertEqual( form.errors, {"error": expected_error, "error_description": expected_error_description} @@ -39,7 +41,7 @@ class AccessTokenExchangeFormTest(AccessTokenExchangeTestMixin): self.assertNotIn("partial_pipeline", self.request.session) def _assert_success(self, data, expected_scopes): - form = AccessTokenExchangeForm(request=self.request, data=data) + form = AccessTokenExchangeForm(request=self.request, oauth2_adapter=self.oauth2_adapter, data=data) self.assertTrue(form.is_valid()) self.assertEqual(form.cleaned_data["user"], self.user) self.assertEqual(form.cleaned_data["client"], self.oauth_client) @@ -49,13 +51,15 @@ class AccessTokenExchangeFormTest(AccessTokenExchangeTestMixin): # This is necessary because cms does not implement third party auth @unittest.skipUnless(settings.FEATURES.get("ENABLE_THIRD_PARTY_AUTH"), "third party auth not enabled") @httpretty.activate -class AccessTokenExchangeFormTestFacebook( +class DOPAccessTokenExchangeFormTestFacebook( + DOPAdapterMixin, AccessTokenExchangeFormTest, ThirdPartyOAuthTestMixinFacebook, - TestCase + TestCase, ): """ - Tests for AccessTokenExchangeForm used with Facebook + Tests for AccessTokenExchangeForm used with Facebook, tested against + django-oauth2-provider (DOP). """ pass @@ -63,12 +67,46 @@ class AccessTokenExchangeFormTestFacebook( # This is necessary because cms does not implement third party auth @unittest.skipUnless(settings.FEATURES.get("ENABLE_THIRD_PARTY_AUTH"), "third party auth not enabled") @httpretty.activate -class AccessTokenExchangeFormTestGoogle( +class DOTAccessTokenExchangeFormTestFacebook( + DOTAdapterMixin, AccessTokenExchangeFormTest, - ThirdPartyOAuthTestMixinGoogle, - TestCase + ThirdPartyOAuthTestMixinFacebook, + TestCase, ): """ - Tests for AccessTokenExchangeForm used with Google + Tests for AccessTokenExchangeForm used with Facebook, tested against + django-oauth-toolkit (DOT). + """ + pass + + +# This is necessary because cms does not implement third party auth +@unittest.skipUnless(settings.FEATURES.get("ENABLE_THIRD_PARTY_AUTH"), "third party auth not enabled") +@httpretty.activate +class DOPAccessTokenExchangeFormTestGoogle( + DOPAdapterMixin, + AccessTokenExchangeFormTest, + ThirdPartyOAuthTestMixinGoogle, + TestCase, +): + """ + Tests for AccessTokenExchangeForm used with Google, tested against + django-oauth2-provider (DOP). + """ + pass + + +# This is necessary because cms does not implement third party auth +@unittest.skipUnless(settings.FEATURES.get("ENABLE_THIRD_PARTY_AUTH"), "third party auth not enabled") +@httpretty.activate +class DOTAccessTokenExchangeFormTestGoogle( + DOTAdapterMixin, + AccessTokenExchangeFormTest, + ThirdPartyOAuthTestMixinGoogle, + TestCase, +): + """ + Tests for AccessTokenExchangeForm used with Google, tested against + django-oauth-toolkit (DOT). """ pass diff --git a/common/djangoapps/auth_exchange/tests/test_views.py b/common/djangoapps/auth_exchange/tests/test_views.py index 5c0b7503f9..60c687960c 100644 --- a/common/djangoapps/auth_exchange/tests/test_views.py +++ b/common/djangoapps/auth_exchange/tests/test_views.py @@ -1,25 +1,30 @@ -# pylint: disable=no-member """ Tests for OAuth token exchange views """ + +# pylint: disable=no-member + from datetime import timedelta import json import mock import unittest +import ddt from django.conf import settings from django.core.urlresolvers import reverse from django.test import TestCase import httpretty import provider.constants -from provider import scope from provider.oauth2.models import AccessToken, Client +from rest_framework.test import APIClient -from auth_exchange.tests.utils import AccessTokenExchangeTestMixin from student.tests.factories import UserFactory from third_party_auth.tests.utils import ThirdPartyOAuthTestMixinFacebook, ThirdPartyOAuthTestMixinGoogle +from .mixins import DOPAdapterMixin, DOTAdapterMixin +from .utils import AccessTokenExchangeTestMixin +@ddt.ddt class AccessTokenExchangeViewTest(AccessTokenExchangeTestMixin): """ Mixin that defines test cases for AccessTokenExchangeView @@ -27,33 +32,34 @@ class AccessTokenExchangeViewTest(AccessTokenExchangeTestMixin): def setUp(self): super(AccessTokenExchangeViewTest, self).setUp() self.url = reverse("exchange_access_token", kwargs={"backend": self.BACKEND}) + self.csrf_client = APIClient(enforce_csrf_checks=True) def _assert_error(self, data, expected_error, expected_error_description): - response = self.client.post(self.url, data) + response = self.csrf_client.post(self.url, data) self.assertEqual(response.status_code, 400) self.assertEqual(response["Content-Type"], "application/json") self.assertEqual( json.loads(response.content), - {"error": expected_error, "error_description": expected_error_description} + {u"error": expected_error, u"error_description": expected_error_description} ) self.assertNotIn("partial_pipeline", self.client.session) def _assert_success(self, data, expected_scopes): - response = self.client.post(self.url, data) + response = self.csrf_client.post(self.url, data) self.assertEqual(response.status_code, 200) self.assertEqual(response["Content-Type"], "application/json") content = json.loads(response.content) - self.assertEqual(set(content.keys()), {"access_token", "token_type", "expires_in", "scope"}) + self.assertEqual(set(content.keys()), self.get_token_response_keys()) self.assertEqual(content["token_type"], "Bearer") self.assertLessEqual( timedelta(seconds=int(content["expires_in"])), provider.constants.EXPIRE_DELTA_PUBLIC ) - self.assertEqual(content["scope"], " ".join(expected_scopes)) - token = AccessToken.objects.get(token=content["access_token"]) + self.assertEqual(content["scope"], self.oauth2_adapter.normalize_scopes(expected_scopes)) + token = self.oauth2_adapter.get_access_token(token_string=content["access_token"]) self.assertEqual(token.user, self.user) - self.assertEqual(token.client, self.oauth_client) - self.assertEqual(scope.to_names(token.scope), expected_scopes) + self.assertEqual(self.oauth2_adapter.get_client_for_token(token), self.oauth_client) + self.assertEqual(self.oauth2_adapter.get_token_scope_names(token), expected_scopes) def test_single_access_token(self): def extract_token(response): @@ -64,16 +70,15 @@ class AccessTokenExchangeViewTest(AccessTokenExchangeTestMixin): self._setup_provider_response(success=True) for single_access_token in [True, False]: - with mock.patch( - "auth_exchange.views.constants.SINGLE_ACCESS_TOKEN", - single_access_token - ): + with mock.patch("auth_exchange.views.constants.SINGLE_ACCESS_TOKEN", single_access_token): first_response = self.client.post(self.url, self.data) second_response = self.client.post(self.url, self.data) - self.assertEqual( - extract_token(first_response) == extract_token(second_response), - single_access_token - ) + self.assertEqual(first_response.status_code, 200) + self.assertEqual(second_response.status_code, 200) + self.assertEqual( + extract_token(first_response) == extract_token(second_response), + single_access_token + ) def test_get_method(self): response = self.client.get(self.url, self.data) @@ -95,10 +100,11 @@ class AccessTokenExchangeViewTest(AccessTokenExchangeTestMixin): # This is necessary because cms does not implement third party auth @unittest.skipUnless(settings.FEATURES.get("ENABLE_THIRD_PARTY_AUTH"), "third party auth not enabled") @httpretty.activate -class AccessTokenExchangeViewTestFacebook( +class DOPAccessTokenExchangeViewTestFacebook( + DOPAdapterMixin, AccessTokenExchangeViewTest, ThirdPartyOAuthTestMixinFacebook, - TestCase + TestCase, ): """ Tests for AccessTokenExchangeView used with Facebook @@ -106,16 +112,48 @@ class AccessTokenExchangeViewTestFacebook( pass +@unittest.skipUnless(settings.FEATURES.get("ENABLE_THIRD_PARTY_AUTH"), "third party auth not enabled") +@httpretty.activate +class DOTAccessTokenExchangeViewTestFacebook( + DOTAdapterMixin, + AccessTokenExchangeViewTest, + ThirdPartyOAuthTestMixinFacebook, + TestCase, +): + """ + Rerun AccessTokenExchangeViewTestFacebook tests against DOT backend + """ + pass + + # This is necessary because cms does not implement third party auth @unittest.skipUnless(settings.FEATURES.get("ENABLE_THIRD_PARTY_AUTH"), "third party auth not enabled") @httpretty.activate -class AccessTokenExchangeViewTestGoogle( +class DOPAccessTokenExchangeViewTestGoogle( + DOPAdapterMixin, AccessTokenExchangeViewTest, ThirdPartyOAuthTestMixinGoogle, - TestCase + TestCase, ): """ - Tests for AccessTokenExchangeView used with Google + Tests for AccessTokenExchangeView used with Google using + django-oauth2-provider backend. + """ + pass + + +# This is necessary because cms does not implement third party auth +@unittest.skipUnless(settings.FEATURES.get("ENABLE_THIRD_PARTY_AUTH"), "third party auth not enabled") +@httpretty.activate +class DOTAccessTokenExchangeViewTestGoogle( + DOTAdapterMixin, + AccessTokenExchangeViewTest, + ThirdPartyOAuthTestMixinGoogle, + TestCase, +): + """ + Tests for AccessTokenExchangeView used with Google using + django-oauth-toolkit backend. """ pass diff --git a/common/djangoapps/auth_exchange/tests/utils.py b/common/djangoapps/auth_exchange/tests/utils.py index 60608f292f..2629557c08 100644 --- a/common/djangoapps/auth_exchange/tests/utils.py +++ b/common/djangoapps/auth_exchange/tests/utils.py @@ -1,9 +1,8 @@ """ Test utilities for OAuth access token exchange """ -import provider.constants -from social.apps.django_app.default.models import UserSocialAuth +from social.apps.django_app.default.models import UserSocialAuth from third_party_auth.tests.utils import ThirdPartyOAuthTestMixin @@ -37,6 +36,12 @@ class AccessTokenExchangeTestMixin(ThirdPartyOAuthTestMixin): """ raise NotImplementedError() + def _create_client(self): + """ + Create an oauth2 client application using class defaults. + """ + return self.create_public_client(self.user, self.client_id) + def test_minimal(self): self._setup_provider_response(success=True) self._assert_success(self.data, expected_scopes=[]) @@ -61,12 +66,12 @@ class AccessTokenExchangeTestMixin(ThirdPartyOAuthTestMixin): ) def test_confidential_client(self): - self.oauth_client.client_type = provider.constants.CONFIDENTIAL - self.oauth_client.save() + self.data['client_id'] += '_confidential' + self.oauth_client = self.create_confidential_client(self.user, self.data['client_id']) self._assert_error( self.data, "invalid_client", - "test_client_id is not a public client" + "{}_confidential is not a public client".format(self.client_id), ) def test_inactive_user(self): diff --git a/common/djangoapps/auth_exchange/views.py b/common/djangoapps/auth_exchange/views.py index abd31de9ec..6669e489c5 100644 --- a/common/djangoapps/auth_exchange/views.py +++ b/common/djangoapps/auth_exchange/views.py @@ -1,4 +1,3 @@ -# pylint: disable=abstract-method """ Views to support exchange of authentication credentials. The following are currently implemented: @@ -7,36 +6,52 @@ The following are currently implemented: 2. LoginWithAccessTokenView: 1st party (open-edx) OAuth 2.0 access token -> session cookie """ + +# pylint: disable=abstract-method + from django.conf import settings from django.contrib.auth import login import django.contrib.auth as auth from django.http import HttpResponse from django.utils.decorators import method_decorator from django.views.decorators.csrf import csrf_exempt +from edx_oauth2_provider.constants import SCOPE_VALUE_DICT +from oauth2_provider.settings import oauth2_settings +from oauth2_provider.views.base import TokenView as DOTAccessTokenView +from oauthlib.oauth2.rfc6749.tokens import BearerToken from provider import constants -from provider.oauth2.views import AccessTokenView as AccessTokenView +from provider.oauth2.views import AccessTokenView as DOPAccessTokenView from rest_framework import permissions +from rest_framework.response import Response from rest_framework.views import APIView import social.apps.django_app.utils as social_utils from auth_exchange.forms import AccessTokenExchangeForm +from lms.djangoapps.oauth_dispatch import adapters from openedx.core.lib.api.authentication import OAuth2AuthenticationAllowInactiveUser -class AccessTokenExchangeView(AccessTokenView): +class AccessTokenExchangeBase(APIView): """ - View for token exchange from 3rd party OAuth access token to 1st party OAuth access token + View for token exchange from 3rd party OAuth access token to 1st party + OAuth access token. """ @method_decorator(csrf_exempt) @method_decorator(social_utils.strategy("social:complete")) def dispatch(self, *args, **kwargs): - return super(AccessTokenExchangeView, self).dispatch(*args, **kwargs) + return super(AccessTokenExchangeBase, self).dispatch(*args, **kwargs) def get(self, request, _backend): # pylint: disable=arguments-differ - return super(AccessTokenExchangeView, self).get(request) + """ + Pass through GET requests without the _backend + """ + return super(AccessTokenExchangeBase, self).get(request) def post(self, request, _backend): # pylint: disable=arguments-differ - form = AccessTokenExchangeForm(request=request, data=request.POST) + """ + Handle POST requests to get a first-party access token. + """ + form = AccessTokenExchangeForm(request=request, oauth2_adapter=self.oauth2_adapter, data=request.POST) # pylint: disable=no-member if not form.is_valid(): return self.error_response(form.errors) @@ -44,12 +59,89 @@ class AccessTokenExchangeView(AccessTokenView): scope = form.cleaned_data["scope"] client = form.cleaned_data["client"] + return self.exchange_access_token(request, user, scope, client) + + def exchange_access_token(self, request, user, scope, client): + """ + Exchange third party credentials for an edx access token, and return a + serialized access token response. + """ if constants.SINGLE_ACCESS_TOKEN: - edx_access_token = self.get_access_token(request, user, scope, client) + edx_access_token = self.get_access_token(request, user, scope, client) # pylint: disable=no-member else: edx_access_token = self.create_access_token(request, user, scope, client) + return self.access_token_response(edx_access_token) # pylint: disable=no-member - return self.access_token_response(edx_access_token) + +class DOPAccessTokenExchangeView(AccessTokenExchangeBase, DOPAccessTokenView): + """ + View for token exchange from 3rd party OAuth access token to 1st party + OAuth access token. Uses django-oauth2-provider (DOP) to manage access + tokens. + """ + + oauth2_adapter = adapters.DOPAdapter() + + +class DOTAccessTokenExchangeView(AccessTokenExchangeBase, DOTAccessTokenView): + """ + View for token exchange from 3rd party OAuth access token to 1st party + OAuth access token. Uses django-oauth-toolkit (DOT) to manage access + tokens. + """ + + oauth2_adapter = adapters.DOTAdapter() + + def get(self, request, _backend): + return Response(status=400, data={ + 'error': 'invalid_request', + 'error_description': 'Only POST requests allowed.', + }) + + def get_access_token(self, request, user, scope, client): + """ + TODO: MA-2122: Reusing access tokens is not yet supported for DOT. + Just return a new access token. + """ + return self.create_access_token(request, user, scope, client) + + def create_access_token(self, request, user, scope, client): + """ + Create and return a new access token. + """ + _days = 24 * 60 * 60 + token_generator = BearerToken( + expires_in=settings.OAUTH_EXPIRE_PUBLIC_CLIENT_DAYS * _days, + request_validator=oauth2_settings.OAUTH2_VALIDATOR_CLASS(), + ) + self._populate_create_access_token_request(request, user, scope, client) + return token_generator.create_token(request, refresh_token=True) + + def access_token_response(self, token): + """ + Wrap an access token in an appropriate response + """ + return Response(data=token) + + def _populate_create_access_token_request(self, request, user, scope, client): + """ + django-oauth-toolkit expects certain non-standard attributes to + be present on the request object. This function modifies the + request object to match these expectations + """ + request.user = user + request.scopes = [SCOPE_VALUE_DICT[scope]] + request.client = client + request.state = None + request.refresh_token = None + request.extra_credentials = None + request.grant_type = client.authorization_grant_type + + def error_response(self, form_errors): + """ + Return an error response consisting of the errors in the form + """ + return Response(status=400, data=form_errors) class LoginWithAccessTokenView(APIView): diff --git a/common/djangoapps/third_party_auth/tests/utils.py b/common/djangoapps/third_party_auth/tests/utils.py index cce2edd59b..588d23dce9 100644 --- a/common/djangoapps/third_party_auth/tests/utils.py +++ b/common/djangoapps/third_party_auth/tests/utils.py @@ -22,23 +22,30 @@ class ThirdPartyOAuthTestMixin(ThirdPartyAuthTestMixin): USER_URL: The URL of the endpoint that the backend retrieves user data from UID_FIELD: The field in the user data that the backend uses as the user id """ + social_uid = "test_social_uid" + access_token = "test_access_token" + client_id = "test_client_id" + def setUp(self, create_user=True): super(ThirdPartyOAuthTestMixin, self).setUp() - self.social_uid = "test_social_uid" - self.access_token = "test_access_token" - self.client_id = "test_client_id" - self.oauth_client = Client.objects.create( - client_id=self.client_id, - client_type=PUBLIC - ) if create_user: self.user = UserFactory() UserSocialAuth.objects.create(user=self.user, provider=self.BACKEND, uid=self.social_uid) + self.oauth_client = self._create_client() if self.BACKEND == 'google-oauth2': self.configure_google_provider(enabled=True) elif self.BACKEND == 'facebook': self.configure_facebook_provider(enabled=True) + def _create_client(self): + """ + Create an OAuth2 client application + """ + return Client.objects.create( + client_id=self.client_id, + client_type=PUBLIC, + ) + def _setup_provider_response(self, success=False, email=''): """ Register a mock response for the third party user information endpoint; @@ -65,7 +72,7 @@ class ThirdPartyOAuthTestMixin(ThirdPartyAuthTestMixin): self.USER_URL, body=body, status=status, - content_type="application/json" + content_type="application/json", ) diff --git a/common/test/db_cache/bok_choy_data_default.json b/common/test/db_cache/bok_choy_data_default.json index aebe847da7..1eece3c36e 100644 --- a/common/test/db_cache/bok_choy_data_default.json +++ b/common/test/db_cache/bok_choy_data_default.json @@ -1 +1 @@ -[{"fields": {"model": "permission", "app_label": "auth"}, "model": "contenttypes.contenttype", "pk": 1}, {"fields": {"model": "group", "app_label": "auth"}, "model": "contenttypes.contenttype", "pk": 2}, {"fields": {"model": "user", "app_label": "auth"}, "model": "contenttypes.contenttype", "pk": 3}, {"fields": {"model": "contenttype", "app_label": "contenttypes"}, "model": "contenttypes.contenttype", "pk": 4}, {"fields": {"model": "session", "app_label": "sessions"}, "model": "contenttypes.contenttype", "pk": 5}, {"fields": {"model": "site", "app_label": "sites"}, "model": "contenttypes.contenttype", "pk": 6}, {"fields": {"model": "taskmeta", "app_label": "djcelery"}, "model": "contenttypes.contenttype", "pk": 7}, {"fields": {"model": "tasksetmeta", "app_label": "djcelery"}, "model": "contenttypes.contenttype", "pk": 8}, {"fields": {"model": "intervalschedule", "app_label": "djcelery"}, "model": "contenttypes.contenttype", "pk": 9}, {"fields": {"model": "crontabschedule", "app_label": "djcelery"}, "model": "contenttypes.contenttype", "pk": 10}, {"fields": {"model": "periodictasks", "app_label": "djcelery"}, "model": "contenttypes.contenttype", "pk": 11}, {"fields": {"model": "periodictask", "app_label": "djcelery"}, "model": "contenttypes.contenttype", "pk": 12}, {"fields": {"model": "workerstate", "app_label": "djcelery"}, "model": "contenttypes.contenttype", "pk": 13}, {"fields": {"model": "taskstate", "app_label": "djcelery"}, "model": "contenttypes.contenttype", "pk": 14}, {"fields": {"model": "globalstatusmessage", "app_label": "status"}, "model": "contenttypes.contenttype", "pk": 15}, {"fields": {"model": "coursemessage", "app_label": "status"}, "model": "contenttypes.contenttype", "pk": 16}, {"fields": {"model": "assetbaseurlconfig", "app_label": "static_replace"}, "model": "contenttypes.contenttype", "pk": 17}, {"fields": {"model": "assetexcludedextensionsconfig", "app_label": "static_replace"}, "model": "contenttypes.contenttype", "pk": 18}, {"fields": {"model": "courseassetcachettlconfig", "app_label": "contentserver"}, "model": "contenttypes.contenttype", "pk": 19}, {"fields": {"model": "studentmodule", "app_label": "courseware"}, "model": "contenttypes.contenttype", "pk": 20}, {"fields": {"model": "studentmodulehistory", "app_label": "courseware"}, "model": "contenttypes.contenttype", "pk": 21}, {"fields": {"model": "xmoduleuserstatesummaryfield", "app_label": "courseware"}, "model": "contenttypes.contenttype", "pk": 22}, {"fields": {"model": "xmodulestudentprefsfield", "app_label": "courseware"}, "model": "contenttypes.contenttype", "pk": 23}, {"fields": {"model": "xmodulestudentinfofield", "app_label": "courseware"}, "model": "contenttypes.contenttype", "pk": 24}, {"fields": {"model": "offlinecomputedgrade", "app_label": "courseware"}, "model": "contenttypes.contenttype", "pk": 25}, {"fields": {"model": "offlinecomputedgradelog", "app_label": "courseware"}, "model": "contenttypes.contenttype", "pk": 26}, {"fields": {"model": "studentfieldoverride", "app_label": "courseware"}, "model": "contenttypes.contenttype", "pk": 27}, {"fields": {"model": "anonymoususerid", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 28}, {"fields": {"model": "userstanding", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 29}, {"fields": {"model": "userprofile", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 30}, {"fields": {"model": "usersignupsource", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 31}, {"fields": {"model": "usertestgroup", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 32}, {"fields": {"model": "registration", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 33}, {"fields": {"model": "pendingnamechange", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 34}, {"fields": {"model": "pendingemailchange", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 35}, {"fields": {"model": "passwordhistory", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 36}, {"fields": {"model": "loginfailures", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 37}, {"fields": {"model": "historicalcourseenrollment", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 38}, {"fields": {"model": "courseenrollment", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 39}, {"fields": {"model": "manualenrollmentaudit", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 40}, {"fields": {"model": "courseenrollmentallowed", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 41}, {"fields": {"model": "courseaccessrole", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 42}, {"fields": {"model": "dashboardconfiguration", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 43}, {"fields": {"model": "linkedinaddtoprofileconfiguration", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 44}, {"fields": {"model": "entranceexamconfiguration", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 45}, {"fields": {"model": "languageproficiency", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 46}, {"fields": {"model": "courseenrollmentattribute", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 47}, {"fields": {"model": "enrollmentrefundconfiguration", "app_label": "student"}, "model": "contenttypes.contenttype", "pk": 48}, {"fields": {"model": "trackinglog", "app_label": "track"}, "model": "contenttypes.contenttype", "pk": 49}, {"fields": {"model": "ratelimitconfiguration", "app_label": "util"}, "model": "contenttypes.contenttype", "pk": 50}, {"fields": {"model": "certificatewhitelist", "app_label": "certificates"}, "model": "contenttypes.contenttype", "pk": 51}, {"fields": {"model": "generatedcertificate", "app_label": "certificates"}, "model": "contenttypes.contenttype", "pk": 52}, {"fields": {"model": "certificategenerationhistory", "app_label": "certificates"}, "model": "contenttypes.contenttype", "pk": 53}, {"fields": {"model": "certificateinvalidation", "app_label": "certificates"}, "model": "contenttypes.contenttype", "pk": 54}, {"fields": {"model": "examplecertificateset", "app_label": "certificates"}, "model": "contenttypes.contenttype", "pk": 55}, {"fields": {"model": "examplecertificate", "app_label": "certificates"}, "model": "contenttypes.contenttype", "pk": 56}, {"fields": {"model": "certificategenerationcoursesetting", "app_label": "certificates"}, "model": "contenttypes.contenttype", "pk": 57}, {"fields": {"model": "certificategenerationconfiguration", "app_label": "certificates"}, "model": "contenttypes.contenttype", "pk": 58}, {"fields": {"model": "certificatehtmlviewconfiguration", "app_label": "certificates"}, "model": "contenttypes.contenttype", "pk": 59}, {"fields": {"model": "badgeassertion", "app_label": "certificates"}, "model": "contenttypes.contenttype", "pk": 60}, {"fields": {"model": "badgeimageconfiguration", "app_label": "certificates"}, "model": "contenttypes.contenttype", "pk": 61}, {"fields": {"model": "certificatetemplate", "app_label": "certificates"}, "model": "contenttypes.contenttype", "pk": 62}, {"fields": {"model": "certificatetemplateasset", "app_label": "certificates"}, "model": "contenttypes.contenttype", "pk": 63}, {"fields": {"model": "instructortask", "app_label": "instructor_task"}, "model": "contenttypes.contenttype", "pk": 64}, {"fields": {"model": "courseusergroup", "app_label": "course_groups"}, "model": "contenttypes.contenttype", "pk": 65}, {"fields": {"model": "cohortmembership", "app_label": "course_groups"}, "model": "contenttypes.contenttype", "pk": 66}, {"fields": {"model": "courseusergrouppartitiongroup", "app_label": "course_groups"}, "model": "contenttypes.contenttype", "pk": 67}, {"fields": {"model": "coursecohortssettings", "app_label": "course_groups"}, "model": "contenttypes.contenttype", "pk": 68}, {"fields": {"model": "coursecohort", "app_label": "course_groups"}, "model": "contenttypes.contenttype", "pk": 69}, {"fields": {"model": "courseemail", "app_label": "bulk_email"}, "model": "contenttypes.contenttype", "pk": 70}, {"fields": {"model": "optout", "app_label": "bulk_email"}, "model": "contenttypes.contenttype", "pk": 71}, {"fields": {"model": "courseemailtemplate", "app_label": "bulk_email"}, "model": "contenttypes.contenttype", "pk": 72}, {"fields": {"model": "courseauthorization", "app_label": "bulk_email"}, "model": "contenttypes.contenttype", "pk": 73}, {"fields": {"model": "brandinginfoconfig", "app_label": "branding"}, "model": "contenttypes.contenttype", "pk": 74}, {"fields": {"model": "brandingapiconfig", "app_label": "branding"}, "model": "contenttypes.contenttype", "pk": 75}, {"fields": {"model": "externalauthmap", "app_label": "external_auth"}, "model": "contenttypes.contenttype", "pk": 76}, {"fields": {"model": "nonce", "app_label": "django_openid_auth"}, "model": "contenttypes.contenttype", "pk": 77}, {"fields": {"model": "association", "app_label": "django_openid_auth"}, "model": "contenttypes.contenttype", "pk": 78}, {"fields": {"model": "useropenid", "app_label": "django_openid_auth"}, "model": "contenttypes.contenttype", "pk": 79}, {"fields": {"model": "client", "app_label": "oauth2"}, "model": "contenttypes.contenttype", "pk": 80}, {"fields": {"model": "grant", "app_label": "oauth2"}, "model": "contenttypes.contenttype", "pk": 81}, {"fields": {"model": "accesstoken", "app_label": "oauth2"}, "model": "contenttypes.contenttype", "pk": 82}, {"fields": {"model": "refreshtoken", "app_label": "oauth2"}, "model": "contenttypes.contenttype", "pk": 83}, {"fields": {"model": "trustedclient", "app_label": "oauth2_provider"}, "model": "contenttypes.contenttype", "pk": 84}, {"fields": {"model": "oauth2providerconfig", "app_label": "third_party_auth"}, "model": "contenttypes.contenttype", "pk": 85}, {"fields": {"model": "samlproviderconfig", "app_label": "third_party_auth"}, "model": "contenttypes.contenttype", "pk": 86}, {"fields": {"model": "samlconfiguration", "app_label": "third_party_auth"}, "model": "contenttypes.contenttype", "pk": 87}, {"fields": {"model": "samlproviderdata", "app_label": "third_party_auth"}, "model": "contenttypes.contenttype", "pk": 88}, {"fields": {"model": "ltiproviderconfig", "app_label": "third_party_auth"}, "model": "contenttypes.contenttype", "pk": 89}, {"fields": {"model": "providerapipermissions", "app_label": "third_party_auth"}, "model": "contenttypes.contenttype", "pk": 90}, {"fields": {"model": "nonce", "app_label": "oauth_provider"}, "model": "contenttypes.contenttype", "pk": 91}, {"fields": {"model": "scope", "app_label": "oauth_provider"}, "model": "contenttypes.contenttype", "pk": 92}, {"fields": {"model": "consumer", "app_label": "oauth_provider"}, "model": "contenttypes.contenttype", "pk": 93}, {"fields": {"model": "token", "app_label": "oauth_provider"}, "model": "contenttypes.contenttype", "pk": 94}, {"fields": {"model": "resource", "app_label": "oauth_provider"}, "model": "contenttypes.contenttype", "pk": 95}, {"fields": {"model": "article", "app_label": "wiki"}, "model": "contenttypes.contenttype", "pk": 96}, {"fields": {"model": "articleforobject", "app_label": "wiki"}, "model": "contenttypes.contenttype", "pk": 97}, {"fields": {"model": "articlerevision", "app_label": "wiki"}, "model": "contenttypes.contenttype", "pk": 98}, {"fields": {"model": "urlpath", "app_label": "wiki"}, "model": "contenttypes.contenttype", "pk": 99}, {"fields": {"model": "articleplugin", "app_label": "wiki"}, "model": "contenttypes.contenttype", "pk": 100}, {"fields": {"model": "reusableplugin", "app_label": "wiki"}, "model": "contenttypes.contenttype", "pk": 101}, {"fields": {"model": "simpleplugin", "app_label": "wiki"}, "model": "contenttypes.contenttype", "pk": 102}, {"fields": {"model": "revisionplugin", "app_label": "wiki"}, "model": "contenttypes.contenttype", "pk": 103}, {"fields": {"model": "revisionpluginrevision", "app_label": "wiki"}, "model": "contenttypes.contenttype", "pk": 104}, {"fields": {"model": "image", "app_label": "wiki"}, "model": "contenttypes.contenttype", "pk": 105}, {"fields": {"model": "imagerevision", "app_label": "wiki"}, "model": "contenttypes.contenttype", "pk": 106}, {"fields": {"model": "attachment", "app_label": "wiki"}, "model": "contenttypes.contenttype", "pk": 107}, {"fields": {"model": "attachmentrevision", "app_label": "wiki"}, "model": "contenttypes.contenttype", "pk": 108}, {"fields": {"model": "notificationtype", "app_label": "django_notify"}, "model": "contenttypes.contenttype", "pk": 109}, {"fields": {"model": "settings", "app_label": "django_notify"}, "model": "contenttypes.contenttype", "pk": 110}, {"fields": {"model": "subscription", "app_label": "django_notify"}, "model": "contenttypes.contenttype", "pk": 111}, {"fields": {"model": "notification", "app_label": "django_notify"}, "model": "contenttypes.contenttype", "pk": 112}, {"fields": {"model": "logentry", "app_label": "admin"}, "model": "contenttypes.contenttype", "pk": 113}, {"fields": {"model": "role", "app_label": "django_comment_common"}, "model": "contenttypes.contenttype", "pk": 114}, {"fields": {"model": "permission", "app_label": "django_comment_common"}, "model": "contenttypes.contenttype", "pk": 115}, {"fields": {"model": "note", "app_label": "notes"}, "model": "contenttypes.contenttype", "pk": 116}, {"fields": {"model": "splashconfig", "app_label": "splash"}, "model": "contenttypes.contenttype", "pk": 117}, {"fields": {"model": "userpreference", "app_label": "user_api"}, "model": "contenttypes.contenttype", "pk": 118}, {"fields": {"model": "usercoursetag", "app_label": "user_api"}, "model": "contenttypes.contenttype", "pk": 119}, {"fields": {"model": "userorgtag", "app_label": "user_api"}, "model": "contenttypes.contenttype", "pk": 120}, {"fields": {"model": "order", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 121}, {"fields": {"model": "orderitem", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 122}, {"fields": {"model": "invoice", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 123}, {"fields": {"model": "invoicetransaction", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 124}, {"fields": {"model": "invoiceitem", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 125}, {"fields": {"model": "courseregistrationcodeinvoiceitem", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 126}, {"fields": {"model": "invoicehistory", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 127}, {"fields": {"model": "courseregistrationcode", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 128}, {"fields": {"model": "registrationcoderedemption", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 129}, {"fields": {"model": "coupon", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 130}, {"fields": {"model": "couponredemption", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 131}, {"fields": {"model": "paidcourseregistration", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 132}, {"fields": {"model": "courseregcodeitem", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 133}, {"fields": {"model": "courseregcodeitemannotation", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 134}, {"fields": {"model": "paidcourseregistrationannotation", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 135}, {"fields": {"model": "certificateitem", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 136}, {"fields": {"model": "donationconfiguration", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 137}, {"fields": {"model": "donation", "app_label": "shoppingcart"}, "model": "contenttypes.contenttype", "pk": 138}, {"fields": {"model": "coursemode", "app_label": "course_modes"}, "model": "contenttypes.contenttype", "pk": 139}, {"fields": {"model": "coursemodesarchive", "app_label": "course_modes"}, "model": "contenttypes.contenttype", "pk": 140}, {"fields": {"model": "coursemodeexpirationconfig", "app_label": "course_modes"}, "model": "contenttypes.contenttype", "pk": 141}, {"fields": {"model": "softwaresecurephotoverification", "app_label": "verify_student"}, "model": "contenttypes.contenttype", "pk": 142}, {"fields": {"model": "historicalverificationdeadline", "app_label": "verify_student"}, "model": "contenttypes.contenttype", "pk": 143}, {"fields": {"model": "verificationdeadline", "app_label": "verify_student"}, "model": "contenttypes.contenttype", "pk": 144}, {"fields": {"model": "verificationcheckpoint", "app_label": "verify_student"}, "model": "contenttypes.contenttype", "pk": 145}, {"fields": {"model": "verificationstatus", "app_label": "verify_student"}, "model": "contenttypes.contenttype", "pk": 146}, {"fields": {"model": "incoursereverificationconfiguration", "app_label": "verify_student"}, "model": "contenttypes.contenttype", "pk": 147}, {"fields": {"model": "icrvstatusemailsconfiguration", "app_label": "verify_student"}, "model": "contenttypes.contenttype", "pk": 148}, {"fields": {"model": "skippedreverification", "app_label": "verify_student"}, "model": "contenttypes.contenttype", "pk": 149}, {"fields": {"model": "darklangconfig", "app_label": "dark_lang"}, "model": "contenttypes.contenttype", "pk": 150}, {"fields": {"model": "microsite", "app_label": "microsite_configuration"}, "model": "contenttypes.contenttype", "pk": 151}, {"fields": {"model": "micrositehistory", "app_label": "microsite_configuration"}, "model": "contenttypes.contenttype", "pk": 152}, {"fields": {"model": "historicalmicrositeorganizationmapping", "app_label": "microsite_configuration"}, "model": "contenttypes.contenttype", "pk": 153}, {"fields": {"model": "micrositeorganizationmapping", "app_label": "microsite_configuration"}, "model": "contenttypes.contenttype", "pk": 154}, {"fields": {"model": "historicalmicrositetemplate", "app_label": "microsite_configuration"}, "model": "contenttypes.contenttype", "pk": 155}, {"fields": {"model": "micrositetemplate", "app_label": "microsite_configuration"}, "model": "contenttypes.contenttype", "pk": 156}, {"fields": {"model": "whitelistedrssurl", "app_label": "rss_proxy"}, "model": "contenttypes.contenttype", "pk": 157}, {"fields": {"model": "embargoedcourse", "app_label": "embargo"}, "model": "contenttypes.contenttype", "pk": 158}, {"fields": {"model": "embargoedstate", "app_label": "embargo"}, "model": "contenttypes.contenttype", "pk": 159}, {"fields": {"model": "restrictedcourse", "app_label": "embargo"}, "model": "contenttypes.contenttype", "pk": 160}, {"fields": {"model": "country", "app_label": "embargo"}, "model": "contenttypes.contenttype", "pk": 161}, {"fields": {"model": "countryaccessrule", "app_label": "embargo"}, "model": "contenttypes.contenttype", "pk": 162}, {"fields": {"model": "courseaccessrulehistory", "app_label": "embargo"}, "model": "contenttypes.contenttype", "pk": 163}, {"fields": {"model": "ipfilter", "app_label": "embargo"}, "model": "contenttypes.contenttype", "pk": 164}, {"fields": {"model": "coursererunstate", "app_label": "course_action_state"}, "model": "contenttypes.contenttype", "pk": 165}, {"fields": {"model": "mobileapiconfig", "app_label": "mobile_api"}, "model": "contenttypes.contenttype", "pk": 166}, {"fields": {"model": "usersocialauth", "app_label": "default"}, "model": "contenttypes.contenttype", "pk": 167}, {"fields": {"model": "nonce", "app_label": "default"}, "model": "contenttypes.contenttype", "pk": 168}, {"fields": {"model": "association", "app_label": "default"}, "model": "contenttypes.contenttype", "pk": 169}, {"fields": {"model": "code", "app_label": "default"}, "model": "contenttypes.contenttype", "pk": 170}, {"fields": {"model": "surveyform", "app_label": "survey"}, "model": "contenttypes.contenttype", "pk": 171}, {"fields": {"model": "surveyanswer", "app_label": "survey"}, "model": "contenttypes.contenttype", "pk": 172}, {"fields": {"model": "xblockasidesconfig", "app_label": "lms_xblock"}, "model": "contenttypes.contenttype", "pk": 173}, {"fields": {"model": "courseoverview", "app_label": "course_overviews"}, "model": "contenttypes.contenttype", "pk": 174}, {"fields": {"model": "courseoverviewtab", "app_label": "course_overviews"}, "model": "contenttypes.contenttype", "pk": 175}, {"fields": {"model": "courseoverviewimageset", "app_label": "course_overviews"}, "model": "contenttypes.contenttype", "pk": 176}, {"fields": {"model": "courseoverviewimageconfig", "app_label": "course_overviews"}, "model": "contenttypes.contenttype", "pk": 177}, {"fields": {"model": "coursestructure", "app_label": "course_structures"}, "model": "contenttypes.contenttype", "pk": 178}, {"fields": {"model": "corsmodel", "app_label": "corsheaders"}, "model": "contenttypes.contenttype", "pk": 179}, {"fields": {"model": "xdomainproxyconfiguration", "app_label": "cors_csrf"}, "model": "contenttypes.contenttype", "pk": 180}, {"fields": {"model": "commerceconfiguration", "app_label": "commerce"}, "model": "contenttypes.contenttype", "pk": 181}, {"fields": {"model": "creditprovider", "app_label": "credit"}, "model": "contenttypes.contenttype", "pk": 182}, {"fields": {"model": "creditcourse", "app_label": "credit"}, "model": "contenttypes.contenttype", "pk": 183}, {"fields": {"model": "creditrequirement", "app_label": "credit"}, "model": "contenttypes.contenttype", "pk": 184}, {"fields": {"model": "historicalcreditrequirementstatus", "app_label": "credit"}, "model": "contenttypes.contenttype", "pk": 185}, {"fields": {"model": "creditrequirementstatus", "app_label": "credit"}, "model": "contenttypes.contenttype", "pk": 186}, {"fields": {"model": "crediteligibility", "app_label": "credit"}, "model": "contenttypes.contenttype", "pk": 187}, {"fields": {"model": "historicalcreditrequest", "app_label": "credit"}, "model": "contenttypes.contenttype", "pk": 188}, {"fields": {"model": "creditrequest", "app_label": "credit"}, "model": "contenttypes.contenttype", "pk": 189}, {"fields": {"model": "courseteam", "app_label": "teams"}, "model": "contenttypes.contenttype", "pk": 190}, {"fields": {"model": "courseteammembership", "app_label": "teams"}, "model": "contenttypes.contenttype", "pk": 191}, {"fields": {"model": "xblockdisableconfig", "app_label": "xblock_django"}, "model": "contenttypes.contenttype", "pk": 192}, {"fields": {"model": "bookmark", "app_label": "bookmarks"}, "model": "contenttypes.contenttype", "pk": 193}, {"fields": {"model": "xblockcache", "app_label": "bookmarks"}, "model": "contenttypes.contenttype", "pk": 194}, {"fields": {"model": "programsapiconfig", "app_label": "programs"}, "model": "contenttypes.contenttype", "pk": 195}, {"fields": {"model": "selfpacedconfiguration", "app_label": "self_paced"}, "model": "contenttypes.contenttype", "pk": 196}, {"fields": {"model": "kvstore", "app_label": "thumbnail"}, "model": "contenttypes.contenttype", "pk": 197}, {"fields": {"model": "credentialsapiconfig", "app_label": "credentials"}, "model": "contenttypes.contenttype", "pk": 198}, {"fields": {"model": "milestone", "app_label": "milestones"}, "model": "contenttypes.contenttype", "pk": 199}, {"fields": {"model": "milestonerelationshiptype", "app_label": "milestones"}, "model": "contenttypes.contenttype", "pk": 200}, {"fields": {"model": "coursemilestone", "app_label": "milestones"}, "model": "contenttypes.contenttype", "pk": 201}, {"fields": {"model": "coursecontentmilestone", "app_label": "milestones"}, "model": "contenttypes.contenttype", "pk": 202}, {"fields": {"model": "usermilestone", "app_label": "milestones"}, "model": "contenttypes.contenttype", "pk": 203}, {"fields": {"model": "studentitem", "app_label": "submissions"}, "model": "contenttypes.contenttype", "pk": 204}, {"fields": {"model": "submission", "app_label": "submissions"}, "model": "contenttypes.contenttype", "pk": 205}, {"fields": {"model": "score", "app_label": "submissions"}, "model": "contenttypes.contenttype", "pk": 206}, {"fields": {"model": "scoresummary", "app_label": "submissions"}, "model": "contenttypes.contenttype", "pk": 207}, {"fields": {"model": "scoreannotation", "app_label": "submissions"}, "model": "contenttypes.contenttype", "pk": 208}, {"fields": {"model": "rubric", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 209}, {"fields": {"model": "criterion", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 210}, {"fields": {"model": "criterionoption", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 211}, {"fields": {"model": "assessment", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 212}, {"fields": {"model": "assessmentpart", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 213}, {"fields": {"model": "assessmentfeedbackoption", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 214}, {"fields": {"model": "assessmentfeedback", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 215}, {"fields": {"model": "peerworkflow", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 216}, {"fields": {"model": "peerworkflowitem", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 217}, {"fields": {"model": "trainingexample", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 218}, {"fields": {"model": "studenttrainingworkflow", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 219}, {"fields": {"model": "studenttrainingworkflowitem", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 220}, {"fields": {"model": "aiclassifierset", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 221}, {"fields": {"model": "aiclassifier", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 222}, {"fields": {"model": "aitrainingworkflow", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 223}, {"fields": {"model": "aigradingworkflow", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 224}, {"fields": {"model": "staffworkflow", "app_label": "assessment"}, "model": "contenttypes.contenttype", "pk": 225}, {"fields": {"model": "assessmentworkflow", "app_label": "workflow"}, "model": "contenttypes.contenttype", "pk": 226}, {"fields": {"model": "assessmentworkflowstep", "app_label": "workflow"}, "model": "contenttypes.contenttype", "pk": 227}, {"fields": {"model": "assessmentworkflowcancellation", "app_label": "workflow"}, "model": "contenttypes.contenttype", "pk": 228}, {"fields": {"model": "profile", "app_label": "edxval"}, "model": "contenttypes.contenttype", "pk": 229}, {"fields": {"model": "video", "app_label": "edxval"}, "model": "contenttypes.contenttype", "pk": 230}, {"fields": {"model": "coursevideo", "app_label": "edxval"}, "model": "contenttypes.contenttype", "pk": 231}, {"fields": {"model": "encodedvideo", "app_label": "edxval"}, "model": "contenttypes.contenttype", "pk": 232}, {"fields": {"model": "subtitle", "app_label": "edxval"}, "model": "contenttypes.contenttype", "pk": 233}, {"fields": {"model": "proctoredexam", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 234}, {"fields": {"model": "proctoredexamreviewpolicy", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 235}, {"fields": {"model": "proctoredexamreviewpolicyhistory", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 236}, {"fields": {"model": "proctoredexamstudentattempt", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 237}, {"fields": {"model": "proctoredexamstudentattempthistory", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 238}, {"fields": {"model": "proctoredexamstudentallowance", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 239}, {"fields": {"model": "proctoredexamstudentallowancehistory", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 240}, {"fields": {"model": "proctoredexamsoftwaresecurereview", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 241}, {"fields": {"model": "proctoredexamsoftwaresecurereviewhistory", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 242}, {"fields": {"model": "proctoredexamsoftwaresecurecomment", "app_label": "edx_proctoring"}, "model": "contenttypes.contenttype", "pk": 243}, {"fields": {"model": "organization", "app_label": "organizations"}, "model": "contenttypes.contenttype", "pk": 244}, {"fields": {"model": "organizationcourse", "app_label": "organizations"}, "model": "contenttypes.contenttype", "pk": 245}, {"fields": {"model": "studentmodulehistoryextended", "app_label": "coursewarehistoryextended"}, "model": "contenttypes.contenttype", "pk": 246}, {"fields": {"model": "videouploadconfig", "app_label": "contentstore"}, "model": "contenttypes.contenttype", "pk": 247}, {"fields": {"model": "pushnotificationconfig", "app_label": "contentstore"}, "model": "contenttypes.contenttype", "pk": 248}, {"fields": {"model": "coursecreator", "app_label": "course_creators"}, "model": "contenttypes.contenttype", "pk": 249}, {"fields": {"model": "studioconfig", "app_label": "xblock_config"}, "model": "contenttypes.contenttype", "pk": 250}, {"fields": {"domain": "example.com", "name": "example.com"}, "model": "sites.site", "pk": 1}, {"fields": {"default": false, "mode": "honor", "icon": "badges/honor.png"}, "model": "certificates.badgeimageconfiguration", "pk": 1}, {"fields": {"default": false, "mode": "verified", "icon": "badges/verified.png"}, "model": "certificates.badgeimageconfiguration", "pk": 2}, {"fields": {"default": false, "mode": "professional", "icon": "badges/professional.png"}, "model": "certificates.badgeimageconfiguration", "pk": 3}, {"fields": {"plain_template": "{course_title}\n\n{{message_body}}\r\n----\r\nCopyright 2013 edX, All rights reserved.\r\n----\r\nConnect with edX:\r\nFacebook (http://facebook.com/edxonline)\r\nTwitter (http://twitter.com/edxonline)\r\nGoogle+ (https://plus.google.com/108235383044095082735)\r\nMeetup (http://www.meetup.com/edX-Communities/)\r\n----\r\nThis email was automatically sent from {platform_name}.\r\nYou are receiving this email at address {email} because you are enrolled in {course_title}\r\n(URL: {course_url} ).\r\nTo stop receiving email like this, update your course email settings at {email_settings_url}.\r\n", "html_template": " Update from {course_title}

edX
Connect with edX:        

{course_title}


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


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


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

edX
Connect with edX:        

{course_title}


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


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


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

edX
Connect with edX:        

{course_title}


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


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


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

edX
Connect with edX:        

{course_title}


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


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


This email was automatically sent from {platform_name}.
You are receiving this email at address {email} because you are enrolled in {course_title}.
To stop receiving email like this, update your course email settings here.
", "name": "branded.template"}, "model": "bulk_email.courseemailtemplate", "pk": 2}, {"fields": {"country": "AF"}, "model": "embargo.country", "pk": 1}, {"fields": {"country": "AX"}, "model": "embargo.country", "pk": 2}, {"fields": {"country": "AL"}, "model": "embargo.country", "pk": 3}, {"fields": {"country": "DZ"}, "model": "embargo.country", "pk": 4}, {"fields": {"country": "AS"}, "model": "embargo.country", "pk": 5}, {"fields": {"country": "AD"}, "model": "embargo.country", "pk": 6}, {"fields": {"country": "AO"}, "model": "embargo.country", "pk": 7}, {"fields": {"country": "AI"}, "model": "embargo.country", "pk": 8}, {"fields": {"country": "AQ"}, "model": "embargo.country", "pk": 9}, {"fields": {"country": "AG"}, "model": "embargo.country", "pk": 10}, {"fields": {"country": "AR"}, "model": "embargo.country", "pk": 11}, {"fields": {"country": "AM"}, "model": "embargo.country", "pk": 12}, {"fields": {"country": "AW"}, "model": "embargo.country", "pk": 13}, {"fields": {"country": "AU"}, "model": "embargo.country", "pk": 14}, {"fields": {"country": "AT"}, "model": "embargo.country", "pk": 15}, {"fields": {"country": "AZ"}, "model": "embargo.country", "pk": 16}, {"fields": {"country": "BS"}, "model": "embargo.country", "pk": 17}, {"fields": {"country": "BH"}, "model": "embargo.country", "pk": 18}, {"fields": {"country": "BD"}, "model": "embargo.country", "pk": 19}, {"fields": {"country": "BB"}, "model": "embargo.country", "pk": 20}, {"fields": {"country": "BY"}, "model": "embargo.country", "pk": 21}, {"fields": {"country": "BE"}, "model": "embargo.country", "pk": 22}, {"fields": {"country": "BZ"}, "model": "embargo.country", "pk": 23}, {"fields": {"country": "BJ"}, "model": "embargo.country", "pk": 24}, {"fields": {"country": "BM"}, "model": "embargo.country", "pk": 25}, {"fields": {"country": "BT"}, "model": "embargo.country", "pk": 26}, {"fields": {"country": "BO"}, "model": "embargo.country", "pk": 27}, {"fields": {"country": "BQ"}, "model": "embargo.country", "pk": 28}, {"fields": {"country": "BA"}, "model": "embargo.country", "pk": 29}, {"fields": {"country": "BW"}, "model": "embargo.country", "pk": 30}, {"fields": {"country": "BV"}, "model": "embargo.country", "pk": 31}, {"fields": {"country": "BR"}, "model": "embargo.country", "pk": 32}, {"fields": {"country": "IO"}, "model": "embargo.country", "pk": 33}, {"fields": {"country": "BN"}, "model": "embargo.country", "pk": 34}, {"fields": {"country": "BG"}, "model": "embargo.country", "pk": 35}, {"fields": {"country": "BF"}, "model": "embargo.country", "pk": 36}, {"fields": {"country": "BI"}, "model": "embargo.country", "pk": 37}, {"fields": {"country": "CV"}, "model": "embargo.country", "pk": 38}, {"fields": {"country": "KH"}, "model": "embargo.country", "pk": 39}, {"fields": {"country": "CM"}, "model": "embargo.country", "pk": 40}, {"fields": {"country": "CA"}, "model": "embargo.country", "pk": 41}, {"fields": {"country": "KY"}, "model": "embargo.country", "pk": 42}, {"fields": {"country": "CF"}, "model": "embargo.country", "pk": 43}, {"fields": {"country": "TD"}, "model": "embargo.country", "pk": 44}, {"fields": {"country": "CL"}, "model": "embargo.country", "pk": 45}, {"fields": {"country": "CN"}, "model": "embargo.country", "pk": 46}, {"fields": {"country": "CX"}, "model": "embargo.country", "pk": 47}, {"fields": {"country": "CC"}, "model": "embargo.country", "pk": 48}, {"fields": {"country": "CO"}, "model": "embargo.country", "pk": 49}, {"fields": {"country": "KM"}, "model": "embargo.country", "pk": 50}, {"fields": {"country": "CG"}, "model": "embargo.country", "pk": 51}, {"fields": {"country": "CD"}, "model": "embargo.country", "pk": 52}, {"fields": {"country": "CK"}, "model": "embargo.country", "pk": 53}, {"fields": {"country": "CR"}, "model": "embargo.country", "pk": 54}, {"fields": {"country": "CI"}, "model": "embargo.country", "pk": 55}, {"fields": {"country": "HR"}, "model": "embargo.country", "pk": 56}, {"fields": {"country": "CU"}, "model": "embargo.country", "pk": 57}, {"fields": {"country": "CW"}, "model": "embargo.country", "pk": 58}, {"fields": {"country": "CY"}, "model": "embargo.country", "pk": 59}, {"fields": {"country": "CZ"}, "model": "embargo.country", "pk": 60}, {"fields": {"country": "DK"}, "model": "embargo.country", "pk": 61}, {"fields": {"country": "DJ"}, "model": "embargo.country", "pk": 62}, {"fields": {"country": "DM"}, "model": "embargo.country", "pk": 63}, {"fields": {"country": "DO"}, "model": "embargo.country", "pk": 64}, {"fields": {"country": "EC"}, "model": "embargo.country", "pk": 65}, {"fields": {"country": "EG"}, "model": "embargo.country", "pk": 66}, {"fields": {"country": "SV"}, "model": "embargo.country", "pk": 67}, {"fields": {"country": "GQ"}, "model": "embargo.country", "pk": 68}, {"fields": {"country": "ER"}, "model": "embargo.country", "pk": 69}, {"fields": {"country": "EE"}, "model": "embargo.country", "pk": 70}, {"fields": {"country": "ET"}, "model": "embargo.country", "pk": 71}, {"fields": {"country": "FK"}, "model": "embargo.country", "pk": 72}, {"fields": {"country": "FO"}, "model": "embargo.country", "pk": 73}, {"fields": {"country": "FJ"}, "model": "embargo.country", "pk": 74}, {"fields": {"country": "FI"}, "model": "embargo.country", "pk": 75}, {"fields": {"country": "FR"}, "model": "embargo.country", "pk": 76}, {"fields": {"country": "GF"}, "model": "embargo.country", "pk": 77}, {"fields": {"country": "PF"}, "model": "embargo.country", "pk": 78}, {"fields": {"country": "TF"}, "model": "embargo.country", "pk": 79}, {"fields": {"country": "GA"}, "model": "embargo.country", "pk": 80}, {"fields": {"country": "GM"}, "model": "embargo.country", "pk": 81}, {"fields": {"country": "GE"}, "model": "embargo.country", "pk": 82}, {"fields": {"country": "DE"}, "model": "embargo.country", "pk": 83}, {"fields": {"country": "GH"}, "model": "embargo.country", "pk": 84}, {"fields": {"country": "GI"}, "model": "embargo.country", "pk": 85}, {"fields": {"country": "GR"}, "model": "embargo.country", "pk": 86}, {"fields": {"country": "GL"}, "model": "embargo.country", "pk": 87}, {"fields": {"country": "GD"}, "model": "embargo.country", "pk": 88}, {"fields": {"country": "GP"}, "model": "embargo.country", "pk": 89}, {"fields": {"country": "GU"}, "model": "embargo.country", "pk": 90}, {"fields": {"country": "GT"}, "model": "embargo.country", "pk": 91}, {"fields": {"country": "GG"}, "model": "embargo.country", "pk": 92}, {"fields": {"country": "GN"}, "model": "embargo.country", "pk": 93}, {"fields": {"country": "GW"}, "model": "embargo.country", "pk": 94}, {"fields": {"country": "GY"}, "model": "embargo.country", "pk": 95}, {"fields": {"country": "HT"}, "model": "embargo.country", "pk": 96}, {"fields": {"country": "HM"}, "model": "embargo.country", "pk": 97}, {"fields": {"country": "VA"}, "model": "embargo.country", "pk": 98}, {"fields": {"country": "HN"}, "model": "embargo.country", "pk": 99}, {"fields": {"country": "HK"}, "model": "embargo.country", "pk": 100}, {"fields": {"country": "HU"}, "model": "embargo.country", "pk": 101}, {"fields": {"country": "IS"}, "model": "embargo.country", "pk": 102}, {"fields": {"country": "IN"}, "model": "embargo.country", "pk": 103}, {"fields": {"country": "ID"}, "model": "embargo.country", "pk": 104}, {"fields": {"country": "IR"}, "model": "embargo.country", "pk": 105}, {"fields": {"country": "IQ"}, "model": "embargo.country", "pk": 106}, {"fields": {"country": "IE"}, "model": "embargo.country", "pk": 107}, {"fields": {"country": "IM"}, "model": "embargo.country", "pk": 108}, {"fields": {"country": "IL"}, "model": "embargo.country", "pk": 109}, {"fields": {"country": "IT"}, "model": "embargo.country", "pk": 110}, {"fields": {"country": "JM"}, "model": "embargo.country", "pk": 111}, {"fields": {"country": "JP"}, "model": "embargo.country", "pk": 112}, {"fields": {"country": "JE"}, "model": "embargo.country", "pk": 113}, {"fields": {"country": "JO"}, "model": "embargo.country", "pk": 114}, {"fields": {"country": "KZ"}, "model": "embargo.country", "pk": 115}, {"fields": {"country": "KE"}, "model": "embargo.country", "pk": 116}, {"fields": {"country": "KI"}, "model": "embargo.country", "pk": 117}, {"fields": {"country": "KW"}, "model": "embargo.country", "pk": 118}, {"fields": {"country": "KG"}, "model": "embargo.country", "pk": 119}, {"fields": {"country": "LA"}, "model": "embargo.country", "pk": 120}, {"fields": {"country": "LV"}, "model": "embargo.country", "pk": 121}, {"fields": {"country": "LB"}, "model": "embargo.country", "pk": 122}, {"fields": {"country": "LS"}, "model": "embargo.country", "pk": 123}, {"fields": {"country": "LR"}, "model": "embargo.country", "pk": 124}, {"fields": {"country": "LY"}, "model": "embargo.country", "pk": 125}, {"fields": {"country": "LI"}, "model": "embargo.country", "pk": 126}, {"fields": {"country": "LT"}, "model": "embargo.country", "pk": 127}, {"fields": {"country": "LU"}, "model": "embargo.country", "pk": 128}, {"fields": {"country": "MO"}, "model": "embargo.country", "pk": 129}, {"fields": {"country": "MK"}, "model": "embargo.country", "pk": 130}, {"fields": {"country": "MG"}, "model": "embargo.country", "pk": 131}, {"fields": {"country": "MW"}, "model": "embargo.country", "pk": 132}, {"fields": {"country": "MY"}, "model": "embargo.country", "pk": 133}, {"fields": {"country": "MV"}, "model": "embargo.country", "pk": 134}, {"fields": {"country": "ML"}, "model": "embargo.country", "pk": 135}, {"fields": {"country": "MT"}, "model": "embargo.country", "pk": 136}, {"fields": {"country": "MH"}, "model": "embargo.country", "pk": 137}, {"fields": {"country": "MQ"}, "model": "embargo.country", "pk": 138}, {"fields": {"country": "MR"}, "model": "embargo.country", "pk": 139}, {"fields": {"country": "MU"}, "model": "embargo.country", "pk": 140}, {"fields": {"country": "YT"}, "model": "embargo.country", "pk": 141}, {"fields": {"country": "MX"}, "model": "embargo.country", "pk": 142}, {"fields": {"country": "FM"}, "model": "embargo.country", "pk": 143}, {"fields": {"country": "MD"}, "model": "embargo.country", "pk": 144}, {"fields": {"country": "MC"}, "model": "embargo.country", "pk": 145}, {"fields": {"country": "MN"}, "model": "embargo.country", "pk": 146}, {"fields": {"country": "ME"}, "model": "embargo.country", "pk": 147}, {"fields": {"country": "MS"}, "model": "embargo.country", "pk": 148}, {"fields": {"country": "MA"}, "model": "embargo.country", "pk": 149}, {"fields": {"country": "MZ"}, "model": "embargo.country", "pk": 150}, {"fields": {"country": "MM"}, "model": "embargo.country", "pk": 151}, {"fields": {"country": "NA"}, "model": "embargo.country", "pk": 152}, {"fields": {"country": "NR"}, "model": "embargo.country", "pk": 153}, {"fields": {"country": "NP"}, "model": "embargo.country", "pk": 154}, {"fields": {"country": "NL"}, "model": "embargo.country", "pk": 155}, {"fields": {"country": "NC"}, "model": "embargo.country", "pk": 156}, {"fields": {"country": "NZ"}, "model": "embargo.country", "pk": 157}, {"fields": {"country": "NI"}, "model": "embargo.country", "pk": 158}, {"fields": {"country": "NE"}, "model": "embargo.country", "pk": 159}, {"fields": {"country": "NG"}, "model": "embargo.country", "pk": 160}, {"fields": {"country": "NU"}, "model": "embargo.country", "pk": 161}, {"fields": {"country": "NF"}, "model": "embargo.country", "pk": 162}, {"fields": {"country": "KP"}, "model": "embargo.country", "pk": 163}, {"fields": {"country": "MP"}, "model": "embargo.country", "pk": 164}, {"fields": {"country": "NO"}, "model": "embargo.country", "pk": 165}, {"fields": {"country": "OM"}, "model": "embargo.country", "pk": 166}, {"fields": {"country": "PK"}, "model": "embargo.country", "pk": 167}, {"fields": {"country": "PW"}, "model": "embargo.country", "pk": 168}, {"fields": {"country": "PS"}, "model": "embargo.country", "pk": 169}, {"fields": {"country": "PA"}, "model": "embargo.country", "pk": 170}, {"fields": {"country": "PG"}, "model": "embargo.country", "pk": 171}, {"fields": {"country": "PY"}, "model": "embargo.country", "pk": 172}, {"fields": {"country": "PE"}, "model": "embargo.country", "pk": 173}, {"fields": {"country": "PH"}, "model": "embargo.country", "pk": 174}, {"fields": {"country": "PN"}, "model": "embargo.country", "pk": 175}, {"fields": {"country": "PL"}, "model": "embargo.country", "pk": 176}, {"fields": {"country": "PT"}, "model": "embargo.country", "pk": 177}, {"fields": {"country": "PR"}, "model": "embargo.country", "pk": 178}, {"fields": {"country": "QA"}, "model": "embargo.country", "pk": 179}, {"fields": {"country": "RE"}, "model": "embargo.country", "pk": 180}, {"fields": {"country": "RO"}, "model": "embargo.country", "pk": 181}, {"fields": {"country": "RU"}, "model": "embargo.country", "pk": 182}, {"fields": {"country": "RW"}, "model": "embargo.country", "pk": 183}, {"fields": {"country": "BL"}, "model": "embargo.country", "pk": 184}, {"fields": {"country": "SH"}, "model": "embargo.country", "pk": 185}, {"fields": {"country": "KN"}, "model": "embargo.country", "pk": 186}, {"fields": {"country": "LC"}, "model": "embargo.country", "pk": 187}, {"fields": {"country": "MF"}, "model": "embargo.country", "pk": 188}, {"fields": {"country": "PM"}, "model": "embargo.country", "pk": 189}, {"fields": {"country": "VC"}, "model": "embargo.country", "pk": 190}, {"fields": {"country": "WS"}, "model": "embargo.country", "pk": 191}, {"fields": {"country": "SM"}, "model": "embargo.country", "pk": 192}, {"fields": {"country": "ST"}, "model": "embargo.country", "pk": 193}, {"fields": {"country": "SA"}, "model": "embargo.country", "pk": 194}, {"fields": {"country": "SN"}, "model": "embargo.country", "pk": 195}, {"fields": {"country": "RS"}, "model": "embargo.country", "pk": 196}, {"fields": {"country": "SC"}, "model": "embargo.country", "pk": 197}, {"fields": {"country": "SL"}, "model": "embargo.country", "pk": 198}, {"fields": {"country": "SG"}, "model": "embargo.country", "pk": 199}, {"fields": {"country": "SX"}, "model": "embargo.country", "pk": 200}, {"fields": {"country": "SK"}, "model": "embargo.country", "pk": 201}, {"fields": {"country": "SI"}, "model": "embargo.country", "pk": 202}, {"fields": {"country": "SB"}, "model": "embargo.country", "pk": 203}, {"fields": {"country": "SO"}, "model": "embargo.country", "pk": 204}, {"fields": {"country": "ZA"}, "model": "embargo.country", "pk": 205}, {"fields": {"country": "GS"}, "model": "embargo.country", "pk": 206}, {"fields": {"country": "KR"}, "model": "embargo.country", "pk": 207}, {"fields": {"country": "SS"}, "model": "embargo.country", "pk": 208}, {"fields": {"country": "ES"}, "model": "embargo.country", "pk": 209}, {"fields": {"country": "LK"}, "model": "embargo.country", "pk": 210}, {"fields": {"country": "SD"}, "model": "embargo.country", "pk": 211}, {"fields": {"country": "SR"}, "model": "embargo.country", "pk": 212}, {"fields": {"country": "SJ"}, "model": "embargo.country", "pk": 213}, {"fields": {"country": "SZ"}, "model": "embargo.country", "pk": 214}, {"fields": {"country": "SE"}, "model": "embargo.country", "pk": 215}, {"fields": {"country": "CH"}, "model": "embargo.country", "pk": 216}, {"fields": {"country": "SY"}, "model": "embargo.country", "pk": 217}, {"fields": {"country": "TW"}, "model": "embargo.country", "pk": 218}, {"fields": {"country": "TJ"}, "model": "embargo.country", "pk": 219}, {"fields": {"country": "TZ"}, "model": "embargo.country", "pk": 220}, {"fields": {"country": "TH"}, "model": "embargo.country", "pk": 221}, {"fields": {"country": "TL"}, "model": "embargo.country", "pk": 222}, {"fields": {"country": "TG"}, "model": "embargo.country", "pk": 223}, {"fields": {"country": "TK"}, "model": "embargo.country", "pk": 224}, {"fields": {"country": "TO"}, "model": "embargo.country", "pk": 225}, {"fields": {"country": "TT"}, "model": "embargo.country", "pk": 226}, {"fields": {"country": "TN"}, "model": "embargo.country", "pk": 227}, {"fields": {"country": "TR"}, "model": "embargo.country", "pk": 228}, {"fields": {"country": "TM"}, "model": "embargo.country", "pk": 229}, {"fields": {"country": "TC"}, "model": "embargo.country", "pk": 230}, {"fields": {"country": "TV"}, "model": "embargo.country", "pk": 231}, {"fields": {"country": "UG"}, "model": "embargo.country", "pk": 232}, {"fields": {"country": "UA"}, "model": "embargo.country", "pk": 233}, {"fields": {"country": "AE"}, "model": "embargo.country", "pk": 234}, {"fields": {"country": "GB"}, "model": "embargo.country", "pk": 235}, {"fields": {"country": "UM"}, "model": "embargo.country", "pk": 236}, {"fields": {"country": "US"}, "model": "embargo.country", "pk": 237}, {"fields": {"country": "UY"}, "model": "embargo.country", "pk": 238}, {"fields": {"country": "UZ"}, "model": "embargo.country", "pk": 239}, {"fields": {"country": "VU"}, "model": "embargo.country", "pk": 240}, {"fields": {"country": "VE"}, "model": "embargo.country", "pk": 241}, {"fields": {"country": "VN"}, "model": "embargo.country", "pk": 242}, {"fields": {"country": "VG"}, "model": "embargo.country", "pk": 243}, {"fields": {"country": "VI"}, "model": "embargo.country", "pk": 244}, {"fields": {"country": "WF"}, "model": "embargo.country", "pk": 245}, {"fields": {"country": "EH"}, "model": "embargo.country", "pk": 246}, {"fields": {"country": "YE"}, "model": "embargo.country", "pk": 247}, {"fields": {"country": "ZM"}, "model": "embargo.country", "pk": 248}, {"fields": {"country": "ZW"}, "model": "embargo.country", "pk": 249}, {"fields": {"active": true, "description": "Autogenerated milestone relationship type \"fulfills\"", "modified": "2016-03-07T21:30:43.537Z", "name": "fulfills", "created": "2016-03-07T21:30:43.537Z"}, "model": "milestones.milestonerelationshiptype", "pk": 1}, {"fields": {"active": true, "description": "Autogenerated milestone relationship type \"requires\"", "modified": "2016-03-07T21:30:43.539Z", "name": "requires", "created": "2016-03-07T21:30:43.539Z"}, "model": "milestones.milestonerelationshiptype", "pk": 2}, {"fields": {"profile_name": "desktop_mp4"}, "model": "edxval.profile", "pk": 1}, {"fields": {"profile_name": "desktop_webm"}, "model": "edxval.profile", "pk": 2}, {"fields": {"profile_name": "mobile_high"}, "model": "edxval.profile", "pk": 3}, {"fields": {"profile_name": "mobile_low"}, "model": "edxval.profile", "pk": 4}, {"fields": {"profile_name": "youtube"}, "model": "edxval.profile", "pk": 5}, {"fields": {"codename": "add_permission", "name": "Can add permission", "content_type": 1}, "model": "auth.permission", "pk": 1}, {"fields": {"codename": "change_permission", "name": "Can change permission", "content_type": 1}, "model": "auth.permission", "pk": 2}, {"fields": {"codename": "delete_permission", "name": "Can delete permission", "content_type": 1}, "model": "auth.permission", "pk": 3}, {"fields": {"codename": "add_group", "name": "Can add group", "content_type": 2}, "model": "auth.permission", "pk": 4}, {"fields": {"codename": "change_group", "name": "Can change group", "content_type": 2}, "model": "auth.permission", "pk": 5}, {"fields": {"codename": "delete_group", "name": "Can delete group", "content_type": 2}, "model": "auth.permission", "pk": 6}, {"fields": {"codename": "add_user", "name": "Can add user", "content_type": 3}, "model": "auth.permission", "pk": 7}, {"fields": {"codename": "change_user", "name": "Can change user", "content_type": 3}, "model": "auth.permission", "pk": 8}, {"fields": {"codename": "delete_user", "name": "Can delete user", "content_type": 3}, "model": "auth.permission", "pk": 9}, {"fields": {"codename": "add_contenttype", "name": "Can add content type", "content_type": 4}, "model": "auth.permission", "pk": 10}, {"fields": {"codename": "change_contenttype", "name": "Can change content type", "content_type": 4}, "model": "auth.permission", "pk": 11}, {"fields": {"codename": "delete_contenttype", "name": "Can delete content type", "content_type": 4}, "model": "auth.permission", "pk": 12}, {"fields": {"codename": "add_session", "name": "Can add session", "content_type": 5}, "model": "auth.permission", "pk": 13}, {"fields": {"codename": "change_session", "name": "Can change session", "content_type": 5}, "model": "auth.permission", "pk": 14}, {"fields": {"codename": "delete_session", "name": "Can delete session", "content_type": 5}, "model": "auth.permission", "pk": 15}, {"fields": {"codename": "add_site", "name": "Can add site", "content_type": 6}, "model": "auth.permission", "pk": 16}, {"fields": {"codename": "change_site", "name": "Can change site", "content_type": 6}, "model": "auth.permission", "pk": 17}, {"fields": {"codename": "delete_site", "name": "Can delete site", "content_type": 6}, "model": "auth.permission", "pk": 18}, {"fields": {"codename": "add_taskmeta", "name": "Can add task state", "content_type": 7}, "model": "auth.permission", "pk": 19}, {"fields": {"codename": "change_taskmeta", "name": "Can change task state", "content_type": 7}, "model": "auth.permission", "pk": 20}, {"fields": {"codename": "delete_taskmeta", "name": "Can delete task state", "content_type": 7}, "model": "auth.permission", "pk": 21}, {"fields": {"codename": "add_tasksetmeta", "name": "Can add saved group result", "content_type": 8}, "model": "auth.permission", "pk": 22}, {"fields": {"codename": "change_tasksetmeta", "name": "Can change saved group result", "content_type": 8}, "model": "auth.permission", "pk": 23}, {"fields": {"codename": "delete_tasksetmeta", "name": "Can delete saved group result", "content_type": 8}, "model": "auth.permission", "pk": 24}, {"fields": {"codename": "add_intervalschedule", "name": "Can add interval", "content_type": 9}, "model": "auth.permission", "pk": 25}, {"fields": {"codename": "change_intervalschedule", "name": "Can change interval", "content_type": 9}, "model": "auth.permission", "pk": 26}, {"fields": {"codename": "delete_intervalschedule", "name": "Can delete interval", "content_type": 9}, "model": "auth.permission", "pk": 27}, {"fields": {"codename": "add_crontabschedule", "name": "Can add crontab", "content_type": 10}, "model": "auth.permission", "pk": 28}, {"fields": {"codename": "change_crontabschedule", "name": "Can change crontab", "content_type": 10}, "model": "auth.permission", "pk": 29}, {"fields": {"codename": "delete_crontabschedule", "name": "Can delete crontab", "content_type": 10}, "model": "auth.permission", "pk": 30}, {"fields": {"codename": "add_periodictasks", "name": "Can add periodic tasks", "content_type": 11}, "model": "auth.permission", "pk": 31}, {"fields": {"codename": "change_periodictasks", "name": "Can change periodic tasks", "content_type": 11}, "model": "auth.permission", "pk": 32}, {"fields": {"codename": "delete_periodictasks", "name": "Can delete periodic tasks", "content_type": 11}, "model": "auth.permission", "pk": 33}, {"fields": {"codename": "add_periodictask", "name": "Can add periodic task", "content_type": 12}, "model": "auth.permission", "pk": 34}, {"fields": {"codename": "change_periodictask", "name": "Can change periodic task", "content_type": 12}, "model": "auth.permission", "pk": 35}, {"fields": {"codename": "delete_periodictask", "name": "Can delete periodic task", "content_type": 12}, "model": "auth.permission", "pk": 36}, {"fields": {"codename": "add_workerstate", "name": "Can add worker", "content_type": 13}, "model": "auth.permission", "pk": 37}, {"fields": {"codename": "change_workerstate", "name": "Can change worker", "content_type": 13}, "model": "auth.permission", "pk": 38}, {"fields": {"codename": "delete_workerstate", "name": "Can delete worker", "content_type": 13}, "model": "auth.permission", "pk": 39}, {"fields": {"codename": "add_taskstate", "name": "Can add task", "content_type": 14}, "model": "auth.permission", "pk": 40}, {"fields": {"codename": "change_taskstate", "name": "Can change task", "content_type": 14}, "model": "auth.permission", "pk": 41}, {"fields": {"codename": "delete_taskstate", "name": "Can delete task", "content_type": 14}, "model": "auth.permission", "pk": 42}, {"fields": {"codename": "add_globalstatusmessage", "name": "Can add global status message", "content_type": 15}, "model": "auth.permission", "pk": 43}, {"fields": {"codename": "change_globalstatusmessage", "name": "Can change global status message", "content_type": 15}, "model": "auth.permission", "pk": 44}, {"fields": {"codename": "delete_globalstatusmessage", "name": "Can delete global status message", "content_type": 15}, "model": "auth.permission", "pk": 45}, {"fields": {"codename": "add_coursemessage", "name": "Can add course message", "content_type": 16}, "model": "auth.permission", "pk": 46}, {"fields": {"codename": "change_coursemessage", "name": "Can change course message", "content_type": 16}, "model": "auth.permission", "pk": 47}, {"fields": {"codename": "delete_coursemessage", "name": "Can delete course message", "content_type": 16}, "model": "auth.permission", "pk": 48}, {"fields": {"codename": "add_assetbaseurlconfig", "name": "Can add asset base url config", "content_type": 17}, "model": "auth.permission", "pk": 49}, {"fields": {"codename": "change_assetbaseurlconfig", "name": "Can change asset base url config", "content_type": 17}, "model": "auth.permission", "pk": 50}, {"fields": {"codename": "delete_assetbaseurlconfig", "name": "Can delete asset base url config", "content_type": 17}, "model": "auth.permission", "pk": 51}, {"fields": {"codename": "add_assetexcludedextensionsconfig", "name": "Can add asset excluded extensions config", "content_type": 18}, "model": "auth.permission", "pk": 52}, {"fields": {"codename": "change_assetexcludedextensionsconfig", "name": "Can change asset excluded extensions config", "content_type": 18}, "model": "auth.permission", "pk": 53}, {"fields": {"codename": "delete_assetexcludedextensionsconfig", "name": "Can delete asset excluded extensions config", "content_type": 18}, "model": "auth.permission", "pk": 54}, {"fields": {"codename": "add_courseassetcachettlconfig", "name": "Can add course asset cache ttl config", "content_type": 19}, "model": "auth.permission", "pk": 55}, {"fields": {"codename": "change_courseassetcachettlconfig", "name": "Can change course asset cache ttl config", "content_type": 19}, "model": "auth.permission", "pk": 56}, {"fields": {"codename": "delete_courseassetcachettlconfig", "name": "Can delete course asset cache ttl config", "content_type": 19}, "model": "auth.permission", "pk": 57}, {"fields": {"codename": "add_studentmodule", "name": "Can add student module", "content_type": 20}, "model": "auth.permission", "pk": 58}, {"fields": {"codename": "change_studentmodule", "name": "Can change student module", "content_type": 20}, "model": "auth.permission", "pk": 59}, {"fields": {"codename": "delete_studentmodule", "name": "Can delete student module", "content_type": 20}, "model": "auth.permission", "pk": 60}, {"fields": {"codename": "add_studentmodulehistory", "name": "Can add student module history", "content_type": 21}, "model": "auth.permission", "pk": 61}, {"fields": {"codename": "change_studentmodulehistory", "name": "Can change student module history", "content_type": 21}, "model": "auth.permission", "pk": 62}, {"fields": {"codename": "delete_studentmodulehistory", "name": "Can delete student module history", "content_type": 21}, "model": "auth.permission", "pk": 63}, {"fields": {"codename": "add_xmoduleuserstatesummaryfield", "name": "Can add x module user state summary field", "content_type": 22}, "model": "auth.permission", "pk": 64}, {"fields": {"codename": "change_xmoduleuserstatesummaryfield", "name": "Can change x module user state summary field", "content_type": 22}, "model": "auth.permission", "pk": 65}, {"fields": {"codename": "delete_xmoduleuserstatesummaryfield", "name": "Can delete x module user state summary field", "content_type": 22}, "model": "auth.permission", "pk": 66}, {"fields": {"codename": "add_xmodulestudentprefsfield", "name": "Can add x module student prefs field", "content_type": 23}, "model": "auth.permission", "pk": 67}, {"fields": {"codename": "change_xmodulestudentprefsfield", "name": "Can change x module student prefs field", "content_type": 23}, "model": "auth.permission", "pk": 68}, {"fields": {"codename": "delete_xmodulestudentprefsfield", "name": "Can delete x module student prefs field", "content_type": 23}, "model": "auth.permission", "pk": 69}, {"fields": {"codename": "add_xmodulestudentinfofield", "name": "Can add x module student info field", "content_type": 24}, "model": "auth.permission", "pk": 70}, {"fields": {"codename": "change_xmodulestudentinfofield", "name": "Can change x module student info field", "content_type": 24}, "model": "auth.permission", "pk": 71}, {"fields": {"codename": "delete_xmodulestudentinfofield", "name": "Can delete x module student info field", "content_type": 24}, "model": "auth.permission", "pk": 72}, {"fields": {"codename": "add_offlinecomputedgrade", "name": "Can add offline computed grade", "content_type": 25}, "model": "auth.permission", "pk": 73}, {"fields": {"codename": "change_offlinecomputedgrade", "name": "Can change offline computed grade", "content_type": 25}, "model": "auth.permission", "pk": 74}, {"fields": {"codename": "delete_offlinecomputedgrade", "name": "Can delete offline computed grade", "content_type": 25}, "model": "auth.permission", "pk": 75}, {"fields": {"codename": "add_offlinecomputedgradelog", "name": "Can add offline computed grade log", "content_type": 26}, "model": "auth.permission", "pk": 76}, {"fields": {"codename": "change_offlinecomputedgradelog", "name": "Can change offline computed grade log", "content_type": 26}, "model": "auth.permission", "pk": 77}, {"fields": {"codename": "delete_offlinecomputedgradelog", "name": "Can delete offline computed grade log", "content_type": 26}, "model": "auth.permission", "pk": 78}, {"fields": {"codename": "add_studentfieldoverride", "name": "Can add student field override", "content_type": 27}, "model": "auth.permission", "pk": 79}, {"fields": {"codename": "change_studentfieldoverride", "name": "Can change student field override", "content_type": 27}, "model": "auth.permission", "pk": 80}, {"fields": {"codename": "delete_studentfieldoverride", "name": "Can delete student field override", "content_type": 27}, "model": "auth.permission", "pk": 81}, {"fields": {"codename": "add_anonymoususerid", "name": "Can add anonymous user id", "content_type": 28}, "model": "auth.permission", "pk": 82}, {"fields": {"codename": "change_anonymoususerid", "name": "Can change anonymous user id", "content_type": 28}, "model": "auth.permission", "pk": 83}, {"fields": {"codename": "delete_anonymoususerid", "name": "Can delete anonymous user id", "content_type": 28}, "model": "auth.permission", "pk": 84}, {"fields": {"codename": "add_userstanding", "name": "Can add user standing", "content_type": 29}, "model": "auth.permission", "pk": 85}, {"fields": {"codename": "change_userstanding", "name": "Can change user standing", "content_type": 29}, "model": "auth.permission", "pk": 86}, {"fields": {"codename": "delete_userstanding", "name": "Can delete user standing", "content_type": 29}, "model": "auth.permission", "pk": 87}, {"fields": {"codename": "add_userprofile", "name": "Can add user profile", "content_type": 30}, "model": "auth.permission", "pk": 88}, {"fields": {"codename": "change_userprofile", "name": "Can change user profile", "content_type": 30}, "model": "auth.permission", "pk": 89}, {"fields": {"codename": "delete_userprofile", "name": "Can delete user profile", "content_type": 30}, "model": "auth.permission", "pk": 90}, {"fields": {"codename": "add_usersignupsource", "name": "Can add user signup source", "content_type": 31}, "model": "auth.permission", "pk": 91}, {"fields": {"codename": "change_usersignupsource", "name": "Can change user signup source", "content_type": 31}, "model": "auth.permission", "pk": 92}, {"fields": {"codename": "delete_usersignupsource", "name": "Can delete user signup source", "content_type": 31}, "model": "auth.permission", "pk": 93}, {"fields": {"codename": "add_usertestgroup", "name": "Can add user test group", "content_type": 32}, "model": "auth.permission", "pk": 94}, {"fields": {"codename": "change_usertestgroup", "name": "Can change user test group", "content_type": 32}, "model": "auth.permission", "pk": 95}, {"fields": {"codename": "delete_usertestgroup", "name": "Can delete user test group", "content_type": 32}, "model": "auth.permission", "pk": 96}, {"fields": {"codename": "add_registration", "name": "Can add registration", "content_type": 33}, "model": "auth.permission", "pk": 97}, {"fields": {"codename": "change_registration", "name": "Can change registration", "content_type": 33}, "model": "auth.permission", "pk": 98}, {"fields": {"codename": "delete_registration", "name": "Can delete registration", "content_type": 33}, "model": "auth.permission", "pk": 99}, {"fields": {"codename": "add_pendingnamechange", "name": "Can add pending name change", "content_type": 34}, "model": "auth.permission", "pk": 100}, {"fields": {"codename": "change_pendingnamechange", "name": "Can change pending name change", "content_type": 34}, "model": "auth.permission", "pk": 101}, {"fields": {"codename": "delete_pendingnamechange", "name": "Can delete pending name change", "content_type": 34}, "model": "auth.permission", "pk": 102}, {"fields": {"codename": "add_pendingemailchange", "name": "Can add pending email change", "content_type": 35}, "model": "auth.permission", "pk": 103}, {"fields": {"codename": "change_pendingemailchange", "name": "Can change pending email change", "content_type": 35}, "model": "auth.permission", "pk": 104}, {"fields": {"codename": "delete_pendingemailchange", "name": "Can delete pending email change", "content_type": 35}, "model": "auth.permission", "pk": 105}, {"fields": {"codename": "add_passwordhistory", "name": "Can add password history", "content_type": 36}, "model": "auth.permission", "pk": 106}, {"fields": {"codename": "change_passwordhistory", "name": "Can change password history", "content_type": 36}, "model": "auth.permission", "pk": 107}, {"fields": {"codename": "delete_passwordhistory", "name": "Can delete password history", "content_type": 36}, "model": "auth.permission", "pk": 108}, {"fields": {"codename": "add_loginfailures", "name": "Can add login failures", "content_type": 37}, "model": "auth.permission", "pk": 109}, {"fields": {"codename": "change_loginfailures", "name": "Can change login failures", "content_type": 37}, "model": "auth.permission", "pk": 110}, {"fields": {"codename": "delete_loginfailures", "name": "Can delete login failures", "content_type": 37}, "model": "auth.permission", "pk": 111}, {"fields": {"codename": "add_historicalcourseenrollment", "name": "Can add historical course enrollment", "content_type": 38}, "model": "auth.permission", "pk": 112}, {"fields": {"codename": "change_historicalcourseenrollment", "name": "Can change historical course enrollment", "content_type": 38}, "model": "auth.permission", "pk": 113}, {"fields": {"codename": "delete_historicalcourseenrollment", "name": "Can delete historical course enrollment", "content_type": 38}, "model": "auth.permission", "pk": 114}, {"fields": {"codename": "add_courseenrollment", "name": "Can add course enrollment", "content_type": 39}, "model": "auth.permission", "pk": 115}, {"fields": {"codename": "change_courseenrollment", "name": "Can change course enrollment", "content_type": 39}, "model": "auth.permission", "pk": 116}, {"fields": {"codename": "delete_courseenrollment", "name": "Can delete course enrollment", "content_type": 39}, "model": "auth.permission", "pk": 117}, {"fields": {"codename": "add_manualenrollmentaudit", "name": "Can add manual enrollment audit", "content_type": 40}, "model": "auth.permission", "pk": 118}, {"fields": {"codename": "change_manualenrollmentaudit", "name": "Can change manual enrollment audit", "content_type": 40}, "model": "auth.permission", "pk": 119}, {"fields": {"codename": "delete_manualenrollmentaudit", "name": "Can delete manual enrollment audit", "content_type": 40}, "model": "auth.permission", "pk": 120}, {"fields": {"codename": "add_courseenrollmentallowed", "name": "Can add course enrollment allowed", "content_type": 41}, "model": "auth.permission", "pk": 121}, {"fields": {"codename": "change_courseenrollmentallowed", "name": "Can change course enrollment allowed", "content_type": 41}, "model": "auth.permission", "pk": 122}, {"fields": {"codename": "delete_courseenrollmentallowed", "name": "Can delete course enrollment allowed", "content_type": 41}, "model": "auth.permission", "pk": 123}, {"fields": {"codename": "add_courseaccessrole", "name": "Can add course access role", "content_type": 42}, "model": "auth.permission", "pk": 124}, {"fields": {"codename": "change_courseaccessrole", "name": "Can change course access role", "content_type": 42}, "model": "auth.permission", "pk": 125}, {"fields": {"codename": "delete_courseaccessrole", "name": "Can delete course access role", "content_type": 42}, "model": "auth.permission", "pk": 126}, {"fields": {"codename": "add_dashboardconfiguration", "name": "Can add dashboard configuration", "content_type": 43}, "model": "auth.permission", "pk": 127}, {"fields": {"codename": "change_dashboardconfiguration", "name": "Can change dashboard configuration", "content_type": 43}, "model": "auth.permission", "pk": 128}, {"fields": {"codename": "delete_dashboardconfiguration", "name": "Can delete dashboard configuration", "content_type": 43}, "model": "auth.permission", "pk": 129}, {"fields": {"codename": "add_linkedinaddtoprofileconfiguration", "name": "Can add linked in add to profile configuration", "content_type": 44}, "model": "auth.permission", "pk": 130}, {"fields": {"codename": "change_linkedinaddtoprofileconfiguration", "name": "Can change linked in add to profile configuration", "content_type": 44}, "model": "auth.permission", "pk": 131}, {"fields": {"codename": "delete_linkedinaddtoprofileconfiguration", "name": "Can delete linked in add to profile configuration", "content_type": 44}, "model": "auth.permission", "pk": 132}, {"fields": {"codename": "add_entranceexamconfiguration", "name": "Can add entrance exam configuration", "content_type": 45}, "model": "auth.permission", "pk": 133}, {"fields": {"codename": "change_entranceexamconfiguration", "name": "Can change entrance exam configuration", "content_type": 45}, "model": "auth.permission", "pk": 134}, {"fields": {"codename": "delete_entranceexamconfiguration", "name": "Can delete entrance exam configuration", "content_type": 45}, "model": "auth.permission", "pk": 135}, {"fields": {"codename": "add_languageproficiency", "name": "Can add language proficiency", "content_type": 46}, "model": "auth.permission", "pk": 136}, {"fields": {"codename": "change_languageproficiency", "name": "Can change language proficiency", "content_type": 46}, "model": "auth.permission", "pk": 137}, {"fields": {"codename": "delete_languageproficiency", "name": "Can delete language proficiency", "content_type": 46}, "model": "auth.permission", "pk": 138}, {"fields": {"codename": "add_courseenrollmentattribute", "name": "Can add course enrollment attribute", "content_type": 47}, "model": "auth.permission", "pk": 139}, {"fields": {"codename": "change_courseenrollmentattribute", "name": "Can change course enrollment attribute", "content_type": 47}, "model": "auth.permission", "pk": 140}, {"fields": {"codename": "delete_courseenrollmentattribute", "name": "Can delete course enrollment attribute", "content_type": 47}, "model": "auth.permission", "pk": 141}, {"fields": {"codename": "add_enrollmentrefundconfiguration", "name": "Can add enrollment refund configuration", "content_type": 48}, "model": "auth.permission", "pk": 142}, {"fields": {"codename": "change_enrollmentrefundconfiguration", "name": "Can change enrollment refund configuration", "content_type": 48}, "model": "auth.permission", "pk": 143}, {"fields": {"codename": "delete_enrollmentrefundconfiguration", "name": "Can delete enrollment refund configuration", "content_type": 48}, "model": "auth.permission", "pk": 144}, {"fields": {"codename": "add_trackinglog", "name": "Can add tracking log", "content_type": 49}, "model": "auth.permission", "pk": 145}, {"fields": {"codename": "change_trackinglog", "name": "Can change tracking log", "content_type": 49}, "model": "auth.permission", "pk": 146}, {"fields": {"codename": "delete_trackinglog", "name": "Can delete tracking log", "content_type": 49}, "model": "auth.permission", "pk": 147}, {"fields": {"codename": "add_ratelimitconfiguration", "name": "Can add rate limit configuration", "content_type": 50}, "model": "auth.permission", "pk": 148}, {"fields": {"codename": "change_ratelimitconfiguration", "name": "Can change rate limit configuration", "content_type": 50}, "model": "auth.permission", "pk": 149}, {"fields": {"codename": "delete_ratelimitconfiguration", "name": "Can delete rate limit configuration", "content_type": 50}, "model": "auth.permission", "pk": 150}, {"fields": {"codename": "add_certificatewhitelist", "name": "Can add certificate whitelist", "content_type": 51}, "model": "auth.permission", "pk": 151}, {"fields": {"codename": "change_certificatewhitelist", "name": "Can change certificate whitelist", "content_type": 51}, "model": "auth.permission", "pk": 152}, {"fields": {"codename": "delete_certificatewhitelist", "name": "Can delete certificate whitelist", "content_type": 51}, "model": "auth.permission", "pk": 153}, {"fields": {"codename": "add_generatedcertificate", "name": "Can add generated certificate", "content_type": 52}, "model": "auth.permission", "pk": 154}, {"fields": {"codename": "change_generatedcertificate", "name": "Can change generated certificate", "content_type": 52}, "model": "auth.permission", "pk": 155}, {"fields": {"codename": "delete_generatedcertificate", "name": "Can delete generated certificate", "content_type": 52}, "model": "auth.permission", "pk": 156}, {"fields": {"codename": "add_certificategenerationhistory", "name": "Can add certificate generation history", "content_type": 53}, "model": "auth.permission", "pk": 157}, {"fields": {"codename": "change_certificategenerationhistory", "name": "Can change certificate generation history", "content_type": 53}, "model": "auth.permission", "pk": 158}, {"fields": {"codename": "delete_certificategenerationhistory", "name": "Can delete certificate generation history", "content_type": 53}, "model": "auth.permission", "pk": 159}, {"fields": {"codename": "add_certificateinvalidation", "name": "Can add certificate invalidation", "content_type": 54}, "model": "auth.permission", "pk": 160}, {"fields": {"codename": "change_certificateinvalidation", "name": "Can change certificate invalidation", "content_type": 54}, "model": "auth.permission", "pk": 161}, {"fields": {"codename": "delete_certificateinvalidation", "name": "Can delete certificate invalidation", "content_type": 54}, "model": "auth.permission", "pk": 162}, {"fields": {"codename": "add_examplecertificateset", "name": "Can add example certificate set", "content_type": 55}, "model": "auth.permission", "pk": 163}, {"fields": {"codename": "change_examplecertificateset", "name": "Can change example certificate set", "content_type": 55}, "model": "auth.permission", "pk": 164}, {"fields": {"codename": "delete_examplecertificateset", "name": "Can delete example certificate set", "content_type": 55}, "model": "auth.permission", "pk": 165}, {"fields": {"codename": "add_examplecertificate", "name": "Can add example certificate", "content_type": 56}, "model": "auth.permission", "pk": 166}, {"fields": {"codename": "change_examplecertificate", "name": "Can change example certificate", "content_type": 56}, "model": "auth.permission", "pk": 167}, {"fields": {"codename": "delete_examplecertificate", "name": "Can delete example certificate", "content_type": 56}, "model": "auth.permission", "pk": 168}, {"fields": {"codename": "add_certificategenerationcoursesetting", "name": "Can add certificate generation course setting", "content_type": 57}, "model": "auth.permission", "pk": 169}, {"fields": {"codename": "change_certificategenerationcoursesetting", "name": "Can change certificate generation course setting", "content_type": 57}, "model": "auth.permission", "pk": 170}, {"fields": {"codename": "delete_certificategenerationcoursesetting", "name": "Can delete certificate generation course setting", "content_type": 57}, "model": "auth.permission", "pk": 171}, {"fields": {"codename": "add_certificategenerationconfiguration", "name": "Can add certificate generation configuration", "content_type": 58}, "model": "auth.permission", "pk": 172}, {"fields": {"codename": "change_certificategenerationconfiguration", "name": "Can change certificate generation configuration", "content_type": 58}, "model": "auth.permission", "pk": 173}, {"fields": {"codename": "delete_certificategenerationconfiguration", "name": "Can delete certificate generation configuration", "content_type": 58}, "model": "auth.permission", "pk": 174}, {"fields": {"codename": "add_certificatehtmlviewconfiguration", "name": "Can add certificate html view configuration", "content_type": 59}, "model": "auth.permission", "pk": 175}, {"fields": {"codename": "change_certificatehtmlviewconfiguration", "name": "Can change certificate html view configuration", "content_type": 59}, "model": "auth.permission", "pk": 176}, {"fields": {"codename": "delete_certificatehtmlviewconfiguration", "name": "Can delete certificate html view configuration", "content_type": 59}, "model": "auth.permission", "pk": 177}, {"fields": {"codename": "add_badgeassertion", "name": "Can add badge assertion", "content_type": 60}, "model": "auth.permission", "pk": 178}, {"fields": {"codename": "change_badgeassertion", "name": "Can change badge assertion", "content_type": 60}, "model": "auth.permission", "pk": 179}, {"fields": {"codename": "delete_badgeassertion", "name": "Can delete badge assertion", "content_type": 60}, "model": "auth.permission", "pk": 180}, {"fields": {"codename": "add_badgeimageconfiguration", "name": "Can add badge image configuration", "content_type": 61}, "model": "auth.permission", "pk": 181}, {"fields": {"codename": "change_badgeimageconfiguration", "name": "Can change badge image configuration", "content_type": 61}, "model": "auth.permission", "pk": 182}, {"fields": {"codename": "delete_badgeimageconfiguration", "name": "Can delete badge image configuration", "content_type": 61}, "model": "auth.permission", "pk": 183}, {"fields": {"codename": "add_certificatetemplate", "name": "Can add certificate template", "content_type": 62}, "model": "auth.permission", "pk": 184}, {"fields": {"codename": "change_certificatetemplate", "name": "Can change certificate template", "content_type": 62}, "model": "auth.permission", "pk": 185}, {"fields": {"codename": "delete_certificatetemplate", "name": "Can delete certificate template", "content_type": 62}, "model": "auth.permission", "pk": 186}, {"fields": {"codename": "add_certificatetemplateasset", "name": "Can add certificate template asset", "content_type": 63}, "model": "auth.permission", "pk": 187}, {"fields": {"codename": "change_certificatetemplateasset", "name": "Can change certificate template asset", "content_type": 63}, "model": "auth.permission", "pk": 188}, {"fields": {"codename": "delete_certificatetemplateasset", "name": "Can delete certificate template asset", "content_type": 63}, "model": "auth.permission", "pk": 189}, {"fields": {"codename": "add_instructortask", "name": "Can add instructor task", "content_type": 64}, "model": "auth.permission", "pk": 190}, {"fields": {"codename": "change_instructortask", "name": "Can change instructor task", "content_type": 64}, "model": "auth.permission", "pk": 191}, {"fields": {"codename": "delete_instructortask", "name": "Can delete instructor task", "content_type": 64}, "model": "auth.permission", "pk": 192}, {"fields": {"codename": "add_courseusergroup", "name": "Can add course user group", "content_type": 65}, "model": "auth.permission", "pk": 193}, {"fields": {"codename": "change_courseusergroup", "name": "Can change course user group", "content_type": 65}, "model": "auth.permission", "pk": 194}, {"fields": {"codename": "delete_courseusergroup", "name": "Can delete course user group", "content_type": 65}, "model": "auth.permission", "pk": 195}, {"fields": {"codename": "add_cohortmembership", "name": "Can add cohort membership", "content_type": 66}, "model": "auth.permission", "pk": 196}, {"fields": {"codename": "change_cohortmembership", "name": "Can change cohort membership", "content_type": 66}, "model": "auth.permission", "pk": 197}, {"fields": {"codename": "delete_cohortmembership", "name": "Can delete cohort membership", "content_type": 66}, "model": "auth.permission", "pk": 198}, {"fields": {"codename": "add_courseusergrouppartitiongroup", "name": "Can add course user group partition group", "content_type": 67}, "model": "auth.permission", "pk": 199}, {"fields": {"codename": "change_courseusergrouppartitiongroup", "name": "Can change course user group partition group", "content_type": 67}, "model": "auth.permission", "pk": 200}, {"fields": {"codename": "delete_courseusergrouppartitiongroup", "name": "Can delete course user group partition group", "content_type": 67}, "model": "auth.permission", "pk": 201}, {"fields": {"codename": "add_coursecohortssettings", "name": "Can add course cohorts settings", "content_type": 68}, "model": "auth.permission", "pk": 202}, {"fields": {"codename": "change_coursecohortssettings", "name": "Can change course cohorts settings", "content_type": 68}, "model": "auth.permission", "pk": 203}, {"fields": {"codename": "delete_coursecohortssettings", "name": "Can delete course cohorts settings", "content_type": 68}, "model": "auth.permission", "pk": 204}, {"fields": {"codename": "add_coursecohort", "name": "Can add course cohort", "content_type": 69}, "model": "auth.permission", "pk": 205}, {"fields": {"codename": "change_coursecohort", "name": "Can change course cohort", "content_type": 69}, "model": "auth.permission", "pk": 206}, {"fields": {"codename": "delete_coursecohort", "name": "Can delete course cohort", "content_type": 69}, "model": "auth.permission", "pk": 207}, {"fields": {"codename": "add_courseemail", "name": "Can add course email", "content_type": 70}, "model": "auth.permission", "pk": 208}, {"fields": {"codename": "change_courseemail", "name": "Can change course email", "content_type": 70}, "model": "auth.permission", "pk": 209}, {"fields": {"codename": "delete_courseemail", "name": "Can delete course email", "content_type": 70}, "model": "auth.permission", "pk": 210}, {"fields": {"codename": "add_optout", "name": "Can add optout", "content_type": 71}, "model": "auth.permission", "pk": 211}, {"fields": {"codename": "change_optout", "name": "Can change optout", "content_type": 71}, "model": "auth.permission", "pk": 212}, {"fields": {"codename": "delete_optout", "name": "Can delete optout", "content_type": 71}, "model": "auth.permission", "pk": 213}, {"fields": {"codename": "add_courseemailtemplate", "name": "Can add course email template", "content_type": 72}, "model": "auth.permission", "pk": 214}, {"fields": {"codename": "change_courseemailtemplate", "name": "Can change course email template", "content_type": 72}, "model": "auth.permission", "pk": 215}, {"fields": {"codename": "delete_courseemailtemplate", "name": "Can delete course email template", "content_type": 72}, "model": "auth.permission", "pk": 216}, {"fields": {"codename": "add_courseauthorization", "name": "Can add course authorization", "content_type": 73}, "model": "auth.permission", "pk": 217}, {"fields": {"codename": "change_courseauthorization", "name": "Can change course authorization", "content_type": 73}, "model": "auth.permission", "pk": 218}, {"fields": {"codename": "delete_courseauthorization", "name": "Can delete course authorization", "content_type": 73}, "model": "auth.permission", "pk": 219}, {"fields": {"codename": "add_brandinginfoconfig", "name": "Can add branding info config", "content_type": 74}, "model": "auth.permission", "pk": 220}, {"fields": {"codename": "change_brandinginfoconfig", "name": "Can change branding info config", "content_type": 74}, "model": "auth.permission", "pk": 221}, {"fields": {"codename": "delete_brandinginfoconfig", "name": "Can delete branding info config", "content_type": 74}, "model": "auth.permission", "pk": 222}, {"fields": {"codename": "add_brandingapiconfig", "name": "Can add branding api config", "content_type": 75}, "model": "auth.permission", "pk": 223}, {"fields": {"codename": "change_brandingapiconfig", "name": "Can change branding api config", "content_type": 75}, "model": "auth.permission", "pk": 224}, {"fields": {"codename": "delete_brandingapiconfig", "name": "Can delete branding api config", "content_type": 75}, "model": "auth.permission", "pk": 225}, {"fields": {"codename": "add_externalauthmap", "name": "Can add external auth map", "content_type": 76}, "model": "auth.permission", "pk": 226}, {"fields": {"codename": "change_externalauthmap", "name": "Can change external auth map", "content_type": 76}, "model": "auth.permission", "pk": 227}, {"fields": {"codename": "delete_externalauthmap", "name": "Can delete external auth map", "content_type": 76}, "model": "auth.permission", "pk": 228}, {"fields": {"codename": "add_nonce", "name": "Can add nonce", "content_type": 77}, "model": "auth.permission", "pk": 229}, {"fields": {"codename": "change_nonce", "name": "Can change nonce", "content_type": 77}, "model": "auth.permission", "pk": 230}, {"fields": {"codename": "delete_nonce", "name": "Can delete nonce", "content_type": 77}, "model": "auth.permission", "pk": 231}, {"fields": {"codename": "add_association", "name": "Can add association", "content_type": 78}, "model": "auth.permission", "pk": 232}, {"fields": {"codename": "change_association", "name": "Can change association", "content_type": 78}, "model": "auth.permission", "pk": 233}, {"fields": {"codename": "delete_association", "name": "Can delete association", "content_type": 78}, "model": "auth.permission", "pk": 234}, {"fields": {"codename": "add_useropenid", "name": "Can add user open id", "content_type": 79}, "model": "auth.permission", "pk": 235}, {"fields": {"codename": "change_useropenid", "name": "Can change user open id", "content_type": 79}, "model": "auth.permission", "pk": 236}, {"fields": {"codename": "delete_useropenid", "name": "Can delete user open id", "content_type": 79}, "model": "auth.permission", "pk": 237}, {"fields": {"codename": "account_verified", "name": "The OpenID has been verified", "content_type": 79}, "model": "auth.permission", "pk": 238}, {"fields": {"codename": "add_client", "name": "Can add client", "content_type": 80}, "model": "auth.permission", "pk": 239}, {"fields": {"codename": "change_client", "name": "Can change client", "content_type": 80}, "model": "auth.permission", "pk": 240}, {"fields": {"codename": "delete_client", "name": "Can delete client", "content_type": 80}, "model": "auth.permission", "pk": 241}, {"fields": {"codename": "add_grant", "name": "Can add grant", "content_type": 81}, "model": "auth.permission", "pk": 242}, {"fields": {"codename": "change_grant", "name": "Can change grant", "content_type": 81}, "model": "auth.permission", "pk": 243}, {"fields": {"codename": "delete_grant", "name": "Can delete grant", "content_type": 81}, "model": "auth.permission", "pk": 244}, {"fields": {"codename": "add_accesstoken", "name": "Can add access token", "content_type": 82}, "model": "auth.permission", "pk": 245}, {"fields": {"codename": "change_accesstoken", "name": "Can change access token", "content_type": 82}, "model": "auth.permission", "pk": 246}, {"fields": {"codename": "delete_accesstoken", "name": "Can delete access token", "content_type": 82}, "model": "auth.permission", "pk": 247}, {"fields": {"codename": "add_refreshtoken", "name": "Can add refresh token", "content_type": 83}, "model": "auth.permission", "pk": 248}, {"fields": {"codename": "change_refreshtoken", "name": "Can change refresh token", "content_type": 83}, "model": "auth.permission", "pk": 249}, {"fields": {"codename": "delete_refreshtoken", "name": "Can delete refresh token", "content_type": 83}, "model": "auth.permission", "pk": 250}, {"fields": {"codename": "add_trustedclient", "name": "Can add trusted client", "content_type": 84}, "model": "auth.permission", "pk": 251}, {"fields": {"codename": "change_trustedclient", "name": "Can change trusted client", "content_type": 84}, "model": "auth.permission", "pk": 252}, {"fields": {"codename": "delete_trustedclient", "name": "Can delete trusted client", "content_type": 84}, "model": "auth.permission", "pk": 253}, {"fields": {"codename": "add_oauth2providerconfig", "name": "Can add Provider Configuration (OAuth)", "content_type": 85}, "model": "auth.permission", "pk": 254}, {"fields": {"codename": "change_oauth2providerconfig", "name": "Can change Provider Configuration (OAuth)", "content_type": 85}, "model": "auth.permission", "pk": 255}, {"fields": {"codename": "delete_oauth2providerconfig", "name": "Can delete Provider Configuration (OAuth)", "content_type": 85}, "model": "auth.permission", "pk": 256}, {"fields": {"codename": "add_samlproviderconfig", "name": "Can add Provider Configuration (SAML IdP)", "content_type": 86}, "model": "auth.permission", "pk": 257}, {"fields": {"codename": "change_samlproviderconfig", "name": "Can change Provider Configuration (SAML IdP)", "content_type": 86}, "model": "auth.permission", "pk": 258}, {"fields": {"codename": "delete_samlproviderconfig", "name": "Can delete Provider Configuration (SAML IdP)", "content_type": 86}, "model": "auth.permission", "pk": 259}, {"fields": {"codename": "add_samlconfiguration", "name": "Can add SAML Configuration", "content_type": 87}, "model": "auth.permission", "pk": 260}, {"fields": {"codename": "change_samlconfiguration", "name": "Can change SAML Configuration", "content_type": 87}, "model": "auth.permission", "pk": 261}, {"fields": {"codename": "delete_samlconfiguration", "name": "Can delete SAML Configuration", "content_type": 87}, "model": "auth.permission", "pk": 262}, {"fields": {"codename": "add_samlproviderdata", "name": "Can add SAML Provider Data", "content_type": 88}, "model": "auth.permission", "pk": 263}, {"fields": {"codename": "change_samlproviderdata", "name": "Can change SAML Provider Data", "content_type": 88}, "model": "auth.permission", "pk": 264}, {"fields": {"codename": "delete_samlproviderdata", "name": "Can delete SAML Provider Data", "content_type": 88}, "model": "auth.permission", "pk": 265}, {"fields": {"codename": "add_ltiproviderconfig", "name": "Can add Provider Configuration (LTI)", "content_type": 89}, "model": "auth.permission", "pk": 266}, {"fields": {"codename": "change_ltiproviderconfig", "name": "Can change Provider Configuration (LTI)", "content_type": 89}, "model": "auth.permission", "pk": 267}, {"fields": {"codename": "delete_ltiproviderconfig", "name": "Can delete Provider Configuration (LTI)", "content_type": 89}, "model": "auth.permission", "pk": 268}, {"fields": {"codename": "add_providerapipermissions", "name": "Can add Provider API Permission", "content_type": 90}, "model": "auth.permission", "pk": 269}, {"fields": {"codename": "change_providerapipermissions", "name": "Can change Provider API Permission", "content_type": 90}, "model": "auth.permission", "pk": 270}, {"fields": {"codename": "delete_providerapipermissions", "name": "Can delete Provider API Permission", "content_type": 90}, "model": "auth.permission", "pk": 271}, {"fields": {"codename": "add_nonce", "name": "Can add nonce", "content_type": 91}, "model": "auth.permission", "pk": 272}, {"fields": {"codename": "change_nonce", "name": "Can change nonce", "content_type": 91}, "model": "auth.permission", "pk": 273}, {"fields": {"codename": "delete_nonce", "name": "Can delete nonce", "content_type": 91}, "model": "auth.permission", "pk": 274}, {"fields": {"codename": "add_scope", "name": "Can add scope", "content_type": 92}, "model": "auth.permission", "pk": 275}, {"fields": {"codename": "change_scope", "name": "Can change scope", "content_type": 92}, "model": "auth.permission", "pk": 276}, {"fields": {"codename": "delete_scope", "name": "Can delete scope", "content_type": 92}, "model": "auth.permission", "pk": 277}, {"fields": {"codename": "add_resource", "name": "Can add resource", "content_type": 92}, "model": "auth.permission", "pk": 278}, {"fields": {"codename": "change_resource", "name": "Can change resource", "content_type": 92}, "model": "auth.permission", "pk": 279}, {"fields": {"codename": "delete_resource", "name": "Can delete resource", "content_type": 92}, "model": "auth.permission", "pk": 280}, {"fields": {"codename": "add_consumer", "name": "Can add consumer", "content_type": 93}, "model": "auth.permission", "pk": 281}, {"fields": {"codename": "change_consumer", "name": "Can change consumer", "content_type": 93}, "model": "auth.permission", "pk": 282}, {"fields": {"codename": "delete_consumer", "name": "Can delete consumer", "content_type": 93}, "model": "auth.permission", "pk": 283}, {"fields": {"codename": "add_token", "name": "Can add token", "content_type": 94}, "model": "auth.permission", "pk": 284}, {"fields": {"codename": "change_token", "name": "Can change token", "content_type": 94}, "model": "auth.permission", "pk": 285}, {"fields": {"codename": "delete_token", "name": "Can delete token", "content_type": 94}, "model": "auth.permission", "pk": 286}, {"fields": {"codename": "add_article", "name": "Can add article", "content_type": 96}, "model": "auth.permission", "pk": 287}, {"fields": {"codename": "change_article", "name": "Can change article", "content_type": 96}, "model": "auth.permission", "pk": 288}, {"fields": {"codename": "delete_article", "name": "Can delete article", "content_type": 96}, "model": "auth.permission", "pk": 289}, {"fields": {"codename": "moderate", "name": "Can edit all articles and lock/unlock/restore", "content_type": 96}, "model": "auth.permission", "pk": 290}, {"fields": {"codename": "assign", "name": "Can change ownership of any article", "content_type": 96}, "model": "auth.permission", "pk": 291}, {"fields": {"codename": "grant", "name": "Can assign permissions to other users", "content_type": 96}, "model": "auth.permission", "pk": 292}, {"fields": {"codename": "add_articleforobject", "name": "Can add Article for object", "content_type": 97}, "model": "auth.permission", "pk": 293}, {"fields": {"codename": "change_articleforobject", "name": "Can change Article for object", "content_type": 97}, "model": "auth.permission", "pk": 294}, {"fields": {"codename": "delete_articleforobject", "name": "Can delete Article for object", "content_type": 97}, "model": "auth.permission", "pk": 295}, {"fields": {"codename": "add_articlerevision", "name": "Can add article revision", "content_type": 98}, "model": "auth.permission", "pk": 296}, {"fields": {"codename": "change_articlerevision", "name": "Can change article revision", "content_type": 98}, "model": "auth.permission", "pk": 297}, {"fields": {"codename": "delete_articlerevision", "name": "Can delete article revision", "content_type": 98}, "model": "auth.permission", "pk": 298}, {"fields": {"codename": "add_urlpath", "name": "Can add URL path", "content_type": 99}, "model": "auth.permission", "pk": 299}, {"fields": {"codename": "change_urlpath", "name": "Can change URL path", "content_type": 99}, "model": "auth.permission", "pk": 300}, {"fields": {"codename": "delete_urlpath", "name": "Can delete URL path", "content_type": 99}, "model": "auth.permission", "pk": 301}, {"fields": {"codename": "add_articleplugin", "name": "Can add article plugin", "content_type": 100}, "model": "auth.permission", "pk": 302}, {"fields": {"codename": "change_articleplugin", "name": "Can change article plugin", "content_type": 100}, "model": "auth.permission", "pk": 303}, {"fields": {"codename": "delete_articleplugin", "name": "Can delete article plugin", "content_type": 100}, "model": "auth.permission", "pk": 304}, {"fields": {"codename": "add_reusableplugin", "name": "Can add reusable plugin", "content_type": 101}, "model": "auth.permission", "pk": 305}, {"fields": {"codename": "change_reusableplugin", "name": "Can change reusable plugin", "content_type": 101}, "model": "auth.permission", "pk": 306}, {"fields": {"codename": "delete_reusableplugin", "name": "Can delete reusable plugin", "content_type": 101}, "model": "auth.permission", "pk": 307}, {"fields": {"codename": "add_simpleplugin", "name": "Can add simple plugin", "content_type": 102}, "model": "auth.permission", "pk": 308}, {"fields": {"codename": "change_simpleplugin", "name": "Can change simple plugin", "content_type": 102}, "model": "auth.permission", "pk": 309}, {"fields": {"codename": "delete_simpleplugin", "name": "Can delete simple plugin", "content_type": 102}, "model": "auth.permission", "pk": 310}, {"fields": {"codename": "add_revisionplugin", "name": "Can add revision plugin", "content_type": 103}, "model": "auth.permission", "pk": 311}, {"fields": {"codename": "change_revisionplugin", "name": "Can change revision plugin", "content_type": 103}, "model": "auth.permission", "pk": 312}, {"fields": {"codename": "delete_revisionplugin", "name": "Can delete revision plugin", "content_type": 103}, "model": "auth.permission", "pk": 313}, {"fields": {"codename": "add_revisionpluginrevision", "name": "Can add revision plugin revision", "content_type": 104}, "model": "auth.permission", "pk": 314}, {"fields": {"codename": "change_revisionpluginrevision", "name": "Can change revision plugin revision", "content_type": 104}, "model": "auth.permission", "pk": 315}, {"fields": {"codename": "delete_revisionpluginrevision", "name": "Can delete revision plugin revision", "content_type": 104}, "model": "auth.permission", "pk": 316}, {"fields": {"codename": "add_image", "name": "Can add image", "content_type": 105}, "model": "auth.permission", "pk": 317}, {"fields": {"codename": "change_image", "name": "Can change image", "content_type": 105}, "model": "auth.permission", "pk": 318}, {"fields": {"codename": "delete_image", "name": "Can delete image", "content_type": 105}, "model": "auth.permission", "pk": 319}, {"fields": {"codename": "add_imagerevision", "name": "Can add image revision", "content_type": 106}, "model": "auth.permission", "pk": 320}, {"fields": {"codename": "change_imagerevision", "name": "Can change image revision", "content_type": 106}, "model": "auth.permission", "pk": 321}, {"fields": {"codename": "delete_imagerevision", "name": "Can delete image revision", "content_type": 106}, "model": "auth.permission", "pk": 322}, {"fields": {"codename": "add_attachment", "name": "Can add attachment", "content_type": 107}, "model": "auth.permission", "pk": 323}, {"fields": {"codename": "change_attachment", "name": "Can change attachment", "content_type": 107}, "model": "auth.permission", "pk": 324}, {"fields": {"codename": "delete_attachment", "name": "Can delete attachment", "content_type": 107}, "model": "auth.permission", "pk": 325}, {"fields": {"codename": "add_attachmentrevision", "name": "Can add attachment revision", "content_type": 108}, "model": "auth.permission", "pk": 326}, {"fields": {"codename": "change_attachmentrevision", "name": "Can change attachment revision", "content_type": 108}, "model": "auth.permission", "pk": 327}, {"fields": {"codename": "delete_attachmentrevision", "name": "Can delete attachment revision", "content_type": 108}, "model": "auth.permission", "pk": 328}, {"fields": {"codename": "add_notificationtype", "name": "Can add type", "content_type": 109}, "model": "auth.permission", "pk": 329}, {"fields": {"codename": "change_notificationtype", "name": "Can change type", "content_type": 109}, "model": "auth.permission", "pk": 330}, {"fields": {"codename": "delete_notificationtype", "name": "Can delete type", "content_type": 109}, "model": "auth.permission", "pk": 331}, {"fields": {"codename": "add_settings", "name": "Can add settings", "content_type": 110}, "model": "auth.permission", "pk": 332}, {"fields": {"codename": "change_settings", "name": "Can change settings", "content_type": 110}, "model": "auth.permission", "pk": 333}, {"fields": {"codename": "delete_settings", "name": "Can delete settings", "content_type": 110}, "model": "auth.permission", "pk": 334}, {"fields": {"codename": "add_subscription", "name": "Can add subscription", "content_type": 111}, "model": "auth.permission", "pk": 335}, {"fields": {"codename": "change_subscription", "name": "Can change subscription", "content_type": 111}, "model": "auth.permission", "pk": 336}, {"fields": {"codename": "delete_subscription", "name": "Can delete subscription", "content_type": 111}, "model": "auth.permission", "pk": 337}, {"fields": {"codename": "add_notification", "name": "Can add notification", "content_type": 112}, "model": "auth.permission", "pk": 338}, {"fields": {"codename": "change_notification", "name": "Can change notification", "content_type": 112}, "model": "auth.permission", "pk": 339}, {"fields": {"codename": "delete_notification", "name": "Can delete notification", "content_type": 112}, "model": "auth.permission", "pk": 340}, {"fields": {"codename": "add_logentry", "name": "Can add log entry", "content_type": 113}, "model": "auth.permission", "pk": 341}, {"fields": {"codename": "change_logentry", "name": "Can change log entry", "content_type": 113}, "model": "auth.permission", "pk": 342}, {"fields": {"codename": "delete_logentry", "name": "Can delete log entry", "content_type": 113}, "model": "auth.permission", "pk": 343}, {"fields": {"codename": "add_role", "name": "Can add role", "content_type": 114}, "model": "auth.permission", "pk": 344}, {"fields": {"codename": "change_role", "name": "Can change role", "content_type": 114}, "model": "auth.permission", "pk": 345}, {"fields": {"codename": "delete_role", "name": "Can delete role", "content_type": 114}, "model": "auth.permission", "pk": 346}, {"fields": {"codename": "add_permission", "name": "Can add permission", "content_type": 115}, "model": "auth.permission", "pk": 347}, {"fields": {"codename": "change_permission", "name": "Can change permission", "content_type": 115}, "model": "auth.permission", "pk": 348}, {"fields": {"codename": "delete_permission", "name": "Can delete permission", "content_type": 115}, "model": "auth.permission", "pk": 349}, {"fields": {"codename": "add_note", "name": "Can add note", "content_type": 116}, "model": "auth.permission", "pk": 350}, {"fields": {"codename": "change_note", "name": "Can change note", "content_type": 116}, "model": "auth.permission", "pk": 351}, {"fields": {"codename": "delete_note", "name": "Can delete note", "content_type": 116}, "model": "auth.permission", "pk": 352}, {"fields": {"codename": "add_splashconfig", "name": "Can add splash config", "content_type": 117}, "model": "auth.permission", "pk": 353}, {"fields": {"codename": "change_splashconfig", "name": "Can change splash config", "content_type": 117}, "model": "auth.permission", "pk": 354}, {"fields": {"codename": "delete_splashconfig", "name": "Can delete splash config", "content_type": 117}, "model": "auth.permission", "pk": 355}, {"fields": {"codename": "add_userpreference", "name": "Can add user preference", "content_type": 118}, "model": "auth.permission", "pk": 356}, {"fields": {"codename": "change_userpreference", "name": "Can change user preference", "content_type": 118}, "model": "auth.permission", "pk": 357}, {"fields": {"codename": "delete_userpreference", "name": "Can delete user preference", "content_type": 118}, "model": "auth.permission", "pk": 358}, {"fields": {"codename": "add_usercoursetag", "name": "Can add user course tag", "content_type": 119}, "model": "auth.permission", "pk": 359}, {"fields": {"codename": "change_usercoursetag", "name": "Can change user course tag", "content_type": 119}, "model": "auth.permission", "pk": 360}, {"fields": {"codename": "delete_usercoursetag", "name": "Can delete user course tag", "content_type": 119}, "model": "auth.permission", "pk": 361}, {"fields": {"codename": "add_userorgtag", "name": "Can add user org tag", "content_type": 120}, "model": "auth.permission", "pk": 362}, {"fields": {"codename": "change_userorgtag", "name": "Can change user org tag", "content_type": 120}, "model": "auth.permission", "pk": 363}, {"fields": {"codename": "delete_userorgtag", "name": "Can delete user org tag", "content_type": 120}, "model": "auth.permission", "pk": 364}, {"fields": {"codename": "add_order", "name": "Can add order", "content_type": 121}, "model": "auth.permission", "pk": 365}, {"fields": {"codename": "change_order", "name": "Can change order", "content_type": 121}, "model": "auth.permission", "pk": 366}, {"fields": {"codename": "delete_order", "name": "Can delete order", "content_type": 121}, "model": "auth.permission", "pk": 367}, {"fields": {"codename": "add_orderitem", "name": "Can add order item", "content_type": 122}, "model": "auth.permission", "pk": 368}, {"fields": {"codename": "change_orderitem", "name": "Can change order item", "content_type": 122}, "model": "auth.permission", "pk": 369}, {"fields": {"codename": "delete_orderitem", "name": "Can delete order item", "content_type": 122}, "model": "auth.permission", "pk": 370}, {"fields": {"codename": "add_invoice", "name": "Can add invoice", "content_type": 123}, "model": "auth.permission", "pk": 371}, {"fields": {"codename": "change_invoice", "name": "Can change invoice", "content_type": 123}, "model": "auth.permission", "pk": 372}, {"fields": {"codename": "delete_invoice", "name": "Can delete invoice", "content_type": 123}, "model": "auth.permission", "pk": 373}, {"fields": {"codename": "add_invoicetransaction", "name": "Can add invoice transaction", "content_type": 124}, "model": "auth.permission", "pk": 374}, {"fields": {"codename": "change_invoicetransaction", "name": "Can change invoice transaction", "content_type": 124}, "model": "auth.permission", "pk": 375}, {"fields": {"codename": "delete_invoicetransaction", "name": "Can delete invoice transaction", "content_type": 124}, "model": "auth.permission", "pk": 376}, {"fields": {"codename": "add_invoiceitem", "name": "Can add invoice item", "content_type": 125}, "model": "auth.permission", "pk": 377}, {"fields": {"codename": "change_invoiceitem", "name": "Can change invoice item", "content_type": 125}, "model": "auth.permission", "pk": 378}, {"fields": {"codename": "delete_invoiceitem", "name": "Can delete invoice item", "content_type": 125}, "model": "auth.permission", "pk": 379}, {"fields": {"codename": "add_courseregistrationcodeinvoiceitem", "name": "Can add course registration code invoice item", "content_type": 126}, "model": "auth.permission", "pk": 380}, {"fields": {"codename": "change_courseregistrationcodeinvoiceitem", "name": "Can change course registration code invoice item", "content_type": 126}, "model": "auth.permission", "pk": 381}, {"fields": {"codename": "delete_courseregistrationcodeinvoiceitem", "name": "Can delete course registration code invoice item", "content_type": 126}, "model": "auth.permission", "pk": 382}, {"fields": {"codename": "add_invoicehistory", "name": "Can add invoice history", "content_type": 127}, "model": "auth.permission", "pk": 383}, {"fields": {"codename": "change_invoicehistory", "name": "Can change invoice history", "content_type": 127}, "model": "auth.permission", "pk": 384}, {"fields": {"codename": "delete_invoicehistory", "name": "Can delete invoice history", "content_type": 127}, "model": "auth.permission", "pk": 385}, {"fields": {"codename": "add_courseregistrationcode", "name": "Can add course registration code", "content_type": 128}, "model": "auth.permission", "pk": 386}, {"fields": {"codename": "change_courseregistrationcode", "name": "Can change course registration code", "content_type": 128}, "model": "auth.permission", "pk": 387}, {"fields": {"codename": "delete_courseregistrationcode", "name": "Can delete course registration code", "content_type": 128}, "model": "auth.permission", "pk": 388}, {"fields": {"codename": "add_registrationcoderedemption", "name": "Can add registration code redemption", "content_type": 129}, "model": "auth.permission", "pk": 389}, {"fields": {"codename": "change_registrationcoderedemption", "name": "Can change registration code redemption", "content_type": 129}, "model": "auth.permission", "pk": 390}, {"fields": {"codename": "delete_registrationcoderedemption", "name": "Can delete registration code redemption", "content_type": 129}, "model": "auth.permission", "pk": 391}, {"fields": {"codename": "add_coupon", "name": "Can add coupon", "content_type": 130}, "model": "auth.permission", "pk": 392}, {"fields": {"codename": "change_coupon", "name": "Can change coupon", "content_type": 130}, "model": "auth.permission", "pk": 393}, {"fields": {"codename": "delete_coupon", "name": "Can delete coupon", "content_type": 130}, "model": "auth.permission", "pk": 394}, {"fields": {"codename": "add_couponredemption", "name": "Can add coupon redemption", "content_type": 131}, "model": "auth.permission", "pk": 395}, {"fields": {"codename": "change_couponredemption", "name": "Can change coupon redemption", "content_type": 131}, "model": "auth.permission", "pk": 396}, {"fields": {"codename": "delete_couponredemption", "name": "Can delete coupon redemption", "content_type": 131}, "model": "auth.permission", "pk": 397}, {"fields": {"codename": "add_paidcourseregistration", "name": "Can add paid course registration", "content_type": 132}, "model": "auth.permission", "pk": 398}, {"fields": {"codename": "change_paidcourseregistration", "name": "Can change paid course registration", "content_type": 132}, "model": "auth.permission", "pk": 399}, {"fields": {"codename": "delete_paidcourseregistration", "name": "Can delete paid course registration", "content_type": 132}, "model": "auth.permission", "pk": 400}, {"fields": {"codename": "add_courseregcodeitem", "name": "Can add course reg code item", "content_type": 133}, "model": "auth.permission", "pk": 401}, {"fields": {"codename": "change_courseregcodeitem", "name": "Can change course reg code item", "content_type": 133}, "model": "auth.permission", "pk": 402}, {"fields": {"codename": "delete_courseregcodeitem", "name": "Can delete course reg code item", "content_type": 133}, "model": "auth.permission", "pk": 403}, {"fields": {"codename": "add_courseregcodeitemannotation", "name": "Can add course reg code item annotation", "content_type": 134}, "model": "auth.permission", "pk": 404}, {"fields": {"codename": "change_courseregcodeitemannotation", "name": "Can change course reg code item annotation", "content_type": 134}, "model": "auth.permission", "pk": 405}, {"fields": {"codename": "delete_courseregcodeitemannotation", "name": "Can delete course reg code item annotation", "content_type": 134}, "model": "auth.permission", "pk": 406}, {"fields": {"codename": "add_paidcourseregistrationannotation", "name": "Can add paid course registration annotation", "content_type": 135}, "model": "auth.permission", "pk": 407}, {"fields": {"codename": "change_paidcourseregistrationannotation", "name": "Can change paid course registration annotation", "content_type": 135}, "model": "auth.permission", "pk": 408}, {"fields": {"codename": "delete_paidcourseregistrationannotation", "name": "Can delete paid course registration annotation", "content_type": 135}, "model": "auth.permission", "pk": 409}, {"fields": {"codename": "add_certificateitem", "name": "Can add certificate item", "content_type": 136}, "model": "auth.permission", "pk": 410}, {"fields": {"codename": "change_certificateitem", "name": "Can change certificate item", "content_type": 136}, "model": "auth.permission", "pk": 411}, {"fields": {"codename": "delete_certificateitem", "name": "Can delete certificate item", "content_type": 136}, "model": "auth.permission", "pk": 412}, {"fields": {"codename": "add_donationconfiguration", "name": "Can add donation configuration", "content_type": 137}, "model": "auth.permission", "pk": 413}, {"fields": {"codename": "change_donationconfiguration", "name": "Can change donation configuration", "content_type": 137}, "model": "auth.permission", "pk": 414}, {"fields": {"codename": "delete_donationconfiguration", "name": "Can delete donation configuration", "content_type": 137}, "model": "auth.permission", "pk": 415}, {"fields": {"codename": "add_donation", "name": "Can add donation", "content_type": 138}, "model": "auth.permission", "pk": 416}, {"fields": {"codename": "change_donation", "name": "Can change donation", "content_type": 138}, "model": "auth.permission", "pk": 417}, {"fields": {"codename": "delete_donation", "name": "Can delete donation", "content_type": 138}, "model": "auth.permission", "pk": 418}, {"fields": {"codename": "add_coursemode", "name": "Can add course mode", "content_type": 139}, "model": "auth.permission", "pk": 419}, {"fields": {"codename": "change_coursemode", "name": "Can change course mode", "content_type": 139}, "model": "auth.permission", "pk": 420}, {"fields": {"codename": "delete_coursemode", "name": "Can delete course mode", "content_type": 139}, "model": "auth.permission", "pk": 421}, {"fields": {"codename": "add_coursemodesarchive", "name": "Can add course modes archive", "content_type": 140}, "model": "auth.permission", "pk": 422}, {"fields": {"codename": "change_coursemodesarchive", "name": "Can change course modes archive", "content_type": 140}, "model": "auth.permission", "pk": 423}, {"fields": {"codename": "delete_coursemodesarchive", "name": "Can delete course modes archive", "content_type": 140}, "model": "auth.permission", "pk": 424}, {"fields": {"codename": "add_coursemodeexpirationconfig", "name": "Can add course mode expiration config", "content_type": 141}, "model": "auth.permission", "pk": 425}, {"fields": {"codename": "change_coursemodeexpirationconfig", "name": "Can change course mode expiration config", "content_type": 141}, "model": "auth.permission", "pk": 426}, {"fields": {"codename": "delete_coursemodeexpirationconfig", "name": "Can delete course mode expiration config", "content_type": 141}, "model": "auth.permission", "pk": 427}, {"fields": {"codename": "add_softwaresecurephotoverification", "name": "Can add software secure photo verification", "content_type": 142}, "model": "auth.permission", "pk": 428}, {"fields": {"codename": "change_softwaresecurephotoverification", "name": "Can change software secure photo verification", "content_type": 142}, "model": "auth.permission", "pk": 429}, {"fields": {"codename": "delete_softwaresecurephotoverification", "name": "Can delete software secure photo verification", "content_type": 142}, "model": "auth.permission", "pk": 430}, {"fields": {"codename": "add_historicalverificationdeadline", "name": "Can add historical verification deadline", "content_type": 143}, "model": "auth.permission", "pk": 431}, {"fields": {"codename": "change_historicalverificationdeadline", "name": "Can change historical verification deadline", "content_type": 143}, "model": "auth.permission", "pk": 432}, {"fields": {"codename": "delete_historicalverificationdeadline", "name": "Can delete historical verification deadline", "content_type": 143}, "model": "auth.permission", "pk": 433}, {"fields": {"codename": "add_verificationdeadline", "name": "Can add verification deadline", "content_type": 144}, "model": "auth.permission", "pk": 434}, {"fields": {"codename": "change_verificationdeadline", "name": "Can change verification deadline", "content_type": 144}, "model": "auth.permission", "pk": 435}, {"fields": {"codename": "delete_verificationdeadline", "name": "Can delete verification deadline", "content_type": 144}, "model": "auth.permission", "pk": 436}, {"fields": {"codename": "add_verificationcheckpoint", "name": "Can add verification checkpoint", "content_type": 145}, "model": "auth.permission", "pk": 437}, {"fields": {"codename": "change_verificationcheckpoint", "name": "Can change verification checkpoint", "content_type": 145}, "model": "auth.permission", "pk": 438}, {"fields": {"codename": "delete_verificationcheckpoint", "name": "Can delete verification checkpoint", "content_type": 145}, "model": "auth.permission", "pk": 439}, {"fields": {"codename": "add_verificationstatus", "name": "Can add Verification Status", "content_type": 146}, "model": "auth.permission", "pk": 440}, {"fields": {"codename": "change_verificationstatus", "name": "Can change Verification Status", "content_type": 146}, "model": "auth.permission", "pk": 441}, {"fields": {"codename": "delete_verificationstatus", "name": "Can delete Verification Status", "content_type": 146}, "model": "auth.permission", "pk": 442}, {"fields": {"codename": "add_incoursereverificationconfiguration", "name": "Can add in course reverification configuration", "content_type": 147}, "model": "auth.permission", "pk": 443}, {"fields": {"codename": "change_incoursereverificationconfiguration", "name": "Can change in course reverification configuration", "content_type": 147}, "model": "auth.permission", "pk": 444}, {"fields": {"codename": "delete_incoursereverificationconfiguration", "name": "Can delete in course reverification configuration", "content_type": 147}, "model": "auth.permission", "pk": 445}, {"fields": {"codename": "add_icrvstatusemailsconfiguration", "name": "Can add icrv status emails configuration", "content_type": 148}, "model": "auth.permission", "pk": 446}, {"fields": {"codename": "change_icrvstatusemailsconfiguration", "name": "Can change icrv status emails configuration", "content_type": 148}, "model": "auth.permission", "pk": 447}, {"fields": {"codename": "delete_icrvstatusemailsconfiguration", "name": "Can delete icrv status emails configuration", "content_type": 148}, "model": "auth.permission", "pk": 448}, {"fields": {"codename": "add_skippedreverification", "name": "Can add skipped reverification", "content_type": 149}, "model": "auth.permission", "pk": 449}, {"fields": {"codename": "change_skippedreverification", "name": "Can change skipped reverification", "content_type": 149}, "model": "auth.permission", "pk": 450}, {"fields": {"codename": "delete_skippedreverification", "name": "Can delete skipped reverification", "content_type": 149}, "model": "auth.permission", "pk": 451}, {"fields": {"codename": "add_darklangconfig", "name": "Can add dark lang config", "content_type": 150}, "model": "auth.permission", "pk": 452}, {"fields": {"codename": "change_darklangconfig", "name": "Can change dark lang config", "content_type": 150}, "model": "auth.permission", "pk": 453}, {"fields": {"codename": "delete_darklangconfig", "name": "Can delete dark lang config", "content_type": 150}, "model": "auth.permission", "pk": 454}, {"fields": {"codename": "add_microsite", "name": "Can add microsite", "content_type": 151}, "model": "auth.permission", "pk": 455}, {"fields": {"codename": "change_microsite", "name": "Can change microsite", "content_type": 151}, "model": "auth.permission", "pk": 456}, {"fields": {"codename": "delete_microsite", "name": "Can delete microsite", "content_type": 151}, "model": "auth.permission", "pk": 457}, {"fields": {"codename": "add_micrositehistory", "name": "Can add microsite history", "content_type": 152}, "model": "auth.permission", "pk": 458}, {"fields": {"codename": "change_micrositehistory", "name": "Can change microsite history", "content_type": 152}, "model": "auth.permission", "pk": 459}, {"fields": {"codename": "delete_micrositehistory", "name": "Can delete microsite history", "content_type": 152}, "model": "auth.permission", "pk": 460}, {"fields": {"codename": "add_historicalmicrositeorganizationmapping", "name": "Can add historical microsite organization mapping", "content_type": 153}, "model": "auth.permission", "pk": 461}, {"fields": {"codename": "change_historicalmicrositeorganizationmapping", "name": "Can change historical microsite organization mapping", "content_type": 153}, "model": "auth.permission", "pk": 462}, {"fields": {"codename": "delete_historicalmicrositeorganizationmapping", "name": "Can delete historical microsite organization mapping", "content_type": 153}, "model": "auth.permission", "pk": 463}, {"fields": {"codename": "add_micrositeorganizationmapping", "name": "Can add microsite organization mapping", "content_type": 154}, "model": "auth.permission", "pk": 464}, {"fields": {"codename": "change_micrositeorganizationmapping", "name": "Can change microsite organization mapping", "content_type": 154}, "model": "auth.permission", "pk": 465}, {"fields": {"codename": "delete_micrositeorganizationmapping", "name": "Can delete microsite organization mapping", "content_type": 154}, "model": "auth.permission", "pk": 466}, {"fields": {"codename": "add_historicalmicrositetemplate", "name": "Can add historical microsite template", "content_type": 155}, "model": "auth.permission", "pk": 467}, {"fields": {"codename": "change_historicalmicrositetemplate", "name": "Can change historical microsite template", "content_type": 155}, "model": "auth.permission", "pk": 468}, {"fields": {"codename": "delete_historicalmicrositetemplate", "name": "Can delete historical microsite template", "content_type": 155}, "model": "auth.permission", "pk": 469}, {"fields": {"codename": "add_micrositetemplate", "name": "Can add microsite template", "content_type": 156}, "model": "auth.permission", "pk": 470}, {"fields": {"codename": "change_micrositetemplate", "name": "Can change microsite template", "content_type": 156}, "model": "auth.permission", "pk": 471}, {"fields": {"codename": "delete_micrositetemplate", "name": "Can delete microsite template", "content_type": 156}, "model": "auth.permission", "pk": 472}, {"fields": {"codename": "add_whitelistedrssurl", "name": "Can add whitelisted rss url", "content_type": 157}, "model": "auth.permission", "pk": 473}, {"fields": {"codename": "change_whitelistedrssurl", "name": "Can change whitelisted rss url", "content_type": 157}, "model": "auth.permission", "pk": 474}, {"fields": {"codename": "delete_whitelistedrssurl", "name": "Can delete whitelisted rss url", "content_type": 157}, "model": "auth.permission", "pk": 475}, {"fields": {"codename": "add_embargoedcourse", "name": "Can add embargoed course", "content_type": 158}, "model": "auth.permission", "pk": 476}, {"fields": {"codename": "change_embargoedcourse", "name": "Can change embargoed course", "content_type": 158}, "model": "auth.permission", "pk": 477}, {"fields": {"codename": "delete_embargoedcourse", "name": "Can delete embargoed course", "content_type": 158}, "model": "auth.permission", "pk": 478}, {"fields": {"codename": "add_embargoedstate", "name": "Can add embargoed state", "content_type": 159}, "model": "auth.permission", "pk": 479}, {"fields": {"codename": "change_embargoedstate", "name": "Can change embargoed state", "content_type": 159}, "model": "auth.permission", "pk": 480}, {"fields": {"codename": "delete_embargoedstate", "name": "Can delete embargoed state", "content_type": 159}, "model": "auth.permission", "pk": 481}, {"fields": {"codename": "add_restrictedcourse", "name": "Can add restricted course", "content_type": 160}, "model": "auth.permission", "pk": 482}, {"fields": {"codename": "change_restrictedcourse", "name": "Can change restricted course", "content_type": 160}, "model": "auth.permission", "pk": 483}, {"fields": {"codename": "delete_restrictedcourse", "name": "Can delete restricted course", "content_type": 160}, "model": "auth.permission", "pk": 484}, {"fields": {"codename": "add_country", "name": "Can add country", "content_type": 161}, "model": "auth.permission", "pk": 485}, {"fields": {"codename": "change_country", "name": "Can change country", "content_type": 161}, "model": "auth.permission", "pk": 486}, {"fields": {"codename": "delete_country", "name": "Can delete country", "content_type": 161}, "model": "auth.permission", "pk": 487}, {"fields": {"codename": "add_countryaccessrule", "name": "Can add country access rule", "content_type": 162}, "model": "auth.permission", "pk": 488}, {"fields": {"codename": "change_countryaccessrule", "name": "Can change country access rule", "content_type": 162}, "model": "auth.permission", "pk": 489}, {"fields": {"codename": "delete_countryaccessrule", "name": "Can delete country access rule", "content_type": 162}, "model": "auth.permission", "pk": 490}, {"fields": {"codename": "add_courseaccessrulehistory", "name": "Can add course access rule history", "content_type": 163}, "model": "auth.permission", "pk": 491}, {"fields": {"codename": "change_courseaccessrulehistory", "name": "Can change course access rule history", "content_type": 163}, "model": "auth.permission", "pk": 492}, {"fields": {"codename": "delete_courseaccessrulehistory", "name": "Can delete course access rule history", "content_type": 163}, "model": "auth.permission", "pk": 493}, {"fields": {"codename": "add_ipfilter", "name": "Can add ip filter", "content_type": 164}, "model": "auth.permission", "pk": 494}, {"fields": {"codename": "change_ipfilter", "name": "Can change ip filter", "content_type": 164}, "model": "auth.permission", "pk": 495}, {"fields": {"codename": "delete_ipfilter", "name": "Can delete ip filter", "content_type": 164}, "model": "auth.permission", "pk": 496}, {"fields": {"codename": "add_coursererunstate", "name": "Can add course rerun state", "content_type": 165}, "model": "auth.permission", "pk": 497}, {"fields": {"codename": "change_coursererunstate", "name": "Can change course rerun state", "content_type": 165}, "model": "auth.permission", "pk": 498}, {"fields": {"codename": "delete_coursererunstate", "name": "Can delete course rerun state", "content_type": 165}, "model": "auth.permission", "pk": 499}, {"fields": {"codename": "add_mobileapiconfig", "name": "Can add mobile api config", "content_type": 166}, "model": "auth.permission", "pk": 500}, {"fields": {"codename": "change_mobileapiconfig", "name": "Can change mobile api config", "content_type": 166}, "model": "auth.permission", "pk": 501}, {"fields": {"codename": "delete_mobileapiconfig", "name": "Can delete mobile api config", "content_type": 166}, "model": "auth.permission", "pk": 502}, {"fields": {"codename": "add_usersocialauth", "name": "Can add user social auth", "content_type": 167}, "model": "auth.permission", "pk": 503}, {"fields": {"codename": "change_usersocialauth", "name": "Can change user social auth", "content_type": 167}, "model": "auth.permission", "pk": 504}, {"fields": {"codename": "delete_usersocialauth", "name": "Can delete user social auth", "content_type": 167}, "model": "auth.permission", "pk": 505}, {"fields": {"codename": "add_nonce", "name": "Can add nonce", "content_type": 168}, "model": "auth.permission", "pk": 506}, {"fields": {"codename": "change_nonce", "name": "Can change nonce", "content_type": 168}, "model": "auth.permission", "pk": 507}, {"fields": {"codename": "delete_nonce", "name": "Can delete nonce", "content_type": 168}, "model": "auth.permission", "pk": 508}, {"fields": {"codename": "add_association", "name": "Can add association", "content_type": 169}, "model": "auth.permission", "pk": 509}, {"fields": {"codename": "change_association", "name": "Can change association", "content_type": 169}, "model": "auth.permission", "pk": 510}, {"fields": {"codename": "delete_association", "name": "Can delete association", "content_type": 169}, "model": "auth.permission", "pk": 511}, {"fields": {"codename": "add_code", "name": "Can add code", "content_type": 170}, "model": "auth.permission", "pk": 512}, {"fields": {"codename": "change_code", "name": "Can change code", "content_type": 170}, "model": "auth.permission", "pk": 513}, {"fields": {"codename": "delete_code", "name": "Can delete code", "content_type": 170}, "model": "auth.permission", "pk": 514}, {"fields": {"codename": "add_surveyform", "name": "Can add survey form", "content_type": 171}, "model": "auth.permission", "pk": 515}, {"fields": {"codename": "change_surveyform", "name": "Can change survey form", "content_type": 171}, "model": "auth.permission", "pk": 516}, {"fields": {"codename": "delete_surveyform", "name": "Can delete survey form", "content_type": 171}, "model": "auth.permission", "pk": 517}, {"fields": {"codename": "add_surveyanswer", "name": "Can add survey answer", "content_type": 172}, "model": "auth.permission", "pk": 518}, {"fields": {"codename": "change_surveyanswer", "name": "Can change survey answer", "content_type": 172}, "model": "auth.permission", "pk": 519}, {"fields": {"codename": "delete_surveyanswer", "name": "Can delete survey answer", "content_type": 172}, "model": "auth.permission", "pk": 520}, {"fields": {"codename": "add_xblockasidesconfig", "name": "Can add x block asides config", "content_type": 173}, "model": "auth.permission", "pk": 521}, {"fields": {"codename": "change_xblockasidesconfig", "name": "Can change x block asides config", "content_type": 173}, "model": "auth.permission", "pk": 522}, {"fields": {"codename": "delete_xblockasidesconfig", "name": "Can delete x block asides config", "content_type": 173}, "model": "auth.permission", "pk": 523}, {"fields": {"codename": "add_courseoverview", "name": "Can add course overview", "content_type": 174}, "model": "auth.permission", "pk": 524}, {"fields": {"codename": "change_courseoverview", "name": "Can change course overview", "content_type": 174}, "model": "auth.permission", "pk": 525}, {"fields": {"codename": "delete_courseoverview", "name": "Can delete course overview", "content_type": 174}, "model": "auth.permission", "pk": 526}, {"fields": {"codename": "add_courseoverviewtab", "name": "Can add course overview tab", "content_type": 175}, "model": "auth.permission", "pk": 527}, {"fields": {"codename": "change_courseoverviewtab", "name": "Can change course overview tab", "content_type": 175}, "model": "auth.permission", "pk": 528}, {"fields": {"codename": "delete_courseoverviewtab", "name": "Can delete course overview tab", "content_type": 175}, "model": "auth.permission", "pk": 529}, {"fields": {"codename": "add_courseoverviewimageset", "name": "Can add course overview image set", "content_type": 176}, "model": "auth.permission", "pk": 530}, {"fields": {"codename": "change_courseoverviewimageset", "name": "Can change course overview image set", "content_type": 176}, "model": "auth.permission", "pk": 531}, {"fields": {"codename": "delete_courseoverviewimageset", "name": "Can delete course overview image set", "content_type": 176}, "model": "auth.permission", "pk": 532}, {"fields": {"codename": "add_courseoverviewimageconfig", "name": "Can add course overview image config", "content_type": 177}, "model": "auth.permission", "pk": 533}, {"fields": {"codename": "change_courseoverviewimageconfig", "name": "Can change course overview image config", "content_type": 177}, "model": "auth.permission", "pk": 534}, {"fields": {"codename": "delete_courseoverviewimageconfig", "name": "Can delete course overview image config", "content_type": 177}, "model": "auth.permission", "pk": 535}, {"fields": {"codename": "add_coursestructure", "name": "Can add course structure", "content_type": 178}, "model": "auth.permission", "pk": 536}, {"fields": {"codename": "change_coursestructure", "name": "Can change course structure", "content_type": 178}, "model": "auth.permission", "pk": 537}, {"fields": {"codename": "delete_coursestructure", "name": "Can delete course structure", "content_type": 178}, "model": "auth.permission", "pk": 538}, {"fields": {"codename": "add_corsmodel", "name": "Can add cors model", "content_type": 179}, "model": "auth.permission", "pk": 539}, {"fields": {"codename": "change_corsmodel", "name": "Can change cors model", "content_type": 179}, "model": "auth.permission", "pk": 540}, {"fields": {"codename": "delete_corsmodel", "name": "Can delete cors model", "content_type": 179}, "model": "auth.permission", "pk": 541}, {"fields": {"codename": "add_xdomainproxyconfiguration", "name": "Can add x domain proxy configuration", "content_type": 180}, "model": "auth.permission", "pk": 542}, {"fields": {"codename": "change_xdomainproxyconfiguration", "name": "Can change x domain proxy configuration", "content_type": 180}, "model": "auth.permission", "pk": 543}, {"fields": {"codename": "delete_xdomainproxyconfiguration", "name": "Can delete x domain proxy configuration", "content_type": 180}, "model": "auth.permission", "pk": 544}, {"fields": {"codename": "add_commerceconfiguration", "name": "Can add commerce configuration", "content_type": 181}, "model": "auth.permission", "pk": 545}, {"fields": {"codename": "change_commerceconfiguration", "name": "Can change commerce configuration", "content_type": 181}, "model": "auth.permission", "pk": 546}, {"fields": {"codename": "delete_commerceconfiguration", "name": "Can delete commerce configuration", "content_type": 181}, "model": "auth.permission", "pk": 547}, {"fields": {"codename": "add_creditprovider", "name": "Can add credit provider", "content_type": 182}, "model": "auth.permission", "pk": 548}, {"fields": {"codename": "change_creditprovider", "name": "Can change credit provider", "content_type": 182}, "model": "auth.permission", "pk": 549}, {"fields": {"codename": "delete_creditprovider", "name": "Can delete credit provider", "content_type": 182}, "model": "auth.permission", "pk": 550}, {"fields": {"codename": "add_creditcourse", "name": "Can add credit course", "content_type": 183}, "model": "auth.permission", "pk": 551}, {"fields": {"codename": "change_creditcourse", "name": "Can change credit course", "content_type": 183}, "model": "auth.permission", "pk": 552}, {"fields": {"codename": "delete_creditcourse", "name": "Can delete credit course", "content_type": 183}, "model": "auth.permission", "pk": 553}, {"fields": {"codename": "add_creditrequirement", "name": "Can add credit requirement", "content_type": 184}, "model": "auth.permission", "pk": 554}, {"fields": {"codename": "change_creditrequirement", "name": "Can change credit requirement", "content_type": 184}, "model": "auth.permission", "pk": 555}, {"fields": {"codename": "delete_creditrequirement", "name": "Can delete credit requirement", "content_type": 184}, "model": "auth.permission", "pk": 556}, {"fields": {"codename": "add_historicalcreditrequirementstatus", "name": "Can add historical credit requirement status", "content_type": 185}, "model": "auth.permission", "pk": 557}, {"fields": {"codename": "change_historicalcreditrequirementstatus", "name": "Can change historical credit requirement status", "content_type": 185}, "model": "auth.permission", "pk": 558}, {"fields": {"codename": "delete_historicalcreditrequirementstatus", "name": "Can delete historical credit requirement status", "content_type": 185}, "model": "auth.permission", "pk": 559}, {"fields": {"codename": "add_creditrequirementstatus", "name": "Can add credit requirement status", "content_type": 186}, "model": "auth.permission", "pk": 560}, {"fields": {"codename": "change_creditrequirementstatus", "name": "Can change credit requirement status", "content_type": 186}, "model": "auth.permission", "pk": 561}, {"fields": {"codename": "delete_creditrequirementstatus", "name": "Can delete credit requirement status", "content_type": 186}, "model": "auth.permission", "pk": 562}, {"fields": {"codename": "add_crediteligibility", "name": "Can add credit eligibility", "content_type": 187}, "model": "auth.permission", "pk": 563}, {"fields": {"codename": "change_crediteligibility", "name": "Can change credit eligibility", "content_type": 187}, "model": "auth.permission", "pk": 564}, {"fields": {"codename": "delete_crediteligibility", "name": "Can delete credit eligibility", "content_type": 187}, "model": "auth.permission", "pk": 565}, {"fields": {"codename": "add_historicalcreditrequest", "name": "Can add historical credit request", "content_type": 188}, "model": "auth.permission", "pk": 566}, {"fields": {"codename": "change_historicalcreditrequest", "name": "Can change historical credit request", "content_type": 188}, "model": "auth.permission", "pk": 567}, {"fields": {"codename": "delete_historicalcreditrequest", "name": "Can delete historical credit request", "content_type": 188}, "model": "auth.permission", "pk": 568}, {"fields": {"codename": "add_creditrequest", "name": "Can add credit request", "content_type": 189}, "model": "auth.permission", "pk": 569}, {"fields": {"codename": "change_creditrequest", "name": "Can change credit request", "content_type": 189}, "model": "auth.permission", "pk": 570}, {"fields": {"codename": "delete_creditrequest", "name": "Can delete credit request", "content_type": 189}, "model": "auth.permission", "pk": 571}, {"fields": {"codename": "add_courseteam", "name": "Can add course team", "content_type": 190}, "model": "auth.permission", "pk": 572}, {"fields": {"codename": "change_courseteam", "name": "Can change course team", "content_type": 190}, "model": "auth.permission", "pk": 573}, {"fields": {"codename": "delete_courseteam", "name": "Can delete course team", "content_type": 190}, "model": "auth.permission", "pk": 574}, {"fields": {"codename": "add_courseteammembership", "name": "Can add course team membership", "content_type": 191}, "model": "auth.permission", "pk": 575}, {"fields": {"codename": "change_courseteammembership", "name": "Can change course team membership", "content_type": 191}, "model": "auth.permission", "pk": 576}, {"fields": {"codename": "delete_courseteammembership", "name": "Can delete course team membership", "content_type": 191}, "model": "auth.permission", "pk": 577}, {"fields": {"codename": "add_xblockdisableconfig", "name": "Can add x block disable config", "content_type": 192}, "model": "auth.permission", "pk": 578}, {"fields": {"codename": "change_xblockdisableconfig", "name": "Can change x block disable config", "content_type": 192}, "model": "auth.permission", "pk": 579}, {"fields": {"codename": "delete_xblockdisableconfig", "name": "Can delete x block disable config", "content_type": 192}, "model": "auth.permission", "pk": 580}, {"fields": {"codename": "add_bookmark", "name": "Can add bookmark", "content_type": 193}, "model": "auth.permission", "pk": 581}, {"fields": {"codename": "change_bookmark", "name": "Can change bookmark", "content_type": 193}, "model": "auth.permission", "pk": 582}, {"fields": {"codename": "delete_bookmark", "name": "Can delete bookmark", "content_type": 193}, "model": "auth.permission", "pk": 583}, {"fields": {"codename": "add_xblockcache", "name": "Can add x block cache", "content_type": 194}, "model": "auth.permission", "pk": 584}, {"fields": {"codename": "change_xblockcache", "name": "Can change x block cache", "content_type": 194}, "model": "auth.permission", "pk": 585}, {"fields": {"codename": "delete_xblockcache", "name": "Can delete x block cache", "content_type": 194}, "model": "auth.permission", "pk": 586}, {"fields": {"codename": "add_programsapiconfig", "name": "Can add programs api config", "content_type": 195}, "model": "auth.permission", "pk": 587}, {"fields": {"codename": "change_programsapiconfig", "name": "Can change programs api config", "content_type": 195}, "model": "auth.permission", "pk": 588}, {"fields": {"codename": "delete_programsapiconfig", "name": "Can delete programs api config", "content_type": 195}, "model": "auth.permission", "pk": 589}, {"fields": {"codename": "add_selfpacedconfiguration", "name": "Can add self paced configuration", "content_type": 196}, "model": "auth.permission", "pk": 590}, {"fields": {"codename": "change_selfpacedconfiguration", "name": "Can change self paced configuration", "content_type": 196}, "model": "auth.permission", "pk": 591}, {"fields": {"codename": "delete_selfpacedconfiguration", "name": "Can delete self paced configuration", "content_type": 196}, "model": "auth.permission", "pk": 592}, {"fields": {"codename": "add_kvstore", "name": "Can add kv store", "content_type": 197}, "model": "auth.permission", "pk": 593}, {"fields": {"codename": "change_kvstore", "name": "Can change kv store", "content_type": 197}, "model": "auth.permission", "pk": 594}, {"fields": {"codename": "delete_kvstore", "name": "Can delete kv store", "content_type": 197}, "model": "auth.permission", "pk": 595}, {"fields": {"codename": "add_credentialsapiconfig", "name": "Can add credentials api config", "content_type": 198}, "model": "auth.permission", "pk": 596}, {"fields": {"codename": "change_credentialsapiconfig", "name": "Can change credentials api config", "content_type": 198}, "model": "auth.permission", "pk": 597}, {"fields": {"codename": "delete_credentialsapiconfig", "name": "Can delete credentials api config", "content_type": 198}, "model": "auth.permission", "pk": 598}, {"fields": {"codename": "add_milestone", "name": "Can add milestone", "content_type": 199}, "model": "auth.permission", "pk": 599}, {"fields": {"codename": "change_milestone", "name": "Can change milestone", "content_type": 199}, "model": "auth.permission", "pk": 600}, {"fields": {"codename": "delete_milestone", "name": "Can delete milestone", "content_type": 199}, "model": "auth.permission", "pk": 601}, {"fields": {"codename": "add_milestonerelationshiptype", "name": "Can add milestone relationship type", "content_type": 200}, "model": "auth.permission", "pk": 602}, {"fields": {"codename": "change_milestonerelationshiptype", "name": "Can change milestone relationship type", "content_type": 200}, "model": "auth.permission", "pk": 603}, {"fields": {"codename": "delete_milestonerelationshiptype", "name": "Can delete milestone relationship type", "content_type": 200}, "model": "auth.permission", "pk": 604}, {"fields": {"codename": "add_coursemilestone", "name": "Can add course milestone", "content_type": 201}, "model": "auth.permission", "pk": 605}, {"fields": {"codename": "change_coursemilestone", "name": "Can change course milestone", "content_type": 201}, "model": "auth.permission", "pk": 606}, {"fields": {"codename": "delete_coursemilestone", "name": "Can delete course milestone", "content_type": 201}, "model": "auth.permission", "pk": 607}, {"fields": {"codename": "add_coursecontentmilestone", "name": "Can add course content milestone", "content_type": 202}, "model": "auth.permission", "pk": 608}, {"fields": {"codename": "change_coursecontentmilestone", "name": "Can change course content milestone", "content_type": 202}, "model": "auth.permission", "pk": 609}, {"fields": {"codename": "delete_coursecontentmilestone", "name": "Can delete course content milestone", "content_type": 202}, "model": "auth.permission", "pk": 610}, {"fields": {"codename": "add_usermilestone", "name": "Can add user milestone", "content_type": 203}, "model": "auth.permission", "pk": 611}, {"fields": {"codename": "change_usermilestone", "name": "Can change user milestone", "content_type": 203}, "model": "auth.permission", "pk": 612}, {"fields": {"codename": "delete_usermilestone", "name": "Can delete user milestone", "content_type": 203}, "model": "auth.permission", "pk": 613}, {"fields": {"codename": "add_studentitem", "name": "Can add student item", "content_type": 204}, "model": "auth.permission", "pk": 614}, {"fields": {"codename": "change_studentitem", "name": "Can change student item", "content_type": 204}, "model": "auth.permission", "pk": 615}, {"fields": {"codename": "delete_studentitem", "name": "Can delete student item", "content_type": 204}, "model": "auth.permission", "pk": 616}, {"fields": {"codename": "add_submission", "name": "Can add submission", "content_type": 205}, "model": "auth.permission", "pk": 617}, {"fields": {"codename": "change_submission", "name": "Can change submission", "content_type": 205}, "model": "auth.permission", "pk": 618}, {"fields": {"codename": "delete_submission", "name": "Can delete submission", "content_type": 205}, "model": "auth.permission", "pk": 619}, {"fields": {"codename": "add_score", "name": "Can add score", "content_type": 206}, "model": "auth.permission", "pk": 620}, {"fields": {"codename": "change_score", "name": "Can change score", "content_type": 206}, "model": "auth.permission", "pk": 621}, {"fields": {"codename": "delete_score", "name": "Can delete score", "content_type": 206}, "model": "auth.permission", "pk": 622}, {"fields": {"codename": "add_scoresummary", "name": "Can add score summary", "content_type": 207}, "model": "auth.permission", "pk": 623}, {"fields": {"codename": "change_scoresummary", "name": "Can change score summary", "content_type": 207}, "model": "auth.permission", "pk": 624}, {"fields": {"codename": "delete_scoresummary", "name": "Can delete score summary", "content_type": 207}, "model": "auth.permission", "pk": 625}, {"fields": {"codename": "add_scoreannotation", "name": "Can add score annotation", "content_type": 208}, "model": "auth.permission", "pk": 626}, {"fields": {"codename": "change_scoreannotation", "name": "Can change score annotation", "content_type": 208}, "model": "auth.permission", "pk": 627}, {"fields": {"codename": "delete_scoreannotation", "name": "Can delete score annotation", "content_type": 208}, "model": "auth.permission", "pk": 628}, {"fields": {"codename": "add_rubric", "name": "Can add rubric", "content_type": 209}, "model": "auth.permission", "pk": 629}, {"fields": {"codename": "change_rubric", "name": "Can change rubric", "content_type": 209}, "model": "auth.permission", "pk": 630}, {"fields": {"codename": "delete_rubric", "name": "Can delete rubric", "content_type": 209}, "model": "auth.permission", "pk": 631}, {"fields": {"codename": "add_criterion", "name": "Can add criterion", "content_type": 210}, "model": "auth.permission", "pk": 632}, {"fields": {"codename": "change_criterion", "name": "Can change criterion", "content_type": 210}, "model": "auth.permission", "pk": 633}, {"fields": {"codename": "delete_criterion", "name": "Can delete criterion", "content_type": 210}, "model": "auth.permission", "pk": 634}, {"fields": {"codename": "add_criterionoption", "name": "Can add criterion option", "content_type": 211}, "model": "auth.permission", "pk": 635}, {"fields": {"codename": "change_criterionoption", "name": "Can change criterion option", "content_type": 211}, "model": "auth.permission", "pk": 636}, {"fields": {"codename": "delete_criterionoption", "name": "Can delete criterion option", "content_type": 211}, "model": "auth.permission", "pk": 637}, {"fields": {"codename": "add_assessment", "name": "Can add assessment", "content_type": 212}, "model": "auth.permission", "pk": 638}, {"fields": {"codename": "change_assessment", "name": "Can change assessment", "content_type": 212}, "model": "auth.permission", "pk": 639}, {"fields": {"codename": "delete_assessment", "name": "Can delete assessment", "content_type": 212}, "model": "auth.permission", "pk": 640}, {"fields": {"codename": "add_assessmentpart", "name": "Can add assessment part", "content_type": 213}, "model": "auth.permission", "pk": 641}, {"fields": {"codename": "change_assessmentpart", "name": "Can change assessment part", "content_type": 213}, "model": "auth.permission", "pk": 642}, {"fields": {"codename": "delete_assessmentpart", "name": "Can delete assessment part", "content_type": 213}, "model": "auth.permission", "pk": 643}, {"fields": {"codename": "add_assessmentfeedbackoption", "name": "Can add assessment feedback option", "content_type": 214}, "model": "auth.permission", "pk": 644}, {"fields": {"codename": "change_assessmentfeedbackoption", "name": "Can change assessment feedback option", "content_type": 214}, "model": "auth.permission", "pk": 645}, {"fields": {"codename": "delete_assessmentfeedbackoption", "name": "Can delete assessment feedback option", "content_type": 214}, "model": "auth.permission", "pk": 646}, {"fields": {"codename": "add_assessmentfeedback", "name": "Can add assessment feedback", "content_type": 215}, "model": "auth.permission", "pk": 647}, {"fields": {"codename": "change_assessmentfeedback", "name": "Can change assessment feedback", "content_type": 215}, "model": "auth.permission", "pk": 648}, {"fields": {"codename": "delete_assessmentfeedback", "name": "Can delete assessment feedback", "content_type": 215}, "model": "auth.permission", "pk": 649}, {"fields": {"codename": "add_peerworkflow", "name": "Can add peer workflow", "content_type": 216}, "model": "auth.permission", "pk": 650}, {"fields": {"codename": "change_peerworkflow", "name": "Can change peer workflow", "content_type": 216}, "model": "auth.permission", "pk": 651}, {"fields": {"codename": "delete_peerworkflow", "name": "Can delete peer workflow", "content_type": 216}, "model": "auth.permission", "pk": 652}, {"fields": {"codename": "add_peerworkflowitem", "name": "Can add peer workflow item", "content_type": 217}, "model": "auth.permission", "pk": 653}, {"fields": {"codename": "change_peerworkflowitem", "name": "Can change peer workflow item", "content_type": 217}, "model": "auth.permission", "pk": 654}, {"fields": {"codename": "delete_peerworkflowitem", "name": "Can delete peer workflow item", "content_type": 217}, "model": "auth.permission", "pk": 655}, {"fields": {"codename": "add_trainingexample", "name": "Can add training example", "content_type": 218}, "model": "auth.permission", "pk": 656}, {"fields": {"codename": "change_trainingexample", "name": "Can change training example", "content_type": 218}, "model": "auth.permission", "pk": 657}, {"fields": {"codename": "delete_trainingexample", "name": "Can delete training example", "content_type": 218}, "model": "auth.permission", "pk": 658}, {"fields": {"codename": "add_studenttrainingworkflow", "name": "Can add student training workflow", "content_type": 219}, "model": "auth.permission", "pk": 659}, {"fields": {"codename": "change_studenttrainingworkflow", "name": "Can change student training workflow", "content_type": 219}, "model": "auth.permission", "pk": 660}, {"fields": {"codename": "delete_studenttrainingworkflow", "name": "Can delete student training workflow", "content_type": 219}, "model": "auth.permission", "pk": 661}, {"fields": {"codename": "add_studenttrainingworkflowitem", "name": "Can add student training workflow item", "content_type": 220}, "model": "auth.permission", "pk": 662}, {"fields": {"codename": "change_studenttrainingworkflowitem", "name": "Can change student training workflow item", "content_type": 220}, "model": "auth.permission", "pk": 663}, {"fields": {"codename": "delete_studenttrainingworkflowitem", "name": "Can delete student training workflow item", "content_type": 220}, "model": "auth.permission", "pk": 664}, {"fields": {"codename": "add_aiclassifierset", "name": "Can add ai classifier set", "content_type": 221}, "model": "auth.permission", "pk": 665}, {"fields": {"codename": "change_aiclassifierset", "name": "Can change ai classifier set", "content_type": 221}, "model": "auth.permission", "pk": 666}, {"fields": {"codename": "delete_aiclassifierset", "name": "Can delete ai classifier set", "content_type": 221}, "model": "auth.permission", "pk": 667}, {"fields": {"codename": "add_aiclassifier", "name": "Can add ai classifier", "content_type": 222}, "model": "auth.permission", "pk": 668}, {"fields": {"codename": "change_aiclassifier", "name": "Can change ai classifier", "content_type": 222}, "model": "auth.permission", "pk": 669}, {"fields": {"codename": "delete_aiclassifier", "name": "Can delete ai classifier", "content_type": 222}, "model": "auth.permission", "pk": 670}, {"fields": {"codename": "add_aitrainingworkflow", "name": "Can add ai training workflow", "content_type": 223}, "model": "auth.permission", "pk": 671}, {"fields": {"codename": "change_aitrainingworkflow", "name": "Can change ai training workflow", "content_type": 223}, "model": "auth.permission", "pk": 672}, {"fields": {"codename": "delete_aitrainingworkflow", "name": "Can delete ai training workflow", "content_type": 223}, "model": "auth.permission", "pk": 673}, {"fields": {"codename": "add_aigradingworkflow", "name": "Can add ai grading workflow", "content_type": 224}, "model": "auth.permission", "pk": 674}, {"fields": {"codename": "change_aigradingworkflow", "name": "Can change ai grading workflow", "content_type": 224}, "model": "auth.permission", "pk": 675}, {"fields": {"codename": "delete_aigradingworkflow", "name": "Can delete ai grading workflow", "content_type": 224}, "model": "auth.permission", "pk": 676}, {"fields": {"codename": "add_staffworkflow", "name": "Can add staff workflow", "content_type": 225}, "model": "auth.permission", "pk": 677}, {"fields": {"codename": "change_staffworkflow", "name": "Can change staff workflow", "content_type": 225}, "model": "auth.permission", "pk": 678}, {"fields": {"codename": "delete_staffworkflow", "name": "Can delete staff workflow", "content_type": 225}, "model": "auth.permission", "pk": 679}, {"fields": {"codename": "add_assessmentworkflow", "name": "Can add assessment workflow", "content_type": 226}, "model": "auth.permission", "pk": 680}, {"fields": {"codename": "change_assessmentworkflow", "name": "Can change assessment workflow", "content_type": 226}, "model": "auth.permission", "pk": 681}, {"fields": {"codename": "delete_assessmentworkflow", "name": "Can delete assessment workflow", "content_type": 226}, "model": "auth.permission", "pk": 682}, {"fields": {"codename": "add_assessmentworkflowstep", "name": "Can add assessment workflow step", "content_type": 227}, "model": "auth.permission", "pk": 683}, {"fields": {"codename": "change_assessmentworkflowstep", "name": "Can change assessment workflow step", "content_type": 227}, "model": "auth.permission", "pk": 684}, {"fields": {"codename": "delete_assessmentworkflowstep", "name": "Can delete assessment workflow step", "content_type": 227}, "model": "auth.permission", "pk": 685}, {"fields": {"codename": "add_assessmentworkflowcancellation", "name": "Can add assessment workflow cancellation", "content_type": 228}, "model": "auth.permission", "pk": 686}, {"fields": {"codename": "change_assessmentworkflowcancellation", "name": "Can change assessment workflow cancellation", "content_type": 228}, "model": "auth.permission", "pk": 687}, {"fields": {"codename": "delete_assessmentworkflowcancellation", "name": "Can delete assessment workflow cancellation", "content_type": 228}, "model": "auth.permission", "pk": 688}, {"fields": {"codename": "add_profile", "name": "Can add profile", "content_type": 229}, "model": "auth.permission", "pk": 689}, {"fields": {"codename": "change_profile", "name": "Can change profile", "content_type": 229}, "model": "auth.permission", "pk": 690}, {"fields": {"codename": "delete_profile", "name": "Can delete profile", "content_type": 229}, "model": "auth.permission", "pk": 691}, {"fields": {"codename": "add_video", "name": "Can add video", "content_type": 230}, "model": "auth.permission", "pk": 692}, {"fields": {"codename": "change_video", "name": "Can change video", "content_type": 230}, "model": "auth.permission", "pk": 693}, {"fields": {"codename": "delete_video", "name": "Can delete video", "content_type": 230}, "model": "auth.permission", "pk": 694}, {"fields": {"codename": "add_coursevideo", "name": "Can add course video", "content_type": 231}, "model": "auth.permission", "pk": 695}, {"fields": {"codename": "change_coursevideo", "name": "Can change course video", "content_type": 231}, "model": "auth.permission", "pk": 696}, {"fields": {"codename": "delete_coursevideo", "name": "Can delete course video", "content_type": 231}, "model": "auth.permission", "pk": 697}, {"fields": {"codename": "add_encodedvideo", "name": "Can add encoded video", "content_type": 232}, "model": "auth.permission", "pk": 698}, {"fields": {"codename": "change_encodedvideo", "name": "Can change encoded video", "content_type": 232}, "model": "auth.permission", "pk": 699}, {"fields": {"codename": "delete_encodedvideo", "name": "Can delete encoded video", "content_type": 232}, "model": "auth.permission", "pk": 700}, {"fields": {"codename": "add_subtitle", "name": "Can add subtitle", "content_type": 233}, "model": "auth.permission", "pk": 701}, {"fields": {"codename": "change_subtitle", "name": "Can change subtitle", "content_type": 233}, "model": "auth.permission", "pk": 702}, {"fields": {"codename": "delete_subtitle", "name": "Can delete subtitle", "content_type": 233}, "model": "auth.permission", "pk": 703}, {"fields": {"codename": "add_proctoredexam", "name": "Can add proctored exam", "content_type": 234}, "model": "auth.permission", "pk": 704}, {"fields": {"codename": "change_proctoredexam", "name": "Can change proctored exam", "content_type": 234}, "model": "auth.permission", "pk": 705}, {"fields": {"codename": "delete_proctoredexam", "name": "Can delete proctored exam", "content_type": 234}, "model": "auth.permission", "pk": 706}, {"fields": {"codename": "add_proctoredexamreviewpolicy", "name": "Can add Proctored exam review policy", "content_type": 235}, "model": "auth.permission", "pk": 707}, {"fields": {"codename": "change_proctoredexamreviewpolicy", "name": "Can change Proctored exam review policy", "content_type": 235}, "model": "auth.permission", "pk": 708}, {"fields": {"codename": "delete_proctoredexamreviewpolicy", "name": "Can delete Proctored exam review policy", "content_type": 235}, "model": "auth.permission", "pk": 709}, {"fields": {"codename": "add_proctoredexamreviewpolicyhistory", "name": "Can add proctored exam review policy history", "content_type": 236}, "model": "auth.permission", "pk": 710}, {"fields": {"codename": "change_proctoredexamreviewpolicyhistory", "name": "Can change proctored exam review policy history", "content_type": 236}, "model": "auth.permission", "pk": 711}, {"fields": {"codename": "delete_proctoredexamreviewpolicyhistory", "name": "Can delete proctored exam review policy history", "content_type": 236}, "model": "auth.permission", "pk": 712}, {"fields": {"codename": "add_proctoredexamstudentattempt", "name": "Can add proctored exam attempt", "content_type": 237}, "model": "auth.permission", "pk": 713}, {"fields": {"codename": "change_proctoredexamstudentattempt", "name": "Can change proctored exam attempt", "content_type": 237}, "model": "auth.permission", "pk": 714}, {"fields": {"codename": "delete_proctoredexamstudentattempt", "name": "Can delete proctored exam attempt", "content_type": 237}, "model": "auth.permission", "pk": 715}, {"fields": {"codename": "add_proctoredexamstudentattempthistory", "name": "Can add proctored exam attempt history", "content_type": 238}, "model": "auth.permission", "pk": 716}, {"fields": {"codename": "change_proctoredexamstudentattempthistory", "name": "Can change proctored exam attempt history", "content_type": 238}, "model": "auth.permission", "pk": 717}, {"fields": {"codename": "delete_proctoredexamstudentattempthistory", "name": "Can delete proctored exam attempt history", "content_type": 238}, "model": "auth.permission", "pk": 718}, {"fields": {"codename": "add_proctoredexamstudentallowance", "name": "Can add proctored allowance", "content_type": 239}, "model": "auth.permission", "pk": 719}, {"fields": {"codename": "change_proctoredexamstudentallowance", "name": "Can change proctored allowance", "content_type": 239}, "model": "auth.permission", "pk": 720}, {"fields": {"codename": "delete_proctoredexamstudentallowance", "name": "Can delete proctored allowance", "content_type": 239}, "model": "auth.permission", "pk": 721}, {"fields": {"codename": "add_proctoredexamstudentallowancehistory", "name": "Can add proctored allowance history", "content_type": 240}, "model": "auth.permission", "pk": 722}, {"fields": {"codename": "change_proctoredexamstudentallowancehistory", "name": "Can change proctored allowance history", "content_type": 240}, "model": "auth.permission", "pk": 723}, {"fields": {"codename": "delete_proctoredexamstudentallowancehistory", "name": "Can delete proctored allowance history", "content_type": 240}, "model": "auth.permission", "pk": 724}, {"fields": {"codename": "add_proctoredexamsoftwaresecurereview", "name": "Can add Proctored exam software secure review", "content_type": 241}, "model": "auth.permission", "pk": 725}, {"fields": {"codename": "change_proctoredexamsoftwaresecurereview", "name": "Can change Proctored exam software secure review", "content_type": 241}, "model": "auth.permission", "pk": 726}, {"fields": {"codename": "delete_proctoredexamsoftwaresecurereview", "name": "Can delete Proctored exam software secure review", "content_type": 241}, "model": "auth.permission", "pk": 727}, {"fields": {"codename": "add_proctoredexamsoftwaresecurereviewhistory", "name": "Can add Proctored exam review archive", "content_type": 242}, "model": "auth.permission", "pk": 728}, {"fields": {"codename": "change_proctoredexamsoftwaresecurereviewhistory", "name": "Can change Proctored exam review archive", "content_type": 242}, "model": "auth.permission", "pk": 729}, {"fields": {"codename": "delete_proctoredexamsoftwaresecurereviewhistory", "name": "Can delete Proctored exam review archive", "content_type": 242}, "model": "auth.permission", "pk": 730}, {"fields": {"codename": "add_proctoredexamsoftwaresecurecomment", "name": "Can add proctored exam software secure comment", "content_type": 243}, "model": "auth.permission", "pk": 731}, {"fields": {"codename": "change_proctoredexamsoftwaresecurecomment", "name": "Can change proctored exam software secure comment", "content_type": 243}, "model": "auth.permission", "pk": 732}, {"fields": {"codename": "delete_proctoredexamsoftwaresecurecomment", "name": "Can delete proctored exam software secure comment", "content_type": 243}, "model": "auth.permission", "pk": 733}, {"fields": {"codename": "add_organization", "name": "Can add organization", "content_type": 244}, "model": "auth.permission", "pk": 734}, {"fields": {"codename": "change_organization", "name": "Can change organization", "content_type": 244}, "model": "auth.permission", "pk": 735}, {"fields": {"codename": "delete_organization", "name": "Can delete organization", "content_type": 244}, "model": "auth.permission", "pk": 736}, {"fields": {"codename": "add_organizationcourse", "name": "Can add Link Course", "content_type": 245}, "model": "auth.permission", "pk": 737}, {"fields": {"codename": "change_organizationcourse", "name": "Can change Link Course", "content_type": 245}, "model": "auth.permission", "pk": 738}, {"fields": {"codename": "delete_organizationcourse", "name": "Can delete Link Course", "content_type": 245}, "model": "auth.permission", "pk": 739}, {"fields": {"codename": "add_studentmodulehistoryextended", "name": "Can add student module history extended", "content_type": 246}, "model": "auth.permission", "pk": 740}, {"fields": {"codename": "change_studentmodulehistoryextended", "name": "Can change student module history extended", "content_type": 246}, "model": "auth.permission", "pk": 741}, {"fields": {"codename": "delete_studentmodulehistoryextended", "name": "Can delete student module history extended", "content_type": 246}, "model": "auth.permission", "pk": 742}, {"fields": {"codename": "add_videouploadconfig", "name": "Can add video upload config", "content_type": 247}, "model": "auth.permission", "pk": 743}, {"fields": {"codename": "change_videouploadconfig", "name": "Can change video upload config", "content_type": 247}, "model": "auth.permission", "pk": 744}, {"fields": {"codename": "delete_videouploadconfig", "name": "Can delete video upload config", "content_type": 247}, "model": "auth.permission", "pk": 745}, {"fields": {"codename": "add_pushnotificationconfig", "name": "Can add push notification config", "content_type": 248}, "model": "auth.permission", "pk": 746}, {"fields": {"codename": "change_pushnotificationconfig", "name": "Can change push notification config", "content_type": 248}, "model": "auth.permission", "pk": 747}, {"fields": {"codename": "delete_pushnotificationconfig", "name": "Can delete push notification config", "content_type": 248}, "model": "auth.permission", "pk": 748}, {"fields": {"codename": "add_coursecreator", "name": "Can add course creator", "content_type": 249}, "model": "auth.permission", "pk": 749}, {"fields": {"codename": "change_coursecreator", "name": "Can change course creator", "content_type": 249}, "model": "auth.permission", "pk": 750}, {"fields": {"codename": "delete_coursecreator", "name": "Can delete course creator", "content_type": 249}, "model": "auth.permission", "pk": 751}, {"fields": {"codename": "add_studioconfig", "name": "Can add studio config", "content_type": 250}, "model": "auth.permission", "pk": 752}, {"fields": {"codename": "change_studioconfig", "name": "Can change studio config", "content_type": 250}, "model": "auth.permission", "pk": 753}, {"fields": {"codename": "delete_studioconfig", "name": "Can delete studio config", "content_type": 250}, "model": "auth.permission", "pk": 754}, {"fields": {"username": "ecommerce_worker", "first_name": "", "last_name": "", "is_active": true, "is_superuser": false, "is_staff": false, "last_login": null, "groups": [], "user_permissions": [], "password": "!Anc3rzqyOJmEUcl35V2GO5w2WOmdYzVGDy1E3GBB", "email": "ecommerce_worker@fake.email", "date_joined": "2016-03-07T21:30:20.660Z"}, "model": "auth.user", "pk": 1}, {"fields": {"change_date": "2016-03-07T21:31:28.058Z", "changed_by": null, "enabled": true}, "model": "util.ratelimitconfiguration", "pk": 1}, {"fields": {"change_date": "2016-03-07T21:30:20.215Z", "changed_by": null, "configuration": "{\"default\": {\"accomplishment_class_append\": \"accomplishment-certificate\", \"platform_name\": \"Your Platform Name Here\", \"logo_src\": \"/static/certificates/images/logo.png\", \"logo_url\": \"http://www.example.com\", \"company_verified_certificate_url\": \"http://www.example.com/verified-certificate\", \"company_privacy_url\": \"http://www.example.com/privacy-policy\", \"company_tos_url\": \"http://www.example.com/terms-service\", \"company_about_url\": \"http://www.example.com/about-us\"}, \"verified\": {\"certificate_type\": \"Verified\", \"certificate_title\": \"Verified Certificate of Achievement\"}, \"honor\": {\"certificate_type\": \"Honor Code\", \"certificate_title\": \"Certificate of Achievement\"}}", "enabled": false}, "model": "certificates.certificatehtmlviewconfiguration", "pk": 1}, {"fields": {"change_date": "2016-03-07T21:30:27.820Z", "changed_by": null, "enabled": true, "released_languages": ""}, "model": "dark_lang.darklangconfig", "pk": 1}] \ No newline at end of file diff --git a/common/test/db_cache/bok_choy_migrations_data_default.sql b/common/test/db_cache/bok_choy_migrations_data_default.sql index ab80457f1d..00f5715897 100644 --- a/common/test/db_cache/bok_choy_migrations_data_default.sql +++ b/common/test/db_cache/bok_choy_migrations_data_default.sql @@ -21,7 +21,7 @@ LOCK TABLES `django_migrations` WRITE; /*!40000 ALTER TABLE `django_migrations` DISABLE KEYS */; -INSERT INTO `django_migrations` VALUES (1,'contenttypes','0001_initial','2016-02-29 17:58:04.910265'),(2,'auth','0001_initial','2016-02-29 17:58:05.155297'),(3,'admin','0001_initial','2016-02-29 17:58:05.261098'),(4,'assessment','0001_initial','2016-02-29 17:58:08.458980'),(5,'assessment','0002_staffworkflow','2016-02-29 17:58:08.659081'),(6,'contenttypes','0002_remove_content_type_name','2016-02-29 17:58:08.818265'),(7,'auth','0002_alter_permission_name_max_length','2016-02-29 17:58:08.855835'),(8,'auth','0003_alter_user_email_max_length','2016-02-29 17:58:08.894682'),(9,'auth','0004_alter_user_username_opts','2016-02-29 17:58:08.918567'),(10,'auth','0005_alter_user_last_login_null','2016-02-29 17:58:08.971615'),(11,'auth','0006_require_contenttypes_0002','2016-02-29 17:58:08.976069'),(12,'bookmarks','0001_initial','2016-02-29 17:58:09.243246'),(13,'branding','0001_initial','2016-02-29 17:58:09.364920'),(14,'bulk_email','0001_initial','2016-02-29 17:58:09.630882'),(15,'bulk_email','0002_data__load_course_email_template','2016-02-29 17:58:09.715512'),(16,'instructor_task','0001_initial','2016-02-29 17:58:09.872596'),(17,'certificates','0001_initial','2016-02-29 17:58:10.722743'),(18,'certificates','0002_data__certificatehtmlviewconfiguration_data','2016-02-29 17:58:10.736641'),(19,'certificates','0003_data__default_modes','2016-02-29 17:58:10.775334'),(20,'certificates','0004_certificategenerationhistory','2016-02-29 17:58:10.911498'),(21,'certificates','0005_auto_20151208_0801','2016-02-29 17:58:11.002303'),(22,'certificates','0006_certificatetemplateasset_asset_slug','2016-02-29 17:58:11.050549'),(23,'certificates','0007_certificateinvalidation','2016-02-29 17:58:11.166297'),(24,'commerce','0001_data__add_ecommerce_service_user','2016-02-29 17:58:11.198023'),(25,'commerce','0002_commerceconfiguration','2016-02-29 17:58:11.291907'),(26,'contentserver','0001_initial','2016-02-29 17:58:11.375676'),(27,'cors_csrf','0001_initial','2016-02-29 17:58:11.462189'),(28,'course_action_state','0001_initial','2016-02-29 17:58:11.783744'),(29,'course_groups','0001_initial','2016-02-29 17:58:12.790006'),(30,'course_modes','0001_initial','2016-02-29 17:58:12.902796'),(31,'course_modes','0002_coursemode_expiration_datetime_is_explicit','2016-02-29 17:58:12.957209'),(32,'course_modes','0003_auto_20151113_1443','2016-02-29 17:58:12.979234'),(33,'course_modes','0004_auto_20151113_1457','2016-02-29 17:58:13.095320'),(34,'course_modes','0005_auto_20151217_0958','2016-02-29 17:58:13.116644'),(35,'course_modes','0006_auto_20160208_1407','2016-02-29 17:58:13.208193'),(36,'course_overviews','0001_initial','2016-02-29 17:58:13.283088'),(37,'course_overviews','0002_add_course_catalog_fields','2016-02-29 17:58:13.499090'),(38,'course_overviews','0003_courseoverviewgeneratedhistory','2016-02-29 17:58:13.525866'),(39,'course_overviews','0004_courseoverview_org','2016-02-29 17:58:13.567577'),(40,'course_overviews','0005_delete_courseoverviewgeneratedhistory','2016-02-29 17:58:13.585458'),(41,'course_overviews','0006_courseoverviewimageset','2016-02-29 17:58:13.636894'),(42,'course_overviews','0007_courseoverviewimageconfig','2016-02-29 17:58:13.764616'),(43,'course_overviews','0008_remove_courseoverview_facebook_url','2016-02-29 17:58:13.815867'),(44,'course_overviews','0009_readd_facebook_url','2016-02-29 17:58:13.872971'),(45,'course_structures','0001_initial','2016-02-29 17:58:13.899706'),(46,'courseware','0001_initial','2016-02-29 17:58:16.765503'),(47,'coursewarehistoryextended','0001_initial','2016-02-29 17:58:16.912454'),(48,'credentials','0001_initial','2016-02-29 17:58:17.072454'),(49,'credit','0001_initial','2016-02-29 17:58:18.478297'),(50,'dark_lang','0001_initial','2016-02-29 17:58:18.635638'),(51,'dark_lang','0002_data__enable_on_install','2016-02-29 17:58:18.654315'),(52,'default','0001_initial','2016-02-29 17:58:19.121037'),(53,'default','0002_add_related_name','2016-02-29 17:58:19.287646'),(54,'default','0003_alter_email_max_length','2016-02-29 17:58:19.355367'),(55,'django_comment_common','0001_initial','2016-02-29 17:58:19.826406'),(56,'django_notify','0001_initial','2016-02-29 17:58:20.691115'),(57,'django_openid_auth','0001_initial','2016-02-29 17:58:20.948196'),(58,'edx_proctoring','0001_initial','2016-02-29 17:58:25.028310'),(59,'edx_proctoring','0002_proctoredexamstudentattempt_is_status_acknowledged','2016-02-29 17:58:25.270722'),(60,'edx_proctoring','0003_auto_20160101_0525','2016-02-29 17:58:25.651659'),(61,'edx_proctoring','0004_auto_20160201_0523','2016-02-29 17:58:25.881209'),(62,'edxval','0001_initial','2016-02-29 17:58:26.490038'),(63,'edxval','0002_data__default_profiles','2016-02-29 17:58:26.519947'),(64,'embargo','0001_initial','2016-02-29 17:58:27.388295'),(65,'embargo','0002_data__add_countries','2016-02-29 17:58:27.716022'),(66,'external_auth','0001_initial','2016-02-29 17:58:28.339793'),(67,'lms_xblock','0001_initial','2016-02-29 17:58:28.600358'),(68,'sites','0001_initial','2016-02-29 17:58:28.639305'),(69,'microsite_configuration','0001_initial','2016-02-29 17:58:30.470563'),(70,'microsite_configuration','0002_auto_20160202_0228','2016-02-29 17:58:31.089884'),(71,'milestones','0001_initial','2016-02-29 17:58:32.206321'),(72,'milestones','0002_data__seed_relationship_types','2016-02-29 17:58:32.242905'),(73,'milestones','0003_coursecontentmilestone_requirements','2016-02-29 17:58:33.317573'),(74,'milestones','0004_auto_20151221_1445','2016-02-29 17:58:33.593210'),(75,'mobile_api','0001_initial','2016-02-29 17:58:33.849089'),(76,'notes','0001_initial','2016-02-29 17:58:34.185220'),(77,'oauth2','0001_initial','2016-02-29 17:58:35.892898'),(78,'oauth2_provider','0001_initial','2016-02-29 17:58:36.227236'),(79,'oauth_provider','0001_initial','2016-02-29 17:58:37.052991'),(80,'organizations','0001_initial','2016-02-29 17:58:37.290331'),(81,'programs','0001_initial','2016-02-29 17:58:37.667708'),(82,'programs','0002_programsapiconfig_cache_ttl','2016-02-29 17:58:38.067119'),(83,'programs','0003_auto_20151120_1613','2016-02-29 17:58:39.752602'),(84,'programs','0004_programsapiconfig_enable_certification','2016-02-29 17:58:40.179508'),(85,'programs','0005_programsapiconfig_max_retries','2016-02-29 17:58:40.596412'),(86,'rss_proxy','0001_initial','2016-02-29 17:58:40.641620'),(87,'self_paced','0001_initial','2016-02-29 17:58:41.078194'),(88,'sessions','0001_initial','2016-02-29 17:58:41.133704'),(89,'student','0001_initial','2016-02-29 17:58:53.980867'),(90,'shoppingcart','0001_initial','2016-02-29 17:59:06.233175'),(91,'shoppingcart','0002_auto_20151208_1034','2016-02-29 17:59:07.059000'),(92,'shoppingcart','0003_auto_20151217_0958','2016-02-29 17:59:07.907660'),(93,'splash','0001_initial','2016-02-29 17:59:08.351083'),(94,'static_replace','0001_initial','2016-02-29 17:59:08.818049'),(95,'static_replace','0002_assetexcludedextensionsconfig','2016-02-29 17:59:09.319193'),(96,'status','0001_initial','2016-02-29 17:59:10.500113'),(97,'student','0002_auto_20151208_1034','2016-02-29 17:59:11.650009'),(98,'submissions','0001_initial','2016-02-29 17:59:12.491480'),(99,'submissions','0002_auto_20151119_0913','2016-02-29 17:59:12.683289'),(100,'submissions','0003_submission_status','2016-02-29 17:59:12.811034'),(101,'survey','0001_initial','2016-02-29 17:59:13.767659'),(102,'teams','0001_initial','2016-02-29 17:59:16.603866'),(103,'third_party_auth','0001_initial','2016-02-29 17:59:19.924001'),(104,'track','0001_initial','2016-02-29 17:59:19.974203'),(105,'user_api','0001_initial','2016-02-29 17:59:24.197607'),(106,'util','0001_initial','2016-02-29 17:59:24.978364'),(107,'util','0002_data__default_rate_limit_config','2016-02-29 17:59:25.017205'),(108,'verify_student','0001_initial','2016-02-29 17:59:33.329519'),(109,'verify_student','0002_auto_20151124_1024','2016-02-29 17:59:34.238392'),(110,'verify_student','0003_auto_20151113_1443','2016-02-29 17:59:35.001393'),(111,'wiki','0001_initial','2016-02-29 17:59:56.418517'),(112,'wiki','0002_remove_article_subscription','2016-02-29 17:59:56.476734'),(113,'workflow','0001_initial','2016-02-29 17:59:56.760505'),(114,'xblock_django','0001_initial','2016-02-29 17:59:57.572216'),(115,'xblock_django','0002_auto_20160204_0809','2016-02-29 17:59:58.380438'),(116,'contentstore','0001_initial','2016-02-29 18:00:19.534458'),(117,'course_creators','0001_initial','2016-02-29 18:00:19.597219'),(118,'xblock_config','0001_initial','2016-02-29 18:00:19.855097'); +INSERT INTO `django_migrations` VALUES (1,'contenttypes','0001_initial','2016-03-07 21:30:14.182305'),(2,'auth','0001_initial','2016-03-07 21:30:14.485815'),(3,'admin','0001_initial','2016-03-07 21:30:14.565850'),(4,'assessment','0001_initial','2016-03-07 21:30:17.817617'),(5,'assessment','0002_staffworkflow','2016-03-07 21:30:18.084033'),(6,'contenttypes','0002_remove_content_type_name','2016-03-07 21:30:18.233041'),(7,'auth','0002_alter_permission_name_max_length','2016-03-07 21:30:18.276671'),(8,'auth','0003_alter_user_email_max_length','2016-03-07 21:30:18.326002'),(9,'auth','0004_alter_user_username_opts','2016-03-07 21:30:18.353157'),(10,'auth','0005_alter_user_last_login_null','2016-03-07 21:30:18.414606'),(11,'auth','0006_require_contenttypes_0002','2016-03-07 21:30:18.418705'),(12,'bookmarks','0001_initial','2016-03-07 21:30:18.701043'),(13,'branding','0001_initial','2016-03-07 21:30:18.829558'),(14,'bulk_email','0001_initial','2016-03-07 21:30:19.115081'),(15,'bulk_email','0002_data__load_course_email_template','2016-03-07 21:30:19.155468'),(16,'instructor_task','0001_initial','2016-03-07 21:30:19.341905'),(17,'certificates','0001_initial','2016-03-07 21:30:20.197566'),(18,'certificates','0002_data__certificatehtmlviewconfiguration_data','2016-03-07 21:30:20.220202'),(19,'certificates','0003_data__default_modes','2016-03-07 21:30:20.258243'),(20,'certificates','0004_certificategenerationhistory','2016-03-07 21:30:20.390214'),(21,'certificates','0005_auto_20151208_0801','2016-03-07 21:30:20.497751'),(22,'certificates','0006_certificatetemplateasset_asset_slug','2016-03-07 21:30:20.541391'),(23,'certificates','0007_certificateinvalidation','2016-03-07 21:30:20.642449'),(24,'commerce','0001_data__add_ecommerce_service_user','2016-03-07 21:30:20.668836'),(25,'commerce','0002_commerceconfiguration','2016-03-07 21:30:20.764499'),(26,'contentserver','0001_initial','2016-03-07 21:30:20.858120'),(27,'cors_csrf','0001_initial','2016-03-07 21:30:20.948472'),(28,'course_action_state','0001_initial','2016-03-07 21:30:22.206899'),(29,'course_groups','0001_initial','2016-03-07 21:30:23.049803'),(30,'course_modes','0001_initial','2016-03-07 21:30:23.168870'),(31,'course_modes','0002_coursemode_expiration_datetime_is_explicit','2016-03-07 21:30:23.216519'),(32,'course_modes','0003_auto_20151113_1443','2016-03-07 21:30:23.240339'),(33,'course_modes','0004_auto_20151113_1457','2016-03-07 21:30:23.342111'),(34,'course_modes','0005_auto_20151217_0958','2016-03-07 21:30:23.361769'),(35,'course_modes','0006_auto_20160208_1407','2016-03-07 21:30:23.436155'),(36,'course_overviews','0001_initial','2016-03-07 21:30:23.508236'),(37,'course_overviews','0002_add_course_catalog_fields','2016-03-07 21:30:23.733762'),(38,'course_overviews','0003_courseoverviewgeneratedhistory','2016-03-07 21:30:23.761257'),(39,'course_overviews','0004_courseoverview_org','2016-03-07 21:30:23.810614'),(40,'course_overviews','0005_delete_courseoverviewgeneratedhistory','2016-03-07 21:30:23.835739'),(41,'course_overviews','0006_courseoverviewimageset','2016-03-07 21:30:23.888381'),(42,'course_overviews','0007_courseoverviewimageconfig','2016-03-07 21:30:23.983401'),(43,'course_overviews','0008_remove_courseoverview_facebook_url','2016-03-07 21:30:23.999461'),(44,'course_overviews','0009_readd_facebook_url','2016-03-07 21:30:24.004728'),(45,'course_structures','0001_initial','2016-03-07 21:30:24.040777'),(46,'courseware','0001_initial','2016-03-07 21:30:25.940851'),(47,'coursewarehistoryextended','0001_initial','2016-03-07 21:30:26.040072'),(48,'coursewarehistoryextended','0002_force_studentmodule_index','2016-03-07 21:30:26.130654'),(49,'credentials','0001_initial','2016-03-07 21:30:26.264799'),(50,'credit','0001_initial','2016-03-07 21:30:27.649602'),(51,'dark_lang','0001_initial','2016-03-07 21:30:27.805328'),(52,'dark_lang','0002_data__enable_on_install','2016-03-07 21:30:27.826148'),(53,'default','0001_initial','2016-03-07 21:30:28.315042'),(54,'default','0002_add_related_name','2016-03-07 21:30:28.498168'),(55,'default','0003_alter_email_max_length','2016-03-07 21:30:28.548248'),(56,'django_comment_common','0001_initial','2016-03-07 21:30:29.000655'),(57,'django_notify','0001_initial','2016-03-07 21:30:29.868315'),(58,'django_openid_auth','0001_initial','2016-03-07 21:30:30.132929'),(59,'oauth2','0001_initial','2016-03-07 21:30:32.085445'),(60,'edx_oauth2_provider','0001_initial','2016-03-07 21:30:32.271384'),(61,'edx_proctoring','0001_initial','2016-03-07 21:30:35.489095'),(62,'edx_proctoring','0002_proctoredexamstudentattempt_is_status_acknowledged','2016-03-07 21:30:35.811830'),(63,'edx_proctoring','0003_auto_20160101_0525','2016-03-07 21:30:36.318967'),(64,'edx_proctoring','0004_auto_20160201_0523','2016-03-07 21:30:36.594639'),(65,'edxval','0001_initial','2016-03-07 21:30:37.250149'),(66,'edxval','0002_data__default_profiles','2016-03-07 21:30:37.292234'),(67,'embargo','0001_initial','2016-03-07 21:30:38.318664'),(68,'embargo','0002_data__add_countries','2016-03-07 21:30:38.670470'),(69,'external_auth','0001_initial','2016-03-07 21:30:40.309901'),(70,'lms_xblock','0001_initial','2016-03-07 21:30:40.530640'),(71,'sites','0001_initial','2016-03-07 21:30:40.570456'),(72,'microsite_configuration','0001_initial','2016-03-07 21:30:42.065940'),(73,'microsite_configuration','0002_auto_20160202_0228','2016-03-07 21:30:42.510084'),(74,'milestones','0001_initial','2016-03-07 21:30:43.515278'),(75,'milestones','0002_data__seed_relationship_types','2016-03-07 21:30:43.549236'),(76,'milestones','0003_coursecontentmilestone_requirements','2016-03-07 21:30:43.637530'),(77,'milestones','0004_auto_20151221_1445','2016-03-07 21:30:43.934637'),(78,'mobile_api','0001_initial','2016-03-07 21:30:44.232529'),(79,'notes','0001_initial','2016-03-07 21:30:44.623792'),(80,'oauth_provider','0001_initial','2016-03-07 21:30:45.424401'),(81,'organizations','0001_initial','2016-03-07 21:30:45.647395'),(82,'programs','0001_initial','2016-03-07 21:30:46.009532'),(83,'programs','0002_programsapiconfig_cache_ttl','2016-03-07 21:30:46.380846'),(84,'programs','0003_auto_20151120_1613','2016-03-07 21:30:48.590249'),(85,'programs','0004_programsapiconfig_enable_certification','2016-03-07 21:30:48.865268'),(86,'programs','0005_programsapiconfig_max_retries','2016-03-07 21:30:49.120259'),(87,'rss_proxy','0001_initial','2016-03-07 21:30:49.167846'),(88,'self_paced','0001_initial','2016-03-07 21:30:49.436334'),(89,'sessions','0001_initial','2016-03-07 21:30:49.500776'),(90,'student','0001_initial','2016-03-07 21:31:00.590300'),(91,'shoppingcart','0001_initial','2016-03-07 21:31:11.285831'),(92,'shoppingcart','0002_auto_20151208_1034','2016-03-07 21:31:12.264731'),(93,'shoppingcart','0003_auto_20151217_0958','2016-03-07 21:31:13.226615'),(94,'splash','0001_initial','2016-03-07 21:31:13.813727'),(95,'static_replace','0001_initial','2016-03-07 21:31:14.416875'),(96,'static_replace','0002_assetexcludedextensionsconfig','2016-03-07 21:31:14.985262'),(97,'status','0001_initial','2016-03-07 21:31:16.225967'),(98,'student','0002_auto_20151208_1034','2016-03-07 21:31:18.224130'),(99,'submissions','0001_initial','2016-03-07 21:31:19.010824'),(100,'submissions','0002_auto_20151119_0913','2016-03-07 21:31:19.189219'),(101,'submissions','0003_submission_status','2016-03-07 21:31:19.281079'),(102,'survey','0001_initial','2016-03-07 21:31:19.931263'),(103,'teams','0001_initial','2016-03-07 21:31:21.332348'),(104,'third_party_auth','0001_initial','2016-03-07 21:31:23.645023'),(105,'track','0001_initial','2016-03-07 21:31:23.694019'),(106,'user_api','0001_initial','2016-03-07 21:31:27.559462'),(107,'util','0001_initial','2016-03-07 21:31:28.021488'),(108,'util','0002_data__default_rate_limit_config','2016-03-07 21:31:28.071141'),(109,'verify_student','0001_initial','2016-03-07 21:31:34.927463'),(110,'verify_student','0002_auto_20151124_1024','2016-03-07 21:31:36.838984'),(111,'verify_student','0003_auto_20151113_1443','2016-03-07 21:31:37.274647'),(112,'wiki','0001_initial','2016-03-07 21:31:55.194872'),(113,'wiki','0002_remove_article_subscription','2016-03-07 21:31:55.245251'),(114,'workflow','0001_initial','2016-03-07 21:31:55.566223'),(115,'xblock_django','0001_initial','2016-03-07 21:31:56.357737'),(116,'xblock_django','0002_auto_20160204_0809','2016-03-07 21:31:58.039094'),(117,'contentstore','0001_initial','2016-03-07 21:32:17.147931'),(118,'course_creators','0001_initial','2016-03-07 21:32:17.219370'),(119,'xblock_config','0001_initial','2016-03-07 21:32:17.426982'); /*!40000 ALTER TABLE `django_migrations` ENABLE KEYS */; UNLOCK TABLES; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; @@ -34,4 +34,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2016-02-29 18:00:23 +-- Dump completed on 2016-03-07 21:32:22 diff --git a/common/test/db_cache/bok_choy_migrations_data_student_module_history.sql b/common/test/db_cache/bok_choy_migrations_data_student_module_history.sql index be9faad011..fdbb557fe1 100644 --- a/common/test/db_cache/bok_choy_migrations_data_student_module_history.sql +++ b/common/test/db_cache/bok_choy_migrations_data_student_module_history.sql @@ -21,7 +21,7 @@ LOCK TABLES `django_migrations` WRITE; /*!40000 ALTER TABLE `django_migrations` DISABLE KEYS */; -INSERT INTO `django_migrations` VALUES (1,'contenttypes','0001_initial','2016-02-29 18:01:39.511327'),(2,'auth','0001_initial','2016-02-29 18:01:39.547129'),(3,'admin','0001_initial','2016-02-29 18:01:39.568351'),(4,'assessment','0001_initial','2016-02-29 18:01:40.149754'),(5,'assessment','0002_staffworkflow','2016-02-29 18:01:40.160082'),(6,'contenttypes','0002_remove_content_type_name','2016-02-29 18:01:40.231907'),(7,'auth','0002_alter_permission_name_max_length','2016-02-29 18:01:40.251926'),(8,'auth','0003_alter_user_email_max_length','2016-02-29 18:01:40.276419'),(9,'auth','0004_alter_user_username_opts','2016-02-29 18:01:40.297224'),(10,'auth','0005_alter_user_last_login_null','2016-02-29 18:01:40.317098'),(11,'auth','0006_require_contenttypes_0002','2016-02-29 18:01:40.319374'),(12,'bookmarks','0001_initial','2016-02-29 18:01:40.396366'),(13,'branding','0001_initial','2016-02-29 18:01:40.453783'),(14,'bulk_email','0001_initial','2016-02-29 18:01:40.565081'),(15,'bulk_email','0002_data__load_course_email_template','2016-02-29 18:01:40.574000'),(16,'instructor_task','0001_initial','2016-02-29 18:01:40.613011'),(17,'certificates','0001_initial','2016-02-29 18:01:40.980762'),(18,'certificates','0002_data__certificatehtmlviewconfiguration_data','2016-02-29 18:01:40.991190'),(19,'certificates','0003_data__default_modes','2016-02-29 18:01:41.003742'),(20,'certificates','0004_certificategenerationhistory','2016-02-29 18:01:41.061308'),(21,'certificates','0005_auto_20151208_0801','2016-02-29 18:01:41.113837'),(22,'certificates','0006_certificatetemplateasset_asset_slug','2016-02-29 18:01:41.131141'),(23,'certificates','0007_certificateinvalidation','2016-02-29 18:01:41.189247'),(24,'commerce','0001_data__add_ecommerce_service_user','2016-02-29 18:01:41.200385'),(25,'commerce','0002_commerceconfiguration','2016-02-29 18:01:41.260287'),(26,'contentserver','0001_initial','2016-02-29 18:01:41.323580'),(27,'cors_csrf','0001_initial','2016-02-29 18:01:41.388714'),(28,'course_action_state','0001_initial','2016-02-29 18:01:41.514544'),(29,'course_groups','0001_initial','2016-02-29 18:01:42.036647'),(30,'course_modes','0001_initial','2016-02-29 18:01:42.068946'),(31,'course_modes','0002_coursemode_expiration_datetime_is_explicit','2016-02-29 18:01:42.084746'),(32,'course_modes','0003_auto_20151113_1443','2016-02-29 18:01:42.100516'),(33,'course_modes','0004_auto_20151113_1457','2016-02-29 18:01:42.187139'),(34,'course_modes','0005_auto_20151217_0958','2016-02-29 18:01:42.205556'),(35,'course_modes','0006_auto_20160208_1407','2016-02-29 18:01:42.289731'),(36,'course_overviews','0001_initial','2016-02-29 18:01:42.319879'),(37,'course_overviews','0002_add_course_catalog_fields','2016-02-29 18:01:42.402948'),(38,'course_overviews','0003_courseoverviewgeneratedhistory','2016-02-29 18:01:42.417563'),(39,'course_overviews','0004_courseoverview_org','2016-02-29 18:01:42.435373'),(40,'course_overviews','0005_delete_courseoverviewgeneratedhistory','2016-02-29 18:01:42.448847'),(41,'course_overviews','0006_courseoverviewimageset','2016-02-29 18:01:42.472337'),(42,'course_overviews','0007_courseoverviewimageconfig','2016-02-29 18:01:42.561497'),(43,'course_overviews','0008_remove_courseoverview_facebook_url','2016-02-29 18:01:42.582078'),(44,'course_overviews','0009_readd_facebook_url','2016-02-29 18:01:42.608691'),(45,'course_structures','0001_initial','2016-02-29 18:01:42.625296'),(46,'courseware','0001_initial','2016-02-29 18:01:44.499738'),(47,'coursewarehistoryextended','0001_initial','2016-02-29 18:01:44.691094'),(48,'credentials','0001_initial','2016-02-29 18:01:44.788912'),(49,'credit','0001_initial','2016-02-29 18:01:45.621214'),(50,'dark_lang','0001_initial','2016-02-29 18:01:45.752882'),(51,'dark_lang','0002_data__enable_on_install','2016-02-29 18:01:45.765638'),(52,'default','0001_initial','2016-02-29 18:01:46.107319'),(53,'default','0002_add_related_name','2016-02-29 18:01:46.247368'),(54,'default','0003_alter_email_max_length','2016-02-29 18:01:46.265241'),(55,'django_comment_common','0001_initial','2016-02-29 18:01:46.569556'),(56,'django_notify','0001_initial','2016-02-29 18:01:47.200935'),(57,'django_openid_auth','0001_initial','2016-02-29 18:01:47.399851'),(58,'edx_proctoring','0001_initial','2016-02-29 18:01:50.659784'),(59,'edx_proctoring','0002_proctoredexamstudentattempt_is_status_acknowledged','2016-02-29 18:01:50.845795'),(60,'edx_proctoring','0003_auto_20160101_0525','2016-02-29 18:01:51.213992'),(61,'edx_proctoring','0004_auto_20160201_0523','2016-02-29 18:01:51.397904'),(62,'edxval','0001_initial','2016-02-29 18:01:51.631665'),(63,'edxval','0002_data__default_profiles','2016-02-29 18:01:51.651781'),(64,'embargo','0001_initial','2016-02-29 18:01:52.230500'),(65,'embargo','0002_data__add_countries','2016-02-29 18:01:52.401900'),(66,'external_auth','0001_initial','2016-02-29 18:01:52.851531'),(67,'lms_xblock','0001_initial','2016-02-29 18:01:53.081369'),(68,'sites','0001_initial','2016-02-29 18:01:53.104608'),(69,'microsite_configuration','0001_initial','2016-02-29 18:01:54.497782'),(70,'microsite_configuration','0002_auto_20160202_0228','2016-02-29 18:01:55.048275'),(71,'milestones','0001_initial','2016-02-29 18:01:55.459781'),(72,'milestones','0002_data__seed_relationship_types','2016-02-29 18:01:55.481439'),(73,'milestones','0003_coursecontentmilestone_requirements','2016-02-29 18:01:55.522487'),(74,'milestones','0004_auto_20151221_1445','2016-02-29 18:01:55.688330'),(75,'mobile_api','0001_initial','2016-02-29 18:01:56.844055'),(76,'notes','0001_initial','2016-02-29 18:01:57.066857'),(77,'oauth2','0001_initial','2016-02-29 18:01:58.412080'),(78,'oauth2_provider','0001_initial','2016-02-29 18:01:58.699157'),(79,'oauth_provider','0001_initial','2016-02-29 18:01:59.448662'),(80,'organizations','0001_initial','2016-02-29 18:01:59.538595'),(81,'programs','0001_initial','2016-02-29 18:01:59.922304'),(82,'programs','0002_programsapiconfig_cache_ttl','2016-02-29 18:02:00.317781'),(83,'programs','0003_auto_20151120_1613','2016-02-29 18:02:01.977886'),(84,'programs','0004_programsapiconfig_enable_certification','2016-02-29 18:02:02.413721'),(85,'programs','0005_programsapiconfig_max_retries','2016-02-29 18:02:02.799700'),(86,'rss_proxy','0001_initial','2016-02-29 18:02:02.828648'),(87,'self_paced','0001_initial','2016-02-29 18:02:03.260889'),(88,'sessions','0001_initial','2016-02-29 18:02:03.285722'),(89,'student','0001_initial','2016-02-29 18:02:14.964735'),(90,'shoppingcart','0001_initial','2016-02-29 18:02:26.167709'),(91,'shoppingcart','0002_auto_20151208_1034','2016-02-29 18:02:26.959607'),(92,'shoppingcart','0003_auto_20151217_0958','2016-02-29 18:02:27.772373'),(93,'splash','0001_initial','2016-02-29 18:02:28.180056'),(94,'static_replace','0001_initial','2016-02-29 18:02:28.600901'),(95,'static_replace','0002_assetexcludedextensionsconfig','2016-02-29 18:02:29.072670'),(96,'status','0001_initial','2016-02-29 18:02:30.149381'),(97,'student','0002_auto_20151208_1034','2016-02-29 18:02:31.383085'),(98,'submissions','0001_initial','2016-02-29 18:02:31.704655'),(99,'submissions','0002_auto_20151119_0913','2016-02-29 18:02:31.818741'),(100,'submissions','0003_submission_status','2016-02-29 18:02:31.875924'),(101,'survey','0001_initial','2016-02-29 18:02:32.613867'),(102,'teams','0001_initial','2016-02-29 18:02:35.208964'),(103,'third_party_auth','0001_initial','2016-02-29 18:02:38.385039'),(104,'track','0001_initial','2016-02-29 18:02:38.420093'),(105,'user_api','0001_initial','2016-02-29 18:02:42.631297'),(106,'util','0001_initial','2016-02-29 18:02:43.444988'),(107,'util','0002_data__default_rate_limit_config','2016-02-29 18:02:43.472520'),(108,'verify_student','0001_initial','2016-02-29 18:02:51.517974'),(109,'verify_student','0002_auto_20151124_1024','2016-02-29 18:02:52.305832'),(110,'verify_student','0003_auto_20151113_1443','2016-02-29 18:02:53.133517'),(111,'wiki','0001_initial','2016-02-29 18:03:14.972792'),(112,'wiki','0002_remove_article_subscription','2016-02-29 18:03:15.007100'),(113,'workflow','0001_initial','2016-02-29 18:03:15.147297'),(114,'xblock_django','0001_initial','2016-02-29 18:03:15.981916'),(115,'xblock_django','0002_auto_20160204_0809','2016-02-29 18:03:16.844433'),(116,'contentstore','0001_initial','2016-02-29 18:03:37.119213'),(117,'course_creators','0001_initial','2016-02-29 18:03:37.149132'),(118,'xblock_config','0001_initial','2016-02-29 18:03:37.381904'); +INSERT INTO `django_migrations` VALUES (1,'contenttypes','0001_initial','2016-03-07 21:33:26.033148'),(2,'auth','0001_initial','2016-03-07 21:33:26.071794'),(3,'admin','0001_initial','2016-03-07 21:33:26.094726'),(4,'assessment','0001_initial','2016-03-07 21:33:26.734334'),(5,'assessment','0002_staffworkflow','2016-03-07 21:33:26.748174'),(6,'contenttypes','0002_remove_content_type_name','2016-03-07 21:33:26.822178'),(7,'auth','0002_alter_permission_name_max_length','2016-03-07 21:33:26.846501'),(8,'auth','0003_alter_user_email_max_length','2016-03-07 21:33:26.870855'),(9,'auth','0004_alter_user_username_opts','2016-03-07 21:33:26.895281'),(10,'auth','0005_alter_user_last_login_null','2016-03-07 21:33:26.919048'),(11,'auth','0006_require_contenttypes_0002','2016-03-07 21:33:26.922595'),(12,'bookmarks','0001_initial','2016-03-07 21:33:27.008343'),(13,'branding','0001_initial','2016-03-07 21:33:27.065792'),(14,'bulk_email','0001_initial','2016-03-07 21:33:27.189432'),(15,'bulk_email','0002_data__load_course_email_template','2016-03-07 21:33:27.197917'),(16,'instructor_task','0001_initial','2016-03-07 21:33:27.245184'),(17,'certificates','0001_initial','2016-03-07 21:33:27.641690'),(18,'certificates','0002_data__certificatehtmlviewconfiguration_data','2016-03-07 21:33:27.656293'),(19,'certificates','0003_data__default_modes','2016-03-07 21:33:27.667624'),(20,'certificates','0004_certificategenerationhistory','2016-03-07 21:33:27.737402'),(21,'certificates','0005_auto_20151208_0801','2016-03-07 21:33:27.794978'),(22,'certificates','0006_certificatetemplateasset_asset_slug','2016-03-07 21:33:27.808778'),(23,'certificates','0007_certificateinvalidation','2016-03-07 21:33:27.865273'),(24,'commerce','0001_data__add_ecommerce_service_user','2016-03-07 21:33:27.875925'),(25,'commerce','0002_commerceconfiguration','2016-03-07 21:33:27.937252'),(26,'contentserver','0001_initial','2016-03-07 21:33:28.010793'),(27,'cors_csrf','0001_initial','2016-03-07 21:33:28.072393'),(28,'course_action_state','0001_initial','2016-03-07 21:33:29.150991'),(29,'course_groups','0001_initial','2016-03-07 21:33:29.653738'),(30,'course_modes','0001_initial','2016-03-07 21:33:29.692413'),(31,'course_modes','0002_coursemode_expiration_datetime_is_explicit','2016-03-07 21:33:29.707909'),(32,'course_modes','0003_auto_20151113_1443','2016-03-07 21:33:29.723139'),(33,'course_modes','0004_auto_20151113_1457','2016-03-07 21:33:29.802913'),(34,'course_modes','0005_auto_20151217_0958','2016-03-07 21:33:29.819395'),(35,'course_modes','0006_auto_20160208_1407','2016-03-07 21:33:29.901786'),(36,'course_overviews','0001_initial','2016-03-07 21:33:29.932173'),(37,'course_overviews','0002_add_course_catalog_fields','2016-03-07 21:33:30.019436'),(38,'course_overviews','0003_courseoverviewgeneratedhistory','2016-03-07 21:33:30.035991'),(39,'course_overviews','0004_courseoverview_org','2016-03-07 21:33:30.055999'),(40,'course_overviews','0005_delete_courseoverviewgeneratedhistory','2016-03-07 21:33:30.069417'),(41,'course_overviews','0006_courseoverviewimageset','2016-03-07 21:33:30.092113'),(42,'course_overviews','0007_courseoverviewimageconfig','2016-03-07 21:33:30.174080'),(43,'course_overviews','0008_remove_courseoverview_facebook_url','2016-03-07 21:33:30.176656'),(44,'course_overviews','0009_readd_facebook_url','2016-03-07 21:33:30.178836'),(45,'course_structures','0001_initial','2016-03-07 21:33:30.194595'),(46,'courseware','0001_initial','2016-03-07 21:33:31.078692'),(47,'coursewarehistoryextended','0001_initial','2016-03-07 21:33:31.241565'),(48,'coursewarehistoryextended','0002_force_studentmodule_index','2016-03-07 21:33:31.349328'),(49,'credentials','0001_initial','2016-03-07 21:33:31.439568'),(50,'credit','0001_initial','2016-03-07 21:33:32.158562'),(51,'dark_lang','0001_initial','2016-03-07 21:33:32.272553'),(52,'dark_lang','0002_data__enable_on_install','2016-03-07 21:33:32.292147'),(53,'default','0001_initial','2016-03-07 21:33:32.618496'),(54,'default','0002_add_related_name','2016-03-07 21:33:32.747109'),(55,'default','0003_alter_email_max_length','2016-03-07 21:33:32.764118'),(56,'django_comment_common','0001_initial','2016-03-07 21:33:33.045633'),(57,'django_notify','0001_initial','2016-03-07 21:33:33.683870'),(58,'django_openid_auth','0001_initial','2016-03-07 21:33:33.887994'),(59,'oauth2','0001_initial','2016-03-07 21:33:35.518104'),(60,'edx_oauth2_provider','0001_initial','2016-03-07 21:33:35.661195'),(61,'edx_proctoring','0001_initial','2016-03-07 21:33:37.901502'),(62,'edx_proctoring','0002_proctoredexamstudentattempt_is_status_acknowledged','2016-03-07 21:33:38.137829'),(63,'edx_proctoring','0003_auto_20160101_0525','2016-03-07 21:33:38.644618'),(64,'edx_proctoring','0004_auto_20160201_0523','2016-03-07 21:33:38.906016'),(65,'edxval','0001_initial','2016-03-07 21:33:39.155791'),(66,'edxval','0002_data__default_profiles','2016-03-07 21:33:39.181773'),(67,'embargo','0001_initial','2016-03-07 21:33:39.959843'),(68,'embargo','0002_data__add_countries','2016-03-07 21:33:40.149397'),(69,'external_auth','0001_initial','2016-03-07 21:33:40.725785'),(70,'lms_xblock','0001_initial','2016-03-07 21:33:41.882266'),(71,'sites','0001_initial','2016-03-07 21:33:41.904159'),(72,'microsite_configuration','0001_initial','2016-03-07 21:33:42.952132'),(73,'microsite_configuration','0002_auto_20160202_0228','2016-03-07 21:33:43.359419'),(74,'milestones','0001_initial','2016-03-07 21:33:43.716203'),(75,'milestones','0002_data__seed_relationship_types','2016-03-07 21:33:43.739942'),(76,'milestones','0003_coursecontentmilestone_requirements','2016-03-07 21:33:43.772194'),(77,'milestones','0004_auto_20151221_1445','2016-03-07 21:33:43.907278'),(78,'mobile_api','0001_initial','2016-03-07 21:33:44.150482'),(79,'notes','0001_initial','2016-03-07 21:33:44.414752'),(80,'oauth_provider','0001_initial','2016-03-07 21:33:45.032852'),(81,'organizations','0001_initial','2016-03-07 21:33:45.111393'),(82,'programs','0001_initial','2016-03-07 21:33:45.427919'),(83,'programs','0002_programsapiconfig_cache_ttl','2016-03-07 21:33:45.727136'),(84,'programs','0003_auto_20151120_1613','2016-03-07 21:33:47.072788'),(85,'programs','0004_programsapiconfig_enable_certification','2016-03-07 21:33:48.327058'),(86,'programs','0005_programsapiconfig_max_retries','2016-03-07 21:33:48.536151'),(87,'rss_proxy','0001_initial','2016-03-07 21:33:48.571928'),(88,'self_paced','0001_initial','2016-03-07 21:33:48.799690'),(89,'sessions','0001_initial','2016-03-07 21:33:48.831344'),(90,'student','0001_initial','2016-03-07 21:33:58.200378'),(91,'shoppingcart','0001_initial','2016-03-07 21:34:07.068222'),(92,'shoppingcart','0002_auto_20151208_1034','2016-03-07 21:34:07.860305'),(93,'shoppingcart','0003_auto_20151217_0958','2016-03-07 21:34:08.746587'),(94,'splash','0001_initial','2016-03-07 21:34:09.212391'),(95,'static_replace','0001_initial','2016-03-07 21:34:09.728084'),(96,'static_replace','0002_assetexcludedextensionsconfig','2016-03-07 21:34:10.232762'),(97,'status','0001_initial','2016-03-07 21:34:11.353387'),(98,'student','0002_auto_20151208_1034','2016-03-07 21:34:12.427561'),(99,'submissions','0001_initial','2016-03-07 21:34:13.762704'),(100,'submissions','0002_auto_20151119_0913','2016-03-07 21:34:13.860261'),(101,'submissions','0003_submission_status','2016-03-07 21:34:13.899844'),(102,'survey','0001_initial','2016-03-07 21:34:14.322540'),(103,'teams','0001_initial','2016-03-07 21:34:15.395533'),(104,'third_party_auth','0001_initial','2016-03-07 21:34:17.484168'),(105,'track','0001_initial','2016-03-07 21:34:17.515995'),(106,'user_api','0001_initial','2016-03-07 21:34:21.513361'),(107,'util','0001_initial','2016-03-07 21:34:21.885445'),(108,'util','0002_data__default_rate_limit_config','2016-03-07 21:34:21.920632'),(109,'verify_student','0001_initial','2016-03-07 21:34:27.215973'),(110,'verify_student','0002_auto_20151124_1024','2016-03-07 21:34:27.909387'),(111,'verify_student','0003_auto_20151113_1443','2016-03-07 21:34:28.606460'),(112,'wiki','0001_initial','2016-03-07 21:34:45.492292'),(113,'wiki','0002_remove_article_subscription','2016-03-07 21:34:45.529216'),(114,'workflow','0001_initial','2016-03-07 21:34:45.651613'),(115,'xblock_django','0001_initial','2016-03-07 21:34:46.297434'),(116,'xblock_django','0002_auto_20160204_0809','2016-03-07 21:34:46.988209'),(117,'contentstore','0001_initial','2016-03-07 21:35:04.702755'),(118,'course_creators','0001_initial','2016-03-07 21:35:04.729239'),(119,'xblock_config','0001_initial','2016-03-07 21:35:04.908173'); /*!40000 ALTER TABLE `django_migrations` ENABLE KEYS */; UNLOCK TABLES; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; @@ -34,4 +34,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2016-02-29 18:03:40 +-- Dump completed on 2016-03-07 21:35:08 diff --git a/common/test/db_cache/bok_choy_schema_default.sql b/common/test/db_cache/bok_choy_schema_default.sql index 2a09404f56..f4b333e32a 100644 --- a/common/test/db_cache/bok_choy_schema_default.sql +++ b/common/test/db_cache/bok_choy_schema_default.sql @@ -1143,6 +1143,7 @@ CREATE TABLE `course_overviews_courseoverview` ( `end` datetime(6) DEFAULT NULL, `advertised_start` longtext, `course_image_url` longtext NOT NULL, + `facebook_url` longtext, `social_sharing_url` longtext, `end_of_course_survey_url` longtext, `certificates_display_behavior` longtext, @@ -1167,7 +1168,6 @@ CREATE TABLE `course_overviews_courseoverview` ( `effort` longtext, `short_description` longtext, `org` longtext NOT NULL, - `facebook_url` longtext, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; @@ -1658,7 +1658,7 @@ CREATE TABLE `django_migrations` ( `name` varchar(255) NOT NULL, `applied` datetime(6) NOT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=119 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=120 DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `django_openid_auth_association`; /*!40101 SET @saved_cs_client = @@character_set_client */; diff --git a/common/test/db_cache/bok_choy_schema_student_module_history.sql b/common/test/db_cache/bok_choy_schema_student_module_history.sql index 5a30d5a35c..ca0d7226ec 100644 --- a/common/test/db_cache/bok_choy_schema_student_module_history.sql +++ b/common/test/db_cache/bok_choy_schema_student_module_history.sql @@ -22,7 +22,8 @@ CREATE TABLE `coursewarehistoryextended_studentmodulehistoryextended` ( `student_module_id` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `coursewarehistoryextended_studentmodulehistoryextended_2af72f10` (`version`), - KEY `coursewarehistoryextended_studentmodulehistoryextended_e2fa5388` (`created`) + KEY `coursewarehistoryextended_studentmodulehistoryextended_e2fa5388` (`created`), + KEY `coursewarehistoryextended_student_module_id_61b23a7a1dd27fe4_idx` (`student_module_id`) ) ENGINE=InnoDB AUTO_INCREMENT=10000 DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `django_migrations`; @@ -34,7 +35,7 @@ CREATE TABLE `django_migrations` ( `name` varchar(255) NOT NULL, `applied` datetime(6) NOT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=119 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=120 DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; diff --git a/common/test/db_cache/lettuce.db b/common/test/db_cache/lettuce.db index 7b1e650713..c90f206e86 100644 Binary files a/common/test/db_cache/lettuce.db and b/common/test/db_cache/lettuce.db differ diff --git a/lms/djangoapps/course_structure_api/v0/tests.py b/lms/djangoapps/course_structure_api/v0/tests.py index 921b34d005..000d8b2584 100644 --- a/lms/djangoapps/course_structure_api/v0/tests.py +++ b/lms/djangoapps/course_structure_api/v0/tests.py @@ -9,7 +9,7 @@ from mock import patch, Mock from django.core.urlresolvers import reverse from capa.tests.response_xml_factory import MultipleChoiceResponseXMLFactory -from oauth2_provider.tests.factories import AccessTokenFactory, ClientFactory +from edx_oauth2_provider.tests.factories import AccessTokenFactory, ClientFactory from opaque_keys.edx.locator import CourseLocator from xmodule.error_module import ErrorDescriptor from xmodule.modulestore import ModuleStoreEnum diff --git a/lms/djangoapps/edxnotes/tests.py b/lms/djangoapps/edxnotes/tests.py index 1add802a08..4497c95046 100644 --- a/lms/djangoapps/edxnotes/tests.py +++ b/lms/djangoapps/edxnotes/tests.py @@ -20,7 +20,7 @@ from django.core.urlresolvers import reverse from django.core.exceptions import ImproperlyConfigured from django.test.client import RequestFactory from django.test.utils import override_settings -from oauth2_provider.tests.factories import ClientFactory +from edx_oauth2_provider.tests.factories import ClientFactory from provider.oauth2.models import Client from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase diff --git a/lms/djangoapps/oauth2_handler/handlers.py b/lms/djangoapps/oauth2_handler/handlers.py index 38f246b688..017078bd0d 100644 --- a/lms/djangoapps/oauth2_handler/handlers.py +++ b/lms/djangoapps/oauth2_handler/handlers.py @@ -115,7 +115,7 @@ class CourseAccessHandler(object): For a description of the function naming and arguments, see: - `oauth2_provider/oidc/handlers.py` + `edx_oauth2_provider/oidc/handlers.py` """ diff --git a/lms/djangoapps/oauth2_handler/tests.py b/lms/djangoapps/oauth2_handler/tests.py index be6ff9bd74..c4ab36ce21 100644 --- a/lms/djangoapps/oauth2_handler/tests.py +++ b/lms/djangoapps/oauth2_handler/tests.py @@ -14,7 +14,7 @@ from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase # Will also run default tests for IDTokens and UserInfo -from oauth2_provider.tests import IDTokenTestCase, UserInfoTestCase +from edx_oauth2_provider.tests import IDTokenTestCase, UserInfoTestCase class BaseTestMixin(ModuleStoreTestCase): diff --git a/lms/djangoapps/oauth_dispatch/__init__.py b/lms/djangoapps/oauth_dispatch/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lms/djangoapps/oauth_dispatch/adapters/__init__.py b/lms/djangoapps/oauth_dispatch/adapters/__init__.py new file mode 100644 index 0000000000..1f6227b50a --- /dev/null +++ b/lms/djangoapps/oauth_dispatch/adapters/__init__.py @@ -0,0 +1,7 @@ +""" +Adapters to provide a common interface to django-oauth2-provider (DOP) and +django-oauth-toolkit (DOT). +""" + +from .dop import DOPAdapter +from .dot import DOTAdapter diff --git a/lms/djangoapps/oauth_dispatch/adapters/dop.py b/lms/djangoapps/oauth_dispatch/adapters/dop.py new file mode 100644 index 0000000000..b12994b96f --- /dev/null +++ b/lms/djangoapps/oauth_dispatch/adapters/dop.py @@ -0,0 +1,70 @@ +""" +Adapter to isolate django-oauth2-provider dependencies +""" + +from provider.oauth2 import models +from provider import constants, scope + + +class DOPAdapter(object): + """ + Standard interface for working with django-oauth2-provider + """ + + backend = object() + + def create_confidential_client(self, name, user, redirect_uri, client_id=None): + """ + Create an oauth client application that is confidential. + """ + return models.Client.objects.create( + name=name, + user=user, + client_id=client_id, + redirect_uri=redirect_uri, + client_type=constants.CONFIDENTIAL, + ) + + def create_public_client(self, name, user, redirect_uri, client_id=None): + """ + Create an oauth client application that is public. + """ + return models.Client.objects.create( + name=name, + user=user, + client_id=client_id, + redirect_uri=redirect_uri, + client_type=constants.PUBLIC, + ) + + def get_client(self, **filters): + """ + Get the oauth client application with the specified filters. + + Wraps django's queryset.get() method. + """ + return models.Client.objects.get(**filters) + + def get_client_for_token(self, token): + """ + Given an AccessToken object, return the associated client application. + """ + return token.client + + def get_access_token(self, token_string): + """ + Given a token string, return the matching AccessToken object. + """ + return models.AccessToken.objects.get(token=token_string) + + def normalize_scopes(self, scopes): + """ + Given a list of scopes, return a space-separated list of those scopes. + """ + return ' '.join(scopes) + + def get_token_scope_names(self, token): + """ + Given an access token object, return its scopes. + """ + return scope.to_names(token.scope) diff --git a/lms/djangoapps/oauth_dispatch/adapters/dot.py b/lms/djangoapps/oauth_dispatch/adapters/dot.py new file mode 100644 index 0000000000..84dcb7ece4 --- /dev/null +++ b/lms/djangoapps/oauth_dispatch/adapters/dot.py @@ -0,0 +1,73 @@ +""" +Adapter to isolate django-oauth-toolkit dependencies +""" + +from oauth2_provider import models + + +class DOTAdapter(object): + """ + Standard interface for working with django-oauth-toolkit + """ + + backend = object() + + def create_confidential_client(self, name, user, redirect_uri, client_id=None): + """ + Create an oauth client application that is confidential. + """ + return models.Application.objects.create( + name=name, + user=user, + client_id=client_id, + client_type=models.Application.CLIENT_CONFIDENTIAL, + authorization_grant_type=models.Application.GRANT_AUTHORIZATION_CODE, + redirect_uris=redirect_uri, + ) + + def create_public_client(self, name, user, redirect_uri, client_id=None): + """ + Create an oauth client application that is public. + """ + return models.Application.objects.create( + name=name, + user=user, + client_id=client_id, + client_type=models.Application.CLIENT_PUBLIC, + authorization_grant_type=models.Application.GRANT_PASSWORD, + redirect_uris=redirect_uri, + ) + + def get_client(self, **filters): + """ + Get the oauth client application with the specified filters. + + Wraps django's queryset.get() method. + """ + return models.Application.objects.get(**filters) + + def get_client_for_token(self, token): + """ + Given an AccessToken object, return the associated client application. + """ + return token.application + + def get_access_token(self, token_string): + """ + Given a token string, return the matching AccessToken object. + """ + return models.AccessToken.objects.get(token=token_string) + + def normalize_scopes(self, scopes): + """ + Given a list of scopes, return a space-separated list of those scopes. + """ + if not scopes: + scopes = ['default'] + return ' '.join(scopes) + + def get_token_scope_names(self, token): + """ + Given an access token object, return its scopes. + """ + return list(token.scopes) diff --git a/lms/djangoapps/oauth_dispatch/tests/__init__.py b/lms/djangoapps/oauth_dispatch/tests/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lms/djangoapps/oauth_dispatch/tests/constants.py b/lms/djangoapps/oauth_dispatch/tests/constants.py new file mode 100644 index 0000000000..b38868bcfb --- /dev/null +++ b/lms/djangoapps/oauth_dispatch/tests/constants.py @@ -0,0 +1,5 @@ +""" +Constants for testing purposes +""" + +DUMMY_REDIRECT_URL = u'https://example.edx/redirect' diff --git a/lms/djangoapps/oauth_dispatch/tests/mixins.py b/lms/djangoapps/oauth_dispatch/tests/mixins.py new file mode 100644 index 0000000000..8b16c53fc2 --- /dev/null +++ b/lms/djangoapps/oauth_dispatch/tests/mixins.py @@ -0,0 +1,3 @@ +""" +OAuth Dispatch test mixins +""" diff --git a/lms/djangoapps/oauth_dispatch/tests/test_dop_adapter.py b/lms/djangoapps/oauth_dispatch/tests/test_dop_adapter.py new file mode 100644 index 0000000000..6dfe9ac9d4 --- /dev/null +++ b/lms/djangoapps/oauth_dispatch/tests/test_dop_adapter.py @@ -0,0 +1,77 @@ +""" +Tests for DOP Adapter +""" + +from datetime import timedelta + +import ddt +from django.test import TestCase +from django.utils.timezone import now +from provider.oauth2 import models +from provider import constants + +from student.tests.factories import UserFactory + +from ..adapters import DOPAdapter +from .constants import DUMMY_REDIRECT_URL + + +@ddt.ddt +class DOPAdapterTestCase(TestCase): + """ + Test class for DOPAdapter. + """ + + adapter = DOPAdapter() + + def setUp(self): + super(DOPAdapterTestCase, self).setUp() + self.user = UserFactory() + self.public_client = self.adapter.create_public_client( + name='public client', + user=self.user, + redirect_uri=DUMMY_REDIRECT_URL, + client_id='public-client-id', + ) + self.confidential_client = self.adapter.create_confidential_client( + name='confidential client', + user=self.user, + redirect_uri=DUMMY_REDIRECT_URL, + client_id='confidential-client-id', + ) + + @ddt.data( + ('confidential', constants.CONFIDENTIAL), + ('public', constants.PUBLIC), + ) + @ddt.unpack + def test_create_client(self, client_name, client_type): + client = getattr(self, '{}_client'.format(client_name)) + self.assertIsInstance(client, models.Client) + self.assertEqual(client.client_id, '{}-client-id'.format(client_name)) + self.assertEqual(client.client_type, client_type) + + def test_get_client(self): + client = self.adapter.get_client(client_type=constants.CONFIDENTIAL) + self.assertIsInstance(client, models.Client) + self.assertEqual(client.client_type, constants.CONFIDENTIAL) + + def test_get_client_not_found(self): + with self.assertRaises(models.Client.DoesNotExist): + self.adapter.get_client(client_id='not-found') + + def test_get_client_for_token(self): + token = models.AccessToken( + user=self.user, + client=self.public_client, + ) + self.assertEqual(self.adapter.get_client_for_token(token), self.public_client) + + def test_get_access_token(self): + token = models.AccessToken.objects.create( + token='token-id', + client=self.public_client, + user=self.user, + expires=now() + timedelta(days=30), + ) + self.assertEqual(self.adapter.get_access_token(token_string='token-id'), token) diff --git a/lms/djangoapps/oauth_dispatch/tests/test_dot_adapter.py b/lms/djangoapps/oauth_dispatch/tests/test_dot_adapter.py new file mode 100644 index 0000000000..a623e8cc6d --- /dev/null +++ b/lms/djangoapps/oauth_dispatch/tests/test_dot_adapter.py @@ -0,0 +1,76 @@ +""" +Tests for DOT Adapter +""" + +from datetime import timedelta + +import ddt +from django.test import TestCase +from django.utils.timezone import now +from oauth2_provider import models + +from student.tests.factories import UserFactory + +from ..adapters import DOTAdapter +from .constants import DUMMY_REDIRECT_URL + + +@ddt.ddt +class DOTAdapterTestCase(TestCase): + """ + Test class for DOTAdapter. + """ + + adapter = DOTAdapter() + + def setUp(self): + super(DOTAdapterTestCase, self).setUp() + self.user = UserFactory() + self.public_client = self.adapter.create_public_client( + name='public app', + user=self.user, + redirect_uri=DUMMY_REDIRECT_URL, + client_id='public-client-id', + ) + self.confidential_client = self.adapter.create_confidential_client( + name='confidential app', + user=self.user, + redirect_uri=DUMMY_REDIRECT_URL, + client_id='confidential-client-id', + ) + + @ddt.data( + ('confidential', models.Application.CLIENT_CONFIDENTIAL), + ('public', models.Application.CLIENT_PUBLIC), + ) + @ddt.unpack + def test_create_client(self, client_name, client_type): + client = getattr(self, '{}_client'.format(client_name)) + self.assertIsInstance(client, models.Application) + self.assertEqual(client.client_id, '{}-client-id'.format(client_name)) + self.assertEqual(client.client_type, client_type) + + def test_get_client(self): + client = self.adapter.get_client(client_type=models.Application.CLIENT_CONFIDENTIAL) + self.assertIsInstance(client, models.Application) + self.assertEqual(client.client_type, models.Application.CLIENT_CONFIDENTIAL) + + def test_get_client_not_found(self): + with self.assertRaises(models.Application.DoesNotExist): + self.adapter.get_client(client_id='not-found') + + def test_get_client_for_token(self): + token = models.AccessToken( + user=self.user, + application=self.public_client, + ) + self.assertEqual(self.adapter.get_client_for_token(token), self.public_client) + + def test_get_access_token(self): + token = models.AccessToken.objects.create( + token='token-id', + application=self.public_client, + user=self.user, + expires=now() + timedelta(days=30), + ) + self.assertEqual(self.adapter.get_access_token(token_string='token-id'), token) diff --git a/lms/djangoapps/oauth_dispatch/tests/test_views.py b/lms/djangoapps/oauth_dispatch/tests/test_views.py new file mode 100644 index 0000000000..b8fb7435ff --- /dev/null +++ b/lms/djangoapps/oauth_dispatch/tests/test_views.py @@ -0,0 +1,251 @@ +""" +Tests for Blocks Views +""" + +import json + +import ddt +from django.test import RequestFactory, TestCase +from django.core.urlresolvers import reverse +import httpretty + +from student.tests.factories import UserFactory +from third_party_auth.tests.utils import ThirdPartyOAuthTestMixin, ThirdPartyOAuthTestMixinGoogle + +from .. import adapters +from .. import views +from .constants import DUMMY_REDIRECT_URL + + +class _DispatchingViewTestCase(TestCase): + """ + Base class for tests that exercise DispatchingViews. + """ + dop_adapter = adapters.DOPAdapter() + dot_adapter = adapters.DOTAdapter() + + view_class = None + url = None + + def setUp(self): + super(_DispatchingViewTestCase, self).setUp() + self.user = UserFactory() + self.dot_app = self.dot_adapter.create_public_client( + name='test dot application', + user=self.user, + redirect_uri=DUMMY_REDIRECT_URL, + client_id='dot-app-client-id', + ) + self.dop_client = self.dop_adapter.create_public_client( + name='test dop client', + user=self.user, + redirect_uri=DUMMY_REDIRECT_URL, + client_id='dop-app-client-id', + ) + + def _post_request(self, user, client): + """ + Call the view with a POST request objectwith the appropriate format, + returning the response object. + """ + return self.client.post(self.url, self._post_body(user, client)) + + def _post_body(self, user, client): + """ + Return a dictionary to be used as the body of the POST request + """ + raise NotImplementedError() + + +@ddt.ddt +class TestAccessTokenView(_DispatchingViewTestCase): + """ + Test class for AccessTokenView + """ + + view_class = views.AccessTokenView + url = reverse('access_token') + + def _post_body(self, user, client): + """ + Return a dictionary to be used as the body of the POST request + """ + return { + 'client_id': client.client_id, + 'grant_type': 'password', + 'username': user.username, + 'password': 'test', + } + + @ddt.data('dop_client', 'dot_app') + def test_access_token_fields(self, client_attr): + client = getattr(self, client_attr) + response = self._post_request(self.user, client) + self.assertEqual(response.status_code, 200) + data = json.loads(response.content) + self.assertIn('access_token', data) + self.assertIn('expires_in', data) + self.assertIn('scope', data) + self.assertIn('token_type', data) + + def test_dot_access_token_provides_refresh_token(self): + response = self._post_request(self.user, self.dot_app) + self.assertEqual(response.status_code, 200) + data = json.loads(response.content) + self.assertIn('refresh_token', data) + + def test_dop_public_client_access_token(self): + response = self._post_request(self.user, self.dop_client) + self.assertEqual(response.status_code, 200) + data = json.loads(response.content) + self.assertNotIn('refresh_token', data) + + +@ddt.ddt +@httpretty.activate +class TestAccessTokenExchangeView(ThirdPartyOAuthTestMixinGoogle, ThirdPartyOAuthTestMixin, _DispatchingViewTestCase): + """ + Test class for AccessTokenExchangeView + """ + + view_class = views.AccessTokenExchangeView + url = reverse('exchange_access_token', kwargs={'backend': 'google-oauth2'}) + + def _post_body(self, user, client): + return { + 'client_id': client.client_id, + 'access_token': self.access_token, + } + + @ddt.data('dop_client', 'dot_app') + def test_access_token_exchange_calls_dispatched_view(self, client_attr): + client = getattr(self, client_attr) + self.oauth_client = client + self._setup_provider_response(success=True) + response = self._post_request(self.user, client) + self.assertEqual(response.status_code, 200) + + +@ddt.ddt +class TestAuthorizationView(TestCase): + """ + Test class for AuthorizationView + """ + + dop_adapter = adapters.DOPAdapter() + + def setUp(self): + super(TestAuthorizationView, self).setUp() + self.user = UserFactory() + self.dop_client = self._create_confidential_client(user=self.user, client_id='dop-app-client-id') + + def _create_confidential_client(self, user, client_id): + """ + Create a confidential client suitable for testing purposes. + """ + return self.dop_adapter.create_confidential_client( + name='test_app', + user=user, + client_id=client_id, + redirect_uri=DUMMY_REDIRECT_URL + ) + + def test_authorization_view(self): + self.client.login(username=self.user.username, password='test') + response = self.client.post( + '/oauth2/authorize/', + { + 'client_id': self.dop_client.client_id, # TODO: DOT is not yet supported (MA-2124) + 'response_type': 'code', + 'state': 'random_state_string', + 'redirect_uri': DUMMY_REDIRECT_URL, + }, + follow=True, + ) + + self.assertEqual(response.status_code, 200) + + # check form is in context and form params are valid + context = response.context # pylint: disable=no-member + self.assertIn('form', context) + self.assertIsNone(context['form']['authorize'].value()) + + self.assertIn('oauth_data', context) + oauth_data = context['oauth_data'] + self.assertEqual(oauth_data['redirect_uri'], DUMMY_REDIRECT_URL) + self.assertEqual(oauth_data['state'], 'random_state_string') + + +class TestViewDispatch(TestCase): + """ + Test that the DispatchingView dispatches the right way. + """ + + dop_adapter = adapters.DOPAdapter() + dot_adapter = adapters.DOTAdapter() + + def setUp(self): + super(TestViewDispatch, self).setUp() + self.user = UserFactory() + self.view = views._DispatchingView() # pylint: disable=protected-access + self.dop_adapter.create_public_client( + name='', + user=self.user, + client_id='dop-id', + redirect_uri=DUMMY_REDIRECT_URL + ) + self.dot_adapter.create_public_client( + name='', + user=self.user, + client_id='dot-id', + redirect_uri=DUMMY_REDIRECT_URL + ) + + def assert_is_view(self, view_candidate): + """ + Assert that a given object is a view. That is, it is callable, and + takes a request argument. Note: while technically, the request argument + could take any name, this assertion requires the argument to be named + `request`. This is good practice. You should do it anyway. + """ + _msg_base = u'{view} is not a view: {reason}' + msg_not_callable = _msg_base.format(view=view_candidate, reason=u'it is not callable') + msg_no_request = _msg_base.format(view=view_candidate, reason=u'it has no request argument') + self.assertTrue(hasattr(view_candidate, '__call__'), msg_not_callable) + args = view_candidate.func_code.co_varnames + self.assertTrue(args, msg_no_request) + self.assertEqual(args[0], 'request') + + def _get_request(self, client_id): + """ + Return a request with the specified client_id in the body + """ + return RequestFactory().post('/', {'client_id': client_id}) + + def test_dispatching_to_dot(self): + request = self._get_request('dot-id') + self.assertEqual(self.view.select_backend(request), self.dot_adapter.backend) + + def test_dispatching_to_dop(self): + request = self._get_request('dop-id') + self.assertEqual(self.view.select_backend(request), self.dop_adapter.backend) + + def test_dispatching_with_no_client(self): + request = self._get_request(None) + self.assertEqual(self.view.select_backend(request), self.dop_adapter.backend) + + def test_dispatching_with_invalid_client(self): + request = self._get_request('abcesdfljh') + self.assertEqual(self.view.select_backend(request), self.dop_adapter.backend) + + def test_get_view_for_dot(self): + view_object = views.AccessTokenView() + self.assert_is_view(view_object.get_view_for_backend(self.dot_adapter.backend)) + + def test_get_view_for_dop(self): + view_object = views.AccessTokenView() + self.assert_is_view(view_object.get_view_for_backend(self.dop_adapter.backend)) + + def test_get_view_for_no_backend(self): + view_object = views.AccessTokenView() + self.assertRaises(KeyError, view_object.get_view_for_backend, None) diff --git a/lms/djangoapps/oauth_dispatch/urls.py b/lms/djangoapps/oauth_dispatch/urls.py new file mode 100644 index 0000000000..59e9068bdb --- /dev/null +++ b/lms/djangoapps/oauth_dispatch/urls.py @@ -0,0 +1,25 @@ +""" +OAuth2 wrapper urls +""" + +from django.conf import settings +from django.conf.urls import patterns, url +from django.views.decorators.csrf import csrf_exempt + +from . import views + + +urlpatterns = patterns( + '', + # TODO: authorize/ URL not yet supported for DOT (MA-2124) + url(r'^access_token/?$', csrf_exempt(views.AccessTokenView.as_view()), name='access_token'), +) + +if settings.FEATURES.get('ENABLE_THIRD_PARTY_AUTH'): + urlpatterns += ( + url( + r'^exchange_access_token/(?P[^/]+)/$', + csrf_exempt(views.AccessTokenExchangeView.as_view()), + name='exchange_access_token', + ), + ) diff --git a/lms/djangoapps/oauth_dispatch/views.py b/lms/djangoapps/oauth_dispatch/views.py new file mode 100644 index 0000000000..22652f127b --- /dev/null +++ b/lms/djangoapps/oauth_dispatch/views.py @@ -0,0 +1,89 @@ +""" +Views that dispatch processing of OAuth requests to django-oauth2-provider or +django-oauth-toolkit as appropriate. +""" + +from __future__ import unicode_literals + +from django.views.generic import View +from edx_oauth2_provider import views as dop_views # django-oauth2-provider views +from oauth2_provider import models as dot_models, views as dot_views # django-oauth-toolkit + +from auth_exchange import views as auth_exchange_views + +from . import adapters + + +class _DispatchingView(View): + """ + Base class that route views to the appropriate provider view. The default + behavior routes based on client_id, but this can be overridden by redefining + `select_backend()` if particular views need different behavior. + """ + # pylint: disable=no-member + + dot_adapter = adapters.DOTAdapter() + dop_adapter = adapters.DOPAdapter() + + def dispatch(self, request, *args, **kwargs): + """ + Dispatch the request to the selected backend's view. + """ + backend = self.select_backend(request) + view = self.get_view_for_backend(backend) + return view(request, *args, **kwargs) + + def select_backend(self, request): + """ + Given a request that specifies an oauth `client_id`, return the adapter + for the appropriate OAuth handling library. If the client_id is found + in a django-oauth-toolkit (DOT) Application, use the DOT adapter, + otherwise use the django-oauth2-provider (DOP) adapter, and allow the + calls to fail normally if the client does not exist. + """ + + if dot_models.Application.objects.filter(client_id=self._get_client_id(request)).exists(): + return self.dot_adapter.backend + else: + return self.dop_adapter.backend + + def get_view_for_backend(self, backend): + """ + Return the appropriate view from the requested backend. + """ + if backend == self.dot_adapter.backend: + return self.dot_view.as_view() + elif backend == self.dop_adapter.backend: + return self.dop_view.as_view() + else: + raise KeyError('Failed to dispatch view. Invalid backend {}'.format(backend)) + + def _get_client_id(self, request): + """ + Return the client_id from the provided request + """ + return request.POST.get('client_id') + + +class AccessTokenView(_DispatchingView): + """ + Handle access token requests. + """ + dot_view = dot_views.TokenView + dop_view = dop_views.AccessTokenView + + +class AuthorizationView(_DispatchingView): + """ + Part of the authorization flow. + """ + dop_view = dop_views.Capture + dot_view = dot_views.AuthorizationView + + +class AccessTokenExchangeView(_DispatchingView): + """ + Exchange a third party auth token. + """ + dop_view = auth_exchange_views.DOPAccessTokenExchangeView + dot_view = auth_exchange_views.DOTAccessTokenExchangeView diff --git a/lms/djangoapps/support/tests/test_programs.py b/lms/djangoapps/support/tests/test_programs.py index 9d2356e40f..2bad288ddf 100644 --- a/lms/djangoapps/support/tests/test_programs.py +++ b/lms/djangoapps/support/tests/test_programs.py @@ -2,7 +2,7 @@ from django.core.urlresolvers import reverse from django.test import TestCase import mock -from oauth2_provider.tests.factories import AccessTokenFactory, ClientFactory +from edx_oauth2_provider.tests.factories import AccessTokenFactory, ClientFactory from openedx.core.djangoapps.programs.tests.mixins import ProgramsApiConfigMixin from student.tests.factories import UserFactory diff --git a/lms/envs/common.py b/lms/envs/common.py index 202eae6486..e7894f3896 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -440,16 +440,16 @@ OAUTH_OIDC_ISSUER = 'https:/example.com/oauth2' # OpenID Connect claim handlers OAUTH_OIDC_ID_TOKEN_HANDLERS = ( - 'oauth2_provider.oidc.handlers.BasicIDTokenHandler', - 'oauth2_provider.oidc.handlers.ProfileHandler', - 'oauth2_provider.oidc.handlers.EmailHandler', + 'edx_oauth2_provider.oidc.handlers.BasicIDTokenHandler', + 'edx_oauth2_provider.oidc.handlers.ProfileHandler', + 'edx_oauth2_provider.oidc.handlers.EmailHandler', 'oauth2_handler.IDTokenHandler' ) OAUTH_OIDC_USERINFO_HANDLERS = ( - 'oauth2_provider.oidc.handlers.BasicUserInfoHandler', - 'oauth2_provider.oidc.handlers.ProfileHandler', - 'oauth2_provider.oidc.handlers.EmailHandler', + 'edx_oauth2_provider.oidc.handlers.BasicUserInfoHandler', + 'edx_oauth2_provider.oidc.handlers.ProfileHandler', + 'edx_oauth2_provider.oidc.handlers.EmailHandler', 'oauth2_handler.UserInfoHandler' ) @@ -1853,9 +1853,12 @@ INSTALLED_APPS = ( 'external_auth', 'django_openid_auth', - # OAuth2 Provider + # django-oauth2-provider (deprecated) 'provider', 'provider.oauth2', + 'edx_oauth2_provider', + + # django-oauth-toolkit 'oauth2_provider', 'third_party_auth', diff --git a/lms/urls.py b/lms/urls.py index 662031dd28..387982daa2 100644 --- a/lms/urls.py +++ b/lms/urls.py @@ -824,10 +824,19 @@ if settings.FEATURES.get('AUTH_USE_OPENID_PROVIDER'): if settings.FEATURES.get('ENABLE_OAUTH2_PROVIDER'): urlpatterns += ( - url(r'^oauth2/', include('oauth2_provider.urls', namespace='oauth2')), + # These URLs dispatch to django-oauth-toolkit or django-oauth2-provider as appropriate. + # Developers should use these routes, to maintain compatibility for existing client code + url(r'^oauth2/', include('lms.djangoapps.oauth_dispatch.urls')), + # These URLs contain the django-oauth2-provider default behavior. It exists to provide + # URLs for django-oauth2-provider to call using reverse() with the oauth2 namespace, and + # also to maintain support for views that have not yet been wrapped in dispatch views. + url(r'^oauth2/', include('edx_oauth2_provider.urls', namespace='oauth2')), + # The /_o/ prefix exists to provide a target for code in django-oauth-toolkit that + # uses reverse() with the 'oauth2_provider' namespace. Developers should not access these + # views directly, but should rather use the wrapped views at /oauth2/ + url(r'^_o/', include('oauth2_provider.urls', namespace='oauth2_provider')), ) - if settings.FEATURES.get('ENABLE_LMS_MIGRATION'): urlpatterns += ( url(r'^migrate/modules$', 'lms_migration.migrate.manage_modulestores'), @@ -892,14 +901,6 @@ if settings.FEATURES.get('ENABLE_THIRD_PARTY_AUTH'): # OAuth token exchange if settings.FEATURES.get('ENABLE_OAUTH2_PROVIDER'): - if settings.FEATURES.get('ENABLE_THIRD_PARTY_AUTH'): - urlpatterns += ( - url( - r'^oauth2/exchange_access_token/(?P[^/]+)/$', - auth_exchange.views.AccessTokenExchangeView.as_view(), - name="exchange_access_token" - ), - ) urlpatterns += ( url( r'^oauth2/login/$', diff --git a/openedx/core/djangoapps/credentials/tests/test_utils.py b/openedx/core/djangoapps/credentials/tests/test_utils.py index 4872d6c5fb..8de680f79f 100644 --- a/openedx/core/djangoapps/credentials/tests/test_utils.py +++ b/openedx/core/djangoapps/credentials/tests/test_utils.py @@ -6,7 +6,7 @@ from django.core.cache import cache from django.test import TestCase from nose.plugins.attrib import attr import httpretty -from oauth2_provider.tests.factories import ClientFactory +from edx_oauth2_provider.tests.factories import ClientFactory from provider.constants import CONFIDENTIAL from openedx.core.djangoapps.credentials.tests.mixins import CredentialsApiConfigMixin, CredentialsDataMixin diff --git a/openedx/core/djangoapps/credit/tests/test_views.py b/openedx/core/djangoapps/credit/tests/test_views.py index 2fc3790d83..b73277ca69 100644 --- a/openedx/core/djangoapps/credit/tests/test_views.py +++ b/openedx/core/djangoapps/credit/tests/test_views.py @@ -15,7 +15,7 @@ from django.conf import settings from django.core.urlresolvers import reverse from django.test import TestCase, Client from django.test.utils import override_settings -from oauth2_provider.tests.factories import AccessTokenFactory, ClientFactory +from edx_oauth2_provider.tests.factories import AccessTokenFactory, ClientFactory from opaque_keys.edx.keys import CourseKey import pytz diff --git a/openedx/core/djangoapps/programs/tasks/v1/tests/test_tasks.py b/openedx/core/djangoapps/programs/tasks/v1/tests/test_tasks.py index 6ee3729827..397bd593c1 100644 --- a/openedx/core/djangoapps/programs/tasks/v1/tests/test_tasks.py +++ b/openedx/core/djangoapps/programs/tasks/v1/tests/test_tasks.py @@ -12,8 +12,8 @@ from celery.exceptions import MaxRetriesExceededError from django.conf import settings from django.test import override_settings, TestCase from edx_rest_api_client.client import EdxRestApiClient +from edx_oauth2_provider.tests.factories import ClientFactory -from oauth2_provider.tests.factories import ClientFactory from openedx.core.djangoapps.credentials.tests.mixins import CredentialsApiConfigMixin from openedx.core.djangoapps.programs.tests.mixins import ProgramsApiConfigMixin from openedx.core.djangoapps.programs.tasks.v1 import tasks diff --git a/openedx/core/djangoapps/programs/tests/test_utils.py b/openedx/core/djangoapps/programs/tests/test_utils.py index a1e2b9f1be..9db0d3b27e 100644 --- a/openedx/core/djangoapps/programs/tests/test_utils.py +++ b/openedx/core/djangoapps/programs/tests/test_utils.py @@ -7,7 +7,7 @@ from django.test import TestCase import httpretty import mock from nose.plugins.attrib import attr -from oauth2_provider.tests.factories import ClientFactory +from edx_oauth2_provider.tests.factories import ClientFactory from provider.constants import CONFIDENTIAL from openedx.core.djangoapps.credentials.tests.mixins import CredentialsApiConfigMixin diff --git a/openedx/core/lib/api/authentication.py b/openedx/core/lib/api/authentication.py index 8e773e2f84..95a296d5b4 100644 --- a/openedx/core/lib/api/authentication.py +++ b/openedx/core/lib/api/authentication.py @@ -2,10 +2,13 @@ import logging +import django.utils.timezone from rest_framework.authentication import SessionAuthentication from rest_framework import exceptions as drf_exceptions from rest_framework_oauth.authentication import OAuth2Authentication -from rest_framework_oauth.compat import oauth2_provider, provider_now + +from provider.oauth2 import models as dop_models +from oauth2_provider import models as dot_models from openedx.core.lib.api.exceptions import AuthenticationFailed @@ -114,21 +117,44 @@ class OAuth2AuthenticationAllowInactiveUser(OAuth2Authentication): def authenticate_credentials(self, request, access_token): """ Authenticate the request, given the access token. - Overrides base class implementation to discard failure if user is inactive. + + Overrides base class implementation to discard failure if user is + inactive. """ - token_query = oauth2_provider.oauth2.models.AccessToken.objects.select_related('user') - token = token_query.filter(token=access_token).first() + + token = self.get_access_token(access_token) if not token: raise AuthenticationFailed({ u'error_code': OAUTH2_TOKEN_ERROR_NONEXISTENT, u'developer_message': u'The provided access token does not match any valid tokens.' }) - # provider_now switches to timezone aware datetime when - # the oauth2_provider version supports it. - elif token.expires < provider_now(): + elif token.expires < django.utils.timezone.now(): raise AuthenticationFailed({ u'error_code': OAUTH2_TOKEN_ERROR_EXPIRED, u'developer_message': u'The provided access token has expired and is no longer valid.', }) else: return token.user, token + + def get_access_token(self, access_token): + """ + Return a valid access token that exists in one of our OAuth2 libraries, + or None if no matching token is found. + """ + return self._get_dot_token(access_token) or self._get_dop_token(access_token) + + def _get_dop_token(self, access_token): + """ + Return a valid access token stored by django-oauth2-provider (DOP), or + None if no matching token is found. + """ + token_query = dop_models.AccessToken.objects.select_related('user') + return token_query.filter(token=access_token).first() + + def _get_dot_token(self, access_token): + """ + Return a valid access token stored by django-oauth-toolkit (DOT), or + None if no matching token is found. + """ + token_query = dot_models.AccessToken.objects.select_related('user') + return token_query.filter(token=access_token).first() diff --git a/openedx/core/lib/api/tests/test_authentication.py b/openedx/core/lib/api/tests/test_authentication.py index ea572b841b..ab3f077a27 100644 --- a/openedx/core/lib/api/tests/test_authentication.py +++ b/openedx/core/lib/api/tests/test_authentication.py @@ -19,6 +19,7 @@ from django.utils import unittest from django.utils.http import urlencode from mock import patch from nose.plugins.attrib import attr +from oauth2_provider import models as dot_models from rest_framework import exceptions from rest_framework import status from rest_framework.permissions import IsAuthenticated @@ -28,6 +29,7 @@ from rest_framework.test import APIRequestFactory, APIClient from rest_framework.views import APIView from rest_framework_jwt.settings import api_settings +from lms.djangoapps.oauth_dispatch import adapters from openedx.core.lib.api import authentication from openedx.core.lib.api.tests.mixins import JwtMixin from provider import constants, scope @@ -84,6 +86,8 @@ class OAuth2Tests(TestCase): def setUp(self): super(OAuth2Tests, self).setUp() + self.dop_adapter = adapters.DOPAdapter() + self.dot_adapter = adapters.DOTAdapter() self.csrf_client = APIClient(enforce_csrf_checks=True) self.username = 'john' self.email = 'lennon@thebeatles.com' @@ -95,24 +99,35 @@ class OAuth2Tests(TestCase): self.ACCESS_TOKEN = 'access_token' # pylint: disable=invalid-name self.REFRESH_TOKEN = 'refresh_token' # pylint: disable=invalid-name - self.oauth2_client = oauth2_provider.oauth2.models.Client.objects.create( - client_id=self.CLIENT_ID, - client_secret=self.CLIENT_SECRET, - redirect_uri='', - client_type=0, + self.dop_oauth2_client = self.dop_adapter.create_public_client( name='example', - user=None, + user=self.user, + client_id=self.CLIENT_ID, + redirect_uri='https://example.edx/redirect', ) self.access_token = oauth2_provider.oauth2.models.AccessToken.objects.create( token=self.ACCESS_TOKEN, - client=self.oauth2_client, + client=self.dop_oauth2_client, user=self.user, ) self.refresh_token = oauth2_provider.oauth2.models.RefreshToken.objects.create( user=self.user, access_token=self.access_token, - client=self.oauth2_client + client=self.dop_oauth2_client, + ) + + self.dot_oauth2_client = self.dot_adapter.create_public_client( + name='example', + user=self.user, + client_id='dot-client-id', + redirect_uri='https://example.edx/redirect', + ) + self.dot_access_token = dot_models.AccessToken.objects.create( + user=self.user, + token='dot-access-token', + application=self.dot_oauth2_client, + expires=datetime.now() + timedelta(days=30), ) # This is the a change we've made from the django-rest-framework-oauth version @@ -182,6 +197,10 @@ class OAuth2Tests(TestCase): response = self.get_with_bearer_token('/oauth2-test/') self.assertEqual(response.status_code, status.HTTP_200_OK) + def test_get_form_passing_auth_with_dot(self): + response = self.get_with_bearer_token('/oauth2-test/', token=self.dot_access_token.token) + self.assertEqual(response.status_code, status.HTTP_200_OK) + @unittest.skipUnless(oauth2_provider, 'django-oauth2-provider not installed') def test_post_form_passing_auth_url_transport(self): """Ensure GETing form over OAuth with correct client credentials in form data succeed""" diff --git a/openedx/core/lib/tests/test_edx_api_utils.py b/openedx/core/lib/tests/test_edx_api_utils.py index ca62f850e5..1570c0b4bb 100644 --- a/openedx/core/lib/tests/test_edx_api_utils.py +++ b/openedx/core/lib/tests/test_edx_api_utils.py @@ -7,7 +7,7 @@ from django.test import TestCase import httpretty import mock from nose.plugins.attrib import attr -from oauth2_provider.tests.factories import ClientFactory +from edx_oauth2_provider.tests.factories import ClientFactory from provider.constants import CONFIDENTIAL from testfixtures import LogCapture diff --git a/openedx/core/lib/tests/test_token_utils.py b/openedx/core/lib/tests/test_token_utils.py index 495e4eebc4..86ce51b280 100644 --- a/openedx/core/lib/tests/test_token_utils.py +++ b/openedx/core/lib/tests/test_token_utils.py @@ -10,7 +10,7 @@ from django.test.utils import override_settings import freezegun import jwt from nose.plugins.attrib import attr -from oauth2_provider.tests.factories import ClientFactory +from edx_oauth2_provider.tests.factories import ClientFactory from provider.constants import CONFIDENTIAL from openedx.core.lib.token_utils import get_id_token diff --git a/pavelib/prereqs.py b/pavelib/prereqs.py index da314158dd..6df3eb31f3 100644 --- a/pavelib/prereqs.py +++ b/pavelib/prereqs.py @@ -163,6 +163,7 @@ PACKAGES_TO_UNINSTALL = [ "edxval", # Because it was bork-installed somehow. "django-storages", "django-oauth2-provider", # Because now it's called edx-django-oauth2-provider. + "edx-oauth2-provider", # Because it moved from github to pypi ] @@ -203,7 +204,6 @@ def uninstall_python_packages(): # Uninstall the pacakge sh("pip uninstall --disable-pip-version-check -y {}".format(package_name)) uninstalled = True - if not uninstalled: break else: diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index 40922a04e3..acfe863fa4 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -23,6 +23,7 @@ django-mako==0.1.5pre django-model-utils==2.3.1 django-mptt==0.7.4 django-oauth-plus==2.2.8 +django-oauth-toolkit==0.10.0 django-sekizai==0.8.2 django-ses==0.7.0 django-simple-history==1.6.3 @@ -35,10 +36,10 @@ git+https://github.com/edx/django-rest-framework.git@3c72cb5ee5baebc432894737119 django==1.8.11 djangorestframework-jwt==1.7.2 djangorestframework-oauth==1.1.0 -edx-django-oauth2-provider==0.5.0 edx-lint==0.4.3 edx-management-commands==0.0.1 -edx-oauth2-provider==0.5.9 +edx-django-oauth2-provider==1.0.1 +edx-oauth2-provider==1.0.0 edx-opaque-keys==0.2.1 edx-organizations==0.4.0 edx-rest-api-client==1.2.1