Merge pull request #11754 from edx/rc/2016-03-08
Release Candidate rc/2016-03-08
This commit is contained in:
@@ -55,9 +55,9 @@ def see_a_multi_step_component(step, category):
|
||||
if category == 'HTML':
|
||||
html_matcher = {
|
||||
'Text': '\n \n',
|
||||
'Announcement': '<h3>Announcement Date</h3>',
|
||||
'Zooming Image Tool': '<h3>Zooming Image Tool</h3>',
|
||||
'E-text Written in LaTeX': '<h3>Example: E-text page</h3>',
|
||||
'Announcement': '<h3 class="hd hd-2">Announcement Date</h3>',
|
||||
'Zooming Image Tool': '<h3 class="hd hd-2">Zooming Image Tool</h3>',
|
||||
'E-text Written in LaTeX': '<h3 class="hd hd-2">Example: E-text page</h3>',
|
||||
'Raw HTML': '<p>This template is similar to the Text template. The only difference is',
|
||||
}
|
||||
actual_html = world.css_html(selector, index=idx)
|
||||
|
||||
@@ -125,6 +125,9 @@ def my_display_name_change_is_persisted_on_save(step):
|
||||
|
||||
@step('the problem display name is "(.*)"$')
|
||||
def verify_problem_display_name(step, name):
|
||||
"""
|
||||
name is uppercased because the heading styles are uppercase in css
|
||||
"""
|
||||
assert_equal(name, world.browser.find_by_css('.problem-header').text)
|
||||
|
||||
|
||||
|
||||
@@ -1,72 +0,0 @@
|
||||
"""
|
||||
Script for converting a tar.gz file representing an exported course
|
||||
to the archive format used by a different version of export.
|
||||
|
||||
Sample invocation: ./manage.py export_convert_format mycourse.tar.gz ~/newformat/
|
||||
"""
|
||||
import os
|
||||
from path import Path as path
|
||||
from django.core.management.base import BaseCommand, CommandError
|
||||
from django.conf import settings
|
||||
|
||||
from tempfile import mkdtemp
|
||||
import tarfile
|
||||
import shutil
|
||||
from openedx.core.lib.extract_tar import safetar_extractall
|
||||
|
||||
from xmodule.modulestore.xml_exporter import convert_between_versions
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
"""
|
||||
Convert between export formats.
|
||||
"""
|
||||
help = 'Convert between versions 0 and 1 of the course export format'
|
||||
args = '<tar.gz archive file> <output path>'
|
||||
|
||||
def handle(self, *args, **options):
|
||||
"Execute the command"
|
||||
if len(args) != 2:
|
||||
raise CommandError("export requires two arguments: <tar.gz file> <output path>")
|
||||
|
||||
source_archive = args[0]
|
||||
output_path = args[1]
|
||||
|
||||
# Create temp directories to extract the source and create the target archive.
|
||||
temp_source_dir = mkdtemp(dir=settings.DATA_DIR)
|
||||
temp_target_dir = mkdtemp(dir=settings.DATA_DIR)
|
||||
try:
|
||||
extract_source(source_archive, temp_source_dir)
|
||||
|
||||
desired_version = convert_between_versions(temp_source_dir, temp_target_dir)
|
||||
|
||||
# New zip up the target directory.
|
||||
parts = os.path.basename(source_archive).split('.')
|
||||
archive_name = path(output_path) / "{source_name}_version_{desired_version}.tar.gz".format(
|
||||
source_name=parts[0], desired_version=desired_version
|
||||
)
|
||||
with open(archive_name, "w"):
|
||||
tar_file = tarfile.open(archive_name, mode='w:gz')
|
||||
try:
|
||||
for item in os.listdir(temp_target_dir):
|
||||
tar_file.add(path(temp_target_dir) / item, arcname=item)
|
||||
|
||||
finally:
|
||||
tar_file.close()
|
||||
|
||||
print "Created archive {0}".format(archive_name)
|
||||
|
||||
except ValueError as err:
|
||||
raise CommandError(err)
|
||||
|
||||
finally:
|
||||
shutil.rmtree(temp_source_dir)
|
||||
shutil.rmtree(temp_target_dir)
|
||||
|
||||
|
||||
def extract_source(source_archive, target):
|
||||
"""
|
||||
Extract the archive into the given target directory.
|
||||
"""
|
||||
with tarfile.open(source_archive) as tar_file:
|
||||
safetar_extractall(tar_file, target)
|
||||
@@ -1,65 +0,0 @@
|
||||
"""
|
||||
Test for export_convert_format.
|
||||
"""
|
||||
from unittest import TestCase
|
||||
from django.core.management import call_command, CommandError
|
||||
from django.conf import settings
|
||||
from tempfile import mkdtemp
|
||||
import shutil
|
||||
from path import Path as path
|
||||
from contentstore.management.commands.export_convert_format import Command, extract_source
|
||||
from xmodule.tests.helpers import directories_equal
|
||||
|
||||
|
||||
class ConvertExportFormat(TestCase):
|
||||
"""
|
||||
Tests converting between export formats.
|
||||
"""
|
||||
def setUp(self):
|
||||
""" Common setup. """
|
||||
super(ConvertExportFormat, self).setUp()
|
||||
|
||||
self.temp_dir = mkdtemp(dir=settings.DATA_DIR)
|
||||
self.addCleanup(shutil.rmtree, self.temp_dir)
|
||||
self.data_dir = path(__file__).realpath().parent / 'data'
|
||||
self.version0 = self.data_dir / "Version0_drafts.tar.gz"
|
||||
self.version1 = self.data_dir / "Version1_drafts.tar.gz"
|
||||
|
||||
self.command = Command()
|
||||
|
||||
def test_no_args(self):
|
||||
""" Test error condition of no arguments. """
|
||||
errstring = "export requires two arguments"
|
||||
with self.assertRaisesRegexp(CommandError, errstring):
|
||||
self.command.handle()
|
||||
|
||||
def test_version1_archive(self):
|
||||
"""
|
||||
Smoke test for creating a version 1 archive from a version 0.
|
||||
"""
|
||||
call_command('export_convert_format', self.version0, self.temp_dir)
|
||||
output = path(self.temp_dir) / 'Version0_drafts_version_1.tar.gz'
|
||||
self.assertTrue(self._verify_archive_equality(output, self.version1))
|
||||
|
||||
def test_version0_archive(self):
|
||||
"""
|
||||
Smoke test for creating a version 0 archive from a version 1.
|
||||
"""
|
||||
call_command('export_convert_format', self.version1, self.temp_dir)
|
||||
output = path(self.temp_dir) / 'Version1_drafts_version_0.tar.gz'
|
||||
self.assertTrue(self._verify_archive_equality(output, self.version0))
|
||||
|
||||
def _verify_archive_equality(self, file1, file2):
|
||||
"""
|
||||
Helper function for determining if 2 archives are equal.
|
||||
"""
|
||||
temp_dir_1 = mkdtemp(dir=settings.DATA_DIR)
|
||||
temp_dir_2 = mkdtemp(dir=settings.DATA_DIR)
|
||||
try:
|
||||
extract_source(file1, temp_dir_1)
|
||||
extract_source(file2, temp_dir_2)
|
||||
return directories_equal(temp_dir_1, temp_dir_2)
|
||||
|
||||
finally:
|
||||
shutil.rmtree(temp_dir_1)
|
||||
shutil.rmtree(temp_dir_2)
|
||||
@@ -8,6 +8,7 @@ from chrono import Timer
|
||||
from mock import patch, Mock
|
||||
import ddt
|
||||
|
||||
from django.conf import settings
|
||||
from django.test import RequestFactory
|
||||
from django.test.client import Client
|
||||
|
||||
@@ -28,8 +29,9 @@ from opaque_keys.edx.locations import CourseLocator
|
||||
from xmodule.error_module import ErrorDescriptor
|
||||
from course_action_state.models import CourseRerunState
|
||||
|
||||
TOTAL_COURSES_COUNT = 500
|
||||
USER_COURSES_COUNT = 50
|
||||
|
||||
TOTAL_COURSES_COUNT = 10
|
||||
USER_COURSES_COUNT = 1
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
@@ -99,6 +101,15 @@ class TestCourseListing(ModuleStoreTestCase, XssTestMixin):
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assert_no_xss(response, escaping_content)
|
||||
|
||||
def test_empty_course_listing(self):
|
||||
"""
|
||||
Test on empty course listing, studio name is properly displayed
|
||||
"""
|
||||
message = "Are you staff on an existing {studio_name} course?".format(studio_name=settings.STUDIO_SHORT_NAME)
|
||||
response = self.client.get('/home')
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertIn(message, response.content)
|
||||
|
||||
def test_get_course_list(self):
|
||||
"""
|
||||
Test getting courses with new access group format e.g. 'instructor_edx.course.run'
|
||||
@@ -147,8 +158,8 @@ class TestCourseListing(ModuleStoreTestCase, XssTestMixin):
|
||||
self.assertEqual(courses_list_by_groups, [])
|
||||
|
||||
@ddt.data(
|
||||
(ModuleStoreEnum.Type.split, 5),
|
||||
(ModuleStoreEnum.Type.mongo, 3)
|
||||
(ModuleStoreEnum.Type.split, 3),
|
||||
(ModuleStoreEnum.Type.mongo, 2)
|
||||
)
|
||||
@ddt.unpack
|
||||
def test_staff_course_listing(self, default_store, mongo_calls):
|
||||
@@ -255,8 +266,8 @@ class TestCourseListing(ModuleStoreTestCase, XssTestMixin):
|
||||
)
|
||||
|
||||
@ddt.data(
|
||||
(ModuleStoreEnum.Type.split, 150, 505),
|
||||
(ModuleStoreEnum.Type.mongo, USER_COURSES_COUNT, 3)
|
||||
(ModuleStoreEnum.Type.split, 3, 13),
|
||||
(ModuleStoreEnum.Type.mongo, USER_COURSES_COUNT, 2)
|
||||
)
|
||||
@ddt.unpack
|
||||
def test_course_listing_performance(self, store, courses_list_from_group_calls, courses_list_calls):
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
Unit tests for course import and export
|
||||
"""
|
||||
import copy
|
||||
import ddt
|
||||
import json
|
||||
import logging
|
||||
import lxml
|
||||
@@ -15,20 +16,24 @@ from uuid import uuid4
|
||||
from django.test.utils import override_settings
|
||||
from django.conf import settings
|
||||
from xmodule.contentstore.django import contentstore
|
||||
from xmodule.modulestore.django import modulestore
|
||||
from xmodule.modulestore.xml_exporter import export_library_to_xml
|
||||
from xmodule.modulestore.xml_importer import import_library_from_xml
|
||||
from xmodule.modulestore import LIBRARY_ROOT
|
||||
from xmodule.modulestore import LIBRARY_ROOT, ModuleStoreEnum
|
||||
from contentstore.utils import reverse_course_url
|
||||
from contentstore.tests.utils import CourseTestCase
|
||||
|
||||
from xmodule.modulestore.tests.factories import ItemFactory, LibraryFactory
|
||||
from xmodule.modulestore.tests.utils import (
|
||||
MongoContentstoreBuilder, SPLIT_MODULESTORE_SETUP, TEST_DATA_DIR
|
||||
)
|
||||
from opaque_keys.edx.locator import LibraryLocator
|
||||
|
||||
from contentstore.tests.utils import CourseTestCase
|
||||
from openedx.core.lib.extract_tar import safetar_extractall
|
||||
from student import auth
|
||||
from student.roles import CourseInstructorRole, CourseStaffRole
|
||||
from models.settings.course_metadata import CourseMetadata
|
||||
from util import milestones_helpers
|
||||
from xmodule.modulestore.django import modulestore
|
||||
from milestones.tests.utils import MilestonesTestCaseMixin
|
||||
|
||||
TEST_DATA_CONTENTSTORE = copy.deepcopy(settings.CONTENTSTORE)
|
||||
@@ -123,6 +128,7 @@ class ImportEntranceExamTestCase(CourseTestCase, MilestonesTestCaseMixin):
|
||||
self.assertEquals(course.entrance_exam_minimum_score_pct, 0.7)
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
@override_settings(CONTENTSTORE=TEST_DATA_CONTENTSTORE)
|
||||
class ImportTestCase(CourseTestCase):
|
||||
"""
|
||||
@@ -435,6 +441,73 @@ class ImportTestCase(CourseTestCase):
|
||||
self.assertIn(test_block3.url_name, children)
|
||||
self.assertIn(test_block4.url_name, children)
|
||||
|
||||
@ddt.data(
|
||||
ModuleStoreEnum.Branch.draft_preferred,
|
||||
ModuleStoreEnum.Branch.published_only,
|
||||
)
|
||||
def test_library_import_branch_settings(self, branch_setting):
|
||||
"""
|
||||
Try importing a known good library archive under either branch setting.
|
||||
The branch setting should have no effect on library import.
|
||||
"""
|
||||
with self.store.branch_setting(branch_setting):
|
||||
library = LibraryFactory.create(modulestore=self.store)
|
||||
lib_key = library.location.library_key
|
||||
extract_dir = path(tempfile.mkdtemp(dir=settings.DATA_DIR))
|
||||
# the extract_dir needs to be passed as a relative dir to
|
||||
# import_library_from_xml
|
||||
extract_dir_relative = path.relpath(extract_dir, settings.DATA_DIR)
|
||||
|
||||
try:
|
||||
with tarfile.open(path(TEST_DATA_DIR) / 'imports' / 'library.HhJfPD.tar.gz') as tar:
|
||||
safetar_extractall(tar, extract_dir)
|
||||
import_library_from_xml(
|
||||
self.store,
|
||||
self.user.id,
|
||||
settings.GITHUB_REPO_ROOT,
|
||||
[extract_dir_relative / 'library'],
|
||||
load_error_modules=False,
|
||||
static_content_store=contentstore(),
|
||||
target_id=lib_key
|
||||
)
|
||||
finally:
|
||||
shutil.rmtree(extract_dir)
|
||||
|
||||
@ddt.data(
|
||||
ModuleStoreEnum.Branch.draft_preferred,
|
||||
ModuleStoreEnum.Branch.published_only,
|
||||
)
|
||||
def test_library_import_branch_settings_again(self, branch_setting):
|
||||
# Construct the contentstore for storing the import
|
||||
with MongoContentstoreBuilder().build() as source_content:
|
||||
# Construct the modulestore for storing the import (using the previously created contentstore)
|
||||
with SPLIT_MODULESTORE_SETUP.build(contentstore=source_content) as source_store:
|
||||
# Use the test branch setting.
|
||||
with source_store.branch_setting(branch_setting):
|
||||
source_library_key = LibraryLocator(org='TestOrg', library='TestProbs')
|
||||
|
||||
extract_dir = path(tempfile.mkdtemp(dir=settings.DATA_DIR))
|
||||
# the extract_dir needs to be passed as a relative dir to
|
||||
# import_library_from_xml
|
||||
extract_dir_relative = path.relpath(extract_dir, settings.DATA_DIR)
|
||||
|
||||
try:
|
||||
with tarfile.open(path(TEST_DATA_DIR) / 'imports' / 'library.HhJfPD.tar.gz') as tar:
|
||||
safetar_extractall(tar, extract_dir)
|
||||
import_library_from_xml(
|
||||
source_store,
|
||||
self.user.id,
|
||||
settings.GITHUB_REPO_ROOT,
|
||||
[extract_dir_relative / 'library'],
|
||||
static_content_store=source_content,
|
||||
target_id=source_library_key,
|
||||
load_error_modules=False,
|
||||
raise_on_failure=True,
|
||||
create_if_not_present=True,
|
||||
)
|
||||
finally:
|
||||
shutil.rmtree(extract_dir)
|
||||
|
||||
|
||||
@override_settings(CONTENTSTORE=TEST_DATA_CONTENTSTORE)
|
||||
class ExportTestCase(CourseTestCase):
|
||||
@@ -556,3 +629,59 @@ class ExportTestCase(CourseTestCase):
|
||||
)
|
||||
|
||||
self.test_export_targz_urlparam()
|
||||
|
||||
|
||||
@override_settings(CONTENTSTORE=TEST_DATA_CONTENTSTORE)
|
||||
class TestLibraryImportExport(CourseTestCase):
|
||||
"""
|
||||
Tests for importing content libraries from XML and exporting them to XML.
|
||||
"""
|
||||
def setUp(self):
|
||||
super(TestLibraryImportExport, self).setUp()
|
||||
self.export_dir = tempfile.mkdtemp()
|
||||
self.addCleanup(shutil.rmtree, self.export_dir, ignore_errors=True)
|
||||
|
||||
def test_content_library_export_import(self):
|
||||
library1 = LibraryFactory.create(modulestore=self.store)
|
||||
source_library1_key = library1.location.library_key
|
||||
library2 = LibraryFactory.create(modulestore=self.store)
|
||||
source_library2_key = library2.location.library_key
|
||||
|
||||
import_library_from_xml(
|
||||
self.store,
|
||||
'test_user',
|
||||
TEST_DATA_DIR,
|
||||
['library_empty_problem'],
|
||||
static_content_store=contentstore(),
|
||||
target_id=source_library1_key,
|
||||
load_error_modules=False,
|
||||
raise_on_failure=True,
|
||||
create_if_not_present=True,
|
||||
)
|
||||
|
||||
export_library_to_xml(
|
||||
self.store,
|
||||
contentstore(),
|
||||
source_library1_key,
|
||||
self.export_dir,
|
||||
'exported_source_library',
|
||||
)
|
||||
|
||||
source_library = self.store.get_library(source_library1_key)
|
||||
self.assertEqual(source_library.url_name, 'library')
|
||||
|
||||
# Import the exported library into a different content library.
|
||||
import_library_from_xml(
|
||||
self.store,
|
||||
'test_user',
|
||||
self.export_dir,
|
||||
['exported_source_library'],
|
||||
static_content_store=contentstore(),
|
||||
target_id=source_library2_key,
|
||||
load_error_modules=False,
|
||||
raise_on_failure=True,
|
||||
create_if_not_present=True,
|
||||
)
|
||||
|
||||
# Compare the two content libraries for equality.
|
||||
self.assertCoursesEqual(source_library1_key, source_library2_key)
|
||||
|
||||
@@ -10,7 +10,7 @@ from provider.constants import CONFIDENTIAL
|
||||
|
||||
from openedx.core.djangoapps.programs.models import ProgramsApiConfig
|
||||
from openedx.core.djangoapps.programs.tests.mixins import ProgramsApiConfigMixin, ProgramsDataMixin
|
||||
from openedx.core.djangolib.markup import escape
|
||||
from openedx.core.djangolib.markup import Text
|
||||
from student.tests.factories import UserFactory
|
||||
from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase
|
||||
|
||||
@@ -64,7 +64,7 @@ class TestProgramListing(ProgramsApiConfigMixin, ProgramsDataMixin, SharedModule
|
||||
self.mock_programs_api(data={'results': []})
|
||||
|
||||
response = self.client.get(self.studio_home)
|
||||
self.assertIn(escape("You haven't created any programs yet."), response.content)
|
||||
self.assertIn(Text("You haven't created any programs yet."), response.content)
|
||||
|
||||
# When data is provided, expect a program listing.
|
||||
self.mock_programs_api()
|
||||
|
||||
@@ -80,6 +80,14 @@ DATABASES = {
|
||||
'timeout': 30,
|
||||
},
|
||||
'ATOMIC_REQUESTS': True,
|
||||
},
|
||||
'student_module_history': {
|
||||
'ENGINE': 'django.db.backends.sqlite3',
|
||||
'NAME': TEST_ROOT / "db" / "test_student_module_history.db",
|
||||
'TEST_NAME': TEST_ROOT / "db" / "test_student_module_history.db",
|
||||
'OPTIONS': {
|
||||
'timeout': 30,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -274,12 +274,6 @@ else:
|
||||
|
||||
DATABASES = AUTH_TOKENS['DATABASES']
|
||||
|
||||
# Enable automatic transaction management on all databases
|
||||
# https://docs.djangoproject.com/en/1.8/topics/db/transactions/#tying-transactions-to-http-requests
|
||||
# This needs to be true for all databases
|
||||
for database_name in DATABASES:
|
||||
DATABASES[database_name]['ATOMIC_REQUESTS'] = True
|
||||
|
||||
MODULESTORE = convert_module_store_setting_if_needed(AUTH_TOKENS.get('MODULESTORE', MODULESTORE))
|
||||
CONTENTSTORE = AUTH_TOKENS['CONTENTSTORE']
|
||||
DOC_STORE_CONFIG = AUTH_TOKENS['DOC_STORE_CONFIG']
|
||||
|
||||
@@ -13,18 +13,27 @@ from .aws import *
|
||||
import os
|
||||
from django.core.exceptions import ImproperlyConfigured
|
||||
|
||||
DB_OVERRIDES = dict(
|
||||
PASSWORD=os.environ.get('DB_MIGRATION_PASS', None),
|
||||
ENGINE=os.environ.get('DB_MIGRATION_ENGINE', DATABASES['default']['ENGINE']),
|
||||
USER=os.environ.get('DB_MIGRATION_USER', DATABASES['default']['USER']),
|
||||
NAME=os.environ.get('DB_MIGRATION_NAME', DATABASES['default']['NAME']),
|
||||
HOST=os.environ.get('DB_MIGRATION_HOST', DATABASES['default']['HOST']),
|
||||
PORT=os.environ.get('DB_MIGRATION_PORT', DATABASES['default']['PORT']),
|
||||
)
|
||||
|
||||
if DB_OVERRIDES['PASSWORD'] is None:
|
||||
raise ImproperlyConfigured("No database password was provided for running "
|
||||
"migrations. This is fatal.")
|
||||
def get_db_overrides(db_name):
|
||||
"""
|
||||
Now that we have multiple databases, we want to look up from the environment
|
||||
for both databases.
|
||||
"""
|
||||
db_overrides = dict(
|
||||
PASSWORD=os.environ.get('DB_MIGRATION_PASS', None),
|
||||
ENGINE=os.environ.get('DB_MIGRATION_ENGINE', DATABASES[db_name]['ENGINE']),
|
||||
USER=os.environ.get('DB_MIGRATION_USER', DATABASES[db_name]['USER']),
|
||||
NAME=os.environ.get('DB_MIGRATION_NAME', DATABASES[db_name]['NAME']),
|
||||
HOST=os.environ.get('DB_MIGRATION_HOST', DATABASES[db_name]['HOST']),
|
||||
PORT=os.environ.get('DB_MIGRATION_PORT', DATABASES[db_name]['PORT']),
|
||||
)
|
||||
|
||||
for override, value in DB_OVERRIDES.iteritems():
|
||||
DATABASES['default'][override] = value
|
||||
if db_overrides['PASSWORD'] is None:
|
||||
raise ImproperlyConfigured("No database password was provided for running "
|
||||
"migrations. This is fatal.")
|
||||
return db_overrides
|
||||
|
||||
for db in DATABASES:
|
||||
# You never migrate a read_replica
|
||||
if db != 'read_replica':
|
||||
DATABASES[db].update(get_db_overrides(db))
|
||||
|
||||
@@ -30,6 +30,14 @@
|
||||
"PASSWORD": "",
|
||||
"PORT": "3306",
|
||||
"USER": "root"
|
||||
},
|
||||
"student_module_history": {
|
||||
"ENGINE": "django.db.backends.mysql",
|
||||
"HOST": "localhost",
|
||||
"NAME": "student_module_history_test",
|
||||
"PASSWORD": "",
|
||||
"PORT": "3306",
|
||||
"USER": "root"
|
||||
}
|
||||
},
|
||||
"DOC_STORE_CONFIG": {
|
||||
|
||||
@@ -1114,6 +1114,11 @@ PROCTORING_BACKEND_PROVIDER = {
|
||||
}
|
||||
PROCTORING_SETTINGS = {}
|
||||
|
||||
############################ Global Database Configuration #####################
|
||||
|
||||
DATABASE_ROUTERS = [
|
||||
'openedx.core.lib.django_courseware_routers.StudentModuleHistoryExtendedRouter',
|
||||
]
|
||||
|
||||
############################ OAUTH2 Provider ###################################
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@ import os
|
||||
from path import Path as path
|
||||
from warnings import filterwarnings, simplefilter
|
||||
from uuid import uuid4
|
||||
from util.db import NoOpMigrationModules
|
||||
|
||||
# import settings from LMS for consistent behavior with CMS
|
||||
# pylint: disable=unused-import
|
||||
@@ -42,7 +43,7 @@ MONGO_HOST = os.environ.get('EDXAPP_TEST_MONGO_HOST', 'localhost')
|
||||
THIS_UUID = uuid4().hex[:5]
|
||||
|
||||
# Nose Test Runner
|
||||
TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
|
||||
TEST_RUNNER = 'openedx.core.djangolib.nose.NoseTestSuiteRunner'
|
||||
|
||||
_SYSTEM = 'cms'
|
||||
|
||||
@@ -129,9 +130,10 @@ DATABASES = {
|
||||
},
|
||||
}
|
||||
|
||||
# This hack disables migrations during tests. We want to create tables directly from the models for speed.
|
||||
# See https://groups.google.com/d/msg/django-developers/PWPj3etj3-U/kCl6pMsQYYoJ.
|
||||
MIGRATION_MODULES = {app: "app.migrations_not_used_in_tests" for app in INSTALLED_APPS}
|
||||
if os.environ.get('DISABLE_MIGRATIONS'):
|
||||
# Create tables directly from apps' models. This can be removed once we upgrade
|
||||
# to Django 1.9, which allows setting MIGRATION_MODULES to None in order to skip migrations.
|
||||
MIGRATION_MODULES = NoOpMigrationModules()
|
||||
|
||||
LMS_BASE = "localhost:8000"
|
||||
FEATURES['PREVIEW_LMS_BASE'] = "preview"
|
||||
|
||||
@@ -9,7 +9,11 @@ settings.INSTALLED_APPS # pylint: disable=pointless-statement
|
||||
|
||||
from openedx.core.lib.django_startup import autostartup
|
||||
import django
|
||||
from monkey_patch import third_party_auth
|
||||
from monkey_patch import (
|
||||
third_party_auth,
|
||||
django_db_models_options,
|
||||
django_utils_http_is_safe_url
|
||||
)
|
||||
|
||||
import xmodule.x_module
|
||||
import cms.lib.xblock.runtime
|
||||
@@ -22,6 +26,8 @@ def run():
|
||||
Executed during django startup
|
||||
"""
|
||||
third_party_auth.patch()
|
||||
django_db_models_options.patch()
|
||||
django_utils_http_is_safe_url.patch()
|
||||
|
||||
# Comprehensive theming needs to be set up before django startup,
|
||||
# because modifying django template paths after startup has no effect.
|
||||
|
||||
@@ -230,7 +230,7 @@
|
||||
"Adding the selected course to your cart": "\u041f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0430\u043c\u0438 \u043a\u0443\u0440\u0441\u0430 \u0432 \u043a\u043e\u0440\u0437\u0438\u043d\u0443",
|
||||
"Additional Information (optional)": "\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f (\u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f)",
|
||||
"Admin": "\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440",
|
||||
"Advanced": "\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0437\u0430\u0434\u0430\u043d\u0438\u0439",
|
||||
"Advanced": "\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e",
|
||||
"Align center": "\u041f\u043e \u0446\u0435\u043d\u0442\u0440\u0443",
|
||||
"Align left": "\u041f\u043e \u043b\u0435\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e",
|
||||
"Align right": "\u041f\u043e \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e",
|
||||
@@ -479,7 +479,7 @@
|
||||
"Course": "\u041a\u0443\u0440\u0441",
|
||||
"Course Credit Requirements": "\u0422\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0437\u0430\u0447\u0451\u0442\u0430 \u043d\u0430 \u043a\u0443\u0440\u0441\u0435",
|
||||
"Course End": "\u041a\u0443\u0440\u0441 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f",
|
||||
"Course Handouts": "\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u043f\u043e \u043a\u0443\u0440\u0441\u0443",
|
||||
"Course Handouts": "\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b",
|
||||
"Course ID": "\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043a\u0443\u0440\u0441\u0430",
|
||||
"Course Index": "\u041f\u043e\u0438\u0441\u043a\u043e\u0432\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u0443\u0440\u0441\u0430",
|
||||
"Course Key": "\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043a\u0443\u0440\u0441\u0430",
|
||||
@@ -610,8 +610,8 @@
|
||||
"Editor": "\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440",
|
||||
"Education Completed": "\u0417\u0430\u043a\u043e\u043d\u0447\u0435\u043d\u043d\u043e\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435",
|
||||
"Email": "\u042d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0430\u044f \u043f\u043e\u0447\u0442\u0430",
|
||||
"Email Address": "\u0410\u0434\u0440\u0435\u0441 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b",
|
||||
"Email address": "\u0410\u0434\u0440\u0435\u0441 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b",
|
||||
"Email Address": "E-mail \u0430\u0434\u0440\u0435\u0441",
|
||||
"Email address": "E-mail \u0430\u0434\u0440\u0435\u0441",
|
||||
"Emails successfully sent. The following users are no longer enrolled in the course:": "\u042d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b. \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u043d\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043d\u0430 \u043a\u0443\u0440\u0441\u0435:",
|
||||
"Embed": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c",
|
||||
"Emoticons": "\u0421\u043c\u0430\u0439\u043b\u044b",
|
||||
@@ -891,8 +891,8 @@
|
||||
"Load more": "\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0435\u0449\u0451",
|
||||
"Load next %(numResponses)s responses": "\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 %(numResponses)s \u043e\u0442\u0432\u0435\u0442\u043e\u0432",
|
||||
"Load next %(num_items)s result": [
|
||||
"\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 %(num_items)s \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442",
|
||||
"\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 %(num_items)s \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b",
|
||||
"\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c %(num_items)s \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442",
|
||||
"\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 %(num_items)s \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430",
|
||||
"",
|
||||
"\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 %(num_items)s \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b"
|
||||
],
|
||||
@@ -1291,12 +1291,12 @@
|
||||
"Start regenerating certificates for students in this course?": "\u041d\u0430\u0447\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0434\u043b\u044f \u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u0435\u0439 \u043a\u0443\u0440\u0441\u0430?",
|
||||
"Start search": "\u041d\u0430\u0447\u0430\u0442\u044c \u043f\u043e\u0438\u0441\u043a",
|
||||
"Started entrance exam rescore task for student '{student_id}'. Click the 'Show Background Task History for Student' button to see the status of the task.": "\u0417\u0430\u043f\u0443\u0449\u0435\u043d\u0430 \u043f\u0435\u0440\u0435\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0441\u0442\u0443\u043f\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u044f \u0434\u043b\u044f '{student_id}'. \u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443 \u00ab\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0444\u043e\u043d\u043e\u0432\u044b\u0445 \u0437\u0430\u0434\u0430\u0447\u00bb, \u0447\u0442\u043e\u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u0434\u0430\u0447\u0438.",
|
||||
"Started rescore problem task for problem '<%= problem_id %>' and student '<%= student_id %>'. Click the 'Show Background Task History for Student' button to see the status of the task.": "\u0417\u0430\u043f\u0443\u0449\u0435\u043d\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0439 \u043e\u0446\u0435\u043d\u043a\u0438 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f '<%= problem_id %>' \u0434\u043b\u044f '<%= student_id %>'. \u0427\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u0449\u0451\u043b\u043a\u043d\u0438\u0442\u0435 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0435 '\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0444\u043e\u043d\u043e\u0432\u044b\u0445 \u0437\u0430\u0434\u0430\u0447'.",
|
||||
"Started rescore problem task for problem '<%= problem_id %>' and student '<%= student_id %>'. Click the 'Show Background Task History for Student' button to see the status of the task.": "\u0417\u0430\u043f\u0443\u0449\u0435\u043d\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0439 \u043e\u0446\u0435\u043d\u043a\u0438 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f '<%= problem_id %>' \u0434\u043b\u044f '<%= student_id %>'. \u0427\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u0449\u0451\u043b\u043a\u043d\u0438\u0442\u0435 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0435 \u00ab\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0444\u043e\u043d\u043e\u0432\u044b\u0445 \u0437\u0430\u0434\u0430\u0447\u00bb.",
|
||||
"Starts": "\u041d\u0430\u0447\u0430\u043b\u043e",
|
||||
"Starts: %(start)s": "\u041d\u0430\u0447\u0430\u043b\u043e: %(start)s",
|
||||
"Starts: %(start_date)s": "\u041d\u0430\u0447\u0430\u043b\u043e: %(start_date)s",
|
||||
"State": "\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435",
|
||||
"Status": "\u0421\u0442\u0430\u0442\u0443\u0441",
|
||||
"Status": "\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435",
|
||||
"Status: unsubmitted": "\u0421\u0442\u0430\u0442\u0443\u0441: \u043d\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043e",
|
||||
"Strikethrough": "\u0417\u0430\u0447\u0451\u0440\u043a\u043d\u0443\u0442\u044b\u0439",
|
||||
"Student": "\u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439\u0441\u044f",
|
||||
@@ -1323,8 +1323,8 @@
|
||||
"Successfully reset the attempts for user {user}": "\u0423\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u0431\u0440\u043e\u0448\u0435\u043d\u044b \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f: {user}",
|
||||
"Successfully sent enrollment emails to the following users. They will be allowed to enroll once they register:": "\u0423\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c. \u041e\u043d\u0438 \u0441\u043c\u043e\u0433\u0443\u0442 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0437\u0434\u0430\u0434\u0443\u0442 \u0441\u0432\u043e\u0438 \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438:",
|
||||
"Successfully sent enrollment emails to the following users. They will be enrolled once they register:": "\u0423\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c: \u041e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0437\u0434\u0430\u0434\u0443\u0442 \u0441\u0432\u043e\u0438 \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438.",
|
||||
"Successfully started task to rescore problem '<%= problem_id %>' for all students. Click the 'Show Background Task History for Problem' button to see the status of the task.": "\u0423\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u043f\u0435\u0440\u0435\u043e\u0446\u0435\u043d\u043a\u0438 \u0437\u0430\u0434\u0430\u043d\u0438\u044f '<%= problem_id %>' \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u0435\u0439. \u041d\u0430\u0436\u043c\u0438\u0442\u0435 '\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0444\u043e\u043d\u043e\u0432\u044b\u0445 \u0437\u0430\u0434\u0430\u0447' \u0447\u0442\u043e\u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u0434\u0430\u0447\u0438.",
|
||||
"Successfully started task to reset attempts for problem '<%= problem_id %>'. Click the 'Show Background Task History for Problem' button to see the status of the task.": "\u0417\u0430\u0434\u0430\u0447\u0430 \u043f\u043e \u0441\u0431\u0440\u043e\u0441\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u043e\u043f\u044b\u0442\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f '<%= problem_id %>' \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e. \u0427\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f, \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \u00ab\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0444\u043e\u043d\u043e\u0432\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f\u00bb.",
|
||||
"Successfully started task to rescore problem '<%= problem_id %>' for all students. Click the 'Show Background Task History for Problem' button to see the status of the task.": "\u0423\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u043f\u0435\u0440\u0435\u043e\u0446\u0435\u043d\u043a\u0438 \u0437\u0430\u0434\u0430\u043d\u0438\u044f '<%= problem_id %>' \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u0435\u0439. \u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u00ab\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0444\u043e\u043d\u043e\u0432\u044b\u0445 \u0437\u0430\u0434\u0430\u0447\u00bb \u0447\u0442\u043e\u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u0434\u0430\u0447\u0438.",
|
||||
"Successfully started task to reset attempts for problem '<%= problem_id %>'. Click the 'Show Background Task History for Problem' button to see the status of the task.": "\u0417\u0430\u0434\u0430\u0447\u0430 \u043f\u043e \u0441\u0431\u0440\u043e\u0441\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u043e\u043f\u044b\u0442\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f '<%= problem_id %>' \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e. \u0427\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f, \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \u00ab\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0444\u043e\u043d\u043e\u0432\u044b\u0445 \u0437\u0430\u0434\u0430\u0447\u00bb.",
|
||||
"Successfully unlinked.": "\u0423\u0434\u0430\u043b\u0435\u043d\u043e.",
|
||||
"Superscript": "\u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u0438\u043d\u0434\u0435\u043a\u0441",
|
||||
"Table": "\u0422\u0430\u0431\u043b\u0438\u0446\u0430",
|
||||
@@ -1399,7 +1399,7 @@
|
||||
"The minimum score percentage must be a whole number between 0 and 100.": "\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043e\u0441\u0432\u043e\u0435\u043d\u0438\u044f \u0432\u044b\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u0430\u0445 \u0438 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0446\u0435\u043b\u044b\u043c \u0447\u0438\u0441\u043b\u043e\u043c \u043c\u0435\u0436\u0434\u0443 0 \u0438 100.",
|
||||
"The name of this signatory as it should appear on certificates.": "\u0418\u043c\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u0435\u043b\u044f \u0432 \u0444\u043e\u0440\u043c\u0435, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0435",
|
||||
"The name that identifies you throughout {platform_name}. You cannot change your username.": "\u0418\u043c\u044f, \u043f\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0432\u0430\u0441 \u0437\u043d\u0430\u044e\u0442 \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 {platform_name}. \u0412\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.",
|
||||
"The name that is used for ID verification and appears on your certificates. Other learners never see your full name. Make sure to enter your name exactly as it appears on your government-issued photo ID, including any non-Roman characters.": "\u0418\u043c\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430\u0445. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0432\u0432\u043e\u0434\u0430 \u0432\u0430\u0448\u0435\u0433\u043e \u0438\u043c\u0435\u043d\u0438. \u041e\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a, \u043a\u0430\u043a \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u0432\u0430\u0448\u0435\u043c \u0443\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u0435\u043d\u0438\u0438 \u043b\u0438\u0447\u043d\u043e\u0441\u0442\u0438.",
|
||||
"The name that is used for ID verification and appears on your certificates. Other learners never see your full name. Make sure to enter your name exactly as it appears on your government-issued photo ID, including any non-Roman characters.": "\u0418\u043c\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430\u0445. \u041e\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a, \u043a\u0430\u043a \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u0432\u0430\u0448\u0435\u043c \u043f\u0430\u0441\u043f\u043e\u0440\u0442\u0435 \u0438\u043b\u0438 \u0443\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u0435\u043d\u0438\u0438 \u043b\u0438\u0447\u043d\u043e\u0441\u0442\u0438.",
|
||||
"The organization that this signatory belongs to, as it should appear on certificates.": "\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043b\u0438\u0446\u043e, \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0432\u0448\u0435\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442.",
|
||||
"The page \"%(route)s\" could not be found.": "\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u00ab%(route)s\u00bb \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.",
|
||||
"The photo of your face matches the photo on your ID.": "\u0424\u043e\u0442\u043e \u0432\u0430\u0448\u0435\u0433\u043e \u043b\u0438\u0446\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0444\u043e\u0442\u043e \u0432 \u0432\u0430\u0448\u0435\u043c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0435.",
|
||||
@@ -1488,7 +1488,7 @@
|
||||
"Timed Transcript from %(filename)s": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u044b \u0438\u0437 %(filename)s",
|
||||
"Tips on taking a successful photo": "\u0421\u043e\u0432\u0435\u0442\u044b: \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0443\u0434\u0430\u0447\u043d\u044b\u0439 \u0441\u043d\u0438\u043c\u043e\u043a",
|
||||
"Title": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a",
|
||||
"Title ": "\u041e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435",
|
||||
"Title ": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a",
|
||||
"Title of the signatory": "\u041e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u0435\u043b\u044e, \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0435\u043c\u0443 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442",
|
||||
"Title:": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a:",
|
||||
"Titles more than 100 characters may prevent students from printing their certificate on a single page.": "\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0434\u043b\u0438\u043d\u043e\u0439 \u0431\u043e\u043b\u0435\u0435 100 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0441\u043f\u0435\u0447\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.",
|
||||
@@ -1860,7 +1860,7 @@
|
||||
"section": "\u0440\u0430\u0437\u0434\u0435\u043b",
|
||||
"section.title": "section.title",
|
||||
"send an email message to {email}": "\u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0435 \u043f\u0438\u0441\u044c\u043c\u043e \u043d\u0430 {email}",
|
||||
"status": "\u0441\u0442\u0430\u0442\u0443\u0441",
|
||||
"status": "c\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435",
|
||||
"strong text": "\u0442\u0435\u043a\u0441\u0442 \u0436\u0438\u0440\u043d\u044b\u043c \u0448\u0440\u0438\u0444\u0442\u043e\u043c",
|
||||
"subsection": "\u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b",
|
||||
"team count": "\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u043c\u0430\u043d\u0434",
|
||||
|
||||
@@ -75,6 +75,7 @@
|
||||
// ====================
|
||||
@import 'xmodule/modules/css/module-styles.scss';
|
||||
@import 'xmodule/descriptors/css/module-styles.scss';
|
||||
@import 'xmodule/headings';
|
||||
@import 'elements/xmodules'; // styling for Studio-specific contexts
|
||||
|
||||
@import 'developer'; // used for any developer-created scss that needs further polish/refactoring
|
||||
|
||||
121
cms/static/sass/xmodule/_headings.scss
Normal file
121
cms/static/sass/xmodule/_headings.scss
Normal file
@@ -0,0 +1,121 @@
|
||||
/*
|
||||
* This comes from the UXPL, and is modified for use.
|
||||
* The UXPL isn't available retroactively, so this shims
|
||||
* the headings from the UXPL with what we're using in
|
||||
* the platform to better sync things up in the meantime.
|
||||
* It is scoped to #seq_content, specifically for xblock.
|
||||
*
|
||||
* Once the UXPl is fitted retroactively, this can be removed.
|
||||
*/
|
||||
|
||||
$headings-count: 8;
|
||||
|
||||
$headings-font-weight-light: 200;
|
||||
$headings-font-weight-normal: 400;
|
||||
$headings-font-weight-bold: 600;
|
||||
$headings-base-font-family: inherit;
|
||||
$headings-base-color: $gray-d2;
|
||||
|
||||
%reset-headings {
|
||||
margin: 0;
|
||||
font-weight: $headings-font-weight-normal;
|
||||
font-size: inherit;
|
||||
line-height: inherit;
|
||||
color: $headings-base-color;
|
||||
}
|
||||
|
||||
%hd-1 {
|
||||
margin-bottom: 1.41575em;
|
||||
font-size: 2em;
|
||||
line-height: 1.4em;
|
||||
}
|
||||
|
||||
|
||||
%hd-2 {
|
||||
margin-bottom: 1em;
|
||||
font-size: 1.5em;
|
||||
font-weight: $headings-font-weight-normal;
|
||||
line-height: 1.4em;
|
||||
}
|
||||
|
||||
|
||||
%hd-3 {
|
||||
margin-bottom: ($baseline / 2);
|
||||
font-size: 1.35em;
|
||||
font-weight: $headings-font-weight-normal;
|
||||
line-height: 1.4em;
|
||||
}
|
||||
|
||||
|
||||
%hd-4 {
|
||||
margin-bottom: ($baseline / 2);
|
||||
font-size: 1.25em;
|
||||
font-weight: $headings-font-weight-bold;
|
||||
line-height: 1.4em;
|
||||
}
|
||||
|
||||
|
||||
%hd-5 {
|
||||
margin-bottom: ($baseline / 2);
|
||||
font-size: 1.1em;
|
||||
font-weight: $headings-font-weight-bold;
|
||||
line-height: 1.4em;
|
||||
}
|
||||
|
||||
|
||||
%hd-6 {
|
||||
margin-bottom: ($baseline / 2);
|
||||
font-size: 1em;
|
||||
font-weight: $headings-font-weight-bold;
|
||||
line-height: 1.4em;
|
||||
}
|
||||
|
||||
%hd-7 {
|
||||
margin-bottom: ($baseline / 4);
|
||||
font-size: 14px;
|
||||
font-weight: $headings-font-weight-bold;
|
||||
text-transform: uppercase;
|
||||
line-height: 1.6em;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
|
||||
%hd-8 {
|
||||
margin-bottom: ($baseline / 8);
|
||||
font-size: 12px;
|
||||
font-weight: $headings-font-weight-bold;
|
||||
text-transform: uppercase;
|
||||
line-height: 1.5em;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
|
||||
.wrapper-xblock .xblock-render .xblock .xblock-render .xblock {
|
||||
|
||||
.hd-1,
|
||||
.hd-2,
|
||||
.hd-3,
|
||||
.hd-4,
|
||||
.hd-5,
|
||||
.hd-6,
|
||||
.hd-7,
|
||||
.hd-8 {
|
||||
@extend %reset-headings;
|
||||
}
|
||||
|
||||
|
||||
// ----------------------------
|
||||
// #CANNED
|
||||
// ----------------------------
|
||||
// canned heading classes
|
||||
@for $i from 1 through $headings-count {
|
||||
.hd-#{$i} {
|
||||
@extend %hd-#{$i};
|
||||
}
|
||||
}
|
||||
|
||||
h3 {
|
||||
@extend %hd-2;
|
||||
font-weight: $headings-font-weight-normal;
|
||||
// override external modules and xblocks that use inline CSS
|
||||
text-transform: initial;
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,8 @@
|
||||
## coding=utf-8
|
||||
<%namespace name='static' file='static_content.html'/>
|
||||
<%!
|
||||
from openedx.core.djangolib.markup import ugettext as _
|
||||
from django.utils.translation import ugettext as _
|
||||
|
||||
from openedx.core.djangolib.js_utils import (
|
||||
dump_js_escaped_json, js_escaped_string
|
||||
)
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
<%page expression_filter="h"/>
|
||||
<%inherit file="base.html" />
|
||||
<%def name="online_help_token()">
|
||||
<%
|
||||
@@ -8,27 +9,30 @@ else:
|
||||
%>
|
||||
</%def>
|
||||
<%!
|
||||
from django.utils.translation import ugettext as _
|
||||
|
||||
from contentstore.views.helpers import xblock_studio_url, xblock_type_display_name
|
||||
from openedx.core.djangolib.js_utils import (
|
||||
dump_js_escaped_json, js_escaped_string
|
||||
)
|
||||
from openedx.core.djangolib.markup import HTML, ugettext as _
|
||||
from openedx.core.djangolib.markup import Text, HTML
|
||||
%>
|
||||
<%block name="title">${xblock.display_name_with_default_escaped} ${xblock_type_display_name(xblock) | h}</%block>
|
||||
|
||||
<%block name="title">${xblock.display_name_with_default} ${xblock_type_display_name(xblock)}</%block>
|
||||
<%block name="bodyclass">is-signedin course container view-container</%block>
|
||||
|
||||
<%namespace name='static' file='static_content.html'/>
|
||||
|
||||
<%block name="header_extras">
|
||||
% for template_name in templates:
|
||||
<script type="text/template" id="${template_name | h}-tpl">
|
||||
<script type="text/template" id="${template_name}-tpl">
|
||||
<%static:include path="js/${template_name}.underscore" />
|
||||
</script>
|
||||
% endfor
|
||||
<script type="text/template" id="image-modal-tpl">
|
||||
<%static:include path="common/templates/image-modal.underscore" />
|
||||
</script>
|
||||
<link rel="stylesheet" type="text/css" href="${static.url('js/vendor/timepicker/jquery.timepicker.css') | h}" />
|
||||
<link rel="stylesheet" type="text/css" href="${static.url('js/vendor/timepicker/jquery.timepicker.css')}" />
|
||||
</%block>
|
||||
|
||||
<%block name="requirejs">
|
||||
@@ -57,15 +61,15 @@ from openedx.core.djangolib.markup import HTML, ugettext as _
|
||||
ancestor_url = xblock_studio_url(ancestor)
|
||||
%>
|
||||
% if ancestor_url:
|
||||
<a href="${ancestor_url | h}" class="navigation-item navigation-link navigation-parent">${ancestor.display_name_with_default_escaped | h}</a>
|
||||
<a href="${ancestor_url}" class="navigation-item navigation-link navigation-parent">${ancestor.display_name_with_default}</a>
|
||||
% else:
|
||||
<span class="navigation-item navigation-parent">${ancestor.display_name_with_default_escaped | h}</span>
|
||||
<span class="navigation-item navigation-parent">${ancestor.display_name_with_default}</span>
|
||||
% endif
|
||||
% endfor
|
||||
</small>
|
||||
<div class="wrapper-xblock-field incontext-editor is-editable"
|
||||
data-field="display_name" data-field-display-name="${_("Display Name")}">
|
||||
<h1 class="page-header-title xblock-field-value incontext-editor-value"><span class="title-value">${xblock.display_name_with_default_escaped | h}</span></h1>
|
||||
<h1 class="page-header-title xblock-field-value incontext-editor-value"><span class="title-value">${xblock.display_name_with_default}</span></h1>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -74,12 +78,12 @@ from openedx.core.djangolib.markup import HTML, ugettext as _
|
||||
<ul>
|
||||
% if is_unit_page:
|
||||
<li class="action-item action-view nav-item">
|
||||
<a href="${published_preview_link | h}" class="button button-view action-button is-disabled" aria-disabled="true" rel="external" title="${_('Open the courseware in the LMS')}">
|
||||
<a href="${published_preview_link}" class="button button-view action-button is-disabled" aria-disabled="true" rel="external" title="${_('Open the courseware in the LMS')}">
|
||||
<span class="action-button-text">${_("View Live Version")}</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="action-item action-preview nav-item">
|
||||
<a href="${draft_preview_link | h}" class="button button-preview action-button" rel="external" title="${_('Preview the courseware in the LMS')}">
|
||||
<a href="${draft_preview_link}" class="button button-preview action-button" rel="external" title="${_('Preview the courseware in the LMS')}">
|
||||
<span class="action-button-text">${_("Preview")}</span>
|
||||
</a>
|
||||
</li>
|
||||
@@ -102,7 +106,7 @@ from openedx.core.djangolib.markup import HTML, ugettext as _
|
||||
|
||||
<article class="content-primary">
|
||||
<div class="container-message wrapper-message"></div>
|
||||
<section class="wrapper-xblock level-page is-hidden studio-xblock-wrapper" data-locator="${xblock_locator | h}" data-course-key="${xblock_locator.course_key | h}">
|
||||
<section class="wrapper-xblock level-page is-hidden studio-xblock-wrapper" data-locator="${xblock_locator}" data-course-key="${xblock_locator.course_key}">
|
||||
</section>
|
||||
<div class="ui-loading">
|
||||
<p><span class="spin"><i class="icon fa fa-refresh"></i></span> <span class="copy">${_("Loading")}</span></p>
|
||||
@@ -112,13 +116,13 @@ from openedx.core.djangolib.markup import HTML, ugettext as _
|
||||
% if xblock.category == 'split_test':
|
||||
<div class="bit">
|
||||
<h3 class="title-3">${_("Adding components")}</h3>
|
||||
<p>${_("Select a component type under {strong_start}Add New Component{strong_end}. Then select a template.").format(
|
||||
<p>${Text(_("Select a component type under {strong_start}Add New Component{strong_end}. Then select a template.")).format(
|
||||
strong_start=HTML('<strong>'),
|
||||
strong_end=HTML("</strong>"),
|
||||
)}</p>
|
||||
<p>${_("The new component is added at the bottom of the page or group. You can then edit and move the component.")}</p>
|
||||
<h3 class="title-3">${_("Editing components")}</h3>
|
||||
<p>${_("Click the {strong_start}Edit{strong_end} icon in a component to edit its content.").format(
|
||||
<p>${Text(_("Click the {strong_start}Edit{strong_end} icon in a component to edit its content.")).format(
|
||||
strong_start=HTML('<strong>'),
|
||||
strong_end=HTML("</strong>"),
|
||||
)}</p>
|
||||
@@ -129,7 +133,7 @@ from openedx.core.djangolib.markup import HTML, ugettext as _
|
||||
<p>${_("Confirm that you have properly configured content in each of your experiment groups.")}</p>
|
||||
</div>
|
||||
<div class="bit external-help">
|
||||
<a href="${get_online_help_info(online_help_token())['doc_url'] | h}" target="_blank" class="button external-help-button">${_("Learn more about component containers")}</a>
|
||||
<a href="${get_online_help_info(online_help_token())['doc_url']}" target="_blank" class="button external-help-button">${_("Learn more about component containers")}</a>
|
||||
</div>
|
||||
% elif is_unit_page:
|
||||
<div id="publish-unit"></div>
|
||||
@@ -139,7 +143,7 @@ from openedx.core.djangolib.markup import HTML, ugettext as _
|
||||
<div class="wrapper-unit-id bar-mod-content">
|
||||
<h5 class="title">${_("Location ID")}</h5>
|
||||
<p class="unit-id">
|
||||
<span class="unit-id-value" id="unit-location-id-input">${unit.location.name | h}</span>
|
||||
<span class="unit-id-value" id="unit-location-id-input">${unit.location.name}</span>
|
||||
<span class="tip"><span class="sr">Tip: </span>${_("Use this ID when you create links to this unit from other course content. You enter the ID in the URL field.")}</span>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
<%! from openedx.core.djangolib.markup import HTML, ugettext as _ %>
|
||||
<%page expression_filter="h"/>
|
||||
<%!
|
||||
from django.utils.translation import ugettext as _
|
||||
|
||||
from openedx.core.djangolib.markup import Text, HTML
|
||||
%>
|
||||
|
||||
<%inherit file="base.html" />
|
||||
|
||||
@@ -80,7 +84,7 @@
|
||||
## Translators: This is an example for the name of the organization sponsoring a course, seen when filling out the form to create a new course. The organization name cannot contain spaces.
|
||||
## Translators: "e.g. UniversityX or OrganizationX" is a placeholder displayed when user put no data into this field.
|
||||
<input class="new-course-org" id="new-course-org" type="text" name="new-course-org" required placeholder="${_('e.g. UniversityX or OrganizationX')}" aria-describedby="tip-new-course-org tip-error-new-course-org" />
|
||||
<span class="tip" id="tip-new-course-org">${_("The name of the organization sponsoring the course. {strong_start}Note: The organization name is part of the course URL.{strong_end} This cannot be changed, but you can set a different display name in Advanced Settings later.").format(
|
||||
<span class="tip" id="tip-new-course-org">${Text(_("The name of the organization sponsoring the course. {strong_start}Note: The organization name is part of the course URL.{strong_end} This cannot be changed, but you can set a different display name in Advanced Settings later.")).format(
|
||||
strong_start=HTML('<strong>'),
|
||||
strong_end=HTML('</strong>'),
|
||||
)}</span>
|
||||
@@ -93,7 +97,7 @@
|
||||
## seen when filling out the form to create a new course. The number here is
|
||||
## short for "Computer Science 101". It can contain letters but cannot contain spaces.
|
||||
<input class="new-course-number" id="new-course-number" type="text" name="new-course-number" required placeholder="${_('e.g. CS101')}" aria-describedby="tip-new-course-number tip-error-new-course-number" />
|
||||
<span class="tip" id="tip-new-course-number">${_("The unique number that identifies your course within your organization. {strong_start}Note: This is part of your course URL, so no spaces or special characters are allowed and it cannot be changed.{strong_end}").format(
|
||||
<span class="tip" id="tip-new-course-number">${Text(_("The unique number that identifies your course within your organization. {strong_start}Note: This is part of your course URL, so no spaces or special characters are allowed and it cannot be changed.{strong_end}")).format(
|
||||
strong_start=HTML('<strong>'),
|
||||
strong_end=HTML('</strong>'),
|
||||
)}</span>
|
||||
@@ -105,7 +109,7 @@
|
||||
## Translators: This is an example for the "run" used to identify different
|
||||
## instances of a course, seen when filling out the form to create a new course.
|
||||
<input class="new-course-run" id="new-course-run" type="text" name="new-course-run" required placeholder="${_('e.g. 2014_T1')}" aria-describedby="tip-new-course-run tip-error-new-course-run" />
|
||||
<span class="tip" id="tip-new-course-run">${_("The term in which your course will run. {strong_start}Note: This is part of your course URL, so no spaces or special characters are allowed and it cannot be changed.{strong_end}").format(
|
||||
<span class="tip" id="tip-new-course-run">${Text(_("The term in which your course will run. {strong_start}Note: This is part of your course URL, so no spaces or special characters are allowed and it cannot be changed.{strong_end}")).format(
|
||||
strong_start=HTML('<strong>'),
|
||||
strong_end=HTML('</strong>'),
|
||||
)}</span>
|
||||
@@ -165,7 +169,7 @@
|
||||
## for "Computer Science Problems". The example number may contain letters
|
||||
## but must not contain spaces.
|
||||
<input class="new-library-number" id="new-library-number" type="text" name="new-library-number" required placeholder="${_('e.g. CSPROB')}" aria-describedby="tip-new-library-number tip-error-new-library-number" />
|
||||
<span class="tip" id="tip-new-library-number">${_("The unique code that identifies this library. {strong_start}Note: This is part of your library URL, so no spaces or special characters are allowed.{strong_end} This cannot be changed.").format(
|
||||
<span class="tip" id="tip-new-library-number">${Text(_("The unique code that identifies this library. {strong_start}Note: This is part of your library URL, so no spaces or special characters are allowed.{strong_end} This cannot be changed.")).format(
|
||||
strong_start=HTML('<strong>'),
|
||||
strong_end=HTML('</strong>'),
|
||||
)}</span>
|
||||
@@ -228,7 +232,7 @@
|
||||
</div>
|
||||
|
||||
<div class="status-message">
|
||||
<p class="copy">${_('The new course will be added to your course list in 5-10 minutes. Return to this page or {link_start}refresh it{link_end} to update the course list. The new course will need some manual configuration.').format(
|
||||
<p class="copy">${Text(_('The new course will be added to your course list in 5-10 minutes. Return to this page or {link_start}refresh it{link_end} to update the course list. The new course will need some manual configuration.')).format(
|
||||
link_start=HTML('<a href="#" class="action-reload">'),
|
||||
link_end=HTML('</a>'),
|
||||
)}</p>
|
||||
@@ -346,7 +350,7 @@
|
||||
<div class="notice notice-incontext notice-instruction notice-instruction-nocourses list-notices courses-tab active">
|
||||
<div class="notice-item">
|
||||
<div class="msg">
|
||||
<h3 class="title">${_("Are you staff on an existing {studio_name} course?").format(studio_name=set)}</h3>
|
||||
<h3 class="title">${_("Are you staff on an existing {studio_name} course?").format(studio_name=settings.STUDIO_SHORT_NAME)}</h3>
|
||||
<div class="copy">
|
||||
<p>${_('The course creator must give you access to the course. Contact the course creator or administrator for the course you are helping to author.')}</p>
|
||||
</div>
|
||||
@@ -575,7 +579,7 @@
|
||||
% if course_creator_status=='disallowed_for_this_site' and settings.FEATURES.get('STUDIO_REQUEST_EMAIL',''):
|
||||
<div class="bit">
|
||||
<h3 class="title title-3">${_("Can I create courses in {studio_name}?").format(studio_name=settings.STUDIO_NAME)}</h3>
|
||||
<p>${_("In order to create courses in {studio_name}, you must {link_start}contact {platform_name} staff to help you create a course{link_end}.").format(
|
||||
<p>${Text(_("In order to create courses in {studio_name}, you must {link_start}contact {platform_name} staff to help you create a course{link_end}.")).format(
|
||||
studio_name=settings.STUDIO_NAME,
|
||||
platform_name=settings.PLATFORM_NAME,
|
||||
link_start=HTML('<a href="mailto:{email}">').format(email=settings.FEATURES.get('STUDIO_REQUEST_EMAIL','')),
|
||||
@@ -593,7 +597,7 @@
|
||||
% elif course_creator_status == "denied":
|
||||
<div class="bit">
|
||||
<h3 class="title title-3">${_("Can I create courses in {studio_name}?").format(studio_name=settings.STUDIO_NAME)}</h3>
|
||||
<p>${_("Your request to author courses in {studio_name} has been denied. Please {link_start}contact {platform_name} Staff with further questions{link_end}.").format(
|
||||
<p>${Text(_("Your request to author courses in {studio_name} has been denied. Please {link_start}contact {platform_name} Staff with further questions{link_end}.")).format(
|
||||
studio_name=settings.STUDIO_NAME,
|
||||
platform_name=settings.PLATFORM_NAME,
|
||||
link_start=HTML('<a href="mailto:{email}">').format(email=settings.TECH_SUPPORT_EMAIL),
|
||||
|
||||
@@ -336,7 +336,7 @@
|
||||
<section id="problem_i4x-AndyA-ABT101-problem-46d2b65d793549e2876729d55df9a2cb" class="problems-wrapper" data-problem-id="i4x://AndyA/ABT101/problem/46d2b65d793549e2876729d55df9a2cb" data-url="/preview/xblock/i4x:;_;_AndyA;_ABT101;_problem;_46d2b65d793549e2876729d55df9a2cb/handler/xmodule_handler" data-progress_status="none" data-progress_detail="0/1">
|
||||
|
||||
|
||||
<h3 class="problem-header">
|
||||
<h3 class="hd hd-2 problem-header">
|
||||
Multiple Choice
|
||||
</h3>
|
||||
|
||||
|
||||
@@ -19,6 +19,8 @@ from django.template.context import _builtin_context_processors
|
||||
from django.utils.module_loading import import_string
|
||||
from util.request import safe_get_host
|
||||
|
||||
from request_cache.middleware import RequestCache
|
||||
|
||||
REQUEST_CONTEXT = threading.local()
|
||||
|
||||
|
||||
@@ -51,6 +53,12 @@ def get_template_request_context():
|
||||
request = getattr(REQUEST_CONTEXT, "request", None)
|
||||
if not request:
|
||||
return None
|
||||
|
||||
request_cache_dict = RequestCache.get_request_cache().data
|
||||
cache_key = "edxmako_request_context"
|
||||
if cache_key in request_cache_dict:
|
||||
return request_cache_dict[cache_key]
|
||||
|
||||
context = RequestContext(request)
|
||||
context['is_secure'] = request.is_secure()
|
||||
context['site'] = safe_get_host(request)
|
||||
@@ -62,4 +70,6 @@ def get_template_request_context():
|
||||
for processor in get_template_context_processors():
|
||||
context.update(processor(request))
|
||||
|
||||
request_cache_dict[cache_key] = context
|
||||
|
||||
return context
|
||||
|
||||
@@ -33,7 +33,6 @@ def marketing_link(name):
|
||||
possible URLs for certain links. This function is to decides
|
||||
which URL should be provided.
|
||||
"""
|
||||
|
||||
# link_map maps URLs from the marketing site to the old equivalent on
|
||||
# the Django site
|
||||
link_map = settings.MKTG_URL_LINK_MAP
|
||||
|
||||
@@ -290,9 +290,8 @@ class BaseMicrositeBackend(AbstractBaseMicrositeBackend):
|
||||
in non-mako templates must be loaded before the django startup
|
||||
"""
|
||||
microsites_root = settings.MICROSITE_ROOT_DIR
|
||||
microsite_config_dict = settings.MICROSITE_CONFIGURATION
|
||||
|
||||
if microsite_config_dict:
|
||||
if self.has_configuration_set():
|
||||
settings.DEFAULT_TEMPLATE_ENGINE['DIRS'].append(microsites_root)
|
||||
|
||||
|
||||
|
||||
@@ -1,12 +1,20 @@
|
||||
"""
|
||||
Test Microsite base backends.
|
||||
"""
|
||||
import logging
|
||||
|
||||
from mock import patch
|
||||
from django.conf import settings
|
||||
from django.test import TestCase
|
||||
|
||||
from microsite_configuration import microsite
|
||||
from microsite_configuration.backends.base import (
|
||||
AbstractBaseMicrositeBackend,
|
||||
BaseMicrositeBackend
|
||||
)
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class NullBackend(AbstractBaseMicrositeBackend):
|
||||
"""
|
||||
@@ -130,3 +138,36 @@ class AbstractBaseMicrositeBackendTests(TestCase):
|
||||
|
||||
with self.assertRaises(NotImplementedError):
|
||||
backend.get_all_orgs()
|
||||
|
||||
|
||||
@patch(
|
||||
'microsite_configuration.microsite.BACKEND',
|
||||
microsite.get_backend(
|
||||
'microsite_configuration.backends.base.BaseMicrositeBackend', BaseMicrositeBackend
|
||||
)
|
||||
)
|
||||
class BaseMicrositeBackendTests(TestCase):
|
||||
"""
|
||||
Go through and test the BaseMicrositeBackend class for behavior which is not
|
||||
overriden in subclasses
|
||||
"""
|
||||
def test_enable_microsites_pre_startup(self):
|
||||
"""
|
||||
Tests microsite.test_enable_microsites_pre_startup works as expected.
|
||||
"""
|
||||
# remove microsite root directory paths first
|
||||
settings.DEFAULT_TEMPLATE_ENGINE['DIRS'] = [
|
||||
path for path in settings.DEFAULT_TEMPLATE_ENGINE['DIRS']
|
||||
if path != settings.MICROSITE_ROOT_DIR
|
||||
]
|
||||
|
||||
with patch('microsite_configuration.backends.base.BaseMicrositeBackend.has_configuration_set',
|
||||
return_value=False):
|
||||
microsite.enable_microsites_pre_startup(log)
|
||||
self.assertNotIn(settings.MICROSITE_ROOT_DIR,
|
||||
settings.DEFAULT_TEMPLATE_ENGINE['DIRS'])
|
||||
with patch('microsite_configuration.backends.base.BaseMicrositeBackend.has_configuration_set',
|
||||
return_value=True):
|
||||
microsite.enable_microsites_pre_startup(log)
|
||||
self.assertIn(settings.MICROSITE_ROOT_DIR,
|
||||
settings.DEFAULT_TEMPLATE_ENGINE['DIRS'])
|
||||
|
||||
@@ -105,22 +105,6 @@ class DatabaseMicrositeBackendTests(DatabaseMicrositeTestCase):
|
||||
microsite.clear()
|
||||
self.assertIsNone(microsite.get_value('platform_name'))
|
||||
|
||||
def test_enable_microsites_pre_startup(self):
|
||||
"""
|
||||
Tests microsite.test_enable_microsites_pre_startup works as expected.
|
||||
"""
|
||||
# remove microsite root directory paths first
|
||||
settings.DEFAULT_TEMPLATE_ENGINE['DIRS'] = [
|
||||
path for path in settings.DEFAULT_TEMPLATE_ENGINE['DIRS']
|
||||
if path != settings.MICROSITE_ROOT_DIR
|
||||
]
|
||||
with patch.dict('django.conf.settings.FEATURES', {'USE_MICROSITES': False}):
|
||||
microsite.enable_microsites_pre_startup(log)
|
||||
self.assertNotIn(settings.MICROSITE_ROOT_DIR, settings.DEFAULT_TEMPLATE_ENGINE['DIRS'])
|
||||
with patch.dict('django.conf.settings.FEATURES', {'USE_MICROSITES': True}):
|
||||
microsite.enable_microsites_pre_startup(log)
|
||||
self.assertIn(settings.MICROSITE_ROOT_DIR, settings.DEFAULT_TEMPLATE_ENGINE['DIRS'])
|
||||
|
||||
@patch('edxmako.paths.add_lookup')
|
||||
def test_enable_microsites(self, add_lookup):
|
||||
"""
|
||||
@@ -173,6 +157,15 @@ class DatabaseMicrositeBackendTests(DatabaseMicrositeTestCase):
|
||||
with self.assertRaises(Exception):
|
||||
microsite.set_by_domain('test.microsite2.com')
|
||||
|
||||
def test_has_configuration_set(self):
|
||||
"""
|
||||
Tests microsite.has_configuration_set works as expected on this backend.
|
||||
"""
|
||||
self.assertTrue(microsite.BACKEND.has_configuration_set())
|
||||
|
||||
Microsite.objects.all().delete()
|
||||
self.assertFalse(microsite.BACKEND.has_configuration_set())
|
||||
|
||||
|
||||
@patch(
|
||||
'microsite_configuration.microsite.TEMPLATES_BACKEND',
|
||||
|
||||
@@ -122,6 +122,15 @@ class FilebasedMicrositeBackendTests(TestCase):
|
||||
microsite.set_by_domain('unknown')
|
||||
self.assertEqual(microsite.get_value('university'), 'default_university')
|
||||
|
||||
def test_has_configuration_set(self):
|
||||
"""
|
||||
Tests microsite.has_configuration_set works as expected.
|
||||
"""
|
||||
self.assertTrue(microsite.BACKEND.has_configuration_set())
|
||||
|
||||
with patch('django.conf.settings.MICROSITE_CONFIGURATION', {}):
|
||||
self.assertFalse(microsite.BACKEND.has_configuration_set())
|
||||
|
||||
|
||||
@patch(
|
||||
'microsite_configuration.microsite.TEMPLATES_BACKEND',
|
||||
|
||||
@@ -2,6 +2,9 @@
|
||||
"""
|
||||
Tests microsite_configuration templatetags and helper functions.
|
||||
"""
|
||||
import logging
|
||||
|
||||
from mock import patch
|
||||
from django.test import TestCase
|
||||
from django.conf import settings
|
||||
from microsite_configuration.templatetags import microsite as microsite_tags
|
||||
@@ -9,6 +12,8 @@ from microsite_configuration import microsite
|
||||
from microsite_configuration.backends.base import BaseMicrositeBackend
|
||||
from microsite_configuration.backends.database import DatabaseMicrositeBackend
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class MicrositeTests(TestCase):
|
||||
"""
|
||||
@@ -74,3 +79,20 @@ class MicrositeTests(TestCase):
|
||||
),
|
||||
DatabaseMicrositeBackend
|
||||
)
|
||||
|
||||
def test_enable_microsites_pre_startup(self):
|
||||
"""
|
||||
Tests microsite.test_enable_microsites_pre_startup is not used if the feature is turned off.
|
||||
"""
|
||||
# remove microsite root directory paths first
|
||||
settings.DEFAULT_TEMPLATE_ENGINE['DIRS'] = [
|
||||
path for path in settings.DEFAULT_TEMPLATE_ENGINE['DIRS']
|
||||
if path != settings.MICROSITE_ROOT_DIR
|
||||
]
|
||||
|
||||
with patch.dict('django.conf.settings.FEATURES', {'USE_MICROSITES': False}):
|
||||
microsite.enable_microsites_pre_startup(log)
|
||||
self.assertNotIn(settings.MICROSITE_ROOT_DIR, settings.DEFAULT_TEMPLATE_ENGINE['DIRS'])
|
||||
with patch.dict('django.conf.settings.FEATURES', {'USE_MICROSITES': True}):
|
||||
microsite.enable_microsites_pre_startup(log)
|
||||
self.assertIn(settings.MICROSITE_ROOT_DIR, settings.DEFAULT_TEMPLATE_ENGINE['DIRS'])
|
||||
|
||||
39
common/djangoapps/monkey_patch/django_db_models_options.py
Normal file
39
common/djangoapps/monkey_patch/django_db_models_options.py
Normal file
@@ -0,0 +1,39 @@
|
||||
"""
|
||||
Monkey patch implementation of the following _expire_cache performance improvement:
|
||||
|
||||
https://github.com/django/django/commit/7628f87e2b1ab4b8a881f06c8973be4c368aaa3d
|
||||
|
||||
Remove once we upgrade to a version of django which includes this fix natively!
|
||||
NOTE: This is on django's master branch but is NOT currently part of any django 1.8 or 1.9 release.
|
||||
"""
|
||||
|
||||
from django.db.models.options import Options
|
||||
|
||||
|
||||
def patch():
|
||||
"""
|
||||
Monkey-patch the Options class.
|
||||
"""
|
||||
def _expire_cache(self, forward=True, reverse=True):
|
||||
# pylint: disable=missing-docstring
|
||||
|
||||
# This method is usually called by apps.cache_clear(), when the
|
||||
# registry is finalized, or when a new field is added.
|
||||
if forward:
|
||||
for cache_key in self.FORWARD_PROPERTIES:
|
||||
if cache_key in self.__dict__:
|
||||
delattr(self, cache_key)
|
||||
if reverse and not self.abstract:
|
||||
for cache_key in self.REVERSE_PROPERTIES:
|
||||
if cache_key in self.__dict__:
|
||||
delattr(self, cache_key)
|
||||
self._get_fields_cache = {} # pylint: disable=protected-access
|
||||
|
||||
# Patch constants as a set instead of a list.
|
||||
Options.FORWARD_PROPERTIES = {'fields', 'many_to_many', 'concrete_fields',
|
||||
'local_concrete_fields', '_forward_fields_map'}
|
||||
|
||||
Options.REVERSE_PROPERTIES = {'related_objects', 'fields_map', '_relation_tree'}
|
||||
|
||||
# Patch the expire_cache method to utilize constant's new set data structure.
|
||||
Options._expire_cache = _expire_cache # pylint: disable=protected-access
|
||||
@@ -0,0 +1,30 @@
|
||||
"""
|
||||
Monkey patch the is_safe_url method in django.utils.http for Django 1.8.10.
|
||||
In that release, the method crashes when a bytestring, non-unicode string is passed-in
|
||||
as the url.
|
||||
Remove the monkey patch when the bug is fixed in a Django 1.8 release. Here's the bug:
|
||||
https://code.djangoproject.com/ticket/26308
|
||||
"""
|
||||
|
||||
from django.utils import http
|
||||
from django.utils.encoding import force_text
|
||||
|
||||
|
||||
def patch():
|
||||
"""
|
||||
Monkey patch the django.utils.http.is_safe_url function to convert the incoming
|
||||
url and host parameters to unicode.
|
||||
"""
|
||||
def create_is_safe_url_wrapper(wrapped_func):
|
||||
# pylint: disable=missing-docstring
|
||||
def _wrap_is_safe_url(*args, **kwargs):
|
||||
def _conv_text(value):
|
||||
return None if value is None else force_text(value)
|
||||
return wrapped_func(
|
||||
# Converted *args.
|
||||
*tuple(map(_conv_text, args)),
|
||||
# Converted **kwargs.
|
||||
**{key: _conv_text(value) for key, value in kwargs.items()}
|
||||
)
|
||||
return _wrap_is_safe_url
|
||||
http.is_safe_url = create_is_safe_url_wrapper(http.is_safe_url)
|
||||
@@ -933,7 +933,7 @@ class DashboardTestXSeriesPrograms(ModuleStoreTestCase, ProgramsApiConfigMixin):
|
||||
_id = 0
|
||||
|
||||
for course, program_status in data:
|
||||
programs[unicode(course)] = {
|
||||
programs[unicode(course)] = [{
|
||||
'id': _id,
|
||||
'category': self.category,
|
||||
'organization': {'display_name': 'Test Organization 1', 'key': 'edX'},
|
||||
@@ -958,7 +958,7 @@ class DashboardTestXSeriesPrograms(ModuleStoreTestCase, ProgramsApiConfigMixin):
|
||||
],
|
||||
'subtitle': 'sub',
|
||||
'name': self.program_name
|
||||
}
|
||||
}]
|
||||
|
||||
_id += 1
|
||||
|
||||
@@ -975,7 +975,7 @@ class DashboardTestXSeriesPrograms(ModuleStoreTestCase, ProgramsApiConfigMixin):
|
||||
"""Verify that program data is parsed correctly for a given course"""
|
||||
with patch('student.views.get_programs_for_dashboard') as mock_data:
|
||||
mock_data.return_value = {
|
||||
u'edx/demox/Run_1': {
|
||||
u'edx/demox/Run_1': [{
|
||||
'id': 0,
|
||||
'category': self.category,
|
||||
'organization': {'display_name': 'Test Organization 1', 'key': 'edX'},
|
||||
@@ -984,7 +984,7 @@ class DashboardTestXSeriesPrograms(ModuleStoreTestCase, ProgramsApiConfigMixin):
|
||||
'course_codes': course_codes,
|
||||
'subtitle': 'sub',
|
||||
'name': self.program_name
|
||||
}
|
||||
}]
|
||||
}
|
||||
parse_data = _get_course_programs(
|
||||
self.user, [
|
||||
@@ -998,14 +998,16 @@ class DashboardTestXSeriesPrograms(ModuleStoreTestCase, ProgramsApiConfigMixin):
|
||||
self.assertEqual(
|
||||
{
|
||||
u'edx/demox/Run_1': {
|
||||
'program_id': 0,
|
||||
'category': 'xseries',
|
||||
'course_count': len(course_codes),
|
||||
'display_name': self.program_name,
|
||||
'program_marketing_url': urljoin(
|
||||
settings.MKTG_URLS.get('ROOT'), 'xseries' + '/{}'
|
||||
).format(marketing_slug),
|
||||
'display_category': 'XSeries'
|
||||
'display_category': 'XSeries',
|
||||
'course_program_list': [{
|
||||
'program_id': 0,
|
||||
'course_count': len(course_codes),
|
||||
'display_name': self.program_name,
|
||||
'program_marketing_url': urljoin(
|
||||
settings.MKTG_URLS.get('ROOT'), 'xseries' + '/{}'
|
||||
).format(marketing_slug)
|
||||
}]
|
||||
}
|
||||
},
|
||||
parse_data
|
||||
@@ -1122,8 +1124,9 @@ class DashboardTestXSeriesPrograms(ModuleStoreTestCase, ProgramsApiConfigMixin):
|
||||
self.create_programs_config()
|
||||
|
||||
program_data = self._create_program_data([(self.course_1.id, 'active')])
|
||||
if key_remove and key_remove in program_data[unicode(self.course_1.id)]:
|
||||
del program_data[unicode(self.course_1.id)][key_remove]
|
||||
for program in program_data[unicode(self.course_1.id)]:
|
||||
if key_remove and key_remove in program:
|
||||
del program[key_remove]
|
||||
|
||||
with patch('student.views.get_programs_for_dashboard') as mock_data:
|
||||
mock_data.return_value = program_data
|
||||
@@ -1135,7 +1138,7 @@ class DashboardTestXSeriesPrograms(ModuleStoreTestCase, ProgramsApiConfigMixin):
|
||||
log_warn.assert_called_with(
|
||||
'Program structure is invalid, skipping display: %r', program_data[
|
||||
unicode(self.course_1.id)
|
||||
]
|
||||
][0]
|
||||
)
|
||||
# verify that no programs related upsell messages appear on the
|
||||
# student dashboard.
|
||||
|
||||
@@ -1628,7 +1628,11 @@ def create_account_with_params(request, params):
|
||||
not do_external_auth
|
||||
)
|
||||
# Can't have terms of service for certain SHIB users, like at Stanford
|
||||
registration_fields = getattr(settings, 'REGISTRATION_EXTRA_FIELDS', {})
|
||||
tos_required = (
|
||||
registration_fields.get('terms_of_service') != 'hidden' or
|
||||
registration_fields.get('honor_code') != 'hidden'
|
||||
) and (
|
||||
not settings.FEATURES.get("AUTH_USE_SHIB") or
|
||||
not settings.FEATURES.get("SHIB_DISABLE_TOS") or
|
||||
not do_external_auth or
|
||||
@@ -2417,26 +2421,29 @@ def _get_course_programs(user, user_enrolled_courses): # pylint: disable=invali
|
||||
the given user has active enrollments.
|
||||
|
||||
Returns:
|
||||
dict, containing programs keyed by course. Empty if programs cannot be retrieved.
|
||||
dict, containing programs keyed by course.
|
||||
"""
|
||||
course_programs = get_programs_for_dashboard(user, user_enrolled_courses)
|
||||
programs_data = {}
|
||||
|
||||
for course_key, program in course_programs.viewitems():
|
||||
if program.get('status') == 'active' and program.get('category') == 'xseries':
|
||||
try:
|
||||
programs_data[course_key] = {
|
||||
'course_count': len(program['course_codes']),
|
||||
'display_name': program['name'],
|
||||
'category': program.get('category'),
|
||||
'program_id': program['id'],
|
||||
'program_marketing_url': urljoin(
|
||||
settings.MKTG_URLS.get('ROOT'), 'xseries' + '/{}'
|
||||
).format(program['marketing_slug']),
|
||||
'display_category': 'XSeries'
|
||||
}
|
||||
except KeyError:
|
||||
log.warning('Program structure is invalid, skipping display: %r', program)
|
||||
for course_key, programs in course_programs.viewitems():
|
||||
for program in programs:
|
||||
if program.get('status') == 'active' and program.get('category') == 'xseries':
|
||||
try:
|
||||
programs_for_course = programs_data.setdefault(course_key, {})
|
||||
programs_for_course.setdefault('course_program_list', []).append({
|
||||
'course_count': len(program['course_codes']),
|
||||
'display_name': program['name'],
|
||||
'program_id': program['id'],
|
||||
'program_marketing_url': urljoin(
|
||||
settings.MKTG_URLS.get('ROOT'),
|
||||
'xseries' + '/{}'
|
||||
).format(program['marketing_slug'])
|
||||
})
|
||||
programs_for_course['display_category'] = 'XSeries'
|
||||
programs_for_course['category'] = program.get('category')
|
||||
except KeyError:
|
||||
log.warning('Program structure is invalid, skipping display: %r', program)
|
||||
|
||||
return programs_data
|
||||
|
||||
|
||||
@@ -81,8 +81,6 @@ def initial_setup(server):
|
||||
desired_capabilities['loggingPrefs'] = {
|
||||
'browser': 'ALL',
|
||||
}
|
||||
elif browser_driver == 'firefox':
|
||||
desired_capabilities = DesiredCapabilities.FIREFOX
|
||||
else:
|
||||
desired_capabilities = {}
|
||||
|
||||
@@ -98,7 +96,13 @@ def initial_setup(server):
|
||||
# the browser session is invalid, this will
|
||||
# raise a WebDriverException
|
||||
try:
|
||||
world.browser = Browser(browser_driver, desired_capabilities=desired_capabilities)
|
||||
if browser_driver == 'firefox':
|
||||
# Lettuce initializes differently for firefox, and sending
|
||||
# desired_capabilities will not work. So initialize without
|
||||
# sending desired_capabilities.
|
||||
world.browser = Browser(browser_driver)
|
||||
else:
|
||||
world.browser = Browser(browser_driver, desired_capabilities=desired_capabilities)
|
||||
world.browser.driver.set_script_timeout(GLOBAL_SCRIPT_TIMEOUT)
|
||||
world.visit('/')
|
||||
|
||||
|
||||
@@ -231,3 +231,16 @@ def generate_int_id(minimum=0, maximum=MYSQL_MAX_INT, used_ids=None):
|
||||
cid = random.randint(minimum, maximum)
|
||||
|
||||
return cid
|
||||
|
||||
|
||||
class NoOpMigrationModules(object):
|
||||
"""
|
||||
Return invalid migrations modules for apps. Used for disabling migrations during tests.
|
||||
See https://groups.google.com/d/msg/django-developers/PWPj3etj3-U/kCl6pMsQYYoJ.
|
||||
"""
|
||||
|
||||
def __contains__(self, item):
|
||||
return True
|
||||
|
||||
def __getitem__(self, item):
|
||||
return "notmigrations"
|
||||
|
||||
@@ -2134,6 +2134,10 @@ class StringResponse(LoncapaResponse):
|
||||
Note: for old code, which supports _or_ separator, we add some backward compatibility handling.
|
||||
Should be removed soon. When to remove it, is up to Lyla Fisher.
|
||||
"""
|
||||
# if given answer is empty.
|
||||
if not given:
|
||||
return False
|
||||
|
||||
_ = self.capa_system.i18n.ugettext
|
||||
# backward compatibility, should be removed in future.
|
||||
if self.backward:
|
||||
|
||||
@@ -946,6 +946,13 @@ class StringResponseTest(ResponseTest): # pylint: disable=missing-docstring
|
||||
hint = correct_map.get_hint('1_2_1')
|
||||
self.assertEqual(hint, self._get_random_number_result(problem.seed))
|
||||
|
||||
def test_empty_answer_graded_as_incorrect(self):
|
||||
"""
|
||||
Tests that problem should be graded incorrect if blank space is chosen as answer
|
||||
"""
|
||||
problem = self.build_problem(answer=" ", case_sensitive=False, regexp=True)
|
||||
self.assert_grade(problem, u" ", "incorrect")
|
||||
|
||||
|
||||
class CodeResponseTest(ResponseTest): # pylint: disable=missing-docstring
|
||||
xml_factory_class = CodeResponseXMLFactory
|
||||
|
||||
@@ -399,6 +399,7 @@ class CapaMixin(CapaFields):
|
||||
'ajax_url': self.runtime.ajax_url,
|
||||
'progress_status': Progress.to_js_status_str(progress),
|
||||
'progress_detail': Progress.to_js_detail_str(progress),
|
||||
'content': self.get_problem_html(encapsulate=False)
|
||||
})
|
||||
|
||||
def check_button_name(self):
|
||||
|
||||
@@ -93,11 +93,23 @@ class CapaModule(CapaMixin, XModule):
|
||||
result = handlers[dispatch](data)
|
||||
|
||||
except NotFoundError as err:
|
||||
_, _, traceback_obj = sys.exc_info()
|
||||
log.exception(
|
||||
"Unable to find data when dispatching %s to %s for user %s",
|
||||
dispatch,
|
||||
self.scope_ids.usage_id,
|
||||
self.scope_ids.user_id
|
||||
)
|
||||
_, _, traceback_obj = sys.exc_info() # pylint: disable=redefined-outer-name
|
||||
raise ProcessingError(not_found_error_message), None, traceback_obj
|
||||
|
||||
except Exception as err:
|
||||
_, _, traceback_obj = sys.exc_info()
|
||||
log.exception(
|
||||
"Unknown error when dispatching %s to %s for user %s",
|
||||
dispatch,
|
||||
self.scope_ids.usage_id,
|
||||
self.scope_ids.user_id
|
||||
)
|
||||
_, _, traceback_obj = sys.exc_info() # pylint: disable=redefined-outer-name
|
||||
raise ProcessingError(generic_error_message), None, traceback_obj
|
||||
|
||||
after = self.get_progress()
|
||||
|
||||
@@ -357,8 +357,8 @@ class CourseFields(object):
|
||||
html_textbooks = List(
|
||||
display_name=_("HTML Textbooks"),
|
||||
help=_(
|
||||
"For HTML textbooks that appear as separate tabs in the courseware, enter the name of the tab (usually "
|
||||
"the name of the book) as well as the URLs and titles of all the chapters in the book."
|
||||
"For HTML textbooks that appear as separate tabs in the course, enter the name of the tab (usually "
|
||||
"the title of the book) as well as the URLs and titles of each chapter in the book."
|
||||
),
|
||||
scope=Scope.settings
|
||||
)
|
||||
@@ -423,7 +423,7 @@ class CourseFields(object):
|
||||
scope=Scope.settings, default=_('Course Handouts'))
|
||||
show_timezone = Boolean(
|
||||
help=_(
|
||||
"True if timezones should be shown on dates in the courseware. "
|
||||
"True if timezones should be shown on dates in the course. "
|
||||
"Deprecated in favor of due_date_display_format."
|
||||
),
|
||||
scope=Scope.settings, default=True
|
||||
@@ -568,7 +568,7 @@ class CourseFields(object):
|
||||
display_organization = String(
|
||||
display_name=_("Course Organization Display String"),
|
||||
help=_(
|
||||
"Enter the course organization that you want to appear in the courseware. This setting overrides the "
|
||||
"Enter the course organization that you want to appear in the course. This setting overrides the "
|
||||
"organization that you entered when you created the course. To use the organization that you entered "
|
||||
"when you created the course, enter null."
|
||||
),
|
||||
@@ -578,7 +578,7 @@ class CourseFields(object):
|
||||
display_coursenumber = String(
|
||||
display_name=_("Course Number Display String"),
|
||||
help=_(
|
||||
"Enter the course number that you want to appear in the courseware. This setting overrides the course "
|
||||
"Enter the course number that you want to appear in the course. This setting overrides the course "
|
||||
"number that you entered when you created the course. To use the course number that you entered when "
|
||||
"you created the course, enter null."
|
||||
),
|
||||
|
||||
@@ -13,11 +13,6 @@ $annotatable--body-font-size: em(14);
|
||||
|
||||
.annotatable-header {
|
||||
margin-bottom: .5em;
|
||||
.annotatable-title {
|
||||
font-size: em(22);
|
||||
text-transform: uppercase;
|
||||
padding: ($baseline/10) ($baseline/5);
|
||||
}
|
||||
}
|
||||
|
||||
.annotatable-section {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<section class='xblock xblock-student_view xmodule_display xmodule_AnnotatableModule' data-type='Annotatable'>
|
||||
<div class="annotatable-wrapper">
|
||||
<div class="annotatable-header">
|
||||
<div class="annotatable-title">First Annotation Exercise</div>
|
||||
<h3 class="hd hd-2 annotatable-title">First Annotation Exercise</h2>
|
||||
</div>
|
||||
<div class="annotatable-section">
|
||||
<div class="annotatable-section-title">
|
||||
@@ -32,4 +32,3 @@
|
||||
<div class="problem"><a class="annotation-return" href="javascript:void(0)">Return to Annotation</a></div>
|
||||
<div class="problem"><a class="annotation-return" href="javascript:void(0)">Return to Annotation</a></div>
|
||||
<div class="problem"><a class="annotation-return" href="javascript:void(0)">Return to Annotation</a></div>
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
<section id="problem_i4x-Me-19_002-problem-Numerical_Input" class="problems-wrapper" data-problem-id="i4x://Me/19.002/problem/Numerical_Input" data-url="/courses/Me/19.002/Test/modx/i4x://Me/19.002/problem/Numerical_Input" data-progress_status="done" data-progress_detail="1/1">
|
||||
|
||||
|
||||
<h3 class="problem-header">
|
||||
<h3 class="hd hd-2 problem-header">
|
||||
Numerical Input
|
||||
</h3>
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<h3 class="problem-header">Custom Javascript Display and Grading</h3>
|
||||
<h3 class="hd hd-2 problem-header">Custom Javascript Display and Grading</h3>
|
||||
|
||||
<div class="problem">
|
||||
<div>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<h3 class="problem-header">Problem Header</h3>
|
||||
<h3 class="hd hd-2 problem-header">Problem Header</h3>
|
||||
|
||||
<div class='problem-progress'></div>
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<h3 class="problem-header">Problem Header</h3>
|
||||
<h3 class="hd hd-2 problem-header">Problem Header</h3>
|
||||
|
||||
<div class='problem-progress'></div>
|
||||
|
||||
|
||||
@@ -710,7 +710,7 @@ describe 'MarkdownEditingDescriptor', ->
|
||||
""")
|
||||
expect(data).toEqual("""<problem>
|
||||
<p>Not a header</p>
|
||||
<h3 class="problem-header">A header</h3>
|
||||
<h3 class="hd hd-2 problem-header">A header</h3>
|
||||
|
||||
<p>Multiple choice w/ parentheticals</p>
|
||||
<multiplechoiceresponse>
|
||||
|
||||
@@ -5,6 +5,7 @@ class @Problem
|
||||
@id = @el.data('problem-id')
|
||||
@element_id = @el.attr('id')
|
||||
@url = @el.data('url')
|
||||
@content = @el.data('content')
|
||||
|
||||
# has_timed_out and has_response are used to ensure that are used to
|
||||
# ensure that we wait a minimum of ~ 1s before transitioning the check
|
||||
@@ -12,7 +13,7 @@ class @Problem
|
||||
@has_timed_out = false
|
||||
@has_response = false
|
||||
|
||||
@render()
|
||||
@render(@content)
|
||||
|
||||
$: (selector) ->
|
||||
$(selector, @el)
|
||||
|
||||
@@ -202,7 +202,7 @@ class @MarkdownEditingDescriptor extends XModule.Descriptor
|
||||
xml = xml.replace(/\r\n/g, '\n');
|
||||
|
||||
// replace headers
|
||||
xml = xml.replace(/(^.*?$)(?=\n\=\=+$)/gm, '<h3 class="problem-header">$1</h3>');
|
||||
xml = xml.replace(/(^.*?$)(?=\n\=\=+$)/gm, '<h3 class="hd hd-2 problem-header">$1</h3>');
|
||||
xml = xml.replace(/\n^\=\=+$/gm, '');
|
||||
|
||||
// Pull out demand hints, || a hint ||
|
||||
|
||||
@@ -68,6 +68,7 @@ from xblock.core import XBlock
|
||||
from xblock.fields import Scope, Reference, ReferenceList, ReferenceValueDict
|
||||
from xmodule.course_module import CourseSummary
|
||||
from xmodule.errortracker import null_error_tracker
|
||||
from opaque_keys.edx.keys import CourseKey
|
||||
from opaque_keys.edx.locator import (
|
||||
BlockUsageLocator, DefinitionLocator, CourseLocator, LibraryLocator, VersionTree, LocalId,
|
||||
)
|
||||
@@ -1160,8 +1161,8 @@ class SplitMongoModuleStore(SplitBulkWriteMixin, ModuleStoreWriteBase):
|
||||
False - if we want only those items which are in the course tree. This would ensure no orphans are
|
||||
fetched.
|
||||
"""
|
||||
if not isinstance(course_locator, CourseLocator) or course_locator.deprecated:
|
||||
# The supplied CourseKey is of the wrong type, so it can't possibly be stored in this modulestore.
|
||||
if not isinstance(course_locator, CourseKey) or course_locator.deprecated:
|
||||
# The supplied courselike key is of the wrong type, so it can't possibly be stored in this modulestore.
|
||||
return []
|
||||
|
||||
course = self._lookup_course(course_locator)
|
||||
|
||||
@@ -544,9 +544,11 @@ class DraftVersioningModuleStore(SplitMongoModuleStore, ModuleStoreDraftAndPubli
|
||||
block_id = self.DEFAULT_ROOT_LIBRARY_BLOCK_ID
|
||||
new_usage_key = course_key.make_usage_key(block_type, block_id)
|
||||
|
||||
# Only the course import process calls import_xblock(). If the branch setting is published_only,
|
||||
# then the non-draft blocks are being imported.
|
||||
if self.get_branch_setting() == ModuleStoreEnum.Branch.published_only:
|
||||
# Both the course and library import process calls import_xblock().
|
||||
# If importing a course -and- the branch setting is published_only,
|
||||
# then the non-draft course blocks are being imported.
|
||||
is_course = isinstance(course_key, CourseLocator)
|
||||
if is_course and self.get_branch_setting() == ModuleStoreEnum.Branch.published_only:
|
||||
# Override any existing drafts (PLAT-297, PLAT-299). This import/publish step removes
|
||||
# any local changes during the course import.
|
||||
draft_course = course_key.for_branch(ModuleStoreEnum.BranchName.draft)
|
||||
|
||||
@@ -4,6 +4,7 @@ Modulestore configuration for test cases.
|
||||
"""
|
||||
import functools
|
||||
from uuid import uuid4
|
||||
from contextlib import contextmanager
|
||||
|
||||
from mock import patch
|
||||
|
||||
@@ -265,17 +266,54 @@ class SharedModuleStoreTestCase(TestCase):
|
||||
for Django ORM models that will get cleaned up properly.
|
||||
"""
|
||||
MODULESTORE = mixed_store_config(mkdtemp_clean(), {}, include_xml=False)
|
||||
# Tell Django to clean out all databases, not just default
|
||||
multi_db = True
|
||||
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
super(SharedModuleStoreTestCase, cls).setUpClass()
|
||||
|
||||
def _setUpModuleStore(cls): # pylint: disable=invalid-name
|
||||
"""
|
||||
Set up the modulestore for an entire test class.
|
||||
"""
|
||||
cls._settings_override = override_settings(MODULESTORE=cls.MODULESTORE)
|
||||
cls._settings_override.__enter__()
|
||||
XMODULE_FACTORY_LOCK.enable()
|
||||
clear_existing_modulestores()
|
||||
cls.store = modulestore()
|
||||
|
||||
@classmethod
|
||||
@contextmanager
|
||||
def setUpClassAndTestData(cls): # pylint: disable=invalid-name
|
||||
"""
|
||||
For use when the test class has a setUpTestData() method that uses variables
|
||||
that are setup during setUpClass() of the same test class.
|
||||
|
||||
Use it like so:
|
||||
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
with super(MyTestClass, cls).setUpClassAndTestData():
|
||||
<all the cls.setUpClass() setup code that performs modulestore setup...>
|
||||
|
||||
@classmethod
|
||||
def setUpTestData(cls):
|
||||
<all the setup code that creates Django models per test class...>
|
||||
<these models can use variables (courses) setup in setUpClass() above>
|
||||
"""
|
||||
cls._setUpModuleStore()
|
||||
# Now yield to allow the test class to run its setUpClass() setup code.
|
||||
yield
|
||||
# Now call the base class, which calls back into the test class's setUpTestData().
|
||||
super(SharedModuleStoreTestCase, cls).setUpClass()
|
||||
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
"""
|
||||
For use when the test class has no setUpTestData() method -or-
|
||||
when that method does not use variable set up in setUpClass().
|
||||
"""
|
||||
super(SharedModuleStoreTestCase, cls).setUpClass()
|
||||
cls._setUpModuleStore()
|
||||
|
||||
@classmethod
|
||||
def tearDownClass(cls):
|
||||
drop_mongo_collections() # pylint: disable=no-value-for-parameter
|
||||
@@ -392,6 +430,8 @@ class ModuleStoreTestCase(TestCase):
|
||||
"""
|
||||
|
||||
MODULESTORE = mixed_store_config(mkdtemp_clean(), {}, include_xml=False)
|
||||
# Tell Django to clean out all databases, not just default
|
||||
multi_db = True
|
||||
|
||||
def setUp(self, **kwargs):
|
||||
"""
|
||||
|
||||
@@ -24,8 +24,6 @@ from opaque_keys.edx.locator import CourseLocator, LibraryLocator
|
||||
|
||||
DRAFT_DIR = "drafts"
|
||||
PUBLISHED_DIR = "published"
|
||||
EXPORT_VERSION_FILE = "format.json"
|
||||
EXPORT_VERSION_KEY = "export_format"
|
||||
|
||||
DEFAULT_CONTENT_FIELDS = ['metadata', 'data']
|
||||
|
||||
@@ -408,90 +406,3 @@ def export_extra_content(export_fs, modulestore, source_course_key, dest_course_
|
||||
|
||||
# export content fields other then metadata and data in json format in current directory
|
||||
_export_field_content(item, item_dir)
|
||||
|
||||
|
||||
def convert_between_versions(source_dir, target_dir):
|
||||
"""
|
||||
Converts a version 0 export format to version 1, and vice versa.
|
||||
|
||||
@param source_dir: the directory structure with the course export that should be converted.
|
||||
The contents of source_dir will not be altered.
|
||||
@param target_dir: the directory where the converted export should be written.
|
||||
@return: the version number of the converted export.
|
||||
"""
|
||||
def convert_to_version_1():
|
||||
""" Convert a version 0 archive to version 0 """
|
||||
os.mkdir(copy_root)
|
||||
with open(copy_root / EXPORT_VERSION_FILE, 'w') as f:
|
||||
f.write('{{"{export_key}": 1}}\n'.format(export_key=EXPORT_VERSION_KEY))
|
||||
|
||||
# If a drafts folder exists, copy it over.
|
||||
copy_drafts()
|
||||
|
||||
# Now copy everything into the published directory
|
||||
published_dir = copy_root / PUBLISHED_DIR
|
||||
shutil.copytree(path(source_dir) / course_name, published_dir)
|
||||
# And delete the nested drafts directory, if it exists.
|
||||
nested_drafts_dir = published_dir / DRAFT_DIR
|
||||
if nested_drafts_dir.isdir():
|
||||
shutil.rmtree(nested_drafts_dir)
|
||||
|
||||
def convert_to_version_0():
|
||||
""" Convert a version 1 archive to version 0 """
|
||||
# Copy everything in "published" up to the top level.
|
||||
published_dir = path(source_dir) / course_name / PUBLISHED_DIR
|
||||
if not published_dir.isdir():
|
||||
raise ValueError("a version 1 archive must contain a published branch")
|
||||
|
||||
shutil.copytree(published_dir, copy_root)
|
||||
|
||||
# If there is a DRAFT branch, copy it. All other branches are ignored.
|
||||
copy_drafts()
|
||||
|
||||
def copy_drafts():
|
||||
"""
|
||||
Copy drafts directory from the old archive structure to the new.
|
||||
"""
|
||||
draft_dir = path(source_dir) / course_name / DRAFT_DIR
|
||||
if draft_dir.isdir():
|
||||
shutil.copytree(draft_dir, copy_root / DRAFT_DIR)
|
||||
|
||||
root = os.listdir(source_dir)
|
||||
if len(root) != 1 or (path(source_dir) / root[0]).isfile():
|
||||
raise ValueError("source archive does not have single course directory at top level")
|
||||
|
||||
course_name = root[0]
|
||||
|
||||
# For this version of the script, we simply convert back and forth between version 0 and 1.
|
||||
original_version = get_version(path(source_dir) / course_name)
|
||||
if original_version not in [0, 1]:
|
||||
raise ValueError("unknown version: " + str(original_version))
|
||||
desired_version = 1 if original_version is 0 else 0
|
||||
|
||||
copy_root = path(target_dir) / course_name
|
||||
|
||||
if desired_version == 1:
|
||||
convert_to_version_1()
|
||||
else:
|
||||
convert_to_version_0()
|
||||
|
||||
return desired_version
|
||||
|
||||
|
||||
def get_version(course_path):
|
||||
"""
|
||||
Return the export format version number for the given
|
||||
archive directory structure (represented as a path instance).
|
||||
|
||||
If the archived file does not correspond to a known export
|
||||
format, None will be returned.
|
||||
"""
|
||||
format_file = course_path / EXPORT_VERSION_FILE
|
||||
if not format_file.isfile():
|
||||
return 0
|
||||
with open(format_file, "r") as f:
|
||||
data = json.load(f)
|
||||
if EXPORT_VERSION_KEY in data:
|
||||
return data[EXPORT_VERSION_KEY]
|
||||
|
||||
return None
|
||||
|
||||
@@ -607,6 +607,7 @@ class LibraryImportManager(ImportManager):
|
||||
org=self.target_id.org,
|
||||
library=self.target_id.library,
|
||||
user_id=self.user_id,
|
||||
fields={"display_name": ""},
|
||||
)
|
||||
runtime = library.runtime
|
||||
except DuplicateCourseError:
|
||||
|
||||
@@ -5,14 +5,14 @@ data: |
|
||||
<p>To use this template, replace the example text with your own text.</p>
|
||||
<p>When you add the component, be sure to select <strong>Settings</strong>
|
||||
to specify a <strong>Display Name</strong> and other values that apply.</p>
|
||||
<h3>Announcement Date</h3>
|
||||
<h3 class="hd hd-2">Announcement Date</h3>
|
||||
<section class='update-description'>
|
||||
<section class='primary'>
|
||||
<p>Short note that introduces the topic</p>
|
||||
<p class='author'>Instructor's name</p>
|
||||
</section>
|
||||
<h4>Heading for announcement 1</h4>
|
||||
<h4 class="hd hd-4">Heading for announcement 1</h4>
|
||||
<p>Announcement 1 text</p>
|
||||
<h4>Heading for announcement 2</h4>
|
||||
<h4 class="hd hd-4">Heading for announcement 2</h4>
|
||||
<p>Announcement 2 text</p>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
metadata:
|
||||
display_name: IFrame Tool
|
||||
data: |
|
||||
<h3>IFrame Tool</h3>
|
||||
<h3 class="hd hd-2">IFrame Tool</h3>
|
||||
<p>Use the IFrame tool to embed an exercise or tool from any web site into your course content. For example, the tool below allows learners to experiment with how the shape of a triangle affects a line that is derived from the triangle.</p>
|
||||
<p>Exercises in an IFrame are not graded. To embed graded exercises, use a Custom JavaScript Problem.</p>
|
||||
<p>The following code is the HTML format required to use the IFrame tool. For the IFrame in this template, you must replace the values in <i>italics</i>.</p>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
metadata:
|
||||
display_name: Full Screen Image Tool
|
||||
data: |
|
||||
<h3>Full Screen Image Tool</h3>
|
||||
<h3 class="hd hd-2">Full Screen Image Tool</h3>
|
||||
<p>Use the Full Screen Image tool to allow learners to open and zoom in on a larger version of an image in your course.</p>
|
||||
<p>With the Full Screen Image tool, learners can see the image's details as well as its context within the unit.</p>
|
||||
<p>To enable users to view the larger image, you wrap the smaller image in a link to the larger version of the image.</p>
|
||||
|
||||
@@ -12,7 +12,7 @@ metadata:
|
||||
|
||||
data: |
|
||||
<html>
|
||||
<h3>Example: E-text page</h3>
|
||||
<h3 class="hd hd-2">Example: E-text page</h3>
|
||||
<p>You can write complex equations in LaTeX.</p>
|
||||
<p>When you add the component, be sure to select <strong>Settings</strong>
|
||||
to specify a <strong>Display Name</strong> and other values that apply.</p>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
metadata:
|
||||
display_name: Zooming Image Tool
|
||||
data: |
|
||||
<h3>Zooming Image Tool</h3>
|
||||
<h3 class="hd hd-2">Zooming Image Tool</h3>
|
||||
<p>Use the Zooming Image Tool to enable learners to see details of large, complex images.</p>
|
||||
<p>With the Zooming Image Tool, the learner can move the mouse pointer over a part of the image to enlarge it and see more detail.</p>
|
||||
<p>To use the Zooming Image Tool, you must first add the <a href="http://files.edx.org/jquery.loupeAndLightbox.js" target="_blank">jquery.loupeAndLightbox.js JavaScript file</a> to your course.</p>
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -25,9 +25,6 @@ from xblock.test.tools import blocks_are_equivalent
|
||||
from opaque_keys.edx.locations import Location
|
||||
from xmodule.modulestore import EdxJSONEncoder
|
||||
from xmodule.modulestore.xml import XMLModuleStore
|
||||
from xmodule.modulestore.xml_exporter import (
|
||||
convert_between_versions, get_version
|
||||
)
|
||||
from xmodule.tests import DATA_DIR
|
||||
from xmodule.tests.helpers import directories_equal
|
||||
from xmodule.x_module import XModuleMixin
|
||||
@@ -214,173 +211,3 @@ class TestEdxJsonEncoder(unittest.TestCase):
|
||||
|
||||
with self.assertRaises(TypeError):
|
||||
self.encoder.default({})
|
||||
|
||||
|
||||
class ConvertExportFormat(unittest.TestCase):
|
||||
"""
|
||||
Tests converting between export formats.
|
||||
"""
|
||||
def setUp(self):
|
||||
""" Common setup. """
|
||||
super(ConvertExportFormat, self).setUp()
|
||||
|
||||
# Directory for expanding all the test archives
|
||||
self.temp_dir = mkdtemp()
|
||||
self.addCleanup(shutil.rmtree, self.temp_dir)
|
||||
|
||||
# Directory where new archive will be created
|
||||
self.result_dir = path(self.temp_dir) / uuid.uuid4().hex
|
||||
os.mkdir(self.result_dir)
|
||||
|
||||
# Expand all the test archives and store their paths.
|
||||
self.data_dir = path(__file__).realpath().parent / 'data'
|
||||
|
||||
self._version0_nodrafts = None
|
||||
self._version1_nodrafts = None
|
||||
self._version0_drafts = None
|
||||
self._version1_drafts = None
|
||||
self._version1_drafts_extra_branch = None
|
||||
self._no_version = None
|
||||
|
||||
@property
|
||||
def version0_nodrafts(self):
|
||||
"lazily expand this"
|
||||
if self._version0_nodrafts is None:
|
||||
self._version0_nodrafts = self._expand_archive('Version0_nodrafts.tar.gz')
|
||||
return self._version0_nodrafts
|
||||
|
||||
@property
|
||||
def version1_nodrafts(self):
|
||||
"lazily expand this"
|
||||
if self._version1_nodrafts is None:
|
||||
self._version1_nodrafts = self._expand_archive('Version1_nodrafts.tar.gz')
|
||||
return self._version1_nodrafts
|
||||
|
||||
@property
|
||||
def version0_drafts(self):
|
||||
"lazily expand this"
|
||||
if self._version0_drafts is None:
|
||||
self._version0_drafts = self._expand_archive('Version0_drafts.tar.gz')
|
||||
return self._version0_drafts
|
||||
|
||||
@property
|
||||
def version1_drafts(self):
|
||||
"lazily expand this"
|
||||
if self._version1_drafts is None:
|
||||
self._version1_drafts = self._expand_archive('Version1_drafts.tar.gz')
|
||||
return self._version1_drafts
|
||||
|
||||
@property
|
||||
def version1_drafts_extra_branch(self):
|
||||
"lazily expand this"
|
||||
if self._version1_drafts_extra_branch is None:
|
||||
self._version1_drafts_extra_branch = self._expand_archive('Version1_drafts_extra_branch.tar.gz')
|
||||
return self._version1_drafts_extra_branch
|
||||
|
||||
@property
|
||||
def no_version(self):
|
||||
"lazily expand this"
|
||||
if self._no_version is None:
|
||||
self._no_version = self._expand_archive('NoVersionNumber.tar.gz')
|
||||
return self._no_version
|
||||
|
||||
def _expand_archive(self, name):
|
||||
""" Expand archive into a directory and return the directory. """
|
||||
target = path(self.temp_dir) / uuid.uuid4().hex
|
||||
os.mkdir(target)
|
||||
with tarfile.open(self.data_dir / name) as tar_file:
|
||||
tar_file.extractall(path=target)
|
||||
|
||||
return target
|
||||
|
||||
def test_no_version(self):
|
||||
""" Test error condition of no version number specified. """
|
||||
errstring = "unknown version"
|
||||
with self.assertRaisesRegexp(ValueError, errstring):
|
||||
convert_between_versions(self.no_version, self.result_dir)
|
||||
|
||||
def test_no_published(self):
|
||||
""" Test error condition of a version 1 archive with no published branch. """
|
||||
errstring = "version 1 archive must contain a published branch"
|
||||
no_published = self._expand_archive('Version1_nopublished.tar.gz')
|
||||
with self.assertRaisesRegexp(ValueError, errstring):
|
||||
convert_between_versions(no_published, self.result_dir)
|
||||
|
||||
def test_empty_course(self):
|
||||
""" Test error condition of a version 1 archive with no published branch. """
|
||||
errstring = "source archive does not have single course directory at top level"
|
||||
empty_course = self._expand_archive('EmptyCourse.tar.gz')
|
||||
with self.assertRaisesRegexp(ValueError, errstring):
|
||||
convert_between_versions(empty_course, self.result_dir)
|
||||
|
||||
def test_convert_to_1_nodrafts(self):
|
||||
"""
|
||||
Test for converting from version 0 of export format to version 1 in a course with no drafts.
|
||||
"""
|
||||
self._verify_conversion(self.version0_nodrafts, self.version1_nodrafts)
|
||||
|
||||
def test_convert_to_1_drafts(self):
|
||||
"""
|
||||
Test for converting from version 0 of export format to version 1 in a course with drafts.
|
||||
"""
|
||||
self._verify_conversion(self.version0_drafts, self.version1_drafts)
|
||||
|
||||
def test_convert_to_0_nodrafts(self):
|
||||
"""
|
||||
Test for converting from version 1 of export format to version 0 in a course with no drafts.
|
||||
"""
|
||||
self._verify_conversion(self.version1_nodrafts, self.version0_nodrafts)
|
||||
|
||||
def test_convert_to_0_drafts(self):
|
||||
"""
|
||||
Test for converting from version 1 of export format to version 0 in a course with drafts.
|
||||
"""
|
||||
self._verify_conversion(self.version1_drafts, self.version0_drafts)
|
||||
|
||||
def test_convert_to_0_extra_branch(self):
|
||||
"""
|
||||
Test for converting from version 1 of export format to version 0 in a course
|
||||
with drafts and an extra branch.
|
||||
"""
|
||||
self._verify_conversion(self.version1_drafts_extra_branch, self.version0_drafts)
|
||||
|
||||
def test_equality_function(self):
|
||||
"""
|
||||
Check equality function returns False for unequal directories.
|
||||
"""
|
||||
self.assertFalse(directories_equal(self.version1_nodrafts, self.version0_nodrafts))
|
||||
self.assertFalse(directories_equal(self.version1_drafts_extra_branch, self.version1_drafts))
|
||||
|
||||
def test_version_0(self):
|
||||
"""
|
||||
Check that get_version correctly identifies a version 0 archive (old format).
|
||||
"""
|
||||
self.assertEqual(0, self._version_test(self.version0_nodrafts))
|
||||
|
||||
def test_version_1(self):
|
||||
"""
|
||||
Check that get_version correctly identifies a version 1 archive (new format).
|
||||
"""
|
||||
self.assertEqual(1, self._version_test(self.version1_nodrafts))
|
||||
|
||||
def test_version_missing(self):
|
||||
"""
|
||||
Check that get_version returns None if no version number is specified,
|
||||
and the archive is not version 0.
|
||||
"""
|
||||
self.assertIsNone(self._version_test(self.no_version))
|
||||
|
||||
def _version_test(self, archive_dir):
|
||||
"""
|
||||
Helper function for version tests.
|
||||
"""
|
||||
root = os.listdir(archive_dir)
|
||||
course_directory = archive_dir / root[0]
|
||||
return get_version(course_directory)
|
||||
|
||||
def _verify_conversion(self, source_archive, comparison_archive):
|
||||
"""
|
||||
Helper function for conversion tests.
|
||||
"""
|
||||
convert_between_versions(source_archive, self.result_dir)
|
||||
self.assertTrue(directories_equal(self.result_dir, comparison_archive))
|
||||
|
||||
@@ -20,47 +20,52 @@
|
||||
scrollbar-track-color: #F5F5F5;
|
||||
}
|
||||
|
||||
.mce-content-body h1 {
|
||||
.mce-content-body h1,
|
||||
.mce-content-body .hd-1 {
|
||||
color: #3c3c3c;
|
||||
font-weight: normal;
|
||||
font-size: 2em;
|
||||
line-height: 1.4em;
|
||||
letter-spacing: 1px;
|
||||
margin: 0 0 1.416em 0;
|
||||
margin: 0 0 1.41575em 0;
|
||||
}
|
||||
|
||||
.mce-content-body h2 {
|
||||
.mce-content-body h2,
|
||||
.mce-content-body .hd-2,
|
||||
.mce-content-body h3 {
|
||||
color: #646464;
|
||||
font-weight: 300;
|
||||
font-size: 1.2em;
|
||||
line-height: 1.2em;
|
||||
letter-spacing: 1px;
|
||||
margin-bottom: 15px;
|
||||
font-size: 1.6em;
|
||||
line-height: 1.4em;
|
||||
margin-bottom: 1.6em;
|
||||
text-transform: uppercase;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
}
|
||||
|
||||
.mce-content-body h3, .mce-content-body h4, .mce-content-body h5, .mce-content-body h6 {
|
||||
.mce-content-body .hd-3,
|
||||
.mce-content-body h4,
|
||||
.mce-content-body .hd-4,
|
||||
.mce-content-body h5,
|
||||
.mce-content-body .hd-5,
|
||||
.mce-content-body h6,
|
||||
.mce-content-body .hd-6 {
|
||||
margin: 0 0 10px 0;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.mce-content-body h3 {
|
||||
.mce-content-body h4,
|
||||
.mce-content-body .hd-4 {
|
||||
font-size: 1.4em;
|
||||
}
|
||||
|
||||
.mce-content-body h5,
|
||||
.mce-content-body .hd-5 {
|
||||
font-size: 1.2em;
|
||||
}
|
||||
|
||||
.mce-content-body h4 {
|
||||
.mce-content-body h6,
|
||||
.mce-content-body .hd-6 {
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
.mce-content-body h5 {
|
||||
font-size: .83em;
|
||||
}
|
||||
|
||||
.mce-content-body h6 {
|
||||
font-size: 0.75em;
|
||||
}
|
||||
|
||||
.mce-content-body p {
|
||||
margin-bottom: 1.416em;
|
||||
font-size: 1em;
|
||||
|
||||
@@ -839,6 +839,7 @@ class SpecialExamsPageAllowanceSection(PageObject):
|
||||
self.q(css='input#user_info').fill(username)
|
||||
self.q(css="input#addNewAllowance").click()
|
||||
self.wait_for_element_absence("div.modal div.modal-header", "Popup should be hidden")
|
||||
self.wait_for_ajax()
|
||||
|
||||
|
||||
class SpecialExamsPageAttemptsSection(PageObject):
|
||||
|
||||
@@ -44,5 +44,5 @@ class LibraryContentXBlockWrapper(PageObject):
|
||||
"""
|
||||
Gets headers of all child XBlocks as list of strings
|
||||
"""
|
||||
child_blocks_headers = self.q(css=self._bounded_selector("div[data-id] h3.problem-header"))
|
||||
child_blocks_headers = self.q(css=self._bounded_selector("div[data-id] .problem-header"))
|
||||
return frozenset(child.text for child in child_blocks_headers)
|
||||
|
||||
@@ -15,7 +15,7 @@ class DashboardPage(PageObject):
|
||||
url = BASE_URL + "/course/"
|
||||
|
||||
def is_browser_on_page(self):
|
||||
return self.q(css='body.view-dashboard').present
|
||||
return self.q(css='.content-primary').visible
|
||||
|
||||
@property
|
||||
def course_runs(self):
|
||||
|
||||
@@ -290,6 +290,7 @@ class ProctoredExamsTest(BaseInstructorDashboardTest):
|
||||
# Stop the timed exam.
|
||||
self.courseware_page.stop_timed_exam()
|
||||
|
||||
@flaky # TODO: fix this. See SOL-1654, SOL-1183, and SOL-1182
|
||||
def test_can_add_remove_allowance(self):
|
||||
"""
|
||||
Make sure that allowances can be added and removed.
|
||||
|
||||
@@ -4,6 +4,8 @@ from common.test.acceptance.pages.lms.oauth2_confirmation import OAuth2Confirmat
|
||||
from common.test.acceptance.pages.lms.auto_auth import AutoAuthPage
|
||||
from bok_choy.web_app_test import WebAppTest
|
||||
|
||||
from flaky import flaky
|
||||
|
||||
from urlparse import urlparse, parse_qsl
|
||||
|
||||
|
||||
@@ -42,10 +44,15 @@ class OAuth2PermissionDelegationTests(WebAppTest):
|
||||
assert self.oauth_page.visit()
|
||||
self.oauth_page.cancel()
|
||||
|
||||
# This redirects to an invalid URI.
|
||||
query = self._qs(self.browser.current_url)
|
||||
self.assertEqual('access_denied', query['error'])
|
||||
# This redirects to an invalid URI. For chrome verify title, current_url otherwise
|
||||
if self.browser.name == 'chrome':
|
||||
query = self._qs(self.browser.title)
|
||||
self.assertIn('access_denied', query['error'])
|
||||
else:
|
||||
query = self._qs(self.browser.current_url)
|
||||
self.assertIn('access_denied', query['error'])
|
||||
|
||||
@flaky # TODO, fix this: TNL-4190
|
||||
def test_accepting_redirects(self):
|
||||
"""
|
||||
If you accept the request, you're redirected to the redirect_url with
|
||||
@@ -53,8 +60,17 @@ class OAuth2PermissionDelegationTests(WebAppTest):
|
||||
"""
|
||||
self._auth()
|
||||
assert self.oauth_page.visit()
|
||||
self.oauth_page.confirm()
|
||||
|
||||
# This redirects to an invalid URI.
|
||||
query = self._qs(self.browser.current_url)
|
||||
self.oauth_page.confirm()
|
||||
self.oauth_page.wait_for_element_absence('input[name=authorize]', 'Authorization button is not present')
|
||||
|
||||
# Due to a bug in ChromeDriver, when chrome is on invalid URI,self.browser.current_url outputs
|
||||
# data:text/html,chromewebdata. When this happens in our case,query string is present in the title.
|
||||
# So to get query string, we branch out based on selected browser.
|
||||
if self.browser.name == 'chrome':
|
||||
query = self._qs(self.browser.title)
|
||||
else:
|
||||
query = self._qs(self.browser.current_url)
|
||||
|
||||
self.assertIn('code', query)
|
||||
|
||||
@@ -4,6 +4,8 @@ Acceptance tests for the Import and Export pages
|
||||
from nose.plugins.attrib import attr
|
||||
from datetime import datetime
|
||||
|
||||
from flaky import flaky
|
||||
|
||||
from abc import abstractmethod
|
||||
from bok_choy.promise import EmptyPromise
|
||||
|
||||
@@ -180,6 +182,7 @@ class ImportTestMixin(object):
|
||||
"""
|
||||
return []
|
||||
|
||||
@flaky # TODO, fix this: TNL-4191
|
||||
def test_upload(self):
|
||||
"""
|
||||
Scenario: I want to upload a course or library for import.
|
||||
|
||||
@@ -5,6 +5,7 @@ from ...pages.studio.asset_index import AssetIndexPage
|
||||
|
||||
from .base_studio_test import StudioCourseTest
|
||||
from ...fixtures.base import StudioApiLoginError
|
||||
from ..helpers import skip_if_browser
|
||||
|
||||
|
||||
class AssetIndexTest(StudioCourseTest):
|
||||
@@ -12,7 +13,6 @@ class AssetIndexTest(StudioCourseTest):
|
||||
"""
|
||||
Tests for the Asset index page.
|
||||
"""
|
||||
|
||||
def setUp(self, is_staff=False):
|
||||
super(AssetIndexTest, self).setUp()
|
||||
self.asset_page = AssetIndexPage(
|
||||
@@ -28,12 +28,7 @@ class AssetIndexTest(StudioCourseTest):
|
||||
"""
|
||||
self.course_fixture.add_asset(['image.jpg', 'textbook.pdf'])
|
||||
|
||||
def test_page_existence(self):
|
||||
"""
|
||||
Make sure that the page is accessible.
|
||||
"""
|
||||
self.asset_page.visit()
|
||||
|
||||
@skip_if_browser('chrome') # TODO Need to fix test_page_existance for this for chrome browser
|
||||
def test_type_filter_exists(self):
|
||||
"""
|
||||
Make sure type filter is on the page.
|
||||
@@ -41,6 +36,7 @@ class AssetIndexTest(StudioCourseTest):
|
||||
self.asset_page.visit()
|
||||
assert self.asset_page.type_filter_on_page() is True
|
||||
|
||||
@skip_if_browser('chrome') # TODO Need to fix test_page_existance for this for chrome browser
|
||||
def test_filter_results(self):
|
||||
"""
|
||||
Make sure type filter actually filters the results.
|
||||
|
||||
@@ -49,7 +49,6 @@ class CreateLibraryTest(WebAppTest):
|
||||
|
||||
self.auth_page.visit()
|
||||
self.dashboard_page.visit()
|
||||
self.dashboard_page.wait_for_element_visibility('.content-primary', 'See library list.')
|
||||
self.assertFalse(self.dashboard_page.has_library(name=name, org=org, number=number))
|
||||
self.assertTrue(self.dashboard_page.has_new_library_button())
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ from .base_studio_test import StudioCourseTest
|
||||
from ...pages.lms.create_mode import ModeCreationPage
|
||||
from ...pages.studio.settings_certificates import CertificatesPage
|
||||
from ...pages.studio.settings_advanced import AdvancedSettingsPage
|
||||
from ..helpers import skip_if_browser
|
||||
|
||||
|
||||
@attr('shard_8')
|
||||
@@ -160,6 +161,7 @@ class CertificatesTest(StudioCourseTest):
|
||||
self.certificates_page.visit()
|
||||
self.assertEqual(len(self.certificates_page.certificates), 0)
|
||||
|
||||
@skip_if_browser('chrome') # TODO Need to fix this for chrome browser
|
||||
def test_can_create_and_edit_signatories_of_certficate(self):
|
||||
"""
|
||||
Scenario: Ensure that the certificates can be created with signatories and edited correctly.
|
||||
|
||||
@@ -115,7 +115,7 @@ class AnnotatableProblemTest(UniqueCourseTest):
|
||||
self.courseware_page.visit()
|
||||
annotation_component_page = AnnotationComponentPage(self.browser)
|
||||
self.assertEqual(
|
||||
annotation_component_page.component_name, 'TEST ANNOTATION MODULE'.format()
|
||||
annotation_component_page.component_name, 'Test Annotation Module'.format()
|
||||
)
|
||||
return annotation_component_page
|
||||
|
||||
|
||||
@@ -630,10 +630,11 @@ class YouTubeVideoTest(VideoBaseTest):
|
||||
"""
|
||||
Scenario: Multiple videos in sequentials all load and work, switching between sequentials
|
||||
Given it has videos "A,B" in "Youtube" mode in position "1" of sequential
|
||||
And videos "E,F" in "Youtube" mode in position "2" of sequential
|
||||
And videos "C,D" in "Youtube" mode in position "2" of sequential
|
||||
"""
|
||||
self.verticals = [
|
||||
[{'display_name': 'A'}, {'display_name': 'B'}], [{'display_name': 'C'}, {'display_name': 'D'}]
|
||||
[{'display_name': 'A'}, {'display_name': 'B'}],
|
||||
[{'display_name': 'C'}, {'display_name': 'D'}]
|
||||
]
|
||||
|
||||
tab1_video_names = ['A', 'B']
|
||||
@@ -651,15 +652,16 @@ class YouTubeVideoTest(VideoBaseTest):
|
||||
|
||||
# go to video
|
||||
self.navigate_to_video()
|
||||
|
||||
execute_video_steps(tab1_video_names)
|
||||
|
||||
# go to second sequential position
|
||||
# import ipdb; ipdb.set_trace()
|
||||
self.go_to_sequential_position(2)
|
||||
execute_video_steps(tab2_video_names)
|
||||
|
||||
# go back to first sequential position
|
||||
# we are again playing tab 1 videos to ensure that switching didn't broke some video functionality.
|
||||
# import ipdb; ipdb.set_trace()
|
||||
self.go_to_sequential_position(1)
|
||||
execute_video_steps(tab1_video_names)
|
||||
|
||||
|
||||
4
common/test/data/library_empty_problem/library.xml
Normal file
4
common/test/data/library_empty_problem/library.xml
Normal file
@@ -0,0 +1,4 @@
|
||||
<library xblock-family="xblock.v1" display_name="Test Problems" org="TestOrg" library="TestProbs100">
|
||||
<problem url_name="afe9dbb29b724181944f56617c72b3e5"/>
|
||||
<problem url_name="ba28f97e8f33414e9a5de0068508f7fa"/>
|
||||
</library>
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -0,0 +1 @@
|
||||
<problem/>
|
||||
@@ -0,0 +1,28 @@
|
||||
<problem display_name="Multiple Choice" markdown="Multiple choice problems allow learners to select only one option. Learners can see all the options along with the problem text. When you add the problem, be sure to select Settings to specify a Display Name and other values that apply. You can use the following example problem as a model. >>Which of the following countries has the largest population?<< ( ) Brazil {{ timely feedback -- explain why an almost correct answer is wrong }} ( ) Germany (x) Indonesia ( ) Russia [explanation] According to September 2014 estimates: The population of Indonesia is approximately 250 million. The population of Brazil is approximately 200 million. The population of Russia is approximately 146 million. The population of Germany is approximately 81 million. [explanation] ">
|
||||
<p>Multiple choice problems allow learners to select only one option.
|
||||
Learners can see all the options along with the problem text.</p>
|
||||
<p>When you add the problem, be sure to select <strong>Settings</strong>
|
||||
to specify a <strong>Display Name</strong> and other values that apply.</p>
|
||||
<p>You can use the following example problem as a model.</p>
|
||||
<p>Which of the following countries has the largest population?</p>
|
||||
<multiplechoiceresponse>
|
||||
<choicegroup type="MultipleChoice">
|
||||
<choice correct="false" name="brazil">Brazil
|
||||
<choicehint>timely feedback -- explain why an almost correct answer is wrong</choicehint>
|
||||
</choice>
|
||||
<choice correct="false" name="germany">Germany</choice>
|
||||
<choice correct="true" name="indonesia">Indonesia</choice>
|
||||
<choice correct="false" name="russia">Russia</choice>
|
||||
</choicegroup>
|
||||
</multiplechoiceresponse>
|
||||
<solution>
|
||||
<div class="detailed-solution">
|
||||
<p>Explanation</p>
|
||||
<p>According to September 2014 estimates:</p>
|
||||
<p>The population of Indonesia is approximately 250 million.</p>
|
||||
<p>The population of Brazil is approximately 200 million.</p>
|
||||
<p>The population of Russia is approximately 146 million.</p>
|
||||
<p>The population of Germany is approximately 81 million.</p>
|
||||
</div>
|
||||
</solution>
|
||||
</problem>
|
||||
File diff suppressed because one or more lines are too long
1
common/test/db_cache/bok_choy_data_default.json
Normal file
1
common/test/db_cache/bok_choy_data_default.json
Normal file
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
[]
|
||||
File diff suppressed because one or more lines are too long
37
common/test/db_cache/bok_choy_migrations_data_default.sql
Normal file
37
common/test/db_cache/bok_choy_migrations_data_default.sql
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -20,8 +20,8 @@ CREATE TABLE `assessment_aiclassifier` (
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `assessment_aiclassifier_962f069f` (`classifier_set_id`),
|
||||
KEY `assessment_aiclassifier_385b00a3` (`criterion_id`),
|
||||
CONSTRAINT `D3bd45d5e3c9cfdc4f3b442119adebe8` FOREIGN KEY (`classifier_set_id`) REFERENCES `assessment_aiclassifierset` (`id`),
|
||||
CONSTRAINT `assessm_criterion_id_275db29f2a0e1711_fk_assessment_criterion_id` FOREIGN KEY (`criterion_id`) REFERENCES `assessment_criterion` (`id`)
|
||||
CONSTRAINT `assessm_criterion_id_275db29f2a0e1711_fk_assessment_criterion_id` FOREIGN KEY (`criterion_id`) REFERENCES `assessment_criterion` (`id`),
|
||||
CONSTRAINT `D3bd45d5e3c9cfdc4f3b442119adebe8` FOREIGN KEY (`classifier_set_id`) REFERENCES `assessment_aiclassifierset` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `assessment_aiclassifierset`;
|
||||
@@ -72,9 +72,9 @@ CREATE TABLE `assessment_aigradingworkflow` (
|
||||
KEY `assessment_aigradingworkflow_a4079fcf` (`assessment_id`),
|
||||
KEY `assessment_aigradingworkflow_962f069f` (`classifier_set_id`),
|
||||
KEY `assessment_aigradingworkflow_8980b7ae` (`rubric_id`),
|
||||
CONSTRAINT `D4d9bca115376aeb07fd970155499db3` FOREIGN KEY (`classifier_set_id`) REFERENCES `assessment_aiclassifierset` (`id`),
|
||||
CONSTRAINT `assessment_ai_rubric_id_3fc938e9e3ae7b2d_fk_assessment_rubric_id` FOREIGN KEY (`rubric_id`) REFERENCES `assessment_rubric` (`id`),
|
||||
CONSTRAINT `asses_assessment_id_68b86880a7f62f1c_fk_assessment_assessment_id` FOREIGN KEY (`assessment_id`) REFERENCES `assessment_assessment` (`id`),
|
||||
CONSTRAINT `assessment_ai_rubric_id_3fc938e9e3ae7b2d_fk_assessment_rubric_id` FOREIGN KEY (`rubric_id`) REFERENCES `assessment_rubric` (`id`)
|
||||
CONSTRAINT `D4d9bca115376aeb07fd970155499db3` FOREIGN KEY (`classifier_set_id`) REFERENCES `assessment_aiclassifierset` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `assessment_aitrainingworkflow`;
|
||||
@@ -110,8 +110,8 @@ CREATE TABLE `assessment_aitrainingworkflow_training_examples` (
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `aitrainingworkflow_id` (`aitrainingworkflow_id`,`trainingexample_id`),
|
||||
KEY `ff4ddecc43bd06c0d85785a61e955133` (`trainingexample_id`),
|
||||
CONSTRAINT `da55be90caee21d95136e40c53e5c754` FOREIGN KEY (`aitrainingworkflow_id`) REFERENCES `assessment_aitrainingworkflow` (`id`),
|
||||
CONSTRAINT `ff4ddecc43bd06c0d85785a61e955133` FOREIGN KEY (`trainingexample_id`) REFERENCES `assessment_trainingexample` (`id`)
|
||||
CONSTRAINT `ff4ddecc43bd06c0d85785a61e955133` FOREIGN KEY (`trainingexample_id`) REFERENCES `assessment_trainingexample` (`id`),
|
||||
CONSTRAINT `da55be90caee21d95136e40c53e5c754` FOREIGN KEY (`aitrainingworkflow_id`) REFERENCES `assessment_aitrainingworkflow` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `assessment_assessment`;
|
||||
@@ -154,8 +154,8 @@ CREATE TABLE `assessment_assessmentfeedback_assessments` (
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `assessmentfeedback_id` (`assessmentfeedback_id`,`assessment_id`),
|
||||
KEY `asses_assessment_id_392d354eca2e0c87_fk_assessment_assessment_id` (`assessment_id`),
|
||||
CONSTRAINT `D1fc3fa7cd7be79d20561668a95a9fc1` FOREIGN KEY (`assessmentfeedback_id`) REFERENCES `assessment_assessmentfeedback` (`id`),
|
||||
CONSTRAINT `asses_assessment_id_392d354eca2e0c87_fk_assessment_assessment_id` FOREIGN KEY (`assessment_id`) REFERENCES `assessment_assessment` (`id`)
|
||||
CONSTRAINT `asses_assessment_id_392d354eca2e0c87_fk_assessment_assessment_id` FOREIGN KEY (`assessment_id`) REFERENCES `assessment_assessment` (`id`),
|
||||
CONSTRAINT `D1fc3fa7cd7be79d20561668a95a9fc1` FOREIGN KEY (`assessmentfeedback_id`) REFERENCES `assessment_assessmentfeedback` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `assessment_assessmentfeedback_options`;
|
||||
@@ -168,8 +168,8 @@ CREATE TABLE `assessment_assessmentfeedback_options` (
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `assessmentfeedback_id` (`assessmentfeedback_id`,`assessmentfeedbackoption_id`),
|
||||
KEY `cc7028abc88c431df3172c9b2d6422e4` (`assessmentfeedbackoption_id`),
|
||||
CONSTRAINT `cba12ac98c4a04d67d5edaa2223f4fe5` FOREIGN KEY (`assessmentfeedback_id`) REFERENCES `assessment_assessmentfeedback` (`id`),
|
||||
CONSTRAINT `cc7028abc88c431df3172c9b2d6422e4` FOREIGN KEY (`assessmentfeedbackoption_id`) REFERENCES `assessment_assessmentfeedbackoption` (`id`)
|
||||
CONSTRAINT `cc7028abc88c431df3172c9b2d6422e4` FOREIGN KEY (`assessmentfeedbackoption_id`) REFERENCES `assessment_assessmentfeedbackoption` (`id`),
|
||||
CONSTRAINT `cba12ac98c4a04d67d5edaa2223f4fe5` FOREIGN KEY (`assessmentfeedback_id`) REFERENCES `assessment_assessmentfeedback` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `assessment_assessmentfeedbackoption`;
|
||||
@@ -196,8 +196,8 @@ CREATE TABLE `assessment_assessmentpart` (
|
||||
KEY `assessment_assessmentpart_385b00a3` (`criterion_id`),
|
||||
KEY `assessment_assessmentpart_28df3725` (`option_id`),
|
||||
CONSTRAINT `asse_option_id_2508a14feeabf4ce_fk_assessment_criterionoption_id` FOREIGN KEY (`option_id`) REFERENCES `assessment_criterionoption` (`id`),
|
||||
CONSTRAINT `asses_assessment_id_1d752290138ce479_fk_assessment_assessment_id` FOREIGN KEY (`assessment_id`) REFERENCES `assessment_assessment` (`id`),
|
||||
CONSTRAINT `assessm_criterion_id_2061f2359fd292bf_fk_assessment_criterion_id` FOREIGN KEY (`criterion_id`) REFERENCES `assessment_criterion` (`id`)
|
||||
CONSTRAINT `assessm_criterion_id_2061f2359fd292bf_fk_assessment_criterion_id` FOREIGN KEY (`criterion_id`) REFERENCES `assessment_criterion` (`id`),
|
||||
CONSTRAINT `asses_assessment_id_1d752290138ce479_fk_assessment_assessment_id` FOREIGN KEY (`assessment_id`) REFERENCES `assessment_assessment` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `assessment_criterion`;
|
||||
@@ -272,9 +272,9 @@ CREATE TABLE `assessment_peerworkflowitem` (
|
||||
KEY `assessm_scorer_id_2d803ee2d52c0e2c_fk_assessment_peerworkflow_id` (`scorer_id`),
|
||||
KEY `assessment_peerworkflowitem_ab5b2b73` (`submission_uuid`),
|
||||
KEY `assessment_peerworkflowitem_ff1ae11b` (`started_at`),
|
||||
CONSTRAINT `asses_assessment_id_15cadfae90ddcc2a_fk_assessment_assessment_id` FOREIGN KEY (`assessment_id`) REFERENCES `assessment_assessment` (`id`),
|
||||
CONSTRAINT `assessm_scorer_id_2d803ee2d52c0e2c_fk_assessment_peerworkflow_id` FOREIGN KEY (`scorer_id`) REFERENCES `assessment_peerworkflow` (`id`),
|
||||
CONSTRAINT `assessm_author_id_1948f89dea6d2b5f_fk_assessment_peerworkflow_id` FOREIGN KEY (`author_id`) REFERENCES `assessment_peerworkflow` (`id`),
|
||||
CONSTRAINT `assessm_scorer_id_2d803ee2d52c0e2c_fk_assessment_peerworkflow_id` FOREIGN KEY (`scorer_id`) REFERENCES `assessment_peerworkflow` (`id`)
|
||||
CONSTRAINT `asses_assessment_id_15cadfae90ddcc2a_fk_assessment_assessment_id` FOREIGN KEY (`assessment_id`) REFERENCES `assessment_assessment` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `assessment_rubric`;
|
||||
@@ -345,8 +345,8 @@ CREATE TABLE `assessment_studenttrainingworkflowitem` (
|
||||
UNIQUE KEY `assessment_studenttrainingwork_workflow_id_484e930feb86ad74_uniq` (`workflow_id`,`order_num`),
|
||||
KEY `assessment_studenttrainingworkflowitem_9cc97abc` (`training_example_id`),
|
||||
KEY `assessment_studenttrainingworkflowitem_846c77cf` (`workflow_id`),
|
||||
CONSTRAINT `D74ce3e30635de397fef41ac869640c7` FOREIGN KEY (`training_example_id`) REFERENCES `assessment_trainingexample` (`id`),
|
||||
CONSTRAINT `f9c080ebc7ad16394edda963ed3f280f` FOREIGN KEY (`workflow_id`) REFERENCES `assessment_studenttrainingworkflow` (`id`)
|
||||
CONSTRAINT `f9c080ebc7ad16394edda963ed3f280f` FOREIGN KEY (`workflow_id`) REFERENCES `assessment_studenttrainingworkflow` (`id`),
|
||||
CONSTRAINT `D74ce3e30635de397fef41ac869640c7` FOREIGN KEY (`training_example_id`) REFERENCES `assessment_trainingexample` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `assessment_trainingexample`;
|
||||
@@ -412,7 +412,7 @@ CREATE TABLE `auth_permission` (
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `content_type_id` (`content_type_id`,`codename`),
|
||||
CONSTRAINT `auth__content_type_id_508cf46651277a81_fk_django_content_type_id` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=746 DEFAULT CHARSET=utf8;
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=755 DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `auth_registration`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
@@ -444,7 +444,7 @@ CREATE TABLE `auth_user` (
|
||||
`date_joined` datetime(6) NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `username` (`username`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `auth_user_groups`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
@@ -872,6 +872,35 @@ CREATE TABLE `certificates_generatedcertificate` (
|
||||
CONSTRAINT `certificates_generatedc_user_id_77ed5f7a53121815_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `commerce_commerceconfiguration`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!40101 SET character_set_client = utf8 */;
|
||||
CREATE TABLE `commerce_commerceconfiguration` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`change_date` datetime(6) NOT NULL,
|
||||
`enabled` tinyint(1) NOT NULL,
|
||||
`checkout_on_ecommerce_service` tinyint(1) NOT NULL,
|
||||
`single_course_checkout_page` varchar(255) NOT NULL,
|
||||
`changed_by_id` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `commerce_commerce_changed_by_id_7441951d1c97c1d7_fk_auth_user_id` (`changed_by_id`),
|
||||
CONSTRAINT `commerce_commerce_changed_by_id_7441951d1c97c1d7_fk_auth_user_id` FOREIGN KEY (`changed_by_id`) REFERENCES `auth_user` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `contentserver_courseassetcachettlconfig`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!40101 SET character_set_client = utf8 */;
|
||||
CREATE TABLE `contentserver_courseassetcachettlconfig` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`change_date` datetime(6) NOT NULL,
|
||||
`enabled` tinyint(1) NOT NULL,
|
||||
`cache_ttl` int(10) unsigned NOT NULL,
|
||||
`changed_by_id` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `contentserver_cou_changed_by_id_3b5e5ff6c6df495d_fk_auth_user_id` (`changed_by_id`),
|
||||
CONSTRAINT `contentserver_cou_changed_by_id_3b5e5ff6c6df495d_fk_auth_user_id` FOREIGN KEY (`changed_by_id`) REFERENCES `auth_user` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `contentstore_pushnotificationconfig`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!40101 SET character_set_client = utf8 */;
|
||||
@@ -945,8 +974,8 @@ CREATE TABLE `course_action_state_coursererunstate` (
|
||||
KEY `course_action_state_coursererunstate_c8235886` (`course_key`),
|
||||
KEY `course_action_state_coursererunstate_418c5509` (`action`),
|
||||
KEY `course_action_state_coursererunstate_a9bd7343` (`source_course_key`),
|
||||
CONSTRAINT `course_action_s_created_user_id_7f53088ef8dccd0b_fk_auth_user_id` FOREIGN KEY (`created_user_id`) REFERENCES `auth_user` (`id`),
|
||||
CONSTRAINT `course_action_s_updated_user_id_4fab18012332c9a4_fk_auth_user_id` FOREIGN KEY (`updated_user_id`) REFERENCES `auth_user` (`id`)
|
||||
CONSTRAINT `course_action_s_updated_user_id_4fab18012332c9a4_fk_auth_user_id` FOREIGN KEY (`updated_user_id`) REFERENCES `auth_user` (`id`),
|
||||
CONSTRAINT `course_action_s_created_user_id_7f53088ef8dccd0b_fk_auth_user_id` FOREIGN KEY (`created_user_id`) REFERENCES `auth_user` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `course_creators_coursecreator`;
|
||||
@@ -975,8 +1004,8 @@ CREATE TABLE `course_groups_cohortmembership` (
|
||||
UNIQUE KEY `course_groups_cohortmembership_user_id_395bddd0389ed7da_uniq` (`user_id`,`course_id`),
|
||||
KEY `course_groups_cohortmembership_6e438ee3` (`course_user_group_id`),
|
||||
KEY `course_groups_cohortmembership_e8701ad4` (`user_id`),
|
||||
CONSTRAINT `D004e77c965054d46217a8bd48bcaec8` FOREIGN KEY (`course_user_group_id`) REFERENCES `course_groups_courseusergroup` (`id`),
|
||||
CONSTRAINT `course_groups_cohortmem_user_id_15d408bf736398bf_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`)
|
||||
CONSTRAINT `course_groups_cohortmem_user_id_15d408bf736398bf_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`),
|
||||
CONSTRAINT `D004e77c965054d46217a8bd48bcaec8` FOREIGN KEY (`course_user_group_id`) REFERENCES `course_groups_courseusergroup` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `course_groups_coursecohort`;
|
||||
@@ -1114,7 +1143,6 @@ CREATE TABLE `course_overviews_courseoverview` (
|
||||
`end` datetime(6) DEFAULT NULL,
|
||||
`advertised_start` longtext,
|
||||
`course_image_url` longtext NOT NULL,
|
||||
`facebook_url` longtext,
|
||||
`social_sharing_url` longtext,
|
||||
`end_of_course_survey_url` longtext,
|
||||
`certificates_display_behavior` longtext,
|
||||
@@ -1139,6 +1167,7 @@ CREATE TABLE `course_overviews_courseoverview` (
|
||||
`effort` longtext,
|
||||
`short_description` longtext,
|
||||
`org` longtext NOT NULL,
|
||||
`facebook_url` longtext,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
@@ -1558,8 +1587,8 @@ CREATE TABLE `django_admin_log` (
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `djang_content_type_id_697914295151027a_fk_django_content_type_id` (`content_type_id`),
|
||||
KEY `django_admin_log_user_id_52fdd58701c5f563_fk_auth_user_id` (`user_id`),
|
||||
CONSTRAINT `djang_content_type_id_697914295151027a_fk_django_content_type_id` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`),
|
||||
CONSTRAINT `django_admin_log_user_id_52fdd58701c5f563_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`)
|
||||
CONSTRAINT `django_admin_log_user_id_52fdd58701c5f563_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`),
|
||||
CONSTRAINT `djang_content_type_id_697914295151027a_fk_django_content_type_id` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `django_comment_client_permission`;
|
||||
@@ -1580,8 +1609,8 @@ CREATE TABLE `django_comment_client_permission_roles` (
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `permission_id` (`permission_id`,`role_id`),
|
||||
KEY `django_role_id_558412c96ef7ba87_fk_django_comment_client_role_id` (`role_id`),
|
||||
CONSTRAINT `D4e9a4067c1db9041491363f5e032121` FOREIGN KEY (`permission_id`) REFERENCES `django_comment_client_permission` (`name`),
|
||||
CONSTRAINT `django_role_id_558412c96ef7ba87_fk_django_comment_client_role_id` FOREIGN KEY (`role_id`) REFERENCES `django_comment_client_role` (`id`)
|
||||
CONSTRAINT `django_role_id_558412c96ef7ba87_fk_django_comment_client_role_id` FOREIGN KEY (`role_id`) REFERENCES `django_comment_client_role` (`id`),
|
||||
CONSTRAINT `D4e9a4067c1db9041491363f5e032121` FOREIGN KEY (`permission_id`) REFERENCES `django_comment_client_permission` (`name`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `django_comment_client_role`;
|
||||
@@ -1618,7 +1647,7 @@ CREATE TABLE `django_content_type` (
|
||||
`model` varchar(100) NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `django_content_type_app_label_45f3b1d93ec8c61c_uniq` (`app_label`,`model`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=248 DEFAULT CHARSET=utf8;
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=251 DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `django_migrations`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
@@ -1629,7 +1658,7 @@ CREATE TABLE `django_migrations` (
|
||||
`name` varchar(255) NOT NULL,
|
||||
`applied` datetime(6) NOT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=107 DEFAULT CHARSET=utf8;
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=119 DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `django_openid_auth_association`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
@@ -1737,8 +1766,8 @@ CREATE TABLE `djcelery_periodictask` (
|
||||
UNIQUE KEY `name` (`name`),
|
||||
KEY `djc_interval_id_20cfc1cad060dfad_fk_djcelery_intervalschedule_id` (`interval_id`),
|
||||
KEY `djcel_crontab_id_1d8228f5b44b680a_fk_djcelery_crontabschedule_id` (`crontab_id`),
|
||||
CONSTRAINT `djc_interval_id_20cfc1cad060dfad_fk_djcelery_intervalschedule_id` FOREIGN KEY (`interval_id`) REFERENCES `djcelery_intervalschedule` (`id`),
|
||||
CONSTRAINT `djcel_crontab_id_1d8228f5b44b680a_fk_djcelery_crontabschedule_id` FOREIGN KEY (`crontab_id`) REFERENCES `djcelery_crontabschedule` (`id`)
|
||||
CONSTRAINT `djcel_crontab_id_1d8228f5b44b680a_fk_djcelery_crontabschedule_id` FOREIGN KEY (`crontab_id`) REFERENCES `djcelery_crontabschedule` (`id`),
|
||||
CONSTRAINT `djc_interval_id_20cfc1cad060dfad_fk_djcelery_intervalschedule_id` FOREIGN KEY (`interval_id`) REFERENCES `djcelery_intervalschedule` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `djcelery_periodictasks`;
|
||||
@@ -1819,8 +1848,8 @@ CREATE TABLE `edxval_encodedvideo` (
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `edxval_encodedvideo_83a0eb3f` (`profile_id`),
|
||||
KEY `edxval_encodedvideo_b58b747e` (`video_id`),
|
||||
CONSTRAINT `edxval_encodedv_profile_id_484a111092acafb3_fk_edxval_profile_id` FOREIGN KEY (`profile_id`) REFERENCES `edxval_profile` (`id`),
|
||||
CONSTRAINT `edxval_encodedvideo_video_id_56934bca09fc3b13_fk_edxval_video_id` FOREIGN KEY (`video_id`) REFERENCES `edxval_video` (`id`)
|
||||
CONSTRAINT `edxval_encodedvideo_video_id_56934bca09fc3b13_fk_edxval_video_id` FOREIGN KEY (`video_id`) REFERENCES `edxval_video` (`id`),
|
||||
CONSTRAINT `edxval_encodedv_profile_id_484a111092acafb3_fk_edxval_profile_id` FOREIGN KEY (`profile_id`) REFERENCES `edxval_profile` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `edxval_profile`;
|
||||
@@ -2087,8 +2116,7 @@ CREATE TABLE `microsite_configuration_micrositehistory` (
|
||||
`values` longtext NOT NULL,
|
||||
`site_id` int(11) NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `key` (`key`),
|
||||
UNIQUE KEY `site_id` (`site_id`),
|
||||
KEY `microsite_configurati_site_id_6977a04d3625a533_fk_django_site_id` (`site_id`),
|
||||
CONSTRAINT `microsite_configurati_site_id_6977a04d3625a533_fk_django_site_id` FOREIGN KEY (`site_id`) REFERENCES `django_site` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
@@ -2131,12 +2159,14 @@ CREATE TABLE `milestones_coursecontentmilestone` (
|
||||
`active` tinyint(1) NOT NULL,
|
||||
`milestone_id` int(11) NOT NULL,
|
||||
`milestone_relationship_type_id` int(11) NOT NULL,
|
||||
`requirements` varchar(255),
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `milestones_coursecontentmileston_course_id_68d1457cd52d6dff_uniq` (`course_id`,`content_id`,`milestone_id`),
|
||||
KEY `milestones_coursecontentmilestone_ea134da7` (`course_id`),
|
||||
KEY `milestones_coursecontentmilestone_e14f02ad` (`content_id`),
|
||||
KEY `milestones_coursecontentmilestone_dbb5cd1e` (`milestone_id`),
|
||||
KEY `milestones_coursecontentmilestone_db6866e3` (`milestone_relationship_type_id`),
|
||||
KEY `milestones_coursecontentmilestone_active_39b5c645fa33bfee_uniq` (`active`),
|
||||
CONSTRAINT `D84e404851bc6d6b9fe0d60955e8729c` FOREIGN KEY (`milestone_relationship_type_id`) REFERENCES `milestones_milestonerelationshiptype` (`id`),
|
||||
CONSTRAINT `milesto_milestone_id_73b6eddde5b205a8_fk_milestones_milestone_id` FOREIGN KEY (`milestone_id`) REFERENCES `milestones_milestone` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
@@ -2157,6 +2187,7 @@ CREATE TABLE `milestones_coursemilestone` (
|
||||
KEY `milestones_coursemilestone_ea134da7` (`course_id`),
|
||||
KEY `milestones_coursemilestone_dbb5cd1e` (`milestone_id`),
|
||||
KEY `milestones_coursemilestone_db6866e3` (`milestone_relationship_type_id`),
|
||||
KEY `milestones_coursemilestone_active_5c3a925f8cc4bde2_uniq` (`active`),
|
||||
CONSTRAINT `D69536d0d313008147c5daf5341090e1` FOREIGN KEY (`milestone_relationship_type_id`) REFERENCES `milestones_milestonerelationshiptype` (`id`),
|
||||
CONSTRAINT `milesto_milestone_id_284153799c54d7d8_fk_milestones_milestone_id` FOREIGN KEY (`milestone_id`) REFERENCES `milestones_milestone` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
@@ -2176,7 +2207,8 @@ CREATE TABLE `milestones_milestone` (
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `milestones_milestone_namespace_460a2f6943016c0b_uniq` (`namespace`,`name`),
|
||||
KEY `milestones_milestone_89801e9e` (`namespace`),
|
||||
KEY `milestones_milestone_b068931c` (`name`)
|
||||
KEY `milestones_milestone_b068931c` (`name`),
|
||||
KEY `milestones_milestone_active_1182ba3c09d42c35_uniq` (`active`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `milestones_milestonerelationshiptype`;
|
||||
@@ -2209,6 +2241,7 @@ CREATE TABLE `milestones_usermilestone` (
|
||||
UNIQUE KEY `milestones_usermilestone_user_id_10206aa452468351_uniq` (`user_id`,`milestone_id`),
|
||||
KEY `milesto_milestone_id_4fe38e3e9994f15c_fk_milestones_milestone_id` (`milestone_id`),
|
||||
KEY `milestones_usermilestone_e8701ad4` (`user_id`),
|
||||
KEY `milestones_usermilestone_active_1827f467fe87a8ea_uniq` (`active`),
|
||||
CONSTRAINT `milesto_milestone_id_4fe38e3e9994f15c_fk_milestones_milestone_id` FOREIGN KEY (`milestone_id`) REFERENCES `milestones_milestone` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
@@ -2304,8 +2337,8 @@ CREATE TABLE `notify_subscription` (
|
||||
PRIMARY KEY (`subscription_id`),
|
||||
KEY `a2462650bbefc26547210b80dec61069` (`notification_type_id`),
|
||||
KEY `notify_subscr_settings_id_64d594d127e8ca95_fk_notify_settings_id` (`settings_id`),
|
||||
CONSTRAINT `a2462650bbefc26547210b80dec61069` FOREIGN KEY (`notification_type_id`) REFERENCES `notify_notificationtype` (`key`),
|
||||
CONSTRAINT `notify_subscr_settings_id_64d594d127e8ca95_fk_notify_settings_id` FOREIGN KEY (`settings_id`) REFERENCES `notify_settings` (`id`)
|
||||
CONSTRAINT `notify_subscr_settings_id_64d594d127e8ca95_fk_notify_settings_id` FOREIGN KEY (`settings_id`) REFERENCES `notify_settings` (`id`),
|
||||
CONSTRAINT `a2462650bbefc26547210b80dec61069` FOREIGN KEY (`notification_type_id`) REFERENCES `notify_notificationtype` (`key`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `oauth2_accesstoken`;
|
||||
@@ -2322,8 +2355,8 @@ CREATE TABLE `oauth2_accesstoken` (
|
||||
KEY `oauth2_accesstoken_94a08da1` (`token`),
|
||||
KEY `oauth2_accesstoken_2bfe9d72` (`client_id`),
|
||||
KEY `oauth2_accesstoken_e8701ad4` (`user_id`),
|
||||
CONSTRAINT `oauth2_accesstoke_client_id_20c73b03a7c139a2_fk_oauth2_client_id` FOREIGN KEY (`client_id`) REFERENCES `oauth2_client` (`id`),
|
||||
CONSTRAINT `oauth2_accesstoken_user_id_7a865c7085722378_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`)
|
||||
CONSTRAINT `oauth2_accesstoken_user_id_7a865c7085722378_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`),
|
||||
CONSTRAINT `oauth2_accesstoke_client_id_20c73b03a7c139a2_fk_oauth2_client_id` FOREIGN KEY (`client_id`) REFERENCES `oauth2_client` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `oauth2_client`;
|
||||
@@ -2357,8 +2390,8 @@ CREATE TABLE `oauth2_grant` (
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `oauth2_grant_client_id_fbfc174fbc856af_fk_oauth2_client_id` (`client_id`),
|
||||
KEY `oauth2_grant_user_id_3de96a461bb76819_fk_auth_user_id` (`user_id`),
|
||||
CONSTRAINT `oauth2_grant_client_id_fbfc174fbc856af_fk_oauth2_client_id` FOREIGN KEY (`client_id`) REFERENCES `oauth2_client` (`id`),
|
||||
CONSTRAINT `oauth2_grant_user_id_3de96a461bb76819_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`)
|
||||
CONSTRAINT `oauth2_grant_user_id_3de96a461bb76819_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`),
|
||||
CONSTRAINT `oauth2_grant_client_id_fbfc174fbc856af_fk_oauth2_client_id` FOREIGN KEY (`client_id`) REFERENCES `oauth2_client` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `oauth2_provider_trustedclient`;
|
||||
@@ -2386,9 +2419,9 @@ CREATE TABLE `oauth2_refreshtoken` (
|
||||
UNIQUE KEY `access_token_id` (`access_token_id`),
|
||||
KEY `oauth2_refreshtok_client_id_2f55036ac9aa614e_fk_oauth2_client_id` (`client_id`),
|
||||
KEY `oauth2_refreshtoken_user_id_acecf94460b787c_fk_auth_user_id` (`user_id`),
|
||||
CONSTRAINT `oauth2__access_token_id_f99377d503a000b_fk_oauth2_accesstoken_id` FOREIGN KEY (`access_token_id`) REFERENCES `oauth2_accesstoken` (`id`),
|
||||
CONSTRAINT `oauth2_refreshtoken_user_id_acecf94460b787c_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`),
|
||||
CONSTRAINT `oauth2_refreshtok_client_id_2f55036ac9aa614e_fk_oauth2_client_id` FOREIGN KEY (`client_id`) REFERENCES `oauth2_client` (`id`),
|
||||
CONSTRAINT `oauth2_refreshtoken_user_id_acecf94460b787c_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`)
|
||||
CONSTRAINT `oauth2__access_token_id_f99377d503a000b_fk_oauth2_accesstoken_id` FOREIGN KEY (`access_token_id`) REFERENCES `oauth2_accesstoken` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `oauth_provider_consumer`;
|
||||
@@ -2452,9 +2485,9 @@ CREATE TABLE `oauth_provider_token` (
|
||||
KEY `oauth_consumer_id_1b9915b5bcf1ee5b_fk_oauth_provider_consumer_id` (`consumer_id`),
|
||||
KEY `oauth_provi_scope_id_459821b6fecbc02a_fk_oauth_provider_scope_id` (`scope_id`),
|
||||
KEY `oauth_provider_token_user_id_588adbcffc892186_fk_auth_user_id` (`user_id`),
|
||||
CONSTRAINT `oauth_provider_token_user_id_588adbcffc892186_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`),
|
||||
CONSTRAINT `oauth_consumer_id_1b9915b5bcf1ee5b_fk_oauth_provider_consumer_id` FOREIGN KEY (`consumer_id`) REFERENCES `oauth_provider_consumer` (`id`),
|
||||
CONSTRAINT `oauth_provi_scope_id_459821b6fecbc02a_fk_oauth_provider_scope_id` FOREIGN KEY (`scope_id`) REFERENCES `oauth_provider_scope` (`id`),
|
||||
CONSTRAINT `oauth_provider_token_user_id_588adbcffc892186_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`)
|
||||
CONSTRAINT `oauth_provi_scope_id_459821b6fecbc02a_fk_oauth_provider_scope_id` FOREIGN KEY (`scope_id`) REFERENCES `oauth_provider_scope` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `organizations_organization`;
|
||||
@@ -2491,24 +2524,6 @@ CREATE TABLE `organizations_organizationcourse` (
|
||||
CONSTRAINT `a7b04b16eba98e518fbe21d390bd8e3e` FOREIGN KEY (`organization_id`) REFERENCES `organizations_organization` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `problem_builder_answer`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!40101 SET character_set_client = utf8 */;
|
||||
CREATE TABLE `problem_builder_answer` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(50) NOT NULL,
|
||||
`student_id` varchar(32) NOT NULL,
|
||||
`course_id` varchar(50) NOT NULL,
|
||||
`student_input` longtext NOT NULL,
|
||||
`created_on` datetime(6) NOT NULL,
|
||||
`modified_on` datetime(6) NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `problem_builder_answer_student_id_2f6847a9fb3e9385_uniq` (`student_id`,`course_id`,`name`),
|
||||
KEY `problem_builder_answer_b068931c` (`name`),
|
||||
KEY `problem_builder_answer_30a811f6` (`student_id`),
|
||||
KEY `problem_builder_answer_ea134da7` (`course_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `proctoring_proctoredexam`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!40101 SET character_set_client = utf8 */;
|
||||
@@ -2545,8 +2560,8 @@ CREATE TABLE `proctoring_proctoredexamreviewpolicy` (
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `D32bab97500954b362d3f768dd89b6da` (`proctored_exam_id`),
|
||||
KEY `proctoring_proct_set_by_user_id_75a66580aa44cd84_fk_auth_user_id` (`set_by_user_id`),
|
||||
CONSTRAINT `D32bab97500954b362d3f768dd89b6da` FOREIGN KEY (`proctored_exam_id`) REFERENCES `proctoring_proctoredexam` (`id`),
|
||||
CONSTRAINT `proctoring_proct_set_by_user_id_75a66580aa44cd84_fk_auth_user_id` FOREIGN KEY (`set_by_user_id`) REFERENCES `auth_user` (`id`)
|
||||
CONSTRAINT `proctoring_proct_set_by_user_id_75a66580aa44cd84_fk_auth_user_id` FOREIGN KEY (`set_by_user_id`) REFERENCES `auth_user` (`id`),
|
||||
CONSTRAINT `D32bab97500954b362d3f768dd89b6da` FOREIGN KEY (`proctored_exam_id`) REFERENCES `proctoring_proctoredexam` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `proctoring_proctoredexamreviewpolicyhistory`;
|
||||
@@ -2564,8 +2579,8 @@ CREATE TABLE `proctoring_proctoredexamreviewpolicyhistory` (
|
||||
KEY `d9965d8af87bebd0587414ca1ba4826f` (`proctored_exam_id`),
|
||||
KEY `proctoring_procto_set_by_user_id_31fae610848d90f_fk_auth_user_id` (`set_by_user_id`),
|
||||
KEY `proctoring_proctoredexamreviewpolicyhistory_524b09d0` (`original_id`),
|
||||
CONSTRAINT `d9965d8af87bebd0587414ca1ba4826f` FOREIGN KEY (`proctored_exam_id`) REFERENCES `proctoring_proctoredexam` (`id`),
|
||||
CONSTRAINT `proctoring_procto_set_by_user_id_31fae610848d90f_fk_auth_user_id` FOREIGN KEY (`set_by_user_id`) REFERENCES `auth_user` (`id`)
|
||||
CONSTRAINT `proctoring_procto_set_by_user_id_31fae610848d90f_fk_auth_user_id` FOREIGN KEY (`set_by_user_id`) REFERENCES `auth_user` (`id`),
|
||||
CONSTRAINT `d9965d8af87bebd0587414ca1ba4826f` FOREIGN KEY (`proctored_exam_id`) REFERENCES `proctoring_proctoredexam` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `proctoring_proctoredexamsoftwaresecurereview`;
|
||||
@@ -2583,13 +2598,14 @@ CREATE TABLE `proctoring_proctoredexamsoftwaresecurereview` (
|
||||
`reviewed_by_id` int(11) DEFAULT NULL,
|
||||
`student_id` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `proctoring_proctoredexamsoftw_attempt_code_69b9866a54964afb_uniq` (`attempt_code`),
|
||||
KEY `proctori_exam_id_635059f5fe2cc392_fk_proctoring_proctoredexam_id` (`exam_id`),
|
||||
KEY `proctoring_proct_reviewed_by_id_4cff67b7de094f65_fk_auth_user_id` (`reviewed_by_id`),
|
||||
KEY `proctoring_proctored_student_id_14c182517b0cbb5b_fk_auth_user_id` (`student_id`),
|
||||
KEY `proctoring_proctoredexamsoftwaresecurereview_b38e5b0e` (`attempt_code`),
|
||||
CONSTRAINT `proctori_exam_id_635059f5fe2cc392_fk_proctoring_proctoredexam_id` FOREIGN KEY (`exam_id`) REFERENCES `proctoring_proctoredexam` (`id`),
|
||||
CONSTRAINT `proctoring_proctored_student_id_14c182517b0cbb5b_fk_auth_user_id` FOREIGN KEY (`student_id`) REFERENCES `auth_user` (`id`),
|
||||
CONSTRAINT `proctoring_proct_reviewed_by_id_4cff67b7de094f65_fk_auth_user_id` FOREIGN KEY (`reviewed_by_id`) REFERENCES `auth_user` (`id`),
|
||||
CONSTRAINT `proctoring_proctored_student_id_14c182517b0cbb5b_fk_auth_user_id` FOREIGN KEY (`student_id`) REFERENCES `auth_user` (`id`)
|
||||
CONSTRAINT `proctori_exam_id_635059f5fe2cc392_fk_proctoring_proctoredexam_id` FOREIGN KEY (`exam_id`) REFERENCES `proctoring_proctoredexam` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `proctoring_proctoredexamsoftwaresecurereviewhistory`;
|
||||
@@ -2611,9 +2627,9 @@ CREATE TABLE `proctoring_proctoredexamsoftwaresecurereviewhistory` (
|
||||
KEY `proctoring_proct_reviewed_by_id_139568d0bf423998_fk_auth_user_id` (`reviewed_by_id`),
|
||||
KEY `proctoring_proctored_student_id_6922ba3b791462d8_fk_auth_user_id` (`student_id`),
|
||||
KEY `proctoring_proctoredexamsoftwaresecurereviewhistory_b38e5b0e` (`attempt_code`),
|
||||
CONSTRAINT `proctori_exam_id_73969ae423813477_fk_proctoring_proctoredexam_id` FOREIGN KEY (`exam_id`) REFERENCES `proctoring_proctoredexam` (`id`),
|
||||
CONSTRAINT `proctoring_proctored_student_id_6922ba3b791462d8_fk_auth_user_id` FOREIGN KEY (`student_id`) REFERENCES `auth_user` (`id`),
|
||||
CONSTRAINT `proctoring_proct_reviewed_by_id_139568d0bf423998_fk_auth_user_id` FOREIGN KEY (`reviewed_by_id`) REFERENCES `auth_user` (`id`),
|
||||
CONSTRAINT `proctoring_proctored_student_id_6922ba3b791462d8_fk_auth_user_id` FOREIGN KEY (`student_id`) REFERENCES `auth_user` (`id`)
|
||||
CONSTRAINT `proctori_exam_id_73969ae423813477_fk_proctoring_proctoredexam_id` FOREIGN KEY (`exam_id`) REFERENCES `proctoring_proctoredexam` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `proctoring_proctoredexamstudentallowance`;
|
||||
@@ -2630,8 +2646,8 @@ CREATE TABLE `proctoring_proctoredexamstudentallowance` (
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `proctoring_proctoredexamstudentall_user_id_665ed945152c2f60_uniq` (`user_id`,`proctored_exam_id`,`key`),
|
||||
KEY `db55b83a7875e70b3a0ebd1f81a898d8` (`proctored_exam_id`),
|
||||
CONSTRAINT `db55b83a7875e70b3a0ebd1f81a898d8` FOREIGN KEY (`proctored_exam_id`) REFERENCES `proctoring_proctoredexam` (`id`),
|
||||
CONSTRAINT `proctoring_proctoredexam_user_id_a0a0681d4a01661_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`)
|
||||
CONSTRAINT `proctoring_proctoredexam_user_id_a0a0681d4a01661_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`),
|
||||
CONSTRAINT `db55b83a7875e70b3a0ebd1f81a898d8` FOREIGN KEY (`proctored_exam_id`) REFERENCES `proctoring_proctoredexam` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `proctoring_proctoredexamstudentallowancehistory`;
|
||||
@@ -2649,8 +2665,8 @@ CREATE TABLE `proctoring_proctoredexamstudentallowancehistory` (
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `D169ec97a7fca1dbf6b0bb2929d41ccc` (`proctored_exam_id`),
|
||||
KEY `proctoring_proctoredexa_user_id_68e25e3abb187580_fk_auth_user_id` (`user_id`),
|
||||
CONSTRAINT `D169ec97a7fca1dbf6b0bb2929d41ccc` FOREIGN KEY (`proctored_exam_id`) REFERENCES `proctoring_proctoredexam` (`id`),
|
||||
CONSTRAINT `proctoring_proctoredexa_user_id_68e25e3abb187580_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`)
|
||||
CONSTRAINT `proctoring_proctoredexa_user_id_68e25e3abb187580_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`),
|
||||
CONSTRAINT `D169ec97a7fca1dbf6b0bb2929d41ccc` FOREIGN KEY (`proctored_exam_id`) REFERENCES `proctoring_proctoredexam` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `proctoring_proctoredexamstudentattempt`;
|
||||
@@ -2729,8 +2745,8 @@ CREATE TABLE `proctoring_proctoredexamstudentattempthistory` (
|
||||
KEY `proctoring_proctoredexa_user_id_59ce75db7c4fc769_fk_auth_user_id` (`user_id`),
|
||||
KEY `proctoring_proctoredexamstudentattempthistory_b38e5b0e` (`attempt_code`),
|
||||
KEY `proctoring_proctoredexamstudentattempthistory_0e684294` (`external_id`),
|
||||
CONSTRAINT `cbccbfd5c4c427541fdce96e77e6bf6c` FOREIGN KEY (`proctored_exam_id`) REFERENCES `proctoring_proctoredexam` (`id`),
|
||||
CONSTRAINT `proctoring_proctoredexa_user_id_59ce75db7c4fc769_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`)
|
||||
CONSTRAINT `proctoring_proctoredexa_user_id_59ce75db7c4fc769_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`),
|
||||
CONSTRAINT `cbccbfd5c4c427541fdce96e77e6bf6c` FOREIGN KEY (`proctored_exam_id`) REFERENCES `proctoring_proctoredexam` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `programs_programsapiconfig`;
|
||||
@@ -2749,6 +2765,8 @@ CREATE TABLE `programs_programsapiconfig` (
|
||||
`authoring_app_css_path` varchar(255) NOT NULL,
|
||||
`authoring_app_js_path` varchar(255) NOT NULL,
|
||||
`enable_studio_tab` tinyint(1) NOT NULL,
|
||||
`enable_certification` tinyint(1) NOT NULL,
|
||||
`max_retries` int(10) unsigned NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `programs_programsa_changed_by_id_b7c3b49d5c0dcd3_fk_auth_user_id` (`changed_by_id`),
|
||||
CONSTRAINT `programs_programsa_changed_by_id_b7c3b49d5c0dcd3_fk_auth_user_id` FOREIGN KEY (`changed_by_id`) REFERENCES `auth_user` (`id`)
|
||||
@@ -2827,9 +2845,9 @@ CREATE TABLE `shoppingcart_couponredemption` (
|
||||
KEY `shoppingcar_coupon_id_1afa016627ac44bb_fk_shoppingcart_coupon_id` (`coupon_id`),
|
||||
KEY `shoppingcart_couponredemption_69dfcb07` (`order_id`),
|
||||
KEY `shoppingcart_couponredemption_e8701ad4` (`user_id`),
|
||||
CONSTRAINT `shoppingcar_coupon_id_1afa016627ac44bb_fk_shoppingcart_coupon_id` FOREIGN KEY (`coupon_id`) REFERENCES `shoppingcart_coupon` (`id`),
|
||||
CONSTRAINT `shoppingcart_couponredemp_user_id_f5b814b7d92666_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`),
|
||||
CONSTRAINT `shoppingcart__order_id_5ba031c3bfaf643a_fk_shoppingcart_order_id` FOREIGN KEY (`order_id`) REFERENCES `shoppingcart_order` (`id`),
|
||||
CONSTRAINT `shoppingcart_couponredemp_user_id_f5b814b7d92666_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`)
|
||||
CONSTRAINT `shoppingcar_coupon_id_1afa016627ac44bb_fk_shoppingcart_coupon_id` FOREIGN KEY (`coupon_id`) REFERENCES `shoppingcart_coupon` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `shoppingcart_courseregcodeitem`;
|
||||
@@ -2878,9 +2896,9 @@ CREATE TABLE `shoppingcart_courseregistrationcode` (
|
||||
KEY `shoppingcart_courseregistrationcode_69dfcb07` (`order_id`),
|
||||
KEY `shoppingcart_courseregistrationcode_7a471658` (`invoice_item_id`),
|
||||
CONSTRAINT `f040030b6361304bd87eb40c09a82094` FOREIGN KEY (`invoice_item_id`) REFERENCES `shoppingcart_courseregistrationcodeinvoiceitem` (`invoiceitem_ptr_id`),
|
||||
CONSTRAINT `shoppingc_invoice_id_422f26bdc7c5cb99_fk_shoppingcart_invoice_id` FOREIGN KEY (`invoice_id`) REFERENCES `shoppingcart_invoice` (`id`),
|
||||
CONSTRAINT `shoppingcart_cour_created_by_id_11125a9667aa01c9_fk_auth_user_id` FOREIGN KEY (`created_by_id`) REFERENCES `auth_user` (`id`),
|
||||
CONSTRAINT `shoppingcart__order_id_279d7e2df3fe6b6a_fk_shoppingcart_order_id` FOREIGN KEY (`order_id`) REFERENCES `shoppingcart_order` (`id`),
|
||||
CONSTRAINT `shoppingcart_cour_created_by_id_11125a9667aa01c9_fk_auth_user_id` FOREIGN KEY (`created_by_id`) REFERENCES `auth_user` (`id`)
|
||||
CONSTRAINT `shoppingc_invoice_id_422f26bdc7c5cb99_fk_shoppingcart_invoice_id` FOREIGN KEY (`invoice_id`) REFERENCES `shoppingcart_invoice` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `shoppingcart_courseregistrationcodeinvoiceitem`;
|
||||
@@ -2996,9 +3014,9 @@ CREATE TABLE `shoppingcart_invoicetransaction` (
|
||||
KEY `shoppingcart_invoi_created_by_id_f5f3d90ce55a145_fk_auth_user_id` (`created_by_id`),
|
||||
KEY `shoppingc_invoice_id_66bdbfa6f029288b_fk_shoppingcart_invoice_id` (`invoice_id`),
|
||||
KEY `shoppingcar_last_modified_by_id_5e10e433f9576d91_fk_auth_user_id` (`last_modified_by_id`),
|
||||
CONSTRAINT `shoppingc_invoice_id_66bdbfa6f029288b_fk_shoppingcart_invoice_id` FOREIGN KEY (`invoice_id`) REFERENCES `shoppingcart_invoice` (`id`),
|
||||
CONSTRAINT `shoppingcar_last_modified_by_id_5e10e433f9576d91_fk_auth_user_id` FOREIGN KEY (`last_modified_by_id`) REFERENCES `auth_user` (`id`),
|
||||
CONSTRAINT `shoppingcart_invoi_created_by_id_f5f3d90ce55a145_fk_auth_user_id` FOREIGN KEY (`created_by_id`) REFERENCES `auth_user` (`id`)
|
||||
CONSTRAINT `shoppingcart_invoi_created_by_id_f5f3d90ce55a145_fk_auth_user_id` FOREIGN KEY (`created_by_id`) REFERENCES `auth_user` (`id`),
|
||||
CONSTRAINT `shoppingc_invoice_id_66bdbfa6f029288b_fk_shoppingcart_invoice_id` FOREIGN KEY (`invoice_id`) REFERENCES `shoppingcart_invoice` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `shoppingcart_order`;
|
||||
@@ -3059,8 +3077,8 @@ CREATE TABLE `shoppingcart_orderitem` (
|
||||
KEY `shoppingcart_orderitem_76ed2946` (`refund_requested_time`),
|
||||
KEY `shoppingcart_orderitem_69dfcb07` (`order_id`),
|
||||
KEY `shoppingcart_orderitem_e8701ad4` (`user_id`),
|
||||
CONSTRAINT `shoppingcart__order_id_325e5347f18743e3_fk_shoppingcart_order_id` FOREIGN KEY (`order_id`) REFERENCES `shoppingcart_order` (`id`),
|
||||
CONSTRAINT `shoppingcart_orderitem_user_id_5708ec7aabe24a31_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`)
|
||||
CONSTRAINT `shoppingcart_orderitem_user_id_5708ec7aabe24a31_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`),
|
||||
CONSTRAINT `shoppingcart__order_id_325e5347f18743e3_fk_shoppingcart_order_id` FOREIGN KEY (`order_id`) REFERENCES `shoppingcart_order` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `shoppingcart_paidcourseregistration`;
|
||||
@@ -3107,8 +3125,8 @@ CREATE TABLE `shoppingcart_registrationcoderedemption` (
|
||||
KEY `D1ed44c4be114e424571929bce972f54` (`registration_code_id`),
|
||||
CONSTRAINT `D1ed44c4be114e424571929bce972f54` FOREIGN KEY (`registration_code_id`) REFERENCES `shoppingcart_courseregistrationcode` (`id`),
|
||||
CONSTRAINT `D6654a8efe686d45804b6116dfc6bee1` FOREIGN KEY (`course_enrollment_id`) REFERENCES `student_courseenrollment` (`id`),
|
||||
CONSTRAINT `shoppingcart_r_order_id_752ddc3003afe96_fk_shoppingcart_order_id` FOREIGN KEY (`order_id`) REFERENCES `shoppingcart_order` (`id`),
|
||||
CONSTRAINT `shoppingcart_reg_redeemed_by_id_455df2dd74004fff_fk_auth_user_id` FOREIGN KEY (`redeemed_by_id`) REFERENCES `auth_user` (`id`)
|
||||
CONSTRAINT `shoppingcart_reg_redeemed_by_id_455df2dd74004fff_fk_auth_user_id` FOREIGN KEY (`redeemed_by_id`) REFERENCES `auth_user` (`id`),
|
||||
CONSTRAINT `shoppingcart_r_order_id_752ddc3003afe96_fk_shoppingcart_order_id` FOREIGN KEY (`order_id`) REFERENCES `shoppingcart_order` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `social_auth_association`;
|
||||
@@ -3197,6 +3215,20 @@ CREATE TABLE `static_replace_assetbaseurlconfig` (
|
||||
CONSTRAINT `static_replace_as_changed_by_id_796c2e5b1bee7027_fk_auth_user_id` FOREIGN KEY (`changed_by_id`) REFERENCES `auth_user` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `static_replace_assetexcludedextensionsconfig`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!40101 SET character_set_client = utf8 */;
|
||||
CREATE TABLE `static_replace_assetexcludedextensionsconfig` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`change_date` datetime(6) NOT NULL,
|
||||
`enabled` tinyint(1) NOT NULL,
|
||||
`excluded_extensions` longtext NOT NULL,
|
||||
`changed_by_id` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `static_replace_as_changed_by_id_5885827de4f271dc_fk_auth_user_id` (`changed_by_id`),
|
||||
CONSTRAINT `static_replace_as_changed_by_id_5885827de4f271dc_fk_auth_user_id` FOREIGN KEY (`changed_by_id`) REFERENCES `auth_user` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `status_coursemessage`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!40101 SET character_set_client = utf8 */;
|
||||
@@ -3499,8 +3531,8 @@ CREATE TABLE `student_userstanding` (
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `user_id` (`user_id`),
|
||||
KEY `student_userstand_changed_by_id_23784b83f2849aff_fk_auth_user_id` (`changed_by_id`),
|
||||
CONSTRAINT `student_userstand_changed_by_id_23784b83f2849aff_fk_auth_user_id` FOREIGN KEY (`changed_by_id`) REFERENCES `auth_user` (`id`),
|
||||
CONSTRAINT `student_userstanding_user_id_6bb90abaaa05d42e_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`)
|
||||
CONSTRAINT `student_userstanding_user_id_6bb90abaaa05d42e_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`),
|
||||
CONSTRAINT `student_userstand_changed_by_id_23784b83f2849aff_fk_auth_user_id` FOREIGN KEY (`changed_by_id`) REFERENCES `auth_user` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `student_usertestgroup`;
|
||||
@@ -3524,8 +3556,8 @@ CREATE TABLE `student_usertestgroup_users` (
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `usertestgroup_id` (`usertestgroup_id`,`user_id`),
|
||||
KEY `student_usertestgroup_u_user_id_26c886de60cceacb_fk_auth_user_id` (`user_id`),
|
||||
CONSTRAINT `st_usertestgroup_id_3d634741f1dd4e4f_fk_student_usertestgroup_id` FOREIGN KEY (`usertestgroup_id`) REFERENCES `student_usertestgroup` (`id`),
|
||||
CONSTRAINT `student_usertestgroup_u_user_id_26c886de60cceacb_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`)
|
||||
CONSTRAINT `student_usertestgroup_u_user_id_26c886de60cceacb_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`),
|
||||
CONSTRAINT `st_usertestgroup_id_3d634741f1dd4e4f_fk_student_usertestgroup_id` FOREIGN KEY (`usertestgroup_id`) REFERENCES `student_usertestgroup` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `submissions_score`;
|
||||
@@ -3543,8 +3575,8 @@ CREATE TABLE `submissions_score` (
|
||||
KEY `submissions_score_fde81f11` (`created_at`),
|
||||
KEY `submissions_score_02d5e83e` (`student_item_id`),
|
||||
KEY `submissions_score_1dd9cfcc` (`submission_id`),
|
||||
CONSTRAINT `s_student_item_id_7d4d4bb6a7dd0642_fk_submissions_studentitem_id` FOREIGN KEY (`student_item_id`) REFERENCES `submissions_studentitem` (`id`),
|
||||
CONSTRAINT `subm_submission_id_3fc975fe88442ff7_fk_submissions_submission_id` FOREIGN KEY (`submission_id`) REFERENCES `submissions_submission` (`id`)
|
||||
CONSTRAINT `subm_submission_id_3fc975fe88442ff7_fk_submissions_submission_id` FOREIGN KEY (`submission_id`) REFERENCES `submissions_submission` (`id`),
|
||||
CONSTRAINT `s_student_item_id_7d4d4bb6a7dd0642_fk_submissions_studentitem_id` FOREIGN KEY (`student_item_id`) REFERENCES `submissions_studentitem` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `submissions_scoreannotation`;
|
||||
@@ -3576,8 +3608,8 @@ CREATE TABLE `submissions_scoresummary` (
|
||||
KEY `submissions__highest_id_7fd91b8eb312c175_fk_submissions_score_id` (`highest_id`),
|
||||
KEY `submissions_s_latest_id_2b352506a35fd569_fk_submissions_score_id` (`latest_id`),
|
||||
CONSTRAINT `s_student_item_id_32fa0a425a149b1b_fk_submissions_studentitem_id` FOREIGN KEY (`student_item_id`) REFERENCES `submissions_studentitem` (`id`),
|
||||
CONSTRAINT `submissions__highest_id_7fd91b8eb312c175_fk_submissions_score_id` FOREIGN KEY (`highest_id`) REFERENCES `submissions_score` (`id`),
|
||||
CONSTRAINT `submissions_s_latest_id_2b352506a35fd569_fk_submissions_score_id` FOREIGN KEY (`latest_id`) REFERENCES `submissions_score` (`id`)
|
||||
CONSTRAINT `submissions_s_latest_id_2b352506a35fd569_fk_submissions_score_id` FOREIGN KEY (`latest_id`) REFERENCES `submissions_score` (`id`),
|
||||
CONSTRAINT `submissions__highest_id_7fd91b8eb312c175_fk_submissions_score_id` FOREIGN KEY (`highest_id`) REFERENCES `submissions_score` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `submissions_studentitem`;
|
||||
@@ -3607,6 +3639,7 @@ CREATE TABLE `submissions_submission` (
|
||||
`created_at` datetime(6) NOT NULL,
|
||||
`raw_answer` longtext NOT NULL,
|
||||
`student_item_id` int(11) NOT NULL,
|
||||
`status` varchar(1) NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `su_student_item_id_d3801ff833d05b1_fk_submissions_studentitem_id` (`student_item_id`),
|
||||
KEY `submissions_submission_ef7c876f` (`uuid`),
|
||||
@@ -3632,8 +3665,8 @@ CREATE TABLE `survey_surveyanswer` (
|
||||
KEY `survey_surveyanswer_c8235886` (`course_key`),
|
||||
KEY `survey_surveyanswer_d6cba1ad` (`form_id`),
|
||||
KEY `survey_surveyanswer_e8701ad4` (`user_id`),
|
||||
CONSTRAINT `survey_surveyan_form_id_1c835afe12a54912_fk_survey_surveyform_id` FOREIGN KEY (`form_id`) REFERENCES `survey_surveyform` (`id`),
|
||||
CONSTRAINT `survey_surveyanswer_user_id_4e77d83a82fd0b2b_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`)
|
||||
CONSTRAINT `survey_surveyanswer_user_id_4e77d83a82fd0b2b_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`),
|
||||
CONSTRAINT `survey_surveyan_form_id_1c835afe12a54912_fk_survey_surveyform_id` FOREIGN KEY (`form_id`) REFERENCES `survey_surveyform` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `survey_surveyform`;
|
||||
@@ -3687,8 +3720,8 @@ CREATE TABLE `teams_courseteammembership` (
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `teams_courseteammembership_user_id_48efa8e8971947c3_uniq` (`user_id`,`team_id`),
|
||||
KEY `teams_courseteam_team_id_594700d19b04f922_fk_teams_courseteam_id` (`team_id`),
|
||||
CONSTRAINT `teams_courseteam_team_id_594700d19b04f922_fk_teams_courseteam_id` FOREIGN KEY (`team_id`) REFERENCES `teams_courseteam` (`id`),
|
||||
CONSTRAINT `teams_courseteammembers_user_id_2d93b28be22c3c40_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`)
|
||||
CONSTRAINT `teams_courseteammembers_user_id_2d93b28be22c3c40_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`),
|
||||
CONSTRAINT `teams_courseteam_team_id_594700d19b04f922_fk_teams_courseteam_id` FOREIGN KEY (`team_id`) REFERENCES `teams_courseteam` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `third_party_auth_ltiproviderconfig`;
|
||||
@@ -3962,8 +3995,8 @@ CREATE TABLE `verify_student_skippedreverification` (
|
||||
KEY `verify_student_skippedreverification_ea134da7` (`course_id`),
|
||||
KEY `verify_student_skippedreverification_bef2d98a` (`checkpoint_id`),
|
||||
KEY `verify_student_skippedreverification_e8701ad4` (`user_id`),
|
||||
CONSTRAINT `D759ffa5ca66ef1a2c8c200f7a21365b` FOREIGN KEY (`checkpoint_id`) REFERENCES `verify_student_verificationcheckpoint` (`id`),
|
||||
CONSTRAINT `verify_student_skippedr_user_id_6752b392e3d3c501_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`)
|
||||
CONSTRAINT `verify_student_skippedr_user_id_6752b392e3d3c501_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`),
|
||||
CONSTRAINT `D759ffa5ca66ef1a2c8c200f7a21365b` FOREIGN KEY (`checkpoint_id`) REFERENCES `verify_student_verificationcheckpoint` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `verify_student_softwaresecurephotoverification`;
|
||||
@@ -3997,9 +4030,9 @@ CREATE TABLE `verify_student_softwaresecurephotoverification` (
|
||||
KEY `verify_student_softwaresecurephotoverification_afd1a1a8` (`updated_at`),
|
||||
KEY `verify_student_softwaresecurephotoverification_ebf78b51` (`display`),
|
||||
KEY `verify_student_softwaresecurephotoverification_22bb6ff9` (`submitted_at`),
|
||||
CONSTRAINT `verify_student_software_user_id_61ffab9c12020106_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`),
|
||||
CONSTRAINT `D01dce17b91c9382bd80d4be23a3e0cf` FOREIGN KEY (`copy_id_photo_from_id`) REFERENCES `verify_student_softwaresecurephotoverification` (`id`),
|
||||
CONSTRAINT `verify_studen_reviewing_user_id_727fae1d0bcf8aaf_fk_auth_user_id` FOREIGN KEY (`reviewing_user_id`) REFERENCES `auth_user` (`id`),
|
||||
CONSTRAINT `verify_student_software_user_id_61ffab9c12020106_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`)
|
||||
CONSTRAINT `verify_studen_reviewing_user_id_727fae1d0bcf8aaf_fk_auth_user_id` FOREIGN KEY (`reviewing_user_id`) REFERENCES `auth_user` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `verify_student_verificationcheckpoint`;
|
||||
@@ -4057,8 +4090,8 @@ CREATE TABLE `verify_student_verificationstatus` (
|
||||
KEY `D4cefb6d3d71c9b26af2a5ece4c37277` (`checkpoint_id`),
|
||||
KEY `verify_student_verifica_user_id_5c19fcd6dc05f211_fk_auth_user_id` (`user_id`),
|
||||
KEY `verify_student_verificationstatus_9acb4454` (`status`),
|
||||
CONSTRAINT `D4cefb6d3d71c9b26af2a5ece4c37277` FOREIGN KEY (`checkpoint_id`) REFERENCES `verify_student_verificationcheckpoint` (`id`),
|
||||
CONSTRAINT `verify_student_verifica_user_id_5c19fcd6dc05f211_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`)
|
||||
CONSTRAINT `verify_student_verifica_user_id_5c19fcd6dc05f211_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`),
|
||||
CONSTRAINT `D4cefb6d3d71c9b26af2a5ece4c37277` FOREIGN KEY (`checkpoint_id`) REFERENCES `verify_student_verificationcheckpoint` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `wiki_article`;
|
||||
@@ -4079,9 +4112,9 @@ CREATE TABLE `wiki_article` (
|
||||
UNIQUE KEY `current_revision_id` (`current_revision_id`),
|
||||
KEY `wiki_article_0e939a4f` (`group_id`),
|
||||
KEY `wiki_article_5e7b1936` (`owner_id`),
|
||||
CONSTRAINT `wiki_article_owner_id_b1c1e44609a378f_fk_auth_user_id` FOREIGN KEY (`owner_id`) REFERENCES `auth_user` (`id`),
|
||||
CONSTRAINT `current_revision_id_42a9dbec1e0dd15c_fk_wiki_articlerevision_id` FOREIGN KEY (`current_revision_id`) REFERENCES `wiki_articlerevision` (`id`),
|
||||
CONSTRAINT `wiki_article_group_id_2b38601b6aa39f3d_fk_auth_group_id` FOREIGN KEY (`group_id`) REFERENCES `auth_group` (`id`),
|
||||
CONSTRAINT `wiki_article_owner_id_b1c1e44609a378f_fk_auth_user_id` FOREIGN KEY (`owner_id`) REFERENCES `auth_user` (`id`)
|
||||
CONSTRAINT `wiki_article_group_id_2b38601b6aa39f3d_fk_auth_group_id` FOREIGN KEY (`group_id`) REFERENCES `auth_group` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `wiki_articleforobject`;
|
||||
@@ -4135,9 +4168,9 @@ CREATE TABLE `wiki_articlerevision` (
|
||||
UNIQUE KEY `wiki_articlerevision_article_id_4b4e7910c8e7b2d0_uniq` (`article_id`,`revision_number`),
|
||||
KEY `fae2b1c6e892c699844d5dda69aeb89e` (`previous_revision_id`),
|
||||
KEY `wiki_articlerevision_user_id_183520686b6ead55_fk_auth_user_id` (`user_id`),
|
||||
CONSTRAINT `wiki_articlerevision_user_id_183520686b6ead55_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`),
|
||||
CONSTRAINT `fae2b1c6e892c699844d5dda69aeb89e` FOREIGN KEY (`previous_revision_id`) REFERENCES `wiki_articlerevision` (`id`),
|
||||
CONSTRAINT `wiki_articlerevis_article_id_1f2c587981af1463_fk_wiki_article_id` FOREIGN KEY (`article_id`) REFERENCES `wiki_article` (`id`),
|
||||
CONSTRAINT `wiki_articlerevision_user_id_183520686b6ead55_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`)
|
||||
CONSTRAINT `wiki_articlerevis_article_id_1f2c587981af1463_fk_wiki_article_id` FOREIGN KEY (`article_id`) REFERENCES `wiki_article` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `wiki_attachment`;
|
||||
@@ -4175,9 +4208,9 @@ CREATE TABLE `wiki_attachmentrevision` (
|
||||
KEY `wiki_attachmentrevision_07ba63f5` (`attachment_id`),
|
||||
KEY `wiki_attachmentrevision_e8680b8a` (`previous_revision_id`),
|
||||
KEY `wiki_attachmentrevision_e8701ad4` (`user_id`),
|
||||
CONSTRAINT `wiki_attachmentrevision_user_id_427e3f452b4bfdcd_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`),
|
||||
CONSTRAINT `D68d5cd540b66f536228137e518081f8` FOREIGN KEY (`attachment_id`) REFERENCES `wiki_attachment` (`reusableplugin_ptr_id`),
|
||||
CONSTRAINT `D8c1f0a8f0ddceb9c3ebc94379fe22c9` FOREIGN KEY (`previous_revision_id`) REFERENCES `wiki_attachmentrevision` (`id`),
|
||||
CONSTRAINT `wiki_attachmentrevision_user_id_427e3f452b4bfdcd_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`)
|
||||
CONSTRAINT `D8c1f0a8f0ddceb9c3ebc94379fe22c9` FOREIGN KEY (`previous_revision_id`) REFERENCES `wiki_attachmentrevision` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `wiki_image`;
|
||||
@@ -4220,8 +4253,8 @@ CREATE TABLE `wiki_reusableplugin_articles` (
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `reusableplugin_id` (`reusableplugin_id`,`article_id`),
|
||||
KEY `wiki_reusableplug_article_id_5e893d3b3fb4f7fa_fk_wiki_article_id` (`article_id`),
|
||||
CONSTRAINT `a9f9f50fd4e8fdafe7ffc0c1a145fee3` FOREIGN KEY (`reusableplugin_id`) REFERENCES `wiki_reusableplugin` (`articleplugin_ptr_id`),
|
||||
CONSTRAINT `wiki_reusableplug_article_id_5e893d3b3fb4f7fa_fk_wiki_article_id` FOREIGN KEY (`article_id`) REFERENCES `wiki_article` (`id`)
|
||||
CONSTRAINT `wiki_reusableplug_article_id_5e893d3b3fb4f7fa_fk_wiki_article_id` FOREIGN KEY (`article_id`) REFERENCES `wiki_article` (`id`),
|
||||
CONSTRAINT `a9f9f50fd4e8fdafe7ffc0c1a145fee3` FOREIGN KEY (`reusableplugin_id`) REFERENCES `wiki_reusableplugin` (`articleplugin_ptr_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `wiki_revisionplugin`;
|
||||
@@ -4256,9 +4289,9 @@ CREATE TABLE `wiki_revisionpluginrevision` (
|
||||
KEY `wiki_revisionpluginrevision_b25eaab4` (`plugin_id`),
|
||||
KEY `wiki_revisionpluginrevision_e8680b8a` (`previous_revision_id`),
|
||||
KEY `wiki_revisionpluginrevision_e8701ad4` (`user_id`),
|
||||
CONSTRAINT `wiki_revisionpluginrevi_user_id_55a00bd0e2532762_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`),
|
||||
CONSTRAINT `D9574e2f57b828a85a24838761473871` FOREIGN KEY (`plugin_id`) REFERENCES `wiki_revisionplugin` (`articleplugin_ptr_id`),
|
||||
CONSTRAINT `e524c4f887e857f93c39356f7cf7d4df` FOREIGN KEY (`previous_revision_id`) REFERENCES `wiki_revisionpluginrevision` (`id`),
|
||||
CONSTRAINT `wiki_revisionpluginrevi_user_id_55a00bd0e2532762_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`)
|
||||
CONSTRAINT `e524c4f887e857f93c39356f7cf7d4df` FOREIGN KEY (`previous_revision_id`) REFERENCES `wiki_revisionpluginrevision` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `wiki_simpleplugin`;
|
||||
@@ -4295,9 +4328,9 @@ CREATE TABLE `wiki_urlpath` (
|
||||
KEY `wiki_urlpath_656442a0` (`tree_id`),
|
||||
KEY `wiki_urlpath_c9e9a848` (`level`),
|
||||
KEY `wiki_urlpath_6be37982` (`parent_id`),
|
||||
CONSTRAINT `wiki_urlpath_site_id_4f30e731b0464e80_fk_django_site_id` FOREIGN KEY (`site_id`) REFERENCES `django_site` (`id`),
|
||||
CONSTRAINT `wiki_urlpath_article_id_1d1c5eb9a64e1390_fk_wiki_article_id` FOREIGN KEY (`article_id`) REFERENCES `wiki_article` (`id`),
|
||||
CONSTRAINT `wiki_urlpath_parent_id_24eab80cd168595f_fk_wiki_urlpath_id` FOREIGN KEY (`parent_id`) REFERENCES `wiki_urlpath` (`id`),
|
||||
CONSTRAINT `wiki_urlpath_site_id_4f30e731b0464e80_fk_django_site_id` FOREIGN KEY (`site_id`) REFERENCES `django_site` (`id`)
|
||||
CONSTRAINT `wiki_urlpath_parent_id_24eab80cd168595f_fk_wiki_urlpath_id` FOREIGN KEY (`parent_id`) REFERENCES `wiki_urlpath` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `workflow_assessmentworkflow`;
|
||||
@@ -4374,6 +4407,7 @@ CREATE TABLE `xblock_django_xblockdisableconfig` (
|
||||
`enabled` tinyint(1) NOT NULL,
|
||||
`disabled_blocks` longtext NOT NULL,
|
||||
`changed_by_id` int(11) DEFAULT NULL,
|
||||
`disabled_create_blocks` longtext NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `xblock_django_xbl_changed_by_id_429bdccb9201831c_fk_auth_user_id` (`changed_by_id`),
|
||||
CONSTRAINT `xblock_django_xbl_changed_by_id_429bdccb9201831c_fk_auth_user_id` FOREIGN KEY (`changed_by_id`) REFERENCES `auth_user` (`id`)
|
||||
@@ -0,0 +1,48 @@
|
||||
|
||||
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
||||
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
|
||||
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
|
||||
/*!40101 SET NAMES utf8 */;
|
||||
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
|
||||
/*!40103 SET TIME_ZONE='+00:00' */;
|
||||
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
|
||||
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
|
||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||
DROP TABLE IF EXISTS `coursewarehistoryextended_studentmodulehistoryextended`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!40101 SET character_set_client = utf8 */;
|
||||
CREATE TABLE `coursewarehistoryextended_studentmodulehistoryextended` (
|
||||
`version` varchar(255) DEFAULT NULL,
|
||||
`created` datetime(6) NOT NULL,
|
||||
`state` longtext,
|
||||
`grade` double DEFAULT NULL,
|
||||
`max_grade` double DEFAULT NULL,
|
||||
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`student_module_id` int(11) NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `coursewarehistoryextended_studentmodulehistoryextended_2af72f10` (`version`),
|
||||
KEY `coursewarehistoryextended_studentmodulehistoryextended_e2fa5388` (`created`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=10000 DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
DROP TABLE IF EXISTS `django_migrations`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!40101 SET character_set_client = utf8 */;
|
||||
CREATE TABLE `django_migrations` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`app` varchar(255) NOT NULL,
|
||||
`name` varchar(255) NOT NULL,
|
||||
`applied` datetime(6) NOT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=119 DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
|
||||
|
||||
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
|
||||
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
|
||||
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
|
||||
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
|
||||
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
|
||||
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
|
||||
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
|
||||
|
||||
Binary file not shown.
BIN
common/test/db_cache/lettuce_student_module_history.db
Normal file
BIN
common/test/db_cache/lettuce_student_module_history.db
Normal file
Binary file not shown.
Binary file not shown.
@@ -142,7 +142,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: edx-platform\n"
|
||||
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
|
||||
"POT-Creation-Date: 2016-02-17 21:30+0000\n"
|
||||
"POT-Creation-Date: 2016-02-24 18:02+0000\n"
|
||||
"PO-Revision-Date: 2015-12-07 09:55+0000\n"
|
||||
"Last-Translator: Soha Assali <soha+transifex@qordoba.com>\n"
|
||||
"Language-Team: Arabic (http://www.transifex.com/open-edx/edx-platform/language/ar/)\n"
|
||||
@@ -2376,11 +2376,12 @@ msgstr "الترتيب الأبجدي للنقاشات"
|
||||
#: common/lib/xmodule/xmodule/course_module.py
|
||||
msgid ""
|
||||
"Enter true or false. If true, discussion categories and subcategories are "
|
||||
"sorted alphabetically. If false, they are sorted chronologically."
|
||||
"sorted alphabetically. If false, they are sorted chronologically by creation"
|
||||
" date and time."
|
||||
msgstr ""
|
||||
"يُرجى إدخال ’true‘ أو ’false‘ .تشير القيمة ’true‘ إلى ترتيب فئات النقاشات "
|
||||
"وكل من فئاتها الفرعية بحسب الأحرف الأبجدية، بينما يسمح اختيار ’false‘ "
|
||||
"بترتيبها زمنيًّا."
|
||||
"يُرجى إدخال صحيح أو خاطئ. ويسمح اختيارك لصحيح بترتيب فئات النقاشات وفئاتها "
|
||||
"الفرعية بحسب الأبجدية، بينما يساعد اختيارك لخاطئ على ترتيبها زمنيًّا تبعًا "
|
||||
"للتاريخ والتوقيت."
|
||||
|
||||
#: common/lib/xmodule/xmodule/course_module.py
|
||||
msgid "Course Announcement Date"
|
||||
@@ -2440,19 +2441,6 @@ msgstr ""
|
||||
"يُرجى إدخال الرقم التعريفي الفريد من نوعه لملفّات الفيديو الخاصة بمساقك "
|
||||
"والتي زوّدتك بها edX. "
|
||||
|
||||
#: common/lib/xmodule/xmodule/course_module.py
|
||||
msgid ""
|
||||
"Enter the URL for the official course Facebook group. If you provide a URL, "
|
||||
"the mobile app includes a button that students can tap to access the group."
|
||||
msgstr ""
|
||||
"أدخل رابِط المجموعة الرسمية للمساق على موقع فيسبوك. في حال قدّمت رابطًا، "
|
||||
"فسيعرض تطبيق الهاتف المحمول زرًّا يخوّل الطلاب، بمجرّد الضغط عليه، الوصول "
|
||||
"إلى المجموعة."
|
||||
|
||||
#: common/lib/xmodule/xmodule/course_module.py
|
||||
msgid "Facebook URL"
|
||||
msgstr "الرابط لموقع فيسبوك"
|
||||
|
||||
#: common/lib/xmodule/xmodule/course_module.py
|
||||
msgid "Course Not Graded"
|
||||
msgstr "مساق غير مٌقيّم"
|
||||
@@ -5008,10 +4996,14 @@ msgstr "المساق {course_id} غير موجود"
|
||||
#: lms/djangoapps/commerce/models.py
|
||||
msgid "Use the checkout page hosted by the E-Commerce service."
|
||||
msgstr ""
|
||||
"استخدم صفحة ’السحب لفحص المراجعة‘ المُستضافة من قبل خدمة التجارة "
|
||||
"الإلكترونية."
|
||||
|
||||
#: lms/djangoapps/commerce/models.py
|
||||
msgid "Path to single course checkout page hosted by the E-Commerce service."
|
||||
msgstr ""
|
||||
"مسار صفحة ’السحب لفحص المراجعة‘ الخاصة بمساق واحد، والمُستضافة من قبل خدمة "
|
||||
"التجارة الإلكترونية."
|
||||
|
||||
#: lms/djangoapps/commerce/signals.py
|
||||
msgid ""
|
||||
@@ -8371,26 +8363,28 @@ msgid ""
|
||||
" <strong>%(application_name)s</strong> would like to access your data with the following permissions:\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"يرغب التطبيق <strong> %(application_name)s</strong> بالوصول إلى بياناتك باستخدام السماحيات التالية:"
|
||||
|
||||
#: lms/templates/provider/authorize.html
|
||||
msgid "Read your user ID"
|
||||
msgstr ""
|
||||
msgstr "اقرأ الرمز التعريفي للمستخدم الخاص بك"
|
||||
|
||||
#: lms/templates/provider/authorize.html
|
||||
msgid "Read your user profile"
|
||||
msgstr ""
|
||||
msgstr "اقرأ معلومات الصفحة الشخصية للمستخدم الخاص بك"
|
||||
|
||||
#: lms/templates/provider/authorize.html
|
||||
msgid "Read your email address"
|
||||
msgstr ""
|
||||
msgstr "اقرأ عنوان بريدك الإلكتروني"
|
||||
|
||||
#: lms/templates/provider/authorize.html
|
||||
msgid "Read the list of courses in which you are a staff member."
|
||||
msgstr ""
|
||||
msgstr "اقرأ قائمة المساقات التي عُيّنت كأحد أعضاء فريقها."
|
||||
|
||||
#: lms/templates/provider/authorize.html
|
||||
msgid "Read the list of courses in which you are an instructor."
|
||||
msgstr ""
|
||||
msgstr "إقرأ قائمة المساقات التي عُيّنت كمدرّس فيها."
|
||||
|
||||
#: lms/templates/provider/authorize.html
|
||||
msgid "To see if you are a global staff user"
|
||||
@@ -10916,7 +10910,6 @@ msgid "Dashboard for:"
|
||||
msgstr "لوحة المعلومات لـ:"
|
||||
|
||||
#: lms/templates/navigation-edx.html lms/templates/navigation.html
|
||||
#: themes/edx.org/lms/templates/header.html
|
||||
msgid "Profile image for {username}"
|
||||
msgstr "صورة الصفحة الشخصية للمستخدم {username}"
|
||||
|
||||
@@ -12529,12 +12522,6 @@ msgstr "أنت الآن تستعرض المساق بصفتك <i>{user_name}</i>.
|
||||
msgid "Course Material"
|
||||
msgstr "مواد المساق"
|
||||
|
||||
#. Translators: 'needs attention' is an alternative string for the
|
||||
#. notification image that indicates the tab "needs attention".
|
||||
#: lms/templates/courseware/course_navigation.html
|
||||
msgid "needs attention"
|
||||
msgstr "يستدعي الانتباه"
|
||||
|
||||
#: lms/templates/courseware/course_navigation.html
|
||||
msgid "Course is not yet visible to students."
|
||||
msgstr "المساق غير مرئي للطلّاب بعد"
|
||||
@@ -12830,6 +12817,12 @@ msgstr "لا توجد درجات للمسائل في هذا القسم"
|
||||
msgid "{course.display_number_with_default} Course Info"
|
||||
msgstr "معلومات المساق {course.display_number_with_default} "
|
||||
|
||||
#. Translators: 'needs attention' is an alternative string for the
|
||||
#. notification image that indicates the tab "needs attention".
|
||||
#: lms/templates/courseware/tabs.html
|
||||
msgid "needs attention"
|
||||
msgstr "يستدعي الانتباه"
|
||||
|
||||
#: lms/templates/courseware/welcome-back.html
|
||||
msgid ""
|
||||
"You were most recently in {section_link}. If you're done with that, choose "
|
||||
@@ -17341,7 +17334,7 @@ msgstr "هذه الوحدة غير مفعَّلة."
|
||||
|
||||
#: cms/templates/certificates.html
|
||||
msgid "This course does not use a mode that offers certificates."
|
||||
msgstr ""
|
||||
msgstr "لا يستخدم هذا المساق وضعًا يسمح بتقديم شهادات."
|
||||
|
||||
#: cms/templates/certificates.html
|
||||
msgid "Working with Certificates"
|
||||
@@ -17475,6 +17468,8 @@ msgid ""
|
||||
"Select a component type under {strong_start}Add New Component{strong_end}. "
|
||||
"Then select a template."
|
||||
msgstr ""
|
||||
"إختر نوع مكوّن مُدرج تحت {strong_start}أضف مكوّنًا جديدًا{strong_end}. ثمّ "
|
||||
"اختر نموذجًا."
|
||||
|
||||
#: cms/templates/container.html
|
||||
msgid ""
|
||||
@@ -17493,6 +17488,8 @@ msgid ""
|
||||
"Click the {strong_start}Edit{strong_end} icon in a component to edit its "
|
||||
"content."
|
||||
msgstr ""
|
||||
"إنقر على أيقونة {strong_start}تعديل{strong_end} لمكوّن معيّن لتتمكّن من "
|
||||
"تعديل محتواه."
|
||||
|
||||
#: cms/templates/container.html
|
||||
msgid "Reorganizing components"
|
||||
@@ -17935,6 +17932,9 @@ msgid ""
|
||||
"(Home, Course, Discussion, Wiki, and Progress) are followed by textbooks and"
|
||||
" custom pages that you create."
|
||||
msgstr ""
|
||||
"ستجد الصفحات مسرودة أفقيًّا في أعلى مساقك، بحيث تُدرَج الصفحات الافتراضية "
|
||||
"(الصفحة الرئيسية، والمساق، والنقاشات، والويكي، والعلامات) قبل الكتب "
|
||||
"والصفحات المخصّصة التي تنشئها."
|
||||
|
||||
#: cms/templates/edit-tabs.html
|
||||
msgid "Custom pages"
|
||||
@@ -17979,6 +17979,9 @@ msgid ""
|
||||
"Course, Discussion, Wiki, and Progress) are followed by textbooks and custom"
|
||||
" pages."
|
||||
msgstr ""
|
||||
"تظهر الصفحات في الركن العلوي لشريط التصفّح في مساقك، بحيث تُدرَج الصفحات "
|
||||
"الافتراضية (الصفحة الرئيسية، والمساق، والنقاشات، والويكي، والعلامات) قبل "
|
||||
"الكتب والصفحات المخصّصة."
|
||||
|
||||
#: cms/templates/edit-tabs.html cms/templates/howitworks.html
|
||||
msgid "close modal"
|
||||
@@ -18903,38 +18906,36 @@ msgstr ""
|
||||
"اسم العرض العام لمساقك. لا يمكن تغيير هذا الاسم ولكن يمكنك لاحقًا تحديد اسم "
|
||||
"عرض مختلف من خلال ’الإعدادات المتقدّمة‘."
|
||||
|
||||
#: cms/templates/index.html
|
||||
msgid "The name of the organization sponsoring the course."
|
||||
msgstr "اسم المؤسّسة الراعية للمساق"
|
||||
|
||||
#: cms/templates/index.html
|
||||
msgid "Note: The organization name is part of the course URL"
|
||||
msgstr "ملاحظة: اسم المؤسّسة جزء من رابط المساق."
|
||||
|
||||
#: cms/templates/index.html
|
||||
msgid ""
|
||||
"This cannot be changed, but you can set a different display name in Advanced"
|
||||
" Settings later."
|
||||
"The name of the organization sponsoring the course. {strong_start}Note: The "
|
||||
"organization name is part of the course URL.{strong_end} This cannot be "
|
||||
"changed, but you can set a different display name in Advanced Settings "
|
||||
"later."
|
||||
msgstr ""
|
||||
"لا يمكن تغيير هذا ولكن يمكنك لاحقًا تحديد اسم عرض مختلف من خلال ’الإعدادات "
|
||||
"المتقدّمة‘."
|
||||
"اسم المؤسسة الراعية للمساق. {strong_start}ملاحظة: اسم المؤسسة هو جزء من رابط"
|
||||
" المساق.{strong_end} لا يمكن تغيير هذا إلا أنه يمكنك تعيين اسم عرض مختلف، في"
|
||||
" وقتٍ لاحق، من خلال قسم الإعدادات المتقدّمة."
|
||||
|
||||
#: cms/templates/index.html
|
||||
msgid ""
|
||||
"The unique number that identifies your course within your organization."
|
||||
msgstr "الرقم الفريد الذي يعرّف عن مساقك في المؤسّسة."
|
||||
|
||||
#: cms/templates/index.html
|
||||
msgid ""
|
||||
"Note: This is part of your course URL, so no spaces or special characters "
|
||||
"are allowed and it cannot be changed."
|
||||
"The unique number that identifies your course within your organization. "
|
||||
"{strong_start}Note: This is part of your course URL, so no spaces or special"
|
||||
" characters are allowed and it cannot be changed.{strong_end}"
|
||||
msgstr ""
|
||||
"ملاحظة: هذا جزء من رابط مساقك، فلا يُسمح بإدخال فراغات أو استخدام أحرف "
|
||||
"خاصّة، ولا يمكن تغييره."
|
||||
"يُعرّف الرقم الفريد مساقك ضمن منظمتك. {strong_start} ملاحظة: هذا جزء من رابط"
|
||||
" مساقك، لذا لا يُسمح باستخدام فراغات أو محارف خاصةـ كما ولا يمكن "
|
||||
"تغييره.{strong_end}"
|
||||
|
||||
#: cms/templates/index.html
|
||||
msgid "The term in which your course will run."
|
||||
msgstr "الفترة التي سيجري فيها تشغيل مساقك"
|
||||
msgid ""
|
||||
"The term in which your course will run. {strong_start}Note: This is part of "
|
||||
"your course URL, so no spaces or special characters are allowed and it "
|
||||
"cannot be changed.{strong_end}"
|
||||
msgstr ""
|
||||
"يُعرّف الرقم الفريد مساقك ضمن منظمتك. {strong_start} ملاحظة: هذا جزء من رابط"
|
||||
" مساقك، لذا لا يُسمح باستخدام فراغات أو محارف خاصةـ كما ولا يمكن "
|
||||
"تغييره.{strong_end}"
|
||||
|
||||
#: cms/templates/index.html
|
||||
msgid "Create"
|
||||
@@ -18984,17 +18985,15 @@ msgstr "رمز المكتبة"
|
||||
msgid "e.g. CSPROB"
|
||||
msgstr "مثلًا، CSPROB"
|
||||
|
||||
#: cms/templates/index.html
|
||||
msgid "The unique code that identifies this library."
|
||||
msgstr "الرمز التعريفي الفريد لتحديد المكتبة."
|
||||
|
||||
#: cms/templates/index.html
|
||||
msgid ""
|
||||
"Note: This is part of your library URL, so no spaces or special characters "
|
||||
"are allowed."
|
||||
"The unique code that identifies this library. {strong_start}Note: This is "
|
||||
"part of your library URL, so no spaces or special characters are "
|
||||
"allowed.{strong_end} This cannot be changed."
|
||||
msgstr ""
|
||||
"ملاحظة: هذا جزء من الرابط الخاص بمكتبتك، وبالتالي لا يُسمح بإدخال فراغات أو "
|
||||
"أحرف خاصّة."
|
||||
"يُعرف الرمز الفريد هذه المكتبة. {strong_start} ملاحظة: هذا جزء من رابط "
|
||||
"مكتبتك، بل يُسمح باستخدام الفراغات أو المحارف الخاصّة.{strong_end} لا يمكن "
|
||||
"تغيير هذا الجزء."
|
||||
|
||||
#: cms/templates/index.html
|
||||
msgid "Courses Being Processed"
|
||||
@@ -19246,23 +19245,22 @@ msgstr ""
|
||||
"{link_start}الاتّصال بطاقم {platform_name} للمزيد من الاستفسار{link_end}."
|
||||
|
||||
#: cms/templates/index.html
|
||||
#, python-format
|
||||
msgid "Thanks for signing up, %(name)s!"
|
||||
msgstr "نشكرك على تسجيل عضويتك، %(name)s!"
|
||||
msgid "Thanks for signing up, {name}!"
|
||||
msgstr "نشكرك على تسجيل اشتراكك، {name}!"
|
||||
|
||||
#: cms/templates/index.html
|
||||
msgid "We need to verify your email address"
|
||||
msgstr "نحتاج إلى التحقّق من عنوان بريدك الإلكتروني لو سمحت. "
|
||||
|
||||
#: cms/templates/index.html
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Almost there! In order to complete your sign up we need you to verify your "
|
||||
"email address (%(email)s). An activation message and next steps should be "
|
||||
"email address ({email}). An activation message and next steps should be "
|
||||
"waiting for you there."
|
||||
msgstr ""
|
||||
"أوشكت على الانتهاء! نرجو منك التأكيد على عنوان بريدك الإلكتروني (%(email)s) "
|
||||
"لتستكمل تسجيل عضويتك، ثمّ ستجد رسالة تفعيل وخطوات تالية بانتظارك."
|
||||
"أوشكت على الانتهاء من تقديم الطلب! من أجل استكمال الطلب يجب عليك تأكيد بريدك"
|
||||
" الإلكتروني ({email}). ستجد رسالة التفعيل مع الخطوات القادمة التي يجب "
|
||||
"اتخاذها بانتظارك هناك."
|
||||
|
||||
#: cms/templates/index.html
|
||||
msgid "Need help?"
|
||||
@@ -20159,15 +20157,15 @@ msgstr "تحتوي هذه الكتلة على عدة مكوِّنات."
|
||||
|
||||
#: cms/templates/temp-course-landing.html
|
||||
msgid "Circuits and Electronics"
|
||||
msgstr ""
|
||||
msgstr "الدارات والإلكترونيات"
|
||||
|
||||
#: cms/templates/temp-course-landing.html
|
||||
msgid "Massachusetts Institute of Technology"
|
||||
msgstr ""
|
||||
msgstr "معهد ماساتشوستس للتكنولوجيا"
|
||||
|
||||
#: cms/templates/temp-course-landing.html
|
||||
msgid "Forgot?"
|
||||
msgstr ""
|
||||
msgstr "نسيت؟"
|
||||
|
||||
#: cms/templates/temp-course-landing.html
|
||||
msgid ""
|
||||
@@ -20537,7 +20535,7 @@ msgstr "تشغيل مترجم مصادر لاتخ Latex"
|
||||
|
||||
#: cms/templates/widgets/problem-edit.html
|
||||
msgid "Heading"
|
||||
msgstr ""
|
||||
msgstr "عنوان رئيسي"
|
||||
|
||||
#: cms/templates/widgets/problem-edit.html
|
||||
msgid "Insert a heading"
|
||||
|
||||
Binary file not shown.
@@ -94,7 +94,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: edx-platform\n"
|
||||
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
|
||||
"POT-Creation-Date: 2016-02-17 21:29+0000\n"
|
||||
"POT-Creation-Date: 2016-02-24 18:01+0000\n"
|
||||
"PO-Revision-Date: 2016-02-12 08:07+0000\n"
|
||||
"Last-Translator: Soha Assali <soha+transifex@qordoba.com>\n"
|
||||
"Language-Team: Arabic (http://www.transifex.com/open-edx/edx-platform/language/ar/)\n"
|
||||
|
||||
Binary file not shown.
@@ -37,8 +37,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: 0.1a\n"
|
||||
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
|
||||
"POT-Creation-Date: 2016-02-24 17:24+0000\n"
|
||||
"PO-Revision-Date: 2016-02-24 17:24:09.449724\n"
|
||||
"POT-Creation-Date: 2016-03-03 16:07+0000\n"
|
||||
"PO-Revision-Date: 2016-03-03 16:07:28.319104\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: openedx-translation <openedx-translation@googlegroups.com>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -2637,18 +2637,18 @@ msgstr "HTML Téxtßööks Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт#"
|
||||
|
||||
#: common/lib/xmodule/xmodule/course_module.py
|
||||
msgid ""
|
||||
"For HTML textbooks that appear as separate tabs in the courseware, enter the"
|
||||
" name of the tab (usually the name of the book) as well as the URLs and "
|
||||
"titles of all the chapters in the book."
|
||||
"For HTML textbooks that appear as separate tabs in the course, enter the "
|
||||
"name of the tab (usually the title of the book) as well as the URLs and "
|
||||
"titles of each chapter in the book."
|
||||
msgstr ""
|
||||
"För HTML téxtßööks thät äppéär äs sépäräté täßs ïn thé çöürséwäré, éntér thé"
|
||||
" nämé öf thé täß (üsüällý thé nämé öf thé ßöök) äs wéll äs thé ÛRLs änd "
|
||||
"tïtlés öf äll thé çhäptérs ïn thé ßöök. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, "
|
||||
"¢σηѕє¢тєтυя α∂ιριѕι¢ιηg єłιт, ѕє∂ ∂σ єιυѕмσ∂ тємρσя ιη¢ι∂ι∂υηт υт łαвσяє єт "
|
||||
"∂σłσяє мαgηα αłιqυα. υт єηιм α∂ мιηιм νєηιαм, qυιѕ ησѕтяυ∂ єχєя¢ιтαтιση "
|
||||
"υłłαм¢σ łαвσяιѕ ηιѕι υт αłιqυιρ єχ єα ¢σммσ∂σ ¢σηѕєqυαт. ∂υιѕ αυтє ιяυяє "
|
||||
"∂σłσя ιη яєρяєнєη∂єяιт ιη νσłυρтαтє νєłιт єѕѕє ¢ιłłυм ∂σłσяє єυ ƒυgιαт ηυłłα"
|
||||
" ραяιαтυя. єχ¢єρтєυя ѕιηт σ¢¢αє¢αт ¢υρι∂αтαт ηση ρяσι∂#"
|
||||
"För HTML téxtßööks thät äppéär äs sépäräté täßs ïn thé çöürsé, éntér thé "
|
||||
"nämé öf thé täß (üsüällý thé tïtlé öf thé ßöök) äs wéll äs thé ÛRLs änd "
|
||||
"tïtlés öf éäçh çhäptér ïn thé ßöök. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя"
|
||||
" α∂ιριѕι¢ιηg єłιт, ѕє∂ ∂σ єιυѕмσ∂ тємρσя ιη¢ι∂ι∂υηт υт łαвσяє єт ∂σłσяє "
|
||||
"мαgηα αłιqυα. υт єηιм α∂ мιηιм νєηιαм, qυιѕ ησѕтяυ∂ єχєя¢ιтαтιση υłłαм¢σ "
|
||||
"łαвσяιѕ ηιѕι υт αłιqυιρ єχ єα ¢σммσ∂σ ¢σηѕєqυαт. ∂υιѕ αυтє ιяυяє ∂σłσя ιη "
|
||||
"яєρяєнєη∂єяιт ιη νσłυρтαтє νєłιт єѕѕє ¢ιłłυм ∂σłσяє єυ ƒυgιαт ηυłłα "
|
||||
"ραяιαтυя. єχ¢єρтєυя ѕιηт σ¢¢αє¢αт ¢υρι∂αтαт ηση ρяσι∂єηт, ѕυηт #"
|
||||
|
||||
#: common/lib/xmodule/xmodule/course_module.py
|
||||
msgid "Remote Gradebook"
|
||||
@@ -2776,11 +2776,11 @@ msgstr "Çöürsé Händöüts Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт α#"
|
||||
|
||||
#: common/lib/xmodule/xmodule/course_module.py
|
||||
msgid ""
|
||||
"True if timezones should be shown on dates in the courseware. Deprecated in "
|
||||
"True if timezones should be shown on dates in the course. Deprecated in "
|
||||
"favor of due_date_display_format."
|
||||
msgstr ""
|
||||
"Trüé ïf tïmézönés shöüld ßé shöwn ön dätés ïn thé çöürséwäré. Dépréçätéd ïn "
|
||||
"fävör öf düé_däté_dïspläý_förmät. Ⱡ'σяєм ιρѕυм ∂σłσя ѕ#"
|
||||
"Trüé ïf tïmézönés shöüld ßé shöwn ön dätés ïn thé çöürsé. Dépréçätéd ïn "
|
||||
"fävör öf düé_däté_dïspläý_förmät. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт #"
|
||||
|
||||
#: common/lib/xmodule/xmodule/course_module.py
|
||||
msgid "Due Date Display Format"
|
||||
@@ -2998,19 +2998,19 @@ msgstr ""
|
||||
|
||||
#: common/lib/xmodule/xmodule/course_module.py
|
||||
msgid ""
|
||||
"Enter the course organization that you want to appear in the courseware. "
|
||||
"This setting overrides the organization that you entered when you created "
|
||||
"the course. To use the organization that you entered when you created the "
|
||||
"Enter the course organization that you want to appear in the course. This "
|
||||
"setting overrides the organization that you entered when you created the "
|
||||
"course. To use the organization that you entered when you created the "
|
||||
"course, enter null."
|
||||
msgstr ""
|
||||
"Éntér thé çöürsé örgänïzätïön thät ýöü wänt tö äppéär ïn thé çöürséwäré. "
|
||||
"Thïs séttïng övérrïdés thé örgänïzätïön thät ýöü éntéréd whén ýöü çréätéd "
|
||||
"thé çöürsé. Tö üsé thé örgänïzätïön thät ýöü éntéréd whén ýöü çréätéd thé "
|
||||
"Éntér thé çöürsé örgänïzätïön thät ýöü wänt tö äppéär ïn thé çöürsé. Thïs "
|
||||
"séttïng övérrïdés thé örgänïzätïön thät ýöü éntéréd whén ýöü çréätéd thé "
|
||||
"çöürsé. Tö üsé thé örgänïzätïön thät ýöü éntéréd whén ýöü çréätéd thé "
|
||||
"çöürsé, éntér nüll. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя α∂ιριѕι¢ιηg "
|
||||
"єłιт, ѕє∂ ∂σ єιυѕмσ∂ тємρσя ιη¢ι∂ι∂υηт υт łαвσяє єт ∂σłσяє мαgηα αłιqυα. υт "
|
||||
"єηιм α∂ мιηιм νєηιαм, qυιѕ ησѕтяυ∂ єχєя¢ιтαтιση υłłαм¢σ łαвσяιѕ ηιѕι υт "
|
||||
"αłιqυιρ єχ єα ¢σммσ∂σ ¢σηѕєqυαт. ∂υιѕ αυтє ιяυяє ∂σłσя ιη яєρяєнєη∂єяιт ιη "
|
||||
"νσłυρтαтє νєłιт #"
|
||||
"νσłυρтαтє νєłιт єѕѕє ¢ιł#"
|
||||
|
||||
#: common/lib/xmodule/xmodule/course_module.py
|
||||
msgid "Course Number Display String"
|
||||
@@ -3018,19 +3018,19 @@ msgstr "Çöürsé Nümßér Dïspläý Strïng Ⱡ'σяєм ιρѕυм ∂σł
|
||||
|
||||
#: common/lib/xmodule/xmodule/course_module.py
|
||||
msgid ""
|
||||
"Enter the course number that you want to appear in the courseware. This "
|
||||
"setting overrides the course number that you entered when you created the "
|
||||
"course. To use the course number that you entered when you created the "
|
||||
"course, enter null."
|
||||
"Enter the course number that you want to appear in the course. This setting "
|
||||
"overrides the course number that you entered when you created the course. To"
|
||||
" use the course number that you entered when you created the course, enter "
|
||||
"null."
|
||||
msgstr ""
|
||||
"Éntér thé çöürsé nümßér thät ýöü wänt tö äppéär ïn thé çöürséwäré. Thïs "
|
||||
"séttïng övérrïdés thé çöürsé nümßér thät ýöü éntéréd whén ýöü çréätéd thé "
|
||||
"çöürsé. Tö üsé thé çöürsé nümßér thät ýöü éntéréd whén ýöü çréätéd thé "
|
||||
"çöürsé, éntér nüll. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя α∂ιριѕι¢ιηg "
|
||||
"єłιт, ѕє∂ ∂σ єιυѕмσ∂ тємρσя ιη¢ι∂ι∂υηт υт łαвσяє єт ∂σłσяє мαgηα αłιqυα. υт "
|
||||
"єηιм α∂ мιηιм νєηιαм, qυιѕ ησѕтяυ∂ єχєя¢ιтαтιση υłłαм¢σ łαвσяιѕ ηιѕι υт "
|
||||
"αłιqυιρ єχ єα ¢σммσ∂σ ¢σηѕєqυαт. ∂υιѕ αυтє ιяυяє ∂σłσя ιη яєρяєнєη∂єяιт ιη "
|
||||
"νσłυρтαтє νєłιт єѕѕє ¢ιł#"
|
||||
"Éntér thé çöürsé nümßér thät ýöü wänt tö äppéär ïn thé çöürsé. Thïs séttïng "
|
||||
"övérrïdés thé çöürsé nümßér thät ýöü éntéréd whén ýöü çréätéd thé çöürsé. Tö"
|
||||
" üsé thé çöürsé nümßér thät ýöü éntéréd whén ýöü çréätéd thé çöürsé, éntér "
|
||||
"nüll. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя α∂ιριѕι¢ιηg єłιт, ѕє∂ ∂σ "
|
||||
"єιυѕмσ∂ тємρσя ιη¢ι∂ι∂υηт υт łαвσяє єт ∂σłσяє мαgηα αłιqυα. υт єηιм α∂ мιηιм"
|
||||
" νєηιαм, qυιѕ ησѕтяυ∂ єχєя¢ιтαтιση υłłαм¢σ łαвσяιѕ ηιѕι υт αłιqυιρ єχ єα "
|
||||
"¢σммσ∂σ ¢σηѕєqυαт. ∂υιѕ αυтє ιяυяє ∂σłσя ιη яєρяєнєη∂єяιт ιη νσłυρтαтє νєłιт"
|
||||
" єѕѕє ¢ιłłυм ∂σł#"
|
||||
|
||||
#: common/lib/xmodule/xmodule/course_module.py
|
||||
msgid "Course Maximum Student Enrollment"
|
||||
@@ -6204,59 +6204,6 @@ msgstr ""
|
||||
msgid "Added Course"
|
||||
msgstr "Àddéd Çöürsé Ⱡ'σяєм ιρѕυм ∂σłσя ѕ#"
|
||||
|
||||
#. Translators: "GIT_IMPORT_WITH_XMLMODULESTORE" is a variable name.
|
||||
#. "XMLModuleStore" and "MongoDB" are database systems. You should not
|
||||
#. translate these names.
|
||||
#: lms/djangoapps/dashboard/sysadmin.py
|
||||
msgid ""
|
||||
"Refusing to import. GIT_IMPORT_WITH_XMLMODULESTORE is not turned on, and it "
|
||||
"is generally not safe to import into an XMLModuleStore with multithreaded. "
|
||||
"We recommend you enable the MongoDB based module store instead, unless this "
|
||||
"is a development environment."
|
||||
msgstr ""
|
||||
"Réfüsïng tö ïmpört. GÌT_ÌMPÖRT_WÌTH_XMLMÖDÛLÉSTÖRÉ ïs nöt türnéd ön, änd ït "
|
||||
"ïs générällý nöt säfé tö ïmpört ïntö än XMLMödüléStöré wïth mültïthréädéd. "
|
||||
"Wé réçömménd ýöü énäßlé thé MöngöDB ßäséd mödülé störé ïnstéäd, ünléss thïs "
|
||||
"ïs ä dévélöpmént énvïrönmént. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя "
|
||||
"α∂ιριѕι¢ιηg єłιт, ѕє∂ ∂σ єιυѕмσ∂ тємρσя ιη¢ι∂ι∂υηт υт łαвσяє єт ∂σłσяє мαgηα"
|
||||
" αłιqυα. υт єηιм α∂ мιηιм νєηιαм, qυιѕ ησѕтяυ∂ єχєя¢ιтαтιση υłłαм¢σ łαвσяιѕ "
|
||||
"ηιѕι υт αłιqυιρ єχ єα ¢σммσ∂σ ¢σηѕєqυαт. ∂υιѕ αυтє ιяυяє ∂σłσя ιη яєρ#"
|
||||
|
||||
#: lms/djangoapps/dashboard/sysadmin.py
|
||||
msgid ""
|
||||
"The course {0} already exists in the data directory! (reloading anyway)"
|
||||
msgstr ""
|
||||
"Thé çöürsé {0} älréädý éxïsts ïn thé dätä dïréçtörý! (rélöädïng änýwäý) "
|
||||
"Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя#"
|
||||
|
||||
#. Translators: unable to download the course content from
|
||||
#. the source git repository. Clone occurs if this is brand
|
||||
#. new, and pull is when it is being updated from the
|
||||
#. source.
|
||||
#: lms/djangoapps/dashboard/sysadmin.py
|
||||
msgid ""
|
||||
"Unable to clone or pull repository. Please check your url. Output was: {0!r}"
|
||||
msgstr ""
|
||||
"Ûnäßlé tö çlöné ör püll répösïtörý. Pléäsé çhéçk ýöür ürl. Öütpüt wäs: {0!r}"
|
||||
" Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυ#"
|
||||
|
||||
#: lms/djangoapps/dashboard/sysadmin.py
|
||||
msgid "Failed to clone repository to {directory_name}"
|
||||
msgstr ""
|
||||
"Fäïléd tö çlöné répösïtörý tö {directory_name} Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, "
|
||||
"¢σηѕє¢тє#"
|
||||
|
||||
#: lms/djangoapps/dashboard/sysadmin.py
|
||||
msgid "Successfully switched to branch: {branch_name}"
|
||||
msgstr ""
|
||||
"Süççéssfüllý swïtçhéd tö ßränçh: {branch_name} Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, "
|
||||
"¢σηѕє¢тєтυ#"
|
||||
|
||||
#: lms/djangoapps/dashboard/sysadmin.py
|
||||
msgid "Loaded course {course_name}<br/>Errors:"
|
||||
msgstr ""
|
||||
"Löädéd çöürsé {course_name}<br/>Érrörs: Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє#"
|
||||
|
||||
#: lms/djangoapps/dashboard/sysadmin.py cms/templates/course-create-rerun.html
|
||||
#: cms/templates/index.html lms/templates/shoppingcart/receipt.html
|
||||
msgid "Course Name"
|
||||
|
||||
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user