diff --git a/cms/djangoapps/cms_user_tasks/signals.py b/cms/djangoapps/cms_user_tasks/signals.py
index 8011f2be1c55..b4f86807fd68 100644
--- a/cms/djangoapps/cms_user_tasks/signals.py
+++ b/cms/djangoapps/cms_user_tasks/signals.py
@@ -2,6 +2,7 @@
Receivers of signals sent from django-user-tasks
"""
import logging
+import re
from urllib.parse import urljoin
from django.dispatch import receiver
@@ -15,6 +16,7 @@
from .tasks import send_task_complete_email
LOGGER = logging.getLogger(__name__)
+LIBRARY_CONTENT_TASK_NAME_TEMPLATE = 'updating .*type@library_content.* from library'
@receiver(user_task_stopped, dispatch_uid="cms_user_task_stopped")
@@ -33,6 +35,22 @@ def user_task_stopped_handler(sender, **kwargs): # pylint: disable=unused-argum
Returns:
None
"""
+
+ def is_library_content_update(task_name: str) -> bool:
+ """
+ Decides whether to suppress an end-of-task email on the basis that the just-ended task was a library content
+ XBlock update operation, and that emails following such operations amount to spam
+ Arguments:
+ task_name: The name of the just-ended task. By convention, if this was a library content XBlock update
+ task, then the task name follows the pattern prescribed in LibrarySyncChildrenTask
+ (content_libraries under openedx) 'Updating {key} from library'. Moreover, the block type
+ in the task name is always of type 'library_content' for such operations
+ Returns:
+ True if the end-of-task email should be suppressed
+ """
+ p = re.compile(LIBRARY_CONTENT_TASK_NAME_TEMPLATE)
+ return p.match(task_name)
+
def get_olx_validation_from_artifact():
"""
Get olx validation error if available for current task.
@@ -47,9 +65,17 @@ def get_olx_validation_from_artifact():
return olx_artifact.text
status = kwargs['status']
+
# Only send email when the entire task is complete, should only send when
# a chain / chord / etc completes, not on sub-tasks.
if status.parent is None:
+ task_name = status.name.lower()
+
+ # Also suppress emails on library content XBlock updates (too much like spam)
+ if is_library_content_update(task_name):
+ LOGGER.info(f"Suppressing end-of-task email on task {task_name}")
+ return
+
# `name` and `status` are not unique, first is our best guess
artifact = UserTaskArtifact.objects.filter(status=status, name="BASE_URL").first()
@@ -61,7 +87,6 @@ def get_olx_validation_from_artifact():
)
user_email = status.user.email
- task_name = status.name.lower()
olx_validation_text = get_olx_validation_from_artifact()
task_args = [task_name, str(status.state_text), user_email, detail_url, olx_validation_text]
try:
diff --git a/cms/djangoapps/cms_user_tasks/tests.py b/cms/djangoapps/cms_user_tasks/tests.py
index f50e5002feff..feeac4db0986 100644
--- a/cms/djangoapps/cms_user_tasks/tests.py
+++ b/cms/djangoapps/cms_user_tasks/tests.py
@@ -208,6 +208,19 @@ def test_email_sent_with_site(self):
self.assert_msg_subject(msg)
self.assert_msg_body_fragments(msg, body_fragments)
+ def test_email_not_sent_with_libary_content_update(self):
+ """
+ Check the signal receiver and email sending.
+ """
+ UserTaskArtifact.objects.create(
+ status=self.status, name='BASE_URL', url='https://test.edx.org/'
+ )
+ end_of_task_status = self.status
+ end_of_task_status.name = "updating block-v1:course+type@library_content+block@uuid from library"
+ user_task_stopped.send(sender=UserTaskStatus, status=end_of_task_status)
+
+ self.assertEqual(len(mail.outbox), 0)
+
def test_email_sent_with_olx_validations_with_config_enabled(self):
"""
Tests that email is sent with olx validation errors.
diff --git a/cms/djangoapps/contentstore/asset_storage_handlers.py b/cms/djangoapps/contentstore/asset_storage_handlers.py
index 3f77a934f946..281258e03a8d 100644
--- a/cms/djangoapps/contentstore/asset_storage_handlers.py
+++ b/cms/djangoapps/contentstore/asset_storage_handlers.py
@@ -126,28 +126,41 @@ def _get_asset_usage_path(course_key, assets):
asset_key_string = str(asset_key)
static_path = StaticContent.get_static_path_from_location(asset_key)
is_video_block = getattr(block, 'category', '') == 'video'
- if is_video_block:
- handout = getattr(block, 'handout', '')
- if handout and asset_key_string in handout:
- unit = block.get_parent()
- subsection = unit.get_parent()
- subsection_display_name = getattr(subsection, 'display_name', '')
- unit_display_name = getattr(unit, 'display_name', '')
- xblock_display_name = getattr(block, 'display_name', '')
- current_locations = usage_locations[asset_key_string]
- new_location = f'{subsection_display_name} - {unit_display_name} / {xblock_display_name}'
- usage_locations[asset_key_string] = [*current_locations, new_location]
- else:
- data = getattr(block, 'data', '')
- if static_path in data or asset_key_string in data:
- unit = block.get_parent()
- subsection = unit.get_parent()
- subsection_display_name = getattr(subsection, 'display_name', '')
- unit_display_name = getattr(unit, 'display_name', '')
- xblock_display_name = getattr(block, 'display_name', '')
- current_locations = usage_locations[asset_key_string]
- new_location = f'{subsection_display_name} - {unit_display_name} / {xblock_display_name}'
- usage_locations[asset_key_string] = [*current_locations, new_location]
+ try:
+ if is_video_block:
+ handout = getattr(block, 'handout', '')
+ if handout and asset_key_string in handout:
+ usage_dict = {'display_location': '', 'url': ''}
+ xblock_display_name = getattr(block, 'display_name', '')
+ xblock_location = str(block.location)
+ unit = block.get_parent()
+ unit_location = str(block.parent)
+ unit_display_name = getattr(unit, 'display_name', '')
+ subsection = unit.get_parent()
+ subsection_display_name = getattr(subsection, 'display_name', '')
+ current_locations = usage_locations[asset_key_string]
+ usage_dict['display_location'] = (f'{subsection_display_name} - '
+ f'{unit_display_name} / {xblock_display_name}')
+ usage_dict['url'] = f'/container/{unit_location}#{xblock_location}'
+ usage_locations[asset_key_string] = [*current_locations, usage_dict]
+ else:
+ data = getattr(block, 'data', '')
+ if static_path in data or asset_key_string in data:
+ usage_dict = {'display_location': '', 'url': ''}
+ xblock_display_name = getattr(block, 'display_name', '')
+ xblock_location = str(block.location)
+ unit = block.get_parent()
+ unit_location = str(block.parent)
+ unit_display_name = getattr(unit, 'display_name', '')
+ subsection = unit.get_parent()
+ subsection_display_name = getattr(subsection, 'display_name', '')
+ current_locations = usage_locations[asset_key_string]
+ usage_dict['display_location'] = (f'{subsection_display_name} - '
+ f'{unit_display_name} / {xblock_display_name}')
+ usage_dict['url'] = f'/container/{unit_location}#{xblock_location}'
+ usage_locations[asset_key_string] = [*current_locations, usage_dict]
+ except AttributeError:
+ continue
return usage_locations
diff --git a/cms/djangoapps/contentstore/helpers.py b/cms/djangoapps/contentstore/helpers.py
index c2cc876f19da..0d66070b1120 100644
--- a/cms/djangoapps/contentstore/helpers.py
+++ b/cms/djangoapps/contentstore/helpers.py
@@ -302,6 +302,16 @@ def _import_xml_node_to_parent(
# and VAL will thus make the transcript available.
child_nodes = []
+
+ if issubclass(xblock_class, XmlMixin):
+ # Hack: XBlocks that use "XmlMixin" have their own XML parsing behavior, and in particular if they encounter
+ # an XML node that has no children and has only a "url_name" attribute, they'll try to load the XML data
+ # from an XML file in runtime.resources_fs. But that file doesn't exist here. So we set at least one
+ # additional attribute here to make sure that url_name is not the only attribute; otherwise in some cases,
+ # XmlMixin.parse_xml will try to load an XML file that doesn't exist, giving an error. The name and value
+ # of this attribute don't matter and should be ignored.
+ node.attrib["x-is-pointer-node"] = "no"
+
if not xblock_class.has_children:
# No children to worry about. The XML may contain child nodes, but they're not XBlocks.
temp_xblock = xblock_class.parse_xml(node, runtime, keys, id_generator)
@@ -314,14 +324,6 @@ def _import_xml_node_to_parent(
# serialization of a child block, in order. For blocks that don't support children, their XML content/nodes
# could be anything (e.g. HTML, capa)
node_without_children = etree.Element(node.tag, **node.attrib)
- if issubclass(xblock_class, XmlMixin):
- # Hack: XBlocks that use "XmlMixin" have their own XML parsing behavior, and in particular if they encounter
- # an XML node that has no children and has only a "url_name" attribute, they'll try to load the XML data
- # from an XML file in runtime.resources_fs. But that file doesn't exist here. So we set at least one
- # additional attribute here to make sure that url_name is not the only attribute; otherwise in some cases,
- # XmlMixin.parse_xml will try to load an XML file that doesn't exist, giving an error. The name and value
- # of this attribute don't matter and should be ignored.
- node_without_children.attrib["x-is-pointer-node"] = "no"
temp_xblock = xblock_class.parse_xml(node_without_children, runtime, keys, id_generator)
child_nodes = list(node)
if xblock_class.has_children and temp_xblock.children:
diff --git a/cms/djangoapps/contentstore/rest_api/v1/serializers/videos.py b/cms/djangoapps/contentstore/rest_api/v1/serializers/videos.py
index 04f508eedfd7..50100f6a2b05 100644
--- a/cms/djangoapps/contentstore/rest_api/v1/serializers/videos.py
+++ b/cms/djangoapps/contentstore/rest_api/v1/serializers/videos.py
@@ -57,7 +57,7 @@ class VideoModelSerializer(serializers.Serializer):
child=serializers.CharField()
)
usage_locations = serializers.ListField(
- child=serializers.CharField()
+ child=serializers.DictField()
)
@@ -89,6 +89,7 @@ class CourseVideosSerializer(serializers.Serializer):
video_upload_max_file_size = serializers.CharField()
video_image_settings = VideoImageSettingsSerializer(required=True, allow_null=False)
is_video_transcript_enabled = serializers.BooleanField()
+ is_ai_translations_enabled = serializers.BooleanField()
active_transcript_preferences = VideoActiveTranscriptPreferencesSerializer(required=False, allow_null=True)
transcript_credentials = serializers.DictField(
child=serializers.BooleanField()
@@ -110,7 +111,7 @@ class CourseVideosSerializer(serializers.Serializer):
class VideoUsageSerializer(serializers.Serializer):
"""Serializer for video usage"""
usage_locations = serializers.ListField(
- child=serializers.CharField()
+ child=serializers.DictField()
)
diff --git a/cms/djangoapps/contentstore/rest_api/v1/views/tests/test_videos.py b/cms/djangoapps/contentstore/rest_api/v1/views/tests/test_videos.py
index d5d277c498dc..993072e0717f 100644
--- a/cms/djangoapps/contentstore/rest_api/v1/views/tests/test_videos.py
+++ b/cms/djangoapps/contentstore/rest_api/v1/views/tests/test_videos.py
@@ -56,6 +56,7 @@ def test_course_videos_response(self):
"supported_file_formats": settings.VIDEO_IMAGE_SUPPORTED_FILE_FORMATS
},
"is_video_transcript_enabled": False,
+ "is_ai_translations_enabled": False,
"active_transcript_preferences": None,
"transcript_credentials": None,
"transcript_available_languages": get_all_transcript_languages(),
@@ -126,3 +127,10 @@ def test_VideoTranscriptEnabledFlag_enabled(self):
)
self.assertIn("transcript_credentials_handler_url", transcript_settings)
self.assertEqual(expected_credentials_handler, transcript_settings["transcript_credentials_handler_url"])
+ with patch(
+ 'openedx.core.djangoapps.video_config.toggles.XPERT_TRANSLATIONS_UI.is_enabled'
+ ) as xpertTranslationfeature:
+ xpertTranslationfeature.return_value = True
+ response = self.client.get(self.url)
+ self.assertIn("is_ai_translations_enabled", response.data)
+ self.assertTrue(response.data["is_ai_translations_enabled"])
diff --git a/cms/djangoapps/contentstore/tasks.py b/cms/djangoapps/contentstore/tasks.py
index 69c9057966ee..8cf1f3172832 100644
--- a/cms/djangoapps/contentstore/tasks.py
+++ b/cms/djangoapps/contentstore/tasks.py
@@ -715,6 +715,7 @@ def read_chunk():
from .views.entrance_exam import add_entrance_exam_milestone
add_entrance_exam_milestone(course.id, entrance_exam_chapter)
LOGGER.info(f'Course import {course.id}: Entrance exam imported')
+ if is_course:
sync_discussion_settings(courselike_key, user)
diff --git a/cms/djangoapps/contentstore/tests/test_libraries.py b/cms/djangoapps/contentstore/tests/test_libraries.py
index e7dcc3647886..376ba56d8dd9 100644
--- a/cms/djangoapps/contentstore/tests/test_libraries.py
+++ b/cms/djangoapps/contentstore/tests/test_libraries.py
@@ -440,10 +440,6 @@ def test_sync_if_source_library_changed(self):
html_block_2 = modulestore().get_item(lc_block.children[0])
self.assertEqual(html_block_2.data, data2)
- @patch(
- 'openedx.core.djangoapps.content_libraries.tasks.SearchEngine.get_search_engine',
- Mock(return_value=None, autospec=True),
- )
def test_sync_if_capa_type_changed(self):
""" Tests that children are automatically refreshed if capa type field changes """
name1, name2 = "Option Problem", "Multiple Choice Problem"
diff --git a/cms/djangoapps/contentstore/utils.py b/cms/djangoapps/contentstore/utils.py
index e5f73b8137e0..5f2015ffa0fc 100644
--- a/cms/djangoapps/contentstore/utils.py
+++ b/cms/djangoapps/contentstore/utils.py
@@ -74,6 +74,7 @@
use_new_video_uploads_page,
use_new_custom_pages,
use_tagging_taxonomy_list_page,
+ # use_xpert_translations_component,
)
from cms.djangoapps.models.settings.course_grading import CourseGradingModel
from xmodule.library_tools import LibraryToolsService
@@ -1537,6 +1538,7 @@ def get_course_videos_context(course_block, pagination_conf, course_key=None):
get_transcript_preferences,
)
from openedx.core.djangoapps.video_config.models import VideoTranscriptEnabledFlag
+ from openedx.core.djangoapps.video_config.toggles import use_xpert_translations_component
from xmodule.video_block.transcripts_utils import Transcript # lint-amnesty, pylint: disable=wrong-import-order
from .video_storage_handlers import (
@@ -1561,6 +1563,7 @@ def get_course_videos_context(course_block, pagination_conf, course_key=None):
course = modulestore().get_course(course_key)
is_video_transcript_enabled = VideoTranscriptEnabledFlag.feature_enabled(course.id)
+ is_ai_translations_enabled = use_xpert_translations_component(course.id)
previous_uploads, pagination_context = _get_index_videos(course, pagination_conf)
course_video_context = {
'context_course': course,
@@ -1581,6 +1584,7 @@ def get_course_videos_context(course_block, pagination_conf, course_key=None):
'supported_file_formats': settings.VIDEO_IMAGE_SUPPORTED_FILE_FORMATS
},
'is_video_transcript_enabled': is_video_transcript_enabled,
+ 'is_ai_translations_enabled': is_ai_translations_enabled,
'active_transcript_preferences': None,
'transcript_credentials': None,
'transcript_available_languages': get_all_transcript_languages(),
diff --git a/cms/djangoapps/contentstore/video_storage_handlers.py b/cms/djangoapps/contentstore/video_storage_handlers.py
index 4d546aab3de5..f68d71a6bf6b 100644
--- a/cms/djangoapps/contentstore/video_storage_handlers.py
+++ b/cms/djangoapps/contentstore/video_storage_handlers.py
@@ -234,15 +234,26 @@ def get_video_usage_path(course_key, edx_video_id):
'category': 'video'
},
)
+
for video in videos:
video_id = getattr(video, 'edx_video_id', '')
- if video_id == edx_video_id:
- unit = video.get_parent()
- subsection = unit.get_parent()
- subsection_display_name = getattr(subsection, 'display_name', '')
- unit_display_name = getattr(unit, 'display_name', '')
- xblock_display_name = getattr(video, 'display_name', '')
- usage_locations.append(f'{subsection_display_name} - {unit_display_name} / {xblock_display_name}')
+ try:
+ if video_id == edx_video_id:
+ usage_dict = {'display_location': '', 'url': ''}
+ video_location = str(video.location)
+ xblock_display_name = getattr(video, 'display_name', '')
+ unit = video.get_parent()
+ unit_location = str(video.parent)
+ unit_display_name = getattr(unit, 'display_name', '')
+ subsection = unit.get_parent()
+ subsection_display_name = getattr(subsection, 'display_name', '')
+ usage_dict['display_location'] = (f'{subsection_display_name} - '
+ f'{unit_display_name} / {xblock_display_name}')
+ usage_dict['url'] = f'/container/{unit_location}#{video_location}'
+ usage_locations.append(usage_dict)
+ except AttributeError:
+ continue
+
return {'usage_locations': usage_locations}
@@ -666,12 +677,12 @@ def videos_index_html(course, pagination_conf=None):
"""
Returns an HTML page to display previous video uploads and allow new ones
"""
+ if use_new_video_uploads_page(course.id):
+ return redirect(get_video_uploads_url(course.id))
context = get_course_videos_context(
course,
pagination_conf,
)
- if use_new_video_uploads_page(course.id):
- return redirect(get_video_uploads_url(course.id))
return render_to_response('videos_index.html', context)
diff --git a/cms/djangoapps/contentstore/views/tests/test_clipboard_paste.py b/cms/djangoapps/contentstore/views/tests/test_clipboard_paste.py
index 429630ac8d1b..170c98d1eb09 100644
--- a/cms/djangoapps/contentstore/views/tests/test_clipboard_paste.py
+++ b/cms/djangoapps/contentstore/views/tests/test_clipboard_paste.py
@@ -3,6 +3,7 @@
allow users to paste XBlocks that were copied using the staged_content/clipboard
APIs.
"""
+import ddt
from opaque_keys.edx.keys import UsageKey
from rest_framework.test import APIClient
from xmodule.modulestore.django import contentstore
@@ -13,6 +14,7 @@
XBLOCK_ENDPOINT = "/xblock/"
+@ddt.ddt
class ClipboardPasteTestCase(ModuleStoreTestCase):
"""
Test Clipboard Paste functionality
@@ -99,6 +101,42 @@ def test_copy_and_paste_unit(self):
# The new block should store a reference to where it was copied from
assert dest_unit.copied_from_block == str(unit_key)
+ @ddt.data(
+ # A problem with absolutely no fields set. A previous version of copy-paste had an error when pasting this.
+ {"category": "problem", "display_name": None, "data": ""},
+ {"category": "problem", "display_name": "Emoji Land 😎", "data": "emoji in the body 😎"},
+ )
+ def test_copy_and_paste_component(self, block_args):
+ """
+ Test copying a component (XBlock) from one course into another
+ """
+ source_course = CourseFactory.create(display_name='Destination Course')
+ source_block = BlockFactory.create(parent_location=source_course.location, **block_args)
+
+ dest_course = CourseFactory.create(display_name='Destination Course')
+ with self.store.bulk_operations(dest_course.id):
+ dest_chapter = BlockFactory.create(parent=dest_course, category='chapter', display_name='Section')
+ dest_sequential = BlockFactory.create(parent=dest_chapter, category='sequential', display_name='Subsection')
+
+ # Copy the block
+ client = APIClient()
+ client.login(username=self.user.username, password=self.user_password)
+ copy_response = client.post(CLIPBOARD_ENDPOINT, {"usage_key": str(source_block.location)}, format="json")
+ assert copy_response.status_code == 200
+
+ # Paste the unit
+ paste_response = client.post(XBLOCK_ENDPOINT, {
+ "parent_locator": str(dest_sequential.location),
+ "staged_content": "clipboard",
+ }, format="json")
+ assert paste_response.status_code == 200
+ dest_block_key = UsageKey.from_string(paste_response.json()["locator"])
+
+ dest_block = self.store.get_item(dest_block_key)
+ assert dest_block.display_name == source_block.display_name
+ # The new block should store a reference to where it was copied from
+ assert dest_block.copied_from_block == str(source_block.location)
+
def test_paste_with_assets(self):
"""
When pasting into a different course, any required static assets should
diff --git a/cms/envs/common.py b/cms/envs/common.py
index 11afd870a016..e4d23241bf4a 100644
--- a/cms/envs/common.py
+++ b/cms/envs/common.py
@@ -115,7 +115,6 @@
ENTERPRISE_BACKEND_SERVICE_EDX_OAUTH2_PROVIDER_URL,
# Blockstore
- BLOCKSTORE_USE_BLOCKSTORE_APP_API,
BUNDLE_ASSET_STORAGE_SETTINGS,
# Methods to derive settings
@@ -298,9 +297,6 @@
# Enable content libraries (modulestore) search functionality
'ENABLE_LIBRARY_INDEX': False,
- # Enable content libraries (blockstore) indexing
- 'ENABLE_CONTENT_LIBRARY_INDEX': False,
-
# .. toggle_name: FEATURES['ALLOW_COURSE_RERUNS']
# .. toggle_implementation: DjangoSetting
# .. toggle_default: True
@@ -2606,8 +2602,7 @@
PROCTORING_SETTINGS = {}
################## BLOCKSTORE RELATED SETTINGS #########################
-BLOCKSTORE_PUBLIC_URL_ROOT = 'http://localhost:18250'
-BLOCKSTORE_API_URL = 'http://localhost:18250/api/v1/'
+
# Which of django's caches to use for storing anonymous user state for XBlocks
# in the blockstore-based XBlock runtime
XBLOCK_RUNTIME_V2_EPHEMERAL_DATA_CACHE = 'default'
diff --git a/cms/envs/devstack-experimental.yml b/cms/envs/devstack-experimental.yml
index 8aa2c304af81..54f6edf8f9f2 100644
--- a/cms/envs/devstack-experimental.yml
+++ b/cms/envs/devstack-experimental.yml
@@ -40,8 +40,6 @@ AWS_SES_REGION_ENDPOINT: email.us-east-1.amazonaws.com
AWS_SES_REGION_NAME: us-east-1
AWS_STORAGE_BUCKET_NAME: SET-ME-PLEASE (ex. bucket-name)
BASE_COOKIE_DOMAIN: localhost
-BLOCKSTORE_API_URL: http://localhost:18250/api/v1
-BLOCKSTORE_PUBLIC_URL_ROOT: http://localhost:18250
BLOCK_STRUCTURES_SETTINGS:
COURSE_PUBLISH_TASK_DELAY: 30
TASK_DEFAULT_RETRY_DELAY: 30
diff --git a/cms/envs/devstack.py b/cms/envs/devstack.py
index 275a1fd31e72..7deb16c7eb67 100644
--- a/cms/envs/devstack.py
+++ b/cms/envs/devstack.py
@@ -147,7 +147,6 @@ def should_show_debug_toolbar(request): # lint-amnesty, pylint: disable=missing
################################ SEARCH INDEX ################################
FEATURES['ENABLE_COURSEWARE_INDEX'] = True
FEATURES['ENABLE_LIBRARY_INDEX'] = False
-FEATURES['ENABLE_CONTENT_LIBRARY_INDEX'] = False
SEARCH_ENGINE = "search.elastic.ElasticSearchEngine"
ELASTIC_SEARCH_CONFIG = [
diff --git a/cms/envs/production.py b/cms/envs/production.py
index d0a846d3da21..262d0d4c4629 100644
--- a/cms/envs/production.py
+++ b/cms/envs/production.py
@@ -510,7 +510,7 @@ def get_env_setting(setting):
# Example: {'CN': 'http://api.xuetangx.com/edx/video?s3_url='}
VIDEO_CDN_URL = ENV_TOKENS.get('VIDEO_CDN_URL', {})
-if FEATURES['ENABLE_COURSEWARE_INDEX'] or FEATURES['ENABLE_LIBRARY_INDEX'] or FEATURES['ENABLE_CONTENT_LIBRARY_INDEX']:
+if FEATURES['ENABLE_COURSEWARE_INDEX'] or FEATURES['ENABLE_LIBRARY_INDEX']:
# Use ElasticSearch for the search engine
SEARCH_ENGINE = "search.elastic.ElasticSearchEngine"
diff --git a/cms/envs/test.py b/cms/envs/test.py
index e7be26b73c0e..118d7e27a79c 100644
--- a/cms/envs/test.py
+++ b/cms/envs/test.py
@@ -27,8 +27,6 @@
# import settings from LMS for consistent behavior with CMS
from lms.envs.test import ( # pylint: disable=wrong-import-order
- BLOCKSTORE_USE_BLOCKSTORE_APP_API,
- BLOCKSTORE_API_URL,
COMPREHENSIVE_THEME_DIRS, # unimport:skip
DEFAULT_FILE_STORAGE,
ECOMMERCE_API_URL,
@@ -184,10 +182,6 @@
}
############################### BLOCKSTORE #####################################
-# Blockstore tests
-RUN_BLOCKSTORE_TESTS = os.environ.get('EDXAPP_RUN_BLOCKSTORE_TESTS', 'no').lower() in ('true', 'yes', '1')
-BLOCKSTORE_API_URL = os.environ.get('EDXAPP_BLOCKSTORE_API_URL', "http://edx.devstack.blockstore-test:18251/api/v1/")
-BLOCKSTORE_API_AUTH_TOKEN = os.environ.get('EDXAPP_BLOCKSTORE_API_AUTH_TOKEN', 'edxapp-test-key')
BUNDLE_ASSET_STORAGE_SETTINGS = dict(
STORAGE_CLASS='django.core.files.storage.FileSystemStorage',
STORAGE_KWARGS=dict(
@@ -265,21 +259,10 @@
# Courseware Search Index
FEATURES['ENABLE_COURSEWARE_INDEX'] = True
FEATURES['ENABLE_LIBRARY_INDEX'] = True
-FEATURES['ENABLE_CONTENT_LIBRARY_INDEX'] = False
SEARCH_ENGINE = "search.tests.mock_search_engine.MockSearchEngine"
FEATURES['ENABLE_ENROLLMENT_TRACK_USER_PARTITION'] = True
-####################### ELASTICSEARCH TESTS #######################
-# Enable this when testing elasticsearch-based code which couldn't be tested using the mock engine
-ENABLE_ELASTICSEARCH_FOR_TESTS = os.environ.get(
- 'EDXAPP_ENABLE_ELASTICSEARCH_FOR_TESTS', 'no').lower() in ('true', 'yes', '1')
-
-TEST_ELASTICSEARCH_USE_SSL = os.environ.get(
- 'EDXAPP_TEST_ELASTICSEARCH_USE_SSL', 'no').lower() in ('true', 'yes', '1')
-TEST_ELASTICSEARCH_HOST = os.environ.get('EDXAPP_TEST_ELASTICSEARCH_HOST', 'edx.devstack.elasticsearch710')
-TEST_ELASTICSEARCH_PORT = int(os.environ.get('EDXAPP_TEST_ELASTICSEARCH_PORT', '9200'))
-
########################## AUTHOR PERMISSION #######################
FEATURES['ENABLE_CREATOR_GROUP'] = False
diff --git a/cms/static/js/i18n/el/djangojs.js b/cms/static/js/i18n/el/djangojs.js
index b285dc7c78cf..ea7d101fd4f8 100644
--- a/cms/static/js/i18n/el/djangojs.js
+++ b/cms/static/js/i18n/el/djangojs.js
@@ -75,6 +75,8 @@
"April": "\u0391\u03c0\u03c1\u03af\u03bb\u03b9\u03bf\u03c2",
"Are you sure you want to delete this post?": "\u0395\u03af\u03c3\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03bf\u03c2 \u03cc\u03c4\u03b9 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03ac\u03c8\u03b5\u03c4\u03b5 \u03c4\u03b7\u03bd \u03b1\u03bd\u03ac\u03c1\u03c4\u03b7\u03c3\u03b7;",
"Are you sure you want to delete this response?": "\u0395\u03af\u03c3\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03bf\u03c2 \u03cc\u03c4\u03b9 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03ac\u03c8\u03b5\u03c4\u03b5 \u03c4\u03b7\u03bd \u03b1\u03c0\u03cc\u03ba\u03c1\u03b9\u03c3\u03b7;",
+ "Are you sure you want to unenroll from the verified {certNameLong} track of {courseName} ({courseNumber})?": "\u0398\u03ad\u03bb\u03b5\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03b1 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03b5\u03af\u03c4\u03b5 \u03b1\u03c0\u03cc \u03c4\u03bf \u03bc\u03ac\u03b8\u03b7\u03bc\u03b1 {certNameLong} {courseName} ({courseNumber});",
+ "Are you sure you want to unenroll from the verified {certNameLong} track of {courseName} ({courseNumber})?": "\u0398\u03ad\u03bb\u03b5\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03b1 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03b5\u03af\u03c4\u03b5 \u03b1\u03c0\u03cc \u03c4\u03bf \u03bc\u03ac\u03b8\u03b7\u03bc\u03b1 {certNameLong} {courseName} ({courseNumber});",
"Are you sure you want to unenroll from {courseName} ({courseNumber})?": "\u0398\u03ad\u03bb\u03b5\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03b1 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03b5\u03af\u03c4\u03b5 \u03b1\u03c0\u03cc \u03c4\u03bf \u03bc\u03ac\u03b8\u03b7\u03bc\u03b1 {courseName} ({courseNumber});",
"Assessment": "\u0391\u03be\u03b9\u03bf\u03bb\u03cc\u03b3\u03b7\u03c3\u03b7",
"Assessments": "\u0391\u03be\u03b9\u03bf\u03bb\u03bf\u03b3\u03ae\u03c3\u03b5\u03b9\u03c2",
@@ -126,6 +128,7 @@
"Course Name": "\u03a4\u03af\u03c4\u03bb\u03bf\u03c2 \u03bc\u03b1\u03b8\u03ae\u03bc\u03b1\u03c4\u03bf\u03c2",
"Course Number": "\u039a\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u039c\u03b1\u03b8\u03ae\u03bc\u03b1\u03c4\u03bf\u03c2",
"Create Account": "\u03a0\u03b1\u03c4\u03ae\u03c3\u03c4\u03b5 \u03b5\u03b4\u03ce \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03b3\u03af\u03bd\u03b5\u03b9 \u03b7 \u03b5\u03b3\u03b3\u03c1\u03b1\u03c6\u03ae \u03c3\u03b1\u03c2",
+ "Create a report of problem responses": "\u0394\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac\u03c2",
"Create an Account": "\u0394\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03bd\u03ad\u03bf\u03c5 \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03bf\u03cd",
"Create an Account.": "\u0394\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03bd\u03ad\u03bf\u03c5 \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03bf\u03cd",
"Create an account": "\u0394\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03bd\u03ad\u03bf\u03c5 \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03bf\u03cd",
@@ -153,7 +156,7 @@
"Engage with posts": "\u0394\u03b9\u03b1\u03c7\u03b5\u03af\u03c1\u03b9\u03c3\u03b7 \u03b1\u03bd\u03b1\u03c1\u03c4\u03ae\u03c3\u03b5\u03c9\u03bd",
"Enter Due Date and Time": "\u0395\u03b9\u03c3\u03ac\u03b3\u03b1\u03c4\u03b5 \u03b7\u03bc\u03b5\u03c1\u03bf\u03bc\u03b7\u03bd\u03af\u03b1 \u03ba\u03b1\u03b9 \u03ce\u03c1\u03b1 \u03bb\u03ae\u03be\u03b7\u03c2 \u03c4\u03b7\u03c2 \u03c0\u03c1\u03bf\u03b8\u03b5\u03c3\u03bc\u03af\u03b1\u03c2 \u03c5\u03c0\u03bf\u03b2\u03bf\u03bb\u03ae\u03c2",
"Enter a student's username or email address.": "\u03a0\u03b1\u03ba\u03b1\u03bb\u03bf\u03cd\u03bc\u03b5 \u03b5\u03b9\u03c3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03c4\u03bf \u03c8\u03b5\u03c5\u03b4\u03ce\u03bd\u03c5\u03bc\u03bf \u03ae \u03c4\u03bf e-mail \u03ba\u03ac\u03c0\u03bf\u03b9\u03bf\u03c5 \u03c3\u03c0\u03bf\u03c5\u03b4\u03b1\u03c3\u03c4\u03ae..",
- "Enter a username or email.": "\u0395\u03b9\u03c3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03c8\u03b5\u03c5\u03b4\u03ce\u03bd\u03c5\u03bc\u03bf \u03ae e-mail",
+ "Enter a username or email.": "\u0395\u03b9\u03c3\u03b1\u03b3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03c8\u03b5\u03c5\u03b4\u03ce\u03bd\u03c5\u03bc\u03bf \u03ae e-mail",
"Enter and confirm your new password.": "\u0395\u03b9\u03c3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03ba\u03b1\u03b9 \u03b5\u03c0\u03b9\u03b2\u03b5\u03b2\u03b1\u03b9\u03ce\u03c3\u03c4\u03b5 \u03c4\u03bf \u03bd\u03ad\u03bf \u03c3\u03b1\u03c2 \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc.",
"Enter username or email": "\u0395\u03b9\u03c3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03c4\u03bf \u03c8\u03b5\u03c5\u03b4\u03ce\u03bd\u03c5\u03bc\u03bf \u03ae \u03c4\u03bf e-mail \u03c3\u03b1\u03c2",
"Enter your {platform_display_name} username or the URL to your {platform_display_name} page. Delete the URL to remove the link.": "\u0395\u03b9\u03c3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03c4\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7 \u03c3\u03b1\u03c2 \u03c3\u03c4\u03bf {platform_display_name} \u03ae \u03c4\u03b7 \u03b4\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 URL \u03c0\u03c1\u03bf\u03c2 \u03c4\u03b7 \u03c3\u03b5\u03bb\u03af\u03b4\u03b1 \u03c3\u03b1\u03c2 \u03c3\u03c4\u03bf {platform_display_name}. \u0394\u03b9\u03b1\u03b3\u03c1\u03ac\u03c8\u03c4\u03b5 \u03c4\u03b7 \u03b4\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 URL \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03b1\u03c6\u03b1\u03b9\u03c1\u03ad\u03c3\u03b5\u03c4\u03b5 \u03c4\u03bf \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03bc\u03bf.",
@@ -174,6 +177,7 @@
"Full Name": "\u039f\u03bd\u03bf\u03bc\u03b1\u03c4\u03b5\u03c0\u03ce\u03bd\u03c5\u03bc\u03bf",
"Full Profile": "\u03a4\u03b7\u03bd \u03c0\u03bb\u03ae\u03c1\u03b7 \u03c0\u03c1\u03bf\u03c3\u03c9\u03c0\u03b9\u03ba\u03ae \u03bc\u03bf\u03c5 \u03c3\u03b5\u03bb\u03af\u03b4\u03b1",
"Gender": "\u03a6\u03cd\u03bb\u03bf",
+ "Generate Exception Certificates": "\u0394\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03b2\u03b5\u03b2\u03b1\u03b9\u03ce\u03c3\u03b5\u03c9\u03bd",
"Grading": "\u0392\u0391\u0398\u039c\u039f\u039b\u039f\u0393\u0399\u0391",
"Heading": "\u0395\u03c0\u03b9\u03ba\u03b5\u03c6\u03b1\u03bb\u03af\u03b4\u03b1",
"Heading (Ctrl+H)": "\u0395\u03c0\u03b9\u03ba\u03b5\u03c6\u03b1\u03bb\u03af\u03b4\u03b1 (Ctrl+H)",
@@ -310,9 +314,11 @@
"Student": "\u03a3\u03c0\u03bf\u03c5\u03b4\u03b1\u03c3\u03c4\u03ae\u03c2",
"Submit": "\u03a5\u03c0\u03bf\u03b2\u03bf\u03bb\u03ae",
"Successfully enrolled and sent email to the following users:": "\u0395\u03c0\u03b9\u03c4\u03c5\u03c7\u03ae\u03c2 \u03b4\u03ae\u03bb\u03c9\u03c3\u03b7 \u03ba\u03b1\u03b9 \u03b1\u03c0\u03bf\u03c3\u03c4\u03bf\u03bb\u03ae \u03b7\u03bb\u03b5\u03ba\u03c4\u03c1\u03bf\u03bd\u03b9\u03ba\u03bf\u03cd \u03c4\u03b1\u03c7\u03c5\u03b4\u03c1\u03bf\u03bc\u03b5\u03af\u03bf\u03c5 \u03c3\u03c4\u03bf\u03c5\u03c2 \u03b5\u03be\u03ae\u03c2 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b5\u03c2:",
+ "Successfully started task to reset attempts for problem '<%- problem_id %>'. Click the 'Show Task Status' button to see the status of the task.": "\u039e\u03b5\u03ba\u03af\u03bd\u03b7\u03c3\u03b5 \u03bc\u03b5 \u03b5\u03c0\u03b9\u03c4\u03c5\u03c7\u03af\u03b1 \u03b7 \u03b4\u03b9\u03b1\u03b4\u03b9\u03ba\u03b1\u03c3\u03af\u03b1 \u03b3\u03b9\u03b1 \u03b5\u03c0\u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac \u03c4\u03c9\u03bd \u03c0\u03c1\u03bf\u03c3\u03c0\u03b1\u03b8\u03b5\u03b9\u03ce\u03bd \u03b3\u03b9\u03b1 \u03c4\u03bf \u03c4\u03b5\u03c3\u03c4 \"<%- problem_id %>\". \u039a\u03ac\u03bd\u03c4\u03b5 \u03ba\u03bb\u03b9\u03ba \u03c3\u03c4\u03bf \u03ba\u03bf\u03c5\u03bc\u03c0\u03af \"\u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7\u03c2 \u03c4\u03b7\u03c2 \u03b4\u03b9\u03b1\u03b4\u03b9\u03ba\u03b1\u03c3\u03af\u03b1\u03c2\", \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03b4\u03b5\u03af\u03c4\u03b5 \u03c4\u03b7\u03bd \u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7 \u03c4\u03b7\u03c2 \u03c4\u03b7\u03c2 \u03b4\u03b9\u03b1\u03b4\u03b9\u03ba\u03b1\u03c3\u03af\u03b1\u03c2.",
"Support education research by providing additional information": "\u03a3\u03c5\u03bd\u03b5\u03b9\u03c3\u03c6\u03ad\u03c1\u03b5\u03c4\u03b5 \u03c3\u03c4\u03b7\u03bd \u03b5\u03ba\u03c0\u03b1\u03b9\u03b4\u03b5\u03c5\u03c4\u03b9\u03ba\u03ae \u03ad\u03c1\u03b5\u03c5\u03bd\u03b1 \u03b4\u03af\u03bd\u03bf\u03bd\u03c4\u03b1\u03c2 \u03ba\u03ac\u03c0\u03bf\u03b9\u03b5\u03c2 \u03b5\u03c0\u03b9\u03c0\u03bb\u03ad\u03bf\u03bd \u03c0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b5\u03c2.",
"Supported file types: {supportedVideoTypes}": "\u03a3\u03c5\u03bc\u03b2\u03b1\u03c4\u03bf\u03af \u03c4\u03cd\u03c0\u03bf\u03b9 \u03b1\u03c1\u03c7\u03b5\u03af\u03c9\u03bd: {supportedVideoTypes}",
"TOTAL": "\u03a3\u03a5\u039d\u039f\u039b\u039f",
+ "Task Status": "\u039a\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7 \u03c4\u03b7\u03c2 \u03b4\u03b9\u03b1\u03b4\u03b9\u03ba\u03b1\u03c3\u03af\u03b1\u03c2",
"Team Description (Required) *": "\u03a0\u03b5\u03c1\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae \u039f\u03bc\u03ac\u03b4\u03b1\u03c2 (\u03a5\u03c0\u03bf\u03c7\u03c1\u03b5\u03c9\u03c4\u03b9\u03ba\u03cc \u03c0\u03b5\u03b4\u03af\u03bf)*",
"Team Name (Required) *": "\u038c\u03bd\u03bf\u03bc\u03b1 \u039f\u03bc\u03ac\u03b4\u03b1\u03c2 (\u03a5\u03c0\u03bf\u03c7\u03c1\u03b5\u03c9\u03c4\u03b9\u03ba\u03cc \u03c0\u03b5\u03b4\u03af\u03bf)*",
"Terms of Service and Honor Code": "\u038c\u03c1\u03bf\u03b9 \u03c7\u03c1\u03ae\u03c3\u03b7\u03c2 \u03ba\u03b1\u03b9 \u039a\u03ce\u03b4\u03b9\u03ba\u03b1\u03c2 \u03a4\u03b9\u03bc\u03ae\u03c2",
@@ -356,7 +362,7 @@
"URL": "\u0394\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 URL",
"Undo (Ctrl+Z)": "\u0391\u03bd\u03b1\u03af\u03c1\u03b5\u03c3\u03b7 (Ctrl+Z)",
"Undo Changes": "\u0391\u03bd\u03b1\u03af\u03c1\u03b5\u03c3\u03b7 \u03b1\u03bb\u03bb\u03b1\u03b3\u03ce\u03bd",
- "Unendorse": "\u0394\u03b5\u03bd \u03c0\u03c1\u03bf\u03c4\u03b5\u03af\u03bd\u03c9",
+ "Unendorse": "\u0391\u03bd\u03b1\u03af\u03c1\u03b5\u03c3\u03b7 \u03c4\u03b7\u03c2 \u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae\u03c2 \"\u03a0\u03c1\u03bf\u03c4\u03b5\u03af\u03bd\u03c9\"",
"Unit": "\u039a\u03b5\u03c6\u03ac\u03bb\u03b1\u03b9\u03bf",
"Upload File": "\u039c\u03b5\u03c4\u03b1\u03c6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7 \u0391\u03c1\u03c7\u03b5\u03af\u03bf\u03c5",
"Upload New File": "\u039c\u03b5\u03c4\u03b1\u03c6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7 \u03bd\u03ad\u03bf\u03c5 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5",
diff --git a/cms/static/js/i18n/eo/djangojs.js b/cms/static/js/i18n/eo/djangojs.js
index 1d127306f289..fd3ea5bef809 100644
--- a/cms/static/js/i18n/eo/djangojs.js
+++ b/cms/static/js/i18n/eo/djangojs.js
@@ -479,6 +479,7 @@
"Copy": "\u00c7\u00f6p\u00fd \u2c60'\u03c3\u044f\u0454\u043c \u03b9#",
"Copy Component Location": "\u00c7\u00f6p\u00fd \u00c7\u00f6mp\u00f6n\u00e9nt L\u00f6\u00e7\u00e4t\u00ef\u00f6n \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3#",
"Copy Email To Editor": "\u00c7\u00f6p\u00fd \u00c9m\u00e4\u00efl T\u00f6 \u00c9d\u00eft\u00f6r \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, #",
+ "Copy Unit": "\u00c7\u00f6p\u00fd \u00dbn\u00eft \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142#",
"Copy of '{componentDisplayName}'": "\u00c7\u00f6p\u00fd \u00f6f '{componentDisplayName}' \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9#",
"Copy row": "\u00c7\u00f6p\u00fd r\u00f6w \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202#",
"Copy to Clipboard": "\u00c7\u00f6p\u00fd t\u00f6 \u00c7l\u00efp\u00df\u00f6\u00e4rd \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454#",
diff --git a/cms/static/js/i18n/es-419/djangojs.js b/cms/static/js/i18n/es-419/djangojs.js
index 549e97e0b542..587d4c2077cd 100644
--- a/cms/static/js/i18n/es-419/djangojs.js
+++ b/cms/static/js/i18n/es-419/djangojs.js
@@ -599,6 +599,7 @@
"Copy Component Location": "Copiar la ubicaci\u00f3n del Componente",
"Copy Email To Editor": "Copiar el correo al editor",
"Copy Exam Code": "Copia el C\u00f3digo de el Examen",
+ "Copy Unit": "Copiar unidad",
"Copy of '{componentDisplayName}'": "Copia de '{componentDisplayName}'",
"Copy row": "Copiar la fila",
"Copy to Clipboard": "Copiar al portapapeles",
@@ -1232,6 +1233,7 @@
"Manage Learners": "Manejar Estudiantes",
"Manage Tags": "Administrar etiquetas",
"Manage my subscription": "Gestionar mi suscripci\u00f3n",
+ "Manage tags": "Administrar etiquetas",
"Manual": "Manual",
"March": "Marzo",
"Mark Exam As Completed": "Marcar el examen como completado",
diff --git a/cms/static/js/i18n/rtl/djangojs.js b/cms/static/js/i18n/rtl/djangojs.js
index 7e60d7631cf1..193b0b1d599c 100644
--- a/cms/static/js/i18n/rtl/djangojs.js
+++ b/cms/static/js/i18n/rtl/djangojs.js
@@ -444,6 +444,7 @@
"Copy": "\u023b\u00f8d\u028e",
"Copy Component Location": "\u023b\u00f8d\u028e \u023b\u00f8\u026fd\u00f8n\u01ddn\u0287 \u0141\u00f8\u0254\u0250\u0287\u1d09\u00f8n",
"Copy Email To Editor": "\u023b\u00f8d\u028e \u0246\u026f\u0250\u1d09l \u0166\u00f8 \u0246d\u1d09\u0287\u00f8\u0279",
+ "Copy Unit": "\u023b\u00f8d\u028e \u0244n\u1d09\u0287",
"Copy of '{componentDisplayName}'": "\u023b\u00f8d\u028e \u00f8\u025f '{componentDisplayName}'",
"Copy row": "\u023b\u00f8d\u028e \u0279\u00f8\u028d",
"Copy to Clipboard": "\u023b\u00f8d\u028e \u0287\u00f8 \u023bl\u1d09db\u00f8\u0250\u0279d",
diff --git a/cms/static/js/views/pages/container.js b/cms/static/js/views/pages/container.js
index 9a15c779df1a..cea6eb856bd3 100644
--- a/cms/static/js/views/pages/container.js
+++ b/cms/static/js/views/pages/container.js
@@ -177,6 +177,12 @@ function($, _, Backbone, gettext, BasePage,
self.initializePasteButton();
}
+ var targetId = window.location.hash.slice(1);
+ if (targetId) {
+ var target = document.getElementById(targetId);
+ target.scrollIntoView({ behavior: 'smooth', inline: 'center' });
+ }
+
},
block_added: options && options.block_added
});
diff --git a/cms/templates/studio_xblock_wrapper.html b/cms/templates/studio_xblock_wrapper.html
index 4c73f940b9d6..19d9c876ed48 100644
--- a/cms/templates/studio_xblock_wrapper.html
+++ b/cms/templates/studio_xblock_wrapper.html
@@ -43,9 +43,9 @@
% if not is_root:
% if is_reorderable:
-
+
% else:
-
+
% endif
, 2022\n"
"Language-Team: Arabic (http://app.transifex.com/open-edx/edx-platform/language/ar/)\n"
@@ -320,7 +320,8 @@ msgstr "اختر الملف"
#: cms/static/js/views/course_info_update.js
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js
-#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js
+#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js
+#: xmodule/js/src/html/edit.js
#: common/static/common/templates/discussion/templates.underscore
#: lms/templates/learner_dashboard/verification_popover.underscore
msgid "OK"
@@ -6486,6 +6487,7 @@ msgstr "هل أنت واثق من رغبتك في حذف هذا التحديث؟
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/pages/container_subviews.js
msgid "Copying"
msgstr ""
@@ -6495,26 +6497,31 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Pasting"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Some errors occurred"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files could not be added to the course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "You may need to update a file(s) manually"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid ""
"The following files already exist in this course but don't match the version"
" used by the component you pasted:"
@@ -6522,21 +6529,25 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "New file(s) added to Files & Uploads."
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files were imported to this course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "View files"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Dismiss"
msgstr ""
@@ -11266,6 +11277,10 @@ msgstr "إخفاء من المتعلمين"
msgid "Note: Do not hide graded assignments after they have been released."
msgstr "ملاحظة: لا تقم بإخفاء المهام المتدرجة بعد إطلاقها. "
+#: cms/templates/js/publish-xblock.underscore
+msgid "Copy Unit"
+msgstr ""
+
#: cms/templates/js/release-date-editor.underscore
msgid "Release Date and Time"
msgstr "تاريخ وتوقيت الإصدار"
@@ -11457,6 +11472,10 @@ msgstr ""
msgid "Enable summaries"
msgstr ""
+#: cms/templates/js/tag-list.underscore
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/js/team-member.underscore
msgid "Current Role:"
msgstr "الدور الحالي:"
diff --git a/conf/locale/ca/LC_MESSAGES/django.po b/conf/locale/ca/LC_MESSAGES/django.po
index 40b0e7c860ff..3ca71863e871 100644
--- a/conf/locale/ca/LC_MESSAGES/django.po
+++ b/conf/locale/ca/LC_MESSAGES/django.po
@@ -10287,6 +10287,19 @@ msgid ""
"their answers and reshuffle selected items."
msgstr ""
+#: xmodule/library_content_block.py
+msgid "Source content library has not been specified."
+msgstr ""
+
+#: xmodule/library_content_block.py
+msgid "Content libraries are not available in the current runtime."
+msgstr ""
+
+#: xmodule/library_content_block.py
+#, python-brace-format
+msgid "Source content library does not exist: {source_library_id}"
+msgstr ""
+
#: xmodule/library_content_block.py
msgid "This component is out of date. The library has new content."
msgstr ""
@@ -10321,7 +10334,8 @@ msgid "Select a Library."
msgstr ""
#: xmodule/library_content_block.py
-msgid "There are no matching problem types in the specified libraries."
+#, python-brace-format
+msgid "There are no problems in the specified library of type {capa_type}."
msgstr ""
#: xmodule/library_content_block.py
@@ -12363,14 +12377,6 @@ msgstr "Requisits"
msgid "Details"
msgstr "Detalls"
-#. #-#-#-#-# mako.po (edx-platform) #-#-#-#-#
-#. Translators: this is a verb describing the action of viewing more details
-#: cms/templates/studio_xblock_wrapper.html
-#: lms/templates/wiki/includes/article_menu.html
-#: wiki/templates/wiki/includes/article_menu.html
-msgid "View"
-msgstr "Vista"
-
#: cms/templates/maintenance/_announcement_edit.html
#: lms/templates/problem.html lms/templates/word_cloud.html
msgid "Save"
@@ -13147,6 +13153,14 @@ msgstr "Seqüència"
msgid "Completed"
msgstr ""
+#: lms/templates/seq_block.html
+msgid "New Unit"
+msgstr ""
+
+#: lms/templates/seq_block.html
+msgid "Paste as new unit"
+msgstr ""
+
#: lms/templates/signup_modal.html
msgid "Sign Up for {platform_name}"
msgstr "Inscriviu-vos a {platform_name}"
@@ -19055,6 +19069,11 @@ msgstr "Ho tinc!"
msgid "Learn more"
msgstr "Aprèn més"
+#: lms/templates/wiki/includes/article_menu.html
+#: wiki/templates/wiki/includes/article_menu.html
+msgid "View"
+msgstr "Vista"
+
#: lms/templates/wiki/includes/article_menu.html
msgid "{span_start}(active){span_end}"
msgstr "{span_start}(active){span_end}"
@@ -19766,6 +19785,10 @@ msgstr "Veure versió en directe"
msgid "Preview the courseware in the LMS"
msgstr "Previsualitzeu el material informàtic al LMS"
+#: cms/templates/container.html
+msgid "Collapse All"
+msgstr ""
+
#: cms/templates/container.html
msgid "Adding components"
msgstr "Addició de components"
@@ -22737,14 +22760,26 @@ msgstr ""
"També podeu crear tipus d'assignacions, com ara tasques, laboratoris, proves"
" i exàmens, i especificar quant val la pena la qualificació d'un alumne."
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Importing components"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Expand or Collapse"
msgstr "Amplia o redueix"
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Select this problem"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Copy to Clipboard"
msgstr ""
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Manage Access"
msgstr ""
diff --git a/conf/locale/ca/LC_MESSAGES/djangojs.po b/conf/locale/ca/LC_MESSAGES/djangojs.po
index 7900887d2461..4163a7819aae 100644
--- a/conf/locale/ca/LC_MESSAGES/djangojs.po
+++ b/conf/locale/ca/LC_MESSAGES/djangojs.po
@@ -48,7 +48,7 @@ msgid ""
msgstr ""
"Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
-"POT-Creation-Date: 2023-11-19 20:43+0000\n"
+"POT-Creation-Date: 2023-12-03 20:43+0000\n"
"PO-Revision-Date: 2014-06-11 15:18+0000\n"
"Last-Translator: Waheed Ahmed , 2019\n"
"Language-Team: Catalan (http://app.transifex.com/open-edx/edx-platform/language/ca/)\n"
@@ -169,7 +169,8 @@ msgstr "Escull arxiu"
#: cms/static/js/views/course_info_update.js
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js
-#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js
+#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js
+#: xmodule/js/src/html/edit.js
#: common/static/common/templates/discussion/templates.underscore
#: lms/templates/learner_dashboard/verification_popover.underscore
msgid "OK"
@@ -1850,6 +1851,7 @@ msgstr "Resultats de la cerca"
msgid "[no tags]"
msgstr ""
+#. #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-#
#. Translators: 'Tags' is the name of the view (noun) within the Student Notes
#. page that shows all
#. notes organized by the tags the student has associated with them (if any).
@@ -1858,6 +1860,7 @@ msgstr ""
#. with the note
#. in order to group similar notes together and help with search.
#: lms/static/js/edxnotes/views/tabs/tags.js
+#: cms/templates/js/tag-list.underscore
msgid "Tags"
msgstr ""
@@ -5819,6 +5822,7 @@ msgstr "Segur que vols esborrar aquesta actualització?"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/pages/container_subviews.js
msgid "Copying"
msgstr ""
@@ -5828,26 +5832,31 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Pasting"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Some errors occurred"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files could not be added to the course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "You may need to update a file(s) manually"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid ""
"The following files already exist in this course but don't match the version"
" used by the component you pasted:"
@@ -5855,21 +5864,25 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "New file(s) added to Files & Uploads."
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files were imported to this course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "View files"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Dismiss"
msgstr ""
@@ -10560,6 +10573,10 @@ msgstr ""
"Nota: No amagueu les assignacions graduades després d'haver estat "
"alliberades."
+#: cms/templates/js/publish-xblock.underscore
+msgid "Copy Unit"
+msgstr ""
+
#: cms/templates/js/release-date-editor.underscore
msgid "Release Date and Time"
msgstr "Data i hora de publicació"
@@ -10759,6 +10776,10 @@ msgstr ""
msgid "Enable summaries"
msgstr ""
+#: cms/templates/js/tag-list.underscore
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/js/team-member.underscore
msgid "Current Role:"
msgstr "Rol actual:"
diff --git a/conf/locale/de_DE/LC_MESSAGES/django.mo b/conf/locale/de_DE/LC_MESSAGES/django.mo
index 922823b66a5a..5abc0f1668b7 100644
Binary files a/conf/locale/de_DE/LC_MESSAGES/django.mo and b/conf/locale/de_DE/LC_MESSAGES/django.mo differ
diff --git a/conf/locale/de_DE/LC_MESSAGES/django.po b/conf/locale/de_DE/LC_MESSAGES/django.po
index 1bfcdc1dbc6a..a45a2eb18875 100644
--- a/conf/locale/de_DE/LC_MESSAGES/django.po
+++ b/conf/locale/de_DE/LC_MESSAGES/django.po
@@ -11576,6 +11576,19 @@ msgid ""
"their answers and reshuffle selected items."
msgstr ""
+#: xmodule/library_content_block.py
+msgid "Source content library has not been specified."
+msgstr ""
+
+#: xmodule/library_content_block.py
+msgid "Content libraries are not available in the current runtime."
+msgstr ""
+
+#: xmodule/library_content_block.py
+#, python-brace-format
+msgid "Source content library does not exist: {source_library_id}"
+msgstr ""
+
#: xmodule/library_content_block.py
msgid "This component is out of date. The library has new content."
msgstr "Die Aufgabe ist abgelaufen. Die Bibliothek hat neue Inhalte."
@@ -11612,8 +11625,9 @@ msgid "Select a Library."
msgstr "Wählen Sie eine Bibliothek."
#: xmodule/library_content_block.py
-msgid "There are no matching problem types in the specified libraries."
-msgstr "In den angegebenen Bibliotheken gab es keine passenden Aufgabentypen."
+#, python-brace-format
+msgid "There are no problems in the specified library of type {capa_type}."
+msgstr ""
#: xmodule/library_content_block.py
msgid "Select another problem type."
@@ -13896,14 +13910,6 @@ msgstr "Vorraussetzungen"
msgid "Details"
msgstr "Details"
-#. #-#-#-#-# mako.po (edx-platform) #-#-#-#-#
-#. Translators: this is a verb describing the action of viewing more details
-#: cms/templates/studio_xblock_wrapper.html
-#: lms/templates/wiki/includes/article_menu.html
-#: wiki/templates/wiki/includes/article_menu.html
-msgid "View"
-msgstr "Ansicht"
-
#: cms/templates/maintenance/_announcement_edit.html
#: lms/templates/problem.html lms/templates/word_cloud.html
msgid "Save"
@@ -14684,6 +14690,14 @@ msgstr "Ablauf"
msgid "Completed"
msgstr "Beendet"
+#: lms/templates/seq_block.html
+msgid "New Unit"
+msgstr ""
+
+#: lms/templates/seq_block.html
+msgid "Paste as new unit"
+msgstr ""
+
#: lms/templates/signup_modal.html
msgid "Sign Up for {platform_name}"
msgstr "Registrieren bei {platform_name}"
@@ -20759,6 +20773,11 @@ msgstr "Verstanden!"
msgid "Learn more"
msgstr "Lernen Sie mehr"
+#: lms/templates/wiki/includes/article_menu.html
+#: wiki/templates/wiki/includes/article_menu.html
+msgid "View"
+msgstr "Ansicht"
+
#: lms/templates/wiki/includes/article_menu.html
msgid "{span_start}(active){span_end}"
msgstr "{span_start}(aktiv){span_end}"
@@ -21483,6 +21502,10 @@ msgstr "Live-Version betrachten"
msgid "Preview the courseware in the LMS"
msgstr "Vorschau der Kursinhalte im LMS"
+#: cms/templates/container.html
+msgid "Collapse All"
+msgstr ""
+
#: cms/templates/container.html
msgid "Adding components"
msgstr "Komponenten werden hinzugefügt"
@@ -24501,14 +24524,26 @@ msgstr ""
"und Klausuren erstellen. Dann kannst du festlegen, wie viel die Note des "
"Teilnehmers für die jeweilige Aufgabe wert ist."
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Importing components"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Expand or Collapse"
msgstr "Aufklappen oder zusammenlegen"
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Select this problem"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Copy to Clipboard"
msgstr ""
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Manage Access"
msgstr ""
diff --git a/conf/locale/de_DE/LC_MESSAGES/djangojs.po b/conf/locale/de_DE/LC_MESSAGES/djangojs.po
index 51e8e52edebb..e35cba117f03 100644
--- a/conf/locale/de_DE/LC_MESSAGES/djangojs.po
+++ b/conf/locale/de_DE/LC_MESSAGES/djangojs.po
@@ -134,7 +134,7 @@ msgid ""
msgstr ""
"Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
-"POT-Creation-Date: 2023-11-19 20:43+0000\n"
+"POT-Creation-Date: 2023-12-03 20:43+0000\n"
"PO-Revision-Date: 2014-06-11 15:18+0000\n"
"Last-Translator: Alfredo Guillem, 2022\n"
"Language-Team: German (Germany) (http://app.transifex.com/open-edx/edx-platform/language/de_DE/)\n"
@@ -260,7 +260,8 @@ msgstr "Datei auswählen"
#: cms/static/js/views/course_info_update.js
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js
-#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js
+#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js
+#: xmodule/js/src/html/edit.js
#: common/static/common/templates/discussion/templates.underscore
#: lms/templates/learner_dashboard/verification_popover.underscore
msgid "OK"
@@ -6499,6 +6500,7 @@ msgstr "Wollen Sie wirklich die Aktualisierungen löschen?"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/pages/container_subviews.js
msgid "Copying"
msgstr ""
@@ -6508,26 +6510,31 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Pasting"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Some errors occurred"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files could not be added to the course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "You may need to update a file(s) manually"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid ""
"The following files already exist in this course but don't match the version"
" used by the component you pasted:"
@@ -6535,21 +6542,25 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "New file(s) added to Files & Uploads."
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files were imported to this course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "View files"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Dismiss"
msgstr ""
@@ -11416,6 +11427,10 @@ msgstr ""
"Hinweis: Blenden Sie benotete Aufgaben nicht aus, nachdem sie freigegeben "
"wurden."
+#: cms/templates/js/publish-xblock.underscore
+msgid "Copy Unit"
+msgstr ""
+
#: cms/templates/js/release-date-editor.underscore
msgid "Release Date and Time"
msgstr "Freigabedatum und Uhrzeit"
@@ -11614,6 +11629,10 @@ msgstr ""
msgid "Enable summaries"
msgstr ""
+#: cms/templates/js/tag-list.underscore
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/js/team-member.underscore
msgid "Current Role:"
msgstr "Aktuelle Rolle:"
diff --git a/conf/locale/el/LC_MESSAGES/django.mo b/conf/locale/el/LC_MESSAGES/django.mo
index 7e2fe4b064ba..2468bcb2939f 100644
Binary files a/conf/locale/el/LC_MESSAGES/django.mo and b/conf/locale/el/LC_MESSAGES/django.mo differ
diff --git a/conf/locale/el/LC_MESSAGES/django.po b/conf/locale/el/LC_MESSAGES/django.po
index 73da7b9dbc43..5b7fc37c372a 100644
--- a/conf/locale/el/LC_MESSAGES/django.po
+++ b/conf/locale/el/LC_MESSAGES/django.po
@@ -72,6 +72,7 @@
# Konstantina Samara , 2015
# kostas kalatzis , 2015
# Nick Gikopoulos, 2014-2015
+# Ειρήνη Απέργη, 2023
# #-#-#-#-# wiki.po (edx-platform) #-#-#-#-#
# edX community translations have been downloaded from Greek (http://app.transifex.com/open-edx/edx-platform/language/el/)
# Copyright (C) 2023 edX
@@ -273,7 +274,7 @@ msgstr ""
#: common/djangoapps/course_modes/helpers.py
#: lms/templates/instructor/instructor_dashboard_2/course_info.html
msgid "Verified"
-msgstr "Με πιστοποίηση ταυτότητας"
+msgstr "Επαληθευμένοι"
#: common/djangoapps/course_modes/helpers.py
msgid "ID Verified Ribbon/Badge"
@@ -2888,6 +2889,10 @@ msgid ""
" course content but can no longer participate in graded assignments or work "
"towards earning a certificate."
msgstr ""
+"Μετά από αυτήν την ημερομηνία, το μάθημα θα μπει σε καθεστώς αυτομελέτης, "
+"που σημαίνει ότι θα μπορείτε να δείτε το περιεχόμενο του μαθήματος, αλλά δε "
+"θα μπορείτε πλέον να υποβάλετε τα τεστ και την τελική εξέταση για την "
+"απόκτηση της βεβαίωσης παρακολούθησης."
#: lms/djangoapps/courseware/date_summary.py
msgid ""
@@ -3439,6 +3444,8 @@ msgid ""
"The {report_type} report is being created. To view the status of the report,"
" see Pending Tasks below."
msgstr ""
+"Η αναφορά {report_type} δημιουργείται. Για να δείτε την κατάσταση της "
+"αναφοράς, ανατρέξτε στην ενότητα 'Εκκρεμείς διεργασίες' παρακάτω."
#: lms/djangoapps/instructor/views/api.py
msgid ""
@@ -3710,7 +3717,7 @@ msgstr ""
#: lms/djangoapps/instructor/views/api.py
#: lms/djangoapps/instructor_task/api_helper.py
msgid "enrollment"
-msgstr "εγγραφή"
+msgstr "\"Εγγραφή\""
#: lms/djangoapps/instructor/views/api.py
msgid "The file must contain a 'cohort' column containing cohort names."
@@ -4221,6 +4228,9 @@ msgid ""
" see Pending Tasks below. You will be able to download the report when it is"
" complete."
msgstr ""
+"Η αναφορά {report_type} δημιουργείται. Για να δείτε την κατάσταση της "
+"αναφοράς, ανατρέξτε στην ενότητα 'Εκκρεμείς διεργασίες' παρακάτω. Θα "
+"μπορείτε να κάνετε λήψη της αναφοράς, όταν ολοκληρωθεί."
#: lms/djangoapps/instructor_task/api_helper.py
msgid "This component cannot be rescored."
@@ -10533,6 +10543,19 @@ msgid ""
"their answers and reshuffle selected items."
msgstr ""
+#: xmodule/library_content_block.py
+msgid "Source content library has not been specified."
+msgstr ""
+
+#: xmodule/library_content_block.py
+msgid "Content libraries are not available in the current runtime."
+msgstr ""
+
+#: xmodule/library_content_block.py
+#, python-brace-format
+msgid "Source content library does not exist: {source_library_id}"
+msgstr ""
+
#: xmodule/library_content_block.py
msgid "This component is out of date. The library has new content."
msgstr ""
@@ -10567,7 +10590,8 @@ msgid "Select a Library."
msgstr ""
#: xmodule/library_content_block.py
-msgid "There are no matching problem types in the specified libraries."
+#, python-brace-format
+msgid "There are no problems in the specified library of type {capa_type}."
msgstr ""
#: xmodule/library_content_block.py
@@ -12565,12 +12589,6 @@ msgstr ""
msgid "Details"
msgstr ""
-#. Translators: this is a verb describing the action of viewing more details
-#: cms/templates/studio_xblock_wrapper.html
-#: lms/templates/wiki/includes/article_menu.html
-msgid "View"
-msgstr "Προβολή"
-
#: cms/templates/maintenance/_announcement_edit.html
#: lms/templates/problem.html lms/templates/word_cloud.html
msgid "Save"
@@ -12786,7 +12804,7 @@ msgstr ""
#: lms/templates/dashboard.html lms/templates/header/user_dropdown.html
#: lms/templates/user_dropdown.html
msgid "Dashboard"
-msgstr ""
+msgstr "Μαθήματα"
#: lms/templates/dashboard.html
msgid "results successfully populated,"
@@ -13341,6 +13359,14 @@ msgstr ""
msgid "Completed"
msgstr ""
+#: lms/templates/seq_block.html
+msgid "New Unit"
+msgstr ""
+
+#: lms/templates/seq_block.html
+msgid "Paste as new unit"
+msgstr ""
+
#: lms/templates/signup_modal.html
msgid "Sign Up for {platform_name}"
msgstr ""
@@ -13468,12 +13494,12 @@ msgstr ""
#: lms/templates/instructor/instructor_dashboard_2/student_admin.html
#: lms/templates/staff_problem_info.html
msgid "Delete Learner's State"
-msgstr ""
+msgstr "Διαγραφή απαντήσεων και βαθμών"
#: lms/templates/instructor/instructor_dashboard_2/student_admin.html
#: lms/templates/staff_problem_info.html
msgid "Rescore Learner's Submission"
-msgstr ""
+msgstr "Υποβολή αναβαθμολόγησης"
#: lms/templates/instructor/instructor_dashboard_2/student_admin.html
#: lms/templates/staff_problem_info.html
@@ -13503,6 +13529,8 @@ msgstr ""
#: lms/templates/staff_problem_info.html
msgid "Enter the learner email address or username"
msgstr ""
+"Εισαγάγετε τη διεύθυνση ηλεκτρονικού ταχυδρομείου ή το όνομα χρήστη του "
+"φοιτητή"
#: lms/templates/staff_problem_info.html
msgid "View History"
@@ -14701,7 +14729,7 @@ msgstr ""
#: lms/templates/ccx/student_admin.html
msgid "View gradebook"
-msgstr ""
+msgstr "Προβολή βαθμών"
#: lms/templates/ccx/student_admin.html
msgid "Download student grades"
@@ -15634,7 +15662,7 @@ msgstr ""
#: lms/templates/dashboard/_dashboard_certificate_information.html
msgid "View my {cert_name_short}"
-msgstr ""
+msgstr "Δείτε τη {cert_name_short} "
#: lms/templates/dashboard/_dashboard_certificate_information.html
msgid "Complete our course feedback survey"
@@ -16368,6 +16396,11 @@ msgid ""
"your verification was successful.You can also check the status of the "
"verification process on your dashboard."
msgstr ""
+"Λάβαμε τα στοιχεία σας και ξεκίνησε η διαδικασία επαλήθευσης ταυτότητας. "
+"Ελέγξτε αν θα λάβετε μήνυμα ηλεκτρονικού ταχυδρομείου από εμάς τις επόμενες "
+"ημέρες, για να επιβεβαιώσετε αν η επαλήθευσή σας ήταν επιτυχής. Μπορείτε "
+"επίσης να ελέγξετε την κατάσταση της διαδικασίας επαλήθευσης στην καρτέλα "
+"\"Μαθήματα\"."
#: lms/templates/emails/reject_name_change.txt
msgid ""
@@ -16562,7 +16595,7 @@ msgstr "Αναζήτηση Μαθημάτων"
#: lms/templates/header/navbar-logo-header.html
msgid "{name} Dashboard"
-msgstr ""
+msgstr "{name} Μαθήματα"
#: lms/templates/header/navbar-not-authenticated.html
msgid "Supplemental Links"
@@ -16580,7 +16613,7 @@ msgstr ""
#: lms/templates/header/navbar-not-authenticated.html
msgid "Register for free"
-msgstr ""
+msgstr "Εγγραφή"
#: lms/templates/header/user_dropdown.html
msgid "Profile"
@@ -16693,7 +16726,7 @@ msgstr ""
#: lms/templates/instructor/instructor_dashboard_2/send_email.html
#: lms/templates/instructor/instructor_dashboard_2/student_admin.html
msgid "Pending Tasks"
-msgstr ""
+msgstr "Εκκρεμείς διαδικασίες"
#: lms/templates/instructor/instructor_dashboard_2/certificates.html
#: lms/templates/instructor/instructor_dashboard_2/course_info.html
@@ -16760,7 +16793,7 @@ msgstr ""
#: lms/templates/instructor/instructor_dashboard_2/certificates.html
msgid "Invalidate Certificates"
-msgstr ""
+msgstr "Ακύρωση βεβαιώσεων"
#: lms/templates/instructor/instructor_dashboard_2/course_info.html
msgid "Enrollment Information"
@@ -16776,7 +16809,7 @@ msgstr "Ακροατές"
#: lms/templates/instructor/instructor_dashboard_2/course_info.html
msgid "Honor"
-msgstr "Με Κώδικα Τιμής."
+msgstr "Με κώδικα τιμής"
#: lms/templates/instructor/instructor_dashboard_2/course_info.html
msgid "Professional"
@@ -16861,10 +16894,14 @@ msgid ""
"exams and problem sets), and can be changed on the 'Grading' page (under "
"'Settings') in Studio."
msgstr ""
+"Κάντε κλικ, για να εμφανίσετε τη διαμόρφωση βαθμολογίας για το μάθημα. Η "
+"διαμόρφωση βαθμολογίας είναι η ανάλυση των βαθμολογούμενων κεφαλαίων του "
+"μαθήματος (όπως τεστ και τελική εξέταση) και μπορεί να αλλάξει στη σελίδα "
+"\"Βαθμολογία\" (στην καρτέλα \"Ρυθμίσεις\") στο Studio."
#: lms/templates/instructor/instructor_dashboard_2/data_download.html
msgid "Grading Configuration"
-msgstr ""
+msgstr "Διαμόρφωση βαθμολογίας"
#: lms/templates/instructor/instructor_dashboard_2/data_download.html
msgid ""
@@ -16884,18 +16921,30 @@ msgid ""
"background, meaning it is OK to navigate away from this page while your "
"report is generating."
msgstr ""
+"Για μεγάλα μαθήματα, η δημιουργία ορισμένων αναφορών μπορεί να διαρκέσει "
+"αρκετές ώρες. Όταν ολοκληρωθεί η δημιουργία αναφορών, ένας σύνδεσμος που "
+"περιλαμβάνει την ημερομηνία και την ώρα δημιουργίας εμφανίζεται στον "
+"παρακάτω πίνακα. Αυτές οι αναφορές δημιουργούνται στο παρασκήνιο, που "
+"σημαίνει ότι μπορείτε να απομακρυνθείτε από αυτήν τη σελίδα κατά τη "
+"δημιουργία της αναφοράς σας."
#: lms/templates/instructor/instructor_dashboard_2/data_download.html
msgid ""
"Please be patient and do not click these buttons multiple times. Clicking "
"these buttons multiple times will significantly slow the generation process."
msgstr ""
+"Παρακαλούμε να είστε υπομονετικοί και μην κάνετε πολλές φορές κλικ σε αυτά "
+"τα κουμπιά. Εάν κάνετε πολλές φορές κλικ σε αυτά τα κουμπιά, θα επιβραδυνθεί"
+" σημαντικά η διαδικασία δημιουργίας."
#: lms/templates/instructor/instructor_dashboard_2/data_download.html
msgid ""
"Click to generate a CSV file of all students enrolled in this course, along "
"with profile information such as email address and username:"
msgstr ""
+"Κάνετε κλικ, για να δημιουργήσετε ένα αρχείο CSV όλων των φοιτητών που είναι"
+" εγγεγραμμένοι σε αυτό το μάθημα, μαζί με πληροφορίες της προσωπικής σελίδας"
+" τους, όπως email και όνομα χρήστη:"
#: lms/templates/instructor/instructor_dashboard_2/data_download.html
msgid "Download profile information as a CSV"
@@ -16906,18 +16955,20 @@ msgid ""
"Click to generate a CSV file that lists learners who can enroll in the "
"course but have not yet done so."
msgstr ""
+"Κάνετε κλικ, για να δημιουργήσετε ένα αρχείο CSV με τη λίστα φοιτητών που "
+"μπορούν να εγγραφούν στο μάθημα, αλλά δεν το έχουν κάνει ακόμη."
#: lms/templates/instructor/instructor_dashboard_2/data_download.html
msgid "Download a CSV of learners who can enroll"
-msgstr ""
+msgstr "Λήψη CSV "
#: lms/templates/instructor/instructor_dashboard_2/data_download.html
msgid "Click to download a CSV of anonymized student IDs:"
-msgstr ""
+msgstr "Κάνετε κλικ για λήψη ενός αρχείου CSV με τα ανώνυμα IDs των φοιτητών:"
#: lms/templates/instructor/instructor_dashboard_2/data_download.html
msgid "Get Student Anonymized IDs CSV"
-msgstr ""
+msgstr "Λήψη CSV"
#: lms/templates/instructor/instructor_dashboard_2/data_download.html
msgid ""
@@ -16942,6 +16993,9 @@ msgid ""
"the problem. You also select a section or chapter to include results of all "
"problems in that section or chapter."
msgstr ""
+"Επιλέξτε ένα τεστ, για να δημιουργήσετε ένα αρχείο CSV με όλες τις "
+"απαντήσεις των μαθητών στο συγκεκριμένο τεστ. Μπορείτε επίσης να επιλέξετε "
+"μια ενότητα ή κεφάλαιο, για να συμπεριλάβετε τα αποτελέσματα όλων των τεστ."
#: lms/templates/instructor/instructor_dashboard_2/data_download.html
#: lms/templates/instructor/instructor_dashboard_2/data_download_2/problem_report.html
@@ -16961,14 +17015,16 @@ msgstr ""
#: lms/templates/instructor/instructor_dashboard_2/data_download_2/certificates.html
msgid "Click to list certificates that are issued for this course:"
msgstr ""
+"Κάνετε κλικ, για να δημιουργήσετε μια λίστα των βεβαιώσεων που εκδόθηκαν για"
+" αυτό το μάθημα:"
#: lms/templates/instructor/instructor_dashboard_2/data_download.html
msgid "View Certificates Issued"
-msgstr ""
+msgstr "Προβολή βεβαιώσεων"
#: lms/templates/instructor/instructor_dashboard_2/data_download.html
msgid "Download CSV of Certificates Issued"
-msgstr ""
+msgstr "Λήψη CSV"
#: lms/templates/instructor/instructor_dashboard_2/data_download.html
msgid ""
@@ -16985,6 +17041,8 @@ msgstr ""
msgid ""
"Click to generate a CSV grade report for all currently enrolled students."
msgstr ""
+"Κάνετε κλικ, για να δημιουργήσετε μια αναφορά βαθμολογίας σε μορφή CSV για "
+"όλους τους εγγεγραμμένους φοιτητές."
#: lms/templates/instructor/instructor_dashboard_2/data_download.html
msgid "Generate Grade Report"
@@ -16992,7 +17050,7 @@ msgstr ""
#: lms/templates/instructor/instructor_dashboard_2/data_download.html
msgid "Generate Problem Grade Report"
-msgstr ""
+msgstr "Δημιουργία αναφοράς βαθμολογίας τεστ"
#: lms/templates/instructor/instructor_dashboard_2/data_download.html
msgid "Generate ORA Data Report"
@@ -17007,6 +17065,8 @@ msgid ""
"Click to generate a ZIP file that contains all submission texts and "
"attachments."
msgstr ""
+"Κάντε κλικ για να δημιουργήσετε ένα αρχείο ZIP με όλα τα κείμενα και τα "
+"συνημμένα που έχουν υποβληθεί."
#: lms/templates/instructor/instructor_dashboard_2/data_download.html
msgid "Generate Submission Files Archive"
@@ -17104,6 +17164,8 @@ msgstr ""
msgid ""
"Specify the {platform_name} email address or username of a student here:"
msgstr ""
+"Συμπληρώστε τη διεύθυνση ηλεκτρονικού ταχυδρομείου που έχει δηλωθεί στο "
+"{platform_name} ή το όνομα χρήστη του φοιτητή, εδώ:"
#: lms/templates/instructor/instructor_dashboard_2/extensions.html
msgid "Student Email or Username"
@@ -17147,7 +17209,7 @@ msgstr ""
#: lms/templates/instructor/instructor_dashboard_2/extensions.html
msgid "List all students with due date extensions"
-msgstr ""
+msgstr "Λίστα φοιτητών"
#: lms/templates/instructor/instructor_dashboard_2/extensions.html
msgid "Specify a student to see all of that student's extensions."
@@ -17167,6 +17229,9 @@ msgid ""
"on a particular subsection. This will revert the due date for the student "
"back to the problem's original due date."
msgstr ""
+"Η επαναφορά της ημερομηνίας λήξης ενός τεστ ακυρώνει την παράταση προθεσμίας"
+" για έναν φοιτητή σε ένα συγκεκριμένο κεφάλαιο. Αυτό θα επαναφέρει την "
+"ημερομηνία λήξης για τον μαθητή στην αρχική ημερομηνία λήξης του τεστ."
#: lms/templates/instructor/instructor_dashboard_2/extensions.html
msgid "Reason for reset"
@@ -17715,7 +17780,7 @@ msgstr ""
#: lms/templates/instructor/instructor_dashboard_2/student_admin.html
msgid "View Gradebook"
-msgstr ""
+msgstr "Προβολή βαθμών"
#: lms/templates/instructor/instructor_dashboard_2/student_admin.html
msgid ""
@@ -17725,7 +17790,7 @@ msgstr ""
#: lms/templates/instructor/instructor_dashboard_2/student_admin.html
msgid "View a specific learner's enrollment status"
-msgstr ""
+msgstr "Δείτε την κατάσταση εγγραφής ενός συγκεκριμένου φοιτητή"
#: lms/templates/instructor/instructor_dashboard_2/student_admin.html
msgid "Learner's {platform_name} email address or username *"
@@ -17733,7 +17798,7 @@ msgstr ""
#: lms/templates/instructor/instructor_dashboard_2/student_admin.html
msgid "Learner email address or username"
-msgstr ""
+msgstr "Διεύθυνση ηλεκτρονικού ταχυδρομείου ή όνομα χρήστη φοιτητή"
#: lms/templates/instructor/instructor_dashboard_2/student_admin.html
msgid "View Enrollment Status"
@@ -17753,7 +17818,7 @@ msgstr ""
#: lms/templates/instructor/instructor_dashboard_2/student_admin.html
msgid "Adjust a learner's grade for a specific problem"
-msgstr ""
+msgstr "Προσαρμόστε τη βαθμολογία ενός φοιτητή για ένα συγκεκριμένο τεστ"
#: lms/templates/instructor/instructor_dashboard_2/student_admin.html
msgid "Location of problem in course"
@@ -17790,6 +17855,9 @@ msgid ""
"Only If Score Improves' option updates the learner's score only if it "
"improves in the learner's favor."
msgstr ""
+"Για το καθορισμένο πρόβλημα, βαθμολογήστε ξανά τις απαντήσεις του φοιτητή. Η"
+" επιλογή \"Αναβαθμολόγηση μόνο για βελτίωση της βαθμολογίας\" ενημερώνει τη "
+"βαθμολογία του φοιτητή, μόνο εάν βελτιωθεί προς όφελός του."
#: lms/templates/instructor/instructor_dashboard_2/student_admin.html
msgid "Score Override"
@@ -17803,6 +17871,8 @@ msgstr ""
msgid ""
"New score for problem, out of the total points available for the problem"
msgstr ""
+"Νέα βαθμολογία για το τεστ, από τους συνολικούς διαθέσιμους βαθμούς για το "
+"τεστ"
#: lms/templates/instructor/instructor_dashboard_2/student_admin.html
msgid "Score"
@@ -17814,7 +17884,7 @@ msgstr ""
#: lms/templates/instructor/instructor_dashboard_2/student_admin.html
msgid "Problem History"
-msgstr ""
+msgstr "Ιστορικό ενός τεστ"
#: lms/templates/instructor/instructor_dashboard_2/student_admin.html
msgid ""
@@ -17824,7 +17894,7 @@ msgstr ""
#: lms/templates/instructor/instructor_dashboard_2/student_admin.html
msgid "Task Status"
-msgstr ""
+msgstr "Κατάσταση διαδικασίας"
#: lms/templates/instructor/instructor_dashboard_2/student_admin.html
msgid ""
@@ -17890,6 +17960,8 @@ msgstr ""
#: lms/templates/instructor/instructor_dashboard_2/student_admin.html
msgid "Adjust all enrolled learners' grades for a specific problem"
msgstr ""
+"Προσαρμόστε τους βαθμούς όλων των εγγεγραμμένων φοιτητών για ένα "
+"συγκεκριμένο τεστ"
#: lms/templates/instructor/instructor_dashboard_2/student_admin.html
msgid "Allows all learners to work on the problem again."
@@ -17900,6 +17972,9 @@ msgid ""
"Rescore submitted responses. The 'Rescore Only If Scores Improve' option "
"updates a learner's score only if it improves in the learner's favor."
msgstr ""
+"Αναβαθμολογήστε τις απαντήσεις που υποβλήθηκαν. Η επιλογή \"Αναβαθμολόγηση "
+"μόνο για βελτίωση της βαθμολογίας\" ενημερώνει τη βαθμολογία ενός φοιτητή, "
+"μόνο εάν βελτιωθεί προς όφελός του."
#: lms/templates/instructor/instructor_dashboard_2/student_admin.html
msgid "Rescore All Learners' Submissions"
@@ -17907,7 +17982,7 @@ msgstr ""
#: lms/templates/instructor/instructor_dashboard_2/student_admin.html
msgid "Rescore Only If Scores Improve"
-msgstr ""
+msgstr "Αναβαθμολόγηση μόνο για τη βελτίωση της βαθμολογίας"
#: lms/templates/instructor/instructor_dashboard_2/student_admin.html
msgid "Show the status for the tasks that you submitted for this problem."
@@ -17933,10 +18008,14 @@ msgid ""
"course (such as exams and problem sets), and can be changed "
"on the 'Grading' page (under 'Settings') in Studio."
msgstr ""
+"Κάντε κλικ, για να εμφανίσετε τη διαμόρφωση βαθμολογίας για το μάθημα. Η "
+"διαμόρφωση βαθμολογίας είναι η ανάλυση των βαθμολογούμενων κεφαλαίων του "
+"μαθήματος (όπως τεστ και τελική εξέταση) και μπορεί να αλλάξει στη σελίδα "
+"\"Βαθμολόγηση\" (στην καρτέλα \"Ρυθμίσεις\") στο Studio."
#: lms/templates/instructor/instructor_dashboard_2/data_download_2/reports.html
msgid "Click to download a CSV of anonymized student IDs:"
-msgstr ""
+msgstr "Κάνετε κλικ για λήψη ενός αρχείου CSV με τα ανώνυμα IDs των φοιτητών:"
#: lms/templates/instructor/instructor_dashboard_2/data_download_2/reports.html
msgid ""
@@ -17954,6 +18033,9 @@ msgid ""
"times. Clicking these buttons multiple times will significantly slow the "
"generation process."
msgstr ""
+"Παρακαλούμε να είστε υπομονετικοί και μην κάνετε πολλές φορές κλικ σε αυτά "
+"τα κουμπιά. Εάν κάνετε πολλές φορές κλικ σε αυτά τα κουμπιά, θα επιβραδυνθεί"
+" σημαντικά η διαδικασία δημιουργίας."
#: lms/templates/instructor/instructor_dashboard_2/data_download_2/reports.html
msgid ""
@@ -18545,6 +18627,10 @@ msgstr ""
msgid "Learn more"
msgstr ""
+#: lms/templates/wiki/includes/article_menu.html
+msgid "View"
+msgstr "Προβολή"
+
#: lms/templates/wiki/includes/article_menu.html
msgid "{span_start}(active){span_end}"
msgstr ""
@@ -19226,6 +19312,10 @@ msgstr ""
msgid "Preview the courseware in the LMS"
msgstr ""
+#: cms/templates/container.html
+msgid "Collapse All"
+msgstr ""
+
#: cms/templates/container.html
msgid "Adding components"
msgstr ""
@@ -21775,14 +21865,26 @@ msgid ""
"worth."
msgstr ""
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Importing components"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Expand or Collapse"
msgstr ""
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Select this problem"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Copy to Clipboard"
msgstr ""
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Manage Access"
msgstr ""
@@ -22110,7 +22212,7 @@ msgstr ""
#: cms/templates/widgets/header.html
msgid "Export"
-msgstr ""
+msgstr "Εξαγωγή"
#: cms/templates/widgets/header.html
msgid "Current Library:"
diff --git a/conf/locale/el/LC_MESSAGES/djangojs.mo b/conf/locale/el/LC_MESSAGES/djangojs.mo
index 0a6baa057d0f..3da828bf34e1 100644
Binary files a/conf/locale/el/LC_MESSAGES/djangojs.mo and b/conf/locale/el/LC_MESSAGES/djangojs.mo differ
diff --git a/conf/locale/el/LC_MESSAGES/djangojs.po b/conf/locale/el/LC_MESSAGES/djangojs.po
index e28fab6adb2c..d288f0525f57 100644
--- a/conf/locale/el/LC_MESSAGES/djangojs.po
+++ b/conf/locale/el/LC_MESSAGES/djangojs.po
@@ -20,6 +20,7 @@
# Rafaela Polykandrioti , 2015
# STERGIOU IOANNIS , 2014
# kafroulitsa , 2014
+# Ειρήνη Απέργη, 2023
# #-#-#-#-# djangojs-studio.po (edx-platform) #-#-#-#-#
# edX community translations have been downloaded from Greek (http://app.transifex.com/open-edx/edx-platform/language/el/).
# Copyright (C) 2023 EdX
@@ -41,6 +42,7 @@
# STERGIOU IOANNIS , 2014
# Theofilos Chamalis , 2014-2015
# Vassia Kouremenou , 2016
+# Ειρήνη Απέργη, 2023
# #-#-#-#-# djangojs-account-settings-view.po (0.1a) #-#-#-#-#
# edX community translations have been downloaded from Greek (https://app.transifex.com/open-edx/teams/6205/el/).
# Copyright (C) 2023 EdX
@@ -83,13 +85,14 @@
# kostas kalatzis , 2015
# STERGIOU IOANNIS , 2014
# Vassia Kouremenou , 2016
+# Ειρήνη Απέργη, 2023
msgid ""
msgstr ""
"Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
-"POT-Creation-Date: 2023-11-19 20:43+0000\n"
+"POT-Creation-Date: 2023-12-03 20:43+0000\n"
"PO-Revision-Date: 2014-06-11 15:18+0000\n"
-"Last-Translator: Angelos Chraniotis, 2023\n"
+"Last-Translator: Ειρήνη Απέργη, 2023\n"
"Language-Team: Greek (http://app.transifex.com/open-edx/edx-platform/language/el/)\n"
"Language: el\n"
"MIME-Version: 1.0\n"
@@ -193,7 +196,8 @@ msgstr "Επιλέξτε αρχείο"
#: cms/static/js/views/course_info_update.js
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js
-#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js
+#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js
+#: xmodule/js/src/html/edit.js
#: common/static/common/templates/discussion/templates.underscore
#: lms/templates/learner_dashboard/verification_popover.underscore
msgid "OK"
@@ -687,7 +691,7 @@ msgstr ""
#: lms/djangoapps/instructor/static/instructor/ProblemBrowser/components/Main/Main.jsx
msgid "Create a report of problem responses"
-msgstr ""
+msgstr "Δημιουργία αναφοράς"
#: lms/djangoapps/instructor/static/instructor/ProblemBrowser/components/ReportStatus/ReportStatus.jsx
msgid "Your report is being generated..."
@@ -1681,12 +1685,16 @@ msgid ""
"Are you sure you want to unenroll from the verified {certNameLong} track of"
" {courseName} ({courseNumber})?"
msgstr ""
+"Θέλετε σίγουρα να διαγραφείτε από το μάθημα {certNameLong} {courseName} "
+"({courseNumber});"
#: lms/static/js/dashboard/legacy.js
msgid ""
"Are you sure you want to unenroll from the verified {certNameLong} track of "
"{courseName} ({courseNumber})?"
msgstr ""
+"Θέλετε σίγουρα να διαγραφείτε από το μάθημα {certNameLong} {courseName} "
+"({courseNumber});"
#: lms/static/js/dashboard/legacy.js
msgid ""
@@ -1933,6 +1941,7 @@ msgstr "Αποτελέσματα Αναζήτησης"
msgid "[no tags]"
msgstr ""
+#. #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-#
#. Translators: 'Tags' is the name of the view (noun) within the Student Notes
#. page that shows all
#. notes organized by the tags the student has associated with them (if any).
@@ -1941,6 +1950,7 @@ msgstr ""
#. with the note
#. in order to group similar notes together and help with search.
#: lms/static/js/edxnotes/views/tabs/tags.js
+#: cms/templates/js/tag-list.underscore
msgid "Tags"
msgstr ""
@@ -1973,7 +1983,7 @@ msgstr ""
#: lms/static/js/groups/views/cohort_editor.js
msgid "Enter a username or email."
-msgstr "Εισάγετε ψευδώνυμο ή e-mail"
+msgstr "Εισαγάγετε ψευδώνυμο ή e-mail"
#: lms/static/js/groups/views/cohort_editor.js
msgid "{numUsersAdded} learner has been added to this cohort. "
@@ -2572,6 +2582,9 @@ msgid ""
"Successfully started task to reset attempts for problem '<%- problem_id %>'."
" Click the 'Show Task Status' button to see the status of the task."
msgstr ""
+"Ξεκίνησε με επιτυχία η διαδικασία για επαναφορά των προσπαθειών για το τεστ "
+"\"<%- problem_id %>\". Κάντε κλικ στο κουμπί \"Εμφάνιση κατάστασης της "
+"διαδικασίας\", για να δείτε την κατάσταση της της διαδικασίας."
#: lms/static/js/instructor_dashboard/student_admin.js
msgid ""
@@ -2691,7 +2704,7 @@ msgstr ""
#. sending email
#: lms/static/js/instructor_dashboard/util.js
msgid "Task Status"
-msgstr ""
+msgstr "Κατάσταση της διαδικασίας"
#. Translators: a "Task" is a background process such as grading students or
#. sending email
@@ -5978,6 +5991,7 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/pages/container_subviews.js
msgid "Copying"
msgstr ""
@@ -5987,26 +6001,31 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Pasting"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Some errors occurred"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files could not be added to the course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "You may need to update a file(s) manually"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid ""
"The following files already exist in this course but don't match the version"
" used by the component you pasted:"
@@ -6014,21 +6033,25 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "New file(s) added to Files & Uploads."
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files were imported to this course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "View files"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Dismiss"
msgstr ""
@@ -7304,7 +7327,7 @@ msgstr "Προτείνω"
#: common/static/common/templates/discussion/templates.underscore
msgid "Unendorse"
-msgstr "Δεν προτείνω"
+msgstr "Αναίρεση της επιλογής \"Προτείνω\""
#: common/static/common/templates/discussion/templates.underscore
msgid "Mark as Answer"
@@ -7923,7 +7946,7 @@ msgstr ""
#: lms/templates/instructor/instructor_dashboard_2/certificate-allowlist.underscore
msgid "Generate Exception Certificates"
-msgstr ""
+msgstr "Δημιουργία βεβαιώσεων"
#: lms/templates/instructor/instructor_dashboard_2/certificate-allowlist.underscore
msgid "Certificate exceptions group selection"
@@ -10522,6 +10545,10 @@ msgstr ""
msgid "Note: Do not hide graded assignments after they have been released."
msgstr ""
+#: cms/templates/js/publish-xblock.underscore
+msgid "Copy Unit"
+msgstr ""
+
#: cms/templates/js/release-date-editor.underscore
msgid "Release Date and Time"
msgstr ""
@@ -10700,6 +10727,10 @@ msgstr ""
msgid "Enable summaries"
msgstr ""
+#: cms/templates/js/tag-list.underscore
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/js/team-member.underscore
msgid "Current Role:"
msgstr ""
diff --git a/conf/locale/en/LC_MESSAGES/django.po b/conf/locale/en/LC_MESSAGES/django.po
index b17083a1e1be..36b7326d387c 100644
--- a/conf/locale/en/LC_MESSAGES/django.po
+++ b/conf/locale/en/LC_MESSAGES/django.po
@@ -38,8 +38,8 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.1a\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
-"POT-Creation-Date: 2023-11-26 20:36+0000\n"
-"PO-Revision-Date: 2023-11-26 20:36:15.034816\n"
+"POT-Creation-Date: 2023-12-05 14:25+0000\n"
+"PO-Revision-Date: 2023-12-05 14:25:08.102305\n"
"Last-Translator: \n"
"Language-Team: openedx-translation \n"
"Language: en\n"
@@ -7409,6 +7409,10 @@ msgstr ""
msgid "The '{field_name}' field cannot be edited."
msgstr ""
+#: openedx/core/djangoapps/user_api/accounts/api.py
+msgid "Full name can't be longer than 255 symbols"
+msgstr ""
+
#: openedx/core/djangoapps/user_api/accounts/api.py
#: openedx/core/djangoapps/user_authn/views/registration_form.py
msgid "Enter a valid name"
@@ -11678,13 +11682,11 @@ msgid "{previous_groups}, {current_group}"
msgstr ""
#: cms/djangoapps/contentstore/utils.py
-#: cms/djangoapps/contentstore/xblock_storage_handlers/view_handlers.py
#, python-brace-format
msgid "Duplicate of {0}"
msgstr ""
#: cms/djangoapps/contentstore/utils.py
-#: cms/djangoapps/contentstore/xblock_storage_handlers/view_handlers.py
#, python-brace-format
msgid "Duplicate of '{0}'"
msgstr ""
@@ -13097,6 +13099,14 @@ msgstr ""
msgid "Completed"
msgstr ""
+#: lms/templates/seq_block.html
+msgid "New Unit"
+msgstr ""
+
+#: lms/templates/seq_block.html
+msgid "Paste as new unit"
+msgstr ""
+
#: lms/templates/signup_modal.html
msgid "Sign Up for {platform_name}"
msgstr ""
diff --git a/conf/locale/en/LC_MESSAGES/djangojs.po b/conf/locale/en/LC_MESSAGES/djangojs.po
index 824b30d5612b..e4076508b11f 100644
--- a/conf/locale/en/LC_MESSAGES/djangojs.po
+++ b/conf/locale/en/LC_MESSAGES/djangojs.po
@@ -32,8 +32,8 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.1a\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
-"POT-Creation-Date: 2023-11-26 20:36+0000\n"
-"PO-Revision-Date: 2023-11-26 20:36:15.164044\n"
+"POT-Creation-Date: 2023-12-05 14:24+0000\n"
+"PO-Revision-Date: 2023-12-05 14:25:07.995704\n"
"Last-Translator: \n"
"Language-Team: openedx-translation \n"
"Language: en\n"
@@ -158,7 +158,8 @@ msgstr ""
#: cms/static/js/views/course_info_update.js
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js
-#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js
+#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js
+#: xmodule/js/src/html/edit.js
#: common/static/common/templates/discussion/templates.underscore
#: lms/templates/learner_dashboard/verification_popover.underscore
msgid "OK"
@@ -5848,6 +5849,7 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/pages/container_subviews.js
msgid "Copying"
msgstr ""
@@ -5857,26 +5859,31 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Pasting"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Some errors occurred"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files could not be added to the course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "You may need to update a file(s) manually"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid ""
"The following files already exist in this course but don't match the version"
" used by the component you pasted:"
@@ -5884,21 +5891,25 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "New file(s) added to Files & Uploads."
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files were imported to this course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "View files"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Dismiss"
msgstr ""
@@ -10355,6 +10366,10 @@ msgstr ""
msgid "Note: Do not hide graded assignments after they have been released."
msgstr ""
+#: cms/templates/js/publish-xblock.underscore
+msgid "Copy Unit"
+msgstr ""
+
#: cms/templates/js/release-date-editor.underscore
msgid "Release Date and Time"
msgstr ""
diff --git a/conf/locale/eo/LC_MESSAGES/django.mo b/conf/locale/eo/LC_MESSAGES/django.mo
index b1f16e0ef6ab..225a11373c3f 100644
Binary files a/conf/locale/eo/LC_MESSAGES/django.mo and b/conf/locale/eo/LC_MESSAGES/django.mo differ
diff --git a/conf/locale/eo/LC_MESSAGES/django.po b/conf/locale/eo/LC_MESSAGES/django.po
index 7135bb5e5d14..7165b60820fe 100644
--- a/conf/locale/eo/LC_MESSAGES/django.po
+++ b/conf/locale/eo/LC_MESSAGES/django.po
@@ -38,8 +38,8 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.1a\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
-"POT-Creation-Date: 2023-11-26 20:36+0000\n"
-"PO-Revision-Date: 2023-11-26 20:36:15.034816\n"
+"POT-Creation-Date: 2023-12-05 14:25+0000\n"
+"PO-Revision-Date: 2023-12-05 14:25:08.102305\n"
"Last-Translator: \n"
"Language-Team: openedx-translation \n"
"Language: eo\n"
@@ -9446,6 +9446,12 @@ msgstr ""
"Thé '{field_name}' fïéld çännöt ßé édïtéd. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, "
"¢σηѕє¢тє#"
+#: openedx/core/djangoapps/user_api/accounts/api.py
+msgid "Full name can't be longer than 255 symbols"
+msgstr ""
+"Füll nämé çän't ßé löngér thän 255 sýmßöls Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, "
+"¢σηѕє¢тєтυя #"
+
#: openedx/core/djangoapps/user_api/accounts/api.py
#: openedx/core/djangoapps/user_authn/views/registration_form.py
msgid "Enter a valid name"
@@ -15113,13 +15119,11 @@ msgid "{previous_groups}, {current_group}"
msgstr "{previous_groups}, {current_group} Ⱡ'σяєм ιρѕυм ∂#"
#: cms/djangoapps/contentstore/utils.py
-#: cms/djangoapps/contentstore/xblock_storage_handlers/view_handlers.py
#, python-brace-format
msgid "Duplicate of {0}"
msgstr "Düplïçäté öf {0} Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αм#"
#: cms/djangoapps/contentstore/utils.py
-#: cms/djangoapps/contentstore/xblock_storage_handlers/view_handlers.py
#, python-brace-format
msgid "Duplicate of '{0}'"
msgstr "Düplïçäté öf '{0}' Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт#"
@@ -16797,6 +16801,14 @@ msgstr "Séqüénçé Ⱡ'σяєм ιρѕυм ∂#"
msgid "Completed"
msgstr "Çömplétéd Ⱡ'σяєм ιρѕυм ∂σł#"
+#: lms/templates/seq_block.html
+msgid "New Unit"
+msgstr "Néw Ûnït Ⱡ'σяєм ιρѕυм ∂#"
+
+#: lms/templates/seq_block.html
+msgid "Paste as new unit"
+msgstr "Pästé äs néw ünït Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмє#"
+
#: lms/templates/signup_modal.html
msgid "Sign Up for {platform_name}"
msgstr "Sïgn Ûp för {platform_name} Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт α#"
diff --git a/conf/locale/eo/LC_MESSAGES/djangojs.mo b/conf/locale/eo/LC_MESSAGES/djangojs.mo
index a840206baca8..5be56f498854 100644
Binary files a/conf/locale/eo/LC_MESSAGES/djangojs.mo and b/conf/locale/eo/LC_MESSAGES/djangojs.mo differ
diff --git a/conf/locale/eo/LC_MESSAGES/djangojs.po b/conf/locale/eo/LC_MESSAGES/djangojs.po
index 442cc79d83ae..d15f6719eb33 100644
--- a/conf/locale/eo/LC_MESSAGES/djangojs.po
+++ b/conf/locale/eo/LC_MESSAGES/djangojs.po
@@ -32,8 +32,8 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.1a\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
-"POT-Creation-Date: 2023-11-26 20:36+0000\n"
-"PO-Revision-Date: 2023-11-26 20:36:15.164044\n"
+"POT-Creation-Date: 2023-12-05 14:24+0000\n"
+"PO-Revision-Date: 2023-12-05 14:25:07.995704\n"
"Last-Translator: \n"
"Language-Team: openedx-translation \n"
"Language: eo\n"
@@ -158,7 +158,8 @@ msgstr "Çhöösé Fïlé Ⱡ'σяєм ιρѕυм ∂σłσя #"
#: cms/static/js/views/course_info_update.js
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js
-#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js
+#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js
+#: xmodule/js/src/html/edit.js
#: common/static/common/templates/discussion/templates.underscore
#: lms/templates/learner_dashboard/verification_popover.underscore
msgid "OK"
@@ -7036,6 +7037,7 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/pages/container_subviews.js
msgid "Copying"
msgstr "Çöpýïng Ⱡ'σяєм ιρѕυм #"
@@ -7045,16 +7047,19 @@ msgstr "Çöpý öf '{componentDisplayName}' Ⱡ'σяєм ιρѕυм ∂σłσя
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Pasting"
msgstr "Pästïng Ⱡ'σяєм ιρѕυм #"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Some errors occurred"
msgstr "Sömé érrörs öççürréd Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, #"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files could not be added to the course:"
msgstr ""
"Thé föllöwïng réqüïréd fïlés çöüld nöt ßé äddéd tö thé çöürsé: Ⱡ'σяєм ιρѕυм "
@@ -7062,6 +7067,7 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "You may need to update a file(s) manually"
msgstr ""
"Ýöü mäý nééd tö üpdäté ä fïlé(s) mänüällý Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, "
@@ -7069,6 +7075,7 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid ""
"The following files already exist in this course but don't match the version"
" used by the component you pasted:"
@@ -7078,6 +7085,7 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "New file(s) added to Files & Uploads."
msgstr ""
"Néw fïlé(s) äddéd tö Fïlés & Ûplöäds. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, "
@@ -7085,6 +7093,7 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files were imported to this course:"
msgstr ""
"Thé föllöwïng réqüïréd fïlés wéré ïmpörtéd tö thïs çöürsé: Ⱡ'σяєм ιρѕυм "
@@ -7092,11 +7101,13 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "View files"
msgstr "Vïéw fïlés Ⱡ'σяєм ιρѕυм ∂σłσ#"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Dismiss"
msgstr "Dïsmïss Ⱡ'σяєм ιρѕυм #"
@@ -12408,6 +12419,10 @@ msgstr ""
"Nöté: Dö nöt hïdé grädéd ässïgnménts äftér théý hävé ßéén réléäséd. Ⱡ'σяєм "
"ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя #"
+#: cms/templates/js/publish-xblock.underscore
+msgid "Copy Unit"
+msgstr "Çöpý Ûnït Ⱡ'σяєм ιρѕυм ∂σł#"
+
#: cms/templates/js/release-date-editor.underscore
msgid "Release Date and Time"
msgstr "Réléäsé Däté änd Tïmé Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, #"
diff --git a/conf/locale/es_419/LC_MESSAGES/django.mo b/conf/locale/es_419/LC_MESSAGES/django.mo
index 4b895e53047c..636186118054 100644
Binary files a/conf/locale/es_419/LC_MESSAGES/django.mo and b/conf/locale/es_419/LC_MESSAGES/django.mo differ
diff --git a/conf/locale/es_419/LC_MESSAGES/django.po b/conf/locale/es_419/LC_MESSAGES/django.po
index 2623c0224157..67d95d6b27c5 100644
--- a/conf/locale/es_419/LC_MESSAGES/django.po
+++ b/conf/locale/es_419/LC_MESSAGES/django.po
@@ -5316,6 +5316,10 @@ msgid ""
" with the LTI consumer. See the Open edX LTI Provider documentation for more"
" details."
msgstr ""
+"Cuando esté marcado, el contenido LTI se cargará solo para los estudiante "
+"que tengan una Cuenta en este caso. Esto es requiere únicamente para "
+"vincular cuentas estudiante con el consumidor LTI . Consulte la "
+"documentación del proveedor Open edX LTI para obtener más detalles."
#: lms/djangoapps/program_enrollments/models.py
msgid "One of user or external_user_key must not be null."
@@ -12062,6 +12066,21 @@ msgstr ""
" que los usuarios puedan restablecer sus respuestas y reorganizar los "
"elementos seleccionados."
+#: xmodule/library_content_block.py
+msgid "Source content library has not been specified."
+msgstr "No se ha especificado la librería del contenido fuente."
+
+#: xmodule/library_content_block.py
+msgid "Content libraries are not available in the current runtime."
+msgstr ""
+"Las librerías de contenido no están disponibles en el tiempo de ejecución "
+"actual."
+
+#: xmodule/library_content_block.py
+#, python-brace-format
+msgid "Source content library does not exist: {source_library_id}"
+msgstr "La librería de contenido fuente no existe: {source_library_id}"
+
#: xmodule/library_content_block.py
msgid "This component is out of date. The library has new content."
msgstr ""
@@ -12099,9 +12118,9 @@ msgid "Select a Library."
msgstr "Seleccione una librería"
#: xmodule/library_content_block.py
-msgid "There are no matching problem types in the specified libraries."
-msgstr ""
-"No hay problemas que coincidan con este tipo en las librerías especificadas"
+#, python-brace-format
+msgid "There are no problems in the specified library of type {capa_type}."
+msgstr "No hay problemas en la librería especificada de tipo {capa_type} ."
#: xmodule/library_content_block.py
msgid "Select another problem type."
@@ -14418,14 +14437,6 @@ msgstr "Requerimientos"
msgid "Details"
msgstr "Detalles"
-#. #-#-#-#-# mako.po (edx-platform) #-#-#-#-#
-#. Translators: this is a verb describing the action of viewing more details
-#: cms/templates/studio_xblock_wrapper.html
-#: lms/templates/wiki/includes/article_menu.html
-#: wiki/templates/wiki/includes/article_menu.html
-msgid "View"
-msgstr "Ver"
-
#: cms/templates/maintenance/_announcement_edit.html
#: lms/templates/problem.html lms/templates/word_cloud.html
msgid "Save"
@@ -15216,6 +15227,14 @@ msgstr "Secuencia"
msgid "Completed"
msgstr "Completado"
+#: lms/templates/seq_block.html
+msgid "New Unit"
+msgstr "Nueva Unidad"
+
+#: lms/templates/seq_block.html
+msgid "Paste as new unit"
+msgstr "Pegar como nueva unidad"
+
#: lms/templates/signup_modal.html
msgid "Sign Up for {platform_name}"
msgstr "Regístrate en {platform_name}"
@@ -20737,22 +20756,27 @@ msgstr "Mis cursos"
#: lms/templates/lti_provider/user-auth-error.html
msgid "There was an error when loading this module!"
-msgstr ""
+msgstr "¡Hubo un error al cargar este módulo!"
#: lms/templates/lti_provider/user-auth-error.html
msgid ""
"This module is available only for users who are signed into {platform}. "
"Kindly sign in and refresh this page to load the content."
msgstr ""
+"Este módulo está disponible solo para usuarios que hayan iniciado sesión en "
+"{platform} . Por favor inicie en y actualice esta página para cargar el "
+"contenido en ido."
#: lms/templates/lti_provider/user-auth-error.html
msgid "NOTE:"
-msgstr ""
+msgstr "NOTA:"
#: lms/templates/lti_provider/user-auth-error.html
msgid ""
"The email used to sign into this platform and {platform} should be the same."
msgstr ""
+"El correo electrónico utilizado para iniciar sesión en esta plataforma y "
+"{platform} deben ser el mismo."
#: lms/templates/modal/_modal-settings-language.html
msgid "Change Preferred Language"
@@ -21338,6 +21362,11 @@ msgstr "¡Listo!"
msgid "Learn more"
msgstr "Aprender más"
+#: lms/templates/wiki/includes/article_menu.html
+#: wiki/templates/wiki/includes/article_menu.html
+msgid "View"
+msgstr "Ver"
+
#: lms/templates/wiki/includes/article_menu.html
msgid "{span_start}(active){span_end}"
msgstr "{span_start}(activo){span_end}"
@@ -22059,6 +22088,10 @@ msgstr "Ver la versión publicada"
msgid "Preview the courseware in the LMS"
msgstr "Previsualizar el contenido del curso en el LMS"
+#: cms/templates/container.html
+msgid "Collapse All"
+msgstr "Colapsar todo"
+
#: cms/templates/container.html
msgid "Adding components"
msgstr "Agregando componentes"
@@ -25114,14 +25147,26 @@ msgstr ""
" exámenes y especificar el peso que tendrá cada actividad en la calificación"
" final del estudiante."
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Importing components"
+msgstr "Importar componentes"
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Expand or Collapse"
msgstr "Expandir o Colapsar"
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Select this problem"
+msgstr "Seleccionar este problema"
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Copy to Clipboard"
msgstr "Copiar al portapapeles"
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Manage tags"
+msgstr "Administrar etiquetas"
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Manage Access"
msgstr "Administrar acceso"
diff --git a/conf/locale/es_419/LC_MESSAGES/djangojs.mo b/conf/locale/es_419/LC_MESSAGES/djangojs.mo
index eb75d9a7b1d5..7811e58e7ac3 100644
Binary files a/conf/locale/es_419/LC_MESSAGES/djangojs.mo and b/conf/locale/es_419/LC_MESSAGES/djangojs.mo differ
diff --git a/conf/locale/es_419/LC_MESSAGES/djangojs.po b/conf/locale/es_419/LC_MESSAGES/djangojs.po
index b6f95544de99..65d434123ba1 100644
--- a/conf/locale/es_419/LC_MESSAGES/djangojs.po
+++ b/conf/locale/es_419/LC_MESSAGES/djangojs.po
@@ -182,7 +182,7 @@ msgid ""
msgstr ""
"Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
-"POT-Creation-Date: 2023-11-19 20:43+0000\n"
+"POT-Creation-Date: 2023-12-03 20:43+0000\n"
"PO-Revision-Date: 2014-06-11 15:18+0000\n"
"Last-Translator: Jesica Greco, 2023\n"
"Language-Team: Spanish (Latin America) (http://app.transifex.com/open-edx/edx-platform/language/es_419/)\n"
@@ -308,7 +308,8 @@ msgstr "Elegir archivo"
#: cms/static/js/views/course_info_update.js
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js
-#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js
+#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js
+#: xmodule/js/src/html/edit.js
#: common/static/common/templates/discussion/templates.underscore
#: lms/templates/learner_dashboard/verification_popover.underscore
msgid "OK"
@@ -2210,6 +2211,7 @@ msgstr "Resultados de búsqueda"
msgid "[no tags]"
msgstr "[sin etiquetas]"
+#. #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-#
#. Translators: 'Tags' is the name of the view (noun) within the Student Notes
#. page that shows all
#. notes organized by the tags the student has associated with them (if any).
@@ -2218,6 +2220,7 @@ msgstr "[sin etiquetas]"
#. with the note
#. in order to group similar notes together and help with search.
#: lms/static/js/edxnotes/views/tabs/tags.js
+#: cms/templates/js/tag-list.underscore
msgid "Tags"
msgstr "Etiquetas"
@@ -6567,6 +6570,7 @@ msgstr "¿Está seguro de que quiere borrar esta actualización?"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/pages/container_subviews.js
msgid "Copying"
msgstr "Copiando"
@@ -6576,26 +6580,31 @@ msgstr "Copia de '{componentDisplayName}'"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Pasting"
msgstr "Pegando"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Some errors occurred"
msgstr "Se produjeron algunos errores"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files could not be added to the course:"
msgstr "Los siguientes archivos obligatorios no se pudieron agregar al curso:"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "You may need to update a file(s) manually"
msgstr "Es posible que deba actualizar un archivo (s) manualmente"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid ""
"The following files already exist in this course but don't match the version"
" used by the component you pasted:"
@@ -6605,21 +6614,25 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "New file(s) added to Files & Uploads."
msgstr "Nuevos archivos agregados a Archivos y cargas."
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files were imported to this course:"
msgstr "Los siguientes archivos obligatorios no se pudieron agregar al curso:"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "View files"
msgstr "Archivos de vista"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Dismiss"
msgstr "Descartar"
@@ -11485,6 +11498,10 @@ msgid "Note: Do not hide graded assignments after they have been released."
msgstr ""
"Nota: No oculte las tareas calificadas después de que han sido liberadas."
+#: cms/templates/js/publish-xblock.underscore
+msgid "Copy Unit"
+msgstr "Copiar unidad"
+
#: cms/templates/js/release-date-editor.underscore
msgid "Release Date and Time"
msgstr "Fecha y hora de liberación"
@@ -11691,6 +11708,10 @@ msgstr "Resúmenes de unidades de expertos"
msgid "Enable summaries"
msgstr "Habilitar resúmenes"
+#: cms/templates/js/tag-list.underscore
+msgid "Manage tags"
+msgstr "Administrar etiquetas"
+
#: cms/templates/js/team-member.underscore
msgid "Current Role:"
msgstr "Rol actual:"
diff --git a/conf/locale/eu_ES/LC_MESSAGES/django.mo b/conf/locale/eu_ES/LC_MESSAGES/django.mo
index 8439317fbfcc..64c7f13bc0ce 100644
Binary files a/conf/locale/eu_ES/LC_MESSAGES/django.mo and b/conf/locale/eu_ES/LC_MESSAGES/django.mo differ
diff --git a/conf/locale/eu_ES/LC_MESSAGES/django.po b/conf/locale/eu_ES/LC_MESSAGES/django.po
index c6ef7850d6e9..dbe1fa1156d8 100644
--- a/conf/locale/eu_ES/LC_MESSAGES/django.po
+++ b/conf/locale/eu_ES/LC_MESSAGES/django.po
@@ -10519,6 +10519,19 @@ msgid ""
"their answers and reshuffle selected items."
msgstr ""
+#: xmodule/library_content_block.py
+msgid "Source content library has not been specified."
+msgstr ""
+
+#: xmodule/library_content_block.py
+msgid "Content libraries are not available in the current runtime."
+msgstr ""
+
+#: xmodule/library_content_block.py
+#, python-brace-format
+msgid "Source content library does not exist: {source_library_id}"
+msgstr ""
+
#: xmodule/library_content_block.py
msgid "This component is out of date. The library has new content."
msgstr ""
@@ -10555,8 +10568,9 @@ msgid "Select a Library."
msgstr "Aukeratu liburutegia"
#: xmodule/library_content_block.py
-msgid "There are no matching problem types in the specified libraries."
-msgstr "Ez dago adierazitako ariketa-motarik zehaztutako liburutegietan."
+#, python-brace-format
+msgid "There are no problems in the specified library of type {capa_type}."
+msgstr ""
#: xmodule/library_content_block.py
msgid "Select another problem type."
@@ -12585,14 +12599,6 @@ msgstr "Eskakizunak"
msgid "Details"
msgstr "Xehetasunak"
-#. #-#-#-#-# mako.po (edx-platform) #-#-#-#-#
-#. Translators: this is a verb describing the action of viewing more details
-#: cms/templates/studio_xblock_wrapper.html
-#: lms/templates/wiki/includes/article_menu.html
-#: wiki/templates/wiki/includes/article_menu.html
-msgid "View"
-msgstr "Ikusi"
-
#: cms/templates/maintenance/_announcement_edit.html
#: lms/templates/problem.html lms/templates/word_cloud.html
msgid "Save"
@@ -13338,6 +13344,14 @@ msgstr "Sekuentzia"
msgid "Completed"
msgstr "Osatua"
+#: lms/templates/seq_block.html
+msgid "New Unit"
+msgstr ""
+
+#: lms/templates/seq_block.html
+msgid "Paste as new unit"
+msgstr ""
+
#: lms/templates/signup_modal.html
msgid "Sign Up for {platform_name}"
msgstr "Eman izena hemen: {platform_name}"
@@ -18568,6 +18582,11 @@ msgstr ""
msgid "Learn more"
msgstr "Ikasi gehiago"
+#: lms/templates/wiki/includes/article_menu.html
+#: wiki/templates/wiki/includes/article_menu.html
+msgid "View"
+msgstr "Ikusi"
+
#: lms/templates/wiki/includes/article_menu.html
msgid "{span_start}(active){span_end}"
msgstr "{span_start}(aktiboa){span_end}"
@@ -19243,6 +19262,10 @@ msgstr "Ikusi bertsioa zuzenean"
msgid "Preview the courseware in the LMS"
msgstr ""
+#: cms/templates/container.html
+msgid "Collapse All"
+msgstr ""
+
#: cms/templates/container.html
msgid "Adding components"
msgstr "Osagaiak gehitzen"
@@ -21793,14 +21816,26 @@ msgid ""
"worth."
msgstr ""
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Importing components"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Expand or Collapse"
msgstr "Zabaldu edo tolestu"
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Select this problem"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Copy to Clipboard"
msgstr ""
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Manage Access"
msgstr ""
diff --git a/conf/locale/eu_ES/LC_MESSAGES/djangojs.po b/conf/locale/eu_ES/LC_MESSAGES/djangojs.po
index 0b78c05bc1a6..3fc9ac3f2f28 100644
--- a/conf/locale/eu_ES/LC_MESSAGES/djangojs.po
+++ b/conf/locale/eu_ES/LC_MESSAGES/djangojs.po
@@ -50,7 +50,7 @@ msgid ""
msgstr ""
"Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
-"POT-Creation-Date: 2023-11-19 20:43+0000\n"
+"POT-Creation-Date: 2023-12-03 20:43+0000\n"
"PO-Revision-Date: 2014-06-11 15:18+0000\n"
"Last-Translator: Abel Camacho , 2017,2019-2020\n"
"Language-Team: Basque (Spain) (http://app.transifex.com/open-edx/edx-platform/language/eu_ES/)\n"
@@ -176,7 +176,8 @@ msgstr "Aukeratu fitxategia"
#: cms/static/js/views/course_info_update.js
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js
-#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js
+#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js
+#: xmodule/js/src/html/edit.js
#: common/static/common/templates/discussion/templates.underscore
#: lms/templates/learner_dashboard/verification_popover.underscore
msgid "OK"
@@ -5952,6 +5953,7 @@ msgstr "Ziur al zaude eguneraketa hau ezabatu egin nahi duzula?"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/pages/container_subviews.js
msgid "Copying"
msgstr ""
@@ -5961,26 +5963,31 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Pasting"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Some errors occurred"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files could not be added to the course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "You may need to update a file(s) manually"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid ""
"The following files already exist in this course but don't match the version"
" used by the component you pasted:"
@@ -5988,21 +5995,25 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "New file(s) added to Files & Uploads."
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files were imported to this course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "View files"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Dismiss"
msgstr ""
@@ -10475,6 +10486,10 @@ msgstr "Ezkutatu ikasleei"
msgid "Note: Do not hide graded assignments after they have been released."
msgstr ""
+#: cms/templates/js/publish-xblock.underscore
+msgid "Copy Unit"
+msgstr ""
+
#: cms/templates/js/release-date-editor.underscore
msgid "Release Date and Time"
msgstr "Argitaratze-data eta ordua"
@@ -10655,6 +10670,10 @@ msgstr ""
msgid "Enable summaries"
msgstr ""
+#: cms/templates/js/tag-list.underscore
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/js/team-member.underscore
msgid "Current Role:"
msgstr "Oraingo rola:"
diff --git a/conf/locale/fa_IR/LC_MESSAGES/django.mo b/conf/locale/fa_IR/LC_MESSAGES/django.mo
index d8d34c9228ac..8a0976d63507 100644
Binary files a/conf/locale/fa_IR/LC_MESSAGES/django.mo and b/conf/locale/fa_IR/LC_MESSAGES/django.mo differ
diff --git a/conf/locale/fa_IR/LC_MESSAGES/django.po b/conf/locale/fa_IR/LC_MESSAGES/django.po
index eaab57b0d65b..3ab3f2ae0f0d 100644
--- a/conf/locale/fa_IR/LC_MESSAGES/django.po
+++ b/conf/locale/fa_IR/LC_MESSAGES/django.po
@@ -134,7 +134,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.1a\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
-"POT-Creation-Date: 2023-11-05 20:43+0000\n"
+"POT-Creation-Date: 2023-11-26 20:43+0000\n"
"PO-Revision-Date: 2019-01-20 20:43+0000\n"
"Last-Translator: Somaye Joolaee, 2022\n"
"Language-Team: Persian (Iran) (https://app.transifex.com/open-edx/teams/6205/fa_IR/)\n"
@@ -11537,6 +11537,19 @@ msgstr ""
"تعیین میکند که آیا دکمه «بازتنظیم مشکلات» نشان داده شود، بنابراین کاربران "
"میتوانند پاسخهای خود را بازتنظیم کنند و موارد انتخابی را تغییر دهند."
+#: xmodule/library_content_block.py
+msgid "Source content library has not been specified."
+msgstr ""
+
+#: xmodule/library_content_block.py
+msgid "Content libraries are not available in the current runtime."
+msgstr ""
+
+#: xmodule/library_content_block.py
+#, python-brace-format
+msgid "Source content library does not exist: {source_library_id}"
+msgstr ""
+
#: xmodule/library_content_block.py
msgid "This component is out of date. The library has new content."
msgstr "این مولفه روزآمد نیست. کتابخانه مذکور محتوای جدیدی دارد."
@@ -11573,8 +11586,9 @@ msgid "Select a Library."
msgstr "انتخاب کتابخانه"
#: xmodule/library_content_block.py
-msgid "There are no matching problem types in the specified libraries."
-msgstr "هیچ نوع مساله منطبقی در کتابخانههای مشخصشده نیست."
+#, python-brace-format
+msgid "There are no problems in the specified library of type {capa_type}."
+msgstr ""
#: xmodule/library_content_block.py
msgid "Select another problem type."
@@ -13809,14 +13823,6 @@ msgstr "موارد ضروری"
msgid "Details"
msgstr "جزئیات"
-#. #-#-#-#-# mako.po (edx-platform) #-#-#-#-#
-#. Translators: this is a verb describing the action of viewing more details
-#: cms/templates/studio_xblock_wrapper.html
-#: lms/templates/wiki/includes/article_menu.html
-#: wiki/templates/wiki/includes/article_menu.html
-msgid "View"
-msgstr "نمایش"
-
#: cms/templates/maintenance/_announcement_edit.html
#: lms/templates/problem.html lms/templates/word_cloud.html
msgid "Save"
@@ -14598,6 +14604,14 @@ msgstr "توالی"
msgid "Completed"
msgstr "کامل شده"
+#: lms/templates/seq_block.html
+msgid "New Unit"
+msgstr ""
+
+#: lms/templates/seq_block.html
+msgid "Paste as new unit"
+msgstr ""
+
#: lms/templates/signup_modal.html
msgid "Sign Up for {platform_name}"
msgstr "ثبتنام در {platform_name}"
@@ -19120,7 +19134,7 @@ msgstr ""
#: lms/templates/instructor/instructor_dashboard_2/instructor_dashboard_2.html
msgid "Instructor Dashboard"
-msgstr "آموزش پیشخوان"
+msgstr "داشبورد مربی"
#: lms/templates/instructor/instructor_dashboard_2/instructor_dashboard_2.html
msgid "View Course in Studio"
@@ -20551,6 +20565,11 @@ msgstr "متوجه شدم!"
msgid "Learn more"
msgstr "اطلاعات بیشتر"
+#: lms/templates/wiki/includes/article_menu.html
+#: wiki/templates/wiki/includes/article_menu.html
+msgid "View"
+msgstr "نمایش"
+
#: lms/templates/wiki/includes/article_menu.html
msgid "{span_start}(active){span_end}"
msgstr "{span_start}(فعال){span_end}"
@@ -21261,6 +21280,10 @@ msgstr "نمایش نسخه زنده"
msgid "Preview the courseware in the LMS"
msgstr "پیشنمایش ابزار درسی در سیستم آموزش مجازی"
+#: cms/templates/container.html
+msgid "Collapse All"
+msgstr ""
+
#: cms/templates/container.html
msgid "Adding components"
msgstr "در حال افزودن مولفهها"
@@ -24240,14 +24263,26 @@ msgstr ""
"امتحاناتی را ایجاد کرده و مشخص کنید که ارزش هر نوع تکلیف برای یادگیرنده چقدر"
" است."
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Importing components"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Expand or Collapse"
msgstr "گسترده یا فشرده"
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Select this problem"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Copy to Clipboard"
msgstr "کپی به کلیپ بورد"
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Manage Access"
msgstr "مدیریت دسترسی"
diff --git a/conf/locale/fa_IR/LC_MESSAGES/djangojs.po b/conf/locale/fa_IR/LC_MESSAGES/djangojs.po
index ca60204bfbee..2e24de831c29 100644
--- a/conf/locale/fa_IR/LC_MESSAGES/djangojs.po
+++ b/conf/locale/fa_IR/LC_MESSAGES/djangojs.po
@@ -88,7 +88,7 @@ msgid ""
msgstr ""
"Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
-"POT-Creation-Date: 2023-11-19 20:43+0000\n"
+"POT-Creation-Date: 2023-12-03 20:43+0000\n"
"PO-Revision-Date: 2014-06-11 15:18+0000\n"
"Last-Translator: SeyedMahdi Saeid , 2023\n"
"Language-Team: Persian (Iran) (http://app.transifex.com/open-edx/edx-platform/language/fa_IR/)\n"
@@ -214,7 +214,8 @@ msgstr "انتخاب پرونده"
#: cms/static/js/views/course_info_update.js
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js
-#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js
+#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js
+#: xmodule/js/src/html/edit.js
#: common/static/common/templates/discussion/templates.underscore
#: lms/templates/learner_dashboard/verification_popover.underscore
msgid "OK"
@@ -6315,6 +6316,7 @@ msgstr "آیا از حذف این روزآمدسازی اطمینان دارید
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/pages/container_subviews.js
msgid "Copying"
msgstr "کپی کردن"
@@ -6324,26 +6326,31 @@ msgstr "کپی «{componentDisplayName}»"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Pasting"
msgstr "الصاق کردن"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Some errors occurred"
msgstr "برخی از خطاها رخ داده است"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files could not be added to the course:"
msgstr "فایل های مورد نیاز زیر را نمی توان به دوره اضافه کرد:"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "You may need to update a file(s) manually"
msgstr "ممکن است لازم باشد فایل(ها) را به صورت دستی به روز کنید"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid ""
"The following files already exist in this course but don't match the version"
" used by the component you pasted:"
@@ -6353,21 +6360,25 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "New file(s) added to Files & Uploads."
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files were imported to this course:"
msgstr "فایل های مورد نیاز زیر به این دوره وارد شدند:"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "View files"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Dismiss"
msgstr ""
@@ -11142,6 +11153,10 @@ msgstr "پنهانسازی از دید یادگیرندگان"
msgid "Note: Do not hide graded assignments after they have been released."
msgstr "توجه کنید: پس از انتشار، تکالیف نمرهگذاری شده را پنهان نکنید."
+#: cms/templates/js/publish-xblock.underscore
+msgid "Copy Unit"
+msgstr ""
+
#: cms/templates/js/release-date-editor.underscore
msgid "Release Date and Time"
msgstr "تاریخ و زمان انتشار"
@@ -11343,6 +11358,10 @@ msgstr "خلاصه واحد Xpert"
msgid "Enable summaries"
msgstr "فعال کردن خلاصه ها"
+#: cms/templates/js/tag-list.underscore
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/js/team-member.underscore
msgid "Current Role:"
msgstr "نقش کنونی:"
diff --git a/conf/locale/fr/LC_MESSAGES/django.mo b/conf/locale/fr/LC_MESSAGES/django.mo
index 056fa90d7fbf..b1887b5919ec 100644
Binary files a/conf/locale/fr/LC_MESSAGES/django.mo and b/conf/locale/fr/LC_MESSAGES/django.mo differ
diff --git a/conf/locale/fr/LC_MESSAGES/django.po b/conf/locale/fr/LC_MESSAGES/django.po
index ef67981971ef..4ca2c9e1f125 100644
--- a/conf/locale/fr/LC_MESSAGES/django.po
+++ b/conf/locale/fr/LC_MESSAGES/django.po
@@ -12031,6 +12031,19 @@ msgid ""
"their answers and reshuffle selected items."
msgstr ""
+#: xmodule/library_content_block.py
+msgid "Source content library has not been specified."
+msgstr ""
+
+#: xmodule/library_content_block.py
+msgid "Content libraries are not available in the current runtime."
+msgstr ""
+
+#: xmodule/library_content_block.py
+#, python-brace-format
+msgid "Source content library does not exist: {source_library_id}"
+msgstr ""
+
#: xmodule/library_content_block.py
msgid "This component is out of date. The library has new content."
msgstr "Ce composant est obsolète. La bibliothèque a de nouveaux contenus."
@@ -12067,10 +12080,9 @@ msgid "Select a Library."
msgstr "Sélectionner une Bibliothèque."
#: xmodule/library_content_block.py
-msgid "There are no matching problem types in the specified libraries."
+#, python-brace-format
+msgid "There are no problems in the specified library of type {capa_type}."
msgstr ""
-"Il n'y a pas les types de problèmes adaptés dans les bibliothèques "
-"spécifiées."
#: xmodule/library_content_block.py
msgid "Select another problem type."
@@ -14376,14 +14388,6 @@ msgstr "Pré-requis"
msgid "Details"
msgstr "Détails"
-#. #-#-#-#-# mako.po (edx-platform) #-#-#-#-#
-#. Translators: this is a verb describing the action of viewing more details
-#: cms/templates/studio_xblock_wrapper.html
-#: lms/templates/wiki/includes/article_menu.html
-#: wiki/templates/wiki/includes/article_menu.html
-msgid "View"
-msgstr "Voir"
-
#: cms/templates/maintenance/_announcement_edit.html
#: lms/templates/problem.html lms/templates/word_cloud.html
msgid "Save"
@@ -15175,6 +15179,14 @@ msgstr "Séquence"
msgid "Completed"
msgstr "Terminé"
+#: lms/templates/seq_block.html
+msgid "New Unit"
+msgstr ""
+
+#: lms/templates/seq_block.html
+msgid "Paste as new unit"
+msgstr ""
+
#: lms/templates/signup_modal.html
msgid "Sign Up for {platform_name}"
msgstr "Inscrivez-vous sur {platform_name}"
@@ -21310,6 +21322,11 @@ msgstr "OK !"
msgid "Learn more"
msgstr "En savoir plus"
+#: lms/templates/wiki/includes/article_menu.html
+#: wiki/templates/wiki/includes/article_menu.html
+msgid "View"
+msgstr "Voir"
+
#: lms/templates/wiki/includes/article_menu.html
msgid "{span_start}(active){span_end}"
msgstr "{span_start}(actif){span_end}"
@@ -22030,6 +22047,10 @@ msgstr "Aperçu réel"
msgid "Preview the courseware in the LMS"
msgstr "Prévisualiser le cours dans le LMS"
+#: cms/templates/container.html
+msgid "Collapse All"
+msgstr ""
+
#: cms/templates/container.html
msgid "Adding components"
msgstr "Ajout de composants"
@@ -25061,14 +25082,26 @@ msgstr ""
"laboratoires, des quiz, des examens et préciser la valeur des points pour "
"chacune de ces tâches."
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Importing components"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Expand or Collapse"
msgstr "Déplier ou Replier"
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Select this problem"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Copy to Clipboard"
msgstr ""
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Manage Access"
msgstr ""
diff --git a/conf/locale/fr/LC_MESSAGES/djangojs.po b/conf/locale/fr/LC_MESSAGES/djangojs.po
index b9b886ba8a66..3d597c9f424d 100644
--- a/conf/locale/fr/LC_MESSAGES/djangojs.po
+++ b/conf/locale/fr/LC_MESSAGES/djangojs.po
@@ -220,7 +220,7 @@ msgid ""
msgstr ""
"Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
-"POT-Creation-Date: 2023-11-19 20:43+0000\n"
+"POT-Creation-Date: 2023-12-03 20:43+0000\n"
"PO-Revision-Date: 2014-06-11 15:18+0000\n"
"Last-Translator: Pierre Mailhot , 2023\n"
"Language-Team: French (http://app.transifex.com/open-edx/edx-platform/language/fr/)\n"
@@ -346,7 +346,8 @@ msgstr "Choisir le fichier"
#: cms/static/js/views/course_info_update.js
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js
-#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js
+#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js
+#: xmodule/js/src/html/edit.js
#: common/static/common/templates/discussion/templates.underscore
#: lms/templates/learner_dashboard/verification_popover.underscore
msgid "OK"
@@ -6605,6 +6606,7 @@ msgstr "Êtes vous sur de vouloir supprimer cette mise à jour ?"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/pages/container_subviews.js
msgid "Copying"
msgstr ""
@@ -6614,26 +6616,31 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Pasting"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Some errors occurred"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files could not be added to the course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "You may need to update a file(s) manually"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid ""
"The following files already exist in this course but don't match the version"
" used by the component you pasted:"
@@ -6641,21 +6648,25 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "New file(s) added to Files & Uploads."
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files were imported to this course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "View files"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Dismiss"
msgstr ""
@@ -11504,6 +11515,10 @@ msgid "Note: Do not hide graded assignments after they have been released."
msgstr ""
"Note : Veuillez ne pas masquer les devoirs notés après leur publication."
+#: cms/templates/js/publish-xblock.underscore
+msgid "Copy Unit"
+msgstr ""
+
#: cms/templates/js/release-date-editor.underscore
msgid "Release Date and Time"
msgstr "Date et heure de diffusion"
@@ -11709,6 +11724,10 @@ msgstr ""
msgid "Enable summaries"
msgstr ""
+#: cms/templates/js/tag-list.underscore
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/js/team-member.underscore
msgid "Current Role:"
msgstr "Rôle actuel :"
diff --git a/conf/locale/id/LC_MESSAGES/django.mo b/conf/locale/id/LC_MESSAGES/django.mo
index 516f2f844161..7e6e718da840 100644
Binary files a/conf/locale/id/LC_MESSAGES/django.mo and b/conf/locale/id/LC_MESSAGES/django.mo differ
diff --git a/conf/locale/id/LC_MESSAGES/django.po b/conf/locale/id/LC_MESSAGES/django.po
index 7e6ce9bad039..76f0e46670e0 100644
--- a/conf/locale/id/LC_MESSAGES/django.po
+++ b/conf/locale/id/LC_MESSAGES/django.po
@@ -10921,6 +10921,19 @@ msgid ""
"their answers and reshuffle selected items."
msgstr ""
+#: xmodule/library_content_block.py
+msgid "Source content library has not been specified."
+msgstr ""
+
+#: xmodule/library_content_block.py
+msgid "Content libraries are not available in the current runtime."
+msgstr ""
+
+#: xmodule/library_content_block.py
+#, python-brace-format
+msgid "Source content library does not exist: {source_library_id}"
+msgstr ""
+
#: xmodule/library_content_block.py
msgid "This component is out of date. The library has new content."
msgstr "Komponen ini telah kadaluarsa. Library telah memiliki konten baru"
@@ -10957,8 +10970,9 @@ msgid "Select a Library."
msgstr "Pilih Library."
#: xmodule/library_content_block.py
-msgid "There are no matching problem types in the specified libraries."
-msgstr "Tidak ditemukan jenis soal yang sesuai untuk library yang dipilih."
+#, python-brace-format
+msgid "There are no problems in the specified library of type {capa_type}."
+msgstr ""
#: xmodule/library_content_block.py
msgid "Select another problem type."
@@ -13111,14 +13125,6 @@ msgstr "Kebutuhan"
msgid "Details"
msgstr "Detil"
-#. #-#-#-#-# mako.po (edx-platform) #-#-#-#-#
-#. Translators: this is a verb describing the action of viewing more details
-#: cms/templates/studio_xblock_wrapper.html
-#: lms/templates/wiki/includes/article_menu.html
-#: wiki/templates/wiki/includes/article_menu.html
-msgid "View"
-msgstr "Tampilkan"
-
#: cms/templates/maintenance/_announcement_edit.html
#: lms/templates/problem.html lms/templates/word_cloud.html
msgid "Save"
@@ -13889,6 +13895,14 @@ msgstr "Urutan"
msgid "Completed"
msgstr ""
+#: lms/templates/seq_block.html
+msgid "New Unit"
+msgstr ""
+
+#: lms/templates/seq_block.html
+msgid "Paste as new unit"
+msgstr ""
+
#: lms/templates/signup_modal.html
msgid "Sign Up for {platform_name}"
msgstr "Daftar {platform_name}"
@@ -19813,6 +19827,11 @@ msgstr "Mengerti!"
msgid "Learn more"
msgstr "Pelajari lebih lanjut"
+#: lms/templates/wiki/includes/article_menu.html
+#: wiki/templates/wiki/includes/article_menu.html
+msgid "View"
+msgstr "Tampilkan"
+
#: lms/templates/wiki/includes/article_menu.html
msgid "{span_start}(active){span_end}"
msgstr "{span_start}(aktif){span_end}"
@@ -20503,6 +20522,10 @@ msgstr "Lihat Versi Langsung"
msgid "Preview the courseware in the LMS"
msgstr "Pratinjau perangkat kursus di LMS"
+#: cms/templates/container.html
+msgid "Collapse All"
+msgstr ""
+
#: cms/templates/container.html
msgid "Adding components"
msgstr "Menambahkan komponen"
@@ -23107,14 +23130,26 @@ msgstr ""
"Anda dapat membuat beberapa jenis penugasan, seperti pekerjaan rumah, lab, "
"kuis, dan ujian, dan menentukan bobot masing-masing terhadap nilai peserta."
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Importing components"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Expand or Collapse"
msgstr ""
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Select this problem"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Copy to Clipboard"
msgstr ""
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Manage Access"
msgstr ""
diff --git a/conf/locale/id/LC_MESSAGES/djangojs.po b/conf/locale/id/LC_MESSAGES/djangojs.po
index 7b2030626691..2c6455ef6055 100644
--- a/conf/locale/id/LC_MESSAGES/djangojs.po
+++ b/conf/locale/id/LC_MESSAGES/djangojs.po
@@ -84,7 +84,7 @@ msgid ""
msgstr ""
"Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
-"POT-Creation-Date: 2023-11-19 20:43+0000\n"
+"POT-Creation-Date: 2023-12-03 20:43+0000\n"
"PO-Revision-Date: 2014-06-11 15:18+0000\n"
"Last-Translator: Faizar Septiawan , 2023\n"
"Language-Team: Indonesian (http://app.transifex.com/open-edx/edx-platform/language/id/)\n"
@@ -194,7 +194,8 @@ msgstr "Pilih Berkas"
#: cms/static/js/views/course_info_update.js
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js
-#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js
+#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js
+#: xmodule/js/src/html/edit.js
#: common/static/common/templates/discussion/templates.underscore
#: lms/templates/learner_dashboard/verification_popover.underscore
msgid "OK"
@@ -6141,6 +6142,7 @@ msgstr "Anda yakin hendak menghapus pembaruan ini?"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/pages/container_subviews.js
msgid "Copying"
msgstr ""
@@ -6150,26 +6152,31 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Pasting"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Some errors occurred"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files could not be added to the course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "You may need to update a file(s) manually"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid ""
"The following files already exist in this course but don't match the version"
" used by the component you pasted:"
@@ -6177,21 +6184,25 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "New file(s) added to Files & Uploads."
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files were imported to this course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "View files"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Dismiss"
msgstr ""
@@ -10756,6 +10767,10 @@ msgid "Note: Do not hide graded assignments after they have been released."
msgstr ""
"Catatan: Jangan sembunyikan penugasan yang dinilai setelah diterbitkan."
+#: cms/templates/js/publish-xblock.underscore
+msgid "Copy Unit"
+msgstr ""
+
#: cms/templates/js/release-date-editor.underscore
msgid "Release Date and Time"
msgstr "Penerbitan tanggal dan waktu"
@@ -10941,6 +10956,10 @@ msgstr ""
msgid "Enable summaries"
msgstr ""
+#: cms/templates/js/tag-list.underscore
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/js/team-member.underscore
msgid "Current Role:"
msgstr "Peran saat ini"
diff --git a/conf/locale/it_IT/LC_MESSAGES/django.mo b/conf/locale/it_IT/LC_MESSAGES/django.mo
index d8ee171e2da8..64cf0114b41a 100644
Binary files a/conf/locale/it_IT/LC_MESSAGES/django.mo and b/conf/locale/it_IT/LC_MESSAGES/django.mo differ
diff --git a/conf/locale/it_IT/LC_MESSAGES/django.po b/conf/locale/it_IT/LC_MESSAGES/django.po
index c561a859a8b6..9ba0564f322c 100644
--- a/conf/locale/it_IT/LC_MESSAGES/django.po
+++ b/conf/locale/it_IT/LC_MESSAGES/django.po
@@ -11864,6 +11864,19 @@ msgstr ""
" in modo che gli utenti possano reimpostare le risposte e rimescolare gli "
"elementi selezionati."
+#: xmodule/library_content_block.py
+msgid "Source content library has not been specified."
+msgstr ""
+
+#: xmodule/library_content_block.py
+msgid "Content libraries are not available in the current runtime."
+msgstr ""
+
+#: xmodule/library_content_block.py
+#, python-brace-format
+msgid "Source content library does not exist: {source_library_id}"
+msgstr ""
+
#: xmodule/library_content_block.py
msgid "This component is out of date. The library has new content."
msgstr ""
@@ -11901,9 +11914,9 @@ msgid "Select a Library."
msgstr "Seleziona una libreria."
#: xmodule/library_content_block.py
-msgid "There are no matching problem types in the specified libraries."
+#, python-brace-format
+msgid "There are no problems in the specified library of type {capa_type}."
msgstr ""
-"Non vi sono tipi di problema corrispondenti nelle librerie specificate."
#: xmodule/library_content_block.py
msgid "Select another problem type."
@@ -14210,14 +14223,6 @@ msgstr "Requisiti"
msgid "Details"
msgstr "Dettagli"
-#. #-#-#-#-# mako.po (edx-platform) #-#-#-#-#
-#. Translators: this is a verb describing the action of viewing more details
-#: cms/templates/studio_xblock_wrapper.html
-#: lms/templates/wiki/includes/article_menu.html
-#: wiki/templates/wiki/includes/article_menu.html
-msgid "View"
-msgstr "Visualizza"
-
#: cms/templates/maintenance/_announcement_edit.html
#: lms/templates/problem.html lms/templates/word_cloud.html
msgid "Save"
@@ -15006,6 +15011,14 @@ msgstr "Sequenza"
msgid "Completed"
msgstr "Completato"
+#: lms/templates/seq_block.html
+msgid "New Unit"
+msgstr ""
+
+#: lms/templates/seq_block.html
+msgid "Paste as new unit"
+msgstr ""
+
#: lms/templates/signup_modal.html
msgid "Sign Up for {platform_name}"
msgstr "Registrati su {platform_name}"
@@ -21105,6 +21118,11 @@ msgstr "Capito!"
msgid "Learn more"
msgstr "Per saperne di più"
+#: lms/templates/wiki/includes/article_menu.html
+#: wiki/templates/wiki/includes/article_menu.html
+msgid "View"
+msgstr "Visualizza"
+
#: lms/templates/wiki/includes/article_menu.html
msgid "{span_start}(active){span_end}"
msgstr "{span_start}(active){span_end}"
@@ -21825,6 +21843,10 @@ msgstr "Vedi Versione Live"
msgid "Preview the courseware in the LMS"
msgstr "Visualizza in anteprima il materiale didattico in LMS"
+#: cms/templates/container.html
+msgid "Collapse All"
+msgstr ""
+
#: cms/templates/container.html
msgid "Adding components"
msgstr "Aggiungi componenti"
@@ -24878,14 +24900,26 @@ msgstr ""
"esami, e specificare il valore di una valutazione dello studente per ciascun"
" tipo di compito. "
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Importing components"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Expand or Collapse"
msgstr "Espandi o comprimi "
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Select this problem"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Copy to Clipboard"
msgstr ""
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Manage Access"
msgstr ""
diff --git a/conf/locale/it_IT/LC_MESSAGES/djangojs.po b/conf/locale/it_IT/LC_MESSAGES/djangojs.po
index 4bd2712e331e..3acf2d6adb47 100644
--- a/conf/locale/it_IT/LC_MESSAGES/djangojs.po
+++ b/conf/locale/it_IT/LC_MESSAGES/djangojs.po
@@ -113,7 +113,7 @@ msgid ""
msgstr ""
"Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
-"POT-Creation-Date: 2023-11-19 20:43+0000\n"
+"POT-Creation-Date: 2023-12-03 20:43+0000\n"
"PO-Revision-Date: 2014-06-11 15:18+0000\n"
"Last-Translator: Ilaria Botti , 2022\n"
"Language-Team: Italian (Italy) (http://app.transifex.com/open-edx/edx-platform/language/it_IT/)\n"
@@ -239,7 +239,8 @@ msgstr "Scegli File"
#: cms/static/js/views/course_info_update.js
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js
-#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js
+#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js
+#: xmodule/js/src/html/edit.js
#: common/static/common/templates/discussion/templates.underscore
#: lms/templates/learner_dashboard/verification_popover.underscore
msgid "OK"
@@ -6461,6 +6462,7 @@ msgstr "Sei sicuro di voler cancellare questo aggiornamento?"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/pages/container_subviews.js
msgid "Copying"
msgstr ""
@@ -6470,26 +6472,31 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Pasting"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Some errors occurred"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files could not be added to the course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "You may need to update a file(s) manually"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid ""
"The following files already exist in this course but don't match the version"
" used by the component you pasted:"
@@ -6497,21 +6504,25 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "New file(s) added to Files & Uploads."
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files were imported to this course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "View files"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Dismiss"
msgstr ""
@@ -11359,6 +11370,10 @@ msgid "Note: Do not hide graded assignments after they have been released."
msgstr ""
"Nota: Non nascondere i compiti valutati dopo che sono stati rilasciati."
+#: cms/templates/js/publish-xblock.underscore
+msgid "Copy Unit"
+msgstr ""
+
#: cms/templates/js/release-date-editor.underscore
msgid "Release Date and Time"
msgstr "Data e ora rilascio"
@@ -11563,6 +11578,10 @@ msgstr ""
msgid "Enable summaries"
msgstr ""
+#: cms/templates/js/tag-list.underscore
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/js/team-member.underscore
msgid "Current Role:"
msgstr "Ruolo corrente:"
diff --git a/conf/locale/ja_JP/LC_MESSAGES/django.mo b/conf/locale/ja_JP/LC_MESSAGES/django.mo
index 39cd48b62ee8..1c940cd41c4b 100644
Binary files a/conf/locale/ja_JP/LC_MESSAGES/django.mo and b/conf/locale/ja_JP/LC_MESSAGES/django.mo differ
diff --git a/conf/locale/ja_JP/LC_MESSAGES/django.po b/conf/locale/ja_JP/LC_MESSAGES/django.po
index 35e5406ddbf8..da71037a3cea 100644
--- a/conf/locale/ja_JP/LC_MESSAGES/django.po
+++ b/conf/locale/ja_JP/LC_MESSAGES/django.po
@@ -10385,6 +10385,19 @@ msgid ""
"their answers and reshuffle selected items."
msgstr ""
+#: xmodule/library_content_block.py
+msgid "Source content library has not been specified."
+msgstr ""
+
+#: xmodule/library_content_block.py
+msgid "Content libraries are not available in the current runtime."
+msgstr ""
+
+#: xmodule/library_content_block.py
+#, python-brace-format
+msgid "Source content library does not exist: {source_library_id}"
+msgstr ""
+
#: xmodule/library_content_block.py
msgid "This component is out of date. The library has new content."
msgstr "このコンポーネントは期限切れです。ライブラリに新しいコンテンツがあります。"
@@ -10419,8 +10432,9 @@ msgid "Select a Library."
msgstr "ライブラリを選択してください。"
#: xmodule/library_content_block.py
-msgid "There are no matching problem types in the specified libraries."
-msgstr "ご指定のライブラリに合致する問題タイプがありません。"
+#, python-brace-format
+msgid "There are no problems in the specified library of type {capa_type}."
+msgstr ""
#: xmodule/library_content_block.py
msgid "Select another problem type."
@@ -12448,12 +12462,6 @@ msgstr "必須事項"
msgid "Details"
msgstr "詳細"
-#. Translators: this is a verb describing the action of viewing more details
-#: cms/templates/studio_xblock_wrapper.html
-#: lms/templates/wiki/includes/article_menu.html
-msgid "View"
-msgstr "見る"
-
#: cms/templates/maintenance/_announcement_edit.html
#: lms/templates/problem.html lms/templates/word_cloud.html
msgid "Save"
@@ -13199,6 +13207,14 @@ msgstr "順番"
msgid "Completed"
msgstr ""
+#: lms/templates/seq_block.html
+msgid "New Unit"
+msgstr ""
+
+#: lms/templates/seq_block.html
+msgid "Paste as new unit"
+msgstr ""
+
#: lms/templates/signup_modal.html
msgid "Sign Up for {platform_name}"
msgstr "{platform_name}に登録"
@@ -18429,6 +18445,10 @@ msgstr "やったね!"
msgid "Learn more"
msgstr "詳しく知る"
+#: lms/templates/wiki/includes/article_menu.html
+msgid "View"
+msgstr "見る"
+
#: lms/templates/wiki/includes/article_menu.html
msgid "{span_start}(active){span_end}"
msgstr "{span_start}(アクティブ){span_end}"
@@ -19092,6 +19112,10 @@ msgstr "現行バージョンを見る"
msgid "Preview the courseware in the LMS"
msgstr "LMSのコースウェアをプレビュー"
+#: cms/templates/container.html
+msgid "Collapse All"
+msgstr ""
+
#: cms/templates/container.html
msgid "Adding components"
msgstr "コンポーネント追加中"
@@ -21738,14 +21762,26 @@ msgid ""
"worth."
msgstr "宿題、実習、小テスト、試験などの課題タイプを作成することができ、それぞれの課題タイプの配点を設定できます。"
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Importing components"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Expand or Collapse"
msgstr "開くまたは閉じる"
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Select this problem"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Copy to Clipboard"
msgstr ""
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Manage Access"
msgstr ""
diff --git a/conf/locale/ja_JP/LC_MESSAGES/djangojs.po b/conf/locale/ja_JP/LC_MESSAGES/djangojs.po
index 4132cfc8f7c5..86e8baca7b5a 100644
--- a/conf/locale/ja_JP/LC_MESSAGES/djangojs.po
+++ b/conf/locale/ja_JP/LC_MESSAGES/djangojs.po
@@ -78,7 +78,7 @@ msgid ""
msgstr ""
"Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
-"POT-Creation-Date: 2023-11-19 20:43+0000\n"
+"POT-Creation-Date: 2023-12-03 20:43+0000\n"
"PO-Revision-Date: 2014-06-11 15:18+0000\n"
"Last-Translator: Kyoto University , 2017\n"
"Language-Team: Japanese (Japan) (http://app.transifex.com/open-edx/edx-platform/language/ja_JP/)\n"
@@ -184,7 +184,8 @@ msgstr "ファイルを選択"
#: cms/static/js/views/course_info_update.js
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js
-#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js
+#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js
+#: xmodule/js/src/html/edit.js
#: common/static/common/templates/discussion/templates.underscore
#: lms/templates/learner_dashboard/verification_popover.underscore
msgid "OK"
@@ -5838,6 +5839,7 @@ msgstr "この変更を削除してもよろしいですか?"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/pages/container_subviews.js
msgid "Copying"
msgstr ""
@@ -5847,26 +5849,31 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Pasting"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Some errors occurred"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files could not be added to the course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "You may need to update a file(s) manually"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid ""
"The following files already exist in this course but don't match the version"
" used by the component you pasted:"
@@ -5874,21 +5881,25 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "New file(s) added to Files & Uploads."
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files were imported to this course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "View files"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Dismiss"
msgstr ""
@@ -10355,6 +10366,10 @@ msgstr "受講者に非表示"
msgid "Note: Do not hide graded assignments after they have been released."
msgstr "注: 採点対象の課題を公開後に非表示にしないでください。"
+#: cms/templates/js/publish-xblock.underscore
+msgid "Copy Unit"
+msgstr ""
+
#: cms/templates/js/release-date-editor.underscore
msgid "Release Date and Time"
msgstr "リリース日時"
@@ -10535,6 +10550,10 @@ msgstr ""
msgid "Enable summaries"
msgstr ""
+#: cms/templates/js/tag-list.underscore
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/js/team-member.underscore
msgid "Current Role:"
msgstr "現在のロール:"
diff --git a/conf/locale/ka/LC_MESSAGES/django.mo b/conf/locale/ka/LC_MESSAGES/django.mo
index f40779caf872..52270bdfe7f0 100644
Binary files a/conf/locale/ka/LC_MESSAGES/django.mo and b/conf/locale/ka/LC_MESSAGES/django.mo differ
diff --git a/conf/locale/ka/LC_MESSAGES/django.po b/conf/locale/ka/LC_MESSAGES/django.po
index d56a33bbf410..2bec883db513 100644
--- a/conf/locale/ka/LC_MESSAGES/django.po
+++ b/conf/locale/ka/LC_MESSAGES/django.po
@@ -10737,6 +10737,19 @@ msgid ""
"their answers and reshuffle selected items."
msgstr ""
+#: xmodule/library_content_block.py
+msgid "Source content library has not been specified."
+msgstr ""
+
+#: xmodule/library_content_block.py
+msgid "Content libraries are not available in the current runtime."
+msgstr ""
+
+#: xmodule/library_content_block.py
+#, python-brace-format
+msgid "Source content library does not exist: {source_library_id}"
+msgstr ""
+
#: xmodule/library_content_block.py
msgid "This component is out of date. The library has new content."
msgstr "ეს კომპონენტი ვადაგასულია. ბიბლიოთეკას ახალი შინაარსი აქვს."
@@ -10773,8 +10786,9 @@ msgid "Select a Library."
msgstr "აირჩიეთ ბიბლიოთეკა."
#: xmodule/library_content_block.py
-msgid "There are no matching problem types in the specified libraries."
-msgstr "განსაზღვრულ ბიბლიოთეკებში ამოცანის ტიპები არ ემთხვევა ერთმანეთს."
+#, python-brace-format
+msgid "There are no problems in the specified library of type {capa_type}."
+msgstr ""
#: xmodule/library_content_block.py
msgid "Select another problem type."
@@ -12968,12 +12982,6 @@ msgstr "მოთხოვნები"
msgid "Details"
msgstr "დეტალები"
-#. Translators: this is a verb describing the action of viewing more details
-#: cms/templates/studio_xblock_wrapper.html
-#: lms/templates/wiki/includes/article_menu.html
-msgid "View"
-msgstr "ნახვა"
-
#: cms/templates/maintenance/_announcement_edit.html
#: lms/templates/problem.html lms/templates/word_cloud.html
msgid "Save"
@@ -13734,6 +13742,14 @@ msgstr ""
msgid "Completed"
msgstr ""
+#: lms/templates/seq_block.html
+msgid "New Unit"
+msgstr ""
+
+#: lms/templates/seq_block.html
+msgid "Paste as new unit"
+msgstr ""
+
#: lms/templates/signup_modal.html
msgid "Sign Up for {platform_name}"
msgstr "დარეგისტრირდით {platform_name}-ზე"
@@ -19349,6 +19365,10 @@ msgstr ""
msgid "Learn more"
msgstr ""
+#: lms/templates/wiki/includes/article_menu.html
+msgid "View"
+msgstr "ნახვა"
+
#: lms/templates/wiki/includes/article_menu.html
msgid "{span_start}(active){span_end}"
msgstr "{span_start}(მოქმედი){span_end}"
@@ -20032,6 +20052,10 @@ msgstr "მიმდინარე ვერსიის ნახვა"
msgid "Preview the courseware in the LMS"
msgstr "კურსის გადახედვა LMS-ში"
+#: cms/templates/container.html
+msgid "Collapse All"
+msgstr ""
+
#: cms/templates/container.html
msgid "Adding components"
msgstr "კომპონენტების დამატება"
@@ -22944,14 +22968,26 @@ msgstr ""
"ლაბორატორიული სავარჯიშოები, ქვიზები, გამოცდები. ასევე, თითოეული ტიპის "
"დავალებისთვის, შეგიძლიათ განსაზღვროთ სტუდენტის შეფასების ქულები."
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Importing components"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Expand or Collapse"
msgstr "ჩამოშალე ან აკეცე"
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Select this problem"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Copy to Clipboard"
msgstr ""
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Manage Access"
msgstr ""
diff --git a/conf/locale/ka/LC_MESSAGES/djangojs.po b/conf/locale/ka/LC_MESSAGES/djangojs.po
index 83f050a6495e..80cf17678e65 100644
--- a/conf/locale/ka/LC_MESSAGES/djangojs.po
+++ b/conf/locale/ka/LC_MESSAGES/djangojs.po
@@ -56,7 +56,7 @@ msgid ""
msgstr ""
"Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
-"POT-Creation-Date: 2023-11-19 20:43+0000\n"
+"POT-Creation-Date: 2023-12-03 20:43+0000\n"
"PO-Revision-Date: 2014-06-11 15:18+0000\n"
"Last-Translator: Lasha Kokilashvili, 2018\n"
"Language-Team: Georgian (http://app.transifex.com/open-edx/edx-platform/language/ka/)\n"
@@ -162,7 +162,8 @@ msgstr "ფაილის არჩევა"
#: cms/static/js/views/course_info_update.js
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js
-#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js
+#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js
+#: xmodule/js/src/html/edit.js
#: common/static/common/templates/discussion/templates.underscore
#: lms/templates/learner_dashboard/verification_popover.underscore
msgid "OK"
@@ -5972,6 +5973,7 @@ msgstr "დარწმუნებული ხართ, რომ გან
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/pages/container_subviews.js
msgid "Copying"
msgstr ""
@@ -5981,26 +5983,31 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Pasting"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Some errors occurred"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files could not be added to the course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "You may need to update a file(s) manually"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid ""
"The following files already exist in this course but don't match the version"
" used by the component you pasted:"
@@ -6008,21 +6015,25 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "New file(s) added to Files & Uploads."
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files were imported to this course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "View files"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Dismiss"
msgstr ""
@@ -10641,6 +10652,10 @@ msgid "Note: Do not hide graded assignments after they have been released."
msgstr ""
"გაითვალისწინეთ: არ დამალოთ შეფასებული დავალებები მათი გამოქვეყნების შემდეგ."
+#: cms/templates/js/publish-xblock.underscore
+msgid "Copy Unit"
+msgstr ""
+
#: cms/templates/js/release-date-editor.underscore
msgid "Release Date and Time"
msgstr "გამოქვეყნების თარიღი და დრო"
@@ -10830,6 +10845,10 @@ msgstr ""
msgid "Enable summaries"
msgstr ""
+#: cms/templates/js/tag-list.underscore
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/js/team-member.underscore
msgid "Current Role:"
msgstr "მიმდინარე როლი:"
diff --git a/conf/locale/lt_LT/LC_MESSAGES/django.po b/conf/locale/lt_LT/LC_MESSAGES/django.po
index e9e4893178f4..49acbecec5d4 100644
--- a/conf/locale/lt_LT/LC_MESSAGES/django.po
+++ b/conf/locale/lt_LT/LC_MESSAGES/django.po
@@ -10249,6 +10249,19 @@ msgid ""
"their answers and reshuffle selected items."
msgstr ""
+#: xmodule/library_content_block.py
+msgid "Source content library has not been specified."
+msgstr ""
+
+#: xmodule/library_content_block.py
+msgid "Content libraries are not available in the current runtime."
+msgstr ""
+
+#: xmodule/library_content_block.py
+#, python-brace-format
+msgid "Source content library does not exist: {source_library_id}"
+msgstr ""
+
#: xmodule/library_content_block.py
msgid "This component is out of date. The library has new content."
msgstr ""
@@ -10283,7 +10296,8 @@ msgid "Select a Library."
msgstr ""
#: xmodule/library_content_block.py
-msgid "There are no matching problem types in the specified libraries."
+#, python-brace-format
+msgid "There are no problems in the specified library of type {capa_type}."
msgstr ""
#: xmodule/library_content_block.py
@@ -12305,12 +12319,6 @@ msgstr "Reikalavimai"
msgid "Details"
msgstr "Išsamiau"
-#. Translators: this is a verb describing the action of viewing more details
-#: cms/templates/studio_xblock_wrapper.html
-#: lms/templates/wiki/includes/article_menu.html
-msgid "View"
-msgstr "Žiūrėti"
-
#: cms/templates/maintenance/_announcement_edit.html
#: lms/templates/problem.html lms/templates/word_cloud.html
msgid "Save"
@@ -13071,6 +13079,14 @@ msgstr ""
msgid "Completed"
msgstr ""
+#: lms/templates/seq_block.html
+msgid "New Unit"
+msgstr ""
+
+#: lms/templates/seq_block.html
+msgid "Paste as new unit"
+msgstr ""
+
#: lms/templates/signup_modal.html
msgid "Sign Up for {platform_name}"
msgstr "Prisiregistruokite prie {platform_name} "
@@ -18467,6 +18483,10 @@ msgstr ""
msgid "Learn more"
msgstr ""
+#: lms/templates/wiki/includes/article_menu.html
+msgid "View"
+msgstr "Žiūrėti"
+
#: lms/templates/wiki/includes/article_menu.html
msgid "{span_start}(active){span_end}"
msgstr "{span_start}(active){span_end}"
@@ -19149,6 +19169,10 @@ msgstr "Žiūrėti tiesiogiai"
msgid "Preview the courseware in the LMS"
msgstr "Peržiūrėkite kurso medžiagą mokymo valdymo sistemoje"
+#: cms/templates/container.html
+msgid "Collapse All"
+msgstr ""
+
#: cms/templates/container.html
msgid "Adding components"
msgstr "Pridedami komponentai"
@@ -21991,14 +22015,26 @@ msgstr ""
"darbai, apklausos ir egzaminai, bei nurodyti, koks yra kiekvieno tipo "
"užduoties svoris."
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Importing components"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Expand or Collapse"
msgstr "Išskleisti arba suskleisti"
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Select this problem"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Copy to Clipboard"
msgstr ""
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Manage Access"
msgstr ""
diff --git a/conf/locale/lt_LT/LC_MESSAGES/djangojs.po b/conf/locale/lt_LT/LC_MESSAGES/djangojs.po
index 26294d332f15..34706477caaf 100644
--- a/conf/locale/lt_LT/LC_MESSAGES/djangojs.po
+++ b/conf/locale/lt_LT/LC_MESSAGES/djangojs.po
@@ -50,7 +50,7 @@ msgid ""
msgstr ""
"Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
-"POT-Creation-Date: 2023-11-19 20:43+0000\n"
+"POT-Creation-Date: 2023-12-03 20:43+0000\n"
"PO-Revision-Date: 2014-06-11 15:18+0000\n"
"Last-Translator: Riina , 2014-2015\n"
"Language-Team: Lithuanian (Lithuania) (http://app.transifex.com/open-edx/edx-platform/language/lt_LT/)\n"
@@ -155,7 +155,8 @@ msgstr ""
#: cms/static/js/views/course_info_update.js
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js
-#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js
+#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js
+#: xmodule/js/src/html/edit.js
msgid "OK"
msgstr "Taip"
@@ -5938,6 +5939,7 @@ msgstr "Ar jūs tikrai norite pašalinti šį atnaujinimą?"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/pages/container_subviews.js
msgid "Copying"
msgstr ""
@@ -5947,26 +5949,31 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Pasting"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Some errors occurred"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files could not be added to the course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "You may need to update a file(s) manually"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid ""
"The following files already exist in this course but don't match the version"
" used by the component you pasted:"
@@ -5974,21 +5981,25 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "New file(s) added to Files & Uploads."
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files were imported to this course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "View files"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Dismiss"
msgstr ""
@@ -10512,6 +10523,10 @@ msgstr ""
msgid "Note: Do not hide graded assignments after they have been released."
msgstr ""
+#: cms/templates/js/publish-xblock.underscore
+msgid "Copy Unit"
+msgstr ""
+
#: cms/templates/js/release-date-editor.underscore
msgid "Release Date and Time"
msgstr ""
@@ -10695,6 +10710,10 @@ msgstr ""
msgid "Enable summaries"
msgstr ""
+#: cms/templates/js/tag-list.underscore
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/js/team-member.underscore
msgid "Current Role:"
msgstr ""
diff --git a/conf/locale/lv/LC_MESSAGES/django.mo b/conf/locale/lv/LC_MESSAGES/django.mo
index 6ae313136af7..cb882222f3e9 100644
Binary files a/conf/locale/lv/LC_MESSAGES/django.mo and b/conf/locale/lv/LC_MESSAGES/django.mo differ
diff --git a/conf/locale/lv/LC_MESSAGES/django.po b/conf/locale/lv/LC_MESSAGES/django.po
index 6832fcaa6227..4fa49b729bb3 100644
--- a/conf/locale/lv/LC_MESSAGES/django.po
+++ b/conf/locale/lv/LC_MESSAGES/django.po
@@ -10963,6 +10963,19 @@ msgid ""
"their answers and reshuffle selected items."
msgstr ""
+#: xmodule/library_content_block.py
+msgid "Source content library has not been specified."
+msgstr ""
+
+#: xmodule/library_content_block.py
+msgid "Content libraries are not available in the current runtime."
+msgstr ""
+
+#: xmodule/library_content_block.py
+#, python-brace-format
+msgid "Source content library does not exist: {source_library_id}"
+msgstr ""
+
#: xmodule/library_content_block.py
msgid "This component is out of date. The library has new content."
msgstr "Šis komponents ir novecojis. Bibliotēkā ir jauns saturs."
@@ -10999,8 +11012,9 @@ msgid "Select a Library."
msgstr "Izvēlieties bibliotēku."
#: xmodule/library_content_block.py
-msgid "There are no matching problem types in the specified libraries."
-msgstr "Norādītajās bibliotēkās nav atbilstošu problēmu veidu."
+#, python-brace-format
+msgid "There are no problems in the specified library of type {capa_type}."
+msgstr ""
#: xmodule/library_content_block.py
msgid "Select another problem type."
@@ -13147,14 +13161,6 @@ msgstr "Prasības"
msgid "Details"
msgstr "Detalizēti"
-#. #-#-#-#-# mako.po (edx-platform) #-#-#-#-#
-#. Translators: this is a verb describing the action of viewing more details
-#: cms/templates/studio_xblock_wrapper.html
-#: lms/templates/wiki/includes/article_menu.html
-#: wiki/templates/wiki/includes/article_menu.html
-msgid "View"
-msgstr "Skatīt"
-
#: cms/templates/maintenance/_announcement_edit.html
#: lms/templates/problem.html lms/templates/word_cloud.html
msgid "Save"
@@ -13929,6 +13935,14 @@ msgstr "Secība"
msgid "Completed"
msgstr ""
+#: lms/templates/seq_block.html
+msgid "New Unit"
+msgstr ""
+
+#: lms/templates/seq_block.html
+msgid "Paste as new unit"
+msgstr ""
+
#: lms/templates/signup_modal.html
msgid "Sign Up for {platform_name}"
msgstr "Reģistrējieties {platform_name}"
@@ -19597,6 +19611,11 @@ msgstr "Sapratu!"
msgid "Learn more"
msgstr "Uzzināt vairāk"
+#: lms/templates/wiki/includes/article_menu.html
+#: wiki/templates/wiki/includes/article_menu.html
+msgid "View"
+msgstr "Skatīt"
+
#: lms/templates/wiki/includes/article_menu.html
msgid "{span_start}(active){span_end}"
msgstr "{span_start}(aktīvs){span_end}"
@@ -20282,6 +20301,10 @@ msgstr ""
msgid "Preview the courseware in the LMS"
msgstr ""
+#: cms/templates/container.html
+msgid "Collapse All"
+msgstr ""
+
#: cms/templates/container.html
msgid "Adding components"
msgstr ""
@@ -22826,14 +22849,26 @@ msgid ""
"worth."
msgstr ""
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Importing components"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Expand or Collapse"
msgstr "Izvērst vai sakļaut"
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Select this problem"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Copy to Clipboard"
msgstr ""
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Manage Access"
msgstr ""
diff --git a/conf/locale/lv/LC_MESSAGES/djangojs.po b/conf/locale/lv/LC_MESSAGES/djangojs.po
index 721e6b16f7db..9526858a3da5 100644
--- a/conf/locale/lv/LC_MESSAGES/djangojs.po
+++ b/conf/locale/lv/LC_MESSAGES/djangojs.po
@@ -40,7 +40,7 @@ msgid ""
msgstr ""
"Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
-"POT-Creation-Date: 2023-11-19 20:43+0000\n"
+"POT-Creation-Date: 2023-12-03 20:43+0000\n"
"PO-Revision-Date: 2014-06-11 15:18+0000\n"
"Last-Translator: LTMC Latvijas Tiesnešu mācību centrs , 2019\n"
"Language-Team: Latvian (http://app.transifex.com/open-edx/edx-platform/language/lv/)\n"
@@ -150,7 +150,8 @@ msgstr "Izvēlēties failu"
#: cms/static/js/views/course_info_update.js
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js
-#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js
+#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js
+#: xmodule/js/src/html/edit.js
#: common/static/common/templates/discussion/templates.underscore
#: lms/templates/learner_dashboard/verification_popover.underscore
msgid "OK"
@@ -6149,6 +6150,7 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/pages/container_subviews.js
msgid "Copying"
msgstr ""
@@ -6158,26 +6160,31 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Pasting"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Some errors occurred"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files could not be added to the course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "You may need to update a file(s) manually"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid ""
"The following files already exist in this course but don't match the version"
" used by the component you pasted:"
@@ -6185,21 +6192,25 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "New file(s) added to Files & Uploads."
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files were imported to this course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "View files"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Dismiss"
msgstr ""
@@ -10665,6 +10676,10 @@ msgstr ""
msgid "Note: Do not hide graded assignments after they have been released."
msgstr ""
+#: cms/templates/js/publish-xblock.underscore
+msgid "Copy Unit"
+msgstr ""
+
#: cms/templates/js/release-date-editor.underscore
msgid "Release Date and Time"
msgstr ""
@@ -10843,6 +10858,10 @@ msgstr ""
msgid "Enable summaries"
msgstr ""
+#: cms/templates/js/tag-list.underscore
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/js/team-member.underscore
msgid "Current Role:"
msgstr ""
diff --git a/conf/locale/mn/LC_MESSAGES/django.po b/conf/locale/mn/LC_MESSAGES/django.po
index c582f92f95da..1e5a79ba2154 100644
--- a/conf/locale/mn/LC_MESSAGES/django.po
+++ b/conf/locale/mn/LC_MESSAGES/django.po
@@ -10351,6 +10351,19 @@ msgid ""
"their answers and reshuffle selected items."
msgstr ""
+#: xmodule/library_content_block.py
+msgid "Source content library has not been specified."
+msgstr ""
+
+#: xmodule/library_content_block.py
+msgid "Content libraries are not available in the current runtime."
+msgstr ""
+
+#: xmodule/library_content_block.py
+#, python-brace-format
+msgid "Source content library does not exist: {source_library_id}"
+msgstr ""
+
#: xmodule/library_content_block.py
msgid "This component is out of date. The library has new content."
msgstr ""
@@ -10385,7 +10398,8 @@ msgid "Select a Library."
msgstr ""
#: xmodule/library_content_block.py
-msgid "There are no matching problem types in the specified libraries."
+#, python-brace-format
+msgid "There are no problems in the specified library of type {capa_type}."
msgstr ""
#: xmodule/library_content_block.py
@@ -12373,14 +12387,6 @@ msgstr "Шаардлага"
msgid "Details"
msgstr "Дэлгэрэнгүй"
-#. #-#-#-#-# mako.po (edx-platform) #-#-#-#-#
-#. Translators: this is a verb describing the action of viewing more details
-#: cms/templates/studio_xblock_wrapper.html
-#: lms/templates/wiki/includes/article_menu.html
-#: wiki/templates/wiki/includes/article_menu.html
-msgid "View"
-msgstr "Харах"
-
#: cms/templates/maintenance/_announcement_edit.html
#: lms/templates/problem.html lms/templates/word_cloud.html
msgid "Save"
@@ -13124,6 +13130,14 @@ msgstr "Дараалал"
msgid "Completed"
msgstr ""
+#: lms/templates/seq_block.html
+msgid "New Unit"
+msgstr ""
+
+#: lms/templates/seq_block.html
+msgid "Paste as new unit"
+msgstr ""
+
#: lms/templates/signup_modal.html
msgid "Sign Up for {platform_name}"
msgstr "{platform_name} системд бүртгүүлэх"
@@ -18283,6 +18297,11 @@ msgstr ""
msgid "Learn more"
msgstr "Дэлгэрэнгүй"
+#: lms/templates/wiki/includes/article_menu.html
+#: wiki/templates/wiki/includes/article_menu.html
+msgid "View"
+msgstr "Харах"
+
#: lms/templates/wiki/includes/article_menu.html
msgid "{span_start}(active){span_end}"
msgstr ""
@@ -18953,6 +18972,10 @@ msgstr "Одоогийн хувилбарыг нь үзэх"
msgid "Preview the courseware in the LMS"
msgstr "Хичээлийн материалыг Сургалтын Менежментийн Системд урьдчилан харах"
+#: cms/templates/container.html
+msgid "Collapse All"
+msgstr ""
+
#: cms/templates/container.html
msgid "Adding components"
msgstr "Бүрдэл нэмэх"
@@ -21554,14 +21577,26 @@ msgid ""
"worth."
msgstr ""
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Importing components"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Expand or Collapse"
msgstr ""
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Select this problem"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Copy to Clipboard"
msgstr ""
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Manage Access"
msgstr ""
diff --git a/conf/locale/mn/LC_MESSAGES/djangojs.po b/conf/locale/mn/LC_MESSAGES/djangojs.po
index d99b5673aa3c..0cb684776d28 100644
--- a/conf/locale/mn/LC_MESSAGES/djangojs.po
+++ b/conf/locale/mn/LC_MESSAGES/djangojs.po
@@ -63,7 +63,7 @@ msgid ""
msgstr ""
"Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
-"POT-Creation-Date: 2023-11-19 20:43+0000\n"
+"POT-Creation-Date: 2023-12-03 20:43+0000\n"
"PO-Revision-Date: 2014-06-11 15:18+0000\n"
"Last-Translator: Myagmarjav Enkhbileg , 2018\n"
"Language-Team: Mongolian (http://app.transifex.com/open-edx/edx-platform/language/mn/)\n"
@@ -173,7 +173,8 @@ msgstr "Файл сонгох"
#: cms/static/js/views/course_info_update.js
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js
-#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js
+#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js
+#: xmodule/js/src/html/edit.js
#: common/static/common/templates/discussion/templates.underscore
#: lms/templates/learner_dashboard/verification_popover.underscore
msgid "OK"
@@ -1896,6 +1897,7 @@ msgstr "Хайлтын илэрцүүд"
msgid "[no tags]"
msgstr ""
+#. #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-#
#. Translators: 'Tags' is the name of the view (noun) within the Student Notes
#. page that shows all
#. notes organized by the tags the student has associated with them (if any).
@@ -1904,6 +1906,7 @@ msgstr ""
#. with the note
#. in order to group similar notes together and help with search.
#: lms/static/js/edxnotes/views/tabs/tags.js
+#: cms/templates/js/tag-list.underscore
msgid "Tags"
msgstr ""
@@ -5844,6 +5847,7 @@ msgstr "Энэ шинэчлэлийг устгах уу?"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/pages/container_subviews.js
msgid "Copying"
msgstr ""
@@ -5853,26 +5857,31 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Pasting"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Some errors occurred"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files could not be added to the course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "You may need to update a file(s) manually"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid ""
"The following files already exist in this course but don't match the version"
" used by the component you pasted:"
@@ -5880,21 +5889,25 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "New file(s) added to Files & Uploads."
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files were imported to this course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "View files"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Dismiss"
msgstr ""
@@ -10358,6 +10371,10 @@ msgstr ""
msgid "Note: Do not hide graded assignments after they have been released."
msgstr ""
+#: cms/templates/js/publish-xblock.underscore
+msgid "Copy Unit"
+msgstr ""
+
#: cms/templates/js/release-date-editor.underscore
msgid "Release Date and Time"
msgstr ""
@@ -10536,6 +10553,10 @@ msgstr ""
msgid "Enable summaries"
msgstr ""
+#: cms/templates/js/tag-list.underscore
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/js/team-member.underscore
msgid "Current Role:"
msgstr ""
diff --git a/conf/locale/pl/LC_MESSAGES/django.mo b/conf/locale/pl/LC_MESSAGES/django.mo
index a34f99446d6c..151894692159 100644
Binary files a/conf/locale/pl/LC_MESSAGES/django.mo and b/conf/locale/pl/LC_MESSAGES/django.mo differ
diff --git a/conf/locale/pl/LC_MESSAGES/django.po b/conf/locale/pl/LC_MESSAGES/django.po
index 74b06e45d9ff..f3ab335bb9a0 100644
--- a/conf/locale/pl/LC_MESSAGES/django.po
+++ b/conf/locale/pl/LC_MESSAGES/django.po
@@ -11068,6 +11068,19 @@ msgid ""
"their answers and reshuffle selected items."
msgstr ""
+#: xmodule/library_content_block.py
+msgid "Source content library has not been specified."
+msgstr ""
+
+#: xmodule/library_content_block.py
+msgid "Content libraries are not available in the current runtime."
+msgstr ""
+
+#: xmodule/library_content_block.py
+#, python-brace-format
+msgid "Source content library does not exist: {source_library_id}"
+msgstr ""
+
#: xmodule/library_content_block.py
msgid "This component is out of date. The library has new content."
msgstr "Ten element jest przestarzały. Biblioteka zawiera nową wersję treści."
@@ -11104,8 +11117,9 @@ msgid "Select a Library."
msgstr "Wybierz bibliotekę."
#: xmodule/library_content_block.py
-msgid "There are no matching problem types in the specified libraries."
-msgstr "Nie odnaleziono pasujących typów ćwiczeń we wskazanych bibliotekach."
+#, python-brace-format
+msgid "There are no problems in the specified library of type {capa_type}."
+msgstr ""
#: xmodule/library_content_block.py
msgid "Select another problem type."
@@ -13322,14 +13336,6 @@ msgstr "Wymagania"
msgid "Details"
msgstr "Szczegóły"
-#. #-#-#-#-# mako.po (edx-platform) #-#-#-#-#
-#. Translators: this is a verb describing the action of viewing more details
-#: cms/templates/studio_xblock_wrapper.html
-#: lms/templates/wiki/includes/article_menu.html
-#: wiki/templates/wiki/includes/article_menu.html
-msgid "View"
-msgstr "Pokaż"
-
#: cms/templates/maintenance/_announcement_edit.html
#: lms/templates/problem.html lms/templates/word_cloud.html
msgid "Save"
@@ -14116,6 +14122,14 @@ msgstr "Sekwencja"
msgid "Completed"
msgstr "Ukończono"
+#: lms/templates/seq_block.html
+msgid "New Unit"
+msgstr ""
+
+#: lms/templates/seq_block.html
+msgid "Paste as new unit"
+msgstr ""
+
#: lms/templates/signup_modal.html
msgid "Sign Up for {platform_name}"
msgstr "Zarejestruj się w {platform_name}"
@@ -19781,6 +19795,11 @@ msgstr "Rozumiem!"
msgid "Learn more"
msgstr "Dowiedz się więcej "
+#: lms/templates/wiki/includes/article_menu.html
+#: wiki/templates/wiki/includes/article_menu.html
+msgid "View"
+msgstr "Pokaż"
+
#: lms/templates/wiki/includes/article_menu.html
msgid "{span_start}(active){span_end}"
msgstr "{span_start}(active){span_end}"
@@ -20486,6 +20505,10 @@ msgstr "Zobacz wersję próbną"
msgid "Preview the courseware in the LMS"
msgstr "Zobacz podgląd materiału kursowego w LMS"
+#: cms/templates/container.html
+msgid "Collapse All"
+msgstr ""
+
#: cms/templates/container.html
msgid "Adding components"
msgstr "Dodawanie elementów"
@@ -23438,14 +23461,26 @@ msgstr ""
"egzaminy i określać w jakim stopniu dane ćwiczenie wpływa na końcową ocenę "
"studenta."
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Importing components"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Expand or Collapse"
msgstr "Rozwiń lub zwiń"
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Select this problem"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Copy to Clipboard"
msgstr ""
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Manage Access"
msgstr ""
diff --git a/conf/locale/pl/LC_MESSAGES/djangojs.po b/conf/locale/pl/LC_MESSAGES/djangojs.po
index 3339cbbe5b9c..b7547547c001 100644
--- a/conf/locale/pl/LC_MESSAGES/djangojs.po
+++ b/conf/locale/pl/LC_MESSAGES/djangojs.po
@@ -116,7 +116,7 @@ msgid ""
msgstr ""
"Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
-"POT-Creation-Date: 2023-11-19 20:43+0000\n"
+"POT-Creation-Date: 2023-12-03 20:43+0000\n"
"PO-Revision-Date: 2014-06-11 15:18+0000\n"
"Last-Translator: Klara Sielicka-Baryłka, 2022\n"
"Language-Team: Polish (http://app.transifex.com/open-edx/edx-platform/language/pl/)\n"
@@ -238,7 +238,8 @@ msgstr "Wybierz plik"
#: cms/static/js/views/course_info_update.js
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js
-#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js
+#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js
+#: xmodule/js/src/html/edit.js
#: common/static/common/templates/discussion/templates.underscore
#: lms/templates/learner_dashboard/verification_popover.underscore
msgid "OK"
@@ -6227,6 +6228,7 @@ msgstr "Czy na pewno chcesz usunąć tę zmianę?"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/pages/container_subviews.js
msgid "Copying"
msgstr ""
@@ -6236,26 +6238,31 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Pasting"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Some errors occurred"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files could not be added to the course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "You may need to update a file(s) manually"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid ""
"The following files already exist in this course but don't match the version"
" used by the component you pasted:"
@@ -6263,21 +6270,25 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "New file(s) added to Files & Uploads."
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files were imported to this course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "View files"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Dismiss"
msgstr ""
@@ -10952,6 +10963,10 @@ msgid "Note: Do not hide graded assignments after they have been released."
msgstr ""
"Uwaga: nie ukrywaj zadań, które podlegają ocenie, po ich upublicznieniu."
+#: cms/templates/js/publish-xblock.underscore
+msgid "Copy Unit"
+msgstr ""
+
#: cms/templates/js/release-date-editor.underscore
msgid "Release Date and Time"
msgstr "Data i czas upublicznienia"
@@ -11152,6 +11167,10 @@ msgstr ""
msgid "Enable summaries"
msgstr ""
+#: cms/templates/js/tag-list.underscore
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/js/team-member.underscore
msgid "Current Role:"
msgstr "Obecna rola:"
diff --git a/conf/locale/pt_BR/LC_MESSAGES/djangojs.po b/conf/locale/pt_BR/LC_MESSAGES/djangojs.po
index 4f78683b89d4..322fa2c462f1 100644
--- a/conf/locale/pt_BR/LC_MESSAGES/djangojs.po
+++ b/conf/locale/pt_BR/LC_MESSAGES/djangojs.po
@@ -246,7 +246,7 @@ msgid ""
msgstr ""
"Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
-"POT-Creation-Date: 2023-11-19 20:43+0000\n"
+"POT-Creation-Date: 2023-12-03 20:43+0000\n"
"PO-Revision-Date: 2014-06-11 15:18+0000\n"
"Last-Translator: Rodrigo Rocha , 2020\n"
"Language-Team: Portuguese (Brazil) (http://app.transifex.com/open-edx/edx-platform/language/pt_BR/)\n"
@@ -351,7 +351,8 @@ msgstr ""
#: cms/static/js/views/course_info_update.js
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js
-#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js
+#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js
+#: xmodule/js/src/html/edit.js
msgid "OK"
msgstr "OK"
@@ -6129,6 +6130,7 @@ msgstr "Você tem certeza de que deseja apagar essa atualização?"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/pages/container_subviews.js
msgid "Copying"
msgstr ""
@@ -6138,26 +6140,31 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Pasting"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Some errors occurred"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files could not be added to the course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "You may need to update a file(s) manually"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid ""
"The following files already exist in this course but don't match the version"
" used by the component you pasted:"
@@ -6165,21 +6172,25 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "New file(s) added to Files & Uploads."
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files were imported to this course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "View files"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Dismiss"
msgstr ""
@@ -10746,6 +10757,10 @@ msgstr ""
msgid "Note: Do not hide graded assignments after they have been released."
msgstr ""
+#: cms/templates/js/publish-xblock.underscore
+msgid "Copy Unit"
+msgstr ""
+
#: cms/templates/js/release-date-editor.underscore
msgid "Release Date and Time"
msgstr "Data e Horário de Lançamento"
@@ -10928,6 +10943,10 @@ msgstr ""
msgid "Enable summaries"
msgstr ""
+#: cms/templates/js/tag-list.underscore
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/js/team-member.underscore
msgid "Current Role:"
msgstr "Papel Atual:"
diff --git a/conf/locale/pt_PT/LC_MESSAGES/django.mo b/conf/locale/pt_PT/LC_MESSAGES/django.mo
index a7d6755555d8..d41c58a5f3a5 100644
Binary files a/conf/locale/pt_PT/LC_MESSAGES/django.mo and b/conf/locale/pt_PT/LC_MESSAGES/django.mo differ
diff --git a/conf/locale/pt_PT/LC_MESSAGES/django.po b/conf/locale/pt_PT/LC_MESSAGES/django.po
index c3dce3aee7b0..e864c6f81172 100644
--- a/conf/locale/pt_PT/LC_MESSAGES/django.po
+++ b/conf/locale/pt_PT/LC_MESSAGES/django.po
@@ -11811,6 +11811,19 @@ msgstr ""
"utilizadores possam reiniciar as suas respostas e reordenar os itens "
"seleccionados."
+#: xmodule/library_content_block.py
+msgid "Source content library has not been specified."
+msgstr ""
+
+#: xmodule/library_content_block.py
+msgid "Content libraries are not available in the current runtime."
+msgstr ""
+
+#: xmodule/library_content_block.py
+#, python-brace-format
+msgid "Source content library does not exist: {source_library_id}"
+msgstr ""
+
#: xmodule/library_content_block.py
msgid "This component is out of date. The library has new content."
msgstr "Este componente está desatualizado. A biblioteca tem conteúdo novo."
@@ -11847,10 +11860,9 @@ msgid "Select a Library."
msgstr "Selecione uma biblioteca."
#: xmodule/library_content_block.py
-msgid "There are no matching problem types in the specified libraries."
+#, python-brace-format
+msgid "There are no problems in the specified library of type {capa_type}."
msgstr ""
-"Não existem tipos de problemas correspondentes nas bibliotecas "
-"especificadas."
#: xmodule/library_content_block.py
msgid "Select another problem type."
@@ -14135,14 +14147,6 @@ msgstr "Requisitos"
msgid "Details"
msgstr "Detalhes"
-#. #-#-#-#-# mako.po (edx-platform) #-#-#-#-#
-#. Translators: this is a verb describing the action of viewing more details
-#: cms/templates/studio_xblock_wrapper.html
-#: lms/templates/wiki/includes/article_menu.html
-#: wiki/templates/wiki/includes/article_menu.html
-msgid "View"
-msgstr "Ver"
-
#: cms/templates/maintenance/_announcement_edit.html
#: lms/templates/problem.html lms/templates/word_cloud.html
msgid "Save"
@@ -14928,6 +14932,14 @@ msgstr "Sequência"
msgid "Completed"
msgstr "Concluído"
+#: lms/templates/seq_block.html
+msgid "New Unit"
+msgstr ""
+
+#: lms/templates/seq_block.html
+msgid "Paste as new unit"
+msgstr ""
+
#: lms/templates/signup_modal.html
msgid "Sign Up for {platform_name}"
msgstr "Inscrever-se para {platform_name}"
@@ -20974,6 +20986,11 @@ msgstr "Compreendido!"
msgid "Learn more"
msgstr "Saber mais"
+#: lms/templates/wiki/includes/article_menu.html
+#: wiki/templates/wiki/includes/article_menu.html
+msgid "View"
+msgstr "Ver"
+
#: lms/templates/wiki/includes/article_menu.html
msgid "{span_start}(active){span_end}"
msgstr "{span_start}(active){span_end}"
@@ -21689,6 +21706,10 @@ msgstr "Visualizar Versão Ao Vivo"
msgid "Preview the courseware in the LMS"
msgstr "Pré-visualizar o material didático no LMS"
+#: cms/templates/container.html
+msgid "Collapse All"
+msgstr ""
+
#: cms/templates/container.html
msgid "Adding components"
msgstr "Adicionar componentes"
@@ -24713,14 +24734,26 @@ msgstr ""
"laboratórios, questionários, e exames, e especifique quanto uma nota de cada"
" aluno vale para cada tipo de tarefa."
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Importing components"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Expand or Collapse"
msgstr "Expandir ou Encolher"
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Select this problem"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Copy to Clipboard"
msgstr ""
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Manage Access"
msgstr "Gerir o Acesso"
diff --git a/conf/locale/pt_PT/LC_MESSAGES/djangojs.po b/conf/locale/pt_PT/LC_MESSAGES/djangojs.po
index 908665e804c8..15f9389803e6 100644
--- a/conf/locale/pt_PT/LC_MESSAGES/djangojs.po
+++ b/conf/locale/pt_PT/LC_MESSAGES/djangojs.po
@@ -113,7 +113,7 @@ msgid ""
msgstr ""
"Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
-"POT-Creation-Date: 2023-11-19 20:43+0000\n"
+"POT-Creation-Date: 2023-12-03 20:43+0000\n"
"PO-Revision-Date: 2014-06-11 15:18+0000\n"
"Last-Translator: Ivo Branco , 2021,2023\n"
"Language-Team: Portuguese (Portugal) (http://app.transifex.com/open-edx/edx-platform/language/pt_PT/)\n"
@@ -239,7 +239,8 @@ msgstr "Escolha um ficheiro"
#: cms/static/js/views/course_info_update.js
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js
-#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js
+#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js
+#: xmodule/js/src/html/edit.js
#: common/static/common/templates/discussion/templates.underscore
#: lms/templates/learner_dashboard/verification_popover.underscore
msgid "OK"
@@ -6450,6 +6451,7 @@ msgstr "Tem certeza que quer eliminar esta atualização?"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/pages/container_subviews.js
msgid "Copying"
msgstr ""
@@ -6459,26 +6461,31 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Pasting"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Some errors occurred"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files could not be added to the course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "You may need to update a file(s) manually"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid ""
"The following files already exist in this course but don't match the version"
" used by the component you pasted:"
@@ -6486,21 +6493,25 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "New file(s) added to Files & Uploads."
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files were imported to this course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "View files"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Dismiss"
msgstr ""
@@ -11318,6 +11329,10 @@ msgstr "Ocultar dos estudantes"
msgid "Note: Do not hide graded assignments after they have been released."
msgstr "Nota: não oculte as tarefas com classificação após a sua divulgação."
+#: cms/templates/js/publish-xblock.underscore
+msgid "Copy Unit"
+msgstr ""
+
#: cms/templates/js/release-date-editor.underscore
msgid "Release Date and Time"
msgstr "Data e Hora de Lançamento"
@@ -11523,6 +11538,10 @@ msgstr ""
msgid "Enable summaries"
msgstr ""
+#: cms/templates/js/tag-list.underscore
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/js/team-member.underscore
msgid "Current Role:"
msgstr "Perfil Atual:"
diff --git a/conf/locale/rtl/LC_MESSAGES/django.mo b/conf/locale/rtl/LC_MESSAGES/django.mo
index 92978710b0d3..fe6356d5adc2 100644
Binary files a/conf/locale/rtl/LC_MESSAGES/django.mo and b/conf/locale/rtl/LC_MESSAGES/django.mo differ
diff --git a/conf/locale/rtl/LC_MESSAGES/django.po b/conf/locale/rtl/LC_MESSAGES/django.po
index 3b8636d196b3..9a2d358c046d 100644
--- a/conf/locale/rtl/LC_MESSAGES/django.po
+++ b/conf/locale/rtl/LC_MESSAGES/django.po
@@ -38,8 +38,8 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.1a\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
-"POT-Creation-Date: 2023-11-26 20:36+0000\n"
-"PO-Revision-Date: 2023-11-26 20:36:15.034816\n"
+"POT-Creation-Date: 2023-12-05 14:25+0000\n"
+"PO-Revision-Date: 2023-12-05 14:25:08.102305\n"
"Last-Translator: \n"
"Language-Team: openedx-translation \n"
"Language: rtl\n"
@@ -8181,6 +8181,10 @@ msgstr ""
msgid "The '{field_name}' field cannot be edited."
msgstr "Ŧɥǝ '{field_name}' ɟᴉǝld ɔɐnnøʇ bǝ ǝdᴉʇǝd."
+#: openedx/core/djangoapps/user_api/accounts/api.py
+msgid "Full name can't be longer than 255 symbols"
+msgstr "Fnll nɐɯǝ ɔɐn'ʇ bǝ lønƃǝɹ ʇɥɐn 255 sʎɯbøls"
+
#: openedx/core/djangoapps/user_api/accounts/api.py
#: openedx/core/djangoapps/user_authn/views/registration_form.py
msgid "Enter a valid name"
@@ -13016,13 +13020,11 @@ msgid "{previous_groups}, {current_group}"
msgstr "{previous_groups}, {current_group}"
#: cms/djangoapps/contentstore/utils.py
-#: cms/djangoapps/contentstore/xblock_storage_handlers/view_handlers.py
#, python-brace-format
msgid "Duplicate of {0}"
msgstr "Đndlᴉɔɐʇǝ øɟ {0}"
#: cms/djangoapps/contentstore/utils.py
-#: cms/djangoapps/contentstore/xblock_storage_handlers/view_handlers.py
#, python-brace-format
msgid "Duplicate of '{0}'"
msgstr "Đndlᴉɔɐʇǝ øɟ '{0}'"
@@ -14516,6 +14518,14 @@ msgstr "Sǝbnǝnɔǝ"
msgid "Completed"
msgstr "Ȼøɯdlǝʇǝd"
+#: lms/templates/seq_block.html
+msgid "New Unit"
+msgstr "Nǝʍ Ʉnᴉʇ"
+
+#: lms/templates/seq_block.html
+msgid "Paste as new unit"
+msgstr "Ᵽɐsʇǝ ɐs nǝʍ nnᴉʇ"
+
#: lms/templates/signup_modal.html
msgid "Sign Up for {platform_name}"
msgstr "Sᴉƃn Ʉd ɟøɹ {platform_name}"
diff --git a/conf/locale/rtl/LC_MESSAGES/djangojs.mo b/conf/locale/rtl/LC_MESSAGES/djangojs.mo
index 9dd7f7c6f3f9..03167522402b 100644
Binary files a/conf/locale/rtl/LC_MESSAGES/djangojs.mo and b/conf/locale/rtl/LC_MESSAGES/djangojs.mo differ
diff --git a/conf/locale/rtl/LC_MESSAGES/djangojs.po b/conf/locale/rtl/LC_MESSAGES/djangojs.po
index 180a4ac9c29e..e80520f30e8f 100644
--- a/conf/locale/rtl/LC_MESSAGES/djangojs.po
+++ b/conf/locale/rtl/LC_MESSAGES/djangojs.po
@@ -32,8 +32,8 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.1a\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
-"POT-Creation-Date: 2023-11-26 20:36+0000\n"
-"PO-Revision-Date: 2023-11-26 20:36:15.164044\n"
+"POT-Creation-Date: 2023-12-05 14:24+0000\n"
+"PO-Revision-Date: 2023-12-05 14:25:07.995704\n"
"Last-Translator: \n"
"Language-Team: openedx-translation \n"
"Language: rtl\n"
@@ -158,7 +158,8 @@ msgstr "Ȼɥøøsǝ Fᴉlǝ"
#: cms/static/js/views/course_info_update.js
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js
-#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js
+#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js
+#: xmodule/js/src/html/edit.js
#: common/static/common/templates/discussion/templates.underscore
#: lms/templates/learner_dashboard/verification_popover.underscore
msgid "OK"
@@ -6243,6 +6244,7 @@ msgstr "Ⱥɹǝ ʎøn snɹǝ ʎøn ʍɐnʇ ʇø dǝlǝʇǝ ʇɥᴉs nddɐʇǝ?"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/pages/container_subviews.js
msgid "Copying"
msgstr "Ȼødʎᴉnƃ"
@@ -6252,26 +6254,31 @@ msgstr "Ȼødʎ øɟ '{componentDisplayName}'"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Pasting"
msgstr "Ᵽɐsʇᴉnƃ"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Some errors occurred"
msgstr "Søɯǝ ǝɹɹøɹs øɔɔnɹɹǝd"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files could not be added to the course:"
msgstr "Ŧɥǝ ɟølløʍᴉnƃ ɹǝbnᴉɹǝd ɟᴉlǝs ɔønld nøʇ bǝ ɐddǝd ʇø ʇɥǝ ɔønɹsǝ:"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "You may need to update a file(s) manually"
msgstr "Ɏøn ɯɐʎ nǝǝd ʇø nddɐʇǝ ɐ ɟᴉlǝ(s) ɯɐnnɐllʎ"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid ""
"The following files already exist in this course but don't match the version"
" used by the component you pasted:"
@@ -6281,21 +6288,25 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "New file(s) added to Files & Uploads."
msgstr "Nǝʍ ɟᴉlǝ(s) ɐddǝd ʇø Fᴉlǝs & Ʉdløɐds."
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files were imported to this course:"
msgstr "Ŧɥǝ ɟølløʍᴉnƃ ɹǝbnᴉɹǝd ɟᴉlǝs ʍǝɹǝ ᴉɯdøɹʇǝd ʇø ʇɥᴉs ɔønɹsǝ:"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "View files"
msgstr "Vᴉǝʍ ɟᴉlǝs"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Dismiss"
msgstr "Đᴉsɯᴉss"
@@ -11066,6 +11077,10 @@ msgstr "Ħᴉdǝ ɟɹøɯ lǝɐɹnǝɹs"
msgid "Note: Do not hide graded assignments after they have been released."
msgstr "Nøʇǝ: Đø nøʇ ɥᴉdǝ ƃɹɐdǝd ɐssᴉƃnɯǝnʇs ɐɟʇǝɹ ʇɥǝʎ ɥɐʌǝ bǝǝn ɹǝlǝɐsǝd."
+#: cms/templates/js/publish-xblock.underscore
+msgid "Copy Unit"
+msgstr "Ȼødʎ Ʉnᴉʇ"
+
#: cms/templates/js/release-date-editor.underscore
msgid "Release Date and Time"
msgstr "Ɍǝlǝɐsǝ Đɐʇǝ ɐnd Ŧᴉɯǝ"
diff --git a/conf/locale/ru/LC_MESSAGES/djangojs.po b/conf/locale/ru/LC_MESSAGES/djangojs.po
index a88694321057..d722f14d35b8 100644
--- a/conf/locale/ru/LC_MESSAGES/djangojs.po
+++ b/conf/locale/ru/LC_MESSAGES/djangojs.po
@@ -193,7 +193,7 @@ msgid ""
msgstr ""
"Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
-"POT-Creation-Date: 2023-11-19 20:43+0000\n"
+"POT-Creation-Date: 2023-12-03 20:43+0000\n"
"PO-Revision-Date: 2014-06-11 15:18+0000\n"
"Last-Translator: ashed , 2022-2023\n"
"Language-Team: Russian (http://app.transifex.com/open-edx/edx-platform/language/ru/)\n"
@@ -303,7 +303,8 @@ msgstr "Выберите файл"
#: cms/static/js/views/course_info_update.js
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js
-#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js
+#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js
+#: xmodule/js/src/html/edit.js
#: common/static/common/templates/discussion/templates.underscore
#: lms/templates/learner_dashboard/verification_popover.underscore
msgid "OK"
@@ -6311,6 +6312,7 @@ msgstr "Вы уверены, что хотите удалить это обно
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/pages/container_subviews.js
msgid "Copying"
msgstr ""
@@ -6320,26 +6322,31 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Pasting"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Some errors occurred"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files could not be added to the course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "You may need to update a file(s) manually"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid ""
"The following files already exist in this course but don't match the version"
" used by the component you pasted:"
@@ -6347,21 +6354,25 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "New file(s) added to Files & Uploads."
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files were imported to this course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "View files"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Dismiss"
msgstr ""
@@ -11030,6 +11041,10 @@ msgstr ""
"Примечание: не закрывайте доступ к заданиям, выполняемым на оценку, после их"
" выпуска."
+#: cms/templates/js/publish-xblock.underscore
+msgid "Copy Unit"
+msgstr ""
+
#: cms/templates/js/release-date-editor.underscore
msgid "Release Date and Time"
msgstr "Дата и время выпуска"
@@ -11227,6 +11242,10 @@ msgstr ""
msgid "Enable summaries"
msgstr ""
+#: cms/templates/js/tag-list.underscore
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/js/team-member.underscore
msgid "Current Role:"
msgstr "Текущая роль:"
diff --git a/conf/locale/sk/LC_MESSAGES/django.po b/conf/locale/sk/LC_MESSAGES/django.po
index 40e4b5d6b4f1..056864f523a1 100644
--- a/conf/locale/sk/LC_MESSAGES/django.po
+++ b/conf/locale/sk/LC_MESSAGES/django.po
@@ -10369,6 +10369,19 @@ msgid ""
"their answers and reshuffle selected items."
msgstr ""
+#: xmodule/library_content_block.py
+msgid "Source content library has not been specified."
+msgstr ""
+
+#: xmodule/library_content_block.py
+msgid "Content libraries are not available in the current runtime."
+msgstr ""
+
+#: xmodule/library_content_block.py
+#, python-brace-format
+msgid "Source content library does not exist: {source_library_id}"
+msgstr ""
+
#: xmodule/library_content_block.py
msgid "This component is out of date. The library has new content."
msgstr ""
@@ -10403,7 +10416,8 @@ msgid "Select a Library."
msgstr ""
#: xmodule/library_content_block.py
-msgid "There are no matching problem types in the specified libraries."
+#, python-brace-format
+msgid "There are no problems in the specified library of type {capa_type}."
msgstr ""
#: xmodule/library_content_block.py
@@ -12427,12 +12441,6 @@ msgstr "Požiadavky"
msgid "Details"
msgstr "Podrobnosti"
-#. Translators: this is a verb describing the action of viewing more details
-#: cms/templates/studio_xblock_wrapper.html
-#: lms/templates/wiki/includes/article_menu.html
-msgid "View"
-msgstr "Zobraziť"
-
#: cms/templates/maintenance/_announcement_edit.html
#: lms/templates/problem.html lms/templates/word_cloud.html
msgid "Save"
@@ -13180,6 +13188,14 @@ msgstr ""
msgid "Completed"
msgstr ""
+#: lms/templates/seq_block.html
+msgid "New Unit"
+msgstr ""
+
+#: lms/templates/seq_block.html
+msgid "Paste as new unit"
+msgstr ""
+
#: lms/templates/signup_modal.html
msgid "Sign Up for {platform_name}"
msgstr ""
@@ -18333,6 +18349,10 @@ msgstr ""
msgid "Learn more"
msgstr ""
+#: lms/templates/wiki/includes/article_menu.html
+msgid "View"
+msgstr "Zobraziť"
+
#: lms/templates/wiki/includes/article_menu.html
msgid "{span_start}(active){span_end}"
msgstr ""
@@ -18982,6 +19002,10 @@ msgstr ""
msgid "Preview the courseware in the LMS"
msgstr ""
+#: cms/templates/container.html
+msgid "Collapse All"
+msgstr ""
+
#: cms/templates/container.html
msgid "Adding components"
msgstr ""
@@ -21527,14 +21551,26 @@ msgid ""
"worth."
msgstr ""
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Importing components"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Expand or Collapse"
msgstr ""
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Select this problem"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Copy to Clipboard"
msgstr ""
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Manage Access"
msgstr ""
diff --git a/conf/locale/sk/LC_MESSAGES/djangojs.po b/conf/locale/sk/LC_MESSAGES/djangojs.po
index 942a439e6d52..c90d29897f6a 100644
--- a/conf/locale/sk/LC_MESSAGES/djangojs.po
+++ b/conf/locale/sk/LC_MESSAGES/djangojs.po
@@ -46,7 +46,7 @@ msgid ""
msgstr ""
"Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
-"POT-Creation-Date: 2023-11-19 20:43+0000\n"
+"POT-Creation-Date: 2023-12-03 20:43+0000\n"
"PO-Revision-Date: 2014-06-11 15:18+0000\n"
"Last-Translator: \n"
"Language-Team: Slovak (http://app.transifex.com/open-edx/edx-platform/language/sk/)\n"
@@ -145,7 +145,8 @@ msgstr "Vybrať súbor"
#: cms/static/js/views/course_info_update.js
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js
-#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js
+#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js
+#: xmodule/js/src/html/edit.js
msgid "OK"
msgstr "OK"
@@ -5869,6 +5870,7 @@ msgstr "Skutočne chcete odstrániť túto aktualizáciu?"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/pages/container_subviews.js
msgid "Copying"
msgstr ""
@@ -5878,26 +5880,31 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Pasting"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Some errors occurred"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files could not be added to the course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "You may need to update a file(s) manually"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid ""
"The following files already exist in this course but don't match the version"
" used by the component you pasted:"
@@ -5905,21 +5912,25 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "New file(s) added to Files & Uploads."
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files were imported to this course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "View files"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Dismiss"
msgstr ""
@@ -10391,6 +10402,10 @@ msgstr ""
msgid "Note: Do not hide graded assignments after they have been released."
msgstr ""
+#: cms/templates/js/publish-xblock.underscore
+msgid "Copy Unit"
+msgstr ""
+
#: cms/templates/js/release-date-editor.underscore
msgid "Release Date and Time"
msgstr ""
@@ -10569,6 +10584,10 @@ msgstr ""
msgid "Enable summaries"
msgstr ""
+#: cms/templates/js/tag-list.underscore
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/js/team-member.underscore
msgid "Current Role:"
msgstr ""
diff --git a/conf/locale/sw_KE/LC_MESSAGES/django.po b/conf/locale/sw_KE/LC_MESSAGES/django.po
index 1f3699a31285..a1f9851ea6ea 100644
--- a/conf/locale/sw_KE/LC_MESSAGES/django.po
+++ b/conf/locale/sw_KE/LC_MESSAGES/django.po
@@ -10485,6 +10485,19 @@ msgid ""
"their answers and reshuffle selected items."
msgstr ""
+#: xmodule/library_content_block.py
+msgid "Source content library has not been specified."
+msgstr ""
+
+#: xmodule/library_content_block.py
+msgid "Content libraries are not available in the current runtime."
+msgstr ""
+
+#: xmodule/library_content_block.py
+#, python-brace-format
+msgid "Source content library does not exist: {source_library_id}"
+msgstr ""
+
#: xmodule/library_content_block.py
msgid "This component is out of date. The library has new content."
msgstr ""
@@ -10519,7 +10532,8 @@ msgid "Select a Library."
msgstr "Chagua Maktaba."
#: xmodule/library_content_block.py
-msgid "There are no matching problem types in the specified libraries."
+#, python-brace-format
+msgid "There are no problems in the specified library of type {capa_type}."
msgstr ""
#: xmodule/library_content_block.py
@@ -12555,12 +12569,6 @@ msgstr "Yanayohitajika"
msgid "Details"
msgstr "Utondoti"
-#. Translators: this is a verb describing the action of viewing more details
-#: cms/templates/studio_xblock_wrapper.html
-#: lms/templates/wiki/includes/article_menu.html
-msgid "View"
-msgstr "Tazama"
-
#: cms/templates/maintenance/_announcement_edit.html
#: lms/templates/problem.html lms/templates/word_cloud.html
msgid "Save"
@@ -13326,6 +13334,14 @@ msgstr "Mfululizo"
msgid "Completed"
msgstr ""
+#: lms/templates/seq_block.html
+msgid "New Unit"
+msgstr ""
+
+#: lms/templates/seq_block.html
+msgid "Paste as new unit"
+msgstr ""
+
#: lms/templates/signup_modal.html
msgid "Sign Up for {platform_name}"
msgstr "Jiandikishe mtandaoni kwa {platform_name}"
@@ -18893,6 +18909,10 @@ msgstr "Umeipata!"
msgid "Learn more"
msgstr "Jifunze zaidi"
+#: lms/templates/wiki/includes/article_menu.html
+msgid "View"
+msgstr "Tazama"
+
#: lms/templates/wiki/includes/article_menu.html
msgid "{span_start}(active){span_end}"
msgstr "{span_start}(active){span_end}"
@@ -19581,6 +19601,10 @@ msgstr "Tazama toleo mubashara "
msgid "Preview the courseware in the LMS"
msgstr "Mtazamo kabla wa Maudhui ya kozi katika LMS"
+#: cms/templates/container.html
+msgid "Collapse All"
+msgstr ""
+
#: cms/templates/container.html
msgid "Adding components"
msgstr "Kuongeza vipengele"
@@ -22240,14 +22264,26 @@ msgid ""
"worth."
msgstr ""
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Importing components"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Expand or Collapse"
msgstr ""
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Select this problem"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Copy to Clipboard"
msgstr ""
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Manage Access"
msgstr ""
diff --git a/conf/locale/sw_KE/LC_MESSAGES/djangojs.po b/conf/locale/sw_KE/LC_MESSAGES/djangojs.po
index 29bb2ec03c3b..38532de8dc20 100644
--- a/conf/locale/sw_KE/LC_MESSAGES/djangojs.po
+++ b/conf/locale/sw_KE/LC_MESSAGES/djangojs.po
@@ -71,7 +71,7 @@ msgid ""
msgstr ""
"Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
-"POT-Creation-Date: 2023-11-19 20:43+0000\n"
+"POT-Creation-Date: 2023-12-03 20:43+0000\n"
"PO-Revision-Date: 2014-06-11 15:18+0000\n"
"Last-Translator: YAHAYA MWAVURIZI , 2017\n"
"Language-Team: Swahili (Kenya) (http://app.transifex.com/open-edx/edx-platform/language/sw_KE/)\n"
@@ -177,7 +177,8 @@ msgstr "Chagua Faili"
#: cms/static/js/views/course_info_update.js
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js
-#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js
+#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js
+#: xmodule/js/src/html/edit.js
#: common/static/common/templates/discussion/templates.underscore
#: lms/templates/learner_dashboard/verification_popover.underscore
msgid "OK"
@@ -5971,6 +5972,7 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/pages/container_subviews.js
msgid "Copying"
msgstr ""
@@ -5980,26 +5982,31 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Pasting"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Some errors occurred"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files could not be added to the course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "You may need to update a file(s) manually"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid ""
"The following files already exist in this course but don't match the version"
" used by the component you pasted:"
@@ -6007,21 +6014,25 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "New file(s) added to Files & Uploads."
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files were imported to this course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "View files"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Dismiss"
msgstr ""
@@ -10589,6 +10600,10 @@ msgstr "Ficha isionekane na wanafunzi"
msgid "Note: Do not hide graded assignments after they have been released."
msgstr "Zingatia: Usifiche mazoezi yalipewa madara baada ya kutolewa kwake."
+#: cms/templates/js/publish-xblock.underscore
+msgid "Copy Unit"
+msgstr ""
+
#: cms/templates/js/release-date-editor.underscore
msgid "Release Date and Time"
msgstr ""
@@ -10784,6 +10799,10 @@ msgstr ""
msgid "Enable summaries"
msgstr ""
+#: cms/templates/js/tag-list.underscore
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/js/team-member.underscore
msgid "Current Role:"
msgstr "Wadhifa wako Hivi sasa:"
diff --git a/conf/locale/th/LC_MESSAGES/django.po b/conf/locale/th/LC_MESSAGES/django.po
index 4391c2364045..881f02d14dc3 100644
--- a/conf/locale/th/LC_MESSAGES/django.po
+++ b/conf/locale/th/LC_MESSAGES/django.po
@@ -10165,6 +10165,19 @@ msgid ""
"their answers and reshuffle selected items."
msgstr ""
+#: xmodule/library_content_block.py
+msgid "Source content library has not been specified."
+msgstr ""
+
+#: xmodule/library_content_block.py
+msgid "Content libraries are not available in the current runtime."
+msgstr ""
+
+#: xmodule/library_content_block.py
+#, python-brace-format
+msgid "Source content library does not exist: {source_library_id}"
+msgstr ""
+
#: xmodule/library_content_block.py
msgid "This component is out of date. The library has new content."
msgstr ""
@@ -10199,7 +10212,8 @@ msgid "Select a Library."
msgstr ""
#: xmodule/library_content_block.py
-msgid "There are no matching problem types in the specified libraries."
+#, python-brace-format
+msgid "There are no problems in the specified library of type {capa_type}."
msgstr ""
#: xmodule/library_content_block.py
@@ -12208,12 +12222,6 @@ msgstr "ความต้องการ"
msgid "Details"
msgstr "รายละเอียด"
-#. Translators: this is a verb describing the action of viewing more details
-#: cms/templates/studio_xblock_wrapper.html
-#: lms/templates/wiki/includes/article_menu.html
-msgid "View"
-msgstr "ดู"
-
#: cms/templates/maintenance/_announcement_edit.html
#: lms/templates/problem.html lms/templates/word_cloud.html
msgid "Save"
@@ -12958,6 +12966,14 @@ msgstr ""
msgid "Completed"
msgstr "เสร็จสิ้น"
+#: lms/templates/seq_block.html
+msgid "New Unit"
+msgstr ""
+
+#: lms/templates/seq_block.html
+msgid "Paste as new unit"
+msgstr ""
+
#: lms/templates/signup_modal.html
msgid "Sign Up for {platform_name}"
msgstr "สมัครสำหรับ {platform_name}"
@@ -18287,6 +18303,10 @@ msgstr "เข้าใจแล้ว!"
msgid "Learn more"
msgstr "เรียนรู้เพิ่มเติม"
+#: lms/templates/wiki/includes/article_menu.html
+msgid "View"
+msgstr "ดู"
+
#: lms/templates/wiki/includes/article_menu.html
msgid "{span_start}(active){span_end}"
msgstr "{span_start}(active){span_end} "
@@ -18961,6 +18981,10 @@ msgstr "เวอร์ชั่นดูสด"
msgid "Preview the courseware in the LMS"
msgstr "ชมตัวอย่างบทเรียนใน LMS"
+#: cms/templates/container.html
+msgid "Collapse All"
+msgstr ""
+
#: cms/templates/container.html
msgid "Adding components"
msgstr "การเพิ่มส่วนประกอบ"
@@ -21733,14 +21757,26 @@ msgstr ""
"คุณยังสามารถสร้างประเภทของงานที่มอบหมาย เช่น การบ้าน, การทดลอง, ควิซ "
"และข้อสอบ และกำหนดว่างานประเภทไหนมีค่าเท่าไร"
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Importing components"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Expand or Collapse"
msgstr "ขยายเพิ่มหรือยุบทิ้ง"
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Select this problem"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Copy to Clipboard"
msgstr ""
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Manage Access"
msgstr ""
diff --git a/conf/locale/th/LC_MESSAGES/djangojs.po b/conf/locale/th/LC_MESSAGES/djangojs.po
index c5d280129b7a..55997e45c0c5 100644
--- a/conf/locale/th/LC_MESSAGES/djangojs.po
+++ b/conf/locale/th/LC_MESSAGES/djangojs.po
@@ -73,7 +73,7 @@ msgid ""
msgstr ""
"Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
-"POT-Creation-Date: 2023-11-19 20:43+0000\n"
+"POT-Creation-Date: 2023-12-03 20:43+0000\n"
"PO-Revision-Date: 2014-06-11 15:18+0000\n"
"Last-Translator: edx demo , 2019\n"
"Language-Team: Thai (http://app.transifex.com/open-edx/edx-platform/language/th/)\n"
@@ -182,7 +182,8 @@ msgstr ""
#: cms/static/js/views/course_info_update.js
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js
-#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js
+#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js
+#: xmodule/js/src/html/edit.js
msgid "OK"
msgstr "ตกลง"
@@ -5847,6 +5848,7 @@ msgstr "คุณแน่ใจหรือว่าต้องการที
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/pages/container_subviews.js
msgid "Copying"
msgstr ""
@@ -5856,26 +5858,31 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Pasting"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Some errors occurred"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files could not be added to the course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "You may need to update a file(s) manually"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid ""
"The following files already exist in this course but don't match the version"
" used by the component you pasted:"
@@ -5883,21 +5890,25 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "New file(s) added to Files & Uploads."
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files were imported to this course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "View files"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Dismiss"
msgstr ""
@@ -10381,6 +10392,10 @@ msgstr ""
msgid "Note: Do not hide graded assignments after they have been released."
msgstr ""
+#: cms/templates/js/publish-xblock.underscore
+msgid "Copy Unit"
+msgstr ""
+
#: cms/templates/js/release-date-editor.underscore
msgid "Release Date and Time"
msgstr ""
@@ -10559,6 +10574,10 @@ msgstr ""
msgid "Enable summaries"
msgstr ""
+#: cms/templates/js/tag-list.underscore
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/js/team-member.underscore
msgid "Current Role:"
msgstr ""
diff --git a/conf/locale/tr_TR/LC_MESSAGES/django.mo b/conf/locale/tr_TR/LC_MESSAGES/django.mo
index 2e412e5e7638..c2f87fb6b977 100644
Binary files a/conf/locale/tr_TR/LC_MESSAGES/django.mo and b/conf/locale/tr_TR/LC_MESSAGES/django.mo differ
diff --git a/conf/locale/tr_TR/LC_MESSAGES/django.po b/conf/locale/tr_TR/LC_MESSAGES/django.po
index 19b3497d9873..41c638d5da5f 100644
--- a/conf/locale/tr_TR/LC_MESSAGES/django.po
+++ b/conf/locale/tr_TR/LC_MESSAGES/django.po
@@ -11656,6 +11656,19 @@ msgstr ""
"böylece kullanıcılar yanıtlarını sıfırlayabilir ve seçilen öğeleri yeniden "
"düzenleyebilirler."
+#: xmodule/library_content_block.py
+msgid "Source content library has not been specified."
+msgstr ""
+
+#: xmodule/library_content_block.py
+msgid "Content libraries are not available in the current runtime."
+msgstr ""
+
+#: xmodule/library_content_block.py
+#, python-brace-format
+msgid "Source content library does not exist: {source_library_id}"
+msgstr ""
+
#: xmodule/library_content_block.py
msgid "This component is out of date. The library has new content."
msgstr "Bu bileşen güncel değil. Kütüphane yeni içeriğe sahip."
@@ -11692,8 +11705,9 @@ msgid "Select a Library."
msgstr "Bir Kütüphane Seçin."
#: xmodule/library_content_block.py
-msgid "There are no matching problem types in the specified libraries."
-msgstr "Belirtilen kütüphanelerde, eşleşen problem türleri yoktur."
+#, python-brace-format
+msgid "There are no problems in the specified library of type {capa_type}."
+msgstr ""
#: xmodule/library_content_block.py
msgid "Select another problem type."
@@ -13947,14 +13961,6 @@ msgstr "Gereklilikler"
msgid "Details"
msgstr "Ayrıntılar"
-#. #-#-#-#-# mako.po (edx-platform) #-#-#-#-#
-#. Translators: this is a verb describing the action of viewing more details
-#: cms/templates/studio_xblock_wrapper.html
-#: lms/templates/wiki/includes/article_menu.html
-#: wiki/templates/wiki/includes/article_menu.html
-msgid "View"
-msgstr "Görüntüle"
-
#: cms/templates/maintenance/_announcement_edit.html
#: lms/templates/problem.html lms/templates/word_cloud.html
msgid "Save"
@@ -14732,6 +14738,14 @@ msgstr "Sıralı"
msgid "Completed"
msgstr "Tamamlandı"
+#: lms/templates/seq_block.html
+msgid "New Unit"
+msgstr ""
+
+#: lms/templates/seq_block.html
+msgid "Paste as new unit"
+msgstr ""
+
#: lms/templates/signup_modal.html
msgid "Sign Up for {platform_name}"
msgstr "{platform_name} için kaydolun"
@@ -20644,6 +20658,11 @@ msgstr "Anladım!"
msgid "Learn more"
msgstr "Daha fazlasını öğren"
+#: lms/templates/wiki/includes/article_menu.html
+#: wiki/templates/wiki/includes/article_menu.html
+msgid "View"
+msgstr "Görüntüle"
+
#: lms/templates/wiki/includes/article_menu.html
msgid "{span_start}(active){span_end}"
msgstr "{span_start}(aktif){span_end}"
@@ -21359,6 +21378,10 @@ msgstr "Canlı Sürümü Görüntüle"
msgid "Preview the courseware in the LMS"
msgstr "LMS'deki ders içeriğini önizle"
+#: cms/templates/container.html
+msgid "Collapse All"
+msgstr ""
+
#: cms/templates/container.html
msgid "Adding components"
msgstr "Bileşenler ekleniyor"
@@ -24329,14 +24352,26 @@ msgstr ""
"her bir görevin öğrencinin notuna ne kadar katkıda bulunacağını "
"belirleyebilirsiniz."
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Importing components"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Expand or Collapse"
msgstr "Genişlet veya Daralt"
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Select this problem"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Copy to Clipboard"
msgstr ""
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Manage Access"
msgstr "Erişimi Yönet"
diff --git a/conf/locale/tr_TR/LC_MESSAGES/djangojs.po b/conf/locale/tr_TR/LC_MESSAGES/djangojs.po
index 65af4f6cd188..edfec9d786ce 100644
--- a/conf/locale/tr_TR/LC_MESSAGES/djangojs.po
+++ b/conf/locale/tr_TR/LC_MESSAGES/djangojs.po
@@ -110,7 +110,7 @@ msgid ""
msgstr ""
"Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
-"POT-Creation-Date: 2023-11-19 20:43+0000\n"
+"POT-Creation-Date: 2023-12-03 20:43+0000\n"
"PO-Revision-Date: 2014-06-11 15:18+0000\n"
"Last-Translator: Ali Işıngör , 2018,2020-2021,2023\n"
"Language-Team: Turkish (Turkey) (http://app.transifex.com/open-edx/edx-platform/language/tr_TR/)\n"
@@ -236,7 +236,8 @@ msgstr "Dosya Seç"
#: cms/static/js/views/course_info_update.js
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js
-#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js
+#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js
+#: xmodule/js/src/html/edit.js
#: common/static/common/templates/discussion/templates.underscore
#: lms/templates/learner_dashboard/verification_popover.underscore
msgid "OK"
@@ -6373,6 +6374,7 @@ msgstr "Bu güncellemeyi silmek istediğinize emin misiniz?"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/pages/container_subviews.js
msgid "Copying"
msgstr "Kopyalıyor"
@@ -6382,26 +6384,31 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Pasting"
msgstr "Yapıştırıyor"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Some errors occurred"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files could not be added to the course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "You may need to update a file(s) manually"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid ""
"The following files already exist in this course but don't match the version"
" used by the component you pasted:"
@@ -6409,21 +6416,25 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "New file(s) added to Files & Uploads."
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files were imported to this course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "View files"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Dismiss"
msgstr ""
@@ -11174,6 +11185,10 @@ msgstr "Öğrencilerden gizle"
msgid "Note: Do not hide graded assignments after they have been released."
msgstr "Not: Notlandırılmış görevleri yayınlandıktan sonra gizlemeyin."
+#: cms/templates/js/publish-xblock.underscore
+msgid "Copy Unit"
+msgstr ""
+
#: cms/templates/js/release-date-editor.underscore
msgid "Release Date and Time"
msgstr "Yayım Tarih ve Zamanı"
@@ -11372,6 +11387,10 @@ msgstr ""
msgid "Enable summaries"
msgstr ""
+#: cms/templates/js/tag-list.underscore
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/js/team-member.underscore
msgid "Current Role:"
msgstr "Mevcut Rol:"
diff --git a/conf/locale/uk/LC_MESSAGES/django.mo b/conf/locale/uk/LC_MESSAGES/django.mo
index 8fc5c5c46baa..a90f89d6c87a 100644
Binary files a/conf/locale/uk/LC_MESSAGES/django.mo and b/conf/locale/uk/LC_MESSAGES/django.mo differ
diff --git a/conf/locale/uk/LC_MESSAGES/django.po b/conf/locale/uk/LC_MESSAGES/django.po
index c6ce14a4243f..fbe950ab64a3 100644
--- a/conf/locale/uk/LC_MESSAGES/django.po
+++ b/conf/locale/uk/LC_MESSAGES/django.po
@@ -11180,6 +11180,19 @@ msgid ""
"their answers and reshuffle selected items."
msgstr ""
+#: xmodule/library_content_block.py
+msgid "Source content library has not been specified."
+msgstr ""
+
+#: xmodule/library_content_block.py
+msgid "Content libraries are not available in the current runtime."
+msgstr ""
+
+#: xmodule/library_content_block.py
+#, python-brace-format
+msgid "Source content library does not exist: {source_library_id}"
+msgstr ""
+
#: xmodule/library_content_block.py
msgid "This component is out of date. The library has new content."
msgstr "Цей компонент застарів. Оновлено вміст бібліотеки."
@@ -11216,8 +11229,9 @@ msgid "Select a Library."
msgstr "Вибрати бібліотеку."
#: xmodule/library_content_block.py
-msgid "There are no matching problem types in the specified libraries."
-msgstr "У заданих бібліотеках немає відповідного виду завдань."
+#, python-brace-format
+msgid "There are no problems in the specified library of type {capa_type}."
+msgstr ""
#: xmodule/library_content_block.py
msgid "Select another problem type."
@@ -13442,14 +13456,6 @@ msgstr "Вимоги"
msgid "Details"
msgstr "Деталі"
-#. #-#-#-#-# mako.po (edx-platform) #-#-#-#-#
-#. Translators: this is a verb describing the action of viewing more details
-#: cms/templates/studio_xblock_wrapper.html
-#: lms/templates/wiki/includes/article_menu.html
-#: wiki/templates/wiki/includes/article_menu.html
-msgid "View"
-msgstr "Дивитися"
-
#: cms/templates/maintenance/_announcement_edit.html
#: lms/templates/problem.html lms/templates/word_cloud.html
msgid "Save"
@@ -14213,6 +14219,14 @@ msgstr ""
msgid "Completed"
msgstr ""
+#: lms/templates/seq_block.html
+msgid "New Unit"
+msgstr ""
+
+#: lms/templates/seq_block.html
+msgid "Paste as new unit"
+msgstr ""
+
#: lms/templates/signup_modal.html
msgid "Sign Up for {platform_name}"
msgstr "Зареєструватися на {platform_name}"
@@ -19433,6 +19447,11 @@ msgstr ""
msgid "Learn more"
msgstr "Дізнатися більше"
+#: lms/templates/wiki/includes/article_menu.html
+#: wiki/templates/wiki/includes/article_menu.html
+msgid "View"
+msgstr "Дивитися"
+
#: lms/templates/wiki/includes/article_menu.html
msgid "{span_start}(active){span_end}"
msgstr ""
@@ -20088,6 +20107,10 @@ msgstr ""
msgid "Preview the courseware in the LMS"
msgstr ""
+#: cms/templates/container.html
+msgid "Collapse All"
+msgstr ""
+
#: cms/templates/container.html
msgid "Adding components"
msgstr ""
@@ -22785,14 +22808,26 @@ msgstr ""
" лабораторні роботи, вікторини та іспити, а також визначати, як оцінювати "
"кожний тип завдання, виконаний студентом."
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Importing components"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Expand or Collapse"
msgstr ""
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Select this problem"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Copy to Clipboard"
msgstr ""
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Manage Access"
msgstr ""
diff --git a/conf/locale/uk/LC_MESSAGES/djangojs.po b/conf/locale/uk/LC_MESSAGES/djangojs.po
index afd723afc4cd..9c72edb51510 100644
--- a/conf/locale/uk/LC_MESSAGES/djangojs.po
+++ b/conf/locale/uk/LC_MESSAGES/djangojs.po
@@ -106,7 +106,7 @@ msgid ""
msgstr ""
"Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
-"POT-Creation-Date: 2023-11-19 20:43+0000\n"
+"POT-Creation-Date: 2023-12-03 20:43+0000\n"
"PO-Revision-Date: 2014-06-11 15:18+0000\n"
"Last-Translator: Mykola Melnyk, 2023\n"
"Language-Team: Ukrainian (http://app.transifex.com/open-edx/edx-platform/language/uk/)\n"
@@ -210,7 +210,8 @@ msgstr "Обрати файл"
#: cms/static/js/views/course_info_update.js
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js
-#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js
+#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js
+#: xmodule/js/src/html/edit.js
msgid "OK"
msgstr "Гаразд"
@@ -6233,6 +6234,7 @@ msgstr "Ви впевнені, що хочете видалити це онов
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/pages/container_subviews.js
msgid "Copying"
msgstr ""
@@ -6242,26 +6244,31 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Pasting"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Some errors occurred"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files could not be added to the course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "You may need to update a file(s) manually"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid ""
"The following files already exist in this course but don't match the version"
" used by the component you pasted:"
@@ -6269,21 +6276,25 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "New file(s) added to Files & Uploads."
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files were imported to this course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "View files"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Dismiss"
msgstr ""
@@ -10844,6 +10855,10 @@ msgstr ""
msgid "Note: Do not hide graded assignments after they have been released."
msgstr ""
+#: cms/templates/js/publish-xblock.underscore
+msgid "Copy Unit"
+msgstr ""
+
#: cms/templates/js/release-date-editor.underscore
msgid "Release Date and Time"
msgstr "Дата і час випуску"
@@ -11024,6 +11039,10 @@ msgstr ""
msgid "Enable summaries"
msgstr ""
+#: cms/templates/js/tag-list.underscore
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/js/team-member.underscore
msgid "Current Role:"
msgstr ""
diff --git a/conf/locale/vi/LC_MESSAGES/django.po b/conf/locale/vi/LC_MESSAGES/django.po
index a1cd76b74172..42a3dd3ddfd0 100644
--- a/conf/locale/vi/LC_MESSAGES/django.po
+++ b/conf/locale/vi/LC_MESSAGES/django.po
@@ -10242,6 +10242,19 @@ msgid ""
"their answers and reshuffle selected items."
msgstr ""
+#: xmodule/library_content_block.py
+msgid "Source content library has not been specified."
+msgstr ""
+
+#: xmodule/library_content_block.py
+msgid "Content libraries are not available in the current runtime."
+msgstr ""
+
+#: xmodule/library_content_block.py
+#, python-brace-format
+msgid "Source content library does not exist: {source_library_id}"
+msgstr ""
+
#: xmodule/library_content_block.py
msgid "This component is out of date. The library has new content."
msgstr ""
@@ -10276,7 +10289,8 @@ msgid "Select a Library."
msgstr ""
#: xmodule/library_content_block.py
-msgid "There are no matching problem types in the specified libraries."
+#, python-brace-format
+msgid "There are no problems in the specified library of type {capa_type}."
msgstr ""
#: xmodule/library_content_block.py
@@ -12308,12 +12322,6 @@ msgstr "Yêu cầu"
msgid "Details"
msgstr "Chi tiết"
-#. Translators: this is a verb describing the action of viewing more details
-#: cms/templates/studio_xblock_wrapper.html
-#: lms/templates/wiki/includes/article_menu.html
-msgid "View"
-msgstr "Xem "
-
#: cms/templates/maintenance/_announcement_edit.html
#: lms/templates/problem.html lms/templates/word_cloud.html
msgid "Save"
@@ -13076,6 +13084,14 @@ msgstr "Trình tự"
msgid "Completed"
msgstr ""
+#: lms/templates/seq_block.html
+msgid "New Unit"
+msgstr ""
+
+#: lms/templates/seq_block.html
+msgid "Paste as new unit"
+msgstr ""
+
#: lms/templates/signup_modal.html
msgid "Sign Up for {platform_name}"
msgstr "Đăng ký với {platform_name}"
@@ -18738,6 +18754,10 @@ msgstr "Hiểu rồi!"
msgid "Learn more"
msgstr "Tìm hiểu thêm"
+#: lms/templates/wiki/includes/article_menu.html
+msgid "View"
+msgstr "Xem "
+
#: lms/templates/wiki/includes/article_menu.html
msgid "{span_start}(active){span_end}"
msgstr "{span_start}(active){span_end}"
@@ -19434,6 +19454,10 @@ msgstr "Xem phiên bản thực"
msgid "Preview the courseware in the LMS"
msgstr "Xem trước giáo trình trong LMS"
+#: cms/templates/container.html
+msgid "Collapse All"
+msgstr ""
+
#: cms/templates/container.html
msgid "Adding components"
msgstr "Thêm các phần"
@@ -22358,14 +22382,26 @@ msgstr ""
"thí nghiệm, các câu đố, và các kỳ thi, và xác định có bao nhiêu lớp của học "
"sinh mỗi loại phân công là phù hợp."
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Importing components"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Expand or Collapse"
msgstr "Mở rộng hoặc Thu gọn"
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Select this problem"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Copy to Clipboard"
msgstr ""
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Manage Access"
msgstr ""
diff --git a/conf/locale/vi/LC_MESSAGES/djangojs.po b/conf/locale/vi/LC_MESSAGES/djangojs.po
index 438ad86970fa..2332a604b05a 100644
--- a/conf/locale/vi/LC_MESSAGES/djangojs.po
+++ b/conf/locale/vi/LC_MESSAGES/djangojs.po
@@ -113,7 +113,7 @@ msgid ""
msgstr ""
"Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
-"POT-Creation-Date: 2023-11-19 20:43+0000\n"
+"POT-Creation-Date: 2023-12-03 20:43+0000\n"
"PO-Revision-Date: 2014-06-11 15:18+0000\n"
"Last-Translator: Le Minh Tri , 2020\n"
"Language-Team: Vietnamese (http://app.transifex.com/open-edx/edx-platform/language/vi/)\n"
@@ -216,7 +216,8 @@ msgstr "Chọn Tệp"
#: cms/static/js/views/course_info_update.js
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js
-#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js
+#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js
+#: xmodule/js/src/html/edit.js
msgid "OK"
msgstr "OK"
@@ -6102,6 +6103,7 @@ msgstr "Bạn chắc chắn muốn xóa bản cập nhật này?"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/pages/container_subviews.js
msgid "Copying"
msgstr ""
@@ -6111,26 +6113,31 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Pasting"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Some errors occurred"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files could not be added to the course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "You may need to update a file(s) manually"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid ""
"The following files already exist in this course but don't match the version"
" used by the component you pasted:"
@@ -6138,21 +6145,25 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "New file(s) added to Files & Uploads."
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files were imported to this course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "View files"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Dismiss"
msgstr ""
@@ -10757,6 +10768,10 @@ msgid "Note: Do not hide graded assignments after they have been released."
msgstr ""
"Lưu ý: Không được ẩn những bài tập đã chấm sau khi chúng đã được công bố."
+#: cms/templates/js/publish-xblock.underscore
+msgid "Copy Unit"
+msgstr ""
+
#: cms/templates/js/release-date-editor.underscore
msgid "Release Date and Time"
msgstr "Ngày và giờ phát hành"
@@ -10954,6 +10969,10 @@ msgstr ""
msgid "Enable summaries"
msgstr ""
+#: cms/templates/js/tag-list.underscore
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/js/team-member.underscore
msgid "Current Role:"
msgstr "Vai trò hiện tại:"
diff --git a/conf/locale/zh_CN/LC_MESSAGES/django.mo b/conf/locale/zh_CN/LC_MESSAGES/django.mo
index 6736c4b59e4b..a75505c0bcd9 100644
Binary files a/conf/locale/zh_CN/LC_MESSAGES/django.mo and b/conf/locale/zh_CN/LC_MESSAGES/django.mo differ
diff --git a/conf/locale/zh_CN/LC_MESSAGES/django.po b/conf/locale/zh_CN/LC_MESSAGES/django.po
index 5b6899edc454..c30c3400fe5a 100644
--- a/conf/locale/zh_CN/LC_MESSAGES/django.po
+++ b/conf/locale/zh_CN/LC_MESSAGES/django.po
@@ -10826,6 +10826,19 @@ msgid ""
"their answers and reshuffle selected items."
msgstr "确定是否显示“重置问题”按钮,以便用户可以重置他们的答案并重新排列所选项目。"
+#: xmodule/library_content_block.py
+msgid "Source content library has not been specified."
+msgstr ""
+
+#: xmodule/library_content_block.py
+msgid "Content libraries are not available in the current runtime."
+msgstr ""
+
+#: xmodule/library_content_block.py
+#, python-brace-format
+msgid "Source content library does not exist: {source_library_id}"
+msgstr ""
+
#: xmodule/library_content_block.py
msgid "This component is out of date. The library has new content."
msgstr "该组件已过时。知识库有新的内容。"
@@ -10860,8 +10873,9 @@ msgid "Select a Library."
msgstr "选择一个知识库。"
#: xmodule/library_content_block.py
-msgid "There are no matching problem types in the specified libraries."
-msgstr "指定知识库中没有匹配的问题类型。"
+#, python-brace-format
+msgid "There are no problems in the specified library of type {capa_type}."
+msgstr ""
#: xmodule/library_content_block.py
msgid "Select another problem type."
@@ -12894,14 +12908,6 @@ msgstr "修习要求"
msgid "Details"
msgstr "细节"
-#. #-#-#-#-# mako.po (edx-platform) #-#-#-#-#
-#. Translators: this is a verb describing the action of viewing more details
-#: cms/templates/studio_xblock_wrapper.html
-#: lms/templates/wiki/includes/article_menu.html
-#: wiki/templates/wiki/includes/article_menu.html
-msgid "View"
-msgstr "阅览"
-
#: cms/templates/maintenance/_announcement_edit.html
#: lms/templates/problem.html lms/templates/word_cloud.html
msgid "Save"
@@ -13645,6 +13651,14 @@ msgstr "序列"
msgid "Completed"
msgstr "已完成"
+#: lms/templates/seq_block.html
+msgid "New Unit"
+msgstr ""
+
+#: lms/templates/seq_block.html
+msgid "Paste as new unit"
+msgstr ""
+
#: lms/templates/signup_modal.html
msgid "Sign Up for {platform_name}"
msgstr "注册为{platform_name}平台的会员"
@@ -18908,6 +18922,11 @@ msgstr "成功了!"
msgid "Learn more"
msgstr "了解更多"
+#: lms/templates/wiki/includes/article_menu.html
+#: wiki/templates/wiki/includes/article_menu.html
+msgid "View"
+msgstr "阅览"
+
#: lms/templates/wiki/includes/article_menu.html
msgid "{span_start}(active){span_end}"
msgstr "{span_start}(激活){span_end}"
@@ -19567,6 +19586,10 @@ msgstr "观看在线版本"
msgid "Preview the courseware in the LMS"
msgstr "在LMS中预览课件"
+#: cms/templates/container.html
+msgid "Collapse All"
+msgstr ""
+
#: cms/templates/container.html
msgid "Adding components"
msgstr "添加组件"
@@ -22159,14 +22182,26 @@ msgid ""
"worth."
msgstr "您也可以创建作业类型,比如家庭作业、实验、测验、以及考试,并且指定每个作业是否计入最终的成绩及其评价分值。"
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Importing components"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Expand or Collapse"
msgstr "展开或折叠"
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Select this problem"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Copy to Clipboard"
msgstr ""
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Manage Access"
msgstr ""
diff --git a/conf/locale/zh_CN/LC_MESSAGES/djangojs.po b/conf/locale/zh_CN/LC_MESSAGES/djangojs.po
index efaf309704fc..d8bef9dcb95c 100644
--- a/conf/locale/zh_CN/LC_MESSAGES/djangojs.po
+++ b/conf/locale/zh_CN/LC_MESSAGES/djangojs.po
@@ -231,7 +231,7 @@ msgid ""
msgstr ""
"Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
-"POT-Creation-Date: 2023-11-19 20:43+0000\n"
+"POT-Creation-Date: 2023-12-03 20:43+0000\n"
"PO-Revision-Date: 2014-06-11 15:18+0000\n"
"Last-Translator: Cecilia Liu, 2023\n"
"Language-Team: Chinese (China) (http://app.transifex.com/open-edx/edx-platform/language/zh_CN/)\n"
@@ -341,7 +341,8 @@ msgstr "选择文件"
#: cms/static/js/views/course_info_update.js
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js
-#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js
+#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js
+#: xmodule/js/src/html/edit.js
#: common/static/common/templates/discussion/templates.underscore
#: lms/templates/learner_dashboard/verification_popover.underscore
msgid "OK"
@@ -6020,6 +6021,7 @@ msgstr "您确定要删除此更新吗?"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/pages/container_subviews.js
msgid "Copying"
msgstr ""
@@ -6029,26 +6031,31 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Pasting"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Some errors occurred"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files could not be added to the course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "You may need to update a file(s) manually"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid ""
"The following files already exist in this course but don't match the version"
" used by the component you pasted:"
@@ -6056,21 +6063,25 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "New file(s) added to Files & Uploads."
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files were imported to this course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "View files"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Dismiss"
msgstr "解散"
@@ -10541,6 +10552,10 @@ msgstr "对学习这隐藏"
msgid "Note: Do not hide graded assignments after they have been released."
msgstr "注意:请勿在已发布后隐藏已评分作业。"
+#: cms/templates/js/publish-xblock.underscore
+msgid "Copy Unit"
+msgstr ""
+
#: cms/templates/js/release-date-editor.underscore
msgid "Release Date and Time"
msgstr "公开日期及时间"
@@ -10720,6 +10735,10 @@ msgstr ""
msgid "Enable summaries"
msgstr ""
+#: cms/templates/js/tag-list.underscore
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/js/team-member.underscore
msgid "Current Role:"
msgstr "当前角色:"
diff --git a/conf/locale/zh_HANS/LC_MESSAGES/django.mo b/conf/locale/zh_HANS/LC_MESSAGES/django.mo
index 6736c4b59e4b..a75505c0bcd9 100644
Binary files a/conf/locale/zh_HANS/LC_MESSAGES/django.mo and b/conf/locale/zh_HANS/LC_MESSAGES/django.mo differ
diff --git a/conf/locale/zh_HANS/LC_MESSAGES/django.po b/conf/locale/zh_HANS/LC_MESSAGES/django.po
index 5b6899edc454..c30c3400fe5a 100644
--- a/conf/locale/zh_HANS/LC_MESSAGES/django.po
+++ b/conf/locale/zh_HANS/LC_MESSAGES/django.po
@@ -10826,6 +10826,19 @@ msgid ""
"their answers and reshuffle selected items."
msgstr "确定是否显示“重置问题”按钮,以便用户可以重置他们的答案并重新排列所选项目。"
+#: xmodule/library_content_block.py
+msgid "Source content library has not been specified."
+msgstr ""
+
+#: xmodule/library_content_block.py
+msgid "Content libraries are not available in the current runtime."
+msgstr ""
+
+#: xmodule/library_content_block.py
+#, python-brace-format
+msgid "Source content library does not exist: {source_library_id}"
+msgstr ""
+
#: xmodule/library_content_block.py
msgid "This component is out of date. The library has new content."
msgstr "该组件已过时。知识库有新的内容。"
@@ -10860,8 +10873,9 @@ msgid "Select a Library."
msgstr "选择一个知识库。"
#: xmodule/library_content_block.py
-msgid "There are no matching problem types in the specified libraries."
-msgstr "指定知识库中没有匹配的问题类型。"
+#, python-brace-format
+msgid "There are no problems in the specified library of type {capa_type}."
+msgstr ""
#: xmodule/library_content_block.py
msgid "Select another problem type."
@@ -12894,14 +12908,6 @@ msgstr "修习要求"
msgid "Details"
msgstr "细节"
-#. #-#-#-#-# mako.po (edx-platform) #-#-#-#-#
-#. Translators: this is a verb describing the action of viewing more details
-#: cms/templates/studio_xblock_wrapper.html
-#: lms/templates/wiki/includes/article_menu.html
-#: wiki/templates/wiki/includes/article_menu.html
-msgid "View"
-msgstr "阅览"
-
#: cms/templates/maintenance/_announcement_edit.html
#: lms/templates/problem.html lms/templates/word_cloud.html
msgid "Save"
@@ -13645,6 +13651,14 @@ msgstr "序列"
msgid "Completed"
msgstr "已完成"
+#: lms/templates/seq_block.html
+msgid "New Unit"
+msgstr ""
+
+#: lms/templates/seq_block.html
+msgid "Paste as new unit"
+msgstr ""
+
#: lms/templates/signup_modal.html
msgid "Sign Up for {platform_name}"
msgstr "注册为{platform_name}平台的会员"
@@ -18908,6 +18922,11 @@ msgstr "成功了!"
msgid "Learn more"
msgstr "了解更多"
+#: lms/templates/wiki/includes/article_menu.html
+#: wiki/templates/wiki/includes/article_menu.html
+msgid "View"
+msgstr "阅览"
+
#: lms/templates/wiki/includes/article_menu.html
msgid "{span_start}(active){span_end}"
msgstr "{span_start}(激活){span_end}"
@@ -19567,6 +19586,10 @@ msgstr "观看在线版本"
msgid "Preview the courseware in the LMS"
msgstr "在LMS中预览课件"
+#: cms/templates/container.html
+msgid "Collapse All"
+msgstr ""
+
#: cms/templates/container.html
msgid "Adding components"
msgstr "添加组件"
@@ -22159,14 +22182,26 @@ msgid ""
"worth."
msgstr "您也可以创建作业类型,比如家庭作业、实验、测验、以及考试,并且指定每个作业是否计入最终的成绩及其评价分值。"
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Importing components"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Expand or Collapse"
msgstr "展开或折叠"
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Select this problem"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Copy to Clipboard"
msgstr ""
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Manage Access"
msgstr ""
diff --git a/conf/locale/zh_HANS/LC_MESSAGES/djangojs.po b/conf/locale/zh_HANS/LC_MESSAGES/djangojs.po
index efaf309704fc..d8bef9dcb95c 100644
--- a/conf/locale/zh_HANS/LC_MESSAGES/djangojs.po
+++ b/conf/locale/zh_HANS/LC_MESSAGES/djangojs.po
@@ -231,7 +231,7 @@ msgid ""
msgstr ""
"Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
-"POT-Creation-Date: 2023-11-19 20:43+0000\n"
+"POT-Creation-Date: 2023-12-03 20:43+0000\n"
"PO-Revision-Date: 2014-06-11 15:18+0000\n"
"Last-Translator: Cecilia Liu, 2023\n"
"Language-Team: Chinese (China) (http://app.transifex.com/open-edx/edx-platform/language/zh_CN/)\n"
@@ -341,7 +341,8 @@ msgstr "选择文件"
#: cms/static/js/views/course_info_update.js
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js
-#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js
+#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js
+#: xmodule/js/src/html/edit.js
#: common/static/common/templates/discussion/templates.underscore
#: lms/templates/learner_dashboard/verification_popover.underscore
msgid "OK"
@@ -6020,6 +6021,7 @@ msgstr "您确定要删除此更新吗?"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/pages/container_subviews.js
msgid "Copying"
msgstr ""
@@ -6029,26 +6031,31 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Pasting"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Some errors occurred"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files could not be added to the course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "You may need to update a file(s) manually"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid ""
"The following files already exist in this course but don't match the version"
" used by the component you pasted:"
@@ -6056,21 +6063,25 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "New file(s) added to Files & Uploads."
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files were imported to this course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "View files"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Dismiss"
msgstr "解散"
@@ -10541,6 +10552,10 @@ msgstr "对学习这隐藏"
msgid "Note: Do not hide graded assignments after they have been released."
msgstr "注意:请勿在已发布后隐藏已评分作业。"
+#: cms/templates/js/publish-xblock.underscore
+msgid "Copy Unit"
+msgstr ""
+
#: cms/templates/js/release-date-editor.underscore
msgid "Release Date and Time"
msgstr "公开日期及时间"
@@ -10720,6 +10735,10 @@ msgstr ""
msgid "Enable summaries"
msgstr ""
+#: cms/templates/js/tag-list.underscore
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/js/team-member.underscore
msgid "Current Role:"
msgstr "当前角色:"
diff --git a/conf/locale/zh_TW/LC_MESSAGES/django.mo b/conf/locale/zh_TW/LC_MESSAGES/django.mo
index b90ecc154cca..6615eefcf1bd 100644
Binary files a/conf/locale/zh_TW/LC_MESSAGES/django.mo and b/conf/locale/zh_TW/LC_MESSAGES/django.mo differ
diff --git a/conf/locale/zh_TW/LC_MESSAGES/django.po b/conf/locale/zh_TW/LC_MESSAGES/django.po
index 5c2d88806ab2..de35e359eeaf 100644
--- a/conf/locale/zh_TW/LC_MESSAGES/django.po
+++ b/conf/locale/zh_TW/LC_MESSAGES/django.po
@@ -10383,6 +10383,19 @@ msgid ""
"their answers and reshuffle selected items."
msgstr ""
+#: xmodule/library_content_block.py
+msgid "Source content library has not been specified."
+msgstr ""
+
+#: xmodule/library_content_block.py
+msgid "Content libraries are not available in the current runtime."
+msgstr ""
+
+#: xmodule/library_content_block.py
+#, python-brace-format
+msgid "Source content library does not exist: {source_library_id}"
+msgstr ""
+
#: xmodule/library_content_block.py
msgid "This component is out of date. The library has new content."
msgstr "此組件已過期,課程組件庫中有新的內容。"
@@ -10417,8 +10430,9 @@ msgid "Select a Library."
msgstr "選擇一個課程組件庫。"
#: xmodule/library_content_block.py
-msgid "There are no matching problem types in the specified libraries."
-msgstr "在指定庫找不到對應的問題型態。"
+#, python-brace-format
+msgid "There are no problems in the specified library of type {capa_type}."
+msgstr ""
#: xmodule/library_content_block.py
msgid "Select another problem type."
@@ -12433,12 +12447,6 @@ msgstr "課程要求"
msgid "Details"
msgstr "細節"
-#. Translators: this is a verb describing the action of viewing more details
-#: cms/templates/studio_xblock_wrapper.html
-#: lms/templates/wiki/includes/article_menu.html
-msgid "View"
-msgstr "檢視"
-
#: cms/templates/maintenance/_announcement_edit.html
#: lms/templates/problem.html lms/templates/word_cloud.html
msgid "Save"
@@ -13177,6 +13185,14 @@ msgstr ""
msgid "Completed"
msgstr ""
+#: lms/templates/seq_block.html
+msgid "New Unit"
+msgstr ""
+
+#: lms/templates/seq_block.html
+msgid "Paste as new unit"
+msgstr ""
+
#: lms/templates/signup_modal.html
msgid "Sign Up for {platform_name}"
msgstr "註冊加入{platform_name}"
@@ -18337,6 +18353,10 @@ msgstr "瞭解!"
msgid "Learn more"
msgstr ""
+#: lms/templates/wiki/includes/article_menu.html
+msgid "View"
+msgstr "檢視"
+
#: lms/templates/wiki/includes/article_menu.html
msgid "{span_start}(active){span_end}"
msgstr "{span_start}(active){span_end}"
@@ -18985,6 +19005,10 @@ msgstr "檢視線上版本"
msgid "Preview the courseware in the LMS"
msgstr ""
+#: cms/templates/container.html
+msgid "Collapse All"
+msgstr ""
+
#: cms/templates/container.html
msgid "Adding components"
msgstr ""
@@ -21550,14 +21574,26 @@ msgid ""
"worth."
msgstr ""
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Importing components"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Expand or Collapse"
msgstr ""
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Select this problem"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Copy to Clipboard"
msgstr ""
+#: cms/templates/studio_xblock_wrapper.html
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/studio_xblock_wrapper.html
msgid "Manage Access"
msgstr ""
diff --git a/conf/locale/zh_TW/LC_MESSAGES/djangojs.po b/conf/locale/zh_TW/LC_MESSAGES/djangojs.po
index fa51b90a954c..d7563ebace03 100644
--- a/conf/locale/zh_TW/LC_MESSAGES/djangojs.po
+++ b/conf/locale/zh_TW/LC_MESSAGES/djangojs.po
@@ -132,7 +132,7 @@ msgid ""
msgstr ""
"Project-Id-Version: edx-platform\n"
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
-"POT-Creation-Date: 2023-11-19 20:43+0000\n"
+"POT-Creation-Date: 2023-12-03 20:43+0000\n"
"PO-Revision-Date: 2014-06-11 15:18+0000\n"
"Last-Translator: Andrew Lau , 2017\n"
"Language-Team: Chinese (Taiwan) (http://app.transifex.com/open-edx/edx-platform/language/zh_TW/)\n"
@@ -236,7 +236,8 @@ msgstr "選擇檔案"
#: cms/static/js/views/course_info_update.js
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js
-#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js
+#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js
+#: xmodule/js/src/html/edit.js
msgid "OK"
msgstr "好的"
@@ -5863,6 +5864,7 @@ msgstr "您確定要刪除這項更新嗎?"
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/pages/container_subviews.js
msgid "Copying"
msgstr ""
@@ -5872,26 +5874,31 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Pasting"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Some errors occurred"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files could not be added to the course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "You may need to update a file(s) manually"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid ""
"The following files already exist in this course but don't match the version"
" used by the component you pasted:"
@@ -5899,21 +5906,25 @@ msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "New file(s) added to Files & Uploads."
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "The following required files were imported to this course:"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "View files"
msgstr ""
#: cms/static/js/views/course_outline.js
#: cms/static/js/views/pages/container.js
+#: cms/static/js/views/utils/xblock_utils.js
msgid "Dismiss"
msgstr ""
@@ -10368,6 +10379,10 @@ msgstr "對學習者隱藏"
msgid "Note: Do not hide graded assignments after they have been released."
msgstr ""
+#: cms/templates/js/publish-xblock.underscore
+msgid "Copy Unit"
+msgstr ""
+
#: cms/templates/js/release-date-editor.underscore
msgid "Release Date and Time"
msgstr ""
@@ -10546,6 +10561,10 @@ msgstr ""
msgid "Enable summaries"
msgstr ""
+#: cms/templates/js/tag-list.underscore
+msgid "Manage tags"
+msgstr ""
+
#: cms/templates/js/team-member.underscore
msgid "Current Role:"
msgstr ""
diff --git a/lms/djangoapps/courseware/tests/test_utils.py b/lms/djangoapps/courseware/tests/test_utils.py
index 81841f99ad58..f8508f69c90c 100644
--- a/lms/djangoapps/courseware/tests/test_utils.py
+++ b/lms/djangoapps/courseware/tests/test_utils.py
@@ -135,7 +135,6 @@ def test_create_financial_assistance_application(self):
test_form_data = {
'lms_user_id': self.user.id,
'course_id': self.test_course_id,
- 'income': '$85,000 - $100,000'
}
with patch.object(OAuthAPIClient, 'request') as oauth_mock:
oauth_mock.return_value = self._mock_response(status.HTTP_200_OK, {'success': True})
@@ -150,7 +149,6 @@ def test_create_financial_assistance_application_bad_request(self):
test_form_data = {
'lms_user_id': self.user.id,
'course_id': 'invalid_course_id',
- 'income': '$85,000 - $100,000'
}
error_response = {'message': 'Invalid course id provided'}
with patch.object(OAuthAPIClient, 'request') as oauth_mock:
diff --git a/lms/djangoapps/courseware/tests/test_views.py b/lms/djangoapps/courseware/tests/test_views.py
index bebd4a79fb93..e170e857666e 100644
--- a/lms/djangoapps/courseware/tests/test_views.py
+++ b/lms/djangoapps/courseware/tests/test_views.py
@@ -932,27 +932,22 @@ def _submit_financial_assistance_form(self, data, submit_url='submit_financial_a
url = reverse(submit_url)
return self.client.post(url, json.dumps(data), content_type='application/json', HTTP_REFERER=referrer_url)
+ @override_settings(ZENDESK_CUSTOM_FIELDS={'course_id': 'custom_123'})
@patch.object(views, 'create_zendesk_ticket', return_value=200)
def test_submit_financial_assistance_request(self, mock_create_zendesk_ticket):
username = self.user.username
course = str(self.course_key)
legal_name = 'Jesse Pinkman'
country = 'United States'
- income = '1234567890'
- reason_for_applying = "It's just basic chemistry, yo."
- goals = "I don't know if it even matters, but... work with my hands, I guess."
- effort = "I'm done, okay? You just give me my money, and you and I, we're done."
data = {
'username': username,
'course': course,
'name': legal_name,
'email': self.user.email,
'country': country,
- 'income': income,
- 'reason_for_applying': reason_for_applying,
- 'goals': goals,
- 'effort': effort,
- 'mktg-permission': False,
+ 'certify-economic-hardship': False,
+ 'certify-complete-certificate': False,
+ 'certify-honor-code': False,
}
response = self._submit_financial_assistance_form(data)
assert response.status_code == 204
@@ -960,17 +955,19 @@ def test_submit_financial_assistance_request(self, mock_create_zendesk_ticket):
__, __, ticket_subject, __ = mock_create_zendesk_ticket.call_args[0]
mocked_kwargs = mock_create_zendesk_ticket.call_args[1]
group_name = mocked_kwargs['group']
- tags = mocked_kwargs['tags']
+ custom_fields = mocked_kwargs['custom_fields']
additional_info = mocked_kwargs['additional_info']
private_comment = '\n'.join(list(additional_info.values()))
- for info in (country, income, reason_for_applying, goals, effort, username, legal_name, course):
+ for info in (country, username, legal_name, course):
assert info in private_comment
- assert additional_info['Allowed for marketing purposes'] == 'No'
+ assert additional_info['Paying for the course would cause economic hardship'] == 'No'
+ assert additional_info['Certify work diligently to receive a certificate'] == 'No'
+ assert additional_info['Certify abide by the honor code'] == 'No'
assert ticket_subject == f'Financial assistance request for learner {username} in course {self.course.display_name}' # pylint: disable=line-too-long
- self.assertDictContainsSubset({'course_id': course}, tags)
+ self.assertEqual([{'id': 'custom_123', 'value': course}], custom_fields)
assert 'Client IP' in additional_info
assert group_name == 'Financial Assistance'
@@ -982,11 +979,9 @@ def test_zendesk_submission_failed(self, _mock_create_zendesk_ticket):
'name': '',
'email': '',
'country': '',
- 'income': '',
- 'reason_for_applying': '',
- 'goals': '',
- 'effort': '',
- 'mktg-permission': False,
+ 'certify-economic-hardship': False,
+ 'certify-complete-certificate': False,
+ 'certify-honor-code': False,
})
assert response.status_code == 500
@@ -1002,11 +997,9 @@ def test_submit_financial_assistance_request_v2(self, referrer_url, expected_sta
form_data = {
'username': self.user.username,
'course': 'course-v1:test+TestX+Test_Course',
- 'income': '$25,000 - $40,000',
- 'reason_for_applying': "It's just basic chemistry, yo.",
- 'goals': "I don't know if it even matters, but... work with my hands, I guess.",
- 'effort': "I'm done, okay? You just give me my money, and you and I, we're done.",
- 'mktg-permission': False
+ 'certify-economic-hardship': False,
+ 'certify-complete-certificate': False,
+ 'certify-honor-code': False,
}
response = self._submit_financial_assistance_form(
form_data,
diff --git a/lms/djangoapps/courseware/utils.py b/lms/djangoapps/courseware/utils.py
index 957f6fd370f1..5409c89f636b 100644
--- a/lms/djangoapps/courseware/utils.py
+++ b/lms/djangoapps/courseware/utils.py
@@ -183,11 +183,9 @@ def create_financial_assistance_application(form_data):
{
"lms_user_id": ,
"course_id": ,
- "income": ,
- "learner_reasons": ,
- "learner_goals": ,
- "learner_plans": ,
- "allow_for_marketing":
+ "certify_economic_hardship": ,
+ "certify_complete_certificate": ,
+ "certify_honor_code": ,
}
"""
response = _request_financial_assistance(
diff --git a/lms/djangoapps/courseware/views/views.py b/lms/djangoapps/courseware/views/views.py
index fdc90a46a513..d0e657775bce 100644
--- a/lms/djangoapps/courseware/views/views.py
+++ b/lms/djangoapps/courseware/views/views.py
@@ -26,7 +26,6 @@
from django.utils.text import slugify
from django.utils.translation import gettext
from django.utils.translation import gettext_lazy as _
-from django.utils.translation import gettext_noop
from django.views.decorators.cache import cache_control
from django.views.decorators.clickjacking import xframe_options_exempt
from django.views.decorators.csrf import ensure_csrf_cookie
@@ -1966,13 +1965,13 @@ def get_template_and_context(self, course, video_block):
# Translators: "percent_sign" is the symbol "%". "platform_name" is a
# string identifying the name of this installation, such as "edX".
FINANCIAL_ASSISTANCE_HEADER = _(
- '{platform_name} now offers financial assistance for learners who want to earn Verified Certificates but'
- ' who may not be able to pay the Verified Certificate fee. Eligible learners may receive up to 90{percent_sign} off' # lint-amnesty, pylint: disable=line-too-long
- ' the Verified Certificate fee for a course.\nTo apply for financial assistance, enroll in the'
- ' audit track for a course that offers Verified Certificates, and then complete this application.'
- ' Note that you must complete a separate application for each course you take.\n We plan to use this'
- ' information to evaluate your application for financial assistance and to further develop our'
- ' financial assistance program.'
+ 'We plan to use this information to evaluate your application for financial assistance and to further develop our'
+ ' financial assistance program. Please note that while \nassistance is available in most courses that offer'
+ ' verified certificates, a few courses and programs are not eligible. You must complete a separate application'
+ ' \nfor each course you take. You may be approved for financial assistance five (5) times each year'
+ ' (based on 12-month period from you first approval). \nTo apply for financial assistance: \n'
+ '1. Enroll in the audit track for an eligible course that offers Verified Certificates \n2. Complete this'
+ ' application \n3. Check your email, your application will be reviewed in 3-4 business days'
)
@@ -1982,15 +1981,6 @@ def _get_fa_header(header):
platform_name=configuration_helpers.get_value('PLATFORM_NAME', settings.PLATFORM_NAME)).split('\n')
-FA_INCOME_LABEL = gettext_noop('Annual Household Income')
-FA_REASON_FOR_APPLYING_LABEL = gettext_noop('Tell us about your current financial situation. Why do you need assistance?') # lint-amnesty, pylint: disable=line-too-long
-FA_GOALS_LABEL = gettext_noop('Tell us about your learning or professional goals. How will a Verified Certificate in this course help you achieve these goals?') # lint-amnesty, pylint: disable=line-too-long
-
-FA_EFFORT_LABEL = gettext_noop('Tell us about your plans for this course. What steps will you take to help you complete the course work and receive a certificate?') # lint-amnesty, pylint: disable=line-too-long
-
-FA_SHORT_ANSWER_INSTRUCTIONS = _('Use between 1250 and 2500 characters or so in your response.')
-
-
@login_required
def financial_assistance(request, course_id=None):
"""Render the initial financial assistance page."""
@@ -2024,11 +2014,9 @@ def financial_assistance_request(request):
legal_name = data['name']
email = data['email']
country = data['country']
- income = data['income']
- reason_for_applying = data['reason_for_applying']
- goals = data['goals']
- effort = data['effort']
- marketing_permission = data['mktg-permission']
+ certify_economic_hardship = data['certify-economic-hardship']
+ certify_complete_certificate = data['certify-complete-certificate']
+ certify_honor_code = data['certify-honor-code']
ip_address = get_client_ip(request)[0]
except ValueError:
# Thrown if JSON parsing fails
@@ -2048,7 +2036,12 @@ def financial_assistance_request(request):
course_name=course.display_name
),
'Financial Assistance Request',
- tags={'course_id': course_id},
+ custom_fields=[
+ {
+ 'id': settings.ZENDESK_CUSTOM_FIELDS.get('course_id'),
+ 'value': course_id,
+ },
+ ],
# Send the application as additional info on the ticket so
# that it is not shown when support replies. This uses
# OrderedDict so that information is presented in the right
@@ -2057,12 +2050,10 @@ def financial_assistance_request(request):
('Username', username),
('Full Name', legal_name),
('Course ID', course_id),
- (FA_INCOME_LABEL, income),
('Country', country),
- ('Allowed for marketing purposes', 'Yes' if marketing_permission else 'No'),
- (FA_REASON_FOR_APPLYING_LABEL, '\n' + reason_for_applying + '\n\n'),
- (FA_GOALS_LABEL, '\n' + goals + '\n\n'),
- (FA_EFFORT_LABEL, '\n' + effort + '\n\n'),
+ ('Paying for the course would cause economic hardship', 'Yes' if certify_economic_hardship else 'No'),
+ ('Certify work diligently to receive a certificate', 'Yes' if certify_complete_certificate else 'No'),
+ ('Certify abide by the honor code', 'Yes' if certify_honor_code else 'No'),
('Client IP', ip_address),
)),
group='Financial Assistance',
@@ -2094,11 +2085,9 @@ def financial_assistance_request_v2(request):
if course_id and course_id not in request.META.get('HTTP_REFERER'):
return HttpResponseBadRequest('Invalid Course ID provided.')
lms_user_id = request.user.id
- income = data['income']
- learner_reasons = data['reason_for_applying']
- learner_goals = data['goals']
- learner_plans = data['effort']
- allowed_for_marketing = data['mktg-permission']
+ certify_economic_hardship = data['certify-economic-hardship']
+ certify_complete_certificate = data['certify-complete-certificate']
+ certify_honor_code = data['certify-honor-code']
except ValueError:
# Thrown if JSON parsing fails
@@ -2110,11 +2099,9 @@ def financial_assistance_request_v2(request):
form_data = {
'lms_user_id': lms_user_id,
'course_id': course_id,
- 'income': income,
- 'learner_reasons': learner_reasons,
- 'learner_goals': learner_goals,
- 'learner_plans': learner_plans,
- 'allowed_for_marketing': allowed_for_marketing
+ 'certify_economic_hardship': certify_economic_hardship,
+ 'certify_complete_certificate': certify_complete_certificate,
+ 'certify-honor-code': certify_honor_code,
}
return create_financial_assistance_application(form_data)
@@ -2127,13 +2114,13 @@ def financial_assistance_form(request, course_id=None):
if course_id:
disabled = True
enrolled_courses = get_financial_aid_courses(user, course_id)
- incomes = ['Less than $5,000', '$5,000 - $10,000', '$10,000 - $15,000', '$15,000 - $20,000', '$20,000 - $25,000',
- '$25,000 - $40,000', '$40,000 - $55,000', '$55,000 - $70,000', '$70,000 - $85,000',
- '$85,000 - $100,000', 'More than $100,000']
- annual_incomes = [
- {'name': _(income), 'value': income} for income in incomes # lint-amnesty, pylint: disable=translation-of-non-string
- ]
+ default_course = ''
+ for enrolled_course in enrolled_courses:
+ if enrolled_course['value'] == course_id:
+ default_course = enrolled_course['name']
+ break
+
if course_id and _use_new_financial_assistance_flow(course_id):
submit_url = 'submit_financial_assistance_request_v2'
else:
@@ -2141,7 +2128,7 @@ def financial_assistance_form(request, course_id=None):
return render_to_response('financial-assistance/apply.html', {
'header_text': _get_fa_header(FINANCIAL_ASSISTANCE_HEADER),
- 'student_faq_url': marketing_link('FAQ'),
+ 'course_id': course_id,
'dashboard_url': reverse('dashboard'),
'account_settings_url': reverse('account_settings'),
'platform_name': configuration_helpers.get_value('PLATFORM_NAME', settings.PLATFORM_NAME),
@@ -2158,7 +2145,7 @@ def financial_assistance_form(request, course_id=None):
'type': 'select',
'label': _('Course'),
'placeholder': '',
- 'defaultValue': '',
+ 'defaultValue': default_course,
'required': True,
'disabled': disabled,
'options': enrolled_courses,
@@ -2169,64 +2156,46 @@ def financial_assistance_form(request, course_id=None):
)
},
{
- 'name': 'income',
- 'type': 'select',
- 'label': _(FA_INCOME_LABEL), # lint-amnesty, pylint: disable=translation-of-non-string
- 'placeholder': '',
- 'defaultValue': '',
- 'required': True,
- 'options': annual_incomes,
- 'instructions': _('Specify your annual household income in US Dollars.')
- },
- {
- 'name': 'reason_for_applying',
- 'type': 'textarea',
- 'label': _(FA_REASON_FOR_APPLYING_LABEL), # lint-amnesty, pylint: disable=translation-of-non-string
- 'placeholder': '',
- 'defaultValue': '',
- 'required': True,
- 'restrictions': {
- 'min_length': settings.FINANCIAL_ASSISTANCE_MIN_LENGTH,
- 'max_length': settings.FINANCIAL_ASSISTANCE_MAX_LENGTH
- },
- 'instructions': FA_SHORT_ANSWER_INSTRUCTIONS
+ 'name': 'certify-heading',
+ 'label': _('I certify that: '),
+ 'type': 'plaintext',
},
{
- 'name': 'goals',
- 'type': 'textarea',
- 'label': _(FA_GOALS_LABEL), # lint-amnesty, pylint: disable=translation-of-non-string
'placeholder': '',
+ 'name': 'certify-economic-hardship',
+ 'label': _(
+ 'Paying the verified certificate fee for the above course would cause me economic hardship'
+ ),
'defaultValue': '',
+ 'type': 'checkbox',
'required': True,
- 'restrictions': {
- 'min_length': settings.FINANCIAL_ASSISTANCE_MIN_LENGTH,
- 'max_length': settings.FINANCIAL_ASSISTANCE_MAX_LENGTH
- },
- 'instructions': FA_SHORT_ANSWER_INSTRUCTIONS
+ 'instructions': '',
+ 'restrictions': {}
},
{
- 'name': 'effort',
- 'type': 'textarea',
- 'label': _(FA_EFFORT_LABEL), # lint-amnesty, pylint: disable=translation-of-non-string
'placeholder': '',
+ 'name': 'certify-complete-certificate',
+ 'label': _(
+ 'I will work diligently to complete the course work and receive a certificate'
+ ),
'defaultValue': '',
+ 'type': 'checkbox',
'required': True,
- 'restrictions': {
- 'min_length': settings.FINANCIAL_ASSISTANCE_MIN_LENGTH,
- 'max_length': settings.FINANCIAL_ASSISTANCE_MAX_LENGTH
- },
- 'instructions': FA_SHORT_ANSWER_INSTRUCTIONS
+ 'instructions': '',
+ 'restrictions': {}
},
{
'placeholder': '',
- 'name': 'mktg-permission',
- 'label': _(
- 'I allow {platform_name} to use the information provided in this application '
- '(except for financial information) for {platform_name} marketing purposes.'
- ).format(platform_name=settings.PLATFORM_NAME),
+ 'name': 'certify-honor-code',
+ 'label': Text(_(
+ 'I have read, understand, and will abide by the {honor_code_link} for the edX Site'
+ )).format(honor_code_link=HTML('{honor_code_label}').format(
+ honor_code_label=_("Honor Code"),
+ honor_code_url=marketing_link('TOS') + "#honor",
+ )),
'defaultValue': '',
'type': 'checkbox',
- 'required': False,
+ 'required': True,
'instructions': '',
'restrictions': {}
}
@@ -2263,7 +2232,6 @@ def get_financial_aid_courses(user, course_id=None):
'value': str(enrollment.course_id)
}
)
-
if course_id is not None and use_new_flow is False:
# We don't want to show financial_aid_courses if the course_id is not found in the enrolled courses.
return []
diff --git a/lms/djangoapps/discussion/rest_api/api.py b/lms/djangoapps/discussion/rest_api/api.py
index 54878d69ca37..61877f57f06a 100644
--- a/lms/djangoapps/discussion/rest_api/api.py
+++ b/lms/djangoapps/discussion/rest_api/api.py
@@ -101,7 +101,6 @@
has_discussion_privileges,
is_commentable_divided
)
-from ..toggles import ENABLE_DISCUSSION_MODERATION_REASON_CODES
from .exceptions import CommentNotFoundError, DiscussionBlackOutException, DiscussionDisabledError, ThreadNotFoundError
from .forms import CommentActionsForm, ThreadActionsForm, UserOrdering
from .pagination import DiscussionAPIPagination
@@ -365,7 +364,6 @@ def _format_datetime(dt):
"enable_in_context": course_config.enable_in_context,
"group_at_subsection": course_config.plugin_configuration.get("group_at_subsection", False),
'learners_tab_enabled': ENABLE_LEARNERS_TAB_IN_DISCUSSIONS_MFE.is_enabled(course_key),
- "reason_codes_enabled": ENABLE_DISCUSSION_MODERATION_REASON_CODES.is_enabled(course_key),
"edit_reasons": [
{"code": reason_code, "label": label}
for (reason_code, label) in EDIT_REASON_CODES.items()
diff --git a/lms/djangoapps/discussion/rest_api/tests/test_api.py b/lms/djangoapps/discussion/rest_api/tests/test_api.py
index ebe4a429c42c..bf744738b0a2 100644
--- a/lms/djangoapps/discussion/rest_api/tests/test_api.py
+++ b/lms/djangoapps/discussion/rest_api/tests/test_api.py
@@ -212,7 +212,6 @@ def test_basic(self):
'is_user_admin': False,
'user_roles': {'Student'},
'learners_tab_enabled': False,
- 'reason_codes_enabled': False,
'edit_reasons': [{'code': 'test-edit-reason', 'label': 'Test Edit Reason'}],
'post_close_reasons': [{'code': 'test-close-reason', 'label': 'Test Close Reason'}],
}
diff --git a/lms/djangoapps/discussion/rest_api/tests/test_views.py b/lms/djangoapps/discussion/rest_api/tests/test_views.py
index 806cf9b11d31..ded21536e7f6 100644
--- a/lms/djangoapps/discussion/rest_api/tests/test_views.py
+++ b/lms/djangoapps/discussion/rest_api/tests/test_views.py
@@ -536,7 +536,6 @@ def test_basic(self):
'is_user_admin': False,
"user_roles": ["Student"],
'learners_tab_enabled': False,
- "reason_codes_enabled": False,
"edit_reasons": [{"code": "test-edit-reason", "label": "Test Edit Reason"}],
"post_close_reasons": [{"code": "test-close-reason", "label": "Test Close Reason"}],
}
diff --git a/lms/djangoapps/discussion/toggles.py b/lms/djangoapps/discussion/toggles.py
index 85c3cc0bf978..201cd4e7318c 100644
--- a/lms/djangoapps/discussion/toggles.py
+++ b/lms/djangoapps/discussion/toggles.py
@@ -24,17 +24,6 @@
f'{WAFFLE_FLAG_NAMESPACE}.enable_learners_tab_in_discussions_mfe', __name__
)
-# .. toggle_name: discussions.enable_moderation_reason_codes
-# .. toggle_implementation: CourseWaffleFlag
-# .. toggle_default: False
-# .. toggle_description: Waffle flag to toggle support for the new edit and post close reason codes
-# .. toggle_use_cases: temporary, open_edx
-# .. toggle_creation_date: 2022-02-22
-# .. toggle_target_removal_date: 2022-09-22
-ENABLE_DISCUSSION_MODERATION_REASON_CODES = CourseWaffleFlag(
- f'{WAFFLE_FLAG_NAMESPACE}.enable_moderation_reason_codes', __name__
-)
-
# .. toggle_name: discussions.enable_reported_content_email_notifications
# .. toggle_implementation: CourseWaffleFlag
# .. toggle_default: False
diff --git a/lms/envs/common.py b/lms/envs/common.py
index 59377b67cc5d..d328174a712d 100644
--- a/lms/envs/common.py
+++ b/lms/envs/common.py
@@ -5104,12 +5104,6 @@ def _make_locale_paths(settings): # pylint: disable=missing-function-docstring
MAILCHIMP_NEW_USER_LIST_ID = ""
########################## BLOCKSTORE #####################################
-BLOCKSTORE_PUBLIC_URL_ROOT = 'http://localhost:18250'
-BLOCKSTORE_API_URL = 'http://localhost:18250/api/v1/'
-
-# Disable the Blockstore app API by default.
-# See openedx.core.lib.blockstore_api.config for details.
-BLOCKSTORE_USE_BLOCKSTORE_APP_API = False
# .. setting_name: XBLOCK_RUNTIME_V2_EPHEMERAL_DATA_CACHE
# .. setting_default: default
diff --git a/lms/envs/devstack-experimental.yml b/lms/envs/devstack-experimental.yml
index 6d24b63cf920..63812686e86a 100644
--- a/lms/envs/devstack-experimental.yml
+++ b/lms/envs/devstack-experimental.yml
@@ -57,8 +57,6 @@ AWS_SES_REGION_ENDPOINT: email.us-east-1.amazonaws.com
AWS_SES_REGION_NAME: us-east-1
AWS_STORAGE_BUCKET_NAME: SET-ME-PLEASE (ex. bucket-name)
BASE_COOKIE_DOMAIN: localhost
-BLOCKSTORE_API_URL: http://localhost:18250/api/v1
-BLOCKSTORE_PUBLIC_URL_ROOT: http://localhost:18250
BLOCK_STRUCTURES_SETTINGS:
COURSE_PUBLISH_TASK_DELAY: 30
TASK_DEFAULT_RETRY_DELAY: 30
diff --git a/lms/envs/test.py b/lms/envs/test.py
index 9e18344aa17f..39996e857ac5 100644
--- a/lms/envs/test.py
+++ b/lms/envs/test.py
@@ -418,16 +418,6 @@
FACEBOOK_APP_ID = "Test"
FACEBOOK_API_VERSION = "v2.8"
-####################### ELASTICSEARCH TESTS #######################
-# Enable this when testing elasticsearch-based code which couldn't be tested using the mock engine
-ENABLE_ELASTICSEARCH_FOR_TESTS = os.environ.get(
- 'EDXAPP_ENABLE_ELASTICSEARCH_FOR_TESTS', 'no').lower() in ('true', 'yes', '1')
-
-TEST_ELASTICSEARCH_USE_SSL = os.environ.get(
- 'EDXAPP_TEST_ELASTICSEARCH_USE_SSL', 'no').lower() in ('true', 'yes', '1')
-TEST_ELASTICSEARCH_HOST = os.environ.get('EDXAPP_TEST_ELASTICSEARCH_HOST', 'edx.devstack.elasticsearch710')
-TEST_ELASTICSEARCH_PORT = int(os.environ.get('EDXAPP_TEST_ELASTICSEARCH_PORT', '9200'))
-
######### custom courses #########
INSTALLED_APPS += ['lms.djangoapps.ccx', 'openedx.core.djangoapps.ccxcon.apps.CCXConnectorConfig']
FEATURES['CUSTOM_COURSES_EDX'] = True
@@ -557,11 +547,6 @@
derive_settings(__name__)
############################### BLOCKSTORE #####################################
-# Blockstore tests
-RUN_BLOCKSTORE_TESTS = os.environ.get('EDXAPP_RUN_BLOCKSTORE_TESTS', 'no').lower() in ('true', 'yes', '1')
-BLOCKSTORE_USE_BLOCKSTORE_APP_API = not RUN_BLOCKSTORE_TESTS
-BLOCKSTORE_API_URL = os.environ.get('EDXAPP_BLOCKSTORE_API_URL', "http://edx.devstack.blockstore-test:18251/api/v1/")
-BLOCKSTORE_API_AUTH_TOKEN = os.environ.get('EDXAPP_BLOCKSTORE_API_AUTH_TOKEN', 'edxapp-test-key')
XBLOCK_RUNTIME_V2_EPHEMERAL_DATA_CACHE = 'blockstore' # This must be set to a working cache for the tests to pass
BUNDLE_ASSET_STORAGE_SETTINGS = dict(
STORAGE_CLASS='django.core.files.storage.FileSystemStorage',
diff --git a/lms/static/js/financial-assistance/views/financial_assistance_form_view.js b/lms/static/js/financial-assistance/views/financial_assistance_form_view.js
index 5d37d38ecb73..3ff0b2b9ff2f 100644
--- a/lms/static/js/financial-assistance/views/financial_assistance_form_view.js
+++ b/lms/static/js/financial-assistance/views/financial_assistance_form_view.js
@@ -43,16 +43,14 @@
fields = context.fields;
// Add default option to course array
- this.addDefaultOption(fields, 0);
- // Add default option to household income array
- this.addDefaultOption(fields, 1);
+ this.addDefaultOption(fields, 0, context.course_id);
// Set non-form data needed to render the View
this.context = {
dashboard_url: context.dashboard_url,
header_text: context.header_text,
+ course_id: context.course_id,
platform_name: context.platform_name,
- student_faq_url: context.student_faq_url,
account_settings_url: context.account_settings_url
};
@@ -146,13 +144,16 @@
}
},
- addDefaultOption: function(array, index) {
- if (array[index].options.length > 1) {
- array[index].options.unshift({
- name: '- ' + gettext('Choose one') + ' -',
- value: '',
- default: true
- });
+ addDefaultOption: function(array, index, course_id) {
+ if (array[index].options.length >= 1) {
+ if (!course_id) {
+ array[index].options.unshift({
+ name: gettext('Choose one'),
+ value: '',
+ default: true,
+ disabled: true,
+ });
+ }
}
}
});
diff --git a/lms/static/js/i18n/el/djangojs.js b/lms/static/js/i18n/el/djangojs.js
index b285dc7c78cf..ea7d101fd4f8 100644
--- a/lms/static/js/i18n/el/djangojs.js
+++ b/lms/static/js/i18n/el/djangojs.js
@@ -75,6 +75,8 @@
"April": "\u0391\u03c0\u03c1\u03af\u03bb\u03b9\u03bf\u03c2",
"Are you sure you want to delete this post?": "\u0395\u03af\u03c3\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03bf\u03c2 \u03cc\u03c4\u03b9 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03ac\u03c8\u03b5\u03c4\u03b5 \u03c4\u03b7\u03bd \u03b1\u03bd\u03ac\u03c1\u03c4\u03b7\u03c3\u03b7;",
"Are you sure you want to delete this response?": "\u0395\u03af\u03c3\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03bf\u03c2 \u03cc\u03c4\u03b9 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03ac\u03c8\u03b5\u03c4\u03b5 \u03c4\u03b7\u03bd \u03b1\u03c0\u03cc\u03ba\u03c1\u03b9\u03c3\u03b7;",
+ "Are you sure you want to unenroll from the verified {certNameLong} track of {courseName} ({courseNumber})?": "\u0398\u03ad\u03bb\u03b5\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03b1 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03b5\u03af\u03c4\u03b5 \u03b1\u03c0\u03cc \u03c4\u03bf \u03bc\u03ac\u03b8\u03b7\u03bc\u03b1 {certNameLong} {courseName} ({courseNumber});",
+ "Are you sure you want to unenroll from the verified {certNameLong} track of {courseName} ({courseNumber})?": "\u0398\u03ad\u03bb\u03b5\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03b1 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03b5\u03af\u03c4\u03b5 \u03b1\u03c0\u03cc \u03c4\u03bf \u03bc\u03ac\u03b8\u03b7\u03bc\u03b1 {certNameLong} {courseName} ({courseNumber});",
"Are you sure you want to unenroll from {courseName} ({courseNumber})?": "\u0398\u03ad\u03bb\u03b5\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03b1 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03b5\u03af\u03c4\u03b5 \u03b1\u03c0\u03cc \u03c4\u03bf \u03bc\u03ac\u03b8\u03b7\u03bc\u03b1 {courseName} ({courseNumber});",
"Assessment": "\u0391\u03be\u03b9\u03bf\u03bb\u03cc\u03b3\u03b7\u03c3\u03b7",
"Assessments": "\u0391\u03be\u03b9\u03bf\u03bb\u03bf\u03b3\u03ae\u03c3\u03b5\u03b9\u03c2",
@@ -126,6 +128,7 @@
"Course Name": "\u03a4\u03af\u03c4\u03bb\u03bf\u03c2 \u03bc\u03b1\u03b8\u03ae\u03bc\u03b1\u03c4\u03bf\u03c2",
"Course Number": "\u039a\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u039c\u03b1\u03b8\u03ae\u03bc\u03b1\u03c4\u03bf\u03c2",
"Create Account": "\u03a0\u03b1\u03c4\u03ae\u03c3\u03c4\u03b5 \u03b5\u03b4\u03ce \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03b3\u03af\u03bd\u03b5\u03b9 \u03b7 \u03b5\u03b3\u03b3\u03c1\u03b1\u03c6\u03ae \u03c3\u03b1\u03c2",
+ "Create a report of problem responses": "\u0394\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac\u03c2",
"Create an Account": "\u0394\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03bd\u03ad\u03bf\u03c5 \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03bf\u03cd",
"Create an Account.": "\u0394\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03bd\u03ad\u03bf\u03c5 \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03bf\u03cd",
"Create an account": "\u0394\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03bd\u03ad\u03bf\u03c5 \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03bf\u03cd",
@@ -153,7 +156,7 @@
"Engage with posts": "\u0394\u03b9\u03b1\u03c7\u03b5\u03af\u03c1\u03b9\u03c3\u03b7 \u03b1\u03bd\u03b1\u03c1\u03c4\u03ae\u03c3\u03b5\u03c9\u03bd",
"Enter Due Date and Time": "\u0395\u03b9\u03c3\u03ac\u03b3\u03b1\u03c4\u03b5 \u03b7\u03bc\u03b5\u03c1\u03bf\u03bc\u03b7\u03bd\u03af\u03b1 \u03ba\u03b1\u03b9 \u03ce\u03c1\u03b1 \u03bb\u03ae\u03be\u03b7\u03c2 \u03c4\u03b7\u03c2 \u03c0\u03c1\u03bf\u03b8\u03b5\u03c3\u03bc\u03af\u03b1\u03c2 \u03c5\u03c0\u03bf\u03b2\u03bf\u03bb\u03ae\u03c2",
"Enter a student's username or email address.": "\u03a0\u03b1\u03ba\u03b1\u03bb\u03bf\u03cd\u03bc\u03b5 \u03b5\u03b9\u03c3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03c4\u03bf \u03c8\u03b5\u03c5\u03b4\u03ce\u03bd\u03c5\u03bc\u03bf \u03ae \u03c4\u03bf e-mail \u03ba\u03ac\u03c0\u03bf\u03b9\u03bf\u03c5 \u03c3\u03c0\u03bf\u03c5\u03b4\u03b1\u03c3\u03c4\u03ae..",
- "Enter a username or email.": "\u0395\u03b9\u03c3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03c8\u03b5\u03c5\u03b4\u03ce\u03bd\u03c5\u03bc\u03bf \u03ae e-mail",
+ "Enter a username or email.": "\u0395\u03b9\u03c3\u03b1\u03b3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03c8\u03b5\u03c5\u03b4\u03ce\u03bd\u03c5\u03bc\u03bf \u03ae e-mail",
"Enter and confirm your new password.": "\u0395\u03b9\u03c3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03ba\u03b1\u03b9 \u03b5\u03c0\u03b9\u03b2\u03b5\u03b2\u03b1\u03b9\u03ce\u03c3\u03c4\u03b5 \u03c4\u03bf \u03bd\u03ad\u03bf \u03c3\u03b1\u03c2 \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc.",
"Enter username or email": "\u0395\u03b9\u03c3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03c4\u03bf \u03c8\u03b5\u03c5\u03b4\u03ce\u03bd\u03c5\u03bc\u03bf \u03ae \u03c4\u03bf e-mail \u03c3\u03b1\u03c2",
"Enter your {platform_display_name} username or the URL to your {platform_display_name} page. Delete the URL to remove the link.": "\u0395\u03b9\u03c3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03c4\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7 \u03c3\u03b1\u03c2 \u03c3\u03c4\u03bf {platform_display_name} \u03ae \u03c4\u03b7 \u03b4\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 URL \u03c0\u03c1\u03bf\u03c2 \u03c4\u03b7 \u03c3\u03b5\u03bb\u03af\u03b4\u03b1 \u03c3\u03b1\u03c2 \u03c3\u03c4\u03bf {platform_display_name}. \u0394\u03b9\u03b1\u03b3\u03c1\u03ac\u03c8\u03c4\u03b5 \u03c4\u03b7 \u03b4\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 URL \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03b1\u03c6\u03b1\u03b9\u03c1\u03ad\u03c3\u03b5\u03c4\u03b5 \u03c4\u03bf \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03bc\u03bf.",
@@ -174,6 +177,7 @@
"Full Name": "\u039f\u03bd\u03bf\u03bc\u03b1\u03c4\u03b5\u03c0\u03ce\u03bd\u03c5\u03bc\u03bf",
"Full Profile": "\u03a4\u03b7\u03bd \u03c0\u03bb\u03ae\u03c1\u03b7 \u03c0\u03c1\u03bf\u03c3\u03c9\u03c0\u03b9\u03ba\u03ae \u03bc\u03bf\u03c5 \u03c3\u03b5\u03bb\u03af\u03b4\u03b1",
"Gender": "\u03a6\u03cd\u03bb\u03bf",
+ "Generate Exception Certificates": "\u0394\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03b2\u03b5\u03b2\u03b1\u03b9\u03ce\u03c3\u03b5\u03c9\u03bd",
"Grading": "\u0392\u0391\u0398\u039c\u039f\u039b\u039f\u0393\u0399\u0391",
"Heading": "\u0395\u03c0\u03b9\u03ba\u03b5\u03c6\u03b1\u03bb\u03af\u03b4\u03b1",
"Heading (Ctrl+H)": "\u0395\u03c0\u03b9\u03ba\u03b5\u03c6\u03b1\u03bb\u03af\u03b4\u03b1 (Ctrl+H)",
@@ -310,9 +314,11 @@
"Student": "\u03a3\u03c0\u03bf\u03c5\u03b4\u03b1\u03c3\u03c4\u03ae\u03c2",
"Submit": "\u03a5\u03c0\u03bf\u03b2\u03bf\u03bb\u03ae",
"Successfully enrolled and sent email to the following users:": "\u0395\u03c0\u03b9\u03c4\u03c5\u03c7\u03ae\u03c2 \u03b4\u03ae\u03bb\u03c9\u03c3\u03b7 \u03ba\u03b1\u03b9 \u03b1\u03c0\u03bf\u03c3\u03c4\u03bf\u03bb\u03ae \u03b7\u03bb\u03b5\u03ba\u03c4\u03c1\u03bf\u03bd\u03b9\u03ba\u03bf\u03cd \u03c4\u03b1\u03c7\u03c5\u03b4\u03c1\u03bf\u03bc\u03b5\u03af\u03bf\u03c5 \u03c3\u03c4\u03bf\u03c5\u03c2 \u03b5\u03be\u03ae\u03c2 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b5\u03c2:",
+ "Successfully started task to reset attempts for problem '<%- problem_id %>'. Click the 'Show Task Status' button to see the status of the task.": "\u039e\u03b5\u03ba\u03af\u03bd\u03b7\u03c3\u03b5 \u03bc\u03b5 \u03b5\u03c0\u03b9\u03c4\u03c5\u03c7\u03af\u03b1 \u03b7 \u03b4\u03b9\u03b1\u03b4\u03b9\u03ba\u03b1\u03c3\u03af\u03b1 \u03b3\u03b9\u03b1 \u03b5\u03c0\u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac \u03c4\u03c9\u03bd \u03c0\u03c1\u03bf\u03c3\u03c0\u03b1\u03b8\u03b5\u03b9\u03ce\u03bd \u03b3\u03b9\u03b1 \u03c4\u03bf \u03c4\u03b5\u03c3\u03c4 \"<%- problem_id %>\". \u039a\u03ac\u03bd\u03c4\u03b5 \u03ba\u03bb\u03b9\u03ba \u03c3\u03c4\u03bf \u03ba\u03bf\u03c5\u03bc\u03c0\u03af \"\u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7\u03c2 \u03c4\u03b7\u03c2 \u03b4\u03b9\u03b1\u03b4\u03b9\u03ba\u03b1\u03c3\u03af\u03b1\u03c2\", \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03b4\u03b5\u03af\u03c4\u03b5 \u03c4\u03b7\u03bd \u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7 \u03c4\u03b7\u03c2 \u03c4\u03b7\u03c2 \u03b4\u03b9\u03b1\u03b4\u03b9\u03ba\u03b1\u03c3\u03af\u03b1\u03c2.",
"Support education research by providing additional information": "\u03a3\u03c5\u03bd\u03b5\u03b9\u03c3\u03c6\u03ad\u03c1\u03b5\u03c4\u03b5 \u03c3\u03c4\u03b7\u03bd \u03b5\u03ba\u03c0\u03b1\u03b9\u03b4\u03b5\u03c5\u03c4\u03b9\u03ba\u03ae \u03ad\u03c1\u03b5\u03c5\u03bd\u03b1 \u03b4\u03af\u03bd\u03bf\u03bd\u03c4\u03b1\u03c2 \u03ba\u03ac\u03c0\u03bf\u03b9\u03b5\u03c2 \u03b5\u03c0\u03b9\u03c0\u03bb\u03ad\u03bf\u03bd \u03c0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b5\u03c2.",
"Supported file types: {supportedVideoTypes}": "\u03a3\u03c5\u03bc\u03b2\u03b1\u03c4\u03bf\u03af \u03c4\u03cd\u03c0\u03bf\u03b9 \u03b1\u03c1\u03c7\u03b5\u03af\u03c9\u03bd: {supportedVideoTypes}",
"TOTAL": "\u03a3\u03a5\u039d\u039f\u039b\u039f",
+ "Task Status": "\u039a\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7 \u03c4\u03b7\u03c2 \u03b4\u03b9\u03b1\u03b4\u03b9\u03ba\u03b1\u03c3\u03af\u03b1\u03c2",
"Team Description (Required) *": "\u03a0\u03b5\u03c1\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae \u039f\u03bc\u03ac\u03b4\u03b1\u03c2 (\u03a5\u03c0\u03bf\u03c7\u03c1\u03b5\u03c9\u03c4\u03b9\u03ba\u03cc \u03c0\u03b5\u03b4\u03af\u03bf)*",
"Team Name (Required) *": "\u038c\u03bd\u03bf\u03bc\u03b1 \u039f\u03bc\u03ac\u03b4\u03b1\u03c2 (\u03a5\u03c0\u03bf\u03c7\u03c1\u03b5\u03c9\u03c4\u03b9\u03ba\u03cc \u03c0\u03b5\u03b4\u03af\u03bf)*",
"Terms of Service and Honor Code": "\u038c\u03c1\u03bf\u03b9 \u03c7\u03c1\u03ae\u03c3\u03b7\u03c2 \u03ba\u03b1\u03b9 \u039a\u03ce\u03b4\u03b9\u03ba\u03b1\u03c2 \u03a4\u03b9\u03bc\u03ae\u03c2",
@@ -356,7 +362,7 @@
"URL": "\u0394\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 URL",
"Undo (Ctrl+Z)": "\u0391\u03bd\u03b1\u03af\u03c1\u03b5\u03c3\u03b7 (Ctrl+Z)",
"Undo Changes": "\u0391\u03bd\u03b1\u03af\u03c1\u03b5\u03c3\u03b7 \u03b1\u03bb\u03bb\u03b1\u03b3\u03ce\u03bd",
- "Unendorse": "\u0394\u03b5\u03bd \u03c0\u03c1\u03bf\u03c4\u03b5\u03af\u03bd\u03c9",
+ "Unendorse": "\u0391\u03bd\u03b1\u03af\u03c1\u03b5\u03c3\u03b7 \u03c4\u03b7\u03c2 \u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae\u03c2 \"\u03a0\u03c1\u03bf\u03c4\u03b5\u03af\u03bd\u03c9\"",
"Unit": "\u039a\u03b5\u03c6\u03ac\u03bb\u03b1\u03b9\u03bf",
"Upload File": "\u039c\u03b5\u03c4\u03b1\u03c6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7 \u0391\u03c1\u03c7\u03b5\u03af\u03bf\u03c5",
"Upload New File": "\u039c\u03b5\u03c4\u03b1\u03c6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7 \u03bd\u03ad\u03bf\u03c5 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5",
diff --git a/lms/static/js/i18n/eo/djangojs.js b/lms/static/js/i18n/eo/djangojs.js
index 1d127306f289..fd3ea5bef809 100644
--- a/lms/static/js/i18n/eo/djangojs.js
+++ b/lms/static/js/i18n/eo/djangojs.js
@@ -479,6 +479,7 @@
"Copy": "\u00c7\u00f6p\u00fd \u2c60'\u03c3\u044f\u0454\u043c \u03b9#",
"Copy Component Location": "\u00c7\u00f6p\u00fd \u00c7\u00f6mp\u00f6n\u00e9nt L\u00f6\u00e7\u00e4t\u00ef\u00f6n \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3#",
"Copy Email To Editor": "\u00c7\u00f6p\u00fd \u00c9m\u00e4\u00efl T\u00f6 \u00c9d\u00eft\u00f6r \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, #",
+ "Copy Unit": "\u00c7\u00f6p\u00fd \u00dbn\u00eft \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142#",
"Copy of '{componentDisplayName}'": "\u00c7\u00f6p\u00fd \u00f6f '{componentDisplayName}' \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9#",
"Copy row": "\u00c7\u00f6p\u00fd r\u00f6w \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202#",
"Copy to Clipboard": "\u00c7\u00f6p\u00fd t\u00f6 \u00c7l\u00efp\u00df\u00f6\u00e4rd \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454#",
diff --git a/lms/static/js/i18n/es-419/djangojs.js b/lms/static/js/i18n/es-419/djangojs.js
index 549e97e0b542..587d4c2077cd 100644
--- a/lms/static/js/i18n/es-419/djangojs.js
+++ b/lms/static/js/i18n/es-419/djangojs.js
@@ -599,6 +599,7 @@
"Copy Component Location": "Copiar la ubicaci\u00f3n del Componente",
"Copy Email To Editor": "Copiar el correo al editor",
"Copy Exam Code": "Copia el C\u00f3digo de el Examen",
+ "Copy Unit": "Copiar unidad",
"Copy of '{componentDisplayName}'": "Copia de '{componentDisplayName}'",
"Copy row": "Copiar la fila",
"Copy to Clipboard": "Copiar al portapapeles",
@@ -1232,6 +1233,7 @@
"Manage Learners": "Manejar Estudiantes",
"Manage Tags": "Administrar etiquetas",
"Manage my subscription": "Gestionar mi suscripci\u00f3n",
+ "Manage tags": "Administrar etiquetas",
"Manual": "Manual",
"March": "Marzo",
"Mark Exam As Completed": "Marcar el examen como completado",
diff --git a/lms/static/js/i18n/rtl/djangojs.js b/lms/static/js/i18n/rtl/djangojs.js
index 7e60d7631cf1..193b0b1d599c 100644
--- a/lms/static/js/i18n/rtl/djangojs.js
+++ b/lms/static/js/i18n/rtl/djangojs.js
@@ -444,6 +444,7 @@
"Copy": "\u023b\u00f8d\u028e",
"Copy Component Location": "\u023b\u00f8d\u028e \u023b\u00f8\u026fd\u00f8n\u01ddn\u0287 \u0141\u00f8\u0254\u0250\u0287\u1d09\u00f8n",
"Copy Email To Editor": "\u023b\u00f8d\u028e \u0246\u026f\u0250\u1d09l \u0166\u00f8 \u0246d\u1d09\u0287\u00f8\u0279",
+ "Copy Unit": "\u023b\u00f8d\u028e \u0244n\u1d09\u0287",
"Copy of '{componentDisplayName}'": "\u023b\u00f8d\u028e \u00f8\u025f '{componentDisplayName}'",
"Copy row": "\u023b\u00f8d\u028e \u0279\u00f8\u028d",
"Copy to Clipboard": "\u023b\u00f8d\u028e \u0287\u00f8 \u023bl\u1d09db\u00f8\u0250\u0279d",
diff --git a/lms/static/js/spec/financial-assistance/financial_assistance_form_view_spec.js b/lms/static/js/spec/financial-assistance/financial_assistance_form_view_spec.js
index 64f94368f767..738dd272ef80 100644
--- a/lms/static/js/spec/financial-assistance/financial_assistance_form_view_spec.js
+++ b/lms/static/js/spec/financial-assistance/financial_assistance_form_view_spec.js
@@ -29,62 +29,29 @@ define([
type: 'select'
}, {
defaultValue: '',
- instructions: 'Specify your annual income in USD.',
- label: 'Annual Income',
- name: 'income',
- options: [
- {name: 'Less than $5,000', value: 'Less than $5,000'},
- {name: '$5,000 - $10,000', value: '$5,000 - $10,000'},
- {name: '$10,000 - $15,000', value: '$10,000 - $15,000'},
- {name: '$15,000 - $20,000', value: '$15,000 - $20,000'},
- {name: '$20,000 - $25,000', value: '$20,000 - $25,000'}
- ],
- placeholder: '',
- required: true,
- type: 'select'
- }, {
- defaultValue: '',
- instructions: 'Your response should contain approximately 250 - 500 words.',
- label: 'Tell us about your current financial situation, including any unusual circumstances.',
- name: 'reason_for_applying',
+ instructions: '',
+ label: 'Paying the verified certificate fee for the above course would cause me economic hardship',
+ name: 'certify-economic-hardship',
placeholder: '',
required: true,
- restrictions: {
- min_length: 800,
- max_length: 2500
- },
- type: 'textarea'
+ restrictions: {},
+ type: 'checkbox'
}, {
defaultValue: '',
- instructions: 'Use between 250 and 500 words or so in your response.',
- label: 'Tell us about your learning or professional goals. How will a Verified Certificate in this course help you achieve these goals?',
- name: 'goals',
+ instructions: '',
+ label: 'I will work diligently to complete the course work and receive a certificate',
+ name: 'certify-complete-certificate',
placeholder: '',
required: true,
- restrictions: {
- min_length: 800,
- max_length: 2500
- },
- type: 'textarea'
+ restrictions: {},
+ type: 'checkbox'
}, {
defaultValue: '',
- instructions: 'Use between 250 and 500 words or so in your response.',
- label: 'Tell us about your plans for this course. What steps will you take to help you complete the course work a receive a certificate?',
- name: 'effort',
+ instructions: '',
+ label: 'I have read, understand, and will abide by the Honor Code for the edX Site',
+ name: 'certify-honor-code',
placeholder: '',
required: true,
- restrictions: {
- min_length: 800,
- max_length: 2500
- },
- type: 'textarea'
- }, {
- defaultValue: '',
- instructions: 'Annual income and personal information such as email address will not be shared.',
- label: 'I allow edX to use the information provided in this application for edX marketing purposes.',
- name: 'mktg-permission',
- placeholder: '',
- required: false,
restrictions: {},
type: 'checkbox'
}
@@ -96,7 +63,7 @@ define([
username: 'xsy4ever'
},
header_text: ['Line one.', 'Line two.'],
- student_faq_url: '/faqs',
+ course_id: 'course-v1:edX+Test+1',
dashboard_url: '/dashboard',
platform_name: 'edx',
submit_url: '/api/financial/v1/assistance'
@@ -111,12 +78,11 @@ define([
completeForm = function() {
var courseOptions = context.fields[0].options,
courseSelectValue = courseOptions[courseOptions.length - 1].value;
- var incomeOptions = context.fields[1].options,
- incomeSelectValue = incomeOptions[incomeOptions.length - 1].value;
view.$('#financial-assistance-course').val(courseSelectValue);
- view.$('#financial-assistance-income').val(incomeSelectValue);
- view.$('textarea').html(Array(802).join('w'));
+ view.$('#financial-assistance-certify-economic-hardship').prop('checked', true );
+ view.$('#financial-assistance-certify-complete-certificate').prop('checked', true );
+ view.$('#financial-assistance-certify-honor-code').prop('checked', true );
};
validSubmission = function() {
@@ -179,9 +145,9 @@ define([
var $form = view.$('.financial-assistance-form');
expect($form.find('select').first().attr('name')).toEqual(context.fields[0].name);
- expect($form.find('select').last().attr('name')).toEqual(context.fields[1].name);
- expect($form.find('textarea').first().attr('name')).toEqual(context.fields[2].name);
- expect($form.find('input[type=checkbox]').attr('name')).toEqual(context.fields[5].name);
+ expect($form.find('input[type=checkbox]')[0].name).toEqual(context.fields[1].name);
+ expect($form.find('input[type=checkbox]')[1].name).toEqual(context.fields[2].name);
+ expect($form.find('input[type=checkbox]')[2].name).toEqual(context.fields[3].name);
});
it('should not submit the form if the front end validation fails', function() {
@@ -204,7 +170,7 @@ define([
});
it('should allow form resubmission after a front end validation failure', function() {
- view.$('#financial-assistance-income').val(1312);
+ view.$('#financial-assistance-course').val('');
expect(view.model.save).not.toHaveBeenCalled();
validSubmission();
});
diff --git a/lms/static/sass/views/_financial-assistance.scss b/lms/static/sass/views/_financial-assistance.scss
index 20370aa617da..ce9ad6c24ae7 100644
--- a/lms/static/sass/views/_financial-assistance.scss
+++ b/lms/static/sass/views/_financial-assistance.scss
@@ -3,42 +3,46 @@
padding: ($baseline/2) 0;
margin: 0;
- color: $m-gray-d2;
+ color: $gray-500;
}
.financial-assistance-wrapper {
- margin: auto;
padding: $baseline ($baseline/2);
- max-width: 1180px;
+ max-width: 1248px;
h1 {
- @extend %t-title4;
+ @extend %t-title3;
+ @extend %t-ultrastrong;
@include text-align(left);
margin: 0;
padding: ($baseline/2) 0;
- border-bottom: 4px solid $gray-l5;
- color: $m-gray-d3;
+ color: $black;
}
h2 {
- @extend %t-title6;
- @extend %t-strong;
+ @extend %t-title4;
+ @extend %t-ultrastrong;
margin-top: ($baseline/2);
text-transform: none;
+ color: $black;
}
p {
- @extend %fa-copy;
+ line-height: $base-line-height;
+ margin-top: 0;
+ color: $gray-700;
+ font-size: 1em;
+ }
- font-size: 0.875em;
+ span {
+ color: $gray-700;
}
.financial-assistance {
padding-bottom: ($baseline/2);
- border-bottom: 4px solid $gray-l5;
.apply-form-list {
padding: 0;
@@ -70,29 +74,36 @@
}
}
+ #financial-assistance-course-desc {
+ padding-bottom: 1rem;
+ }
+
+ .plaintext-certify-heading .plaintext-field.honor_tos_combined {
+ font-size: 1rem !important;
+ }
+
.financial-assistance-footer {
padding: $baseline;
-
- .faq-link {
- padding: $baseline/2;
- }
+ margin-bottom: 1rem;
.action-link {
- @include float(right);
+ float: right;
+ font-weight: 500;
+ }
+ }
- padding: $baseline/2;
- background-color: $m-blue-d2;
- color: $gray-l7;
- border-radius: 2px;
+ .financial-assistance-header {
+ p:nth-child(4) {
+ margin-top: 1rem;
}
}
// Application form View
.intro {
- border-bottom: 4px solid $gray-l5;
+ margin-bottom: 2rem;
- p {
- margin: 10px 0;
+ p:nth-child(4) {
+ margin-top: 1rem;
}
}
@@ -117,8 +128,6 @@
.user-info {
@include clearfix();
- border-bottom: 2px solid $gray-l5;
- padding: 20px 0;
margin-bottom: 20px;
.info-column {
@@ -143,14 +152,15 @@
padding: 0;
color: $black;
- font-size: 1.125em;
}
}
.financial-assistance-form {
@extend .login-register;
- max-width: 800px;
+ max-width: 1248px;
+ padding: 0;
+ margin: inherit;
.action-primary {
@include float(left);
@@ -185,17 +195,13 @@
box-shadow: none;
}
- textarea {
- height: 125px;
- }
-
.checkbox {
height: auto;
position: absolute;
top: 5px;
& + label {
- @include margin-left(30px);
+ @include margin-left(24px);
display: inline-block;
}
@@ -204,17 +210,10 @@
}
.cta-wrapper {
- border-top: 4px solid $gray-l5;
padding: 20px 0;
}
@include media($bp-medium) {
- .user-info {
- .info-column {
- width: 50%;
- }
- }
-
.financial-assistance-form {
.action-primary {
@include float(right);
@@ -227,12 +226,6 @@
}
@include media($bp-large) {
- .user-info {
- .info-column {
- width: 25%;
- }
- }
-
.financial-assistance-form {
.action-primary {
@include float(right);
@@ -245,12 +238,6 @@
}
@include media($bp-huge) {
- .user-info {
- .info-column {
- width: 25%;
- }
- }
-
.financial-assistance-form {
.action-primary {
@include float(right);
diff --git a/lms/templates/financial-assistance/apply.html b/lms/templates/financial-assistance/apply.html
index ca588d264a3d..09787193193b 100644
--- a/lms/templates/financial-assistance/apply.html
+++ b/lms/templates/financial-assistance/apply.html
@@ -14,7 +14,6 @@
fields: ${fields | n, dump_js_escaped_json},
user_details: ${user_details | n, dump_js_escaped_json},
header_text: ${header_text | n, dump_js_escaped_json},
- student_faq_url: '${student_faq_url | n, js_escaped_string}',
dashboard_url: '${dashboard_url | n, js_escaped_string}',
account_settings_url: '${account_settings_url | n, js_escaped_string}',
platform_name: '${platform_name | n, js_escaped_string}',
diff --git a/lms/templates/financial-assistance/financial-assistance.html b/lms/templates/financial-assistance/financial-assistance.html
index 88a8d5ff26c1..f44f49e51150 100644
--- a/lms/templates/financial-assistance/financial-assistance.html
+++ b/lms/templates/financial-assistance/financial-assistance.html
@@ -30,9 +30,6 @@ ${_("A Note to Learners")}
## Translators: This string will not be used in Open edX installations.
${_("If you are interested in working toward a Verified Certificate, but cannot afford to pay the fee, please apply now. Please note that financial assistance is limited and may not be awarded to all eligible candidates.")}
- ## Translators: This string will not be used in Open edX installations.
- ${_("In order to be eligible for edX Financial Assistance, you must demonstrate that paying the Verified Certificate fee would cause you economic hardship. To apply, you will be asked to answer a few questions about why you are applying and how the Verified Certificate will benefit you.")}
-
## Translators: This string will not be used in Open edX installations.
${_("If your application is approved, we'll give you instructions for verifying your identity on edx.org so you can start working toward completing your edX course.")}
@@ -45,14 +42,8 @@ ${_("A Note to Learners")}
diff --git a/lms/templates/financial-assistance/financial_assessment_form.underscore b/lms/templates/financial-assistance/financial_assessment_form.underscore
index e6c76428fc0f..cd41ad6d6161 100644
--- a/lms/templates/financial-assistance/financial_assessment_form.underscore
+++ b/lms/templates/financial-assistance/financial_assessment_form.underscore
@@ -11,11 +11,11 @@
-
<%- gettext('About You') %>
+
<%- gettext('Profile Information') %>
<%- interpolate_text(
- gettext("The following information is already a part of your {platform} profile. We've included it here for your application."),
+ gettext("The following information is already a part of your {platform} profile and is required for your application. To edit this information go to "),
{platform: platform_name}
- ) %>
+ ) %>
<%- gettext("Account Settings") %>.
<%- gettext('Username') %>
<%- username %>
@@ -33,15 +33,12 @@
<%- country %>
+ <%- gettext('Application Details') %>
<% // xss-lint: disable=underscore-not-escaped %>
<%= fields %>
diff --git a/openedx/core/djangoapps/content_libraries/api.py b/openedx/core/djangoapps/content_libraries/api.py
index 33d43cdc64f2..10383de336e5 100644
--- a/openedx/core/djangoapps/content_libraries/api.py
+++ b/openedx/core/djangoapps/content_libraries/api.py
@@ -67,7 +67,6 @@
from django.core.validators import validate_unicode_slug
from django.db import IntegrityError, transaction
from django.utils.translation import gettext as _
-from elasticsearch.exceptions import ConnectionError as ElasticConnectionError
from lxml import etree
from opaque_keys.edx.keys import LearningContextKey, UsageKey
from opaque_keys.edx.locator import (
@@ -94,7 +93,6 @@
from openedx.core.djangoapps.content_libraries import permissions
from openedx.core.djangoapps.content_libraries.constants import DRAFT_NAME, COMPLEX
from openedx.core.djangoapps.content_libraries.library_bundle import LibraryBundle
-from openedx.core.djangoapps.content_libraries.libraries_index import ContentLibraryIndexer, LibraryBlockIndexer
from openedx.core.djangoapps.content_libraries.models import (
ContentLibrary,
ContentLibraryPermission,
@@ -290,56 +288,35 @@ def get_libraries_for_user(user, org=None, library_type=None):
return permissions.perms[permissions.CAN_VIEW_THIS_CONTENT_LIBRARY].filter(user, qs)
-def get_metadata_from_index(queryset, text_search=None):
+def get_metadata(queryset, text_search=None):
"""
- Take a list of ContentLibrary objects and return metadata stored in
- ContentLibraryIndex.
+ Take a list of ContentLibrary objects and return metadata from blockstore.
"""
- metadata = None
- if ContentLibraryIndexer.indexing_is_enabled():
- try:
- library_keys = [str(lib.library_key) for lib in queryset]
- metadata = ContentLibraryIndexer.get_items(library_keys, text_search=text_search)
- metadata_dict = {
- item["id"]: item
- for item in metadata
- }
- metadata = [
- metadata_dict[key]
- if key in metadata_dict
- else None
- for key in library_keys
- ]
- except ElasticConnectionError as e:
- log.exception(e)
-
- # If ContentLibraryIndex is not available, we query blockstore for a limited set of metadata
- if metadata is None:
- uuids = [lib.bundle_uuid for lib in queryset]
- bundles = get_bundles(uuids=uuids, text_search=text_search)
-
- if text_search:
- # Bundle APIs can't apply text_search on a bundle's org, so including those results here
- queryset_org_search = queryset.filter(org__short_name__icontains=text_search)
- if queryset_org_search.exists():
- uuids_org_search = [lib.bundle_uuid for lib in queryset_org_search]
- bundles += get_bundles(uuids=uuids_org_search)
-
- bundle_dict = {
- bundle.uuid: {
- 'uuid': bundle.uuid,
- 'title': bundle.title,
- 'description': bundle.description,
- 'version': bundle.latest_version,
- }
- for bundle in bundles
+ uuids = [lib.bundle_uuid for lib in queryset]
+ bundles = get_bundles(uuids=uuids, text_search=text_search)
+
+ if text_search:
+ # Bundle APIs can't apply text_search on a bundle's org, so including those results here
+ queryset_org_search = queryset.filter(org__short_name__icontains=text_search)
+ if queryset_org_search.exists():
+ uuids_org_search = [lib.bundle_uuid for lib in queryset_org_search]
+ bundles += get_bundles(uuids=uuids_org_search)
+
+ bundle_dict = {
+ bundle.uuid: {
+ 'uuid': bundle.uuid,
+ 'title': bundle.title,
+ 'description': bundle.description,
+ 'version': bundle.latest_version,
}
- metadata = [
- bundle_dict[uuid]
- if uuid in bundle_dict
- else None
- for uuid in uuids
- ]
+ for bundle in bundles
+ }
+ metadata = [
+ bundle_dict[uuid]
+ if uuid in bundle_dict
+ else None
+ for uuid in uuids
+ ]
libraries = [
ContentLibraryMetadata(
@@ -648,50 +625,28 @@ def get_library_blocks(library_key, text_search=None, block_types=None) -> list[
Returns a list of LibraryXBlockMetadata objects
"""
- metadata = None
- if LibraryBlockIndexer.indexing_is_enabled():
- try:
- filter_terms = {
- 'library_key': [str(library_key)],
- 'is_child': [False],
- }
- if block_types:
- filter_terms['block_type'] = block_types
- metadata = [
- {
- **item,
- "id": LibraryUsageLocatorV2.from_string(item['id']),
- }
- for item in LibraryBlockIndexer.get_items(filter_terms=filter_terms, text_search=text_search)
- if item is not None
- ]
- except ElasticConnectionError as e:
- log.exception(e)
-
- # If indexing is disabled, or connection to elastic failed
- if metadata is None:
- metadata = []
- ref = ContentLibrary.objects.get_by_key(library_key) # type: ignore[attr-defined]
- lib_bundle = LibraryBundle(library_key, ref.bundle_uuid, draft_name=DRAFT_NAME)
- usages = lib_bundle.get_top_level_usages()
-
- for usage_key in usages:
- # For top-level definitions, we can go from definition key to usage key using the following, but this would
- # not work for non-top-level blocks as they may have multiple usages. Top level blocks are guaranteed to
- # have only a single usage in the library, which is part of the definition of top level block.
- def_key = lib_bundle.definition_for_usage(usage_key)
- display_name = get_block_display_name(def_key)
- text_match = (text_search is None or
- text_search.lower() in display_name.lower() or
- text_search.lower() in str(usage_key).lower())
- type_match = (block_types is None or usage_key.block_type in block_types)
- if text_match and type_match:
- metadata.append({
- "id": usage_key,
- "def_key": def_key,
- "display_name": display_name,
- "has_unpublished_changes": lib_bundle.does_definition_have_unpublished_changes(def_key),
- })
+ metadata = []
+ ref = ContentLibrary.objects.get_by_key(library_key) # type: ignore[attr-defined]
+ lib_bundle = LibraryBundle(library_key, ref.bundle_uuid, draft_name=DRAFT_NAME)
+ usages = lib_bundle.get_top_level_usages()
+
+ for usage_key in usages:
+ # For top-level definitions, we can go from definition key to usage key using the following, but this would
+ # not work for non-top-level blocks as they may have multiple usages. Top level blocks are guaranteed to
+ # have only a single usage in the library, which is part of the definition of top level block.
+ def_key = lib_bundle.definition_for_usage(usage_key)
+ display_name = get_block_display_name(def_key)
+ text_match = (text_search is None or
+ text_search.lower() in display_name.lower() or
+ text_search.lower() in str(usage_key).lower())
+ type_match = (block_types is None or usage_key.block_type in block_types)
+ if text_match and type_match:
+ metadata.append({
+ "id": usage_key,
+ "def_key": def_key,
+ "display_name": display_name,
+ "has_unpublished_changes": lib_bundle.does_definition_have_unpublished_changes(def_key),
+ })
return [
LibraryXBlockMetadata(
diff --git a/openedx/core/djangoapps/content_libraries/docs/decisions/0001-index-libraries-in-elasticsearch.rst b/openedx/core/djangoapps/content_libraries/docs/decisions/0001-index-libraries-in-elasticsearch.rst
index ed16be84a48f..eb003e1ca6df 100644
--- a/openedx/core/djangoapps/content_libraries/docs/decisions/0001-index-libraries-in-elasticsearch.rst
+++ b/openedx/core/djangoapps/content_libraries/docs/decisions/0001-index-libraries-in-elasticsearch.rst
@@ -4,7 +4,30 @@
Status
------
-Accepted
+**Revoked**
+
+In Dec 2023, we decided to remove the code supporting this decision, because:
+
+* The index is disabled on edx.org, which will initially be the only user
+ of Content Libraries V2.
+* As we migrate libraries from Modulestore to Blockstore and then from
+ Blockstore to Learning Core, the unused indexing code increases complexity
+ and decreases certainty.
+* With the decision to migrate from Blockstore-the-service to an in-process
+ storage backend (that is: Blockstore-the-app or Learning Core), it seems
+ that we will be able to simply use Django ORM in order to filter/sort/search
+ Content Library V2 metadata for the library listing page.
+* Searching Content Library V2 *block* content would still require indexing,
+ but we would rather implement that in Learning Core than use the current
+ implementation in the content_libraries app, which is untested, library-
+ specific, and doesn't take into account library versioning. It always uses
+ the latest draft, which is good for Library Authoring purposes, but not good for
+ Course Authoring purposes.
+
+It is possible that we will end up re-instating a modified version of this ADR
+future. If that happens, we may re-use and adapt the original library index
+code.
+
Context
-------
diff --git a/openedx/core/djangoapps/content_libraries/libraries_index.py b/openedx/core/djangoapps/content_libraries/libraries_index.py
deleted file mode 100644
index 82a79a652561..000000000000
--- a/openedx/core/djangoapps/content_libraries/libraries_index.py
+++ /dev/null
@@ -1,346 +0,0 @@
-""" Code to allow indexing content libraries """
-
-import logging
-from abc import ABC, abstractmethod
-
-from django.conf import settings
-from django.dispatch import receiver
-from elasticsearch.exceptions import ConnectionError as ElasticConnectionError
-from search.elastic import _translate_hits, RESERVED_CHARACTERS
-from search.search_engine_base import SearchEngine
-from opaque_keys.edx.locator import LibraryUsageLocatorV2
-from openedx_events.content_authoring.data import ContentLibraryData, LibraryBlockData
-from openedx_events.content_authoring.signals import (
- CONTENT_LIBRARY_CREATED,
- CONTENT_LIBRARY_DELETED,
- CONTENT_LIBRARY_UPDATED,
- LIBRARY_BLOCK_CREATED,
- LIBRARY_BLOCK_DELETED,
- LIBRARY_BLOCK_UPDATED,
-)
-
-from openedx.core.djangoapps.content_libraries.constants import DRAFT_NAME
-from openedx.core.djangoapps.content_libraries.library_bundle import LibraryBundle
-from openedx.core.djangoapps.content_libraries.models import ContentLibrary
-from openedx.core.lib.blockstore_api import get_bundle
-
-log = logging.getLogger(__name__)
-
-MAX_SIZE = 10000 # 10000 is the maximum records elastic is able to return in a single result. Defaults to 10.
-
-
-class SearchIndexerBase(ABC):
- """
- Abstract Base Class for implementing library search indexers.
- """
- INDEX_NAME = None
- ENABLE_INDEXING_KEY = None
- SCHEMA_VERSION = 0
- SEARCH_KWARGS = {
- # Set this to True or 'wait_for' if immediate refresh is required after any update.
- # See elastic docs for more information.
- 'refresh': False
- }
-
- @classmethod
- @abstractmethod
- def get_item_definition(cls, item):
- """
- Returns a serializable dictionary which can be stored in elasticsearch.
- """
-
- @classmethod
- def index_items(cls, items):
- """
- Index the specified libraries. If they already exist, replace them with new ones.
- """
- searcher = SearchEngine.get_search_engine(cls.INDEX_NAME)
- items = [cls.get_item_definition(item) for item in items]
- return searcher.index(items, **cls.SEARCH_KWARGS)
-
- @classmethod
- def get_items(cls, ids=None, filter_terms=None, text_search=None):
- """
- Retrieve a list of items from the index.
- Arguments:
- ids - List of ids to be searched for in the index
- filter_terms - Dictionary of filters to be applied
- text_search - String which is used to do a text search in the supported indexes.
- """
- if filter_terms is None:
- filter_terms = {}
- if ids is not None:
- filter_terms = {
- "id": [str(item) for item in ids],
- "schema_version": [cls.SCHEMA_VERSION],
- **filter_terms,
- }
- if text_search:
- response = cls._perform_elastic_search(filter_terms, text_search)
- else:
- searcher = SearchEngine.get_search_engine(cls.INDEX_NAME)
- response = searcher.search(field_dictionary=filter_terms, size=MAX_SIZE)
-
- response = [result["data"] for result in response["results"]]
- return sorted(response, key=lambda i: i["id"])
-
- @classmethod
- def remove_items(cls, ids):
- """
- Remove the provided ids from the index
- """
- searcher = SearchEngine.get_search_engine(cls.INDEX_NAME)
- ids_str = [str(i) for i in ids]
- searcher.remove(ids_str, **cls.SEARCH_KWARGS)
-
- @classmethod
- def remove_all_items(cls):
- """
- Remove all items from the index
- """
- searcher = SearchEngine.get_search_engine(cls.INDEX_NAME)
- response = searcher.search(filter_dictionary={}, size=MAX_SIZE)
- ids = [result["data"]["id"] for result in response["results"]]
- searcher.remove(ids, **cls.SEARCH_KWARGS)
-
- @classmethod
- def indexing_is_enabled(cls):
- """
- Checks to see if the indexing feature is enabled
- """
- return settings.FEATURES.get(cls.ENABLE_INDEXING_KEY, False)
-
- @classmethod
- def _perform_elastic_search(cls, filter_terms, text_search):
- """
- Build a query and search directly on elasticsearch
- """
- searcher = SearchEngine.get_search_engine(cls.INDEX_NAME)
- return _translate_hits(searcher._es.search( # pylint: disable=protected-access
- index=searcher.index_name,
- body=cls.build_elastic_query(filter_terms, text_search),
- size=MAX_SIZE
- ))
-
- @staticmethod
- def build_elastic_query(filter_terms, text_search):
- """
- Build and return an elastic query for doing text search on a library
- """
- # Remove reserved characters (and ") from the text to prevent unexpected errors.
- text_search_normalised = text_search.translate(text_search.maketrans('', '', RESERVED_CHARACTERS + '"'))
- text_search_normalised = text_search_normalised.replace('-', ' ')
- # Wrap with asterix to enable partial matches
- text_search_normalised = f"*{text_search_normalised}*"
- terms = [
- {
- 'terms': {
- item: filter_terms[item]
- }
- }
- for item in filter_terms
- ]
- return {
- 'query': {
- 'bool': {
- 'must': [
- {
- 'query_string': {
- 'query': text_search_normalised,
- "fields": ["content.*"],
- 'minimum_should_match': '100%',
- },
- },
- ],
- 'filter': {
- 'bool': {
- 'must': terms,
- }
- }
- },
- },
- }
-
-
-class ContentLibraryIndexer(SearchIndexerBase):
- """
- Class to perform indexing for blockstore-based content libraries
- """
-
- INDEX_NAME = "content_library_index"
- ENABLE_INDEXING_KEY = "ENABLE_CONTENT_LIBRARY_INDEX"
- SCHEMA_VERSION = 0
-
- @classmethod
- def get_item_definition(cls, item):
- ref = ContentLibrary.objects.get_by_key(item)
- lib_bundle = LibraryBundle(item, ref.bundle_uuid, draft_name=DRAFT_NAME)
- num_blocks = len(lib_bundle.get_top_level_usages())
- last_published = lib_bundle.get_last_published_time()
- last_published_str = None
- if last_published:
- last_published_str = last_published.strftime('%Y-%m-%dT%H:%M:%SZ')
- (has_unpublished_changes, has_unpublished_deletes) = lib_bundle.has_changes()
-
- bundle_metadata = get_bundle(ref.bundle_uuid)
-
- # NOTE: Increment ContentLibraryIndexer.SCHEMA_VERSION if the following schema is updated to avoid dealing
- # with outdated indexes which might cause errors due to missing/invalid attributes.
- return {
- "schema_version": ContentLibraryIndexer.SCHEMA_VERSION,
- "id": str(item),
- "uuid": str(bundle_metadata.uuid),
- "title": bundle_metadata.title,
- "description": bundle_metadata.description,
- "num_blocks": num_blocks,
- "version": bundle_metadata.latest_version,
- "last_published": last_published_str,
- "has_unpublished_changes": has_unpublished_changes,
- "has_unpublished_deletes": has_unpublished_deletes,
- # only 'content' field is analyzed by elasticsearch, and allows text-search
- "content": {
- "id": str(item),
- "title": bundle_metadata.title,
- "description": bundle_metadata.description,
- },
- }
-
-
-class LibraryBlockIndexer(SearchIndexerBase):
- """
- Class to perform indexing on the XBlocks in content libraries.
- """
-
- INDEX_NAME = "content_library_block_index"
- ENABLE_INDEXING_KEY = "ENABLE_CONTENT_LIBRARY_INDEX"
- SCHEMA_VERSION = 0
-
- @classmethod
- def get_item_definition(cls, item):
- from openedx.core.djangoapps.content_libraries.api import get_block_display_name, _lookup_usage_key
-
- def_key, lib_bundle = _lookup_usage_key(item)
- is_child = item in lib_bundle.get_bundle_includes().keys()
-
- # NOTE: Increment LibraryBlockIndexer.SCHEMA_VERSION if the following schema is updated to avoid dealing
- # with outdated indexes which might cause errors due to missing/invalid attributes.
- return {
- "schema_version": LibraryBlockIndexer.SCHEMA_VERSION,
- "id": str(item),
- "library_key": str(lib_bundle.library_key),
- "is_child": is_child,
- "def_key": str(def_key),
- "display_name": get_block_display_name(def_key),
- "block_type": def_key.block_type,
- "has_unpublished_changes": lib_bundle.does_definition_have_unpublished_changes(def_key),
- # only 'content' field is analyzed by elastisearch, and allows text-search
- "content": {
- "id": str(item),
- "display_name": get_block_display_name(def_key),
- },
- }
-
-
-@receiver(CONTENT_LIBRARY_CREATED)
-@receiver(CONTENT_LIBRARY_UPDATED)
-def index_library(**kwargs):
- """
- Index library when created or updated, or when its blocks are modified.
- """
- content_library = kwargs.get('content_library', None)
- if not content_library or not isinstance(content_library, ContentLibraryData):
- log.error('Received null or incorrect data for event')
- return
-
- library_key = content_library.library_key
- update_blocks = content_library.update_blocks
- if ContentLibraryIndexer.indexing_is_enabled():
- try:
- ContentLibraryIndexer.index_items([library_key])
- if update_blocks:
- blocks = LibraryBlockIndexer.get_items(filter_terms={
- 'library_key': str(library_key)
- })
- usage_keys = [LibraryUsageLocatorV2.from_string(block['id']) for block in blocks]
- LibraryBlockIndexer.index_items(usage_keys)
- except ElasticConnectionError as e:
- log.exception(e)
-
-
-@receiver(LIBRARY_BLOCK_CREATED)
-@receiver(LIBRARY_BLOCK_DELETED)
-@receiver(LIBRARY_BLOCK_UPDATED)
-def index_library_block(**kwargs):
- """
- Index library when its blocks are created, modified, or deleted.
- """
- library_block = kwargs.get('library_block', None)
- if not library_block or not isinstance(library_block, LibraryBlockData):
- log.error('Received null or incorrect data for event')
- return
-
- library_key = library_block.library_key
- if ContentLibraryIndexer.indexing_is_enabled():
- try:
- ContentLibraryIndexer.index_items([library_key])
- except ElasticConnectionError as e:
- log.exception(e)
-
-
-@receiver(CONTENT_LIBRARY_DELETED)
-def remove_library_index(**kwargs):
- """
- Remove from index when library is deleted
- """
- content_library = kwargs.get('content_library', None)
- if not content_library or not isinstance(content_library, ContentLibraryData):
- log.error('Received null or incorrect data for event')
- return
-
- if ContentLibraryIndexer.indexing_is_enabled():
- library_key = content_library.library_key
- try:
- ContentLibraryIndexer.remove_items([library_key])
- blocks = LibraryBlockIndexer.get_items(filter_terms={
- 'library_key': str(library_key)
- })
- LibraryBlockIndexer.remove_items([block['id'] for block in blocks])
- except ElasticConnectionError as e:
- log.exception(e)
-
-
-@receiver(LIBRARY_BLOCK_CREATED)
-@receiver(LIBRARY_BLOCK_UPDATED)
-def index_block(**kwargs):
- """
- Index block metadata when created or updated
- """
- library_block = kwargs.get('library_block', None)
- if not library_block or not isinstance(library_block, LibraryBlockData):
- log.error('Received null or incorrect data for event')
- return
-
- usage_key = library_block.usage_key
- if LibraryBlockIndexer.indexing_is_enabled():
- try:
- LibraryBlockIndexer.index_items([usage_key])
- except ElasticConnectionError as e:
- log.exception(e)
-
-
-@receiver(LIBRARY_BLOCK_DELETED)
-def remove_block_index(**kwargs):
- """
- Remove the block from the index when deleted
- """
- library_block = kwargs.get('library_block', None)
- if not library_block or not isinstance(library_block, LibraryBlockData):
- log.error('Received null or incorrect data for LIBRARY_BLOCK_DELETED')
- return
-
- usage_key = library_block.usage_key
- if LibraryBlockIndexer.indexing_is_enabled():
- try:
- LibraryBlockIndexer.remove_items([usage_key])
- except ElasticConnectionError as e:
- log.exception(e)
diff --git a/openedx/core/djangoapps/content_libraries/management/commands/reindex_content_library.py b/openedx/core/djangoapps/content_libraries/management/commands/reindex_content_library.py
deleted file mode 100644
index 6c3c8874e895..000000000000
--- a/openedx/core/djangoapps/content_libraries/management/commands/reindex_content_library.py
+++ /dev/null
@@ -1,81 +0,0 @@
-""" Management command to update content libraries' search index """ # lint-amnesty, pylint: disable=cyclic-import
-
-
-import logging
-
-from textwrap import dedent
-
-from django.core.management import BaseCommand
-from opaque_keys.edx.locator import LibraryLocatorV2
-from openedx.core.djangoapps.content_libraries.api import DRAFT_NAME
-from openedx.core.djangoapps.content_libraries.libraries_index import ContentLibraryIndexer, LibraryBlockIndexer
-from openedx.core.djangoapps.content_libraries.library_bundle import LibraryBundle
-from openedx.core.djangoapps.content_libraries.models import ContentLibrary
-
-from cms.djangoapps.contentstore.management.commands.prompt import query_yes_no
-
-
-class Command(BaseCommand):
- """
- Command to reindex blockstore-based content libraries (single, multiple or all available).
-
- This isn't needed on a regular basis as signals in various library APIs update the index when creating, updating or
- deleting libraries.
- This is usually required when the schema of the index changes, or if indexes are out of sync due to indexing
- being previously disabled or any other reason.
-
- Examples:
-
- ./manage.py reindex_content_library lib1 lib2 - reindexes libraries with keys lib1 and lib2
- ./manage.py reindex_content_library --all - reindexes all available libraries
- ./manage.py reindex_content_library --clear-all - clear all libraries indexes
- """
- help = dedent(__doc__)
- CONFIRMATION_PROMPT_CLEAR = "This will clear all indexed libraries from elasticsearch. Do you want to continue?"
- CONFIRMATION_PROMPT_ALL = "Reindexing all libraries might be a time consuming operation. Do you want to continue?"
-
- def add_arguments(self, parser):
- parser.add_argument(
- '--clear-all',
- action='store_true',
- dest='clear-all',
- help='Clear all library indexes'
- )
- parser.add_argument(
- '--all',
- action='store_true',
- dest='all',
- help='Reindex all libraries'
- )
- parser.add_argument(
- '--force',
- action='store_true',
- dest='force',
- help='Run command without user prompt for confirmation'
- )
- parser.add_argument('library_ids', nargs='*')
-
- def handle(self, *args, **options):
- if options['clear-all']:
- if options['force'] or query_yes_no(self.CONFIRMATION_PROMPT_CLEAR, default="no"):
- logging.info("Removing all libraries from the index")
- ContentLibraryIndexer.remove_all_items()
- LibraryBlockIndexer.remove_all_items()
- return
-
- if options['all']:
- if options['force'] or query_yes_no(self.CONFIRMATION_PROMPT_ALL, default="no"):
- logging.info("Indexing all libraries")
- library_keys = [library.library_key for library in ContentLibrary.objects.all()]
- else:
- return
- else:
- logging.info("Indexing libraries: {}".format(options['library_ids']))
- library_keys = list(map(LibraryLocatorV2.from_string, options['library_ids']))
-
- ContentLibraryIndexer.index_items(library_keys)
-
- for library_key in library_keys:
- ref = ContentLibrary.objects.get_by_key(library_key)
- lib_bundle = LibraryBundle(library_key, ref.bundle_uuid, draft_name=DRAFT_NAME)
- LibraryBlockIndexer.index_items(lib_bundle.get_all_usages())
diff --git a/openedx/core/djangoapps/content_libraries/tasks.py b/openedx/core/djangoapps/content_libraries/tasks.py
index c3c2e82ef556..3c259aaba956 100644
--- a/openedx/core/djangoapps/content_libraries/tasks.py
+++ b/openedx/core/djangoapps/content_libraries/tasks.py
@@ -28,10 +28,8 @@
from opaque_keys.edx.keys import UsageKey
from opaque_keys.edx.locator import (
BlockUsageLocator,
- LibraryUsageLocator,
LibraryUsageLocatorV2
)
-from search.search_engine_base import SearchEngine
from user_tasks.tasks import UserTask, UserTaskStatus
from xblock.fields import Scope
@@ -80,11 +78,6 @@ def on_progress(block_key, block_num, block_count, exception=None):
)
-def _normalize_key_for_search(library_key):
- """ Normalizes library key for use with search indexing """
- return library_key.replace(version_guid=None, branch=None)
-
-
def _import_block(store, user_id, source_block, dest_parent_key):
"""
Recursively import a blockstore block and its children.`
@@ -168,21 +161,7 @@ def _filter_child(store, usage_key, capa_type):
def _problem_type_filter(store, library, capa_type):
""" Filters library children by capa type."""
- try:
- search_engine = SearchEngine.get_search_engine(index="library_index")
- except: # pylint: disable=bare-except
- search_engine = None
- if search_engine:
- filter_clause = {
- "library": str(_normalize_key_for_search(library.location.library_key)),
- "content_type": ProblemBlock.INDEX_CONTENT_TYPE,
- "problem_types": capa_type
- }
- search_result = search_engine.search(field_dictionary=filter_clause)
- results = search_result.get('results', [])
- return [LibraryUsageLocator.from_string(item['data']['id']) for item in results]
- else:
- return [key for key in library.children if _filter_child(store, key, capa_type)]
+ return [key for key in library.children if _filter_child(store, key, capa_type)]
def _import_from_blockstore(user_id, store, dest_block, blockstore_block_ids):
diff --git a/openedx/core/djangoapps/content_libraries/tests/base.py b/openedx/core/djangoapps/content_libraries/tests/base.py
index dbf76142a784..63b93509a3cb 100644
--- a/openedx/core/djangoapps/content_libraries/tests/base.py
+++ b/openedx/core/djangoapps/content_libraries/tests/base.py
@@ -4,24 +4,17 @@
from contextlib import contextmanager
from io import BytesIO
from urllib.parse import urlencode
-from unittest import mock
-from django.conf import settings
from django.test import LiveServerTestCase
-from django.test.utils import override_settings
from organizations.models import Organization
from rest_framework.test import APITestCase, APIClient
-from search.search_engine_base import SearchEngine
from common.djangoapps.student.tests.factories import UserFactory
-from openedx.core.djangoapps.content_libraries.libraries_index import MAX_SIZE
from openedx.core.djangoapps.content_libraries.constants import COMPLEX, ALL_RIGHTS_RESERVED
from openedx.core.djangolib.testing.utils import skip_unless_cms
from openedx.core.lib import blockstore_api
from openedx.core.lib.blockstore_api.tests.base import (
BlockstoreAppTestMixin,
- requires_blockstore,
- requires_blockstore_app,
)
# Define the URLs here - don't use reverse() because we want to detect
@@ -53,45 +46,6 @@
URL_BLOCK_XBLOCK_HANDLER = '/api/xblock/v2/xblocks/{block_key}/handler/{user_id}-{secure_token}/{handler_name}/'
-def elasticsearch_test(func):
- """
- Decorator for tests which connect to elasticsearch when needed
- """
- # This is disabled by default. Set to True if the elasticsearch engine is needed to test parts of code.
- if settings.ENABLE_ELASTICSEARCH_FOR_TESTS:
- func = override_settings(SEARCH_ENGINE="search.elastic.ElasticSearchEngine")(func)
- func = override_settings(ELASTIC_SEARCH_CONFIG=[{
- 'use_ssl': settings.TEST_ELASTICSEARCH_USE_SSL,
- 'host': settings.TEST_ELASTICSEARCH_HOST,
- 'port': settings.TEST_ELASTICSEARCH_PORT,
- }])(func)
- func = mock.patch(
- "openedx.core.djangoapps.content_libraries.libraries_index.SearchIndexerBase.SEARCH_KWARGS",
- new={
- 'refresh': 'wait_for'
- })(func)
- return func
- else:
- @classmethod
- def mock_perform(cls, filter_terms, text_search):
- # pylint: disable=no-member
- return SearchEngine.get_search_engine(cls.INDEX_NAME).search(
- field_dictionary=filter_terms,
- query_string=text_search,
- size=MAX_SIZE
- )
-
- func = mock.patch(
- "openedx.core.djangoapps.content_libraries.libraries_index.SearchIndexerBase.SEARCH_KWARGS",
- new={}
- )(func)
- func = mock.patch(
- "openedx.core.djangoapps.content_libraries.libraries_index.SearchIndexerBase._perform_elastic_search",
- new=mock_perform
- )(func)
- return func
-
-
@skip_unless_cms # Content Libraries REST API is only available in Studio
class _ContentLibrariesRestApiTestMixin:
"""
@@ -355,15 +309,6 @@ def _get_block_handler_url(self, block_key, handler_name):
return self._api('get', url, None, expect_response=200)["handler_url"]
-@requires_blockstore
-class ContentLibrariesRestApiBlockstoreServiceTest(_ContentLibrariesRestApiTestMixin, APITestCase):
- """
- Base class for Blockstore-based Content Libraries test that use the REST API
- and the standalone Blockstore service.
- """
-
-
-@requires_blockstore_app
class ContentLibrariesRestApiTest(
_ContentLibrariesRestApiTestMixin,
BlockstoreAppTestMixin,
diff --git a/openedx/core/djangoapps/content_libraries/tests/test_content_libraries.py b/openedx/core/djangoapps/content_libraries/tests/test_content_libraries.py
index 42d5bccf3442..69ee1755188f 100644
--- a/openedx/core/djangoapps/content_libraries/tests/test_content_libraries.py
+++ b/openedx/core/djangoapps/content_libraries/tests/test_content_libraries.py
@@ -5,10 +5,8 @@
from unittest.mock import Mock, patch
import ddt
-from django.conf import settings
from django.contrib.auth.models import Group
from django.test.client import Client
-from django.test.utils import override_settings
from organizations.models import Organization
from rest_framework.test import APITestCase
@@ -22,11 +20,8 @@
LIBRARY_BLOCK_DELETED,
LIBRARY_BLOCK_UPDATED,
)
-from openedx.core.djangoapps.content_libraries.libraries_index import LibraryBlockIndexer, ContentLibraryIndexer
from openedx.core.djangoapps.content_libraries.tests.base import (
- ContentLibrariesRestApiBlockstoreServiceTest,
ContentLibrariesRestApiTest,
- elasticsearch_test,
URL_BLOCK_METADATA_URL,
URL_BLOCK_RENDER_VIEW,
URL_BLOCK_GET_HANDLER_URL,
@@ -62,13 +57,6 @@ class ContentLibrariesTestMixin:
library slug and bundle UUID does not because it's assumed to be immutable
and cached forever.
"""
-
- def setUp(self):
- super().setUp()
- if settings.ENABLE_ELASTICSEARCH_FOR_TESTS:
- ContentLibraryIndexer.remove_all_items()
- LibraryBlockIndexer.remove_all_items()
-
def test_library_crud(self):
"""
Test Create, Read, Update, and Delete of a Content Library
@@ -211,89 +199,83 @@ def test_library_validation(self):
'slug': ['Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or hyphens.'],
}
- @ddt.data(True, False)
@patch("openedx.core.djangoapps.content_libraries.views.LibraryApiPagination.page_size", new=2)
- def test_list_library(self, is_indexing_enabled):
+ def test_list_library(self):
"""
Test the /libraries API and its pagination
"""
- with override_settings(FEATURES={**settings.FEATURES, 'ENABLE_CONTENT_LIBRARY_INDEX': is_indexing_enabled}):
- lib1 = self._create_library(slug="some-slug-1", title="Existing Library")
- lib2 = self._create_library(slug="some-slug-2", title="Existing Library")
- if not is_indexing_enabled:
- lib1['num_blocks'] = lib2['num_blocks'] = None
- lib1['last_published'] = lib2['last_published'] = None
- lib1['has_unpublished_changes'] = lib2['has_unpublished_changes'] = None
- lib1['has_unpublished_deletes'] = lib2['has_unpublished_deletes'] = None
-
- result = self._list_libraries()
- assert len(result) == 2
- assert lib1 in result
- assert lib2 in result
- result = self._list_libraries({'pagination': 'true'})
- assert len(result['results']) == 2
- assert result['next'] is None
-
- # Create another library which causes number of libraries to exceed the page size
- self._create_library(slug="some-slug-3", title="Existing Library")
- # Verify that if `pagination` param isn't sent, API still honors the max page size.
- # This is for maintaining compatibility with older non pagination-aware clients.
- result = self._list_libraries()
- assert len(result) == 2
-
- # Pagination enabled:
- # Verify total elements and valid 'next' in page 1
- result = self._list_libraries({'pagination': 'true'})
- assert len(result['results']) == 2
- assert 'page=2' in result['next']
- assert 'pagination=true' in result['next']
- # Verify total elements and null 'next' in page 2
- result = self._list_libraries({'pagination': 'true', 'page': '2'})
- assert len(result['results']) == 1
- assert result['next'] is None
-
- @ddt.data(True, False)
- def test_library_filters(self, is_indexing_enabled):
+ lib1 = self._create_library(slug="some-slug-1", title="Existing Library")
+ lib2 = self._create_library(slug="some-slug-2", title="Existing Library")
+ lib1['num_blocks'] = lib2['num_blocks'] = None
+ lib1['last_published'] = lib2['last_published'] = None
+ lib1['has_unpublished_changes'] = lib2['has_unpublished_changes'] = None
+ lib1['has_unpublished_deletes'] = lib2['has_unpublished_deletes'] = None
+
+ result = self._list_libraries()
+ assert len(result) == 2
+ assert lib1 in result
+ assert lib2 in result
+ result = self._list_libraries({'pagination': 'true'})
+ assert len(result['results']) == 2
+ assert result['next'] is None
+
+ # Create another library which causes number of libraries to exceed the page size
+ self._create_library(slug="some-slug-3", title="Existing Library")
+ # Verify that if `pagination` param isn't sent, API still honors the max page size.
+ # This is for maintaining compatibility with older non pagination-aware clients.
+ result = self._list_libraries()
+ assert len(result) == 2
+
+ # Pagination enabled:
+ # Verify total elements and valid 'next' in page 1
+ result = self._list_libraries({'pagination': 'true'})
+ assert len(result['results']) == 2
+ assert 'page=2' in result['next']
+ assert 'pagination=true' in result['next']
+ # Verify total elements and null 'next' in page 2
+ result = self._list_libraries({'pagination': 'true', 'page': '2'})
+ assert len(result['results']) == 1
+ assert result['next'] is None
+
+ def test_library_filters(self):
"""
Test the filters in the list libraries API
"""
- suffix = str(is_indexing_enabled)
- with override_settings(FEATURES={**settings.FEATURES, 'ENABLE_CONTENT_LIBRARY_INDEX': is_indexing_enabled}):
- self._create_library(
- slug=f"test-lib-filter-{suffix}-1", title="Fob", description=f"Bar-{suffix}", library_type=VIDEO,
- )
- self._create_library(
- slug=f"test-lib-filter-{suffix}-2", title=f"Library-Title-{suffix}-2", description=f"Bar-{suffix}-2",
- )
- self._create_library(
- slug=f"l3{suffix}", title=f"Library-Title-{suffix}-3", description="Description", library_type=VIDEO,
- )
+ self._create_library(
+ slug="test-lib-filter-1", title="Fob", description="Bar", library_type=VIDEO,
+ )
+ self._create_library(
+ slug="test-lib-filter-2", title="Library-Title-2", description="Bar-2",
+ )
+ self._create_library(
+ slug="l3", title="Library-Title-3", description="Description", library_type=VIDEO,
+ )
- Organization.objects.get_or_create(
- short_name=f"org-test-{suffix}",
- defaults={"name": "Content Libraries Tachyon Exploration & Survey Team"},
- )
- self._create_library(
- slug=f"l4-{suffix}", title=f"Library-Title-{suffix}-4",
- description="Library-Description", org=f'org-test-{suffix}',
- library_type=VIDEO,
- )
- self._create_library(
- slug="l5", title=f"Library-Title-{suffix}-5", description="Library-Description",
- org=f'org-test-{suffix}',
- )
+ Organization.objects.get_or_create(
+ short_name="org-test",
+ defaults={"name": "Content Libraries Tachyon Exploration & Survey Team"},
+ )
+ self._create_library(
+ slug="l4", title="Library-Title-4",
+ description="Library-Description", org='org-test',
+ library_type=VIDEO,
+ )
+ self._create_library(
+ slug="l5", title="Library-Title-5", description="Library-Description",
+ org='org-test',
+ )
- assert len(self._list_libraries()) == 5
- assert len(self._list_libraries({'org': f'org-test-{suffix}'})) == 2
- assert len(self._list_libraries({'text_search': f'test-lib-filter-{suffix}'})) == 2
- assert len(self._list_libraries({'text_search': f'test-lib-filter-{suffix}', 'type': VIDEO})) == 1
- assert len(self._list_libraries({'text_search': f'library-title-{suffix}'})) == 4
- assert len(self._list_libraries({'text_search': f'library-title-{suffix}', 'type': VIDEO})) == 2
- assert len(self._list_libraries({'text_search': f'bar-{suffix}'})) == 2
- assert len(self._list_libraries({'text_search': f'org-test-{suffix}'})) == 2
- assert len(self._list_libraries({'org': f'org-test-{suffix}',
- 'text_search': f'library-title-{suffix}-4'})) == 1
- assert len(self._list_libraries({'type': VIDEO})) == 3
+ assert len(self._list_libraries()) == 5
+ assert len(self._list_libraries({'org': 'org-test'})) == 2
+ assert len(self._list_libraries({'text_search': 'test-lib-filter'})) == 2
+ assert len(self._list_libraries({'text_search': 'test-lib-filter', 'type': VIDEO})) == 1
+ assert len(self._list_libraries({'text_search': 'library-title'})) == 4
+ assert len(self._list_libraries({'text_search': 'library-title', 'type': VIDEO})) == 2
+ assert len(self._list_libraries({'text_search': 'bar'})) == 2
+ assert len(self._list_libraries({'text_search': 'org-test'})) == 2
+ assert len(self._list_libraries({'org': 'org-test',
+ 'text_search': 'library-title-4'})) == 1
+ assert len(self._list_libraries({'type': VIDEO})) == 3
# General Content Library XBlock tests:
@@ -440,65 +422,61 @@ def test_library_blocks_studio_view(self):
assert 'resources' in fragment
assert 'Hello world!' in fragment['content']
- @ddt.data(True, False)
@patch("openedx.core.djangoapps.content_libraries.views.LibraryApiPagination.page_size", new=2)
- def test_list_library_blocks(self, is_indexing_enabled):
+ def test_list_library_blocks(self):
"""
Test the /libraries/{lib_key_str}/blocks API and its pagination
"""
- with override_settings(FEATURES={**settings.FEATURES, 'ENABLE_CONTENT_LIBRARY_INDEX': is_indexing_enabled}):
- lib = self._create_library(slug="list_blocks-slug" + str(is_indexing_enabled), title="Library 1")
- block1 = self._add_block_to_library(lib["id"], "problem", "problem1")
- block2 = self._add_block_to_library(lib["id"], "unit", "unit1")
-
- self._add_block_to_library(lib["id"], "problem", "problem2", parent_block=block2["id"])
-
- result = self._get_library_blocks(lib["id"])
- assert len(result) == 2
- assert block1 in result
-
- result = self._get_library_blocks(lib["id"], {'pagination': 'true'})
- assert len(result['results']) == 2
- assert result['next'] is None
-
- self._add_block_to_library(lib["id"], "problem", "problem3")
- # Test pagination
- result = self._get_library_blocks(lib["id"])
- assert len(result) == 3
- result = self._get_library_blocks(lib["id"], {'pagination': 'true'})
- assert len(result['results']) == 2
- assert 'page=2' in result['next']
- assert 'pagination=true' in result['next']
- result = self._get_library_blocks(lib["id"], {'pagination': 'true', 'page': '2'})
- assert len(result['results']) == 1
- assert result['next'] is None
-
- @ddt.data(True, False)
- def test_library_blocks_filters(self, is_indexing_enabled):
+ lib = self._create_library(slug="list_blocks-slug", title="Library 1")
+ block1 = self._add_block_to_library(lib["id"], "problem", "problem1")
+ block2 = self._add_block_to_library(lib["id"], "unit", "unit1")
+
+ self._add_block_to_library(lib["id"], "problem", "problem2", parent_block=block2["id"])
+
+ result = self._get_library_blocks(lib["id"])
+ assert len(result) == 2
+ assert block1 in result
+
+ result = self._get_library_blocks(lib["id"], {'pagination': 'true'})
+ assert len(result['results']) == 2
+ assert result['next'] is None
+
+ self._add_block_to_library(lib["id"], "problem", "problem3")
+ # Test pagination
+ result = self._get_library_blocks(lib["id"])
+ assert len(result) == 3
+ result = self._get_library_blocks(lib["id"], {'pagination': 'true'})
+ assert len(result['results']) == 2
+ assert 'page=2' in result['next']
+ assert 'pagination=true' in result['next']
+ result = self._get_library_blocks(lib["id"], {'pagination': 'true', 'page': '2'})
+ assert len(result['results']) == 1
+ assert result['next'] is None
+
+ def test_library_blocks_filters(self):
"""
Test the filters in the list libraries API
"""
- with override_settings(FEATURES={**settings.FEATURES, 'ENABLE_CONTENT_LIBRARY_INDEX': is_indexing_enabled}):
- lib = self._create_library(slug="test-lib-blocks" + str(is_indexing_enabled), title="Title")
- block1 = self._add_block_to_library(lib["id"], "problem", "foo-bar")
- self._add_block_to_library(lib["id"], "video", "vid-baz")
- self._add_block_to_library(lib["id"], "html", "html-baz")
- self._add_block_to_library(lib["id"], "problem", "foo-baz")
- self._add_block_to_library(lib["id"], "problem", "bar-baz")
-
- self._set_library_block_olx(block1["id"], "")
-
- assert len(self._get_library_blocks(lib['id'])) == 5
- assert len(self._get_library_blocks(lib['id'], {'text_search': 'Foo'})) == 2
- assert len(self._get_library_blocks(lib['id'], {'text_search': 'Display'})) == 1
- assert len(self._get_library_blocks(lib['id'], {'text_search': 'Video'})) == 1
- assert len(self._get_library_blocks(lib['id'], {'text_search': 'Foo', 'block_type': 'video'})) == 0
- assert len(self._get_library_blocks(lib['id'], {'text_search': 'Baz', 'block_type': 'video'})) == 1
- assert len(self._get_library_blocks(lib['id'], {'text_search': 'Baz', 'block_type': ['video', 'html']})) ==\
- 2
- assert len(self._get_library_blocks(lib['id'], {'block_type': 'video'})) == 1
- assert len(self._get_library_blocks(lib['id'], {'block_type': 'problem'})) == 3
- assert len(self._get_library_blocks(lib['id'], {'block_type': 'squirrel'})) == 0
+ lib = self._create_library(slug="test-lib-blocks", title="Title")
+ block1 = self._add_block_to_library(lib["id"], "problem", "foo-bar")
+ self._add_block_to_library(lib["id"], "video", "vid-baz")
+ self._add_block_to_library(lib["id"], "html", "html-baz")
+ self._add_block_to_library(lib["id"], "problem", "foo-baz")
+ self._add_block_to_library(lib["id"], "problem", "bar-baz")
+
+ self._set_library_block_olx(block1["id"], "")
+
+ assert len(self._get_library_blocks(lib['id'])) == 5
+ assert len(self._get_library_blocks(lib['id'], {'text_search': 'Foo'})) == 2
+ assert len(self._get_library_blocks(lib['id'], {'text_search': 'Display'})) == 1
+ assert len(self._get_library_blocks(lib['id'], {'text_search': 'Video'})) == 1
+ assert len(self._get_library_blocks(lib['id'], {'text_search': 'Foo', 'block_type': 'video'})) == 0
+ assert len(self._get_library_blocks(lib['id'], {'text_search': 'Baz', 'block_type': 'video'})) == 1
+ assert len(self._get_library_blocks(lib['id'], {'text_search': 'Baz', 'block_type': ['video', 'html']})) ==\
+ 2
+ assert len(self._get_library_blocks(lib['id'], {'block_type': 'video'})) == 1
+ assert len(self._get_library_blocks(lib['id'], {'block_type': 'problem'})) == 3
+ assert len(self._get_library_blocks(lib['id'], {'block_type': 'squirrel'})) == 0
@ddt.data(
('video-problem', VIDEO, 'problem', 400),
@@ -1232,17 +1210,6 @@ def test_library_block_delete_event(self):
)
-@elasticsearch_test
-class ContentLibrariesBlockstoreServiceTest(
- ContentLibrariesTestMixin,
- ContentLibrariesRestApiBlockstoreServiceTest,
-):
- """
- General tests for Blockstore-based Content Libraries, using the standalone Blockstore service.
- """
-
-
-@elasticsearch_test
class ContentLibrariesTest(
ContentLibrariesTestMixin,
ContentLibrariesRestApiTest,
diff --git a/openedx/core/djangoapps/content_libraries/tests/test_libraries_index.py b/openedx/core/djangoapps/content_libraries/tests/test_libraries_index.py
deleted file mode 100644
index 0e46680351af..000000000000
--- a/openedx/core/djangoapps/content_libraries/tests/test_libraries_index.py
+++ /dev/null
@@ -1,325 +0,0 @@
-"""
-Testing indexing of blockstore based content libraries
-"""
-from unittest.mock import patch
-
-from django.conf import settings
-from django.core.management import call_command
-from django.test.utils import override_settings
-from opaque_keys.edx.locator import LibraryLocatorV2, LibraryUsageLocatorV2
-from search.search_engine_base import SearchEngine
-
-from openedx.core.djangoapps.content_libraries.libraries_index import ContentLibraryIndexer, LibraryBlockIndexer
-from openedx.core.djangoapps.content_libraries.tests.base import (
- ContentLibrariesRestApiBlockstoreServiceTest,
- ContentLibrariesRestApiTest,
- elasticsearch_test,
-)
-
-
-class ContentLibraryIndexerTestMixin:
- """
- Tests the operation of ContentLibraryIndexer
- """
-
- @elasticsearch_test
- def setUp(self):
- super().setUp()
- ContentLibraryIndexer.remove_all_items()
- LibraryBlockIndexer.remove_all_items()
- self.searcher = SearchEngine.get_search_engine(ContentLibraryIndexer.INDEX_NAME)
-
- def test_index_libraries(self):
- """
- Test if libraries are being indexed correctly
- """
- result1 = self._create_library(slug="test-lib-index-1", title="Title 1", description="Description")
- result2 = self._create_library(slug="test-lib-index-2", title="Title 2", description="Description")
-
- for result in [result1, result2]:
- library_key = LibraryLocatorV2.from_string(result['id'])
- response = ContentLibraryIndexer.get_items([library_key])[0]
-
- assert response['id'] == result['id']
- assert response['title'] == result['title']
- assert response['description'] == result['description']
- assert response['uuid'] == result['bundle_uuid']
- assert response['num_blocks'] == 0
- assert response['version'] == result['version']
- assert response['last_published'] is None
- assert response['has_unpublished_changes'] is False
- assert response['has_unpublished_deletes'] is False
-
- def test_schema_updates(self):
- """
- Test that outdated indexes aren't retrieved
- """
- with patch("openedx.core.djangoapps.content_libraries.libraries_index.ContentLibraryIndexer.SCHEMA_VERSION",
- new=0):
- result = self._create_library(slug="test-lib-schemaupdates-1", title="Title 1", description="Description")
- library_key = LibraryLocatorV2.from_string(result['id'])
- assert len(ContentLibraryIndexer.get_items([library_key])) == 1
-
- with patch("openedx.core.djangoapps.content_libraries.libraries_index.ContentLibraryIndexer.SCHEMA_VERSION",
- new=1):
- assert len(ContentLibraryIndexer.get_items([library_key])) == 0
-
- call_command("reindex_content_library", all=True, force=True)
-
- assert len(ContentLibraryIndexer.get_items([library_key])) == 1
-
- def test_remove_all_libraries(self):
- """
- Test if remove_all_items() deletes all libraries
- """
- lib1 = self._create_library(slug="test-lib-rm-all-1", title="Title 1", description="Description")
- lib2 = self._create_library(slug="test-lib-rm-all-2", title="Title 2", description="Description")
- library_key1 = LibraryLocatorV2.from_string(lib1['id'])
- library_key2 = LibraryLocatorV2.from_string(lib2['id'])
-
- assert len(ContentLibraryIndexer.get_items([library_key1, library_key2])) == 2
-
- ContentLibraryIndexer.remove_all_items()
- assert len(ContentLibraryIndexer.get_items()) == 0
-
- def test_update_libraries(self):
- """
- Test if indexes are updated when libraries are updated
- """
- lib = self._create_library(slug="test-lib-update", title="Title", description="Description")
- library_key = LibraryLocatorV2.from_string(lib['id'])
-
- self._update_library(lib['id'], title="New Title", description="New Title")
-
- response = ContentLibraryIndexer.get_items([library_key])[0]
-
- assert response['id'] == lib['id']
- assert response['title'] == 'New Title'
- assert response['description'] == 'New Title'
- assert response['uuid'] == lib['bundle_uuid']
- assert response['num_blocks'] == 0
- assert response['version'] == lib['version']
- assert response['last_published'] is None
- assert response['has_unpublished_changes'] is False
- assert response['has_unpublished_deletes'] is False
-
- self._delete_library(lib['id'])
- assert ContentLibraryIndexer.get_items([library_key]) == []
- ContentLibraryIndexer.get_items([library_key])
-
- def test_update_library_blocks(self):
- """
- Test if indexes are updated when blocks in libraries are updated
- """
- def commit_library_and_verify(library_key):
- """
- Commit library changes, and verify that there are no uncommited changes anymore
- """
- last_published = ContentLibraryIndexer.get_items([library_key])[0]['last_published']
- self._commit_library_changes(str(library_key))
- response = ContentLibraryIndexer.get_items([library_key])[0]
- assert response['has_unpublished_changes'] is False
- assert response['has_unpublished_deletes'] is False
- assert response['last_published'] >= last_published
- return response
-
- def verify_uncommitted_libraries(library_key, has_unpublished_changes, has_unpublished_deletes):
- """
- Verify uncommitted changes and deletes in the index
- """
- response = ContentLibraryIndexer.get_items([library_key])[0]
- assert response['has_unpublished_changes'] == has_unpublished_changes
- assert response['has_unpublished_deletes'] == has_unpublished_deletes
- return response
-
- lib = self._create_library(slug="test-lib-update-block", title="Title", description="Description")
- library_key = LibraryLocatorV2.from_string(lib['id'])
-
- # Verify uncommitted new blocks
- block = self._add_block_to_library(lib['id'], "problem", "problem1")
- response = verify_uncommitted_libraries(library_key, True, False)
- assert response['last_published'] is None
- assert response['num_blocks'] == 1
- # Verify committed new blocks
- self._commit_library_changes(lib['id'])
- response = verify_uncommitted_libraries(library_key, False, False)
- assert response['num_blocks'] == 1
- # Verify uncommitted deleted blocks
- self._delete_library_block(block['id'])
- response = verify_uncommitted_libraries(library_key, True, True)
- assert response['num_blocks'] == 0
- # Verify committed deleted blocks
- self._commit_library_changes(lib['id'])
- response = verify_uncommitted_libraries(library_key, False, False)
- assert response['num_blocks'] == 0
-
- block = self._add_block_to_library(lib['id'], "problem", "problem1")
- self._commit_library_changes(lib['id'])
-
- # Verify changes to blocks
- # Verify OLX updates on blocks
- self._set_library_block_olx(block["id"], "")
- verify_uncommitted_libraries(library_key, True, False)
- commit_library_and_verify(library_key)
- # Verify asset updates on blocks
- self._set_library_block_asset(block["id"], "whatever.png", b"data")
- verify_uncommitted_libraries(library_key, True, False)
- commit_library_and_verify(library_key)
- self._delete_library_block_asset(block["id"], "whatever.png")
- verify_uncommitted_libraries(library_key, True, False)
- commit_library_and_verify(library_key)
-
- lib2 = self._create_library(slug="test-lib-update-block-2", title="Title 2", description="Description")
- self._add_block_to_library(lib2["id"], "problem", "problem1")
- self._commit_library_changes(lib2["id"])
-
- #Verify new links on libraries
- self._link_to_library(lib["id"], "library_2", lib2["id"])
- verify_uncommitted_libraries(library_key, True, False)
- #Verify reverting uncommitted changes
- self._revert_library_changes(lib["id"])
- verify_uncommitted_libraries(library_key, False, False)
-
-
-@override_settings(FEATURES={**settings.FEATURES, 'ENABLE_CONTENT_LIBRARY_INDEX': True})
-@elasticsearch_test
-class ContentLibraryIndexerBlockstoreServiceTest(
- ContentLibraryIndexerTestMixin,
- ContentLibrariesRestApiBlockstoreServiceTest,
-):
- """
- Tests the operation of ContentLibraryIndexer using the standalone Blockstore service.
- """
-
-
-@override_settings(FEATURES={**settings.FEATURES, 'ENABLE_CONTENT_LIBRARY_INDEX': True})
-@elasticsearch_test
-class ContentLibraryIndexerTest(
- ContentLibraryIndexerTestMixin,
- ContentLibrariesRestApiTest,
-):
- """
- Tests the operation of ContentLibraryIndexer using the installed Blockstore app.
- """
-
-
-class LibraryBlockIndexerTestMixin:
- """
- Tests the operation of LibraryBlockIndexer
- """
-
- @elasticsearch_test
- def setUp(self):
- super().setUp()
- ContentLibraryIndexer.remove_all_items()
- LibraryBlockIndexer.remove_all_items()
- self.searcher = SearchEngine.get_search_engine(LibraryBlockIndexer.INDEX_NAME)
-
- def test_index_block(self):
- """
- Test if libraries are being indexed correctly
- """
- lib = self._create_library(slug="test-lib-index-1", title="Title 1", description="Description")
- block1 = self._add_block_to_library(lib['id'], "problem", "problem1")
- block2 = self._add_block_to_library(lib['id'], "problem", "problem2")
-
- assert len(LibraryBlockIndexer.get_items()) == 2
-
- for block in [block1, block2]:
- usage_key = LibraryUsageLocatorV2.from_string(block['id'])
- response = LibraryBlockIndexer.get_items([usage_key])[0]
-
- assert response['id'] == block['id']
- assert response['def_key'] == block['def_key']
- assert response['block_type'] == block['block_type']
- assert response['display_name'] == block['display_name']
- assert response['has_unpublished_changes'] == block['has_unpublished_changes']
-
- def test_schema_updates(self):
- """
- Test that outdated indexes aren't retrieved
- """
- lib = self._create_library(slug="test-lib--block-schemaupdates-1", title="Title 1", description="Description")
- with patch("openedx.core.djangoapps.content_libraries.libraries_index.LibraryBlockIndexer.SCHEMA_VERSION",
- new=0):
- block = self._add_block_to_library(lib['id'], "problem", "problem1")
- assert len(LibraryBlockIndexer.get_items([block['id']])) == 1
-
- with patch("openedx.core.djangoapps.content_libraries.libraries_index.LibraryBlockIndexer.SCHEMA_VERSION",
- new=1):
- assert len(LibraryBlockIndexer.get_items([block['id']])) == 0
-
- call_command("reindex_content_library", all=True, force=True)
-
- assert len(LibraryBlockIndexer.get_items([block['id']])) == 1
-
- def test_remove_all_items(self):
- """
- Test if remove_all_items() deletes all libraries
- """
- lib1 = self._create_library(slug="test-lib-rm-all", title="Title 1", description="Description")
- self._add_block_to_library(lib1['id'], "problem", "problem1")
- self._add_block_to_library(lib1['id'], "problem", "problem2")
- assert len(LibraryBlockIndexer.get_items()) == 2
-
- LibraryBlockIndexer.remove_all_items()
- assert len(LibraryBlockIndexer.get_items()) == 0
-
- def test_crud_block(self):
- """
- Test that CRUD operations on blocks are reflected in the index
- """
- lib = self._create_library(slug="test-lib-crud-block", title="Title", description="Description")
- block = self._add_block_to_library(lib['id'], "problem", "problem1")
-
- # Update OLX, verify updates in index
- self._set_library_block_olx(block["id"], '')
- response = LibraryBlockIndexer.get_items([block['id']])[0]
- assert response['display_name'] == 'new_name'
- assert response['has_unpublished_changes'] is True
-
- # Verify has_unpublished_changes after committing library
- self._commit_library_changes(lib['id'])
- response = LibraryBlockIndexer.get_items([block['id']])[0]
- assert response['has_unpublished_changes'] is False
-
- # Verify has_unpublished_changes after reverting library
- self._set_library_block_asset(block["id"], "whatever.png", b"data")
- response = LibraryBlockIndexer.get_items([block['id']])[0]
- assert response['has_unpublished_changes'] is True
-
- self._revert_library_changes(lib['id'])
- response = LibraryBlockIndexer.get_items([block['id']])[0]
- assert response['has_unpublished_changes'] is False
-
- # Verify that deleting block removes it from index
- self._delete_library_block(block['id'])
- assert LibraryBlockIndexer.get_items([block['id']]) == []
-
- # Verify that deleting a library removes its blocks from index too
- self._add_block_to_library(lib['id'], "problem", "problem1")
- LibraryBlockIndexer.get_items([block['id']])
- self._delete_library(lib['id'])
- assert LibraryBlockIndexer.get_items([block['id']]) == []
-
-
-@override_settings(FEATURES={**settings.FEATURES, 'ENABLE_CONTENT_LIBRARY_INDEX': True})
-@elasticsearch_test
-class LibraryBlockIndexerBlockstoreServiceTest(
- LibraryBlockIndexerTestMixin,
- ContentLibrariesRestApiBlockstoreServiceTest,
-):
- """
- Tests the operation of LibraryBlockIndexer using the standalone Blockstore service.
- """
-
-
-@override_settings(FEATURES={**settings.FEATURES, 'ENABLE_CONTENT_LIBRARY_INDEX': True})
-@elasticsearch_test
-class LibraryBlockIndexerTest(
- LibraryBlockIndexerTestMixin,
- ContentLibrariesRestApiTest,
-):
- """
- Tests the operation of LibraryBlockIndexer using the installed Blockstore app.
- """
diff --git a/openedx/core/djangoapps/content_libraries/tests/test_runtime.py b/openedx/core/djangoapps/content_libraries/tests/test_runtime.py
index f166cee546ca..430306d936e2 100644
--- a/openedx/core/djangoapps/content_libraries/tests/test_runtime.py
+++ b/openedx/core/djangoapps/content_libraries/tests/test_runtime.py
@@ -6,7 +6,7 @@
from completion.test_utils import CompletionWaffleTestMixin
from django.db import connections, transaction
-from django.test import LiveServerTestCase, TestCase
+from django.test import LiveServerTestCase
from django.utils.text import slugify
from organizations.models import Organization
from rest_framework.test import APIClient
@@ -16,8 +16,6 @@
from openedx.core.djangoapps.content_libraries import api as library_api
from openedx.core.djangoapps.content_libraries.tests.base import (
BlockstoreAppTestMixin,
- requires_blockstore,
- requires_blockstore_app,
URL_BLOCK_RENDER_VIEW,
URL_BLOCK_GET_HANDLER_URL,
URL_BLOCK_METADATA_URL,
@@ -224,14 +222,6 @@ def test_xblock_fields(self):
assert xblock_api.get_block_display_name(block_saved) == 'New Display Name'
-@requires_blockstore
-class ContentLibraryRuntimeBServiceTest(ContentLibraryRuntimeTestMixin, TestCase):
- """
- Tests XBlock runtime using XBlocks in a content library using the standalone Blockstore service.
- """
-
-
-@requires_blockstore_app
class ContentLibraryRuntimeTest(ContentLibraryRuntimeTestMixin, BlockstoreAppTestMixin, LiveServerTestCase):
"""
Tests XBlock runtime using XBlocks in a content library using the installed Blockstore app.
@@ -545,14 +535,6 @@ def test_i18n(self):
assert 'Submit' not in dummy_public_view.data['content']
-@requires_blockstore
-class ContentLibraryXBlockUserStateBServiceTest(ContentLibraryXBlockUserStateTestMixin, TestCase): # type: ignore[misc]
- """
- Tests XBlock user state for XBlocks in a content library using the standalone Blockstore service.
- """
-
-
-@requires_blockstore_app
class ContentLibraryXBlockUserStateTest( # type: ignore[misc]
ContentLibraryXBlockUserStateTestMixin,
BlockstoreAppTestMixin,
@@ -619,19 +601,6 @@ def get_block_completion_status():
assert get_block_completion_status() == 1
-@requires_blockstore
-class ContentLibraryXBlockCompletionBServiceTest(
- ContentLibraryXBlockCompletionTestMixin,
- CompletionWaffleTestMixin,
- TestCase,
-):
- """
- Test that the Blockstore-based XBlocks can track their completion status
- using the standalone Blockstore service.
- """
-
-
-@requires_blockstore_app
class ContentLibraryXBlockCompletionTest(
ContentLibraryXBlockCompletionTestMixin,
CompletionWaffleTestMixin,
diff --git a/openedx/core/djangoapps/content_libraries/tests/test_static_assets.py b/openedx/core/djangoapps/content_libraries/tests/test_static_assets.py
index 7004860f9d4c..e330101eb3bc 100644
--- a/openedx/core/djangoapps/content_libraries/tests/test_static_assets.py
+++ b/openedx/core/djangoapps/content_libraries/tests/test_static_assets.py
@@ -3,7 +3,6 @@
"""
from openedx.core.djangoapps.content_libraries.tests.base import (
- ContentLibrariesRestApiBlockstoreServiceTest,
ContentLibrariesRestApiTest,
)
@@ -109,15 +108,6 @@ def check_download():
check_download()
-class ContentLibrariesStaticAssetsBlockstoreServiceTest(
- ContentLibrariesStaticAssetsTestMixin,
- ContentLibrariesRestApiBlockstoreServiceTest,
-):
- """
- Tests for static asset files in Blockstore-based Content Libraries, using the standalone Blockstore service.
- """
-
-
class ContentLibrariesStaticAssetsTest(
ContentLibrariesStaticAssetsTestMixin,
ContentLibrariesRestApiTest,
diff --git a/openedx/core/djangoapps/content_libraries/tests/test_views_lti.py b/openedx/core/djangoapps/content_libraries/tests/test_views_lti.py
index 58dd7e9b214a..cb306ebbfe48 100644
--- a/openedx/core/djangoapps/content_libraries/tests/test_views_lti.py
+++ b/openedx/core/djangoapps/content_libraries/tests/test_views_lti.py
@@ -8,7 +8,6 @@
from openedx.core.djangoapps.content_libraries.constants import PROBLEM
from .base import (
- ContentLibrariesRestApiBlockstoreServiceTest,
ContentLibrariesRestApiTest,
URL_LIB_LTI_JWKS,
skip_unless_cms,
@@ -81,17 +80,6 @@ def test_block_not_found(self):
self._api("get", '/api/libraries/v2/blocks/lb:CL-TEST:libgg:problem:bad-block/lti/', None, expect_response=404)
-@override_features(ENABLE_CONTENT_LIBRARIES=True,
- ENABLE_CONTENT_LIBRARIES_LTI_TOOL=True)
-class LibraryBlockLtiUrlViewBlockstoreServiceTest(
- LibraryBlockLtiUrlViewTestMixin,
- ContentLibrariesRestApiBlockstoreServiceTest,
-):
- """
- Test generating LTI URL for a block in a library, using the standalone Blockstore service.
- """
-
-
@override_features(ENABLE_CONTENT_LIBRARIES=True,
ENABLE_CONTENT_LIBRARIES_LTI_TOOL=True)
class LibraryBlockLtiUrlViewTest(
diff --git a/openedx/core/djangoapps/content_libraries/views.py b/openedx/core/djangoapps/content_libraries/views.py
index c83a9c4fcb56..bd5f091b136c 100644
--- a/openedx/core/djangoapps/content_libraries/views.py
+++ b/openedx/core/djangoapps/content_libraries/views.py
@@ -172,12 +172,12 @@ def get(self, request):
paginator = LibraryApiPagination()
queryset = api.get_libraries_for_user(request.user, org=org, library_type=library_type)
if text_search:
- result = api.get_metadata_from_index(queryset, text_search=text_search)
+ result = api.get_metadata(queryset, text_search=text_search)
result = paginator.paginate_queryset(result, request)
else:
# We can paginate queryset early and prevent fetching unneeded metadata
paginated_qs = paginator.paginate_queryset(queryset, request)
- result = api.get_metadata_from_index(paginated_qs)
+ result = api.get_metadata(paginated_qs)
serializer = ContentLibraryMetadataSerializer(result, many=True)
# Verify `pagination` param to maintain compatibility with older
diff --git a/openedx/core/djangoapps/content_staging/migrations/0003_olx_unicode.py b/openedx/core/djangoapps/content_staging/migrations/0003_olx_unicode.py
new file mode 100644
index 000000000000..1a1c414bf193
--- /dev/null
+++ b/openedx/core/djangoapps/content_staging/migrations/0003_olx_unicode.py
@@ -0,0 +1,24 @@
+# Generated by Django 3.2.23 on 2023-12-07 20:10
+
+from django.db import migrations
+import openedx_learning.lib.fields
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('content_staging', '0002_stagedcontentfile'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='stagedcontent',
+ name='display_name',
+ field=openedx_learning.lib.fields.MultiCollationCharField(db_collations={'mysql': 'utf8mb4_unicode_ci', 'sqlite': 'NOCASE'}, max_length=768),
+ ),
+ migrations.AlterField(
+ model_name='stagedcontent',
+ name='olx',
+ field=openedx_learning.lib.fields.MultiCollationTextField(db_collations={'mysql': 'utf8mb4_bin', 'sqlite': 'BINARY'}),
+ ),
+ ]
diff --git a/openedx/core/djangoapps/content_staging/models.py b/openedx/core/djangoapps/content_staging/models.py
index c3db6148c68c..59216912924e 100644
--- a/openedx/core/djangoapps/content_staging/models.py
+++ b/openedx/core/djangoapps/content_staging/models.py
@@ -10,6 +10,7 @@
from django.utils.translation import gettext_lazy as _
from opaque_keys.edx.django.models import UsageKeyField
from opaque_keys.edx.keys import LearningContextKey
+from openedx_learning.lib.fields import case_insensitive_char_field, MultiCollationTextField
from openedx.core.djangoapps.content.course_overviews.api import get_course_overview_or_none
@@ -19,6 +20,11 @@
User = get_user_model()
+CASE_SENSITIVE_COLLATIONS = {
+ "sqlite": "BINARY",
+ "mysql": "utf8mb4_bin",
+}
+
class StagedContent(models.Model):
"""
@@ -51,9 +57,9 @@ class Meta:
e.g. "video" if a video is staged, or "vertical" for a unit.
"""),
)
- olx = models.TextField(null=False, blank=False)
+ olx = MultiCollationTextField(null=False, blank=False, db_collations=CASE_SENSITIVE_COLLATIONS)
# The display name of whatever item is staged here, i.e. the root XBlock.
- display_name = models.CharField(max_length=1024)
+ display_name = case_insensitive_char_field(max_length=768)
# A _suggested_ URL name to use for this content. Since this suggestion may already be in use, it's fine to generate
# a new url_name instead.
suggested_url_name = models.CharField(max_length=1024)
diff --git a/openedx/core/djangoapps/external_user_ids/migrations/0007_remove_mbcoaching_extids.py b/openedx/core/djangoapps/external_user_ids/migrations/0007_remove_mbcoaching_extids.py
new file mode 100644
index 000000000000..f9119f55e5bc
--- /dev/null
+++ b/openedx/core/djangoapps/external_user_ids/migrations/0007_remove_mbcoaching_extids.py
@@ -0,0 +1,26 @@
+# Generated by Django 3.2.23 on 2023-12-04 18:48
+"""Deletes instances of deprecated mb_coaching external ID type"""
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+ dependencies = [
+ ("external_user_ids", "0006_auto_20230808_0944"),
+ ]
+
+ mb_coaching_type_name = "mb_coaching"
+
+ def delete_ids(apps, schema_editor):
+ # The
+ ExternalIdType = apps.get_model("external_user_ids", "ExternalIdType")
+ mb_coaching_type_id = ExternalIdType.objects.get(
+ name=Migration.mb_coaching_type_name
+ ).id
+
+ ExternalId = apps.get_model("external_user_ids", "ExternalId")
+ ExternalId.objects.filter(external_id_type=mb_coaching_type_id).delete()
+
+ operations = [
+ migrations.RunPython(delete_ids, reverse_code=migrations.RunPython.noop)
+ ]
diff --git a/openedx/core/djangoapps/external_user_ids/migrations/0008_remove_mbcoaching_extid_type.py b/openedx/core/djangoapps/external_user_ids/migrations/0008_remove_mbcoaching_extid_type.py
new file mode 100644
index 000000000000..f04ae01cbe0d
--- /dev/null
+++ b/openedx/core/djangoapps/external_user_ids/migrations/0008_remove_mbcoaching_extid_type.py
@@ -0,0 +1,33 @@
+# Generated by Django 3.2.23 on 2023-12-05 16:22
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+ dependencies = [
+ ("external_user_ids", "0007_remove_mbcoaching_extids"),
+ ]
+
+ coaching_name = "mb_coaching"
+
+ def create_mb_coaching_type(apps, schema_editor):
+ """
+ Add a MicroBachelors (MB) coaching type
+ """
+ ExternalIdType = apps.get_model("external_user_ids", "ExternalIdType")
+ ExternalIdType.objects.update_or_create(
+ name=Migration.coaching_name, description="MicroBachelors Coaching"
+ )
+
+ def delete_mb_coaching_type(apps, schema_editor):
+ """
+ Delete the MicroBachelors (MB) coaching type
+ """
+ ExternalIdType = apps.get_model("external_user_ids", "ExternalIdType")
+ ExternalIdType.objects.filter(name=Migration.coaching_name).delete()
+
+ operations = [
+ migrations.RunPython(
+ delete_mb_coaching_type, reverse_code=create_mb_coaching_type
+ ),
+ ]
diff --git a/openedx/core/djangoapps/user_authn/views/registration_form.py b/openedx/core/djangoapps/user_authn/views/registration_form.py
index d49e4c439e62..fb0631f0c0c6 100644
--- a/openedx/core/djangoapps/user_authn/views/registration_form.py
+++ b/openedx/core/djangoapps/user_authn/views/registration_form.py
@@ -93,7 +93,7 @@ def contains_url(value):
"""
Validator method to check whether full name contains url
"""
- regex = re.findall(r'https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))*', value)
+ regex = re.findall(r'://', value)
return bool(regex)
diff --git a/openedx/core/djangoapps/video_config/toggles.py b/openedx/core/djangoapps/video_config/toggles.py
index f417537b547e..9569a00edd7d 100644
--- a/openedx/core/djangoapps/video_config/toggles.py
+++ b/openedx/core/djangoapps/video_config/toggles.py
@@ -37,3 +37,10 @@
XPERT_TRANSLATIONS_UI = CourseWaffleFlag(
f'{WAFFLE_FLAG_NAMESPACE}.xpert_translations_ui', __name__
)
+
+
+def use_xpert_translations_component(course_key):
+ """
+ Returns a boolean if xpert translations ui component is enabled
+ """
+ return XPERT_TRANSLATIONS_UI.is_enabled(course_key)
diff --git a/openedx/core/djangoapps/zendesk_proxy/tests/test_utils.py b/openedx/core/djangoapps/zendesk_proxy/tests/test_utils.py
index 9888487a989d..628f8302b464 100644
--- a/openedx/core/djangoapps/zendesk_proxy/tests/test_utils.py
+++ b/openedx/core/djangoapps/zendesk_proxy/tests/test_utils.py
@@ -88,7 +88,6 @@ def test_financial_assistant_ticket(self):
('Username', 'test'),
('Full Name', 'Legal Name'),
('Course ID', 'course_key'),
- ('Annual Household Income', 'Income'),
('Country', 'Country'),
)
),
diff --git a/openedx/core/djangoapps/zendesk_proxy/utils.py b/openedx/core/djangoapps/zendesk_proxy/utils.py
index 9401949dc995..9ddfa2874686 100644
--- a/openedx/core/djangoapps/zendesk_proxy/utils.py
+++ b/openedx/core/djangoapps/zendesk_proxy/utils.py
@@ -41,7 +41,8 @@ def create_zendesk_ticket(
Create a Zendesk ticket via API.
"""
if tags:
- # Remove duplicates from tags list
+ # Remove duplicates from tags list.
+ # Pls note: only use tags for lists and sets, as the below will remove the value of a key/value dictionary.
tags = list(set(tags))
data = {
@@ -60,11 +61,8 @@ def create_zendesk_ticket(
}
}
- # Encode the data to create a JSON payload
- payload = json.dumps(data)
-
if not (settings.ZENDESK_URL and settings.ZENDESK_OAUTH_ACCESS_TOKEN):
- log.error(_std_error_message("zendesk not configured", payload))
+ log.error(_std_error_message("zendesk not configured", data))
return status.HTTP_503_SERVICE_UNAVAILABLE
if group:
@@ -73,9 +71,12 @@ def create_zendesk_ticket(
data['ticket']['group_id'] = group_id
else:
msg = f"Group ID not found for group {group}. Please update ZENDESK_GROUP_ID_MAPPING"
- log.error(_std_error_message(msg, payload))
+ log.error(_std_error_message(msg, data))
return status.HTTP_400_BAD_REQUEST
+ # Encode the data to create a JSON payload
+ payload = json.dumps(data)
+
# Set the request parameters
url = urljoin(settings.ZENDESK_URL, '/api/v2/tickets.json')
diff --git a/openedx/core/djangolib/tests/test_blockstore_cache.py b/openedx/core/djangolib/tests/test_blockstore_cache.py
index 5c55e07f449b..5ad1993d3ecd 100644
--- a/openedx/core/djangolib/tests/test_blockstore_cache.py
+++ b/openedx/core/djangolib/tests/test_blockstore_cache.py
@@ -5,11 +5,6 @@
from django.test import TestCase
from openedx.core.djangolib.blockstore_cache import BundleCache
-from openedx.core.lib.blockstore_api.tests.base import (
- BlockstoreAppTestMixin,
- requires_blockstore,
- requires_blockstore_app,
-)
from openedx.core.lib import blockstore_api as api
@@ -27,7 +22,7 @@ def setUpClass(cls):
@patch('openedx.core.djangolib.blockstore_cache.MAX_BLOCKSTORE_CACHE_DELAY', 0)
-class BundleCacheTestMixin(TestWithBundleMixin):
+class BundleCacheTestMixin(TestWithBundleMixin, TestCase):
"""
Tests for BundleCache
"""
@@ -112,17 +107,3 @@ def test_bundle_cache_clear(self):
# Now "clear" the cache, forcing the check of the new version:
cache.clear()
assert cache.get(key1) is None
-
-
-@requires_blockstore
-class BundleCacheBlockstoreServiceTest(BundleCacheTestMixin, TestCase):
- """
- Tests BundleCache using the standalone Blockstore service.
- """
-
-
-@requires_blockstore_app
-class BundleCacheTest(BundleCacheTestMixin, BlockstoreAppTestMixin, TestCase):
- """
- Tests BundleCache using the installed Blockstore app.
- """
diff --git a/openedx/core/lib/blockstore_api/__init__.py b/openedx/core/lib/blockstore_api/__init__.py
index 50b352578cdf..d9855ef1812f 100644
--- a/openedx/core/lib/blockstore_api/__init__.py
+++ b/openedx/core/lib/blockstore_api/__init__.py
@@ -4,6 +4,9 @@
This API does not do any caching; consider using BundleCache or (in
openedx.core.djangolib.blockstore_cache) together with these API methods for
improved performance.
+
+TODO: This wrapper is extraneous now that Blockstore-as-a-service isn't supported.
+ This whole directory tree should be removed by https://github.com/openedx/blockstore/issues/296.
"""
from blockstore.apps.api.data import (
BundleFileData,
@@ -16,7 +19,7 @@
BundleFileNotFound,
BundleStorageError,
)
-from .methods import (
+from blockstore.apps.api.methods import (
# Collections:
get_collection,
create_collection,
diff --git a/openedx/core/lib/blockstore_api/config/__init__.py b/openedx/core/lib/blockstore_api/config/__init__.py
deleted file mode 100644
index 4cd2999d2e32..000000000000
--- a/openedx/core/lib/blockstore_api/config/__init__.py
+++ /dev/null
@@ -1,13 +0,0 @@
-"""
-Helper method to indicate when the blockstore app API is enabled.
-"""
-from django.conf import settings
-from .waffle import BLOCKSTORE_USE_BLOCKSTORE_APP_API # pylint: disable=invalid-django-waffle-import
-
-
-def use_blockstore_app():
- """
- Use the Blockstore app API if the settings say to (e.g. in test)
- or if the waffle switch is enabled.
- """
- return settings.BLOCKSTORE_USE_BLOCKSTORE_APP_API or BLOCKSTORE_USE_BLOCKSTORE_APP_API.is_enabled()
diff --git a/openedx/core/lib/blockstore_api/config/waffle.py b/openedx/core/lib/blockstore_api/config/waffle.py
deleted file mode 100644
index 192d4d5c3ab2..000000000000
--- a/openedx/core/lib/blockstore_api/config/waffle.py
+++ /dev/null
@@ -1,20 +0,0 @@
-"""
-Toggles for blockstore.
-"""
-
-from edx_toggles.toggles import WaffleSwitch
-
-# .. toggle_name: blockstore.use_blockstore_app_api
-# .. toggle_implementation: WaffleSwitch
-# .. toggle_default: False
-# .. toggle_description: Enable to use the installed blockstore app's Python API directly instead of the
-# external blockstore service REST API.
-# The blockstore REST API is used by default.
-# .. toggle_use_cases: temporary, open_edx
-# .. toggle_creation_date: 2022-01-13
-# .. toggle_target_removal_date: None
-# .. toggle_tickets: TNL-8705, BD-14
-# .. toggle_warning: This temporary feature toggle does not have a target removal date.
-BLOCKSTORE_USE_BLOCKSTORE_APP_API = WaffleSwitch(
- 'blockstore.use_blockstore_app_api', __name__
-)
diff --git a/openedx/core/lib/blockstore_api/methods.py b/openedx/core/lib/blockstore_api/methods.py
deleted file mode 100644
index 86b4730efe1b..000000000000
--- a/openedx/core/lib/blockstore_api/methods.py
+++ /dev/null
@@ -1,496 +0,0 @@
-"""
-API Client methods for working with Blockstore bundles and drafts
-"""
-
-import base64
-from functools import wraps
-from urllib.parse import urlencode
-from uuid import UUID
-
-import dateutil.parser
-from django.conf import settings
-from django.core.exceptions import ImproperlyConfigured
-import requests
-
-from blockstore.apps.api.data import (
- BundleData,
- CollectionData,
- DraftData,
- BundleVersionData,
- BundleFileData,
- DraftFileData,
- BundleLinkData,
- DraftLinkData,
- Dependency,
-)
-from blockstore.apps.api.exceptions import (
- NotFound,
- CollectionNotFound,
- BundleNotFound,
- DraftNotFound,
- BundleFileNotFound,
-)
-import blockstore.apps.api.methods as blockstore_api_methods
-
-from .config import use_blockstore_app
-
-
-def toggle_blockstore_api(func):
- """
- Decorator function to toggle usage of the Blockstore service
- and the in-built Blockstore app dependency.
- """
- @wraps(func)
- def wrapper(*args, **kwargs):
- if use_blockstore_app():
- return getattr(blockstore_api_methods, func.__name__)(*args, **kwargs)
- return func(*args, **kwargs)
- return wrapper
-
-
-def api_url(*path_parts):
- if not settings.BLOCKSTORE_API_URL or not settings.BLOCKSTORE_API_URL.endswith('/api/v1/'):
- raise ImproperlyConfigured('BLOCKSTORE_API_URL must be set and should end with /api/v1/')
- return settings.BLOCKSTORE_API_URL + '/'.join(path_parts)
-
-
-def api_request(method, url, **kwargs):
- """
- Helper method for making a request to the Blockstore REST API
- """
- if not settings.BLOCKSTORE_API_AUTH_TOKEN:
- raise ImproperlyConfigured("Cannot use Blockstore unless BLOCKSTORE_API_AUTH_TOKEN is set.")
- kwargs.setdefault('headers', {})['Authorization'] = f"Token {settings.BLOCKSTORE_API_AUTH_TOKEN}"
- response = requests.request(method, url, **kwargs)
- if response.status_code == 404:
- raise NotFound
- response.raise_for_status()
- if response.status_code == 204:
- return None # No content
- return response.json()
-
-
-def _collection_from_response(data):
- """
- Given data about a Collection returned by any blockstore REST API, convert it to
- a CollectionData instance.
- """
- return CollectionData(uuid=UUID(data['uuid']), title=data['title'])
-
-
-def _bundle_from_response(data):
- """
- Given data about a Bundle returned by any blockstore REST API, convert it to
- a BundleData instance.
- """
- return BundleData(
- uuid=UUID(data['uuid']),
- title=data['title'],
- description=data['description'],
- slug=data['slug'],
- # drafts: Convert from a dict of URLs to a dict of UUIDs:
- drafts={draft_name: UUID(url.split('/')[-1]) for (draft_name, url) in data['drafts'].items()},
- # versions field: take the last one and convert it from URL to an int
- # i.e.: [..., 'https://blockstore/api/v1/bundle_versions/bundle_uuid,15'] -> 15
- latest_version=int(data['versions'][-1].split(',')[-1]) if data['versions'] else 0,
- )
-
-
-def _bundle_version_from_response(data):
- """
- Given data about a BundleVersion returned by any blockstore REST API, convert it to
- a BundleVersionData instance.
- """
- return BundleVersionData(
- bundle_uuid=UUID(data['bundle_uuid']),
- version=data.get('version', 0),
- change_description=data['change_description'],
- created_at=dateutil.parser.parse(data['snapshot']['created_at']),
- files={
- path: BundleFileData(path=path, **filedata)
- for path, filedata in data['snapshot']['files'].items()
- },
- links={
- name: BundleLinkData(
- name=name,
- direct=Dependency(**link["direct"]),
- indirect=[Dependency(**ind) for ind in link["indirect"]],
- )
- for name, link in data['snapshot']['links'].items()
- }
- )
-
-
-def _draft_from_response(data):
- """
- Given data about a Draft returned by any blockstore REST API, convert it to
- a DraftData instance.
- """
- return DraftData(
- uuid=UUID(data['uuid']),
- bundle_uuid=UUID(data['bundle_uuid']),
- name=data['name'],
- created_at=dateutil.parser.parse(data['staged_draft']['created_at']),
- updated_at=dateutil.parser.parse(data['staged_draft']['updated_at']),
- files={
- path: DraftFileData(path=path, **file)
- for path, file in data['staged_draft']['files'].items()
- },
- links={
- name: DraftLinkData(
- name=name,
- direct=Dependency(**link["direct"]),
- indirect=[Dependency(**ind) for ind in link["indirect"]],
- modified=link["modified"],
- )
- for name, link in data['staged_draft']['links'].items()
- }
- )
-
-
-@toggle_blockstore_api
-def get_collection(collection_uuid):
- """
- Retrieve metadata about the specified collection
-
- Raises CollectionNotFound if the collection does not exist
- """
- assert isinstance(collection_uuid, UUID)
- try:
- data = api_request('get', api_url('collections', str(collection_uuid)))
- except NotFound:
- raise CollectionNotFound(f"Collection {collection_uuid} does not exist.") # lint-amnesty, pylint: disable=raise-missing-from
- return _collection_from_response(data)
-
-
-@toggle_blockstore_api
-def create_collection(title):
- """
- Create a new collection.
- """
- result = api_request('post', api_url('collections'), json={"title": title})
- return _collection_from_response(result)
-
-
-@toggle_blockstore_api
-def update_collection(collection_uuid, title):
- """
- Update a collection's title
- """
- assert isinstance(collection_uuid, UUID)
- data = {"title": title}
- result = api_request('patch', api_url('collections', str(collection_uuid)), json=data)
- return _collection_from_response(result)
-
-
-@toggle_blockstore_api
-def delete_collection(collection_uuid):
- """
- Delete a collection
- """
- assert isinstance(collection_uuid, UUID)
- api_request('delete', api_url('collections', str(collection_uuid)))
-
-
-@toggle_blockstore_api
-def get_bundles(uuids=None, text_search=None):
- """
- Get the details of all bundles.
- """
- query_params = {}
- data = {}
- if uuids:
- # Potentially we could have a lot of libraries which will lead to 414 error (Request-URI Too Long)
- # if sending uuids in the query_params. So we have to use the request data instead.
- data = {'uuid': ','.join(map(str, uuids))}
- if text_search:
- query_params['text_search'] = text_search
- version_url = api_url('bundles') + '?' + urlencode(query_params)
- response = api_request('get', version_url, json=data)
- # build bundle from response, convert map object to list and return
- return [_bundle_from_response(item) for item in response]
-
-
-@toggle_blockstore_api
-def get_bundle(bundle_uuid):
- """
- Retrieve metadata about the specified bundle
-
- Raises BundleNotFound if the bundle does not exist
- """
- assert isinstance(bundle_uuid, UUID)
- try:
- data = api_request('get', api_url('bundles', str(bundle_uuid)))
- except NotFound:
- raise BundleNotFound(f"Bundle {bundle_uuid} does not exist.") # lint-amnesty, pylint: disable=raise-missing-from
- return _bundle_from_response(data)
-
-
-@toggle_blockstore_api
-def create_bundle(collection_uuid, slug, title="New Bundle", description=""):
- """
- Create a new bundle.
-
- Note that description is currently required.
- """
- result = api_request('post', api_url('bundles'), json={
- "collection_uuid": str(collection_uuid),
- "slug": slug,
- "title": title,
- "description": description,
- })
- return _bundle_from_response(result)
-
-
-@toggle_blockstore_api
-def update_bundle(bundle_uuid, **fields):
- """
- Update a bundle's title, description, slug, or collection.
- """
- assert isinstance(bundle_uuid, UUID)
- data = {}
- # Most validation will be done by Blockstore, so we don't worry too much about data validation
- for str_field in ("title", "description", "slug"):
- if str_field in fields:
- data[str_field] = fields.pop(str_field)
- if "collection_uuid" in fields:
- data["collection_uuid"] = str(fields.pop("collection_uuid"))
- if fields:
- raise ValueError(f"Unexpected extra fields passed "
- f"to update_bundle: {fields.keys()}")
- result = api_request('patch', api_url('bundles', str(bundle_uuid)), json=data)
- return _bundle_from_response(result)
-
-
-@toggle_blockstore_api
-def delete_bundle(bundle_uuid):
- """
- Delete a bundle
- """
- assert isinstance(bundle_uuid, UUID)
- api_request('delete', api_url('bundles', str(bundle_uuid)))
-
-
-@toggle_blockstore_api
-def get_draft(draft_uuid):
- """
- Retrieve metadata about the specified draft.
- If you don't know the draft's UUID, look it up using get_bundle()
- """
- assert isinstance(draft_uuid, UUID)
- try:
- data = api_request('get', api_url('drafts', str(draft_uuid)))
- except NotFound:
- raise DraftNotFound(f"Draft does not exist: {draft_uuid}") # lint-amnesty, pylint: disable=raise-missing-from
- return _draft_from_response(data)
-
-
-@toggle_blockstore_api
-def get_or_create_bundle_draft(bundle_uuid, draft_name):
- """
- Retrieve metadata about the specified draft.
- """
- bundle = get_bundle(bundle_uuid)
- try:
- return get_draft(bundle.drafts[draft_name]) # pylint: disable=unsubscriptable-object
- except KeyError:
- # The draft doesn't exist yet, so create it:
- response = api_request('post', api_url('drafts'), json={
- "bundle_uuid": str(bundle_uuid),
- "name": draft_name,
- })
- # The result of creating a draft doesn't include all the fields we want, so retrieve it now:
- return get_draft(UUID(response["uuid"]))
-
-
-@toggle_blockstore_api
-def commit_draft(draft_uuid):
- """
- Commit all of the pending changes in the draft, creating a new version of
- the associated bundle.
-
- Does not return any value.
- """
- api_request('post', api_url('drafts', str(draft_uuid), 'commit'))
-
-
-@toggle_blockstore_api
-def delete_draft(draft_uuid):
- """
- Delete the specified draft, removing any staged changes/files/deletes.
-
- Does not return any value.
- """
- api_request('delete', api_url('drafts', str(draft_uuid)))
-
-
-@toggle_blockstore_api
-def get_bundle_version(bundle_uuid, version_number):
- """
- Get the details of the specified bundle version
- """
- if version_number == 0:
- return None
- version_url = api_url('bundle_versions', str(bundle_uuid) + ',' + str(version_number))
- return _bundle_version_from_response(api_request('get', version_url))
-
-
-@toggle_blockstore_api
-def get_bundle_version_files(bundle_uuid, version_number):
- """
- Get a list of the files in the specified bundle version
- """
- if version_number == 0:
- return []
- version_info = get_bundle_version(bundle_uuid, version_number)
- return list(version_info.files.values())
-
-
-@toggle_blockstore_api
-def get_bundle_version_links(bundle_uuid, version_number):
- """
- Get a dictionary of the links in the specified bundle version
- """
- if version_number == 0:
- return {}
- version_info = get_bundle_version(bundle_uuid, version_number)
- return version_info.links
-
-
-@toggle_blockstore_api
-def get_bundle_files_dict(bundle_uuid, use_draft=None):
- """
- Get a dict of all the files in the specified bundle.
-
- Returns a dict where the keys are the paths (strings) and the values are
- BundleFileData or DraftFileData tuples.
- """
- bundle = get_bundle(bundle_uuid)
- if use_draft and use_draft in bundle.drafts: # pylint: disable=unsupported-membership-test
- draft_uuid = bundle.drafts[use_draft] # pylint: disable=unsubscriptable-object
- return get_draft(draft_uuid).files
- elif not bundle.latest_version:
- # This bundle has no versions so definitely does not contain any files
- return {}
- else:
- return {file_meta.path: file_meta for file_meta in get_bundle_version_files(bundle_uuid, bundle.latest_version)}
-
-
-@toggle_blockstore_api
-def get_bundle_files(bundle_uuid, use_draft=None):
- """
- Get an iterator over all the files in the specified bundle or draft.
- """
- return get_bundle_files_dict(bundle_uuid, use_draft).values()
-
-
-@toggle_blockstore_api
-def get_bundle_links(bundle_uuid, use_draft=None):
- """
- Get a dict of all the links in the specified bundle.
-
- Returns a dict where the keys are the link names (strings) and the values
- are BundleLinkData or DraftLinkData tuples.
- """
- bundle = get_bundle(bundle_uuid)
- if use_draft and use_draft in bundle.drafts: # pylint: disable=unsupported-membership-test
- draft_uuid = bundle.drafts[use_draft] # pylint: disable=unsubscriptable-object
- return get_draft(draft_uuid).links
- elif not bundle.latest_version:
- # This bundle has no versions so definitely does not contain any links
- return {}
- else:
- return get_bundle_version_links(bundle_uuid, bundle.latest_version)
-
-
-@toggle_blockstore_api
-def get_bundle_file_metadata(bundle_uuid, path, use_draft=None):
- """
- Get the metadata of the specified file.
- """
- assert isinstance(bundle_uuid, UUID)
- files_dict = get_bundle_files_dict(bundle_uuid, use_draft=use_draft)
- try:
- return files_dict[path]
- except KeyError:
- raise BundleFileNotFound( # lint-amnesty, pylint: disable=raise-missing-from
- f"Bundle {bundle_uuid} (draft: {use_draft}) does not contain a file {path}"
- )
-
-
-@toggle_blockstore_api
-def get_bundle_file_data(bundle_uuid, path, use_draft=None):
- """
- Read all the data in the given bundle file and return it as a
- binary string.
-
- Do not use this for large files!
- """
- metadata = get_bundle_file_metadata(bundle_uuid, path, use_draft)
- with requests.get(metadata.url, stream=True) as r:
- return r.content
-
-
-@toggle_blockstore_api
-def write_draft_file(draft_uuid, path, contents):
- """
- Create or overwrite the file at 'path' in the specified draft with the given
- contents. To delete a file, pass contents=None.
-
- If you don't know the draft's UUID, look it up using
- get_or_create_bundle_draft()
-
- Does not return anything.
- """
- api_request('patch', api_url('drafts', str(draft_uuid)), json={
- 'files': {
- path: _encode_str_for_draft(contents) if contents is not None else None,
- },
- })
-
-
-@toggle_blockstore_api
-def set_draft_link(draft_uuid, link_name, bundle_uuid, version):
- """
- Create or replace the link with the given name in the specified draft so
- that it points to the specified bundle version. To delete a link, pass
- bundle_uuid=None, version=None.
-
- If you don't know the draft's UUID, look it up using
- get_or_create_bundle_draft()
-
- Does not return anything.
- """
- api_request('patch', api_url('drafts', str(draft_uuid)), json={
- 'links': {
- link_name: {"bundle_uuid": str(bundle_uuid), "version": version} if bundle_uuid is not None else None,
- },
- })
-
-
-def _encode_str_for_draft(input_str):
- """
- Given a string, return UTF-8 representation that is then base64 encoded.
- """
- if isinstance(input_str, str):
- binary = input_str.encode('utf8')
- else:
- binary = input_str
- return base64.b64encode(binary)
-
-
-@toggle_blockstore_api
-def force_browser_url(blockstore_file_url):
- """
- Ensure that the given devstack URL is a URL accessible from the end user's browser.
- """
- # Hack: on some devstacks, we must necessarily use different URLs for
- # accessing Blockstore file data from within and outside of docker
- # containers, but Blockstore has no way of knowing which case any particular
- # request is for. So it always returns a URL suitable for use from within
- # the container. Only this edxapp can transform the URL at the last second,
- # knowing that in this case it's going to the user's browser and not being
- # read by edxapp.
- # In production, the same S3 URLs get used for internal and external access
- # so this hack is not necessary.
- return blockstore_file_url.replace('http://edx.devstack.blockstore:', 'http://localhost:')
diff --git a/openedx/core/lib/blockstore_api/tests/base.py b/openedx/core/lib/blockstore_api/tests/base.py
index 0888e8c81dc7..1d202d7671b5 100644
--- a/openedx/core/lib/blockstore_api/tests/base.py
+++ b/openedx/core/lib/blockstore_api/tests/base.py
@@ -1,17 +1,11 @@
"""
Common code for tests that work with Blockstore
"""
-from unittest import mock, skipUnless
+from unittest import mock
from urllib.parse import urlparse
-from django.conf import settings
from django.test.client import RequestFactory
-# Decorators for tests that require the blockstore service/app
-requires_blockstore = skipUnless(settings.RUN_BLOCKSTORE_TESTS, "Requires a running Blockstore server")
-
-requires_blockstore_app = skipUnless(settings.BLOCKSTORE_USE_BLOCKSTORE_APP_API, "Requires blockstore app")
-
class BlockstoreAppTestMixin:
"""
diff --git a/openedx/core/lib/blockstore_api/tests/test_blockstore_api.py b/openedx/core/lib/blockstore_api/tests/test_blockstore_api.py
index 9c15e16668d0..859b24e01d03 100644
--- a/openedx/core/lib/blockstore_api/tests/test_blockstore_api.py
+++ b/openedx/core/lib/blockstore_api/tests/test_blockstore_api.py
@@ -10,8 +10,6 @@
from openedx.core.lib import blockstore_api as api
from openedx.core.lib.blockstore_api.tests.base import (
BlockstoreAppTestMixin,
- requires_blockstore,
- requires_blockstore_app,
)
# A fake UUID that won't represent any real bundle/draft/collection:
@@ -197,14 +195,6 @@ def test_links(self):
assert not api.get_bundle_links(course_bundle.uuid, use_draft=course_draft.name)
-@requires_blockstore
-class BlockstoreServiceApiClientTest(BlockstoreApiClientTestMixin, TestCase):
- """
- Test the Blockstore API Client, using the standalone Blockstore service.
- """
-
-
-@requires_blockstore_app
class BlockstoreAppApiClientTest(BlockstoreApiClientTestMixin, BlockstoreAppTestMixin, TestCase):
"""
Test the Blockstore API Client, using the installed Blockstore app.
diff --git a/requirements/constraints.txt b/requirements/constraints.txt
index b4ff68f8f4dd..b175792a0321 100644
--- a/requirements/constraints.txt
+++ b/requirements/constraints.txt
@@ -23,7 +23,7 @@ click>=8.0,<9.0
# The team that owns this package will manually bump this package rather than having it pulled in automatically.
# This is to allow them to better control its deployment and to do it in a process that works better
# for them.
-edx-enterprise==4.8.4
+edx-enterprise==4.8.10
# django-oauth-toolkit version >=2.0.0 has breaking changes. More details
# mentioned on this issue https://github.com/openedx/edx-platform/issues/32884
diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt
index 94a428fc95c6..e87a5ba02e97 100644
--- a/requirements/edx/base.txt
+++ b/requirements/edx/base.txt
@@ -474,7 +474,7 @@ edx-drf-extensions==9.0.0
# edx-when
# edxval
# openedx-learning
-edx-enterprise==4.8.4
+edx-enterprise==4.8.10
# via
# -c requirements/edx/../constraints.txt
# -r requirements/edx/kernel.in
@@ -786,7 +786,7 @@ openedx-mongodbproxy==0.2.0
# via -r requirements/edx/kernel.in
optimizely-sdk==4.1.1
# via -r requirements/edx/bundled.in
-ora2==6.0.10
+ora2==6.0.12
# via -r requirements/edx/bundled.in
packaging==23.2
# via
diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt
index 5fb58a44c2ee..96257160d28e 100644
--- a/requirements/edx/development.txt
+++ b/requirements/edx/development.txt
@@ -755,7 +755,7 @@ edx-drf-extensions==9.0.0
# edx-when
# edxval
# openedx-learning
-edx-enterprise==4.8.4
+edx-enterprise==4.8.10
# via
# -c requirements/edx/../constraints.txt
# -r requirements/edx/doc.txt
@@ -1323,7 +1323,7 @@ optimizely-sdk==4.1.1
# via
# -r requirements/edx/doc.txt
# -r requirements/edx/testing.txt
-ora2==6.0.10
+ora2==6.0.12
# via
# -r requirements/edx/doc.txt
# -r requirements/edx/testing.txt
diff --git a/requirements/edx/doc.txt b/requirements/edx/doc.txt
index d81c1c6166e6..ce5161edf894 100644
--- a/requirements/edx/doc.txt
+++ b/requirements/edx/doc.txt
@@ -552,7 +552,7 @@ edx-drf-extensions==9.0.0
# edx-when
# edxval
# openedx-learning
-edx-enterprise==4.8.4
+edx-enterprise==4.8.10
# via
# -c requirements/edx/../constraints.txt
# -r requirements/edx/base.txt
@@ -928,7 +928,7 @@ openedx-mongodbproxy==0.2.0
# via -r requirements/edx/base.txt
optimizely-sdk==4.1.1
# via -r requirements/edx/base.txt
-ora2==6.0.10
+ora2==6.0.12
# via -r requirements/edx/base.txt
packaging==23.2
# via
diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt
index 562b0c8a0a88..b001a3273e98 100644
--- a/requirements/edx/testing.txt
+++ b/requirements/edx/testing.txt
@@ -580,7 +580,7 @@ edx-drf-extensions==9.0.0
# edx-when
# edxval
# openedx-learning
-edx-enterprise==4.8.4
+edx-enterprise==4.8.10
# via
# -c requirements/edx/../constraints.txt
# -r requirements/edx/base.txt
@@ -988,7 +988,7 @@ openedx-mongodbproxy==0.2.0
# via -r requirements/edx/base.txt
optimizely-sdk==4.1.1
# via -r requirements/edx/base.txt
-ora2==6.0.10
+ora2==6.0.12
# via -r requirements/edx/base.txt
packaging==23.2
# via
diff --git a/xmodule/library_tools.py b/xmodule/library_tools.py
index 6d8106caeaf3..0e3c3af51063 100644
--- a/xmodule/library_tools.py
+++ b/xmodule/library_tools.py
@@ -185,7 +185,7 @@ def list_available_libraries(self):
for lib in self.store.get_library_summaries()
]
v2_query = library_api.get_libraries_for_user(user)
- v2_libs_with_meta = library_api.get_metadata_from_index(v2_query)
+ v2_libs_with_meta = library_api.get_metadata(v2_query)
v2_libs = [(lib.key, lib.title) for lib in v2_libs_with_meta]
if settings.FEATURES.get('ENABLE_LIBRARY_AUTHORING_MICROFRONTEND'):