Commit 33f0e92d by Will Daly

Merge remote-tracking branch 'origin/master' into will/combine-reg-login-form

parents 82385c4e ffd64212
...@@ -49,6 +49,7 @@ def get_an_error_dialog(step): ...@@ -49,6 +49,7 @@ def get_an_error_dialog(step):
@step('I can click to go to the unit with the error$') @step('I can click to go to the unit with the error$')
def i_click_on_error_dialog(step): def i_click_on_error_dialog(step):
world.wait_for_visible(".button.action-primary")
world.click_link_by_text('Correct failed component') world.click_link_by_text('Correct failed component')
problem_string = unicode(world.scenario_dict['COURSE'].id.make_usage_key("problem", 'ignore')) problem_string = unicode(world.scenario_dict['COURSE'].id.make_usage_key("problem", 'ignore'))
......
"""
Django management command to create a course in a specific modulestore
"""
from django.core.management.base import BaseCommand, CommandError
from django.contrib.auth.models import User
from xmodule.modulestore import ModuleStoreEnum
from contentstore.views.course import create_new_course_in_store
from contentstore.management.commands.utils import user_from_str
class Command(BaseCommand):
"""
Create a course in a specific modulestore.
"""
# can this query modulestore for the list of write accessible stores or does that violate command pattern?
help = "Create a course in one of {}".format([ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split])
args = "modulestore user org course run"
def parse_args(self, *args):
"""
Return a tuple of passed in values for (modulestore, user, org, course, run).
"""
if len(args) != 5:
raise CommandError(
"create_course requires 5 arguments: "
"a modulestore, user, org, course, run. Modulestore is one of {}".format(
[ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split]
)
)
if args[0] not in [ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split]:
raise CommandError(
"Modulestore (first arg) must be one of {}".format(
[ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split]
)
)
storetype = args[0]
try:
user = user_from_str(args[1])
except User.DoesNotExist:
raise CommandError("No user {} found: expected args are ".format(args[1], self.args))
org = args[2]
course = args[3]
run = args[4]
return storetype, user, org, course, run
def handle(self, *args, **options):
storetype, user, org, course, run = self.parse_args(*args)
new_course = create_new_course_in_store(storetype, user, org, course, run, {})
self.stdout.write(u"Created {}".format(unicode(new_course.id)))
...@@ -8,23 +8,8 @@ from xmodule.modulestore.django import modulestore ...@@ -8,23 +8,8 @@ from xmodule.modulestore.django import modulestore
from xmodule.modulestore.split_migrator import SplitMigrator from xmodule.modulestore.split_migrator import SplitMigrator
from opaque_keys.edx.keys import CourseKey from opaque_keys.edx.keys import CourseKey
from opaque_keys import InvalidKeyError from opaque_keys import InvalidKeyError
from opaque_keys.edx.locations import SlashSeparatedCourseKey
from xmodule.modulestore import ModuleStoreEnum from xmodule.modulestore import ModuleStoreEnum
from contentstore.management.commands.utils import user_from_str
def user_from_str(identifier):
"""
Return a user identified by the given string. The string could be an email
address, or a stringified integer corresponding to the ID of the user in
the database. If no user could be found, a User.DoesNotExist exception
will be raised.
"""
try:
user_id = int(identifier)
except ValueError:
return User.objects.get(email=identifier)
return User.objects.get(id=user_id)
class Command(BaseCommand): class Command(BaseCommand):
...@@ -48,7 +33,7 @@ class Command(BaseCommand): ...@@ -48,7 +33,7 @@ class Command(BaseCommand):
try: try:
course_key = CourseKey.from_string(args[0]) course_key = CourseKey.from_string(args[0])
except InvalidKeyError: except InvalidKeyError:
course_key = SlashSeparatedCourseKey.from_deprecated_string(args[0]) raise CommandError("Invalid location string")
try: try:
user = user_from_str(args[1]) user = user_from_str(args[1])
...@@ -63,7 +48,7 @@ class Command(BaseCommand): ...@@ -63,7 +48,7 @@ class Command(BaseCommand):
except IndexError: except IndexError:
pass pass
return course_key, user, org, course, run return course_key, user.id, org, course, run
def handle(self, *args, **options): def handle(self, *args, **options):
course_key, user, org, course, run = self.parse_args(*args) course_key, user, org, course, run = self.parse_args(*args)
......
"""
Unittests for creating a course in an chosen modulestore
"""
import unittest
import ddt
from django.core.management import CommandError, call_command
from contentstore.management.commands.create_course import Command
from xmodule.modulestore import ModuleStoreEnum
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
from xmodule.modulestore.django import modulestore
class TestArgParsing(unittest.TestCase):
"""
Tests for parsing arguments for the `create_course` management command
"""
def setUp(self):
self.command = Command()
def test_no_args(self):
errstring = "create_course requires 5 arguments"
with self.assertRaisesRegexp(CommandError, errstring):
self.command.handle('create_course')
def test_invalid_store(self):
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):
self.command.handle("split", "99", "org", "course", "run")
def test_nonexistent_user_email(self):
errstring = "No user fake@example.com found"
with self.assertRaisesRegexp(CommandError, errstring):
self.command.handle("mongo", "fake@example.com", "org", "course", "run")
@ddt.ddt
class TestCreateCourse(ModuleStoreTestCase):
"""
Unit tests for creating a course in either old mongo or split mongo via command line
"""
def setUp(self):
super(TestCreateCourse, self).setUp(create_user=True)
@ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
def test_all_stores_user_email(self, store):
call_command(
"create_course",
store,
str(self.user.email),
"org", "course", "run"
)
new_key = modulestore().make_course_key("org", "course", "run")
self.assertTrue(
modulestore().has_course(new_key),
"Could not find course in {}".format(store)
)
# pylint: disable=protected-access
self.assertEqual(store, modulestore()._get_modulestore_for_courseid(new_key).get_modulestore_type())
...@@ -3,87 +3,110 @@ Unittests for migrating a course to split mongo ...@@ -3,87 +3,110 @@ Unittests for migrating a course to split mongo
""" """
import unittest import unittest
from django.contrib.auth.models import User
from django.core.management import CommandError, call_command from django.core.management import CommandError, call_command
from contentstore.management.commands.migrate_to_split import Command from contentstore.management.commands.migrate_to_split import Command
from xmodule.modulestore import ModuleStoreEnum from xmodule.modulestore import ModuleStoreEnum
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
from xmodule.modulestore.tests.factories import CourseFactory from xmodule.modulestore.tests.factories import CourseFactory
from xmodule.modulestore.django import modulestore, clear_existing_modulestores from xmodule.modulestore.django import modulestore
from opaque_keys.edx.locator import CourseLocator
# pylint: disable=E1101
@unittest.skip("Not fixing split mongo until we land this long branch")
class TestArgParsing(unittest.TestCase): class TestArgParsing(unittest.TestCase):
""" """
Tests for parsing arguments for the `migrate_to_split` management command Tests for parsing arguments for the `migrate_to_split` management command
""" """
def setUp(self): def setUp(self):
super(TestArgParsing, self).setUp()
self.command = Command() self.command = Command()
def test_no_args(self): def test_no_args(self):
"""
Test the arg length error
"""
errstring = "migrate_to_split requires at least two arguments" errstring = "migrate_to_split requires at least two arguments"
with self.assertRaisesRegexp(CommandError, errstring): with self.assertRaisesRegexp(CommandError, errstring):
self.command.handle() self.command.handle()
def test_invalid_location(self): def test_invalid_location(self):
"""
Test passing an unparsable course id
"""
errstring = "Invalid location string" errstring = "Invalid location string"
with self.assertRaisesRegexp(CommandError, errstring): with self.assertRaisesRegexp(CommandError, errstring):
self.command.handle("foo", "bar") self.command.handle("foo", "bar")
def test_nonexistant_user_id(self): def test_nonexistent_user_id(self):
"""
Test error for using an unknown user primary key
"""
errstring = "No user found identified by 99" errstring = "No user found identified by 99"
with self.assertRaisesRegexp(CommandError, errstring): with self.assertRaisesRegexp(CommandError, errstring):
self.command.handle("i4x://org/course/category/name", "99") self.command.handle("org/course/name", "99")
def test_nonexistant_user_email(self): def test_nonexistent_user_email(self):
"""
Test error for using an unknown user email
"""
errstring = "No user found identified by fake@example.com" errstring = "No user found identified by fake@example.com"
with self.assertRaisesRegexp(CommandError, errstring): with self.assertRaisesRegexp(CommandError, errstring):
self.command.handle("i4x://org/course/category/name", "fake@example.com") self.command.handle("org/course/name", "fake@example.com")
@unittest.skip("Not fixing split mongo until we land this long branch") # pylint: disable=no-member, protected-access
class TestMigrateToSplit(ModuleStoreTestCase): class TestMigrateToSplit(ModuleStoreTestCase):
""" """
Unit tests for migrating a course from old mongo to split mongo Unit tests for migrating a course from old mongo to split mongo
""" """
def setUp(self): def setUp(self):
super(TestMigrateToSplit, self).setUp() super(TestMigrateToSplit, self).setUp(create_user=True)
uname = 'testuser'
email = 'test+courses@edx.org'
password = 'foo'
self.user = User.objects.create_user(uname, email, password)
self.course = CourseFactory() self.course = CourseFactory()
self.addCleanup(ModuleStoreTestCase.drop_mongo_collections)
self.addCleanup(clear_existing_modulestores)
def test_user_email(self): def test_user_email(self):
"""
Test migration for real as well as testing using an email addr to id the user
"""
call_command( call_command(
"migrate_to_split", "migrate_to_split",
str(self.course.location), str(self.course.id),
str(self.user.email), str(self.user.email),
) )
course_from_split = modulestore('split').get_course(self.course.id) split_store = modulestore()._get_modulestore_by_type(ModuleStoreEnum.Type.split)
self.assertIsNotNone(course_from_split) new_key = split_store.make_course_key(self.course.id.org, self.course.id.course, self.course.id.run)
self.assertTrue(
split_store.has_course(new_key),
"Could not find course"
)
# I put this in but realized that the migrator doesn't make the new course the
# default mapping in mixed modulestore. I left the test here so we can debate what it ought to do.
# self.assertEqual(
# ModuleStoreEnum.Type.split,
# modulestore()._get_modulestore_for_courseid(new_key).get_modulestore_type(),
# "Split is not the new default for the course"
# )
def test_user_id(self): def test_user_id(self):
"""
Test that the command accepts the user's primary key
"""
# lack of error implies success
call_command( call_command(
"migrate_to_split", "migrate_to_split",
str(self.course.location), str(self.course.id),
str(self.user.id), str(self.user.id),
) )
course_from_split = modulestore('split').get_course(self.course.id)
self.assertIsNotNone(course_from_split)
def test_locator_string(self): def test_locator_string(self):
"""
Test importing to a different course id
"""
call_command( call_command(
"migrate_to_split", "migrate_to_split",
str(self.course.location), str(self.course.id),
str(self.user.id), str(self.user.id),
"org.dept+name.run", "org.dept", "name", "run",
) )
locator = CourseLocator(org="org.dept", course="name", run="run", branch=ModuleStoreEnum.RevisionOption.published_only) split_store = modulestore()._get_modulestore_by_type(ModuleStoreEnum.Type.split)
course_from_split = modulestore('split').get_course(locator) locator = split_store.make_course_key(self.course.id.org, self.course.id.course, self.course.id.run)
course_from_split = modulestore().get_course(locator)
self.assertIsNotNone(course_from_split) self.assertIsNotNone(course_from_split)
"""
Common methods for cms commands to use
"""
from django.contrib.auth.models import User
def user_from_str(identifier):
"""
Return a user identified by the given string. The string could be an email
address, or a stringified integer corresponding to the ID of the user in
the database. If no user could be found, a User.DoesNotExist exception
will be raised.
"""
try:
user_id = int(identifier)
except ValueError:
return User.objects.get(email=identifier)
return User.objects.get(id=user_id)
...@@ -5,9 +5,11 @@ import datetime ...@@ -5,9 +5,11 @@ import datetime
import json import json
import copy import copy
import mock import mock
from mock import patch
from django.utils.timezone import UTC from django.utils.timezone import UTC
from django.test.utils import override_settings from django.test.utils import override_settings
from django.conf import settings
from models.settings.course_details import (CourseDetails, CourseSettingsEncoder) from models.settings.course_details import (CourseDetails, CourseSettingsEncoder)
from models.settings.course_grading import CourseGradingModel from models.settings.course_grading import CourseGradingModel
...@@ -476,6 +478,80 @@ class CourseMetadataEditingTest(CourseTestCase): ...@@ -476,6 +478,80 @@ class CourseMetadataEditingTest(CourseTestCase):
self.assertIn('showanswer', test_model, 'showanswer field ') self.assertIn('showanswer', test_model, 'showanswer field ')
self.assertIn('xqa_key', test_model, 'xqa_key field ') self.assertIn('xqa_key', test_model, 'xqa_key field ')
@patch.dict(settings.FEATURES, {'ENABLE_EXPORT_GIT': True})
def test_fetch_giturl_present(self):
"""
If feature flag ENABLE_EXPORT_GIT is on, show the setting as a non-deprecated Advanced Setting.
"""
test_model = CourseMetadata.fetch(self.fullcourse)
self.assertIn('giturl', test_model)
@patch.dict(settings.FEATURES, {'ENABLE_EXPORT_GIT': False})
def test_fetch_giturl_not_present(self):
"""
If feature flag ENABLE_EXPORT_GIT is off, don't show the setting at all on the Advanced Settings page.
"""
test_model = CourseMetadata.fetch(self.fullcourse)
self.assertNotIn('giturl', test_model)
@patch.dict(settings.FEATURES, {'ENABLE_EXPORT_GIT': False})
def test_validate_update_filtered_off(self):
"""
If feature flag is off, then giturl must be filtered.
"""
# pylint: disable=unused-variable
is_valid, errors, test_model = CourseMetadata.validate_and_update_from_json(
self.course,
{
"giturl": {"value": "http://example.com"},
},
user=self.user
)
self.assertNotIn('giturl', test_model)
@patch.dict(settings.FEATURES, {'ENABLE_EXPORT_GIT': True})
def test_validate_update_filtered_on(self):
"""
If feature flag is on, then giturl must not be filtered.
"""
# pylint: disable=unused-variable
is_valid, errors, test_model = CourseMetadata.validate_and_update_from_json(
self.course,
{
"giturl": {"value": "http://example.com"},
},
user=self.user
)
self.assertIn('giturl', test_model)
@patch.dict(settings.FEATURES, {'ENABLE_EXPORT_GIT': True})
def test_update_from_json_filtered_on(self):
"""
If feature flag is on, then giturl must be updated.
"""
test_model = CourseMetadata.update_from_json(
self.course,
{
"giturl": {"value": "http://example.com"},
},
user=self.user
)
self.assertIn('giturl', test_model)
@patch.dict(settings.FEATURES, {'ENABLE_EXPORT_GIT': False})
def test_update_from_json_filtered_off(self):
"""
If feature flag is on, then giturl must not be updated.
"""
test_model = CourseMetadata.update_from_json(
self.course,
{
"giturl": {"value": "http://example.com"},
},
user=self.user
)
self.assertNotIn('giturl', test_model)
def test_validate_and_update_from_json_correct_inputs(self): def test_validate_and_update_from_json_correct_inputs(self):
is_valid, errors, test_model = CourseMetadata.validate_and_update_from_json( is_valid, errors, test_model = CourseMetadata.validate_and_update_from_json(
self.course, self.course,
......
...@@ -327,7 +327,7 @@ class CourseKeyVerificationTestCase(CourseTestCase): ...@@ -327,7 +327,7 @@ class CourseKeyVerificationTestCase(CourseTestCase):
super(CourseKeyVerificationTestCase, self).setUp() super(CourseKeyVerificationTestCase, self).setUp()
self.course = CourseFactory.create(org='edX', number='test_course_key', display_name='Test Course') self.course = CourseFactory.create(org='edX', number='test_course_key', display_name='Test Course')
@data(('edX/test_course_key/Test_Course', 200), ('slashes:edX+test_course_key+Test_Course', 404)) @data(('edX/test_course_key/Test_Course', 200), ('garbage:edX+test_course_key+Test_Course', 404))
@unpack @unpack
def test_course_key_decorator(self, course_key, status_code): def test_course_key_decorator(self, course_key, status_code):
""" """
......
...@@ -564,6 +564,22 @@ def _create_new_course(request, org, number, run, fields): ...@@ -564,6 +564,22 @@ def _create_new_course(request, org, number, run, fields):
Returns the URL for the course overview page. Returns the URL for the course overview page.
Raises DuplicateCourseError if the course already exists Raises DuplicateCourseError if the course already exists
""" """
store_for_new_course = (
settings.FEATURES.get('DEFAULT_STORE_FOR_NEW_COURSE') or
modulestore().default_modulestore.get_modulestore_type()
)
new_course = create_new_course_in_store(store_for_new_course, request.user, org, number, run, fields)
return JsonResponse({
'url': reverse_course_url('course_handler', new_course.id),
'course_key': unicode(new_course.id),
})
def create_new_course_in_store(store, user, org, number, run, fields):
"""
Create course in store w/ handling instructor enrollment, permissions, and defaulting the wiki slug.
Separated out b/c command line course creation uses this as well as the web interface.
"""
# Set a unique wiki_slug for newly created courses. To maintain active wiki_slugs for # Set a unique wiki_slug for newly created courses. To maintain active wiki_slugs for
# existing xml courses this cannot be changed in CourseDescriptor. # existing xml courses this cannot be changed in CourseDescriptor.
# # TODO get rid of defining wiki slug in this org/course/run specific way and reconcile # # TODO get rid of defining wiki slug in this org/course/run specific way and reconcile
...@@ -572,31 +588,22 @@ def _create_new_course(request, org, number, run, fields): ...@@ -572,31 +588,22 @@ def _create_new_course(request, org, number, run, fields):
definition_data = {'wiki_slug': wiki_slug} definition_data = {'wiki_slug': wiki_slug}
fields.update(definition_data) fields.update(definition_data)
store = modulestore() with modulestore().default_store(store):
store_for_new_course = (
settings.FEATURES.get('DEFAULT_STORE_FOR_NEW_COURSE') or
store.default_modulestore.get_modulestore_type()
)
with store.default_store(store_for_new_course):
# Creating the course raises DuplicateCourseError if an existing course with this org/name is found # Creating the course raises DuplicateCourseError if an existing course with this org/name is found
new_course = store.create_course( new_course = modulestore().create_course(
org, org,
number, number,
run, run,
request.user.id, user.id,
fields=fields, fields=fields,
) )
# Make sure user has instructor and staff access to the new course # Make sure user has instructor and staff access to the new course
add_instructor(new_course.id, request.user, request.user) add_instructor(new_course.id, user, user)
# Initialize permissions for user in the new course # Initialize permissions for user in the new course
initialize_permissions(new_course.id, request.user) initialize_permissions(new_course.id, user)
return new_course
return JsonResponse({
'url': reverse_course_url('course_handler', new_course.id),
'course_key': unicode(new_course.id),
})
def _rerun_course(request, org, number, run, fields): def _rerun_course(request, org, number, run, fields):
......
from xblock.fields import Scope from xblock.fields import Scope
from xmodule.modulestore.django import modulestore from xmodule.modulestore.django import modulestore
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from django.conf import settings
class CourseMetadata(object): class CourseMetadata(object):
...@@ -11,6 +12,8 @@ class CourseMetadata(object): ...@@ -11,6 +12,8 @@ class CourseMetadata(object):
editable metadata. editable metadata.
''' '''
# The list of fields that wouldn't be shown in Advanced Settings. # The list of fields that wouldn't be shown in Advanced Settings.
# Should not be used directly. Instead the filtered_list method should be used if the field needs to be filtered
# depending on the feature flag.
FILTERED_LIST = ['xml_attributes', FILTERED_LIST = ['xml_attributes',
'start', 'start',
'end', 'end',
...@@ -31,6 +34,20 @@ class CourseMetadata(object): ...@@ -31,6 +34,20 @@ class CourseMetadata(object):
] ]
@classmethod @classmethod
def filtered_list(cls):
"""
Filter fields based on feature flag, i.e. enabled, disabled.
"""
# Copy the filtered list to avoid permanently changing the class attribute.
filtered_list = list(cls.FILTERED_LIST)
# Do not show giturl if feature is not enabled.
if not settings.FEATURES.get('ENABLE_EXPORT_GIT'):
filtered_list.append('giturl')
return filtered_list
@classmethod
def fetch(cls, descriptor): def fetch(cls, descriptor):
""" """
Fetch the key:value editable course details for the given course from Fetch the key:value editable course details for the given course from
...@@ -42,7 +59,7 @@ class CourseMetadata(object): ...@@ -42,7 +59,7 @@ class CourseMetadata(object):
if field.scope != Scope.settings: if field.scope != Scope.settings:
continue continue
if field.name in cls.FILTERED_LIST: if field.name in cls.filtered_list():
continue continue
result[field.name] = { result[field.name] = {
...@@ -61,8 +78,7 @@ class CourseMetadata(object): ...@@ -61,8 +78,7 @@ class CourseMetadata(object):
Ensures none of the fields are in the blacklist. Ensures none of the fields are in the blacklist.
""" """
# Copy the filtered list to avoid permanently changing the class attribute. filtered_list = cls.filtered_list()
filtered_list = list(cls.FILTERED_LIST)
# Don't filter on the tab attribute if filter_tabs is False. # Don't filter on the tab attribute if filter_tabs is False.
if not filter_tabs: if not filter_tabs:
filtered_list.remove("tabs") filtered_list.remove("tabs")
...@@ -97,10 +113,10 @@ class CourseMetadata(object): ...@@ -97,10 +113,10 @@ class CourseMetadata(object):
errors: list of error objects errors: list of error objects
result: the updated course metadata or None if error result: the updated course metadata or None if error
""" """
filtered_list = cls.filtered_list()
filtered_list = list(cls.FILTERED_LIST)
if not filter_tabs: if not filter_tabs:
filtered_list.remove("tabs") filtered_list.remove("tabs")
filtered_dict = dict((k, v) for k, v in jsondict.iteritems() if k not in filtered_list) filtered_dict = dict((k, v) for k, v in jsondict.iteritems() if k not in filtered_list)
did_validate = True did_validate = True
errors = [] errors = []
......
...@@ -145,10 +145,10 @@ class Migration(DataMigration): ...@@ -145,10 +145,10 @@ class Migration(DataMigration):
if self.mongostore is not None: if self.mongostore is not None:
course_son = bson.son.SON([ course_son = bson.son.SON([
('_id.tag', 'i4x'), ('_id.tag', 'i4x'),
('_id.org', re.compile(r'^{}$'.format(downcased_ssck.org), re.IGNORECASE)), ('_id.org', re.compile(ur'^{}$'.format(downcased_ssck.org), re.IGNORECASE | re.UNICODE)),
('_id.course', re.compile(r'^{}$'.format(downcased_ssck.course), re.IGNORECASE)), ('_id.course', re.compile(ur'^{}$'.format(downcased_ssck.course), re.IGNORECASE | re.UNICODE)),
('_id.category', 'course'), ('_id.category', 'course'),
('_id.name', re.compile(r'^{}$'.format(downcased_ssck.run), re.IGNORECASE)), ('_id.name', re.compile(ur'^{}$'.format(downcased_ssck.run), re.IGNORECASE | re.UNICODE)),
]) ])
entry = self.mongostore.collection.find_one(course_son) entry = self.mongostore.collection.find_one(course_son)
if entry: if entry:
......
...@@ -112,10 +112,10 @@ class Migration(DataMigration): ...@@ -112,10 +112,10 @@ class Migration(DataMigration):
if self.mongostore is not None: if self.mongostore is not None:
course_son = bson.son.SON([ course_son = bson.son.SON([
('_id.tag', 'i4x'), ('_id.tag', 'i4x'),
('_id.org', re.compile(r'^{}$'.format(downcased_ssck.org), re.IGNORECASE)), ('_id.org', re.compile(ur'^{}$'.format(downcased_ssck.org), re.IGNORECASE | re.UNICODE)),
('_id.course', re.compile(r'^{}$'.format(downcased_ssck.course), re.IGNORECASE)), ('_id.course', re.compile(ur'^{}$'.format(downcased_ssck.course), re.IGNORECASE | re.UNICODE)),
('_id.category', 'course'), ('_id.category', 'course'),
('_id.name', re.compile(r'^{}$'.format(downcased_ssck.run), re.IGNORECASE)), ('_id.name', re.compile(ur'^{}$'.format(downcased_ssck.run), re.IGNORECASE | re.UNICODE)),
]) ])
entry = self.mongostore.collection.find_one(course_son) entry = self.mongostore.collection.find_one(course_son)
if entry: if entry:
......
...@@ -447,13 +447,17 @@ def is_course_blocked(request, redeemed_registration_codes, course_key): ...@@ -447,13 +447,17 @@ def is_course_blocked(request, redeemed_registration_codes, course_key):
"""Checking either registration is blocked or not .""" """Checking either registration is blocked or not ."""
blocked = False blocked = False
for redeemed_registration in redeemed_registration_codes: for redeemed_registration in redeemed_registration_codes:
if not getattr(redeemed_registration.invoice, 'is_valid'): # registration codes may be generated via Bulk Purchase Scenario
blocked = True # we have to check only for the invoice generated registration codes
# disabling email notifications for unpaid registration courses # that their invoice is valid or not
Optout.objects.get_or_create(user=request.user, course_id=course_key) if redeemed_registration.invoice:
log.info(u"User {0} ({1}) opted out of receiving emails from course {2}".format(request.user.username, request.user.email, course_key)) if not getattr(redeemed_registration.invoice, 'is_valid'):
track.views.server_track(request, "change-email1-settings", {"receive_emails": "no", "course": course_key.to_deprecated_string()}, page='dashboard') blocked = True
break # disabling email notifications for unpaid registration courses
Optout.objects.get_or_create(user=request.user, course_id=course_key)
log.info(u"User {0} ({1}) opted out of receiving emails from course {2}".format(request.user.username, request.user.email, course_key))
track.views.server_track(request, "change-email1-settings", {"receive_emails": "no", "course": course_key.to_deprecated_string()}, page='dashboard')
break
return blocked return blocked
......
...@@ -29,7 +29,6 @@ ...@@ -29,7 +29,6 @@
<p class="status" <p class="status"
%if status != 'unsubmitted': %if status != 'unsubmitted':
aria-hidden="true"
%endif %endif
aria-describedby="input_${id}"> aria-describedby="input_${id}">
%if value: %if value:
...@@ -41,7 +40,7 @@ ...@@ -41,7 +40,7 @@
${status.display_name} ${status.display_name}
</p> </p>
<p id="answer_${id}" class="answer" aria-hidden="true"></p> <p id="answer_${id}" class="answer"></p>
% if do_math: % if do_math:
<div id="display_${id}" class="equation">`{::}`</div> <div id="display_${id}" class="equation">`{::}`</div>
......
...@@ -122,6 +122,11 @@ ...@@ -122,6 +122,11 @@
'option', 'value', 20 'option', 'value', 20
); );
}); });
it('required aria values updated', function () {
expect(state.videoProgressSlider.handle.attr('aria-valuenow')).toBe('20');
expect(state.videoProgressSlider.handle.attr('aria-valuemax')).toBe('120');
});
}); });
}); });
......
...@@ -76,7 +76,10 @@ function () { ...@@ -76,7 +76,10 @@ function () {
'title': gettext('Video position'), 'title': gettext('Video position'),
'aria-disabled': false, 'aria-disabled': false,
'aria-valuetext': getTimeDescription(state.videoProgressSlider 'aria-valuetext': getTimeDescription(state.videoProgressSlider
.slider.slider('option', 'value')) .slider.slider('option', 'value')),
'aria-valuemax': state.videoPlayer.duration(),
'aria-valuemin': '0',
'aria-valuenow': state.videoPlayer.currentTime
}); });
} }
...@@ -243,6 +246,12 @@ function () { ...@@ -243,6 +246,12 @@ function () {
.slider('option', 'max', duration) .slider('option', 'max', duration)
.slider('option', 'value', time); .slider('option', 'value', time);
} }
// Update aria values.
this.videoProgressSlider.handle.attr({
'aria-valuemax': duration,
'aria-valuenow': time
});
} }
// When the video stops playing (either because the end was reached, or // When the video stops playing (either because the end was reached, or
......
...@@ -66,8 +66,7 @@ class InheritanceMixin(XBlockMixin): ...@@ -66,8 +66,7 @@ class InheritanceMixin(XBlockMixin):
giturl = String( giturl = String(
display_name=_("GIT URL"), display_name=_("GIT URL"),
help=_("Enter the URL for the course data GIT repository."), help=_("Enter the URL for the course data GIT repository."),
scope=Scope.settings, scope=Scope.settings
deprecated=True # Deprecated because GIT workflow users do not use Studio.
) )
xqa_key = String( xqa_key = String(
display_name=_("XQA Key"), display_name=_("XQA Key"),
...@@ -127,7 +126,7 @@ class InheritanceMixin(XBlockMixin): ...@@ -127,7 +126,7 @@ class InheritanceMixin(XBlockMixin):
) )
max_attempts = Integer( max_attempts = Integer(
display_name=_("Maximum Attempts"), display_name=_("Maximum Attempts"),
help=_("Enter the maximum number of times a student can try to answer problems. This is a course-wide setting, but you can specify a different number when you create an individual problem. To allow unlimited attempts, enter null."), help=_("Enter the maximum number of times a student can try to answer problems. By default, Maximum Attempts is set to null, meaning that students have an unlimited number of attempts for problems. You can override this course-wide setting for individual problems. However, if the course-wide setting is a specific number, you cannot set the Maximum Attempts for individual problems to unlimited."),
values={"min": 0}, scope=Scope.settings values={"min": 0}, scope=Scope.settings
) )
matlab_api_key = String( matlab_api_key = String(
......
...@@ -11,6 +11,7 @@ import logging ...@@ -11,6 +11,7 @@ import logging
from xblock.fields import Reference, ReferenceList, ReferenceValueDict from xblock.fields import Reference, ReferenceList, ReferenceValueDict
from xmodule.modulestore import ModuleStoreEnum from xmodule.modulestore import ModuleStoreEnum
from opaque_keys.edx.locator import CourseLocator from opaque_keys.edx.locator import CourseLocator
from xmodule.modulestore.exceptions import ItemNotFoundError
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
...@@ -46,6 +47,8 @@ class SplitMigrator(object): ...@@ -46,6 +47,8 @@ class SplitMigrator(object):
# create the course: set fields to explicitly_set for each scope, id_root = new_course_locator, master_branch = 'production' # create the course: set fields to explicitly_set for each scope, id_root = new_course_locator, master_branch = 'production'
original_course = self.source_modulestore.get_course(source_course_key, **kwargs) original_course = self.source_modulestore.get_course(source_course_key, **kwargs)
if original_course is None:
raise ItemNotFoundError(unicode(source_course_key))
if new_org is None: if new_org is None:
new_org = source_course_key.org new_org = source_course_key.org
......
...@@ -7,89 +7,89 @@ metadata: ...@@ -7,89 +7,89 @@ metadata:
% key new feature is the \edXabox{} macro, which specifies an "Answer % key new feature is the \edXabox{} macro, which specifies an "Answer
% Box" that queries students for a response, and specifies what the % Box" that queries students for a response, and specifies what the
% epxected (correct) answer is. % epxected (correct) answer is.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Example "option" problem} \subsection{Example "option" problem}
Where is the earth? Where is the earth?
\edXabox{options='up','down' expect='down'} \edXabox{options='up','down' expect='down'}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Example "symbolic" problem} \subsection{Example "symbolic" problem}
What is Einstein's equation for the energy equivalent of a mass $m$? What is Einstein's equation for the energy equivalent of a mass $m$?
\edXabox{type='symbolic' size='90' expect='m*c^2' } \edXabox{type='symbolic' size='90' expect='m*c^2' }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Example "numerical" problem} \subsection{Example "numerical" problem}
Estimate the energy savings (in J/y) if all the people Estimate the energy savings (in J/y) if all the people
($3\times 10^8$) in the U.~S. switched from U.~S. code to low flow ($3\times 10^8$) in the U.~S. switched from U.~S. code to low flow
shower heads. shower heads.
\edXinline{Energy saved = }\edXabox{expect="0.52" type="numerical" tolerance='0.02' inline='1' } % \edXinline{Energy saved = }\edXabox{expect="0.52" type="numerical" tolerance='0.02' inline='1' } %
\edXinline{~EJ/year} \edXinline{~EJ/year}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Example "multiple choice" problem} \subsection{Example "multiple choice" problem}
What color is a banana? What color is a banana?
\edXabox{ type="multichoice" expect="Yellow" options="Red","Green","Yellow","Blue" } \edXabox{ type="multichoice" expect="Yellow" options="Red","Green","Yellow","Blue" }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Example "string response" problem} \subsection{Example "string response" problem}
In what U.S. state is Detroit located? In what U.S. state is Detroit located?
\edXabox{ type="string" expect="Michigan" options="ci" } \edXabox{ type="string" expect="Michigan" options="ci" }
An explanation of the answer can be provided by using the edXsolution An explanation of the answer can be provided by using the edXsolution
macro. Click on "Show Answer" to see the solution. macro. Click on "Show Answer" to see the solution.
\begin{edXsolution} \begin{edXsolution}
Detroit is near Canada, but it is actually in the United States. Detroit is near Canada, but it is actually in the United States.
\end{edXsolution} \end{edXsolution}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Example "custom response" problem} \subsection{Example "custom response" problem}
This problem demonstrates the use of a custom python script used for This problem demonstrates the use of a custom python script used for
checking the answer. checking the answer.
\begin{edXscript} \begin{edXscript}
def sumtest(expect,ans): def sumtest(expect,ans):
(a1,a2) = map(float,eval(ans)) (a1,a2) = map(float,eval(ans))
return (a1+a2)==10 return (a1+a2)==10
\end{edXscript} \end{edXscript}
Enter a python list of two numbers which sum to 10, eg [9,1]: Enter a python list of two numbers which sum to 10, eg [9,1]:
\edXabox{expect="[1,9]" type="custom" cfn="sumtest"} \edXabox{expect="[1,9]" type="custom" cfn="sumtest"}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Example image} \subsection{Example image}
Include image by using the edXxml macro: Include image by using the edXxml macro:
\edXxml{<img src="http://autoid.mit.edu/images/mit_dome.jpg"/>} \edXxml{<img src="https://courses.edx.org/static/images/mit_dome.jpg"/>}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Example show/hide explanation} \subsection{Example show/hide explanation}
Extra explanations can be tucked away behind a "showhide" toggle flag: Extra explanations can be tucked away behind a "showhide" toggle flag:
\edXshowhide{sh1}{More explanation}{This is a hidden explanation. It \edXshowhide{sh1}{More explanation}{This is a hidden explanation. It
can contain equations: $\alpha = \frac{2}{\sqrt{1+\gamma}}$ } can contain equations: $\alpha = \frac{2}{\sqrt{1+\gamma}}$ }
This is some text after the showhide example. This is some text after the showhide example.
markdown: !!null markdown: !!null
data: | data: |
<?xml version="1.0"?> <?xml version="1.0"?>
<problem> <problem showanswer="closed" rerandomize="never" weight="10" display_name="lec1_Q2">
<text> <text>
<p> <p>
<h4>Example "option" problem</h4> <h4>Example "option" problem</h4>
...@@ -98,7 +98,7 @@ data: | ...@@ -98,7 +98,7 @@ data: |
Where is the earth? </p> Where is the earth? </p>
<p> <p>
<optionresponse> <optionresponse>
<optioninput options="('up','down')" correct="down" label="Where is the earth?"/> <optioninput options="('up','down')" correct="down"/>
</optionresponse> </optionresponse>
</p> </p>
<p> <p>
...@@ -108,7 +108,7 @@ data: | ...@@ -108,7 +108,7 @@ data: |
What is Einstein's equation for the energy equivalent of a mass [mathjaxinline]m[/mathjaxinline]? </p> What is Einstein's equation for the energy equivalent of a mass [mathjaxinline]m[/mathjaxinline]? </p>
<p> <p>
<symbolicresponse expect="m*c^2"> <symbolicresponse expect="m*c^2">
<textline size="90" correct_answer="m*c^2" math="1" label="Enter Einstein's equation"/> <textline size="90" correct_answer="m*c^2" math="1"/>
</symbolicresponse> </symbolicresponse>
</p> </p>
<p> <p>
...@@ -119,8 +119,9 @@ data: | ...@@ -119,8 +119,9 @@ data: |
<p> <p>
<p style="display:inline">Energy saved = </p> <p style="display:inline">Energy saved = </p>
<numericalresponse inline="1" answer="0.52"> <numericalresponse inline="1" answer="0.52">
<responseparam description="Numerical Tolerance" type="tolerance" default="0.02" name="tol"/> <textline inline="1">
<formulaequationinput label="Enter the equation"/> <responseparam type="tolerance" default="0.02"/>
</textline>
</numericalresponse> </numericalresponse>
<p style="display:inline">&#xA0;EJ/year</p> <p style="display:inline">&#xA0;EJ/year</p>
</p> </p>
...@@ -130,22 +131,22 @@ data: | ...@@ -130,22 +131,22 @@ data: |
<p> <p>
What color is a banana? </p> What color is a banana? </p>
<p> <p>
<choiceresponse> <multiplechoiceresponse>
<checkboxgroup label="What color is a banana?"> <choicegroup direction="vertical">
<choice correct="false" name="1"> <choice correct="false" name="1">
<text>Red</text> <text> Red</text>
</choice> </choice>
<choice correct="false" name="2"> <choice correct="false" name="2">
<text>Green</text> <text> Green</text>
</choice> </choice>
<choice correct="true" name="3"> <choice correct="true" name="3">
<text>Yellow</text> <text> Yellow</text>
</choice> </choice>
<choice correct="false" name="4"> <choice correct="false" name="4">
<text>Blue</text> <text> Blue</text>
</choice> </choice>
</checkboxgroup> </choicegroup>
</choiceresponse> </multiplechoiceresponse>
</p> </p>
<p> <p>
<h4>Example "string response" problem</h4> <h4>Example "string response" problem</h4>
...@@ -154,11 +155,11 @@ data: | ...@@ -154,11 +155,11 @@ data: |
In what U.S. state is Detroit located? </p> In what U.S. state is Detroit located? </p>
<p> <p>
<stringresponse answer="Michigan"> <stringresponse answer="Michigan">
<textline label="What state contains Michigan?"/> <textline/>
</stringresponse> </stringresponse>
</p> </p>
<p> <p>
An explanation of the answer can be provided by using the edXsolution macro: </p> An explanation of the answer can be provided by using the edXsolution macro. Click on "Show Answer" to see the solution. </p>
<p> <p>
<solution> <solution>
<font color="blue">Answer: </font> <font color="blue">Answer: </font>
...@@ -179,7 +180,7 @@ data: | ...@@ -179,7 +180,7 @@ data: |
Enter a python list of two numbers which sum to 10, eg [9,1]: </p> Enter a python list of two numbers which sum to 10, eg [9,1]: </p>
<p> <p>
<customresponse cfn="sumtest" expect="[1,9]"> <customresponse cfn="sumtest" expect="[1,9]">
<textline correct_answer="[1,9]" label="Enter the python list"/> <textline correct_answer="[1,9]"/>
</customresponse> </customresponse>
</p> </p>
<p> <p>
...@@ -188,7 +189,7 @@ data: | ...@@ -188,7 +189,7 @@ data: |
<p> <p>
Include image by using the edXxml macro: </p> Include image by using the edXxml macro: </p>
<p> <p>
<img src="/static/images/mit_dome.jpg"/> <img src="https://courses.edx.org/static/images/mit_dome.jpg"/>
</p> </p>
<p> <p>
<h4>Example show/hide explanation</h4> <h4>Example show/hide explanation</h4>
......
...@@ -47,3 +47,8 @@ div.mce-tinymce.mce-container.mce-panel { ...@@ -47,3 +47,8 @@ div.mce-tinymce.mce-container.mce-panel {
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QkBBB07nraNoQAAAhZJREFUKM+NkstrE1EUxr+5c08ykztpJtVoazHBF8FgQQzonyBKEZS6FrQKLl0EXBRT0ZULJSs3oii4TyHgu90IlTaL6qouWlv7Ck1N0BSnmZk714WbPHz07M4534+Pw3eAHdTY8A9+Nd9/bshU1DpnO4HXjh2ZY2J9/OSTxHTrnP8PvJYf+BDQ6qEDaQBB43jrTusUFy4oPjsYWYzF+VS91nxLYfdhKgONaQT3W/KMxr1XY5e+qj86f8zsKYYsZ6AvjWFzA8ORHkAnwN8So7evzL/8pzMAXL/Hq8mMv1up371T7Z+/c3n9cKeuDS6Xy6dN07zLuZ56Onk2Ed2/ANJsnE/PQMpgyffle+kYzwazB1+3waVS6X48Hr9BRPB9H57nYXplFKeSt8D1Hriug9XKF0x+Lmw+ys8m2m42DOOn4zhQSsGyLOi6jqONm9isbmFVFlDbaGKx8QaB1rvdlbNhGLAsC0IIGIYBIQSy2ROQ0oOp7wOPraHXEugRvDtnzjmi0SiICEIIEBGklAB9B6cmbG0AUnrY5m73h+m6DsYYTNMEYwxEBMY0hGNVhHkcZigBO9qHlDHS7cwYg23bAIBQKAQigud7IH0XwtxDoHwEIQ9SLKx0wa7rPiaivYyxESklXNeFBg0mjyNQTQSuATMSm6ipuYt//eVcLhdeXl5+UKlUlur1upqamVAv3j3/VCyOD3VqfwF6uLp3q+vMcgAAAABJRU5ErkJggg=='); background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QkBBB07nraNoQAAAhZJREFUKM+NkstrE1EUxr+5c08ykztpJtVoazHBF8FgQQzonyBKEZS6FrQKLl0EXBRT0ZULJSs3oii4TyHgu90IlTaL6qouWlv7Ck1N0BSnmZk714WbPHz07M4534+Pw3eAHdTY8A9+Nd9/bshU1DpnO4HXjh2ZY2J9/OSTxHTrnP8PvJYf+BDQ6qEDaQBB43jrTusUFy4oPjsYWYzF+VS91nxLYfdhKgONaQT3W/KMxr1XY5e+qj86f8zsKYYsZ6AvjWFzA8ORHkAnwN8So7evzL/8pzMAXL/Hq8mMv1up371T7Z+/c3n9cKeuDS6Xy6dN07zLuZ56Onk2Ed2/ANJsnE/PQMpgyffle+kYzwazB1+3waVS6X48Hr9BRPB9H57nYXplFKeSt8D1Hriug9XKF0x+Lmw+ys8m2m42DOOn4zhQSsGyLOi6jqONm9isbmFVFlDbaGKx8QaB1rvdlbNhGLAsC0IIGIYBIQSy2ROQ0oOp7wOPraHXEugRvDtnzjmi0SiICEIIEBGklAB9B6cmbG0AUnrY5m73h+m6DsYYTNMEYwxEBMY0hGNVhHkcZigBO9qHlDHS7cwYg23bAIBQKAQigud7IH0XwtxDoHwEIQ9SLKx0wa7rPiaivYyxESklXNeFBg0mjyNQTQSuATMSm6ipuYt//eVcLhdeXl5+UKlUlur1upqamVAv3j3/VCyOD3VqfwF6uLp3q+vMcgAAAABJRU5ErkJggg==');
background-repeat: no-repeat; background-repeat: no-repeat;
} }
/* Fixes conflicting design between tinymce css and annotator css */
.mce-ico.mce-i-resize {
font-family: 'tinymce';
}
...@@ -187,7 +187,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ...@@ -187,7 +187,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
} }
// if the colored highlights by tags plugin it is notified to colorize // if the colored highlights by tags plugin it is notified to colorize
annotator.publish('colorizeHighlight', [an]); annotator.publish('externalCallToHighlightTags', [an]);
}, },
/** /**
...@@ -231,7 +231,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ...@@ -231,7 +231,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
var span = document.createElement('span'); var span = document.createElement('span');
var rectPosition = an.rangePosition; var rectPosition = an.rangePosition;
span.className = "annotator-hl"; span.className = "annotator-hl";
span.style.border = '2px solid rgba(0,0,0,0.5)';
// outline and border below create a double line one black and one white
// so to be able to differentiate when selecting dark or light images
span.style.border = '2px solid rgb(255, 255, 255)';
span.style.outline = '2px solid rgb(0, 0, 0)';
span.style.background = 'rgba(0,0,0,0)'; span.style.background = 'rgba(0,0,0,0)';
// Adds listening items for the viewer and editor // Adds listening items for the viewer and editor
...@@ -305,7 +309,12 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ...@@ -305,7 +309,12 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
viewer.innerTracker.setTracking(false); viewer.innerTracker.setTracking(false);
this.rect = document.createElement('div'); this.rect = document.createElement('div');
this.rect.style.background = 'rgba(0,0,0,0)'; this.rect.style.background = 'rgba(0,0,0,0)';
this.rect.style.border = '2px solid rgba(0,0,0,0.5)';
// outline and border below create a double line one black and one white
// so to be able to differentiate when selecting dark or light images
this.rect.style.border = '2px solid rgb(255, 255, 255)';
this.rect.style.outline = '2px solid rgb(0, 0, 0)';
this.rect.style.position = 'absolute'; this.rect.style.position = 'absolute';
this.rect.className = 'DrawingRect'; this.rect.className = 'DrawingRect';
// set the initial position // set the initial position
...@@ -1026,6 +1035,10 @@ OpenSeadragonAnnotation = function (element, options) { ...@@ -1026,6 +1035,10 @@ OpenSeadragonAnnotation = function (element, options) {
function reloadEditor(){ function reloadEditor(){
tinymce.EditorManager.execCommand('mceRemoveEditor',true, "annotator-field-0"); tinymce.EditorManager.execCommand('mceRemoveEditor',true, "annotator-field-0");
tinymce.EditorManager.execCommand('mceAddEditor',true, "annotator-field-0"); tinymce.EditorManager.execCommand('mceAddEditor',true, "annotator-field-0");
// if person hits into/out of fullscreen before closing the editor should close itself
// ideally we would want to keep it open and reposition, this would make a great TODO in the future
annotator.editor.hide();
} }
var self = this; var self = this;
...@@ -1044,6 +1057,14 @@ OpenSeadragonAnnotation = function (element, options) { ...@@ -1044,6 +1057,14 @@ OpenSeadragonAnnotation = function (element, options) {
document.addEventListener("msfullscreenchange", function () { document.addEventListener("msfullscreenchange", function () {
reloadEditor(); reloadEditor();
}, false); }, false);
// for some reason the above doesn't work when person hits ESC to exit full screen...
$(document).keyup(function(e) {
// esc key reloads editor as well
if (e.keyCode == 27) {
reloadEditor();
}
});
this.options = options; this.options = options;
......
...@@ -504,6 +504,13 @@ CatchAnnotation.prototype = { ...@@ -504,6 +504,13 @@ CatchAnnotation.prototype = {
// Search Button // Search Button
el.on("click", ".searchbox .search-icon", onSearchButtonClick); el.on("click", ".searchbox .search-icon", onSearchButtonClick);
// Search should also run when user hits ENTER
$('input[name=search]').keyup(function(e) {
// ENTER == 13
if(e.which == 13) {
onSearchButtonClick();
}
});
// Clear Search Button // Clear Search Button
el.on("click", ".searchbox .clear-search-icon", onClearSearchButtonClick); el.on("click", ".searchbox .clear-search-icon", onClearSearchButtonClick);
...@@ -1001,6 +1008,9 @@ CatchAnnotation.prototype = { ...@@ -1001,6 +1008,9 @@ CatchAnnotation.prototype = {
var positionAnnotator = videojs.findPosition(wrapper[0]); var positionAnnotator = videojs.findPosition(wrapper[0]);
var positionAdder = {}; var positionAdder = {};
// the following addition to display makes sure the editor shows up
// after opening TinyMCE/editor within the image source
positionAdder.display = "block";
positionAdder.left = positionLeft.left - positionAnnotator.left; positionAdder.left = positionLeft.left - positionAnnotator.left;
positionAdder.top = positionLeft.top + 20 - positionAnnotator.top; positionAdder.top = positionLeft.top + 20 - positionAnnotator.top;
...@@ -1010,9 +1020,9 @@ CatchAnnotation.prototype = { ...@@ -1010,9 +1020,9 @@ CatchAnnotation.prototype = {
this.annotator.onAdderClick(); this.annotator.onAdderClick();
// Set vertical editor // Set vertical editor
$(this.annotator.editor.element).css(positionAdder);
this.annotator.editor.resetOrientation(); this.annotator.editor.resetOrientation();
this.annotator.editor.invertY(); this.annotator.editor.invertY();
this.annotator.editor.element.find('.annotator-widget').css('min-width', replyElem.css('width'));
// set parent // set parent
var parentValue = $(this.annotator.editor.element).find(".reply-item span.parent-annotation"); var parentValue = $(this.annotator.editor.element).find(".reply-item span.parent-annotation");
......
...@@ -64,14 +64,24 @@ Annotator.Plugin.Reply = (function(_super) { ...@@ -64,14 +64,24 @@ Annotator.Plugin.Reply = (function(_super) {
// New JSON for the database // New JSON for the database
Reply.prototype.pluginSubmit = function(field, annotation) { Reply.prototype.pluginSubmit = function(field, annotation) {
var replyItem = $(this.annotator.editor.element).find(".reply-item span.parent-annotation"), // since each annotation has their own reply item, this "find" is element specific
parent = replyItem.html()!=''?replyItem.html():'0'; var replyItem = $(this.annotator.editor.element).find(".reply-item span.parent-annotation");
console.log(parent); // checks to see if the current annotation is a reply by checking parent numbers
console.log(replyItem.html()); var parent = replyItem.html() !== '' ? replyItem.html() : '0';
if (parent!='0') annotation.media = 'comment'; // if the parent number is not empty or zero, we know that this is a comment
annotation.parent = parent;//set 0, because it is not a reply if (parent !== '0') {
console.log(annotation.parent); annotation.media = 'comment';
return annotation.parent; }
// apparently some browsers continue adding <font> tags here for nonreplies
// this will check and set to 0 (nonreply) if it fails
if (parseInt(parent, 10) === NaN){
parent = '0';
}
// set 0, because it is not a reply
annotation.parent = parent;
return annotation.parent;
}; };
......
...@@ -93,6 +93,17 @@ Annotator.Plugin.RichText = (function(_super) { ...@@ -93,6 +93,17 @@ Annotator.Plugin.RichText = (function(_super) {
// set the modification in the textarea of annotator // set the modification in the textarea of annotator
$(editor.element).find('textarea')[0].value = tinymce.activeEditor.getContent(); $(editor.element).find('textarea')[0].value = tinymce.activeEditor.getContent();
}); });
// creates a function called whenever editor is resized
ed.on('init', function(mceInstance) {
// get win means this event activates when window is resized
tinymce.dom.Event.bind(ed.getWin(), 'resize', function(e){
// mceInstance.target gets the editor, its id is used to retrieved iframe
$("#"+mceInstance.target.id+"_ifr").css('min-width', '400px');
});
});
// new button to add Rubrics of the url https://gteavirtual.org/rubric // new button to add Rubrics of the url https://gteavirtual.org/rubric
ed.addButton('rubric', { ed.addButton('rubric', {
icon: 'rubric', icon: 'rubric',
......
...@@ -26,7 +26,7 @@ msgid "" ...@@ -26,7 +26,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: edx-platform\n" "Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
"POT-Creation-Date: 2014-10-14 11:52-0400\n" "POT-Creation-Date: 2014-10-20 10:15-0400\n"
"PO-Revision-Date: 2014-10-08 18:08+0000\n" "PO-Revision-Date: 2014-10-08 18:08+0000\n"
"Last-Translator: Sarina Canelake <sarina@edx.org>\n" "Last-Translator: Sarina Canelake <sarina@edx.org>\n"
"Language-Team: Amharic (http://www.transifex.com/projects/p/edx-platform/language/am/)\n" "Language-Team: Amharic (http://www.transifex.com/projects/p/edx-platform/language/am/)\n"
...@@ -2967,6 +2967,20 @@ msgstr "" ...@@ -2967,6 +2967,20 @@ msgstr ""
msgid "Your donation could not be submitted." msgid "Your donation could not be submitted."
msgstr "" msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid "An error occurred. Please try again later."
msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid "Please verify your new email address"
msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid ""
"You'll receive a confirmation in your inbox. Please follow the link in the "
"email to confirm your email address change."
msgstr ""
#: lms/static/js/student_account/account.js #: lms/static/js/student_account/account.js
#: lms/static/js/student_profile/profile.js #: lms/static/js/student_profile/profile.js
msgid "The data could not be saved." msgid "The data could not be saved."
...@@ -3728,6 +3742,12 @@ msgid "Enter Your New Cohort Group's Name" ...@@ -3728,6 +3742,12 @@ msgid "Enter Your New Cohort Group's Name"
msgstr "" msgstr ""
#: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore #: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore
msgid "(contains %(student_count)s student)"
msgid_plural "(contains %(student_count)s students)"
msgstr[0] ""
msgstr[1] ""
#: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore
msgid "" msgid ""
"Students are added to this group only when you provide their email addresses" "Students are added to this group only when you provide their email addresses"
" or usernames on this page." " or usernames on this page."
......
...@@ -67,7 +67,7 @@ msgid "" ...@@ -67,7 +67,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: edx-platform\n" "Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
"POT-Creation-Date: 2014-10-14 11:52-0400\n" "POT-Creation-Date: 2014-10-20 10:15-0400\n"
"PO-Revision-Date: 2014-10-13 16:51+0000\n" "PO-Revision-Date: 2014-10-13 16:51+0000\n"
"Last-Translator: Nabeel El-Dughailib <nabeel@qordoba.com>\n" "Last-Translator: Nabeel El-Dughailib <nabeel@qordoba.com>\n"
"Language-Team: Arabic (http://www.transifex.com/projects/p/edx-platform/language/ar/)\n" "Language-Team: Arabic (http://www.transifex.com/projects/p/edx-platform/language/ar/)\n"
...@@ -3225,6 +3225,20 @@ msgstr "يرجى إدخال مبلغ تبرّع صالح." ...@@ -3225,6 +3225,20 @@ msgstr "يرجى إدخال مبلغ تبرّع صالح."
msgid "Your donation could not be submitted." msgid "Your donation could not be submitted."
msgstr "لقد تعذّر تقديم تبرعك." msgstr "لقد تعذّر تقديم تبرعك."
#: lms/static/js/dashboard/legacy.js
msgid "An error occurred. Please try again later."
msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid "Please verify your new email address"
msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid ""
"You'll receive a confirmation in your inbox. Please follow the link in the "
"email to confirm your email address change."
msgstr ""
#: lms/static/js/student_account/account.js #: lms/static/js/student_account/account.js
#: lms/static/js/student_profile/profile.js #: lms/static/js/student_profile/profile.js
msgid "The data could not be saved." msgid "The data could not be saved."
...@@ -4071,6 +4085,16 @@ msgid "Enter Your New Cohort Group's Name" ...@@ -4071,6 +4085,16 @@ msgid "Enter Your New Cohort Group's Name"
msgstr "أدخِل اسم مجموعتك الجديدة" msgstr "أدخِل اسم مجموعتك الجديدة"
#: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore #: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore
msgid "(contains %(student_count)s student)"
msgid_plural "(contains %(student_count)s students)"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
#: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore
msgid "" msgid ""
"Students are added to this group only when you provide their email addresses" "Students are added to this group only when you provide their email addresses"
" or usernames on this page." " or usernames on this page."
......
...@@ -26,7 +26,7 @@ msgid "" ...@@ -26,7 +26,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: edx-platform\n" "Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
"POT-Creation-Date: 2014-10-14 11:52-0400\n" "POT-Creation-Date: 2014-10-20 10:15-0400\n"
"PO-Revision-Date: 2014-10-08 18:08+0000\n" "PO-Revision-Date: 2014-10-08 18:08+0000\n"
"Last-Translator: Sarina Canelake <sarina@edx.org>\n" "Last-Translator: Sarina Canelake <sarina@edx.org>\n"
"Language-Team: Azerbaijani (http://www.transifex.com/projects/p/edx-platform/language/az/)\n" "Language-Team: Azerbaijani (http://www.transifex.com/projects/p/edx-platform/language/az/)\n"
...@@ -2967,6 +2967,20 @@ msgstr "" ...@@ -2967,6 +2967,20 @@ msgstr ""
msgid "Your donation could not be submitted." msgid "Your donation could not be submitted."
msgstr "" msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid "An error occurred. Please try again later."
msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid "Please verify your new email address"
msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid ""
"You'll receive a confirmation in your inbox. Please follow the link in the "
"email to confirm your email address change."
msgstr ""
#: lms/static/js/student_account/account.js #: lms/static/js/student_account/account.js
#: lms/static/js/student_profile/profile.js #: lms/static/js/student_profile/profile.js
msgid "The data could not be saved." msgid "The data could not be saved."
...@@ -3728,6 +3742,12 @@ msgid "Enter Your New Cohort Group's Name" ...@@ -3728,6 +3742,12 @@ msgid "Enter Your New Cohort Group's Name"
msgstr "" msgstr ""
#: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore #: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore
msgid "(contains %(student_count)s student)"
msgid_plural "(contains %(student_count)s students)"
msgstr[0] ""
msgstr[1] ""
#: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore
msgid "" msgid ""
"Students are added to this group only when you provide their email addresses" "Students are added to this group only when you provide their email addresses"
" or usernames on this page." " or usernames on this page."
......
...@@ -26,7 +26,7 @@ msgid "" ...@@ -26,7 +26,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: edx-platform\n" "Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
"POT-Creation-Date: 2014-10-14 11:52-0400\n" "POT-Creation-Date: 2014-10-20 10:15-0400\n"
"PO-Revision-Date: 2014-10-08 18:08+0000\n" "PO-Revision-Date: 2014-10-08 18:08+0000\n"
"Last-Translator: Sarina Canelake <sarina@edx.org>\n" "Last-Translator: Sarina Canelake <sarina@edx.org>\n"
"Language-Team: Bulgarian (Bulgaria) (http://www.transifex.com/projects/p/edx-platform/language/bg_BG/)\n" "Language-Team: Bulgarian (Bulgaria) (http://www.transifex.com/projects/p/edx-platform/language/bg_BG/)\n"
...@@ -2967,6 +2967,20 @@ msgstr "" ...@@ -2967,6 +2967,20 @@ msgstr ""
msgid "Your donation could not be submitted." msgid "Your donation could not be submitted."
msgstr "" msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid "An error occurred. Please try again later."
msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid "Please verify your new email address"
msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid ""
"You'll receive a confirmation in your inbox. Please follow the link in the "
"email to confirm your email address change."
msgstr ""
#: lms/static/js/student_account/account.js #: lms/static/js/student_account/account.js
#: lms/static/js/student_profile/profile.js #: lms/static/js/student_profile/profile.js
msgid "The data could not be saved." msgid "The data could not be saved."
...@@ -3728,6 +3742,12 @@ msgid "Enter Your New Cohort Group's Name" ...@@ -3728,6 +3742,12 @@ msgid "Enter Your New Cohort Group's Name"
msgstr "" msgstr ""
#: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore #: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore
msgid "(contains %(student_count)s student)"
msgid_plural "(contains %(student_count)s students)"
msgstr[0] ""
msgstr[1] ""
#: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore
msgid "" msgid ""
"Students are added to this group only when you provide their email addresses" "Students are added to this group only when you provide their email addresses"
" or usernames on this page." " or usernames on this page."
......
...@@ -27,7 +27,7 @@ msgid "" ...@@ -27,7 +27,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: edx-platform\n" "Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
"POT-Creation-Date: 2014-10-14 11:52-0400\n" "POT-Creation-Date: 2014-10-20 10:15-0400\n"
"PO-Revision-Date: 2014-10-08 18:08+0000\n" "PO-Revision-Date: 2014-10-08 18:08+0000\n"
"Last-Translator: Sarina Canelake <sarina@edx.org>\n" "Last-Translator: Sarina Canelake <sarina@edx.org>\n"
"Language-Team: Bengali (Bangladesh) (http://www.transifex.com/projects/p/edx-platform/language/bn_BD/)\n" "Language-Team: Bengali (Bangladesh) (http://www.transifex.com/projects/p/edx-platform/language/bn_BD/)\n"
...@@ -2968,6 +2968,20 @@ msgstr "" ...@@ -2968,6 +2968,20 @@ msgstr ""
msgid "Your donation could not be submitted." msgid "Your donation could not be submitted."
msgstr "" msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid "An error occurred. Please try again later."
msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid "Please verify your new email address"
msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid ""
"You'll receive a confirmation in your inbox. Please follow the link in the "
"email to confirm your email address change."
msgstr ""
#: lms/static/js/student_account/account.js #: lms/static/js/student_account/account.js
#: lms/static/js/student_profile/profile.js #: lms/static/js/student_profile/profile.js
msgid "The data could not be saved." msgid "The data could not be saved."
...@@ -3729,6 +3743,12 @@ msgid "Enter Your New Cohort Group's Name" ...@@ -3729,6 +3743,12 @@ msgid "Enter Your New Cohort Group's Name"
msgstr "" msgstr ""
#: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore #: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore
msgid "(contains %(student_count)s student)"
msgid_plural "(contains %(student_count)s students)"
msgstr[0] ""
msgstr[1] ""
#: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore
msgid "" msgid ""
"Students are added to this group only when you provide their email addresses" "Students are added to this group only when you provide their email addresses"
" or usernames on this page." " or usernames on this page."
......
...@@ -26,7 +26,7 @@ msgid "" ...@@ -26,7 +26,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: edx-platform\n" "Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
"POT-Creation-Date: 2014-10-14 11:52-0400\n" "POT-Creation-Date: 2014-10-20 10:15-0400\n"
"PO-Revision-Date: 2014-10-08 18:08+0000\n" "PO-Revision-Date: 2014-10-08 18:08+0000\n"
"Last-Translator: Sarina Canelake <sarina@edx.org>\n" "Last-Translator: Sarina Canelake <sarina@edx.org>\n"
"Language-Team: Bengali (India) (http://www.transifex.com/projects/p/edx-platform/language/bn_IN/)\n" "Language-Team: Bengali (India) (http://www.transifex.com/projects/p/edx-platform/language/bn_IN/)\n"
...@@ -2967,6 +2967,20 @@ msgstr "" ...@@ -2967,6 +2967,20 @@ msgstr ""
msgid "Your donation could not be submitted." msgid "Your donation could not be submitted."
msgstr "" msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid "An error occurred. Please try again later."
msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid "Please verify your new email address"
msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid ""
"You'll receive a confirmation in your inbox. Please follow the link in the "
"email to confirm your email address change."
msgstr ""
#: lms/static/js/student_account/account.js #: lms/static/js/student_account/account.js
#: lms/static/js/student_profile/profile.js #: lms/static/js/student_profile/profile.js
msgid "The data could not be saved." msgid "The data could not be saved."
...@@ -3728,6 +3742,12 @@ msgid "Enter Your New Cohort Group's Name" ...@@ -3728,6 +3742,12 @@ msgid "Enter Your New Cohort Group's Name"
msgstr "" msgstr ""
#: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore #: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore
msgid "(contains %(student_count)s student)"
msgid_plural "(contains %(student_count)s students)"
msgstr[0] ""
msgstr[1] ""
#: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore
msgid "" msgid ""
"Students are added to this group only when you provide their email addresses" "Students are added to this group only when you provide their email addresses"
" or usernames on this page." " or usernames on this page."
......
...@@ -28,7 +28,7 @@ msgid "" ...@@ -28,7 +28,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: edx-platform\n" "Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
"POT-Creation-Date: 2014-10-14 11:52-0400\n" "POT-Creation-Date: 2014-10-20 10:15-0400\n"
"PO-Revision-Date: 2014-10-08 18:08+0000\n" "PO-Revision-Date: 2014-10-08 18:08+0000\n"
"Last-Translator: Sarina Canelake <sarina@edx.org>\n" "Last-Translator: Sarina Canelake <sarina@edx.org>\n"
"Language-Team: Bosnian (http://www.transifex.com/projects/p/edx-platform/language/bs/)\n" "Language-Team: Bosnian (http://www.transifex.com/projects/p/edx-platform/language/bs/)\n"
...@@ -2989,6 +2989,20 @@ msgstr "" ...@@ -2989,6 +2989,20 @@ msgstr ""
msgid "Your donation could not be submitted." msgid "Your donation could not be submitted."
msgstr "" msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid "An error occurred. Please try again later."
msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid "Please verify your new email address"
msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid ""
"You'll receive a confirmation in your inbox. Please follow the link in the "
"email to confirm your email address change."
msgstr ""
#: lms/static/js/student_account/account.js #: lms/static/js/student_account/account.js
#: lms/static/js/student_profile/profile.js #: lms/static/js/student_profile/profile.js
msgid "The data could not be saved." msgid "The data could not be saved."
...@@ -3759,6 +3773,13 @@ msgid "Enter Your New Cohort Group's Name" ...@@ -3759,6 +3773,13 @@ msgid "Enter Your New Cohort Group's Name"
msgstr "" msgstr ""
#: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore #: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore
msgid "(contains %(student_count)s student)"
msgid_plural "(contains %(student_count)s students)"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore
msgid "" msgid ""
"Students are added to this group only when you provide their email addresses" "Students are added to this group only when you provide their email addresses"
" or usernames on this page." " or usernames on this page."
......
...@@ -31,7 +31,7 @@ msgid "" ...@@ -31,7 +31,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: edx-platform\n" "Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
"POT-Creation-Date: 2014-10-14 11:52-0400\n" "POT-Creation-Date: 2014-10-20 10:15-0400\n"
"PO-Revision-Date: 2014-10-08 18:08+0000\n" "PO-Revision-Date: 2014-10-08 18:08+0000\n"
"Last-Translator: Sarina Canelake <sarina@edx.org>\n" "Last-Translator: Sarina Canelake <sarina@edx.org>\n"
"Language-Team: Catalan (http://www.transifex.com/projects/p/edx-platform/language/ca/)\n" "Language-Team: Catalan (http://www.transifex.com/projects/p/edx-platform/language/ca/)\n"
...@@ -3051,6 +3051,20 @@ msgstr "" ...@@ -3051,6 +3051,20 @@ msgstr ""
msgid "Your donation could not be submitted." msgid "Your donation could not be submitted."
msgstr "" msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid "An error occurred. Please try again later."
msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid "Please verify your new email address"
msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid ""
"You'll receive a confirmation in your inbox. Please follow the link in the "
"email to confirm your email address change."
msgstr ""
#: lms/static/js/student_account/account.js #: lms/static/js/student_account/account.js
#: lms/static/js/student_profile/profile.js #: lms/static/js/student_profile/profile.js
msgid "The data could not be saved." msgid "The data could not be saved."
...@@ -3839,6 +3853,12 @@ msgid "Enter Your New Cohort Group's Name" ...@@ -3839,6 +3853,12 @@ msgid "Enter Your New Cohort Group's Name"
msgstr "" msgstr ""
#: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore #: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore
msgid "(contains %(student_count)s student)"
msgid_plural "(contains %(student_count)s students)"
msgstr[0] ""
msgstr[1] ""
#: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore
msgid "" msgid ""
"Students are added to this group only when you provide their email addresses" "Students are added to this group only when you provide their email addresses"
" or usernames on this page." " or usernames on this page."
......
...@@ -27,7 +27,7 @@ msgid "" ...@@ -27,7 +27,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: edx-platform\n" "Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
"POT-Creation-Date: 2014-10-14 11:52-0400\n" "POT-Creation-Date: 2014-10-20 10:15-0400\n"
"PO-Revision-Date: 2014-10-08 18:08+0000\n" "PO-Revision-Date: 2014-10-08 18:08+0000\n"
"Last-Translator: Sarina Canelake <sarina@edx.org>\n" "Last-Translator: Sarina Canelake <sarina@edx.org>\n"
"Language-Team: Catalan (Valencian) (http://www.transifex.com/projects/p/edx-platform/language/ca@valencia/)\n" "Language-Team: Catalan (Valencian) (http://www.transifex.com/projects/p/edx-platform/language/ca@valencia/)\n"
...@@ -2968,6 +2968,20 @@ msgstr "" ...@@ -2968,6 +2968,20 @@ msgstr ""
msgid "Your donation could not be submitted." msgid "Your donation could not be submitted."
msgstr "" msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid "An error occurred. Please try again later."
msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid "Please verify your new email address"
msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid ""
"You'll receive a confirmation in your inbox. Please follow the link in the "
"email to confirm your email address change."
msgstr ""
#: lms/static/js/student_account/account.js #: lms/static/js/student_account/account.js
#: lms/static/js/student_profile/profile.js #: lms/static/js/student_profile/profile.js
msgid "The data could not be saved." msgid "The data could not be saved."
...@@ -3729,6 +3743,12 @@ msgid "Enter Your New Cohort Group's Name" ...@@ -3729,6 +3743,12 @@ msgid "Enter Your New Cohort Group's Name"
msgstr "" msgstr ""
#: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore #: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore
msgid "(contains %(student_count)s student)"
msgid_plural "(contains %(student_count)s students)"
msgstr[0] ""
msgstr[1] ""
#: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore
msgid "" msgid ""
"Students are added to this group only when you provide their email addresses" "Students are added to this group only when you provide their email addresses"
" or usernames on this page." " or usernames on this page."
......
...@@ -35,7 +35,7 @@ msgid "" ...@@ -35,7 +35,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: edx-platform\n" "Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
"POT-Creation-Date: 2014-10-14 11:52-0400\n" "POT-Creation-Date: 2014-10-20 10:15-0400\n"
"PO-Revision-Date: 2014-10-08 18:08+0000\n" "PO-Revision-Date: 2014-10-08 18:08+0000\n"
"Last-Translator: Sarina Canelake <sarina@edx.org>\n" "Last-Translator: Sarina Canelake <sarina@edx.org>\n"
"Language-Team: Czech (http://www.transifex.com/projects/p/edx-platform/language/cs/)\n" "Language-Team: Czech (http://www.transifex.com/projects/p/edx-platform/language/cs/)\n"
...@@ -2995,6 +2995,20 @@ msgstr "" ...@@ -2995,6 +2995,20 @@ msgstr ""
msgid "Your donation could not be submitted." msgid "Your donation could not be submitted."
msgstr "" msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid "An error occurred. Please try again later."
msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid "Please verify your new email address"
msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid ""
"You'll receive a confirmation in your inbox. Please follow the link in the "
"email to confirm your email address change."
msgstr ""
#: lms/static/js/student_account/account.js #: lms/static/js/student_account/account.js
#: lms/static/js/student_profile/profile.js #: lms/static/js/student_profile/profile.js
msgid "The data could not be saved." msgid "The data could not be saved."
...@@ -3765,6 +3779,13 @@ msgid "Enter Your New Cohort Group's Name" ...@@ -3765,6 +3779,13 @@ msgid "Enter Your New Cohort Group's Name"
msgstr "" msgstr ""
#: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore #: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore
msgid "(contains %(student_count)s student)"
msgid_plural "(contains %(student_count)s students)"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore
msgid "" msgid ""
"Students are added to this group only when you provide their email addresses" "Students are added to this group only when you provide their email addresses"
" or usernames on this page." " or usernames on this page."
......
...@@ -26,7 +26,7 @@ msgid "" ...@@ -26,7 +26,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: edx-platform\n" "Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
"POT-Creation-Date: 2014-10-14 11:52-0400\n" "POT-Creation-Date: 2014-10-20 10:15-0400\n"
"PO-Revision-Date: 2014-10-08 18:08+0000\n" "PO-Revision-Date: 2014-10-08 18:08+0000\n"
"Last-Translator: Sarina Canelake <sarina@edx.org>\n" "Last-Translator: Sarina Canelake <sarina@edx.org>\n"
"Language-Team: Welsh (http://www.transifex.com/projects/p/edx-platform/language/cy/)\n" "Language-Team: Welsh (http://www.transifex.com/projects/p/edx-platform/language/cy/)\n"
...@@ -3007,6 +3007,20 @@ msgstr "" ...@@ -3007,6 +3007,20 @@ msgstr ""
msgid "Your donation could not be submitted." msgid "Your donation could not be submitted."
msgstr "" msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid "An error occurred. Please try again later."
msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid "Please verify your new email address"
msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid ""
"You'll receive a confirmation in your inbox. Please follow the link in the "
"email to confirm your email address change."
msgstr ""
#: lms/static/js/student_account/account.js #: lms/static/js/student_account/account.js
#: lms/static/js/student_profile/profile.js #: lms/static/js/student_profile/profile.js
msgid "The data could not be saved." msgid "The data could not be saved."
...@@ -3786,6 +3800,14 @@ msgid "Enter Your New Cohort Group's Name" ...@@ -3786,6 +3800,14 @@ msgid "Enter Your New Cohort Group's Name"
msgstr "" msgstr ""
#: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore #: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore
msgid "(contains %(student_count)s student)"
msgid_plural "(contains %(student_count)s students)"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
#: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore
msgid "" msgid ""
"Students are added to this group only when you provide their email addresses" "Students are added to this group only when you provide their email addresses"
" or usernames on this page." " or usernames on this page."
......
...@@ -26,7 +26,7 @@ msgid "" ...@@ -26,7 +26,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: edx-platform\n" "Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
"POT-Creation-Date: 2014-10-14 11:52-0400\n" "POT-Creation-Date: 2014-10-20 10:15-0400\n"
"PO-Revision-Date: 2014-10-08 18:08+0000\n" "PO-Revision-Date: 2014-10-08 18:08+0000\n"
"Last-Translator: Sarina Canelake <sarina@edx.org>\n" "Last-Translator: Sarina Canelake <sarina@edx.org>\n"
"Language-Team: Danish (http://www.transifex.com/projects/p/edx-platform/language/da/)\n" "Language-Team: Danish (http://www.transifex.com/projects/p/edx-platform/language/da/)\n"
...@@ -2967,6 +2967,20 @@ msgstr "" ...@@ -2967,6 +2967,20 @@ msgstr ""
msgid "Your donation could not be submitted." msgid "Your donation could not be submitted."
msgstr "" msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid "An error occurred. Please try again later."
msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid "Please verify your new email address"
msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid ""
"You'll receive a confirmation in your inbox. Please follow the link in the "
"email to confirm your email address change."
msgstr ""
#: lms/static/js/student_account/account.js #: lms/static/js/student_account/account.js
#: lms/static/js/student_profile/profile.js #: lms/static/js/student_profile/profile.js
msgid "The data could not be saved." msgid "The data could not be saved."
...@@ -3728,6 +3742,12 @@ msgid "Enter Your New Cohort Group's Name" ...@@ -3728,6 +3742,12 @@ msgid "Enter Your New Cohort Group's Name"
msgstr "" msgstr ""
#: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore #: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore
msgid "(contains %(student_count)s student)"
msgid_plural "(contains %(student_count)s students)"
msgstr[0] ""
msgstr[1] ""
#: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore
msgid "" msgid ""
"Students are added to this group only when you provide their email addresses" "Students are added to this group only when you provide their email addresses"
" or usernames on this page." " or usernames on this page."
......
...@@ -57,7 +57,7 @@ msgid "" ...@@ -57,7 +57,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: edx-platform\n" "Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
"POT-Creation-Date: 2014-10-14 11:52-0400\n" "POT-Creation-Date: 2014-10-20 10:15-0400\n"
"PO-Revision-Date: 2014-10-08 18:08+0000\n" "PO-Revision-Date: 2014-10-08 18:08+0000\n"
"Last-Translator: Sarina Canelake <sarina@edx.org>\n" "Last-Translator: Sarina Canelake <sarina@edx.org>\n"
"Language-Team: German (Germany) (http://www.transifex.com/projects/p/edx-platform/language/de_DE/)\n" "Language-Team: German (Germany) (http://www.transifex.com/projects/p/edx-platform/language/de_DE/)\n"
...@@ -3083,6 +3083,20 @@ msgstr "" ...@@ -3083,6 +3083,20 @@ msgstr ""
msgid "Your donation could not be submitted." msgid "Your donation could not be submitted."
msgstr "" msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid "An error occurred. Please try again later."
msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid "Please verify your new email address"
msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid ""
"You'll receive a confirmation in your inbox. Please follow the link in the "
"email to confirm your email address change."
msgstr ""
#: lms/static/js/student_account/account.js #: lms/static/js/student_account/account.js
#: lms/static/js/student_profile/profile.js #: lms/static/js/student_profile/profile.js
msgid "The data could not be saved." msgid "The data could not be saved."
...@@ -3843,6 +3857,12 @@ msgid "Enter Your New Cohort Group's Name" ...@@ -3843,6 +3857,12 @@ msgid "Enter Your New Cohort Group's Name"
msgstr "" msgstr ""
#: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore #: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore
msgid "(contains %(student_count)s student)"
msgid_plural "(contains %(student_count)s students)"
msgstr[0] ""
msgstr[1] ""
#: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore
msgid "" msgid ""
"Students are added to this group only when you provide their email addresses" "Students are added to this group only when you provide their email addresses"
" or usernames on this page." " or usernames on this page."
......
...@@ -36,7 +36,7 @@ msgid "" ...@@ -36,7 +36,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: edx-platform\n" "Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
"POT-Creation-Date: 2014-10-14 11:52-0400\n" "POT-Creation-Date: 2014-10-20 10:15-0400\n"
"PO-Revision-Date: 2014-10-08 18:08+0000\n" "PO-Revision-Date: 2014-10-08 18:08+0000\n"
"Last-Translator: Sarina Canelake <sarina@edx.org>\n" "Last-Translator: Sarina Canelake <sarina@edx.org>\n"
"Language-Team: Greek (http://www.transifex.com/projects/p/edx-platform/language/el/)\n" "Language-Team: Greek (http://www.transifex.com/projects/p/edx-platform/language/el/)\n"
...@@ -2977,6 +2977,20 @@ msgstr "" ...@@ -2977,6 +2977,20 @@ msgstr ""
msgid "Your donation could not be submitted." msgid "Your donation could not be submitted."
msgstr "" msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid "An error occurred. Please try again later."
msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid "Please verify your new email address"
msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid ""
"You'll receive a confirmation in your inbox. Please follow the link in the "
"email to confirm your email address change."
msgstr ""
#: lms/static/js/student_account/account.js #: lms/static/js/student_account/account.js
#: lms/static/js/student_profile/profile.js #: lms/static/js/student_profile/profile.js
msgid "The data could not be saved." msgid "The data could not be saved."
...@@ -3738,6 +3752,12 @@ msgid "Enter Your New Cohort Group's Name" ...@@ -3738,6 +3752,12 @@ msgid "Enter Your New Cohort Group's Name"
msgstr "" msgstr ""
#: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore #: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore
msgid "(contains %(student_count)s student)"
msgid_plural "(contains %(student_count)s students)"
msgstr[0] ""
msgstr[1] ""
#: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore
msgid "" msgid ""
"Students are added to this group only when you provide their email addresses" "Students are added to this group only when you provide their email addresses"
" or usernames on this page." " or usernames on this page."
......
...@@ -26,7 +26,7 @@ msgid "" ...@@ -26,7 +26,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: edx-platform\n" "Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
"POT-Creation-Date: 2014-10-14 11:52-0400\n" "POT-Creation-Date: 2014-10-20 10:15-0400\n"
"PO-Revision-Date: 2014-10-08 18:08+0000\n" "PO-Revision-Date: 2014-10-08 18:08+0000\n"
"Last-Translator: Sarina Canelake <sarina@edx.org>\n" "Last-Translator: Sarina Canelake <sarina@edx.org>\n"
"Language-Team: English (United Kingdom) (http://www.transifex.com/projects/p/edx-platform/language/en_GB/)\n" "Language-Team: English (United Kingdom) (http://www.transifex.com/projects/p/edx-platform/language/en_GB/)\n"
...@@ -2967,6 +2967,20 @@ msgstr "" ...@@ -2967,6 +2967,20 @@ msgstr ""
msgid "Your donation could not be submitted." msgid "Your donation could not be submitted."
msgstr "" msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid "An error occurred. Please try again later."
msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid "Please verify your new email address"
msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid ""
"You'll receive a confirmation in your inbox. Please follow the link in the "
"email to confirm your email address change."
msgstr ""
#: lms/static/js/student_account/account.js #: lms/static/js/student_account/account.js
#: lms/static/js/student_profile/profile.js #: lms/static/js/student_profile/profile.js
msgid "The data could not be saved." msgid "The data could not be saved."
...@@ -3728,6 +3742,12 @@ msgid "Enter Your New Cohort Group's Name" ...@@ -3728,6 +3742,12 @@ msgid "Enter Your New Cohort Group's Name"
msgstr "" msgstr ""
#: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore #: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore
msgid "(contains %(student_count)s student)"
msgid_plural "(contains %(student_count)s students)"
msgstr[0] ""
msgstr[1] ""
#: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore
msgid "" msgid ""
"Students are added to this group only when you provide their email addresses" "Students are added to this group only when you provide their email addresses"
" or usernames on this page." " or usernames on this page."
......
...@@ -26,8 +26,8 @@ msgid "" ...@@ -26,8 +26,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: 0.1a\n" "Project-Id-Version: 0.1a\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
"POT-Creation-Date: 2014-10-14 12:44-0400\n" "POT-Creation-Date: 2014-10-17 14:15+0000\n"
"PO-Revision-Date: 2014-10-14 16:45:52.446317\n" "PO-Revision-Date: 2014-10-17 14:16:51.150051\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: openedx-translation <openedx-translation@googlegroups.com>\n" "Language-Team: openedx-translation <openedx-translation@googlegroups.com>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
...@@ -2403,33 +2403,6 @@ msgstr "Çlösé Çälçülätör Ⱡ'σ#" ...@@ -2403,33 +2403,6 @@ msgstr "Çlösé Çälçülätör Ⱡ'σ#"
msgid "Post body" msgid "Post body"
msgstr "Pöst ßödý #" msgstr "Pöst ßödý #"
#. Translators: "Distribution" refers to a grade distribution. This error
#. message appears when there is an error getting the data on grade
#. distribution.;
#: lms/static/coffee/src/instructor_dashboard/analytics.js
msgid "Error fetching distribution."
msgstr "Érrör fétçhïng dïstrïßütïön. Ⱡ'σяєм #"
#: lms/static/coffee/src/instructor_dashboard/analytics.js
#: lms/static/coffee/src/instructor_dashboard/instructor_analytics.js
msgid "Unavailable metric display."
msgstr "Ûnäväïläßlé métrïç dïspläý. Ⱡ'σяєм#"
#: lms/static/coffee/src/instructor_dashboard/analytics.js
#: lms/static/coffee/src/instructor_dashboard/instructor_analytics.js
msgid "Error fetching grade distributions."
msgstr "Érrör fétçhïng grädé dïstrïßütïöns. Ⱡ'σяєм ιρ#"
#: lms/static/coffee/src/instructor_dashboard/analytics.js
#: lms/static/coffee/src/instructor_dashboard/instructor_analytics.js
msgid "Last Updated: <%= timestamp %>"
msgstr "Läst Ûpdätéd: <%= timestamp %> Ⱡ'σ#"
#: lms/static/coffee/src/instructor_dashboard/analytics.js
#: lms/static/coffee/src/instructor_dashboard/instructor_analytics.js
msgid "<%= num_students %> students scored."
msgstr "<%= num_students %> stüdénts sçöréd. Ⱡ'σя#"
#: lms/static/coffee/src/instructor_dashboard/data_download.js #: lms/static/coffee/src/instructor_dashboard/data_download.js
msgid "Error generating student profile information. Please try again." msgid "Error generating student profile information. Please try again."
msgstr "" msgstr ""
...@@ -2465,6 +2438,22 @@ msgstr "" ...@@ -2465,6 +2438,22 @@ msgstr ""
"Lïnks äré générätéd ön démänd änd éxpïré wïthïn 5 mïnütés düé tö thé " "Lïnks äré générätéd ön démänd änd éxpïré wïthïn 5 mïnütés düé tö thé "
"sénsïtïvé nätüré öf stüdént ïnförmätïön. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕ#" "sénsïtïvé nätüré öf stüdént ïnförmätïön. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕ#"
#: lms/static/coffee/src/instructor_dashboard/instructor_analytics.js
msgid "Unavailable metric display."
msgstr "Ûnäväïläßlé métrïç dïspläý. Ⱡ'σяєм#"
#: lms/static/coffee/src/instructor_dashboard/instructor_analytics.js
msgid "Error fetching grade distributions."
msgstr "Érrör fétçhïng grädé dïstrïßütïöns. Ⱡ'σяєм ιρ#"
#: lms/static/coffee/src/instructor_dashboard/instructor_analytics.js
msgid "Last Updated: <%= timestamp %>"
msgstr "Läst Ûpdätéd: <%= timestamp %> Ⱡ'σ#"
#: lms/static/coffee/src/instructor_dashboard/instructor_analytics.js
msgid "<%= num_students %> students scored."
msgstr "<%= num_students %> stüdénts sçöréd. Ⱡ'σя#"
#: lms/static/coffee/src/instructor_dashboard/membership.js #: lms/static/coffee/src/instructor_dashboard/membership.js
msgid "Username" msgid "Username"
msgstr "Ûsérnämé #" msgstr "Ûsérnämé #"
...@@ -3167,6 +3156,23 @@ msgstr "Pléäsé éntér ä välïd dönätïön ämöünt. Ⱡ'σяєм ιρѕ ...@@ -3167,6 +3156,23 @@ msgstr "Pléäsé éntér ä välïd dönätïön ämöünt. Ⱡ'σяєм ιρѕ
msgid "Your donation could not be submitted." msgid "Your donation could not be submitted."
msgstr "Ýöür dönätïön çöüld nöt ßé süßmïttéd. Ⱡ'σяєм ιρѕ#" msgstr "Ýöür dönätïön çöüld nöt ßé süßmïttéd. Ⱡ'σяєм ιρѕ#"
#: lms/static/js/dashboard/legacy.js
msgid "An error occurred. Please try again later."
msgstr "Àn érrör öççürréd. Pléäsé trý ägäïn lätér. Ⱡ'σяєм ιρѕυ#"
#: lms/static/js/dashboard/legacy.js
msgid "Please verify your new email address"
msgstr "Pléäsé vérïfý ýöür néw émäïl äddréss Ⱡ'σяєм ιρ#"
#: lms/static/js/dashboard/legacy.js
msgid ""
"You'll receive a confirmation in your inbox. Please follow the link in the "
"email to confirm your email address change."
msgstr ""
"Ýöü'll réçéïvé ä çönfïrmätïön ïn ýöür ïnßöx. Pléäsé föllöw thé lïnk ïn thé "
"émäïl tö çönfïrm ýöür émäïl äddréss çhängé. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, "
"¢σηѕє¢т#"
#: lms/static/js/student_account/account.js #: lms/static/js/student_account/account.js
#: lms/static/js/student_profile/profile.js #: lms/static/js/student_profile/profile.js
msgid "The data could not be saved." msgid "The data could not be saved."
...@@ -3995,6 +4001,12 @@ msgid "Enter Your New Cohort Group's Name" ...@@ -3995,6 +4001,12 @@ msgid "Enter Your New Cohort Group's Name"
msgstr "Éntér Ýöür Néw Çöhört Gröüp's Nämé Ⱡ'σяєм ιρ#" msgstr "Éntér Ýöür Néw Çöhört Gröüp's Nämé Ⱡ'σяєм ιρ#"
#: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore #: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore
msgid "(contains %(student_count)s student)"
msgid_plural "(contains %(student_count)s students)"
msgstr[0] "(çöntäïns %(student_count)s stüdént) Ⱡ'σяє#"
msgstr[1] "(çöntäïns %(student_count)s stüdénts) Ⱡ'σяє#"
#: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore
msgid "" msgid ""
"Students are added to this group only when you provide their email addresses" "Students are added to this group only when you provide their email addresses"
" or usernames on this page." " or usernames on this page."
......
...@@ -60,7 +60,7 @@ msgid "" ...@@ -60,7 +60,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: edx-platform\n" "Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
"POT-Creation-Date: 2014-10-14 11:52-0400\n" "POT-Creation-Date: 2014-10-20 10:15-0400\n"
"PO-Revision-Date: 2014-10-08 18:08+0000\n" "PO-Revision-Date: 2014-10-08 18:08+0000\n"
"Last-Translator: Sarina Canelake <sarina@edx.org>\n" "Last-Translator: Sarina Canelake <sarina@edx.org>\n"
"Language-Team: Spanish (Latin America) (http://www.transifex.com/projects/p/edx-platform/language/es_419/)\n" "Language-Team: Spanish (Latin America) (http://www.transifex.com/projects/p/edx-platform/language/es_419/)\n"
...@@ -3146,6 +3146,20 @@ msgstr "" ...@@ -3146,6 +3146,20 @@ msgstr ""
msgid "Your donation could not be submitted." msgid "Your donation could not be submitted."
msgstr "" msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid "An error occurred. Please try again later."
msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid "Please verify your new email address"
msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid ""
"You'll receive a confirmation in your inbox. Please follow the link in the "
"email to confirm your email address change."
msgstr ""
#: lms/static/js/student_account/account.js #: lms/static/js/student_account/account.js
#: lms/static/js/student_profile/profile.js #: lms/static/js/student_profile/profile.js
msgid "The data could not be saved." msgid "The data could not be saved."
...@@ -3956,6 +3970,12 @@ msgid "Enter Your New Cohort Group's Name" ...@@ -3956,6 +3970,12 @@ msgid "Enter Your New Cohort Group's Name"
msgstr "" msgstr ""
#: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore #: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore
msgid "(contains %(student_count)s student)"
msgid_plural "(contains %(student_count)s students)"
msgstr[0] ""
msgstr[1] ""
#: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore
msgid "" msgid ""
"Students are added to this group only when you provide their email addresses" "Students are added to this group only when you provide their email addresses"
" or usernames on this page." " or usernames on this page."
......
...@@ -29,7 +29,7 @@ msgid "" ...@@ -29,7 +29,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: edx-platform\n" "Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
"POT-Creation-Date: 2014-10-14 11:52-0400\n" "POT-Creation-Date: 2014-10-20 10:15-0400\n"
"PO-Revision-Date: 2014-10-08 18:08+0000\n" "PO-Revision-Date: 2014-10-08 18:08+0000\n"
"Last-Translator: Sarina Canelake <sarina@edx.org>\n" "Last-Translator: Sarina Canelake <sarina@edx.org>\n"
"Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/edx-platform/language/es_AR/)\n" "Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/edx-platform/language/es_AR/)\n"
...@@ -2970,6 +2970,20 @@ msgstr "" ...@@ -2970,6 +2970,20 @@ msgstr ""
msgid "Your donation could not be submitted." msgid "Your donation could not be submitted."
msgstr "" msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid "An error occurred. Please try again later."
msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid "Please verify your new email address"
msgstr ""
#: lms/static/js/dashboard/legacy.js
msgid ""
"You'll receive a confirmation in your inbox. Please follow the link in the "
"email to confirm your email address change."
msgstr ""
#: lms/static/js/student_account/account.js #: lms/static/js/student_account/account.js
#: lms/static/js/student_profile/profile.js #: lms/static/js/student_profile/profile.js
msgid "The data could not be saved." msgid "The data could not be saved."
...@@ -3731,6 +3745,12 @@ msgid "Enter Your New Cohort Group's Name" ...@@ -3731,6 +3745,12 @@ msgid "Enter Your New Cohort Group's Name"
msgstr "" msgstr ""
#: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore #: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore
msgid "(contains %(student_count)s student)"
msgid_plural "(contains %(student_count)s students)"
msgstr[0] ""
msgstr[1] ""
#: lms/templates/instructor/instructor_dashboard_2/cohort-editor.underscore
msgid "" msgid ""
"Students are added to this group only when you provide their email addresses" "Students are added to this group only when you provide their email addresses"
" or usernames on this page." " or usernames on this page."
......
This diff is collapsed. Click to expand it.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment