Merge pull request #12307 from edx/rc/2016-05-03
Release Candidate rc/2016-05-03
This commit is contained in:
@@ -14,14 +14,17 @@ source =
|
||||
omit =
|
||||
cms/envs/*
|
||||
cms/manage.py
|
||||
cms/djangoapps/contentstore/views/dev.py
|
||||
cms/djangoapps/*/migrations/*
|
||||
cms/djangoapps/*/features/*
|
||||
lms/debug/*
|
||||
lms/envs/*
|
||||
lms/djangoapps/*/migrations/*
|
||||
lms/djangoapps/*/features/*
|
||||
common/djangoapps/terrain/*
|
||||
common/djangoapps/*/migrations/*
|
||||
openedx/core/djangoapps/*/migrations/*
|
||||
openedx/core/djangoapps/debug/*
|
||||
|
||||
[report]
|
||||
ignore_errors = True
|
||||
|
||||
@@ -29,10 +29,6 @@ class TestArgParsing(unittest.TestCase):
|
||||
with self.assertRaises(CommandError):
|
||||
self.command.handle("foo", "user@foo.org", "org", "course", "run")
|
||||
|
||||
def test_xml_store(self):
|
||||
with self.assertRaises(CommandError):
|
||||
self.command.handle(ModuleStoreEnum.Type.xml, "user@foo.org", "org", "course", "run")
|
||||
|
||||
def test_nonexistent_user_id(self):
|
||||
errstring = "No user 99 found"
|
||||
with self.assertRaisesRegexp(CommandError, errstring):
|
||||
|
||||
@@ -83,7 +83,8 @@ def register_special_exams(course_key):
|
||||
due_date=timed_exam.due,
|
||||
is_proctored=timed_exam.is_proctored_exam,
|
||||
is_practice_exam=timed_exam.is_practice_exam,
|
||||
is_active=True
|
||||
is_active=True,
|
||||
hide_after_due=timed_exam.hide_after_due,
|
||||
)
|
||||
msg = 'Updated timed exam {exam_id}'.format(exam_id=exam['id'])
|
||||
log.info(msg)
|
||||
@@ -97,7 +98,8 @@ def register_special_exams(course_key):
|
||||
due_date=timed_exam.due,
|
||||
is_proctored=timed_exam.is_proctored_exam,
|
||||
is_practice_exam=timed_exam.is_practice_exam,
|
||||
is_active=True
|
||||
is_active=True,
|
||||
hide_after_due=timed_exam.hide_after_due,
|
||||
)
|
||||
msg = 'Created new timed exam {exam_id}'.format(exam_id=exam_id)
|
||||
log.info(msg)
|
||||
|
||||
@@ -124,15 +124,6 @@ class MixedWithOptionsTestCase(MixedSplitTestCase):
|
||||
'DOC_STORE_CONFIG': DOC_STORE_CONFIG,
|
||||
'OPTIONS': modulestore_options
|
||||
},
|
||||
{
|
||||
'NAME': 'xml',
|
||||
'ENGINE': 'xmodule.modulestore.xml.XMLModuleStore',
|
||||
'OPTIONS': {
|
||||
'data_dir': DATA_DIR,
|
||||
'default_class': 'xmodule.hidden_module.HiddenDescriptor',
|
||||
'xblock_mixins': modulestore_options['xblock_mixins'],
|
||||
}
|
||||
},
|
||||
],
|
||||
'xblock_mixins': modulestore_options['xblock_mixins'],
|
||||
}
|
||||
|
||||
@@ -53,6 +53,10 @@ class TestProctoredExams(ModuleStoreTestCase):
|
||||
exam_review_policy = get_review_policy_by_exam_id(exam['id'])
|
||||
self.assertEqual(exam_review_policy['review_policy'], sequence.exam_review_rules)
|
||||
|
||||
if not exam['is_proctored'] and not exam['is_practice_exam']:
|
||||
# the hide after due value only applies to timed exams
|
||||
self.assertEqual(exam['hide_after_due'], sequence.hide_after_due)
|
||||
|
||||
self.assertEqual(exam['course_id'], unicode(self.course.id))
|
||||
self.assertEqual(exam['content_id'], unicode(sequence.location))
|
||||
self.assertEqual(exam['exam_name'], sequence.display_name)
|
||||
@@ -62,13 +66,14 @@ class TestProctoredExams(ModuleStoreTestCase):
|
||||
self.assertEqual(exam['is_active'], expected_active)
|
||||
|
||||
@ddt.data(
|
||||
(True, 10, True, False, True, False),
|
||||
(True, 10, False, False, True, False),
|
||||
(True, 10, True, True, True, True),
|
||||
(True, 10, True, False, True, False, False),
|
||||
(True, 10, False, False, True, False, False),
|
||||
(True, 10, False, False, True, False, True),
|
||||
(True, 10, True, True, True, True, False),
|
||||
)
|
||||
@ddt.unpack
|
||||
def test_publishing_exam(self, is_time_limited, default_time_limit_minutes,
|
||||
is_proctored_exam, is_practice_exam, expected_active, republish):
|
||||
def test_publishing_exam(self, is_time_limited, default_time_limit_minutes, is_proctored_exam,
|
||||
is_practice_exam, expected_active, republish, hide_after_due):
|
||||
"""
|
||||
Happy path testing to see that when a course is published which contains
|
||||
a proctored exam, it will also put an entry into the exam tables
|
||||
@@ -85,7 +90,8 @@ class TestProctoredExams(ModuleStoreTestCase):
|
||||
is_proctored_exam=is_proctored_exam,
|
||||
is_practice_exam=is_practice_exam,
|
||||
due=datetime.now(UTC) + timedelta(minutes=default_time_limit_minutes + 1),
|
||||
exam_review_rules="allow_use_of_paper"
|
||||
exam_review_rules="allow_use_of_paper",
|
||||
hide_after_due=hide_after_due,
|
||||
)
|
||||
|
||||
listen_for_course_publish(self, self.course.id)
|
||||
@@ -117,7 +123,8 @@ class TestProctoredExams(ModuleStoreTestCase):
|
||||
graded=True,
|
||||
is_time_limited=True,
|
||||
default_time_limit_minutes=10,
|
||||
is_proctored_exam=True
|
||||
is_proctored_exam=True,
|
||||
hide_after_due=False,
|
||||
)
|
||||
|
||||
listen_for_course_publish(self, self.course.id)
|
||||
@@ -147,7 +154,8 @@ class TestProctoredExams(ModuleStoreTestCase):
|
||||
graded=True,
|
||||
is_time_limited=True,
|
||||
default_time_limit_minutes=10,
|
||||
is_proctored_exam=True
|
||||
is_proctored_exam=True,
|
||||
hide_after_due=False,
|
||||
)
|
||||
|
||||
listen_for_course_publish(self, self.course.id)
|
||||
@@ -182,7 +190,8 @@ class TestProctoredExams(ModuleStoreTestCase):
|
||||
graded=True,
|
||||
is_time_limited=True,
|
||||
default_time_limit_minutes=10,
|
||||
is_proctored_exam=True
|
||||
is_proctored_exam=True,
|
||||
hide_after_due=False,
|
||||
)
|
||||
|
||||
listen_for_course_publish(self, self.course.id)
|
||||
@@ -218,7 +227,8 @@ class TestProctoredExams(ModuleStoreTestCase):
|
||||
is_time_limited=True,
|
||||
default_time_limit_minutes=10,
|
||||
is_proctored_exam=True,
|
||||
exam_review_rules="allow_use_of_paper"
|
||||
exam_review_rules="allow_use_of_paper",
|
||||
hide_after_due=False,
|
||||
)
|
||||
|
||||
listen_for_course_publish(self, self.course.id)
|
||||
|
||||
@@ -91,7 +91,7 @@ from util.organizations_helpers import (
|
||||
organizations_enabled,
|
||||
)
|
||||
from util.string_utils import _has_non_ascii_characters
|
||||
from util.course_key_utils import course_key_from_string_or_404
|
||||
from util.course_key_utils import from_string_or_404
|
||||
from xmodule.contentstore.content import StaticContent
|
||||
from xmodule.course_module import CourseFields
|
||||
from xmodule.course_module import DEFAULT_START_DATE
|
||||
@@ -875,7 +875,7 @@ def course_info_handler(request, course_key_string):
|
||||
GET
|
||||
html: return html for editing the course info handouts and updates.
|
||||
"""
|
||||
course_key = course_key_from_string_or_404(course_key_string)
|
||||
course_key = from_string_or_404(course_key_string)
|
||||
|
||||
with modulestore().bulk_operations(course_key):
|
||||
course_module = get_course_and_check_access(course_key, request.user)
|
||||
|
||||
@@ -12,17 +12,3 @@ from django.http import HttpResponseNotFound
|
||||
def dev_mode(request):
|
||||
"Sample static view"
|
||||
return render_to_response("dev/dev_mode.html")
|
||||
|
||||
|
||||
def dev_show_template(request, template):
|
||||
"""
|
||||
Shows the specified template as an HTML page.
|
||||
e.g. /template/ux/reference/container.html shows the template under ux/reference/container.html
|
||||
|
||||
Note: dynamic parameters can also be passed to the page.
|
||||
e.g. /template/ux/reference/container.html?name=Foo
|
||||
"""
|
||||
try:
|
||||
return render_to_response(template, request.GET.dict())
|
||||
except TopLevelLookupException:
|
||||
return HttpResponseNotFound("Couldn't find template {tpl}".format(tpl=template))
|
||||
|
||||
@@ -935,7 +935,8 @@ def create_xblock_info(xblock, data=None, metadata=None, include_ancestor_info=F
|
||||
"is_practice_exam": xblock.is_practice_exam,
|
||||
"is_time_limited": xblock.is_time_limited,
|
||||
"exam_review_rules": xblock.exam_review_rules,
|
||||
"default_time_limit_minutes": xblock.default_time_limit_minutes
|
||||
"default_time_limit_minutes": xblock.default_time_limit_minutes,
|
||||
"hide_after_due": xblock.hide_after_due,
|
||||
})
|
||||
|
||||
# Update with gating info
|
||||
|
||||
@@ -14,8 +14,7 @@ from edxmako.shortcuts import render_to_response
|
||||
from xmodule.modulestore.django import modulestore
|
||||
from xmodule.modulestore import ModuleStoreEnum
|
||||
from xmodule.tabs import CourseTabList, CourseTab, InvalidTabsException, StaticTab
|
||||
from opaque_keys.edx.keys import UsageKey
|
||||
from util.course_key_utils import course_key_from_string_or_404
|
||||
from opaque_keys.edx.keys import CourseKey, UsageKey
|
||||
|
||||
from ..utils import get_lms_link_for_item
|
||||
|
||||
@@ -40,7 +39,7 @@ def tabs_handler(request, course_key_string):
|
||||
Creating a tab, deleting a tab, or changing its contents is not supported through this method.
|
||||
Instead use the general xblock URL (see item.xblock_handler).
|
||||
"""
|
||||
course_key = course_key_from_string_or_404(course_key_string)
|
||||
course_key = CourseKey.from_string(course_key_string)
|
||||
if not has_course_author_access(request.user, course_key):
|
||||
raise PermissionDenied()
|
||||
|
||||
|
||||
@@ -7,12 +7,9 @@ from contentstore.tests.utils import CourseTestCase
|
||||
from contentstore.utils import reverse_course_url
|
||||
from xmodule.x_module import STUDENT_VIEW
|
||||
from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory
|
||||
from django.test.client import RequestFactory
|
||||
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
|
||||
from xmodule.tabs import CourseTabList
|
||||
from xmodule.modulestore.django import modulestore
|
||||
from django.http import Http404
|
||||
from contentstore.views.tabs import tabs_handler
|
||||
|
||||
|
||||
class TabsPageTests(CourseTestCase):
|
||||
@@ -194,14 +191,6 @@ class TabsPageTests(CourseTestCase):
|
||||
self.assertIn('<span class="sr">Delete this component</span>', html)
|
||||
self.assertIn('<span data-tooltip="Drag to reorder" class="drag-handle action"></span>', html)
|
||||
|
||||
def test_invalid_course_id(self):
|
||||
""" Asserts that Http404 is raised when the course id is not valid. """
|
||||
request_factory = RequestFactory()
|
||||
request = request_factory.get('/dummy-url')
|
||||
request.user = self.user
|
||||
with self.assertRaises(Http404):
|
||||
tabs_handler(request, "/some.invalid.key/course-v1:TTT+CS01+2015_T0")
|
||||
|
||||
|
||||
class PrimitiveTabEdit(ModuleStoreTestCase):
|
||||
"""Tests for the primitive tab edit data manipulations"""
|
||||
|
||||
@@ -9,9 +9,6 @@ from django.contrib.auth.models import User
|
||||
from student.models import CourseEnrollment
|
||||
from student.roles import CourseStaffRole, CourseInstructorRole
|
||||
from student import auth
|
||||
from django.http import Http404
|
||||
from contentstore.views.user import course_team_handler
|
||||
from django.test.client import RequestFactory
|
||||
|
||||
|
||||
class UsersTestCase(CourseTestCase):
|
||||
@@ -318,11 +315,3 @@ class UsersTestCase(CourseTestCase):
|
||||
CourseEnrollment.is_enrolled(self.ext_user, self.course.id),
|
||||
'User ext_user should have been enrolled in the course'
|
||||
)
|
||||
|
||||
def test_invalid_course_id(self):
|
||||
""" Asserts that Http404 is raised when the course id is not valid. """
|
||||
request_factory = RequestFactory()
|
||||
request = request_factory.get('/dummy-url')
|
||||
request.user = self.user
|
||||
with self.assertRaises(Http404):
|
||||
course_team_handler(request, "/some.invalid.key/course-v1:TTT+CS01+2015_T0")
|
||||
|
||||
@@ -8,7 +8,7 @@ from django.views.decorators.csrf import ensure_csrf_cookie
|
||||
from edxmako.shortcuts import render_to_response
|
||||
|
||||
from xmodule.modulestore.django import modulestore
|
||||
from util.course_key_utils import course_key_from_string_or_404
|
||||
from opaque_keys.edx.keys import CourseKey
|
||||
from opaque_keys.edx.locator import LibraryLocator
|
||||
from util.json_request import JsonResponse, expect_json
|
||||
from student.roles import CourseInstructorRole, CourseStaffRole, LibraryUserRole
|
||||
@@ -49,7 +49,7 @@ def course_team_handler(request, course_key_string=None, email=None):
|
||||
DELETE:
|
||||
json: remove a particular course team member from the course team (email is required).
|
||||
"""
|
||||
course_key = course_key_from_string_or_404(course_key_string) if course_key_string else None
|
||||
course_key = CourseKey.from_string(course_key_string) if course_key_string else None
|
||||
# No permissions check here - each helper method does its own check.
|
||||
|
||||
if 'application/json' in request.META.get('HTTP_ACCEPT', 'application/json'):
|
||||
|
||||
@@ -50,6 +50,7 @@ class CourseMetadata(object):
|
||||
'is_time_limited',
|
||||
'is_practice_exam',
|
||||
'exam_review_rules',
|
||||
'hide_after_due',
|
||||
'self_paced',
|
||||
'chrome',
|
||||
'default_tab',
|
||||
|
||||
@@ -485,7 +485,6 @@ STATIC_ROOT = ENV_ROOT / "staticfiles" / EDX_PLATFORM_REVISION
|
||||
STATICFILES_DIRS = [
|
||||
COMMON_ROOT / "static",
|
||||
PROJECT_ROOT / "static",
|
||||
LMS_ROOT / "static",
|
||||
|
||||
# This is how you would use the textbook images locally
|
||||
# ("book", ENV_ROOT / "book_images"),
|
||||
@@ -685,8 +684,11 @@ REQUIRE_DEBUG = False
|
||||
REQUIRE_EXCLUDE = ("build.txt",)
|
||||
|
||||
# The execution environment in which to run r.js: auto, node or rhino.
|
||||
# auto will autodetect the environment and make use of node if available and rhino if not.
|
||||
# It can also be a path to a custom class that subclasses require.environments.Environment and defines some "args" function that returns a list with the command arguments to execute.
|
||||
# auto will autodetect the environment and make use of node if available and
|
||||
# rhino if not.
|
||||
# It can also be a path to a custom class that subclasses
|
||||
# require.environments.Environment and defines some "args" function that
|
||||
# returns a list with the command arguments to execute.
|
||||
REQUIRE_ENVIRONMENT = "node"
|
||||
|
||||
|
||||
@@ -957,7 +959,7 @@ EVENT_TRACKING_BACKENDS = {
|
||||
},
|
||||
'processors': [
|
||||
{'ENGINE': 'track.shim.LegacyFieldMappingProcessor'},
|
||||
{'ENGINE': 'track.shim.VideoEventProcessor'}
|
||||
{'ENGINE': 'track.shim.PrefixedEventProcessor'}
|
||||
]
|
||||
}
|
||||
},
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
"text": 'js/vendor/requirejs/text',
|
||||
"underscore": "common/js/vendor/underscore",
|
||||
"underscore.string": "common/js/vendor/underscore.string",
|
||||
"backbone": "js/vendor/backbone-min",
|
||||
"backbone": "common/js/vendor/backbone",
|
||||
"backbone-relational" : "js/vendor/backbone-relational.min",
|
||||
"backbone.associations": "js/vendor/backbone-associations-min",
|
||||
"backbone.paginator": "js/vendor/backbone.paginator.min",
|
||||
|
||||
@@ -29,7 +29,7 @@ requirejs.config({
|
||||
"text": "xmodule_js/common_static/js/vendor/requirejs/text",
|
||||
"underscore": "xmodule_js/common_static/common/js/vendor/underscore",
|
||||
"underscore.string": "xmodule_js/common_static/common/js/vendor/underscore.string",
|
||||
"backbone": "xmodule_js/common_static/js/vendor/backbone-min",
|
||||
"backbone": "xmodule_js/common_static/common/js/vendor/backbone",
|
||||
"backbone.associations": "xmodule_js/common_static/js/vendor/backbone-associations-min",
|
||||
"backbone.paginator": "xmodule_js/common_static/js/vendor/backbone.paginator.min",
|
||||
"backbone-relational": "xmodule_js/common_static/js/vendor/backbone-relational.min",
|
||||
@@ -283,6 +283,8 @@ while i < testFiles.length
|
||||
testFiles[i] = '/base/' + testFiles[i] + '.js'
|
||||
i++
|
||||
|
||||
require testFiles, ->
|
||||
# Jasmine has a global stack for creating a tree of specs. We need to load
|
||||
# spec files one by one, otherwise some end up getting nested under others.
|
||||
requireSerial testFiles, ->
|
||||
# start test run, once Require.js is done
|
||||
window.__karma__.start()
|
||||
|
||||
@@ -26,7 +26,7 @@ requirejs.config({
|
||||
"text": "xmodule_js/common_static/js/vendor/requirejs/text",
|
||||
"underscore": "common/js/vendor/underscore",
|
||||
"underscore.string": "common/js/vendor/underscore.string",
|
||||
"backbone": "xmodule_js/common_static/js/vendor/backbone-min",
|
||||
"backbone": "xmodule_js/common_static/common/js/vendor/backbone",
|
||||
"backbone.associations": "xmodule_js/common_static/js/vendor/backbone-associations-min",
|
||||
"backbone.paginator": "xmodule_js/common_static/js/vendor/backbone.paginator.min",
|
||||
"tinymce": "xmodule_js/common_static/js/vendor/tinymce/js/tinymce/tinymce.full.min",
|
||||
@@ -202,6 +202,9 @@ i = 0
|
||||
while i < testFiles.length
|
||||
testFiles[i] = '/base/' + testFiles[i] + '.js'
|
||||
i++
|
||||
require testFiles, ->
|
||||
|
||||
# Jasmine has a global stack for creating a tree of specs. We need to load
|
||||
# spec files one by one, otherwise some end up getting nested under others.
|
||||
requireSerial testFiles, ->
|
||||
# start test run, once Require.js is done
|
||||
window.__karma__.start()
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
define ["jquery", "jquery.ui", "backbone", "common/js/components/views/feedback_prompt",
|
||||
define ["underscore", "jquery", "jquery.ui", "backbone", "common/js/components/views/feedback_prompt",
|
||||
"common/js/components/views/feedback_notification", "coffee/src/views/module_edit", "js/models/module_info", "js/utils/module"],
|
||||
($, ui, Backbone, PromptView, NotificationView, ModuleEditView, ModuleModel, ModuleUtils) ->
|
||||
(_, $, ui, Backbone, PromptView, NotificationView, ModuleEditView, ModuleModel, ModuleUtils) ->
|
||||
class TabsEdit extends Backbone.View
|
||||
|
||||
initialize: =>
|
||||
initialize: (options) =>
|
||||
@$('.component').each((idx, element) =>
|
||||
model = new ModuleModel({
|
||||
id: $(element).data('locator')
|
||||
@@ -15,7 +15,7 @@ define ["jquery", "jquery.ui", "backbone", "common/js/components/views/feedback_
|
||||
model: model
|
||||
)
|
||||
)
|
||||
|
||||
@options = _.extend({}, options)
|
||||
@options.mast.find('.new-tab').on('click', @addNewTab)
|
||||
$('.add-pages .new-tab').on('click', @addNewTab)
|
||||
$('.toggle-checkbox').on('click', @toggleVisibilityOfTab)
|
||||
|
||||
@@ -41,7 +41,6 @@
|
||||
],
|
||||
"%(field)s can only contain up to %(count)d characters.": "%(field)s \u00e7\u00e4n \u00f6nl\u00fd \u00e7\u00f6nt\u00e4\u00efn \u00fcp t\u00f6 %(count)d \u00e7h\u00e4r\u00e4\u00e7t\u00e9rs. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f #",
|
||||
"%(field)s must have at least %(count)d characters.": "%(field)s m\u00fcst h\u00e4v\u00e9 \u00e4t l\u00e9\u00e4st %(count)d \u00e7h\u00e4r\u00e4\u00e7t\u00e9rs. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f#",
|
||||
"%(hours)s:%(minutes)s (current UTC time)": "%(hours)s:%(minutes)s (\u00e7\u00fcrr\u00e9nt \u00dbT\u00c7 t\u00efm\u00e9) \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455#",
|
||||
"%(memberCount)s / %(maxMemberCount)s Member": [
|
||||
"%(memberCount)s / %(maxMemberCount)s M\u00e9m\u00df\u00e9r \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c#",
|
||||
"%(memberCount)s / %(maxMemberCount)s M\u00e9m\u00df\u00e9rs \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454#"
|
||||
@@ -163,6 +162,7 @@
|
||||
"Active Uploads": "\u00c0\u00e7t\u00efv\u00e9 \u00dbpl\u00f6\u00e4ds \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442#",
|
||||
"Add": "\u00c0dd \u2c60'\u03c3\u044f\u0454\u043c#",
|
||||
"Add Additional Signatory": "\u00c0dd \u00c0dd\u00eft\u00ef\u00f6n\u00e4l S\u00efgn\u00e4t\u00f6r\u00fd \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7#",
|
||||
"Add Allowance": "\u00c0dd \u00c0ll\u00f6w\u00e4n\u00e7\u00e9 \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9#",
|
||||
"Add Cohort": "\u00c0dd \u00c7\u00f6h\u00f6rt \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3#",
|
||||
"Add Component:": "\u00c0dd \u00c7\u00f6mp\u00f6n\u00e9nt: \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442#",
|
||||
"Add Country": "\u00c0dd \u00c7\u00f6\u00fcntr\u00fd \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f #",
|
||||
@@ -171,6 +171,7 @@
|
||||
"Add Students": "\u00c0dd St\u00fcd\u00e9nts \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455#",
|
||||
"Add URLs for additional versions": "\u00c0dd \u00dbRLs f\u00f6r \u00e4dd\u00eft\u00ef\u00f6n\u00e4l v\u00e9rs\u00ef\u00f6ns \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454#",
|
||||
"Add a Chapter": "\u00c0dd \u00e4 \u00c7h\u00e4pt\u00e9r \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9#",
|
||||
"Add a New Allowance": "\u00c0dd \u00e4 N\u00e9w \u00c0ll\u00f6w\u00e4n\u00e7\u00e9 \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442,#",
|
||||
"Add a New Cohort": "\u00c0dd \u00e4 N\u00e9w \u00c7\u00f6h\u00f6rt \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c#",
|
||||
"Add a Response": "\u00c0dd \u00e4 R\u00e9sp\u00f6ns\u00e9 \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442#",
|
||||
"Add a clear and descriptive title to encourage participation.": "\u00c0dd \u00e4 \u00e7l\u00e9\u00e4r \u00e4nd d\u00e9s\u00e7r\u00efpt\u00efv\u00e9 t\u00eftl\u00e9 t\u00f6 \u00e9n\u00e7\u00f6\u00fcr\u00e4g\u00e9 p\u00e4rt\u00ef\u00e7\u00efp\u00e4t\u00ef\u00f6n. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f \u03b1#",
|
||||
@@ -189,6 +190,7 @@
|
||||
"Adding": "\u00c0dd\u00efng \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5#",
|
||||
"Adding the selected course to your cart": "\u00c0dd\u00efng th\u00e9 s\u00e9l\u00e9\u00e7t\u00e9d \u00e7\u00f6\u00fcrs\u00e9 t\u00f6 \u00fd\u00f6\u00fcr \u00e7\u00e4rt \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f#",
|
||||
"Additional Information (optional)": "\u00c0dd\u00eft\u00ef\u00f6n\u00e4l \u00ccnf\u00f6rm\u00e4t\u00ef\u00f6n (\u00f6pt\u00ef\u00f6n\u00e4l) \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454#",
|
||||
"Additional Time (minutes)": "\u00c0dd\u00eft\u00ef\u00f6n\u00e4l T\u00efm\u00e9 (m\u00efn\u00fct\u00e9s) \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455#",
|
||||
"Admin": "\u00c0dm\u00efn \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455#",
|
||||
"Advanced": "\u00c0dv\u00e4n\u00e7\u00e9d \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202#",
|
||||
"Align center": "\u00c0l\u00efgn \u00e7\u00e9nt\u00e9r \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455#",
|
||||
@@ -214,6 +216,9 @@
|
||||
"Allow others to copy, distribute, display and perform your work - and derivative works based upon it - but for noncommercial purposes only.": "\u00c0ll\u00f6w \u00f6th\u00e9rs t\u00f6 \u00e7\u00f6p\u00fd, d\u00efstr\u00ef\u00df\u00fct\u00e9, d\u00efspl\u00e4\u00fd \u00e4nd p\u00e9rf\u00f6rm \u00fd\u00f6\u00fcr w\u00f6rk - \u00e4nd d\u00e9r\u00efv\u00e4t\u00efv\u00e9 w\u00f6rks \u00df\u00e4s\u00e9d \u00fcp\u00f6n \u00eft - \u00df\u00fct f\u00f6r n\u00f6n\u00e7\u00f6mm\u00e9r\u00e7\u00ef\u00e4l p\u00fcrp\u00f6s\u00e9s \u00f6nl\u00fd. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f \u03b1\u2202\u03b9\u03c1\u03b9\u0455\u03b9\u00a2\u03b9\u03b7g \u0454\u0142\u03b9\u0442, \u0455\u0454\u2202 \u2202\u03c3 \u0454\u03b9\u03c5\u0455\u043c\u03c3\u2202 \u0442\u0454\u043c\u03c1\u03c3\u044f \u03b9\u03b7\u00a2\u03b9\u2202\u03b9\u2202\u03c5\u03b7\u0442 \u03c5\u0442 \u0142\u03b1\u0432\u03c3\u044f\u0454 \u0454\u0442 \u2202\u03c3\u0142\u03c3\u044f\u0454 \u043c\u03b1g\u03b7\u03b1 \u03b1\u0142\u03b9q\u03c5\u03b1. \u03c5\u0442 \u0454\u03b7\u03b9\u043c \u03b1\u2202 \u043c\u03b9\u03b7\u03b9\u043c \u03bd\u0454\u03b7\u03b9\u03b1\u043c, q\u03c5\u03b9\u0455 \u03b7\u03c3\u0455\u0442\u044f\u03c5\u2202 \u0454\u03c7\u0454\u044f\u00a2\u03b9\u0442\u03b1\u0442\u03b9\u03c3\u03b7 \u03c5\u0142\u0142\u03b1\u043c\u00a2\u03c3 \u0142\u03b1\u0432\u03c3\u044f\u03b9\u0455 \u03b7\u03b9\u0455\u03b9 \u03c5\u0442 \u03b1\u0142\u03b9q\u03c5\u03b9\u03c1 \u0454\u03c7 \u0454\u03b1 \u00a2\u03c3\u043c\u043c\u03c3\u2202\u03c3 \u00a2\u03c3\u03b7\u0455\u0454q\u03c5\u03b1\u0442. \u2202\u03c5\u03b9\u0455 \u03b1\u03c5\u0442\u0454 \u03b9\u044f\u03c5\u044f\u0454 \u2202\u03c3\u0142\u03c3\u044f \u03b9\u03b7 \u044f\u0454\u03c1\u044f\u0454\u043d\u0454\u03b7\u2202\u0454\u044f\u03b9\u0442 \u03b9\u03b7 \u03bd\u03c3\u0142\u03c5\u03c1\u0442\u03b1\u0442\u0454 \u03bd\u0454\u0142\u03b9\u0442 \u0454\u0455\u0455\u0454 \u00a2\u03b9\u0142\u0142\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f\u0454 \u0454\u03c5 \u0192\u03c5g\u03b9\u03b1\u0442 \u03b7\u03c5\u0142\u0142\u03b1 \u03c1\u03b1\u044f\u03b9\u03b1\u0442\u03c5\u044f. \u0454\u03c7\u00a2\u0454\u03c1\u0442\u0454\u03c5\u044f \u0455\u03b9\u03b7\u0442 \u03c3\u00a2\u00a2\u03b1\u0454\u00a2\u03b1\u0442 \u00a2\u03c5\u03c1\u03b9\u2202\u03b1\u0442\u03b1\u0442 \u03b7\u03c3\u03b7 \u03c1\u044f\u03c3\u03b9\u2202\u0454\u03b7\u0442, \u0455\u03c5\u03b7\u0442 \u03b9\u03b7 \u00a2\u03c5\u0142\u03c1\u03b1 q\u03c5\u03b9 \u03c3\u0192\u0192\u03b9\u00a2\u03b9\u03b1 \u2202\u0454\u0455\u0454\u044f\u03c5\u03b7\u0442 \u043c\u03c3\u0142\u0142\u03b9\u0442 \u03b1\u03b7\u03b9\u043c \u03b9\u2202 \u0454\u0455\u0442 \u0142\u03b1#",
|
||||
"Allow others to distribute derivative works only under a license identical to the license that governs your work. This option is incompatible with \"No Derivatives\".": "\u00c0ll\u00f6w \u00f6th\u00e9rs t\u00f6 d\u00efstr\u00ef\u00df\u00fct\u00e9 d\u00e9r\u00efv\u00e4t\u00efv\u00e9 w\u00f6rks \u00f6nl\u00fd \u00fcnd\u00e9r \u00e4 l\u00ef\u00e7\u00e9ns\u00e9 \u00efd\u00e9nt\u00ef\u00e7\u00e4l t\u00f6 th\u00e9 l\u00ef\u00e7\u00e9ns\u00e9 th\u00e4t g\u00f6v\u00e9rns \u00fd\u00f6\u00fcr w\u00f6rk. Th\u00efs \u00f6pt\u00ef\u00f6n \u00efs \u00efn\u00e7\u00f6mp\u00e4t\u00ef\u00dfl\u00e9 w\u00efth \"N\u00f6 D\u00e9r\u00efv\u00e4t\u00efv\u00e9s\". \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f \u03b1\u2202\u03b9\u03c1\u03b9\u0455\u03b9\u00a2\u03b9\u03b7g \u0454\u0142\u03b9\u0442, \u0455\u0454\u2202 \u2202\u03c3 \u0454\u03b9\u03c5\u0455\u043c\u03c3\u2202 \u0442\u0454\u043c\u03c1\u03c3\u044f \u03b9\u03b7\u00a2\u03b9\u2202\u03b9\u2202\u03c5\u03b7\u0442 \u03c5\u0442 \u0142\u03b1\u0432\u03c3\u044f\u0454 \u0454\u0442 \u2202\u03c3\u0142\u03c3\u044f\u0454 \u043c\u03b1g\u03b7\u03b1 \u03b1\u0142\u03b9q\u03c5\u03b1. \u03c5\u0442 \u0454\u03b7\u03b9\u043c \u03b1\u2202 \u043c\u03b9\u03b7\u03b9\u043c \u03bd\u0454\u03b7\u03b9\u03b1\u043c, q\u03c5\u03b9\u0455 \u03b7\u03c3\u0455\u0442\u044f\u03c5\u2202 \u0454\u03c7\u0454\u044f\u00a2\u03b9\u0442\u03b1\u0442\u03b9\u03c3\u03b7 \u03c5\u0142\u0142\u03b1\u043c\u00a2\u03c3 \u0142\u03b1\u0432\u03c3\u044f\u03b9\u0455 \u03b7\u03b9\u0455\u03b9 \u03c5\u0442 \u03b1\u0142\u03b9q\u03c5\u03b9\u03c1 \u0454\u03c7 \u0454\u03b1 \u00a2\u03c3\u043c\u043c\u03c3\u2202\u03c3 \u00a2\u03c3\u03b7\u0455\u0454q\u03c5\u03b1\u0442. \u2202\u03c5\u03b9\u0455 \u03b1\u03c5\u0442\u0454 \u03b9\u044f\u03c5\u044f\u0454 \u2202\u03c3\u0142\u03c3\u044f \u03b9\u03b7 \u044f\u0454\u03c1\u044f\u0454\u043d\u0454\u03b7\u2202\u0454\u044f\u03b9\u0442 \u03b9\u03b7 \u03bd\u03c3\u0142\u03c5\u03c1\u0442\u03b1\u0442\u0454 \u03bd\u0454\u0142\u03b9\u0442 \u0454\u0455\u0455\u0454 \u00a2\u03b9\u0142\u0142\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f\u0454 \u0454\u03c5 \u0192\u03c5g\u03b9\u03b1\u0442 \u03b7\u03c5\u0142\u0142\u03b1 \u03c1\u03b1\u044f\u03b9\u03b1\u0442\u03c5\u044f. \u0454\u03c7\u00a2\u0454\u03c1\u0442\u0454\u03c5\u044f \u0455\u03b9\u03b7\u0442 \u03c3\u00a2\u00a2\u03b1\u0454\u00a2\u03b1\u0442 \u00a2\u03c5\u03c1\u03b9\u2202\u03b1\u0442\u03b1\u0442 \u03b7\u03c3\u03b7 \u03c1\u044f\u03c3\u03b9\u2202\u0454\u03b7\u0442, \u0455\u03c5\u03b7\u0442 \u03b9\u03b7 \u00a2\u03c5\u0142\u03c1\u03b1 q\u03c5\u03b9 \u03c3\u0192\u0192\u03b9\u00a2\u03b9\u03b1 \u2202#",
|
||||
"Allow students to generate certificates for this course?": "\u00c0ll\u00f6w st\u00fcd\u00e9nts t\u00f6 g\u00e9n\u00e9r\u00e4t\u00e9 \u00e7\u00e9rt\u00eff\u00ef\u00e7\u00e4t\u00e9s f\u00f6r th\u00efs \u00e7\u00f6\u00fcrs\u00e9? \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f \u03b1#",
|
||||
"Allowance Type": "\u00c0ll\u00f6w\u00e4n\u00e7\u00e9 T\u00fdp\u00e9 \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442#",
|
||||
"Allowance Value": "\u00c0ll\u00f6w\u00e4n\u00e7\u00e9 V\u00e4l\u00fc\u00e9 \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1#",
|
||||
"Allowances": "\u00c0ll\u00f6w\u00e4n\u00e7\u00e9s \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3#",
|
||||
"Already a course team member": "\u00c0lr\u00e9\u00e4d\u00fd \u00e4 \u00e7\u00f6\u00fcrs\u00e9 t\u00e9\u00e4m m\u00e9m\u00df\u00e9r \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2#",
|
||||
"Already a library team member": "\u00c0lr\u00e9\u00e4d\u00fd \u00e4 l\u00ef\u00dfr\u00e4r\u00fd t\u00e9\u00e4m m\u00e9m\u00df\u00e9r \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2#",
|
||||
"Already a member": "\u00c0lr\u00e9\u00e4d\u00fd \u00e4 m\u00e9m\u00df\u00e9r \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c#",
|
||||
@@ -398,6 +403,7 @@
|
||||
"Commentary": "\u00c7\u00f6mm\u00e9nt\u00e4r\u00fd \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3#",
|
||||
"Common Problem Types": "\u00c7\u00f6mm\u00f6n Pr\u00f6\u00dfl\u00e9m T\u00fdp\u00e9s \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, #",
|
||||
"Community TA": "\u00c7\u00f6mm\u00fcn\u00eft\u00fd T\u00c0 \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455#",
|
||||
"Completed At": "\u00c7\u00f6mpl\u00e9t\u00e9d \u00c0t \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455#",
|
||||
"Component": "\u00c7\u00f6mp\u00f6n\u00e9nt \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142#",
|
||||
"Configure": "\u00c7\u00f6nf\u00efg\u00fcr\u00e9 \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142#",
|
||||
"Confirm": "\u00c7\u00f6nf\u00efrm \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c #",
|
||||
@@ -640,6 +646,8 @@
|
||||
"Error: User '<%= username %>' has not yet activated their account. Users must create and activate their accounts before they can be assigned a role.": "\u00c9rr\u00f6r: \u00dbs\u00e9r '<%= username %>' h\u00e4s n\u00f6t \u00fd\u00e9t \u00e4\u00e7t\u00efv\u00e4t\u00e9d th\u00e9\u00efr \u00e4\u00e7\u00e7\u00f6\u00fcnt. \u00dbs\u00e9rs m\u00fcst \u00e7r\u00e9\u00e4t\u00e9 \u00e4nd \u00e4\u00e7t\u00efv\u00e4t\u00e9 th\u00e9\u00efr \u00e4\u00e7\u00e7\u00f6\u00fcnts \u00df\u00e9f\u00f6r\u00e9 th\u00e9\u00fd \u00e7\u00e4n \u00df\u00e9 \u00e4ss\u00efgn\u00e9d \u00e4 r\u00f6l\u00e9. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f \u03b1\u2202\u03b9\u03c1\u03b9\u0455\u03b9\u00a2\u03b9\u03b7g \u0454\u0142\u03b9\u0442, \u0455\u0454\u2202 \u2202\u03c3 \u0454\u03b9\u03c5\u0455\u043c\u03c3\u2202 \u0442\u0454\u043c\u03c1\u03c3\u044f \u03b9\u03b7\u00a2\u03b9\u2202\u03b9\u2202\u03c5\u03b7\u0442 \u03c5\u0442 \u0142\u03b1\u0432\u03c3\u044f\u0454 \u0454\u0442 \u2202\u03c3\u0142\u03c3\u044f\u0454 \u043c\u03b1g\u03b7\u03b1 \u03b1\u0142\u03b9q\u03c5\u03b1. \u03c5\u0442 \u0454\u03b7\u03b9\u043c \u03b1\u2202 \u043c\u03b9\u03b7\u03b9\u043c \u03bd\u0454\u03b7\u03b9\u03b1\u043c, q\u03c5\u03b9\u0455 \u03b7\u03c3\u0455\u0442\u044f\u03c5\u2202 \u0454\u03c7\u0454\u044f\u00a2\u03b9\u0442\u03b1\u0442\u03b9\u03c3\u03b7 \u03c5\u0142\u0142\u03b1\u043c\u00a2\u03c3 \u0142\u03b1\u0432\u03c3\u044f\u03b9\u0455 \u03b7\u03b9\u0455\u03b9 \u03c5\u0442 \u03b1\u0142\u03b9q\u03c5\u03b9\u03c1 \u0454\u03c7 \u0454\u03b1 \u00a2\u03c3\u043c\u043c\u03c3\u2202\u03c3 \u00a2\u03c3\u03b7\u0455\u0454q\u03c5\u03b1\u0442. \u2202\u03c5\u03b9\u0455 \u03b1\u03c5\u0442\u0454 \u03b9\u044f\u03c5\u044f\u0454 \u2202\u03c3\u0142\u03c3\u044f \u03b9\u03b7 \u044f\u0454\u03c1\u044f\u0454\u043d\u0454\u03b7\u2202\u0454\u044f\u03b9\u0442 \u03b9\u03b7 \u03bd\u03c3\u0142\u03c5\u03c1\u0442\u03b1\u0442\u0454 \u03bd\u0454\u0142\u03b9\u0442 \u0454\u0455\u0455\u0454 \u00a2\u03b9\u0142\u0142\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f\u0454 \u0454\u03c5 \u0192\u03c5g\u03b9\u03b1\u0442 \u03b7\u03c5\u0142\u0142\u03b1 \u03c1\u03b1\u044f\u03b9\u03b1\u0442\u03c5\u044f. \u0454\u03c7\u00a2\u0454\u03c1\u0442\u0454\u03c5\u044f \u0455\u03b9\u03b7\u0442 \u03c3\u00a2\u00a2\u03b1\u0454\u00a2\u03b1\u0442 \u00a2\u03c5\u03c1\u03b9\u2202\u03b1\u0442\u03b1\u0442 \u03b7\u03c3\u03b7 \u03c1\u044f\u03c3\u03b9\u2202\u0454\u03b7\u0442, \u0455\u03c5\u03b7\u0442 \u03b9\u03b7 \u00a2\u03c5\u0142\u03c1\u03b1 q\u03c5\u03b9 \u03c3\u0192\u0192\u03b9\u00a2\u03b9\u03b1 \u2202\u0454\u0455\u0454\u044f\u03c5\u03b7\u0442 \u043c\u03c3\u0142\u0142\u03b9\u0442 \u03b1\u03b7\u03b9\u043c \u03b9\u2202 \u0454\u0455\u0442 \u0142\u03b1\u0432\u03c3\u044f#",
|
||||
"Error: You cannot remove yourself from the Instructor group!": "\u00c9rr\u00f6r: \u00dd\u00f6\u00fc \u00e7\u00e4nn\u00f6t r\u00e9m\u00f6v\u00e9 \u00fd\u00f6\u00fcrs\u00e9lf fr\u00f6m th\u00e9 \u00ccnstr\u00fc\u00e7t\u00f6r gr\u00f6\u00fcp! \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f \u03b1#",
|
||||
"Errors": "\u00c9rr\u00f6rs \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5#",
|
||||
"Exam Name": "\u00c9x\u00e4m N\u00e4m\u00e9 \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142#",
|
||||
"Exam Type": "\u00c9x\u00e4m T\u00fdp\u00e9 \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142#",
|
||||
"Exception Granted": "\u00c9x\u00e7\u00e9pt\u00ef\u00f6n Gr\u00e4nt\u00e9d \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454#",
|
||||
"Exit full browser": "\u00c9x\u00eft f\u00fcll \u00dfr\u00f6ws\u00e9r \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454#",
|
||||
"Expand All": "\u00c9xp\u00e4nd \u00c0ll \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3#",
|
||||
@@ -649,6 +657,7 @@
|
||||
"Explanation": "\u00c9xpl\u00e4n\u00e4t\u00ef\u00f6n \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f #",
|
||||
"Explicitly Hiding from Students": "\u00c9xpl\u00ef\u00e7\u00eftl\u00fd H\u00efd\u00efng fr\u00f6m St\u00fcd\u00e9nts \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442#",
|
||||
"Explore New XSeries": "\u00c9xpl\u00f6r\u00e9 N\u00e9w XS\u00e9r\u00ef\u00e9s \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442,#",
|
||||
"Explore XSeries Programs": "\u00c9xpl\u00f6r\u00e9 XS\u00e9r\u00ef\u00e9s Pr\u00f6gr\u00e4ms \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7#",
|
||||
"Explore your course!": "\u00c9xpl\u00f6r\u00e9 \u00fd\u00f6\u00fcr \u00e7\u00f6\u00fcrs\u00e9! \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, #",
|
||||
"Failed to delete student state.": "F\u00e4\u00efl\u00e9d t\u00f6 d\u00e9l\u00e9t\u00e9 st\u00fcd\u00e9nt st\u00e4t\u00e9. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442#",
|
||||
"Failed to rescore problem.": "F\u00e4\u00efl\u00e9d t\u00f6 r\u00e9s\u00e7\u00f6r\u00e9 pr\u00f6\u00dfl\u00e9m. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455#",
|
||||
@@ -678,6 +687,7 @@
|
||||
"Font Family": "F\u00f6nt F\u00e4m\u00efl\u00fd \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f #",
|
||||
"Font Sizes": "F\u00f6nt S\u00efz\u00e9s \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3#",
|
||||
"Footer": "F\u00f6\u00f6t\u00e9r \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5#",
|
||||
"For grading to work, you must change all {oldName} subsections to {newName}.": "F\u00f6r gr\u00e4d\u00efng t\u00f6 w\u00f6rk, \u00fd\u00f6\u00fc m\u00fcst \u00e7h\u00e4ng\u00e9 \u00e4ll {oldName} s\u00fc\u00dfs\u00e9\u00e7t\u00ef\u00f6ns t\u00f6 {newName}. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f \u03b1#",
|
||||
"Forgot password?": "F\u00f6rg\u00f6t p\u00e4ssw\u00f6rd? \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c#",
|
||||
"Format": "F\u00f6rm\u00e4t \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5#",
|
||||
"Formats": "F\u00f6rm\u00e4ts \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c #",
|
||||
@@ -690,7 +700,7 @@
|
||||
"Generate": "G\u00e9n\u00e9r\u00e4t\u00e9 \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202#",
|
||||
"Generate Exception Certificates": "G\u00e9n\u00e9r\u00e4t\u00e9 \u00c9x\u00e7\u00e9pt\u00ef\u00f6n \u00c7\u00e9rt\u00eff\u00ef\u00e7\u00e4t\u00e9s \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442#",
|
||||
"Generate a Certificate for all users on the Exception list": "G\u00e9n\u00e9r\u00e4t\u00e9 \u00e4 \u00c7\u00e9rt\u00eff\u00ef\u00e7\u00e4t\u00e9 f\u00f6r \u00e4ll \u00fcs\u00e9rs \u00f6n th\u00e9 \u00c9x\u00e7\u00e9pt\u00ef\u00f6n l\u00efst \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f \u03b1#",
|
||||
"Generate certificates for all users on the Exception list for whom certificates have not yet been run": "G\u00e9n\u00e9r\u00e4t\u00e9 \u00e7\u00e9rt\u00eff\u00ef\u00e7\u00e4t\u00e9s f\u00f6r \u00e4ll \u00fcs\u00e9rs \u00f6n th\u00e9 \u00c9x\u00e7\u00e9pt\u00ef\u00f6n l\u00efst f\u00f6r wh\u00f6m \u00e7\u00e9rt\u00eff\u00ef\u00e7\u00e4t\u00e9s h\u00e4v\u00e9 n\u00f6t \u00fd\u00e9t \u00df\u00e9\u00e9n r\u00fcn \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454#",
|
||||
"Generate certificates for all users on the Exception list who do not yet have a certificate": "G\u00e9n\u00e9r\u00e4t\u00e9 \u00e7\u00e9rt\u00eff\u00ef\u00e7\u00e4t\u00e9s f\u00f6r \u00e4ll \u00fcs\u00e9rs \u00f6n th\u00e9 \u00c9x\u00e7\u00e9pt\u00ef\u00f6n l\u00efst wh\u00f6 d\u00f6 n\u00f6t \u00fd\u00e9t h\u00e4v\u00e9 \u00e4 \u00e7\u00e9rt\u00eff\u00ef\u00e7\u00e4t\u00e9 \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7#",
|
||||
"Generate the user's certificate": "G\u00e9n\u00e9r\u00e4t\u00e9 th\u00e9 \u00fcs\u00e9r's \u00e7\u00e9rt\u00eff\u00ef\u00e7\u00e4t\u00e9 \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442#",
|
||||
"Get Credit": "G\u00e9t \u00c7r\u00e9d\u00eft \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3#",
|
||||
"Go to Dashboard": "G\u00f6 t\u00f6 D\u00e4sh\u00df\u00f6\u00e4rd \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1#",
|
||||
@@ -1227,6 +1237,7 @@
|
||||
"Sorted by": "S\u00f6rt\u00e9d \u00df\u00fd \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142#",
|
||||
"Source": "S\u00f6\u00fcr\u00e7\u00e9 \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5#",
|
||||
"Source code": "S\u00f6\u00fcr\u00e7\u00e9 \u00e7\u00f6d\u00e9 \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f #",
|
||||
"Special Exam": "Sp\u00e9\u00e7\u00ef\u00e4l \u00c9x\u00e4m \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455#",
|
||||
"Special character": "Sp\u00e9\u00e7\u00ef\u00e4l \u00e7h\u00e4r\u00e4\u00e7t\u00e9r \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454#",
|
||||
"Specify an alternative to the official course title to display on certificates. Leave blank to use the official course title.": "Sp\u00e9\u00e7\u00eff\u00fd \u00e4n \u00e4lt\u00e9rn\u00e4t\u00efv\u00e9 t\u00f6 th\u00e9 \u00f6ff\u00ef\u00e7\u00ef\u00e4l \u00e7\u00f6\u00fcrs\u00e9 t\u00eftl\u00e9 t\u00f6 d\u00efspl\u00e4\u00fd \u00f6n \u00e7\u00e9rt\u00eff\u00ef\u00e7\u00e4t\u00e9s. L\u00e9\u00e4v\u00e9 \u00dfl\u00e4nk t\u00f6 \u00fcs\u00e9 th\u00e9 \u00f6ff\u00ef\u00e7\u00ef\u00e4l \u00e7\u00f6\u00fcrs\u00e9 t\u00eftl\u00e9. \u2c60'\u03c3\u044f\u0454\u043c #",
|
||||
"Specify any additional rules or rule exceptions that the proctoring review team should enforce when reviewing the videos. For example, you could specify that calculators are allowed.": "Sp\u00e9\u00e7\u00eff\u00fd \u00e4n\u00fd \u00e4dd\u00eft\u00ef\u00f6n\u00e4l r\u00fcl\u00e9s \u00f6r r\u00fcl\u00e9 \u00e9x\u00e7\u00e9pt\u00ef\u00f6ns th\u00e4t th\u00e9 pr\u00f6\u00e7t\u00f6r\u00efng r\u00e9v\u00ef\u00e9w t\u00e9\u00e4m sh\u00f6\u00fcld \u00e9nf\u00f6r\u00e7\u00e9 wh\u00e9n r\u00e9v\u00ef\u00e9w\u00efng th\u00e9 v\u00efd\u00e9\u00f6s. F\u00f6r \u00e9x\u00e4mpl\u00e9, \u00fd\u00f6\u00fc \u00e7\u00f6\u00fcld sp\u00e9\u00e7\u00eff\u00fd th\u00e4t \u00e7\u00e4l\u00e7\u00fcl\u00e4t\u00f6rs \u00e4r\u00e9 \u00e4ll\u00f6w\u00e9d. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f \u03b1\u2202\u03b9\u03c1\u03b9\u0455\u03b9\u00a2\u03b9\u03b7g \u0454\u0142\u03b9\u0442, \u0455\u0454\u2202 \u2202\u03c3 \u0454\u03b9\u03c5\u0455\u043c\u03c3\u2202 \u0442\u0454\u043c\u03c1\u03c3\u044f \u03b9\u03b7\u00a2\u03b9\u2202\u03b9\u2202\u03c5\u03b7\u0442 \u03c5\u0442 \u0142\u03b1\u0432\u03c3\u044f\u0454 \u0454\u0442 \u2202\u03c3\u0142\u03c3\u044f\u0454 \u043c\u03b1g\u03b7\u03b1 \u03b1\u0142\u03b9q\u03c5\u03b1. \u03c5\u0442 \u0454\u03b7\u03b9\u043c \u03b1\u2202 \u043c\u03b9\u03b7\u03b9\u043c \u03bd\u0454\u03b7\u03b9\u03b1\u043c, q\u03c5\u03b9\u0455 \u03b7\u03c3\u0455\u0442\u044f\u03c5\u2202 \u0454\u03c7\u0454\u044f\u00a2\u03b9\u0442\u03b1\u0442\u03b9\u03c3\u03b7 \u03c5\u0142\u0142\u03b1\u043c\u00a2\u03c3 \u0142\u03b1\u0432\u03c3\u044f\u03b9\u0455 \u03b7\u03b9\u0455\u03b9 \u03c5\u0442 \u03b1\u0142\u03b9q\u03c5\u03b9\u03c1 \u0454\u03c7 \u0454\u03b1 \u00a2\u03c3\u043c\u043c\u03c3\u2202\u03c3 \u00a2\u03c3\u03b7\u0455\u0454q\u03c5\u03b1\u0442. \u2202\u03c5\u03b9\u0455 \u03b1\u03c5\u0442\u0454 \u03b9\u044f\u03c5\u044f\u0454 \u2202\u03c3\u0142\u03c3\u044f \u03b9\u03b7 \u044f\u0454\u03c1\u044f\u0454\u043d\u0454\u03b7\u2202\u0454\u044f\u03b9\u0442 \u03b9\u03b7 \u03bd\u03c3\u0142\u03c5\u03c1\u0442\u03b1\u0442\u0454 \u03bd\u0454\u0142\u03b9\u0442 \u0454\u0455\u0455\u0454 \u00a2\u03b9\u0142\u0142\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f\u0454 \u0454\u03c5 \u0192\u03c5g\u03b9\u03b1\u0442 \u03b7\u03c5\u0142\u0142\u03b1 \u03c1\u03b1\u044f\u03b9\u03b1\u0442\u03c5\u044f. \u0454\u03c7\u00a2\u0454\u03c1\u0442\u0454\u03c5\u044f \u0455\u03b9\u03b7\u0442 \u03c3\u00a2\u00a2\u03b1\u0454\u00a2\u03b1\u0442 \u00a2\u03c5\u03c1\u03b9\u2202\u03b1\u0442\u03b1\u0442 \u03b7\u03c3\u03b7 \u03c1\u044f\u03c3\u03b9\u2202\u0454\u03b7\u0442, \u0455\u03c5#",
|
||||
@@ -1247,6 +1258,7 @@
|
||||
"Start regenerating certificates for students in this course?": "St\u00e4rt r\u00e9g\u00e9n\u00e9r\u00e4t\u00efng \u00e7\u00e9rt\u00eff\u00ef\u00e7\u00e4t\u00e9s f\u00f6r st\u00fcd\u00e9nts \u00efn th\u00efs \u00e7\u00f6\u00fcrs\u00e9? \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f \u03b1#",
|
||||
"Start search": "St\u00e4rt s\u00e9\u00e4r\u00e7h \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455#",
|
||||
"Start working toward your next learning goal.": "St\u00e4rt w\u00f6rk\u00efng t\u00f6w\u00e4rd \u00fd\u00f6\u00fcr n\u00e9xt l\u00e9\u00e4rn\u00efng g\u00f6\u00e4l. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f #",
|
||||
"Started At": "St\u00e4rt\u00e9d \u00c0t \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3#",
|
||||
"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.": "St\u00e4rt\u00e9d \u00e9ntr\u00e4n\u00e7\u00e9 \u00e9x\u00e4m r\u00e9s\u00e7\u00f6r\u00e9 t\u00e4sk f\u00f6r st\u00fcd\u00e9nt '{student_id}'. \u00c7l\u00ef\u00e7k th\u00e9 'Sh\u00f6w B\u00e4\u00e7kgr\u00f6\u00fcnd T\u00e4sk H\u00efst\u00f6r\u00fd f\u00f6r St\u00fcd\u00e9nt' \u00df\u00fctt\u00f6n t\u00f6 s\u00e9\u00e9 th\u00e9 st\u00e4t\u00fcs \u00f6f th\u00e9 t\u00e4sk. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f \u03b1\u2202\u03b9\u03c1\u03b9\u0455\u03b9\u00a2\u03b9\u03b7g \u0454\u0142\u03b9\u0442, \u0455\u0454\u2202 \u2202\u03c3 \u0454\u03b9\u03c5\u0455\u043c\u03c3\u2202 \u0442\u0454\u043c\u03c1\u03c3\u044f \u03b9\u03b7\u00a2\u03b9\u2202\u03b9\u2202\u03c5\u03b7\u0442 \u03c5\u0442 \u0142\u03b1\u0432\u03c3\u044f\u0454 \u0454\u0442 \u2202\u03c3\u0142\u03c3\u044f\u0454 \u043c\u03b1g\u03b7\u03b1 \u03b1\u0142\u03b9q\u03c5\u03b1. \u03c5\u0442 \u0454\u03b7\u03b9\u043c \u03b1\u2202 \u043c\u03b9\u03b7\u03b9\u043c \u03bd\u0454\u03b7\u03b9\u03b1\u043c, q\u03c5\u03b9\u0455 \u03b7\u03c3\u0455\u0442\u044f\u03c5\u2202 \u0454\u03c7\u0454\u044f\u00a2\u03b9\u0442\u03b1\u0442\u03b9\u03c3\u03b7 \u03c5\u0142\u0142\u03b1\u043c\u00a2\u03c3 \u0142\u03b1\u0432\u03c3\u044f\u03b9\u0455 \u03b7\u03b9\u0455\u03b9 \u03c5\u0442 \u03b1\u0142\u03b9q\u03c5\u03b9\u03c1 \u0454\u03c7 \u0454\u03b1 \u00a2\u03c3\u043c\u043c\u03c3\u2202\u03c3 \u00a2\u03c3\u03b7\u0455\u0454q\u03c5\u03b1\u0442. \u2202\u03c5\u03b9\u0455 \u03b1\u03c5\u0442\u0454 \u03b9\u044f\u03c5\u044f\u0454 \u2202\u03c3\u0142\u03c3\u044f \u03b9\u03b7 \u044f\u0454\u03c1\u044f\u0454\u043d\u0454\u03b7\u2202\u0454\u044f\u03b9\u0442 \u03b9\u03b7 \u03bd\u03c3\u0142\u03c5\u03c1\u0442\u03b1\u0442\u0454 \u03bd\u0454\u0142\u03b9\u0442 \u0454\u0455\u0455\u0454 \u00a2\u03b9\u0142\u0142\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f\u0454 \u0454\u03c5 \u0192\u03c5g\u03b9\u03b1\u0442 \u03b7\u03c5\u0142\u0142\u03b1 \u03c1\u03b1\u044f\u03b9\u03b1\u0442\u03c5\u044f. \u0454\u03c7\u00a2\u0454\u03c1\u0442\u0454\u03c5\u044f \u0455\u03b9\u03b7\u0442 \u03c3\u00a2\u00a2\u03b1\u0454\u00a2\u03b1\u0442 \u00a2\u03c5\u03c1\u03b9\u2202\u03b1\u0442\u03b1\u0442 \u03b7\u03c3\u03b7 \u03c1\u044f\u03c3\u03b9\u2202\u0454\u03b7\u0442, \u0455\u03c5\u03b7\u0442 \u03b9\u03b7 \u00a2\u03c5\u0142\u03c1\u03b1 q\u03c5\u03b9 \u03c3\u0192\u0192\u03b9\u00a2\u03b9\u03b1 \u2202\u0454\u0455\u0454\u044f\u03c5\u03b7\u0442 \u043c\u03c3\u0142\u0142\u03b9\u0442 \u03b1\u03b7\u03b9\u043c \u03b9\u2202 \u0454#",
|
||||
"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.": "St\u00e4rt\u00e9d r\u00e9s\u00e7\u00f6r\u00e9 pr\u00f6\u00dfl\u00e9m t\u00e4sk f\u00f6r pr\u00f6\u00dfl\u00e9m '<%= problem_id %>' \u00e4nd st\u00fcd\u00e9nt '<%= student_id %>'. \u00c7l\u00ef\u00e7k th\u00e9 'Sh\u00f6w B\u00e4\u00e7kgr\u00f6\u00fcnd T\u00e4sk H\u00efst\u00f6r\u00fd f\u00f6r St\u00fcd\u00e9nt' \u00df\u00fctt\u00f6n t\u00f6 s\u00e9\u00e9 th\u00e9 st\u00e4t\u00fcs \u00f6f th\u00e9 t\u00e4sk. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f \u03b1\u2202\u03b9\u03c1\u03b9\u0455\u03b9\u00a2\u03b9\u03b7g \u0454\u0142\u03b9\u0442, \u0455\u0454\u2202 \u2202\u03c3 \u0454\u03b9\u03c5\u0455\u043c\u03c3\u2202 \u0442\u0454\u043c\u03c1\u03c3\u044f \u03b9\u03b7\u00a2\u03b9\u2202\u03b9\u2202\u03c5\u03b7\u0442 \u03c5\u0442 \u0142\u03b1\u0432\u03c3\u044f\u0454 \u0454\u0442 \u2202\u03c3\u0142\u03c3\u044f\u0454 \u043c\u03b1g\u03b7\u03b1 \u03b1\u0142\u03b9q\u03c5\u03b1. \u03c5\u0442 \u0454\u03b7\u03b9\u043c \u03b1\u2202 \u043c\u03b9\u03b7\u03b9\u043c \u03bd\u0454\u03b7\u03b9\u03b1\u043c, q\u03c5\u03b9\u0455 \u03b7\u03c3\u0455\u0442\u044f\u03c5\u2202 \u0454\u03c7\u0454\u044f\u00a2\u03b9\u0442\u03b1\u0442\u03b9\u03c3\u03b7 \u03c5\u0142\u0142\u03b1\u043c\u00a2\u03c3 \u0142\u03b1\u0432\u03c3\u044f\u03b9\u0455 \u03b7\u03b9\u0455\u03b9 \u03c5\u0442 \u03b1\u0142\u03b9q\u03c5\u03b9\u03c1 \u0454\u03c7 \u0454\u03b1 \u00a2\u03c3\u043c\u043c\u03c3\u2202\u03c3 \u00a2\u03c3\u03b7\u0455\u0454q\u03c5\u03b1\u0442. \u2202\u03c5\u03b9\u0455 \u03b1\u03c5\u0442\u0454 \u03b9\u044f\u03c5\u044f\u0454 \u2202\u03c3\u0142\u03c3\u044f \u03b9\u03b7 \u044f\u0454\u03c1\u044f\u0454\u043d\u0454\u03b7\u2202\u0454\u044f\u03b9\u0442 \u03b9\u03b7 \u03bd\u03c3\u0142\u03c5\u03c1\u0442\u03b1\u0442\u0454 \u03bd\u0454\u0142\u03b9\u0442 \u0454\u0455\u0455\u0454 \u00a2\u03b9\u0142\u0142\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f\u0454 \u0454\u03c5 \u0192\u03c5g\u03b9\u03b1\u0442 \u03b7\u03c5\u0142\u0142\u03b1 \u03c1\u03b1\u044f\u03b9\u03b1\u0442\u03c5\u044f. \u0454\u03c7\u00a2\u0454\u03c1\u0442\u0454\u03c5\u044f \u0455\u03b9\u03b7\u0442 \u03c3\u00a2\u00a2\u03b1\u0454\u00a2\u03b1\u0442 \u00a2\u03c5\u03c1\u03b9\u2202\u03b1\u0442\u03b1\u0442 \u03b7\u03c3\u03b7 \u03c1\u044f\u03c3\u03b9\u2202\u0454\u03b7\u0442, \u0455\u03c5\u03b7\u0442 \u03b9\u03b7 \u00a2\u03c5\u0142\u03c1\u03b1 q\u03c5\u03b9 \u03c3\u0192\u0192\u03b9\u00a2\u03b9\u03b1 \u2202\u0454\u0455\u0454\u044f\u03c5\u03b7\u0442 \u043c\u03c3#",
|
||||
"Starts": "St\u00e4rts \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5#",
|
||||
@@ -1337,6 +1349,8 @@
|
||||
"The course must have an assigned start date.": "Th\u00e9 \u00e7\u00f6\u00fcrs\u00e9 m\u00fcst h\u00e4v\u00e9 \u00e4n \u00e4ss\u00efgn\u00e9d st\u00e4rt d\u00e4t\u00e9. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f #",
|
||||
"The course start date must be later than the enrollment start date.": "Th\u00e9 \u00e7\u00f6\u00fcrs\u00e9 st\u00e4rt d\u00e4t\u00e9 m\u00fcst \u00df\u00e9 l\u00e4t\u00e9r th\u00e4n th\u00e9 \u00e9nr\u00f6llm\u00e9nt st\u00e4rt d\u00e4t\u00e9. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f #",
|
||||
"The data could not be saved.": "Th\u00e9 d\u00e4t\u00e4 \u00e7\u00f6\u00fcld n\u00f6t \u00df\u00e9 s\u00e4v\u00e9d. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2#",
|
||||
"The description field must be limited to 1000 characters.": "Th\u00e9 d\u00e9s\u00e7r\u00efpt\u00ef\u00f6n f\u00ef\u00e9ld m\u00fcst \u00df\u00e9 l\u00efm\u00eft\u00e9d t\u00f6 1000 \u00e7h\u00e4r\u00e4\u00e7t\u00e9rs. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f \u03b1#",
|
||||
"The duration field must be limited to 50 characters.": "Th\u00e9 d\u00fcr\u00e4t\u00ef\u00f6n f\u00ef\u00e9ld m\u00fcst \u00df\u00e9 l\u00efm\u00eft\u00e9d t\u00f6 50 \u00e7h\u00e4r\u00e4\u00e7t\u00e9rs. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f \u03b1#",
|
||||
"The email address you use to sign in. Communications from {platform_name} and your courses are sent to this address.": "Th\u00e9 \u00e9m\u00e4\u00efl \u00e4ddr\u00e9ss \u00fd\u00f6\u00fc \u00fcs\u00e9 t\u00f6 s\u00efgn \u00efn. \u00c7\u00f6mm\u00fcn\u00ef\u00e7\u00e4t\u00ef\u00f6ns fr\u00f6m {platform_name} \u00e4nd \u00fd\u00f6\u00fcr \u00e7\u00f6\u00fcrs\u00e9s \u00e4r\u00e9 s\u00e9nt t\u00f6 th\u00efs \u00e4ddr\u00e9ss. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1#",
|
||||
"The email address you've provided isn't formatted correctly.": "Th\u00e9 \u00e9m\u00e4\u00efl \u00e4ddr\u00e9ss \u00fd\u00f6\u00fc'v\u00e9 pr\u00f6v\u00efd\u00e9d \u00efsn't f\u00f6rm\u00e4tt\u00e9d \u00e7\u00f6rr\u00e9\u00e7tl\u00fd. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f \u03b1#",
|
||||
"The enrollment end date cannot be after the course end date.": "Th\u00e9 \u00e9nr\u00f6llm\u00e9nt \u00e9nd d\u00e4t\u00e9 \u00e7\u00e4nn\u00f6t \u00df\u00e9 \u00e4ft\u00e9r th\u00e9 \u00e7\u00f6\u00fcrs\u00e9 \u00e9nd d\u00e4t\u00e9. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f \u03b1#",
|
||||
@@ -1366,10 +1380,13 @@
|
||||
"The photo of your face matches the photo on your ID.": "Th\u00e9 ph\u00f6t\u00f6 \u00f6f \u00fd\u00f6\u00fcr f\u00e4\u00e7\u00e9 m\u00e4t\u00e7h\u00e9s th\u00e9 ph\u00f6t\u00f6 \u00f6n \u00fd\u00f6\u00fcr \u00ccD. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f \u03b1#",
|
||||
"The raw error message is:": "Th\u00e9 r\u00e4w \u00e9rr\u00f6r m\u00e9ss\u00e4g\u00e9 \u00efs: \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455#",
|
||||
"The selected content group does not exist": "Th\u00e9 s\u00e9l\u00e9\u00e7t\u00e9d \u00e7\u00f6nt\u00e9nt gr\u00f6\u00fcp d\u00f6\u00e9s n\u00f6t \u00e9x\u00efst \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f #",
|
||||
"The short description field must be limited to 150 characters.": "Th\u00e9 sh\u00f6rt d\u00e9s\u00e7r\u00efpt\u00ef\u00f6n f\u00ef\u00e9ld m\u00fcst \u00df\u00e9 l\u00efm\u00eft\u00e9d t\u00f6 150 \u00e7h\u00e4r\u00e4\u00e7t\u00e9rs. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f \u03b1#",
|
||||
"The subtitle field must be limited to 150 characters.": "Th\u00e9 s\u00fc\u00dft\u00eftl\u00e9 f\u00ef\u00e9ld m\u00fcst \u00df\u00e9 l\u00efm\u00eft\u00e9d t\u00f6 150 \u00e7h\u00e4r\u00e4\u00e7t\u00e9rs. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f \u03b1#",
|
||||
"The team \"%(team)s\" could not be found.": "Th\u00e9 t\u00e9\u00e4m \"%(team)s\" \u00e7\u00f6\u00fcld n\u00f6t \u00df\u00e9 f\u00f6\u00fcnd. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442#",
|
||||
"The thread you selected has been deleted. Please select another thread.": "Th\u00e9 thr\u00e9\u00e4d \u00fd\u00f6\u00fc s\u00e9l\u00e9\u00e7t\u00e9d h\u00e4s \u00df\u00e9\u00e9n d\u00e9l\u00e9t\u00e9d. Pl\u00e9\u00e4s\u00e9 s\u00e9l\u00e9\u00e7t \u00e4n\u00f6th\u00e9r thr\u00e9\u00e4d. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f#",
|
||||
"The timed transcript for the first video file does not appear to be the same as the timed transcript for the second video file.": "Th\u00e9 t\u00efm\u00e9d tr\u00e4ns\u00e7r\u00efpt f\u00f6r th\u00e9 f\u00efrst v\u00efd\u00e9\u00f6 f\u00efl\u00e9 d\u00f6\u00e9s n\u00f6t \u00e4pp\u00e9\u00e4r t\u00f6 \u00df\u00e9 th\u00e9 s\u00e4m\u00e9 \u00e4s th\u00e9 t\u00efm\u00e9d tr\u00e4ns\u00e7r\u00efpt f\u00f6r th\u00e9 s\u00e9\u00e7\u00f6nd v\u00efd\u00e9\u00f6 f\u00efl\u00e9. \u2c60'\u03c3\u044f\u0454#",
|
||||
"The timed transcript for this video on edX is out of date, but YouTube has a current timed transcript for this video.": "Th\u00e9 t\u00efm\u00e9d tr\u00e4ns\u00e7r\u00efpt f\u00f6r th\u00efs v\u00efd\u00e9\u00f6 \u00f6n \u00e9dX \u00efs \u00f6\u00fct \u00f6f d\u00e4t\u00e9, \u00df\u00fct \u00dd\u00f6\u00fcT\u00fc\u00df\u00e9 h\u00e4s \u00e4 \u00e7\u00fcrr\u00e9nt t\u00efm\u00e9d tr\u00e4ns\u00e7r\u00efpt f\u00f6r th\u00efs v\u00efd\u00e9\u00f6. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202#",
|
||||
"The title field must be limited to 50 characters.": "Th\u00e9 t\u00eftl\u00e9 f\u00ef\u00e9ld m\u00fcst \u00df\u00e9 l\u00efm\u00eft\u00e9d t\u00f6 50 \u00e7h\u00e4r\u00e4\u00e7t\u00e9rs. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f \u03b1#",
|
||||
"The topic \"%(topic)s\" could not be found.": "Th\u00e9 t\u00f6p\u00ef\u00e7 \"%(topic)s\" \u00e7\u00f6\u00fcld n\u00f6t \u00df\u00e9 f\u00f6\u00fcnd. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442#",
|
||||
"The weight of all assignments of this type as a percentage of the total grade, for example, 40. Do not include the percent symbol.": "Th\u00e9 w\u00e9\u00efght \u00f6f \u00e4ll \u00e4ss\u00efgnm\u00e9nts \u00f6f th\u00efs t\u00fdp\u00e9 \u00e4s \u00e4 p\u00e9r\u00e7\u00e9nt\u00e4g\u00e9 \u00f6f th\u00e9 t\u00f6t\u00e4l gr\u00e4d\u00e9, f\u00f6r \u00e9x\u00e4mpl\u00e9, 40. D\u00f6 n\u00f6t \u00efn\u00e7l\u00fcd\u00e9 th\u00e9 p\u00e9r\u00e7\u00e9nt s\u00fdm\u00df\u00f6l. \u2c60'#",
|
||||
"The {cohortGroupName} cohort has been created. You can manually add students to this cohort below.": "Th\u00e9 {cohortGroupName} \u00e7\u00f6h\u00f6rt h\u00e4s \u00df\u00e9\u00e9n \u00e7r\u00e9\u00e4t\u00e9d. \u00dd\u00f6\u00fc \u00e7\u00e4n m\u00e4n\u00fc\u00e4ll\u00fd \u00e4dd st\u00fcd\u00e9nts t\u00f6 th\u00efs \u00e7\u00f6h\u00f6rt \u00df\u00e9l\u00f6w. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442#",
|
||||
@@ -1437,6 +1454,7 @@
|
||||
"This team is full.": "Th\u00efs t\u00e9\u00e4m \u00efs f\u00fcll. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442#",
|
||||
"This thread is closed.": "Th\u00efs thr\u00e9\u00e4d \u00efs \u00e7l\u00f6s\u00e9d. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2#",
|
||||
"Time Allotted (HH:MM):": "T\u00efm\u00e9 \u00c0ll\u00f6tt\u00e9d (HH:MM): \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2#",
|
||||
"Time Limit": "T\u00efm\u00e9 L\u00efm\u00eft \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3#",
|
||||
"Time Sent": "T\u00efm\u00e9 S\u00e9nt \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142#",
|
||||
"Time Sent:": "T\u00efm\u00e9 S\u00e9nt: \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3#",
|
||||
"Timed": "T\u00efm\u00e9d \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455#",
|
||||
@@ -1554,6 +1572,7 @@
|
||||
"User": "\u00dbs\u00e9r \u2c60'\u03c3\u044f\u0454\u043c \u03b9#",
|
||||
"User Email": "\u00dbs\u00e9r \u00c9m\u00e4\u00efl \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3#",
|
||||
"Username": "\u00dbs\u00e9rn\u00e4m\u00e9 \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202#",
|
||||
"Username or Email": "\u00dbs\u00e9rn\u00e4m\u00e9 \u00f6r \u00c9m\u00e4\u00efl \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454#",
|
||||
"Username or email address": "\u00dbs\u00e9rn\u00e4m\u00e9 \u00f6r \u00e9m\u00e4\u00efl \u00e4ddr\u00e9ss \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455#",
|
||||
"Users": "\u00dbs\u00e9rs \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455#",
|
||||
"Users must create and activate their account before they can be promoted to beta tester.": "\u00dbs\u00e9rs m\u00fcst \u00e7r\u00e9\u00e4t\u00e9 \u00e4nd \u00e4\u00e7t\u00efv\u00e4t\u00e9 th\u00e9\u00efr \u00e4\u00e7\u00e7\u00f6\u00fcnt \u00df\u00e9f\u00f6r\u00e9 th\u00e9\u00fd \u00e7\u00e4n \u00df\u00e9 pr\u00f6m\u00f6t\u00e9d t\u00f6 \u00df\u00e9t\u00e4 t\u00e9st\u00e9r. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454#",
|
||||
@@ -1561,6 +1580,7 @@
|
||||
"Valid": "V\u00e4l\u00efd \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455#",
|
||||
"Validation Error": "V\u00e4l\u00efd\u00e4t\u00ef\u00f6n \u00c9rr\u00f6r \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c#",
|
||||
"Validation Error While Saving": "V\u00e4l\u00efd\u00e4t\u00ef\u00f6n \u00c9rr\u00f6r Wh\u00efl\u00e9 S\u00e4v\u00efng \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2#",
|
||||
"Value": "V\u00e4l\u00fc\u00e9 \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455#",
|
||||
"Verification Checkpoint": "V\u00e9r\u00eff\u00ef\u00e7\u00e4t\u00ef\u00f6n \u00c7h\u00e9\u00e7kp\u00f6\u00efnt \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3#",
|
||||
"Verification Deadline": "V\u00e9r\u00eff\u00ef\u00e7\u00e4t\u00ef\u00f6n D\u00e9\u00e4dl\u00efn\u00e9 \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, #",
|
||||
"Verification checkpoint to be completed": "V\u00e9r\u00eff\u00ef\u00e7\u00e4t\u00ef\u00f6n \u00e7h\u00e9\u00e7kp\u00f6\u00efnt t\u00f6 \u00df\u00e9 \u00e7\u00f6mpl\u00e9t\u00e9d \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f#",
|
||||
@@ -1652,6 +1672,7 @@
|
||||
"Will Be Visible To:": "W\u00efll B\u00e9 V\u00efs\u00ef\u00dfl\u00e9 T\u00f6: \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442,#",
|
||||
"Words: {0}": "W\u00f6rds: {0} \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3#",
|
||||
"Would you like to sign in using your %(providerName)s credentials?": "W\u00f6\u00fcld \u00fd\u00f6\u00fc l\u00efk\u00e9 t\u00f6 s\u00efgn \u00efn \u00fcs\u00efng \u00fd\u00f6\u00fcr %(providerName)s \u00e7r\u00e9d\u00e9nt\u00ef\u00e4ls? \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f \u03b1#",
|
||||
"XSeries Program Certificates": "XS\u00e9r\u00ef\u00e9s Pr\u00f6gr\u00e4m \u00c7\u00e9rt\u00eff\u00ef\u00e7\u00e4t\u00e9s \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2#",
|
||||
"Year of Birth": "\u00dd\u00e9\u00e4r \u00f6f B\u00efrth \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9#",
|
||||
"Yes, allow edits to the active Certificate": "\u00dd\u00e9s, \u00e4ll\u00f6w \u00e9d\u00efts t\u00f6 th\u00e9 \u00e4\u00e7t\u00efv\u00e9 \u00c7\u00e9rt\u00eff\u00ef\u00e7\u00e4t\u00e9 \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f #",
|
||||
"Yes, delete this %(xblock_type)s": "\u00dd\u00e9s, d\u00e9l\u00e9t\u00e9 th\u00efs %(xblock_type)s \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, #",
|
||||
@@ -1664,6 +1685,7 @@
|
||||
"You are currently sharing a limited profile.": "\u00dd\u00f6\u00fc \u00e4r\u00e9 \u00e7\u00fcrr\u00e9ntl\u00fd sh\u00e4r\u00efng \u00e4 l\u00efm\u00eft\u00e9d pr\u00f6f\u00efl\u00e9. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f #",
|
||||
"You are enrolling in: {courseName}": "\u00dd\u00f6\u00fc \u00e4r\u00e9 \u00e9nr\u00f6ll\u00efng \u00efn: {courseName} \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455#",
|
||||
"You are not currently a member of any team.": "\u00dd\u00f6\u00fc \u00e4r\u00e9 n\u00f6t \u00e7\u00fcrr\u00e9ntl\u00fd \u00e4 m\u00e9m\u00df\u00e9r \u00f6f \u00e4n\u00fd t\u00e9\u00e4m. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f #",
|
||||
"You are not enrolled in any XSeries Programs yet.": "\u00dd\u00f6\u00fc \u00e4r\u00e9 n\u00f6t \u00e9nr\u00f6ll\u00e9d \u00efn \u00e4n\u00fd XS\u00e9r\u00ef\u00e9s Pr\u00f6gr\u00e4ms \u00fd\u00e9t. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f \u03b1#",
|
||||
"You are now enrolled as a verified student for:": "\u00dd\u00f6\u00fc \u00e4r\u00e9 n\u00f6w \u00e9nr\u00f6ll\u00e9d \u00e4s \u00e4 v\u00e9r\u00eff\u00ef\u00e9d st\u00fcd\u00e9nt f\u00f6r: \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f \u03b1#",
|
||||
"You are upgrading your enrollment for: {courseName}": "\u00dd\u00f6\u00fc \u00e4r\u00e9 \u00fcpgr\u00e4d\u00efng \u00fd\u00f6\u00fcr \u00e9nr\u00f6llm\u00e9nt f\u00f6r: {courseName} \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f #",
|
||||
"You can now enter your payment information and complete your enrollment.": "\u00dd\u00f6\u00fc \u00e7\u00e4n n\u00f6w \u00e9nt\u00e9r \u00fd\u00f6\u00fcr p\u00e4\u00fdm\u00e9nt \u00efnf\u00f6rm\u00e4t\u00ef\u00f6n \u00e4nd \u00e7\u00f6mpl\u00e9t\u00e9 \u00fd\u00f6\u00fcr \u00e9nr\u00f6llm\u00e9nt. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f#",
|
||||
@@ -1679,6 +1701,7 @@
|
||||
"You have already reported this annotation.": "\u00dd\u00f6\u00fc h\u00e4v\u00e9 \u00e4lr\u00e9\u00e4d\u00fd r\u00e9p\u00f6rt\u00e9d th\u00efs \u00e4nn\u00f6t\u00e4t\u00ef\u00f6n. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f #",
|
||||
"You have already verified your ID!": "\u00dd\u00f6\u00fc h\u00e4v\u00e9 \u00e4lr\u00e9\u00e4d\u00fd v\u00e9r\u00eff\u00ef\u00e9d \u00fd\u00f6\u00fcr \u00ccD! \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442#",
|
||||
"You have been logged out of your edX account. ": "\u00dd\u00f6\u00fc h\u00e4v\u00e9 \u00df\u00e9\u00e9n l\u00f6gg\u00e9d \u00f6\u00fct \u00f6f \u00fd\u00f6\u00fcr \u00e9dX \u00e4\u00e7\u00e7\u00f6\u00fcnt. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f \u03b1#",
|
||||
"You have earned certificates in %(completed_courses)s of the %(total_courses)s courses so far.": "\u00dd\u00f6\u00fc h\u00e4v\u00e9 \u00e9\u00e4rn\u00e9d \u00e7\u00e9rt\u00eff\u00ef\u00e7\u00e4t\u00e9s \u00efn %(completed_courses)s \u00f6f th\u00e9 %(total_courses)s \u00e7\u00f6\u00fcrs\u00e9s s\u00f6 f\u00e4r. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f \u03b1#",
|
||||
"You have no handouts defined": "\u00dd\u00f6\u00fc h\u00e4v\u00e9 n\u00f6 h\u00e4nd\u00f6\u00fcts d\u00e9f\u00efn\u00e9d \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2#",
|
||||
"You have not bookmarked any courseware pages yet.": "\u00dd\u00f6\u00fc h\u00e4v\u00e9 n\u00f6t \u00df\u00f6\u00f6km\u00e4rk\u00e9d \u00e4n\u00fd \u00e7\u00f6\u00fcrs\u00e9w\u00e4r\u00e9 p\u00e4g\u00e9s \u00fd\u00e9t. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f \u03b1#",
|
||||
"You have not created any certificates yet.": "\u00dd\u00f6\u00fc h\u00e4v\u00e9 n\u00f6t \u00e7r\u00e9\u00e4t\u00e9d \u00e4n\u00fd \u00e7\u00e9rt\u00eff\u00ef\u00e7\u00e4t\u00e9s \u00fd\u00e9t. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f #",
|
||||
@@ -1759,6 +1782,8 @@
|
||||
"asset_path is required": "\u00e4ss\u00e9t_p\u00e4th \u00efs r\u00e9q\u00fc\u00efr\u00e9d \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2#",
|
||||
"bytes": "\u00df\u00fdt\u00e9s \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455#",
|
||||
"certificate": "\u00e7\u00e9rt\u00eff\u00ef\u00e7\u00e4t\u00e9 \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f #",
|
||||
"certificate.credential_url": "\u00e7\u00e9rt\u00eff\u00ef\u00e7\u00e4t\u00e9.\u00e7r\u00e9d\u00e9nt\u00ef\u00e4l_\u00fcrl \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455#",
|
||||
"certificate.display_name": "\u00e7\u00e9rt\u00eff\u00ef\u00e7\u00e4t\u00e9.d\u00efspl\u00e4\u00fd_n\u00e4m\u00e9 \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7#",
|
||||
"close": "\u00e7l\u00f6s\u00e9 \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455#",
|
||||
"content group": "\u00e7\u00f6nt\u00e9nt gr\u00f6\u00fcp \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9#",
|
||||
"correct": "\u00e7\u00f6rr\u00e9\u00e7t \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c #",
|
||||
@@ -1794,6 +1819,7 @@
|
||||
"marked as answer %(time_ago)s": "m\u00e4rk\u00e9d \u00e4s \u00e4nsw\u00e9r %(time_ago)s \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, #",
|
||||
"marked as answer %(time_ago)s by %(user)s": "m\u00e4rk\u00e9d \u00e4s \u00e4nsw\u00e9r %(time_ago)s \u00df\u00fd %(user)s \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454#",
|
||||
"message": "m\u00e9ss\u00e4g\u00e9 \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c #",
|
||||
"minutes": "m\u00efn\u00fct\u00e9s \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c #",
|
||||
"name": "n\u00e4m\u00e9 \u2c60'\u03c3\u044f\u0454\u043c \u03b9#",
|
||||
"off": "\u00f6ff \u2c60'\u03c3\u044f\u0454\u043c#",
|
||||
"on": "\u00f6n \u2c60'\u03c3\u044f#",
|
||||
@@ -1801,7 +1827,7 @@
|
||||
"or": "\u00f6r \u2c60'\u03c3\u044f#",
|
||||
"or create a new one here": "\u00f6r \u00e7r\u00e9\u00e4t\u00e9 \u00e4 n\u00e9w \u00f6n\u00e9 h\u00e9r\u00e9 \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7#",
|
||||
"or sign in with": "\u00f6r s\u00efgn \u00efn w\u00efth \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1#",
|
||||
"org.display_name": "\u00f6rg.d\u00efspl\u00e4\u00fd_n\u00e4m\u00e9 \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c#",
|
||||
"org.key": "\u00f6rg.k\u00e9\u00fd \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c #",
|
||||
"post anonymously": "p\u00f6st \u00e4n\u00f6n\u00fdm\u00f6\u00fcsl\u00fd \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c#",
|
||||
"post anonymously to classmates": "p\u00f6st \u00e4n\u00f6n\u00fdm\u00f6\u00fcsl\u00fd t\u00f6 \u00e7l\u00e4ssm\u00e4t\u00e9s \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442#",
|
||||
"posted %(time_ago)s by %(author)s": "p\u00f6st\u00e9d %(time_ago)s \u00df\u00fd %(author)s \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454#",
|
||||
@@ -1832,6 +1858,7 @@
|
||||
"with %(section_or_subsection)s": "w\u00efth %(section_or_subsection)s \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202#",
|
||||
"{browse_span_start}Browse teams in other topics{span_end} or {search_span_start}search teams{span_end} in this topic. If you still can't find a team to join, {create_span_start}create a new team in this topic{span_end}.": "{browse_span_start}Br\u00f6ws\u00e9 t\u00e9\u00e4ms \u00efn \u00f6th\u00e9r t\u00f6p\u00ef\u00e7s{span_end} \u00f6r {search_span_start}s\u00e9\u00e4r\u00e7h t\u00e9\u00e4ms{span_end} \u00efn th\u00efs t\u00f6p\u00ef\u00e7. \u00ccf \u00fd\u00f6\u00fc st\u00efll \u00e7\u00e4n't f\u00efnd \u00e4 t\u00e9\u00e4m t\u00f6 j\u00f6\u00efn, {create_span_start}\u00e7r\u00e9\u00e4t\u00e9 \u00e4 n\u00e9w t\u00e9\u00e4m \u00efn th\u00efs t\u00f6p\u00ef\u00e7{span_end}. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f \u03b1\u2202\u03b9\u03c1\u03b9\u0455\u03b9\u00a2\u03b9\u03b7g \u0454\u0142\u03b9\u0442, \u0455\u0454\u2202 \u2202\u03c3 \u0454\u03b9\u03c5\u0455\u043c\u03c3\u2202 \u0442\u0454\u043c\u03c1\u03c3\u044f \u03b9\u03b7\u00a2\u03b9\u2202\u03b9\u2202\u03c5\u03b7\u0442 \u03c5\u0442 \u0142\u03b1\u0432\u03c3\u044f\u0454 \u0454\u0442 \u2202\u03c3\u0142\u03c3\u044f\u0454 \u043c\u03b1g\u03b7\u03b1 \u03b1\u0142\u03b9q\u03c5\u03b1. \u03c5\u0442 \u0454\u03b7\u03b9\u043c \u03b1\u2202 \u043c\u03b9\u03b7\u03b9\u043c \u03bd\u0454\u03b7\u03b9\u03b1\u043c, q\u03c5\u03b9\u0455 \u03b7\u03c3\u0455\u0442\u044f\u03c5\u2202 \u0454\u03c7\u0454\u044f\u00a2\u03b9\u0442\u03b1\u0442\u03b9\u03c3\u03b7 \u03c5\u0142\u0142\u03b1\u043c\u00a2\u03c3 \u0142\u03b1\u0432\u03c3\u044f\u03b9\u0455 \u03b7\u03b9\u0455\u03b9 \u03c5\u0442 \u03b1\u0142\u03b9q\u03c5\u03b9\u03c1 \u0454\u03c7 \u0454\u03b1 \u00a2\u03c3\u043c\u043c\u03c3\u2202\u03c3 \u00a2\u03c3\u03b7\u0455\u0454q\u03c5\u03b1\u0442. \u2202\u03c5\u03b9\u0455 \u03b1\u03c5\u0442\u0454 \u03b9\u044f\u03c5\u044f\u0454 \u2202\u03c3\u0142\u03c3\u044f \u03b9\u03b7 \u044f\u0454\u03c1\u044f\u0454\u043d\u0454\u03b7\u2202\u0454\u044f\u03b9\u0442 \u03b9\u03b7 \u03bd\u03c3\u0142\u03c5\u03c1\u0442\u03b1\u0442\u0454 \u03bd\u0454\u0142\u03b9\u0442 \u0454\u0455\u0455\u0454 \u00a2\u03b9\u0142\u0142\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f\u0454 \u0454\u03c5 \u0192\u03c5g\u03b9\u03b1\u0442 \u03b7\u03c5\u0142\u0142\u03b1 \u03c1\u03b1\u044f\u03b9\u03b1\u0442\u03c5\u044f. \u0454\u03c7\u00a2\u0454\u03c1\u0442\u0454\u03c5\u044f \u0455\u03b9\u03b7\u0442 \u03c3\u00a2\u00a2\u03b1\u0454\u00a2\u03b1\u0442 \u00a2\u03c5\u03c1\u03b9\u2202\u03b1\u0442\u03b1\u0442 \u03b7\u03c3\u03b7 \u03c1\u044f\u03c3\u03b9\u2202\u0454\u03b7\u0442, \u0455\u03c5\u03b7\u0442 \u03b9\u03b7 \u00a2\u03c5\u0142\u03c1\u03b1 q\u03c5\u03b9 \u03c3\u0192\u0192\u03b9\u00a2\u03b9\u03b1 \u2202\u0454\u0455\u0454\u044f\u03c5\u03b7\u0442 \u043c\u03c3\u0142\u0142\u03b9\u0442 \u03b1\u03b7#",
|
||||
"{email} is already on the {container} team. Recheck the email address if you want to add a new member.": "{email} \u00efs \u00e4lr\u00e9\u00e4d\u00fd \u00f6n th\u00e9 {container} t\u00e9\u00e4m. R\u00e9\u00e7h\u00e9\u00e7k th\u00e9 \u00e9m\u00e4\u00efl \u00e4ddr\u00e9ss \u00eff \u00fd\u00f6\u00fc w\u00e4nt t\u00f6 \u00e4dd \u00e4 n\u00e9w m\u00e9m\u00df\u00e9r. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455#",
|
||||
"{hours}:{minutes} (current UTC time)": "{hours}:{minutes} (\u00e7\u00fcrr\u00e9nt \u00dbT\u00c7 t\u00efm\u00e9) \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455#",
|
||||
"{numMoved} student was removed from {oldCohort}": [
|
||||
"{numMoved} st\u00fcd\u00e9nt w\u00e4s r\u00e9m\u00f6v\u00e9d fr\u00f6m {oldCohort} \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454#",
|
||||
"{numMoved} st\u00fcd\u00e9nts w\u00e9r\u00e9 r\u00e9m\u00f6v\u00e9d fr\u00f6m {oldCohort} \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442#"
|
||||
|
||||
@@ -143,16 +143,21 @@
|
||||
"A valid email address is required": "Un email correcto es requerido.",
|
||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZ": "ABCDEFGHIJKLMN\u00d1OPQRSTUVWXYZ",
|
||||
"Abbreviation": "Abreviatura",
|
||||
"About Me": "Sobre M\u00ed",
|
||||
"About You": "Acerca de usted",
|
||||
"About me": "Sobre m\u00ed",
|
||||
"Access": "Acceder",
|
||||
"Accomplishments": "Logros",
|
||||
"Accomplishments Pagination": "Paginaci\u00f3n de Logros",
|
||||
"Account Not Activated": "Cuenta no activada",
|
||||
"Account Settings": "Configuraci\u00f3n de cuenta",
|
||||
"Account Settings page.": "P\u00e1gina de configuraci\u00f3n de cuenta.",
|
||||
"Action": "Acci\u00f3n",
|
||||
"Action required: Enter a valid date.": "Acci\u00f3n requerida: Introduzca una fecha v\u00e1lida.",
|
||||
"Actions": "Acciones",
|
||||
"Activate": "Activar",
|
||||
"Activate Your Account": "Activar su cuenta",
|
||||
"Activating a link in this group will skip to the corresponding point in the video.": "Activar un enlace en este grupo har\u00e1 que el video salte al momento correspondiente.",
|
||||
"Active Threads": "Hilos Activos",
|
||||
"Active Uploads": "Cargas activas",
|
||||
"Add": "A\u00f1adir",
|
||||
@@ -160,7 +165,7 @@
|
||||
"Add Cohort": "A\u00f1adir cohorte",
|
||||
"Add Component:": "A\u00f1adir Componente:",
|
||||
"Add Country": "A\u00f1adir pa\u00eds",
|
||||
"Add New Component": "A\u00f1adir nuevo Componente",
|
||||
"Add New Component": "A\u00f1adir Nuevo Componente",
|
||||
"Add Post": "A\u00f1adir entrada",
|
||||
"Add Students": "A\u00f1adir estudiantes",
|
||||
"Add URLs for additional versions": "A\u00f1ada URLs para las versiones adicionales",
|
||||
@@ -560,6 +565,7 @@
|
||||
"Encoding": "Codificaci\u00f3n",
|
||||
"End": "Fin",
|
||||
"End My Exam": "Terminar mi examen",
|
||||
"End of transcript. Skip to the start.": "Fin de la transcripci\u00f3n. Saltar al inicio.",
|
||||
"Endorse": "Validar",
|
||||
"Engage with posts": "Trabajar con las publicaciones",
|
||||
"Enrolling you in the selected course": "Inscribi\u00e9ndolo en el curso seleccionado",
|
||||
@@ -794,6 +800,7 @@
|
||||
"Keywords": "Palabras clave",
|
||||
"LEARN MORE": "APRENDER MAS",
|
||||
"Language": "Idioma",
|
||||
"Language: Press the UP arrow key to enter the language menu then use UP and DOWN arrow keys to navigate language options. Press ENTER to change to the selected language.": "Idioma: Presione la flecha ARRIBA para entrar al men\u00fa de idioma, luego use las flechas ARRIBA y ABAJO para navegar las opciones de idioma. Presione ENTRAR para cambiar al idioma seleccionado.",
|
||||
"Large": "Largo",
|
||||
"Last Activity %(date)s": "\u00daltima Actividad %(date)s",
|
||||
"Last Edited:": "\u00daltima modificaci\u00f3n:",
|
||||
@@ -868,7 +875,7 @@
|
||||
"Merge cells": "Fusionar celdas",
|
||||
"Message:": "Mensaje:",
|
||||
"Middle": "En medio",
|
||||
"Minimum Score:": "Nota m\u00ednima",
|
||||
"Minimum Score:": "Calificaci\u00f3n m\u00ednima",
|
||||
"Module state successfully deleted.": "Estado del m\u00f3dulo borrado exit\u00f3samente.",
|
||||
"More": "M\u00e1s",
|
||||
"Must complete verification checkpoint": "Debe completar el punto de verificaci\u00f3n",
|
||||
@@ -938,6 +945,7 @@
|
||||
"Only properly formatted .csv files will be accepted.": "Solo archivos .csv correctamente formateados pueden ser utilizados.",
|
||||
"Open": "Abrir",
|
||||
"Open Calculator": "Abrir Calculadora",
|
||||
"Open language menu.": "Abrir men\u00fa de idiomas.",
|
||||
"Open/download this file": "Abrir / descargar este archivo",
|
||||
"OpenAssessment Save Error": "Error al guardar en el servidor OpenAssessment",
|
||||
"Optional Characteristics": "Caracter\u00edsiticas Opcionales",
|
||||
@@ -949,6 +957,7 @@
|
||||
"Organization of the signatory": "Organizaci\u00f3n del signatario",
|
||||
"Other": "Otro",
|
||||
"Page break": "Salto de p\u00e1gina",
|
||||
"Pagination": "Paginaci\u00f3n",
|
||||
"Paragraph": "P\u00e1rrafo",
|
||||
"Password": "Contrase\u00f1a",
|
||||
"Password Reset Email Sent": "El correo para restablecer contrase\u00f1a ha sido enviado.",
|
||||
@@ -1016,7 +1025,7 @@
|
||||
"Pre": "Pre",
|
||||
"Preferred Language": "Preferencia de idioma",
|
||||
"Preformatted": "Preformateado",
|
||||
"Prerequisite:": "Prerrequisito",
|
||||
"Prerequisite:": "Prerrequisito:",
|
||||
"Prerequisite: %(prereq_display_name)s": "Prerrequisito: %(prereq_display_name)s ",
|
||||
"Prev": "Previo",
|
||||
"Prevent students from generating certificates in this course?": "\u00a1Evitar que estudiantes generen certificados para este curso ?",
|
||||
@@ -1033,6 +1042,7 @@
|
||||
"Proctored exams are timed and they record video of each learner taking the exam. The videos are then reviewed to ensure that learners follow all examination rules.": "Los ex\u00e1menes supervisados son cronometrados y un software graba a cada estudiante que toma el examen. Los videos luego son revisados para garantizar que el estudiante cumpli\u00f3 con todas las reglas del examen.",
|
||||
"Professional Education": "Educaci\u00f3n profesional",
|
||||
"Professional Education Verified Certificate": "Certificado verificado",
|
||||
"Profile": "Perfil",
|
||||
"Profile Image": "Foto de perfil",
|
||||
"Profile image for {username}": "Foto de perfil para {username}",
|
||||
"Promote another member to Admin to remove your admin rights": "Promueva a otro miembro del equipo a administrador si quiere quitar sus propios privilegios de administrador",
|
||||
@@ -1213,6 +1223,7 @@
|
||||
"Start": "Inicio",
|
||||
"Start Date": "Fecha inicial:",
|
||||
"Start generating certificates for all students in this course?": "\u00bfComenzar a generar los certificados para todos los alumnos de este curso?",
|
||||
"Start of transcript. Skip to the end.": "Inicio de la transcripci\u00f3n. Saltar al final.",
|
||||
"Start regenerating certificates for students in this course?": "Iniciar regeneraci\u00f3n de certificados para estudiantes de este curso?",
|
||||
"Start search": "Iniciar b\u00fasqueda",
|
||||
"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.": "Iniciada tarea de recalificaci\u00f3n de ex\u00e1men de ingreso para estudiante '{student_id}'. Clic en el bot\u00f3n 'Mostrar historial de tareas para estudiante' para ver el estado de la tarea.",
|
||||
@@ -1279,6 +1290,7 @@
|
||||
"Team member profiles": "Perfiles de los miembros del equipo",
|
||||
"Team name cannot have more than 255 characters.": "El nombre del equipo no puede tener m\u00e1s de 255 caracteres.",
|
||||
"Teams": "Equipos",
|
||||
"Teams Pagination": "Paginaci\u00f3n de Equipos",
|
||||
"Tell other learners a little about yourself: where you live, what your interests are, why you're taking courses, or what you hope to learn.": "Comparta con otros usuarios algo sobre usted: donde vive, cuales son sus intereses, porque est\u00e1 tomando estos cursos, o cuales son sus expectativas de aprendizaje.",
|
||||
"Templates": "Plantillas",
|
||||
"Text": "Texto",
|
||||
@@ -1325,6 +1337,7 @@
|
||||
"The name that identifies you throughout {platform_name}. You cannot change your username.": "En nombre que lo identifica en el sitio de {platform_name}. No podr\u00e1 ser cambiado.",
|
||||
"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.": "Nombre que se usar\u00e1 para la verificaci\u00f3n de identidad y que aparece en sus certificados. Otros estudiantes nunca ver\u00e1n su nombre completo. Aseg\u00farese de que ingresa el nombre exactamente como aparece en su identificaci\u00f3n oficial con foto, incluyendo cualquier caracter no romano.",
|
||||
"The number of assignments of this type that will be dropped. The lowest scoring assignments are dropped first.": "El n\u00famero de asignaciones de este tipo que ser\u00e1n descartados. Las asignaciones con calificaciones m\u00e1s bajas ser\u00e1n las primeras en ser descartadas.",
|
||||
"The number of subsections in the course that contain problems of this assignment type.": "El n\u00famero de subdivisiones del curso que contiene problemas de este tipo de asignaci\u00f3n.",
|
||||
"The organization that this signatory belongs to, as it should appear on certificates.": "La organizaci\u00f3n a la que pertenece el firmante, como debe aparecer en los certificados. ",
|
||||
"The page \"%(route)s\" could not be found.": "La p\u00e1gina \"%(route)s\" no pudo ser encontrada.",
|
||||
"The photo of your face matches the photo on your ID.": "La foto de su documento coincide con la foto de su cara.",
|
||||
@@ -1335,6 +1348,7 @@
|
||||
"The timed transcript for the first video file does not appear to be the same as the timed transcript for the second video file.": "La transcripci\u00f3n para este primer video no parece ser la misma que la transcripci\u00f3n para el segundo video",
|
||||
"The timed transcript for this video on edX is out of date, but YouTube has a current timed transcript for this video.": "La transcripci\u00f3n para este video en edX est\u00e1 desactualizada, pero en YouTube hay una transcripci\u00f3n actualizada para el mismo",
|
||||
"The topic \"%(topic)s\" could not be found.": "El tema \"%(topic)s no pudo ser encontrado.",
|
||||
"The weight of all assignments of this type as a percentage of the total grade, for example, 40. Do not include the percent symbol.": "El peso de todas las asignaciones de este tipo como porcentaje de la calificaci\u00f3n total, por ejemplo, 40. No incluya el s\u00edmbolo de porcentaje.",
|
||||
"The {cohortGroupName} cohort has been created. You can manually add students to this cohort below.": "El cohorte {cohortGroupName} ha sido creado. Puede manualmente a\u00f1adir estudiantes a este cohorte.",
|
||||
"There are invalid keywords in your email. Please check the following keywords and try again:": "Hay errores en su e-mail. Por favor, compruebe las siguientes claves e intente de nuevo:",
|
||||
"There has been a failure to export to XML at least one component. It is recommended that you go to the edit page and repair the error before attempting another export. Please check that all components on the page are valid and do not display any error messages.": "Ha habido una falla para exportar al XML al menos un componente. Se recomienda ir a la p\u00e1gina de edici\u00f3n y reparar el error antes de intentar otra exportaci\u00f3n. Por favor, verifique que todos los componentes en la p\u00e1gina son validos y no exhiben ninguna mensaje de error. ",
|
||||
@@ -1429,6 +1443,7 @@
|
||||
"Topics": "Temas",
|
||||
"Total": "Total",
|
||||
"Total Number": "N\u00famero total",
|
||||
"Transcript will be displayed when you start playing the video.": "La transcripci\u00f3n se visualizar\u00e1 cuando empieza a reproducir el video.",
|
||||
"Try the transaction again in a few minutes.": "Intente la transacci\u00f3n nuevamente en algunos minutos.",
|
||||
"Try using a different browser, such as Google Chrome.": "Intente usar otro navegador. Por ejemplo Google Chrome.",
|
||||
"Turn off transcripts": "Desactivar transcripci\u00f3n",
|
||||
@@ -1531,6 +1546,7 @@
|
||||
"Video ID": "ID del video",
|
||||
"Video ended": "Fin del video",
|
||||
"Video position": "Posici\u00f3n del video",
|
||||
"Video transcript": "Transcripci\u00f3n de video",
|
||||
"VideoPlayer: Element corresponding to the given selector was not found.": "VideoPlayer: El elemento correspondiente al selector dado no ha sido encontrado.",
|
||||
"View": "Ver",
|
||||
"View %(span_start)s %(team_name)s %(span_end)s": "Ver %(span_start)s %(team_name)s %(span_end)s",
|
||||
@@ -1680,6 +1696,7 @@
|
||||
"Your post will be discarded.": "Su publicaci\u00f3n ser\u00e1 descartada.",
|
||||
"Your request could not be completed due to a server problem. Reload the page and try again. If the issue persists, click the Help tab to report the problem.": "Su solicitud no pudo ser completada debido a un problema en el servidor. Recargue la p\u00e1gina e intente nuevamente. Si el problema persiste, haga clic en la pesta\u00f1a de ayuda para reportar el problema.",
|
||||
"Your request could not be completed. Reload the page and try again.": "Su solicitud no pudo ser completada. Recargue la p\u00e1gina e intente nuevamente.",
|
||||
"Your request could not be completed. Reload the page and try again. If the issue persists, click the Help tab to report the problem.": "Su solicitud no pudo ser completada. Recargue la p\u00e1gina e intente nuevamente. Si el problema persiste, haga clic en la pesta\u00f1a de Ayuda para reportar el problema.",
|
||||
"Your team could not be created.": "Su equipo no pudo ser creado.",
|
||||
"Your team could not be updated.": "Su equipo no pudo ser actualizado.",
|
||||
"Your upload of '{file}' failed.": "No se ha podido cargar el archivo '{file}'.",
|
||||
|
||||
@@ -41,7 +41,6 @@
|
||||
],
|
||||
"%(field)s can only contain up to %(count)d characters.": "%(field)s \u0254\u0250n \u00f8nl\u028e \u0254\u00f8n\u0287\u0250\u1d09n nd \u0287\u00f8 %(count)d \u0254\u0265\u0250\u0279\u0250\u0254\u0287\u01dd\u0279s.",
|
||||
"%(field)s must have at least %(count)d characters.": "%(field)s \u026fns\u0287 \u0265\u0250\u028c\u01dd \u0250\u0287 l\u01dd\u0250s\u0287 %(count)d \u0254\u0265\u0250\u0279\u0250\u0254\u0287\u01dd\u0279s.",
|
||||
"%(hours)s:%(minutes)s (current UTC time)": "%(hours)s:%(minutes)s (\u0254n\u0279\u0279\u01ddn\u0287 \u0244\u0166\u023b \u0287\u1d09\u026f\u01dd)",
|
||||
"%(memberCount)s / %(maxMemberCount)s Member": [
|
||||
"%(memberCount)s / %(maxMemberCount)s M\u01dd\u026fb\u01dd\u0279",
|
||||
"%(memberCount)s / %(maxMemberCount)s M\u01dd\u026fb\u01dd\u0279s"
|
||||
@@ -688,6 +687,7 @@
|
||||
"Font Family": "F\u00f8n\u0287 F\u0250\u026f\u1d09l\u028e",
|
||||
"Font Sizes": "F\u00f8n\u0287 S\u1d09z\u01dds",
|
||||
"Footer": "F\u00f8\u00f8\u0287\u01dd\u0279",
|
||||
"For grading to work, you must change all {oldName} subsections to {newName}.": "F\u00f8\u0279 \u0183\u0279\u0250d\u1d09n\u0183 \u0287\u00f8 \u028d\u00f8\u0279\u029e, \u028e\u00f8n \u026fns\u0287 \u0254\u0265\u0250n\u0183\u01dd \u0250ll {oldName} snbs\u01dd\u0254\u0287\u1d09\u00f8ns \u0287\u00f8 {newName}.",
|
||||
"Forgot password?": "F\u00f8\u0279\u0183\u00f8\u0287 d\u0250ss\u028d\u00f8\u0279d?",
|
||||
"Format": "F\u00f8\u0279\u026f\u0250\u0287",
|
||||
"Formats": "F\u00f8\u0279\u026f\u0250\u0287s",
|
||||
@@ -700,7 +700,6 @@
|
||||
"Generate": "\u01e4\u01ddn\u01dd\u0279\u0250\u0287\u01dd",
|
||||
"Generate Exception Certificates": "\u01e4\u01ddn\u01dd\u0279\u0250\u0287\u01dd \u0246x\u0254\u01ddd\u0287\u1d09\u00f8n \u023b\u01dd\u0279\u0287\u1d09\u025f\u1d09\u0254\u0250\u0287\u01dds",
|
||||
"Generate a Certificate for all users on the Exception list": "\u01e4\u01ddn\u01dd\u0279\u0250\u0287\u01dd \u0250 \u023b\u01dd\u0279\u0287\u1d09\u025f\u1d09\u0254\u0250\u0287\u01dd \u025f\u00f8\u0279 \u0250ll ns\u01dd\u0279s \u00f8n \u0287\u0265\u01dd \u0246x\u0254\u01ddd\u0287\u1d09\u00f8n l\u1d09s\u0287",
|
||||
"Generate certificates for all users on the Exception list for whom certificates have not yet been run": "\u01e4\u01ddn\u01dd\u0279\u0250\u0287\u01dd \u0254\u01dd\u0279\u0287\u1d09\u025f\u1d09\u0254\u0250\u0287\u01dds \u025f\u00f8\u0279 \u0250ll ns\u01dd\u0279s \u00f8n \u0287\u0265\u01dd \u0246x\u0254\u01ddd\u0287\u1d09\u00f8n l\u1d09s\u0287 \u025f\u00f8\u0279 \u028d\u0265\u00f8\u026f \u0254\u01dd\u0279\u0287\u1d09\u025f\u1d09\u0254\u0250\u0287\u01dds \u0265\u0250\u028c\u01dd n\u00f8\u0287 \u028e\u01dd\u0287 b\u01dd\u01ddn \u0279nn",
|
||||
"Generate certificates for all users on the Exception list who do not yet have a certificate": "\u01e4\u01ddn\u01dd\u0279\u0250\u0287\u01dd \u0254\u01dd\u0279\u0287\u1d09\u025f\u1d09\u0254\u0250\u0287\u01dds \u025f\u00f8\u0279 \u0250ll ns\u01dd\u0279s \u00f8n \u0287\u0265\u01dd \u0246x\u0254\u01ddd\u0287\u1d09\u00f8n l\u1d09s\u0287 \u028d\u0265\u00f8 d\u00f8 n\u00f8\u0287 \u028e\u01dd\u0287 \u0265\u0250\u028c\u01dd \u0250 \u0254\u01dd\u0279\u0287\u1d09\u025f\u1d09\u0254\u0250\u0287\u01dd",
|
||||
"Generate the user's certificate": "\u01e4\u01ddn\u01dd\u0279\u0250\u0287\u01dd \u0287\u0265\u01dd ns\u01dd\u0279's \u0254\u01dd\u0279\u0287\u1d09\u025f\u1d09\u0254\u0250\u0287\u01dd",
|
||||
"Get Credit": "\u01e4\u01dd\u0287 \u023b\u0279\u01ddd\u1d09\u0287",
|
||||
@@ -1350,6 +1349,8 @@
|
||||
"The course must have an assigned start date.": "\u0166\u0265\u01dd \u0254\u00f8n\u0279s\u01dd \u026fns\u0287 \u0265\u0250\u028c\u01dd \u0250n \u0250ss\u1d09\u0183n\u01ddd s\u0287\u0250\u0279\u0287 d\u0250\u0287\u01dd.",
|
||||
"The course start date must be later than the enrollment start date.": "\u0166\u0265\u01dd \u0254\u00f8n\u0279s\u01dd s\u0287\u0250\u0279\u0287 d\u0250\u0287\u01dd \u026fns\u0287 b\u01dd l\u0250\u0287\u01dd\u0279 \u0287\u0265\u0250n \u0287\u0265\u01dd \u01ddn\u0279\u00f8ll\u026f\u01ddn\u0287 s\u0287\u0250\u0279\u0287 d\u0250\u0287\u01dd.",
|
||||
"The data could not be saved.": "\u0166\u0265\u01dd d\u0250\u0287\u0250 \u0254\u00f8nld n\u00f8\u0287 b\u01dd s\u0250\u028c\u01ddd.",
|
||||
"The description field must be limited to 1000 characters.": "\u0166\u0265\u01dd d\u01dds\u0254\u0279\u1d09d\u0287\u1d09\u00f8n \u025f\u1d09\u01ddld \u026fns\u0287 b\u01dd l\u1d09\u026f\u1d09\u0287\u01ddd \u0287\u00f8 1000 \u0254\u0265\u0250\u0279\u0250\u0254\u0287\u01dd\u0279s.",
|
||||
"The duration field must be limited to 50 characters.": "\u0166\u0265\u01dd dn\u0279\u0250\u0287\u1d09\u00f8n \u025f\u1d09\u01ddld \u026fns\u0287 b\u01dd l\u1d09\u026f\u1d09\u0287\u01ddd \u0287\u00f8 50 \u0254\u0265\u0250\u0279\u0250\u0254\u0287\u01dd\u0279s.",
|
||||
"The email address you use to sign in. Communications from {platform_name} and your courses are sent to this address.": "\u0166\u0265\u01dd \u01dd\u026f\u0250\u1d09l \u0250dd\u0279\u01ddss \u028e\u00f8n ns\u01dd \u0287\u00f8 s\u1d09\u0183n \u1d09n. \u023b\u00f8\u026f\u026fnn\u1d09\u0254\u0250\u0287\u1d09\u00f8ns \u025f\u0279\u00f8\u026f {platform_name} \u0250nd \u028e\u00f8n\u0279 \u0254\u00f8n\u0279s\u01dds \u0250\u0279\u01dd s\u01ddn\u0287 \u0287\u00f8 \u0287\u0265\u1d09s \u0250dd\u0279\u01ddss.",
|
||||
"The email address you've provided isn't formatted correctly.": "\u0166\u0265\u01dd \u01dd\u026f\u0250\u1d09l \u0250dd\u0279\u01ddss \u028e\u00f8n'\u028c\u01dd d\u0279\u00f8\u028c\u1d09d\u01ddd \u1d09sn'\u0287 \u025f\u00f8\u0279\u026f\u0250\u0287\u0287\u01ddd \u0254\u00f8\u0279\u0279\u01dd\u0254\u0287l\u028e.",
|
||||
"The enrollment end date cannot be after the course end date.": "\u0166\u0265\u01dd \u01ddn\u0279\u00f8ll\u026f\u01ddn\u0287 \u01ddnd d\u0250\u0287\u01dd \u0254\u0250nn\u00f8\u0287 b\u01dd \u0250\u025f\u0287\u01dd\u0279 \u0287\u0265\u01dd \u0254\u00f8n\u0279s\u01dd \u01ddnd d\u0250\u0287\u01dd.",
|
||||
@@ -1379,10 +1380,13 @@
|
||||
"The photo of your face matches the photo on your ID.": "\u0166\u0265\u01dd d\u0265\u00f8\u0287\u00f8 \u00f8\u025f \u028e\u00f8n\u0279 \u025f\u0250\u0254\u01dd \u026f\u0250\u0287\u0254\u0265\u01dds \u0287\u0265\u01dd d\u0265\u00f8\u0287\u00f8 \u00f8n \u028e\u00f8n\u0279 \u0197\u0110.",
|
||||
"The raw error message is:": "\u0166\u0265\u01dd \u0279\u0250\u028d \u01dd\u0279\u0279\u00f8\u0279 \u026f\u01ddss\u0250\u0183\u01dd \u1d09s:",
|
||||
"The selected content group does not exist": "\u0166\u0265\u01dd s\u01ddl\u01dd\u0254\u0287\u01ddd \u0254\u00f8n\u0287\u01ddn\u0287 \u0183\u0279\u00f8nd d\u00f8\u01dds n\u00f8\u0287 \u01ddx\u1d09s\u0287",
|
||||
"The short description field must be limited to 150 characters.": "\u0166\u0265\u01dd s\u0265\u00f8\u0279\u0287 d\u01dds\u0254\u0279\u1d09d\u0287\u1d09\u00f8n \u025f\u1d09\u01ddld \u026fns\u0287 b\u01dd l\u1d09\u026f\u1d09\u0287\u01ddd \u0287\u00f8 150 \u0254\u0265\u0250\u0279\u0250\u0254\u0287\u01dd\u0279s.",
|
||||
"The subtitle field must be limited to 150 characters.": "\u0166\u0265\u01dd snb\u0287\u1d09\u0287l\u01dd \u025f\u1d09\u01ddld \u026fns\u0287 b\u01dd l\u1d09\u026f\u1d09\u0287\u01ddd \u0287\u00f8 150 \u0254\u0265\u0250\u0279\u0250\u0254\u0287\u01dd\u0279s.",
|
||||
"The team \"%(team)s\" could not be found.": "\u0166\u0265\u01dd \u0287\u01dd\u0250\u026f \"%(team)s\" \u0254\u00f8nld n\u00f8\u0287 b\u01dd \u025f\u00f8nnd.",
|
||||
"The thread you selected has been deleted. Please select another thread.": "\u0166\u0265\u01dd \u0287\u0265\u0279\u01dd\u0250d \u028e\u00f8n s\u01ddl\u01dd\u0254\u0287\u01ddd \u0265\u0250s b\u01dd\u01ddn d\u01ddl\u01dd\u0287\u01ddd. \u2c63l\u01dd\u0250s\u01dd s\u01ddl\u01dd\u0254\u0287 \u0250n\u00f8\u0287\u0265\u01dd\u0279 \u0287\u0265\u0279\u01dd\u0250d.",
|
||||
"The timed transcript for the first video file does not appear to be the same as the timed transcript for the second video file.": "\u0166\u0265\u01dd \u0287\u1d09\u026f\u01ddd \u0287\u0279\u0250ns\u0254\u0279\u1d09d\u0287 \u025f\u00f8\u0279 \u0287\u0265\u01dd \u025f\u1d09\u0279s\u0287 \u028c\u1d09d\u01dd\u00f8 \u025f\u1d09l\u01dd d\u00f8\u01dds n\u00f8\u0287 \u0250dd\u01dd\u0250\u0279 \u0287\u00f8 b\u01dd \u0287\u0265\u01dd s\u0250\u026f\u01dd \u0250s \u0287\u0265\u01dd \u0287\u1d09\u026f\u01ddd \u0287\u0279\u0250ns\u0254\u0279\u1d09d\u0287 \u025f\u00f8\u0279 \u0287\u0265\u01dd s\u01dd\u0254\u00f8nd \u028c\u1d09d\u01dd\u00f8 \u025f\u1d09l\u01dd.",
|
||||
"The timed transcript for this video on edX is out of date, but YouTube has a current timed transcript for this video.": "\u0166\u0265\u01dd \u0287\u1d09\u026f\u01ddd \u0287\u0279\u0250ns\u0254\u0279\u1d09d\u0287 \u025f\u00f8\u0279 \u0287\u0265\u1d09s \u028c\u1d09d\u01dd\u00f8 \u00f8n \u01dddX \u1d09s \u00f8n\u0287 \u00f8\u025f d\u0250\u0287\u01dd, bn\u0287 \u024e\u00f8n\u0166nb\u01dd \u0265\u0250s \u0250 \u0254n\u0279\u0279\u01ddn\u0287 \u0287\u1d09\u026f\u01ddd \u0287\u0279\u0250ns\u0254\u0279\u1d09d\u0287 \u025f\u00f8\u0279 \u0287\u0265\u1d09s \u028c\u1d09d\u01dd\u00f8.",
|
||||
"The title field must be limited to 50 characters.": "\u0166\u0265\u01dd \u0287\u1d09\u0287l\u01dd \u025f\u1d09\u01ddld \u026fns\u0287 b\u01dd l\u1d09\u026f\u1d09\u0287\u01ddd \u0287\u00f8 50 \u0254\u0265\u0250\u0279\u0250\u0254\u0287\u01dd\u0279s.",
|
||||
"The topic \"%(topic)s\" could not be found.": "\u0166\u0265\u01dd \u0287\u00f8d\u1d09\u0254 \"%(topic)s\" \u0254\u00f8nld n\u00f8\u0287 b\u01dd \u025f\u00f8nnd.",
|
||||
"The weight of all assignments of this type as a percentage of the total grade, for example, 40. Do not include the percent symbol.": "\u0166\u0265\u01dd \u028d\u01dd\u1d09\u0183\u0265\u0287 \u00f8\u025f \u0250ll \u0250ss\u1d09\u0183n\u026f\u01ddn\u0287s \u00f8\u025f \u0287\u0265\u1d09s \u0287\u028ed\u01dd \u0250s \u0250 d\u01dd\u0279\u0254\u01ddn\u0287\u0250\u0183\u01dd \u00f8\u025f \u0287\u0265\u01dd \u0287\u00f8\u0287\u0250l \u0183\u0279\u0250d\u01dd, \u025f\u00f8\u0279 \u01ddx\u0250\u026fdl\u01dd, 40. \u0110\u00f8 n\u00f8\u0287 \u1d09n\u0254lnd\u01dd \u0287\u0265\u01dd d\u01dd\u0279\u0254\u01ddn\u0287 s\u028e\u026fb\u00f8l.",
|
||||
"The {cohortGroupName} cohort has been created. You can manually add students to this cohort below.": "\u0166\u0265\u01dd {cohortGroupName} \u0254\u00f8\u0265\u00f8\u0279\u0287 \u0265\u0250s b\u01dd\u01ddn \u0254\u0279\u01dd\u0250\u0287\u01ddd. \u024e\u00f8n \u0254\u0250n \u026f\u0250nn\u0250ll\u028e \u0250dd s\u0287nd\u01ddn\u0287s \u0287\u00f8 \u0287\u0265\u1d09s \u0254\u00f8\u0265\u00f8\u0279\u0287 b\u01ddl\u00f8\u028d.",
|
||||
@@ -1697,6 +1701,7 @@
|
||||
"You have already reported this annotation.": "\u024e\u00f8n \u0265\u0250\u028c\u01dd \u0250l\u0279\u01dd\u0250d\u028e \u0279\u01ddd\u00f8\u0279\u0287\u01ddd \u0287\u0265\u1d09s \u0250nn\u00f8\u0287\u0250\u0287\u1d09\u00f8n.",
|
||||
"You have already verified your ID!": "\u024e\u00f8n \u0265\u0250\u028c\u01dd \u0250l\u0279\u01dd\u0250d\u028e \u028c\u01dd\u0279\u1d09\u025f\u1d09\u01ddd \u028e\u00f8n\u0279 \u0197\u0110!",
|
||||
"You have been logged out of your edX account. ": "\u024e\u00f8n \u0265\u0250\u028c\u01dd b\u01dd\u01ddn l\u00f8\u0183\u0183\u01ddd \u00f8n\u0287 \u00f8\u025f \u028e\u00f8n\u0279 \u01dddX \u0250\u0254\u0254\u00f8nn\u0287. ",
|
||||
"You have earned certificates in %(completed_courses)s of the %(total_courses)s courses so far.": "\u024e\u00f8n \u0265\u0250\u028c\u01dd \u01dd\u0250\u0279n\u01ddd \u0254\u01dd\u0279\u0287\u1d09\u025f\u1d09\u0254\u0250\u0287\u01dds \u1d09n %(completed_courses)s \u00f8\u025f \u0287\u0265\u01dd %(total_courses)s \u0254\u00f8n\u0279s\u01dds s\u00f8 \u025f\u0250\u0279.",
|
||||
"You have no handouts defined": "\u024e\u00f8n \u0265\u0250\u028c\u01dd n\u00f8 \u0265\u0250nd\u00f8n\u0287s d\u01dd\u025f\u1d09n\u01ddd",
|
||||
"You have not bookmarked any courseware pages yet.": "\u024e\u00f8n \u0265\u0250\u028c\u01dd n\u00f8\u0287 b\u00f8\u00f8\u029e\u026f\u0250\u0279\u029e\u01ddd \u0250n\u028e \u0254\u00f8n\u0279s\u01dd\u028d\u0250\u0279\u01dd d\u0250\u0183\u01dds \u028e\u01dd\u0287.",
|
||||
"You have not created any certificates yet.": "\u024e\u00f8n \u0265\u0250\u028c\u01dd n\u00f8\u0287 \u0254\u0279\u01dd\u0250\u0287\u01ddd \u0250n\u028e \u0254\u01dd\u0279\u0287\u1d09\u025f\u1d09\u0254\u0250\u0287\u01dds \u028e\u01dd\u0287.",
|
||||
@@ -1822,7 +1827,7 @@
|
||||
"or": "\u00f8\u0279",
|
||||
"or create a new one here": "\u00f8\u0279 \u0254\u0279\u01dd\u0250\u0287\u01dd \u0250 n\u01dd\u028d \u00f8n\u01dd \u0265\u01dd\u0279\u01dd",
|
||||
"or sign in with": "\u00f8\u0279 s\u1d09\u0183n \u1d09n \u028d\u1d09\u0287\u0265",
|
||||
"org.display_name": "\u00f8\u0279\u0183.d\u1d09sdl\u0250\u028e_n\u0250\u026f\u01dd",
|
||||
"org.key": "\u00f8\u0279\u0183.\u029e\u01dd\u028e",
|
||||
"post anonymously": "d\u00f8s\u0287 \u0250n\u00f8n\u028e\u026f\u00f8nsl\u028e",
|
||||
"post anonymously to classmates": "d\u00f8s\u0287 \u0250n\u00f8n\u028e\u026f\u00f8nsl\u028e \u0287\u00f8 \u0254l\u0250ss\u026f\u0250\u0287\u01dds",
|
||||
"posted %(time_ago)s by %(author)s": "d\u00f8s\u0287\u01ddd %(time_ago)s b\u028e %(author)s",
|
||||
@@ -1853,6 +1858,7 @@
|
||||
"with %(section_or_subsection)s": "\u028d\u1d09\u0287\u0265 %(section_or_subsection)s",
|
||||
"{browse_span_start}Browse teams in other topics{span_end} or {search_span_start}search teams{span_end} in this topic. If you still can't find a team to join, {create_span_start}create a new team in this topic{span_end}.": "{browse_span_start}\u0243\u0279\u00f8\u028ds\u01dd \u0287\u01dd\u0250\u026fs \u1d09n \u00f8\u0287\u0265\u01dd\u0279 \u0287\u00f8d\u1d09\u0254s{span_end} \u00f8\u0279 {search_span_start}s\u01dd\u0250\u0279\u0254\u0265 \u0287\u01dd\u0250\u026fs{span_end} \u1d09n \u0287\u0265\u1d09s \u0287\u00f8d\u1d09\u0254. \u0197\u025f \u028e\u00f8n s\u0287\u1d09ll \u0254\u0250n'\u0287 \u025f\u1d09nd \u0250 \u0287\u01dd\u0250\u026f \u0287\u00f8 \u027e\u00f8\u1d09n, {create_span_start}\u0254\u0279\u01dd\u0250\u0287\u01dd \u0250 n\u01dd\u028d \u0287\u01dd\u0250\u026f \u1d09n \u0287\u0265\u1d09s \u0287\u00f8d\u1d09\u0254{span_end}.",
|
||||
"{email} is already on the {container} team. Recheck the email address if you want to add a new member.": "{email} \u1d09s \u0250l\u0279\u01dd\u0250d\u028e \u00f8n \u0287\u0265\u01dd {container} \u0287\u01dd\u0250\u026f. \u024c\u01dd\u0254\u0265\u01dd\u0254\u029e \u0287\u0265\u01dd \u01dd\u026f\u0250\u1d09l \u0250dd\u0279\u01ddss \u1d09\u025f \u028e\u00f8n \u028d\u0250n\u0287 \u0287\u00f8 \u0250dd \u0250 n\u01dd\u028d \u026f\u01dd\u026fb\u01dd\u0279.",
|
||||
"{hours}:{minutes} (current UTC time)": "{hours}:{minutes} (\u0254n\u0279\u0279\u01ddn\u0287 \u0244\u0166\u023b \u0287\u1d09\u026f\u01dd)",
|
||||
"{numMoved} student was removed from {oldCohort}": [
|
||||
"{numMoved} s\u0287nd\u01ddn\u0287 \u028d\u0250s \u0279\u01dd\u026f\u00f8\u028c\u01ddd \u025f\u0279\u00f8\u026f {oldCohort}",
|
||||
"{numMoved} s\u0287nd\u01ddn\u0287s \u028d\u01dd\u0279\u01dd \u0279\u01dd\u026f\u00f8\u028c\u01ddd \u025f\u0279\u00f8\u026f {oldCohort}"
|
||||
|
||||
@@ -41,7 +41,6 @@
|
||||
],
|
||||
"%(field)s can only contain up to %(count)d characters.": "%(field)s \u0630\u0634\u0631 \u062e\u0631\u0645\u063a \u0630\u062e\u0631\u0641\u0634\u0647\u0631 \u0639\u062d \u0641\u062e %(count)d \u0630\u0627\u0634\u0642\u0634\u0630\u0641\u062b\u0642\u0633.",
|
||||
"%(field)s must have at least %(count)d characters.": "%(field)s \u0648\u0639\u0633\u0641 \u0627\u0634\u062f\u062b \u0634\u0641 \u0645\u062b\u0634\u0633\u0641 %(count)d \u0630\u0627\u0634\u0642\u0634\u0630\u0641\u062b\u0642\u0633.",
|
||||
"%(hours)s:%(minutes)s (current UTC time)": "%(hours)s:%(minutes)s (\u0630\u0639\u0642\u0642\u062b\u0631\u0641 \u0639\u0641\u0630 \u0641\u0647\u0648\u062b)",
|
||||
"%(memberCount)s / %(maxMemberCount)s Member": [
|
||||
"%(memberCount)s / %(maxMemberCount)s \u0648\u062b\u0648\u0632\u062b\u0642",
|
||||
"%(memberCount)s / %(maxMemberCount)s \u0648\u062b\u0648\u0632\u062b\u0642\u0633"
|
||||
@@ -163,6 +162,7 @@
|
||||
"Active Uploads": "\u0634\u0630\u0641\u0647\u062f\u062b \u0639\u062d\u0645\u062e\u0634\u064a\u0633",
|
||||
"Add": "\u0634\u064a\u064a",
|
||||
"Add Additional Signatory": "\u0634\u064a\u064a \u0634\u064a\u064a\u0647\u0641\u0647\u062e\u0631\u0634\u0645 \u0633\u0647\u0644\u0631\u0634\u0641\u062e\u0642\u063a",
|
||||
"Add Allowance": "\u0634\u064a\u064a \u0634\u0645\u0645\u062e\u0635\u0634\u0631\u0630\u062b",
|
||||
"Add Cohort": "\u0634\u064a\u064a \u0630\u062e\u0627\u062e\u0642\u0641",
|
||||
"Add Component:": "\u0634\u064a\u064a \u0630\u062e\u0648\u062d\u062e\u0631\u062b\u0631\u0641:",
|
||||
"Add Country": "\u0634\u064a\u064a \u0630\u062e\u0639\u0631\u0641\u0642\u063a",
|
||||
@@ -171,6 +171,7 @@
|
||||
"Add Students": "\u0634\u064a\u064a \u0633\u0641\u0639\u064a\u062b\u0631\u0641\u0633",
|
||||
"Add URLs for additional versions": "\u0634\u064a\u064a \u0639\u0642\u0645\u0633 \u0628\u062e\u0642 \u0634\u064a\u064a\u0647\u0641\u0647\u062e\u0631\u0634\u0645 \u062f\u062b\u0642\u0633\u0647\u062e\u0631\u0633",
|
||||
"Add a Chapter": "\u0634\u064a\u064a \u0634 \u0630\u0627\u0634\u062d\u0641\u062b\u0642",
|
||||
"Add a New Allowance": "\u0634\u064a\u064a \u0634 \u0631\u062b\u0635 \u0634\u0645\u0645\u062e\u0635\u0634\u0631\u0630\u062b",
|
||||
"Add a New Cohort": "\u0634\u064a\u064a \u0634 \u0631\u062b\u0635 \u0630\u062e\u0627\u062e\u0642\u0641",
|
||||
"Add a Response": "\u0634\u064a\u064a \u0634 \u0642\u062b\u0633\u062d\u062e\u0631\u0633\u062b",
|
||||
"Add a clear and descriptive title to encourage participation.": "\u0634\u064a\u064a \u0634 \u0630\u0645\u062b\u0634\u0642 \u0634\u0631\u064a \u064a\u062b\u0633\u0630\u0642\u0647\u062d\u0641\u0647\u062f\u062b \u0641\u0647\u0641\u0645\u062b \u0641\u062e \u062b\u0631\u0630\u062e\u0639\u0642\u0634\u0644\u062b \u062d\u0634\u0642\u0641\u0647\u0630\u0647\u062d\u0634\u0641\u0647\u062e\u0631.",
|
||||
@@ -189,6 +190,7 @@
|
||||
"Adding": "\u0634\u064a\u064a\u0647\u0631\u0644",
|
||||
"Adding the selected course to your cart": "\u0634\u064a\u064a\u0647\u0631\u0644 \u0641\u0627\u062b \u0633\u062b\u0645\u062b\u0630\u0641\u062b\u064a \u0630\u062e\u0639\u0642\u0633\u062b \u0641\u062e \u063a\u062e\u0639\u0642 \u0630\u0634\u0642\u0641",
|
||||
"Additional Information (optional)": "\u0634\u064a\u064a\u0647\u0641\u0647\u062e\u0631\u0634\u0645 \u0647\u0631\u0628\u062e\u0642\u0648\u0634\u0641\u0647\u062e\u0631 (\u062e\u062d\u0641\u0647\u062e\u0631\u0634\u0645)",
|
||||
"Additional Time (minutes)": "\u0634\u064a\u064a\u0647\u0641\u0647\u062e\u0631\u0634\u0645 \u0641\u0647\u0648\u062b (\u0648\u0647\u0631\u0639\u0641\u062b\u0633)",
|
||||
"Admin": "\u0634\u064a\u0648\u0647\u0631",
|
||||
"Advanced": "\u0634\u064a\u062f\u0634\u0631\u0630\u062b\u064a",
|
||||
"Align center": "\u0634\u0645\u0647\u0644\u0631 \u0630\u062b\u0631\u0641\u062b\u0642",
|
||||
@@ -214,6 +216,9 @@
|
||||
"Allow others to copy, distribute, display and perform your work - and derivative works based upon it - but for noncommercial purposes only.": "\u0634\u0645\u0645\u062e\u0635 \u062e\u0641\u0627\u062b\u0642\u0633 \u0641\u062e \u0630\u062e\u062d\u063a, \u064a\u0647\u0633\u0641\u0642\u0647\u0632\u0639\u0641\u062b, \u064a\u0647\u0633\u062d\u0645\u0634\u063a \u0634\u0631\u064a \u062d\u062b\u0642\u0628\u062e\u0642\u0648 \u063a\u062e\u0639\u0642 \u0635\u062e\u0642\u0646 - \u0634\u0631\u064a \u064a\u062b\u0642\u0647\u062f\u0634\u0641\u0647\u062f\u062b \u0635\u062e\u0642\u0646\u0633 \u0632\u0634\u0633\u062b\u064a \u0639\u062d\u062e\u0631 \u0647\u0641 - \u0632\u0639\u0641 \u0628\u062e\u0642 \u0631\u062e\u0631\u0630\u062e\u0648\u0648\u062b\u0642\u0630\u0647\u0634\u0645 \u062d\u0639\u0642\u062d\u062e\u0633\u062b\u0633 \u062e\u0631\u0645\u063a.",
|
||||
"Allow others to distribute derivative works only under a license identical to the license that governs your work. This option is incompatible with \"No Derivatives\".": "\u0634\u0645\u0645\u062e\u0635 \u062e\u0641\u0627\u062b\u0642\u0633 \u0641\u062e \u064a\u0647\u0633\u0641\u0642\u0647\u0632\u0639\u0641\u062b \u064a\u062b\u0642\u0647\u062f\u0634\u0641\u0647\u062f\u062b \u0635\u062e\u0642\u0646\u0633 \u062e\u0631\u0645\u063a \u0639\u0631\u064a\u062b\u0642 \u0634 \u0645\u0647\u0630\u062b\u0631\u0633\u062b \u0647\u064a\u062b\u0631\u0641\u0647\u0630\u0634\u0645 \u0641\u062e \u0641\u0627\u062b \u0645\u0647\u0630\u062b\u0631\u0633\u062b \u0641\u0627\u0634\u0641 \u0644\u062e\u062f\u062b\u0642\u0631\u0633 \u063a\u062e\u0639\u0642 \u0635\u062e\u0642\u0646. \u0641\u0627\u0647\u0633 \u062e\u062d\u0641\u0647\u062e\u0631 \u0647\u0633 \u0647\u0631\u0630\u062e\u0648\u062d\u0634\u0641\u0647\u0632\u0645\u062b \u0635\u0647\u0641\u0627 \"\u0631\u062e \u064a\u062b\u0642\u0647\u062f\u0634\u0641\u0647\u062f\u062b\u0633\".",
|
||||
"Allow students to generate certificates for this course?": "\u0634\u0645\u0645\u062e\u0635 \u0633\u0641\u0639\u064a\u062b\u0631\u0641\u0633 \u0641\u062e \u0644\u062b\u0631\u062b\u0642\u0634\u0641\u062b \u0630\u062b\u0642\u0641\u0647\u0628\u0647\u0630\u0634\u0641\u062b\u0633 \u0628\u062e\u0642 \u0641\u0627\u0647\u0633 \u0630\u062e\u0639\u0642\u0633\u062b?",
|
||||
"Allowance Type": "\u0634\u0645\u0645\u062e\u0635\u0634\u0631\u0630\u062b \u0641\u063a\u062d\u062b",
|
||||
"Allowance Value": "\u0634\u0645\u0645\u062e\u0635\u0634\u0631\u0630\u062b \u062f\u0634\u0645\u0639\u062b",
|
||||
"Allowances": "\u0634\u0645\u0645\u062e\u0635\u0634\u0631\u0630\u062b\u0633",
|
||||
"Already a course team member": "\u0634\u0645\u0642\u062b\u0634\u064a\u063a \u0634 \u0630\u062e\u0639\u0642\u0633\u062b \u0641\u062b\u0634\u0648 \u0648\u062b\u0648\u0632\u062b\u0642",
|
||||
"Already a library team member": "\u0634\u0645\u0642\u062b\u0634\u064a\u063a \u0634 \u0645\u0647\u0632\u0642\u0634\u0642\u063a \u0641\u062b\u0634\u0648 \u0648\u062b\u0648\u0632\u062b\u0642",
|
||||
"Already a member": "\u0634\u0645\u0642\u062b\u0634\u064a\u063a \u0634 \u0648\u062b\u0648\u0632\u062b\u0642",
|
||||
@@ -398,6 +403,7 @@
|
||||
"Commentary": "\u0630\u062e\u0648\u0648\u062b\u0631\u0641\u0634\u0642\u063a",
|
||||
"Common Problem Types": "\u0630\u062e\u0648\u0648\u062e\u0631 \u062d\u0642\u062e\u0632\u0645\u062b\u0648 \u0641\u063a\u062d\u062b\u0633",
|
||||
"Community TA": "\u0630\u062e\u0648\u0648\u0639\u0631\u0647\u0641\u063a \u0641\u0634",
|
||||
"Completed At": "\u0630\u062e\u0648\u062d\u0645\u062b\u0641\u062b\u064a \u0634\u0641",
|
||||
"Component": "\u0630\u062e\u0648\u062d\u062e\u0631\u062b\u0631\u0641",
|
||||
"Configure": "\u0630\u062e\u0631\u0628\u0647\u0644\u0639\u0642\u062b",
|
||||
"Confirm": "\u0630\u062e\u0631\u0628\u0647\u0642\u0648",
|
||||
@@ -640,6 +646,8 @@
|
||||
"Error: User '<%= username %>' has not yet activated their account. Users must create and activate their accounts before they can be assigned a role.": "\u062b\u0642\u0642\u062e\u0642: \u0639\u0633\u062b\u0642 '<%= username %>' \u0627\u0634\u0633 \u0631\u062e\u0641 \u063a\u062b\u0641 \u0634\u0630\u0641\u0647\u062f\u0634\u0641\u062b\u064a \u0641\u0627\u062b\u0647\u0642 \u0634\u0630\u0630\u062e\u0639\u0631\u0641. \u0639\u0633\u062b\u0642\u0633 \u0648\u0639\u0633\u0641 \u0630\u0642\u062b\u0634\u0641\u062b \u0634\u0631\u064a \u0634\u0630\u0641\u0647\u062f\u0634\u0641\u062b \u0641\u0627\u062b\u0647\u0642 \u0634\u0630\u0630\u062e\u0639\u0631\u0641\u0633 \u0632\u062b\u0628\u062e\u0642\u062b \u0641\u0627\u062b\u063a \u0630\u0634\u0631 \u0632\u062b \u0634\u0633\u0633\u0647\u0644\u0631\u062b\u064a \u0634 \u0642\u062e\u0645\u062b.",
|
||||
"Error: You cannot remove yourself from the Instructor group!": "\u062b\u0642\u0642\u062e\u0642: \u063a\u062e\u0639 \u0630\u0634\u0631\u0631\u062e\u0641 \u0642\u062b\u0648\u062e\u062f\u062b \u063a\u062e\u0639\u0642\u0633\u062b\u0645\u0628 \u0628\u0642\u062e\u0648 \u0641\u0627\u062b \u0647\u0631\u0633\u0641\u0642\u0639\u0630\u0641\u062e\u0642 \u0644\u0642\u062e\u0639\u062d!",
|
||||
"Errors": "\u062b\u0642\u0642\u062e\u0642\u0633",
|
||||
"Exam Name": "\u062b\u0637\u0634\u0648 \u0631\u0634\u0648\u062b",
|
||||
"Exam Type": "\u062b\u0637\u0634\u0648 \u0641\u063a\u062d\u062b",
|
||||
"Exception Granted": "\u062b\u0637\u0630\u062b\u062d\u0641\u0647\u062e\u0631 \u0644\u0642\u0634\u0631\u0641\u062b\u064a",
|
||||
"Exit full browser": "\u062b\u0637\u0647\u0641 \u0628\u0639\u0645\u0645 \u0632\u0642\u062e\u0635\u0633\u062b\u0642",
|
||||
"Expand All": "\u062b\u0637\u062d\u0634\u0631\u064a \u0634\u0645\u0645",
|
||||
@@ -649,6 +657,7 @@
|
||||
"Explanation": "\u062b\u0637\u062d\u0645\u0634\u0631\u0634\u0641\u0647\u062e\u0631",
|
||||
"Explicitly Hiding from Students": "\u062b\u0637\u062d\u0645\u0647\u0630\u0647\u0641\u0645\u063a \u0627\u0647\u064a\u0647\u0631\u0644 \u0628\u0642\u062e\u0648 \u0633\u0641\u0639\u064a\u062b\u0631\u0641\u0633",
|
||||
"Explore New XSeries": "\u062b\u0637\u062d\u0645\u062e\u0642\u062b \u0631\u062b\u0635 \u0637\u0633\u062b\u0642\u0647\u062b\u0633",
|
||||
"Explore XSeries Programs": "\u062b\u0637\u062d\u0645\u062e\u0642\u062b \u0637\u0633\u062b\u0642\u0647\u062b\u0633 \u062d\u0642\u062e\u0644\u0642\u0634\u0648\u0633",
|
||||
"Explore your course!": "\u062b\u0637\u062d\u0645\u062e\u0642\u062b \u063a\u062e\u0639\u0642 \u0630\u062e\u0639\u0642\u0633\u062b!",
|
||||
"Failed to delete student state.": "\u0628\u0634\u0647\u0645\u062b\u064a \u0641\u062e \u064a\u062b\u0645\u062b\u0641\u062b \u0633\u0641\u0639\u064a\u062b\u0631\u0641 \u0633\u0641\u0634\u0641\u062b.",
|
||||
"Failed to rescore problem.": "\u0628\u0634\u0647\u0645\u062b\u064a \u0641\u062e \u0642\u062b\u0633\u0630\u062e\u0642\u062b \u062d\u0642\u062e\u0632\u0645\u062b\u0648.",
|
||||
@@ -678,6 +687,7 @@
|
||||
"Font Family": "\u0628\u062e\u0631\u0641 \u0628\u0634\u0648\u0647\u0645\u063a",
|
||||
"Font Sizes": "\u0628\u062e\u0631\u0641 \u0633\u0647\u0638\u062b\u0633",
|
||||
"Footer": "\u0628\u062e\u062e\u0641\u062b\u0642",
|
||||
"For grading to work, you must change all {oldName} subsections to {newName}.": "\u0628\u062e\u0642 \u0644\u0642\u0634\u064a\u0647\u0631\u0644 \u0641\u062e \u0635\u062e\u0642\u0646, \u063a\u062e\u0639 \u0648\u0639\u0633\u0641 \u0630\u0627\u0634\u0631\u0644\u062b \u0634\u0645\u0645 {oldName} \u0633\u0639\u0632\u0633\u062b\u0630\u0641\u0647\u062e\u0631\u0633 \u0641\u062e {newName}.",
|
||||
"Forgot password?": "\u0628\u062e\u0642\u0644\u062e\u0641 \u062d\u0634\u0633\u0633\u0635\u062e\u0642\u064a?",
|
||||
"Format": "\u0628\u062e\u0642\u0648\u0634\u0641",
|
||||
"Formats": "\u0628\u062e\u0642\u0648\u0634\u0641\u0633",
|
||||
@@ -690,7 +700,7 @@
|
||||
"Generate": "\u0644\u062b\u0631\u062b\u0642\u0634\u0641\u062b",
|
||||
"Generate Exception Certificates": "\u0644\u062b\u0631\u062b\u0642\u0634\u0641\u062b \u062b\u0637\u0630\u062b\u062d\u0641\u0647\u062e\u0631 \u0630\u062b\u0642\u0641\u0647\u0628\u0647\u0630\u0634\u0641\u062b\u0633",
|
||||
"Generate a Certificate for all users on the Exception list": "\u0644\u062b\u0631\u062b\u0642\u0634\u0641\u062b \u0634 \u0630\u062b\u0642\u0641\u0647\u0628\u0647\u0630\u0634\u0641\u062b \u0628\u062e\u0642 \u0634\u0645\u0645 \u0639\u0633\u062b\u0642\u0633 \u062e\u0631 \u0641\u0627\u062b \u062b\u0637\u0630\u062b\u062d\u0641\u0647\u062e\u0631 \u0645\u0647\u0633\u0641",
|
||||
"Generate certificates for all users on the Exception list for whom certificates have not yet been run": "\u0644\u062b\u0631\u062b\u0642\u0634\u0641\u062b \u0630\u062b\u0642\u0641\u0647\u0628\u0647\u0630\u0634\u0641\u062b\u0633 \u0628\u062e\u0642 \u0634\u0645\u0645 \u0639\u0633\u062b\u0642\u0633 \u062e\u0631 \u0641\u0627\u062b \u062b\u0637\u0630\u062b\u062d\u0641\u0647\u062e\u0631 \u0645\u0647\u0633\u0641 \u0628\u062e\u0642 \u0635\u0627\u062e\u0648 \u0630\u062b\u0642\u0641\u0647\u0628\u0647\u0630\u0634\u0641\u062b\u0633 \u0627\u0634\u062f\u062b \u0631\u062e\u0641 \u063a\u062b\u0641 \u0632\u062b\u062b\u0631 \u0642\u0639\u0631",
|
||||
"Generate certificates for all users on the Exception list who do not yet have a certificate": "\u0644\u062b\u0631\u062b\u0642\u0634\u0641\u062b \u0630\u062b\u0642\u0641\u0647\u0628\u0647\u0630\u0634\u0641\u062b\u0633 \u0628\u062e\u0642 \u0634\u0645\u0645 \u0639\u0633\u062b\u0642\u0633 \u062e\u0631 \u0641\u0627\u062b \u062b\u0637\u0630\u062b\u062d\u0641\u0647\u062e\u0631 \u0645\u0647\u0633\u0641 \u0635\u0627\u062e \u064a\u062e \u0631\u062e\u0641 \u063a\u062b\u0641 \u0627\u0634\u062f\u062b \u0634 \u0630\u062b\u0642\u0641\u0647\u0628\u0647\u0630\u0634\u0641\u062b",
|
||||
"Generate the user's certificate": "\u0644\u062b\u0631\u062b\u0642\u0634\u0641\u062b \u0641\u0627\u062b \u0639\u0633\u062b\u0642'\u0633 \u0630\u062b\u0642\u0641\u0647\u0628\u0647\u0630\u0634\u0641\u062b",
|
||||
"Get Credit": "\u0644\u062b\u0641 \u0630\u0642\u062b\u064a\u0647\u0641",
|
||||
"Go to Dashboard": "\u0644\u062e \u0641\u062e \u064a\u0634\u0633\u0627\u0632\u062e\u0634\u0642\u064a",
|
||||
@@ -1227,6 +1237,7 @@
|
||||
"Sorted by": "\u0633\u062e\u0642\u0641\u062b\u064a \u0632\u063a",
|
||||
"Source": "\u0633\u062e\u0639\u0642\u0630\u062b",
|
||||
"Source code": "\u0633\u062e\u0639\u0642\u0630\u062b \u0630\u062e\u064a\u062b",
|
||||
"Special Exam": "\u0633\u062d\u062b\u0630\u0647\u0634\u0645 \u062b\u0637\u0634\u0648",
|
||||
"Special character": "\u0633\u062d\u062b\u0630\u0647\u0634\u0645 \u0630\u0627\u0634\u0642\u0634\u0630\u0641\u062b\u0642",
|
||||
"Specify an alternative to the official course title to display on certificates. Leave blank to use the official course title.": "\u0633\u062d\u062b\u0630\u0647\u0628\u063a \u0634\u0631 \u0634\u0645\u0641\u062b\u0642\u0631\u0634\u0641\u0647\u062f\u062b \u0641\u062e \u0641\u0627\u062b \u062e\u0628\u0628\u0647\u0630\u0647\u0634\u0645 \u0630\u062e\u0639\u0642\u0633\u062b \u0641\u0647\u0641\u0645\u062b \u0641\u062e \u064a\u0647\u0633\u062d\u0645\u0634\u063a \u062e\u0631 \u0630\u062b\u0642\u0641\u0647\u0628\u0647\u0630\u0634\u0641\u062b\u0633. \u0645\u062b\u0634\u062f\u062b \u0632\u0645\u0634\u0631\u0646 \u0641\u062e \u0639\u0633\u062b \u0641\u0627\u062b \u062e\u0628\u0628\u0647\u0630\u0647\u0634\u0645 \u0630\u062e\u0639\u0642\u0633\u062b \u0641\u0647\u0641\u0645\u062b.",
|
||||
"Specify any additional rules or rule exceptions that the proctoring review team should enforce when reviewing the videos. For example, you could specify that calculators are allowed.": "\u0633\u062d\u062b\u0630\u0647\u0628\u063a \u0634\u0631\u063a \u0634\u064a\u064a\u0647\u0641\u0647\u062e\u0631\u0634\u0645 \u0642\u0639\u0645\u062b\u0633 \u062e\u0642 \u0642\u0639\u0645\u062b \u062b\u0637\u0630\u062b\u062d\u0641\u0647\u062e\u0631\u0633 \u0641\u0627\u0634\u0641 \u0641\u0627\u062b \u062d\u0642\u062e\u0630\u0641\u062e\u0642\u0647\u0631\u0644 \u0642\u062b\u062f\u0647\u062b\u0635 \u0641\u062b\u0634\u0648 \u0633\u0627\u062e\u0639\u0645\u064a \u062b\u0631\u0628\u062e\u0642\u0630\u062b \u0635\u0627\u062b\u0631 \u0642\u062b\u062f\u0647\u062b\u0635\u0647\u0631\u0644 \u0641\u0627\u062b \u062f\u0647\u064a\u062b\u062e\u0633. \u0628\u062e\u0642 \u062b\u0637\u0634\u0648\u062d\u0645\u062b, \u063a\u062e\u0639 \u0630\u062e\u0639\u0645\u064a \u0633\u062d\u062b\u0630\u0647\u0628\u063a \u0641\u0627\u0634\u0641 \u0630\u0634\u0645\u0630\u0639\u0645\u0634\u0641\u062e\u0642\u0633 \u0634\u0642\u062b \u0634\u0645\u0645\u062e\u0635\u062b\u064a.",
|
||||
@@ -1247,6 +1258,7 @@
|
||||
"Start regenerating certificates for students in this course?": "\u0633\u0641\u0634\u0642\u0641 \u0642\u062b\u0644\u062b\u0631\u062b\u0642\u0634\u0641\u0647\u0631\u0644 \u0630\u062b\u0642\u0641\u0647\u0628\u0647\u0630\u0634\u0641\u062b\u0633 \u0628\u062e\u0642 \u0633\u0641\u0639\u064a\u062b\u0631\u0641\u0633 \u0647\u0631 \u0641\u0627\u0647\u0633 \u0630\u062e\u0639\u0642\u0633\u062b?",
|
||||
"Start search": "\u0633\u0641\u0634\u0642\u0641 \u0633\u062b\u0634\u0642\u0630\u0627",
|
||||
"Start working toward your next learning goal.": "\u0633\u0641\u0634\u0642\u0641 \u0635\u062e\u0642\u0646\u0647\u0631\u0644 \u0641\u062e\u0635\u0634\u0642\u064a \u063a\u062e\u0639\u0642 \u0631\u062b\u0637\u0641 \u0645\u062b\u0634\u0642\u0631\u0647\u0631\u0644 \u0644\u062e\u0634\u0645.",
|
||||
"Started At": "\u0633\u0641\u0634\u0642\u0641\u062b\u064a \u0634\u0641",
|
||||
"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.": "\u0633\u0641\u0634\u0642\u0641\u062b\u064a \u062b\u0631\u0641\u0642\u0634\u0631\u0630\u062b \u062b\u0637\u0634\u0648 \u0642\u062b\u0633\u0630\u062e\u0642\u062b \u0641\u0634\u0633\u0646 \u0628\u062e\u0642 \u0633\u0641\u0639\u064a\u062b\u0631\u0641 '{student_id}'. \u0630\u0645\u0647\u0630\u0646 \u0641\u0627\u062b '\u0633\u0627\u062e\u0635 \u0632\u0634\u0630\u0646\u0644\u0642\u062e\u0639\u0631\u064a \u0641\u0634\u0633\u0646 \u0627\u0647\u0633\u0641\u062e\u0642\u063a \u0628\u062e\u0642 \u0633\u0641\u0639\u064a\u062b\u0631\u0641' \u0632\u0639\u0641\u0641\u062e\u0631 \u0641\u062e \u0633\u062b\u062b \u0641\u0627\u062b \u0633\u0641\u0634\u0641\u0639\u0633 \u062e\u0628 \u0641\u0627\u062b \u0641\u0634\u0633\u0646.",
|
||||
"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.": "\u0633\u0641\u0634\u0642\u0641\u062b\u064a \u0642\u062b\u0633\u0630\u062e\u0642\u062b \u062d\u0642\u062e\u0632\u0645\u062b\u0648 \u0641\u0634\u0633\u0646 \u0628\u062e\u0642 \u062d\u0642\u062e\u0632\u0645\u062b\u0648 '<%= problem_id %>' \u0634\u0631\u064a \u0633\u0641\u0639\u064a\u062b\u0631\u0641 '<%= student_id %>'. \u0630\u0645\u0647\u0630\u0646 \u0641\u0627\u062b '\u0633\u0627\u062e\u0635 \u0632\u0634\u0630\u0646\u0644\u0642\u062e\u0639\u0631\u064a \u0641\u0634\u0633\u0646 \u0627\u0647\u0633\u0641\u062e\u0642\u063a \u0628\u062e\u0642 \u0633\u0641\u0639\u064a\u062b\u0631\u0641' \u0632\u0639\u0641\u0641\u062e\u0631 \u0641\u062e \u0633\u062b\u062b \u0641\u0627\u062b \u0633\u0641\u0634\u0641\u0639\u0633 \u062e\u0628 \u0641\u0627\u062b \u0641\u0634\u0633\u0646.",
|
||||
"Starts": "\u0633\u0641\u0634\u0642\u0641\u0633",
|
||||
@@ -1337,6 +1349,8 @@
|
||||
"The course must have an assigned start date.": "\u0641\u0627\u062b \u0630\u062e\u0639\u0642\u0633\u062b \u0648\u0639\u0633\u0641 \u0627\u0634\u062f\u062b \u0634\u0631 \u0634\u0633\u0633\u0647\u0644\u0631\u062b\u064a \u0633\u0641\u0634\u0642\u0641 \u064a\u0634\u0641\u062b.",
|
||||
"The course start date must be later than the enrollment start date.": "\u0641\u0627\u062b \u0630\u062e\u0639\u0642\u0633\u062b \u0633\u0641\u0634\u0642\u0641 \u064a\u0634\u0641\u062b \u0648\u0639\u0633\u0641 \u0632\u062b \u0645\u0634\u0641\u062b\u0642 \u0641\u0627\u0634\u0631 \u0641\u0627\u062b \u062b\u0631\u0642\u062e\u0645\u0645\u0648\u062b\u0631\u0641 \u0633\u0641\u0634\u0642\u0641 \u064a\u0634\u0641\u062b.",
|
||||
"The data could not be saved.": "\u0641\u0627\u062b \u064a\u0634\u0641\u0634 \u0630\u062e\u0639\u0645\u064a \u0631\u062e\u0641 \u0632\u062b \u0633\u0634\u062f\u062b\u064a.",
|
||||
"The description field must be limited to 1000 characters.": "\u0641\u0627\u062b \u064a\u062b\u0633\u0630\u0642\u0647\u062d\u0641\u0647\u062e\u0631 \u0628\u0647\u062b\u0645\u064a \u0648\u0639\u0633\u0641 \u0632\u062b \u0645\u0647\u0648\u0647\u0641\u062b\u064a \u0641\u062e 1000 \u0630\u0627\u0634\u0642\u0634\u0630\u0641\u062b\u0642\u0633.",
|
||||
"The duration field must be limited to 50 characters.": "\u0641\u0627\u062b \u064a\u0639\u0642\u0634\u0641\u0647\u062e\u0631 \u0628\u0647\u062b\u0645\u064a \u0648\u0639\u0633\u0641 \u0632\u062b \u0645\u0647\u0648\u0647\u0641\u062b\u064a \u0641\u062e 50 \u0630\u0627\u0634\u0642\u0634\u0630\u0641\u062b\u0642\u0633.",
|
||||
"The email address you use to sign in. Communications from {platform_name} and your courses are sent to this address.": "\u0641\u0627\u062b \u062b\u0648\u0634\u0647\u0645 \u0634\u064a\u064a\u0642\u062b\u0633\u0633 \u063a\u062e\u0639 \u0639\u0633\u062b \u0641\u062e \u0633\u0647\u0644\u0631 \u0647\u0631. \u0630\u062e\u0648\u0648\u0639\u0631\u0647\u0630\u0634\u0641\u0647\u062e\u0631\u0633 \u0628\u0642\u062e\u0648 {platform_name} \u0634\u0631\u064a \u063a\u062e\u0639\u0642 \u0630\u062e\u0639\u0642\u0633\u062b\u0633 \u0634\u0642\u062b \u0633\u062b\u0631\u0641 \u0641\u062e \u0641\u0627\u0647\u0633 \u0634\u064a\u064a\u0642\u062b\u0633\u0633.",
|
||||
"The email address you've provided isn't formatted correctly.": "\u0641\u0627\u062b \u062b\u0648\u0634\u0647\u0645 \u0634\u064a\u064a\u0642\u062b\u0633\u0633 \u063a\u062e\u0639'\u062f\u062b \u062d\u0642\u062e\u062f\u0647\u064a\u062b\u064a \u0647\u0633\u0631'\u0641 \u0628\u062e\u0642\u0648\u0634\u0641\u0641\u062b\u064a \u0630\u062e\u0642\u0642\u062b\u0630\u0641\u0645\u063a.",
|
||||
"The enrollment end date cannot be after the course end date.": "\u0641\u0627\u062b \u062b\u0631\u0642\u062e\u0645\u0645\u0648\u062b\u0631\u0641 \u062b\u0631\u064a \u064a\u0634\u0641\u062b \u0630\u0634\u0631\u0631\u062e\u0641 \u0632\u062b \u0634\u0628\u0641\u062b\u0642 \u0641\u0627\u062b \u0630\u062e\u0639\u0642\u0633\u062b \u062b\u0631\u064a \u064a\u0634\u0641\u062b.",
|
||||
@@ -1366,10 +1380,13 @@
|
||||
"The photo of your face matches the photo on your ID.": "\u0641\u0627\u062b \u062d\u0627\u062e\u0641\u062e \u062e\u0628 \u063a\u062e\u0639\u0642 \u0628\u0634\u0630\u062b \u0648\u0634\u0641\u0630\u0627\u062b\u0633 \u0641\u0627\u062b \u062d\u0627\u062e\u0641\u062e \u062e\u0631 \u063a\u062e\u0639\u0642 \u0647\u064a.",
|
||||
"The raw error message is:": "\u0641\u0627\u062b \u0642\u0634\u0635 \u062b\u0642\u0642\u062e\u0642 \u0648\u062b\u0633\u0633\u0634\u0644\u062b \u0647\u0633:",
|
||||
"The selected content group does not exist": "\u0641\u0627\u062b \u0633\u062b\u0645\u062b\u0630\u0641\u062b\u064a \u0630\u062e\u0631\u0641\u062b\u0631\u0641 \u0644\u0642\u062e\u0639\u062d \u064a\u062e\u062b\u0633 \u0631\u062e\u0641 \u062b\u0637\u0647\u0633\u0641",
|
||||
"The short description field must be limited to 150 characters.": "\u0641\u0627\u062b \u0633\u0627\u062e\u0642\u0641 \u064a\u062b\u0633\u0630\u0642\u0647\u062d\u0641\u0647\u062e\u0631 \u0628\u0647\u062b\u0645\u064a \u0648\u0639\u0633\u0641 \u0632\u062b \u0645\u0647\u0648\u0647\u0641\u062b\u064a \u0641\u062e 150 \u0630\u0627\u0634\u0642\u0634\u0630\u0641\u062b\u0642\u0633.",
|
||||
"The subtitle field must be limited to 150 characters.": "\u0641\u0627\u062b \u0633\u0639\u0632\u0641\u0647\u0641\u0645\u062b \u0628\u0647\u062b\u0645\u064a \u0648\u0639\u0633\u0641 \u0632\u062b \u0645\u0647\u0648\u0647\u0641\u062b\u064a \u0641\u062e 150 \u0630\u0627\u0634\u0642\u0634\u0630\u0641\u062b\u0642\u0633.",
|
||||
"The team \"%(team)s\" could not be found.": "\u0641\u0627\u062b \u0641\u062b\u0634\u0648 \"%(team)s\" \u0630\u062e\u0639\u0645\u064a \u0631\u062e\u0641 \u0632\u062b \u0628\u062e\u0639\u0631\u064a.",
|
||||
"The thread you selected has been deleted. Please select another thread.": "\u0641\u0627\u062b \u0641\u0627\u0642\u062b\u0634\u064a \u063a\u062e\u0639 \u0633\u062b\u0645\u062b\u0630\u0641\u062b\u064a \u0627\u0634\u0633 \u0632\u062b\u062b\u0631 \u064a\u062b\u0645\u062b\u0641\u062b\u064a. \u062d\u0645\u062b\u0634\u0633\u062b \u0633\u062b\u0645\u062b\u0630\u0641 \u0634\u0631\u062e\u0641\u0627\u062b\u0642 \u0641\u0627\u0642\u062b\u0634\u064a.",
|
||||
"The timed transcript for the first video file does not appear to be the same as the timed transcript for the second video file.": "\u0641\u0627\u062b \u0641\u0647\u0648\u062b\u064a \u0641\u0642\u0634\u0631\u0633\u0630\u0642\u0647\u062d\u0641 \u0628\u062e\u0642 \u0641\u0627\u062b \u0628\u0647\u0642\u0633\u0641 \u062f\u0647\u064a\u062b\u062e \u0628\u0647\u0645\u062b \u064a\u062e\u062b\u0633 \u0631\u062e\u0641 \u0634\u062d\u062d\u062b\u0634\u0642 \u0641\u062e \u0632\u062b \u0641\u0627\u062b \u0633\u0634\u0648\u062b \u0634\u0633 \u0641\u0627\u062b \u0641\u0647\u0648\u062b\u064a \u0641\u0642\u0634\u0631\u0633\u0630\u0642\u0647\u062d\u0641 \u0628\u062e\u0642 \u0641\u0627\u062b \u0633\u062b\u0630\u062e\u0631\u064a \u062f\u0647\u064a\u062b\u062e \u0628\u0647\u0645\u062b.",
|
||||
"The timed transcript for this video on edX is out of date, but YouTube has a current timed transcript for this video.": "\u0641\u0627\u062b \u0641\u0647\u0648\u062b\u064a \u0641\u0642\u0634\u0631\u0633\u0630\u0642\u0647\u062d\u0641 \u0628\u062e\u0642 \u0641\u0627\u0647\u0633 \u062f\u0647\u064a\u062b\u062e \u062e\u0631 \u062b\u064a\u0637 \u0647\u0633 \u062e\u0639\u0641 \u062e\u0628 \u064a\u0634\u0641\u062b, \u0632\u0639\u0641 \u063a\u062e\u0639\u0641\u0639\u0632\u062b \u0627\u0634\u0633 \u0634 \u0630\u0639\u0642\u0642\u062b\u0631\u0641 \u0641\u0647\u0648\u062b\u064a \u0641\u0642\u0634\u0631\u0633\u0630\u0642\u0647\u062d\u0641 \u0628\u062e\u0642 \u0641\u0627\u0647\u0633 \u062f\u0647\u064a\u062b\u062e.",
|
||||
"The title field must be limited to 50 characters.": "\u0641\u0627\u062b \u0641\u0647\u0641\u0645\u062b \u0628\u0647\u062b\u0645\u064a \u0648\u0639\u0633\u0641 \u0632\u062b \u0645\u0647\u0648\u0647\u0641\u062b\u064a \u0641\u062e 50 \u0630\u0627\u0634\u0642\u0634\u0630\u0641\u062b\u0642\u0633.",
|
||||
"The topic \"%(topic)s\" could not be found.": "\u0641\u0627\u062b \u0641\u062e\u062d\u0647\u0630 \"%(topic)s\" \u0630\u062e\u0639\u0645\u064a \u0631\u062e\u0641 \u0632\u062b \u0628\u062e\u0639\u0631\u064a.",
|
||||
"The weight of all assignments of this type as a percentage of the total grade, for example, 40. Do not include the percent symbol.": "\u0641\u0627\u062b \u0635\u062b\u0647\u0644\u0627\u0641 \u062e\u0628 \u0634\u0645\u0645 \u0634\u0633\u0633\u0647\u0644\u0631\u0648\u062b\u0631\u0641\u0633 \u062e\u0628 \u0641\u0627\u0647\u0633 \u0641\u063a\u062d\u062b \u0634\u0633 \u0634 \u062d\u062b\u0642\u0630\u062b\u0631\u0641\u0634\u0644\u062b \u062e\u0628 \u0641\u0627\u062b \u0641\u062e\u0641\u0634\u0645 \u0644\u0642\u0634\u064a\u062b, \u0628\u062e\u0642 \u062b\u0637\u0634\u0648\u062d\u0645\u062b, 40. \u064a\u062e \u0631\u062e\u0641 \u0647\u0631\u0630\u0645\u0639\u064a\u062b \u0641\u0627\u062b \u062d\u062b\u0642\u0630\u062b\u0631\u0641 \u0633\u063a\u0648\u0632\u062e\u0645.",
|
||||
"The {cohortGroupName} cohort has been created. You can manually add students to this cohort below.": "\u0641\u0627\u062b {cohortGroupName} \u0630\u062e\u0627\u062e\u0642\u0641 \u0627\u0634\u0633 \u0632\u062b\u062b\u0631 \u0630\u0642\u062b\u0634\u0641\u062b\u064a. \u063a\u062e\u0639 \u0630\u0634\u0631 \u0648\u0634\u0631\u0639\u0634\u0645\u0645\u063a \u0634\u064a\u064a \u0633\u0641\u0639\u064a\u062b\u0631\u0641\u0633 \u0641\u062e \u0641\u0627\u0647\u0633 \u0630\u062e\u0627\u062e\u0642\u0641 \u0632\u062b\u0645\u062e\u0635.",
|
||||
@@ -1437,6 +1454,7 @@
|
||||
"This team is full.": "\u0641\u0627\u0647\u0633 \u0641\u062b\u0634\u0648 \u0647\u0633 \u0628\u0639\u0645\u0645.",
|
||||
"This thread is closed.": "\u0641\u0627\u0647\u0633 \u0641\u0627\u0642\u062b\u0634\u064a \u0647\u0633 \u0630\u0645\u062e\u0633\u062b\u064a.",
|
||||
"Time Allotted (HH:MM):": "\u0641\u0647\u0648\u062b \u0634\u0645\u0645\u062e\u0641\u0641\u062b\u064a (\u0627\u0627:\u0648\u0648):",
|
||||
"Time Limit": "\u0641\u0647\u0648\u062b \u0645\u0647\u0648\u0647\u0641",
|
||||
"Time Sent": "\u0641\u0647\u0648\u062b \u0633\u062b\u0631\u0641",
|
||||
"Time Sent:": "\u0641\u0647\u0648\u062b \u0633\u062b\u0631\u0641:",
|
||||
"Timed": "\u0641\u0647\u0648\u062b\u064a",
|
||||
@@ -1554,6 +1572,7 @@
|
||||
"User": "\u0639\u0633\u062b\u0642",
|
||||
"User Email": "\u0639\u0633\u062b\u0642 \u062b\u0648\u0634\u0647\u0645",
|
||||
"Username": "\u0639\u0633\u062b\u0642\u0631\u0634\u0648\u062b",
|
||||
"Username or Email": "\u0639\u0633\u062b\u0642\u0631\u0634\u0648\u062b \u062e\u0642 \u062b\u0648\u0634\u0647\u0645",
|
||||
"Username or email address": "\u0639\u0633\u062b\u0642\u0631\u0634\u0648\u062b \u062e\u0642 \u062b\u0648\u0634\u0647\u0645 \u0634\u064a\u064a\u0642\u062b\u0633\u0633",
|
||||
"Users": "\u0639\u0633\u062b\u0642\u0633",
|
||||
"Users must create and activate their account before they can be promoted to beta tester.": "\u0639\u0633\u062b\u0642\u0633 \u0648\u0639\u0633\u0641 \u0630\u0642\u062b\u0634\u0641\u062b \u0634\u0631\u064a \u0634\u0630\u0641\u0647\u062f\u0634\u0641\u062b \u0641\u0627\u062b\u0647\u0642 \u0634\u0630\u0630\u062e\u0639\u0631\u0641 \u0632\u062b\u0628\u062e\u0642\u062b \u0641\u0627\u062b\u063a \u0630\u0634\u0631 \u0632\u062b \u062d\u0642\u062e\u0648\u062e\u0641\u062b\u064a \u0641\u062e \u0632\u062b\u0641\u0634 \u0641\u062b\u0633\u0641\u062b\u0642.",
|
||||
@@ -1561,6 +1580,7 @@
|
||||
"Valid": "\u062f\u0634\u0645\u0647\u064a",
|
||||
"Validation Error": "\u062f\u0634\u0645\u0647\u064a\u0634\u0641\u0647\u062e\u0631 \u062b\u0642\u0642\u062e\u0642",
|
||||
"Validation Error While Saving": "\u062f\u0634\u0645\u0647\u064a\u0634\u0641\u0647\u062e\u0631 \u062b\u0642\u0642\u062e\u0642 \u0635\u0627\u0647\u0645\u062b \u0633\u0634\u062f\u0647\u0631\u0644",
|
||||
"Value": "\u062f\u0634\u0645\u0639\u062b",
|
||||
"Verification Checkpoint": "\u062f\u062b\u0642\u0647\u0628\u0647\u0630\u0634\u0641\u0647\u062e\u0631 \u0630\u0627\u062b\u0630\u0646\u062d\u062e\u0647\u0631\u0641",
|
||||
"Verification Deadline": "\u062f\u062b\u0642\u0647\u0628\u0647\u0630\u0634\u0641\u0647\u062e\u0631 \u064a\u062b\u0634\u064a\u0645\u0647\u0631\u062b",
|
||||
"Verification checkpoint to be completed": "\u062f\u062b\u0642\u0647\u0628\u0647\u0630\u0634\u0641\u0647\u062e\u0631 \u0630\u0627\u062b\u0630\u0646\u062d\u062e\u0647\u0631\u0641 \u0641\u062e \u0632\u062b \u0630\u062e\u0648\u062d\u0645\u062b\u0641\u062b\u064a",
|
||||
@@ -1652,6 +1672,7 @@
|
||||
"Will Be Visible To:": "\u0635\u0647\u0645\u0645 \u0632\u062b \u062f\u0647\u0633\u0647\u0632\u0645\u062b \u0641\u062e:",
|
||||
"Words: {0}": "\u0635\u062e\u0642\u064a\u0633: {0}",
|
||||
"Would you like to sign in using your %(providerName)s credentials?": "\u0635\u062e\u0639\u0645\u064a \u063a\u062e\u0639 \u0645\u0647\u0646\u062b \u0641\u062e \u0633\u0647\u0644\u0631 \u0647\u0631 \u0639\u0633\u0647\u0631\u0644 \u063a\u062e\u0639\u0642 %(providerName)s \u0630\u0642\u062b\u064a\u062b\u0631\u0641\u0647\u0634\u0645\u0633?",
|
||||
"XSeries Program Certificates": "\u0637\u0633\u062b\u0642\u0647\u062b\u0633 \u062d\u0642\u062e\u0644\u0642\u0634\u0648 \u0630\u062b\u0642\u0641\u0647\u0628\u0647\u0630\u0634\u0641\u062b\u0633",
|
||||
"Year of Birth": "\u063a\u062b\u0634\u0642 \u062e\u0628 \u0632\u0647\u0642\u0641\u0627",
|
||||
"Yes, allow edits to the active Certificate": "\u063a\u062b\u0633, \u0634\u0645\u0645\u062e\u0635 \u062b\u064a\u0647\u0641\u0633 \u0641\u062e \u0641\u0627\u062b \u0634\u0630\u0641\u0647\u062f\u062b \u0630\u062b\u0642\u0641\u0647\u0628\u0647\u0630\u0634\u0641\u062b",
|
||||
"Yes, delete this %(xblock_type)s": "\u063a\u062b\u0633, \u064a\u062b\u0645\u062b\u0641\u062b \u0641\u0627\u0647\u0633 %(xblock_type)s",
|
||||
@@ -1664,6 +1685,7 @@
|
||||
"You are currently sharing a limited profile.": "\u063a\u062e\u0639 \u0634\u0642\u062b \u0630\u0639\u0642\u0642\u062b\u0631\u0641\u0645\u063a \u0633\u0627\u0634\u0642\u0647\u0631\u0644 \u0634 \u0645\u0647\u0648\u0647\u0641\u062b\u064a \u062d\u0642\u062e\u0628\u0647\u0645\u062b.",
|
||||
"You are enrolling in: {courseName}": "\u063a\u062e\u0639 \u0634\u0642\u062b \u062b\u0631\u0642\u062e\u0645\u0645\u0647\u0631\u0644 \u0647\u0631: {courseName}",
|
||||
"You are not currently a member of any team.": "\u063a\u062e\u0639 \u0634\u0642\u062b \u0631\u062e\u0641 \u0630\u0639\u0642\u0642\u062b\u0631\u0641\u0645\u063a \u0634 \u0648\u062b\u0648\u0632\u062b\u0642 \u062e\u0628 \u0634\u0631\u063a \u0641\u062b\u0634\u0648.",
|
||||
"You are not enrolled in any XSeries Programs yet.": "\u063a\u062e\u0639 \u0634\u0642\u062b \u0631\u062e\u0641 \u062b\u0631\u0642\u062e\u0645\u0645\u062b\u064a \u0647\u0631 \u0634\u0631\u063a \u0637\u0633\u062b\u0642\u0647\u062b\u0633 \u062d\u0642\u062e\u0644\u0642\u0634\u0648\u0633 \u063a\u062b\u0641.",
|
||||
"You are now enrolled as a verified student for:": "\u063a\u062e\u0639 \u0634\u0642\u062b \u0631\u062e\u0635 \u062b\u0631\u0642\u062e\u0645\u0645\u062b\u064a \u0634\u0633 \u0634 \u062f\u062b\u0642\u0647\u0628\u0647\u062b\u064a \u0633\u0641\u0639\u064a\u062b\u0631\u0641 \u0628\u062e\u0642:",
|
||||
"You are upgrading your enrollment for: {courseName}": "\u063a\u062e\u0639 \u0634\u0642\u062b \u0639\u062d\u0644\u0642\u0634\u064a\u0647\u0631\u0644 \u063a\u062e\u0639\u0642 \u062b\u0631\u0642\u062e\u0645\u0645\u0648\u062b\u0631\u0641 \u0628\u062e\u0642: {courseName}",
|
||||
"You can now enter your payment information and complete your enrollment.": "\u063a\u062e\u0639 \u0630\u0634\u0631 \u0631\u062e\u0635 \u062b\u0631\u0641\u062b\u0642 \u063a\u062e\u0639\u0642 \u062d\u0634\u063a\u0648\u062b\u0631\u0641 \u0647\u0631\u0628\u062e\u0642\u0648\u0634\u0641\u0647\u062e\u0631 \u0634\u0631\u064a \u0630\u062e\u0648\u062d\u0645\u062b\u0641\u062b \u063a\u062e\u0639\u0642 \u062b\u0631\u0642\u062e\u0645\u0645\u0648\u062b\u0631\u0641.",
|
||||
@@ -1679,6 +1701,7 @@
|
||||
"You have already reported this annotation.": "\u063a\u062e\u0639 \u0627\u0634\u062f\u062b \u0634\u0645\u0642\u062b\u0634\u064a\u063a \u0642\u062b\u062d\u062e\u0642\u0641\u062b\u064a \u0641\u0627\u0647\u0633 \u0634\u0631\u0631\u062e\u0641\u0634\u0641\u0647\u062e\u0631.",
|
||||
"You have already verified your ID!": "\u063a\u062e\u0639 \u0627\u0634\u062f\u062b \u0634\u0645\u0642\u062b\u0634\u064a\u063a \u062f\u062b\u0642\u0647\u0628\u0647\u062b\u064a \u063a\u062e\u0639\u0642 \u0647\u064a!",
|
||||
"You have been logged out of your edX account. ": "\u063a\u062e\u0639 \u0627\u0634\u062f\u062b \u0632\u062b\u062b\u0631 \u0645\u062e\u0644\u0644\u062b\u064a \u062e\u0639\u0641 \u062e\u0628 \u063a\u062e\u0639\u0642 \u062b\u064a\u0637 \u0634\u0630\u0630\u062e\u0639\u0631\u0641. ",
|
||||
"You have earned certificates in %(completed_courses)s of the %(total_courses)s courses so far.": "\u063a\u062e\u0639 \u0627\u0634\u062f\u062b \u062b\u0634\u0642\u0631\u062b\u064a \u0630\u062b\u0642\u0641\u0647\u0628\u0647\u0630\u0634\u0641\u062b\u0633 \u0647\u0631 %(completed_courses)s \u062e\u0628 \u0641\u0627\u062b %(total_courses)s \u0630\u062e\u0639\u0642\u0633\u062b\u0633 \u0633\u062e \u0628\u0634\u0642.",
|
||||
"You have no handouts defined": "\u063a\u062e\u0639 \u0627\u0634\u062f\u062b \u0631\u062e \u0627\u0634\u0631\u064a\u062e\u0639\u0641\u0633 \u064a\u062b\u0628\u0647\u0631\u062b\u064a",
|
||||
"You have not bookmarked any courseware pages yet.": "\u063a\u062e\u0639 \u0627\u0634\u062f\u062b \u0631\u062e\u0641 \u0632\u062e\u062e\u0646\u0648\u0634\u0642\u0646\u062b\u064a \u0634\u0631\u063a \u0630\u062e\u0639\u0642\u0633\u062b\u0635\u0634\u0642\u062b \u062d\u0634\u0644\u062b\u0633 \u063a\u062b\u0641.",
|
||||
"You have not created any certificates yet.": "\u063a\u062e\u0639 \u0627\u0634\u062f\u062b \u0631\u062e\u0641 \u0630\u0642\u062b\u0634\u0641\u062b\u064a \u0634\u0631\u063a \u0630\u062b\u0642\u0641\u0647\u0628\u0647\u0630\u0634\u0641\u062b\u0633 \u063a\u062b\u0641.",
|
||||
@@ -1759,6 +1782,8 @@
|
||||
"asset_path is required": "\u0634\u0633\u0633\u062b\u0641_\u062d\u0634\u0641\u0627 \u0647\u0633 \u0642\u062b\u0636\u0639\u0647\u0642\u062b\u064a",
|
||||
"bytes": "\u0632\u063a\u0641\u062b\u0633",
|
||||
"certificate": "\u0630\u062b\u0642\u0641\u0647\u0628\u0647\u0630\u0634\u0641\u062b",
|
||||
"certificate.credential_url": "\u0630\u062b\u0642\u0641\u0647\u0628\u0647\u0630\u0634\u0641\u062b.\u0630\u0642\u062b\u064a\u062b\u0631\u0641\u0647\u0634\u0645_\u0639\u0642\u0645",
|
||||
"certificate.display_name": "\u0630\u062b\u0642\u0641\u0647\u0628\u0647\u0630\u0634\u0641\u062b.\u064a\u0647\u0633\u062d\u0645\u0634\u063a_\u0631\u0634\u0648\u062b",
|
||||
"close": "\u0630\u0645\u062e\u0633\u062b",
|
||||
"content group": "\u0630\u062e\u0631\u0641\u062b\u0631\u0641 \u0644\u0642\u062e\u0639\u062d",
|
||||
"correct": "\u0630\u062e\u0642\u0642\u062b\u0630\u0641",
|
||||
@@ -1794,6 +1819,7 @@
|
||||
"marked as answer %(time_ago)s": "\u0648\u0634\u0642\u0646\u062b\u064a \u0634\u0633 \u0634\u0631\u0633\u0635\u062b\u0642 %(time_ago)s",
|
||||
"marked as answer %(time_ago)s by %(user)s": "\u0648\u0634\u0642\u0646\u062b\u064a \u0634\u0633 \u0634\u0631\u0633\u0635\u062b\u0642 %(time_ago)s \u0632\u063a %(user)s",
|
||||
"message": "\u0648\u062b\u0633\u0633\u0634\u0644\u062b",
|
||||
"minutes": "\u0648\u0647\u0631\u0639\u0641\u062b\u0633",
|
||||
"name": "\u0631\u0634\u0648\u062b",
|
||||
"off": "\u062e\u0628\u0628",
|
||||
"on": "\u062e\u0631",
|
||||
@@ -1801,7 +1827,7 @@
|
||||
"or": "\u062e\u0642",
|
||||
"or create a new one here": "\u062e\u0642 \u0630\u0642\u062b\u0634\u0641\u062b \u0634 \u0631\u062b\u0635 \u062e\u0631\u062b \u0627\u062b\u0642\u062b",
|
||||
"or sign in with": "\u062e\u0642 \u0633\u0647\u0644\u0631 \u0647\u0631 \u0635\u0647\u0641\u0627",
|
||||
"org.display_name": "\u062e\u0642\u0644.\u064a\u0647\u0633\u062d\u0645\u0634\u063a_\u0631\u0634\u0648\u062b",
|
||||
"org.key": "\u062e\u0642\u0644.\u0646\u062b\u063a",
|
||||
"post anonymously": "\u062d\u062e\u0633\u0641 \u0634\u0631\u062e\u0631\u063a\u0648\u062e\u0639\u0633\u0645\u063a",
|
||||
"post anonymously to classmates": "\u062d\u062e\u0633\u0641 \u0634\u0631\u062e\u0631\u063a\u0648\u062e\u0639\u0633\u0645\u063a \u0641\u062e \u0630\u0645\u0634\u0633\u0633\u0648\u0634\u0641\u062b\u0633",
|
||||
"posted %(time_ago)s by %(author)s": "\u062d\u062e\u0633\u0641\u062b\u064a %(time_ago)s \u0632\u063a %(author)s",
|
||||
@@ -1832,6 +1858,7 @@
|
||||
"with %(section_or_subsection)s": "\u0635\u0647\u0641\u0627 %(section_or_subsection)s",
|
||||
"{browse_span_start}Browse teams in other topics{span_end} or {search_span_start}search teams{span_end} in this topic. If you still can't find a team to join, {create_span_start}create a new team in this topic{span_end}.": "{browse_span_start}\u0632\u0642\u062e\u0635\u0633\u062b \u0641\u062b\u0634\u0648\u0633 \u0647\u0631 \u062e\u0641\u0627\u062b\u0642 \u0641\u062e\u062d\u0647\u0630\u0633{span_end} \u062e\u0642 {search_span_start}\u0633\u062b\u0634\u0642\u0630\u0627 \u0641\u062b\u0634\u0648\u0633{span_end} \u0647\u0631 \u0641\u0627\u0647\u0633 \u0641\u062e\u062d\u0647\u0630. \u0647\u0628 \u063a\u062e\u0639 \u0633\u0641\u0647\u0645\u0645 \u0630\u0634\u0631'\u0641 \u0628\u0647\u0631\u064a \u0634 \u0641\u062b\u0634\u0648 \u0641\u062e \u062a\u062e\u0647\u0631, {create_span_start}\u0630\u0642\u062b\u0634\u0641\u062b \u0634 \u0631\u062b\u0635 \u0641\u062b\u0634\u0648 \u0647\u0631 \u0641\u0627\u0647\u0633 \u0641\u062e\u062d\u0647\u0630{span_end}.",
|
||||
"{email} is already on the {container} team. Recheck the email address if you want to add a new member.": "{email} \u0647\u0633 \u0634\u0645\u0642\u062b\u0634\u064a\u063a \u062e\u0631 \u0641\u0627\u062b {container} \u0641\u062b\u0634\u0648. \u0642\u062b\u0630\u0627\u062b\u0630\u0646 \u0641\u0627\u062b \u062b\u0648\u0634\u0647\u0645 \u0634\u064a\u064a\u0642\u062b\u0633\u0633 \u0647\u0628 \u063a\u062e\u0639 \u0635\u0634\u0631\u0641 \u0641\u062e \u0634\u064a\u064a \u0634 \u0631\u062b\u0635 \u0648\u062b\u0648\u0632\u062b\u0642.",
|
||||
"{hours}:{minutes} (current UTC time)": "{hours}:{minutes} (\u0630\u0639\u0642\u0642\u062b\u0631\u0641 \u0639\u0641\u0630 \u0641\u0647\u0648\u062b)",
|
||||
"{numMoved} student was removed from {oldCohort}": [
|
||||
"{numMoved} \u0633\u0641\u0639\u064a\u062b\u0631\u0641 \u0635\u0634\u0633 \u0642\u062b\u0648\u062e\u062f\u062b\u064a \u0628\u0642\u062e\u0648 {oldCohort}",
|
||||
"{numMoved} \u0633\u0641\u0639\u064a\u062b\u0631\u0641\u0633 \u0635\u062b\u0642\u062b \u0642\u062b\u0648\u062e\u062f\u062b\u064a \u0628\u0642\u062e\u0648 {oldCohort}"
|
||||
|
||||
@@ -598,7 +598,7 @@ define(["jquery", "common/js/spec_helpers/ajax_helpers", "common/js/components/u
|
||||
var getDisplayNameWrapper, setEditModalValues, mockServerValuesJson,
|
||||
selectDisableSpecialExams, selectBasicSettings, selectAdvancedSettings,
|
||||
selectAccessSettings, selectTimedExam, selectProctoredExam, selectPracticeExam,
|
||||
selectPrerequisite, selectLastPrerequisiteSubsection;
|
||||
selectPrerequisite, selectLastPrerequisiteSubsection, checkOptionFieldVisibility;
|
||||
|
||||
getDisplayNameWrapper = function() {
|
||||
return getItemHeaders('subsection').find('.wrapper-xblock-field');
|
||||
@@ -612,7 +612,7 @@ define(["jquery", "common/js/spec_helpers/ajax_helpers", "common/js/components/u
|
||||
};
|
||||
|
||||
selectDisableSpecialExams = function() {
|
||||
this.$("#id_not_timed").prop('checked', true).trigger('change');
|
||||
this.$("input.no_special_exam").prop('checked', true).trigger('change');
|
||||
};
|
||||
|
||||
selectBasicSettings = function() {
|
||||
@@ -627,22 +627,23 @@ define(["jquery", "common/js/spec_helpers/ajax_helpers", "common/js/components/u
|
||||
this.$(".modal-section .settings-tab-button[data-tab='access']").click();
|
||||
};
|
||||
|
||||
selectTimedExam = function(time_limit) {
|
||||
this.$("#id_timed_exam").prop('checked', true).trigger('change');
|
||||
this.$("#id_time_limit").val(time_limit);
|
||||
this.$("#id_time_limit").trigger('focusout');
|
||||
selectTimedExam = function(time_limit, hide_after_due) {
|
||||
this.$("input.timed_exam").prop('checked', true).trigger('change');
|
||||
this.$(".field-time-limit input").val(time_limit);
|
||||
this.$(".field-time-limit input").trigger('focusout');
|
||||
this.$('.field-hide-after-due input').prop('checked', hide_after_due).trigger('change');
|
||||
};
|
||||
|
||||
selectProctoredExam = function(time_limit) {
|
||||
this.$("#id_proctored_exam").prop('checked', true).trigger('change');
|
||||
this.$("#id_time_limit").val(time_limit);
|
||||
this.$("#id_time_limit").trigger('focusout');
|
||||
this.$("input.proctored_exam").prop('checked', true).trigger('change');
|
||||
this.$(".field-time-limit input").val(time_limit);
|
||||
this.$(".field-time-limit input").trigger('focusout');
|
||||
};
|
||||
|
||||
selectPracticeExam = function(time_limit) {
|
||||
this.$("#id_practice_exam").prop('checked', true).trigger('change');
|
||||
this.$("#id_time_limit").val(time_limit);
|
||||
this.$("#id_time_limit").trigger('focusout');
|
||||
this.$("input.practice_exam").prop('checked', true).trigger('change');
|
||||
this.$(".field-time-limit input").val(time_limit);
|
||||
this.$(".field-time-limit input").trigger('focusout');
|
||||
};
|
||||
|
||||
selectPrerequisite = function() {
|
||||
@@ -654,6 +655,13 @@ define(["jquery", "common/js/spec_helpers/ajax_helpers", "common/js/components/u
|
||||
this.$("#prereq_min_score").val(minScore).trigger('keyup');
|
||||
};
|
||||
|
||||
// Helper to validate oft-checked additional option fields' visibility
|
||||
checkOptionFieldVisibility = function(time_limit, review_rules, hide_after_due) {
|
||||
expect($('.field-time-limit').is(':visible')).toBe(time_limit);
|
||||
expect($('.field-exam-review-rules').is(':visible')).toBe(review_rules);
|
||||
expect($('.field-hide-after-due').is(':visible')).toBe(hide_after_due);
|
||||
};
|
||||
|
||||
// Contains hard-coded dates because dates are presented in different formats.
|
||||
mockServerValuesJson = createMockSectionJSON({
|
||||
release_date: 'Jan 01, 2970 at 05:00 UTC'
|
||||
@@ -670,8 +678,9 @@ define(["jquery", "common/js/spec_helpers/ajax_helpers", "common/js/components/u
|
||||
is_prereq: false,
|
||||
"is_time_limited": true,
|
||||
"is_practice_exam": false,
|
||||
"is_proctored_exam": true,
|
||||
"default_time_limit_minutes": 150
|
||||
"is_proctored_exam": false,
|
||||
"default_time_limit_minutes": 150,
|
||||
"hide_after_due": true,
|
||||
}, [
|
||||
createMockVerticalJSON({
|
||||
has_changes: true,
|
||||
@@ -815,13 +824,13 @@ define(["jquery", "common/js/spec_helpers/ajax_helpers", "common/js/components/u
|
||||
for (i = 0; i < valid_times.length; i++){
|
||||
time_limit = valid_times[i];
|
||||
selectTimedExam(time_limit);
|
||||
expect($("#id_time_limit").val()).toEqual(time_limit);
|
||||
expect($(".field-time-limit input").val()).toEqual(time_limit);
|
||||
}
|
||||
for (i = 0; i < invalid_times.length; i++){
|
||||
time_limit = invalid_times[i];
|
||||
selectTimedExam(time_limit);
|
||||
expect($("#id_time_limit").val()).not.toEqual(time_limit);
|
||||
expect($("#id_time_limit").val()).toEqual(default_time);
|
||||
expect($(".field-time-limit input").val()).not.toEqual(time_limit);
|
||||
expect($(".field-time-limit input").val()).toEqual(default_time);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -829,7 +838,8 @@ define(["jquery", "common/js/spec_helpers/ajax_helpers", "common/js/components/u
|
||||
createCourseOutlinePage(this, mockCourseJSON, false);
|
||||
outlinePage.$('.outline-subsection .configure-button').click();
|
||||
setEditModalValues("7/9/2014", "7/10/2014", "Lab", true);
|
||||
selectProctoredExam("02:30");
|
||||
selectAdvancedSettings();
|
||||
selectTimedExam("02:30", true);
|
||||
$(".wrapper-modal-window .action-save").click();
|
||||
AjaxHelpers.expectJsonRequest(requests, 'POST', '/xblock/mock-subsection', {
|
||||
"graderType":"Lab",
|
||||
@@ -842,8 +852,9 @@ define(["jquery", "common/js/spec_helpers/ajax_helpers", "common/js/components/u
|
||||
"exam_review_rules": "",
|
||||
"is_time_limited": true,
|
||||
"is_practice_exam": false,
|
||||
"is_proctored_enabled": true,
|
||||
"default_time_limit_minutes": 150
|
||||
"is_proctored_enabled": false,
|
||||
"default_time_limit_minutes": 150,
|
||||
"hide_after_due": true,
|
||||
}
|
||||
});
|
||||
expect(requests[0].requestHeaders['X-HTTP-Method-Override']).toBe('PATCH');
|
||||
@@ -872,30 +883,35 @@ define(["jquery", "common/js/spec_helpers/ajax_helpers", "common/js/components/u
|
||||
expect($("#due_date").val()).toBe('7/10/2014');
|
||||
expect($("#grading_type").val()).toBe('Lab');
|
||||
expect($("#staff_lock").is(":checked")).toBe(true);
|
||||
expect($("#id_timed_exam").is(":checked")).toBe(false);
|
||||
expect($("#id_proctored_exam").is(":checked")).toBe(true);
|
||||
expect($("#id_not_timed").is(":checked")).toBe(false);
|
||||
expect($("#id_practice_exam").is(":checked")).toBe(false);
|
||||
expect($("#id_time_limit").val()).toBe("02:30");
|
||||
expect($("input.timed_exam").is(":checked")).toBe(true);
|
||||
expect($("input.proctored_exam").is(":checked")).toBe(false);
|
||||
expect($("input.no_special_exam").is(":checked")).toBe(false);
|
||||
expect($("input.practice_exam").is(":checked")).toBe(false);
|
||||
expect($(".field-time-limit input").val()).toBe("02:30");
|
||||
expect($(".field-hide-after-due input").is(":checked")).toBe(true);
|
||||
});
|
||||
|
||||
it('can hide the time limit field when the None radio box is selected', function() {
|
||||
it('can hide time limit and hide after due fields when the None radio box is selected', function() {
|
||||
createCourseOutlinePage(this, mockCourseJSON, false);
|
||||
outlinePage.$('.outline-subsection .configure-button').click();
|
||||
setEditModalValues("7/9/2014", "7/10/2014", "Lab", true);
|
||||
selectAdvancedSettings();
|
||||
selectDisableSpecialExams();
|
||||
|
||||
// id_time_limit_div should be hidden when None is specified
|
||||
expect($('#id_time_limit_div')).toHaveClass('is-hidden');
|
||||
// all additional options should be hidden
|
||||
expect($('.exam-options').is(':hidden')).toBe(true);
|
||||
});
|
||||
|
||||
it('can select the practice exam', function() {
|
||||
createCourseOutlinePage(this, mockCourseJSON, false);
|
||||
outlinePage.$('.outline-subsection .configure-button').click();
|
||||
setEditModalValues("7/9/2014", "7/10/2014", "Lab", true);
|
||||
selectAdvancedSettings();
|
||||
selectPracticeExam("00:30");
|
||||
// id_time_limit_div should not be hidden when practice exam is specified
|
||||
expect($('#id_time_limit_div')).not.toHaveClass('is-hidden"');
|
||||
|
||||
// time limit should be visible, review rules and hide after due should be hidden
|
||||
checkOptionFieldVisibility(true, false, false);
|
||||
|
||||
$(".wrapper-modal-window .action-save").click();
|
||||
});
|
||||
|
||||
@@ -903,9 +919,12 @@ define(["jquery", "common/js/spec_helpers/ajax_helpers", "common/js/components/u
|
||||
createCourseOutlinePage(this, mockCourseJSON, false);
|
||||
outlinePage.$('.outline-subsection .configure-button').click();
|
||||
setEditModalValues("7/9/2014", "7/10/2014", "Lab", true);
|
||||
selectAdvancedSettings();
|
||||
selectTimedExam("00:30");
|
||||
// id_time_limit_div should not be hidden when timed exam is specified
|
||||
expect($('#id_time_limit_div')).not.toHaveClass('is-hidden"');
|
||||
|
||||
// time limit and hide after due should be visible, review rules should be hidden
|
||||
checkOptionFieldVisibility(true, false, true);
|
||||
|
||||
$(".wrapper-modal-window .action-save").click();
|
||||
});
|
||||
|
||||
@@ -913,9 +932,12 @@ define(["jquery", "common/js/spec_helpers/ajax_helpers", "common/js/components/u
|
||||
createCourseOutlinePage(this, mockCourseJSON, false);
|
||||
outlinePage.$('.outline-subsection .configure-button').click();
|
||||
setEditModalValues("7/9/2014", "7/10/2014", "Lab", true);
|
||||
selectAdvancedSettings();
|
||||
selectProctoredExam("00:30");
|
||||
// id_time_limit_div should not be hidden when timed exam is specified
|
||||
expect($('#id_time_limit_div')).not.toHaveClass('is-hidden"');
|
||||
|
||||
// time limit and review rules should be visible, hide after due should be hidden
|
||||
checkOptionFieldVisibility(true, true, false);
|
||||
|
||||
$(".wrapper-modal-window .action-save").click();
|
||||
|
||||
});
|
||||
@@ -924,10 +946,12 @@ define(["jquery", "common/js/spec_helpers/ajax_helpers", "common/js/components/u
|
||||
createCourseOutlinePage(this, mockCourseJSON, false);
|
||||
outlinePage.$('.outline-subsection .configure-button').click();
|
||||
setEditModalValues("7/9/2014", "7/10/2014", "Lab", true);
|
||||
selectAdvancedSettings();
|
||||
selectProctoredExam("abcd");
|
||||
// id_time_limit_div should not be hidden when timed exam is specified
|
||||
expect($('#id_time_limit_div')).not.toHaveClass('is-hidden"');
|
||||
expect($('#id_time_limit')).toHaveValue('00:30');
|
||||
|
||||
// time limit field should be visible and have the correct value
|
||||
expect($('.field-time-limit').is(':visible')).toBe(true);
|
||||
expect($('.field-time-limit input').val()).toEqual("00:30");
|
||||
|
||||
});
|
||||
|
||||
@@ -944,21 +968,24 @@ define(["jquery", "common/js/spec_helpers/ajax_helpers", "common/js/components/u
|
||||
"is_time_limited": false,
|
||||
"is_practice_exam": false,
|
||||
"is_proctored_exam": false,
|
||||
"default_time_limit_minutes": 150
|
||||
"default_time_limit_minutes": 150,
|
||||
"hide_after_due": false,
|
||||
}, [
|
||||
]),
|
||||
])
|
||||
]);
|
||||
createCourseOutlinePage(this, mockCourseWithSpecialExamJSON, false);
|
||||
outlinePage.$('.outline-subsection .configure-button').click();
|
||||
expect($("#id_timed_exam").is(":checked")).toBe(false);
|
||||
expect($("#id_proctored_exam").is(":checked")).toBe(false);
|
||||
expect($("#id_not_timed").is(":checked")).toBe(true);
|
||||
expect($("#id_practice_exam").is(":checked")).toBe(false);
|
||||
expect($("#id_time_limit").val()).toBe("02:30");
|
||||
selectAdvancedSettings();
|
||||
expect($("input.timed_exam").is(":checked")).toBe(false);
|
||||
expect($("input.proctored_exam").is(":checked")).toBe(false);
|
||||
expect($("input.no_special_exam").is(":checked")).toBe(true);
|
||||
expect($("input.practice_exam").is(":checked")).toBe(false);
|
||||
expect($(".field-time-limit input").val()).toBe("02:30");
|
||||
expect($('.field-hide-after-due').is(':hidden')).toBe(true);
|
||||
});
|
||||
|
||||
it('can show a saved timed exam correctly', function() {
|
||||
it('can show a saved timed exam correctly when hide_after_due is true', function() {
|
||||
var mockCourseWithSpecialExamJSON = createMockCourseJSON({}, [
|
||||
createMockSectionJSON({
|
||||
has_changes: true,
|
||||
@@ -971,18 +998,51 @@ define(["jquery", "common/js/spec_helpers/ajax_helpers", "common/js/components/u
|
||||
"is_time_limited": true,
|
||||
"is_practice_exam": false,
|
||||
"is_proctored_exam": false,
|
||||
"default_time_limit_minutes": 10
|
||||
"default_time_limit_minutes": 10,
|
||||
"hide_after_due": true,
|
||||
}, [
|
||||
]),
|
||||
])
|
||||
]);
|
||||
createCourseOutlinePage(this, mockCourseWithSpecialExamJSON, false);
|
||||
outlinePage.$('.outline-subsection .configure-button').click();
|
||||
expect($("#id_timed_exam").is(":checked")).toBe(true);
|
||||
expect($("#id_proctored_exam").is(":checked")).toBe(false);
|
||||
expect($("#id_not_timed").is(":checked")).toBe(false);
|
||||
expect($("#id_practice_exam").is(":checked")).toBe(false);
|
||||
expect($("#id_time_limit").val()).toBe("00:10");
|
||||
selectAdvancedSettings();
|
||||
expect($("input.timed_exam").is(":checked")).toBe(true);
|
||||
expect($("input.proctored_exam").is(":checked")).toBe(false);
|
||||
expect($("input.no_special_exam").is(":checked")).toBe(false);
|
||||
expect($("input.practice_exam").is(":checked")).toBe(false);
|
||||
expect($(".field-time-limit input").val()).toBe("00:10");
|
||||
expect($('.field-hide-after-due input').is(":checked")).toBe(true);
|
||||
});
|
||||
|
||||
it('can show a saved timed exam correctly when hide_after_due is true', function() {
|
||||
var mockCourseWithSpecialExamJSON = createMockCourseJSON({}, [
|
||||
createMockSectionJSON({
|
||||
has_changes: true,
|
||||
enable_proctored_exams: true,
|
||||
enable_timed_exams: true
|
||||
|
||||
}, [
|
||||
createMockSubsectionJSON({
|
||||
has_changes: true,
|
||||
"is_time_limited": true,
|
||||
"is_practice_exam": false,
|
||||
"is_proctored_exam": false,
|
||||
"default_time_limit_minutes": 10,
|
||||
"hide_after_due": false,
|
||||
}, [
|
||||
]),
|
||||
])
|
||||
]);
|
||||
createCourseOutlinePage(this, mockCourseWithSpecialExamJSON, false);
|
||||
outlinePage.$('.outline-subsection .configure-button').click();
|
||||
selectAdvancedSettings();
|
||||
expect($("input.timed_exam").is(":checked")).toBe(true);
|
||||
expect($("input.proctored_exam").is(":checked")).toBe(false);
|
||||
expect($("input.no_special_exam").is(":checked")).toBe(false);
|
||||
expect($("input.practice_exam").is(":checked")).toBe(false);
|
||||
expect($(".field-time-limit input").val()).toBe("00:10");
|
||||
expect($('.field-hide-after-due input').is(":checked")).toBe(false);
|
||||
});
|
||||
|
||||
it('can show a saved practice exam correctly', function() {
|
||||
@@ -1005,11 +1065,13 @@ define(["jquery", "common/js/spec_helpers/ajax_helpers", "common/js/components/u
|
||||
]);
|
||||
createCourseOutlinePage(this, mockCourseWithSpecialExamJSON, false);
|
||||
outlinePage.$('.outline-subsection .configure-button').click();
|
||||
expect($("#id_timed_exam").is(":checked")).toBe(false);
|
||||
expect($("#id_proctored_exam").is(":checked")).toBe(false);
|
||||
expect($("#id_not_timed").is(":checked")).toBe(false);
|
||||
expect($("#id_practice_exam").is(":checked")).toBe(true);
|
||||
expect($("#id_time_limit").val()).toBe("02:30");
|
||||
selectAdvancedSettings();
|
||||
expect($("input.timed_exam").is(":checked")).toBe(false);
|
||||
expect($("input.proctored_exam").is(":checked")).toBe(false);
|
||||
expect($("input.no_special_exam").is(":checked")).toBe(false);
|
||||
expect($("input.practice_exam").is(":checked")).toBe(true);
|
||||
expect($(".field-time-limit input").val()).toBe("02:30");
|
||||
expect($('.field-hide-after-due').is(':hidden')).toBe(true);
|
||||
});
|
||||
|
||||
it('can show a saved proctored exam correctly', function() {
|
||||
@@ -1032,11 +1094,13 @@ define(["jquery", "common/js/spec_helpers/ajax_helpers", "common/js/components/u
|
||||
]);
|
||||
createCourseOutlinePage(this, mockCourseWithSpecialExamJSON, false);
|
||||
outlinePage.$('.outline-subsection .configure-button').click();
|
||||
expect($("#id_timed_exam").is(":checked")).toBe(false);
|
||||
expect($("#id_proctored_exam").is(":checked")).toBe(true);
|
||||
expect($("#id_not_timed").is(":checked")).toBe(false);
|
||||
expect($("#id_practice_exam").is(":checked")).toBe(false);
|
||||
expect($("#id_time_limit").val()).toBe("02:30");
|
||||
selectAdvancedSettings();
|
||||
expect($("input.timed_exam").is(":checked")).toBe(false);
|
||||
expect($("input.proctored_exam").is(":checked")).toBe(true);
|
||||
expect($("input.no_special_exam").is(":checked")).toBe(false);
|
||||
expect($("input.practice_exam").is(":checked")).toBe(false);
|
||||
expect($(".field-time-limit input").val()).toBe("02:30");
|
||||
expect($('.field-hide-after-due').is(':hidden')).toBe(true);
|
||||
});
|
||||
|
||||
it('does not show proctored settings if proctored exams not enabled', function() {
|
||||
@@ -1052,16 +1116,19 @@ define(["jquery", "common/js/spec_helpers/ajax_helpers", "common/js/components/u
|
||||
"is_time_limited": true,
|
||||
"is_practice_exam": false,
|
||||
"is_proctored_exam": false,
|
||||
"default_time_limit_minutes": 150
|
||||
"default_time_limit_minutes": 150,
|
||||
"hide_after_due": true,
|
||||
}, [
|
||||
]),
|
||||
])
|
||||
]);
|
||||
createCourseOutlinePage(this, mockCourseWithSpecialExamJSON, false);
|
||||
outlinePage.$('.outline-subsection .configure-button').click();
|
||||
expect($("#id_timed_exam").is(":checked")).toBe(true);
|
||||
expect($("#id_not_timed").is(":checked")).toBe(false);
|
||||
expect($("#id_time_limit").val()).toBe("02:30");
|
||||
selectAdvancedSettings();
|
||||
expect($("input.timed_exam").is(":checked")).toBe(true);
|
||||
expect($("input.no_special_exam").is(":checked")).toBe(false);
|
||||
expect($(".field-time-limit input").val()).toBe("02:30");
|
||||
expect($('.field-hide-after-due input').is(":checked")).toBe(true);
|
||||
});
|
||||
|
||||
it('can select prerequisite', function() {
|
||||
|
||||
@@ -62,8 +62,8 @@ define(["jquery", "URI", "common/js/spec_helpers/ajax_helpers", "common/js/compo
|
||||
mockCssUrl = "mock.css",
|
||||
headHtml;
|
||||
postXBlockRequest(requests, [
|
||||
["hash1", { mimetype: "text/css", kind: "text", data: mockCssText }],
|
||||
["hash2", { mimetype: "text/css", kind: "url", data: mockCssUrl }]
|
||||
["xblock_spec_hash1", { mimetype: "text/css", kind: "text", data: mockCssText }],
|
||||
["xblock_spec_hash2", { mimetype: "text/css", kind: "url", data: mockCssUrl }]
|
||||
]);
|
||||
headHtml = $('head').html();
|
||||
expect(headHtml).toContain(mockCssText);
|
||||
@@ -73,7 +73,9 @@ define(["jquery", "URI", "common/js/spec_helpers/ajax_helpers", "common/js/compo
|
||||
it('can render an xblock with required JavaScript', function() {
|
||||
var requests = AjaxHelpers.requests(this);
|
||||
postXBlockRequest(requests, [
|
||||
["hash3", { mimetype: "application/javascript", kind: "text", data: "window.test = 100;" }]
|
||||
["xblock_spec_hash3", {
|
||||
mimetype: "application/javascript", kind: "text", data: "window.test = 100;"
|
||||
}]
|
||||
]);
|
||||
expect(window.test).toBe(100);
|
||||
});
|
||||
@@ -82,7 +84,7 @@ define(["jquery", "URI", "common/js/spec_helpers/ajax_helpers", "common/js/compo
|
||||
var requests = AjaxHelpers.requests(this),
|
||||
mockHeadTag = "<title>Test Title</title>";
|
||||
postXBlockRequest(requests, [
|
||||
["hash4", { mimetype: "text/html", placement: "head", data: mockHeadTag }]
|
||||
["xblock_spec_hash4", { mimetype: "text/html", placement: "head", data: mockHeadTag }]
|
||||
]);
|
||||
expect($('head').html()).toContain(mockHeadTag);
|
||||
});
|
||||
@@ -93,7 +95,9 @@ define(["jquery", "URI", "common/js/spec_helpers/ajax_helpers", "common/js/compo
|
||||
promise;
|
||||
spyOn(ViewUtils, 'loadJavaScript').and.returnValue($.Deferred().reject().promise());
|
||||
promise = postXBlockRequest(requests, [
|
||||
["hash5", { mimetype: "application/javascript", kind: "url", data: missingJavaScriptUrl }]
|
||||
["xblock_spec_hash5", {
|
||||
mimetype: "application/javascript", kind: "url", data: missingJavaScriptUrl
|
||||
}]
|
||||
]);
|
||||
expect(promise.isRejected()).toBe(true);
|
||||
});
|
||||
|
||||
@@ -26,6 +26,14 @@ define(["jquery", "underscore", "backbone", "gettext", "js/utils/handle_iframe_b
|
||||
//override the constructor function
|
||||
constructor: function(options) {
|
||||
_.bindAll(this, 'beforeRender', 'render', 'afterRender');
|
||||
|
||||
// Merge passed options and view's options property and
|
||||
// attach to the view's options property
|
||||
if (this.options) {
|
||||
options = _.extend({}, _.result(this, 'options'), options);
|
||||
}
|
||||
this.options = options;
|
||||
|
||||
var _this = this;
|
||||
this.render = _.wrap(this.render, function (render, options) {
|
||||
_this.beforeRender();
|
||||
|
||||
@@ -100,8 +100,8 @@ define(['jquery', 'underscore', 'gettext', "js/views/baseview",
|
||||
};
|
||||
var roleEvents = {};
|
||||
var self = this;
|
||||
for (var i = 0; i < self.roles.length; i++) {
|
||||
var role_name = self.roles[i].key;
|
||||
for (var i = 0; i < self.options.roles.length; i++) {
|
||||
var role_name = self.options.roles[i].key;
|
||||
var role_selector = 'click .user-actions .make-' + role_name;
|
||||
|
||||
(function (role) {
|
||||
|
||||
@@ -26,7 +26,7 @@ define(["jquery", "underscore", "gettext", "js/views/baseview"],
|
||||
'click .action-cancel': 'cancel'
|
||||
},
|
||||
|
||||
options: $.extend({}, BaseView.prototype.options, {
|
||||
options: _.extend({}, BaseView.prototype.options, {
|
||||
type: 'prompt',
|
||||
closeIcon: false,
|
||||
icon: false,
|
||||
|
||||
@@ -17,9 +17,9 @@ define(['jquery', 'backbone', 'underscore', 'gettext', 'js/views/baseview',
|
||||
VerificationAccessEditor, TimedExaminationPreferenceEditor, AccessEditor;
|
||||
|
||||
CourseOutlineXBlockModal = BaseModal.extend({
|
||||
events : {
|
||||
events : _.extend({}, BaseModal.prototype.events, {
|
||||
'click .action-save': 'save'
|
||||
},
|
||||
}),
|
||||
|
||||
options: $.extend({}, BaseModal.prototype.options, {
|
||||
modalName: 'course-outline',
|
||||
@@ -32,7 +32,6 @@ define(['jquery', 'backbone', 'underscore', 'gettext', 'js/views/baseview',
|
||||
|
||||
initialize: function() {
|
||||
BaseModal.prototype.initialize.call(this);
|
||||
this.events = $.extend({}, BaseModal.prototype.events, this.events);
|
||||
this.template = this.loadTemplate('course-outline-modal');
|
||||
this.options.title = this.getTitle();
|
||||
},
|
||||
@@ -154,10 +153,10 @@ define(['jquery', 'backbone', 'underscore', 'gettext', 'js/views/baseview',
|
||||
}
|
||||
},
|
||||
|
||||
events: {
|
||||
events: _.extend({}, CourseOutlineXBlockModal.prototype.events, {
|
||||
'click .action-save': 'save',
|
||||
'click .settings-tab-button': 'handleShowTab',
|
||||
},
|
||||
'click .settings-tab-button': 'handleShowTab'
|
||||
}),
|
||||
|
||||
/**
|
||||
* Return request data.
|
||||
@@ -185,9 +184,9 @@ define(['jquery', 'backbone', 'underscore', 'gettext', 'js/views/baseview',
|
||||
|
||||
|
||||
PublishXBlockModal = CourseOutlineXBlockModal.extend({
|
||||
events : {
|
||||
events : _.extend({}, CourseOutlineXBlockModal.prototype.events, {
|
||||
'click .action-publish': 'save'
|
||||
},
|
||||
}),
|
||||
|
||||
initialize: function() {
|
||||
CourseOutlineXBlockModal.prototype.initialize.call(this);
|
||||
@@ -333,41 +332,47 @@ define(['jquery', 'backbone', 'underscore', 'gettext', 'js/views/baseview',
|
||||
templateName: 'timed-examination-preference-editor',
|
||||
className: 'edit-settings-timed-examination',
|
||||
events : {
|
||||
'change #id_not_timed': 'notTimedExam',
|
||||
'change #id_timed_exam': 'setTimedExam',
|
||||
'change #id_practice_exam': 'setPracticeExam',
|
||||
'change #id_proctored_exam': 'setProctoredExam',
|
||||
'focusout #id_time_limit': 'timeLimitFocusout'
|
||||
'change input.no_special_exam': 'notTimedExam',
|
||||
'change input.timed_exam': 'setTimedExam',
|
||||
'change input.practice_exam': 'setPracticeExam',
|
||||
'change input.proctored_exam': 'setProctoredExam',
|
||||
'focusout .field-time-limit input': 'timeLimitFocusout'
|
||||
},
|
||||
notTimedExam: function (event) {
|
||||
event.preventDefault();
|
||||
this.$('#id_time_limit_div').hide();
|
||||
this.$('.exam-review-rules-list-fields').hide();
|
||||
this.$('#id_time_limit').val('00:00');
|
||||
this.$('.exam-options').hide();
|
||||
this.$('.field-time-limit input').val('00:00');
|
||||
},
|
||||
selectSpecialExam: function (showRulesField) {
|
||||
this.$('#id_time_limit_div').show();
|
||||
if (!this.isValidTimeLimit(this.$('#id_time_limit').val())) {
|
||||
this.$('#id_time_limit').val('00:30');
|
||||
selectSpecialExam: function (showRulesField, showHideAfterDueField) {
|
||||
this.$('.exam-options').show();
|
||||
this.$('.field-time-limit').show();
|
||||
if (!this.isValidTimeLimit(this.$('.field-time-limit input').val())) {
|
||||
this.$('.field-time-limit input').val('00:30');
|
||||
}
|
||||
if (showRulesField) {
|
||||
this.$('.exam-review-rules-list-fields').show();
|
||||
this.$('.field-exam-review-rules').show();
|
||||
}
|
||||
else {
|
||||
this.$('.exam-review-rules-list-fields').hide();
|
||||
this.$('.field-exam-review-rules').hide();
|
||||
}
|
||||
if (showHideAfterDueField) {
|
||||
this.$('.field-hide-after-due').show();
|
||||
}
|
||||
else {
|
||||
this.$('.field-hide-after-due').hide();
|
||||
}
|
||||
},
|
||||
setTimedExam: function (event) {
|
||||
event.preventDefault();
|
||||
this.selectSpecialExam(false);
|
||||
this.selectSpecialExam(false, true);
|
||||
},
|
||||
setPracticeExam: function (event) {
|
||||
event.preventDefault();
|
||||
this.selectSpecialExam(false);
|
||||
this.selectSpecialExam(false, false);
|
||||
},
|
||||
setProctoredExam: function (event) {
|
||||
event.preventDefault();
|
||||
this.selectSpecialExam(true);
|
||||
this.selectSpecialExam(true, false);
|
||||
},
|
||||
timeLimitFocusout: function(event) {
|
||||
event.preventDefault();
|
||||
@@ -390,43 +395,51 @@ define(['jquery', 'backbone', 'underscore', 'gettext', 'js/views/baseview',
|
||||
this.setExamTime(this.model.get('default_time_limit_minutes'));
|
||||
|
||||
this.setReviewRules(this.model.get('exam_review_rules'));
|
||||
this.setHideAfterDue(this.model.get('hide_after_due'));
|
||||
},
|
||||
setExamType: function(is_time_limited, is_proctored_exam, is_practice_exam) {
|
||||
this.$('.field-time-limit').hide();
|
||||
this.$('.field-exam-review-rules').hide();
|
||||
this.$('.field-hide-after-due').hide();
|
||||
|
||||
if (!is_time_limited) {
|
||||
this.$("#id_not_timed").prop('checked', true);
|
||||
this.$('input.no_special_exam').prop('checked', true);
|
||||
return;
|
||||
}
|
||||
|
||||
this.$('#id_time_limit_div').show();
|
||||
this.$('.exam-review-rules-list-fields').hide();
|
||||
this.$('.field-time-limit').show();
|
||||
|
||||
if (this.options.enable_proctored_exams && is_proctored_exam) {
|
||||
if (is_practice_exam) {
|
||||
this.$('#id_practice_exam').prop('checked', true);
|
||||
this.$('input.practice_exam').prop('checked', true);
|
||||
} else {
|
||||
this.$('#id_proctored_exam').prop('checked', true);
|
||||
this.$('.exam-review-rules-list-fields').show();
|
||||
this.$('input.proctored_exam').prop('checked', true);
|
||||
this.$('.field-exam-review-rules').show();
|
||||
}
|
||||
} else {
|
||||
// Since we have an early exit at the top of the method
|
||||
// if the subsection is not time limited, then
|
||||
// here we rightfully assume that it just a timed exam
|
||||
this.$("#id_timed_exam").prop('checked', true);
|
||||
this.$('input.timed_exam').prop('checked', true);
|
||||
this.$('.field-hide-after-due').show();
|
||||
}
|
||||
},
|
||||
setExamTime: function(value) {
|
||||
var time = this.convertTimeLimitMinutesToString(value);
|
||||
this.$('#id_time_limit').val(time);
|
||||
this.$('.field-time-limit input').val(time);
|
||||
},
|
||||
setReviewRules: function (value) {
|
||||
this.$('#id_exam_review_rules').val(value);
|
||||
this.$('.field-exam-review-rules textarea').val(value);
|
||||
},
|
||||
setHideAfterDue: function(value) {
|
||||
this.$('.field-hide-after-due input').prop('checked', value);
|
||||
},
|
||||
isValidTimeLimit: function(time_limit) {
|
||||
var pattern = new RegExp('^\\d{1,2}:[0-5][0-9]$');
|
||||
return pattern.test(time_limit) && time_limit !== "00:00";
|
||||
},
|
||||
getExamTimeLimit: function () {
|
||||
return this.$('#id_time_limit').val();
|
||||
return this.$('.field-time-limit input').val();
|
||||
},
|
||||
convertTimeLimitMinutesToString: function (timeLimitMinutes) {
|
||||
var hoursStr = "" + Math.floor(timeLimitMinutes / 60);
|
||||
@@ -445,21 +458,22 @@ define(['jquery', 'backbone', 'underscore', 'gettext', 'js/views/baseview',
|
||||
var is_practice_exam;
|
||||
var is_proctored_exam;
|
||||
var time_limit = this.getExamTimeLimit();
|
||||
var exam_review_rules = this.$('#id_exam_review_rules').val();
|
||||
var exam_review_rules = this.$('.field-exam-review-rules textarea').val();
|
||||
var hide_after_due = this.$('.field-hide-after-due input').is(':checked');
|
||||
|
||||
if (this.$("#id_not_timed").is(':checked')){
|
||||
if (this.$('input.no_special_exam').is(':checked')){
|
||||
is_time_limited = false;
|
||||
is_practice_exam = false;
|
||||
is_proctored_exam = false;
|
||||
} else if (this.$("#id_timed_exam").is(':checked')){
|
||||
} else if (this.$('input.timed_exam').is(':checked')){
|
||||
is_time_limited = true;
|
||||
is_practice_exam = false;
|
||||
is_proctored_exam = false;
|
||||
} else if (this.$("#id_proctored_exam").is(':checked')){
|
||||
} else if (this.$('input.proctored_exam').is(':checked')){
|
||||
is_time_limited = true;
|
||||
is_practice_exam = false;
|
||||
is_proctored_exam = true;
|
||||
} else if (this.$("#id_practice_exam").is(':checked')){
|
||||
} else if (this.$('input.practice_exam').is(':checked')){
|
||||
is_time_limited = true;
|
||||
is_practice_exam = true;
|
||||
is_proctored_exam = true;
|
||||
@@ -470,6 +484,7 @@ define(['jquery', 'backbone', 'underscore', 'gettext', 'js/views/baseview',
|
||||
'is_practice_exam': is_practice_exam,
|
||||
'is_time_limited': is_time_limited,
|
||||
'exam_review_rules': exam_review_rules,
|
||||
'hide_after_due': hide_after_due,
|
||||
// We have to use the legacy field name
|
||||
// as the Ajax handler directly populates
|
||||
// the xBlocks fields. We will have to
|
||||
|
||||
@@ -9,10 +9,10 @@ define(["jquery", "underscore", "gettext", "js/views/modals/base_modal", "common
|
||||
"strict mode";
|
||||
|
||||
var EditXBlockModal = BaseModal.extend({
|
||||
events : {
|
||||
events: _.extend({}, BaseModal.prototype.events, {
|
||||
"click .action-save": "save",
|
||||
"click .action-modes a": "changeMode"
|
||||
},
|
||||
}),
|
||||
|
||||
options: $.extend({}, BaseModal.prototype.options, {
|
||||
modalName: 'edit-xblock',
|
||||
@@ -25,7 +25,6 @@ define(["jquery", "underscore", "gettext", "js/views/modals/base_modal", "common
|
||||
|
||||
initialize: function() {
|
||||
BaseModal.prototype.initialize.call(this);
|
||||
this.events = _.extend({}, BaseModal.prototype.events, this.events);
|
||||
this.template = this.loadTemplate('edit-xblock-modal');
|
||||
this.editorModeButtonTemplate = this.loadTemplate('editor-mode-button');
|
||||
},
|
||||
|
||||
@@ -38,7 +38,7 @@ define(['jquery', 'underscore', 'gettext', 'js/views/modals/base_modal'],
|
||||
|
||||
return this.template({
|
||||
response: this.response,
|
||||
num_errors: this.response.length,
|
||||
num_errors: this.response.length
|
||||
});
|
||||
},
|
||||
|
||||
@@ -57,7 +57,7 @@ define(['jquery', 'underscore', 'gettext', 'js/views/modals/base_modal'],
|
||||
|
||||
// hide the modal
|
||||
BaseModal.prototype.hide.call(this);
|
||||
},
|
||||
}
|
||||
});
|
||||
|
||||
return ValidationErrorModal;
|
||||
|
||||
@@ -6,12 +6,14 @@ define(["jquery", "underscore", "gettext", "js/views/pages/container", "js/views
|
||||
'use strict';
|
||||
var PagedXBlockContainerPage = XBlockContainerPage.extend({
|
||||
|
||||
events: {"click .toggle-preview-button": "toggleChildrenPreviews"},
|
||||
events: _.extend({}, XBlockContainerPage.prototype.events, {
|
||||
'click .toggle-preview-button': 'toggleChildrenPreviews'
|
||||
}),
|
||||
|
||||
defaultViewClass: PagedContainerView,
|
||||
components_on_init: false,
|
||||
|
||||
initialize: function (options){
|
||||
this.events = _.extend({}, XBlockContainerPage.prototype.events, this.events);
|
||||
initialize: function (options) {
|
||||
this.page_size = options.page_size || 10;
|
||||
this.showChildrenPreviews = options.showChildrenPreviews || true;
|
||||
XBlockContainerPage.prototype.initialize.call(this, options);
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
define(["js/views/validation", "jquery", "underscore", "gettext", "codemirror", "js/views/modals/validation_error_modal"],
|
||||
function(ValidatingView, $, _, gettext, CodeMirror, ValidationErrorModal) {
|
||||
define(["js/views/validation",
|
||||
"jquery",
|
||||
"underscore",
|
||||
"gettext",
|
||||
"codemirror",
|
||||
"js/views/modals/validation_error_modal",
|
||||
'edx-ui-toolkit/js/utils/html-utils'],
|
||||
function(ValidatingView, $, _, gettext, CodeMirror, ValidationErrorModal, HtmlUtils) {
|
||||
|
||||
var AdvancedView = ValidatingView.extend({
|
||||
error_saving : "error_saving",
|
||||
@@ -13,7 +19,9 @@ var AdvancedView = ValidatingView.extend({
|
||||
// TODO enable/disable save based on validation (currently enabled whenever there are changes)
|
||||
},
|
||||
initialize : function() {
|
||||
this.template = _.template($("#advanced_entry-tpl").text());
|
||||
this.template = HtmlUtils.template(
|
||||
$("#advanced_entry-tpl").text()
|
||||
);
|
||||
this.listenTo(this.model, 'invalid', this.handleValidationError);
|
||||
this.render();
|
||||
},
|
||||
@@ -33,7 +41,7 @@ var AdvancedView = ValidatingView.extend({
|
||||
_.each(_.sortBy(_.keys(this.model.attributes), function(key) { return self.model.get(key).display_name; }),
|
||||
function(key) {
|
||||
if (self.render_deprecated || !self.model.get(key).deprecated) {
|
||||
listEle$.append(self.renderTemplate(key, self.model.get(key)));
|
||||
HtmlUtils.append(listEle$, self.renderTemplate(key, self.model.get(key)));
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -1,4 +1,10 @@
|
||||
define(["js/views/validation", "underscore", "jquery"], function(ValidatingView, _, $) {
|
||||
define(["js/views/validation",
|
||||
'gettext',
|
||||
'edx-ui-toolkit/js/utils/string-utils',
|
||||
"edx-ui-toolkit/js/utils/html-utils",
|
||||
"underscore",
|
||||
"jquery"],
|
||||
function(ValidatingView, gettext, StringUtils, HtmlUtils, _, $) {
|
||||
|
||||
var GraderView = ValidatingView.extend({
|
||||
// Model class is CMS.Models.Settings.CourseGrader
|
||||
@@ -49,9 +55,14 @@ var GraderView = ValidatingView.extend({
|
||||
if (this.setField(event) != this.oldName && !_.isEmpty(this.oldName)) {
|
||||
// overload the error display logic
|
||||
this._cacheValidationErrors.push(event.currentTarget);
|
||||
$(event.currentTarget).parent().append(
|
||||
this.errorTemplate({message : 'For grading to work, you must change all "' + this.oldName +
|
||||
'" subsections to "' + this.model.get('type') + '".'}));
|
||||
var message = StringUtils.interpolate(
|
||||
gettext('For grading to work, you must change all {oldName} subsections to {newName}.'),
|
||||
{
|
||||
oldName: this.oldName,
|
||||
newName: this.model.get('type')
|
||||
}
|
||||
);
|
||||
HtmlUtils.append($(event.currentTarget).parent(), this.errorTemplate({message : message}));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
define(["js/views/validation", "underscore", "jquery", "jquery.ui", "js/views/settings/grader"],
|
||||
function(ValidatingView, _, $, ui, GraderView) {
|
||||
define(["js/views/validation",
|
||||
"underscore",
|
||||
"jquery",
|
||||
"jquery.ui",
|
||||
"js/views/settings/grader",
|
||||
'edx-ui-toolkit/js/utils/string-utils',
|
||||
'edx-ui-toolkit/js/utils/html-utils',
|
||||
],
|
||||
function(ValidatingView, _, $, ui, GraderView, StringUtils, HtmlUtils) {
|
||||
|
||||
var GradingView = ValidatingView.extend({
|
||||
// Model class is CMS.Models.Settings.CourseGradingPolicy
|
||||
@@ -21,13 +28,12 @@ var GradingView = ValidatingView.extend({
|
||||
initialize : function() {
|
||||
// load template for grading view
|
||||
var self = this;
|
||||
this.template = _.template($("#course_grade_policy-tpl").text());
|
||||
this.gradeCutoffTemplate = _.template('<li class="grade-specific-bar" style="width:<%= width %>%"><span class="letter-grade" contenteditable="true">' +
|
||||
'<%= descriptor %>' +
|
||||
'</span><span class="range"></span>' +
|
||||
'<% if (removable) {%><a href="#" class="remove-button">remove</a><% ;} %>' +
|
||||
'</li>');
|
||||
|
||||
this.template = HtmlUtils.template(
|
||||
$("#course_grade_policy-tpl").text()
|
||||
);
|
||||
this.gradeCutoffTemplate = HtmlUtils.template(
|
||||
$("#course_grade_cutoff-tpl").text()
|
||||
);
|
||||
this.setupCutoffs();
|
||||
|
||||
this.listenTo(this.model, 'invalid', this.handleValidationError);
|
||||
@@ -68,7 +74,7 @@ var GradingView = ValidatingView.extend({
|
||||
},
|
||||
this);
|
||||
gradeCollection.each(function(gradeModel) {
|
||||
$(gradelist).append(self.template({model : gradeModel }));
|
||||
HtmlUtils.append(gradelist, self.template({model : gradeModel }));
|
||||
var newEle = gradelist.children().last();
|
||||
var newView = new GraderView({el: newEle,
|
||||
model : gradeModel, collection : gradeCollection });
|
||||
@@ -147,7 +153,7 @@ var GradingView = ValidatingView.extend({
|
||||
gradeBarWidth : null, // cache of value since it won't change (more certain)
|
||||
|
||||
renderCutoffBar: function() {
|
||||
var gradeBar =this.$el.find('.grade-bar');
|
||||
var gradeBar = this.$el.find('.grade-bar');
|
||||
this.gradeBarWidth = gradeBar.width();
|
||||
var gradelist = gradeBar.children('.grades');
|
||||
// HACK fixing a duplicate call issue by undoing previous call effect. Need to figure out why called 2x
|
||||
@@ -156,15 +162,15 @@ var GradingView = ValidatingView.extend({
|
||||
// Can probably be simplified to one variable now.
|
||||
var removable = false;
|
||||
var draggable = false; // first and last are not removable, first is not draggable
|
||||
_.each(this.descendingCutoffs,
|
||||
function(cutoff, index) {
|
||||
var newBar = this.gradeCutoffTemplate({
|
||||
descriptor : cutoff['designation'] ,
|
||||
_.each(this.descendingCutoffs, function(cutoff) {
|
||||
HtmlUtils.append(gradelist, this.gradeCutoffTemplate({
|
||||
descriptor : cutoff.designation,
|
||||
width : nextWidth,
|
||||
removable : removable });
|
||||
gradelist.append(newBar);
|
||||
contenteditable: true,
|
||||
removable : removable})
|
||||
);
|
||||
if (draggable) {
|
||||
newBar = gradelist.children().last(); // get the dom object not the unparsed string
|
||||
var newBar = gradelist.children().last(); // get the dom object not the unparsed string
|
||||
newBar.resizable({
|
||||
handles: "e",
|
||||
containment : "parent",
|
||||
@@ -174,19 +180,18 @@ var GradingView = ValidatingView.extend({
|
||||
});
|
||||
}
|
||||
// prepare for next
|
||||
nextWidth = cutoff['cutoff'];
|
||||
nextWidth = cutoff.cutoff;
|
||||
removable = true; // first is not removable, all others are
|
||||
draggable = true;
|
||||
},
|
||||
this);
|
||||
// add fail which is not in data
|
||||
var failBar = $(this.gradeCutoffTemplate({
|
||||
// Add fail which is not in data
|
||||
HtmlUtils.append(gradelist, this.gradeCutoffTemplate({
|
||||
descriptor : this.failLabel(),
|
||||
width : nextWidth,
|
||||
contenteditable: false,
|
||||
removable : false
|
||||
}));
|
||||
failBar.find("span[contenteditable=true]").attr("contenteditable", false);
|
||||
gradelist.append(failBar);
|
||||
gradelist.children().last().resizable({
|
||||
handles: "e",
|
||||
containment : "parent",
|
||||
@@ -298,10 +303,13 @@ var GradingView = ValidatingView.extend({
|
||||
this.descendingCutoffs.push({designation: this.GRADES[gradeLength], cutoff: failBarWidth});
|
||||
this.descendingCutoffs[gradeLength - 1]['cutoff'] = Math.round(targetWidth);
|
||||
|
||||
var $newGradeBar = this.gradeCutoffTemplate({ descriptor : this.GRADES[gradeLength],
|
||||
width : targetWidth, removable : true });
|
||||
var newGradeHtml = this.gradeCutoffTemplate({
|
||||
descriptor : this.GRADES[gradeLength],
|
||||
width : targetWidth,
|
||||
contenteditable: true,
|
||||
removable : true });
|
||||
var gradeDom = this.$el.find('.grades');
|
||||
gradeDom.children().last().before($newGradeBar);
|
||||
gradeDom.children().last().before(HtmlUtils.ensureHtml(newGradeHtml).toString());
|
||||
var newEle = gradeDom.children()[gradeLength];
|
||||
$(newEle).resizable({
|
||||
handles: "e",
|
||||
@@ -313,8 +321,8 @@ var GradingView = ValidatingView.extend({
|
||||
|
||||
// Munge existing grade labels?
|
||||
// If going from Pass/Fail to 3 levels, change to Pass to A
|
||||
if (gradeLength === 1 && this.descendingCutoffs[0]['designation'] === 'Pass') {
|
||||
this.descendingCutoffs[0]['designation'] = this.GRADES[0];
|
||||
if (gradeLength === 1 && this.descendingCutoffs[0].designation === 'Pass') {
|
||||
this.descendingCutoffs[0].designation = this.GRADES[0];
|
||||
this.setTopGradeLabel();
|
||||
}
|
||||
this.setFailLabel();
|
||||
@@ -349,10 +357,10 @@ var GradingView = ValidatingView.extend({
|
||||
else return 'F';
|
||||
},
|
||||
setFailLabel: function() {
|
||||
this.$el.find('.grades .letter-grade').last().html(this.failLabel());
|
||||
this.$el.find('.grades .letter-grade').last().text(this.failLabel());
|
||||
},
|
||||
setTopGradeLabel: function() {
|
||||
this.$el.find('.grades .letter-grade').first().html(this.descendingCutoffs[0]['designation']);
|
||||
this.$el.find('.grades .letter-grade').first().text(this.descendingCutoffs[0].designation);
|
||||
},
|
||||
setupCutoffs: function() {
|
||||
// Instrument grading scale
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
define(["jquery", "underscore", "gettext", "js/views/modals/base_modal", "jquery.form"],
|
||||
function($, _, gettext, BaseModal) {
|
||||
var UploadDialog = BaseModal.extend({
|
||||
events: {
|
||||
events: _.extend({}, BaseModal.prototype.events, {
|
||||
"change input[type=file]": "selectFile",
|
||||
"click .action-upload": "upload"
|
||||
},
|
||||
}),
|
||||
|
||||
options: $.extend({}, BaseModal.prototype.options, {
|
||||
modalName: 'assetupload',
|
||||
@@ -15,7 +15,6 @@ define(["jquery", "underscore", "gettext", "js/views/modals/base_modal", "jquery
|
||||
|
||||
initialize: function() {
|
||||
BaseModal.prototype.initialize.call(this);
|
||||
this.events = _.extend({}, BaseModal.prototype.events, this.events);
|
||||
this.template = this.loadTemplate("upload-dialog");
|
||||
this.listenTo(this.model, "change", this.renderContents);
|
||||
this.options.title = this.model.get('title');
|
||||
|
||||
@@ -1,5 +1,13 @@
|
||||
define(["js/views/baseview", "underscore", "jquery", "gettext", "common/js/components/views/feedback_notification", "common/js/components/views/feedback_alert", "js/views/baseview", "jquery.smoothScroll"],
|
||||
function(BaseView, _, $, gettext, NotificationView, AlertView) {
|
||||
define(["edx-ui-toolkit/js/utils/html-utils",
|
||||
"js/views/baseview",
|
||||
"underscore",
|
||||
"jquery",
|
||||
"gettext",
|
||||
"common/js/components/views/feedback_notification",
|
||||
"common/js/components/views/feedback_alert",
|
||||
"js/views/baseview",
|
||||
"jquery.smoothScroll"],
|
||||
function(HtmlUtils, BaseView, _, $, gettext, NotificationView, AlertView) {
|
||||
|
||||
var ValidatingView = BaseView.extend({
|
||||
// Intended as an abstract class which catches validation errors on the model and
|
||||
@@ -10,7 +18,7 @@ var ValidatingView = BaseView.extend({
|
||||
this.selectorToField = _.invert(this.fieldToSelectorMap);
|
||||
},
|
||||
|
||||
errorTemplate : _.template('<span class="message-error"><%= message %></span>'),
|
||||
errorTemplate : HtmlUtils.template('<span class="message-error"><%- message %></span>'),
|
||||
|
||||
save_title: gettext("You've made some changes"),
|
||||
save_message: gettext("Your changes will not take effect until you save your progress."),
|
||||
@@ -34,7 +42,7 @@ var ValidatingView = BaseView.extend({
|
||||
var ele = this.$el.find('#' + this.fieldToSelectorMap[field]);
|
||||
this._cacheValidationErrors.push(ele);
|
||||
this.getInputElements(ele).addClass('error');
|
||||
$(ele).parent().append(this.errorTemplate({message : error[field]}));
|
||||
HtmlUtils.append($(ele).parent(), this.errorTemplate({message : error[field]}));
|
||||
}
|
||||
$('.wrapper-notification-warning').addClass('wrapper-notification-warning-w-errors');
|
||||
$('.action-save').addClass('is-disabled');
|
||||
@@ -60,7 +68,7 @@ var ValidatingView = BaseView.extend({
|
||||
// Set model field and return the new value.
|
||||
this.clearValidationErrors();
|
||||
var field = this.selectorToField[event.currentTarget.id];
|
||||
var newVal = ''
|
||||
var newVal = '';
|
||||
if(event.currentTarget.type == 'checkbox'){
|
||||
newVal = $(event.currentTarget).is(":checked").toString();
|
||||
}else{
|
||||
|
||||
@@ -17,11 +17,11 @@ function($, Backbone, _, Utils) {
|
||||
|
||||
uploadTpl: '#file-upload',
|
||||
|
||||
initialize: function () {
|
||||
initialize: function (options) {
|
||||
_.bindAll(this,
|
||||
'changeHandler', 'clickHandler', 'xhrResetProgressBar', 'xhrProgressHandler', 'xhrCompleteHandler'
|
||||
);
|
||||
|
||||
this.options = _.extend({}, options);
|
||||
this.file = false;
|
||||
this.render();
|
||||
},
|
||||
|
||||
@@ -28,11 +28,13 @@ function($, Backbone, _, Utils, FileUploader, gettext) {
|
||||
choose: '#transcripts-choose'
|
||||
},
|
||||
|
||||
initialize: function () {
|
||||
initialize: function (options) {
|
||||
_.bindAll(this,
|
||||
'importHandler', 'replaceHandler', 'chooseHandler', 'useExistingHandler', 'showError', 'hideError'
|
||||
);
|
||||
|
||||
this.options = _.extend({}, options);
|
||||
|
||||
this.component_locator = this.$el.closest('[data-locator]').data('locator');
|
||||
|
||||
this.fileUploader = new FileUploader({
|
||||
|
||||
@@ -25,9 +25,10 @@ function($, Backbone, _, AbstractEditor, Utils, MessageManager) {
|
||||
'youtube': 'http://youtube.com/'
|
||||
},
|
||||
|
||||
initialize: function () {
|
||||
initialize: function (options) {
|
||||
// Initialize MessageManager that is responsible for
|
||||
// status messages and errors.
|
||||
this.options = _.extend({}, options);
|
||||
var Messenger = this.options.MessageManager || MessageManager;
|
||||
|
||||
this.messenger = new Messenger({
|
||||
|
||||
@@ -37,7 +37,7 @@ lib_paths:
|
||||
- xmodule_js/common_static/js/vendor/jquery.simulate.js
|
||||
- xmodule_js/common_static/common/js/vendor/underscore.js
|
||||
- xmodule_js/common_static/common/js/vendor/underscore.string.js
|
||||
- xmodule_js/common_static/js/vendor/backbone-min.js
|
||||
- xmodule_js/common_static/common/js/vendor/backbone.js
|
||||
- xmodule_js/common_static/js/vendor/backbone-associations-min.js
|
||||
- xmodule_js/common_static/js/vendor/backbone.paginator.min.js
|
||||
- xmodule_js/common_static/js/vendor/backbone-relational.min.js
|
||||
|
||||
@@ -36,7 +36,7 @@ lib_paths:
|
||||
- xmodule_js/common_static/js/vendor/jquery.cookie.js
|
||||
- xmodule_js/common_static/common/js/vendor/underscore.js
|
||||
- xmodule_js/common_static/common/js/vendor/underscore.string.js
|
||||
- xmodule_js/common_static/js/vendor/backbone-min.js
|
||||
- xmodule_js/common_static/common/js/vendor/backbone.js
|
||||
- xmodule_js/common_static/js/vendor/backbone-associations-min.js
|
||||
- xmodule_js/common_static/js/vendor/backbone.paginator.min.js
|
||||
- xmodule_js/common_static/js/vendor/timepicker/jquery.timepicker.js
|
||||
|
||||
@@ -35,7 +35,7 @@ var libraryFiles = [
|
||||
{pattern: 'xmodule_js/common_static/js/vendor/jquery.simulate.js', included: false},
|
||||
{pattern: 'xmodule_js/common_static/common/js/vendor/underscore.js', included: false},
|
||||
{pattern: 'xmodule_js/common_static/common/js/vendor/underscore.string.js', included: false},
|
||||
{pattern: 'xmodule_js/common_static/js/vendor/backbone-min.js', included: false},
|
||||
{pattern: 'xmodule_js/common_static/common/js/vendor/backbone.js', included: false},
|
||||
{pattern: 'xmodule_js/common_static/js/vendor/backbone-associations-min.js', included: false},
|
||||
{pattern: 'xmodule_js/common_static/js/vendor/backbone.paginator.min.js', included: false},
|
||||
{pattern: 'xmodule_js/common_static/js/vendor/backbone-relational.min.js', included: false},
|
||||
@@ -82,7 +82,9 @@ var libraryFiles = [
|
||||
{pattern: 'edx-pattern-library/js/afontgarde.js', included: false},
|
||||
{pattern: 'edx-pattern-library/js/edx-icons.js', included: false},
|
||||
{pattern: 'edx-pattern-library/js/**/*.js', included: false},
|
||||
{pattern: 'edx-ui-toolkit/js/**/*.js', included: false}
|
||||
{pattern: 'edx-ui-toolkit/js/**/*.js', included: false},
|
||||
|
||||
{pattern: 'common/js/utils/require-serial.js', included: true}
|
||||
];
|
||||
|
||||
// Paths to source JavaScript files
|
||||
|
||||
@@ -35,7 +35,7 @@ var libraryFiles = [
|
||||
{pattern: 'xmodule_js/common_static/js/vendor/jquery.cookie.js', included: false},
|
||||
{pattern: 'xmodule_js/common_static/common/js/vendor/underscore.js', included: false},
|
||||
{pattern: 'xmodule_js/common_static/common/js/vendor/underscore.string.js', included: false},
|
||||
{pattern: 'xmodule_js/common_static/js/vendor/backbone-min.js', included: false},
|
||||
{pattern: 'xmodule_js/common_static/common/js/vendor/backbone.js', included: false},
|
||||
{pattern: 'xmodule_js/common_static/js/vendor/backbone-associations-min.js', included: false},
|
||||
{pattern: 'xmodule_js/common_static/js/vendor/backbone.paginator.min.js', included: false},
|
||||
{pattern: 'xmodule_js/common_static/js/vendor/timepicker/jquery.timepicker.js', included: false},
|
||||
@@ -68,7 +68,8 @@ var libraryFiles = [
|
||||
pattern: 'xmodule_js/common_static/js/vendor/jQuery-File-Upload/js/jquery.fileupload-validate.js',
|
||||
included: false
|
||||
},
|
||||
{pattern: 'xmodule_js/common_static/js/vendor/requirejs/text.js', included: false}
|
||||
{pattern: 'xmodule_js/common_static/js/vendor/requirejs/text.js', included: false},
|
||||
{pattern: 'common/js/utils/require-serial.js', included: true}
|
||||
];
|
||||
|
||||
// Paths to source JavaScript files
|
||||
|
||||
@@ -564,7 +564,7 @@
|
||||
}
|
||||
.list-fields {
|
||||
.field-message {
|
||||
color: $gray;
|
||||
color: $gray-d1;
|
||||
font-size: ($baseline/2);
|
||||
}
|
||||
.field {
|
||||
|
||||
@@ -303,7 +303,7 @@ $outline-indent-width: $baseline;
|
||||
%outline-item-status {
|
||||
@extend %t-copy-sub2;
|
||||
@extend %t-strong;
|
||||
color: $color-copy-base;
|
||||
color: $gray-d1;
|
||||
|
||||
.icon {
|
||||
@extend %t-icon5;
|
||||
@@ -576,12 +576,16 @@ $outline-indent-width: $baseline;
|
||||
> .subsection-status .status-timed-proctored-exam {
|
||||
opacity: 1.0;
|
||||
}
|
||||
|
||||
> .subsection-status .status-hide-after-due {
|
||||
opacity: 1.0;
|
||||
}
|
||||
}
|
||||
|
||||
// status - grading
|
||||
.status-grading, .status-timed-proctored-exam {
|
||||
.status-grading, .status-timed-proctored-exam, .status-hide-after-due {
|
||||
@include transition(opacity $tmg-f2 ease-in-out 0s);
|
||||
opacity: 0.65;
|
||||
opacity: 0.75;
|
||||
}
|
||||
|
||||
.status-grading-value, .status-proctored-exam-value {
|
||||
|
||||
@@ -54,7 +54,7 @@ from openedx.core.djangolib.js_utils import (
|
||||
<body class="${static.dir_rtl()} <%block name='bodyclass'></%block> lang_${LANGUAGE_CODE}">
|
||||
<%block name="view_notes"></%block>
|
||||
|
||||
<a class="nav-skip" href="#content">${_("Skip to main content")}</a>
|
||||
<a class="nav-skip" href="#main">${_("Skip to main content")}</a>
|
||||
|
||||
<script type="text/javascript">
|
||||
window.baseUrl = "${settings.STATIC_URL | n, js_escaped_string}";
|
||||
@@ -72,9 +72,11 @@ from openedx.core.djangolib.js_utils import (
|
||||
<%block name="page_alert"></%block>
|
||||
</div>
|
||||
|
||||
<div id="content" tabindex="-1">
|
||||
<%block name="content"></%block>
|
||||
</div>
|
||||
<main id="main" aria-label="Content" tabindex="-1">
|
||||
<div id="content">
|
||||
<%block name="content"></%block>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
% if user.is_authenticated():
|
||||
<%include file="widgets/sock.html" args="online_help_token=online_help_token" />
|
||||
|
||||
@@ -22,7 +22,7 @@ from openedx.core.djangolib.js_utils import js_escaped_string
|
||||
</%block>
|
||||
|
||||
<%block name="content">
|
||||
<div id="content" tabindex="-1">
|
||||
<div id="content">
|
||||
<div class="wrapper-mast wrapper">
|
||||
<header class="mast mast-wizard has-actions">
|
||||
<h1 class="page-header">
|
||||
|
||||
@@ -67,96 +67,96 @@ if (is_proctored_exam) {
|
||||
}
|
||||
%>
|
||||
<% if (parentInfo) { %>
|
||||
<li class="outline-item outline-<%= xblockType %> <%= visibilityClass %> is-draggable <%= includesChildren ? 'is-collapsible' : '' %> <%= isCollapsed ? 'is-collapsed' : '' %>"
|
||||
data-parent="<%= parentInfo.get('id') %>" data-locator="<%= xblockInfo.get('id') %>">
|
||||
<li class="outline-item outline-<%- xblockType %> <%- visibilityClass %> is-draggable <%- includesChildren ? 'is-collapsible' : '' %> <%- isCollapsed ? 'is-collapsed' : '' %>"
|
||||
data-parent="<%- parentInfo.get('id') %>" data-locator="<%- xblockInfo.get('id') %>">
|
||||
|
||||
<span class="draggable-drop-indicator draggable-drop-indicator-before"><i class="icon fa fa-caret-right"></i></span>
|
||||
<% if (xblockInfo.isHeaderVisible()) { %>
|
||||
<div class="<%= xblockType %>-header">
|
||||
<div class="<%- xblockType %>-header">
|
||||
<% if (includesChildren) { %>
|
||||
<h3 class="<%= xblockType %>-header-details expand-collapse <%= isCollapsed ? 'expand' : 'collapse' %> ui-toggle-expansion"
|
||||
title="<%= interpolate(
|
||||
<h3 class="<%- xblockType %>-header-details expand-collapse <%- isCollapsed ? 'expand' : 'collapse' %> ui-toggle-expansion"
|
||||
title="<%- interpolate(
|
||||
gettext('Collapse/Expand this %(xblock_type)s'), { xblock_type: xblockTypeDisplayName }, true
|
||||
) %>"
|
||||
>
|
||||
<i class="icon fa fa-caret-down"></i>
|
||||
<% } else { %>
|
||||
<h3 class="<%= xblockType %>-header-details">
|
||||
<h3 class="<%- xblockType %>-header-details">
|
||||
<% } %>
|
||||
<% if (xblockInfo.isVertical()) { %>
|
||||
<span class="unit-title item-title">
|
||||
<a href="<%= xblockInfo.get('studio_url') %>"><%- xblockInfo.get('display_name') %></a>
|
||||
<a href="<%- xblockInfo.get('studio_url') %>"><%- xblockInfo.get('display_name') %></a>
|
||||
</span>
|
||||
<% } else { %>
|
||||
<span class="wrapper-<%= xblockType %>-title wrapper-xblock-field incontext-editor is-editable" data-field="display_name" data-field-display-name="<%= gettext("Display Name") %>">
|
||||
<span class="<%= xblockType %>-title item-title xblock-field-value incontext-editor-value"><%- xblockInfo.get('display_name') %></span>
|
||||
<span class="wrapper-<%- xblockType %>-title wrapper-xblock-field incontext-editor is-editable" data-field="display_name" data-field-display-name="<%- gettext("Display Name") %>">
|
||||
<span class="<%- xblockType %>-title item-title xblock-field-value incontext-editor-value"><%- xblockInfo.get('display_name') %></span>
|
||||
</span>
|
||||
<% } %>
|
||||
</h3>
|
||||
|
||||
<div class="<%= xblockType %>-header-actions">
|
||||
<div class="<%- xblockType %>-header-actions">
|
||||
<ul class="actions-list">
|
||||
<% if (xblockInfo.isPublishable()) { %>
|
||||
<li class="action-item action-publish">
|
||||
<a href="#" data-tooltip="<%= gettext('Publish') %>" class="publish-button action-button">
|
||||
<a href="#" data-tooltip="<%- gettext('Publish') %>" class="publish-button action-button">
|
||||
<i class="icon fa fa-upload"></i>
|
||||
<span class="sr action-button-text"><%= gettext('Publish') %></span>
|
||||
<span class="sr action-button-text"><%- gettext('Publish') %></span>
|
||||
</a>
|
||||
</li>
|
||||
<% } %>
|
||||
<% if (xblockInfo.isEditableOnCourseOutline()) { %>
|
||||
<li class="action-item action-configure">
|
||||
<a href="#" data-tooltip="<%= gettext('Configure') %>" class="configure-button action-button">
|
||||
<a href="#" data-tooltip="<%- gettext('Configure') %>" class="configure-button action-button">
|
||||
<i class="icon fa fa-gear"></i>
|
||||
<span class="sr action-button-text"><%= gettext('Configure') %></span>
|
||||
<span class="sr action-button-text"><%- gettext('Configure') %></span>
|
||||
</a>
|
||||
</li>
|
||||
<% } %>
|
||||
<% if (xblockInfo.isDeletable()) { %>
|
||||
<li class="action-item action-delete">
|
||||
<a href="#" data-tooltip="<%= gettext('Delete') %>" class="delete-button action-button">
|
||||
<a href="#" data-tooltip="<%- gettext('Delete') %>" class="delete-button action-button">
|
||||
<i class="icon fa fa-trash-o" aria-hidden="true"></i>
|
||||
<span class="sr action-button-text"><%= gettext('Delete') %></span>
|
||||
<span class="sr action-button-text"><%- gettext('Delete') %></span>
|
||||
</a>
|
||||
</li>
|
||||
<% } %>
|
||||
<% if (xblockInfo.isDraggable()) { %>
|
||||
<li class="action-item action-drag">
|
||||
<span data-tooltip="<%= gettext('Drag to reorder') %>"
|
||||
class="drag-handle <%= xblockType %>-drag-handle action">
|
||||
<span class="sr"><%= gettext('Drag to reorder') %></span>
|
||||
<span data-tooltip="<%- gettext('Drag to reorder') %>"
|
||||
class="drag-handle <%- xblockType %>-drag-handle action">
|
||||
<span class="sr"><%- gettext('Drag to reorder') %></span>
|
||||
</span>
|
||||
</li>
|
||||
<% } %>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="<%= xblockType %>-status">
|
||||
<div class="<%- xblockType %>-status">
|
||||
<% if (!xblockInfo.isVertical()) { %>
|
||||
<% if (xblockInfo.get('explanatory_message') !=null) { %>
|
||||
<div class="explanatory-message">
|
||||
<span>
|
||||
<%= xblockInfo.get('explanatory_message') %>
|
||||
<%- xblockInfo.get('explanatory_message') %>
|
||||
</span>
|
||||
</div>
|
||||
<% } else { %>
|
||||
<div class="status-release">
|
||||
<p>
|
||||
<span class="sr status-release-label"><%= gettext('Release Status:') %></span>
|
||||
<span class="sr status-release-label"><%- gettext('Release Status:') %></span>
|
||||
<span class="status-release-value">
|
||||
<% if (!course.get('self_paced')) { %>
|
||||
<% if (xblockInfo.get('released_to_students')) { %>
|
||||
<i class="icon fa fa-check-square-o"></i>
|
||||
<%= gettext('Released:') %>
|
||||
<i class="icon fa fa-check"></i>
|
||||
<%- gettext('Released:') %>
|
||||
<% } else if (xblockInfo.get('release_date')) { %>
|
||||
<i class="icon fa fa-clock-o"></i>
|
||||
<%= gettext('Scheduled:') %>
|
||||
<%- gettext('Scheduled:') %>
|
||||
<% } else { %>
|
||||
<i class="icon fa fa-clock-o"></i>
|
||||
<%= gettext('Unscheduled') %>
|
||||
<%- gettext('Unscheduled') %>
|
||||
<% } %>
|
||||
<% if (xblockInfo.get('release_date')) { %>
|
||||
<%= xblockInfo.get('release_date') %>
|
||||
<%- xblockInfo.get('release_date') %>
|
||||
<% } %>
|
||||
<% } %>
|
||||
</span>
|
||||
@@ -166,25 +166,36 @@ if (is_proctored_exam) {
|
||||
<% if (xblockInfo.get('is_time_limited')) { %>
|
||||
<div class="status-timed-proctored-exam">
|
||||
<p>
|
||||
<span class="sr status-grading-label"> <%= gettext('Graded as:') %> </span>
|
||||
<span class="sr status-grading-label"> <%- gettext('Graded as:') %> </span>
|
||||
<i class="icon fa fa-check"></i>
|
||||
<span class="status-grading-value"> <%= gradingType %> </span>
|
||||
<span class="status-grading-value"> <%- gradingType %> </span>
|
||||
-
|
||||
<span class="sr status-proctored-exam-label"> <%- exam_value %> </span>
|
||||
<span class="status-proctored-exam-value"> <%- exam_value %> </span>
|
||||
<% if (xblockInfo.get('due_date')) { %>
|
||||
<span class="status-grading-date"> <%= gettext('Due:') %> <%= xblockInfo.get('due_date') %> </span>
|
||||
<span class="status-grading-date"> <%- gettext('Due:') %> <%- xblockInfo.get('due_date') %> </span>
|
||||
<% } %>
|
||||
</p>
|
||||
</div>
|
||||
<div class="status-hide-after-due">
|
||||
<p>
|
||||
<% if (!is_proctored_exam && xblockInfo.get('hide_after_due')) { %>
|
||||
<i class="icon fa fa-eye-slash"></i>
|
||||
<span class="status-hide-after-due-value"> <%- gettext("Exam will remain hidden after due date") %> </span>
|
||||
<% } else { %>
|
||||
<i class="icon fa fa-eye"></i>
|
||||
<span class="status-hide-after-due-value"> <%- gettext("Exam will be visible after due date") %> </span>
|
||||
<% } %>
|
||||
</p>
|
||||
</div>
|
||||
<% } else if (xblockInfo.get('due_date') || xblockInfo.get('graded')) { %>
|
||||
<div class="status-grading">
|
||||
<p>
|
||||
<span class="sr status-grading-label"> <%= gettext('Graded as:') %> </span>
|
||||
<span class="sr status-grading-label"> <%- gettext('Graded as:') %> </span>
|
||||
<i class="icon fa fa-check"></i>
|
||||
<span class="status-grading-value"> <%= gradingType %> </span>
|
||||
<span class="status-grading-value"> <%- gradingType %> </span>
|
||||
<% if (xblockInfo.get('due_date') && !course.get('self_paced')) { %>
|
||||
<span class="status-grading-date"> <%= gettext('Due:') %> <%= xblockInfo.get('due_date') %> </span>
|
||||
<span class="status-grading-date"> <%- gettext('Due:') %> <%- xblockInfo.get('due_date') %> </span>
|
||||
<% } %>
|
||||
</p>
|
||||
</div>
|
||||
@@ -192,7 +203,7 @@ if (is_proctored_exam) {
|
||||
<% } %>
|
||||
<% if (statusMessage) { %>
|
||||
<div class="status-message">
|
||||
<i class="icon fa <%= statusIconClass %>"></i>
|
||||
<i class="icon fa <%- statusIconClass %>"></i>
|
||||
<p class="status-message-copy"><%- statusMessage %></p>
|
||||
</div>
|
||||
<% } %>
|
||||
@@ -202,20 +213,20 @@ if (is_proctored_exam) {
|
||||
|
||||
<% if (!parentInfo && xblockInfo.get('child_info') && xblockInfo.get('child_info').children.length === 0) { %>
|
||||
<div class="no-content add-section">
|
||||
<p><%= gettext("You haven't added any content to this course yet.") %>
|
||||
<a href="#" class="button button-new" data-category="<%= childCategory %>"
|
||||
data-parent="<%= xblockInfo.get('id') %>" data-default-name="<%= defaultNewChildName %>"
|
||||
title="<%= interpolate(
|
||||
<p><%- gettext("You haven't added any content to this course yet.") %>
|
||||
<a href="#" class="button button-new" data-category="<%- childCategory %>"
|
||||
data-parent="<%- xblockInfo.get('id') %>" data-default-name="<%- defaultNewChildName %>"
|
||||
title="<%- interpolate(
|
||||
gettext('Click to add a new %(xblock_type)s'), { xblock_type: defaultNewChildName }, true
|
||||
) %>"
|
||||
>
|
||||
<i class="icon fa fa-plus"></i><%= addChildLabel %>
|
||||
<i class="icon fa fa-plus"></i><%- addChildLabel %>
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
<% } else if (!xblockInfo.isVertical()) { %>
|
||||
<div class="outline-content <%= xblockType %>-content">
|
||||
<ol class="<%= typeListClass %> is-sortable">
|
||||
<div class="outline-content <%- xblockType %>-content">
|
||||
<ol class="<%- typeListClass %> is-sortable">
|
||||
<li class="ui-splint ui-splint-indicator">
|
||||
<span class="draggable-drop-indicator draggable-drop-indicator-initial"><i class="icon fa fa-caret-right"></i></span>
|
||||
</li>
|
||||
@@ -223,14 +234,14 @@ if (is_proctored_exam) {
|
||||
|
||||
<% if (childType) { %>
|
||||
<% if (xblockInfo.isChildAddable()) { %>
|
||||
<div class="add-<%= childType %> add-item">
|
||||
<a href="#" class="button button-new" data-category="<%= childCategory %>"
|
||||
data-parent="<%= xblockInfo.get('id') %>" data-default-name="<%= defaultNewChildName %>"
|
||||
title="<%= interpolate(
|
||||
<div class="add-<%- childType %> add-item">
|
||||
<a href="#" class="button button-new" data-category="<%- childCategory %>"
|
||||
data-parent="<%- xblockInfo.get('id') %>" data-default-name="<%- defaultNewChildName %>"
|
||||
title="<%- interpolate(
|
||||
gettext('Click to add a new %(xblock_type)s'), { xblock_type: defaultNewChildName }, true
|
||||
) %>"
|
||||
>
|
||||
<i class="icon fa fa-plus"></i><%= addChildLabel %>
|
||||
<i class="icon fa fa-plus"></i><%- addChildLabel %>
|
||||
</a>
|
||||
</div>
|
||||
<% } %>
|
||||
|
||||
5
cms/templates/js/course_grade_cutoff.underscore
Normal file
5
cms/templates/js/course_grade_cutoff.underscore
Normal file
@@ -0,0 +1,5 @@
|
||||
<li class="grade-specific-bar" style="width:<%- width %>%">
|
||||
<span class="letter-grade" contenteditable="<%- contenteditable %>"><%- descriptor %></span>
|
||||
<span class="range"></span>
|
||||
<% if (removable) {%><a href="#" class="remove-button">remove</a><% ;} %>
|
||||
</li>
|
||||
@@ -1,73 +1,65 @@
|
||||
<form>
|
||||
<h3 class="modal-section-title"><%= gettext('Set as a Special Exam') %></h3>
|
||||
<div class="modal-section-content has-actions">
|
||||
<div class='exam-time-list-fields'>
|
||||
<ul class="list-fields list-input">
|
||||
<li class="field-radio">
|
||||
<input type="radio" id="id_not_timed" name="proctored" class="input input-radio" checked="checked"/>
|
||||
<label for="id_not_timed" class="label">
|
||||
<%- gettext('None') %>
|
||||
</label>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class='exam-time-list-fields'>
|
||||
<ul class="list-fields list-input">
|
||||
<li class="field-radio">
|
||||
<input type="radio" id="id_timed_exam" name="proctored" class="input input-radio" />
|
||||
<label for="id_timed_exam" class="label" aria-describedby="timed-exam-description">
|
||||
<%- gettext('Timed') %>
|
||||
</label>
|
||||
</li>
|
||||
<ul class="list-fields list-input exam-types" role="group" aria-label="<%- gettext('Exam Types') %>">
|
||||
<li class="field-radio">
|
||||
<label class="label">
|
||||
<input type="radio" name="exam_type" class="input input-radio no_special_exam" checked="checked"/>
|
||||
<%- gettext('None') %>
|
||||
</label>
|
||||
</li>
|
||||
<li class="field-radio">
|
||||
<label class="label">
|
||||
<input type="radio" name="exam_type" class="input input-radio timed_exam"
|
||||
aria-describedby="timed-exam-description" />
|
||||
<%- gettext('Timed') %>
|
||||
</label>
|
||||
<p class='field-message' id='timed-exam-description'> <%- gettext('Use a timed exam to limit the time learners can spend on problems in this subsection. Learners must submit answers before the time expires. You can allow additional time for individual learners through the Instructor Dashboard.') %> </p>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
<% if (enable_proctored_exam) { %>
|
||||
<div class='exam-time-list-fields'>
|
||||
<ul class="list-fields list-input">
|
||||
<li class="field-radio">
|
||||
<input type="radio" id="id_proctored_exam" name="proctored" class="input input-radio" />
|
||||
<label for="id_proctored_exam" class="label" aria-describedby="proctored-exam-description">
|
||||
<%- gettext('Proctored') %>
|
||||
</label>
|
||||
</li>
|
||||
</li>
|
||||
<% if (enable_proctored_exam) { %>
|
||||
<li class="field-radio">
|
||||
<label class="label">
|
||||
<input type="radio" name="exam_type" class="input input-radio proctored_exam"
|
||||
aria-describedby="proctored-exam-description" />
|
||||
<%- gettext('Proctored') %>
|
||||
</label>
|
||||
<p class='field-message' id='proctored-exam-description'> <%- gettext('Proctored exams are timed and they record video of each learner taking the exam. The videos are then reviewed to ensure that learners follow all examination rules.') %> </p>
|
||||
</ul>
|
||||
</div>
|
||||
<div class='exam-time-list-fields'>
|
||||
<ul class="list-fields list-input">
|
||||
<li class="field-radio">
|
||||
<input type="radio" id="id_practice_exam" name="proctored" class="input input-radio" />
|
||||
<label for="id_practice_exam" class="label" aria-describedby="practice-exam-description">
|
||||
<%- gettext('Practice Proctored') %>
|
||||
</label>
|
||||
</li>
|
||||
</li>
|
||||
<li class="field-radio">
|
||||
<label class="label">
|
||||
<input type="radio" name="exam_type" class="input input-radio practice_exam"
|
||||
aria-describedby="practice-exam-description"/>
|
||||
<%- gettext('Practice Proctored') %>
|
||||
</label>
|
||||
<p class='field-message' id='practice-exam-description'> <%- gettext("Use a practice proctored exam to introduce learners to the proctoring tools and processes. Results of a practice exam do not affect a learner's grade.") %> </p>
|
||||
</ul>
|
||||
</div>
|
||||
<% } %>
|
||||
<div class='exam-time-list-fields is-hidden' id='id_time_limit_div'>
|
||||
<ul class="list-fields list-input time-limit">
|
||||
<li class="field field-text field-time-limit">
|
||||
<label for="id_time_limit" class="label"><%- gettext('Time Allotted (HH:MM):') %> </label>
|
||||
<input type="text" id="id_time_limit" name="time_limit"
|
||||
value="" aria-describedby="time-limit-description"
|
||||
placeholder="HH:MM" class="time_limit release-time time input input-text" autocomplete="off" />
|
||||
</li>
|
||||
<% } %>
|
||||
</ul>
|
||||
<ul class="list-fields list-input exam-options">
|
||||
<li class="field field-text field-time-limit">
|
||||
<label class="label">
|
||||
<%- gettext('Time Allotted (HH:MM):') %>
|
||||
<input type="text" value="" aria-describedby="time-limit-description" placeholder="HH:MM"
|
||||
class="time_limit release-time time input input-text" autocomplete="off" />
|
||||
</label>
|
||||
<p class='field-message' id='time-limit-description'><%- gettext('Select a time allotment for the exam. If it is over 24 hours, type in the amount of time. You can grant individual learners extra time to complete the exam through the Instructor Dashboard.') %></p>
|
||||
</ul>
|
||||
</div>
|
||||
<div class='exam-review-rules-list-fields is-hidden'>
|
||||
<ul class="list-fields list-input exam-review-rules">
|
||||
<li class="field field-text field-exam-review-rules">
|
||||
<label for="id_exam_review_rules" class="label"><%- gettext('Review Rules') %> </label>
|
||||
<textarea id="id_exam_review_rules" cols="50" maxlength="255" name="review_rules" aria-describedby="review-rules-description"
|
||||
</li>
|
||||
<li class="field field-text field-exam-review-rules">
|
||||
<label class="label">
|
||||
<%- gettext('Review Rules') %>
|
||||
<textarea cols="50" maxlength="255" aria-describedby="review-rules-description"
|
||||
class="review-rules input input-text" autocomplete="off" />
|
||||
</li>
|
||||
</label>
|
||||
<p class='field-message' id='review-rules-description'><%- gettext('Specify any additional rules or rule exceptions that the proctoring review team should enforce when reviewing the videos. For example, you could specify that calculators are allowed.') %></p>
|
||||
</ul>
|
||||
</div>
|
||||
</li>
|
||||
<li class="field-checkbox field-hide-after-due">
|
||||
<label class="label">
|
||||
<input type="checkbox" class="input input-checkbox"
|
||||
aria-describedby="hide-after-due-description"/>
|
||||
<%- gettext('Hide Exam After Due Date') %>
|
||||
</label>
|
||||
<p class='field-message' id='hide-after-due-description'><%- gettext('By default, submitted exams are available for review after the due date has passed. Select this option to keep exams hidden after that date.') %></p>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
%>
|
||||
|
||||
<%block name="header_extras">
|
||||
% for template_name in ["course_grade_policy"]:
|
||||
% for template_name in ["course_grade_policy", "course_grade_cutoff"]:
|
||||
<script type="text/template" id="${template_name}-tpl">
|
||||
<%static:include path="js/${template_name}.underscore" />
|
||||
</script>
|
||||
|
||||
@@ -1,706 +0,0 @@
|
||||
<%inherit file="../../base.html" />
|
||||
|
||||
<%block name="view_notes">
|
||||
<%include file="_note-usage.html" />
|
||||
</%block>
|
||||
|
||||
<%!
|
||||
import logging
|
||||
from util.date_utils import get_default_time_display
|
||||
from django.utils.translation import ugettext as _
|
||||
from contentstore.utils import reverse_usage_url
|
||||
%>
|
||||
|
||||
<%block name="title">Container</%block>
|
||||
<%block name="bodyclass">is-signedin course uploads view-container</%block>
|
||||
|
||||
<%namespace name='static' file='../../static_content.html'/>
|
||||
|
||||
<%block name="content">
|
||||
<div id="content">
|
||||
|
||||
|
||||
<div class="wrapper-mast wrapper">
|
||||
<header class="mast has-actions has-navigation has-subtitle">
|
||||
<div class="page-header">
|
||||
<small class="navigation navigation-parents subtitle">
|
||||
<a href="" class="navigation-item navigation-link navigation-parent">
|
||||
Section parent
|
||||
</a>
|
||||
<span class="navigation-item navigation-parent">Subsection parent</span>
|
||||
</small>
|
||||
<div class="wrapper-xblock-field" data-field="display_name">
|
||||
<h1 class="page-header-title is-editable xblock-field-value">Unit Example</h1>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<nav class="nav-actions" aria-label="${_('Page Actions')}">
|
||||
<h3 class="sr">Page Actions</h3>
|
||||
<ul>
|
||||
|
||||
<!-- begin publishing changes -->
|
||||
<li class="action-item action-view nav-item">
|
||||
<a href="#" class="button view-button action-button">
|
||||
<span class="action-button-text">View Published Version</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="action-item action-preview nav-item">
|
||||
<a href="#" class="button preview-button action-button">
|
||||
<span class="action-button-text">Preview</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- end publishing changes -->
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
</header>
|
||||
</div>
|
||||
<div class="wrapper-content wrapper">
|
||||
<div class="inner-wrapper">
|
||||
<section class="content-area">
|
||||
<article class="content-primary">
|
||||
|
||||
<div class="ui-loading">
|
||||
<p><span class="spin"><i class="icon fa fa-refresh"></i></span> <span class="copy">Loading</span></p>
|
||||
</div>
|
||||
<div class="no-container-content">
|
||||
<p>This page has no content yet.</p>
|
||||
</div>
|
||||
<section class="wrapper-xblock level-page">
|
||||
<header class="xblock-header">
|
||||
<div class="header-details">
|
||||
Container Name
|
||||
</div>
|
||||
<div class="header-actions">
|
||||
<ul class="actions-list">
|
||||
<li class="action-item action-edit">
|
||||
<a href="#" class="edit-button action-button">
|
||||
<i class="icon fa fa-edit"></i>
|
||||
<span class="action-button-text">Edit</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</header>
|
||||
<article class="xblock-render">
|
||||
<ol class="xblock-list">
|
||||
<li class="xblock-list-item">
|
||||
<section class="wrapper-xblock level-nesting is-collapsible">
|
||||
<header class="xblock-header">
|
||||
<div class="header-details">
|
||||
<a href="#" data-tooltip="Expand or Collapse" class="action expand-collapse collapse">
|
||||
<i class="icon fa fa-caret-down ui-toggle-expansion"></i>
|
||||
<span class="sr">Expand or Collapse</span>
|
||||
</a>
|
||||
<span>Condition 1</span>
|
||||
</div>
|
||||
<div class="header-actions">
|
||||
<ul class="actions-list">
|
||||
<li class="sr action-item">No Actions</li>
|
||||
</ul>
|
||||
</div>
|
||||
</header>
|
||||
<article class="xblock-render">
|
||||
<ol class="xblock-list">
|
||||
<li class="xblock-list-item">
|
||||
<section class="wrapper-xblock level-element">
|
||||
<header class="xblock-header">
|
||||
<div class="header-details">
|
||||
Video
|
||||
</div>
|
||||
<div class="header-actions">
|
||||
<ul class="actions-list">
|
||||
<li class="action-item action-edit">
|
||||
<a href="#" class="edit-button action-button">
|
||||
<i class="icon fa fa-edit"></i>
|
||||
<span class="action-button-text">Edit</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="action-item action-duplicate">
|
||||
<a href="#" data-tooltip="Duplicate" class="duplicate-button action-button">
|
||||
<i class="icon fa fa-copy"></i>
|
||||
<span class="sr">Duplicate this component</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="action-item action-delete">
|
||||
<a href="#" data-tooltip="Delete" class="delete-button action-button">
|
||||
<i class="icon fa fa-trash-o"></i>
|
||||
<span class="sr">Delete this component</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</header>
|
||||
<article class="xblock-render">
|
||||
<section class="xblock xblock-student_view xmodule_display xmodule_VideoModule" data-runtime-version="1" data-init="XBlockToXModuleShim" data-handler-prefix="/preview/xblock/i4x:;_;_AndyA;_ABT101;_video;_72b5a0d74e8c4ed4a4d4e6bf67837c09/handler" data-type="Video">
|
||||
|
||||
|
||||
<h2>Video</h2>
|
||||
|
||||
<div id="video_i4x-AndyA-ABT101-video-72b5a0d74e8c4ed4a4d4e6bf67837c09" class="video closed is-initialized" data-streams="1.00:OEoXaMPEzfM" data-save-state-url="/preview/xblock/i4x:;_;_AndyA;_ABT101;_video;_72b5a0d74e8c4ed4a4d4e6bf67837c09/handler/xmodule_handler/save_user_state" data-caption-data-dir="None" data-show-captions="true" data-general-speed="1.0" data-speed="null" data-start="0.0" data-end="0.0" data-caption-asset-path="/c4x/AndyA/ABT101/asset/subs_" data-autoplay="False" data-yt-test-timeout="1500" data-yt-test-url="https://www.googleapis.com/youtube/v3/videos/" data-autohide-html5="False" tabindex="-1">
|
||||
<div class="focus_grabber first" tabindex="-1"></div>
|
||||
|
||||
<div class="tc-wrapper">
|
||||
<a href="#before-transcript_i4x-AndyA-ABT101-video-72b5a0d74e8c4ed4a4d4e6bf67837c09" class="nav-skip sr">Skip to a navigable version of this video transcript.</a>
|
||||
|
||||
<article class="video-wrapper">
|
||||
<span tabindex="-1" class="spinner" aria-hidden="true" aria-label="Loading video player"></span>
|
||||
<span tabindex="-1" class="btn-play is-hidden" aria-hidden="true" aria-label="Play video"></span>
|
||||
<div class="video-player-pre"></div>
|
||||
<section class="video-player">
|
||||
<iframe id="i4x-AndyA-ABT101-video-72b5a0d74e8c4ed4a4d4e6bf67837c09" frameborder="0" allowfullscreen="1" title="YouTube video player" width="640" height="360" src="https://www.youtube.com/embed/OEoXaMPEzfM?controls=0&wmode=transparent&rel=0&showinfo=0&enablejsapi=1&modestbranding=1&html5=1&origin=http%3A%2F%2Flocalhost%3A8001" style="height: 411.75px; width: 732px; top: -22.875px; left: 0px;"></iframe>
|
||||
<h3 class="hidden">ERROR: No playable video sources found!</h3>
|
||||
</section>
|
||||
<div class="video-player-post"></div>
|
||||
<section class="video-controls" style="">
|
||||
<div class="slider ui-slider ui-slider-horizontal ui-widget ui-widget-content ui-corner-all" title="Video position" aria-disabled="false" tabindex="-1" style=""><div class="ui-slider-range ui-widget-header ui-slider-range-min" style="width: 0%;"></div><a class="ui-slider-handle ui-state-default ui-corner-all" href="#" role="slider" title="Video position" aria-disabled="false" aria-valuetext="0 seconds" style="left: 0%;"></a></div>
|
||||
<div>
|
||||
<ul class="vcr">
|
||||
<li><a class="video_control play" href="#" title="Play" role="button" aria-disabled="false"></a></li>
|
||||
<li><div class="vidtime">0:00 / 1:56</div></li>
|
||||
</ul>
|
||||
<div class="secondary-controls"><div class="speeds">
|
||||
<a href="#" title="Speeds" role="button" aria-disabled="false">
|
||||
<h3>Speed</h3>
|
||||
<p class="active">1.0x</p>
|
||||
</a>
|
||||
<ol class="video_speeds"><li data-speed="2.0"><a class="speed_link" href="#">2.0x</a></li><li data-speed="1.50"><a class="speed_link" href="#">1.50x</a></li><li data-speed="1.0" class="active"><a class="speed_link" href="#">1.0x</a></li><li data-speed="0.50"><a class="speed_link" href="#">0.50x</a></li></ol>
|
||||
</div><div class="volume">
|
||||
<a href="#" title="Volume" role="button" aria-disabled="false" aria-label="Volume"></a>
|
||||
<div class="volume-slider-container">
|
||||
<div class="volume-slider ui-slider ui-slider-vertical ui-widget ui-widget-content ui-corner-all" aria-disabled="false"><div class="ui-slider-range ui-widget-header ui-slider-range-min" style="height: 100%;"></div><a class="ui-slider-handle ui-state-default ui-corner-all" href="#" role="slider" title="Volume" aria-disabled="false" aria-valuemin="0" aria-valuemax="100" aria-valuenow="100" aria-valuetext="Maximum" style="bottom: 100%;"></a></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<a href="#" class="add-fullscreen" title="Fill browser" role="button" aria-disabled="false">Fill browser</a>
|
||||
<a href="#" class="quality_control" title="HD off" role="button" aria-disabled="false" style="display: inline;">HD off</a>
|
||||
|
||||
<a href="#" class="hide-subtitles" title="Turn on captions" role="button" aria-disabled="false" style="display: none;">Turn on captions</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<a class="nav-skip sr" id="before-transcript_i4x-AndyA-ABT101-video-72b5a0d74e8c4ed4a4d4e6bf67837c09" href="#after-transcript_i4x-AndyA-ABT101-video-72b5a0d74e8c4ed4a4d4e6bf67837c09">Skip to end of transcript.</a>
|
||||
</article>
|
||||
|
||||
<ol id="transcript-captions" class="subtitles" tabindex="0" title="Captions" role="group" aria-label="Activating an item in this group will spool the video to the corresponding time point. To skip transcript, go to previous item." style="max-height: 411px;">
|
||||
<li style=""></li>
|
||||
</ol>
|
||||
</div>
|
||||
|
||||
<a class="nav-skip sr" id="after-transcript_i4x-AndyA-ABT101-video-72b5a0d74e8c4ed4a4d4e6bf67837c09" href="#before-transcript_i4x-AndyA-ABT101-video-72b5a0d74e8c4ed4a4d4e6bf67837c09">Go back to start of transcript.</a>
|
||||
|
||||
<div class="focus_grabber last" tabindex="-1"></div>
|
||||
<ul class="wrapper-downloads">
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</section>
|
||||
</article>
|
||||
</section>
|
||||
</li><li class="xblock-list-item">
|
||||
<section class="wrapper-xblock xblock-type-container level-element">
|
||||
<header class="xblock-header">
|
||||
<div class="header-details">
|
||||
Randomize Block
|
||||
</div>
|
||||
<div class="header-actions">
|
||||
<ul class="actions-list">
|
||||
<li class="action-item action-view">
|
||||
<a href="#" class="action-button">
|
||||
<span class="action-button-text">View</span>
|
||||
<i class="icon fa fa-arrow-right"></i>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</header>
|
||||
<article class="xblock-render">Shows Element - Example Randomize Block could be here.</article>
|
||||
</section>
|
||||
</li><li class="xblock-list-item">
|
||||
<section class="wrapper-xblock level-element">
|
||||
<header class="xblock-header">
|
||||
<div class="header-details">
|
||||
Element Level Header
|
||||
</div>
|
||||
<div class="header-actions">
|
||||
<ul class="actions-list">
|
||||
<li class="action-item action-edit">
|
||||
<a href="#" class="edit-button action-button">
|
||||
<i class="icon fa fa-edit"></i>
|
||||
<span class="action-button-text">Edit</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="action-item action-duplicate">
|
||||
<a href="#" data-tooltip="Duplicate" class="duplicate-button action-button">
|
||||
<i class="icon fa fa-copy"></i>
|
||||
<span class="sr">Duplicate this component</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="action-item action-delete">
|
||||
<a href="#" data-tooltip="Delete" class="delete-button action-button">
|
||||
<i class="icon fa fa-trash-o"></i>
|
||||
<span class="sr">Delete this component</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</header>
|
||||
<article class="xblock-render" style="height:200px;">Shows Element - Example HTML could be here.</article>
|
||||
</section>
|
||||
</li>
|
||||
</ol>
|
||||
</article>
|
||||
</section>
|
||||
</li>
|
||||
<li class="xblock-list-item xblock-list-item">
|
||||
<section class="wrapper-xblock level-nesting is-collapsible">
|
||||
<header class="xblock-header">
|
||||
<div class="header-details">
|
||||
<a href="#" data-tooltip="Expand or Collapse" class="action expand-collapse collapse">
|
||||
<i class="icon fa fa-caret-down ui-toggle-expansion"></i>
|
||||
<span class="sr">Expand or Collapse</span>
|
||||
</a>
|
||||
<span>Condition 2</span>
|
||||
</div>
|
||||
<div class="header-actions">
|
||||
<ul class="actions-list">
|
||||
<li class="sr action-item">No Actions</li>
|
||||
</ul>
|
||||
</div>
|
||||
</header>
|
||||
<article class="xblock-render">
|
||||
<ol class="xblock-list">
|
||||
<li class="xblock-list-item">
|
||||
<section class="wrapper-xblock level-element">
|
||||
<header class="xblock-header">
|
||||
<div class="header-details">
|
||||
Video
|
||||
</div>
|
||||
<div class="header-actions">
|
||||
<ul class="actions-list">
|
||||
<li class="action-item action-edit">
|
||||
<a href="#" class="edit-button action-button">
|
||||
<i class="icon fa fa-edit"></i>
|
||||
<span class="action-button-text">Edit</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="action-item action-duplicate">
|
||||
<a href="#" data-tooltip="Duplicate" class="duplicate-button action-button">
|
||||
<i class="icon fa fa-copy"></i>
|
||||
<span class="sr">Duplicate this component</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="action-item action-delete">
|
||||
<a href="#" data-tooltip="Delete" class="delete-button action-button">
|
||||
<i class="icon fa fa-trash-o"></i>
|
||||
<span class="sr">Delete this component</span>
|
||||
</a>
|
||||
</li>
|
||||
<ul>
|
||||
</ul></ul></div>
|
||||
</header>
|
||||
<article class="xblock-render" >Shows Element - Example Video could be here. </article>
|
||||
</section>
|
||||
</li><li class="xblock-list-item">
|
||||
<section class="wrapper-xblock level-element">
|
||||
<header class="xblock-header">
|
||||
<div class="header-details">
|
||||
Common Problem
|
||||
</div>
|
||||
<div class="header-actions">
|
||||
<ul class="actions-list">
|
||||
<li class="action-item action-edit">
|
||||
<a href="#" class="edit-button action-button">
|
||||
<i class="icon fa fa-edit"></i>
|
||||
<span class="action-button-text">Edit</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="action-item action-duplicate">
|
||||
<a href="#" data-tooltip="Duplicate" class="duplicate-button action-button">
|
||||
<i class="icon fa fa-copy"></i>
|
||||
<span class="sr">Duplicate this component</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="action-item action-delete">
|
||||
<a href="#" data-tooltip="Delete" class="delete-button action-button">
|
||||
<i class="icon fa fa-trash-o"></i>
|
||||
<span class="sr">Delete this component</span>
|
||||
</a>
|
||||
</li>
|
||||
<ul>
|
||||
</ul></ul></div>
|
||||
</header>
|
||||
<article class="xblock-render">
|
||||
<section class="xblock xblock-student_view xmodule_display xmodule_CapaModule" data-runtime-version="1" data-init="XBlockToXModuleShim" data-handler-prefix="/preview/xblock/i4x:;_;_AndyA;_ABT101;_problem;_46d2b65d793549e2876729d55df9a2cb/handler" data-type="Problem" data-block-type="problem">
|
||||
<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="hd hd-2 problem-header">
|
||||
Multiple Choice
|
||||
</h3>
|
||||
|
||||
<section class="problem-progress">(1 point possible)</section>
|
||||
|
||||
<section class="problem">
|
||||
<div>
|
||||
<p>
|
||||
A multiple choice problem presents radio buttons for student
|
||||
input. Students can only select a single option presented. Multiple Choice questions have been the subject of many areas of research due to the early invention and adoption of bubble sheets.</p>
|
||||
<p> One of the main elements that goes into a good multiple choice question is the existence of good distractors. That is, each of the alternate responses presented to the student should be the result of a plausible mistake that a student might make.
|
||||
</p>
|
||||
<p>What Apple device competed with the portable CD player?</p>
|
||||
<span><form class="choicegroup capa_inputtype" id="inputtype_i4x-AndyA-ABT101-problem-46d2b65d793549e2876729d55df9a2cb_2_1">
|
||||
<div class="indicator-container">
|
||||
<span class="unanswered" style="display:inline-block;" id="status_i4x-AndyA-ABT101-problem-46d2b65d793549e2876729d55df9a2cb_2_1"></span>
|
||||
</div>
|
||||
|
||||
<fieldset>
|
||||
|
||||
<label for="input_i4x-AndyA-ABT101-problem-46d2b65d793549e2876729d55df9a2cb_2_1_choice_ipad">
|
||||
<input type="radio" name="input_i4x-AndyA-ABT101-problem-46d2b65d793549e2876729d55df9a2cb_2_1" id="input_i4x-AndyA-ABT101-problem-46d2b65d793549e2876729d55df9a2cb_2_1_choice_ipad" aria-describedby="answer_i4x-AndyA-ABT101-problem-46d2b65d793549e2876729d55df9a2cb_2_1" value="choice_ipad"> The iPad
|
||||
|
||||
</label>
|
||||
<label for="input_i4x-AndyA-ABT101-problem-46d2b65d793549e2876729d55df9a2cb_2_1_choice_beatles">
|
||||
<input type="radio" name="input_i4x-AndyA-ABT101-problem-46d2b65d793549e2876729d55df9a2cb_2_1" id="input_i4x-AndyA-ABT101-problem-46d2b65d793549e2876729d55df9a2cb_2_1_choice_beatles" aria-describedby="answer_i4x-AndyA-ABT101-problem-46d2b65d793549e2876729d55df9a2cb_2_1" value="choice_beatles"> Napster
|
||||
|
||||
</label>
|
||||
<label for="input_i4x-AndyA-ABT101-problem-46d2b65d793549e2876729d55df9a2cb_2_1_choice_ipod">
|
||||
<input type="radio" name="input_i4x-AndyA-ABT101-problem-46d2b65d793549e2876729d55df9a2cb_2_1" id="input_i4x-AndyA-ABT101-problem-46d2b65d793549e2876729d55df9a2cb_2_1_choice_ipod" aria-describedby="answer_i4x-AndyA-ABT101-problem-46d2b65d793549e2876729d55df9a2cb_2_1" value="choice_ipod"> The iPod
|
||||
|
||||
</label>
|
||||
<label for="input_i4x-AndyA-ABT101-problem-46d2b65d793549e2876729d55df9a2cb_2_1_choice_peeler">
|
||||
<input type="radio" name="input_i4x-AndyA-ABT101-problem-46d2b65d793549e2876729d55df9a2cb_2_1" id="input_i4x-AndyA-ABT101-problem-46d2b65d793549e2876729d55df9a2cb_2_1_choice_peeler" aria-describedby="answer_i4x-AndyA-ABT101-problem-46d2b65d793549e2876729d55df9a2cb_2_1" value="choice_peeler"> The vegetable peeler
|
||||
|
||||
</label>
|
||||
<span id="answer_i4x-AndyA-ABT101-problem-46d2b65d793549e2876729d55df9a2cb_2_1"></span>
|
||||
</fieldset>
|
||||
|
||||
</form></span>
|
||||
<section class="solution-span">
|
||||
<span id="solution_i4x-AndyA-ABT101-problem-46d2b65d793549e2876729d55df9a2cb_solution_1"></span>
|
||||
</section></div>
|
||||
|
||||
<section class="action">
|
||||
<input type="hidden" name="problem_id" value="Multiple Choice">
|
||||
|
||||
<input class="check Check" type="button" value="Check">
|
||||
</section>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
</section>
|
||||
</article>
|
||||
</section>
|
||||
</li><li class="xblock-list-item">
|
||||
<section class="wrapper-xblock level-element">
|
||||
<header class="xblock-header">
|
||||
<div class="header-details">
|
||||
HTML
|
||||
</div>
|
||||
<div class="header-actions">
|
||||
<ul class="actions-list">
|
||||
<li class="action-item action-edit">
|
||||
<a href="#" class="edit-button action-button">
|
||||
<i class="icon fa fa-edit"></i>
|
||||
<span class="action-button-text">Edit</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="action-item action-duplicate">
|
||||
<a href="#" data-tooltip="Duplicate" class="duplicate-button action-button">
|
||||
<i class="icon fa fa-copy"></i>
|
||||
<span class="sr">Duplicate this component</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="action-item action-delete">
|
||||
<a href="#" data-tooltip="Delete" class="delete-button action-button">
|
||||
<i class="icon fa fa-trash-o"></i>
|
||||
<span class="sr">Delete this component</span>
|
||||
</a>
|
||||
</li>
|
||||
<ul>
|
||||
</ul></ul></div>
|
||||
</header>
|
||||
<article class="xblock-render">
|
||||
<section class="xblock xblock-student_view xmodule_display xmodule_HtmlModule" data-runtime-version="1" data-init="XBlockToXModuleShim" data-handler-prefix="/preview/xblock/i4x:;_;_andya;_AA101;_html;_c8fb4780eb554aec95c6231680eb82cf/handler" data-type="HTMLModule" data-block-type="html">
|
||||
<ol>
|
||||
<li>
|
||||
<h2> September 21 </h2>
|
||||
<section class="update-description">
|
||||
<section class="primary">
|
||||
<p> Words of encouragement! This is a short note that most students will read. </p>
|
||||
<p class="author">Anant Agarwal (6.002x Principal Instructor)</p>
|
||||
</section>
|
||||
<p></p><h3>Primary versus Secondary Updates:</h3> Unfortunately, the internet throws a lot of text at students, and they
|
||||
do not read everything that they are given. However, many students <em>do</em> read all that they are
|
||||
given, and so detailed explanations in this section will benefit the most conscientious.
|
||||
Any essential information should be extremely quickly summarized in the primary section for skimmers.<p></p>
|
||||
<p></p><h3>Star Forum Poster</h3>
|
||||
Students appreciate knowing that the course staff is reading what they post, and one of several ways
|
||||
that you can do this is by acknowledging the star posters in your announcements.
|
||||
<p></p>
|
||||
</section>
|
||||
</li>
|
||||
</ol>
|
||||
|
||||
</section>
|
||||
</article>
|
||||
</section>
|
||||
</li>
|
||||
</ol>
|
||||
</article>
|
||||
</section>
|
||||
</li>
|
||||
</ol>
|
||||
</article>
|
||||
</section>
|
||||
</article>
|
||||
<aside class="content-supplementary" role="complementary">
|
||||
|
||||
<!-- begin publishing changes 1 -->
|
||||
|
||||
<!-- case never published, future release no staff lock -->
|
||||
|
||||
<div class="bit-publishing ">
|
||||
<h3 class="bar-mod-title pub-status"><span class="sr">Publishing Status </span>Draft (Never published)</h3>
|
||||
<div class="wrapper-last-draft bar-mod-content">
|
||||
|
||||
<!-- case: unpubbed changes -->
|
||||
<p class="copy meta">
|
||||
Draft saved on 6/15/2014 at 12:45pm by amako
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- case: future release -->
|
||||
<div class="wrapper-release bar-mod-content">
|
||||
<h5 class="title">Scheduled to Release:</h5>
|
||||
<p class="copy">
|
||||
<span class="release-date">July 25, 2014</span> with
|
||||
<span class="release-with">Section "Week 1"</span>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- case: staff and students - no lock -->
|
||||
<div class="wrapper-visibility bar-mod-content">
|
||||
<h5 class="title">Will be Visible to:</h5>
|
||||
<p class="copy">Staff and Students</p>
|
||||
<p class="action-inline">
|
||||
<a href="">
|
||||
<i class="icon fa fa-unlock"></i> Hide from Students
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- case: future release -->
|
||||
<div class="wrapper-pub-actions bar-mod-actions">
|
||||
<ul class="action-list">
|
||||
<li class="action-item"><a class="action-publish action-primary" href="">Publish</a></li>
|
||||
<li class="action-item"><a class="action-discard action-secondary is-disabled" href="" aria-disabled="true" >Discard Changes</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- end publishing changes 1 -->
|
||||
|
||||
<!-- begin publishing changes 2 -->
|
||||
|
||||
<!-- case published no changes, future release no staff lock -->
|
||||
|
||||
<div class="bit-publishing is-published">
|
||||
<h3 class="bar-mod-title pub-status"><span class="sr">Publishing Status </span>Published</h3>
|
||||
<div class="wrapper-last-draft bar-mod-content">
|
||||
|
||||
<!-- case: unpubbed changes -->
|
||||
<p class="copy meta">
|
||||
Last published on 6/15/2014 at 12:45pm by amako
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- case: future release -->
|
||||
<div class="wrapper-release bar-mod-content">
|
||||
<h5 class="title">Scheduled to Release:</h5>
|
||||
<p class="copy">
|
||||
<span class="release-date">July 25, 2014</span> with
|
||||
<span class="release-with">Section "Week 1"</span>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- case: staff and students - no lock -->
|
||||
<div class="wrapper-visibility bar-mod-content">
|
||||
<h5 class="title">Will be Visible to:</h5>
|
||||
<p class="copy">Staff and Students</p>
|
||||
<p class="action-inline">
|
||||
<a href="">
|
||||
<i class="icon fa fa-unlock"></i> Hide from Students
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- case: future release -->
|
||||
<div class="wrapper-pub-actions bar-mod-actions">
|
||||
<ul class="action-list">
|
||||
<li class="action-item"><a class="action-publish action-primary is-disabled" href="" aria-disabled="true" >Publish</a></li>
|
||||
<li class="action-item"><a class="action-discard action-secondary is-disabled" href="" aria-disabled="true" >Discard Changes</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- end publishing changes 2 -->
|
||||
|
||||
|
||||
<!-- begin publishing changes 3 -->
|
||||
|
||||
<!-- case unpubbed changes, future release no staff lock -->
|
||||
|
||||
<div class="bit-publishing is-draft">
|
||||
<h3 class="bar-mod-title pub-status"><span class="sr">Publishing Status </span>Draft (Unpublished changes)</h3>
|
||||
<div class="wrapper-last-draft bar-mod-content">
|
||||
|
||||
<!-- case: unpubbed changes -->
|
||||
<p class="copy meta">
|
||||
Draft saved on 6/15/2014 at 12:45pm by amako
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- case: future release -->
|
||||
<div class="wrapper-release bar-mod-content">
|
||||
<h5 class="title">Scheduled to Release:</h5>
|
||||
<p class="copy">
|
||||
<span class="release-date">July 25, 2014</span> with
|
||||
<span class="release-with">Section "Week 1"</span>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- case: staff and students - no lock -->
|
||||
<div class="wrapper-visibility bar-mod-content">
|
||||
<h5 class="title">Will be Visible to:</h5>
|
||||
<p class="copy">Staff and Students</p>
|
||||
<p class="action-inline">
|
||||
<a href="">
|
||||
<i class="icon fa fa-unlock"></i> Hide from Students
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- case: future release -->
|
||||
<div class="wrapper-pub-actions bar-mod-actions">
|
||||
<ul class="action-list">
|
||||
<li class="action-item"><a class="action-publish action-primary" href="">Publish</a></li>
|
||||
<li class="action-item"><a class="action-discard action-secondary" href="">Discard Changes</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- end publishing changes 3 -->
|
||||
|
||||
|
||||
<!-- begin publishing changes 4 -->
|
||||
|
||||
<!-- case unpubbed changes, future release with staff lock -->
|
||||
|
||||
<div class="bit-publishing is-draft is-staff-only">
|
||||
<h3 class="bar-mod-title pub-status"><span class="sr">Publishing Status </span>Draft (Unpublished changes)</h3>
|
||||
<div class="wrapper-last-draft bar-mod-content">
|
||||
|
||||
<!-- case: unpubbed changes -->
|
||||
<p class="copy meta">
|
||||
Draft saved on 6/15/2014 at 12:45pm by amako
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- case: future release -->
|
||||
<div class="wrapper-release bar-mod-content">
|
||||
<h5 class="title">Scheduled to Release:</h5>
|
||||
<p class="copy">
|
||||
<span class="release-date">July 25, 2014</span> with
|
||||
<span class="release-with">Section "Week 1"</span>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- case: staff and students - no lock -->
|
||||
<div class="wrapper-visibility bar-mod-content">
|
||||
<h5 class="title">Will be Visible to:</h5>
|
||||
<p class="copy">Staff only</p>
|
||||
<p class="action-inline">
|
||||
<a href="">
|
||||
<i class="icon fa fa-lock"></i> Hidden from Students
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- case: future release -->
|
||||
<div class="wrapper-pub-actions bar-mod-actions">
|
||||
<ul class="action-list">
|
||||
<li class="action-item"><a class="action-publish action-primary" href="">Publish</a></li>
|
||||
<li class="action-item"><a class="action-discard action-secondary" href="">Discard Changes</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- end publishing changes 4 -->
|
||||
|
||||
|
||||
<!-- begin publishing changes 5 -->
|
||||
|
||||
<!-- case published no changes, release in past no staff lock -->
|
||||
|
||||
<div class="bit-publishing is-published">
|
||||
<h3 class="bar-mod-title pub-status"><span class="sr">Publishing Status </span>Published</h3>
|
||||
<div class="wrapper-last-draft bar-mod-content">
|
||||
|
||||
<!-- case: unpubbed changes -->
|
||||
<p class="copy meta">
|
||||
Last published on 6/15/2014 at 12:45pm by amako
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- case: future release -->
|
||||
<div class="wrapper-release bar-mod-content">
|
||||
<h5 class="title">Released:</h5>
|
||||
<p class="copy">
|
||||
<span class="release-date">May 25, 2014</span> with
|
||||
<span class="release-with">Section "Week 1"</span>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- case: staff and students - no lock -->
|
||||
<div class="wrapper-visibility bar-mod-content">
|
||||
<h5 class="title">Currently Visible to:</h5>
|
||||
<p class="copy">Staff and Students</p>
|
||||
<p class="action-inline">
|
||||
<a href="">
|
||||
<i class="icon fa fa-unlock"></i> Hide from Students
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- case: future release -->
|
||||
<div class="wrapper-pub-actions bar-mod-actions">
|
||||
<ul class="action-list">
|
||||
<li class="action-item"><a class="action-publish action-primary is-disabled" href="" aria-disabled="true" >Publish</a></li>
|
||||
<li class="action-item"><a class="action-discard action-secondary is-disabled" href="" aria-disabled="true" >Discard Changes</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- end publishing changes 2 -->
|
||||
|
||||
|
||||
<div class="bit-publishing">
|
||||
<h3 class="title-3">Publishing Status</h3>
|
||||
<p class="copy">This content is published with unit <a href="">Unit 1</a>. To make changes to the content of this container, place <a href="">Unit 1</a> in draft mode.</p>
|
||||
</div>
|
||||
<div class="bit">
|
||||
<h3 class="title-3">Container Reference Page</h3>
|
||||
<ul class="list-details">
|
||||
<li class="item-detail">This is a reference for the container page, meant to show visual states and general FED hierarchy for the both the HTML template and the SASS styling.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</aside>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</%block>
|
||||
@@ -1,358 +0,0 @@
|
||||
<%inherit file="../../base.html" />
|
||||
|
||||
<%block name="view_notes">
|
||||
<%include file="_note-usage.html" />
|
||||
</%block>
|
||||
|
||||
<%!
|
||||
from django.utils.translation import ugettext as _
|
||||
from django.core.urlresolvers import reverse
|
||||
%>
|
||||
|
||||
<%block name="title">[template] Create a Course Rerun of HarvardX SW12.2x T2_2014</%block>
|
||||
<%block name="bodyclass">is-signedin view-course-create view-course-create-rerun</%block>
|
||||
|
||||
<%block name="content">
|
||||
<div id="content">
|
||||
|
||||
<div class="wrapper-mast wrapper">
|
||||
<header class="mast mast-wizard has-actions">
|
||||
<h1 class="page-header">
|
||||
<span class="page-header-sub">Create a re-run of a course</span>
|
||||
</h1>
|
||||
|
||||
<nav class="nav-actions" aria-label="${_('Page Actions')}">
|
||||
<h3 class="sr">Page Actions</h3>
|
||||
<ul>
|
||||
<li class="nav-item">
|
||||
<a href="" rel="external" class="button cancel-button">Cancel</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<h2 class="page-header-super course-original">
|
||||
<span class="sr">You are creating a re-run from:</span>
|
||||
<span class="course-original-title-id">HarvardX SW12.2x T2_2014</span>
|
||||
<span class="course-original-title">China (Part 2): The Creation and End of a Centralized Empire</span>
|
||||
</h2>
|
||||
</header>
|
||||
</div> <!-- /mast -->
|
||||
|
||||
<div class="wrapper-content wrapper">
|
||||
<div class="inner-wrapper">
|
||||
<section class="content">
|
||||
<article class="content-primary">
|
||||
<div class="introduction">
|
||||
<div class="copy">
|
||||
<p>
|
||||
Provide identifying information for this re-run of the course. The original course is not affected in any way by a re-run.
|
||||
<strong>Note: Together, the organization, course number, and course run must uniquely identify this new course instance.</strong>
|
||||
<p>
|
||||
</div>
|
||||
</div><!-- /introduction -->
|
||||
|
||||
<!-- - - - -->
|
||||
|
||||
<!-- STATE: initial form -->
|
||||
<div class="wrapper-rerun-course">
|
||||
<form class="form-create rerun-course course-info" id="rerun-course-form" name="rerun-course-form">
|
||||
<!-- NOTE: this element's contents should be only included when they are needed and not kept in the DOM for all states -->
|
||||
<div class="wrapper-error">
|
||||
|
||||
</div>
|
||||
|
||||
<div class="wrapper-form">
|
||||
<fieldset>
|
||||
<legend class="sr">Required Information to Create a re-run of a course</legend>
|
||||
|
||||
<ol class="list-input">
|
||||
<li class="field text required" id="field-course-name">
|
||||
<label for="rerun-course-name">Course Name</label>
|
||||
<input class="rerun-course-name" id="rerun-course-name" type="text" name="rerun-course-name" aria-required="true" placeholder="e.g. Introduction to Computer Science" />
|
||||
<span class="tip">
|
||||
The public display name for the new course. (This name is often the same as the original course name.)
|
||||
</span>
|
||||
<span class="tip tip-error is-hidden"></span>
|
||||
</li>
|
||||
<li class="field text required" id="field-organization">
|
||||
<label for="rerun-course-org">Organization</label>
|
||||
<input class="rerun-course-org" id="rerun-course-org" type="text" name="rerun-course-org" aria-required="true" placeholder="e.g. UniversityX or OrganizationX" />
|
||||
<span class="tip">
|
||||
The name of the organization sponsoring the new course. (This name is often the same as the original organization name.)
|
||||
<strong class="tip-note" class="tip-note">Note: No spaces or special characters are allowed.</strong>
|
||||
</span>
|
||||
<span class="tip tip-error is-hidden"></span>
|
||||
</li>
|
||||
|
||||
<li class="row">
|
||||
<div class="column field text required" id="field-course-number">
|
||||
<label for="rerun-course-number">Course Number</label>
|
||||
<input class="rerun-course-number" id="rerun-course-number" type="text" name="rerun-course-number" aria-required="true" placeholder="e.g. CS101" />
|
||||
<span class="tip">
|
||||
The unique number that identifies the new course within the organization. (This number is often the same as the original course number.)
|
||||
<strong class="tip-note" class="tip-note">Note: No spaces or special characters are allowed.</strong>
|
||||
</span>
|
||||
<span class="tip tip-error is-hidden"></span>
|
||||
</div>
|
||||
|
||||
<div class="column field text required" id="field-course-run">
|
||||
<label for="rerun-course-run">Course Run</label>
|
||||
<input class="rerun-course-run" id="rerun-course-run" type="text" name="rerun-course-run" aria-required="true"placeholder="e.g. 2014_T1" />
|
||||
<span class="tip">
|
||||
The term in which the new course will run. (This value is often different than the original course run value.)
|
||||
<strong class="tip-note" class="tip-note">Note: No spaces or special characters are allowed.</strong>
|
||||
</span>
|
||||
<span class="tip tip-error is-hidden"></span>
|
||||
</div>
|
||||
</li>
|
||||
</ol>
|
||||
|
||||
<input type="hidden" value="" class="allow-unicode-course-id" /> <!-- TODO: need to add support for allow_unicode_course_id in real view's template -->
|
||||
</fieldset>
|
||||
</div>
|
||||
|
||||
<div class="actions">
|
||||
<button type="submit" class="action action-primary rerun-course-save is-disabled" aria-disabled="true" >Create Re-run</button>
|
||||
<button type="button" class="action action-secondary action-cancel rerun-course-cancel">Cancel</button>
|
||||
</div>
|
||||
</form>
|
||||
</div><!-- /rerun-course -->
|
||||
|
||||
<!-- - - - -->
|
||||
|
||||
<!-- STATE: error - all attributes match an existing course -->
|
||||
<div class="wrapper-rerun-course">
|
||||
<form class="form-create rerun-course course-info" id="rerun-course-form" name="rerun-course-form">
|
||||
<div class="wrapper-error is-shown">
|
||||
<!-- NOTE: this element's contents should be only included when they are needed and not kept in the DOM for all states -->
|
||||
<div id="course_rerun_error" name="course_rerun_error" class="message message-status error" role="alert">
|
||||
<p>A course already has that organization, course number, and course run. Change one or more of these values to give the new course a unique URL.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="wrapper-form">
|
||||
<fieldset>
|
||||
<legend class="sr">Required Information to Create a re-run of a course</legend>
|
||||
|
||||
<ol class="list-input">
|
||||
<li class="field text required error" id="field-course-name">
|
||||
<label for="rerun-course-name">Course Name</label>
|
||||
<input class="rerun-course-name" id="rerun-course-name" type="text" name="rerun-course-name" aria-required="true" placeholder="e.g. Introduction to Computer Science" />
|
||||
<span class="tip">
|
||||
The public display name for the new course. (This name is often the same as the original course name.)
|
||||
</span>
|
||||
<span class="tip tip-error is-hiding"></span>
|
||||
</li>
|
||||
<li class="field text required error" id="field-organization">
|
||||
<label for="rerun-course-org">Organization</label>
|
||||
<input class="rerun-course-org" id="rerun-course-org" type="text" name="rerun-course-org" aria-required="true" placeholder="e.g. UniversityX or OrganizationX" />
|
||||
<span class="tip">
|
||||
The name of the organization sponsoring the new course. (This name is often the same as the original organization name.)
|
||||
<strong class="tip-note" class="tip-note">Note: No spaces or special characters are allowed.</strong>
|
||||
</span>
|
||||
<span class="tip tip-error is-hiding"></span>
|
||||
</li>
|
||||
|
||||
<li class="row">
|
||||
<div class="column field text required error" id="field-course-number">
|
||||
<label for="rerun-course-number">Course Number</label>
|
||||
<input class="rerun-course-number" id="rerun-course-number" type="text" name="rerun-course-number" aria-required="true" placeholder="e.g. CS101" />
|
||||
<span class="tip">
|
||||
The unique number that identifies the new course within the organization. (This number is often the same as the original course number.)
|
||||
<strong class="tip-note" class="tip-note">Note: No spaces or special characters are allowed.</strong>
|
||||
</span>
|
||||
<span class="tip tip-error is-hiding"></span>
|
||||
</div>
|
||||
|
||||
<div class="column field text required error" id="field-course-run">
|
||||
<label for="rerun-course-run">Course Run</label>
|
||||
<input class="rerun-course-run" id="rerun-course-run" type="text" name="rerun-course-run" aria-required="true"placeholder="e.g. 2014_T1" />
|
||||
<span class="tip">
|
||||
The term in which the new course will run. (This value is often different than the original course run value.)
|
||||
<strong class="tip-note" class="tip-note">Note: No spaces or special characters are allowed.</strong>
|
||||
</span>
|
||||
<span class="tip tip-error is-hiding"></span>
|
||||
</div>
|
||||
</li>
|
||||
</ol>
|
||||
|
||||
<input type="hidden" value="" class="allow-unicode-course-id" /> <!-- TODO: need to add support for allow_unicode_course_id in real view's template -->
|
||||
|
||||
</fieldset>
|
||||
</div>
|
||||
|
||||
<div class="actions">
|
||||
<button type="submit" class="action action-primary rerun-course-save is-disabled" aria-disabled="true" >Create Re-run</button>
|
||||
<button type="button" class="action action-secondary action-cancel rerun-course-cancel">Cancel and Return to Dashboard</button>
|
||||
</div>
|
||||
</form>
|
||||
</div><!-- /rerun-course -->
|
||||
|
||||
<!-- - - - -->
|
||||
|
||||
<!-- STATE: error - specific error fields -->
|
||||
<div class="wrapper-rerun-course">
|
||||
<form class="form-create rerun-course course-info" id="rerun-course-form" name="rerun-course-form">
|
||||
<div class="wrapper-error is-shown">
|
||||
<!-- NOTE: this element's contents should be only included when they are needed and not kept in the DOM for all states -->
|
||||
<div id="course_rerun_error" name="course_rerun_error" class="message message-status error" role="alert">
|
||||
<p>Please correct the highlighted fields below.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="wrapper-form">
|
||||
<fieldset>
|
||||
<legend class="sr">Required Information to Create a re-run of a course</legend>
|
||||
|
||||
<ol class="list-input">
|
||||
<li class="field text required error" id="field-course-name">
|
||||
<label for="rerun-course-name">Course Name</label>
|
||||
<input class="rerun-course-name" id="rerun-course-name" type="text" name="rerun-course-name" aria-required="true" placeholder="e.g. Introduction to Computer Science" />
|
||||
<span class="tip">
|
||||
The public display name for the new course. (This name is often the same as the original course name.)
|
||||
</span>
|
||||
<span class="tip tip-error is-showing">Required field.</span>
|
||||
</li>
|
||||
<li class="field text required error" id="field-organization">
|
||||
<label for="rerun-course-org">Organization</label>
|
||||
<input class="rerun-course-org" id="rerun-course-org" type="text" name="rerun-course-org" aria-required="true" placeholder="e.g. UniversityX or OrganizationX" />
|
||||
<span class="tip">
|
||||
The name of the organization sponsoring the new course. (This name is often the same as the original organization name.)
|
||||
<strong class="tip-note">Note: No spaces or special characters are allowed.</strong>
|
||||
</span>
|
||||
<span class="tip tip-error is-showing">Please do not use any spaces or special characters in this field.</span>
|
||||
</li>
|
||||
|
||||
<li class="row">
|
||||
<div class="column field text required error" id="field-course-number">
|
||||
<label for="rerun-course-number">Course Number</label>
|
||||
<input class="rerun-course-number" id="rerun-course-number" type="text" name="rerun-course-number" aria-required="true" placeholder="e.g. CS101" />
|
||||
<span class="tip">
|
||||
The unique number that identifies the new course within the organization. (This number is often the same as the original course number.)
|
||||
<strong class="tip-note">Note: No spaces or special characters are allowed.</strong>
|
||||
</span>
|
||||
<span class="tip tip-error is-showing">Please do not use any spaces or special characters in this field.</span>
|
||||
</div>
|
||||
|
||||
<div class="column field text required error" id="field-course-run">
|
||||
<label for="rerun-course-run">Course Run</label>
|
||||
<input class="rerun-course-run" id="rerun-course-run" type="text" name="rerun-course-run" aria-required="true"placeholder="e.g. 2014_T1" />
|
||||
<span class="tip">
|
||||
The term in which the new course will run. (This value is often different than the original course run value.)
|
||||
<strong class="tip-note">Note: No spaces or special characters are allowed.</strong>
|
||||
</span>
|
||||
<span class="tip tip-error is-showing">Required field.</span>
|
||||
</div>
|
||||
</li>
|
||||
</ol>
|
||||
|
||||
<input type="hidden" value="" class="allow-unicode-course-id" /> <!-- TODO: need to add support for allow_unicode_course_id in real view's template -->
|
||||
|
||||
</fieldset>
|
||||
</div>
|
||||
|
||||
<div class="actions">
|
||||
<button type="submit" class="action action-primary rerun-course-save is-disabled" aria-disabled="true" >Create Re-run</button>
|
||||
<button type="button" class="action action-secondary action-cancel rerun-course-cancel">Cancel and Return to Dashboard</button>
|
||||
</div>
|
||||
</form>
|
||||
</div><!-- /rerun-course -->
|
||||
|
||||
<!-- - - - -->
|
||||
|
||||
<!-- STATE: processing successful submission -->
|
||||
<div class="wrapper-rerun-course">
|
||||
<form class="form-create rerun-course course-info" id="rerun-course-form" name="rerun-course-form">
|
||||
<div class="wrapper-error">
|
||||
</div>
|
||||
|
||||
<div class="wrapper-form">
|
||||
<fieldset>
|
||||
<legend class="sr">Required Information to Create a re-run of a course</legend>
|
||||
|
||||
<ol class="list-input">
|
||||
<li class="field text required" id="field-course-name">
|
||||
<label for="rerun-course-name">Course Name</label>
|
||||
<input class="rerun-course-name" id="rerun-course-name" type="text" name="rerun-course-name" aria-required="true" placeholder="e.g. Introduction to Computer Science" />
|
||||
<span class="tip">
|
||||
The public display name for the new course. (This name is often the same as the original course name.)
|
||||
</span>
|
||||
<span class="tip tip-error is-hiding"></span>
|
||||
</li>
|
||||
<li class="field text required" id="field-organization">
|
||||
<label for="rerun-course-org">Organization</label>
|
||||
<input class="rerun-course-org" id="rerun-course-org" type="text" name="rerun-course-org" aria-required="true" placeholder="e.g. UniversityX or OrganizationX" />
|
||||
<span class="tip">
|
||||
The name of the organization sponsoring the new course. (This name is often the same as the original organization name.)
|
||||
<strong class="tip-note">Note: No spaces or special characters are allowed.</strong>
|
||||
</span>
|
||||
<span class="tip tip-error is-hiding"></span>
|
||||
</li>
|
||||
|
||||
<li class="row">
|
||||
<div class="column field text required" id="field-course-number">
|
||||
<label for="rerun-course-number">Course Number</label>
|
||||
<input class="rerun-course-number" id="rerun-course-number" type="text" name="rerun-course-number" aria-required="true" placeholder="e.g. CS101" />
|
||||
<span class="tip">
|
||||
The unique number that identifies the new course within the organization. (This number is often the same as the original course number.)
|
||||
<strong class="tip-note">Note: No spaces or special characters are allowed.</strong>
|
||||
</span>
|
||||
<span class="tip tip-error is-hiding"></span>
|
||||
</div>
|
||||
|
||||
<div class="column field text required" id="field-course-run">
|
||||
<label for="rerun-course-run">Course Run</label>
|
||||
<input class="rerun-course-run" id="rerun-course-run" type="text" name="rerun-course-run" aria-required="true"placeholder="e.g. 2014_T1" />
|
||||
<span class="tip">
|
||||
The term in which the new course will run. (This value is often different than the original course run value.)
|
||||
<strong class="tip-note">Note: No spaces or special characters are allowed.</strong>
|
||||
</span>
|
||||
<span class="tip tip-error is-hiding"></span>
|
||||
</div>
|
||||
</li>
|
||||
</ol>
|
||||
|
||||
<input type="hidden" value="" class="allow-unicode-course-id" /> <!-- TODO: need to add support for allow_unicode_course_id in real view's template -->
|
||||
</fieldset>
|
||||
</div>
|
||||
|
||||
<div class="actions">
|
||||
<button type="submit" class="action action-primary rerun-course-save is-disabled is-processing" aria-disabled="true">
|
||||
<i class="icon fa fa-refresh fa-spin"></i>
|
||||
Processing Re-run Request
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div><!-- /rerun-course -->
|
||||
|
||||
</article><!-- /content-primary -->
|
||||
|
||||
<aside class="content-supplementary" role="complementary">
|
||||
<div class="bit">
|
||||
<h3 class="title-3">When will my course re-run start?</h3>
|
||||
<ul class="list-details">
|
||||
<li class="item-detail">Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Sed posuere consectetur est at lobortis. Maecenas faucibus mollis interdum.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="bit">
|
||||
<h3 class="title-3">What transfers from the original course?</h3>
|
||||
<ul class="list-details">
|
||||
<li class="item-detail">Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Sed posuere consectetur est at lobortis. Maecenas faucibus mollis interdum.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="bit">
|
||||
<h3 class="title-3">What does not transfer from the original course?</h3>
|
||||
<ul class="list-details">
|
||||
<li class="item-detail">Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Sed posuere consectetur est at lobortis. Maecenas faucibus mollis interdum.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</aside><!-- /content-supplementary -->
|
||||
|
||||
</section>
|
||||
</div><!-- /content -->
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</%block>
|
||||
@@ -1,3 +1,6 @@
|
||||
## Override the default styles_version to the Pattern Library version (version 2)
|
||||
<%! main_css = "style-main-v2" %>
|
||||
|
||||
<%page expression_filter="h"/>
|
||||
<%inherit file="../../base.html" />
|
||||
|
||||
@@ -22,8 +25,6 @@
|
||||
</div>
|
||||
<section class="xblock xblock-student_view xmodule_display xmodule_HtmlModule">
|
||||
<ul>
|
||||
<li><a href="container.html">Container page</a></li>
|
||||
<li><a href="unit.html">Unit page</a></li>
|
||||
<li><a href="pattern-library-test.html">Pattern Library test page</a></li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
@@ -1,127 +0,0 @@
|
||||
<%page expression_filter="h"/>
|
||||
<div class="wrapper wrapper-modal-window wrapper-modal-window-edit-xblock" aria-labelledby="modal-window-title" role="dialog">
|
||||
<div class="modal-window-overlay"></div>
|
||||
<div class="modal-window confirm modal-med modal-type-html modal-editor" style="top: 50px; left: 400px;" tabindex="-1" aria-labelledby="modal-window-title">
|
||||
<div class="edit-xblock-modal">
|
||||
<div class="modal-header">
|
||||
<h2 id="modal-window-title" class="title modal-window-title">Editing visibility for: [Component Name]</h2>
|
||||
</div>
|
||||
|
||||
<div class="modal-content">
|
||||
<div class="xblock-editor" data-locator="i4x://TestU/cohorts001/chapter/748152225449412a846bc24811a5621c" data-course-key="">
|
||||
|
||||
<div class="xblock xblock-visibility_view">
|
||||
|
||||
<div class="modal-section visibility-summary">
|
||||
<div class="summary-message summary-message-warning visibility-summary-message">
|
||||
<i class="icon fa fa-exclamation-triangle" aria-hidden="true"></i>
|
||||
<p class="copy"><span class="sr">Warning: </span>This component is contained in a unit that is hidden from students. Component visibility settings are overridden by the unit visibility settings.</p>
|
||||
</div>
|
||||
|
||||
<!-- NOTE: use when no group configuration has been set -->
|
||||
<div class="is-not-configured has-actions">
|
||||
<h4 class="title">You have not set up any groups</h4>
|
||||
|
||||
<div class="copy">
|
||||
<p>Groups are a way for you to organize content in your course with a particular student experience in mind. They are commonly used to facilitate content and pedagogical experiments as well as to provide different tracks of content.</p>
|
||||
</div>
|
||||
|
||||
<div class="actions">
|
||||
<a href="" class="action action-primary action-settings">Manage groups in this course</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form class="visibility-controls-form" method="post" action="">
|
||||
|
||||
<div class="modal-section visibility-controls">
|
||||
<h3 class="modal-section-title">Set visibility to:</h3>
|
||||
|
||||
<div class="modal-section-content">
|
||||
|
||||
<section class="visibility-controls-primary">
|
||||
<ul class="list-fields list-radio">
|
||||
<li class="field field-radio field-visibility-level">
|
||||
<input type="radio" id="visibility-level-all" name="visibility-level" value="" class="input input-radio visibility-level-all" />
|
||||
<label for="visibility-level-all" class="label">All Students and Staff</label>
|
||||
</li>
|
||||
|
||||
<li class="field field-radio field-visibility-level">
|
||||
<input type="radio" id="visibility-level-specific" name="visibility-level" value="" class="input input-radio visibility-level-specific" checked="checked" />
|
||||
<label for="visibility-level-specific" class="label">Specific Groups</label>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<!-- NOTE: @andyarmstrong, if you need this wrapper to show and hide, great. If not, please remove it from the DOM -->
|
||||
<div class="wrapper-visibility-specific">
|
||||
|
||||
<section class="visibility-controls-secondary">
|
||||
<div class="visibility-controls-group">
|
||||
<h4 class="visibility-controls-title modal-subsection-title sr">Content Groups</h4>
|
||||
<ul class="list-fields list-checkbox">
|
||||
<li class="field field-checkbox field-visibility-content-group">
|
||||
<input type="checkbox" id="visibility-content-group-NAME1" name="visibility-content-group" value="" class="input input-checkbox visibility-content-group-NAME1" />
|
||||
<label for="visibility-content-group-NAME1" class="label">Content Group NAME 1</label>
|
||||
</li>
|
||||
|
||||
<li class="field field-checkbox field-visibility-content-group">
|
||||
<input type="checkbox" id="visibility-content-group-NAME2" name="visibility-content-group" value="" class="input input-checkbox visibility-content-group-NAME2" />
|
||||
<label for="visibility-content-group-NAME2" class="label">Content Group NAME 2</label>
|
||||
</li>
|
||||
|
||||
<li class="field field-checkbox field-visibility-content-group">
|
||||
<input type="checkbox" id="visibility-content-group-NAME3" name="visibility-content-group" value="" class="input input-checkbox visibility-content-group-NAME3" />
|
||||
<label for="visibility-content-group-NAME3" class="label">Content Group NAME 3</label>
|
||||
</li>
|
||||
|
||||
<li class="field field-checkbox field-visibility-content-group">
|
||||
<input type="checkbox" id="visibility-content-group-NAME4" name="visibility-content-group" value="" class="input input-checkbox visibility-content-group-NAME4" />
|
||||
<label for="visibility-content-group-NAME4" class="label">Content Group NAME 4</label>
|
||||
</li>
|
||||
|
||||
<!-- NOTE: @andyarmstrong, here's an example of how we would treat a group that was deleted/removed - we need a .was removed class and an additional UI element called a .note -->
|
||||
<li class="field field-checkbox field-visibility-content-group was-removed">
|
||||
<input type="checkbox" id="visibility-content-group-deleted1" name="visibility-content-group" value="" class="input input-checkbox visibility-content-group-deleted" checked="checked" />
|
||||
<label for="visibility-content-group-deleted1" class="label">
|
||||
Deleted Content Group
|
||||
</label>
|
||||
<span class="note">The selected group no longer exists. Choose another group or make the component visible to All Students and Staff</span>
|
||||
</li>
|
||||
|
||||
<!-- NOTE: @andyarmstrong, here's an example of how we would treat a group that was deleted/removed - we need a .was removed class and an additional UI element called a .note -->
|
||||
<li class="field field-checkbox field-visibility-content-group was-removed">
|
||||
<input type="checkbox" id="visibility-content-group-deleted1" name="visibility-content-group" value="" class="input input-checkbox visibility-content-group-deleted" checked="checked" />
|
||||
<label for="visibility-content-group-deleted1" class="label">
|
||||
Deleted Content Group
|
||||
</label>
|
||||
<span class="note">The selected group no longer exists. Choose another group or make the component visible to All Students and Staff</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</form>
|
||||
|
||||
</div><!-- .xblock -->
|
||||
</div><!-- .xblock-editor -->
|
||||
</div><!-- .modal-content -->
|
||||
|
||||
<div class="modal-actions">
|
||||
<h3 class="sr">Actions</h3>
|
||||
<ul>
|
||||
<li class="action-item">
|
||||
<a href="#" class="button action-primary action-save">Save</a>
|
||||
</li>
|
||||
|
||||
<li class="action-item">
|
||||
<a href="#" class="button action-cancel">Cancel</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div><!-- .xblock-visibility-modal -->
|
||||
</div><!-- .modal-window -->
|
||||
</div><!-- .wrapper-modal-window -->
|
||||
@@ -1,144 +0,0 @@
|
||||
<%page expression_filter="h"/>
|
||||
<%! from django.utils.translation import ugettext as _ %>
|
||||
|
||||
<div class="wrapper wrapper-modal-window wrapper-modal-window-bulkpublish-section" aria-labelledby="modal-window-title" role="dialog">
|
||||
<div class="modal-window-overlay"></div>
|
||||
<div style="top: 5%; left: 30%;" class="modal-window confirm modal-med modal-type-confirm">
|
||||
<div class="bulkpublish-section-modal">
|
||||
<div class="modal-header">
|
||||
<h2 class="title modal-window-title">Publish [section name]</h2>
|
||||
</div>
|
||||
|
||||
<div class="modal-content">
|
||||
<div class="message modal-introduction">
|
||||
<p>Publish all unpublished changes for this section?</p>
|
||||
</div>
|
||||
|
||||
<div class="modal-section bulkpublish-included">
|
||||
<h3 class="modal-section-title">The following will be published:</h3>
|
||||
<div class="modal-section-content">
|
||||
<div class="outline outline-simple outline-bulkpublish">
|
||||
<ol class="list-subsections">
|
||||
<li class="outline-item outline-subsection">
|
||||
<h4 class="subsection-title item-title">Subsection Title</h4>
|
||||
|
||||
<div class="subsection-content">
|
||||
<ol class="list-units">
|
||||
<li class="outline-item outline-unit">
|
||||
<span class="unit-title item-title">Unit Title</span>
|
||||
</li>
|
||||
<li class="outline-item outline-unit">
|
||||
<span class="unit-title item-title">Unit Title</span>
|
||||
</li>
|
||||
<li class="outline-item outline-unit">
|
||||
<span class="unit-title item-title">Unit Title</span>
|
||||
</li>
|
||||
<li class="outline-item outline-unit">
|
||||
<span class="unit-title item-title">Unit Title</span>
|
||||
</li>
|
||||
<li class="outline-item outline-unit">
|
||||
<span class="unit-title item-title">Unit Title</span>
|
||||
</li>
|
||||
<li class="outline-item outline-unit">
|
||||
<span class="unit-title item-title">Unit Title that is really really really long and may span more than just one visual line of text.</span>
|
||||
</li>
|
||||
<li class="outline-item outline-unit">
|
||||
<span class="unit-title item-title">Unit Title</span>
|
||||
</li>
|
||||
<li class="outline-item outline-unit">
|
||||
<span class="unit-title item-title">Unit Title</span>
|
||||
</li>
|
||||
<li class="outline-item outline-unit">
|
||||
<span class="unit-title item-title">Unit Title</span>
|
||||
</li>
|
||||
<li class="outline-item outline-unit">
|
||||
<span class="unit-title item-title">Unit Title</span>
|
||||
</li>
|
||||
<li class="outline-item outline-unit">
|
||||
<span class="unit-title item-title">Unit Title</span>
|
||||
</li>
|
||||
</ol>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="outline-item outline-subsection">
|
||||
<h4 class="subsection-title item-title">Subsection Title</h4>
|
||||
|
||||
<div class="subsection-content">
|
||||
<ol class="list-units">
|
||||
<li class="outline-item outline-unit">
|
||||
<span class="unit-title item-title">Unit Title</span>
|
||||
</li>
|
||||
<li class="outline-item outline-unit">
|
||||
<span class="unit-title item-title">Unit Title</span>
|
||||
</li>
|
||||
<li class="outline-item outline-unit">
|
||||
<span class="unit-title item-title">Unit Title</span>
|
||||
</li>
|
||||
<li class="outline-item outline-unit">
|
||||
<span class="unit-title item-title">Unit Title</span>
|
||||
</li>
|
||||
<li class="outline-item outline-unit">
|
||||
<span class="unit-title item-title">Unit Title</span>
|
||||
</li>
|
||||
<li class="outline-item outline-unit">
|
||||
<span class="unit-title item-title">Unit Title that is really really really long and may span more than just one visual line of text.</span>
|
||||
</li>
|
||||
<li class="outline-item outline-unit">
|
||||
<span class="unit-title item-title">Unit Title</span>
|
||||
</li>
|
||||
</ol>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="outline-item outline-subsection">
|
||||
<h4 class="subsection-title item-title">Subsection Title</h4>
|
||||
|
||||
<div class="subsection-content">
|
||||
<ol class="list-units">
|
||||
<ol class="list-units">
|
||||
<li class="outline-item outline-unit">
|
||||
<span class="unit-title item-title">Unit Title</span>
|
||||
</li>
|
||||
<li class="outline-item outline-unit">
|
||||
<span class="unit-title item-title">Unit Title</span>
|
||||
</li>
|
||||
<li class="outline-item outline-unit">
|
||||
<span class="unit-title item-title">Unit Title</span>
|
||||
</li>
|
||||
<li class="outline-item outline-unit">
|
||||
<span class="unit-title item-title">Unit Title</span>
|
||||
</li>
|
||||
<li class="outline-item outline-unit">
|
||||
<span class="unit-title item-title">Unit Title</span>
|
||||
</li>
|
||||
<li class="outline-item outline-unit">
|
||||
<span class="unit-title item-title">Unit Title that is really really really long and may span more than just one visual line of text.</span>
|
||||
</li>
|
||||
<li class="outline-item outline-unit">
|
||||
<span class="unit-title item-title">Unit Title</span>
|
||||
</li>
|
||||
</ol>
|
||||
</ol>
|
||||
</div>
|
||||
</li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="modal-actions">
|
||||
<h3 class="sr">Actions</h3>
|
||||
<ul>
|
||||
<li class="action-item">
|
||||
<a href="#" class="button action-primary action-publish">Publish</a>
|
||||
</li>
|
||||
<li class="action-item">
|
||||
<a href="#" class="button action-cancel">Cancel</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,74 +0,0 @@
|
||||
<%page expression_filter="h"/>
|
||||
<%! from django.utils.translation import ugettext as _ %>
|
||||
|
||||
<div class="wrapper wrapper-modal-window wrapper-modal-window-bulkpublish-subsection" aria-labelledby="modal-window-title" role="dialog">
|
||||
<div class="modal-window-overlay"></div>
|
||||
<div style="top: 5%; left: 30%;" class="modal-window confirm modal-med modal-type-confirm">
|
||||
<div class="bulkpublish-subsection-modal">
|
||||
<div class="modal-header">
|
||||
<h2 class="title modal-window-title">Publish [subsection name]</h2>
|
||||
</div>
|
||||
|
||||
<div class="modal-content">
|
||||
<div class="message modal-introduction">
|
||||
<p>Publish all unpublished changes for this subsection?</p>
|
||||
</div>
|
||||
|
||||
<div class="modal-section bulkpublish-included">
|
||||
<h3 class="modal-section-title">The following will be published:</h3>
|
||||
<div class="modal-section-content">
|
||||
<div class="outline outline-simple outline-bulkpublish">
|
||||
<ol class="list-units">
|
||||
<li class="outline-item outline-unit">
|
||||
<span class="unit-title item-title">Unit Title</span>
|
||||
</li>
|
||||
<li class="outline-item outline-unit">
|
||||
<span class="unit-title item-title">Unit Title</span>
|
||||
</li>
|
||||
<li class="outline-item outline-unit">
|
||||
<span class="unit-title item-title">Unit Title</span>
|
||||
</li>
|
||||
<li class="outline-item outline-unit">
|
||||
<span class="unit-title item-title">Unit Title</span>
|
||||
</li>
|
||||
<li class="outline-item outline-unit">
|
||||
<span class="unit-title item-title">Unit Title</span>
|
||||
</li>
|
||||
<li class="outline-item outline-unit">
|
||||
<span class="unit-title item-title">Unit Title that is really really really long and may span more than just one visual line of text.</span>
|
||||
</li>
|
||||
<li class="outline-item outline-unit">
|
||||
<span class="unit-title item-title">Unit Title</span>
|
||||
</li>
|
||||
<li class="outline-item outline-unit">
|
||||
<span class="unit-title item-title">Unit Title</span>
|
||||
</li>
|
||||
<li class="outline-item outline-unit">
|
||||
<span class="unit-title item-title">Unit Title</span>
|
||||
</li>
|
||||
<li class="outline-item outline-unit">
|
||||
<span class="unit-title item-title">Unit Title</span>
|
||||
</li>
|
||||
<li class="outline-item outline-unit">
|
||||
<span class="unit-title item-title">Unit Title</span>
|
||||
</li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="modal-actions">
|
||||
<h3 class="sr">Actions</h3>
|
||||
<ul>
|
||||
<li class="action-item">
|
||||
<a href="#" class="button action-primary action-publish">Publish</a>
|
||||
</li>
|
||||
<li class="action-item">
|
||||
<a href="#" class="button action-cancel">Cancel</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,31 +0,0 @@
|
||||
<%page expression_filter="h"/>
|
||||
<%! from django.utils.translation import ugettext as _ %>
|
||||
|
||||
<div class="wrapper wrapper-modal-window wrapper-modal-window-bulkpublish-unit" aria-labelledby="modal-window-title" role="dialog">
|
||||
<div class="modal-window-overlay"></div>
|
||||
<div style="top: 5%; left: 30%;" class="modal-window confirm modal-med modal-type-confirm">
|
||||
<div class="bulkpublish-unit-modal">
|
||||
<div class="modal-header">
|
||||
<h2 class="title modal-window-title">Publish [unit name]</h2>
|
||||
</div>
|
||||
|
||||
<div class="modal-content">
|
||||
<div class="message modal-introduction">
|
||||
<p>Publish all unpublished changes for this unit?</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="modal-actions">
|
||||
<h3 class="sr">Actions</h3>
|
||||
<ul>
|
||||
<li class="action-item">
|
||||
<a href="#" class="button action-primary action-publish">Publish</a>
|
||||
</li>
|
||||
<li class="action-item">
|
||||
<a href="#" class="button action-cancel">Cancel</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,773 +0,0 @@
|
||||
<%inherit file="../../base.html" />
|
||||
|
||||
<%block name="view_notes">
|
||||
<%include file="_note-usage.html" />
|
||||
</%block>
|
||||
|
||||
<%!
|
||||
from django.core.urlresolvers import reverse
|
||||
%>
|
||||
<%block name="title">[template] Course Outline UI</%block>
|
||||
<%block name="bodyclass">is-signedin course view-outline</%block>
|
||||
|
||||
<%block name="content">
|
||||
|
||||
<div id="content">
|
||||
|
||||
<div class="wrapper-mast wrapper">
|
||||
<header class="mast has-actions has-subtitle">
|
||||
<h1 class="page-header">
|
||||
<small class="subtitle">Content</small>
|
||||
<span class="sr">> </span>Course Outline
|
||||
</h1>
|
||||
|
||||
<nav class="nav-actions" aria-label="${_('Page Actions')}">
|
||||
<h3 class="sr">Page Actions</h3>
|
||||
<ul>
|
||||
<li class="nav-item">
|
||||
<a href="#" class="button button-new" data-category="chapter" data-parent="" data-default-name="">
|
||||
<i class="icon fa fa-plus"></i>New Section
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="#" class="button button-toggle button-toggle-expand-collapse collapse-all">
|
||||
<span class="collapse-all"><i class="icon fa fa-arrow-up"></i> <span class="label">Collapse All Sections</span></span>
|
||||
<span class="expand-all"><i class="icon fa fa-arrow-down"></i> <span class="label">Expand All Sections</span></span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="" rel="external" class="button button-view view-live-button" title="This link will open in a new browser window/tab">View Live</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</header>
|
||||
</div>
|
||||
|
||||
<div class="wrapper-content wrapper">
|
||||
<section class="content">
|
||||
|
||||
<article class="content-primary" role="main">
|
||||
|
||||
<div class="wrapper-dnd">
|
||||
<article class="outline" data-locator="" data-course-key="">
|
||||
<h2 class="sr outline-title">Your Course's Outline</h2>
|
||||
|
||||
<ol class="list-sections is-sortable">
|
||||
|
||||
<!-- section -->
|
||||
<li class="outline-item outline-section is-collapsible is-draggable" data-parent="" data-locator="">
|
||||
|
||||
<%include file="outline_section_header-expanded.html" />
|
||||
|
||||
<div class="section-status">
|
||||
<%include file="outline_status_release-scheduled.html" />
|
||||
</div>
|
||||
<!-- /section-status -->
|
||||
|
||||
<div class="section-content">
|
||||
<ol class="list-subsections is-sortable">
|
||||
<!-- subsection -->
|
||||
<li class="outline-item outline-subsection is-collapsible is-draggable" data-parent="" data-locator="">
|
||||
|
||||
<%include file="outline_subsection_header-expanded.html" />
|
||||
|
||||
<div class="subsection-status">
|
||||
<%include file="outline_status_release-scheduled.html" />
|
||||
|
||||
<%include file="outline_status_grading.html" />
|
||||
</div>
|
||||
<!-- /subsection-status -->
|
||||
|
||||
<div class="subsection-content">
|
||||
<ol class="list-units is-sortable">
|
||||
<!-- unit -->
|
||||
<li class="outline-item outline-unit is-draggable" data-parent="" data-locator="">
|
||||
<%include file="outline_unit_header.html" />
|
||||
</li>
|
||||
</ol>
|
||||
<!-- /list: units -->
|
||||
</div>
|
||||
|
||||
<%include file="outline_add-unit.html" />
|
||||
|
||||
<!-- /subsection-content -->
|
||||
</li>
|
||||
<!-- /subsection -->
|
||||
|
||||
<!-- subsection -->
|
||||
<li class="outline-item outline-subsection is-collapsible is-draggable" data-parent="" data-locator="">
|
||||
|
||||
<%include file="outline_subsection_header-expanded.html" />
|
||||
|
||||
<div class="subsection-status">
|
||||
<%include file="outline_status_release-scheduled.html" />
|
||||
|
||||
<%include file="outline_status_grading.html" />
|
||||
</div>
|
||||
<!-- /subsection-status -->
|
||||
|
||||
<div class="subsection-content">
|
||||
<ol class="list-units is-sortable">
|
||||
<!-- unit -->
|
||||
<li class="outline-item outline-unit is-draggable" data-parent="" data-locator="">
|
||||
<%include file="outline_unit_header.html" />
|
||||
</li>
|
||||
|
||||
<!-- unit -->
|
||||
<li class="outline-item outline-unit is-draggable" data-parent="" data-locator="">
|
||||
<%include file="outline_unit_header.html" />
|
||||
</li>
|
||||
|
||||
<!-- unit -->
|
||||
<li class="outline-item outline-unit is-draggable" data-parent="" data-locator="">
|
||||
<%include file="outline_unit_header.html" />
|
||||
</li>
|
||||
|
||||
<!-- unit -->
|
||||
<li class="outline-item outline-unit is-draggable" data-parent="" data-locator="">
|
||||
<%include file="outline_unit_header.html" />
|
||||
</li>
|
||||
</ol>
|
||||
<!-- /list: units -->
|
||||
|
||||
<%include file="outline_add-unit.html" />
|
||||
|
||||
</div>
|
||||
<!-- /subsection-content -->
|
||||
</li>
|
||||
<!-- /subsection -->
|
||||
</ol>
|
||||
<!-- /list: subsections -->
|
||||
|
||||
<%include file="outline_add-subsection.html" />
|
||||
|
||||
</div>
|
||||
<!-- /section-content -->
|
||||
</li>
|
||||
<!-- /section -->
|
||||
</ol>
|
||||
<!-- /list: sections -->
|
||||
|
||||
<%include file="outline_add-section.html" />
|
||||
|
||||
|
||||
<!-- ========== -->
|
||||
|
||||
|
||||
<!-- STATES: sections -->
|
||||
<ol class="list-sections is-sortable">
|
||||
|
||||
<!-- section: not published + not scheduled/released -->
|
||||
<li class="outline-item outline-section is-collapsible is-draggable is-collapsed" data-parent="" data-locator="">
|
||||
|
||||
<%include file="outline_section_header-collapsed.html" />
|
||||
|
||||
<div class="section-status">
|
||||
<%include file="outline_status_release-draft.html" />
|
||||
</div>
|
||||
<!-- /section-status -->
|
||||
|
||||
<div class="section-content">
|
||||
<!-- subsections + units here -->
|
||||
</div>
|
||||
</li>
|
||||
<!-- /section: not published + not scheduled/released -->
|
||||
|
||||
<!-- section: published + scheduled -->
|
||||
<li class="outline-item outline-section is-collapsible is-draggable is-ready is-collapsed" data-parent="" data-locator="">
|
||||
|
||||
<%include file="outline_section_header-collapsed.html" />
|
||||
|
||||
<div class="section-status">
|
||||
<%include file="outline_status_release-scheduled.html" />
|
||||
</div>
|
||||
<!-- /section-status -->
|
||||
|
||||
<div class="section-content">
|
||||
<!-- subsections + units here -->
|
||||
</div>
|
||||
</li>
|
||||
<!-- /section: published + scheduled -->
|
||||
|
||||
<!-- section: published + released -->
|
||||
<li class="outline-item outline-section is-collapsible is-draggable is-live is-collapsed" data-parent="" data-locator="">
|
||||
|
||||
<%include file="outline_section_header-collapsed.html" />
|
||||
|
||||
<div class="section-status">
|
||||
<%include file="outline_status_release-released.html" />
|
||||
</div>
|
||||
<!-- /section-status -->
|
||||
|
||||
<div class="section-content">
|
||||
<!-- subsections + units here -->
|
||||
</div>
|
||||
</li>
|
||||
<!-- /section: published + released -->
|
||||
|
||||
<!-- section: published + scheduled + locked content -->
|
||||
<li class="outline-item outline-section is-collapsible is-draggable is-ready is-collapsed" data-parent="" data-locator="">
|
||||
|
||||
<%include file="outline_section_header-collapsed.html" />
|
||||
|
||||
<div class="section-status">
|
||||
<%include file="outline_status_release-scheduled.html" />
|
||||
|
||||
<%include file="outline_status_message-lock.html" />
|
||||
</div>
|
||||
<!-- /section-status -->
|
||||
|
||||
<div class="section-content">
|
||||
<!-- subsections + units here -->
|
||||
</div>
|
||||
</li>
|
||||
<!-- /section: published + scheduled + locked content -->
|
||||
|
||||
<!-- section: published + released + locked content -->
|
||||
<li class="outline-item outline-section is-collapsible is-draggable is-live is-collapsed" data-parent="" data-locator="">
|
||||
|
||||
<%include file="outline_section_header-collapsed.html" />
|
||||
|
||||
<div class="section-status">
|
||||
<%include file="outline_status_release-released.html" />
|
||||
|
||||
<%include file="outline_status_message-lock.html" />
|
||||
</div>
|
||||
<!-- /section-status -->
|
||||
|
||||
<div class="section-content">
|
||||
<!-- subsections + units here -->
|
||||
</div>
|
||||
</li>
|
||||
<!-- /section: published + released + locked content -->
|
||||
|
||||
<!-- section: locked content -->
|
||||
<li class="outline-item outline-section is-collapsible is-draggable is-staff-only is-collapsed" data-parent="" data-locator="">
|
||||
|
||||
<%include file="outline_section_header-collapsed.html" />
|
||||
|
||||
<div class="section-status">
|
||||
<%include file="outline_status_release-lock.html" />
|
||||
</div>
|
||||
<!-- /section-status -->
|
||||
|
||||
<div class="section-content">
|
||||
<!-- subsections + units here -->
|
||||
</div>
|
||||
</li>
|
||||
<!-- /section: locked content -->
|
||||
|
||||
<!-- section: published + released + has unpublished content -->
|
||||
<li class="outline-item outline-section is-collapsible is-draggable has-warnings is-collapsed" data-parent="" data-locator="">
|
||||
|
||||
<%include file="outline_section_header-collapsed.html" />
|
||||
|
||||
<div class="section-status">
|
||||
<%include file="outline_status_release-released.html" />
|
||||
|
||||
<%include file="outline_status_message-unpublished_changes.html" />
|
||||
</div>
|
||||
<!-- /section-status -->
|
||||
|
||||
<div class="section-content">
|
||||
<!-- subsections + units here -->
|
||||
</div>
|
||||
</li>
|
||||
<!-- /section: published + released + has unpublished content -->
|
||||
|
||||
<!-- section: published + scheduled + has unpublished content -->
|
||||
<li class="outline-item outline-section is-collapsible is-draggable has-warnings is-collapsed" data-parent="" data-locator="">
|
||||
|
||||
<%include file="outline_section_header-collapsed.html" />
|
||||
|
||||
<div class="section-status">
|
||||
<%include file="outline_status_release-scheduled.html" />
|
||||
|
||||
<%include file="outline_status_message-unpublished_changes.html" />
|
||||
</div>
|
||||
<!-- /section-status -->
|
||||
|
||||
<div class="section-content">
|
||||
<!-- subsections + units here -->
|
||||
</div>
|
||||
</li>
|
||||
<!-- /section: published + scheduled + has unpublished content -->
|
||||
|
||||
<!-- section: published + released + has error -->
|
||||
<li class="outline-item outline-section is-collapsible is-draggable has-errors is-collapsed" data-parent="" data-locator="">
|
||||
|
||||
<%include file="outline_section_header-collapsed.html" />
|
||||
|
||||
<div class="section-status">
|
||||
<%include file="outline_status_release-released.html" />
|
||||
|
||||
<%include file="outline_status_message-error.html" />
|
||||
</div>
|
||||
<!-- /section-status -->
|
||||
|
||||
<div class="section-content">
|
||||
<!-- subsections + units here -->
|
||||
</div>
|
||||
</li>
|
||||
<!-- /section: published + released + has error -->
|
||||
|
||||
<!-- section: published + scheduled + has error -->
|
||||
<li class="outline-item outline-section is-collapsible is-draggable has-errors is-collapsed" data-parent="" data-locator="">
|
||||
|
||||
<%include file="outline_section_header-collapsed.html" />
|
||||
|
||||
<div class="section-status">
|
||||
<%include file="outline_status_release-scheduled.html" />
|
||||
|
||||
<%include file="outline_status_message-error.html" />
|
||||
</div>
|
||||
<!-- /section-status -->
|
||||
|
||||
<div class="section-content">
|
||||
<!-- subsections + units here -->
|
||||
</div>
|
||||
</li>
|
||||
<!-- /section: published + scheduled + has error -->
|
||||
|
||||
|
||||
<!-- ========== -->
|
||||
|
||||
|
||||
<!-- section: placeholder -->
|
||||
<li class="outline-item outline-section is-collapsible is-draggable" data-parent="" data-locator="">
|
||||
|
||||
<%include file="outline_section_header-expanded.html" />
|
||||
|
||||
<div class="section-status">
|
||||
<%include file="outline_status_release-draft.html" />
|
||||
</div>
|
||||
<!-- /section-status -->
|
||||
|
||||
<div class="section-content">
|
||||
<ol class="list-subsections is-sortable">
|
||||
<!-- subsection: not published + not scheduled/released -->
|
||||
<li class="outline-item outline-subsection is-collapsible is-draggable is-collapsed" data-parent="" data-locator="">
|
||||
|
||||
<%include file="outline_subsection_header-collapsed.html" />
|
||||
|
||||
<div class="subsection-status">
|
||||
<%include file="outline_status_release-draft.html" />
|
||||
</div>
|
||||
<!-- /subsection-status -->
|
||||
|
||||
<div class="subsection-content">
|
||||
<!-- units here -->
|
||||
</div>
|
||||
<!-- /subsection-content -->
|
||||
</li>
|
||||
<!-- /subsection: not published + not scheduled/released -->
|
||||
|
||||
<!-- subsection: not published + not scheduled/released + graded -->
|
||||
<li class="outline-item outline-subsection is-collapsible is-draggable is-collapsed" data-parent="" data-locator="">
|
||||
|
||||
<%include file="outline_subsection_header-collapsed.html" />
|
||||
|
||||
<div class="subsection-status">
|
||||
<%include file="outline_status_release-draft.html" />
|
||||
|
||||
<%include file="outline_status_grading.html" />
|
||||
</div>
|
||||
<!-- /subsection-status -->
|
||||
|
||||
<div class="subsection-content">
|
||||
</div>
|
||||
<!-- /subsection-content -->
|
||||
</li>
|
||||
<!-- /subsection: not published + not scheduled/released + graded -->
|
||||
|
||||
<!-- subsection: published + scheduled w/ section -->
|
||||
<li class="outline-item outline-subsection is-collapsible is-ready is-collapsed" data-parent="" data-locator="">
|
||||
|
||||
<%include file="outline_subsection_header-collapsed.html" />
|
||||
|
||||
<div class="subsection-status">
|
||||
<%include file="outline_status_release-scheduled_with_parent.html" />
|
||||
</div>
|
||||
<!-- /subsection-status -->
|
||||
|
||||
<div class="subsection-content">
|
||||
</div>
|
||||
<!-- /subsection-content -->
|
||||
</li>
|
||||
<!-- /subsection: published + scheduled w/ section -->
|
||||
|
||||
<!-- subsection: published + scheduled + graded -->
|
||||
<li class="outline-item outline-subsection is-collapsible is-draggable is-ready is-collapsed" data-parent="" data-locator="">
|
||||
|
||||
<%include file="outline_subsection_header-collapsed.html" />
|
||||
|
||||
<div class="subsection-status">
|
||||
<%include file="outline_status_release-scheduled.html" />
|
||||
|
||||
<%include file="outline_status_grading.html" />
|
||||
</div>
|
||||
<!-- /subsection-status -->
|
||||
|
||||
<div class="subsection-content">
|
||||
</div>
|
||||
<!-- /subsection-content -->
|
||||
</li>
|
||||
<!-- /subsection: published + scheduled + graded -->
|
||||
|
||||
<!-- subsection: published + scheduled + graded + due date -->
|
||||
<li class="outline-item outline-subsection is-collapsible is-draggable is-ready is-collapsed" data-parent="" data-locator="">
|
||||
|
||||
<%include file="outline_subsection_header-collapsed.html" />
|
||||
|
||||
<div class="subsection-status">
|
||||
<%include file="outline_status_release-scheduled.html" />
|
||||
|
||||
<%include file="outline_status_grading.html" />
|
||||
</div>
|
||||
<!-- /subsection-status -->
|
||||
|
||||
<div class="subsection-content">
|
||||
</div>
|
||||
<!-- /subsection-content -->
|
||||
</li>
|
||||
<!-- /subsection: published + scheduled + graded + due date -->
|
||||
|
||||
<!-- subsection: published + scheduled + graded + due date + locked content -->
|
||||
<li class="outline-item outline-subsection is-collapsible is-draggable is-ready is-collapsed" data-parent="" data-locator="">
|
||||
|
||||
<%include file="outline_subsection_header-collapsed.html" />
|
||||
|
||||
<div class="subsection-status">
|
||||
<%include file="outline_status_release-scheduled.html" />
|
||||
|
||||
<%include file="outline_status_grading.html" />
|
||||
|
||||
<%include file="outline_status_message-lock.html" />
|
||||
</div>
|
||||
<!-- /subsection-status -->
|
||||
|
||||
<div class="subsection-content">
|
||||
</div>
|
||||
<!-- /subsection-content -->
|
||||
</li>
|
||||
<!-- /subsection: published + scheduled + graded + due date + locked content -->
|
||||
|
||||
<!-- subsection: published + released -->
|
||||
<li class="outline-item outline-subsection is-collapsible is-draggable is-live is-scheduled is-collapsed" data-parent="" data-locator="">
|
||||
|
||||
<%include file="outline_subsection_header-collapsed.html" />
|
||||
|
||||
<div class="subsection-status">
|
||||
<%include file="outline_status_release-released_with_parent.html" />
|
||||
</div>
|
||||
<!-- /subsection-status -->
|
||||
|
||||
<div class="subsection-content">
|
||||
</div>
|
||||
<!-- /subsection-content -->
|
||||
</li>
|
||||
<!-- /subsection: published + released -->
|
||||
|
||||
<!-- subsection: published + released (on specific date) + graded -->
|
||||
<li class="outline-item outline-subsection is-collapsible is-draggable is-live is-collapsed" data-parent="" data-locator="">
|
||||
|
||||
<%include file="outline_subsection_header-collapsed.html" />
|
||||
|
||||
<div class="subsection-status">
|
||||
<div class="status-release">
|
||||
<p>
|
||||
<span class="sr status-release-label">Release Status:</span>
|
||||
<span class="status-release-value">
|
||||
<i class="icon fa fa-check-square"></i>
|
||||
Released <span class="sr">on</span>:
|
||||
</span>
|
||||
<span class="status-release-date">March 25, 2014</span>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<%include file="outline_status_grading.html" />
|
||||
</div>
|
||||
<!-- /subsection-status -->
|
||||
|
||||
<div class="subsection-content">
|
||||
</div>
|
||||
<!-- /subsection-content -->
|
||||
</li>
|
||||
<!-- /subsection: published + released (on specific date) + graded -->
|
||||
|
||||
<!-- subsection: published + released + graded + due date -->
|
||||
<li class="outline-item outline-subsection is-collapsible is-draggable is-live is-collapsed" data-parent="" data-locator="">
|
||||
|
||||
<%include file="outline_subsection_header-collapsed.html" />
|
||||
|
||||
<div class="subsection-status">
|
||||
<%include file="outline_status_release-released_with_parent.html" />
|
||||
|
||||
<%include file="outline_status_grading.html" />
|
||||
</div>
|
||||
<!-- /subsection-status -->
|
||||
|
||||
<div class="subsection-content">
|
||||
</div>
|
||||
<!-- /subsection-content -->
|
||||
</li>
|
||||
<!-- /subsection: published + released + graded + due date -->
|
||||
|
||||
<!-- subsection: published + released + graded + due date + locked content -->
|
||||
<li class="outline-item outline-subsection is-collapsible is-draggable is-live is-collapsed" data-parent="" data-locator="">
|
||||
|
||||
<%include file="outline_subsection_header-collapsed.html" />
|
||||
|
||||
<div class="subsection-status">
|
||||
<%include file="outline_status_release-released_with_parent.html" />
|
||||
|
||||
<%include file="outline_status_grading.html" />
|
||||
|
||||
<%include file="outline_status_message-lock.html" />
|
||||
</div>
|
||||
<!-- /subsection-status -->
|
||||
|
||||
<div class="subsection-content">
|
||||
</div>
|
||||
<!-- /subsection-content -->
|
||||
</li>
|
||||
<!-- /subsection: published + released + graded + due date + locked content -->
|
||||
|
||||
<!-- subsection: locked content -->
|
||||
<li class="outline-item outline-subsection is-collapsible is-draggable is-staff-only is-collapsed" data-parent="" data-locator="">
|
||||
|
||||
<%include file="outline_subsection_header-collapsed.html" />
|
||||
|
||||
<div class="subsection-status">
|
||||
<%include file="outline_status_release-lock.html" />
|
||||
</div>
|
||||
<!-- /subsection-status -->
|
||||
|
||||
<div class="subsection-content">
|
||||
</div>
|
||||
<!-- /subsection-content -->
|
||||
</li>
|
||||
<!-- /subsection: locked content -->
|
||||
|
||||
<!-- subsection: published + scheduled + has unpublished content -->
|
||||
<li class="outline-item outline-subsection is-collapsible is-draggable has-warnings is-collapsed" data-parent="" data-locator="">
|
||||
|
||||
<%include file="outline_subsection_header-collapsed.html" />
|
||||
|
||||
<div class="subsection-status">
|
||||
<%include file="outline_status_release-scheduled.html" />
|
||||
|
||||
<%include file="outline_status_message-unpublished_units.html" />
|
||||
</div>
|
||||
<!-- /subsection-status -->
|
||||
|
||||
<div class="subsection-content">
|
||||
</div>
|
||||
<!-- /subsection-content -->
|
||||
</li>
|
||||
<!-- /subsection: published + scheduled + has unpublished content -->
|
||||
|
||||
<!-- subsection: published + released + has unpublished content -->
|
||||
<li class="outline-item outline-subsection is-collapsible is-draggable has-warnings is-collapsed" data-parent="" data-locator="">
|
||||
|
||||
<%include file="outline_subsection_header-collapsed.html" />
|
||||
|
||||
<div class="subsection-status">
|
||||
<%include file="outline_status_release-released.html" />
|
||||
|
||||
<%include file="outline_status_message-unpublished_changes.html" />
|
||||
</div>
|
||||
<!-- /subsection-status -->
|
||||
|
||||
<div class="subsection-content">
|
||||
</div>
|
||||
<!-- /subsection-content -->
|
||||
</li>
|
||||
<!-- /subsection: published + released + has unpublished content -->
|
||||
|
||||
<!-- subsection: published + released + has error -->
|
||||
<li class="outline-item outline-subsection is-collapsible is-draggable has-errors is-collapsed" data-parent="" data-locator="">
|
||||
|
||||
<%include file="outline_subsection_header-collapsed.html" />
|
||||
|
||||
<div class="subsection-status">
|
||||
<%include file="outline_status_release-released.html" />
|
||||
|
||||
<%include file="outline_status_message-error.html" />
|
||||
</div>
|
||||
<!-- /subsection-status -->
|
||||
|
||||
<div class="subsection-content">
|
||||
</div>
|
||||
<!-- /subsection-content -->
|
||||
</li>
|
||||
<!-- /subsection: published + released + has error -->
|
||||
|
||||
<!-- subsection: published + scheduled + has error -->
|
||||
<li class="outline-item outline-subsection is-collapsible has-errors is-collapsed" data-parent="" data-locator="">
|
||||
|
||||
<%include file="outline_subsection_header-collapsed.html" />
|
||||
|
||||
<div class="subsection-status">
|
||||
<%include file="outline_status_release-scheduled.html" />
|
||||
|
||||
<%include file="outline_status_message-error.html" />
|
||||
</div>
|
||||
<!-- /subsection-status -->
|
||||
|
||||
<div class="subsection-content">
|
||||
</div>
|
||||
<!-- /subsection-content -->
|
||||
</li>
|
||||
<!-- /subsection: published + scheduled + has error -->
|
||||
</ol>
|
||||
</div>
|
||||
</li>
|
||||
<!-- /section: placeholder -->
|
||||
|
||||
|
||||
<!-- ========== -->
|
||||
|
||||
|
||||
<!-- section: placeholder -->
|
||||
<li class="outline-item outline-section is-collapsible is-draggable" data-parent="" data-locator="">
|
||||
|
||||
<%include file="outline_section_header-expanded.html" />
|
||||
|
||||
<div class="section-status">
|
||||
<%include file="outline_status_release-draft.html" />
|
||||
</div>
|
||||
<!-- /section-status -->
|
||||
|
||||
<div class="section-content">
|
||||
<ol class="list-subsections is-sortable">
|
||||
<!-- subsection: placeholder -->
|
||||
<li class="outline-item outline-subsection is-collapsible is-draggable" data-parent="" data-locator="">
|
||||
|
||||
<%include file="outline_subsection_header-expanded.html" />
|
||||
|
||||
<div class="subsection-status">
|
||||
<%include file="outline_status_release-scheduled.html" />
|
||||
</div>
|
||||
<!-- /subsection-status -->
|
||||
|
||||
<div class="subsection-content">
|
||||
<ol class="list-units is-sortable">
|
||||
|
||||
<!-- unit -->
|
||||
<li class="outline-item outline-unit is-draggable" data-parent="" data-locator="">
|
||||
<%include file="outline_unit_header.html" />
|
||||
|
||||
<div class="unit-status">
|
||||
|
||||
</div>
|
||||
<!-- /unit-status -->
|
||||
</li>
|
||||
<!-- /unit -->
|
||||
|
||||
|
||||
<!-- unit: not published -->
|
||||
<li class="outline-item outline-unit is-draggable" data-parent="" data-locator="">
|
||||
<%include file="outline_unit_header.html" />
|
||||
|
||||
<div class="unit-status">
|
||||
<%include file="outline_status_release-draft.html" />
|
||||
</div>
|
||||
<!-- /unit-status -->
|
||||
</li>
|
||||
<!-- /unit: not published -->
|
||||
|
||||
<!-- unit: published -->
|
||||
<li class="outline-item outline-unit is-draggable" data-parent="" data-locator="">
|
||||
<%include file="outline_unit_header.html" />
|
||||
</li>
|
||||
<!-- /unit: published -->
|
||||
|
||||
<!-- unit: not published + locked content -->
|
||||
<li class="outline-item outline-unit is-draggable is-staff-only" data-parent="" data-locator="">
|
||||
<%include file="outline_unit_header.html" />
|
||||
|
||||
<div class="unit-status">
|
||||
<%include file="outline_status_message-lock.html" />
|
||||
</div>
|
||||
<!-- /unit-status -->
|
||||
</li>
|
||||
<!-- /unit: not published + locked content -->
|
||||
|
||||
<!-- unit: published + has unpublished content -->
|
||||
<li class="outline-item outline-unit is-draggable has-warnings" data-parent="" data-locator="">
|
||||
<%include file="outline_unit_header.html" />
|
||||
|
||||
<div class="unit-status">
|
||||
<%include file="outline_status_message-unpublished_changes.html" />
|
||||
</div>
|
||||
<!-- /unit-status -->
|
||||
</li>
|
||||
<!-- /unit: published + has unpublished content -->
|
||||
|
||||
<!-- unit: not published + has unpublished content -->
|
||||
<li class="outline-item outline-unit is-draggable has-warnings" data-parent="" data-locator="">
|
||||
<%include file="outline_unit_header.html" />
|
||||
|
||||
<div class="unit-status">
|
||||
<%include file="outline_status_message-unpublished_units.html" />
|
||||
</div>
|
||||
<!-- /unit-status -->
|
||||
</li>
|
||||
<!-- /unit: not published + has unpublished content -->
|
||||
|
||||
<!-- unit: has error -->
|
||||
<li class="outline-item outline-unit is-draggable has-errors" data-parent="" data-locator="">
|
||||
<%include file="outline_unit_header.html" />
|
||||
|
||||
<div class="unit-status">
|
||||
<%include file="outline_status_message-error.html" />
|
||||
</div>
|
||||
<!-- /unit-status -->
|
||||
</li>
|
||||
<!-- /unit: has error -->
|
||||
</ol>
|
||||
<!-- /list: units -->
|
||||
|
||||
<%include file="outline_add-unit.html" />
|
||||
|
||||
</div>
|
||||
<!-- /subsection-content -->
|
||||
</li>
|
||||
<!-- /subsection: placeholder -->
|
||||
</ol>
|
||||
|
||||
<%include file="outline_add-subsection.html" />
|
||||
|
||||
</div>
|
||||
</li>
|
||||
<!-- /section: placeholder -->
|
||||
</ol>
|
||||
|
||||
<%include file="outline_add-section.html" />
|
||||
</article>
|
||||
</div>
|
||||
|
||||
<div class="ui-loading is-hidden">
|
||||
<p><span class="spin">
|
||||
<i class="icon fa fa-refresh"></i></span>
|
||||
<span class="copy">Loading</span>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
</article>
|
||||
|
||||
<aside class="content-supplementary" role="complementary">
|
||||
<div class="bit">
|
||||
<h3 class="title-3">What can I do on this page?</h3>
|
||||
<p>You can create new sections and subsections, set the release date for sections, and create new units in existing subsections. You can set the assignment type for subsections that are to be graded, and you can open a subsection for further editing.</p>
|
||||
|
||||
<p>In addition, you can drag and drop sections, subsections, and units to reorganize your course.</p>
|
||||
</div>
|
||||
</aside>
|
||||
|
||||
</section>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</%block>
|
||||
@@ -1,7 +0,0 @@
|
||||
<%page expression_filter="h"/>
|
||||
<div class="add-section add-item">
|
||||
<a href="#" class="button button-new" data-category="" data-parent="" data-default-name="New Section">
|
||||
<i class="icon fa fa-plus"></i> New Section
|
||||
</a>
|
||||
</div>
|
||||
<!-- /add-section -->
|
||||
@@ -1,7 +0,0 @@
|
||||
<%page expression_filter="h"/>
|
||||
<div class="add-subsection add-item">
|
||||
<a href="#" class="button button-new" data-category="" data-parent="" data-default-name="New Subsection">
|
||||
<i class="icon fa fa-plus"></i> New Subsection
|
||||
</a>
|
||||
</div>
|
||||
<!-- /add-subsection -->
|
||||
@@ -1,7 +0,0 @@
|
||||
<%page expression_filter="h"/>
|
||||
<div class="add-unit add-item">
|
||||
<a href="#" class="button button-new" data-category="" data-parent="" data-default-name="New Unit">
|
||||
<i class="icon fa fa-plus"></i> New Unit
|
||||
</a>
|
||||
</div>
|
||||
<!-- /add-unit -->
|
||||
@@ -1,37 +0,0 @@
|
||||
<%page expression_filter="h"/>
|
||||
<div class="section-header">
|
||||
<h3 class="section-header-details ui-toggle-expansion" title="Collapse/Expand this Section">
|
||||
<i class="icon fa fa-caret-down icon"></i>
|
||||
<span class="wrapper-section-title is-editable wrapper-xblock-field">
|
||||
<span class="section-title item-title xblock-field-value">Section Title</span>
|
||||
</span>
|
||||
</h3>
|
||||
|
||||
<div class="section-header-actions">
|
||||
<ul class="actions-list">
|
||||
<li class="action-item action-publish">
|
||||
<a href="#" data-tooltip="Publish all content" class="publish-button action-button">
|
||||
<i class="icon fa fa-share-square-o"></i>
|
||||
<span class="action-button-text sr">Publish all content</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="action-item action-settings">
|
||||
<a href="#" data-tooltip="Settings" class="settings-button action-button">
|
||||
<i class="icon fa fa-cog"></i>
|
||||
<span class="action-button-text sr">Settings</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="action-item action-delete">
|
||||
<a href="#" data-tooltip="Delete" class="delete-button action-button">
|
||||
<i class="icon fa fa-trash-o"></i>
|
||||
<span class="action-button-text sr">Delete</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="action-item action-drag">
|
||||
<span data-tooltip="Drag to reorder" class="drag-handle action"></span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<!-- /section-header -->
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
<%page expression_filter="h"/>
|
||||
<div class="section-header">
|
||||
<h3 class="section-header-details ui-toggle-expansion" title="Collapse/Expand this Section">
|
||||
<i class="icon fa fa-caret-down icon"></i>
|
||||
<span class="wrapper-section-title is-editable wrapper-xblock-field">
|
||||
<span class="section-title item-title xblock-field-value">Section Title</span>
|
||||
</span>
|
||||
</h3>
|
||||
|
||||
<div class="section-header-actions">
|
||||
<ul class="actions-list">
|
||||
<li class="action-item action-publish">
|
||||
<a href="#" data-tooltip="Publish all content" class="publish-button action-button">
|
||||
<i class="icon fa fa-share-square-o"></i>
|
||||
<span class="action-button-text sr">Publish all content</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="action-item action-settings">
|
||||
<a href="#" data-tooltip="Settings" class="settings-button action-button">
|
||||
<i class="icon fa fa-cog"></i>
|
||||
<span class="action-button-text sr">Settings</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="action-item action-delete">
|
||||
<a href="#" data-tooltip="Delete" class="delete-button action-button">
|
||||
<i class="icon fa fa-trash-o"></i>
|
||||
<span class="action-button-text sr">Delete</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="action-item action-drag">
|
||||
<span data-tooltip="Drag to reorder" class="drag-handle action"></span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<!-- /section-header -->
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
<%page expression_filter="h"/>
|
||||
<div class="status-grading">
|
||||
<p>
|
||||
<span class="sr status-grading-label">Graded as:</span>
|
||||
<i class="icon fa fa-check"></i>
|
||||
<span class="status-grading-value">Homework</span>
|
||||
<span class="status-grading-date">Due: December 31, 2014</span>
|
||||
</p>
|
||||
</div>
|
||||
@@ -1,5 +0,0 @@
|
||||
<%page expression_filter="h"/>
|
||||
<div class="status-message">
|
||||
<i class="icon fa fa-warning"></i>
|
||||
<p class="status-message-copy">Critical error</p>
|
||||
</div>
|
||||
@@ -1,5 +0,0 @@
|
||||
<%page expression_filter="h"/>
|
||||
<div class="status-message">
|
||||
<i class="icon fa fa-lock"></i>
|
||||
<p class="status-message-copy">Contains Staff only content</p>
|
||||
</div>
|
||||
@@ -1,5 +0,0 @@
|
||||
<%page expression_filter="h"/>
|
||||
<div class="status-message">
|
||||
<i class="icon fa fa-file-o"></i>
|
||||
<p class="status-message-copy">Unpublished change(s) to live content</p>
|
||||
</div>
|
||||
@@ -1,5 +0,0 @@
|
||||
<%page expression_filter="h"/>
|
||||
<div class="status-message">
|
||||
<i class="icon fa fa-file-o"></i>
|
||||
<p class="status-message-copy">Unpublished unit(s) will not be released</p>
|
||||
</div>
|
||||
@@ -1,11 +0,0 @@
|
||||
<%page expression_filter="h"/>
|
||||
<div class="status-release">
|
||||
<p>
|
||||
<span class="sr status-release-label">Release Status:</span>
|
||||
<span class="status-release-value">
|
||||
<i class="icon fa fa-file-o"></i>
|
||||
<span class="sr">This item is</span>
|
||||
</span>
|
||||
<span class="status-release-date">Unscheduled</span>
|
||||
</p>
|
||||
</div>
|
||||
@@ -1,10 +0,0 @@
|
||||
<%page expression_filter="h"/>
|
||||
<div class="status-release">
|
||||
<p>
|
||||
<span class="sr status-release-label">Release Status:</span>
|
||||
<span class="status-release-value">
|
||||
<i class="icon fa fa-lock"></i>
|
||||
Will never release - Contains Staff only content
|
||||
</span>
|
||||
</p>
|
||||
</div>
|
||||
@@ -1,11 +0,0 @@
|
||||
<%page expression_filter="h"/>
|
||||
<div class="status-release">
|
||||
<p>
|
||||
<span class="sr status-release-label">Release Status:</span>
|
||||
<span class="status-release-value">
|
||||
<i class="icon fa fa-check-square"></i>
|
||||
Released <span class="sr">on</span>:
|
||||
</span>
|
||||
<span class="status-release-date">March 25, 2014</span>
|
||||
</p>
|
||||
</div>
|
||||
@@ -1,10 +0,0 @@
|
||||
<%page expression_filter="h"/>
|
||||
<div class="status-release">
|
||||
<p>
|
||||
<span class="sr status-release-label">Release Status:</span>
|
||||
<span class="status-release-value">
|
||||
<i class="icon fa fa-check-square"></i>
|
||||
Released with Section
|
||||
</span>
|
||||
</p>
|
||||
</div>
|
||||
@@ -1,10 +0,0 @@
|
||||
<%page expression_filter="h"/>
|
||||
<div class="status-release">
|
||||
<p>
|
||||
<span class="sr status-release-label">Release Status:</span>
|
||||
<span class="status-release-value">
|
||||
<i class="icon fa fa-clock-o"></i>
|
||||
Scheduled: October 31, 2014
|
||||
</span>
|
||||
</p>
|
||||
</div>
|
||||
@@ -1,10 +0,0 @@
|
||||
<%page expression_filter="h"/>
|
||||
<div class="status-release">
|
||||
<p>
|
||||
<span class="sr status-release-label">Release Status:</span>
|
||||
<span class="status-release-value">
|
||||
<i class="icon fa fa-clock-o"></i>
|
||||
Scheduled: with Section
|
||||
</span>
|
||||
</p>
|
||||
</div>
|
||||
@@ -1,43 +0,0 @@
|
||||
<%page expression_filter="h"/>
|
||||
<div class="subsection-header">
|
||||
<h3 class="subsection-header-details ui-toggle-expansion" title="Collapse/Expand this Subsection">
|
||||
<i class="icon fa fa-caret-down icon"></i>
|
||||
<span class="wrapper-subsection-title is-editable wrapper-xblock-field">
|
||||
<span class="subsection-title item-title xblock-field-value">Subsection Title</span>
|
||||
|
||||
<!-- editor-title -->
|
||||
<span class="editor">
|
||||
<label class="sr" for="subsection-title_ID">Rename Subsection Name</label>
|
||||
<input class="item-edit-title is-hidden" id="section-title_ID" type="text" value="" data-metadata-name="" />
|
||||
</span>
|
||||
<!-- /editor-title -->
|
||||
</span>
|
||||
</h3>
|
||||
|
||||
<div class="subsection-header-actions">
|
||||
<ul class="actions-list">
|
||||
<li class="action-item action-publish">
|
||||
<a href="#" data-tooltip="Publish" class="publish-button action-button">
|
||||
<i class="icon fa fa-share-square-o"></i>
|
||||
<span class="action-button-text sr">Publish</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="action-item action-settings">
|
||||
<a href="#" data-tooltip="Settings" class="settings-button action-button">
|
||||
<i class="icon fa fa-cog"></i>
|
||||
<span class="action-button-text sr">Settings</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="action-item action-delete">
|
||||
<a href="#" data-tooltip="Delete" class="delete-button action-button">
|
||||
<i class="icon fa fa-trash-o"></i>
|
||||
<span class="action-button-text sr">Delete</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="action-item action-drag">
|
||||
<span data-tooltip="Drag to reorder" class="drag-handle action"></span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<!-- /subsection-header -->
|
||||
@@ -1,43 +0,0 @@
|
||||
<%page expression_filter="h"/>
|
||||
<div class="subsection-header">
|
||||
<h3 class="subsection-header-details ui-toggle-expansion" title="Collapse/Expand this Subsection">
|
||||
<i class="icon fa fa-caret-down icon"></i>
|
||||
<span class="wrapper-subsection-title is-editable wrapper-xblock-field">
|
||||
<span class="subsection-title item-title xblock-field-value">Subsection Title</span>
|
||||
|
||||
<!-- editor-title -->
|
||||
<span class="editor">
|
||||
<label class="sr" for="subsection-title_ID">Rename Subsection Name</label>
|
||||
<input class="item-edit-title is-hidden" id="section-title_ID" type="text" value="" data-metadata-name="" />
|
||||
</span>
|
||||
<!-- /editor-title -->
|
||||
</span>
|
||||
</h3>
|
||||
|
||||
<div class="subsection-header-actions">
|
||||
<ul class="actions-list">
|
||||
<li class="action-item action-publish">
|
||||
<a href="#" data-tooltip="Publish" class="publish-button action-button">
|
||||
<i class="icon fa fa-share-square-o"></i>
|
||||
<span class="action-button-text sr">Publish</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="action-item action-settings">
|
||||
<a href="#" data-tooltip="Settings" class="settings-button action-button">
|
||||
<i class="icon fa fa-cog"></i>
|
||||
<span class="action-button-text sr">Settings</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="action-item action-delete">
|
||||
<a href="#" data-tooltip="Delete" class="delete-button action-button">
|
||||
<i class="icon fa fa-trash-o"></i>
|
||||
<span class="action-button-text sr">Delete</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="action-item action-drag">
|
||||
<span data-tooltip="Drag to reorder" class="drag-handle action"></span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<!-- /subsection-header -->
|
||||
@@ -1,33 +0,0 @@
|
||||
<%page expression_filter="h"/>
|
||||
<div class="unit-header">
|
||||
<h3 class="unit-header-details">
|
||||
<span class="unit-title item-title"><a class="unit-url" href="">Unit Name</a></span>
|
||||
</h3>
|
||||
|
||||
<div class="unit-header-actions">
|
||||
<ul class="actions-list">
|
||||
<li class="action-item action-publish">
|
||||
<a href="#" data-tooltip="Publish" class="publish-button action-button">
|
||||
<i class="icon fa fa-share-square-o"></i>
|
||||
<span class="action-button-text sr">Publish</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="action-item action-settings">
|
||||
<a href="#" data-tooltip="Settings" class="settings-button action-button">
|
||||
<i class="icon fa fa-cog"></i>
|
||||
<span class="action-button-text sr">Settings</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="action-item action-delete">
|
||||
<a href="#" data-tooltip="Delete" class="delete-button action-button">
|
||||
<i class="icon fa fa-trash-o"></i>
|
||||
<span class="action-button-text sr">Delete</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="action-item action-drag">
|
||||
<span data-tooltip="Drag to reorder" class="drag-handle action"></span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<!-- /unit-header -->
|
||||
@@ -7,17 +7,16 @@
|
||||
<%block name="bodyclass">is-signedin pattern-library</%block>
|
||||
|
||||
<%block name="content">
|
||||
<h3 class="hd-6 example-set-hd">Warning Alert with Message Only</h3>
|
||||
<div class="example-set">
|
||||
<div class="alert alert-warning" role="alert" aria-labelledby="alert-warning-publish-title" tabindex="-1">
|
||||
<span class="icon alert-icon icon-warning" aria-hidden="true"></span>
|
||||
<h1>Pattern Library test page</h1>
|
||||
|
||||
<div class="alert-message">
|
||||
<p class="alert-copy">
|
||||
Interesting pattern library content to come...
|
||||
</p>
|
||||
</div>
|
||||
<div class="alert alert-warning" role="alert" tabindex="-1">
|
||||
<span class="icon alert-icon fa fa-exclamation-triangle" aria-hidden="true"></span>
|
||||
|
||||
<div class="alert-message">
|
||||
<p class="alert-copy">
|
||||
Interesting pattern library content to come...
|
||||
</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</%block>
|
||||
|
||||
@@ -7,5 +7,5 @@ from django.conf.urls import url
|
||||
|
||||
urlpatterns = (
|
||||
url(r'^dev_mode$', 'contentstore.views.dev.dev_mode', name='dev_mode'),
|
||||
url(r'^template/(?P<template>.+)$', 'contentstore.views.dev.dev_show_template'),
|
||||
url(r'^template/(?P<template>.+)$', 'openedx.core.djangoapps.debug.views.show_reference_template'),
|
||||
)
|
||||
|
||||
@@ -8,6 +8,7 @@ import decimal
|
||||
import ddt
|
||||
import freezegun
|
||||
from mock import patch
|
||||
from nose.plugins.attrib import attr
|
||||
from django.conf import settings
|
||||
from django.core.urlresolvers import reverse
|
||||
|
||||
@@ -25,9 +26,13 @@ from course_modes.models import CourseMode, Mode
|
||||
from openedx.core.djangoapps.theming.test_util import with_is_edx_domain
|
||||
|
||||
|
||||
@attr('shard_3')
|
||||
@ddt.ddt
|
||||
@unittest.skipUnless(settings.ROOT_URLCONF == 'lms.urls', 'Test only valid in lms')
|
||||
class CourseModeViewTest(UrlResetMixin, ModuleStoreTestCase):
|
||||
"""
|
||||
Course Mode View tests
|
||||
"""
|
||||
@patch.dict(settings.FEATURES, {'MODE_CREATION_FOR_TESTING': True})
|
||||
def setUp(self):
|
||||
super(CourseModeViewTest, self).setUp('course_modes.urls')
|
||||
|
||||
@@ -4,6 +4,7 @@ Tests for EmbargoMiddleware
|
||||
|
||||
from contextlib import contextmanager
|
||||
import mock
|
||||
from nose.plugins.attrib import attr
|
||||
import unittest
|
||||
import pygeoip
|
||||
import ddt
|
||||
@@ -34,11 +35,10 @@ from embargo.exceptions import InvalidAccessPoint
|
||||
from mock import patch
|
||||
|
||||
|
||||
# Since we don't need any XML course fixtures, use a modulestore configuration
|
||||
# that disables the XML modulestore.
|
||||
MODULESTORE_CONFIG = mixed_store_config(settings.COMMON_TEST_DATA_ROOT, {}, include_xml=False)
|
||||
MODULESTORE_CONFIG = mixed_store_config(settings.COMMON_TEST_DATA_ROOT, {})
|
||||
|
||||
|
||||
@attr('shard_3')
|
||||
@ddt.ddt
|
||||
@override_settings(MODULESTORE=MODULESTORE_CONFIG)
|
||||
@unittest.skipUnless(settings.ROOT_URLCONF == 'lms.urls', 'Test only valid in lms')
|
||||
|
||||
@@ -4,6 +4,7 @@ Tests for EmbargoMiddleware with CountryAccessRules
|
||||
|
||||
import unittest
|
||||
from mock import patch
|
||||
from nose.plugins.attrib import attr
|
||||
import ddt
|
||||
|
||||
from django.core.urlresolvers import reverse
|
||||
@@ -20,6 +21,7 @@ from embargo.models import RestrictedCourse, IPFilter
|
||||
from embargo.test_utils import restrict_course
|
||||
|
||||
|
||||
@attr('shard_3')
|
||||
@ddt.ddt
|
||||
@unittest.skipUnless(settings.ROOT_URLCONF == 'lms.urls', 'Test only valid in lms')
|
||||
class EmbargoMiddlewareAccessTests(UrlResetMixin, ModuleStoreTestCase):
|
||||
|
||||
@@ -9,6 +9,7 @@ import datetime
|
||||
import ddt
|
||||
from django.core.cache import cache
|
||||
from mock import patch
|
||||
from nose.plugins.attrib import attr
|
||||
from django.test import Client
|
||||
from django.core.handlers.wsgi import WSGIRequest
|
||||
from django.core.urlresolvers import reverse
|
||||
@@ -125,6 +126,7 @@ class EnrollmentTestMixin(object):
|
||||
self.assertEqual(actual_mode, expected_mode)
|
||||
|
||||
|
||||
@attr('shard_3')
|
||||
@override_settings(EDX_API_KEY="i am a key")
|
||||
@ddt.ddt
|
||||
@unittest.skipUnless(settings.ROOT_URLCONF == 'lms.urls', 'Test only valid in lms')
|
||||
|
||||
@@ -20,6 +20,7 @@ from external_auth.views import (
|
||||
shib_login, course_specific_login, course_specific_register, _flatten_to_ascii
|
||||
)
|
||||
from mock import patch
|
||||
from nose.plugins.attrib import attr
|
||||
from urllib import urlencode
|
||||
|
||||
from student.views import create_account, change_enrollment
|
||||
@@ -72,6 +73,7 @@ def gen_all_identities():
|
||||
yield _build_identity_dict(mail, display_name, given_name, surname)
|
||||
|
||||
|
||||
@attr('shard_3')
|
||||
@ddt
|
||||
@override_settings(SESSION_ENGINE='django.contrib.sessions.backends.cache')
|
||||
class ShibSPTest(SharedModuleStoreTestCase):
|
||||
|
||||
@@ -15,7 +15,7 @@ class RequireJSPathOverridesTest(TestCase):
|
||||
|
||||
OVERRIDES = {
|
||||
'jquery': 'js/vendor/jquery.min.js',
|
||||
'backbone': 'js/vendor/backbone-min.js',
|
||||
'backbone': 'common/js/vendor/backbone.js',
|
||||
'text': 'js/vendor/text.js'
|
||||
}
|
||||
|
||||
@@ -26,7 +26,7 @@ class RequireJSPathOverridesTest(TestCase):
|
||||
"paths: {",
|
||||
"'jquery': 'js/vendor/jquery.min',",
|
||||
"'text': 'js/vendor/text',",
|
||||
"'backbone': 'js/vendor/backbone-min'",
|
||||
"'backbone': 'common/js/vendor/backbone'",
|
||||
"}",
|
||||
"});",
|
||||
"}).call(this, require || RequireJS.require);",
|
||||
|
||||
@@ -163,9 +163,7 @@ def replace_static_urls(text, data_directory=None, course_id=None, static_asset_
|
||||
if settings.DEBUG and finders.find(rest, True):
|
||||
return original
|
||||
# if we're running with a MongoBacked store course_namespace is not None, then use studio style urls
|
||||
elif (not static_asset_path) \
|
||||
and course_id \
|
||||
and modulestore().get_modulestore_type(course_id) != ModuleStoreEnum.Type.xml:
|
||||
elif (not static_asset_path) and course_id:
|
||||
# first look in the static file pipeline and see if we are trying to reference
|
||||
# a piece of static content which is in the edx-platform repo (e.g. JS associated with an xmodule)
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ from opaque_keys.edx.locations import SlashSeparatedCourseKey
|
||||
|
||||
from student.tests.factories import UserFactory, CourseEnrollmentFactory
|
||||
from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase
|
||||
from xmodule.modulestore.tests.django_utils import TEST_DATA_MIXED_TOY_MODULESTORE
|
||||
from xmodule.modulestore.tests.django_utils import TEST_DATA_MIXED_MODULESTORE
|
||||
from xmodule.modulestore.tests.factories import CourseFactory
|
||||
|
||||
# This import is for an lms djangoapp.
|
||||
@@ -90,7 +90,7 @@ class TestStudentDashboardEmailViewXMLBacked(SharedModuleStoreTestCase):
|
||||
"""
|
||||
Check for email view on student dashboard, with XML backed course.
|
||||
"""
|
||||
MODULESTORE = TEST_DATA_MIXED_TOY_MODULESTORE
|
||||
MODULESTORE = TEST_DATA_MIXED_MODULESTORE
|
||||
|
||||
def setUp(self):
|
||||
super(TestStudentDashboardEmailViewXMLBacked, self).setUp()
|
||||
|
||||
@@ -4,6 +4,7 @@ Tests for student enrollment.
|
||||
import ddt
|
||||
import unittest
|
||||
from mock import patch
|
||||
from nose.plugins.attrib import attr
|
||||
|
||||
from django.conf import settings
|
||||
from django.core.urlresolvers import reverse
|
||||
@@ -20,6 +21,7 @@ from student.roles import (
|
||||
)
|
||||
|
||||
|
||||
@attr('shard_3')
|
||||
@ddt.ddt
|
||||
@unittest.skipUnless(settings.ROOT_URLCONF == 'lms.urls', 'Test only valid in lms')
|
||||
class EnrollmentTest(UrlResetMixin, SharedModuleStoreTestCase):
|
||||
|
||||
@@ -6,6 +6,7 @@ from django.conf import settings
|
||||
from django.core.urlresolvers import reverse
|
||||
from opaque_keys.edx import locator
|
||||
from pytz import UTC
|
||||
from nose.plugins.attrib import attr
|
||||
import unittest
|
||||
import ddt
|
||||
from shoppingcart.models import DonationConfiguration
|
||||
@@ -19,6 +20,7 @@ from student.views import get_course_enrollments, _get_recently_enrolled_courses
|
||||
from common.test.utils import XssTestMixin
|
||||
|
||||
|
||||
@attr('shard_3')
|
||||
@unittest.skipUnless(settings.ROOT_URLCONF == 'lms.urls', 'Test only valid in lms')
|
||||
@ddt.ddt
|
||||
class TestRecentEnrollments(ModuleStoreTestCase, XssTestMixin):
|
||||
|
||||
@@ -4,6 +4,7 @@ from datetime import datetime, timedelta
|
||||
import unittest
|
||||
import ddt
|
||||
from mock import patch
|
||||
from nose.plugins.attrib import attr
|
||||
from pytz import UTC
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.conf import settings
|
||||
@@ -24,6 +25,7 @@ from lms.djangoapps.verify_student.models import VerificationDeadline, SoftwareS
|
||||
from util.testing import UrlResetMixin
|
||||
|
||||
|
||||
@attr('shard_3')
|
||||
@patch.dict(settings.FEATURES, {'AUTOMATIC_VERIFY_STUDENT_IDENTITY_FOR_TESTING': True})
|
||||
@unittest.skipUnless(settings.ROOT_URLCONF == 'lms.urls', 'Test only valid in lms')
|
||||
@ddt.ddt
|
||||
|
||||
@@ -11,6 +11,7 @@ from urlparse import urljoin
|
||||
import pytz
|
||||
from markupsafe import escape
|
||||
from mock import Mock, patch
|
||||
from nose.plugins.attrib import attr
|
||||
from opaque_keys.edx.locations import SlashSeparatedCourseKey
|
||||
from pyquery import PyQuery as pq
|
||||
|
||||
@@ -888,6 +889,7 @@ class AnonymousLookupTable(ModuleStoreTestCase):
|
||||
|
||||
|
||||
# TODO: Clean up these tests so that they use the ProgramsDataMixin.
|
||||
@attr('shard_3')
|
||||
@unittest.skipUnless(settings.ROOT_URLCONF == 'lms.urls', 'Test only valid in lms')
|
||||
@ddt.ddt
|
||||
class DashboardTestXSeriesPrograms(ModuleStoreTestCase, ProgramsApiConfigMixin):
|
||||
@@ -925,7 +927,6 @@ class DashboardTestXSeriesPrograms(ModuleStoreTestCase, ProgramsApiConfigMixin):
|
||||
programs[unicode(course)] = [{
|
||||
'id': _id,
|
||||
'category': self.category,
|
||||
'display_category': self.display_category,
|
||||
'organization': {'display_name': 'Test Organization 1', 'key': 'edX'},
|
||||
'marketing_slug': 'fake-marketing-slug-xseries-1',
|
||||
'status': program_status,
|
||||
@@ -968,7 +969,6 @@ class DashboardTestXSeriesPrograms(ModuleStoreTestCase, ProgramsApiConfigMixin):
|
||||
u'edx/demox/Run_1': [{
|
||||
'id': 0,
|
||||
'category': self.category,
|
||||
'display_category': self.display_category,
|
||||
'organization': {'display_name': 'Test Organization 1', 'key': 'edX'},
|
||||
'marketing_slug': marketing_slug,
|
||||
'status': program_status,
|
||||
|
||||
@@ -126,7 +126,7 @@ from notification_prefs.views import enable_notifications
|
||||
from openedx.core.djangoapps.credentials.utils import get_user_program_credentials
|
||||
from openedx.core.djangoapps.credit.email_utils import get_credit_provider_display_names, make_providers_strings
|
||||
from openedx.core.djangoapps.user_api.preferences import api as preferences_api
|
||||
from openedx.core.djangoapps.programs.utils import get_programs_for_dashboard
|
||||
from openedx.core.djangoapps.programs.utils import get_programs_for_dashboard, get_display_category
|
||||
from openedx.core.djangoapps.programs.models import ProgramsApiConfig
|
||||
|
||||
|
||||
@@ -649,7 +649,6 @@ def dashboard(request):
|
||||
show_email_settings_for = frozenset(
|
||||
enrollment.course_id for enrollment in course_enrollments if (
|
||||
settings.FEATURES['ENABLE_INSTRUCTOR_EMAIL'] and
|
||||
modulestore().get_modulestore_type(enrollment.course_id) != ModuleStoreEnum.Type.xml and
|
||||
CourseAuthorization.instructor_email_enabled(enrollment.course_id)
|
||||
)
|
||||
)
|
||||
@@ -2452,8 +2451,8 @@ def _get_course_programs(user, user_enrolled_courses): # pylint: disable=invali
|
||||
'xseries' + '/{}'
|
||||
).format(program['marketing_slug'])
|
||||
})
|
||||
programs_for_course['display_category'] = program.get('display_category')
|
||||
programs_for_course['category'] = program.get('category')
|
||||
programs_for_course['display_category'] = get_display_category(program)
|
||||
except KeyError:
|
||||
log.warning('Program structure is invalid, skipping display: %r', program)
|
||||
|
||||
|
||||
@@ -1,14 +1,10 @@
|
||||
"""Map new event context values to old top-level field values. Ensures events can be parsed by legacy parsers."""
|
||||
|
||||
import json
|
||||
import logging
|
||||
|
||||
from opaque_keys import InvalidKeyError
|
||||
from opaque_keys.edx.keys import UsageKey
|
||||
from .transformers import EventTransformerRegistry
|
||||
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
CONTEXT_FIELDS_TO_INCLUDE = [
|
||||
'username',
|
||||
'session',
|
||||
@@ -63,6 +59,9 @@ class LegacyFieldMappingProcessor(object):
|
||||
|
||||
|
||||
def remove_shim_context(event):
|
||||
"""
|
||||
Remove obsolete fields from event context.
|
||||
"""
|
||||
if 'context' in event:
|
||||
context = event['context']
|
||||
# These fields are present elsewhere in the event at this point
|
||||
@@ -74,100 +73,6 @@ def remove_shim_context(event):
|
||||
del context[field]
|
||||
|
||||
|
||||
NAME_TO_EVENT_TYPE_MAP = {
|
||||
'edx.video.played': 'play_video',
|
||||
'edx.video.paused': 'pause_video',
|
||||
'edx.video.stopped': 'stop_video',
|
||||
'edx.video.loaded': 'load_video',
|
||||
'edx.video.position.changed': 'seek_video',
|
||||
'edx.video.seeked': 'seek_video',
|
||||
'edx.video.transcript.shown': 'show_transcript',
|
||||
'edx.video.transcript.hidden': 'hide_transcript',
|
||||
}
|
||||
|
||||
|
||||
class VideoEventProcessor(object):
|
||||
"""
|
||||
Converts new format video events into the legacy video event format.
|
||||
|
||||
Mobile devices cannot actually emit events that exactly match their counterparts emitted by the LMS javascript
|
||||
video player. Instead of attempting to get them to do that, we instead insert a shim here that converts the events
|
||||
they *can* easily emit and converts them into the legacy format.
|
||||
|
||||
TODO: Remove this shim and perform the conversion as part of some batch canonicalization process.
|
||||
|
||||
"""
|
||||
|
||||
def __call__(self, event):
|
||||
name = event.get('name')
|
||||
if not name:
|
||||
return
|
||||
|
||||
if name not in NAME_TO_EVENT_TYPE_MAP:
|
||||
return
|
||||
|
||||
# Convert edx.video.seeked to edx.video.position.changed because edx.video.seeked was not intended to actually
|
||||
# ever be emitted.
|
||||
if name == "edx.video.seeked":
|
||||
event['name'] = "edx.video.position.changed"
|
||||
|
||||
event['event_type'] = NAME_TO_EVENT_TYPE_MAP[name]
|
||||
|
||||
if 'event' not in event:
|
||||
return
|
||||
payload = event['event']
|
||||
|
||||
if 'module_id' in payload:
|
||||
module_id = payload['module_id']
|
||||
try:
|
||||
usage_key = UsageKey.from_string(module_id)
|
||||
except InvalidKeyError:
|
||||
log.warning('Unable to parse module_id "%s"', module_id, exc_info=True)
|
||||
else:
|
||||
payload['id'] = usage_key.html_id()
|
||||
|
||||
del payload['module_id']
|
||||
|
||||
if 'current_time' in payload:
|
||||
payload['currentTime'] = payload.pop('current_time')
|
||||
|
||||
if 'context' in event:
|
||||
context = event['context']
|
||||
|
||||
# Converts seek_type to seek and skip|slide to onSlideSeek|onSkipSeek
|
||||
if 'seek_type' in payload:
|
||||
seek_type = payload['seek_type']
|
||||
if seek_type == 'slide':
|
||||
payload['type'] = "onSlideSeek"
|
||||
elif seek_type == 'skip':
|
||||
payload['type'] = "onSkipSeek"
|
||||
del payload['seek_type']
|
||||
|
||||
# For the iOS build that is returning a +30 for back skip 30
|
||||
if (
|
||||
context['application']['version'] == "1.0.02" and
|
||||
context['application']['name'] == "edx.mobileapp.iOS"
|
||||
):
|
||||
if 'requested_skip_interval' in payload and 'type' in payload:
|
||||
if (
|
||||
payload['requested_skip_interval'] == 30 and
|
||||
payload['type'] == "onSkipSeek"
|
||||
):
|
||||
payload['requested_skip_interval'] = -30
|
||||
|
||||
# For the Android build that isn't distinguishing between skip/seek
|
||||
if 'requested_skip_interval' in payload:
|
||||
if abs(payload['requested_skip_interval']) != 30:
|
||||
if 'type' in payload:
|
||||
payload['type'] = 'onSlideSeek'
|
||||
|
||||
if 'open_in_browser_url' in context:
|
||||
page, _sep, _tail = context.pop('open_in_browser_url').rpartition('/')
|
||||
event['page'] = page
|
||||
|
||||
event['event'] = json.dumps(payload)
|
||||
|
||||
|
||||
class GoogleAnalyticsProcessor(object):
|
||||
"""Adds course_id as label, and sets nonInteraction property"""
|
||||
|
||||
@@ -184,3 +89,22 @@ class GoogleAnalyticsProcessor(object):
|
||||
copied_event['nonInteraction'] = 1
|
||||
|
||||
return copied_event
|
||||
|
||||
|
||||
class PrefixedEventProcessor(object):
|
||||
"""
|
||||
Process any events whose name or prefix (ending with a '.') is registered
|
||||
as an EventTransformer.
|
||||
"""
|
||||
|
||||
def __call__(self, event):
|
||||
"""
|
||||
If the event is registered with the EventTransformerRegistry, transform
|
||||
it. Otherwise do nothing to it, and continue processing.
|
||||
"""
|
||||
try:
|
||||
event = EventTransformerRegistry.create_transformer(event)
|
||||
except KeyError:
|
||||
return
|
||||
event.transform()
|
||||
return event
|
||||
|
||||
@@ -1,10 +1,16 @@
|
||||
"""Ensure emitted events contain the fields legacy processors expect to find."""
|
||||
|
||||
from collections import namedtuple
|
||||
|
||||
import ddt
|
||||
from mock import sentinel
|
||||
from django.test.utils import override_settings
|
||||
|
||||
from openedx.core.lib.tests.assertions.events import assert_events_equal
|
||||
from track.tests import EventTrackingTestCase, FROZEN_TIME
|
||||
|
||||
from . import EventTrackingTestCase, FROZEN_TIME
|
||||
from ..shim import PrefixedEventProcessor
|
||||
from .. import transformers
|
||||
|
||||
|
||||
LEGACY_SHIM_PROCESSOR = [
|
||||
@@ -216,3 +222,100 @@ class MultipleShimGoogleAnalyticsProcessorTestCase(EventTrackingTestCase):
|
||||
'timestamp': FROZEN_TIME,
|
||||
}
|
||||
assert_events_equal(expected_event, log_emitted_event)
|
||||
|
||||
|
||||
SequenceDDT = namedtuple('SequenceDDT', ['action', 'tab_count', 'current_tab', 'legacy_event_type'])
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
class EventTransformerRegistryTestCase(EventTrackingTestCase):
|
||||
"""
|
||||
Test the behavior of the event registry
|
||||
"""
|
||||
|
||||
def setUp(self):
|
||||
super(EventTransformerRegistryTestCase, self).setUp()
|
||||
self.registry = transformers.EventTransformerRegistry()
|
||||
|
||||
@ddt.data(
|
||||
('edx.ui.lms.sequence.next_selected', transformers.NextSelectedEventTransformer),
|
||||
('edx.ui.lms.sequence.previous_selected', transformers.PreviousSelectedEventTransformer),
|
||||
('edx.ui.lms.sequence.tab_selected', transformers.SequenceTabSelectedEventTransformer),
|
||||
('edx.video.foo.bar', transformers.VideoEventTransformer),
|
||||
)
|
||||
@ddt.unpack
|
||||
def test_event_registry_dispatch(self, event_name, expected_transformer):
|
||||
event = {'name': event_name}
|
||||
transformer = self.registry.create_transformer(event)
|
||||
self.assertIsInstance(transformer, expected_transformer)
|
||||
|
||||
@ddt.data(
|
||||
'edx.ui.lms.sequence.next_selected.what',
|
||||
'edx',
|
||||
'unregistered_event',
|
||||
)
|
||||
def test_dispatch_to_nonexistent_events(self, event_name):
|
||||
event = {'name': event_name}
|
||||
with self.assertRaises(KeyError):
|
||||
self.registry.create_transformer(event)
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
class PrefixedEventProcessorTestCase(EventTrackingTestCase):
|
||||
"""
|
||||
Test PrefixedEventProcessor
|
||||
"""
|
||||
|
||||
@ddt.data(
|
||||
SequenceDDT(action=u'next', tab_count=5, current_tab=3, legacy_event_type=u'seq_next'),
|
||||
SequenceDDT(action=u'next', tab_count=5, current_tab=5, legacy_event_type=None),
|
||||
SequenceDDT(action=u'previous', tab_count=5, current_tab=3, legacy_event_type=u'seq_prev'),
|
||||
SequenceDDT(action=u'previous', tab_count=5, current_tab=1, legacy_event_type=None),
|
||||
)
|
||||
def test_sequence_linear_navigation(self, sequence_ddt):
|
||||
event_name = u'edx.ui.lms.sequence.{}_selected'.format(sequence_ddt.action)
|
||||
|
||||
event = {
|
||||
u'name': event_name,
|
||||
u'event': {
|
||||
u'current_tab': sequence_ddt.current_tab,
|
||||
u'tab_count': sequence_ddt.tab_count,
|
||||
u'id': u'ABCDEFG',
|
||||
}
|
||||
}
|
||||
|
||||
process_event_shim = PrefixedEventProcessor()
|
||||
result = process_event_shim(event)
|
||||
|
||||
# Legacy fields get added when needed
|
||||
if sequence_ddt.action == u'next':
|
||||
offset = 1
|
||||
else:
|
||||
offset = -1
|
||||
if sequence_ddt.legacy_event_type:
|
||||
self.assertEqual(result[u'event_type'], sequence_ddt.legacy_event_type)
|
||||
self.assertEqual(result[u'event'][u'old'], sequence_ddt.current_tab)
|
||||
self.assertEqual(result[u'event'][u'new'], sequence_ddt.current_tab + offset)
|
||||
else:
|
||||
self.assertNotIn(u'event_type', result)
|
||||
self.assertNotIn(u'old', result[u'event'])
|
||||
self.assertNotIn(u'new', result[u'event'])
|
||||
|
||||
def test_sequence_tab_navigation(self):
|
||||
event_name = u'edx.ui.lms.sequence.tab_selected'
|
||||
event = {
|
||||
u'name': event_name,
|
||||
u'event': {
|
||||
u'current_tab': 2,
|
||||
u'target_tab': 5,
|
||||
u'tab_count': 9,
|
||||
u'id': u'block-v1:abc',
|
||||
u'widget_placement': u'top',
|
||||
}
|
||||
}
|
||||
|
||||
process_event_shim = PrefixedEventProcessor()
|
||||
result = process_event_shim(event)
|
||||
self.assertEqual(result[u'event_type'], u'seq_goto')
|
||||
self.assertEqual(result[u'event'][u'old'], 2)
|
||||
self.assertEqual(result[u'event'][u'new'], 5)
|
||||
|
||||
504
common/djangoapps/track/transformers.py
Normal file
504
common/djangoapps/track/transformers.py
Normal file
@@ -0,0 +1,504 @@
|
||||
"""
|
||||
EventTransformers are data structures that represents events, and modify those
|
||||
events to match the format desired for the tracking logs. They are registered
|
||||
by name (or name prefix) in the EventTransformerRegistry, which is used to
|
||||
apply them to the appropriate events.
|
||||
"""
|
||||
|
||||
import json
|
||||
import logging
|
||||
|
||||
from opaque_keys import InvalidKeyError
|
||||
from opaque_keys.edx.keys import UsageKey
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class DottedPathMapping(object):
|
||||
"""
|
||||
Dictionary-like object for creating keys of dotted paths.
|
||||
|
||||
If a key is created that ends with a dot, it will be treated as a path
|
||||
prefix. Any value whose prefix matches the dotted path can be used
|
||||
as a key for that value, but only the most specific match will
|
||||
be used.
|
||||
"""
|
||||
|
||||
# TODO: The current implementation of the prefix registry requires
|
||||
# O(number of prefix event transformers) to access an event. If we get a
|
||||
# large number of EventTransformers, it may be worth writing a tree-based
|
||||
# map structure where each node is a segment of the match key, which would
|
||||
# reduce access time to O(len(match.key.split('.'))), or essentially constant
|
||||
# time.
|
||||
|
||||
def __init__(self, registry=None):
|
||||
self._match_registry = {}
|
||||
self._prefix_registry = {}
|
||||
self.update(registry or {})
|
||||
|
||||
def __contains__(self, key):
|
||||
try:
|
||||
_ = self[key]
|
||||
return True
|
||||
except KeyError:
|
||||
return False
|
||||
|
||||
def __getitem__(self, key):
|
||||
if key in self._match_registry:
|
||||
return self._match_registry[key]
|
||||
if isinstance(key, basestring):
|
||||
# Reverse-sort the keys to find the longest matching prefix.
|
||||
for prefix in sorted(self._prefix_registry, reverse=True):
|
||||
if key.startswith(prefix):
|
||||
return self._prefix_registry[prefix]
|
||||
raise KeyError('Key {} not found in {}'.format(key, type(self)))
|
||||
|
||||
def __setitem__(self, key, value):
|
||||
if key.endswith('.'):
|
||||
self._prefix_registry[key] = value
|
||||
else:
|
||||
self._match_registry[key] = value
|
||||
|
||||
def __delitem__(self, key):
|
||||
if key.endswith('.'):
|
||||
del self._prefix_registry[key]
|
||||
else:
|
||||
del self._match_registry[key]
|
||||
|
||||
def get(self, key, default=None):
|
||||
"""
|
||||
Return `self[key]` if it exists, otherwise, return `None` or `default`
|
||||
if it is specified.
|
||||
"""
|
||||
try:
|
||||
self[key]
|
||||
except KeyError:
|
||||
return default
|
||||
|
||||
def update(self, dict_):
|
||||
"""
|
||||
Update the mapping with the values in the supplied `dict`.
|
||||
"""
|
||||
for key, value in dict_:
|
||||
self[key] = value
|
||||
|
||||
def keys(self):
|
||||
"""
|
||||
Return the keys of the mapping, including both exact matches and
|
||||
prefix matches.
|
||||
"""
|
||||
return self._match_registry.keys() + self._prefix_registry.keys()
|
||||
|
||||
|
||||
class EventTransformerRegistry(object):
|
||||
"""
|
||||
Registry to track which EventTransformers handle which events. The
|
||||
EventTransformer must define a `match_key` attribute which contains the
|
||||
name or prefix of the event names it tracks. Any `match_key` that ends
|
||||
with a `.` will match all events that share its prefix. A transformer name
|
||||
without a trailing dot only processes exact matches.
|
||||
"""
|
||||
mapping = DottedPathMapping()
|
||||
|
||||
@classmethod
|
||||
def register(cls, transformer):
|
||||
"""
|
||||
Decorator to register an EventTransformer. It must have a `match_key`
|
||||
class attribute defined.
|
||||
"""
|
||||
cls.mapping[transformer.match_key] = transformer
|
||||
return transformer
|
||||
|
||||
@classmethod
|
||||
def create_transformer(cls, event):
|
||||
"""
|
||||
Create an EventTransformer of the given event.
|
||||
|
||||
If no transformer is registered to handle the event, this raises a
|
||||
KeyError.
|
||||
"""
|
||||
name = event.get(u'name')
|
||||
return cls.mapping[name](event)
|
||||
|
||||
|
||||
class EventTransformer(dict):
|
||||
"""
|
||||
Creates a transformer to modify analytics events based on event type.
|
||||
|
||||
To use the transformer, instantiate it using the
|
||||
`EventTransformer.create_transformer()` classmethod with the event
|
||||
dictionary as the sole argument, and then call `transformer.transform()` on
|
||||
the created object to modify the event to the format required for output.
|
||||
|
||||
Custom transformers will want to define some or all of the following values
|
||||
|
||||
Attributes:
|
||||
|
||||
match_key:
|
||||
This is the name of the event you want to transform. If the name
|
||||
ends with a `'.'`, it will be treated as a *prefix transformer*.
|
||||
All other names denote *exact transformers*.
|
||||
|
||||
A *prefix transformer* will handle any event whose name begins with
|
||||
the name of the prefix transformer. Only the most specific match
|
||||
will be used, so if a transformer exists with a name of
|
||||
`'edx.ui.lms.'` and another transformer has the name
|
||||
`'edx.ui.lms.sequence.'` then an event called
|
||||
`'edx.ui.lms.sequence.tab_selected'` will be handled by the
|
||||
`'edx.ui.lms.sequence.'` transformer.
|
||||
|
||||
An *exact transformer* will only handle events whose name matches
|
||||
name of the transformer exactly.
|
||||
|
||||
Exact transformers always take precedence over prefix transformers.
|
||||
|
||||
Transformers without a name will not be added to the registry, and
|
||||
cannot be accessed via the `EventTransformer.create_transformer()`
|
||||
classmethod.
|
||||
|
||||
is_legacy_event:
|
||||
If an event is a legacy event, it needs to set event_type to the
|
||||
legacy name for the event, and may need to set certain event fields
|
||||
to maintain backward compatiblity. If an event needs to provide
|
||||
legacy support in some contexts, `is_legacy_event` can be defined
|
||||
as a property to add dynamic behavior.
|
||||
|
||||
Default: False
|
||||
|
||||
legacy_event_type:
|
||||
If the event is or can be a legacy event, it should define
|
||||
the legacy value for the event_type field here.
|
||||
|
||||
Processing methods. Override these to provide the behavior needed for your
|
||||
particular EventTransformer:
|
||||
|
||||
self.process_legacy_fields():
|
||||
This method should modify the event payload in any way necessary to
|
||||
support legacy event types. It will only be run if
|
||||
`is_legacy_event` returns a True value.
|
||||
|
||||
self.process_event()
|
||||
This method modifies the event payload unconditionally. It will
|
||||
always be run.
|
||||
"""
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(EventTransformer, self).__init__(*args, **kwargs)
|
||||
self.load_payload()
|
||||
|
||||
# Properties to be overridden
|
||||
|
||||
is_legacy_event = False
|
||||
|
||||
@property
|
||||
def legacy_event_type(self):
|
||||
"""
|
||||
Override this as an attribute or property to provide the value for
|
||||
the event's `event_type`, if it does not match the event's `name`.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
# Convenience properties
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
"""
|
||||
Returns the event's name.
|
||||
"""
|
||||
return self[u'name']
|
||||
|
||||
@property
|
||||
def context(self):
|
||||
"""
|
||||
Returns the event's context dict.
|
||||
"""
|
||||
return self.get(u'context', {})
|
||||
|
||||
# Transform methods
|
||||
|
||||
def load_payload(self):
|
||||
"""
|
||||
Create a data version of self[u'event'] at self.event
|
||||
"""
|
||||
if u'event' in self:
|
||||
if isinstance(self[u'event'], basestring):
|
||||
self.event = json.loads(self[u'event'])
|
||||
else:
|
||||
self.event = self[u'event']
|
||||
|
||||
def dump_payload(self):
|
||||
"""
|
||||
Write self.event back to self[u'event'].
|
||||
|
||||
Keep the same format we were originally given.
|
||||
"""
|
||||
if isinstance(self.get(u'event'), basestring):
|
||||
self[u'event'] = json.dumps(self.event)
|
||||
else:
|
||||
self[u'event'] = self.event
|
||||
|
||||
def transform(self):
|
||||
"""
|
||||
Transform the event with legacy fields and other necessary
|
||||
modifications.
|
||||
"""
|
||||
if self.is_legacy_event:
|
||||
self._set_legacy_event_type()
|
||||
self.process_legacy_fields()
|
||||
self.process_event()
|
||||
self.dump_payload()
|
||||
|
||||
def _set_legacy_event_type(self):
|
||||
"""
|
||||
Update the event's `event_type` to the value specified by
|
||||
`self.legacy_event_type`.
|
||||
"""
|
||||
self['event_type'] = self.legacy_event_type
|
||||
|
||||
def process_legacy_fields(self):
|
||||
"""
|
||||
Override this method to specify how to update event fields to maintain
|
||||
compatibility with legacy events.
|
||||
"""
|
||||
pass
|
||||
|
||||
def process_event(self):
|
||||
"""
|
||||
Override this method to make unconditional modifications to event
|
||||
fields.
|
||||
"""
|
||||
pass
|
||||
|
||||
|
||||
@EventTransformerRegistry.register
|
||||
class SequenceTabSelectedEventTransformer(EventTransformer):
|
||||
"""
|
||||
Transformer to maintain backward compatiblity with seq_goto events.
|
||||
"""
|
||||
|
||||
match_key = u'edx.ui.lms.sequence.tab_selected'
|
||||
is_legacy_event = True
|
||||
legacy_event_type = u'seq_goto'
|
||||
|
||||
def process_legacy_fields(self):
|
||||
self.event[u'old'] = self.event[u'current_tab']
|
||||
self.event[u'new'] = self.event[u'target_tab']
|
||||
|
||||
|
||||
class _BaseLinearSequenceEventTransformer(EventTransformer):
|
||||
"""
|
||||
Common functionality for transforming
|
||||
`edx.ui.lms.sequence.{next,previous}_selected` events.
|
||||
"""
|
||||
|
||||
offset = None
|
||||
|
||||
@property
|
||||
def is_legacy_event(self):
|
||||
"""
|
||||
Linear sequence events are legacy events if the origin and target lie
|
||||
within the same sequence.
|
||||
"""
|
||||
return not self.crosses_boundary()
|
||||
|
||||
def process_legacy_fields(self):
|
||||
"""
|
||||
Set legacy payload fields:
|
||||
old: equal to the new current_tab field
|
||||
new: the tab to which the user is navigating
|
||||
"""
|
||||
self.event[u'old'] = self.event[u'current_tab']
|
||||
self.event[u'new'] = self.event[u'current_tab'] + self.offset
|
||||
|
||||
def crosses_boundary(self):
|
||||
"""
|
||||
Returns true if the navigation takes the focus out of the current
|
||||
sequence.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
|
||||
@EventTransformerRegistry.register
|
||||
class NextSelectedEventTransformer(_BaseLinearSequenceEventTransformer):
|
||||
"""
|
||||
Transformer to maintain backward compatiblity with seq_next events.
|
||||
"""
|
||||
|
||||
match_key = u'edx.ui.lms.sequence.next_selected'
|
||||
offset = 1
|
||||
legacy_event_type = u'seq_next'
|
||||
|
||||
def crosses_boundary(self):
|
||||
"""
|
||||
Returns true if the navigation moves the focus to the next sequence.
|
||||
"""
|
||||
return self.event[u'current_tab'] == self.event[u'tab_count']
|
||||
|
||||
|
||||
@EventTransformerRegistry.register
|
||||
class PreviousSelectedEventTransformer(_BaseLinearSequenceEventTransformer):
|
||||
"""
|
||||
Transformer to maintain backward compatiblity with seq_prev events.
|
||||
"""
|
||||
|
||||
match_key = u'edx.ui.lms.sequence.previous_selected'
|
||||
offset = -1
|
||||
legacy_event_type = u'seq_prev'
|
||||
|
||||
def crosses_boundary(self):
|
||||
"""
|
||||
Returns true if the navigation moves the focus to the previous
|
||||
sequence.
|
||||
"""
|
||||
return self.event[u'current_tab'] == 1
|
||||
|
||||
|
||||
@EventTransformerRegistry.register
|
||||
class VideoEventTransformer(EventTransformer):
|
||||
"""
|
||||
Converts new format video events into the legacy video event format.
|
||||
|
||||
Mobile devices cannot actually emit events that exactly match their
|
||||
counterparts emitted by the LMS javascript video player. Instead of
|
||||
attempting to get them to do that, we instead insert a transformer here
|
||||
that converts the events they *can* easily emit and converts them into the
|
||||
legacy format.
|
||||
"""
|
||||
match_key = u'edx.video.'
|
||||
|
||||
name_to_event_type_map = {
|
||||
u'edx.video.played': u'play_video',
|
||||
u'edx.video.paused': u'pause_video',
|
||||
u'edx.video.stopped': u'stop_video',
|
||||
u'edx.video.loaded': u'load_video',
|
||||
u'edx.video.position.changed': u'seek_video',
|
||||
u'edx.video.seeked': u'seek_video',
|
||||
u'edx.video.transcript.shown': u'show_transcript',
|
||||
u'edx.video.transcript.hidden': u'hide_transcript',
|
||||
u'edx.video.language_menu.shown': u'video_show_cc_menu',
|
||||
u'edx.video.language_menu.hidden': u'video_hide_cc_menu',
|
||||
}
|
||||
|
||||
is_legacy_event = True
|
||||
|
||||
@property
|
||||
def legacy_event_type(self):
|
||||
"""
|
||||
Return the legacy event_type of the current event
|
||||
"""
|
||||
return self.name_to_event_type_map[self.name]
|
||||
|
||||
def transform(self):
|
||||
"""
|
||||
Transform the event with necessary modifications if it is one of the
|
||||
expected types of events.
|
||||
"""
|
||||
if self.name in self.name_to_event_type_map:
|
||||
super(VideoEventTransformer, self).transform()
|
||||
|
||||
def process_event(self):
|
||||
"""
|
||||
Modify event fields.
|
||||
"""
|
||||
|
||||
# Convert edx.video.seeked to edx.video.position.changed because edx.video.seeked was not intended to actually
|
||||
# ever be emitted.
|
||||
if self.name == "edx.video.seeked":
|
||||
self['name'] = "edx.video.position.changed"
|
||||
|
||||
if not self.event:
|
||||
return
|
||||
|
||||
self.set_id_to_usage_key()
|
||||
self.capcase_current_time()
|
||||
|
||||
self.convert_seek_type()
|
||||
self.disambiguate_skip_and_seek()
|
||||
self.set_page_to_browser_url()
|
||||
self.handle_ios_seek_bug()
|
||||
|
||||
def set_id_to_usage_key(self):
|
||||
"""
|
||||
Validate that the module_id is a valid usage key, and set the id field
|
||||
accordingly.
|
||||
"""
|
||||
if 'module_id' in self.event:
|
||||
module_id = self.event['module_id']
|
||||
try:
|
||||
usage_key = UsageKey.from_string(module_id)
|
||||
except InvalidKeyError:
|
||||
log.warning('Unable to parse module_id "%s"', module_id, exc_info=True)
|
||||
else:
|
||||
self.event['id'] = usage_key.html_id()
|
||||
|
||||
del self.event['module_id']
|
||||
|
||||
def capcase_current_time(self):
|
||||
"""
|
||||
Convert the current_time field to currentTime.
|
||||
"""
|
||||
if 'current_time' in self.event:
|
||||
self.event['currentTime'] = self.event.pop('current_time')
|
||||
|
||||
def convert_seek_type(self):
|
||||
"""
|
||||
Converts seek_type to seek and converts skip|slide to
|
||||
onSlideSeek|onSkipSeek.
|
||||
"""
|
||||
if 'seek_type' in self.event:
|
||||
seek_type = self.event['seek_type']
|
||||
if seek_type == 'slide':
|
||||
self.event['type'] = "onSlideSeek"
|
||||
elif seek_type == 'skip':
|
||||
self.event['type'] = "onSkipSeek"
|
||||
del self.event['seek_type']
|
||||
|
||||
def disambiguate_skip_and_seek(self):
|
||||
"""
|
||||
For the Android build that isn't distinguishing between skip/seek.
|
||||
"""
|
||||
if 'requested_skip_interval' in self.event:
|
||||
if abs(self.event['requested_skip_interval']) != 30:
|
||||
if 'type' in self.event:
|
||||
self.event['type'] = 'onSlideSeek'
|
||||
|
||||
def set_page_to_browser_url(self):
|
||||
"""
|
||||
If `open_in_browser_url` is specified, set the page to the base of the
|
||||
specified url.
|
||||
"""
|
||||
if 'open_in_browser_url' in self.context:
|
||||
self['page'] = self.context.pop('open_in_browser_url').rpartition('/')[0]
|
||||
|
||||
def handle_ios_seek_bug(self):
|
||||
"""
|
||||
Handle seek bug in iOS.
|
||||
|
||||
iOS build 1.0.02 has a bug where it returns a +30 second skip when
|
||||
it should be returning -30.
|
||||
"""
|
||||
if self._build_requests_plus_30_for_minus_30():
|
||||
if self._user_requested_plus_30_skip():
|
||||
self.event[u'requested_skip_interval'] = -30
|
||||
|
||||
def _build_requests_plus_30_for_minus_30(self):
|
||||
"""
|
||||
Returns True if this build contains the seek bug
|
||||
"""
|
||||
if u'application' in self.context:
|
||||
if all(key in self.context[u'application'] for key in (u'version', u'name')):
|
||||
app_version = self.context[u'application'][u'version']
|
||||
app_name = self.context[u'application'][u'name']
|
||||
return app_version == u'1.0.02' and app_name == u'edx.mobileapp.iOS'
|
||||
return False
|
||||
|
||||
def _user_requested_plus_30_skip(self):
|
||||
"""
|
||||
If the user requested a +30 second skip, return True.
|
||||
"""
|
||||
|
||||
if u'requested_skip_interval' in self.event and u'type' in self.event:
|
||||
interval = self.event[u'requested_skip_interval']
|
||||
action = self.event[u'type']
|
||||
return interval == 30 and action == u'onSkipSeek'
|
||||
else:
|
||||
return False
|
||||
@@ -5,6 +5,7 @@ import json
|
||||
|
||||
from ddt import ddt, data, unpack
|
||||
from mock import sentinel
|
||||
from nose.plugins.attrib import attr
|
||||
|
||||
from django.contrib.auth.models import User
|
||||
from django.test.client import RequestFactory
|
||||
@@ -21,12 +22,8 @@ ENDPOINT = '/segmentio/test/event'
|
||||
USER_ID = 10
|
||||
|
||||
MOBILE_SHIM_PROCESSOR = [
|
||||
{
|
||||
'ENGINE': 'track.shim.LegacyFieldMappingProcessor'
|
||||
},
|
||||
{
|
||||
'ENGINE': 'track.shim.VideoEventProcessor'
|
||||
}
|
||||
{'ENGINE': 'track.shim.LegacyFieldMappingProcessor'},
|
||||
{'ENGINE': 'track.shim.PrefixedEventProcessor'},
|
||||
]
|
||||
|
||||
|
||||
@@ -40,6 +37,7 @@ def expect_failure_with_message(message):
|
||||
return test_decorator
|
||||
|
||||
|
||||
@attr('shard_3')
|
||||
@ddt
|
||||
@override_settings(
|
||||
TRACKING_SEGMENTIO_WEBHOOK_SECRET=SECRET,
|
||||
@@ -411,19 +409,29 @@ class SegmentIOTrackingTestCase(EventTrackingTestCase):
|
||||
assert_event_matches(expected_event, actual_event)
|
||||
|
||||
@data(
|
||||
# Verify positive slide case. Verify slide to onSlideSeek. Verify edx.video.seeked emitted from iOS v1.0.02 is changed to edx.video.position.changed.
|
||||
# Verify positive slide case. Verify slide to onSlideSeek. Verify
|
||||
# edx.video.seeked emitted from iOS v1.0.02 is changed to
|
||||
# edx.video.position.changed.
|
||||
(1, 1, "seek_type", "slide", "onSlideSeek", "edx.video.seeked", "edx.video.position.changed", 'edx.mobileapp.iOS', '1.0.02'),
|
||||
# Verify negative slide case. Verify slide to onSlideSeek. Verify edx.video.seeked to edx.video.position.changed.
|
||||
# Verify negative slide case. Verify slide to onSlideSeek. Verify
|
||||
# edx.video.seeked to edx.video.position.changed.
|
||||
(-2, -2, "seek_type", "slide", "onSlideSeek", "edx.video.seeked", "edx.video.position.changed", 'edx.mobileapp.iOS', '1.0.02'),
|
||||
# Verify +30 is changed to -30 which is incorrectly emitted in iOS v1.0.02. Verify skip to onSkipSeek
|
||||
# Verify +30 is changed to -30 which is incorrectly emitted in iOS
|
||||
# v1.0.02. Verify skip to onSkipSeek
|
||||
(30, -30, "seek_type", "skip", "onSkipSeek", "edx.video.position.changed", "edx.video.position.changed", 'edx.mobileapp.iOS', '1.0.02'),
|
||||
# Verify the correct case of -30 is also handled as well. Verify skip to onSkipSeek
|
||||
# Verify the correct case of -30 is also handled as well. Verify skip
|
||||
# to onSkipSeek
|
||||
(-30, -30, "seek_type", "skip", "onSkipSeek", "edx.video.position.changed", "edx.video.position.changed", 'edx.mobileapp.iOS', '1.0.02'),
|
||||
# Verify positive slide case where onSkipSeek is changed to onSlideSkip. Verify edx.video.seeked emitted from Android v1.0.02 is changed to edx.video.position.changed.
|
||||
# Verify positive slide case where onSkipSeek is changed to
|
||||
# onSlideSkip. Verify edx.video.seeked emitted from Android v1.0.02 is
|
||||
# changed to edx.video.position.changed.
|
||||
(1, 1, "type", "onSkipSeek", "onSlideSeek", "edx.video.seeked", "edx.video.position.changed", 'edx.mobileapp.android', '1.0.02'),
|
||||
# Verify positive slide case where onSkipSeek is changed to onSlideSkip. Verify edx.video.seeked emitted from Android v1.0.02 is changed to edx.video.position.changed.
|
||||
# Verify positive slide case where onSkipSeek is changed to
|
||||
# onSlideSkip. Verify edx.video.seeked emitted from Android v1.0.02 is
|
||||
# changed to edx.video.position.changed.
|
||||
(-2, -2, "type", "onSkipSeek", "onSlideSeek", "edx.video.seeked", "edx.video.position.changed", 'edx.mobileapp.android', '1.0.02'),
|
||||
# Verify positive skip case where onSkipSeek is not changed and does not become negative.
|
||||
# Verify positive skip case where onSkipSeek is not changed and does
|
||||
# not become negative.
|
||||
(30, 30, "type", "onSkipSeek", "onSkipSeek", "edx.video.position.changed", "edx.video.position.changed", 'edx.mobileapp.android', '1.0.02'),
|
||||
# Verify positive skip case where onSkipSeek is not changed.
|
||||
(-30, -30, "type", "onSkipSeek", "onSkipSeek", "edx.video.position.changed", "edx.video.position.changed", 'edx.mobileapp.android', '1.0.02')
|
||||
|
||||
@@ -6,15 +6,14 @@ from opaque_keys import InvalidKeyError
|
||||
from opaque_keys.edx.keys import CourseKey
|
||||
|
||||
|
||||
def course_key_from_string_or_404(course_key_string, message=None):
|
||||
def from_string_or_404(course_key_string):
|
||||
"""
|
||||
Gets CourseKey from the string passed as parameter.
|
||||
|
||||
Parses course key from string(containing course key) or raises 404 if the string's format is invalid.
|
||||
|
||||
Arguments:
|
||||
course_key_string(str): It contains the course key
|
||||
message(str): It contains the exception message
|
||||
course_key_string(str): It is string containing the course key
|
||||
|
||||
Returns:
|
||||
CourseKey: A key that uniquely identifies a course
|
||||
@@ -26,6 +25,6 @@ def course_key_from_string_or_404(course_key_string, message=None):
|
||||
try:
|
||||
course_key = CourseKey.from_string(course_key_string)
|
||||
except InvalidKeyError:
|
||||
raise Http404(message)
|
||||
raise Http404
|
||||
|
||||
return course_key
|
||||
|
||||
@@ -1,54 +1,32 @@
|
||||
"""
|
||||
Tests for util.course_key_utils
|
||||
"""
|
||||
import ddt
|
||||
import unittest
|
||||
from util.course_key_utils import course_key_from_string_or_404
|
||||
from nose.tools import assert_equals, assert_raises # pylint: disable=no-name-in-module
|
||||
from util.course_key_utils import from_string_or_404
|
||||
from opaque_keys.edx.keys import CourseKey
|
||||
from django.http import Http404
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
class TestFromStringOr404(unittest.TestCase):
|
||||
"""
|
||||
Base Test class for course_key_from_string_or_404 utility tests
|
||||
"""
|
||||
@ddt.data(
|
||||
"course-v1:TTT+CS01+2015_T0", # split style course keys
|
||||
"TTT/CS01/2015_T0" # mongo style course keys
|
||||
)
|
||||
def test_from_string_or_404_for_valid_course_key(self, valid_course_key):
|
||||
"""
|
||||
Tests course_key_from_string_or_404 for valid split style course keys and mongo style course keys.
|
||||
"""
|
||||
self.assertEquals(
|
||||
CourseKey.from_string(valid_course_key),
|
||||
course_key_from_string_or_404(valid_course_key)
|
||||
)
|
||||
def test_from_string_or_404():
|
||||
|
||||
@ddt.data(
|
||||
"/some.invalid.key/course-v1:TTT+CS01+2015_T0", # split style course keys
|
||||
"/some.invalid.key/TTT/CS01/2015_T0" # mongo style course keys
|
||||
#testing with split style course keys
|
||||
assert_raises(
|
||||
Http404,
|
||||
from_string_or_404,
|
||||
"/some.invalid.key/course-v1:TTT+CS01+2015_T0"
|
||||
)
|
||||
assert_equals(
|
||||
CourseKey.from_string("course-v1:TTT+CS01+2015_T0"),
|
||||
from_string_or_404("course-v1:TTT+CS01+2015_T0")
|
||||
)
|
||||
def test_from_string_or_404_for_invalid_course_key(self, invalid_course_key):
|
||||
"""
|
||||
Tests course_key_from_string_or_404 for valid split style course keys and mongo style course keys.
|
||||
"""
|
||||
self.assertRaises(
|
||||
Http404,
|
||||
course_key_from_string_or_404,
|
||||
invalid_course_key,
|
||||
)
|
||||
|
||||
@ddt.data(
|
||||
"/some.invalid.key/course-v1:TTT+CS01+2015_T0", # split style invalid course key
|
||||
"/some.invalid.key/TTT/CS01/2015_T0" # mongo style invalid course key
|
||||
#testing with mongo style course keys
|
||||
assert_raises(
|
||||
Http404,
|
||||
from_string_or_404,
|
||||
"/some.invalid.key/TTT/CS01/2015_T0"
|
||||
)
|
||||
assert_equals(
|
||||
CourseKey.from_string("TTT/CS01/2015_T0"),
|
||||
from_string_or_404("TTT/CS01/2015_T0")
|
||||
)
|
||||
def test_from_string_or_404_with_message(self, course_string):
|
||||
"""
|
||||
Tests course_key_from_string_or_404 with exception message for split style and monog style invalid course keys.
|
||||
:return:
|
||||
"""
|
||||
with self.assertRaises(Http404) as context:
|
||||
course_key_from_string_or_404(course_string, message="Invalid Keys")
|
||||
self.assertEquals(str(context.exception), "Invalid Keys")
|
||||
|
||||
@@ -175,7 +175,7 @@ class CourseFields(object):
|
||||
scope=Scope.settings
|
||||
)
|
||||
textbooks = TextbookList(
|
||||
help=_("List of pairs of (title, url) for textbooks used in this course"),
|
||||
help=_("List of Textbook objects with (title, url) for textbooks used in this course"),
|
||||
default=[],
|
||||
scope=Scope.content
|
||||
)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user