From c035d6eece94fa0052353ba801db323af07f2728 Mon Sep 17 00:00:00 2001 From: muhammad-ammar Date: Fri, 4 Sep 2015 16:39:40 +0500 Subject: [PATCH 01/54] update django-debug-toolbar --- requirements/edx/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index cbc2399f2e..330ee51a16 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -119,7 +119,7 @@ ipaddr==2.1.11 django-cors-headers==1.1.0 # Debug toolbar -django_debug_toolbar==1.2.2 +django_debug_toolbar==1.3.2 # Used for testing astroid==1.3.8 From 807299a8a31b652981400c6a0124c6ed8e3bf051 Mon Sep 17 00:00:00 2001 From: Brandon DeRosier Date: Fri, 4 Sep 2015 13:55:50 -0400 Subject: [PATCH 02/54] CRI-40 Don't assume user in request context when grading --- lms/djangoapps/courseware/grades.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lms/djangoapps/courseware/grades.py b/lms/djangoapps/courseware/grades.py index 3f9141d9aa..a7bcc8a8e3 100644 --- a/lms/djangoapps/courseware/grades.py +++ b/lms/djangoapps/courseware/grades.py @@ -306,7 +306,7 @@ def grade(student, request, course, keep_raw_scores=False, field_data_cache=None grade_summary = _grade(student, request, course, keep_raw_scores, field_data_cache, scores_client) responses = GRADES_UPDATED.send_robust( sender=None, - username=request.user.username, + username=student.username, grade_summary=grade_summary, course_key=course.id, deadline=course.end From 34eaecc3d49bedd0e942cedc2a46254f524896b1 Mon Sep 17 00:00:00 2001 From: Brandon DeRosier Date: Fri, 4 Sep 2015 15:42:16 -0400 Subject: [PATCH 03/54] Test student_grade_summary_data method --- .../tests/test_legacy_raw_download_csv.py | 66 +++++++++++++++++-- 1 file changed, 62 insertions(+), 4 deletions(-) diff --git a/lms/djangoapps/instructor/tests/test_legacy_raw_download_csv.py b/lms/djangoapps/instructor/tests/test_legacy_raw_download_csv.py index 4f7cfdf9ed..5eeb76cee6 100644 --- a/lms/djangoapps/instructor/tests/test_legacy_raw_download_csv.py +++ b/lms/djangoapps/instructor/tests/test_legacy_raw_download_csv.py @@ -5,6 +5,8 @@ Create course and answer a problem to test raw grade CSV from django.contrib.auth.models import User from django.core.urlresolvers import reverse +from instructor.utils import DummyRequest +from instructor.views.legacy import get_student_grade_summary_data from nose.plugins.attrib import attr from courseware.tests.test_submitting_problems import TestSubmittingProblems @@ -24,7 +26,7 @@ class TestRawGradeCSV(TestSubmittingProblems): super(TestRawGradeCSV, self).setUp() self.instructor = 'view2@test.com' - self.create_account('u2', self.instructor, self.password) + self.student_user2 = self.create_account('u2', self.instructor, self.password) self.activate_user(self.instructor) CourseStaffRole(self.course.id).add_users(User.objects.get(email=self.instructor)) self.logout() @@ -38,14 +40,20 @@ class TestRawGradeCSV(TestSubmittingProblems): self.add_dropdown_to_section(self.homework.location, 'p3', 1) self.refresh_course() + def answer_question(self): + """ + Answer a question correctly in the course + """ + self.login(self.instructor, self.password) + resp = self.submit_question_answer('p2', {'2_1': 'Correct'}) + self.assertEqual(resp.status_code, 200) + def test_download_raw_grades_dump(self): """ Grab raw grade report and make sure all grades are reported. """ # Answer second problem correctly with 2nd user to expose bug - self.login(self.instructor, self.password) - resp = self.submit_question_answer('p2', {'2_1': 'Correct'}) - self.assertEqual(resp.status_code, 200) + self.answer_question() url = reverse('instructor_dashboard_legacy', kwargs={'course_id': self.course.id.to_deprecated_string()}) msg = "url = {0}\n".format(url) @@ -58,3 +66,53 @@ class TestRawGradeCSV(TestSubmittingProblems): "2","u2","username","view2@test.com","","0.0","1.0","0.0" ''' self.assertEqual(body, expected_csv, msg) + + def test_grade_summary_data(self): + """ + Test grade summary data report generation + """ + self.answer_question() + + request = DummyRequest() + data = get_student_grade_summary_data(request, self.course, get_raw_scores=False) + expected_data = { + 'students': [self.student_user, self.student_user2], + 'header': [ + u'ID', u'Username', u'Full Name', u'edX email', u'External email', + u'HW 01', u'HW 02', u'HW 03', u'HW 04', u'HW 05', u'HW 06', u'HW 07', + u'HW 08', u'HW 09', u'HW 10', u'HW 11', u'HW 12', u'HW Avg', u'Lab 01', + u'Lab 02', u'Lab 03', u'Lab 04', u'Lab 05', u'Lab 06', u'Lab 07', + u'Lab 08', u'Lab 09', u'Lab 10', u'Lab 11', u'Lab 12', u'Lab Avg', u'Midterm', + u'Final' + ], + 'data': [ + [ + 1, u'u1', u'username', u'view@test.com', '', 0.0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0.0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ], + [ + 2, u'u2', u'username', u'view2@test.com', '', 0.3333333333333333, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0.03333333333333333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 + ] + ], + 'assignments': [ + u'HW 01', u'HW 02', u'HW 03', u'HW 04', u'HW 05', u'HW 06', u'HW 07', u'HW 08', + u'HW 09', u'HW 10', u'HW 11', u'HW 12', u'HW Avg', u'Lab 01', u'Lab 02', + u'Lab 03', u'Lab 04', u'Lab 05', u'Lab 06', u'Lab 07', u'Lab 08', u'Lab 09', + u'Lab 10', u'Lab 11', u'Lab 12', u'Lab Avg', u'Midterm', u'Final' + ] + } + + for key in ['assignments', 'header']: + self.assertListEqual(expected_data[key], data[key]) + + for index, student in enumerate(expected_data['students']): + self.assertEqual( + student.username, + data['students'][index].username + ) + self.assertListEqual( + expected_data['data'][index], + data['data'][index] + ) From c652cb2d1de86f702c9e545dc042645e23ff1eb8 Mon Sep 17 00:00:00 2001 From: Gabe Mulley Date: Mon, 7 Sep 2015 18:00:38 -0400 Subject: [PATCH 04/54] Fix order of tracking backends --- cms/envs/aws.py | 4 ++-- cms/envs/common.py | 4 ++-- lms/envs/acceptance.py | 2 +- lms/envs/aws.py | 4 ++-- lms/envs/common.py | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cms/envs/aws.py b/cms/envs/aws.py index 84d8947fbf..af8a8008c4 100644 --- a/cms/envs/aws.py +++ b/cms/envs/aws.py @@ -293,8 +293,8 @@ BROKER_URL = "{0}://{1}:{2}@{3}/{4}".format(CELERY_BROKER_TRANSPORT, # Event tracking TRACKING_BACKENDS.update(AUTH_TOKENS.get("TRACKING_BACKENDS", {})) -EVENT_TRACKING_BACKENDS['tracking_logs']['OPTIONS']['backends'].update(AUTH_TOKENS.get("EVENT_TRACKING_BACKENDS", {})) -EVENT_TRACKING_BACKENDS['segmentio']['OPTIONS']['processors'][0]['OPTIONS']['whitelist'].extend( +EVENT_TRACKING_BACKENDS['0_tracking_logs']['OPTIONS']['backends'].update(AUTH_TOKENS.get("EVENT_TRACKING_BACKENDS", {})) +EVENT_TRACKING_BACKENDS['1_segmentio']['OPTIONS']['processors'][0]['OPTIONS']['whitelist'].extend( AUTH_TOKENS.get("EVENT_TRACKING_SEGMENTIO_EMIT_WHITELIST", [])) SUBDOMAIN_BRANDING = ENV_TOKENS.get('SUBDOMAIN_BRANDING', {}) diff --git a/cms/envs/common.py b/cms/envs/common.py index 25ae0c4250..f2b1ff5d0e 100644 --- a/cms/envs/common.py +++ b/cms/envs/common.py @@ -816,7 +816,7 @@ TRACKING_IGNORE_URL_PATTERNS = [r'^/event', r'^/login', r'^/heartbeat'] EVENT_TRACKING_ENABLED = True EVENT_TRACKING_BACKENDS = { - 'tracking_logs': { + '0_tracking_logs': { 'ENGINE': 'eventtracking.backends.routing.RoutingBackend', 'OPTIONS': { 'backends': { @@ -834,7 +834,7 @@ EVENT_TRACKING_BACKENDS = { ] } }, - 'segmentio': { + '1_segmentio': { 'ENGINE': 'eventtracking.backends.routing.RoutingBackend', 'OPTIONS': { 'backends': { diff --git a/lms/envs/acceptance.py b/lms/envs/acceptance.py index 53fae641c5..ad32746373 100644 --- a/lms/envs/acceptance.py +++ b/lms/envs/acceptance.py @@ -80,7 +80,7 @@ TRACKING_BACKENDS.update({ } }) -EVENT_TRACKING_BACKENDS['tracking_logs']['OPTIONS']['backends'].update({ +EVENT_TRACKING_BACKENDS['0_tracking_logs']['OPTIONS']['backends'].update({ 'mongo': { 'ENGINE': 'eventtracking.backends.mongodb.MongoBackend', 'OPTIONS': { diff --git a/lms/envs/aws.py b/lms/envs/aws.py index d9cf8c9854..4ecd8dcd45 100644 --- a/lms/envs/aws.py +++ b/lms/envs/aws.py @@ -489,8 +489,8 @@ STUDENT_FILEUPLOAD_MAX_SIZE = ENV_TOKENS.get("STUDENT_FILEUPLOAD_MAX_SIZE", STUD # Event tracking TRACKING_BACKENDS.update(AUTH_TOKENS.get("TRACKING_BACKENDS", {})) -EVENT_TRACKING_BACKENDS['tracking_logs']['OPTIONS']['backends'].update(AUTH_TOKENS.get("EVENT_TRACKING_BACKENDS", {})) -EVENT_TRACKING_BACKENDS['segmentio']['OPTIONS']['processors'][0]['OPTIONS']['whitelist'].extend( +EVENT_TRACKING_BACKENDS['0_tracking_logs']['OPTIONS']['backends'].update(AUTH_TOKENS.get("EVENT_TRACKING_BACKENDS", {})) +EVENT_TRACKING_BACKENDS['1_segmentio']['OPTIONS']['processors'][0]['OPTIONS']['whitelist'].extend( AUTH_TOKENS.get("EVENT_TRACKING_SEGMENTIO_EMIT_WHITELIST", [])) TRACKING_SEGMENTIO_WEBHOOK_SECRET = AUTH_TOKENS.get( "TRACKING_SEGMENTIO_WEBHOOK_SECRET", diff --git a/lms/envs/common.py b/lms/envs/common.py index c1ebcfbb04..d63d4d0d49 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -630,7 +630,7 @@ TRACKING_IGNORE_URL_PATTERNS = [r'^/event', r'^/login', r'^/heartbeat', r'^/segm EVENT_TRACKING_ENABLED = True EVENT_TRACKING_BACKENDS = { - 'tracking_logs': { + '0_tracking_logs': { 'ENGINE': 'eventtracking.backends.routing.RoutingBackend', 'OPTIONS': { 'backends': { @@ -648,7 +648,7 @@ EVENT_TRACKING_BACKENDS = { ] } }, - 'segmentio': { + '1_segmentio': { 'ENGINE': 'eventtracking.backends.routing.RoutingBackend', 'OPTIONS': { 'backends': { From ab6e76c19b59aa078dccb62de0490518790dcaf2 Mon Sep 17 00:00:00 2001 From: Gabe Mulley Date: Tue, 8 Sep 2015 09:45:43 -0400 Subject: [PATCH 05/54] Add in a comment describing the reasoning for the names --- cms/envs/common.py | 4 ++++ lms/envs/common.py | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/cms/envs/common.py b/cms/envs/common.py index f2b1ff5d0e..ffc19bb096 100644 --- a/cms/envs/common.py +++ b/cms/envs/common.py @@ -815,6 +815,10 @@ TRACKING_BACKENDS = { TRACKING_IGNORE_URL_PATTERNS = [r'^/event', r'^/login', r'^/heartbeat'] EVENT_TRACKING_ENABLED = True + +# NOTE: the sort order of the backend names is important here, the events will be sent to the backends in sorted +# order. In this case a processor modifies the event in a way that is only intended to be seen by segment.io, so +# we want to make sure that backend and processor is run *after* the event has been sent to the tracking logs. EVENT_TRACKING_BACKENDS = { '0_tracking_logs': { 'ENGINE': 'eventtracking.backends.routing.RoutingBackend', diff --git a/lms/envs/common.py b/lms/envs/common.py index d63d4d0d49..8171182cdc 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -629,6 +629,10 @@ TRACKING_BACKENDS = { TRACKING_IGNORE_URL_PATTERNS = [r'^/event', r'^/login', r'^/heartbeat', r'^/segmentio/event', r'^/performance'] EVENT_TRACKING_ENABLED = True + +# NOTE: the sort order of the backend names is important here, the events will be sent to the backends in sorted +# order. In this case a processor modifies the event in a way that is only intended to be seen by segment.io, so +# we want to make sure that backend and processor is run *after* the event has been sent to the tracking logs. EVENT_TRACKING_BACKENDS = { '0_tracking_logs': { 'ENGINE': 'eventtracking.backends.routing.RoutingBackend', From 282b9449a4bc9dd972eac3b8270cc4bba001ed1c Mon Sep 17 00:00:00 2001 From: aamir-khan Date: Wed, 2 Sep 2015 18:20:11 +0500 Subject: [PATCH 06/54] ECOM-2150: Added the ga client fetching as a customer header in middleware --- common/djangoapps/track/middleware.py | 2 +- common/djangoapps/track/tests/test_middleware.py | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/common/djangoapps/track/middleware.py b/common/djangoapps/track/middleware.py index 7f26b05494..f8715bcc0e 100644 --- a/common/djangoapps/track/middleware.py +++ b/common/djangoapps/track/middleware.py @@ -145,7 +145,7 @@ class TrackMiddleware(object): # this: _ga=GA1.2.1033501218.1368477899. The clientId is this part: 1033501218.1368477899. google_analytics_cookie = request.COOKIES.get('_ga') if google_analytics_cookie is None: - context['client_id'] = None + context['client_id'] = request.META.get('HTTP_X_EDX_GA_CLIENT_ID') else: context['client_id'] = '.'.join(google_analytics_cookie.split('.')[2:]) diff --git a/common/djangoapps/track/tests/test_middleware.py b/common/djangoapps/track/tests/test_middleware.py index 587e4e310d..93be67d911 100644 --- a/common/djangoapps/track/tests/test_middleware.py +++ b/common/djangoapps/track/tests/test_middleware.py @@ -136,12 +136,16 @@ class TrackMiddlewareTestCase(TestCase): def test_request_headers(self): ip_address = '10.0.0.0' user_agent = 'UnitTest/1.0' + client_id_header = '123.123' - factory = RequestFactory(REMOTE_ADDR=ip_address, HTTP_USER_AGENT=user_agent) + factory = RequestFactory( + REMOTE_ADDR=ip_address, HTTP_USER_AGENT=user_agent, HTTP_X_EDX_GA_CLIENT_ID=client_id_header + ) request = factory.get('/some-path') context = self.get_context_for_request(request) self.assert_dict_subset(context, { 'ip': ip_address, 'agent': user_agent, + 'client_id': client_id_header }) From 2521e379b9449451167f82ed4f5ea9405cc2a6e0 Mon Sep 17 00:00:00 2001 From: muhammad-ammar Date: Wed, 9 Sep 2015 15:04:30 +0500 Subject: [PATCH 07/54] update python-social-auth --- requirements/edx/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index 8c6d564310..19a322830f 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -63,7 +63,7 @@ pyparsing==2.0.1 python-memcached==1.48 python-openid==2.2.5 python-dateutil==2.1 -python-social-auth==0.2.11 +python-social-auth==0.2.12 pytz==2015.2 pysrt==0.4.7 PyYAML==3.10 From 2ee10a6c1d216a3495172c2dd08ddb99ba359709 Mon Sep 17 00:00:00 2001 From: Muhammad Shoaib Date: Wed, 9 Sep 2015 19:22:41 +0500 Subject: [PATCH 08/54] fixed the allowances table css issue in instructor dashboard --- .../sass/course/instructor/_instructor_2.scss | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lms/static/sass/course/instructor/_instructor_2.scss b/lms/static/sass/course/instructor/_instructor_2.scss index df043d97d9..bef79f2556 100644 --- a/lms/static/sass/course/instructor/_instructor_2.scss +++ b/lms/static/sass/course/instructor/_instructor_2.scss @@ -1956,16 +1956,20 @@ input[name="subject"] { width: 140px; } &.email { - width: 250px; + @include text-align(center); + width: ($baseline*8); word-wrap: break-word; } &.allowance-name { - width: 140px; + width: ($baseline*5); + text-align: center; } &.allowance-value { - width: 150px; + @include text-align(center); + width: ($baseline*5); } &.c_action { + @include text-align(center); width: 60px; } } @@ -1991,6 +1995,7 @@ input[name="subject"] { text-align: center; } td:nth-child(3){ + word-wrap: break-word; text-align: center; } td:nth-child(6){ @@ -1998,17 +2003,12 @@ input[name="subject"] { text-align: center; } - td{ - a.remove_allowance{ - @include margin-left(15px); - } - } td:last-child { padding-left: 17px; } } } - .exam-attempts-content { + .exam-attempts-content, .exam-allowances-content { padding-left: 0; padding-right: 0; } @@ -2033,7 +2033,7 @@ input[name="subject"] { span { background-color: #ccc; display: inline-block; - padding: 6px 12px; + padding: 7px 12px; cursor: pointer; } } From 6164c20a0f4c5ae9793eaf00b55bb7528a25c847 Mon Sep 17 00:00:00 2001 From: Christine Lytwynec Date: Wed, 9 Sep 2015 12:40:31 -0400 Subject: [PATCH 09/54] Make studio forgot password link focusable --- cms/templates/login.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cms/templates/login.html b/cms/templates/login.html index 76da01e65b..0a2e036654 100644 --- a/cms/templates/login.html +++ b/cms/templates/login.html @@ -30,9 +30,9 @@ from django.utils.translation import ugettext as _
  • - ${_("Forgot password?")} + ${_("Forgot password?")}
  • From 1455882b4f6676bf8e86dd59b65080ae0d04425c Mon Sep 17 00:00:00 2001 From: lduarte1991 Date: Thu, 10 Sep 2015 10:53:36 -0400 Subject: [PATCH 10/54] Allows username and user email to be sent to an LTI. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently, there is a way to do so via opening the LTI tool in a new page, this removes the one line of code that specifies that it is the only way to do it. It allows the iframe’d version of the tool to be able to receive such information if necessary. --- common/lib/xmodule/xmodule/lti_module.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/common/lib/xmodule/xmodule/lti_module.py b/common/lib/xmodule/xmodule/lti_module.py index c559e1d985..7d3a895eb3 100644 --- a/common/lib/xmodule/xmodule/lti_module.py +++ b/common/lib/xmodule/xmodule/lti_module.py @@ -206,9 +206,8 @@ class LTIFields(object): ask_to_send_username = Boolean( display_name=_("Request user's username"), # Translators: This is used to request the user's username for a third party service. - # Usernames can only be requested if "Open in New Page" is set to True. help=_( - "Select True to request the user's username. You must also set Open in New Page to True to get the user's information." + "Select True to request the user's username." ), default=False, scope=Scope.settings @@ -216,9 +215,8 @@ class LTIFields(object): ask_to_send_email = Boolean( display_name=_("Request user's email"), # Translators: This is used to request the user's email for a third party service. - # Emails can only be requested if "Open in New Page" is set to True. help=_( - "Select True to request the user's email address. You must also set Open in New Page to True to get the user's information." + "Select True to request the user's email address." ), default=False, scope=Scope.settings @@ -603,11 +601,10 @@ class LTIModule(LTIFields, LTI20ModuleMixin, XModule): except AttributeError: self.user_username = "" - if self.open_in_a_new_page: - if self.ask_to_send_username and self.user_username: - body["lis_person_sourcedid"] = self.user_username - if self.ask_to_send_email and self.user_email: - body["lis_person_contact_email_primary"] = self.user_email + if self.ask_to_send_username and self.user_username: + body["lis_person_sourcedid"] = self.user_username + if self.ask_to_send_email and self.user_email: + body["lis_person_contact_email_primary"] = self.user_email # Appending custom parameter for signing. body.update(custom_parameters) From c8dc10b2d7f2ccd012fe5c2827066350e1655f35 Mon Sep 17 00:00:00 2001 From: Saleem Latif Date: Thu, 10 Sep 2015 12:12:58 +0500 Subject: [PATCH 11/54] added wait for loading js files --- common/test/acceptance/pages/studio/settings.py | 10 ++++++++++ .../tests/studio/test_studio_settings_details.py | 1 - 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/common/test/acceptance/pages/studio/settings.py b/common/test/acceptance/pages/studio/settings.py index 1f5b2fc10d..9e0c3d90d7 100644 --- a/common/test/acceptance/pages/studio/settings.py +++ b/common/test/acceptance/pages/studio/settings.py @@ -4,11 +4,13 @@ Course Schedule and Details Settings page. """ from __future__ import unicode_literals from bok_choy.promise import EmptyPromise +from bok_choy.javascript import requirejs from .course_page import CoursePage from .utils import press_the_notification_button +@requirejs('js/factories/settings') class SettingsPage(CoursePage): """ Course Schedule and Details Settings page. @@ -22,6 +24,13 @@ class SettingsPage(CoursePage): def is_browser_on_page(self): return self.q(css='body.view-settings').present + def wait_for_require_js(self): + """ + Wait for require-js to load javascript files. + """ + if hasattr(self, 'wait_for_js'): + self.wait_for_js() # pylint: disable=no-member + def refresh_and_wait_for_load(self): """ Refresh the page and wait for all resources to load. @@ -182,4 +191,5 @@ class SettingsPage(CoursePage): lambda: self.q(css='body.view-settings').present, 'Page is refreshed' ).fulfill() + self.wait_for_require_js() self.wait_for_ajax() diff --git a/common/test/acceptance/tests/studio/test_studio_settings_details.py b/common/test/acceptance/tests/studio/test_studio_settings_details.py index 5faa002e43..0e68e69708 100644 --- a/common/test/acceptance/tests/studio/test_studio_settings_details.py +++ b/common/test/acceptance/tests/studio/test_studio_settings_details.py @@ -40,7 +40,6 @@ class SettingsMilestonesTest(StudioCourseTest): self.assertTrue(self.settings_detail.pre_requisite_course_options) - @skip # TODO: fix this. SOL-449 def test_prerequisite_course_save_successfully(self): """ Scenario: Selecting course from Pre-Requisite course drop down save the selected course as pre-requisite From a7cec3283aac460c9e11440e37f16228a2613263 Mon Sep 17 00:00:00 2001 From: Muhammad Shoaib Date: Thu, 10 Sep 2015 15:32:10 +0500 Subject: [PATCH 12/54] Fix of Flaky test in proctored exams. --- common/test/acceptance/pages/lms/instructor_dashboard.py | 2 +- .../acceptance/tests/lms/test_lms_instructor_dashboard.py | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/common/test/acceptance/pages/lms/instructor_dashboard.py b/common/test/acceptance/pages/lms/instructor_dashboard.py index fe79cd2aae..7826e3f2de 100644 --- a/common/test/acceptance/pages/lms/instructor_dashboard.py +++ b/common/test/acceptance/pages/lms/instructor_dashboard.py @@ -72,7 +72,7 @@ class InstructorDashboardPage(CoursePage): """ self.q(css='a[data-section=proctoring]').first.click() proctoring_section = ProctoringPage(self.browser) - proctoring_section.wait_for_ajax() + proctoring_section.wait_for_page() return proctoring_section @staticmethod diff --git a/common/test/acceptance/tests/lms/test_lms_instructor_dashboard.py b/common/test/acceptance/tests/lms/test_lms_instructor_dashboard.py index ea9ab01afc..5ed63fa973 100644 --- a/common/test/acceptance/tests/lms/test_lms_instructor_dashboard.py +++ b/common/test/acceptance/tests/lms/test_lms_instructor_dashboard.py @@ -209,7 +209,7 @@ class ProctoredExamsTest(BaseInstructorDashboardTest): self._auto_auth("STAFF_TESTER", "staff101@example.com", True) self.course_outline.visit() - #open the exam settings to make it a proctored exam. + # open the exam settings to make it a proctored exam. self.course_outline.open_exam_settings_dialog() self.course_outline.make_exam_timed() time.sleep(2) # Wait for 2 seconds to save the settings. @@ -222,14 +222,12 @@ class ProctoredExamsTest(BaseInstructorDashboardTest): # Start the proctored exam. self.courseware_page.start_timed_exam() - @flaky # TODO fix this, see SOL-1183 def test_can_add_remove_allowance(self): """ Make sure that allowances can be added and removed. """ - - # Given that an exam has been configured to be a proctored exam. - self._create_a_proctored_exam_and_attempt() + # Given that an exam has been configured to be a timed exam. + self._create_a_timed_exam_and_attempt() # When I log in as an instructor, self.log_in_as_instructor() From 25449e9148d4a645ede5b47929de9d468a47bc35 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Fri, 11 Sep 2015 11:35:52 -0400 Subject: [PATCH 13/54] Upgrade coverage.py to 4.0b3 --- requirements/edx/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index 5935a77058..06e3555923 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -122,7 +122,7 @@ django_debug_toolbar==1.2.2 astroid==1.3.8 bok-choy==0.4.3 chrono==1.0.2 -coverage==3.7.1 +coverage==4.0b3 ddt==0.8.0 diff-cover==0.8.0 django-crum==0.5 From 5923675c35a21d442860b58e04b8f3c5ba749dda Mon Sep 17 00:00:00 2001 From: Max Rothman Date: Tue, 1 Sep 2015 11:36:49 -0400 Subject: [PATCH 14/54] Add management command for granting superuser access --- .../management/commands/set_superuser.py | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 common/djangoapps/student/management/commands/set_superuser.py diff --git a/common/djangoapps/student/management/commands/set_superuser.py b/common/djangoapps/student/management/commands/set_superuser.py new file mode 100644 index 0000000000..068742bc8c --- /dev/null +++ b/common/djangoapps/student/management/commands/set_superuser.py @@ -0,0 +1,46 @@ +"""Management command to grant or revoke superuser access for one or more users""" + +from optparse import make_option +from django.contrib.auth.models import User +from django.core.management.base import BaseCommand, CommandError + + +class Command(BaseCommand): + """Management command to grant or revoke superuser access for one or more users""" + option_list = BaseCommand.option_list + ( + make_option('--unset', + action='store_true', + dest='unset', + default=False, + help='Set is_superuser to False instead of True'), + ) + + args = ' [user|email ...]>' + help = """ + This command will set is_superuser to true for one or more users. + Lookup by username or email address, assumes usernames + do not look like email addresses. + """ + + def handle(self, *args, **options): + if len(args) < 1: + raise CommandError('Usage is set_superuser {0}'.format(self.args)) + + for user in args: + try: + if '@' in user: + userobj = User.objects.get(email=user) + else: + userobj = User.objects.get(username=user) + + if options['unset']: + userobj.is_superuser = False + else: + userobj.is_superuser = True + + userobj.save() + + except Exception as err: # pylint: disable=broad-except + print "Error modifying user with identifier {}: {}: {}".format(user, type(err).__name__, err.message) + + print 'Success!' From 985c6f64ec2125c49b4b65c3f3a530f5317f075d Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sat, 12 Sep 2015 08:30:15 -0400 Subject: [PATCH 15/54] Fix the inheritance of tests into tests for the recommender tests --- .../xblock_integration/test_recommender.py | 28 ++++++++----------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/openedx/tests/xblock_integration/test_recommender.py b/openedx/tests/xblock_integration/test_recommender.py index dea42322d6..9f67912717 100644 --- a/openedx/tests/xblock_integration/test_recommender.py +++ b/openedx/tests/xblock_integration/test_recommender.py @@ -224,13 +224,10 @@ class TestRecommenderCreateFromEmpty(TestRecommender): @attr('shard_1') -class TestRecommenderWithResources(TestRecommender): - """ - Check whether we can add/edit/flag/export resources correctly - """ +class TestRecommenderResourceBase(TestRecommender): + """Base helper class for tests with resources.""" def setUp(self): - # call the setUp function from the superclass - super(TestRecommenderWithResources, self).setUp() + super(TestRecommenderResourceBase, self).setUp() self.resource_id = self.resource_urls[0] self.resource_id_second = self.resource_urls[1] self.non_existing_resource_id = 'An non-existing id' @@ -258,6 +255,12 @@ class TestRecommenderWithResources(TestRecommender): resource.update(edited_recommendations) return resource + +@attr('shard_1') +class TestRecommenderWithResources(TestRecommenderResourceBase): + """ + Check whether we can add/edit/flag/export resources correctly + """ def test_add_redundant_resource(self): """ Verify the addition of a redundant resource (url) is rejected @@ -420,14 +423,10 @@ class TestRecommenderWithResources(TestRecommender): @attr('shard_1') @ddt -class TestRecommenderVoteWithResources(TestRecommenderWithResources): +class TestRecommenderVoteWithResources(TestRecommenderResourceBase): """ Check whether we can vote resources correctly """ - def setUp(self): - # call the setUp function from the superclass - super(TestRecommenderVoteWithResources, self).setUp() - @data( {'event': 'recommender_upvote'}, {'event': 'recommender_downvote'} @@ -538,14 +537,10 @@ class TestRecommenderVoteWithResources(TestRecommenderWithResources): @attr('shard_1') @ddt -class TestRecommenderStaffFeedbackWithResources(TestRecommenderWithResources): +class TestRecommenderStaffFeedbackWithResources(TestRecommenderResourceBase): """ Check whether we can remove/endorse resources correctly """ - def setUp(self): - # call the setUp function from the superclass - super(TestRecommenderStaffFeedbackWithResources, self).setUp() - @data('remove_resource', 'endorse_resource') def test_remove_or_endorse_resource_non_existing(self, test_case): """ @@ -642,7 +637,6 @@ class TestRecommenderFileUploading(TestRecommender): Check whether we can handle file uploading correctly """ def setUp(self): - # call the setUp function from the superclass super(TestRecommenderFileUploading, self).setUp() self.initial_configuration = { 'flagged_accum_resources': {}, From bbad9ae772a26621a892f2bf6bf3e159819d721c Mon Sep 17 00:00:00 2001 From: wajeeha-khalid Date: Mon, 14 Sep 2015 11:43:21 +0500 Subject: [PATCH 16/54] MA-1182 - added test for not enrolled in course, removed commented out nose test code, formatted import statements according to edx standards --- lms/djangoapps/discussion_api/tests/test_api.py | 6 ++++++ lms/djangoapps/discussion_api/tests/test_views.py | 2 -- lms/djangoapps/discussion_api/views.py | 3 ++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/lms/djangoapps/discussion_api/tests/test_api.py b/lms/djangoapps/discussion_api/tests/test_api.py index 525e19cdba..baf5441900 100644 --- a/lms/djangoapps/discussion_api/tests/test_api.py +++ b/lms/djangoapps/discussion_api/tests/test_api.py @@ -2912,6 +2912,12 @@ class RetrieveThreadTest( self.assertEqual(get_thread(self.request, self.thread_id), expected_response_data) self.assertEqual(httpretty.last_request().method, "GET") + def test_not_enrolled_in_course(self): + self.register_thread() + self.request.user = UserFactory.create() + with self.assertRaises(Http404): + get_thread(self.request, self.thread_id) + @ddt.data( *itertools.product( [ diff --git a/lms/djangoapps/discussion_api/tests/test_views.py b/lms/djangoapps/discussion_api/tests/test_views.py index 3046233734..960ce4f638 100644 --- a/lms/djangoapps/discussion_api/tests/test_views.py +++ b/lms/djangoapps/discussion_api/tests/test_views.py @@ -588,7 +588,6 @@ class ThreadViewSetDeleteTest(DiscussionAPIViewTestMixin, ModuleStoreTestCase): self.thread_id = "test_thread" def test_basic(self): - #from nose.tools import set_trace;set_trace() self.register_get_user_response(self.user) cs_thread = make_minimal_cs_thread({ "id": self.thread_id, @@ -608,7 +607,6 @@ class ThreadViewSetDeleteTest(DiscussionAPIViewTestMixin, ModuleStoreTestCase): self.assertEqual(httpretty.last_request().method, "DELETE") def test_delete_nonexistent_thread(self): - #from nose.tools import set_trace;set_trace() self.register_get_thread_error_response(self.thread_id, 404) response = self.client.delete(self.url) self.assertEqual(response.status_code, 404) diff --git a/lms/djangoapps/discussion_api/views.py b/lms/djangoapps/discussion_api/views.py index 5881c63444..7e7bc2710a 100644 --- a/lms/djangoapps/discussion_api/views.py +++ b/lms/djangoapps/discussion_api/views.py @@ -19,10 +19,11 @@ from discussion_api.api import ( get_comment_list, get_course, get_course_topics, + get_thread, get_thread_list, update_comment, update_thread, - get_thread) +) from discussion_api.forms import CommentListGetForm, ThreadListGetForm from openedx.core.lib.api.view_utils import DeveloperErrorViewMixin From 78af86bc5b8e5c3d4aa8d552b1881ae7fc2f3745 Mon Sep 17 00:00:00 2001 From: John Eskew Date: Fri, 11 Sep 2015 14:59:42 -0400 Subject: [PATCH 17/54] Refactor the test_crud file. Move Split-specific tests to test_split_modulestore.py. Derive remaining tests from ModuleStoreTestCase. Remove unused persistent_factory.py. --- .../contentstore/tests/test_crud.py | 211 ++++-------------- .../modulestore/tests/persistent_factories.py | 91 -------- .../tests/test_split_modulestore.py | 116 ++++++++++ 3 files changed, 163 insertions(+), 255 deletions(-) delete mode 100644 common/lib/xmodule/xmodule/modulestore/tests/persistent_factories.py diff --git a/cms/djangoapps/contentstore/tests/test_crud.py b/cms/djangoapps/contentstore/tests/test_crud.py index 92d6c88c77..512667fa02 100644 --- a/cms/djangoapps/contentstore/tests/test_crud.py +++ b/cms/djangoapps/contentstore/tests/test_crud.py @@ -1,42 +1,21 @@ import unittest -from opaque_keys.edx.locator import LocalId - from xmodule import templates from xmodule.modulestore import ModuleStoreEnum -from xmodule.modulestore.tests import persistent_factories +from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory +from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase, TEST_DATA_SPLIT_MODULESTORE from xmodule.course_module import CourseDescriptor -from xmodule.modulestore.django import modulestore, clear_existing_modulestores from xmodule.seq_module import SequenceDescriptor from xmodule.capa_module import CapaDescriptor -from xmodule.contentstore.django import _CONTENTSTORE -from xmodule.modulestore.exceptions import ItemNotFoundError, DuplicateCourseError from xmodule.html_module import HtmlDescriptor +from xmodule.modulestore.exceptions import DuplicateCourseError -class TemplateTests(unittest.TestCase): +class TemplateTests(ModuleStoreTestCase): """ Test finding and using the templates (boilerplates) for xblocks. """ - - def setUp(self): - super(TemplateTests, self).setUp() - clear_existing_modulestores() # redundant w/ cleanup but someone was getting errors - self.addCleanup(self._drop_mongo_collections) - self.addCleanup(clear_existing_modulestores) - self.split_store = modulestore()._get_modulestore_by_type(ModuleStoreEnum.Type.split) - - @staticmethod - def _drop_mongo_collections(): - """ - If using a Mongo-backed modulestore & contentstore, drop the collections. - """ - module_store = modulestore() - if hasattr(module_store, '_drop_database'): - module_store._drop_database() # pylint: disable=protected-access - _CONTENTSTORE.clear() - if hasattr(module_store, 'close_connections'): - module_store.close_connections() + MODULESTORE = TEST_DATA_SPLIT_MODULESTORE def test_get_templates(self): found = templates.all_templates() @@ -69,42 +48,49 @@ class TemplateTests(unittest.TestCase): self.assertIsNotNone(HtmlDescriptor.get_template('announcement.yaml')) def test_factories(self): - test_course = persistent_factories.PersistentCourseFactory.create( - course='course', run='2014', org='testx', - display_name='fun test course', user_id='testbot' + test_course = CourseFactory.create( + org='testx', + course='course', + run='2014', + display_name='fun test course', + user_id='testbot' ) self.assertIsInstance(test_course, CourseDescriptor) self.assertEqual(test_course.display_name, 'fun test course') - index_info = self.split_store.get_course_index_info(test_course.id) - self.assertEqual(index_info['org'], 'testx') - self.assertEqual(index_info['course'], 'course') - self.assertEqual(index_info['run'], '2014') + course_from_store = self.store.get_course(test_course.id) + self.assertEqual(course_from_store.id.org, 'testx') + self.assertEqual(course_from_store.id.course, 'course') + self.assertEqual(course_from_store.id.run, '2014') - test_chapter = persistent_factories.ItemFactory.create( - display_name='chapter 1', - parent_location=test_course.location + test_chapter = ItemFactory.create( + parent_location=test_course.location, + category='chapter', + display_name='chapter 1' ) self.assertIsInstance(test_chapter, SequenceDescriptor) # refetch parent which should now point to child - test_course = self.split_store.get_course(test_course.id.version_agnostic()) + test_course = self.store.get_course(test_course.id.version_agnostic()) self.assertIn(test_chapter.location, test_course.children) with self.assertRaises(DuplicateCourseError): - persistent_factories.PersistentCourseFactory.create( - course='course', run='2014', org='testx', - display_name='fun test course', user_id='testbot' + CourseFactory.create( + org='testx', + course='course', + run='2014', + display_name='fun test course', + user_id='testbot' ) def test_temporary_xblocks(self): """ Test create_xblock to create non persisted xblocks """ - test_course = persistent_factories.PersistentCourseFactory.create( + test_course = CourseFactory.create( course='course', run='2014', org='testx', display_name='fun test course', user_id='testbot' ) - test_chapter = self.split_store.create_xblock( + test_chapter = self.store.create_xblock( test_course.system, test_course.id, 'chapter', fields={'display_name': 'chapter n'}, parent_xblock=test_course ) @@ -114,7 +100,7 @@ class TemplateTests(unittest.TestCase): # test w/ a definition (e.g., a problem) test_def_content = 'boo' - test_problem = self.split_store.create_xblock( + test_problem = self.store.create_xblock( test_course.system, test_course.id, 'problem', fields={'data': test_def_content}, parent_xblock=test_chapter ) @@ -124,131 +110,28 @@ class TemplateTests(unittest.TestCase): test_problem.display_name = 'test problem' self.assertEqual(test_problem.display_name, 'test problem') - def test_persist_dag(self): - """ - try saving temporary xblocks - """ - test_course = persistent_factories.PersistentCourseFactory.create( - course='course', run='2014', org='testx', - display_name='fun test course', user_id='testbot' - ) - test_chapter = self.split_store.create_xblock( - test_course.system, test_course.id, 'chapter', fields={'display_name': 'chapter n'}, - parent_xblock=test_course - ) - self.assertEqual(test_chapter.display_name, 'chapter n') - test_def_content = 'boo' - # create child - new_block = self.split_store.create_xblock( - test_course.system, test_course.id, - 'problem', - fields={ - 'data': test_def_content, - 'display_name': 'problem' - }, - parent_xblock=test_chapter - ) - self.assertIsNotNone(new_block.definition_locator) - self.assertTrue(isinstance(new_block.definition_locator.definition_id, LocalId)) - # better to pass in persisted parent over the subdag so - # subdag gets the parent pointer (otherwise 2 ops, persist dag, update parent children, - # persist parent - persisted_course = self.split_store.persist_xblock_dag(test_course, 'testbot') - self.assertEqual(len(persisted_course.children), 1) - persisted_chapter = persisted_course.get_children()[0] - self.assertEqual(persisted_chapter.category, 'chapter') - self.assertEqual(persisted_chapter.display_name, 'chapter n') - self.assertEqual(len(persisted_chapter.children), 1) - persisted_problem = persisted_chapter.get_children()[0] - self.assertEqual(persisted_problem.category, 'problem') - self.assertEqual(persisted_problem.data, test_def_content) - # update it - persisted_problem.display_name = 'altered problem' - persisted_problem = self.split_store.persist_xblock_dag(persisted_problem, 'testbot') - self.assertEqual(persisted_problem.display_name, 'altered problem') - def test_delete_course(self): - test_course = persistent_factories.PersistentCourseFactory.create( - course='history', run='doomed', org='edu.harvard', + test_course = CourseFactory.create( + org='edu.harvard', + course='history', + run='doomed', display_name='doomed test course', user_id='testbot') - persistent_factories.ItemFactory.create( - display_name='chapter 1', - parent_location=test_course.location + ItemFactory.create( + parent_location=test_course.location, + category='chapter', + display_name='chapter 1' ) id_locator = test_course.id.for_branch(ModuleStoreEnum.BranchName.draft) - guid_locator = test_course.location.course_agnostic() # verify it can be retrieved by id - self.assertIsInstance(self.split_store.get_course(id_locator), CourseDescriptor) - # and by guid -- TODO reenable when split_draft supports getting specific versions -# self.assertIsInstance(self.split_store.get_item(guid_locator), CourseDescriptor) - self.split_store.delete_course(id_locator, 'testbot') - # test can no longer retrieve by id - self.assertRaises(ItemNotFoundError, self.split_store.get_course, id_locator) - # but can by guid -- same TODO as above -# self.assertIsInstance(self.split_store.get_item(guid_locator), CourseDescriptor) - - def test_block_generations(self): - """ - Test get_block_generations - """ - test_course = persistent_factories.PersistentCourseFactory.create( - course='history', run='hist101', org='edu.harvard', - display_name='history test course', - user_id='testbot' - ) - chapter = persistent_factories.ItemFactory.create( - display_name='chapter 1', - parent_location=test_course.location, - user_id='testbot' - ) - sub = persistent_factories.ItemFactory.create( - display_name='subsection 1', - parent_location=chapter.location, - user_id='testbot', - category='vertical' - ) - first_problem = persistent_factories.ItemFactory.create( - display_name='problem 1', parent_location=sub.location, user_id='testbot', category='problem', - data="" - ) - first_problem.max_attempts = 3 - first_problem.save() # decache the above into the kvs - updated_problem = self.split_store.update_item(first_problem, 'testbot') - self.assertIsNotNone(updated_problem.previous_version) - self.assertEqual(updated_problem.previous_version, first_problem.update_version) - self.assertNotEqual(updated_problem.update_version, first_problem.update_version) - self.split_store.delete_item(updated_problem.location, 'testbot') - - second_problem = persistent_factories.ItemFactory.create( - display_name='problem 2', - parent_location=sub.location.version_agnostic(), - user_id='testbot', category='problem', - data="" - ) - - # The draft course root has 2 revisions: the published revision, and then the subsequent - # changes to the draft revision - version_history = self.split_store.get_block_generations(test_course.location) - self.assertIsNotNone(version_history) - self.assertEqual(version_history.locator.version_guid, test_course.location.version_guid) - self.assertEqual(len(version_history.children), 1) - self.assertEqual(version_history.children[0].children, []) - self.assertEqual(version_history.children[0].locator.version_guid, chapter.location.version_guid) - - # sub changed on add, add problem, delete problem, add problem in strict linear seq - version_history = self.split_store.get_block_generations(sub.location) - self.assertEqual(len(version_history.children), 1) - self.assertEqual(len(version_history.children[0].children), 1) - self.assertEqual(len(version_history.children[0].children[0].children), 1) - self.assertEqual(len(version_history.children[0].children[0].children[0].children), 0) - - # first and second problem may show as same usage_id; so, need to ensure their histories are right - version_history = self.split_store.get_block_generations(updated_problem.location) - self.assertEqual(version_history.locator.version_guid, first_problem.location.version_guid) - self.assertEqual(len(version_history.children), 1) # updated max_attempts - self.assertEqual(len(version_history.children[0].children), 0) - - version_history = self.split_store.get_block_generations(second_problem.location) - self.assertNotEqual(version_history.locator.version_guid, first_problem.location.version_guid) + self.assertIsInstance(self.store.get_course(id_locator), CourseDescriptor) + # TODO reenable when split_draft supports getting specific versions + # guid_locator = test_course.location.course_agnostic() + # Verify it can be retrieved by guid + # self.assertIsInstance(self.store.get_item(guid_locator), CourseDescriptor) + self.store.delete_course(id_locator, 'testbot') + # Test can no longer retrieve by id. + self.assertIsNone(self.store.get_course(id_locator)) + # But can retrieve by guid -- same TODO as above + # self.assertIsInstance(self.store.get_item(guid_locator), CourseDescriptor) diff --git a/common/lib/xmodule/xmodule/modulestore/tests/persistent_factories.py b/common/lib/xmodule/xmodule/modulestore/tests/persistent_factories.py deleted file mode 100644 index 2eee09740f..0000000000 --- a/common/lib/xmodule/xmodule/modulestore/tests/persistent_factories.py +++ /dev/null @@ -1,91 +0,0 @@ -"""Provides factories for Split.""" -from xmodule.modulestore import ModuleStoreEnum -from xmodule.course_module import CourseDescriptor -from xmodule.x_module import XModuleDescriptor -import factory -from factory.helpers import lazy_attribute -from opaque_keys.edx.keys import UsageKey -# Factories are self documenting -# pylint: disable=missing-docstring - - -class SplitFactory(factory.Factory): - """ - Abstracted superclass which defines modulestore so that there's no dependency on django - if the caller passes modulestore in kwargs - """ - @lazy_attribute - def modulestore(self): - # Delayed import so that we only depend on django if the caller - # hasn't provided their own modulestore - from xmodule.modulestore.django import modulestore - return modulestore()._get_modulestore_by_type(ModuleStoreEnum.Type.split) - - -class PersistentCourseFactory(SplitFactory): - """ - Create a new course (not a new version of a course, but a whole new index entry). - - keywords: any xblock field plus (note, the below are filtered out; so, if they - become legitimate xblock fields, they won't be settable via this factory) - * org: defaults to textX - * master_branch: (optional) defaults to ModuleStoreEnum.BranchName.draft - * user_id: (optional) defaults to 'test_user' - * display_name (xblock field): will default to 'Robot Super Course' unless provided - """ - FACTORY_FOR = CourseDescriptor - - # pylint: disable=unused-argument - @classmethod - def _create(cls, target_class, course='999', run='run', org='testX', user_id=ModuleStoreEnum.UserID.test, - master_branch=ModuleStoreEnum.BranchName.draft, **kwargs): - - modulestore = kwargs.pop('modulestore') - root_block_id = kwargs.pop('root_block_id', 'course') - # Write the data to the mongo datastore - new_course = modulestore.create_course( - org, course, run, user_id, fields=kwargs, - master_branch=master_branch, root_block_id=root_block_id - ) - - return new_course - - @classmethod - def _build(cls, target_class, *args, **kwargs): - raise NotImplementedError() - - -class ItemFactory(SplitFactory): - FACTORY_FOR = XModuleDescriptor - - display_name = factory.LazyAttributeSequence(lambda o, n: "{} {}".format(o.category, n)) - - # pylint: disable=unused-argument - @classmethod - def _create(cls, target_class, parent_location, category='chapter', - user_id=ModuleStoreEnum.UserID.test, definition_locator=None, force=False, - continue_version=False, **kwargs): - """ - passes *kwargs* as the new item's field values: - - :param parent_location: (required) the location of the course & possibly parent - - :param category: (defaults to 'chapter') - - :param definition_locator (optional): the DescriptorLocator for the definition this uses or branches - """ - modulestore = kwargs.pop('modulestore') - if isinstance(parent_location, UsageKey): - return modulestore.create_child( - user_id, parent_location, category, defintion_locator=definition_locator, - force=force, continue_version=continue_version, **kwargs - ) - else: - return modulestore.create_item( - user_id, parent_location, category, defintion_locator=definition_locator, - force=force, continue_version=continue_version, **kwargs - ) - - @classmethod - def _build(cls, target_class, *args, **kwargs): - raise NotImplementedError() diff --git a/common/lib/xmodule/xmodule/modulestore/tests/test_split_modulestore.py b/common/lib/xmodule/xmodule/modulestore/tests/test_split_modulestore.py index 25e2dc7741..88da3c71aa 100644 --- a/common/lib/xmodule/xmodule/modulestore/tests/test_split_modulestore.py +++ b/common/lib/xmodule/xmodule/modulestore/tests/test_split_modulestore.py @@ -772,6 +772,122 @@ class SplitModuleCourseTests(SplitModuleTest): self.assertEqual(len(result.children[0].children), 1) self.assertEqual(result.children[0].children[0].locator.version_guid, versions[0]) + @patch('xmodule.tabs.CourseTab.from_json', side_effect=mock_tab_from_json) + def test_persist_dag(self, _from_json): + """ + try saving temporary xblocks + """ + test_course = modulestore().create_course( + course='course', run='2014', org='testx', + display_name='fun test course', user_id='testbot', + master_branch=ModuleStoreEnum.BranchName.draft + ) + test_chapter = modulestore().create_xblock( + test_course.system, test_course.id, 'chapter', fields={'display_name': 'chapter n'}, + parent_xblock=test_course + ) + self.assertEqual(test_chapter.display_name, 'chapter n') + test_def_content = 'boo' + # create child + new_block = modulestore().create_xblock( + test_course.system, test_course.id, + 'problem', + fields={ + 'data': test_def_content, + 'display_name': 'problem' + }, + parent_xblock=test_chapter + ) + self.assertIsNotNone(new_block.definition_locator) + self.assertTrue(isinstance(new_block.definition_locator.definition_id, LocalId)) + # better to pass in persisted parent over the subdag so + # subdag gets the parent pointer (otherwise 2 ops, persist dag, update parent children, + # persist parent + persisted_course = modulestore().persist_xblock_dag(test_course, 'testbot') + self.assertEqual(len(persisted_course.children), 1) + persisted_chapter = persisted_course.get_children()[0] + self.assertEqual(persisted_chapter.category, 'chapter') + self.assertEqual(persisted_chapter.display_name, 'chapter n') + self.assertEqual(len(persisted_chapter.children), 1) + persisted_problem = persisted_chapter.get_children()[0] + self.assertEqual(persisted_problem.category, 'problem') + self.assertEqual(persisted_problem.data, test_def_content) + # update it + persisted_problem.display_name = 'altered problem' + persisted_problem = modulestore().update_item(persisted_problem, 'testbot') + self.assertEqual(persisted_problem.display_name, 'altered problem') + + @patch('xmodule.tabs.CourseTab.from_json', side_effect=mock_tab_from_json) + def test_block_generations(self, _from_json): + """ + Test get_block_generations + """ + test_course = modulestore().create_course( + org='edu.harvard', + course='history', + run='hist101', + display_name='history test course', + user_id='testbot', + master_branch=ModuleStoreEnum.BranchName.draft + ) + chapter = modulestore().create_child( + None, test_course.location, + block_type='chapter', + block_id='chapter1', + fields={'display_name': 'chapter 1'} + ) + sub = modulestore().create_child( + None, chapter.location, + block_type='vertical', + block_id='subsection1', + fields={'display_name': 'subsection 1'} + ) + first_problem = modulestore().create_child( + None, sub.location, + block_type='problem', + block_id='problem1', + fields={'display_name': 'problem 1', 'data': ''} + ) + first_problem.max_attempts = 3 + first_problem.save() # decache the above into the kvs + updated_problem = modulestore().update_item(first_problem, 'testbot') + self.assertIsNotNone(updated_problem.previous_version) + self.assertEqual(updated_problem.previous_version, first_problem.update_version) + self.assertNotEqual(updated_problem.update_version, first_problem.update_version) + modulestore().delete_item(updated_problem.location, 'testbot') + + second_problem = modulestore().create_child( + None, sub.location.version_agnostic(), + block_type='problem', + block_id='problem2', + fields={'display_name': 'problem 2', 'data': ''} + ) + + # The draft course root has 2 revisions: the published revision, and then the subsequent + # changes to the draft revision + version_history = modulestore().get_block_generations(test_course.location) + self.assertIsNotNone(version_history) + self.assertEqual(version_history.locator.version_guid, test_course.location.version_guid) + self.assertEqual(len(version_history.children), 1) + self.assertEqual(version_history.children[0].children, []) + self.assertEqual(version_history.children[0].locator.version_guid, chapter.location.version_guid) + + # sub changed on add, add problem, delete problem, add problem in strict linear seq + version_history = modulestore().get_block_generations(sub.location) + self.assertEqual(len(version_history.children), 1) + self.assertEqual(len(version_history.children[0].children), 1) + self.assertEqual(len(version_history.children[0].children[0].children), 1) + self.assertEqual(len(version_history.children[0].children[0].children[0].children), 0) + + # first and second problem may show as same usage_id; so, need to ensure their histories are right + version_history = modulestore().get_block_generations(updated_problem.location) + self.assertEqual(version_history.locator.version_guid, first_problem.location.version_guid) + self.assertEqual(len(version_history.children), 1) # updated max_attempts + self.assertEqual(len(version_history.children[0].children), 0) + + version_history = modulestore().get_block_generations(second_problem.location) + self.assertNotEqual(version_history.locator.version_guid, first_problem.location.version_guid) + class TestCourseStructureCache(SplitModuleTest): """Tests for the CourseStructureCache""" From 1cfadf39cc5b3a628f9668758bb0b3a63c3c10e0 Mon Sep 17 00:00:00 2001 From: Bill DeRusha Date: Mon, 14 Sep 2015 11:08:33 -0400 Subject: [PATCH 18/54] Add logic to handle not searching when focus is passed to the clear search button TNL-3238 --- .../common/js/components/views/search_field.js | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/common/static/common/js/components/views/search_field.js b/common/static/common/js/components/views/search_field.js index 7599edee35..955133fe1c 100644 --- a/common/static/common/js/components/views/search_field.js +++ b/common/static/common/js/components/views/search_field.js @@ -14,12 +14,15 @@ 'submit .search-form': 'performSearch', 'blur .search-form': 'onFocusOut', 'keyup .search-field': 'refreshState', - 'click .action-clear': 'clearSearch' + 'click .action-clear': 'clearSearch', + 'mouseover .action-clear': 'setMouseOverState', + 'mouseout .action-clear': 'setMouseOutState', }, initialize: function(options) { this.type = options.type; this.label = options.label; + this.mouseOverClear = false; }, refreshState: function() { @@ -43,10 +46,18 @@ return this; }, + setMouseOverState: function(event) { + this.mouseOverClear = true; + }, + + setMouseOutState: function(event) { + this.mouseOverClear = false; + }, + onFocusOut: function(event) { // If the focus is going anywhere but the clear search // button then treat it as a request to search. - if (!$(event.relatedTarget).hasClass('action-clear')) { + if (!this.mouseOverClear) { this.performSearch(event); } }, From 4fe575d8c5904e288592392b43db5250db912db2 Mon Sep 17 00:00:00 2001 From: Eric Fischer Date: Mon, 14 Sep 2015 10:57:58 -0400 Subject: [PATCH 19/54] Fixing bad button style Removing unneeded styling on confirmation button; making the appearance and hover/focus behavior of the button match that of the confirmation dialog in studio. TNL-3189 --- lms/static/sass/_developer.scss | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/lms/static/sass/_developer.scss b/lms/static/sass/_developer.scss index e31d9747e7..244ec94d5b 100644 --- a/lms/static/sass/_developer.scss +++ b/lms/static/sass/_developer.scss @@ -314,3 +314,23 @@ } } +//efischer - TNL-3189 +//copied from cms/static/sass/elements/_system-feedback.scss#L106 +//along with some "hide the inherited value, we want none" action +.prompt.warning button { + @extend %btn-no-style; + box-shadow: none; + text-shadow: none; + + &:hover { + color: $orange-s2; + background: transparent; + box-shadow: none; + } + + &:focus { + box-shadow: none; + border: 0px; + } +} + From 1c4d160596b6e82d8d469a64ed4f08e756b10460 Mon Sep 17 00:00:00 2001 From: David Baumgold Date: Fri, 4 Sep 2015 14:48:26 -0400 Subject: [PATCH 20/54] Fetch people.yaml file from private repo --- scripts/release.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/scripts/release.py b/scripts/release.py index 867d11338e..c333c29b53 100755 --- a/scripts/release.py +++ b/scripts/release.py @@ -45,7 +45,7 @@ PROJECT_ROOT = project_root() repo = Repo(PROJECT_ROOT) git = repo.git -PEOPLE_YAML = "https://raw.githubusercontent.com/edx/repo-tools/master/people.yaml" +PEOPLE_YAML = "https://raw.githubusercontent.com/edx/repo-tools-data/master/people.yaml" class memoized(object): @@ -149,7 +149,10 @@ def create_github_creds(): https://developer.github.com/v3/oauth_authorizations/#create-a-new-authorization """ headers = {"User-Agent": "edx-release"} - payload = {"note": "edx-release"} + payload = { + "note": "edx-release", + "scopes": ["repo"], + } username = raw_input("Github username: ") password = getpass.getpass("Github password: ") response = requests.post( @@ -300,6 +303,7 @@ class DoesNotExist(Exception): self.message = message self.commit = commit self.branch = branch + Exception.__init__(self, message) def get_merge_commit(commit, branch="master"): @@ -371,10 +375,15 @@ def prs_by_email(start_ref, end_ref): The dictionary is alphabetically ordered by email address The pull request list is ordered by merge date """ + username, token = get_github_creds() + headers = { + "Authorization": "token {}".format(token), + "User-Agent": "edx-release", + } # `emails` maps from other_emails to primary email, based on people.yaml. emails = {} try: - people_resp = requests.get(PEOPLE_YAML) + people_resp = requests.get(PEOPLE_YAML, headers=headers) people_resp.raise_for_status() people = yaml.safe_load(people_resp.text) except requests.exceptions.RequestException as e: From 260038356c8c2b33e35e912766fd66cfb5401bab Mon Sep 17 00:00:00 2001 From: David Baumgold Date: Thu, 10 Sep 2015 11:07:46 -0400 Subject: [PATCH 21/54] If cannot fetch people.yaml, entire script should fail --- scripts/release.py | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/scripts/release.py b/scripts/release.py index c333c29b53..751f38383b 100755 --- a/scripts/release.py +++ b/scripts/release.py @@ -382,21 +382,13 @@ def prs_by_email(start_ref, end_ref): } # `emails` maps from other_emails to primary email, based on people.yaml. emails = {} - try: - people_resp = requests.get(PEOPLE_YAML, headers=headers) - people_resp.raise_for_status() - people = yaml.safe_load(people_resp.text) - except requests.exceptions.RequestException as e: - # Hmm, muddle through without canonicalized emails... - message = ( - "Warning: could not fetch people.yaml: {message}".format(message=e.message) - ) - print(colorize("red", message), file=sys.stderr) - else: - for person in people.itervalues(): - if 'other_emails' in person: - for other_email in person['other_emails']: - emails[other_email] = person['email'] + people_resp = requests.get(PEOPLE_YAML, headers=headers) + people_resp.raise_for_status() + people = yaml.safe_load(people_resp.text) + for person in people.itervalues(): + if 'other_emails' in person: + for other_email in person['other_emails']: + emails[other_email] = person['email'] unordered_data = collections.defaultdict(set) for pr_num in get_merged_prs(start_ref, end_ref): From 21b143e40a91da25adc9e0d0acbe01c851618df7 Mon Sep 17 00:00:00 2001 From: Bill DeRusha Date: Mon, 14 Sep 2015 13:57:22 -0400 Subject: [PATCH 22/54] Right align text above action buttons TNL-3234 --- lms/static/sass/views/_teams.scss | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lms/static/sass/views/_teams.scss b/lms/static/sass/views/_teams.scss index 7f1c47d827..e2546a59e0 100644 --- a/lms/static/sass/views/_teams.scss +++ b/lms/static/sass/views/_teams.scss @@ -575,7 +575,10 @@ .join-team-message { @extend %t-copy-sub1; + @include text-align(right); color: $gray-l1; + display: block; + margin-bottom: ($baseline/4); } .team-actions { From 1c21a0d250dce2e9b080960c4770237203dea419 Mon Sep 17 00:00:00 2001 From: David Baumgold Date: Mon, 14 Sep 2015 14:50:38 -0400 Subject: [PATCH 23/54] Remove trailing whitespace from Sass files --- cms/static/sass/_base.scss | 32 +++++++------- cms/static/sass/_variables.scss | 24 +++++----- cms/static/sass/assets/_anims.scss | 12 ++--- cms/static/sass/elements/_controls.scss | 14 +++--- cms/static/sass/elements/_xblocks.scss | 10 ++--- .../sass/vendor/bi-app/_bi-app-ltr.scss | 6 +-- .../sass/vendor/bi-app/_bi-app-rtl.scss | 6 +-- .../sass/vendor/bi-app/_variables-ltr.scss | 12 ++--- .../sass/vendor/bi-app/_variables-rtl.scss | 10 ++--- cms/static/sass/views/_certificates.scss | 6 +-- cms/static/sass/views/_settings.scss | 2 +- common/static/sass/_mixins.scss | 44 +++++++++---------- lms/static/sass/_news.scss | 2 +- lms/static/sass/base/_utilities.scss | 2 +- .../sass/course/_open_ended_grading.scss | 4 +- lms/static/sass/course/_rubric.scss | 4 +- lms/static/sass/course/_staff_grading.scss | 28 ++++++------ lms/static/sass/course/_syllabus.scss | 4 +- lms/static/sass/course/_tabs.scss | 2 +- lms/static/sass/course/_textbook.scss | 2 +- .../course/discussion/_form-wmd-toolbar.scss | 22 +++++----- .../course/layout/_courseware_preview.scss | 2 +- lms/static/sass/course/layout/_footer.scss | 2 +- .../sass/discussion/elements/_editor.scss | 2 +- .../sass/discussion/elements/_labels.scss | 2 +- .../sass/vendor/bi-app/_bi-app-ltr.scss | 6 +-- .../sass/vendor/bi-app/_bi-app-rtl.scss | 6 +-- lms/static/sass/vendor/bi-app/_mixins.scss | 4 +- .../sass/vendor/bi-app/_variables-ltr.scss | 12 ++--- .../sass/vendor/bi-app/_variables-rtl.scss | 10 ++--- lms/static/sass/views/_account-settings.scss | 4 +- static/vendor/bi-app/_bi-app-ltr.scss | 6 +-- static/vendor/bi-app/_bi-app-rtl.scss | 6 +-- static/vendor/bi-app/_mixins.scss | 4 +- static/vendor/bi-app/_variables-ltr.scss | 12 ++--- static/vendor/bi-app/_variables-rtl.scss | 10 ++--- 36 files changed, 168 insertions(+), 168 deletions(-) diff --git a/cms/static/sass/_base.scss b/cms/static/sass/_base.scss index b8ab6e6dc9..0bfc824143 100644 --- a/cms/static/sass/_base.scss +++ b/cms/static/sass/_base.scss @@ -1,8 +1,8 @@ // studio - base styling // ==================== -// Table of Contents -// * +Basic Setup +// Table of Contents +// * +Basic Setup // * +Typography - Basic // * +Typography - Primary Content // * +Typography - Secondary Content @@ -19,7 +19,7 @@ // * +JS Dependent // +Basic Setup -// ==================== +// ==================== html { font-size: 62.5%; height: 102%; // force scrollbar to prevent jump when scroll appears, cannot use overflow because it breaks drag @@ -66,7 +66,7 @@ h1 { } // +Typography - Basic -// ==================== +// ==================== .page-header { @extend %t-title3; @extend %t-strong; @@ -111,7 +111,7 @@ h1 { } // +Typography - Primary Content -// ==================== +// ==================== .content-primary { .section-header { @@ -148,7 +148,7 @@ h1 { } // +Typography - Secondary Content -// ==================== +// ==================== .content-secondary { .section-header { @@ -177,7 +177,7 @@ h1 { } // +Typography - Loose Headings (BT: needs to be removed once html is clean) -// ==================== +// ==================== .title-1, .title-2, .title-3, .title-4, .title-5, .title-6 { @extend %t-strong; } @@ -226,13 +226,13 @@ p, ul, ol, dl { } // +Layout - Basic -// ==================== +// ==================== .wrapper-view { } // +Layout - Basic Page Header -// ==================== +// ==================== .wrapper-mast { margin: ($baseline*1.5) 0 0 0; padding: 0 $baseline; @@ -375,7 +375,7 @@ p, ul, ol, dl { } // +Layout - Basic Page Content -// ==================== +// ==================== .wrapper-content { margin: 0; padding: 0 $baseline; @@ -419,7 +419,7 @@ p, ul, ol, dl { } // +Layout - Primary Content -// ==================== +// ==================== .content-primary { .title-1 { @@ -457,7 +457,7 @@ p, ul, ol, dl { } // +Layout - Supplemental Content -// ==================== +// ==================== .content-supplementary { > section { @@ -466,7 +466,7 @@ p, ul, ol, dl { } // +Layout - Grandfathered -// ==================== +// ==================== .main-wrapper { position: relative; margin: 0 ($baseline*2); @@ -503,7 +503,7 @@ p, ul, ol, dl { } // +UI - Actions -// ==================== +// ==================== .new-unit-item, .new-subsection-item, .new-policy-item { @@ -535,7 +535,7 @@ p, ul, ol, dl { } // +UI - Misc -// ==================== +// ==================== hr.divide { @extend %cont-text-sr; } @@ -623,7 +623,7 @@ hr.divide { // +Utility - Basic -// ==================== +// ==================== // UI - semantically hide text .sr { diff --git a/cms/static/sass/_variables.scss b/cms/static/sass/_variables.scss index b68e0399f7..acdc7e31b3 100644 --- a/cms/static/sass/_variables.scss +++ b/cms/static/sass/_variables.scss @@ -1,7 +1,7 @@ // studio - utilities - variables // ==================== -// Table of Contents +// Table of Contents // * +Grid // * +Fonts // * +Colors - Utility @@ -16,7 +16,7 @@ $baseline: 20px; // +Grid -// ==================== +// ==================== $gw-column: ($baseline*3); $gw-gutter: $baseline; $fg-column: $gw-column; @@ -26,16 +26,16 @@ $fg-max-width: 1280px; $fg-min-width: 900px; // +Fonts -// ==================== +// ==================== $f-sans-serif: 'Open Sans','Helvetica Neue', Helvetica, Arial, sans-serif; $f-monospace: 'Bitstream Vera Sans Mono', Consolas, Courier, monospace; // +Colors - Utility -// ==================== +// ==================== $transparent: rgba(0,0,0,0); // used when color value is needed for UI width/transitions but element is transparent // +Colors - Primary -// ==================== +// ==================== $black: rgb(0,0,0); $black-t0: rgba($black, 0.125); $black-t1: rgba($black, 0.25); @@ -168,7 +168,7 @@ $orange-u2: desaturate($orange,30%); $orange-u3: desaturate($orange,45%); // +Colors - Shadows -// ==================== +// ==================== $shadow: rgba($black, 0.2); $shadow-l1: rgba($black, 0.1); $shadow-l2: rgba($black, 0.05); @@ -176,7 +176,7 @@ $shadow-d1: rgba($black, 0.4); $shadow-d2: rgba($black, 0.6); // +Colors - Application -// ==================== +// ==================== $color-draft: $gray-l3; $color-live: $blue; $color-ready: $green; @@ -190,7 +190,7 @@ $color-copy-base: $gray-l1; $color-copy-emphasized: $gray-d2; // +Timing -// ==================== +// ==================== // used for animation/transition mixin syncing $tmg-s3: 3.0s; $tmg-s2: 2.0s; @@ -201,7 +201,7 @@ $tmg-f2: 0.25s; $tmg-f3: 0.125s; // +Archetype UI -// ==================== +// ==================== $ui-action-primary-color: $blue-u2; $ui-action-primary-color-focus: $blue-s1; @@ -209,12 +209,12 @@ $ui-link-color: $blue-u2; $ui-link-color-focus: $blue-s1; // +Specific UI -// ==================== +// ==================== $ui-notification-height: ($baseline*10); $ui-update-color: $blue-l4; -// +Deprecated -// ==================== +// +Deprecated +// ==================== // do not use, future clean up will use updated styles $baseFontColor: $gray-d2; $lighter-base-font-color: rgb(100,100,100); diff --git a/cms/static/sass/assets/_anims.scss b/cms/static/sass/assets/_anims.scss index 1841430fad..6223ab95f9 100644 --- a/cms/static/sass/assets/_anims.scss +++ b/cms/static/sass/assets/_anims.scss @@ -1,7 +1,7 @@ // studio animations & keyframes // ==================== -// Table of Contents +// Table of Contents // * +Fade In - Extend // * +Fade Out - Extend // * +Rotate Up - Extend @@ -16,7 +16,7 @@ // * +Dropped - Extend // +Fade In - Extend -// ==================== +// ==================== // fade in keyframes @include keyframes(fadeIn) { 0% { @@ -38,9 +38,9 @@ } // +Fade Out - Extend -// ==================== +// ==================== // fade out keyframes -@include keyframes(fadeOut) { +@include keyframes(fadeOut) { 0% { opacity: 1.0; } @@ -60,7 +60,7 @@ } // +Rotate Up - Extend -// ==================== +// ==================== // rotate up keyframes @include keyframes(rotateUp) { 0% { @@ -262,7 +262,7 @@ } } -// flash double animation +// flash double animation %anim-flashDouble { @include animation(flashDouble $tmg-f1 ease-in-out 1); } diff --git a/cms/static/sass/elements/_controls.scss b/cms/static/sass/elements/_controls.scss index 278c1a6478..45df38f5ec 100644 --- a/cms/static/sass/elements/_controls.scss +++ b/cms/static/sass/elements/_controls.scss @@ -1,7 +1,7 @@ // studio - elements - UI controls // ==================== -// Table of Contents +// Table of Contents // * +General Action - Extend // * +General Type and Size - Extend // * +Primary Button - Extends @@ -16,7 +16,7 @@ // +General Action - Extend -// ==================== +// ==================== %action { @extend %ui-fake-link; @@ -28,7 +28,7 @@ } // +General Type and Size - Extend -// ==================== +// ==================== %sizing { @extend %t-action4; padding: ($baseline/4) ($baseline/2) ($baseline/3) ($baseline/2); @@ -36,7 +36,7 @@ // +Primary Button - Extends -// ==================== +// ==================== // gray primary button %btn-primary-gray { @extend %ui-btn-primary; @@ -106,7 +106,7 @@ } // +Secondary Button - Extends -// ==================== +// ==================== // gray secondary button %btn-secondary-gray { @extend %ui-btn-secondary; @@ -193,7 +193,7 @@ } // +Button Element -// ==================== +// ==================== .button { .icon { @@ -385,7 +385,7 @@ cursor: move; } } - + // UI: is draggable .is-draggable { @include transition(border-color $tmg-f2 ease-in-out 0, box-shadow $tmg-f2 ease-in-out 0, margin $tmg-f2 ease-in-out 0); diff --git a/cms/static/sass/elements/_xblocks.scss b/cms/static/sass/elements/_xblocks.scss index 15f71d4d4c..bcea673d8a 100644 --- a/cms/static/sass/elements/_xblocks.scss +++ b/cms/static/sass/elements/_xblocks.scss @@ -4,7 +4,7 @@ // Table of Contents // * +Layout - Xblocks // * +Licensing - Xblocks -// * +Pagination - Xblocks +// * +Pagination - Xblocks // * +Messaging - Xblocks // * +Case: Page Level // * +Case: Nesting Level @@ -14,7 +14,7 @@ // * +Case - Special Xblock Type Overrides -// +Layout - Xblocks +// +Layout - Xblocks // ==================== // styling for xblocks at various levels of nesting: page level, .wrapper-xblock { @@ -116,7 +116,7 @@ } } - // +Licensing - Xblocks + // +Licensing - Xblocks // ==================== .xblock-license, .xmodule_display.xmodule_HtmlModule .xblock-license, @@ -157,7 +157,7 @@ } - // +Pagination - Xblocks + // +Pagination - Xblocks .container-paging-header { .meta-wrap { margin: $baseline ($baseline/2); @@ -910,7 +910,7 @@ div.wrapper-comp-editor.is-inactive ~ div.launch-latex-compiler { @extend %t-copy-sub2; } } - + .wrapper-license-options { margin-bottom: ($baseline/2); diff --git a/cms/static/sass/vendor/bi-app/_bi-app-ltr.scss b/cms/static/sass/vendor/bi-app/_bi-app-ltr.scss index 6278a31380..3b5dfab593 100755 --- a/cms/static/sass/vendor/bi-app/_bi-app-ltr.scss +++ b/cms/static/sass/vendor/bi-app/_bi-app-ltr.scss @@ -1,11 +1,11 @@ // ------------------------------------------ // left to right module -// authors: +// authors: // twitter.com/anasnakawa // twitter.com/victorzamfir -// licensed under the MIT license +// licensed under the MIT license // http://www.opensource.org/licenses/mit-license.php // ------------------------------------------ @import 'variables-ltr'; -@import 'mixins'; \ No newline at end of file +@import 'mixins'; diff --git a/cms/static/sass/vendor/bi-app/_bi-app-rtl.scss b/cms/static/sass/vendor/bi-app/_bi-app-rtl.scss index 17b7f2e90f..2e4b8271d8 100755 --- a/cms/static/sass/vendor/bi-app/_bi-app-rtl.scss +++ b/cms/static/sass/vendor/bi-app/_bi-app-rtl.scss @@ -1,11 +1,11 @@ // ------------------------------------------ // right to left module -// authors: +// authors: // twitter.com/anasnakawa // twitter.com/victorzamfir -// licensed under the MIT license +// licensed under the MIT license // http://www.opensource.org/licenses/mit-license.php // ------------------------------------------ @import 'variables-rtl'; -@import 'mixins'; \ No newline at end of file +@import 'mixins'; diff --git a/cms/static/sass/vendor/bi-app/_variables-ltr.scss b/cms/static/sass/vendor/bi-app/_variables-ltr.scss index 36d5a7b06e..12273051a3 100755 --- a/cms/static/sass/vendor/bi-app/_variables-ltr.scss +++ b/cms/static/sass/vendor/bi-app/_variables-ltr.scss @@ -1,15 +1,15 @@ // ------------------------------------------ // left to right variables to be used by bi-app mixins -// authors: +// authors: // twitter.com/anasnakawa // twitter.com/victorzamfir -// licensed under the MIT license +// licensed under the MIT license // http://www.opensource.org/licenses/mit-license.php // ------------------------------------------ // namespacing variables with bi-app to // avoid conflicting with other global variables -$bi-app-left : left; -$bi-app-right : right; -$bi-app-direction : ltr; -$bi-app-invert-direction: rtl; \ No newline at end of file +$bi-app-left : left; +$bi-app-right : right; +$bi-app-direction : ltr; +$bi-app-invert-direction: rtl; diff --git a/cms/static/sass/vendor/bi-app/_variables-rtl.scss b/cms/static/sass/vendor/bi-app/_variables-rtl.scss index 7300f17863..6b8da0bdbf 100755 --- a/cms/static/sass/vendor/bi-app/_variables-rtl.scss +++ b/cms/static/sass/vendor/bi-app/_variables-rtl.scss @@ -1,15 +1,15 @@ // ------------------------------------------ // right to left variables to be used by bi-app mixins -// authors: +// authors: // twitter.com/anasnakawa // twitter.com/victorzamfir -// licensed under the MIT license +// licensed under the MIT license // http://www.opensource.org/licenses/mit-license.php // ------------------------------------------ // namespacing variables with bi-app to // avoid conflicting with other global variables -$bi-app-left : right; +$bi-app-left : right; $bi-app-right : left; -$bi-app-direction : rtl; -$bi-app-invert-direction: ltr; \ No newline at end of file +$bi-app-direction : rtl; +$bi-app-invert-direction: ltr; diff --git a/cms/static/sass/views/_certificates.scss b/cms/static/sass/views/_certificates.scss index ee0ad2205c..0b231664d6 100644 --- a/cms/static/sass/views/_certificates.scss +++ b/cms/static/sass/views/_certificates.scss @@ -1,7 +1,7 @@ // studio - views - certificates // ==================== -// Table of Contents +// Table of Contents // * +Layout - Certificates // * +Main - Collection // * +Main - Certificate @@ -510,7 +510,7 @@ // * +Signatories -Certificate // ==================== -// TO-DO: refactor to use collection styling where possible. +// TO-DO: refactor to use collection styling where possible. .view-certificates .certificates { .signatory-details, .signatory-edit { @@ -694,4 +694,4 @@ } } } -} \ No newline at end of file +} diff --git a/cms/static/sass/views/_settings.scss b/cms/static/sass/views/_settings.scss index 467a2b464e..822be9f2ba 100644 --- a/cms/static/sass/views/_settings.scss +++ b/cms/static/sass/views/_settings.scss @@ -225,7 +225,7 @@ } } } - + .input-minimum-grade { @include float(left); @include size(92%,100%); diff --git a/common/static/sass/_mixins.scss b/common/static/sass/_mixins.scss index 2b85aa0186..e326dec790 100644 --- a/common/static/sass/_mixins.scss +++ b/common/static/sass/_mixins.scss @@ -1,7 +1,7 @@ // common - utilities - mixins and extends // ==================== -// Table of Contents +// Table of Contents // * +Font Sizing - Mixin // * +Line Height - Mixin // * +Sizing - Mixin @@ -26,34 +26,34 @@ // * +Icon - Font-Awesome - Extend // +Font Sizing - Mixin -// ==================== +// ==================== @mixin font-size($sizeValue: 16){ font-size: $sizeValue + px; font-size: ($sizeValue/10) + rem; } // +Line Height - Mixin -// ==================== +// ==================== @mixin line-height($fontSize: auto){ line-height: ($fontSize*1.48) + px; line-height: (($fontSize/10)*1.48) + rem; } // +Sizing - Mixin -// ==================== +// ==================== @mixin size($width: $baseline, $height: $baseline) { height: $height; width: $width; } // +Square - Mixin -// ==================== +// ==================== @mixin square($size: $baseline) { @include size($size); } // +Placeholder Styling - Mixin -// ==================== +// ==================== @mixin placeholder($color) { :-moz-placeholder { color: $color; @@ -67,7 +67,7 @@ } // +Flex Support - Mixin -// ==================== +// ==================== @mixin ui-flexbox() { display: -webkit-box; display: -moz-box; @@ -77,7 +77,7 @@ } // +Flex PolyFill - Extends -// ==================== +// ==================== // justify-content right for display:flex alignment in older browsers %ui-justify-right-flex { @@ -107,7 +107,7 @@ // +UI - Wrapper - Extends -// ==================== +// ==================== // used for page/view-level wrappers (for centering/grids) %ui-wrapper { @include clearfix(); @@ -128,7 +128,7 @@ } // +UI - Window - Extends -// ==================== +// ==================== %ui-window { @include clearfix(); border-radius: ($baseline/10); @@ -144,13 +144,13 @@ } // +UI - Visual Link - Extends -// ==================== +// ==================== %ui-fake-link { cursor: pointer; } // +UI - Functional Disable - Extends -// ==================== +// ==================== %ui-disabled { pointer-events: none; outline: none; @@ -158,7 +158,7 @@ } // +UI - Depth Levels - Extends -// ==================== +// ==================== %ui-depth0 { z-index: 0; } %ui-depth1 { z-index: 10; } %ui-depth2 { z-index: 100; } @@ -168,7 +168,7 @@ // +UI - Clear Children - Extends -// ==================== +// ==================== // extends - UI - utility - first child clearing %wipe-first-child { @@ -190,7 +190,7 @@ } // +UI - Buttons - Extends -// ==================== +// ==================== %ui-btn { @include box-sizing(border-box); @include transition(color $tmg-f2 ease-in-out 0s, border-color $tmg-f2 ease-in-out 0s, background $tmg-f2 ease-in-out 0s, box-shadow $tmg-f2 ease-in-out 0s); @@ -329,7 +329,7 @@ } // +UI - Well Archetype - Extends -// ==================== +// ==================== %ui-well { box-shadow: inset 0 1px 2px 1px $shadow; padding: ($baseline*0.75) $baseline; @@ -378,7 +378,7 @@ } // +Content - No List - Extends -// ==================== +// ==================== // removes list styling/spacing when using uls, ols for navigation and less content-centric cases %cont-no-list { list-style: none; @@ -393,7 +393,7 @@ } // +Content - Hidden Image Text - Extend -// ==================== +// ==================== // image-replacement hidden text %cont-text-hide { text-indent: 100%; @@ -402,7 +402,7 @@ } // +Content - Screenreader Text - Extend -// ==================== +// ==================== %cont-text-sr { border: 0; clip: rect(0 0 0 0); @@ -415,13 +415,13 @@ } // +Content - Text Wrap - Extend -// ==================== +// ==================== %cont-text-wrap { word-wrap: break-word; } // +Content - Text Truncate - Extend -// ==================== +// ==================== %cont-truncated { @include box-sizing(border-box); overflow: hidden; @@ -430,7 +430,7 @@ } // * +Icon - Font-Awesome - Extend -// ==================== +// ==================== %use-font-awesome { display: inline-block; font-family: FontAwesome; diff --git a/lms/static/sass/_news.scss b/lms/static/sass/_news.scss index 9d73cfc578..d5f31a1b3b 100644 --- a/lms/static/sass/_news.scss +++ b/lms/static/sass/_news.scss @@ -8,7 +8,7 @@ padding-left: $baseline; padding-top: $baseline; padding-bottom: $baseline; - + .notification { @include news-font; margin-top: ($baseline*0.75); diff --git a/lms/static/sass/base/_utilities.scss b/lms/static/sass/base/_utilities.scss index ce32cc4d8d..84e35bc031 100644 --- a/lms/static/sass/base/_utilities.scss +++ b/lms/static/sass/base/_utilities.scss @@ -9,4 +9,4 @@ .sr-is-focusable:focus, .sr-is-focusable:active { @extend %no-outline; -} \ No newline at end of file +} diff --git a/lms/static/sass/course/_open_ended_grading.scss b/lms/static/sass/course/_open_ended_grading.scss index 0ade38b804..e9bf04d938 100644 --- a/lms/static/sass/course/_open_ended_grading.scss +++ b/lms/static/sass/course/_open_ended_grading.scss @@ -29,7 +29,7 @@ padding: ($baseline/2); border: 1px solid black; text-align: center; - + p { font-size: 0.9em; text-align: center; @@ -54,7 +54,7 @@ } .alert-message { - + img { vertical-align: baseline; } diff --git a/lms/static/sass/course/_rubric.scss b/lms/static/sass/course/_rubric.scss index b97eea5cd3..b0830e7881 100644 --- a/lms/static/sass/course/_rubric.scss +++ b/lms/static/sass/course/_rubric.scss @@ -14,7 +14,7 @@ .rubric { margin: 0; color: #3C3C3C; - + tr { margin: 0; height: 100%; @@ -58,7 +58,7 @@ .selected-grade, .selected-grade .rubric-label { background: #666; - color: white; + color: white; } input[type=radio]:checked + .rubric-label { diff --git a/lms/static/sass/course/_staff_grading.scss b/lms/static/sass/course/_staff_grading.scss index 418201d45c..f9a712e877 100644 --- a/lms/static/sass/course/_staff_grading.scss +++ b/lms/static/sass/course/_staff_grading.scss @@ -1,12 +1,12 @@ div.staff-grading, div.peer-grading { border: 1px solid lightgray; - + textarea.feedback-area { margin: 0; height: 75px; } - + div.feedback-area.track-changes { position: relative; margin: 0; @@ -76,7 +76,7 @@ div.peer-grading { min-width: 50px; text-size: 1.5em; } - + /* Toggled State */ input[type=radio]:checked + label { background: #666; @@ -92,15 +92,15 @@ div.peer-grading { width: 100%; table-layout: auto; text-align: center; - + th { padding: ($baseline/10); } - + td { padding: ($baseline/10); } - + td.problem-name { text-align: left; } @@ -124,11 +124,11 @@ div.peer-grading { padding: ($baseline/10); background-color: #ffcccc; } - + .submission-wrapper { padding: ($baseline/10); padding-bottom: ($baseline*0.75); - + h3 { margin-bottom: ($baseline/10); } @@ -140,7 +140,7 @@ div.peer-grading { .meta-info-wrapper { padding: ($baseline/10); background-color: #eee; - + div { display: inline; } @@ -151,7 +151,7 @@ div.peer-grading { padding: ($baseline/10); background-color: $yellow; } - + .breadcrumbs { margin: ($baseline/2) ($baseline/4); font-size: .8em; @@ -162,7 +162,7 @@ div.peer-grading { padding: ($baseline/2); background-color: #eee; font-size: .8em; - + > div { margin-bottom: ($baseline/4); padding: ($baseline/2); @@ -174,7 +174,7 @@ div.peer-grading { text-align: center; text-transform: uppercase; } - + p{ color: #777; } @@ -192,7 +192,7 @@ div.peer-grading { } .current-state { background: $white; - + } } @@ -205,7 +205,7 @@ div.peer-grading { font-size: 1.2em; } } - + .interstitial-page { text-align: center; diff --git a/lms/static/sass/course/_syllabus.scss b/lms/static/sass/course/_syllabus.scss index 8fb103cfd8..c0bd19a456 100644 --- a/lms/static/sass/course/_syllabus.scss +++ b/lms/static/sass/course/_syllabus.scss @@ -27,7 +27,7 @@ div.syllabus { td { padding-top: 15px !important; } - } + } td { border: none !important; @@ -50,7 +50,7 @@ div.syllabus { &.week_separator { padding: 0px !important; - + hr { margin: ($baseline/2); } diff --git a/lms/static/sass/course/_tabs.scss b/lms/static/sass/course/_tabs.scss index f16fc1df3d..62557e0609 100644 --- a/lms/static/sass/course/_tabs.scss +++ b/lms/static/sass/course/_tabs.scss @@ -14,4 +14,4 @@ div.static_tab_wrapper { border: 0; background: transparent !important; } -} \ No newline at end of file +} diff --git a/lms/static/sass/course/_textbook.scss b/lms/static/sass/course/_textbook.scss index ae4a577f63..b24a3a52a2 100755 --- a/lms/static/sass/course/_textbook.scss +++ b/lms/static/sass/course/_textbook.scss @@ -145,7 +145,7 @@ div.book-wrapper { display:none; } } - + &.last { left: 0; diff --git a/lms/static/sass/course/discussion/_form-wmd-toolbar.scss b/lms/static/sass/course/discussion/_form-wmd-toolbar.scss index b443f22566..2caf6cd928 100644 --- a/lms/static/sass/course/discussion/_form-wmd-toolbar.scss +++ b/lms/static/sass/course/discussion/_form-wmd-toolbar.scss @@ -27,45 +27,45 @@ } #wmd-button-row { - position: relative; + position: relative; margin-left: ($baseline/4); margin-right: ($baseline/4); margin-bottom: 0px; margin-top: ($baseline/2); - padding: 0px; + padding: 0px; height: 20px; } .wmd-spacer { - width: 1px; - height: 20px; + width: 1px; + height: 20px; margin-left: 14px; position: absolute; background-color: Silver; - display: inline-block; + display: inline-block; list-style: none; } .wmd-button { - width: 20px; - height: 20px; + width: 20px; + height: 20px; margin-left: ($baseline/4); margin-right: ($baseline/4); position: absolute; background-image: url(../images/wmd-buttons.png); background-repeat: no-repeat; background-position: 0px 0px; - display: inline-block; + display: inline-block; list-style: none; } .wmd-button > a { - width: 20px; - height: 20px; + width: 20px; + height: 20px; margin-left: ($baseline/4); margin-right: ($baseline/4); position: absolute; - display: inline-block; + display: inline-block; } diff --git a/lms/static/sass/course/layout/_courseware_preview.scss b/lms/static/sass/course/layout/_courseware_preview.scss index d56c6945fa..bf35255fc0 100644 --- a/lms/static/sass/course/layout/_courseware_preview.scss +++ b/lms/static/sass/course/layout/_courseware_preview.scss @@ -100,4 +100,4 @@ margin-right: $baseline; } } -} \ No newline at end of file +} diff --git a/lms/static/sass/course/layout/_footer.scss b/lms/static/sass/course/layout/_footer.scss index 8dc0ae540d..7efe6d8ae0 100644 --- a/lms/static/sass/course/layout/_footer.scss +++ b/lms/static/sass/course/layout/_footer.scss @@ -1,4 +1,4 @@ footer { box-shadow: $courseware-footer-shadow; margin-top: $courseware-footer-margin; -} \ No newline at end of file +} diff --git a/lms/static/sass/discussion/elements/_editor.scss b/lms/static/sass/discussion/elements/_editor.scss index 93b1af171b..c0456a3ba8 100644 --- a/lms/static/sass/discussion/elements/_editor.scss +++ b/lms/static/sass/discussion/elements/_editor.scss @@ -41,7 +41,7 @@ // CASE: inline styling // TO-DO: additional styling cleanup here necessary, for now this case was ported over from _discussion.scss .discussion-module { - + .wmd-panel { width: 100%; min-width: 500px; diff --git a/lms/static/sass/discussion/elements/_labels.scss b/lms/static/sass/discussion/elements/_labels.scss index 12f6a46ec5..04e39e2107 100644 --- a/lms/static/sass/discussion/elements/_labels.scss +++ b/lms/static/sass/discussion/elements/_labels.scss @@ -34,4 +34,4 @@ body.discussion, .discussion-module { @include forum-user-label($forum-color-community-ta); } -} \ No newline at end of file +} diff --git a/lms/static/sass/vendor/bi-app/_bi-app-ltr.scss b/lms/static/sass/vendor/bi-app/_bi-app-ltr.scss index 6278a31380..3b5dfab593 100755 --- a/lms/static/sass/vendor/bi-app/_bi-app-ltr.scss +++ b/lms/static/sass/vendor/bi-app/_bi-app-ltr.scss @@ -1,11 +1,11 @@ // ------------------------------------------ // left to right module -// authors: +// authors: // twitter.com/anasnakawa // twitter.com/victorzamfir -// licensed under the MIT license +// licensed under the MIT license // http://www.opensource.org/licenses/mit-license.php // ------------------------------------------ @import 'variables-ltr'; -@import 'mixins'; \ No newline at end of file +@import 'mixins'; diff --git a/lms/static/sass/vendor/bi-app/_bi-app-rtl.scss b/lms/static/sass/vendor/bi-app/_bi-app-rtl.scss index 17b7f2e90f..2e4b8271d8 100755 --- a/lms/static/sass/vendor/bi-app/_bi-app-rtl.scss +++ b/lms/static/sass/vendor/bi-app/_bi-app-rtl.scss @@ -1,11 +1,11 @@ // ------------------------------------------ // right to left module -// authors: +// authors: // twitter.com/anasnakawa // twitter.com/victorzamfir -// licensed under the MIT license +// licensed under the MIT license // http://www.opensource.org/licenses/mit-license.php // ------------------------------------------ @import 'variables-rtl'; -@import 'mixins'; \ No newline at end of file +@import 'mixins'; diff --git a/lms/static/sass/vendor/bi-app/_mixins.scss b/lms/static/sass/vendor/bi-app/_mixins.scss index 353999671d..e02d4d00ac 100755 --- a/lms/static/sass/vendor/bi-app/_mixins.scss +++ b/lms/static/sass/vendor/bi-app/_mixins.scss @@ -1,9 +1,9 @@ // ------------------------------------------ // bi app mixins -// authors: +// authors: // twitter.com/anasnakawa // twitter.com/victorzamfir -// licensed under the MIT license +// licensed under the MIT license // http://www.opensource.org/licenses/mit-license.php // ------------------------------------------ diff --git a/lms/static/sass/vendor/bi-app/_variables-ltr.scss b/lms/static/sass/vendor/bi-app/_variables-ltr.scss index 36d5a7b06e..12273051a3 100755 --- a/lms/static/sass/vendor/bi-app/_variables-ltr.scss +++ b/lms/static/sass/vendor/bi-app/_variables-ltr.scss @@ -1,15 +1,15 @@ // ------------------------------------------ // left to right variables to be used by bi-app mixins -// authors: +// authors: // twitter.com/anasnakawa // twitter.com/victorzamfir -// licensed under the MIT license +// licensed under the MIT license // http://www.opensource.org/licenses/mit-license.php // ------------------------------------------ // namespacing variables with bi-app to // avoid conflicting with other global variables -$bi-app-left : left; -$bi-app-right : right; -$bi-app-direction : ltr; -$bi-app-invert-direction: rtl; \ No newline at end of file +$bi-app-left : left; +$bi-app-right : right; +$bi-app-direction : ltr; +$bi-app-invert-direction: rtl; diff --git a/lms/static/sass/vendor/bi-app/_variables-rtl.scss b/lms/static/sass/vendor/bi-app/_variables-rtl.scss index 7300f17863..6b8da0bdbf 100755 --- a/lms/static/sass/vendor/bi-app/_variables-rtl.scss +++ b/lms/static/sass/vendor/bi-app/_variables-rtl.scss @@ -1,15 +1,15 @@ // ------------------------------------------ // right to left variables to be used by bi-app mixins -// authors: +// authors: // twitter.com/anasnakawa // twitter.com/victorzamfir -// licensed under the MIT license +// licensed under the MIT license // http://www.opensource.org/licenses/mit-license.php // ------------------------------------------ // namespacing variables with bi-app to // avoid conflicting with other global variables -$bi-app-left : right; +$bi-app-left : right; $bi-app-right : left; -$bi-app-direction : rtl; -$bi-app-invert-direction: ltr; \ No newline at end of file +$bi-app-direction : rtl; +$bi-app-invert-direction: ltr; diff --git a/lms/static/sass/views/_account-settings.scss b/lms/static/sass/views/_account-settings.scss index a5d2f7b2f0..18457f6757 100644 --- a/lms/static/sass/views/_account-settings.scss +++ b/lms/static/sass/views/_account-settings.scss @@ -1,7 +1,7 @@ // lms - application - account settings // ==================== -// Table of Contents +// Table of Contents // * +Container - Account Settings // * +Main - Header // * +Settings Section @@ -13,7 +13,7 @@ padding-top: ($baseline*2); .account-settings-container { - padding: 0; + padding: 0; } .ui-loading-indicator, diff --git a/static/vendor/bi-app/_bi-app-ltr.scss b/static/vendor/bi-app/_bi-app-ltr.scss index 6278a31380..3b5dfab593 100755 --- a/static/vendor/bi-app/_bi-app-ltr.scss +++ b/static/vendor/bi-app/_bi-app-ltr.scss @@ -1,11 +1,11 @@ // ------------------------------------------ // left to right module -// authors: +// authors: // twitter.com/anasnakawa // twitter.com/victorzamfir -// licensed under the MIT license +// licensed under the MIT license // http://www.opensource.org/licenses/mit-license.php // ------------------------------------------ @import 'variables-ltr'; -@import 'mixins'; \ No newline at end of file +@import 'mixins'; diff --git a/static/vendor/bi-app/_bi-app-rtl.scss b/static/vendor/bi-app/_bi-app-rtl.scss index 17b7f2e90f..2e4b8271d8 100755 --- a/static/vendor/bi-app/_bi-app-rtl.scss +++ b/static/vendor/bi-app/_bi-app-rtl.scss @@ -1,11 +1,11 @@ // ------------------------------------------ // right to left module -// authors: +// authors: // twitter.com/anasnakawa // twitter.com/victorzamfir -// licensed under the MIT license +// licensed under the MIT license // http://www.opensource.org/licenses/mit-license.php // ------------------------------------------ @import 'variables-rtl'; -@import 'mixins'; \ No newline at end of file +@import 'mixins'; diff --git a/static/vendor/bi-app/_mixins.scss b/static/vendor/bi-app/_mixins.scss index 353999671d..e02d4d00ac 100755 --- a/static/vendor/bi-app/_mixins.scss +++ b/static/vendor/bi-app/_mixins.scss @@ -1,9 +1,9 @@ // ------------------------------------------ // bi app mixins -// authors: +// authors: // twitter.com/anasnakawa // twitter.com/victorzamfir -// licensed under the MIT license +// licensed under the MIT license // http://www.opensource.org/licenses/mit-license.php // ------------------------------------------ diff --git a/static/vendor/bi-app/_variables-ltr.scss b/static/vendor/bi-app/_variables-ltr.scss index 36d5a7b06e..12273051a3 100755 --- a/static/vendor/bi-app/_variables-ltr.scss +++ b/static/vendor/bi-app/_variables-ltr.scss @@ -1,15 +1,15 @@ // ------------------------------------------ // left to right variables to be used by bi-app mixins -// authors: +// authors: // twitter.com/anasnakawa // twitter.com/victorzamfir -// licensed under the MIT license +// licensed under the MIT license // http://www.opensource.org/licenses/mit-license.php // ------------------------------------------ // namespacing variables with bi-app to // avoid conflicting with other global variables -$bi-app-left : left; -$bi-app-right : right; -$bi-app-direction : ltr; -$bi-app-invert-direction: rtl; \ No newline at end of file +$bi-app-left : left; +$bi-app-right : right; +$bi-app-direction : ltr; +$bi-app-invert-direction: rtl; diff --git a/static/vendor/bi-app/_variables-rtl.scss b/static/vendor/bi-app/_variables-rtl.scss index 7300f17863..6b8da0bdbf 100755 --- a/static/vendor/bi-app/_variables-rtl.scss +++ b/static/vendor/bi-app/_variables-rtl.scss @@ -1,15 +1,15 @@ // ------------------------------------------ // right to left variables to be used by bi-app mixins -// authors: +// authors: // twitter.com/anasnakawa // twitter.com/victorzamfir -// licensed under the MIT license +// licensed under the MIT license // http://www.opensource.org/licenses/mit-license.php // ------------------------------------------ // namespacing variables with bi-app to // avoid conflicting with other global variables -$bi-app-left : right; +$bi-app-left : right; $bi-app-right : left; -$bi-app-direction : rtl; -$bi-app-invert-direction: ltr; \ No newline at end of file +$bi-app-direction : rtl; +$bi-app-invert-direction: ltr; From 8285c9d8298686f2f58b9f8ce702e87d4b5a73d1 Mon Sep 17 00:00:00 2001 From: Eric Fischer Date: Mon, 14 Sep 2015 13:37:37 -0400 Subject: [PATCH 24/54] Removing extraneous IE search clear button Taken from http://stackoverflow.com/questions/14007655/remove-ie10s-clear-field-x-button-on-certain-inputs. Not yet tested, but will be soon. --- lms/static/sass/_developer.scss | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lms/static/sass/_developer.scss b/lms/static/sass/_developer.scss index 244ec94d5b..ac6f48daf1 100644 --- a/lms/static/sass/_developer.scss +++ b/lms/static/sass/_developer.scss @@ -312,6 +312,13 @@ font: inherit; } } + //end instructor tools scratch space + + //efischer TNL-3226 + .search-field::-ms-clear { + width: 0px; + height: 0px; + } } //efischer - TNL-3189 From d563a3e921be5b88a1998f50e80606691e52ce79 Mon Sep 17 00:00:00 2001 From: Mushtaq Ali Date: Tue, 15 Sep 2015 17:46:18 +0500 Subject: [PATCH 25/54] Fix Mathjax rendering bug --- common/lib/xmodule/xmodule/css/capa/display.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/lib/xmodule/xmodule/css/capa/display.scss b/common/lib/xmodule/xmodule/css/capa/display.scss index cf441cb462..8d4e35b9c4 100644 --- a/common/lib/xmodule/xmodule/css/capa/display.scss +++ b/common/lib/xmodule/xmodule/css/capa/display.scss @@ -379,7 +379,7 @@ div.problem { } > span { - display: block; + display: inline-block; margin-bottom: lh(0.5); } From 4dbd81451f859f1dcb28dc1480e12126e88e5892 Mon Sep 17 00:00:00 2001 From: David Baumgold Date: Tue, 15 Sep 2015 10:19:55 -0400 Subject: [PATCH 26/54] Internationalize course re-run strings --- cms/templates/index.html | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cms/templates/index.html b/cms/templates/index.html index 92efdd0d81..0d2da0b6de 100644 --- a/cms/templates/index.html +++ b/cms/templates/index.html @@ -227,10 +227,11 @@
    -
    This re-run processing status:
    + ## Translators: This is a status message for the course re-runs feature. When a course admin indicates that a course should be re-run, the system needs to process that and get the new course re-run ready to go. The status of that re-run process will follow this text. +
    ${_("This re-run processing status:")}
    - Configuration Error + ${_("Configuration Error")}
    From 68198845ed0a6f8b73419255500733c811513b05 Mon Sep 17 00:00:00 2001 From: Omar Al-Ithawi Date: Tue, 8 Sep 2015 17:23:41 +0300 Subject: [PATCH 27/54] Watch and process JS and CSS xmodule assets --- pavelib/assets.py | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/pavelib/assets.py b/pavelib/assets.py index be50c9eee0..fd9f188d29 100644 --- a/pavelib/assets.py +++ b/pavelib/assets.py @@ -109,6 +109,30 @@ class XModuleSassWatcher(SassWatcher): traceback.print_exc() +class XModuleAssetsWatcher(PatternMatchingEventHandler): + """ + Watches for css and js file changes + """ + ignore_directories = True + patterns = ['*.css', '*.js'] + + def register(self, observer): + """ + Register files with observer + """ + observer.schedule(self, 'common/lib/xmodule/', recursive=True) + + def on_modified(self, event): + print('\tCHANGED:', event.src_path) + try: + process_xmodule_assets() + except Exception: # pylint: disable=broad-except + traceback.print_exc() + + # To refresh the hash values of static xmodule content + restart_django_servers() + + def coffeescript_files(): """ return find command for paths containing coffee files @@ -181,6 +205,17 @@ def process_xmodule_assets(): sh('xmodule_assets common/static/xmodule') +def restart_django_servers(): + """ + Restart the django server. + + `$ touch` makes the Django file watcher thinks that something has changed, therefore + it restarts the server. + """ + sh(cmd( + "touch", 'lms/urls.py', 'cms/urls.py', + )) + def collect_assets(systems, settings): """ Collect static assets, including Django pipeline processing. @@ -206,6 +241,7 @@ def watch_assets(options): CoffeeScriptWatcher().register(observer) SassWatcher().register(observer) XModuleSassWatcher().register(observer) + XModuleAssetsWatcher().register(observer) print("Starting asset watcher...") observer.start() From 82c0206ca6a1fe198bba97b58fdaa7b2b51fb656 Mon Sep 17 00:00:00 2001 From: Omar Al-Ithawi Date: Tue, 15 Sep 2015 15:55:51 +0300 Subject: [PATCH 28/54] Added messages after assets process steps --- pavelib/assets.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pavelib/assets.py b/pavelib/assets.py index fd9f188d29..3089cd786b 100644 --- a/pavelib/assets.py +++ b/pavelib/assets.py @@ -187,6 +187,8 @@ def compile_sass(options): sh(cmd(*parts)) + print("\t\tFinished compiling sass.") + def compile_templated_sass(systems, settings): """ @@ -196,6 +198,7 @@ def compile_templated_sass(systems, settings): """ for sys in systems: sh(django_cmd(sys, settings, 'preprocess_assets')) + print("\t\tFinished preprocessing {} assets.".format(sys)) def process_xmodule_assets(): @@ -203,6 +206,7 @@ def process_xmodule_assets(): Process XModule static assets. """ sh('xmodule_assets common/static/xmodule') + print("\t\tFinished processing xmodule assets.") def restart_django_servers(): @@ -216,6 +220,7 @@ def restart_django_servers(): "touch", 'lms/urls.py', 'cms/urls.py', )) + def collect_assets(systems, settings): """ Collect static assets, including Django pipeline processing. @@ -224,6 +229,7 @@ def collect_assets(systems, settings): """ for sys in systems: sh(django_cmd(sys, settings, "collectstatic --noinput > /dev/null")) + print("\t\tFinished collecting {} assets.".format(sys)) @task From 9b34ab51bdb48f64ea0ce93d1473fafb54563cb4 Mon Sep 17 00:00:00 2001 From: David Baumgold Date: Tue, 15 Sep 2015 11:22:10 -0400 Subject: [PATCH 29/54] Break translators comments across multiple lines --- cms/templates/index.html | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/cms/templates/index.html b/cms/templates/index.html index 0d2da0b6de..15e4dff3cd 100644 --- a/cms/templates/index.html +++ b/cms/templates/index.html @@ -61,7 +61,8 @@
    1. - ## Translators: This is an example name for a new course, seen when filling out the form to create a new course. + ## Translators: This is an example name for a new course, seen when + ## filling out the form to create a new course. ${_("The public display name for your course. This cannot be changed, but you can set a different display name in Advanced Settings later.")} @@ -77,7 +78,9 @@
    2. - ## Translators: This is an example for the number used to identify a course, seen when filling out the form to create a new course. The number here is short for "Computer Science 101". It can contain letters but cannot contain spaces. + ## Translators: This is an example for the number used to identify a course, + ## seen when filling out the form to create a new course. The number here is + ## short for "Computer Science 101". It can contain letters but cannot contain spaces. ${_("The unique number that identifies your course within your organization.")} ${_("Note: This is part of your course URL, so no spaces or special characters are allowed and it cannot be changed.")} @@ -85,7 +88,8 @@
    3. - ## Translators: This is an example for the "run" used to identify different instances of a course, seen when filling out the form to create a new course. + ## Translators: This is an example for the "run" used to identify different + ## instances of a course, seen when filling out the form to create a new course. ${_("The term in which your course will run.")} ${_("Note: This is part of your course URL, so no spaces or special characters are allowed and it cannot be changed.")} @@ -123,7 +127,9 @@
      1. - ## Translators: This is an example name for a new content library, seen when filling out the form to create a new library. (A library is a collection of content or problems.) + ## Translators: This is an example name for a new content library, seen when + ## filling out the form to create a new library. + ## (A library is a collection of content or problems.) ${_("The public display name for your library.")} @@ -137,7 +143,10 @@
      2. - ## Translators: This is an example for the "code" used to identify a library, seen when filling out the form to create a new library. This example is short for "Computer Science Problems". The example number may contain letters but must not contain spaces. + ## Translators: This is an example for the "code" used to identify a library, + ## seen when filling out the form to create a new library. This example is short + ## for "Computer Science Problems". The example number may contain letters + ## but must not contain spaces. ${_("The unique code that identifies this library.")} ${_("Note: This is part of your library URL, so no spaces or special characters are allowed.")} ${_("This cannot be changed.")} @@ -188,7 +197,11 @@
        ${_("This course run is currently being created.")}
        - ## Translators: This is a status message, used to inform the user of what the system is doing. This status means that the user has requested to re-run an existing course, and the system is currently in the process of duplicating and configuring the existing course so that it can be re-run. + ## Translators: This is a status message, used to inform the user of + ## what the system is doing. This status means that the user has + ## requested to re-run an existing course, and the system is currently + ## in the process of duplicating and configuring the existing course + ## so that it can be re-run. ${_("Configuring as re-run")}
        @@ -227,7 +240,10 @@
        - ## Translators: This is a status message for the course re-runs feature. When a course admin indicates that a course should be re-run, the system needs to process that and get the new course re-run ready to go. The status of that re-run process will follow this text. + ## Translators: This is a status message for the course re-runs feature. + ## When a course admin indicates that a course should be re-run, the system + ## needs to process that and get the new course re-run ready to go. + ## The status of that re-run process will follow this text.
        ${_("This re-run processing status:")}
        From 61419cefa5aa5edf0808abc65e24b75243a1a68b Mon Sep 17 00:00:00 2001 From: David Baumgold Date: Tue, 15 Sep 2015 11:23:09 -0400 Subject: [PATCH 30/54] Re-word translators comment --- cms/templates/index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cms/templates/index.html b/cms/templates/index.html index 15e4dff3cd..0834383dd1 100644 --- a/cms/templates/index.html +++ b/cms/templates/index.html @@ -242,8 +242,8 @@
        ## Translators: This is a status message for the course re-runs feature. ## When a course admin indicates that a course should be re-run, the system - ## needs to process that and get the new course re-run ready to go. - ## The status of that re-run process will follow this text. + ## needs to process the request and prepare the new course. The status of + ## the process will follow this text.
        ${_("This re-run processing status:")}
        From 33f559b04a8c7a3e3254e5a6a5c17da4b14dca7e Mon Sep 17 00:00:00 2001 From: Peter Fogg Date: Tue, 15 Sep 2015 12:52:15 -0400 Subject: [PATCH 31/54] Remove membership field from teams when serializing memberships. TNL-3281 --- lms/djangoapps/teams/serializers.py | 15 +++++++++++++-- lms/djangoapps/teams/tests/test_serializers.py | 5 +---- openedx/core/lib/api/fields.py | 3 --- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/lms/djangoapps/teams/serializers.py b/lms/djangoapps/teams/serializers.py index dae2578bd2..f51ad9e61c 100644 --- a/lms/djangoapps/teams/serializers.py +++ b/lms/djangoapps/teams/serializers.py @@ -90,6 +90,18 @@ class CourseTeamCreationSerializer(serializers.ModelSerializer): ) +class CourseTeamSerializerWithoutMembership(CourseTeamSerializer): + """The same as the `CourseTeamSerializer`, but elides the membership field. + + Intended to be used as a sub-serializer for serializing team + memberships, since the membership field is redundant in that case. + """ + + def __init__(self, *args, **kwargs): + super(CourseTeamSerializerWithoutMembership, self).__init__(*args, **kwargs) + del self.fields['membership'] + + class MembershipSerializer(serializers.ModelSerializer): """Serializes CourseTeamMemberships with information about both teams and users.""" profile_configuration = deepcopy(settings.ACCOUNT_VISIBILITY_CONFIGURATION) @@ -112,8 +124,7 @@ class MembershipSerializer(serializers.ModelSerializer): view_name='teams_detail', read_only=True, ), - expanded_serializer=CourseTeamSerializer(read_only=True), - exclude_expand_fields={'user'}, + expanded_serializer=CourseTeamSerializerWithoutMembership(read_only=True), ) class Meta(object): diff --git a/lms/djangoapps/teams/tests/test_serializers.py b/lms/djangoapps/teams/tests/test_serializers.py index df2dffdf22..123b2f793b 100644 --- a/lms/djangoapps/teams/tests/test_serializers.py +++ b/lms/djangoapps/teams/tests/test_serializers.py @@ -70,10 +70,7 @@ class MembershipSerializerTestCase(SerializerTestCase): 'has_image': False } }) - self.assertEqual(data['team']['membership'][0]['user'], { - 'url': 'http://testserver/api/user/v1/accounts/' + username, - 'username': username - }) + self.assertNotIn('membership', data['team']) class BaseTopicSerializerTestCase(SerializerTestCase): diff --git a/openedx/core/lib/api/fields.py b/openedx/core/lib/api/fields.py index e46bd9dea3..0a1d609997 100644 --- a/openedx/core/lib/api/fields.py +++ b/openedx/core/lib/api/fields.py @@ -10,21 +10,18 @@ class ExpandableField(Field): Kwargs: collapsed_serializer (Serializer): the serializer to use for a non-expanded representation. expanded_serializer (Serializer): the serializer to use for an expanded representation. - exclude_expand_fields (set(str)): a set of fields which will not be expanded by sub-serializers. """ def __init__(self, **kwargs): """Sets up the ExpandableField with the collapsed and expanded versions of the serializer.""" assert 'collapsed_serializer' in kwargs and 'expanded_serializer' in kwargs self.collapsed = kwargs.pop('collapsed_serializer') self.expanded = kwargs.pop('expanded_serializer') - self.exclude_expand_fields = kwargs.pop('exclude_expand_fields', set()) super(ExpandableField, self).__init__(**kwargs) def field_to_native(self, obj, field_name): """Converts obj to a native representation, using the expanded serializer if the context requires it.""" if 'expand' in self.context and field_name in self.context['expand']: self.expanded.initialize(self, field_name) - self.expanded.context['expand'] = list(set(self.expanded.context['expand']) - self.exclude_expand_fields) return self.expanded.field_to_native(obj, field_name) else: self.collapsed.initialize(self, field_name) From 754145a1801390a931bf28f1de7fc2022fdc0789 Mon Sep 17 00:00:00 2001 From: Ben Patterson Date: Tue, 15 Sep 2015 15:19:38 -0400 Subject: [PATCH 32/54] Rebalance. Shard_5 is getting long comparatively. --- common/test/acceptance/tests/lms/test_lms.py | 18 +++++++++--------- .../tests/lms/test_lms_instructor_dashboard.py | 6 +++--- .../tests/studio/test_studio_library.py | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/common/test/acceptance/tests/lms/test_lms.py b/common/test/acceptance/tests/lms/test_lms.py index cd9cedd386..a0ee88c801 100644 --- a/common/test/acceptance/tests/lms/test_lms.py +++ b/common/test/acceptance/tests/lms/test_lms.py @@ -480,7 +480,7 @@ class PayAndVerifyTest(EventsTestMixin, UniqueCourseTest): self.assertEqual(enrollment_mode, 'verified') -@attr('shard_5') +@attr('shard_1') class CourseWikiTest(UniqueCourseTest): """ Tests that verify the course wiki. @@ -534,7 +534,7 @@ class CourseWikiTest(UniqueCourseTest): self.assertEqual(content, actual_content) -@attr('shard_5') +@attr('shard_1') class HighLevelTabTest(UniqueCourseTest): """ Tests that verify each of the high-level tabs available within a course. @@ -720,7 +720,7 @@ class PDFTextBooksTabTest(UniqueCourseTest): self.tab_nav.go_to_tab("PDF Book {}".format(i)) -@attr('shard_5') +@attr('shard_1') class VideoTest(UniqueCourseTest): """ Navigate to a video in the courseware and play it. @@ -791,7 +791,7 @@ class VideoTest(UniqueCourseTest): self.assertGreaterEqual(self.video.duration, self.video.elapsed_time) -@attr('shard_5') +@attr('shard_1') class VisibleToStaffOnlyTest(UniqueCourseTest): """ Tests that content with visible_to_staff_only set to True cannot be viewed by students. @@ -876,7 +876,7 @@ class VisibleToStaffOnlyTest(UniqueCourseTest): self.assertEqual(["Html Child in visible unit"], self.course_nav.sequence_items) -@attr('shard_5') +@attr('shard_1') class TooltipTest(UniqueCourseTest): """ Tests that tooltips are displayed @@ -921,7 +921,7 @@ class TooltipTest(UniqueCourseTest): self.assertTrue(self.courseware_page.tooltips_displayed()) -@attr('shard_5') +@attr('shard_1') class PreRequisiteCourseTest(UniqueCourseTest): """ Tests that pre-requisite course messages are displayed @@ -1006,7 +1006,7 @@ class PreRequisiteCourseTest(UniqueCourseTest): self.settings_page.save_changes() -@attr('shard_5') +@attr('shard_1') class ProblemExecutionTest(UniqueCourseTest): """ Tests of problems. @@ -1085,7 +1085,7 @@ class ProblemExecutionTest(UniqueCourseTest): self.assertFalse(problem_page.is_correct()) -@attr('shard_5') +@attr('shard_1') class EntranceExamTest(UniqueCourseTest): """ Tests that course has an entrance exam. @@ -1156,7 +1156,7 @@ class EntranceExamTest(UniqueCourseTest): )) -@attr('shard_5') +@attr('shard_1') class NotLiveRedirectTest(UniqueCourseTest): """ Test that a banner is shown when the user is redirected to diff --git a/common/test/acceptance/tests/lms/test_lms_instructor_dashboard.py b/common/test/acceptance/tests/lms/test_lms_instructor_dashboard.py index 5ed63fa973..b3e7c4d852 100644 --- a/common/test/acceptance/tests/lms/test_lms_instructor_dashboard.py +++ b/common/test/acceptance/tests/lms/test_lms_instructor_dashboard.py @@ -44,7 +44,7 @@ class BaseInstructorDashboardTest(EventsTestMixin, UniqueCourseTest): return instructor_dashboard_page -@attr('shard_5') +@attr('shard_1') class AutoEnrollmentWithCSVTest(BaseInstructorDashboardTest): """ End-to-end tests for Auto-Registration and enrollment functionality via CSV file. @@ -265,7 +265,7 @@ class ProctoredExamsTest(BaseInstructorDashboardTest): self.assertFalse(exam_attempts_section.is_student_attempt_visible) -@attr('shard_5') +@attr('shard_1') class EntranceExamGradeTest(BaseInstructorDashboardTest): """ Tests for Entrance exam specific student grading tasks. @@ -557,7 +557,7 @@ class DataDownloadsTest(BaseInstructorDashboardTest): self.verify_report_download(report_name) -@attr('shard_5') +@attr('shard_1') class CertificatesTest(BaseInstructorDashboardTest): """ Tests for Certificates functionality on instructor dashboard. diff --git a/common/test/acceptance/tests/studio/test_studio_library.py b/common/test/acceptance/tests/studio/test_studio_library.py index ca3f0a0150..3094499285 100644 --- a/common/test/acceptance/tests/studio/test_studio_library.py +++ b/common/test/acceptance/tests/studio/test_studio_library.py @@ -186,7 +186,7 @@ class LibraryEditPageTest(StudioLibraryTest): self.assertIn("Checkboxes", problem_block.name) -@attr('shard_5') +@attr('shard_2') @ddt class LibraryNavigationTest(StudioLibraryTest): """ From 07664389b77b8a07eb4d7e46967888012b8047fc Mon Sep 17 00:00:00 2001 From: Sarina Canelake Date: Tue, 15 Sep 2015 21:15:48 -0400 Subject: [PATCH 33/54] Fix Translator comment syntax in Mako templates [TNL-3277] --- lms/templates/courseware/course_about.html | 4 ++-- lms/templates/courseware/progress.html | 2 +- lms/templates/shoppingcart/shopping_cart.html | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lms/templates/courseware/course_about.html b/lms/templates/courseware/course_about.html index 86f094b45b..870d4785ed 100644 --- a/lms/templates/courseware/course_about.html +++ b/lms/templates/courseware/course_about.html @@ -242,8 +242,8 @@ from edxmako.shortcuts import marketing_link site_domain = microsite.get_value('site_domain', settings.SITE_NAME) platform_name = microsite.get_value('platform_name', settings.PLATFORM_NAME) - # Translators: This text will be automatically posted to the student's - # Twitter account. {url} should appear at the end of the text. + ## Translators: This text will be automatically posted to the student's + ## Twitter account. {url} should appear at the end of the text. tweet_text = _("I just registered for {number} {title} through {account}: {url}").format( number=course.number, title=get_course_about_section(course, 'title'), diff --git a/lms/templates/courseware/progress.html b/lms/templates/courseware/progress.html index b1fe59fd91..1f2806994f 100644 --- a/lms/templates/courseware/progress.html +++ b/lms/templates/courseware/progress.html @@ -75,7 +75,7 @@ from django.utils.http import urlquote_plus %elif is_generating:
        - # Translators: This message appears to users when the system is processessing course certificates, which can take a few hours. + ## Translators: This message appears to users when the system is processessing course certificates, which can take a few hours.

        ${_("We're working on it...")}

        ${_("We're creating your certificate. You can keep working in your courses and a link to it will appear here and on your Dashboard when it is ready.")}

        diff --git a/lms/templates/shoppingcart/shopping_cart.html b/lms/templates/shoppingcart/shopping_cart.html index 14ceab73c4..9d2a4b53a7 100644 --- a/lms/templates/shoppingcart/shopping_cart.html +++ b/lms/templates/shoppingcart/shopping_cart.html @@ -15,7 +15,7 @@ from django.utils.translation import ungettext % if is_course_enrollment_closed: <% - # Translators: course_names is a comma-separated list of one or more course names + ## Translators: course_names is a comma-separated list of one or more course names expiry_message = ungettext( "{course_names} has been removed because the enrollment period has closed.", "{course_names} have been removed because the enrollment period has closed.", From 764cd862bda57a863c01d9f28bf8f501a508f2ba Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Wed, 16 Sep 2015 11:22:36 -0400 Subject: [PATCH 34/54] Mako comments have to be double-hash, or they are included on the page. --- cms/templates/course_info.html | 2 +- lms/templates/sysadmin_dashboard_gitlogs.html | 4 ++-- lms/templates/verify_student/pay_and_verify.html | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cms/templates/course_info.html b/cms/templates/course_info.html index bbb5e12d72..a770fd9049 100644 --- a/cms/templates/course_info.html +++ b/cms/templates/course_info.html @@ -7,7 +7,7 @@ from django.utils.translation import ugettext as _ from django.template.defaultfilters import escapejs %> - +## TODO decode course # from context_course into title. <%block name="title">${_("Course Updates")} <%block name="bodyclass">is-signedin course course-info updates view-updates diff --git a/lms/templates/sysadmin_dashboard_gitlogs.html b/lms/templates/sysadmin_dashboard_gitlogs.html index a105894da0..df1f571553 100644 --- a/lms/templates/sysadmin_dashboard_gitlogs.html +++ b/lms/templates/sysadmin_dashboard_gitlogs.html @@ -189,11 +189,11 @@ textarea { %else:
        %if not course_id: - # If viewing all logs there are no logs available, let the user know + ## If viewing all logs there are no logs available, let the user know. ## Translators: git is a version-control system; see http://git-scm.com/about ${_('No git import logs have been recorded.')} %else: - # If viewing a single course and there are no logs available, let the user know + ## If viewing a single course and there are no logs available, let the user know. ## Translators: git is a version-control system; see http://git-scm.com/about ${_('No git import logs have been recorded for this course.')} %endif diff --git a/lms/templates/verify_student/pay_and_verify.html b/lms/templates/verify_student/pay_and_verify.html index 2e1dc3c2e7..e4e850eb94 100644 --- a/lms/templates/verify_student/pay_and_verify.html +++ b/lms/templates/verify_student/pay_and_verify.html @@ -76,9 +76,9 @@ from verify_student.views import PayAndVerifyView data-verification-good-until='${verification_good_until}' data-capture-sound='${capture_sound}' - # If we reached the verification flow from an in-course checkpoint, - # then pass the checkpoint location in so that we can associate - # the attempt with the checkpoint on submission. + ## If we reached the verification flow from an in-course checkpoint, + ## then pass the checkpoint location in so that we can associate + ## the attempt with the checkpoint on submission. % if checkpoint_location is not None: data-checkpoint-location='${checkpoint_location}' % endif From cf80c07c14b0ab49f9ec0c4e74c3856ad28bdc4c Mon Sep 17 00:00:00 2001 From: Zia Fazal Date: Fri, 11 Sep 2015 16:27:33 +0500 Subject: [PATCH 35/54] moved variables from template to view fixed broken tests and quality violations moved twitter_url to view also escaped string for js --- .../certificates/tests/test_webview_views.py | 6 +- lms/djangoapps/certificates/views/webview.py | 41 +++++++++++- .../certificates/_accomplishment-banner.html | 64 +++++++------------ .../certificates/_accomplishment-header.html | 2 +- .../_accomplishment-rendering.html | 5 +- 5 files changed, 65 insertions(+), 53 deletions(-) diff --git a/lms/djangoapps/certificates/tests/test_webview_views.py b/lms/djangoapps/certificates/tests/test_webview_views.py index 417e5126bb..929350263a 100644 --- a/lms/djangoapps/certificates/tests/test_webview_views.py +++ b/lms/djangoapps/certificates/tests/test_webview_views.py @@ -477,12 +477,12 @@ class CertificatesViewsTests(ModuleStoreTestCase, EventTrackingTestCase): response = self.client.get(test_url) self.assertEqual(response.status_code, 200) self.assertContains(response, 'lang: fr') - self.assertContains(response, 'course name: {}'.format(self.course.display_name)) + self.assertContains(response, 'course name: course_title_0') # test with second organization template response = self.client.get(test_url) self.assertEqual(response.status_code, 200) self.assertContains(response, 'lang: fr') - self.assertContains(response, 'course name: {}'.format(self.course.display_name)) + self.assertContains(response, 'course name: course_title_0') @override_settings(FEATURES=FEATURES_WITH_CUSTOM_CERTS_ENABLED) def test_certificate_custom_template_with_org(self): @@ -503,7 +503,7 @@ class CertificatesViewsTests(ModuleStoreTestCase, EventTrackingTestCase): ] response = self.client.get(test_url) self.assertEqual(response.status_code, 200) - self.assertContains(response, 'course name: {}'.format(self.course.display_name)) + self.assertContains(response, 'course name: course_title_0') @override_settings(FEATURES=FEATURES_WITH_CUSTOM_CERTS_ENABLED) def test_certificate_custom_template_with_course_mode(self): diff --git a/lms/djangoapps/certificates/views/webview.py b/lms/djangoapps/certificates/views/webview.py index f4e010df73..15f339c155 100644 --- a/lms/djangoapps/certificates/views/webview.py +++ b/lms/djangoapps/certificates/views/webview.py @@ -4,12 +4,14 @@ Certificate HTML webview. from datetime import datetime from uuid import uuid4 import logging +import urllib from django.conf import settings from django.contrib.auth.models import User from django.http import HttpResponse from django.template import RequestContext from django.utils.translation import ugettext as _ +from django.core.urlresolvers import reverse from courseware.courses import course_image_url from edxmako.shortcuts import render_to_response @@ -105,9 +107,27 @@ def _update_certificate_context(context, course, user, user_certificate): context['accomplishment_copy_name'] = user_fullname context['accomplishment_copy_username'] = user.username context['accomplishment_copy_course_org'] = partner_short_name - context['accomplishment_copy_course_name'] = course.display_name - context['course_image_url'] = course_image_url(course) - context['share_settings'] = settings.FEATURES.get('SOCIAL_SHARING_SETTINGS', {}) + course_title_from_cert = context['certificate_data'].get('course_title', '') + accomplishment_copy_course_name = course_title_from_cert if course_title_from_cert else course.display_name + context['accomplishment_copy_course_name'] = accomplishment_copy_course_name + share_settings = settings.FEATURES.get('SOCIAL_SHARING_SETTINGS', {}) + context['facebook_share_enabled'] = share_settings.get('CERTIFICATE_FACEBOOK', False) + context['facebook_app_id'] = getattr(settings, "FACEBOOK_APP_ID", None) + context['facebook_share_text'] = share_settings.get( + 'CERTIFICATE_FACEBOOK_TEXT', + _("I completed the {course_title} course on {platform_name}.").format( + course_title=accomplishment_copy_course_name, + platform_name=platform_name + ) + ) + context['twitter_share_enabled'] = share_settings.get('CERTIFICATE_TWITTER', False) + context['twitter_share_text'] = share_settings.get( + 'CERTIFICATE_TWITTER_TEXT', + _("I completed a course on {platform_name}. Take a look at my certificate.").format( + platform_name=platform_name + ) + ) + context['course_number'] = course.number try: badge = BadgeAssertion.objects.get(user=user, course_id=course.location.course_key) @@ -374,6 +394,19 @@ def render_html_view(request, user_id, course_id): # Append/Override the existing view context values with request-time values _update_certificate_context(context, course, user, user_certificate) + share_url = request.build_absolute_uri( + reverse( + 'certificates:html_view', + kwargs=dict(user_id=str(user_id), course_id=unicode(course_id)) + ) + ) + context['share_url'] = share_url + twitter_url = 'https://twitter.com/intent/tweet?text={twitter_share_text}&url={share_url}'.format( + twitter_share_text=context['twitter_share_text'], + share_url=urllib.quote_plus(share_url) + ) + context['twitter_url'] = twitter_url + context['full_course_image_url'] = request.build_absolute_uri(course_image_url(course)) # If enabled, show the LinkedIn "add to profile" button # Clicking this button sends the user to LinkedIn where they @@ -389,6 +422,8 @@ def render_html_view(request, user_id, course_id): course_id=unicode(course.id) )) ) + else: + context['linked_in_url'] = None # Microsites will need to be able to override any hard coded # content that was put into the context in the diff --git a/lms/templates/certificates/_accomplishment-banner.html b/lms/templates/certificates/_accomplishment-banner.html index 466f2e3615..41e8d82445 100644 --- a/lms/templates/certificates/_accomplishment-banner.html +++ b/lms/templates/certificates/_accomplishment-banner.html @@ -1,19 +1,13 @@ <%! -import urllib from django.utils.translation import ugettext as _ -from django.core.urlresolvers import reverse +from django.template.defaultfilters import escapejs %> <%namespace name='static' file='../static_content.html'/> -<% - accomplishment_course_title = accomplishment_copy_course_name - if certificate_data and certificate_data.get('course_title', ''): - accomplishment_course_title = certificate_data.get('course_title', '') -%> <%block name="js_extra"> <%static:js group='certificates_wv'/> diff --git a/lms/templates/ccx/enrollment.html b/lms/templates/ccx/enrollment.html index 2d054da3e4..c26dfac6f7 100644 --- a/lms/templates/ccx/enrollment.html +++ b/lms/templates/ccx/enrollment.html @@ -46,13 +46,21 @@
        -
        +

        ${_("Student List Management")}

        + %if messages: + +
        + %for message in messages: + ${message} + %endfor +
        + %endif @@ -66,7 +74,7 @@ - + %endfor From ccc921bce8e45b76c462b85ea39197a4bfc696d0 Mon Sep 17 00:00:00 2001 From: christopher lee Date: Fri, 21 Aug 2015 13:40:50 -0400 Subject: [PATCH 42/54] MA-1149 fixed vote bug in discussion api An incorrect response was being returned when voting for a comment or thread. --- lms/djangoapps/discussion_api/api.py | 3 + .../discussion_api/tests/test_api.py | 221 ++++++++++++++---- 2 files changed, 182 insertions(+), 42 deletions(-) diff --git a/lms/djangoapps/discussion_api/api.py b/lms/djangoapps/discussion_api/api.py index bc918c8be0..b16d85216c 100644 --- a/lms/djangoapps/discussion_api/api.py +++ b/lms/djangoapps/discussion_api/api.py @@ -515,8 +515,10 @@ def _do_extra_actions(api_content, cc_content, request_fields, actions_form, con signal.send(sender=None, user=context["request"].user, post=cc_content) if form_value: context["cc_requester"].vote(cc_content, "up") + api_content["vote_count"] += 1 else: context["cc_requester"].unvote(cc_content) + api_content["vote_count"] -= 1 def create_thread(request, thread_data): @@ -647,6 +649,7 @@ def update_thread(request, thread_id, update_data): # Only save thread object if some of the edited fields are in the thread data, not extra actions if set(update_data) - set(actions_form.fields): serializer.save() + # signal to update Teams when a user edits a thread thread_edited.send(sender=None, user=request.user, post=cc_thread) api_thread = serializer.data _do_extra_actions(api_thread, cc_thread, update_data.keys(), actions_form, context) diff --git a/lms/djangoapps/discussion_api/tests/test_api.py b/lms/djangoapps/discussion_api/tests/test_api.py index baf5441900..0549af17ad 100644 --- a/lms/djangoapps/discussion_api/tests/test_api.py +++ b/lms/djangoapps/discussion_api/tests/test_api.py @@ -1877,6 +1877,7 @@ class UpdateThreadTest( httpretty.reset() httpretty.enable() self.addCleanup(httpretty.disable) + self.user = UserFactory.create() self.register_get_user_response(self.user) self.request = RequestFactory().get("/test_path") @@ -2088,48 +2089,115 @@ class UpdateThreadTest( @ddt.data(*itertools.product([True, False], [True, False])) @ddt.unpack - def test_voted(self, old_voted, new_voted): + def test_voted(self, current_vote_status, new_vote_status): """ Test attempts to edit the "voted" field. - old_voted indicates whether the thread should be upvoted at the start of - the test. new_voted indicates the value for the "voted" field in the - update. If old_voted and new_voted are the same, no update should be - made. Otherwise, a vote should be PUT or DELETEd according to the - new_voted value. + current_vote_status indicates whether the thread should be upvoted at + the start of the test. new_vote_status indicates the value for the + "voted" field in the update. If current_vote_status and new_vote_status + are the same, no update should be made. Otherwise, a vote should be PUT + or DELETEd according to the new_vote_status value. """ - if old_voted: + if current_vote_status: self.register_get_user_response(self.user, upvoted_ids=["test_thread"]) self.register_thread_votes_response("test_thread") self.register_thread() - data = {"voted": new_voted} - if old_voted == new_voted: - result = update_thread(self.request, "test_thread", data) - else: - # Vote signals should only be sent if the number of votes has changed - with self.assert_signal_sent(api, 'thread_voted', sender=None, user=self.user, exclude_args=('post',)): - result = update_thread(self.request, "test_thread", data) - self.assertEqual(result["voted"], new_voted) + data = {"voted": new_vote_status} + result = update_thread(self.request, "test_thread", data) + self.assertEqual(result["voted"], new_vote_status) last_request_path = urlparse(httpretty.last_request().path).path votes_url = "/api/v1/threads/test_thread/votes" - if old_voted == new_voted: + if current_vote_status == new_vote_status: self.assertNotEqual(last_request_path, votes_url) else: self.assertEqual(last_request_path, votes_url) self.assertEqual( httpretty.last_request().method, - "PUT" if new_voted else "DELETE" + "PUT" if new_vote_status else "DELETE" ) actual_request_data = ( - httpretty.last_request().parsed_body if new_voted else + httpretty.last_request().parsed_body if new_vote_status else parse_qs(urlparse(httpretty.last_request().path).query) ) actual_request_data.pop("request_id", None) expected_request_data = {"user_id": [str(self.user.id)]} - if new_voted: + if new_vote_status: expected_request_data["value"] = ["up"] self.assertEqual(actual_request_data, expected_request_data) + @ddt.data(*itertools.product([True, False], [True, False], [True, False])) + @ddt.unpack + def test_vote_count(self, current_vote_status, first_vote, second_vote): + """ + Tests vote_count increases and decreases correctly from the same user + """ + #setup + starting_vote_count = 0 + if current_vote_status: + self.register_get_user_response(self.user, upvoted_ids=["test_thread"]) + starting_vote_count = 1 + self.register_thread_votes_response("test_thread") + self.register_thread(overrides={"votes": {"up_count": starting_vote_count}}) + + #first vote + data = {"voted": first_vote} + result = update_thread(self.request, "test_thread", data) + self.register_thread(overrides={"voted": first_vote}) + self.assertEqual(result["vote_count"], 1 if first_vote else 0) + + #second vote + data = {"voted": second_vote} + result = update_thread(self.request, "test_thread", data) + self.assertEqual(result["vote_count"], 1 if second_vote else 0) + + @ddt.data(*itertools.product([True, False], [True, False], [True, False], [True, False])) + @ddt.unpack + def test_vote_count_two_users( + self, + current_user1_vote, + current_user2_vote, + user1_vote, + user2_vote + ): + """ + Tests vote_count increases and decreases correctly from different users + """ + #setup + user2 = UserFactory.create() + self.register_get_user_response(user2) + request2 = RequestFactory().get("/test_path") + request2.user = user2 + CourseEnrollmentFactory.create(user=user2, course_id=self.course.id) + + vote_count = 0 + if current_user1_vote: + self.register_get_user_response(self.user, upvoted_ids=["test_thread"]) + vote_count += 1 + if current_user2_vote: + self.register_get_user_response(user2, upvoted_ids=["test_thread"]) + vote_count += 1 + + for (current_vote, user_vote, request) in \ + [(current_user1_vote, user1_vote, self.request), + (current_user2_vote, user2_vote, request2)]: + + self.register_thread_votes_response("test_thread") + self.register_thread(overrides={"votes": {"up_count": vote_count}}) + + data = {"voted": user_vote} + result = update_thread(request, "test_thread", data) + if current_vote == user_vote: + self.assertEqual(result["vote_count"], vote_count) + elif user_vote: + vote_count += 1 + self.assertEqual(result["vote_count"], vote_count) + self.register_get_user_response(self.user, upvoted_ids=["test_thread"]) + else: + vote_count -= 1 + self.assertEqual(result["vote_count"], vote_count) + self.register_get_user_response(self.user, upvoted_ids=[]) + @ddt.data(*itertools.product([True, False], [True, False])) @ddt.unpack def test_abuse_flagged(self, old_flagged, new_flagged): @@ -2196,15 +2264,15 @@ class UpdateCommentTest( def setUp(self): super(UpdateCommentTest, self).setUp() - self.user = UserFactory.create() - CourseEnrollmentFactory.create(user=self.user, course_id=self.course.id) - httpretty.reset() httpretty.enable() self.addCleanup(httpretty.disable) + + self.user = UserFactory.create() self.register_get_user_response(self.user) self.request = RequestFactory().get("/test_path") self.request.user = self.user + CourseEnrollmentFactory.create(user=self.user, course_id=self.course.id) def register_comment(self, overrides=None, thread_overrides=None, course=None): """ @@ -2414,48 +2482,117 @@ class UpdateCommentTest( @ddt.data(*itertools.product([True, False], [True, False])) @ddt.unpack - def test_voted(self, old_voted, new_voted): + def test_voted(self, current_vote_status, new_vote_status): """ Test attempts to edit the "voted" field. - old_voted indicates whether the comment should be upvoted at the start of - the test. new_voted indicates the value for the "voted" field in the - update. If old_voted and new_voted are the same, no update should be - made. Otherwise, a vote should be PUT or DELETEd according to the - new_voted value. + current_vote_status indicates whether the comment should be upvoted at + the start of the test. new_vote_status indicates the value for the + "voted" field in the update. If current_vote_status and new_vote_status + are the same, no update should be made. Otherwise, a vote should be PUT + or DELETEd according to the new_vote_status value. """ - if old_voted: + vote_count = 0 + if current_vote_status: self.register_get_user_response(self.user, upvoted_ids=["test_comment"]) + vote_count = 1 self.register_comment_votes_response("test_comment") - self.register_comment() - data = {"voted": new_voted} - if old_voted == new_voted: - result = update_comment(self.request, "test_comment", data) - else: - # Vote signals should only be sent if the number of votes has changed - with self.assert_signal_sent(api, 'comment_voted', sender=None, user=self.user, exclude_args=('post',)): - result = update_comment(self.request, "test_comment", data) - self.assertEqual(result["voted"], new_voted) + self.register_comment(overrides={"votes": {"up_count": vote_count}}) + data = {"voted": new_vote_status} + result = update_comment(self.request, "test_comment", data) + self.assertEqual(result["vote_count"], 1 if new_vote_status else 0) + self.assertEqual(result["voted"], new_vote_status) last_request_path = urlparse(httpretty.last_request().path).path votes_url = "/api/v1/comments/test_comment/votes" - if old_voted == new_voted: + if current_vote_status == new_vote_status: self.assertNotEqual(last_request_path, votes_url) else: self.assertEqual(last_request_path, votes_url) self.assertEqual( httpretty.last_request().method, - "PUT" if new_voted else "DELETE" + "PUT" if new_vote_status else "DELETE" ) actual_request_data = ( - httpretty.last_request().parsed_body if new_voted else + httpretty.last_request().parsed_body if new_vote_status else parse_qs(urlparse(httpretty.last_request().path).query) ) actual_request_data.pop("request_id", None) expected_request_data = {"user_id": [str(self.user.id)]} - if new_voted: + if new_vote_status: expected_request_data["value"] = ["up"] self.assertEqual(actual_request_data, expected_request_data) + @ddt.data(*itertools.product([True, False], [True, False], [True, False])) + @ddt.unpack + def test_vote_count(self, current_vote_status, first_vote, second_vote): + """ + Tests vote_count increases and decreases correctly from the same user + """ + #setup + starting_vote_count = 0 + if current_vote_status: + self.register_get_user_response(self.user, upvoted_ids=["test_comment"]) + starting_vote_count = 1 + self.register_comment_votes_response("test_comment") + self.register_comment(overrides={"votes": {"up_count": starting_vote_count}}) + + #first vote + data = {"voted": first_vote} + result = update_comment(self.request, "test_comment", data) + self.register_comment(overrides={"voted": first_vote}) + self.assertEqual(result["vote_count"], 1 if first_vote else 0) + + #second vote + data = {"voted": second_vote} + result = update_comment(self.request, "test_comment", data) + self.assertEqual(result["vote_count"], 1 if second_vote else 0) + + @ddt.data(*itertools.product([True, False], [True, False], [True, False], [True, False])) + @ddt.unpack + def test_vote_count_two_users( + self, + current_user1_vote, + current_user2_vote, + user1_vote, + user2_vote + ): + """ + Tests vote_count increases and decreases correctly from different users + """ + user2 = UserFactory.create() + self.register_get_user_response(user2) + request2 = RequestFactory().get("/test_path") + request2.user = user2 + CourseEnrollmentFactory.create(user=user2, course_id=self.course.id) + + vote_count = 0 + if current_user1_vote: + self.register_get_user_response(self.user, upvoted_ids=["test_comment"]) + vote_count += 1 + if current_user2_vote: + self.register_get_user_response(user2, upvoted_ids=["test_comment"]) + vote_count += 1 + + for (current_vote, user_vote, request) in \ + [(current_user1_vote, user1_vote, self.request), + (current_user2_vote, user2_vote, request2)]: + + self.register_comment_votes_response("test_comment") + self.register_comment(overrides={"votes": {"up_count": vote_count}}) + + data = {"voted": user_vote} + result = update_comment(request, "test_comment", data) + if current_vote == user_vote: + self.assertEqual(result["vote_count"], vote_count) + elif user_vote: + vote_count += 1 + self.assertEqual(result["vote_count"], vote_count) + self.register_get_user_response(self.user, upvoted_ids=["test_comment"]) + else: + vote_count -= 1 + self.assertEqual(result["vote_count"], vote_count) + self.register_get_user_response(self.user, upvoted_ids=[]) + @ddt.data(*itertools.product([True, False], [True, False])) @ddt.unpack def test_abuse_flagged(self, old_flagged, new_flagged): From 844edac4434c4804f280c572dd825ec82fb56446 Mon Sep 17 00:00:00 2001 From: Dennis Jen Date: Tue, 25 Aug 2015 09:56:40 -0400 Subject: [PATCH 43/54] Optimize OpenID Course Claims for users. - Course overviews will cache courses upon publish. - Added management command to warm up cache. - OAuth2 handler returns courses via course overviews. --- common/djangoapps/student/tests/tests.py | 19 ++-- .../xmodule/modulestore/tests/factories.py | 2 +- lms/djangoapps/ccx/tests/test_tasks.py | 11 +-- lms/djangoapps/oauth2_handler/handlers.py | 17 +--- lms/djangoapps/oauth2_handler/tests.py | 99 ++++++++++++------- lms/envs/test.py | 2 + .../course_overviews/management/__init__.py | 0 .../management/commands/__init__.py | 0 .../commands/generate_course_overview.py | 60 +++++++++++ .../management/commands/tests/__init__.py | 0 .../tests/test_generate_course_overview.py | 80 +++++++++++++++ .../content/course_overviews/models.py | 15 ++- .../content/course_overviews/signals.py | 3 +- .../content/course_overviews/tests.py | 33 ++----- 14 files changed, 246 insertions(+), 95 deletions(-) create mode 100644 openedx/core/djangoapps/content/course_overviews/management/__init__.py create mode 100644 openedx/core/djangoapps/content/course_overviews/management/commands/__init__.py create mode 100644 openedx/core/djangoapps/content/course_overviews/management/commands/generate_course_overview.py create mode 100644 openedx/core/djangoapps/content/course_overviews/management/commands/tests/__init__.py create mode 100644 openedx/core/djangoapps/content/course_overviews/management/commands/tests/test_generate_course_overview.py diff --git a/common/djangoapps/student/tests/tests.py b/common/djangoapps/student/tests/tests.py index e4ffb58121..05ab444bf8 100644 --- a/common/djangoapps/student/tests/tests.py +++ b/common/djangoapps/student/tests/tests.py @@ -488,21 +488,18 @@ class DashboardTest(ModuleStoreTestCase): self.assertContains(response, expected_url) @unittest.skipUnless(settings.ROOT_URLCONF == 'lms.urls', 'Test only valid in lms') - @ddt.data((ModuleStoreEnum.Type.mongo, 1), (ModuleStoreEnum.Type.split, 3)) - @ddt.unpack - def test_dashboard_metadata_caching(self, modulestore_type, expected_mongo_calls): + @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split) + def test_dashboard_metadata_caching(self, modulestore_type): """ Check that the student dashboard makes use of course metadata caching. - After enrolling a student in a course, that course's metadata should be - cached as a CourseOverview. The student dashboard should never have to make - calls to the modulestore. + After creating a course, that course's metadata should be cached as a + CourseOverview. The student dashboard should never have to make calls to + the modulestore. Arguments: modulestore_type (ModuleStoreEnum.Type): Type of modulestore to create test course in. - expected_mongo_calls (int >=0): Number of MongoDB queries expected for - a single call to the module store. Note to future developers: If you break this test so that the "check_mongo_calls(0)" fails, @@ -512,11 +509,11 @@ class DashboardTest(ModuleStoreTestCase): CourseDescriptor isn't necessary. """ # Create a course and log in the user. - test_course = CourseFactory.create(default_store=modulestore_type) + # Creating a new course will trigger a publish event and the course will be cached + test_course = CourseFactory.create(default_store=modulestore_type, emit_signals=True) self.client.login(username="jack", password="test") - # Enrolling the user in the course will result in a modulestore query. - with check_mongo_calls(expected_mongo_calls): + with check_mongo_calls(0): CourseEnrollment.enroll(self.user, test_course.id) # Subsequent requests will only result in SQL queries to load the diff --git a/common/lib/xmodule/xmodule/modulestore/tests/factories.py b/common/lib/xmodule/xmodule/modulestore/tests/factories.py index 8748591c55..891e6ede12 100644 --- a/common/lib/xmodule/xmodule/modulestore/tests/factories.py +++ b/common/lib/xmodule/xmodule/modulestore/tests/factories.py @@ -114,7 +114,7 @@ class CourseFactory(XModuleFactory): name = kwargs.get('name', kwargs.get('run', Location.clean(kwargs.get('display_name')))) run = kwargs.pop('run', name) user_id = kwargs.pop('user_id', ModuleStoreEnum.UserID.test) - emit_signals = kwargs.get('emit_signals', False) + emit_signals = kwargs.pop('emit_signals', False) # Pass the metadata just as field=value pairs kwargs.update(kwargs.pop('metadata', {})) diff --git a/lms/djangoapps/ccx/tests/test_tasks.py b/lms/djangoapps/ccx/tests/test_tasks.py index 8af45ad5b5..c1f568b4e2 100644 --- a/lms/djangoapps/ccx/tests/test_tasks.py +++ b/lms/djangoapps/ccx/tests/test_tasks.py @@ -94,17 +94,14 @@ class TestSendCCXCoursePublished(ModuleStoreTestCase): structure = CourseStructure.objects.get(course_id=course_key) self.assertEqual(structure.structure, ccx_structure) - def test_course_overview_deleted(self): - """Check that course overview is deleted after course published signal is sent + def test_course_overview_cached(self): + """Check that course overview is cached after course published signal is sent """ course_key = CCXLocator.from_course_locator(self.course.id, self.ccx.id) - overview = CourseOverview(id=course_key) - overview.version = 1 - overview.save() overview = CourseOverview.objects.filter(id=course_key) - self.assertEqual(len(overview), 1) + self.assertEqual(len(overview), 0) with mock_signal_receiver(SignalHandler.course_published) as receiver: self.call_fut(self.course.id) self.assertEqual(receiver.call_count, 3) overview = CourseOverview.objects.filter(id=course_key) - self.assertEqual(len(overview), 0) + self.assertEqual(len(overview), 1) diff --git a/lms/djangoapps/oauth2_handler/handlers.py b/lms/djangoapps/oauth2_handler/handlers.py index 5989dfb2fe..cab2ec5337 100644 --- a/lms/djangoapps/oauth2_handler/handlers.py +++ b/lms/djangoapps/oauth2_handler/handlers.py @@ -2,9 +2,9 @@ from django.conf import settings from django.core.cache import cache -from xmodule.modulestore.django import modulestore from courseware.access import has_access +from openedx.core.djangoapps.content.course_overviews.models import CourseOverview from openedx.core.djangoapps.user_api.models import UserPreference from student.models import anonymous_id_for_user from student.models import UserProfile @@ -200,13 +200,13 @@ class CourseAccessHandler(object): course_ids = cache.get(key) if not course_ids: - courses = _get_all_courses() + course_keys = CourseOverview.get_all_course_keys() # Global staff have access to all courses. Filter courses for non-global staff. if not GlobalStaff().has_user(user): - courses = [course for course in courses if has_access(user, access_type, course)] + course_keys = [course_key for course_key in course_keys if has_access(user, access_type, course_key)] - course_ids = [unicode(course.id) for course in courses] + course_ids = [unicode(course_key) for course_key in course_keys] cache.set(key, course_ids, self.COURSE_CACHE_TIMEOUT) @@ -234,12 +234,3 @@ class IDTokenHandler(OpenIDHandler, ProfileHandler, CourseAccessHandler, Permiss class UserInfoHandler(OpenIDHandler, ProfileHandler, CourseAccessHandler, PermissionsHandler): """ Configure the UserInfo handler for the LMS. """ pass - - -def _get_all_courses(): - """ Utility function to list all available courses. """ - - ms_courses = modulestore().get_courses() - courses = [course for course in ms_courses if course.scope_ids.block_type == 'course'] - - return courses diff --git a/lms/djangoapps/oauth2_handler/tests.py b/lms/djangoapps/oauth2_handler/tests.py index d34d24072c..be6ff9bd74 100644 --- a/lms/djangoapps/oauth2_handler/tests.py +++ b/lms/djangoapps/oauth2_handler/tests.py @@ -2,16 +2,17 @@ from django.core.cache import cache from django.test.utils import override_settings from lang_pref import LANGUAGE_KEY -from opaque_keys.edx.locations import SlashSeparatedCourseKey -from xmodule.modulestore.tests.django_utils import TEST_DATA_MIXED_TOY_MODULESTORE +from xmodule.modulestore.tests.factories import (check_mongo_calls, CourseFactory) from student.models import anonymous_id_for_user from student.models import UserProfile -from student.roles import CourseStaffRole, CourseInstructorRole +from student.roles import (CourseInstructorRole, CourseStaffRole, GlobalStaff, + OrgInstructorRole, OrgStaffRole) from student.tests.factories import UserFactory, UserProfileFactory from openedx.core.djangoapps.user_api.preferences.api import set_user_preference from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase + # Will also run default tests for IDTokens and UserInfo from oauth2_provider.tests import IDTokenTestCase, UserInfoTestCase @@ -19,14 +20,10 @@ from oauth2_provider.tests import IDTokenTestCase, UserInfoTestCase class BaseTestMixin(ModuleStoreTestCase): profile = None - MODULESTORE = TEST_DATA_MIXED_TOY_MODULESTORE - def setUp(self): super(BaseTestMixin, self).setUp() - - self.course_key = SlashSeparatedCourseKey('edX', 'toy', '2012_Fall') + self.course_key = CourseFactory.create(emit_signals=True).id self.course_id = unicode(self.course_key) - self.user_factory = UserFactory self.set_user(self.make_user()) @@ -77,7 +74,8 @@ class IDTokenTest(BaseTestMixin, IDTokenTestCase): self.assertEqual(language, locale) def test_no_special_course_access(self): - scopes, claims = self.get_id_token_values('openid course_instructor course_staff') + with check_mongo_calls(0): + scopes, claims = self.get_id_token_values('openid course_instructor course_staff') self.assertNotIn('course_staff', scopes) self.assertNotIn('staff_courses', claims) @@ -86,14 +84,15 @@ class IDTokenTest(BaseTestMixin, IDTokenTestCase): def test_course_staff_courses(self): CourseStaffRole(self.course_key).add_users(self.user) - - scopes, claims = self.get_id_token_values('openid course_staff') + with check_mongo_calls(0): + scopes, claims = self.get_id_token_values('openid course_staff') self.assertIn('course_staff', scopes) self.assertNotIn('staff_courses', claims) # should not return courses in id_token def test_course_instructor_courses(self): - CourseInstructorRole(self.course_key).add_users(self.user) + with check_mongo_calls(0): + CourseInstructorRole(self.course_key).add_users(self.user) scopes, claims = self.get_id_token_values('openid course_instructor') @@ -104,6 +103,7 @@ class IDTokenTest(BaseTestMixin, IDTokenTestCase): CourseStaffRole(self.course_key).add_users(self.user) course_id = unicode(self.course_key) + nonexistent_course_id = 'some/other/course' claims = { @@ -113,7 +113,8 @@ class IDTokenTest(BaseTestMixin, IDTokenTestCase): } } - scopes, claims = self.get_id_token_values(scope='openid course_staff', claims=claims) + with check_mongo_calls(0): + scopes, claims = self.get_id_token_values(scope='openid course_staff', claims=claims) self.assertIn('course_staff', scopes) self.assertIn('staff_courses', claims) @@ -133,6 +134,11 @@ class IDTokenTest(BaseTestMixin, IDTokenTestCase): class UserInfoTest(BaseTestMixin, UserInfoTestCase): + def setUp(self): + super(UserInfoTest, self).setUp() + # create another course in the DB that only global staff have access to + CourseFactory.create(emit_signals=True) + def token_for_scope(self, scope): full_scope = 'openid %s' % scope self.set_access_token_scope(full_scope) @@ -158,43 +164,64 @@ class UserInfoTest(BaseTestMixin, UserInfoTestCase): self.assertEqual(result.status_code, 200) return claims + def _assert_role_using_scope(self, scope, claim, assert_one_course=True): + with check_mongo_calls(0): + claims = self.get_with_scope(scope) + self.assertEqual(len(claims), 2) + courses = claims[claim] + self.assertIn(self.course_id, courses) + if assert_one_course: + self.assertEqual(len(courses), 1) + + def test_request_global_staff_courses_using_scope(self): + GlobalStaff().add_users(self.user) + self._assert_role_using_scope('course_staff', 'staff_courses', assert_one_course=False) + + def test_request_org_staff_courses_using_scope(self): + OrgStaffRole(self.course_key.org).add_users(self.user) + self._assert_role_using_scope('course_staff', 'staff_courses') + + def test_request_org_instructor_courses_using_scope(self): + OrgInstructorRole(self.course_key.org).add_users(self.user) + self._assert_role_using_scope('course_instructor', 'instructor_courses') + def test_request_staff_courses_using_scope(self): CourseStaffRole(self.course_key).add_users(self.user) - claims = self.get_with_scope('course_staff') - - courses = claims['staff_courses'] - self.assertIn(self.course_id, courses) - self.assertEqual(len(courses), 1) + self._assert_role_using_scope('course_staff', 'staff_courses') def test_request_instructor_courses_using_scope(self): CourseInstructorRole(self.course_key).add_users(self.user) - claims = self.get_with_scope('course_instructor') + self._assert_role_using_scope('course_instructor', 'instructor_courses') - courses = claims['instructor_courses'] + def _assert_role_using_claim(self, scope, claim): + values = [self.course_id, 'some_invalid_course'] + with check_mongo_calls(0): + claims = self.get_with_claim_value(scope, claim, values) + self.assertEqual(len(claims), 2) + + courses = claims[claim] self.assertIn(self.course_id, courses) self.assertEqual(len(courses), 1) + def test_request_global_staff_courses_with_claims(self): + GlobalStaff().add_users(self.user) + self._assert_role_using_claim('course_staff', 'staff_courses') + + def test_request_org_staff_courses_with_claims(self): + OrgStaffRole(self.course_key.org).add_users(self.user) + self._assert_role_using_claim('course_staff', 'staff_courses') + + def test_request_org_instructor_courses_with_claims(self): + OrgInstructorRole(self.course_key.org).add_users(self.user) + self._assert_role_using_claim('course_instructor', 'instructor_courses') + def test_request_staff_courses_with_claims(self): CourseStaffRole(self.course_key).add_users(self.user) - - values = [self.course_id, 'some_invalid_course'] - claims = self.get_with_claim_value('course_staff', 'staff_courses', values) - self.assertEqual(len(claims), 2) - - courses = claims['staff_courses'] - self.assertIn(self.course_id, courses) - self.assertEqual(len(courses), 1) + self._assert_role_using_claim('course_staff', 'staff_courses') def test_request_instructor_courses_with_claims(self): CourseInstructorRole(self.course_key).add_users(self.user) - - values = ['edX/toy/TT_2012_Fall', self.course_id, 'invalid_course_id'] - claims = self.get_with_claim_value('course_instructor', 'instructor_courses', values) - self.assertEqual(len(claims), 2) - - courses = claims['instructor_courses'] - self.assertIn(self.course_id, courses) - self.assertEqual(len(courses), 1) + self._assert_role_using_claim('course_instructor', 'instructor_courses') def test_permissions_scope(self): claims = self.get_with_scope('permissions') diff --git a/lms/envs/test.py b/lms/envs/test.py index 1e52d4297c..d371d14ae5 100644 --- a/lms/envs/test.py +++ b/lms/envs/test.py @@ -269,6 +269,8 @@ OPENID_PROVIDER_TRUSTED_ROOTS = ['*'] ############################## OAUTH2 Provider ################################ FEATURES['ENABLE_OAUTH2_PROVIDER'] = True +# don't cache courses for testing +OIDC_COURSE_HANDLER_CACHE_TIMEOUT = 0 ########################### External REST APIs ################################# FEATURES['ENABLE_MOBILE_REST_API'] = True diff --git a/openedx/core/djangoapps/content/course_overviews/management/__init__.py b/openedx/core/djangoapps/content/course_overviews/management/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/openedx/core/djangoapps/content/course_overviews/management/commands/__init__.py b/openedx/core/djangoapps/content/course_overviews/management/commands/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/openedx/core/djangoapps/content/course_overviews/management/commands/generate_course_overview.py b/openedx/core/djangoapps/content/course_overviews/management/commands/generate_course_overview.py new file mode 100644 index 0000000000..ea2ee5115d --- /dev/null +++ b/openedx/core/djangoapps/content/course_overviews/management/commands/generate_course_overview.py @@ -0,0 +1,60 @@ +""" +Command to load course overviews. +""" +import logging +from optparse import make_option + +from django.core.management.base import BaseCommand, CommandError +from opaque_keys import InvalidKeyError +from opaque_keys.edx.keys import CourseKey +from xmodule.modulestore.django import modulestore + +from openedx.core.djangoapps.content.course_overviews.models import CourseOverview + + +log = logging.getLogger(__name__) + + +class Command(BaseCommand): + """ + Example usage: + $ ./manage.py lms generate_course_overview --all --settings=devstack + $ ./manage.py lms generate_course_overview 'edX/DemoX/Demo_Course' --settings=devstack + """ + args = '' + help = 'Generates and stores course overview for one or more courses.' + + option_list = BaseCommand.option_list + ( + make_option('--all', + action='store_true', + default=False, + help='Generate course overview for all courses.'), + ) + + def handle(self, *args, **options): + course_keys = [] + + if options['all']: + course_keys = [course.id for course in modulestore().get_courses()] + else: + if len(args) < 1: + raise CommandError('At least one course or --all must be specified.') + try: + course_keys = [CourseKey.from_string(arg) for arg in args] + except InvalidKeyError: + log.fatal('Invalid key specified.') + + if not course_keys: + log.fatal('No courses specified.') + + log.info('Generating course overview for %d courses.', len(course_keys)) + log.debug('Generating course overview(s) for the following courses: %s', course_keys) + + for course_key in course_keys: + try: + CourseOverview.get_from_id(course_key) + except Exception as ex: # pylint: disable=broad-except + log.exception('An error occurred while generating course overview for %s: %s', unicode( + course_key), ex.message) + + log.info('Finished generating course overviews.') diff --git a/openedx/core/djangoapps/content/course_overviews/management/commands/tests/__init__.py b/openedx/core/djangoapps/content/course_overviews/management/commands/tests/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/openedx/core/djangoapps/content/course_overviews/management/commands/tests/test_generate_course_overview.py b/openedx/core/djangoapps/content/course_overviews/management/commands/tests/test_generate_course_overview.py new file mode 100644 index 0000000000..12ba8acafc --- /dev/null +++ b/openedx/core/djangoapps/content/course_overviews/management/commands/tests/test_generate_course_overview.py @@ -0,0 +1,80 @@ +# pylint: disable=missing-docstring +from django.core.management.base import CommandError +from mock import patch +from openedx.core.djangoapps.content.course_overviews.management.commands import generate_course_overview +from openedx.core.djangoapps.content.course_overviews.models import CourseOverview +from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase +from xmodule.modulestore.tests.factories import CourseFactory + + +class TestGenerateCourseOverview(ModuleStoreTestCase): + """ + Tests course overview management command. + """ + def setUp(self): + """ + Create courses in modulestore. + """ + super(TestGenerateCourseOverview, self).setUp() + self.course_key_1 = CourseFactory.create().id + self.course_key_2 = CourseFactory.create().id + self.command = generate_course_overview.Command() + + def _assert_courses_not_in_overview(self, *courses): + """ + Assert that courses doesn't exist in the course overviews. + """ + course_keys = CourseOverview.get_all_course_keys() + for expected_course_key in courses: + self.assertNotIn(expected_course_key, course_keys) + + def _assert_courses_in_overview(self, *courses): + """ + Assert courses exists in course overviews. + """ + course_keys = CourseOverview.get_all_course_keys() + for expected_course_key in courses: + self.assertIn(expected_course_key, course_keys) + + def test_generate_all(self): + """ + Test that all courses in the modulestore are loaded into course overviews. + """ + # ensure that the newly created courses aren't in course overviews + self._assert_courses_not_in_overview(self.course_key_1, self.course_key_2) + self.command.handle(all=True) + + # CourseOverview will be populated with all courses in the modulestore + self._assert_courses_in_overview(self.course_key_1, self.course_key_2) + + def test_generate_one(self): + """ + Test that a specified course is loaded into course overviews. + """ + self._assert_courses_not_in_overview(self.course_key_1, self.course_key_2) + self.command.handle(unicode(self.course_key_1), all=False) + self._assert_courses_in_overview(self.course_key_1) + self._assert_courses_not_in_overview(self.course_key_2) + + @patch('openedx.core.djangoapps.content.course_overviews.management.commands.generate_course_overview.log') + def test_invalid_key(self, mock_log): + """ + Test that invalid key errors are logged. + """ + self.command.handle('not/found', all=False) + self.assertTrue(mock_log.fatal.called) + + @patch('openedx.core.djangoapps.content.course_overviews.management.commands.generate_course_overview.log') + def test_not_found_key(self, mock_log): + """ + Test keys not found are logged. + """ + self.command.handle('fake/course/id', all=False) + self.assertTrue(mock_log.exception.called) + + def test_no_params(self): + """ + Test exception raised when no parameters are specified. + """ + with self.assertRaises(CommandError): + self.command.handle(all=False) diff --git a/openedx/core/djangoapps/content/course_overviews/models.py b/openedx/core/djangoapps/content/course_overviews/models.py index fd98aeb79c..1093f499d1 100644 --- a/openedx/core/djangoapps/content/course_overviews/models.py +++ b/openedx/core/djangoapps/content/course_overviews/models.py @@ -9,6 +9,7 @@ from django.db.utils import IntegrityError from django.utils.translation import ugettext from model_utils.models import TimeStampedModel +from opaque_keys.edx.keys import CourseKey from util.date_utils import strftime_localized from xmodule import course_metadata_utils from xmodule.course_module import CourseDescriptor @@ -151,7 +152,7 @@ class CourseOverview(TimeStampedModel): ) @classmethod - def _load_from_module_store(cls, course_id): + def load_from_module_store(cls, course_id): """ Load a CourseDescriptor, create a new CourseOverview from it, cache the overview, and return it. @@ -225,7 +226,7 @@ class CourseOverview(TimeStampedModel): course_overview = None except cls.DoesNotExist: course_overview = None - return course_overview or cls._load_from_module_store(course_id) + return course_overview or cls.load_from_module_store(course_id) def clean_id(self, padding_char='='): """ @@ -340,3 +341,13 @@ class CourseOverview(TimeStampedModel): Returns a list of ID strings for this course's prerequisite courses. """ return json.loads(self._pre_requisite_courses_json) + + @classmethod + def get_all_course_keys(cls): + """ + Returns all course keys from course overviews. + """ + return [ + CourseKey.from_string(course_overview['id']) + for course_overview in CourseOverview.objects.values('id') + ] diff --git a/openedx/core/djangoapps/content/course_overviews/signals.py b/openedx/core/djangoapps/content/course_overviews/signals.py index c2141847b1..26dcca6490 100644 --- a/openedx/core/djangoapps/content/course_overviews/signals.py +++ b/openedx/core/djangoapps/content/course_overviews/signals.py @@ -11,9 +11,10 @@ from xmodule.modulestore.django import SignalHandler def _listen_for_course_publish(sender, course_key, **kwargs): # pylint: disable=unused-argument """ Catches the signal that a course has been published in Studio and - invalidates the corresponding CourseOverview cache entry if one exists. + updates the corresponding CourseOverview cache entry. """ CourseOverview.objects.filter(id=course_key).delete() + CourseOverview.load_from_module_store(course_key) @receiver(SignalHandler.course_deleted) diff --git a/openedx/core/djangoapps/content/course_overviews/tests.py b/openedx/core/djangoapps/content/course_overviews/tests.py index 164594901b..ae323be440 100644 --- a/openedx/core/djangoapps/content/course_overviews/tests.py +++ b/openedx/core/djangoapps/content/course_overviews/tests.py @@ -258,31 +258,22 @@ class CourseOverviewTestCase(ModuleStoreTestCase): self.store.delete_course(course.id, ModuleStoreEnum.UserID.test) CourseOverview.get_from_id(course.id) - @ddt.data((ModuleStoreEnum.Type.mongo, 1, 1), (ModuleStoreEnum.Type.split, 3, 4)) - @ddt.unpack - def test_course_overview_caching(self, modulestore_type, min_mongo_calls, max_mongo_calls): + @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split) + def test_course_overview_caching(self, modulestore_type): """ Tests that CourseOverview structures are actually getting cached. Arguments: modulestore_type (ModuleStoreEnum.Type): type of store to create the course in. - min_mongo_calls (int): minimum number of MongoDB queries we expect - to be made. - max_mongo_calls (int): maximum number of MongoDB queries we expect - to be made. """ - course = CourseFactory.create(default_store=modulestore_type) - # The first time we load a CourseOverview, it will be a cache miss, so - # we expect the modulestore to be queried. - with check_mongo_calls_range(max_finds=max_mongo_calls, min_finds=min_mongo_calls): - _course_overview_1 = CourseOverview.get_from_id(course.id) + # Creating a new course will trigger a publish event and the course will be cached + course = CourseFactory.create(default_store=modulestore_type, emit_signals=True) - # The second time we load a CourseOverview, it will be a cache hit, so - # we expect no modulestore queries to be made. + # The cache will be hit and mongo will not be queried with check_mongo_calls(0): - _course_overview_2 = CourseOverview.get_from_id(course.id) + CourseOverview.get_from_id(course.id) @ddt.data(ModuleStoreEnum.Type.split, ModuleStoreEnum.Type.mongo) def test_get_non_existent_course(self, modulestore_type): @@ -298,24 +289,18 @@ class CourseOverviewTestCase(ModuleStoreTestCase): with self.assertRaises(CourseOverview.DoesNotExist): CourseOverview.get_from_id(store.make_course_key('Non', 'Existent', 'Course')) - @ddt.data(ModuleStoreEnum.Type.split, ModuleStoreEnum.Type.mongo) - def test_get_errored_course(self, modulestore_type): + def test_get_errored_course(self): """ Test that getting an ErrorDescriptor back from the module store causes - get_from_id to raise an IOError. - - Arguments: - modulestore_type (ModuleStoreEnum.Type): type of store to create the - course in. + load_from_module_store to raise an IOError. """ - course = CourseFactory.create(default_store=modulestore_type) mock_get_course = mock.Mock(return_value=ErrorDescriptor) with mock.patch('xmodule.modulestore.mixed.MixedModuleStore.get_course', mock_get_course): # This mock makes it so when the module store tries to load course data, # an exception is thrown, which causes get_course to return an ErrorDescriptor, # which causes get_from_id to raise an IOError. with self.assertRaises(IOError): - CourseOverview.get_from_id(course.id) + CourseOverview.load_from_module_store(self.store.make_course_key('Non', 'Existent', 'Course')) def test_malformed_grading_policy(self): """ From b56d4a0295630cc13834c29798fcd28516c7f706 Mon Sep 17 00:00:00 2001 From: Gabe Mulley Date: Thu, 17 Sep 2015 15:04:21 -0400 Subject: [PATCH 44/54] Revert "Fix order of tracking backends" --- cms/envs/aws.py | 4 ++-- cms/envs/common.py | 8 ++------ lms/envs/acceptance.py | 2 +- lms/envs/aws.py | 4 ++-- lms/envs/common.py | 8 ++------ 5 files changed, 9 insertions(+), 17 deletions(-) diff --git a/cms/envs/aws.py b/cms/envs/aws.py index af8a8008c4..84d8947fbf 100644 --- a/cms/envs/aws.py +++ b/cms/envs/aws.py @@ -293,8 +293,8 @@ BROKER_URL = "{0}://{1}:{2}@{3}/{4}".format(CELERY_BROKER_TRANSPORT, # Event tracking TRACKING_BACKENDS.update(AUTH_TOKENS.get("TRACKING_BACKENDS", {})) -EVENT_TRACKING_BACKENDS['0_tracking_logs']['OPTIONS']['backends'].update(AUTH_TOKENS.get("EVENT_TRACKING_BACKENDS", {})) -EVENT_TRACKING_BACKENDS['1_segmentio']['OPTIONS']['processors'][0]['OPTIONS']['whitelist'].extend( +EVENT_TRACKING_BACKENDS['tracking_logs']['OPTIONS']['backends'].update(AUTH_TOKENS.get("EVENT_TRACKING_BACKENDS", {})) +EVENT_TRACKING_BACKENDS['segmentio']['OPTIONS']['processors'][0]['OPTIONS']['whitelist'].extend( AUTH_TOKENS.get("EVENT_TRACKING_SEGMENTIO_EMIT_WHITELIST", [])) SUBDOMAIN_BRANDING = ENV_TOKENS.get('SUBDOMAIN_BRANDING', {}) diff --git a/cms/envs/common.py b/cms/envs/common.py index 4cb42bbcfe..f1d34953a1 100644 --- a/cms/envs/common.py +++ b/cms/envs/common.py @@ -828,12 +828,8 @@ TRACKING_BACKENDS = { TRACKING_IGNORE_URL_PATTERNS = [r'^/event', r'^/login', r'^/heartbeat'] EVENT_TRACKING_ENABLED = True - -# NOTE: the sort order of the backend names is important here, the events will be sent to the backends in sorted -# order. In this case a processor modifies the event in a way that is only intended to be seen by segment.io, so -# we want to make sure that backend and processor is run *after* the event has been sent to the tracking logs. EVENT_TRACKING_BACKENDS = { - '0_tracking_logs': { + 'tracking_logs': { 'ENGINE': 'eventtracking.backends.routing.RoutingBackend', 'OPTIONS': { 'backends': { @@ -851,7 +847,7 @@ EVENT_TRACKING_BACKENDS = { ] } }, - '1_segmentio': { + 'segmentio': { 'ENGINE': 'eventtracking.backends.routing.RoutingBackend', 'OPTIONS': { 'backends': { diff --git a/lms/envs/acceptance.py b/lms/envs/acceptance.py index ad32746373..53fae641c5 100644 --- a/lms/envs/acceptance.py +++ b/lms/envs/acceptance.py @@ -80,7 +80,7 @@ TRACKING_BACKENDS.update({ } }) -EVENT_TRACKING_BACKENDS['0_tracking_logs']['OPTIONS']['backends'].update({ +EVENT_TRACKING_BACKENDS['tracking_logs']['OPTIONS']['backends'].update({ 'mongo': { 'ENGINE': 'eventtracking.backends.mongodb.MongoBackend', 'OPTIONS': { diff --git a/lms/envs/aws.py b/lms/envs/aws.py index ef3d1b3193..9399a79e6c 100644 --- a/lms/envs/aws.py +++ b/lms/envs/aws.py @@ -492,8 +492,8 @@ STUDENT_FILEUPLOAD_MAX_SIZE = ENV_TOKENS.get("STUDENT_FILEUPLOAD_MAX_SIZE", STUD # Event tracking TRACKING_BACKENDS.update(AUTH_TOKENS.get("TRACKING_BACKENDS", {})) -EVENT_TRACKING_BACKENDS['0_tracking_logs']['OPTIONS']['backends'].update(AUTH_TOKENS.get("EVENT_TRACKING_BACKENDS", {})) -EVENT_TRACKING_BACKENDS['1_segmentio']['OPTIONS']['processors'][0]['OPTIONS']['whitelist'].extend( +EVENT_TRACKING_BACKENDS['tracking_logs']['OPTIONS']['backends'].update(AUTH_TOKENS.get("EVENT_TRACKING_BACKENDS", {})) +EVENT_TRACKING_BACKENDS['segmentio']['OPTIONS']['processors'][0]['OPTIONS']['whitelist'].extend( AUTH_TOKENS.get("EVENT_TRACKING_SEGMENTIO_EMIT_WHITELIST", [])) TRACKING_SEGMENTIO_WEBHOOK_SECRET = AUTH_TOKENS.get( "TRACKING_SEGMENTIO_WEBHOOK_SECRET", diff --git a/lms/envs/common.py b/lms/envs/common.py index a0e5c474a0..41924c2217 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -629,12 +629,8 @@ TRACKING_BACKENDS = { TRACKING_IGNORE_URL_PATTERNS = [r'^/event', r'^/login', r'^/heartbeat', r'^/segmentio/event', r'^/performance'] EVENT_TRACKING_ENABLED = True - -# NOTE: the sort order of the backend names is important here, the events will be sent to the backends in sorted -# order. In this case a processor modifies the event in a way that is only intended to be seen by segment.io, so -# we want to make sure that backend and processor is run *after* the event has been sent to the tracking logs. EVENT_TRACKING_BACKENDS = { - '0_tracking_logs': { + 'tracking_logs': { 'ENGINE': 'eventtracking.backends.routing.RoutingBackend', 'OPTIONS': { 'backends': { @@ -652,7 +648,7 @@ EVENT_TRACKING_BACKENDS = { ] } }, - '1_segmentio': { + 'segmentio': { 'ENGINE': 'eventtracking.backends.routing.RoutingBackend', 'OPTIONS': { 'backends': { From fec5129a493e53b10a1b63c2766dc347d9f17790 Mon Sep 17 00:00:00 2001 From: Peter Fogg Date: Mon, 14 Sep 2015 10:40:13 -0400 Subject: [PATCH 45/54] Remove Tender and change Studio help links. TNL-2695 --- .../contentstore/features/help.feature | 53 ---- cms/djangoapps/contentstore/features/help.py | 24 -- cms/envs/aws.py | 2 - cms/envs/bok_choy.py | 3 + cms/envs/common.py | 12 - cms/envs/test.py | 3 - cms/static/cms/js/build.js | 1 - cms/static/cms/js/require-config.js | 11 - cms/static/coffee/spec/main.coffee | 1 - cms/static/coffee/spec/main_squire.coffee | 1 - cms/static/js/base.js | 3 - cms/static/sass/_build.scss | 1 - cms/static/sass/elements/_sock.scss | 1 + cms/static/sass/elements/_tender-widget.scss | 273 ------------------ cms/templates/activation_invalid.html | 10 - cms/templates/base.html | 2 - cms/templates/error.html | 11 +- cms/templates/index.html | 27 +- cms/templates/login.html | 14 - cms/templates/widgets/footer.html | 5 - cms/templates/widgets/sock.html | 78 ++--- cms/templates/widgets/tender.html | 20 -- common/static/js/src/tender_fallback.js | 1 - common/test/acceptance/pages/studio/utils.py | 15 + .../tests/studio/test_studio_help.py | 46 +++ lms/static/js/spec/main.js | 1 - 26 files changed, 113 insertions(+), 506 deletions(-) delete mode 100644 cms/djangoapps/contentstore/features/help.feature delete mode 100644 cms/djangoapps/contentstore/features/help.py delete mode 100644 cms/static/sass/elements/_tender-widget.scss delete mode 100644 cms/templates/widgets/tender.html delete mode 100644 common/static/js/src/tender_fallback.js create mode 100644 common/test/acceptance/tests/studio/test_studio_help.py diff --git a/cms/djangoapps/contentstore/features/help.feature b/cms/djangoapps/contentstore/features/help.feature deleted file mode 100644 index 567a2f2526..0000000000 --- a/cms/djangoapps/contentstore/features/help.feature +++ /dev/null @@ -1,53 +0,0 @@ -@shard_1 -Feature: CMS.Help - As a course author, I am able to access online help - - Scenario: Users can access online help on course listing page - Given There are no courses - And I am logged into Studio - Then I should see online help for "get_started" - - - Scenario: Users can access online help within a course - Given I have opened a new course in Studio - - And I click the course link in Studio Home - Then I should see online help for "outline" - - And I go to the course updates page - Then I should see online help for "updates" - - And I go to the pages page - Then I should see online help for "pages" - - And I go to the files and uploads page - Then I should see online help for "files" - - And I go to the textbooks page - Then I should see online help for "textbooks" - - And I select Schedule and Details - Then I should see online help for "setting_up" - - And I am viewing the grading settings - Then I should see online help for "grading" - - And I am viewing the course team settings - Then I should see online help for "course-team" - - And I select the Advanced Settings - Then I should see online help for "index" - - And I select Checklists from the Tools menu - Then I should see online help for "checklist" - - And I go to the import page - Then I should see online help for "import" - - And I go to the export page - Then I should see online help for "export" - - - Scenario: Users can access online help on the unit page - Given I am in Studio editing a new unit - Then I should see online help for "units" diff --git a/cms/djangoapps/contentstore/features/help.py b/cms/djangoapps/contentstore/features/help.py deleted file mode 100644 index f169e72057..0000000000 --- a/cms/djangoapps/contentstore/features/help.py +++ /dev/null @@ -1,24 +0,0 @@ -# pylint: disable=missing-docstring -# pylint: disable=redefined-outer-name -# pylint: disable=unused-argument - -from nose.tools import assert_false # pylint: disable=no-name-in-module -from lettuce import step, world - - -@step(u'I should see online help for "([^"]*)"$') -def see_online_help_for(step, page_name): - # make sure the online Help link exists on this page and contains the expected page name - elements_found = world.browser.find_by_xpath( - '//li[contains(@class, "nav-account-help")]//a[contains(@href, "{page_name}")]'.format( - page_name=page_name - ) - ) - assert_false(elements_found.is_empty()) - - # make sure the PDF link on the sock of this page exists - # for now, the PDF link stays constant for all the pages so we just check for "pdf" - elements_found = world.browser.find_by_xpath( - '//section[contains(@class, "sock")]//li[contains(@class, "js-help-pdf")]//a[contains(@href, "pdf")]' - ) - assert_false(elements_found.is_empty()) diff --git a/cms/envs/aws.py b/cms/envs/aws.py index 84d8947fbf..cc3d974377 100644 --- a/cms/envs/aws.py +++ b/cms/envs/aws.py @@ -204,8 +204,6 @@ LOGGING = get_logger_config(LOG_DIR, PLATFORM_NAME = ENV_TOKENS.get('PLATFORM_NAME', 'edX') STUDIO_NAME = ENV_TOKENS.get('STUDIO_NAME', 'edX Studio') STUDIO_SHORT_NAME = ENV_TOKENS.get('STUDIO_SHORT_NAME', 'Studio') -TENDER_DOMAIN = ENV_TOKENS.get('TENDER_DOMAIN', TENDER_DOMAIN) -TENDER_SUBDOMAIN = ENV_TOKENS.get('TENDER_SUBDOMAIN', TENDER_SUBDOMAIN) # Event Tracking if "TRACKING_IGNORE_URL_PATTERNS" in ENV_TOKENS: diff --git a/cms/envs/bok_choy.py b/cms/envs/bok_choy.py index ee671b084c..94f90d46ad 100644 --- a/cms/envs/bok_choy.py +++ b/cms/envs/bok_choy.py @@ -98,6 +98,9 @@ FEATURES['LICENSING'] = True FEATURES['ENABLE_MOBILE_REST_API'] = True # Enable video bumper in Studio FEATURES['ENABLE_VIDEO_BUMPER'] = True # Enable video bumper in Studio settings +# Enable partner support link in Studio footer +FEATURES['PARTNER_SUPPORT_EMAIL'] = 'partner-support@example.com' + ########################### Entrance Exams ################################# FEATURES['ENTRANCE_EXAMS'] = True diff --git a/cms/envs/common.py b/cms/envs/common.py index f1d34953a1..14b0b33989 100644 --- a/cms/envs/common.py +++ b/cms/envs/common.py @@ -620,18 +620,6 @@ REQUIRE_ENVIRONMENT = "node" DEBUG_TOOLBAR_PATCH_SETTINGS = False -################################# TENDER ###################################### - -# If you want to enable Tender integration (http://tenderapp.com/), -# put in the subdomain where Tender hosts tender_widget.js. For example, -# if you want to use the URL https://example.tenderapp.com/tender_widget.js, -# you should use "example". -TENDER_SUBDOMAIN = None -# If you want to have a vanity domain that points to Tender, put that here. -# For example, "help.myapp.com". Otherwise, should should be your full -# tenderapp domain name: for example, "example.tenderapp.com". -TENDER_DOMAIN = None - ################################# CELERY ###################################### # Message configuration diff --git a/cms/envs/test.py b/cms/envs/test.py index 16133ac8ef..1d7e585f22 100644 --- a/cms/envs/test.py +++ b/cms/envs/test.py @@ -94,9 +94,6 @@ STATICFILES_STORAGE = 'pipeline.storage.NonPackagingPipelineStorage' STATIC_URL = "/static/" PIPELINE_ENABLED = False -TENDER_DOMAIN = "help.edge.edx.org" -TENDER_SUBDOMAIN = "edxedge" - # Update module store settings per defaults for tests update_module_store_settings( MODULESTORE, diff --git a/cms/static/cms/js/build.js b/cms/static/cms/js/build.js index dc9abfdc5b..1b290554b5 100644 --- a/cms/static/cms/js/build.js +++ b/cms/static/cms/js/build.js @@ -83,7 +83,6 @@ 'gettext': 'empty:', 'xmodule': 'empty:', 'mathjax': 'empty:', - 'tender': 'empty:', 'youtube': 'empty:' }, diff --git a/cms/static/cms/js/require-config.js b/cms/static/cms/js/require-config.js index c64ac7f9c1..4e5be98dfc 100644 --- a/cms/static/cms/js/require-config.js +++ b/cms/static/cms/js/require-config.js @@ -70,14 +70,6 @@ require.config({ // end of Annotation tool files // externally hosted files - "tender": [ - // if TENDER_SUBDOMAIN is defined, use that; otherwise, use a dummy value - // (the application JS will never `require(['tender'])` if it's not defined) - "//" + (typeof TENDER_SUBDOMAIN === "string" ? TENDER_SUBDOMAIN : "example") + ".tenderapp.com/tender_widget", - // if tender fails to load, fallback on a local file - // so that require doesn't fall over - "js/src/tender_fallback" - ], "mathjax": "//cdn.mathjax.org/mathjax/2.4-latest/MathJax.js?config=TeX-MML-AM_HTMLorMML-full&delayStartupUntil=configured", "youtube": [ // youtube URL does not end in ".js". We add "?noext" to the path so @@ -172,9 +164,6 @@ require.config({ deps: ["backbone"], exports: "Backbone.Paginator" }, - "tender": { - exports: 'Tender' - }, "youtube": { exports: "YT" }, diff --git a/cms/static/coffee/spec/main.coffee b/cms/static/coffee/spec/main.coffee index 0fcf7f6e2e..5454bea202 100644 --- a/cms/static/coffee/spec/main.coffee +++ b/cms/static/coffee/spec/main.coffee @@ -53,7 +53,6 @@ requirejs.config({ "mathjax": "//cdn.mathjax.org/mathjax/2.4-latest/MathJax.js?config=TeX-MML-AM_HTMLorMML-full&delayStartupUntil=configured", "youtube": "//www.youtube.com/player_api?noext", - "tender": "//api.tenderapp.com/tender_widget", "coffee/src/ajax_prefix": "xmodule_js/common_static/coffee/src/ajax_prefix", "js/spec/test_utils": "js/spec/test_utils", diff --git a/cms/static/coffee/spec/main_squire.coffee b/cms/static/coffee/spec/main_squire.coffee index 1feee91414..866e8d1a12 100644 --- a/cms/static/coffee/spec/main_squire.coffee +++ b/cms/static/coffee/spec/main_squire.coffee @@ -44,7 +44,6 @@ requirejs.config({ "mathjax": "//cdn.mathjax.org/mathjax/2.4-latest/MathJax.js?config=TeX-MML-AM_HTMLorMML-full&delayStartupUntil=configured", "youtube": "//www.youtube.com/player_api?noext", - "tender": "//api.tenderapp.com/tender_widget.js" "coffee/src/ajax_prefix": "xmodule_js/common_static/coffee/src/ajax_prefix" } diff --git a/cms/static/js/base.js b/cms/static/js/base.js index 5d937ef83f..4ab1c9a505 100644 --- a/cms/static/js/base.js +++ b/cms/static/js/base.js @@ -61,9 +61,6 @@ domReady(function() { // general link management - smooth scrolling page links $('a[rel*="view"][href^="#"]').bind('click', smoothScrollLink); - // tender feedback window scrolling - $('a.show-tender').bind('click', smoothScrollTop); - IframeUtils.iframeBinding(); // disable ajax caching in IE so that backbone fetches work diff --git a/cms/static/sass/_build.scss b/cms/static/sass/_build.scss index 303861279e..2253926702 100644 --- a/cms/static/sass/_build.scss +++ b/cms/static/sass/_build.scss @@ -37,7 +37,6 @@ @import 'elements/header'; @import 'elements/footer'; @import 'elements/sock'; -@import 'elements/tender-widget'; @import 'elements/system-feedback'; // alerts, notifications, states @import 'elements/system-help'; // help UI @import 'elements/modal'; // interstitial UI, dialogs, modal windows diff --git a/cms/static/sass/elements/_sock.scss b/cms/static/sass/elements/_sock.scss index 92e2fa9bb9..4ed0e06f69 100644 --- a/cms/static/sass/elements/_sock.scss +++ b/cms/static/sass/elements/_sock.scss @@ -86,6 +86,7 @@ .action-item { @include float(left); @include margin-right($baseline/2); + margin-bottom: ($baseline/2); &:last-child { @include margin-right(0); diff --git a/cms/static/sass/elements/_tender-widget.scss b/cms/static/sass/elements/_tender-widget.scss deleted file mode 100644 index 61d968c88e..0000000000 --- a/cms/static/sass/elements/_tender-widget.scss +++ /dev/null @@ -1,273 +0,0 @@ -// tender help/support widget -// ==================== - -// UI: hiding the default tender help "tag" element -#tender_toggler { - display: none; -} - -#tender_frame, #tender_window { - background-image: none !important; - background: none; -} - -#tender_window { - border-radius: 3px; - box-shadow: 0 2px 3px $shadow; - height: ($baseline*35) !important; - background: $white !important; - border: 2px solid $blue; -} - -#tender_window { - padding: 0 !important; -} - -#tender_frame { - background: $white; -} - -#tender_closer { - color: $white-t2 !important; - text-transform: uppercase; - top: 16px !important; - - &:hover { - color: $white !important; - } -} - -// ==================== - -// tender style overrides - not rendered through here, but an archive is needed -#tender_frame iframe html { - font-size: 62.5%; -} - -.widget-layout { - font-family: 'Open Sans', sans-serif; -} - -.widget-layout .search, -.widget-layout .tabs, -.widget-layout .footer, -.widget-layout .header h1 a { - display: none; -} - -.widget-layout .header { - background: rgb(0, 159, 230); - padding: ($baseline/2) $baseline; -} - -.widget-layout h1, .widget-layout h2, .widget-layout h3, .widget-layout h4, .widget-layout h5, .widget-layout h6, .widget-layout label { - @extend %t-strong; -} - -.widget-layout .header h1 { - @extend %t-title4; -} - -.widget-layout .content { - overflow: auto; - height: auto !important; - padding: 20px; -} - -.widget-layout .flash { - margin: -10px 0 15px 0; - padding: 10px 20px !important; - background-image: none !important; -} - -.widget-layout .flash-error { - background: rgb(178, 6, 16) !important; - color: rgb(255,255,255) !important; -} - -.widget-layout label { - @extend %t-copy-sub1; - @extend %t-strong; - margin-bottom: ($baseline/4); - color: #4c4c4c; -} - -.widget-layout input[type="text"], .widget-layout textarea { - @extend %t-copy-base; - padding: 10px; - color: rgb(0,0,0) !important; - border: 1px solid #b0b6c2; - border-radius: 2px; - background-color: #edf1f5; - background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #edf1f5),color-stop(100%, #fdfdfe)); - background-image: -webkit-linear-gradient(top, #edf1f5,#fdfdfe); - background-image: -moz-linear-gradient(top, #edf1f5,#fdfdfe); - background-image: -ms-linear-gradient(top, #edf1f5,#fdfdfe); - background-image: -o-linear-gradient(top, #edf1f5,#fdfdfe); - background-image: linear-gradient(top, #edf1f5,#fdfdfe); - background-color: #edf1f5; - -webkit-box-shadow: 0 1px 2px rgba(0,0,0,0.1) inset; - -moz-box-shadow: 0 1px 2px rgba(0,0,0,0.1) inset; - box-shadow: 0 1px 2px rgba(0,0,0,0.1) inset; -} - -.widget-layout input[type="text"]:focus, .widget-layout textarea:focus { - background-color: #fffcf1; - background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fffcf1),color-stop(100%, #fffefd)); - background-image: -webkit-linear-gradient(top, #fffcf1,#fffefd); - background-image: -moz-linear-gradient(top, #fffcf1,#fffefd); - background-image: -ms-linear-gradient(top, #fffcf1,#fffefd); - background-image: -o-linear-gradient(top, #fffcf1,#fffefd); - background-image: linear-gradient(top, #fffcf1,#fffefd); - outline: 0; -} - -.widget-layout textarea { - width: 97%; -} - -.widget-layout p.note { - text-align: right !important; - display: inline-block !important; - position: absolute !important; - right: -130px !important; - top: -5px !important; - font-size: 13px !important; - opacity: 0.80; -} - -.widget-layout .form-actions { - margin: 15px 0; - border: none; - padding: 0; -} - -.widget-layout dl.form { - float: none; - width: 100%; - border-bottom: 1px solid $gray-l5; - margin-bottom: ($baseline/2); - padding-bottom: ($baseline/2); -} - -.widget-layout dl.form:last-child { - border: none; - padding-bottom: 0; - margin-bottom: $baseline; -} - -.widget-layout dl.form dt, .widget-layout dl.form dd { - display: inline-block; - vertical-align: middle; -} - -.widget-layout dl.form dt { - margin-right: ($baseline*0.75); - width: 70px; -} - -.widget-layout dl.form dd { - width: 65%; - position: relative; -} - -// specific elements -.widget-layout #discussion_body { - -} - -.widget-layout #discussion_body:before { - @extend %t-copy-sub1; - @extend %t-strong; - content: "What Question or Feedback Would You Like to Share?"; - display: block; - margin-bottom: ($baseline/4); - color: #4c4c4c; -} - - -.widget-layout dl#brain_buster_captcha { - float: none; - width: 100%; - border-top: 1px solid $gray-l5; - margin-top: ($baseline/2); - padding-top: ($baseline/2); -} - -.widget-layout dl#brain_buster_captcha dd { - display: block !important; -} - -.widget-layout dl#brain_buster_captcha #captcha_answer { - border-color: #333; -} - -.widget-layout dl#brain_buster_captcha dd label { - @extend %t-strong; - display: block; - margin: 0 15px 5px 0 !important; -} - -.widget-layout dl#brain_buster_captcha dd #captcha_answer { - display: block; - width: 97%; -} - -.widget-layout .form-actions .btn-post_topic { - @extend %t-copy-base; - @extend %t-strong; - display: block; - width: 100%; - height: auto !important; - -webkit-box-shadow: 0 1px 0 rgba(255,255,255,0.3) inset,0 0 0 $transparent; - -moz-box-shadow: 0 1px 0 rgba(255,255,255,0.3) inset,0 0 0 $transparent; - box-shadow: 0 1px 0 rgba(255,255,255,0.3) inset,0 0 0 $transparent; - -webkit-transition-property: background-color,0.15s; - -moz-transition-property: background-color,0.15s; - -ms-transition-property: background-color,0.15s; - -o-transition-property: background-color,0.15s; - transition-property: background-color,0.15s; - -webkit-transition-duration: box-shadow,0.15s; - -moz-transition-duration: box-shadow,0.15s; - -ms-transition-duration: box-shadow,0.15s; - -o-transition-duration: box-shadow,0.15s; - transition-duration: box-shadow,0.15s; - -webkit-transition-timing-function: ease-out; - -moz-transition-timing-function: ease-out; - -ms-transition-timing-function: ease-out; - -o-transition-timing-function: ease-out; - transition-timing-function: ease-out; - -webkit-transition-delay: 0; - -moz-transition-delay: 0; - -ms-transition-delay: 0; - -o-transition-delay: 0; - transition-delay: 0; - border: 1px solid #34854c; - border-radius: 3px; - background-color: rgba(255,255,255,0.3); - background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(255,255,255,0.3)),color-stop(100%, rgba(255,255,255,0))); - background-image: -webkit-linear-gradient(top, rgba(255,255,255,0.3),rgba(255,255,255,0)); - background-image: -moz-linear-gradient(top, rgba(255,255,255,0.3),rgba(255,255,255,0)); - background-image: -ms-linear-gradient(top, rgba(255,255,255,0.3),rgba(255,255,255,0)); - background-image: -o-linear-gradient(top, rgba(255,255,255,0.3),rgba(255,255,255,0)); - background-image: linear-gradient(top, rgba(255,255,255,0.3),rgba(255,255,255,0)); - background-color: #25b85a; - -webkit-box-shadow: 0 1px 0 rgba(255,255,255,0.3) inset; - -moz-box-shadow: 0 1px 0 rgba(255,255,255,0.3) inset; - box-shadow: 0 1px 0 rgba(255,255,255,0.3) inset; - color: $white; - text-align: center; - margin-top: $baseline; - padding: ($baseline/2) $baseline; -} - -.widget-layout .form-actions #private-discussion-opt { - float: none; - text-align: left; - margin: 0 0 15px 0; -} - -.widget-layout .form-actions .btn-post_topic:hover, .widget-layout .form-actions .btn-post_topic:active { - background-color: #16ca57; - color: $white; -} diff --git a/cms/templates/activation_invalid.html b/cms/templates/activation_invalid.html index 60a7954a56..fd9e5a9e5f 100644 --- a/cms/templates/activation_invalid.html +++ b/cms/templates/activation_invalid.html @@ -24,16 +24,6 @@ )}

        - - diff --git a/cms/templates/base.html b/cms/templates/base.html index 7d8cda30da..eca989ad37 100644 --- a/cms/templates/base.html +++ b/cms/templates/base.html @@ -42,7 +42,6 @@ import json @@ -65,7 +64,6 @@ import json <%include file="widgets/sock.html" args="online_help_token=online_help_token" /> % endif <%include file="widgets/footer.html" /> - <%include file="widgets/tender.html" />
        diff --git a/cms/templates/error.html b/cms/templates/error.html index 99191a3d4d..cebe726544 100644 --- a/cms/templates/error.html +++ b/cms/templates/error.html @@ -14,15 +14,8 @@ from django.conf import settings <%! -if settings.TENDER_DOMAIN: - help_link_start = ''.format( - domain=settings.TENDER_DOMAIN, - title=_("Use our feedback tool, Tender, to share your feedback") - ), - help_link_end = '' -else: - help_link_start = ''.format(email=settings.TECH_SUPPORT_EMAIL) - help_link_end = '' +help_link_start = ''.format(email=settings.TECH_SUPPORT_EMAIL) +help_link_end = '' %> <%block name="content"> diff --git a/cms/templates/index.html b/cms/templates/index.html index 92efdd0d81..162e95a4d5 100644 --- a/cms/templates/index.html +++ b/cms/templates/index.html @@ -479,13 +479,6 @@ ${_("Getting Started with {studio_name}").format(studio_name=settings.STUDIO_NAME)} - % if settings.TENDER_DOMAIN: -
      3. - - ${_("Request help with {studio_name}").format(studio_name=settings.STUDIO_NAME)} - -
      4. - % endif @@ -513,14 +506,8 @@ <%! from django.conf import settings -if settings.TENDER_DOMAIN: - help_link_start = ''.format( - domain=settings.TENDER_DOMAIN, - ) - help_link_end = '' -else: - help_link_start = ''.format(email=settings.TECH_SUPPORT_EMAIL) - help_link_end = '' +help_link_start = ''.format(email=settings.TECH_SUPPORT_EMAIL) +help_link_end = '' %>

        ${_("Your request to author courses in {studio_name} has been denied. Please {link_start}contact {platform_name} Staff with further questions{link_end}.").format( studio_name=settings.STUDIO_NAME, @@ -556,16 +543,6 @@ else:

        ${_('Need help?')}

        ${_('Please check your Junk or Spam folders in case our email isn\'t in your INBOX. Still can\'t find the verification email? Request help via the link below.')}

        - -
          - % if settings.TENDER_DOMAIN: -
        1. - - ${_("Request help with your {studio_name} account").format(studio_name=settings.STUDIO_NAME)} - -
        2. - % endif -
        diff --git a/cms/templates/login.html b/cms/templates/login.html index 0a2e036654..5e99961f63 100644 --- a/cms/templates/login.html +++ b/cms/templates/login.html @@ -45,20 +45,6 @@ from django.utils.translation import ugettext as _ - - % if settings.TENDER_DOMAIN: - - % endif diff --git a/cms/templates/widgets/footer.html b/cms/templates/widgets/footer.html index 4ddfd3763b..8c1e21fbbf 100644 --- a/cms/templates/widgets/footer.html +++ b/cms/templates/widgets/footer.html @@ -19,11 +19,6 @@ from django.core.urlresolvers import reverse - % if settings.TENDER_DOMAIN and user.is_authenticated(): - - % endif diff --git a/cms/templates/widgets/sock.html b/cms/templates/widgets/sock.html index 55f588d4e2..3d222fd9ed 100644 --- a/cms/templates/widgets/sock.html +++ b/cms/templates/widgets/sock.html @@ -20,46 +20,56 @@ from django.core.urlresolvers import reverse
        -

        ${_("{studio_name} Documentation").format(studio_name=settings.STUDIO_NAME)}

        + <%! + from django.conf import settings -
        -

        ${_("You can click Help in the upper right corner of any page to get more information about the page you're on. You can also use the links below to download the Building and Running an {platform_name} Course PDF file, to go to the {platform_name} Author Support site, or to enroll in edX101.").format(platform_name=settings.PLATFORM_NAME)}

        -
        + is_edx_domain = settings.FEATURES.get('IS_EDX_DOMAIN', False) + partner_email = settings.FEATURES.get('PARTNER_SUPPORT_EMAIL', '') - -
        - - % if settings.TENDER_DOMAIN: - - % endif diff --git a/cms/templates/widgets/tender.html b/cms/templates/widgets/tender.html deleted file mode 100644 index bf8b9e20de..0000000000 --- a/cms/templates/widgets/tender.html +++ /dev/null @@ -1,20 +0,0 @@ -% if settings.TENDER_SUBDOMAIN and user.is_authenticated(): - -% endif diff --git a/common/static/js/src/tender_fallback.js b/common/static/js/src/tender_fallback.js deleted file mode 100644 index 1df3b2f106..0000000000 --- a/common/static/js/src/tender_fallback.js +++ /dev/null @@ -1 +0,0 @@ -console.error("Can't load Tender -- anything that relies on it will fail"); diff --git a/common/test/acceptance/pages/studio/utils.py b/common/test/acceptance/pages/studio/utils.py index cd2607af35..f3c28712dd 100644 --- a/common/test/acceptance/pages/studio/utils.py +++ b/common/test/acceptance/pages/studio/utils.py @@ -4,6 +4,7 @@ Utility methods useful for Studio page tests. from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.keys import Keys from bok_choy.javascript import js_defined +from bok_choy.promise import EmptyPromise from ..common.utils import click_css, wait_for_notification @@ -199,3 +200,17 @@ def verify_ordering(test_class, page, expected_orderings): blocks_checked.add(expected) break test_class.assertEqual(len(blocks_checked), len(xblocks)) + + +def click_studio_help(page): + """Click the Studio help link in the page footer.""" + page.q(css='.cta-show-sock').click() + EmptyPromise( + lambda: page.q(css='.support .list-actions a').results[0].text != '', + 'Support section opened' + ).fulfill() + + +def studio_help_links(page): + """Return the list of Studio help links in the page footer.""" + return page.q(css='.support .list-actions a').results diff --git a/common/test/acceptance/tests/studio/test_studio_help.py b/common/test/acceptance/tests/studio/test_studio_help.py new file mode 100644 index 0000000000..4561019396 --- /dev/null +++ b/common/test/acceptance/tests/studio/test_studio_help.py @@ -0,0 +1,46 @@ +""" +Test the Studio help links. +""" + +from .base_studio_test import StudioCourseTest +from ...pages.studio.index import DashboardPage +from ...pages.studio.utils import click_studio_help, studio_help_links + + +class StudioHelpTest(StudioCourseTest): + """Tests for Studio help.""" + + def test_studio_help_links(self): + """Test that the help links are present and have the correct content.""" + page = DashboardPage(self.browser) + page.visit() + click_studio_help(page) + links = studio_help_links(page) + expected_links = [{ + 'href': u'http://docs.edx.org/', + 'text': u'edX Documentation', + 'sr_text': u'Access documentation on http://docs.edx.org' + }, { + 'href': u'https://open.edx.org/', + 'text': u'Open edX Portal', + 'sr_text': u'Access the Open edX Portal' + }, { + 'href': u'https://www.edx.org/course/overview-creating-edx-course-edx-edx101#.VO4eaLPF-n1', + 'text': u'Enroll in edX101', + 'sr_text': u'Enroll in edX101: Overview of Creating an edX Course' + }, { + 'href': u'https://www.edx.org/course/creating-course-edx-studio-edx-studiox', + 'text': u'Enroll in StudioX', + 'sr_text': u'Enroll in StudioX: Creating a Course with edX Studio' + }, { + 'href': u'mailto:partner-support@example.com', + 'text': u'Contact Us', + 'sr_text': 'Send an email to partner-support@example.com' + }] + for expected, actual in zip(expected_links, links): + self.assertEqual(expected['href'], actual.get_attribute('href')) + self.assertEqual(expected['text'], actual.text) + self.assertEqual( + expected['sr_text'], + actual.find_element_by_xpath('following-sibling::span').text + ) diff --git a/lms/static/js/spec/main.js b/lms/static/js/spec/main.js index 9fac876357..199d7f5acd 100644 --- a/lms/static/js/spec/main.js +++ b/lms/static/js/spec/main.js @@ -50,7 +50,6 @@ 'domReady': 'xmodule_js/common_static/js/vendor/domReady', 'mathjax': '//cdn.mathjax.org/mathjax/2.4-latest/MathJax.js?config=TeX-MML-AM_HTMLorMML-full&delayStartupUntil=configured', 'youtube': '//www.youtube.com/player_api?noext', - 'tender': '//api.tenderapp.com/tender_widget', 'coffee/src/ajax_prefix': 'xmodule_js/common_static/coffee/src/ajax_prefix', 'coffee/src/instructor_dashboard/student_admin': 'coffee/src/instructor_dashboard/student_admin', 'xmodule_js/common_static/js/test/add_ajax_prefix': 'xmodule_js/common_static/js/test/add_ajax_prefix', From 0d994498992b554c4b15549633f5b208d1116d02 Mon Sep 17 00:00:00 2001 From: cahrens Date: Wed, 16 Sep 2015 16:14:33 -0400 Subject: [PATCH 46/54] Emit event when last_activity_at is updated. TNL-3303 --- lms/djangoapps/teams/models.py | 4 ++++ lms/djangoapps/teams/tests/test_models.py | 12 +++++++++--- lms/djangoapps/teams/tests/test_views.py | 12 ++++++------ lms/djangoapps/teams/utils.py | 14 ++++++++++++++ lms/djangoapps/teams/views.py | 13 +------------ 5 files changed, 34 insertions(+), 21 deletions(-) create mode 100644 lms/djangoapps/teams/utils.py diff --git a/lms/djangoapps/teams/models.py b/lms/djangoapps/teams/models.py index accedf6b56..cbcb822554 100644 --- a/lms/djangoapps/teams/models.py +++ b/lms/djangoapps/teams/models.py @@ -28,6 +28,7 @@ from xmodule_django.models import CourseKeyField from util.model_utils import slugify from student.models import LanguageField, CourseEnrollment from .errors import AlreadyOnTeamInCourse, NotEnrolledInCourseForTeam, ImmutableMembershipFieldException +from teams.utils import emit_team_event from teams import TEAM_DISCUSSION_CONTEXT @@ -247,3 +248,6 @@ class CourseTeamMembership(models.Model): membership.team.last_activity_at = now membership.team.save() membership.save() + emit_team_event('edx.team.activity_updated', membership.team.course_id, { + 'team_id': membership.team_id, + }) diff --git a/lms/djangoapps/teams/tests/test_models.py b/lms/djangoapps/teams/tests/test_models.py index ba9fc6f53c..753665a473 100644 --- a/lms/djangoapps/teams/tests/test_models.py +++ b/lms/djangoapps/teams/tests/test_models.py @@ -24,8 +24,9 @@ from opaque_keys.edx.keys import CourseKey from student.tests.factories import CourseEnrollmentFactory, UserFactory from .factories import CourseTeamFactory, CourseTeamMembershipFactory -from ..models import CourseTeam, CourseTeamMembership +from teams.models import CourseTeam, CourseTeamMembership from teams import TEAM_DISCUSSION_CONTEXT +from util.testing import EventTestMixin COURSE_KEY1 = CourseKey.from_string('edx/history/1') COURSE_KEY2 = CourseKey.from_string('edx/history/2') @@ -114,7 +115,7 @@ class TeamMembershipTest(SharedModuleStoreTestCase): @ddt.ddt -class TeamSignalsTest(SharedModuleStoreTestCase): +class TeamSignalsTest(EventTestMixin, SharedModuleStoreTestCase): """Tests for handling of team-related signals.""" SIGNALS_LIST = ( @@ -133,7 +134,7 @@ class TeamSignalsTest(SharedModuleStoreTestCase): def setUp(self): """Create a user with a team to test signals.""" - super(TeamSignalsTest, self).setUp() + super(TeamSignalsTest, self).setUp('teams.utils.tracker') self.user = UserFactory.create(username="user") self.moderator = UserFactory.create(username="moderator") self.team = CourseTeamFactory(discussion_topic_id=self.DISCUSSION_TOPIC_ID) @@ -168,9 +169,14 @@ class TeamSignalsTest(SharedModuleStoreTestCase): now = datetime.utcnow().replace(tzinfo=pytz.utc) self.assertGreater(now, team.last_activity_at) self.assertGreater(now, team_membership.last_activity_at) + self.assert_event_emitted( + 'edx.team.activity_updated', + team_id=team.id, + ) else: self.assertEqual(team.last_activity_at, team_last_activity) self.assertEqual(team_membership.last_activity_at, team_membership_last_activity) + self.assert_no_events_were_emitted() @ddt.data( *itertools.product( diff --git a/lms/djangoapps/teams/tests/test_views.py b/lms/djangoapps/teams/tests/test_views.py index f1610a6d99..cc7fcc23ed 100644 --- a/lms/djangoapps/teams/tests/test_views.py +++ b/lms/djangoapps/teams/tests/test_views.py @@ -418,7 +418,7 @@ class TestListTeamsAPI(EventTestMixin, TeamAPITestCase): """Test cases for the team listing API endpoint.""" def setUp(self): # pylint: disable=arguments-differ - super(TestListTeamsAPI, self).setUp('teams.views.tracker') + super(TestListTeamsAPI, self).setUp('teams.utils.tracker') @ddt.data( (None, 401), @@ -592,7 +592,7 @@ class TestCreateTeamAPI(EventTestMixin, TeamAPITestCase): """Test cases for the team creation endpoint.""" def setUp(self): # pylint: disable=arguments-differ - super(TestCreateTeamAPI, self).setUp('teams.views.tracker') + super(TestCreateTeamAPI, self).setUp('teams.utils.tracker') @ddt.data( (None, 401), @@ -803,7 +803,7 @@ class TestDeleteTeamAPI(EventTestMixin, TeamAPITestCase): """Test cases for the team delete endpoint.""" def setUp(self): # pylint: disable=arguments-differ - super(TestDeleteTeamAPI, self).setUp('teams.views.tracker') + super(TestDeleteTeamAPI, self).setUp('teams.utils.tracker') @ddt.data( (None, 401), @@ -853,7 +853,7 @@ class TestUpdateTeamAPI(EventTestMixin, TeamAPITestCase): """Test cases for the team update endpoint.""" def setUp(self): # pylint: disable=arguments-differ - super(TestUpdateTeamAPI, self).setUp('teams.views.tracker') + super(TestUpdateTeamAPI, self).setUp('teams.utils.tracker') @ddt.data( (None, 401), @@ -1182,7 +1182,7 @@ class TestCreateMembershipAPI(EventTestMixin, TeamAPITestCase): """Test cases for the membership creation endpoint.""" def setUp(self): # pylint: disable=arguments-differ - super(TestCreateMembershipAPI, self).setUp('teams.views.tracker') + super(TestCreateMembershipAPI, self).setUp('teams.utils.tracker') @ddt.data( (None, 401), @@ -1346,7 +1346,7 @@ class TestDeleteMembershipAPI(EventTestMixin, TeamAPITestCase): """Test cases for the membership deletion endpoint.""" def setUp(self): # pylint: disable=arguments-differ - super(TestDeleteMembershipAPI, self).setUp('teams.views.tracker') + super(TestDeleteMembershipAPI, self).setUp('teams.utils.tracker') @ddt.data( (None, 401), diff --git a/lms/djangoapps/teams/utils.py b/lms/djangoapps/teams/utils.py new file mode 100644 index 0000000000..dc576397b5 --- /dev/null +++ b/lms/djangoapps/teams/utils.py @@ -0,0 +1,14 @@ +"""Utility methods related to teams.""" + +from eventtracking import tracker +from track import contexts + + +def emit_team_event(event_name, course_key, event_data): + """ + Emit team events with the correct course id context. + """ + context = contexts.course_context_from_course_id(course_key) + + with tracker.get_tracker().context(event_name, context): + tracker.emit(event_name, event_data) diff --git a/lms/djangoapps/teams/views.py b/lms/djangoapps/teams/views.py index 07f477fb6c..6a6af4e5d9 100644 --- a/lms/djangoapps/teams/views.py +++ b/lms/djangoapps/teams/views.py @@ -39,8 +39,6 @@ from opaque_keys import InvalidKeyError from opaque_keys.edx.keys import CourseKey from courseware.courses import get_course_with_access, has_access -from eventtracking import tracker -from track import contexts from student.models import CourseEnrollment, CourseAccessRole from student.roles import CourseStaffRole from django_comment_client.utils import has_discussion_privileges @@ -59,6 +57,7 @@ from .serializers import ( ) from .search_indexes import CourseTeamIndexer from .errors import AlreadyOnTeamInCourse, ElasticSearchConnectionError, NotEnrolledInCourseForTeam +from .utils import emit_team_event TEAM_MEMBERSHIPS_PER_PAGE = 2 TOPICS_PER_PAGE = 12 @@ -67,16 +66,6 @@ MAXIMUM_SEARCH_SIZE = 100000 log = logging.getLogger(__name__) -def emit_team_event(event_name, course_key, event_data): - """ - Emit team events with the correct course id context. - """ - context = contexts.course_context_from_course_id(course_key) - - with tracker.get_tracker().context(event_name, context): - tracker.emit(event_name, event_data) - - @receiver(post_save, sender=CourseTeam) def team_post_save_callback(sender, instance, **kwargs): # pylint: disable=unused-argument """ Emits signal after the team is saved. """ From 6a5ce5d544c6642b6586b0deecd67fdb6b01d6cd Mon Sep 17 00:00:00 2001 From: muhammad-ammar Date: Mon, 31 Aug 2015 13:52:20 +0500 Subject: [PATCH 47/54] Upgrade factory_boy TNL-3179 --- .../course_modes/tests/factories.py | 3 +- common/djangoapps/student/tests/factories.py | 39 ++++++++++++------- common/djangoapps/student/tests/test_login.py | 3 +- .../xmodule/modulestore/tests/factories.py | 5 ++- .../xmodule/tests/test_xblock_wrappers.py | 9 +++-- .../xmodule/xmodule/tests/xml/factories.py | 3 +- common/test/acceptance/fixtures/discussion.py | 6 ++- common/test/acceptance/fixtures/edxnotes.py | 6 ++- lms/djangoapps/ccx/tests/factories.py | 3 +- .../certificates/tests/factories.py | 28 +++++++++---- lms/djangoapps/courseware/tests/factories.py | 12 ++++-- .../courseware/tests/test_model_data.py | 4 +- .../django_comment_client/tests/factories.py | 6 ++- .../instructor_task/tests/factories.py | 3 +- lms/djangoapps/licenses/tests.py | 6 ++- lms/djangoapps/teams/tests/factories.py | 8 ++-- .../verify_student/tests/factories.py | 3 +- .../djangoapps/course_groups/tests/helpers.py | 9 +++-- .../djangoapps/user_api/tests/factories.py | 9 +++-- requirements/edx/base.txt | 2 +- requirements/edx/github.txt | 3 +- 21 files changed, 113 insertions(+), 57 deletions(-) diff --git a/common/djangoapps/course_modes/tests/factories.py b/common/djangoapps/course_modes/tests/factories.py index bbe1ca5c2b..853922bb32 100644 --- a/common/djangoapps/course_modes/tests/factories.py +++ b/common/djangoapps/course_modes/tests/factories.py @@ -6,7 +6,8 @@ from opaque_keys.edx.locations import SlashSeparatedCourseKey # Factories are self documenting # pylint: disable=missing-docstring class CourseModeFactory(DjangoModelFactory): - FACTORY_FOR = CourseMode + class Meta(object): + model = CourseMode course_id = SlashSeparatedCourseKey('MITx', '999', 'Robot_Super_Course') mode_slug = 'audit' diff --git a/common/djangoapps/student/tests/factories.py b/common/djangoapps/student/tests/factories.py index 7965cdd186..f59750eb40 100644 --- a/common/djangoapps/student/tests/factories.py +++ b/common/djangoapps/student/tests/factories.py @@ -17,14 +17,16 @@ from opaque_keys.edx.locations import SlashSeparatedCourseKey class GroupFactory(DjangoModelFactory): - FACTORY_FOR = Group - FACTORY_DJANGO_GET_OR_CREATE = ('name', ) + class Meta(object): + model = Group + django_get_or_create = ('name', ) name = factory.Sequence(u'group{0}'.format) class UserStandingFactory(DjangoModelFactory): - FACTORY_FOR = UserStanding + class Meta(object): + model = UserStanding user = None account_status = None @@ -32,8 +34,9 @@ class UserStandingFactory(DjangoModelFactory): class UserProfileFactory(DjangoModelFactory): - FACTORY_FOR = UserProfile - FACTORY_DJANGO_GET_OR_CREATE = ('user', ) + class Meta(object): + model = UserProfile + django_get_or_create = ('user', ) user = None name = factory.LazyAttribute(u'{0.user.first_name} {0.user.last_name}'.format) @@ -45,7 +48,8 @@ class UserProfileFactory(DjangoModelFactory): class CourseModeFactory(DjangoModelFactory): - FACTORY_FOR = CourseMode + class Meta(object): + model = CourseMode course_id = None mode_display_name = u'Honor Code', @@ -57,15 +61,17 @@ class CourseModeFactory(DjangoModelFactory): class RegistrationFactory(DjangoModelFactory): - FACTORY_FOR = Registration + class Meta(object): + model = Registration user = None activation_key = uuid4().hex.decode('ascii') class UserFactory(DjangoModelFactory): - FACTORY_FOR = User - FACTORY_DJANGO_GET_OR_CREATE = ('email', 'username') + class Meta(object): + model = User + django_get_or_create = ('email', 'username') username = factory.Sequence(u'robot{0}'.format) email = factory.Sequence(u'robot+test+{0}@edx.org'.format) @@ -101,7 +107,8 @@ class UserFactory(DjangoModelFactory): class AnonymousUserFactory(factory.Factory): - FACTORY_FOR = AnonymousUser + class Meta(object): + model = AnonymousUser class AdminFactory(UserFactory): @@ -109,14 +116,16 @@ class AdminFactory(UserFactory): class CourseEnrollmentFactory(DjangoModelFactory): - FACTORY_FOR = CourseEnrollment + class Meta(object): + model = CourseEnrollment user = factory.SubFactory(UserFactory) course_id = SlashSeparatedCourseKey('edX', 'toy', '2012_Fall') class CourseAccessRoleFactory(DjangoModelFactory): - FACTORY_FOR = CourseAccessRole + class Meta(object): + model = CourseAccessRole user = factory.SubFactory(UserFactory) course_id = SlashSeparatedCourseKey('edX', 'toy', '2012_Fall') @@ -124,7 +133,8 @@ class CourseAccessRoleFactory(DjangoModelFactory): class CourseEnrollmentAllowedFactory(DjangoModelFactory): - FACTORY_FOR = CourseEnrollmentAllowed + class Meta(object): + model = CourseEnrollmentAllowed email = 'test@edx.org' course_id = SlashSeparatedCourseKey('edX', 'toy', '2012_Fall') @@ -137,7 +147,8 @@ class PendingEmailChangeFactory(DjangoModelFactory): new_email: sequence of new+email+{}@edx.org activation_key: sequence of integers, padded to 30 characters """ - FACTORY_FOR = PendingEmailChange + class Meta(object): + model = PendingEmailChange user = factory.SubFactory(UserFactory) new_email = factory.Sequence(u'new+email+{0}@edx.org'.format) diff --git a/common/djangoapps/student/tests/test_login.py b/common/djangoapps/student/tests/test_login.py index e57e81b732..9ac21c17f5 100644 --- a/common/djangoapps/student/tests/test_login.py +++ b/common/djangoapps/student/tests/test_login.py @@ -8,6 +8,7 @@ from django.test import TestCase from django.test.client import Client from django.test.utils import override_settings from django.conf import settings +from django.contrib.auth.models import User from django.core.cache import cache from django.core.urlresolvers import reverse, NoReverseMatch from django.http import HttpResponseBadRequest, HttpResponse @@ -252,7 +253,7 @@ class LoginTest(TestCase): self._assert_response(response, success=True) # Reload the user from the database - self.user = UserFactory.FACTORY_FOR.objects.get(pk=self.user.pk) + self.user = User.objects.get(pk=self.user.pk) self.assertEqual(self.user.profile.get_meta()['session_id'], client1.session.session_key) diff --git a/common/lib/xmodule/xmodule/modulestore/tests/factories.py b/common/lib/xmodule/xmodule/modulestore/tests/factories.py index 891e6ede12..42221b6c4b 100644 --- a/common/lib/xmodule/xmodule/modulestore/tests/factories.py +++ b/common/lib/xmodule/xmodule/modulestore/tests/factories.py @@ -71,10 +71,11 @@ class XModuleFactory(Factory): Factory for XModules """ - # We have to give a Factory a FACTORY_FOR. + # We have to give a model for Factory. # However, the class that we create is actually determined by the category # specified in the factory - FACTORY_FOR = Dummy + class Meta(object): # pylint: disable=missing-docstring + model = Dummy @lazy_attribute def modulestore(self): diff --git a/common/lib/xmodule/xmodule/tests/test_xblock_wrappers.py b/common/lib/xmodule/xmodule/tests/test_xblock_wrappers.py index bd1fdddb8f..7ddf4a7004 100644 --- a/common/lib/xmodule/xmodule/tests/test_xblock_wrappers.py +++ b/common/lib/xmodule/xmodule/tests/test_xblock_wrappers.py @@ -104,7 +104,8 @@ class ModuleSystemFactory(Factory): performed by :func:`xmodule.tests.get_test_system`, so arguments for that function are valid factory attributes. """ - FACTORY_FOR = ModuleSystem + class Meta(object): # pylint: disable=missing-docstring + model = ModuleSystem @classmethod def _build(cls, target_class, *args, **kwargs): # pylint: disable=unused-argument @@ -119,7 +120,8 @@ class DescriptorSystemFactory(Factory): performed by :func:`xmodule.tests.get_test_descriptor_system`, so arguments for that function are valid factory attributes. """ - FACTORY_FOR = DescriptorSystem + class Meta(object): # pylint: disable=missing-docstring + model = DescriptorSystem @classmethod def _build(cls, target_class, *args, **kwargs): # pylint: disable=unused-argument @@ -190,7 +192,8 @@ class LeafDescriptorFactory(Factory): """ # pylint: disable=missing-docstring - FACTORY_FOR = XModuleDescriptor + class Meta(object): + model = XModuleDescriptor runtime = SubFactory(DescriptorSystemFactory) url_name = LazyAttributeSequence('{.block_type}_{}'.format) diff --git a/common/lib/xmodule/xmodule/tests/xml/factories.py b/common/lib/xmodule/xmodule/tests/xml/factories.py index ab844735be..946e115f1b 100644 --- a/common/lib/xmodule/xmodule/tests/xml/factories.py +++ b/common/lib/xmodule/xmodule/tests/xml/factories.py @@ -64,7 +64,8 @@ class XmlImportFactory(Factory): Factory for generating XmlImportData's, which can hold all the data needed to run an XModule XML import """ - FACTORY_FOR = XmlImportData + class Meta(object): # pylint: disable=missing-docstring + model = XmlImportData filesystem = MemoryFS() xblock_mixins = (InheritanceMixin, XModuleMixin) diff --git a/common/test/acceptance/fixtures/discussion.py b/common/test/acceptance/fixtures/discussion.py index 25cc034f6a..8655be5c1e 100644 --- a/common/test/acceptance/fixtures/discussion.py +++ b/common/test/acceptance/fixtures/discussion.py @@ -12,7 +12,8 @@ from . import COMMENTS_STUB_URL class ContentFactory(factory.Factory): - FACTORY_FOR = dict + class Meta(object): # pylint: disable=missing-docstring + model = dict id = None user_id = "1234" username = "dummy-username" @@ -63,7 +64,8 @@ class Response(Comment): class SearchResult(factory.Factory): - FACTORY_FOR = dict + class Meta(object): # pylint: disable=missing-docstring + model = dict discussion_data = [] annotated_content_info = {} num_pages = 1 diff --git a/common/test/acceptance/fixtures/edxnotes.py b/common/test/acceptance/fixtures/edxnotes.py index e64c40abec..1bc1f928d0 100644 --- a/common/test/acceptance/fixtures/edxnotes.py +++ b/common/test/acceptance/fixtures/edxnotes.py @@ -10,7 +10,8 @@ from . import EDXNOTES_STUB_URL class Range(factory.Factory): - FACTORY_FOR = dict + class Meta(object): # pylint: disable=missing-docstring + model = dict start = "/div[1]/p[1]" end = "/div[1]/p[1]" startOffset = 0 @@ -18,7 +19,8 @@ class Range(factory.Factory): class Note(factory.Factory): - FACTORY_FOR = dict + class Meta(object): # pylint: disable=missing-docstring + model = dict user = "dummy-user" usage_id = "dummy-usage-id" course_id = "dummy-course-id" diff --git a/lms/djangoapps/ccx/tests/factories.py b/lms/djangoapps/ccx/tests/factories.py index b2a99215c1..0185ac3fbe 100644 --- a/lms/djangoapps/ccx/tests/factories.py +++ b/lms/djangoapps/ccx/tests/factories.py @@ -8,7 +8,8 @@ from ccx.models import CustomCourseForEdX # pylint: disable=import-error class CcxFactory(DjangoModelFactory): # pylint: disable=missing-docstring - FACTORY_FOR = CustomCourseForEdX + class Meta(object): # pylint: disable=missing-docstring + model = CustomCourseForEdX display_name = "Test CCX" id = None # pylint: disable=redefined-builtin, invalid-name coach = SubFactory(UserFactory) diff --git a/lms/djangoapps/certificates/tests/factories.py b/lms/djangoapps/certificates/tests/factories.py index 8f5138a22d..7a6a3ac6ba 100644 --- a/lms/djangoapps/certificates/tests/factories.py +++ b/lms/djangoapps/certificates/tests/factories.py @@ -1,5 +1,7 @@ # Factories are self documenting # pylint: disable=missing-docstring +import factory +from django.core.files.base import ContentFile from factory.django import DjangoModelFactory, ImageField from student.models import LinkedInAddToProfileConfiguration @@ -12,7 +14,8 @@ from certificates.models import ( class GeneratedCertificateFactory(DjangoModelFactory): - FACTORY_FOR = GeneratedCertificate + class Meta(object): + model = GeneratedCertificate course_id = None status = CertificateStatuses.unavailable @@ -22,29 +25,39 @@ class GeneratedCertificateFactory(DjangoModelFactory): class CertificateWhitelistFactory(DjangoModelFactory): - FACTORY_FOR = CertificateWhitelist + class Meta(object): + model = CertificateWhitelist course_id = None whitelist = True class BadgeAssertionFactory(DjangoModelFactory): - FACTORY_FOR = BadgeAssertion + class Meta(object): + model = BadgeAssertion mode = 'honor' class BadgeImageConfigurationFactory(DjangoModelFactory): - FACTORY_FOR = BadgeImageConfiguration + class Meta(object): + model = BadgeImageConfiguration mode = 'honor' - icon = ImageField(color='blue', height=50, width=50, filename='test.png', format='PNG') + icon = factory.LazyAttribute( + lambda _: ContentFile( + ImageField()._make_data( # pylint: disable=protected-access + {'color': 'blue', 'width': 50, 'height': 50, 'format': 'PNG'} + ), 'test.png' + ) + ) class CertificateHtmlViewConfigurationFactory(DjangoModelFactory): - FACTORY_FOR = CertificateHtmlViewConfiguration + class Meta(object): + model = CertificateHtmlViewConfiguration enabled = True configuration = """{ @@ -76,7 +89,8 @@ class CertificateHtmlViewConfigurationFactory(DjangoModelFactory): class LinkedInAddToProfileConfigurationFactory(DjangoModelFactory): - FACTORY_FOR = LinkedInAddToProfileConfiguration + class Meta(object): + model = LinkedInAddToProfileConfiguration enabled = True company_identifier = "0_0dPSPyS070e0HsE9HNz_13_d11_" diff --git a/lms/djangoapps/courseware/tests/factories.py b/lms/djangoapps/courseware/tests/factories.py index c47fc54f41..d7c75d089f 100644 --- a/lms/djangoapps/courseware/tests/factories.py +++ b/lms/djangoapps/courseware/tests/factories.py @@ -123,7 +123,8 @@ class GlobalStaffFactory(UserFactory): class StudentModuleFactory(DjangoModelFactory): - FACTORY_FOR = StudentModule + class Meta(object): + model = StudentModule module_type = "problem" student = factory.SubFactory(UserFactory) @@ -135,7 +136,8 @@ class StudentModuleFactory(DjangoModelFactory): class UserStateSummaryFactory(DjangoModelFactory): - FACTORY_FOR = XModuleUserStateSummaryField + class Meta(object): + model = XModuleUserStateSummaryField field_name = 'existing_field' value = json.dumps('old_value') @@ -143,7 +145,8 @@ class UserStateSummaryFactory(DjangoModelFactory): class StudentPrefsFactory(DjangoModelFactory): - FACTORY_FOR = XModuleStudentPrefsField + class Meta(object): + model = XModuleStudentPrefsField field_name = 'existing_field' value = json.dumps('old_value') @@ -152,7 +155,8 @@ class StudentPrefsFactory(DjangoModelFactory): class StudentInfoFactory(DjangoModelFactory): - FACTORY_FOR = XModuleStudentInfoField + class Meta(object): + model = XModuleStudentInfoField field_name = 'existing_field' value = json.dumps('old_value') diff --git a/lms/djangoapps/courseware/tests/test_model_data.py b/lms/djangoapps/courseware/tests/test_model_data.py index a123309f85..38b51b9fdf 100644 --- a/lms/djangoapps/courseware/tests/test_model_data.py +++ b/lms/djangoapps/courseware/tests/test_model_data.py @@ -7,7 +7,7 @@ from nose.plugins.attrib import attr from functools import partial from courseware.model_data import DjangoKeyValueStore, FieldDataCache, InvalidScopeError -from courseware.models import StudentModule +from courseware.models import StudentModule, XModuleUserStateSummaryField from courseware.models import XModuleStudentInfoField, XModuleStudentPrefsField from student.tests.factories import UserFactory @@ -394,7 +394,7 @@ class TestUserStateSummaryStorage(StorageTestBase, TestCase): factory = UserStateSummaryFactory scope = Scope.user_state_summary key_factory = user_state_summary_key - storage_class = factory.FACTORY_FOR + storage_class = XModuleUserStateSummaryField class TestStudentPrefsStorage(OtherUserFailureTestMixin, StorageTestBase, TestCase): diff --git a/lms/djangoapps/django_comment_client/tests/factories.py b/lms/djangoapps/django_comment_client/tests/factories.py index a3393b6010..d5ad2dbe74 100644 --- a/lms/djangoapps/django_comment_client/tests/factories.py +++ b/lms/djangoapps/django_comment_client/tests/factories.py @@ -3,11 +3,13 @@ from django_comment_common.models import Role, Permission class RoleFactory(DjangoModelFactory): - FACTORY_FOR = Role + class Meta(object): # pylint: disable=missing-docstring + model = Role name = 'Student' course_id = 'edX/toy/2012_Fall' class PermissionFactory(DjangoModelFactory): - FACTORY_FOR = Permission + class Meta(object): # pylint: disable=missing-docstring + model = Permission name = 'create_comment' diff --git a/lms/djangoapps/instructor_task/tests/factories.py b/lms/djangoapps/instructor_task/tests/factories.py index 4f67b52ef6..bd62c8f378 100644 --- a/lms/djangoapps/instructor_task/tests/factories.py +++ b/lms/djangoapps/instructor_task/tests/factories.py @@ -9,7 +9,8 @@ from opaque_keys.edx.locations import SlashSeparatedCourseKey class InstructorTaskFactory(DjangoModelFactory): - FACTORY_FOR = InstructorTask + class Meta(object): # pylint: disable=missing-docstring + model = InstructorTask task_type = 'rescore_problem' course_id = SlashSeparatedCourseKey("MITx", "999", "Robot_Super_Course") diff --git a/lms/djangoapps/licenses/tests.py b/lms/djangoapps/licenses/tests.py index ceaf693b28..1c68c4c43a 100644 --- a/lms/djangoapps/licenses/tests.py +++ b/lms/djangoapps/licenses/tests.py @@ -32,7 +32,8 @@ log = logging.getLogger(__name__) class CourseSoftwareFactory(DjangoModelFactory): '''Factory for generating CourseSoftware objects in database''' - FACTORY_FOR = CourseSoftware + class Meta(object): # pylint: disable=missing-docstring + model = CourseSoftware name = SOFTWARE_1 full_name = SOFTWARE_1 @@ -47,7 +48,8 @@ class UserLicenseFactory(DjangoModelFactory): By default, the user assigned is null, indicating that the serial number has not yet been assigned. ''' - FACTORY_FOR = UserLicense + class Meta(object): # pylint: disable=missing-docstring + model = UserLicense user = None software = factory.SubFactory(CourseSoftwareFactory) diff --git a/lms/djangoapps/teams/tests/factories.py b/lms/djangoapps/teams/tests/factories.py index 07077a5161..ee58e1ad69 100644 --- a/lms/djangoapps/teams/tests/factories.py +++ b/lms/djangoapps/teams/tests/factories.py @@ -18,8 +18,9 @@ class CourseTeamFactory(DjangoModelFactory): Note that team_id is not auto-generated from name when using the factory. """ - FACTORY_FOR = CourseTeam - FACTORY_DJANGO_GET_OR_CREATE = ('team_id',) + class Meta(object): # pylint: disable=missing-docstring + model = CourseTeam + django_get_or_create = ('team_id',) team_id = factory.Sequence('team-{0}'.format) discussion_topic_id = factory.LazyAttribute(lambda a: uuid4().hex) @@ -30,5 +31,6 @@ class CourseTeamFactory(DjangoModelFactory): class CourseTeamMembershipFactory(DjangoModelFactory): """Factory for CourseTeamMemberships.""" - FACTORY_FOR = CourseTeamMembership + class Meta(object): # pylint: disable=missing-docstring + model = CourseTeamMembership last_activity_at = LAST_ACTIVITY_AT diff --git a/lms/djangoapps/verify_student/tests/factories.py b/lms/djangoapps/verify_student/tests/factories.py index 6514c594a9..d24e95804c 100644 --- a/lms/djangoapps/verify_student/tests/factories.py +++ b/lms/djangoapps/verify_student/tests/factories.py @@ -10,6 +10,7 @@ class SoftwareSecurePhotoVerificationFactory(DjangoModelFactory): """ Factory for SoftwareSecurePhotoVerification """ - FACTORY_FOR = SoftwareSecurePhotoVerification + class Meta(object): # pylint: disable=missing-docstring + model = SoftwareSecurePhotoVerification status = 'approved' diff --git a/openedx/core/djangoapps/course_groups/tests/helpers.py b/openedx/core/djangoapps/course_groups/tests/helpers.py index eb5e312f5f..636b8b05e8 100644 --- a/openedx/core/djangoapps/course_groups/tests/helpers.py +++ b/openedx/core/djangoapps/course_groups/tests/helpers.py @@ -18,7 +18,8 @@ class CohortFactory(DjangoModelFactory): """ Factory for constructing mock cohorts. """ - FACTORY_FOR = CourseUserGroup + class Meta(object): # pylint: disable=missing-docstring + model = CourseUserGroup name = Sequence("cohort{}".format) course_id = SlashSeparatedCourseKey("dummy", "dummy", "dummy") @@ -37,7 +38,8 @@ class CourseCohortFactory(DjangoModelFactory): """ Factory for constructing mock course cohort. """ - FACTORY_FOR = CourseCohort + class Meta(object): # pylint: disable=missing-docstring + model = CourseCohort course_user_group = factory.SubFactory(CohortFactory) assignment_type = 'manual' @@ -47,7 +49,8 @@ class CourseCohortSettingsFactory(DjangoModelFactory): """ Factory for constructing mock course cohort settings. """ - FACTORY_FOR = CourseCohortsSettings + class Meta(object): # pylint: disable=missing-docstring + model = CourseCohortsSettings is_cohorted = False course_id = SlashSeparatedCourseKey("dummy", "dummy", "dummy") diff --git a/openedx/core/djangoapps/user_api/tests/factories.py b/openedx/core/djangoapps/user_api/tests/factories.py index 8b1198bef5..14fd9ac934 100644 --- a/openedx/core/djangoapps/user_api/tests/factories.py +++ b/openedx/core/djangoapps/user_api/tests/factories.py @@ -10,7 +10,8 @@ from ..models import UserPreference, UserCourseTag, UserOrgTag # Factories are self documenting # pylint: disable=missing-docstring class UserPreferenceFactory(DjangoModelFactory): - FACTORY_FOR = UserPreference + class Meta(object): + model = UserPreference user = None key = None @@ -18,7 +19,8 @@ class UserPreferenceFactory(DjangoModelFactory): class UserCourseTagFactory(DjangoModelFactory): - FACTORY_FOR = UserCourseTag + class Meta(object): + model = UserCourseTag user = SubFactory(UserFactory) course_id = SlashSeparatedCourseKey('org', 'course', 'run') @@ -28,7 +30,8 @@ class UserCourseTagFactory(DjangoModelFactory): class UserOrgTagFactory(DjangoModelFactory): """ Simple factory class for generating UserOrgTags """ - FACTORY_FOR = UserOrgTag + class Meta(object): + model = UserOrgTag user = SubFactory(UserFactory) org = 'org' diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index 374b10c063..1ba39187b2 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -126,7 +126,7 @@ ddt==0.8.0 diff-cover==0.8.0 django-crum==0.5 django_nose==1.4.1 -factory_boy==2.2.1 +factory_boy==2.5.1 flaky==2.0.3 freezegun==0.1.11 mock-django==0.6.9 diff --git a/requirements/edx/github.txt b/requirements/edx/github.txt index c838730490..52099e99be 100644 --- a/requirements/edx/github.txt +++ b/requirements/edx/github.txt @@ -45,7 +45,7 @@ git+https://github.com/edx/rfc6266.git@v0.0.5-edx#egg=rfc6266==0.0.5-edx -e git+https://github.com/edx/opaque-keys.git@27dc382ea587483b1e3889a3d19cbd90b9023a06#egg=opaque-keys git+https://github.com/edx/ease.git@release-2015-07-14#egg=ease==0.1.3 git+https://github.com/edx/i18n-tools.git@v0.1.3#egg=i18n-tools==v0.1.3 -git+https://github.com/edx/edx-oauth2-provider.git@0.5.6#egg=oauth2-provider==0.5.6 +git+https://github.com/edx/edx-oauth2-provider.git@0.5.7#egg=oauth2-provider==0.5.7 -e git+https://github.com/edx/edx-val.git@v0.0.5#egg=edx-val -e git+https://github.com/pmitros/RecommenderXBlock.git@518234bc354edbfc2651b9e534ddb54f96080779#egg=recommender-xblock -e git+https://github.com/edx/edx-search.git@release-2015-09-11a#egg=edx-search @@ -63,3 +63,4 @@ git+https://github.com/edx/edx-proctoring.git@0.9.6b#egg=edx-proctoring==0.9.6b # Third Party XBlocks -e git+https://github.com/mitodl/edx-sga@172a90fd2738f8142c10478356b2d9ed3e55334a#egg=edx-sga -e git+https://github.com/open-craft/xblock-poll@e7a6c95c300e95c51e42bfd1eba70489c05a6527#egg=xblock-poll + From 5fffa108f9cb110cc6d7739b9b33c8bf3af69504 Mon Sep 17 00:00:00 2001 From: Hasnain Date: Fri, 18 Sep 2015 18:18:43 +0500 Subject: [PATCH 48/54] Added my name in authors --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index 944d143cba..80c2acc58e 100644 --- a/AUTHORS +++ b/AUTHORS @@ -239,3 +239,4 @@ Mirjam Škarica Saleem Latif Julien Paillé Michael Frey +Hasnain Naveed From c6b54aa61f2e45e4db775697f98477b09e3d73dc Mon Sep 17 00:00:00 2001 From: Bill DeRusha Date: Tue, 15 Sep 2015 10:36:44 -0400 Subject: [PATCH 49/54] Readonly for enrollment end date/time on edX (for non-global-staff) TNL-2694 Add accessibility aria-readonly attributes --- .../tests/test_course_settings.py | 116 ++++++++++++++++++ cms/djangoapps/contentstore/views/course.py | 6 +- cms/static/sass/views/_settings.scss | 41 +++++-- cms/templates/settings.html | 20 ++- 4 files changed, 164 insertions(+), 19 deletions(-) diff --git a/cms/djangoapps/contentstore/tests/test_course_settings.py b/cms/djangoapps/contentstore/tests/test_course_settings.py index a9dd9ee8bd..57a9718cf5 100644 --- a/cms/djangoapps/contentstore/tests/test_course_settings.py +++ b/cms/djangoapps/contentstore/tests/test_course_settings.py @@ -16,6 +16,9 @@ from models.settings.course_details import (CourseDetails, CourseSettingsEncoder from models.settings.course_grading import CourseGradingModel from contentstore.utils import reverse_course_url, reverse_usage_url from xmodule.modulestore.tests.factories import CourseFactory +from student.roles import CourseInstructorRole +from student.tests.factories import UserFactory + from models.settings.course_metadata import CourseMetadata from xmodule.fields import Date @@ -1106,3 +1109,116 @@ class CourseGraderUpdatesTest(CourseTestCase): self.assertEqual(obj, grader) current_graders = CourseGradingModel.fetch(self.course.id).graders self.assertEqual(len(self.starting_graders) + 1, len(current_graders)) + + +class CourseEnrollmentEndFieldTest(CourseTestCase): + """ + Base class to test the enrollment end fields in the course settings details view in Studio + when using marketing site flag and global vs non-global staff to access the page. + """ + NOT_EDITABLE_HELPER_MESSAGE = "Contact your edX Partner Manager to update these settings." + NOT_EDITABLE_DATE_WRAPPER = "
        " + NOT_EDITABLE_TIME_WRAPPER = "
        " + NOT_EDITABLE_DATE_FIELD = "" + NOT_EDITABLE_TIME_FIELD = "" + + EDITABLE_DATE_WRAPPER = "
        " + EDITABLE_TIME_WRAPPER = "
        " + EDITABLE_DATE_FIELD = "" + EDITABLE_TIME_FIELD = "" + + EDITABLE_ELEMENTS = [ + EDITABLE_DATE_WRAPPER, + EDITABLE_TIME_WRAPPER, + EDITABLE_DATE_FIELD, + EDITABLE_TIME_FIELD, + ] + + NOT_EDITABLE_ELEMENTS = [ + NOT_EDITABLE_HELPER_MESSAGE, + NOT_EDITABLE_DATE_WRAPPER, + NOT_EDITABLE_TIME_WRAPPER, + NOT_EDITABLE_DATE_FIELD, + NOT_EDITABLE_TIME_FIELD, + ] + + def setUp(self): + """ Initialize course used to test enrollment fields. """ + super(CourseEnrollmentEndFieldTest, self).setUp() + self.course = CourseFactory.create(org='edX', number='dummy', display_name='Marketing Site Course') + self.course_details_url = reverse_course_url('settings_handler', unicode(self.course.id)) + + def _get_course_details_response(self, global_staff): + """ Return the course details page as either global or non-global staff""" + user = UserFactory(is_staff=global_staff) + CourseInstructorRole(self.course.id).add_users(user) + + self.client.login(username=user.username, password='test') + + return self.client.get_html(self.course_details_url) + + def _verify_editable(self, response): + """ Verify that the response has expected editable fields. + + Assert that all editable field content exists and no + uneditable field content exists for enrollment end fields. + """ + self.assertEqual(response.status_code, 200) + for element in self.NOT_EDITABLE_ELEMENTS: + self.assertNotContains(response, element) + + for element in self.EDITABLE_ELEMENTS: + self.assertContains(response, element) + + def _verify_not_editable(self, response): + """ Verify that the response has expected non-editable fields. + + Assert that all uneditable field content exists and no + editable field content exists for enrollment end fields. + """ + self.assertEqual(response.status_code, 200) + for element in self.NOT_EDITABLE_ELEMENTS: + self.assertContains(response, element) + + for element in self.EDITABLE_ELEMENTS: + self.assertNotContains(response, element) + + @mock.patch.dict("django.conf.settings.FEATURES", {'ENABLE_MKTG_SITE': False}) + def test_course_details_with_disabled_setting_global_staff(self): + """ Test that user enrollment end date is editable in response. + + Feature flag 'ENABLE_MKTG_SITE' is not enabled. + User is global staff. + """ + self._verify_editable(self._get_course_details_response(True)) + + @mock.patch.dict("django.conf.settings.FEATURES", {'ENABLE_MKTG_SITE': False}) + def test_course_details_with_disabled_setting_non_global_staff(self): + """ Test that user enrollment end date is editable in response. + + Feature flag 'ENABLE_MKTG_SITE' is not enabled. + User is non-global staff. + """ + self._verify_editable(self._get_course_details_response(False)) + + @mock.patch.dict("django.conf.settings.FEATURES", {'ENABLE_MKTG_SITE': True}) + def test_course_details_with_enabled_setting_global_staff(self): + """ Test that user enrollment end date is editable in response. + + Feature flag 'ENABLE_MKTG_SITE' is enabled. + User is global staff. + """ + self._verify_editable(self._get_course_details_response(True)) + + @mock.patch.dict("django.conf.settings.FEATURES", {'ENABLE_MKTG_SITE': True}) + def test_course_details_with_enabled_setting_non_global_staff(self): + """ Test that user enrollment end date is not editable in response. + + Feature flag 'ENABLE_MKTG_SITE' is enabled. + User is non-global staff. + """ + self._verify_not_editable(self._get_course_details_response(False)) diff --git a/cms/djangoapps/contentstore/views/course.py b/cms/djangoapps/contentstore/views/course.py index 5c230c13d7..113a543ee4 100644 --- a/cms/djangoapps/contentstore/views/course.py +++ b/cms/djangoapps/contentstore/views/course.py @@ -903,12 +903,15 @@ def settings_handler(request, course_key_string): # see if the ORG of this course can be attributed to a 'Microsite'. In that case, the # course about page should be editable in Studio - about_page_editable = not microsite.get_value_for_org( + marketing_site_enabled = microsite.get_value_for_org( course_module.location.org, 'ENABLE_MKTG_SITE', settings.FEATURES.get('ENABLE_MKTG_SITE', False) ) + about_page_editable = not marketing_site_enabled + enrollment_end_editable = GlobalStaff().has_user(request.user) or not marketing_site_enabled + short_description_editable = settings.FEATURES.get('EDITABLE_SHORT_DESCRIPTION', True) settings_context = { 'context_course': course_module, @@ -924,6 +927,7 @@ def settings_handler(request, course_key_string): 'credit_eligibility_enabled': credit_eligibility_enabled, 'is_credit_course': False, 'show_min_grade_warning': False, + 'enrollment_end_editable': enrollment_end_editable, } if prerequisite_course_enabled: courses, in_process_course_actions = get_courses_accessible_to_user(request) diff --git a/cms/static/sass/views/_settings.scss b/cms/static/sass/views/_settings.scss index 822be9f2ba..8be7e82dd5 100644 --- a/cms/static/sass/views/_settings.scss +++ b/cms/static/sass/views/_settings.scss @@ -62,6 +62,27 @@ margin-top: ($baseline); } + // specific fields - settings details + .settings-details { + + // course details that should appear more like content than elements to change + .is-not-editable { + + label { + + } + + input, textarea { + @extend %t-copy-lead1; + @extend %t-strong; + box-shadow: none; + border: none; + background: none; + margin: 0; + } + } + } + // in form - elements .group-settings { @@ -305,21 +326,10 @@ } } - // course details that should appear more like content than elements to change - .field.is-not-editable { - - label { - - } + .is-not-editable { input, textarea { - @extend %t-copy-lead1; - @extend %t-strong; - box-shadow: none; - border: none; - background: none; padding: 0; - margin: 0; } } @@ -438,6 +448,13 @@ padding-bottom: 0; } + .is-not-editable { + + input, textarea { + padding: 10px; + } + } + .field { @include float(left); width: flex-grid(3, 9); diff --git a/cms/templates/settings.html b/cms/templates/settings.html index 4f0769e080..9cccd92ecb 100644 --- a/cms/templates/settings.html +++ b/cms/templates/settings.html @@ -220,17 +220,25 @@ CMS.URL.UPLOAD_ASSET = '${upload_asset_url}'; ${_("(UTC)")}
        - + <% + enrollment_end_readonly = "readonly aria-readonly=\"true\"" if not enrollment_end_editable else "" + enrollment_end_editable_class = "is-not-editable" if not enrollment_end_editable else "" + %>
      5. -
        +
        - - ${_("Last day students can enroll")} + + + ${_("Last day students can enroll.")} + % if not enrollment_end_editable: + ${_("Contact your edX Partner Manager to update these settings.")} + % endif +
        -
        +
        - + ${_("(UTC)")}
      6. From 8171a2775eb39a7c05233df84845f5223dd3374e Mon Sep 17 00:00:00 2001 From: Sarina Canelake Date: Fri, 18 Sep 2015 09:44:22 -0400 Subject: [PATCH 50/54] Update translations (autogenerated message) --- conf/locale/ar/LC_MESSAGES/django.mo | Bin 637859 -> 637047 bytes conf/locale/ar/LC_MESSAGES/django.po | 60 ++++++------- conf/locale/ar/LC_MESSAGES/djangojs.mo | Bin 174544 -> 174544 bytes conf/locale/ar/LC_MESSAGES/djangojs.po | 2 +- conf/locale/eo/LC_MESSAGES/django.mo | Bin 985513 -> 985378 bytes conf/locale/eo/LC_MESSAGES/django.po | 64 ++++++------- conf/locale/eo/LC_MESSAGES/djangojs.mo | Bin 290146 -> 290146 bytes conf/locale/eo/LC_MESSAGES/djangojs.po | 4 +- conf/locale/es_419/LC_MESSAGES/django.mo | Bin 536587 -> 535965 bytes conf/locale/es_419/LC_MESSAGES/django.po | 59 ++++++------ conf/locale/es_419/LC_MESSAGES/djangojs.mo | Bin 146142 -> 146142 bytes conf/locale/es_419/LC_MESSAGES/djangojs.po | 2 +- conf/locale/fr/LC_MESSAGES/django.mo | Bin 357939 -> 357939 bytes conf/locale/fr/LC_MESSAGES/django.po | 55 ++++++------ conf/locale/fr/LC_MESSAGES/djangojs.mo | Bin 116841 -> 116840 bytes conf/locale/fr/LC_MESSAGES/djangojs.po | 6 +- conf/locale/he/LC_MESSAGES/django.mo | Bin 6225 -> 6225 bytes conf/locale/he/LC_MESSAGES/django.po | 53 ++++++----- conf/locale/he/LC_MESSAGES/djangojs.mo | Bin 1515 -> 1515 bytes conf/locale/he/LC_MESSAGES/djangojs.po | 2 +- conf/locale/hi/LC_MESSAGES/django.mo | Bin 204054 -> 204054 bytes conf/locale/hi/LC_MESSAGES/django.po | 53 ++++++----- conf/locale/hi/LC_MESSAGES/djangojs.mo | Bin 41286 -> 41286 bytes conf/locale/hi/LC_MESSAGES/djangojs.po | 2 +- conf/locale/ko_KR/LC_MESSAGES/django.mo | Bin 505817 -> 505255 bytes conf/locale/ko_KR/LC_MESSAGES/django.po | 100 +++++++++++---------- conf/locale/ko_KR/LC_MESSAGES/djangojs.mo | Bin 71032 -> 71022 bytes conf/locale/ko_KR/LC_MESSAGES/djangojs.po | 4 +- conf/locale/pt_BR/LC_MESSAGES/django.mo | Bin 215581 -> 215581 bytes conf/locale/pt_BR/LC_MESSAGES/django.po | 53 ++++++----- conf/locale/pt_BR/LC_MESSAGES/djangojs.mo | Bin 51859 -> 51874 bytes conf/locale/pt_BR/LC_MESSAGES/djangojs.po | 8 +- conf/locale/rtl/LC_MESSAGES/django.mo | Bin 657500 -> 657153 bytes conf/locale/rtl/LC_MESSAGES/django.po | 63 ++++++------- conf/locale/rtl/LC_MESSAGES/djangojs.mo | Bin 191695 -> 191695 bytes conf/locale/rtl/LC_MESSAGES/djangojs.po | 4 +- conf/locale/ru/LC_MESSAGES/django.mo | Bin 45867 -> 45911 bytes conf/locale/ru/LC_MESSAGES/django.po | 55 ++++++------ conf/locale/ru/LC_MESSAGES/djangojs.mo | Bin 16986 -> 16996 bytes conf/locale/ru/LC_MESSAGES/djangojs.po | 6 +- conf/locale/zh_CN/LC_MESSAGES/django.mo | Bin 262606 -> 262606 bytes conf/locale/zh_CN/LC_MESSAGES/django.po | 53 ++++++----- conf/locale/zh_CN/LC_MESSAGES/djangojs.mo | Bin 98833 -> 98833 bytes conf/locale/zh_CN/LC_MESSAGES/djangojs.po | 2 +- 44 files changed, 375 insertions(+), 335 deletions(-) diff --git a/conf/locale/ar/LC_MESSAGES/django.mo b/conf/locale/ar/LC_MESSAGES/django.mo index 61b60b64d6b8a81ada04f03f86b05fd86b99f43c..8e54e578d695049f00ab6a622e668adc5a43106b 100644 GIT binary patch delta 75203 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 ||%F!+HTaYBTBgC{t70 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 X8;3YnhmXuy*1_f6p0TWJaF_oFhqvub delta 75748 zcmXWkb)Xg17RT{9MR!SaFWn87=F;8WDInd_hfbxtyF^Nm?p73#Zcq@AQsIFD!u$Sa z&HLkhX3v?}d+oLM%(?ffZ~x4?>TTBWog~3I4*xroz;V)I$AONsFR9~fdZxXOGry$I z`34tYXRK7p=S;$H@fAju_BnrGt};GnHKr)*a~9w})c!`%KIeCgF6VPLVz%-=XD$AM zD;+2746fjFma-#lMW6Ek_u)QVUdiXY#+H?R&JL_s#pgW77*&1FOni+~aY8kpvmaAb z_c^=qA|~=V&Q~>jPF7q})91v+iK%t!lY{2V`GU+mb>=d9xVtLUdaw6V`gj3Y2PPRBU77GvTz)Ny;z z$NioC-T?=(5bZOV68}R@Ns1;uCj}P5yjb09560ZIr(-%ifXVPCX2(Aoc)^Ep*;A;!R8Q5SlG>iI{Ei?N&gob;F+Ls%GNV+qWJ6)_QZL0xAs zs$(O)_EOY9)}RKszd7UA#$|Toz!w+~Q?{@RWI=T#HQ0in`zrm>=(9HcZ^s=a4r} zanuMVwlkOEblTrz1XgM9b24KWRH(m3CF3KxoQFGc6Y7TT zKev!hMvZ7QDneO0*@<;9lJ+3%gA1`9#_Q~J7GY~tRlP&y(1I?Obl+oq+Iu|1r`XV3 zUPguZCVqx5F%`!A!sa*<)6mX^icl5If~_zkj=?{0E$X-#U9AefMcwca4#J;M1Fqc7 zt%k7Ef(_+B2h>yyLv>^tDw$S!?H#C&oyLlI4^>WCx?7g#L3OAq>IOYg*BgWCz+6zzqjKoDvNKRZv4^PpRk7xbewdac~BiLjp|TibZ?064biAZF!jG$c}RsS7OC9e*B&;C&3gV54Pk8%d2mW(QQqhN8;xJ?h4>`dTtYp;owts1bHT9X}2gkx)My zVLDXul}1IVxo0m_M8@``{za0d=YqU zkI;<}YF&sm*yjw!45%9}Kqci0)bXcKOY%)rnZF6M5y3`!x|IXVqDJ}!D#?c7F`R?R z=y|iDKIaJzV0A^f?u<2=2ncSPlz}vIVOj7NY$JMq~QXKBp+QL9MiN zv7Mg(N7+#5GLNyxY)LFmdlf3_Zlg|!H`bQqVyGK`fi>`3%!&VE8O%J+uGazQ(jJ1- zF!6YjjtH*6leE8?pd=)1`%bi{+%VJ#C!p5w`Cj_~D#?EKyoySmd#I7Om}FCtbh0Ju zAS}rK5vT}kLk;L5*2WA|?7gBV##h;#V?$GL8#VWTp^_x{m1T1VjG$c@RZfk(c3;$a zvrv!Ob*Q;Mq0bp{H*6~&leb%{hv@}8h3`Z zlcUNq5_MiSRJj$yPgorlvFbBz${L`qGZuB7>8Rru&h+Yklego0&(o-!xZ$<`LXA8y z%TA0ytrrDR^i8Q}_J5c~HmfJeXIqwMLxnyHHM07c zlMr^md^mNE&-sh}2j|*_x6ZRNyNN2lC#cZIo9}ZDVJcK4uA}brD=OlzJ%ix|mVC)D zf)6sFdKit0KxGVKE7V-K_u2#T5$&NEfgKiF(vC$f$s16Q;nVmfK0qa9%SHD2G}M%Y zH?wh#k?lqGbk-7^qs6Eju00sFTl8uJ!n1xz+9;4>=C2Axeu_&fnZZ~X*8)^5({Fr8im03;HaU-!T?m~6s zE!INcN-M)UsDVzx`l|n#Y@}kxL)2sU6Y43Je3d0h9(1PyBiY{yGhrBW<0@Q?=TU2Y zkJVO=vryOBhRTUE-u^47_2o6bj0|b$1q%vjX&AY3FX&Y_SeEnw7Xyl+>E;66V!44 zLv_sAU~`!i%hN1@I&L^>w z9x8+{@NayNPu2d$*7h5lEc9K!^*PnpKOGC>4OBTN+-&FN#DcWbZLuk>yCv*%CbFY5 zJ38Z^s0%dRY8P0E1*wj!mJU~S%u#>E(!--JWYyG_) z-ye13DX9J7aBmC;Ak4Px!GIn0I%adE7JJy9Jxh_~@F>IUEK zwgH|&&G`jvh!2o54Lim6SO*59l5spn;WgZhiT2v7*&);g{z7#qxX&(}02SgCs9cJ~ z3|Jg>d^1#pyL;{asP$z6y6^vU*=WO#wWtLo#(s-HX>{w}Yqvt(xD)Dvy-_RVAXK@2 zg(|O&sE%yK)_5A-r{n<}NHJ{A{;n9U`ai)&E{t)|e!x%=Rp;%o01m}M_$?~b_fb<* z;E=6sjZhs}g{t!-sLy{xRaMNx*0D&`5}XY+fZ`Zd=*qF7B&&()X;V~Ae1SS)AS!Do zdi$rLMz|RD*xi9jstc%&|BlL~PpAmRKVsL3L`Ap|DzaUVQ2*-TD0Zk$7onSs=q4j- zt}dW1bPsi-*WTx`kJ{t(GtX?O^P;?VCDfEPLJh2q*Y1tF&yb^GJ7EGlbm2LuNNhxn zx-JouTdSCk2-%f>V`W|<#^QFe+@Oj@MAV~1K$bj zX#&p(R8kd0jkqpq3fg&}4?x{$g7^6>REJih=JptB1lE4`|AuHykT?R|AwDv%CX#Ed#n0D?T?ZuII@DM&W2wo$f{T_$VsLZs1D%fSU7VKU=6bq9V8- zRj#K|=bb~%^&?N`oV8P7SaVd6jeJ-Ub%Xw>kj_O#W;N;pyHV9}0rkT16suyg^R~Yg z>i92Fp`L!%8_yN_SoWJ;-VptQ^k#VTC zeW~X*)I;mI*Zv6=(R-+zc;gx4qUBl&RE}l4Nc}5oE3zX3JD|#GEGl`Hp|bfn>V`K_ zA$@_G+ZdN@Zi}GycSS{XG^(m*V;Nk5is(JmbzYzb=nG%Ak>$f&?C653hS{i#f(13$%{SMU+;#M-ys}MyTVO-7d(P(_4zHI(+jub7nt$3RmE4R z2+qPTs{i%gj>LCtq*+lBse;PpZm1E2Q5~F$3iVo4lHEde_-|CXe)RUoxNFC!^(>4k z%bKXEZh&$1{13Acg;OvBkD(5HfV$vQR1&^Iofzkyee)@bqiAn$GUh3b$p`V zEZNea&MSu1n7ZnyoSOZ>rgrlK>R;t|iXHNIRPux#T47Qx z2cAGh>LqG~Z&BGEd}PN*Vjev!gD0h1MPog4l4t1mdp{6S3pEl>|P)l$&Or-iR z!G;!^8mJp|M2(;aF2!M}tWNWn+3$O0-!E#u z_Bj{%d=o0kNB)oUQ~gh6Lp@CJ#zvA9m1LPwBPfRoZAY&?2sPqGsASuO8qrZyM=zu5 z`yT4NKT*{aeCudnf|da45d*$t$^BJ4;7hisE!RmU1$jo z!mZx^9RFI<)kGaP9@UWz*d7m{Iu!Aa`d67mzq2m}^-&|Agdtpu8qp@tU8oTsMa}&+ z)H?7dYD!|hx4BP?O1ko>b)hxtI-OAKLmyPfN9d>7iogtZ=z{Yx0=J?%b^#UY-%ve% zjfzOJ4|c(fs8HuYb)+=v_=ev8&pijAA~4Q#0qXc~!`=bMJujhd`~Wr5H=gnSvvx*Q zgoDzmv;P{k>%) zF9&3b;di3_tYo;8_N-WTfoie+&InHY3PTt-uHRkh636qqZ$K4r9>=f5$5`vr&SHca6{q7fti>Ug4j|FgH62JQc z$Fmqs`#;=@xW%ws*iJhLz@65)ZaWHmB?svx0k=v-HxBX{+_h&=vuoU-qUb8U@ z3#9ZrBf5bRw5z7E8+?HoX@8F@-|N^J zU*S}2k(T)Df`72l3=^fZx#^14X@7?i_z~M-hV*`CJdVOC7%PL{>5jAUSM){r-JkP4 zz}2*?M%uuhV>Q~nGWy*meGks1?PT(Y-3!dir`x&Yn3ud)Bk47b93sm*=N0sAbR1Pe{lDH4GzVP=ie)o&Tf9xpCj-uK8?z>+% z%uah6YD#vaZuk!CVRUv&zL}`H{tH!pp&XW6B~fKI29-N2Q0vS^Y=AegAm$C{Bum+7 z=h+im(H@HG`E`7Xf1v943N@pL)Ke^kuQ4-b&+T_tv|6YRwe{NlaS81SsC6Mr9?Pvp zSd?~nJ{twO~Zq-H}Wl)}VV9phk2)H`8k)QHBTI=B#ZRitsB`$DRC^12HkP>c0XT3S}46LbMo_3qPXf+9}|7f30306{$U#6|bXv!Gd;! zn4ZZzBT*gAi`lRuD(kzW1{5g7z`4Kk85?>V&4PMb_!cSMudyV=4~C!x*Qkh3rSvjW44f&o@vV zEnLms3##Hk+G9{_`8%wF1*%*13`X7PHY#_XqptT4DuVxESUpcr!$um3T8ayyPAG>O zNlny9J9}_E$Uw%)MAHj*Z}p= zXpIWx0Mx@{3M!daqjKOZs-sW5{ckZB?F_YTg{*y*02b?QxzbFoJfdo=r(s^wVyK3Vlb^fcm355L850 zqav|C%!WpO9M7@>p2PmM7dNm7ByPydBkgRcx8F@TfcExAe)kU#vp4oTEotvTMIc2J z>u7l_Mtd0c#GN=8GdH#MW-0zgJN%4|Eo_``=67b`$maHznxut|v zhoM&XQaS}w(y{y4iT&?d``tg|ZP&){+@xK(t>3wU8Qb}t>-Zmjfmhr6^@j;zr(6f? z(H<j3@%<~oYX8$|X(%Y?@B~O3sMSCQU$3MOO zUv{@79D{$be>z6u&>of(ORy5{Z?S|z`-+W{n75}bEL~AKF%i|FSr~;&a1dTbtpl}t z*~-}-wIGec+_(%?u4hrl{e`+=sJA@}YM=((4c)*0>C1**EJmYlJPlQT3sEcLRNS~n=2HzlC>0+ZEI$2Q{EP`3F3Th?miOP|As4QRMxg9ly$57Y5jynGd z>OJ5+YO2G{2K(JVnd*pI>9%5i{0B9cIfmE?Gf+K$i9@mAP@D73s1EN!b>I-{8E_tR z;$_r|=nS)t22jZwAL&5Y$;F0FEQ*?&DyZ!2fST*Bs2dDIEu|w-$ukd?bW4yI31_Y6 zc2qJ@Ib_xTo#pncKX{~8l=fBw%dkO4JE6+9cEs-QC}GDFcFIVwU+P@!Ip z8sP?PkEc<`ur4iZ~u?qau14!%Di_Y%IaQQQ1Fzl!a&sDrDO|kD!w3JnFdL z@pF8IZn=)OrML$w>HK5t>6!#}!-_Z^Yhnc69z*?W1RvR)D6p{lB_XC;3(7rvl7*TpHY#!gDTH=I1r1BvxnQJafGTQJD#yaD^&LJc0zs3 zM!P4f=W|gbUy6#@4paxvppx$w)Lh>|O~t>c2&J501Ipr=8SkDtOJWs zA>M>4yKSfuA42u`GHR***E8{Co3b3JE!5n;Lq#lNsztUK z>N=&-Opw^F~7!I&enhni;IaH`BV>ujx3gLcKsDH!=e1|H_G&5}Ek*JVYKpj`x zYY)flv?rpD--asNUEb$E&Y=EPK3CYGp8e|i6t({~ssqkU8(~6JJ!e2ARY}y1tD+v? z4N#HkftreO_yw*)m2Lc4HU$|`Ia6{L^{?cs#17r41u7CcRd+*k zq!B7dzQk~DHkPuXr`?aJIemp%`HHWy8!@eOGgQ+4hl*_CjaK&=P@fk=E#=iVQvZ=`bYX`UmdU6KuEi0!6*c$yzOipS z?J*1O?@?KQ3#(wJP1f#)RcUWW<<5Il=!<`AD`0dc~*a%OdMs^F;kr$|r_;=cc^O{C;ZlEZBd?C?aeZ_{>9u>I*6Z0kE)*GSO7O*SQ|Il(1qjgu>(?JBifa44KBjPSZ=T1S&4U0Hy*XmLOBzo zX)i%l%NHZo>tRiNj7q*D2fXk9KOL~1KE!f-5ci<{B%>B)p*;ju4a@N} z+=m(PB5H+ug&i>0A^WNJG*sE$LnURJ!xq767?Wggg88t`5$b;(2TVI^7l=A$KR8^3 z+t~jQ6^VJrZDh|;NfdFy@7%&tsC6LKN$Xf!Y)yL*R>P~P$VQ&Bj^x2Ev|FGee>}`a zZZ_UvG-f(&q3!570F|xdQFA=Qa}6e@y~p!M)Y^X=6{**#Tu6Av%C|o1na~9lxpk-& zGkl7TNH%U@M*M)fQHCEZWQ9;kSq_zy^-vdRhB|LBYGGM~IdB`QI&PxM^G{Ur{);N_ zm_OQ$<0Cm0b|To&NDiP5Jcki@8&!TEQ8$i%*2*TiXGT;K=JVRosN-v)mfn_F1Q()4 zdLDKBZ>XGk?S4-E<^IXuOxmMPn1Xuf96`N!{Db+iz|Zz@YLEJSJSxi%ppx=0R9(kD zXAw(*wP z@}Wjl9(A1>sOsp7T2aTN26PY8;v>|JgO_Y&Omd0(*B6k_*pUy@pq_>`P$O!Dy5Q%i z6Gx#|#A&ExT8}zzGxouQs2k?LY$1@P`OYA-Dd)3qdf~99}5*KLi?}URGvT`_a2pmiNe>cUaO)) z)B!cZk$4>!pysUKb*qxen3eWouYC-aT$fSD-A1?mQ4vdc!xo@)sDb7{onOM+A8yBn zdej3|_oJ~A&PA2wEmR0!pmHPDP3vF;Dgwn(9jJ;5ZC%tlFc{ULRp=%g>OQAY9l33W zofmBA0-sPx6!VsKBr7W0OQ05<&ZumjfGWptQ5U>}>ewq(?!>)q^`9IS`Ua@uTB4qQ zeNfk3f`#<_|A7r%@FNz$e0MBa+F@(jU!v;z3aW#@p_0;n*G8Hib%Uy?(6_=PI0%)b zCGOeOMx!Fy3L~%=y3haVZ0N*wxC@V>E;!`AMPeFiB&$%7+Jw5$4lIQyQ6UZdY8_98 zIzA_=~a6c;BFQG1Y6IC|PFfaOlv(F2lI#3MthEpAt zJ9SWV-T^h|Lr@)S( zcnMHBQ3Ul$Rt*!Y{u{X)EHJ2$3`W)YWK?o(@Z5zs&yU z-LKyM_oyn1``WIX2@`XFrvMweVFgqV+oRU#fv5{EL5<{FREWPvCDRel^H|u&Z$hyz z`;)z~WSoHR(-L+5dT;+WEKGY3x_|%kf(?Z_&Rfgc%&2Uxgz8W&RF1SmjbH>S`{#Q5 z_n^x63bw^JsGMo?kKg^LVyEE^+V4>VyYjE)#()1({~BSMcXq>EsH7_7Sq!xjmPTE$ zJ}Rpxd;8a*j^B&9@enF9&rlD1JBbwiCQ`5eW3nZv2p2xl~ck0>~BH4 z;P32j_R-H@w6b)5^1J_LgW|ldY$nvjeF0}RKK2LPU(0_T3^)yG&k6;cmf9a9;8szk zSOND>J7=S+Aw}$f`_5PxwUBiQv!OZdi8XOBR>YI2$i$5kaHk>-7NeaBRh}(TQ}GQd z*^c3MyoAv>A#T9^26P(r$LWE10r#(B^2QIiKa3iQ1350dhK;Ihq)iZTA3mRBLE7mO z2HZa~t&7KL-@whdEK$HIhqV*i2&SW|VJ@m8E3p|j{LX8~Pa1H}u|GYknqHtf{sA+q z{*xuM2oy&xy%kY&SkJR9>V#gXuD}*JDF32F;KjIpa`Cvk^<;AyhTIM~xtmBH&g_VpPX+p>9+Gb>l|f{*I{Q zhoL$+85N=BsHxqCc~$>M*icsgiK@%Ep9S3YAQ~fSxA7c>`Dw30)$=8+fwxg*nj>Yv z{ddBYMtz@Hi7oLbR0MLSvZ*SJ%DHHC|M}kq6N3d;w;sy$Kb< z%czmuLLL7MHNrQjs*0J~I{Z1RLvv9#K7u;$Z0bPR4ec#<=td7vA^nJ|&lG6_?n2W5 z^=uf3Rd6Aez+X`jN|)9?FN=9;cR)?qOjL&#q9S|@l{ z%ouRKR{hsyBPk2U9aIPY&J=JTHc2wuh4P^~R05R)^)Uhmq8>u?P;DU1asXz($x2lNO}@7qL;2jcWA# zDt<*fvap@78T-?|jybS)5st$_xC@VBRvc2)MzjKT+)t>L^DV0U3PoAjw#0n2SL1uU z6h-})VdH!;>v6*3Hp0RJ{}1jZ^6a5iBM9Eex&JFHdG)&XBByKpJ2&;IUM4iBL^ z;wx>}D~(lY??H9kUnU%I|DriZ85`+C+{Xva%UX|9Lf%P zR4D!B?SeT`WmylSu`5=_Z*Um?je2eGRlz#ACd@{8c058Ikh5aI{i?JM&(MB|^>9li z%L!j)yKrIb!u|oc1@B-boLVK|eoMZDs;YOG3=>qdq|H>_s%t#z`0y$=)T1Xj9W&Gj zxc{D?t*B6Tt!Yzo0JWwkuN81AU_Vr7ci}XAh5CFG z-2sH11#GNghrgb^`K-s&w4bB<{$Jmw;5;f4Q4Q?Eldvr90~m?_p^_~_!+`r+@T#b4 z7>z2wUvU*CYZP$*)@(PHQT+!R+Z>fgg=7*o!gHtvCQB1rv8tlxdLSwXmSQ&6E*!->R_+hA|+lMvL-`bM94)&#e9JP)_wW0nsm($qL4KI3TX=@|? z5?io;4HidVJL_mkOht#erQvX@l zDBsc6?k=bcEWt_mBWi?=KDSUWL5=7xDw%S3vT~c`xe{Bme;?{bsXN=NS2ffM*aj8h z$*3j%ht6Rek*|wob#~O!*&Q{48K?t)#OCP#!jh^Ls#*@l1aeoT!M^ zXfMGM_y{$CjNL5>dxhCh((OehhttE>@|>sxo1pfuMlGE`qmKWGO3sQst=$<*)BYB7 z<5N@)r0iwuMH^JdmSYa4?h>lX!XJCv2dDbj!{$9|uF~|ia;ktDd3PL-r?4H??iXe~7K^l~5NNjpc9; zD&+5RC*~Sz9lMVz!*s(eM~b0F+82}KOjMGsMYX_+e_yt zoJxB>uET5-EQikF1|2uiI(}&)^{ij#+_>mQajWL#-op(Cz@wZ%OvvyPFwajK`rIGQO}GI7>y+tSPl%s z1+s)Mq@gx;qCtdHD#kP z0nSHd|2mAu!>B3uEq0IN@4wl|!H&Eb51V3I{2Vp6qfuEt4-4Tj)D7OE$}7PV>ri3r zLAxeugnLl~JB!MV|4;)AF17m=K==E93pP{*9Z<r z6=N#)VJzCGmfJU=^O%bE4b*jBqo%an3R|$|qpIm7=1~2=WJ4=ns+CqIjj$-~t*DMY zLiIf6Dm$())~4MXqwx@G?w!@v;fkmTHAgMoeNa<$7K`8?sPc|jL;Xjx(VC4aI1(%3 zY1EX&Uu$z5g&JXb%!oBmBkYL^?L?e_(@+uoY@J0SEykyv6_qQ6F%y>c+8x$W|1sIo zlO1JoAS%?~qb_{HYoEo~v~PO*A7WhE&rr$u4{F6rwBAOZ8x^q%sE+qWU2iaI=^cs6 zky-1he??#oJJgX=m=(`qLVSaXFvbS+Gt`Z;qh2T~q9V}?HNr`#YMG7d;Cj@6cA&0z z38Pan23O!ET!jO_3Aq0@%+#9#?oT#PU@`X3 z{g$U7$$1W^V9YJHWY5}aIdBx)a9sEwHk6%Bx7p9>w%~Yuusz`ZquDXO3%I|{>W4?! zUu1_};2%`d<=tryslKSWPxZY`L3-2(i=g&b#Cba2=|nZ?QV} zcT(-Oy6uP&w1=RQXc4N8x1cU~616fuM2*P5&yI_W`aA<_sV##_#wMr%v_~D^9o3Nm zs16TB_uv2X6&o7SD%64Bp+dbMb>NTQ=eJNdc!sL$(0-fSq^K%Li3)u|bR&YA!ltN| zv?FS2hoJ5^VL$b+8_i>fT#FjnEPhV?K% zF2cHa78_x@gLc1u2dRJEcr-hz;tVW`H&Bn!#D{F@tc#Us_e70w2Wn|OgX(bR!?qBW zM3rj;)D-kYb#yRl0AHhWVi}gjlVLWr|~lgdLFnq>bPz7UqMOs6Um; ze9C_0lKZs%z+n|Cr18$!x=|XN(4LK%@foV4iGQ%4mX$=kf_*@BDBq73;U`E0`1_x; z_5*~rn1=)YL?uo7pX_HoIk6t?tJo8B{A@pbnvXkZ*F9&i=b`iV5Zi}q*&nz-WEj9k zOpOnIv8noWG2o2m^Awl#({k!>0UOiU@ex%XQ!m>T%tlSYBGjC(LOs29qpIK*YOeq1 zwG&;j^&+^%HZI0KH|%>wf}8eLts1(2|2ve8LL9Ijqwp4L1j%lZ z6NIh?mZRO_wq@-aEJ6Dr>KPDm$8OLOBWU~XT9#)-4XhgG!VaiNPD8B+tM5|(+OgN$ zaSoLO4^hwcr1xxr$%P78e$)aIjk-WBOoSa!>qLLlo6QK!fcsI`xrM5t*Vq;P_pPHn z?uTt|rm{m9I)+*gE}=sD8)~jUp>iSRuXdpb&%795e<{@Y(Wvw5p(556vl79TSb+AK z->hTrQB#>F{2<`|cDpJnL>DkG{)bsG_e1Ze-l&cY^qhtfwAW)kJcC8>UyQ*G^ZjnG zYDFIf+aU!kTvT;oZ={j2scHe*NXKdb}&@iFaHn4SxM_0-mZZ=P8> zW_)h-+#la?T;3PtB#%6jrKEaflc3ANO#~_+K*8;+WEmc z`T{lQ{r|IwufS%i|56|A#JSjx_77MbbAPg_=!64k&%yQ>mlrC{T~FMLD^c0r$`^FY zZ8-i$dmiezq5h!zMPv(>r2WCOSRm+x%d?|D8}D%!e!}m9LH92mz6%B2@9Xtq1l`cR zM|CVRX3!l;3smw=#B#VBwQjsaec>n&E9kC#b+8xhvDg-0<)Bsecrbv0sRp{_ocBij-kC6RgMvnmd$f<7VWpF&`!x1bbr=!8Jp5h znJMW0X+|H^>wD(RLHCDK<*=-J{uLWq^UtC}_8zzSc%RQgw$i?k)#mUvMzj9|s)MDo z+j;FVChZv*zy%nAOHjFR5cQP3jY`J9J>%yfa@vud4OzjnwdY{Z*`8ZGfADEyKY z)1XFJ)U$zSZ_lqiH+r7RN&V}D2kg+o;mc*AD~9?iHq>(}D(P0BvVIq8#CK4S-QQ7F z^A=Tpq1;wYiBKcYjEZD&)KXmub>52H)W1&L&JNx1Foy6VDhaP+3jE94A1jYtD1m2c zRL8QS-t|hMI#vneVJ)xS9QFR+9#!W3F$yP!*-(-l#=;oPYio3IR5lOr+>WtnzeG*d zzo;7}%V#4=i|Rlg)c&Fv1Ir*~=2Sv;s2wUoJw3yNy${BEJ7%ClwHTE=>rrKP3M28k zXTtop5EVeJ7xhpb?219`kBa1A)cIjdfNM~Z*nxC3?3`pnJ^dLqg3G8A@1W}SfoIAB zLH8Z7Ch7t$QFGYSYll&}Gz0Ze+l;O7FI0!>6tt;si0Vjt%%J-3!-jf3!*dbpLTfM; z9>tn?3)Rsag)GGRQ5`LY>QEU}4%PMccR=0f3)IW&Ak_I2z5UZLj_Q9Y8|uIYROr7$ z&D9~)31>YoVm;b7P;;2Outh8i-Iq^PN9v)Htb^y5sE$oRb!4gMW(@1ZgKVg$=TIl! zL7nh7s(eC4EEiIH7RLd_yj;BLSNdZ*Hqp&2_L{-H^RE|ye+6$tn zf0f4y?}G!V(4O?#7d&sEF8mv+qfbyB{1?^XKrx%DSg2}9h}xgs+n)zDwS`d~iN>*5 zHOz)?_!DaFzJ_{^-$GsBllOVBxE+@eb%E4a05hU4+z@qqThs_Y$E?^BHKlVrH+UXE zEnMLX-i}A!j`yh0B`#qrUslu&N~3OE4Ye}X^Y(v%8u0+^hEqM?;penFm9(eeS!_)^ zODS_KvXF(H-`G%=f5iM4Djjrxg;Er?H2;Vi$#v9JIc01GOpCc_Mxm0a1F9nvP%od$ zz4k%OLHjCZLtj~YAIO18RsRjy(1~3zJB~u#cq3|RcBB5qLdWn9?Z2Xf?jN6=FBf!w zCN#FZ`2*_wL=`MT#Zk|WdZ-(BK~>FkROq*Azv}-a8ydk2jK(At?LrMuZ?D5pp}U9? zSg?|nRRhdPdlYKQHhCVwVzjSd2~1eoZde_4pSGx{?N|&~WMuo;D8~+`s$Hl&UZdFr zWASWU1!!C#aG9^Er{g7@dRekJn0c;dPz%YdpsdBfIhi zhxT8%fp*jG_S)|6LH4she3*?SY+UL|o#LZj*2CyNlp*c)eS_|Q0jYHVpmUWA^d1m& z4rA4UL8lF$$Ntj3ihVK2Lb?_A^7)Iw_FBGSh<%=8Xwdy9s(Yh8e~I<@`*UaGu%N?r zoDU;x?mnW*CK*$sr(iBrh>M|CI8B+3Z{&U61WVEGh&pZss?7GFzN}uye3*2ky{=cl zL9|z6Db;_vQI;&tu^b=tLtSVm7QvrTD_dZ6(ET^0^}@}xePe=7N8E~9FOrY7g(?&3 zAypl9ofa5{{ZQri4Qfd~hwk71{l-QlI}(kv3l&6VcQook{ZT90I8>IeLY31&)HC2V zYGq6~-pV%@sw$#A8(>jF)(Q1zeoH1;gdR;~igI&c%t=A_KO9&X`_sOM`ggiDnrttp zJ*QYUZ^v1DzU?b3&q`n0g4GGtp>^07Poh@5;!}gpa;l*n>OH|f!y=R)chGJ!gZkG9 z;?1;`stgXJJs4lpfj6i*d^$Vm{xT}doS@Tz_Dt0NHyGf!{B!LUt?)d1=#0YseEtY^ z7{QLfLMw;Sc$@azMYgo|Uu+>?hPvTiOogvebDm&{ zMItTgv0WPVuxX2WL79wNiWj4%@G>gmuTV>OM0jb?`GFDCK&^x+mfM9|qHYwHe7*n` z((hJSRouk9v>&6A?6Z}Y1Nl5_pgPnUwKPvg4Rk9ir}C|`XFxcb4fW(p)I($?>an^D zRYt#|vNf>UF8CQ%pj`rW;}IB*bFmCwMJ>H4*4WaW5A}IX)HC60EQsG@gr5IT*icB~ zthMrp!rHW3pbp%Ks_)yVDM-D}I@A!=fi9@z8;Od@GK|2VQRlzJ_Ly?IR7fD9LH|9uXM{% z9l4C!A8U(+J~MvM^S=cf>UqP!9A$y=pDQ!i?|;>V|K=W6AWhPV5M}{|1wh-v`~l zWKO#)=>Co9RMfg~A5Y?d-Sz{DQhRtN&~At7$TG}``%pP@XAkvXf{nNAcz^}>+FX9N z&+4=&>V#3KvRaMx@Mly`MC`W?w8G4^w_**vjDr|JlRMOY(H8y z@5ZIH&tfg?cGi+|4=S?%pdwP}CtF{__%-bls1Ai2{2X+D?7jxo(+uZ=&Sflv2Qb-r zP9TK8p#GH!ZGW+c%k+yDiB*`Nc^-Y zN_fLMSRAwK`QL(#D||2(SCQo{Zt|QD@YU}bix5?q3+_mYq7#F`kB_5{=jrlIC~ zDQe{BP&a;xWiakz8$fmZg8_BJ``Gx8Ais>zKXhtkd;YoAfBYBJzt;Y&FKhv7fO-iX zfeO*pm$v^srqXeL+Kr=8D_=`&fPGO9sgtO=zJVHu?=S0c5>$Csz-e5+E~?}A{-*vT z*>GOj4Kt!%7%Jml?2jswe6Q^(HVXCJKZ-lamGh|V9{<*EI1{yWuR=xatoC!mo7j!^ zvwv*uZ~Cu&;h7d@V*npqL#^4h-&qHmU}4(hP$SxlZ#IFC*ekBvW!p0XIQ2A5P{kxy7sL)37^Nzt-3oGC$)Q#f$ zLhhevra+b1Jb=LvGerM@?A|R0JoW25=p#W12unzoZH~o!C$gR1eyTU!ook z3sH0U9Y)}Btb-4+A|ojh3b|D=B!+ct8mj&mVqQFqdM3Q|Ocv8RR2<8*zX7`SKbH-y zc!y9Im=i1H&fPv#`TT$yc__AxBoWS`-5!-h|Dc{BDdU9PZ@=|$EbafH%6CZIkXtQt zP?6n+dLKB2?tlO19UFSi4~eH9@pg-U;yzrDo8ntU8YQqB^+e^yI#h1lLM2-uq1_+} zsv5GR7NkJp{g+hUBnr7-P6s5R1L}GIq#^fDE51dQQ`%$}iQc%A6XxP(_SZ~d zQ}G`4tvKyxA@^^?vZV|;o5qX8mg|rbi;ykF4HN+&?2{qS)z0a4T>iq;NGQVI8ypPI_ z(vfyv_sFniZDZT$euoi!kTr)zqzbBx>fJoipSv zEH$wv?cMkjhH_b!Uqr2>DRNuLOQ1Sd9TnklS2h&7kysknpdORIp+Xlwk98m|YJ^2S z8{$#geNpvYB(H^Z0xBsNqB?j4HS(V@7QRGP#XrbG6?T&5v!2yOExm2=2b_uub+i07 z71MAn?Pu5)XBDs!zQ*3PqY8%H?~?0L52G6xjj0NS-2Vc4b5yebg3~c>VI4=hE@q=F zJ8q(WES9E-t$6iONjVo4suf;)7b@wFdiyV9M%qtNWt^a> zZ_xezf0vD1?1&d-Cl*7^c?Z&Fb#4IZK* z7pJ66Z3L=nYNPhIFG>BkVPlZ@!8O#4o}ohND`m-(3bnr^s$+Fg7wC=Z;CR$JvC(T^ zMBV5uDw*S!4!OUYErLq&Fy_PqrKx}2=rKD|qEp5$oC-Cfe5jGsM7=`wL4|w;>W5UP zQLkKgQKA2c%Ar(c?K*Waf_5j=4JUZ}x1*-=beN3-Y&^vXOc!mILEX3wY9wP(A)k-B z&<<3`?|S>+BIV>HEoU9Ci&36Xx3Ll?tr&9u zWU?8mgBwvHzJ(fbsFK|%GwNwp4hvy_EQ#w;b^id%VT{VO{d~j1545{hrR??dzs}V{ z&gbm-vWAW9HrAybtESa)GgJrXV}87dDyv{Ei%1eIPCGAF#V(i#x1q}ID5|{wLj7d4 zKy5p(bscp$%wv}gCDUfqigg?{H|H?|U!g{vtgh`ZggU-4Mq_u>3(U8u<8GjG&ozS3x<-#^pR-eG1@Fgl24m1q8 zKiRm9O2TxF>{Y8FDwmd_I&>VBOOG(DPzD-X=o6#ntQ0DnTcgTtFsfqPolE;9%^bL+F25oM1{N_YAIfbD#yd94!*)1e!efX=T(k&t&So0 z_XvT{iL8&6@DDchz5ZjTko&Wnyj?=>f7|JQ_#-Dg`6A^0dTwV|o74Sxhy8a^E9Aj$ zypH2d)D0uL+i`VKQ`ZmGu?eUMe2dDZP!BhfVJ9;iiP=#Km8G>&+1(Fy;1Z03`%xo3 zg(}lTJ?(;NQEPgC)N$KU^?v}Byg#EBrWaTZGxiF(f9%#B)2RNt^tN&vi{*487RFCF z7z_8Ym2Wd@?ysUQ_!3nOnfluK%~5kb3pHgMQB!ps6{)+Zhm(v*W+0j%EDP+9j|u=XF5cXyaf@-s`ByIzw#A za$;C3SuZv;1>;a%Dn47GQ{!KesKM3vEg?16z{_S)SC6@d{Lf%8$< z-Gdt7ebjlr;nct0P^u2M5%x!w+XBpk$1x-Rjk;j+5oSJA`BXzaoR(q~p2yA@i?Y^v zy-{U33pIfAs40mt(jpc)k{w;yQJfu``_(ube@A8O&`}nFi>Tu=j}Ey%znkXy3RUM# z#@KOdurcj7s1DQ`YuVo$2hg62y)oW6`^Ggq%!ZQU8LDT_csnr-DgtG&I(El0xC=Fh zZ!j7oCWM@~*beoDqS?fd`wuE^M=e-oCfO8xj>@U=sOzpqm1X!B?}LA^EIU$6woo=k zmETlUj(m$s!eie4$EdQ4ImPC@5^4bTQD4t{pl-1JD_i@oVQboiCAJ3w8I}qcMW^LezEkp{{=owa&anEnJya+d9%@ zb=b!MEVhkEf?hFXYjqDJyRJc6OMR#vA_9seH=W@;0yvlo@g z>#bT|VmCg|v%xyDAk2myB0u3x3~mg$zv;Y(GicZPhVOoU9v=8T?aG@&4u8t;{D&&n zhuirv8tp9KF%WJTdsoQ)l}y9kA?FI`t;3bpdu-FNU*us;xAl*mRf5ubPH^+BAZ41*W zTtYkIOvvfQ=Lhi(_jmICXm7b$&W0R6AMC{29Ju?Zkh6@A%>CKE{};VLwz7W~w#1~r zgzOIzuqW-R7j22%g{p=;mqN~RoPv7zj* zmZx3)nw|JH?xDRC)xloZ?ODc7K1`vGLKUqkMH?fwt^oeLCwU_bv$_t1XwaS}ru-{bd?`_FXrdt^U| zZ2j0q{u(pzdDka)qsf1S+<)$8_S2C2k9ZV#W|2CJO5&2wiKw#s|F!*hbWPd&z>lAc z+=3v2h#-lG9t06Yh~7&O-4I0Yq7JU;yp6RS|7LyG z`u*|!wCQPvR=zS0|%2X@k%`z-2r94iF(cYk0+A&+RGRQFTwh-$s2Wk zUk{z6lf6}wCl!>l+-m48`R^3dL0K)?p7=EETPE6fG&!(f>5o4Us<0A&mlp`2_cLD{l@fuiRm z6nW!cbu!BVWuK`DMgMRp=Lq*IBH4)S)w~8%ll}-r(CfSMOg@-Mx*8N0?uT+E0VcJ-xoC_{PxGF1Hk4-p2l(|$qvl@zKP`2cLneA@t zYIGqPvhkdPa&`I*7K8cymF2BqZ_*QCQE1D8D`5o82iHKkWV;AuNWMeqVMKspMQAN+ zC>v2XD2D$N;8v6D0~s=zYG$=tv%e{ni^TR&PRmnZRoEq)-P%gGLusIHcDr?n))IB@8cqyR4Nrh_ zvA7P(9Jvi;b@=5}!~W!-fHz?IJa(fIs~|A1@<_jYcI$3>7TiMlYABPqd49D) z^@WQ_UxU?U{r_CRZk@f3!l4vIhbfEqLvi_4D3j#{l&jg#Q07Mdf{G2GTpbUF;^LVw z3T}hqxtCCeD5Q{D9gSct20w-EY2SznR}CzMvPW-#so+B>WBN+dD54rj3&pT7%?eN& zXaY;aiBR;Mgff?GMeWvIa&;&}GYHD*cNTQZBsfPz6#5jiTen=fq3nFCp_D&{GMjTp zsGYJ4j3qr3mVtl5M$o6Y-MaYf2y2nv3(LWjk#_6qx~ArAD3kb6B;#Hy)9^Rn=}i zsy$N8ZvCf|xaz9@Kd=*WM{C%v&zQq&sk5V_w%WS;xrr=9K}=otd<5@6dH*-2p515& zPt|8~!klq->ph>j4ei!v!lfG7t$V-wun+ZHH?~{919%12Kz>XU)u9Vb?M7SDvCY&* zwxhY-7)5$o3%m8h#%}+X%tBn4zLnj&b{p8*Zk$8mTPR!d(Kc%Deh+1K2eefiN=Ya? zW;>V;CPG;yBcV*%DR4Dh2xa+IOHlht8@Pt_&+rdf|GC&;>_AY8t=7M3e{yPw< ziNH))5Z;H<)AU`{zEBwEBE1qyPftVX(QTL>euC2D)ZLT;0Z?|x7?=+ZhtlH>noYW^ zjVeVCRvqmdp+t7UD0mFMg|a^P_Ed`A!5Gpdda0Ak04O`=csLiXfpP^@xwqZA>um^S zdG*%m`I>v6Y{8e|B$zyr^*@owG$OL>g8HbjZ3#D#o&aSGqx-52#TlUPS6a!D`(&V{mXoP#Oh_d%?Gu{`Bq#k??> zbX6!@WhW?OI0~+Xo1x5s7DLo^KsQYndPHs+JPFT0S=Mug;$m1T$!^?(d!QILf0*KS zHxW6RoPsim-ox6^Yq%Qg1~3Qdc2IW2u~2%v5sLf~D3kR9l-d6p#zDUk>cXQdlpz}k zU2p-Ep09$^LHAZ2IRnMAzoE?D%Q-U!d#@SD?r{M=1uu8l+1=nFAxB zT=8szax(fG%B0RQTAf9kL59|COdulHdIw+y_!f#sN{msHCmxDxS3>E@pHRx*Lpj?8 zj#WKr4#iXbVLdn(%9uZgGGsZ&sg6WI*&kX!>;3<>L}Y9iLvd-X@oIfGhf;Aclnatc zP+Zq{g4$S;U_LggqfmzA)kHP99Fx?fi_okCW&h|1MQ#e*3s=B0GCA5zwp;J}EP>)u z&lJ1$O4eE^24$RTxBh2aPFR?9mTBr@vj!AbH-KW;P$>Jrc$f;#)%h!-G`t1M96AmM z!ROFjpGaqqT7CzhObY+$YK$YGxH19mfxBQo*n0*iC-^s%eWUzLH6%$;_JcK0I`S3D za?D_=$yo-<)o>dqTYV3c^)HiT1Q{ja0VoweY5L4k>AX<(gL0a~VHMIxU}oq&Tg{PN zus7*gXq9Vv&ry4S9F)o12l~L}b6BUce0Gu{ya>gBH=3#DD%XX;A>@~YvLo(-vTwAW zrzTSpl=K)VlXE2uhi9QI%VhJ_YRCC3>;D3jj;30s_JQ0G1Kma| zB2g6VgtFJafem1;<;tL+q0EhOP$t)JP=+Ye3bm{X!XVOdFcS8KF>nKvIr9P*h2bmJ z`cHs;Nl%2<_kUBYQd?$D7)`-IC@$XxW%fRR(xWu1)fO5E(~`~$Wto+P;)zOd0GthF za`~=NSH+=FcFw_2o&PJtIi!0-@kE*pY7Ufw zQZWIFX9hr-D@&owoug2e<3%Xz{5g~{{{m%o`E69`2-u%=>_*mq3L+=TkTE?2Wez-s zGU>8xQZB0mWirJ=Sx!lsD`0ifzeCv>Gi_F5UIiM-=rNR@kK3xw9hYGn(qCXj*m9d& zO|E6z)XC%)tV=<_b|ugS%E@Un42O?k9hiBCs@DN-BfSK+gpGEp)vy!F$trl4o*S?c z>Dh2Sd<9p-h3?&|XVvzo9cuuTE%gvA2#sIV>9`Q=O|lnk3m?I*u*P1sG3|z}Ntf8C zJUADQC4Cx-p2quCz0q(D>3`rA=r#|i$<^baa`jZ0o`U&M=ENo_ljct-WB&lk*nNc3 z!=8uKkj#LYNbiBNKb(W&ky5`h<~C+Ml!kX4RwtkM->e%Nw{eSzoDK&cu^Y>z!clHW z;B6>lRpl5r8Yox`Wm4@vt|y!3MOc;m2T&$k*a@{2SA(TVcYrcUmqVFD$DypAkFbyy4$nd9LBZeEg~TLSg7j}t=D;_dU+WL$+Tk!I`A?uU@J6Ryr?}ds z0~z2G^1Gg9l9FzC#%|1@ePh;HHE9Z-QbUaEk{|-eCPpM*Ev; z?33TJ8?8vMf}+56Te-9?6a%|Mv3w+yNowl!8W>D^FO*4n3(Ag|?2eiq0Sn0F+5Q9?Ff$EH@E3e{azR>7J;9Y*3b4B$O?>hGuUl>v=Aeu|5gY zz<*&?4D)`{MCgF~S7{2Z(RzeDj% zg=eY<4dHmwZD2Y0Lg$A+SDq{bPIdJ0 zd)1NeaDc3T{|{zfdJk~^#$in=Kr)^Ej~g2$=%kC(&p%yzrO+CSdI5!BD*a99_ibDa*i zb$YeC9M;wt1$$C4XG(|VftiqtL}L@Y0UfCv*7^JaY(_dfwL@LYL7B}dyd6dm42CkN z%0rn8O`$CBQ7{Xf2W3_5^maR}<#d}2+1t~kaaenP6(~cn64ru;pq!S|rd9d1p-j#W zP%hafLYZt^b^4ete+FgJrB9~}352p0*ML%gk()>)kt0x+#WyGwvidlzvsqp!CzVP% zT^Ft(-33YyebXz0@NnH<(+odUa&KB!s9&mpH} zx3PeTlY&D~EI$dS!$(jW{yDS5x~TL(S>NlRteRh7MHuDpu%2uTg(;X^<6tN9Cueb3 zk6=E-vZUt(sJU?sirz04(d3)eVdNqsKP(9A!E!JOit7$TG3*wUG5!o?8KudldR7t! zlkN!Za6D{{A=99Y^}Fm2>kg=Tpu@V6NrEyozrZ}wli!KRt=3y8TWYBwhjq3(3S|qv z3@ZM#(pvs51odY;ZrCZSh7&%iRw@ci-qF3L@1MP4D13I zgtGp{m8o($jLNV$lwYeJ48+ja3CB4#pR!Len4I|rZI3B^&3Mu?OxBP zhA2gTHDtwL2J%}%@jzmJw-T5{hD?(EuqgZ&%9s}^pyozxSd(-gC_VZW%Es~#%Fy|Q zIjrXcji4BM3Cdjh0;Plb3aZH$2c_Y@P$u&fHxX%YA&h|Mp;+!Jqy&pVQCJho{?Jo% z3Y3%2Mpyv;3T0NmfHk0_u$pZ3p`0rw!e($ElvU#&u7=9}6A>A^6|g-#08_!-MU)4M z!t$i+KpCQGP-gX2C>NOpi#n|91veDK|Ae#Q7bvctQB2LHH87m?T`2p7Z-hgx58Or< zBGQAIupMJ}7|JBc7pXiG17(X%grZ;$6i@vD<#s(;3C6d9QK~>t=K=tV(`pdBtw!S^wgaon*+Q`xVB) z(@-{;oE03_1xOnx28@PN;4g3sV_vf&Cmr~`lFE;-f+tA7hF_5LuEt4+w5z(>xcb*n z+zmzF=NfL+K*5@7W2pya%uhid_zf0@X=^!*#V`iSP~3wuC*DK(h2-$s4(nE}S{=0| zpM^hBp0lpQy15+=WfjH5syQ+o%Frx!6OqZc56YF!Jt(W8WIfeTI~YZJAnXQrKpB$I z`quI>YCti#50pu}T<7nD??^v}vYKu-P($CPYY{m`L|hioNzKwiFo<+7m;(bmP<~2% zM`wri2=-+chxKW9`L61k?@zdk@?zZ_)_=!+)}2c@((`&cj0G^fx5IiF^=zWU_#+wn zNk4~iko?4ftp6TlL=0m2!4*T)^?z`Z!+P7*10yk{`Y<&)he6pV4nyg|8Mqlfgp;5- zTzMwf2(=|wgssW12S>o|Fc&N}QZ4WJk*xn7Skjw}I0_z&QWZ*#X0l+=d^n5zy<_zj zJI-P3C*1>%hK0s+{-^#xX)7 zB60yS1XicP-=J)%X{S4^e=uAE%2?i|Bpm-n&W`ZV^NxA{bay$-Y3%?IV zzmKWp8^JWByF!^e?mq_G&v)_4et;5*m~rkJHK9-*A=dO^7!7z(9S06oVE(xzgDW<>Ye?Hi3UZ zxjC&kS6xhYfHJlhp&0TN$^(edc@FD2U>zv?!2~!P&V$zf|13V=VJsn|6_m-Ae1XGy zC=~^z!ey8rK89kL??S~wFqm`=D6a1c)4|bDTt5rSGCc~#Ll2-V(|n86a*Tl9vi@5W zkqSNFNVovDfjJi|%f~<&t0Pd(6*r;uJlPWEv0PB*Ks6{XZUv>`?Jyra50l`(umv2t zRBb@Fpj%w!zf5f~<)K(O0EWX6Q0Br8D6aeqiiC1-qZXDWk}Pw*DIIjf--r+;Zj&0%2+*ua1Ji{FVKhbTTmwJODIE}dW+ioBcM#?&QLt+Hi<|Bze8EC z_N~fAzEC!j%1{L3A?wwc0b}41SOeO(DfxO(hH4~y2+zWQFmT6qu7YiRMzqUey{MFG z59bQXli)O2|D}F$7*7#61?y9=bDzWd8Ld?N)#dgsc!B(62UHI(!{Vg9530#l5sspM zFDM@SbVzlm(XS5cqnT-NEBRFptCQ6i_%rDizsXk5`nyWx7cxp8Q58SJ{3tAXR9$+t zJjUE0Jr_nJxBIxdxcmTR%YJjhVSTl-%pVTxbAh+;1acKmDUYQ&?XX@tEdxuSXD=*E z`MWcCQr3UOS#_b%7uF@c3yRBK=N!gR7!7N}{jf6%QvK<$p7-@Tua@N*Xj1+OE`w7q zsO4MyB14LN2Y8PBK9`sqq^n$3S5!@|u>MO@u!M-59&f-dF#f7~gmM}_BVF>Es*wA- z+PQi_IqS`bXDPpbgUL&J+fDWC=g2MPfdaQx$KJyw$d$O`u-+rM4oi@pd6)GsJw0<* zO}6Cs9M(su+2IEAXThAfxXOJs>AE~rJzo#IQSS9fU0x@`1k&M;S#B6&!XBi5eWL0W zeX2Z}2=|fy4t|4M|8jF9L1gpa%9U;ZaacbXHVKYFk^ggL$dVUoD~^5Xus-dc1nW`n zBRmOfyi!j@Grd+GsQ1QUEFyn5l*!lht$I+I=AF8w8wq6t`^!y41dhB{lVrdLHTECi zD)RGxR6V%>2a~S!$zlD}+F@7$0~>u-isydex`1^0uj=Z!?KgEpG65!1&-Y*TIBpE= zMEVkxp?8=2u9n%)uo4+ZU|*PueN5K#Fep#4Pr>G-UCEs4oiEsg^ez|=(cZosJ#YwY?&Xw6Id0=Rk;Y^+v^%Xkpp9@IX}iN|y)wBJ%1LE_ z(`lWQRzk7-Dini#T~2G&G=XbKuYqD%TuP@kgd1TF(j`(mtxL3Kupj9?u)nPTBHm8x zsrOnu(*8fE!GA3m+Dc7!nhe>~hvQZrLa~f5kk=bcI*RKl2BNL!pbnb!T z34ed5@f&OjWpd`s;xyy|L_gRQ-i8BUY=F}`JN^#cp=3ND(jTVG>a?EO4u_dZpM$00 zUrTSr&}rO*@o+e-800jL!sGBfoE+>_ zzyH}Lhw9-BxQK$AP+T-5#A#i>KY|*O+m)@v5F*#AveUYc*j_~$coE9kv`|$U0@mLk zA~IV)!hA5Ynwk@>p(s2IrAI}oJB`z@Ka{KBDm4_l!Ih+EKyh_+O{Z}L&W91OO)a%S z&4#i+`~^qBT(z0hv~R2@5(=a0;8HA(hw@u3%j-I=cfR+;vJ6Q#si!uSnf0C4wcR~f zmU{m}`GQfI2JCEbOPumtzD7>#GP^!ZiCiC;1`dVca58kKCvu3$es}@O*m@ePx`Mh6A0TJ`0$e;G@^HcB9{t<$=aF%r})odu^;@e!0Q_~&*`>*BFSd#Cj{E=32m zv8;gODbLqYZDc#33`L<%PU}A>Plm^6r*&tibtjastJAnk`MR!dr}e)6q;6^p4(+a% z)fBh_foIT8#pykqMsCt`d#dGm7|JrU^-^1KKPaxf1Z6Hggh4Q8Z#8)4n@AoaH=&G)JyA`X60j8MZg3i04Q0zM-N$L&`*nq3q^H7+@Boy_dlC9Tqpw7mTAhEU`#L22h7D3jQoy`S2XE5USRr0%cI``MtKbO$I~X?G~sZ2O>0ruR@Lt!;ox z=Z12jQ3T2j#!4uLoQHC{eh6>Dz=3S>c=TV0L2hH=Ag6WvydBDg!x=aMzJ)RwlLkAj zn@iUar*(VY62_2k!uIeA+yrA7O4$)#!5CP3sOrdM7)SaVoB<0bIjxJ_qp+{|rsy!W zgROzGcmD%d!@%Kcy`F$QNPCS?7bbn7DD)kv=14~SWx4G6Z>7sRp88RnqlgV>l0r z;&-qC^k1z`Lfv2_=?zeZ;t`a|_8qo@8P=#d)(6TCIR^&F`oBs9PaE%G4EzXX(v)1Q zW^)2eAl(hh*k6FN;TtGB-o$lk+3kY9q~AhWe$Mr3hYN+Vq-#Q1JqutETo2=A{huaM zn~cI6l&joOT)PB{OZPz8@g6|gvtK}Qd9IC0Q5`6T^nh}Hp9|$&aT$v1ze8DNIX0=G zs|RIg?Ey>3`tL^sR~VZ#|A5kiCr~PSZB_vQ1Q&0?QvWxXEk^Z~X)@wr9$xcFX@dFqGy?3i+QyUH; zy$>#crS~|kFPUG5PSWjuQA5=o29X{J_87r*RH8 zzogb}!7JPWp|C!bF)V!5X{>^Kp%+ZJrd;0{%DJO241&X96}Sw_Ip!ZIL+f+hO7r}W zh|JoSPZ$eqequ#2M)KzG0weQp%sRzZ7=}Ofr*=89>%g%a+kH7+N5w}DwmOw@{h0$Oyl-;83{ysrEytX z?Ul4HYYT0j&SiaX_ZIvEgDRwVSx?2%`MRv-v>sL<{~cTgOJ;Ccm)E!8WYYUGx~v}{ zs+9?YNFVca8F92@WOiBa1vK<`S(o+hnps@dNo5X{o$Uy0j@+LCF6)DcLRnqbtUeE0 zNd0UsYaRE6vRvoFoA5Q1)9l&o%HSMF`kHx~*^&=@YqJ)OVzY#zD&W7IRs1X>f$gx*1&y<*b^jxXZeqNPzLQZ(JfG zr_mCTYOGekMx<}U6)>`d%X-Fh3r-wQ0LN_s`K za=opL@p0`zVxvhu99jm*n^|=YgP~inE z2MgD5Sx-26LD?aLb*h< z*LJJrRIs+o+9>+MgA~k!p|DXMm-=!Flx0<_uFJY$ISJ(&@hKF=wpf>S!%-8;xnmTR zN!z`i%lhbLA(Wl8XMLCT4~Qqho}}lv8<0UHb)3ukaj48Nj&zQO%9Z_LH`05doIdk6 za#{BWb>V)}?V%{n)!1b{Sf~KyWRw8w!fjBNsaF#<8Jj~fcpMZ%-4}`cOk{skmo*fn znyH>ALD|b!LUH{qC{M48Gp!H8YT%h>xwbCrVe||rlO;`p%Q^=XY3H&|r`@2OBW^)iPR-h@ z<+>dnVUm7_-sB(Yq&jjQ%H;h7Wlp5;>ayO7sRUEY`rk}ME;{$aAb16qho4|}Sh|~< zT+KAwK{>tl)EuJo$7{~iTnwGat<&5NrQUwc--WXNujq`2P)?Vxq0DAmcg56DD*C~6 zFsEh&Y(=^<90pfHk;~UZ)r*9gNSBAwp(aoang`{6V>xuoEIvdeExZb4l0AjtFilUj zDq`SlhN2bBNB-wtilM!ghw4I6+#SmGL4TMRE`u_;PebwWH7K|1Z=p=uw27?$JVXj4 zDvRTwTqv}HqOdOvfo>?1aVeDZ_cbW9JE)J^x_d&|aMr=9FlArG`cMp+2c_OoC^x66 z`>Ev{+K=_0fsAM}d|*8&u5Sxv{db4r(iu=ZvjmDk$Dq{v8~Q?{zhVX`S44SWBy0|4 z(oKgl1jk@mm~wzxuGQT{#ARKeG(1ZeEQNJQAAz!CWgMsstN}$~3n=napcpt8+TkkL z8g7K8VfvrdoT&qIk#40q8j2^}8;ArFIR-nz$8Zsh9i$Y#hB8?`LGeJw!HT7z%$=4n zJ?sa?W8w{}4>_&AhFd>%5SeE&y9i~xp0dQuO{WN8V-;sH=9E`mXD zEtI+O2b4*B5sJcxP=@3^EC5ptRdOZZTGHj9EazuX=2+?^(aZYFVMVxgf?_}k%}P4I zo@NWp4p0o}tvLuvy^)&JG#5g-^jfF+5X$9z_F-ykZvtn@`kzlkZjp))S6k>1Sb_8f z&CDaza%&D{QjLb44@>Cq^i_CQg*8k%s6F0VdDP0~iN5cxkrQ9KEX0kffWXsgaY2W5HQ zfZ~yKWA)_8F;-bv6gH-y29zExgJQ@oC_O&{rGX2Yw{`hnP$uCAP3JhZYW$(-iGUSh zH7NQf!5}!-O=KaFy_(I(s~&!ZUC5t4fiZ%%iHb>3mZ5Eu>Ul0Gb0rL3WQ*g|YAn%mdw}rmC@Q1H;J}3uP#NfigGl!6@iAjcY$xA4-o#K-oZM zK~c0BO2gNnc<2e_|9cv5;BXA9G=r@eo|vgF%iowT`M}a`^qZxY#Vsg3^PjEGT4kW@ zd~q-sj@S9?;U^UR22HqsETuf^zYhY!xRd8QXkBUclZ^T-j!|5|{vUklqG^;AJQVeT2ch4@$=d?P2{V zM{pq-z;Z7zzOY6nCYP8B6H@W1D93U(iwVp!x$TmWUCT6Z^7$`E3EA%c6SBED4U2Y8i3a<<3z!Y_Qk*7yZ(C0G6@!7m&=vFQ%=*@vyLM_fw&c2Bhz zk+#>Kq!+&K%E)w7#l}-D7b0#YUqT-8GV6FZEdGZ6V9H}T%5z9aNqG+1kuVw$rJ`49 z=}Scp3B9#_jmd9D`@=ZcA|-fyUq;(TdSYMt*?M|9zRYdA>zVp8!0RA2J9;+1%R6pmUU~pmG<6v-o4Cko8t+7K*9iQ%!;l| z*u#HfGnymIJEq21${tZ?n=#^i_RM;^NOUr5h zT&J|K=NT5Aq1DC6MbJtpEwo3+Qd*XfpPmmP9Yfhz@`fP0gnao7y{>Lc_7iIi&xB(?nbX`KPg`H+d40QO@Ew=HRy^4hiKb=eyEIB&~;e z_Pq|U{p7j&I?%P4J_K-N@z~z@dLN)>Q))`6YG6CgS6R=-2CJ=_3V4&=Wc_JinJo3JS7V#ksqC;v4^Rgd?FK-*GJ*oT0;owOA{Vb%#`!*FL`gCABf3R3zb#L!+(>{|;{VA~PTw-1s2ONh0j zS3g2VYH_J#ob}ZD7}7Kou{UU+LUCvMU4r;G4*tWZQGpg~qw7cDyDr9d$|PK({e$@9 zEZXXj4x=BHUfb@` z57GrlkAQb*e?AWMXqS1&JNo}~OnRd{hF18|C`{?e`#Hd?CTenes(lV9SrSFnsk9mc z+rnd{>vQ}!EYj)C7~G8b9BQBN%>NwXU7wgkH@DGq>T^I`B;_%B+@pyhe?ZMiXQcvF9Mi zYvQfpP3^FsL?`vSFmA<=ZI8av)a!!Gcr7y(nFwV5Ag>qY{33|K53yKb6nQ(S_unvF z*~u>~QK`De^)-KVF;u=IwU=f}(anXZ?#NiAM|2}c4ayI2oJ7?vWTxV*`!uzNcv(-+ zufB1~s4X9W&ZI;F-+%gFc#DQ=I$wUxCkQ!;VW->U^UXK7x_!Dqbl035+6m`XUgtCZ|v_!Sy$>UP~t{KTE0tu4`d1D zjebN9(1--N-D#-`jEyKs#0UxHbYl^^tTxIe@ZAvOgJijEx){`q4#!Zw4C(T;`I#Cn+T{NgSRoGC&cyAsAmKP= z-o#y=uAHo& zx<{ft2APF0HF61_bKiaaKhi=8ZSN{r1?k_=_{j6^yPx~1uFEIr#$n>};?YLhZcn>i zkm{k^n2g>twEHu865f&arHy)&-@{)csMCo2(b~&ilzkx{qvf+8ABS8$jvwZ}OvTkl zO&aDV)`-+5it>vH{{_pTG&LRXEt!PG8Ha3sUTaXBXU0vNU;HG>CD?SM{6hmP{7!u* z9Vtj-r6`lK~;}dI$XgmBTQRzo3D2~Q3-)m zJ8lM(<iX--(EKyhjRWc$N$1ZM50N{Czo&O#6%jF zz>g9cypLdPpk94CBVihOhmbkW(Fys}TDCQ1HIO||{sZ#w(?)sSA*nac&Np$A+k9+y z%umT}xxIVPri3MMr5TpO7U<?=iK>J**;UToq zo3S2DE2W7~;3!2szRUT);4u%Su=%=qtZZy%6dqG>7=uR=AC5{1hpEy5wN9#?qN91q zf3M3@;S?9mmZb^#!0SgSLu931Q9tr(Ql}N|l;QY^vR;_jlXjxidk;#iC_)3xcrRN> z*KXQ5>0oVIfs^lhml8b4 zNNB}(@2)#+{uy^5$QSSozWZj(MqyXdznCs3j@@F0Ic)*{FLci`QFD^ ze^hKiyo%}VvgI!~la}6UpB2&~yD|Mon2qQdEJ&seUj#Q$XFU1x{lBs10GBN=V+&f{ zMOL@}w4Tpg@3Q&1c_wT8ss~QAUeh8SVHb?Mi1u+Dt#k`H@NjzS_@ZtLc?-2wFOe@t z{o>?rNB%iwKhb|b%ENWtA69Qcb}=$%Qu0ngRs_=1Mc&=ALad%DDQIXVL%f*u6)L30 zn0e4kE2~CB+03Mrw%jGXwG9=ur~06~48^ISgeAlaYMDByjnnb{=G~OGKv!~-BhegZ zx>DH!;&_wE*sN>vYOL{@-friRFb1ElKs+@@w9t8X$&=uNu~lg4vZ%vY3E5C9p@cag z6{FvW;+$H%jy84%&Yz9CGB6Eg$LMbl^H3_AUtC7*ippr%il)yTm36BJEWNx|M3sM$ z8^G}tHP`8%gyh6$(2L2suO`;z;AmuqrMCHncEggtuwW>yx~Mu0wRsRN4CP}I3G2*` zsciw-!pN3Kz_Tc-jOZ+?tRinO+A5lh5s8?GHVL2g7?z+&!WKl2QO%e1X{w~hEmJxA zkzQlIO3g{2Fn0boOs9|4uzLt9?TCi!{^TRSAqMZGtl)p@{D%6ASoI_DtxTgDW?ZD{ zZ0LASJv;Fu$Yi13M2?o)%w>4o`t(UEi;hg@RBxMa^dFd-R<{v|{@0kB5)T|9Z!l>I zC$Vc7au;;leMPgajY7_eEn}H1gJ{6}IUXE7001EO20` zg!7scsXLt33ZcCej@nB8ed;vUIz_gSj`O8nBV5P#YHQo3X6HUYL2Yf`RT>(Gq94Iy zhNrdpdJQ7m*Q}P71y_|QKV)cxn?2Lo3i;Ha;zzP1M5BFyxj8MJ8i*009B(k1H%yHw z=zNB8`EfwS7O+=1Fv~p`9Jn z9irP=q#ejtvW+-o29pk_p9$0tp&upD@xQwO%QE!HcZBx-rxTLjP&Xv;GZ;1lMfbGL zBPjbKiU^N5c#+fyqrqqxh#ua2HOkT0UJP49c_hZ&qW)Mt4quTOfP6OP3?nJIpQz%t z3rm+GJb}XUD6yM^eQbg5E7S``pM;mxy$4fK+yzJZQT9Z4-V)%?c-q~7s^+k%o-7@x zcbKw&$p4AF0rcSr>!$;03AM5B6!x^_m`>mLFzrV$1Jc`E(VeyNC>IJd)8e$K$%3sO*+gzQVYlThbsq{8K zZ#$(+InJW|PxDoJn{SISDyP$f!VC1)tAAt3n~bvG=*Vcw#1HaOqJ-5Pmr=Zr{KeWq z3B=_KFk5jzF57k^*p=`d+J5R&$*d=eASJzGv*>=S5 z=}EF2)iY^=|B7gQqH$hEHl}FfN|E=SbXjd&73yyEw%&9THTaUk+$efW$Cog0*LB5H z@FdD4xG-n~$1s!)qv2!7{v@(=qMP|DgUvT@A4Eq`oR34oNJO?1-$Fm;;p@&+A4j^Y z8J3a3Tw}&& z&&|+GSX{-d24YvBX(a-)5d0B%HQIU?as;i%P*#*y0LP}a^&$ZQL7AEkOXZHK&MbqN_`8I;liRSju{1=!{w=hb^esU)is`=)`M(i4j-Dii_9F3*2wV9 z9^)4E`BfO>gLZ0a(d}*2{$GPZ2#1g<@16Vzzf-9W22Lk`BbmJ4V*EtET5BaDXX<_q zC2zAiF{>?it#HJz;I$EC?Le(JBJu`sD%2gqzIwzZoTEP_b@iR7=BH1rP+ac}f77S; zrY##+VaKT|As6a)5KMufql%x1vBFUD?rXVPzESZ6 zZlq2fj_R1w27MB4;;xx+A?4mogdR5D)~$v>TWxC-1fxl(G}mXdg#@=oPC^H|-I%(e z9JSFomNu7TLp}3VHe2qD2T4}eJs0sT^s=xSmYs*GTg)ceZMkiS&7|zMz_1E5bC{z% z0>`P}oBr}2*^LG0{}K9V7j-mGWoQ51gvfSnzKA5l?3>zUlCGt@-vB=2h}I?tQr6Q9 z4z&4(bZ2=h%X|2r=n?{Qgel@2C+5*c3Xl-w_ zofi?Ati^B8LV#WcCCPhBSq7@MAwB}P7NE~x`Sj5@b|@u@=}V-)IAcR8~18ggGVF32`Hb~V+01Q*rgw6PPZx}76}Y9&#Z zq#ZsD`6&8VmLnG(YD#(!^`6m@I~W^eMg;R9tpM2_sJfP-`KV0Ak$}hvEI6mVIu}cp zkk1!8jYFu5)TXRKO$MwlOZ{8ewn;a=!dx9}3-J1#YWK_&!Az1T=Br?vpHD&T{1JYm z@+8wghb?#B7wFDJU6TqD(i0y{+cu70NvEK_x3ueJcFbW5iT*%x22I{YgM=i~7ZJUr z&62!kv=mC71PAdN$Y(~yb@N0HTcH0lTI8QG|1Z3vXMXtqACs$=fQXC~N7Au}7?c`E ztU%KjM4FP$qK%Zgjmcj^{zMGUZ^nkO=5Hcih3u|Wmk>x%LGp6^r<%M<-HawAtV4E- zE?bU8{KAr9BYj8D!Lt~Dj`S*IhibWgbo3D&Dvyp{$l1{$0ZUREbNPD$fehxW5Vqp?LR=zD)dU| zLz-WWGV&sqN9!cpoSf6<71{{F863^%U;xVI=#EUKl7uVd=QMZc#NNw@oz?>@Mb#0# zgDuAqnai_YN82;EHAs=O#b=eMNKj}Vf!DkI^}n(`mPq^t{x`{FHnKASoNVLkFHQ1_IcDX+}Mxoo*zt!e2G3_EY0%Vi7n zu7S3-91+z1Y<|mS3-Ruv8{(-${&$84b%R?R5#U|lkcWZMP%+m3B}B3yt84e zYx?Bjvb=&BmWNB)UAk}#3inY-!gw0mN<~=?*BO;WY7AS24$h{SL7aH&?4d$I7$(Zr|cJW-$w2|18-Frr=6NW!7Gj?eS zpm{6Zn+&~aaTf8-bmNAuJ`9;!bg?(pOHn5isxOnbn)1}-ouiI~Rg_8ZPf%aND9R_% zj{KVLeU8$k@6iUq{E*k?UF$VU*J}H%Z2qJ~C=-fGax5YKf5S5^Uy<_C7$M;+2COw> z^Kpk2j7kZ~s2YwPC2-M?@FUt7@tvZE^6}W^i|jS}F@=6fh(O0m%8HO*k9-Mysn_UE z+K>MHHxxxSk$Rme-<85J|ITNN_D)UaTs@q#&4~P5*d)_t-_S;k$5HZ6d-`g9OYzHG zx+KBROv-Qb&E&+)fy!N0c3qlhUs;pimctflp2|;elgL`j(H|`zD4h!L&_XM$?ngX< zyrX(THXuDotFxiH8^=D5M#yf`R^_1=hmZ?{f6{?H+9RnbkJp|(kB(mSrjY!q;4BnK zI3c#_a7%afNBRjBH==Ab$8zLrYL|Y1Z4f%8bxfoCV~`z&TQ*R(7;dHE27yKfBzJmw8m4oUi+m#A`1{0N2QJ^v0?H)8rh5?W6bSg zw!nyHwB4P<sR8Xp2n-RSuzXk~y}Jt&mqeibk9J3USMDm1tw6a&FMe&|Yp%)jXW%WM&D3kh3AvZi)+drW!70K{-)XF^uP)K8RGS-Z^Rps&p(uGrJbCMcO)=%Zu=-pPP~~^kEhX?9}K1GmuwW zFRH(2pcGy1Xg(`q^Q(1_qE<8zM%IszhO`7fyxUgWJs(w@Xm}gxy~Gdb{Itm3qizq} z6KBR2<(BR^)z^_dmKI-8bRW^ISd<4YqpUn-pRgj1BeyxVDA(M7q4^D6sZG%lsy&3& z5zR{V-Bf!Imy%wLTw3JnlUI}$TcRR4c@iGd(J5FaA(zgRcq8iFq0TGHPazb7?hx+N9ESWeKJ)q6_nw0ORq@B=|RnhrIkyLUA!s2wQ;b3emiXRWZ9p*aCe{Q>!P6e}pmS ze6rou$iBw$n7*VH{-+@k4MEGV^kox`WYIQC{zgPz@S{yZH|LF@lu z)OpJ1U}!7t(p2=fvhqs~Rg1q($cUnWh8zc}IE6-Qp?rneqB!Q)rEY$XZ|Ez^vCy1Y zoSm))s*BOwH)=WHZfb;6bGY`&Y}nj9QJlNlX%yWwpAz++pc*$uVaP4hC(@SR`y`e3 z)1MHI1!lEKq{g9JLM^1;m^~wHQMNwj`bbWU9n5o)Hs5T6bblrzuz|w|;SA(uf{b4Y zE_X+p*-G%FkY7kK<}m{vW7-HBABnj>s2@a6CXpUQ*^iJ6J6mh>GawU-M@_T`P)9-m z&78`PdD1r-a)%Z8|gYA~(c}b4E#S*S{kj zjxq`9v;h)tXr3yGcWRqYk+L;5U8R_cH?U+Pj`|TAV`WAv)zIo2qUbtJ`*S42krEDT zr9)w$&Qm4q%cM)8GlO<+L-b{(t~lo!-HD~G#!{a=LMEdd4K$~Mgd4=YsQBI7hizWD zsr0jXx0KDdRy5Hus47Zn4&wh%qb({-j#%Oo$a7P>J2J~i4=0_6vV){0+@anL;&tI| zvs@H6k_{>DOBMNIVp-jz1*7{!*>?7cO165vyFsr$2|7yL(XYgv6jaJrcSFb?g>YJE31t z-T3yFo*(+!Q~n=a9lN#b-m7bTV#n^?3L5njx+Jto3=&cI|DU$Sgl_R&6aGJFwqeKK zed4=Fy9wPAN9TWbNWG zuB-~WvXsbZ>5U`p|7mqJt#UYbUa#z$*Yp1Y+|b}R diff --git a/conf/locale/ar/LC_MESSAGES/django.po b/conf/locale/ar/LC_MESSAGES/django.po index 35503bbd13..b7e30196b1 100644 --- a/conf/locale/ar/LC_MESSAGES/django.po +++ b/conf/locale/ar/LC_MESSAGES/django.po @@ -131,7 +131,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2015-09-11 12:16+0000\n" +"POT-Creation-Date: 2015-09-18 13:23+0000\n" "PO-Revision-Date: 2015-08-12 08:13+0000\n" "Last-Translator: Ahmed Jazzar \n" "Language-Team: Arabic (http://www.transifex.com/open-edx/edx-platform/language/ar/)\n" @@ -3751,25 +3751,16 @@ msgid "Request user's username" msgstr "يُرجى طلب اسم المستخدم الخاص بالمستخدم" #: common/lib/xmodule/xmodule/lti_module.py -msgid "" -"Select True to request the user's username. You must also set Open in New " -"Page to True to get the user's information." +msgid "Select True to request the user's username." msgstr "" -"يُرجى اختيار \"صحيح\" لطلب اسم المستخدم الخاص بالمستخدم، ويجب أيضًا ضبط " -"خاصية \"فتح في صفحة جديدة\" على خيار \"صحيح\" للحصول على معلومات المستخدم." #: common/lib/xmodule/xmodule/lti_module.py msgid "Request user's email" msgstr "يُرجى طلب البريد الإلكتروني للمستخدم" #: common/lib/xmodule/xmodule/lti_module.py -msgid "" -"Select True to request the user's email address. You must also set Open in " -"New Page to True to get the user's information." +msgid "Select True to request the user's email address." msgstr "" -"يُرجى اختيار \"صحيح\" لطلب عنوان البريد الإلكتروني الخاص بالمستخدم. ويجب " -"أيضًا ضبط خاصية \"فتح في صفحة جديدة\" على خيار \"صحيح\" أيضًا للحصول على " -"معلومات المستخدم." #: common/lib/xmodule/xmodule/lti_module.py msgid "LTI Application Information" @@ -8405,10 +8396,6 @@ msgstr "" msgid "The supplied topic id {topic_id} is not valid" msgstr "الرقم التعريفي الذي جرى توفيره حول الموضوع {topic_id} غير صالح." -#: lms/djangoapps/teams/views.py -msgid "Error connecting to elasticsearch" -msgstr "" - #. Translators: 'ordering' is a string describing a way #. of ordering a list. For example, {ordering} may be #. 'name', indicating that the user wants to sort the @@ -12513,8 +12500,6 @@ msgstr "إرسال تغريدة حول أنّك سجَّلت في هذا الم msgid "Email someone to say you've registered for this course" msgstr "مراسلة شخص ما عبر البريد الإلكتروني لإخباره أنّك سجّلت في هذا المساق " -#. Translators: This text will be automatically posted to the student's -#. Twitter account. {url} should appear at the end of the text. #: lms/templates/courseware/course_about.html msgid "I just registered for {number} {title} through {account}: {url}" msgstr "سجّلتُ لتوّي في {number} {title} من خلال {url} :{account}" @@ -13018,6 +13003,8 @@ msgstr "سوف يفتح ملف PDF في نافذة متصفح جديدة أو ت msgid "Download Your Certificate" msgstr "تنزيل شهادتك" +#. Translators: This message appears to users when the system is processessing +#. course certificates, which can take a few hours. #: lms/templates/courseware/progress.html msgid "We're working on it..." msgstr "جاري العمل على ذلك..." @@ -17689,9 +17676,8 @@ msgstr "" msgid "Required Information to Create a re-run of a course" msgstr "المعلومات المطلوبة لإنشاء تشغيل ثانٍ لمساق ما" -#. Translators: This is an example name for a new course, seen when filling -#. out -#. the form to create a new course. +#. Translators: This is an example name for a new course, seen when +#. filling out the form to create a new course. #: cms/templates/course-create-rerun.html cms/templates/index.html msgid "e.g. Introduction to Computer Science" msgstr "مثلًا، مقدّمة لعلوم الكمبيوتر" @@ -19064,8 +19050,8 @@ msgid "Library Name" msgstr "اسم المكتبة" #. Translators: This is an example name for a new content library, seen when -#. filling out the form to create a new library. (A library is a collection of -#. content or problems.) +#. filling out the form to create a new library. +#. (A library is a collection of content or problems.) #: cms/templates/index.html msgid "e.g. Computer Science Problems" msgstr "مثلًا، مسائل علوم الكمبيوتر" @@ -19088,8 +19074,9 @@ msgstr "رمز المكتبة" #. Translators: This is an example for the "code" used to identify a library, #. seen when filling out the form to create a new library. This example is -#. short for "Computer Science Problems". The example number may contain -#. letters but must not contain spaces. +#. short +#. for "Computer Science Problems". The example number may contain letters +#. but must not contain spaces. #: cms/templates/index.html msgid "e.g. CSPROB" msgstr "مثلًا، CSPROB" @@ -19118,10 +19105,11 @@ msgstr "تشغيل المساق:" msgid "This course run is currently being created." msgstr "يجري حاليًّا إنشاء تشغيل هذا المساق." -#. Translators: This is a status message, used to inform the user of what the -#. system is doing. This status means that the user has requested to re-run an -#. existing course, and the system is currently in the process of duplicating -#. and configuring the existing course so that it can be re-run. +#. Translators: This is a status message, used to inform the user of +#. what the system is doing. This status means that the user has +#. requested to re-run an existing course, and the system is currently +#. in the process of duplicating and configuring the existing course +#. so that it can be re-run. #: cms/templates/index.html msgid "Configuring as re-run" msgstr "الضبط كتشغيل ثانٍ" @@ -19136,6 +19124,18 @@ msgstr "" "هذه الصفحة أو {link_start}إعادة فتحها{link_end} لتحديث لائحة المساقات. " "وسيتطلّب المساق الجديد ضبط بعض الإعدادات يدويًّا." +#. Translators: This is a status message for the course re-runs feature. +#. When a course admin indicates that a course should be re-run, the system +#. needs to process the request and prepare the new course. The status of +#. the process will follow this text. +#: cms/templates/index.html +msgid "This re-run processing status:" +msgstr "" + +#: cms/templates/index.html +msgid "Configuration Error" +msgstr "" + #: cms/templates/index.html msgid "" "A system error occurred while your course was being processed. Please go to " @@ -20153,7 +20153,7 @@ msgstr "يجب أن تزيد عن درجة النجاح في المساق أو #: cms/templates/settings_graders.html msgid "Grading Rules & Policies" -msgstr "سياسات قواعد & التقييم" +msgstr "سياسات وقواعد التقييم" #: cms/templates/settings_graders.html msgid "Deadlines, requirements, and logistics around grading student work" diff --git a/conf/locale/ar/LC_MESSAGES/djangojs.mo b/conf/locale/ar/LC_MESSAGES/djangojs.mo index 872abf7237a37af5987c3a9783625a33faa48c1f..aa3ca60432dc56b90ed58c61fa4d53cec77f86d2 100644 GIT binary patch delta 29 lcmca`nd`!3u7)j)td{H+3Wmm3Mn>&CmW\n" "Language-Team: Arabic (http://www.transifex.com/open-edx/edx-platform/language/ar/)\n" diff --git a/conf/locale/eo/LC_MESSAGES/django.mo b/conf/locale/eo/LC_MESSAGES/django.mo index ef27e9e07eddf14c1d8fa041d82d0bd9654c9655..6c8f5b9885b3450ab09a0f8cc003c6566096e976 100644 GIT binary patch delta 77826 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%0A%mKf3c( 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 diff --git a/conf/locale/eo/LC_MESSAGES/django.po b/conf/locale/eo/LC_MESSAGES/django.po index 847b04c14a..34dbcd2304 100644 --- a/conf/locale/eo/LC_MESSAGES/django.po +++ b/conf/locale/eo/LC_MESSAGES/django.po @@ -37,8 +37,8 @@ msgid "" msgstr "" "Project-Id-Version: 0.1a\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2015-09-11 12:47+0000\n" -"PO-Revision-Date: 2015-09-11 12:47:23.251524\n" +"POT-Creation-Date: 2015-09-18 13:39+0000\n" +"PO-Revision-Date: 2015-09-18 13:39:23.492978\n" "Last-Translator: \n" "Language-Team: openedx-translation \n" "MIME-Version: 1.0\n" @@ -4154,24 +4154,20 @@ msgid "Request user's username" msgstr "Réqüést üsér's üsérnämé Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σ#" #: common/lib/xmodule/xmodule/lti_module.py -msgid "" -"Select True to request the user's username. You must also set Open in New " -"Page to True to get the user's information." +msgid "Select True to request the user's username." msgstr "" -"Séléçt Trüé tö réqüést thé üsér's üsérnämé. Ýöü müst älsö sét Öpén ïn Néw " -"Pägé tö Trüé tö gét thé üsér's ïnförmätïön. Ⱡ'σяєм ιρѕυм ∂#" +"Séléçt Trüé tö réqüést thé üsér's üsérnämé. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, " +"¢σηѕє¢тєтυя #" #: common/lib/xmodule/xmodule/lti_module.py msgid "Request user's email" msgstr "Réqüést üsér's émäïl Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, #" #: common/lib/xmodule/xmodule/lti_module.py -msgid "" -"Select True to request the user's email address. You must also set Open in " -"New Page to True to get the user's information." +msgid "Select True to request the user's email address." msgstr "" -"Séléçt Trüé tö réqüést thé üsér's émäïl äddréss. Ýöü müst älsö sét Öpén ïn " -"Néw Pägé tö Trüé tö gét thé üsér's ïnförmätïön. Ⱡ'σяєм ιρѕ#" +"Séléçt Trüé tö réqüést thé üsér's émäïl äddréss. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт " +"αмєт, ¢σηѕє¢тєтυя α#" #: common/lib/xmodule/xmodule/lti_module.py msgid "LTI Application Information" @@ -9566,11 +9562,6 @@ msgstr "" "Thé süpplïéd töpïç ïd {topic_id} ïs nöt välïd Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, " "¢σηѕє¢тєтυя#" -#: lms/djangoapps/teams/views.py -msgid "Error connecting to elasticsearch" -msgstr "" -"Érrör çönnéçtïng tö élästïçséärçh Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тє#" - #. Translators: 'ordering' is a string describing a way #. of ordering a list. For example, {ordering} may be #. 'name', indicating that the user wants to sort the @@ -14176,8 +14167,6 @@ msgstr "" "Émäïl söméöné tö säý ýöü'vé régïstéréd för thïs çöürsé Ⱡ'σяєм ιρѕυм ∂σłσя " "ѕιт αмєт, ¢σηѕє¢тєтυя α#" -#. Translators: This text will be automatically posted to the student's -#. Twitter account. {url} should appear at the end of the text. #: lms/templates/courseware/course_about.html msgid "I just registered for {number} {title} through {account}: {url}" msgstr "" @@ -14762,6 +14751,8 @@ msgstr "" msgid "Download Your Certificate" msgstr "Döwnlöäd Ýöür Çértïfïçäté Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕ#" +#. Translators: This message appears to users when the system is processessing +#. course certificates, which can take a few hours. #: lms/templates/courseware/progress.html msgid "We're working on it..." msgstr "Wé'ré wörkïng ön ït... Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢#" @@ -20219,9 +20210,8 @@ msgstr "" "Réqüïréd Ìnförmätïön tö Çréäté ä ré-rün öf ä çöürsé Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт " "αмєт, ¢σηѕє¢тєтυя α#" -#. Translators: This is an example name for a new course, seen when filling -#. out -#. the form to create a new course. +#. Translators: This is an example name for a new course, seen when +#. filling out the form to create a new course. #: cms/templates/course-create-rerun.html cms/templates/index.html msgid "e.g. Introduction to Computer Science" msgstr "" @@ -21883,8 +21873,8 @@ msgid "Library Name" msgstr "Lïßrärý Nämé Ⱡ'σяєм ιρѕυм ∂σłσя ѕ#" #. Translators: This is an example name for a new content library, seen when -#. filling out the form to create a new library. (A library is a collection of -#. content or problems.) +#. filling out the form to create a new library. +#. (A library is a collection of content or problems.) #: cms/templates/index.html msgid "e.g. Computer Science Problems" msgstr "é.g. Çömpütér Sçïénçé Prößléms Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢т#" @@ -21911,8 +21901,9 @@ msgstr "Lïßrärý Çödé Ⱡ'σяєм ιρѕυм ∂σłσя ѕ#" #. Translators: This is an example for the "code" used to identify a library, #. seen when filling out the form to create a new library. This example is -#. short for "Computer Science Problems". The example number may contain -#. letters but must not contain spaces. +#. short +#. for "Computer Science Problems". The example number may contain letters +#. but must not contain spaces. #: cms/templates/index.html msgid "e.g. CSPROB" msgstr "é.g. ÇSPRÖB Ⱡ'σяєм ιρѕυм ∂σłσя #" @@ -21945,10 +21936,11 @@ msgstr "" "Thïs çöürsé rün ïs çürréntlý ßéïng çréätéd. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, " "¢σηѕє¢тєтυя #" -#. Translators: This is a status message, used to inform the user of what the -#. system is doing. This status means that the user has requested to re-run an -#. existing course, and the system is currently in the process of duplicating -#. and configuring the existing course so that it can be re-run. +#. Translators: This is a status message, used to inform the user of +#. what the system is doing. This status means that the user has +#. requested to re-run an existing course, and the system is currently +#. in the process of duplicating and configuring the existing course +#. so that it can be re-run. #: cms/templates/index.html msgid "Configuring as re-run" msgstr "Çönfïgürïng äs ré-rün Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, #" @@ -21968,6 +21960,18 @@ msgstr "" "αυтє ιяυяє ∂σłσя ιη яєρяєнєη∂єяιт ιη νσłυρтαтє νєłιт єѕѕє ¢ιłłυм ∂σłσяє єυ " "ƒυgιαт ηυłłα ραяιαтυя. єχ¢єρтєυя ѕιηт σ¢¢αє¢αт ¢υρι∂αтαт ηση ρяσι∂єηт,#" +#. Translators: This is a status message for the course re-runs feature. +#. When a course admin indicates that a course should be re-run, the system +#. needs to process the request and prepare the new course. The status of +#. the process will follow this text. +#: cms/templates/index.html +msgid "This re-run processing status:" +msgstr "Thïs ré-rün pröçéssïng stätüs: Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢т#" + +#: cms/templates/index.html +msgid "Configuration Error" +msgstr "Çönfïgürätïön Érrör Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт,#" + #: cms/templates/index.html msgid "" "A system error occurred while your course was being processed. Please go to " diff --git a/conf/locale/eo/LC_MESSAGES/djangojs.mo b/conf/locale/eo/LC_MESSAGES/djangojs.mo index ce310ce200062fa8544649224e09c85750c3db1e..68ba09c6cf4c0f41c8ae5f170f46ee01be876f01 100644 GIT binary patch delta 60 zcmaEKOYqSx!GSF0YGsQG5`Po delta 60 zcmaEKOYqSx!GNGa~~-v-a#{Mj&PaV&?7H I$t>SF0X%gQ5&!@I diff --git a/conf/locale/eo/LC_MESSAGES/djangojs.po b/conf/locale/eo/LC_MESSAGES/djangojs.po index f6e1a17759..2995eb25f5 100644 --- a/conf/locale/eo/LC_MESSAGES/djangojs.po +++ b/conf/locale/eo/LC_MESSAGES/djangojs.po @@ -26,8 +26,8 @@ msgid "" msgstr "" "Project-Id-Version: 0.1a\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2015-09-11 12:46+0000\n" -"PO-Revision-Date: 2015-09-11 12:47:23.562016\n" +"POT-Creation-Date: 2015-09-18 13:38+0000\n" +"PO-Revision-Date: 2015-09-18 13:39:23.855088\n" "Last-Translator: \n" "Language-Team: openedx-translation \n" "MIME-Version: 1.0\n" diff --git a/conf/locale/es_419/LC_MESSAGES/django.mo b/conf/locale/es_419/LC_MESSAGES/django.mo index edba37db3de5e9321f0c169186b4a4de84268a9f..2e95c65ebd97662c8e9a12a26c3bef2d0c0f2da9 100644 GIT binary patch delta 76507 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 I{iVnMAM}j&>;M1& diff --git a/conf/locale/fr/LC_MESSAGES/djangojs.po b/conf/locale/fr/LC_MESSAGES/djangojs.po index d3cf5f1ff2..cc98c56387 100644 --- a/conf/locale/fr/LC_MESSAGES/djangojs.po +++ b/conf/locale/fr/LC_MESSAGES/djangojs.po @@ -110,9 +110,9 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2015-09-11 12:15+0000\n" -"PO-Revision-Date: 2015-09-11 12:17+0000\n" -"Last-Translator: Sarina Canelake \n" +"POT-Creation-Date: 2015-09-18 13:22+0000\n" +"PO-Revision-Date: 2015-09-12 04:07+0000\n" +"Last-Translator: rafcha \n" "Language-Team: French (http://www.transifex.com/open-edx/edx-platform/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" diff --git a/conf/locale/he/LC_MESSAGES/django.mo b/conf/locale/he/LC_MESSAGES/django.mo index e0654e9f57722135f64a1a000c618d8701427ff3..1c4d6498c0e7576878a08eeb4e4bcfba28f8cba7 100644 GIT binary patch delta 20 bcmca;aM55xHV?anf}ydMk@4mtp8MPYOKS$F delta 20 bcmca;aM55xHV?a@f}xR>q1omlp8MPYOBn{C diff --git a/conf/locale/he/LC_MESSAGES/django.po b/conf/locale/he/LC_MESSAGES/django.po index 670deccbe2..2ad495b497 100644 --- a/conf/locale/he/LC_MESSAGES/django.po +++ b/conf/locale/he/LC_MESSAGES/django.po @@ -61,7 +61,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2015-09-11 12:16+0000\n" +"POT-Creation-Date: 2015-09-18 13:23+0000\n" "PO-Revision-Date: 2015-05-28 20:00+0000\n" "Last-Translator: Nadav Stark \n" "Language-Team: Hebrew (http://www.transifex.com/open-edx/edx-platform/language/he/)\n" @@ -3294,9 +3294,7 @@ msgid "Request user's username" msgstr "" #: common/lib/xmodule/xmodule/lti_module.py -msgid "" -"Select True to request the user's username. You must also set Open in New " -"Page to True to get the user's information." +msgid "Select True to request the user's username." msgstr "" #: common/lib/xmodule/xmodule/lti_module.py @@ -3304,9 +3302,7 @@ msgid "Request user's email" msgstr "" #: common/lib/xmodule/xmodule/lti_module.py -msgid "" -"Select True to request the user's email address. You must also set Open in " -"New Page to True to get the user's information." +msgid "Select True to request the user's email address." msgstr "" #: common/lib/xmodule/xmodule/lti_module.py @@ -7428,10 +7424,6 @@ msgstr "" msgid "The supplied topic id {topic_id} is not valid" msgstr "" -#: lms/djangoapps/teams/views.py -msgid "Error connecting to elasticsearch" -msgstr "" - #. Translators: 'ordering' is a string describing a way #. of ordering a list. For example, {ordering} may be #. 'name', indicating that the user wants to sort the @@ -11284,8 +11276,6 @@ msgstr "" msgid "Email someone to say you've registered for this course" msgstr "" -#. Translators: This text will be automatically posted to the student's -#. Twitter account. {url} should appear at the end of the text. #: lms/templates/courseware/course_about.html msgid "I just registered for {number} {title} through {account}: {url}" msgstr "" @@ -11752,6 +11742,8 @@ msgstr "" msgid "Download Your Certificate" msgstr "" +#. Translators: This message appears to users when the system is processessing +#. course certificates, which can take a few hours. #: lms/templates/courseware/progress.html msgid "We're working on it..." msgstr "" @@ -15955,9 +15947,8 @@ msgstr "" msgid "Required Information to Create a re-run of a course" msgstr "" -#. Translators: This is an example name for a new course, seen when filling -#. out -#. the form to create a new course. +#. Translators: This is an example name for a new course, seen when +#. filling out the form to create a new course. #: cms/templates/course-create-rerun.html cms/templates/index.html msgid "e.g. Introduction to Computer Science" msgstr "" @@ -17127,8 +17118,8 @@ msgid "Library Name" msgstr "" #. Translators: This is an example name for a new content library, seen when -#. filling out the form to create a new library. (A library is a collection of -#. content or problems.) +#. filling out the form to create a new library. +#. (A library is a collection of content or problems.) #: cms/templates/index.html msgid "e.g. Computer Science Problems" msgstr "" @@ -17151,8 +17142,9 @@ msgstr "" #. Translators: This is an example for the "code" used to identify a library, #. seen when filling out the form to create a new library. This example is -#. short for "Computer Science Problems". The example number may contain -#. letters but must not contain spaces. +#. short +#. for "Computer Science Problems". The example number may contain letters +#. but must not contain spaces. #: cms/templates/index.html msgid "e.g. CSPROB" msgstr "" @@ -17179,10 +17171,11 @@ msgstr "" msgid "This course run is currently being created." msgstr "" -#. Translators: This is a status message, used to inform the user of what the -#. system is doing. This status means that the user has requested to re-run an -#. existing course, and the system is currently in the process of duplicating -#. and configuring the existing course so that it can be re-run. +#. Translators: This is a status message, used to inform the user of +#. what the system is doing. This status means that the user has +#. requested to re-run an existing course, and the system is currently +#. in the process of duplicating and configuring the existing course +#. so that it can be re-run. #: cms/templates/index.html msgid "Configuring as re-run" msgstr "" @@ -17194,6 +17187,18 @@ msgid "" " new course will need some manual configuration." msgstr "" +#. Translators: This is a status message for the course re-runs feature. +#. When a course admin indicates that a course should be re-run, the system +#. needs to process the request and prepare the new course. The status of +#. the process will follow this text. +#: cms/templates/index.html +msgid "This re-run processing status:" +msgstr "" + +#: cms/templates/index.html +msgid "Configuration Error" +msgstr "" + #: cms/templates/index.html msgid "" "A system error occurred while your course was being processed. Please go to " diff --git a/conf/locale/he/LC_MESSAGES/djangojs.mo b/conf/locale/he/LC_MESSAGES/djangojs.mo index ba46ce21438d19342fcca1cd133557f9d214f703..f4ca29b7bfb00b6e976f0bed2b530b61edfdbe6b 100644 GIT binary patch delta 20 bcmaFO{hE7&I5WG2f}ydMk\n" "Language-Team: Hebrew (http://www.transifex.com/open-edx/edx-platform/language/he/)\n" diff --git a/conf/locale/hi/LC_MESSAGES/django.mo b/conf/locale/hi/LC_MESSAGES/django.mo index c78a1fac83f134a977e877c0e88662946bc5e5ba..c5a29112c6745cf2bc12a46ea2e0a56de563395f 100644 GIT binary patch delta 29 lcmbQXi)Y#{o`x-q;o9sL3Wmm3M#k-N+Kk)dw3&8%1OSxB3C;ij delta 29 lcmbQXi)Y#{o`x-q;o9tm3Wi2jhGy+?+Kk)dw3&8%1OSv*3CI8d diff --git a/conf/locale/hi/LC_MESSAGES/django.po b/conf/locale/hi/LC_MESSAGES/django.po index c4b90229bf..63791debf3 100644 --- a/conf/locale/hi/LC_MESSAGES/django.po +++ b/conf/locale/hi/LC_MESSAGES/django.po @@ -74,7 +74,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2015-09-11 12:16+0000\n" +"POT-Creation-Date: 2015-09-18 13:23+0000\n" "PO-Revision-Date: 2015-06-28 20:21+0000\n" "Last-Translator: ria1234 \n" "Language-Team: Hindi (http://www.transifex.com/open-edx/edx-platform/language/hi/)\n" @@ -3317,9 +3317,7 @@ msgid "Request user's username" msgstr "" #: common/lib/xmodule/xmodule/lti_module.py -msgid "" -"Select True to request the user's username. You must also set Open in New " -"Page to True to get the user's information." +msgid "Select True to request the user's username." msgstr "" #: common/lib/xmodule/xmodule/lti_module.py @@ -3327,9 +3325,7 @@ msgid "Request user's email" msgstr "" #: common/lib/xmodule/xmodule/lti_module.py -msgid "" -"Select True to request the user's email address. You must also set Open in " -"New Page to True to get the user's information." +msgid "Select True to request the user's email address." msgstr "" #: common/lib/xmodule/xmodule/lti_module.py @@ -7551,10 +7547,6 @@ msgstr "" msgid "The supplied topic id {topic_id} is not valid" msgstr "" -#: lms/djangoapps/teams/views.py -msgid "Error connecting to elasticsearch" -msgstr "" - #. Translators: 'ordering' is a string describing a way #. of ordering a list. For example, {ordering} may be #. 'name', indicating that the user wants to sort the @@ -11517,8 +11509,6 @@ msgstr "" msgid "Email someone to say you've registered for this course" msgstr "" -#. Translators: This text will be automatically posted to the student's -#. Twitter account. {url} should appear at the end of the text. #: lms/templates/courseware/course_about.html msgid "I just registered for {number} {title} through {account}: {url}" msgstr "" @@ -11981,6 +11971,8 @@ msgstr "" msgid "Download Your Certificate" msgstr "" +#. Translators: This message appears to users when the system is processessing +#. course certificates, which can take a few hours. #: lms/templates/courseware/progress.html msgid "We're working on it..." msgstr "" @@ -16292,9 +16284,8 @@ msgstr "" msgid "Required Information to Create a re-run of a course" msgstr "" -#. Translators: This is an example name for a new course, seen when filling -#. out -#. the form to create a new course. +#. Translators: This is an example name for a new course, seen when +#. filling out the form to create a new course. #: cms/templates/course-create-rerun.html cms/templates/index.html msgid "e.g. Introduction to Computer Science" msgstr "" @@ -17464,8 +17455,8 @@ msgid "Library Name" msgstr "" #. Translators: This is an example name for a new content library, seen when -#. filling out the form to create a new library. (A library is a collection of -#. content or problems.) +#. filling out the form to create a new library. +#. (A library is a collection of content or problems.) #: cms/templates/index.html msgid "e.g. Computer Science Problems" msgstr "" @@ -17488,8 +17479,9 @@ msgstr "" #. Translators: This is an example for the "code" used to identify a library, #. seen when filling out the form to create a new library. This example is -#. short for "Computer Science Problems". The example number may contain -#. letters but must not contain spaces. +#. short +#. for "Computer Science Problems". The example number may contain letters +#. but must not contain spaces. #: cms/templates/index.html msgid "e.g. CSPROB" msgstr "" @@ -17516,10 +17508,11 @@ msgstr "" msgid "This course run is currently being created." msgstr "" -#. Translators: This is a status message, used to inform the user of what the -#. system is doing. This status means that the user has requested to re-run an -#. existing course, and the system is currently in the process of duplicating -#. and configuring the existing course so that it can be re-run. +#. Translators: This is a status message, used to inform the user of +#. what the system is doing. This status means that the user has +#. requested to re-run an existing course, and the system is currently +#. in the process of duplicating and configuring the existing course +#. so that it can be re-run. #: cms/templates/index.html msgid "Configuring as re-run" msgstr "" @@ -17531,6 +17524,18 @@ msgid "" " new course will need some manual configuration." msgstr "" +#. Translators: This is a status message for the course re-runs feature. +#. When a course admin indicates that a course should be re-run, the system +#. needs to process the request and prepare the new course. The status of +#. the process will follow this text. +#: cms/templates/index.html +msgid "This re-run processing status:" +msgstr "" + +#: cms/templates/index.html +msgid "Configuration Error" +msgstr "" + #: cms/templates/index.html msgid "" "A system error occurred while your course was being processed. Please go to " diff --git a/conf/locale/hi/LC_MESSAGES/djangojs.mo b/conf/locale/hi/LC_MESSAGES/djangojs.mo index 43bf170536144669b693cdefca0b1d57ef344405..c6b202d427dcf81a4db45a98b73ffc26432480da 100644 GIT binary patch delta 22 ecmX?hi0RlNrVXyv>=p`!##Tl~n|-W*r2+tC3\n" "Language-Team: Hindi (http://www.transifex.com/open-edx/edx-platform/language/hi/)\n" diff --git a/conf/locale/ko_KR/LC_MESSAGES/django.mo b/conf/locale/ko_KR/LC_MESSAGES/django.mo index 1e798eb01ab59c1bb18f015b78bc28aba94de207..ce1af6a7b9d2163ad6db1f32fb1b3170eb8b7e98 100644 GIT binary patch delta 74468 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 delta 74873 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 Pqdh_KmpgcWYw&*n8@{xh diff --git a/conf/locale/ko_KR/LC_MESSAGES/django.po b/conf/locale/ko_KR/LC_MESSAGES/django.po index 31b139956b..0ed2380641 100644 --- a/conf/locale/ko_KR/LC_MESSAGES/django.po +++ b/conf/locale/ko_KR/LC_MESSAGES/django.po @@ -87,8 +87,8 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2015-09-11 12:16+0000\n" -"PO-Revision-Date: 2015-09-11 07:58+0000\n" +"POT-Creation-Date: 2015-09-18 13:23+0000\n" +"PO-Revision-Date: 2015-09-18 03:12+0000\n" "Last-Translator: Hongseob Lee \n" "Language-Team: Korean (Korea) (http://www.transifex.com/open-edx/edx-platform/language/ko_KR/)\n" "MIME-Version: 1.0\n" @@ -3412,20 +3412,16 @@ msgid "Request user's username" msgstr "아이디를 요청합니다." #: common/lib/xmodule/xmodule/lti_module.py -msgid "" -"Select True to request the user's username. You must also set Open in New " -"Page to True to get the user's information." -msgstr "아이디를 요청하려면 True를 입력하십시오. 아이디를 얻기 위해서는 '신규 페이지에서 열기'가 먼저 설정되어 있어야 합니다." +msgid "Select True to request the user's username." +msgstr "" #: common/lib/xmodule/xmodule/lti_module.py msgid "Request user's email" msgstr "이용자 이메일을 요청합니다." #: common/lib/xmodule/xmodule/lti_module.py -msgid "" -"Select True to request the user's email address. You must also set Open in " -"New Page to True to get the user's information." -msgstr "이용자 이메일 주소를 요청하려면 True를 입력합니다. 이를 위해 신규 페이지에서 열기가 먼저 설정되어 있어야 합니다." +msgid "Select True to request the user's email address." +msgstr "" #: common/lib/xmodule/xmodule/lti_module.py msgid "LTI Application Information" @@ -7808,10 +7804,6 @@ msgstr "" msgid "The supplied topic id {topic_id} is not valid" msgstr "제공된 주제 ID {topic_id}가 유효하지 않습니다." -#: lms/djangoapps/teams/views.py -msgid "Error connecting to elasticsearch" -msgstr "" - #. Translators: 'ordering' is a string describing a way #. of ordering a list. For example, {ordering} may be #. 'name', indicating that the user wants to sort the @@ -8292,7 +8284,7 @@ msgstr "마지막 수정:" #: lms/templates/wiki/article.html msgid "See all children" -msgstr "모든 하위내용 보기" +msgstr "모든 하위 문서 보기" #: lms/templates/wiki/article.html msgid "This article was last modified:" @@ -8869,7 +8861,7 @@ msgstr "" #. below a field meant to hold the user's full name. #: openedx/core/djangoapps/user_api/views.py lms/templates/register.html msgid "Needed for any certificates you may earn" -msgstr "앞으로 받게 될 이수증에 필요합니다." +msgstr "앞으로 받게 될 이수증에 필요합니다. 영문이름 병기를 원하시면 영문이름을 추가하세요." #. Translators: This label appears above a field on the registration form #. meant to hold the user's public username. @@ -8881,13 +8873,13 @@ msgstr "아이디" msgid "" "The name that will identify you in your courses - {bold_start}(cannot be " "changed later){bold_end}" -msgstr "강좌에서 표시되길 원하는 이름 - {bold_start}(변경 불가){bold_end}" +msgstr "영문/숫자로 이루어진 아이디 - {bold_start}(변경 불가){bold_end}" #. Translators: This example username is used as a placeholder in #. a field on the registration form meant to hold the user's username. #: openedx/core/djangoapps/user_api/views.py msgid "JaneDoe" -msgstr "홍길동" +msgstr "HongGilDong" #. Translators: This label appears above a dropdown menu on the registration #. form used to select the user's highest completed level of education. @@ -10742,7 +10734,7 @@ msgstr "학습자 상태 삭제" #: lms/templates/staff_problem_info.html #: lms/templates/instructor/instructor_dashboard_2/student_admin.html msgid "Rescore Student Submission" -msgstr "제출 재채점" +msgstr "답안 재채점" #: lms/templates/staff_problem_info.html msgid "Module Fields" @@ -11738,8 +11730,6 @@ msgstr "본 강좌에 등록한 것을 트위터에 트윗하세요." msgid "Email someone to say you've registered for this course" msgstr "이 강좌에 등록했음을 누군가에게 이메일하세요" -#. Translators: This text will be automatically posted to the student's -#. Twitter account. {url} should appear at the end of the text. #: lms/templates/courseware/course_about.html msgid "I just registered for {number} {title} through {account}: {url}" msgstr "{number} {title} through {account}: {url} 로 방금 등록 완료 " @@ -12048,7 +12038,7 @@ msgstr "학습자별 세부 성적 검토 및 조정" #: lms/templates/courseware/legacy_instructor_dashboard.html msgid "Select a problem and an action:" -msgstr "문제와 동작을 선택하세요:" +msgstr "문제와 액션을 선택하세요." #: lms/templates/courseware/legacy_instructor_dashboard.html msgid "" @@ -12071,8 +12061,7 @@ msgid "" "To download a CSV file containing profile information for students who are " "enrolled in this course, visit the Data Download section of the Instructor " "Dashboard." -msgstr "" -"강좌에 등록되어 있는 학습자 프로필 정보가 담긴 CSV 파일을 다운로드하기 위해, 교수자 대시보드의 자료 다운로드를 방문하세요. " +msgstr "강좌에 등록되어 있는 학습자 정보가 담긴 CSV 파일을 다운로드 하기 위해, 교수자 대시보드에서 데이터를 클릭하세요. " #: lms/templates/courseware/legacy_instructor_dashboard.html msgid "" @@ -12214,6 +12203,8 @@ msgstr "PDF는 새로운 브라우져 창 혹은 탭에 열릴 것입니다." msgid "Download Your Certificate" msgstr "강좌 이수증 다운로드하기" +#. Translators: This message appears to users when the system is processessing +#. course certificates, which can take a few hours. #: lms/templates/courseware/progress.html msgid "We're working on it..." msgstr "작업중입니다." @@ -13419,7 +13410,7 @@ msgstr "[[성함]]에게:" msgid "" "We have provided a course enrollment code for you in {course_name}. To " "enroll in the course, click the following link:" -msgstr "{course_name}에서 수강신청 코드를 제공했습니다. 강좌에 등록하기 위해 다음 링크를 클릭하세요:" +msgstr "{course_name}에서 수강신청 코드를 제공했습니다. 강좌에 등록하려면 다음 링크를 클릭하세요." #: lms/templates/emails/registration_codes_sale_email.txt msgid "HTML link from the attached CSV file" @@ -13881,7 +13872,7 @@ msgstr "" #: lms/templates/instructor/instructor_dashboard_2/data_download.html msgid "Grading Configuration" -msgstr "성적 설정" +msgstr "성적 가중치" #: lms/templates/instructor/instructor_dashboard_2/data_download.html msgid "Click to download a CSV of anonymized student IDs:" @@ -13917,7 +13908,7 @@ msgstr "버튼을 여러번 클릭하지 마세요. 그럴 경우, 생성 과정 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 파일과 이메일, 아이디 등의 프로필 정보를 생성하려면 클릭하세요." +msgstr "이 강좌에 등록된 모든 학습자 CSV 파일과 이메일, 아이디 등의 학습자 정보 보고서를 생성하려면 클릭하세요." #: lms/templates/instructor/instructor_dashboard_2/data_download.html msgid "Download profile information as a CSV" @@ -13931,7 +13922,7 @@ msgstr "강좌에 등록할 수 있으나 아직 처리가 완료되지 않은 #: lms/templates/instructor/instructor_dashboard_2/data_download.html msgid "Download a CSV of learners who can enroll" -msgstr "등록할 수 있는 학습자의 CSV를 다운로드 합니다." +msgstr "등록할 수 있는 학습자의 CSV 다운로드" #: lms/templates/instructor/instructor_dashboard_2/data_download.html msgid "" @@ -15015,7 +15006,7 @@ msgstr "학습자별 성적 사정" #: lms/templates/instructor/instructor_dashboard_2/student_admin.html msgid "Click this link to view the student's progress page:" -msgstr "학습자의 진도 페이지를 보기 위해서 이 링크를 클릭하세요:" +msgstr "학습자의 진도 페이지를 보려면 이 링크를 클릭하세요." #: lms/templates/instructor/instructor_dashboard_2/student_admin.html msgid "Student Progress Page" @@ -15027,7 +15018,7 @@ msgstr "학습자별 성적 조정" #: lms/templates/instructor/instructor_dashboard_2/student_admin.html msgid "Specify a problem in the course here with its complete location:" -msgstr "강좌에서 발생한 문제를 정확한 위치와 함께 기술하세요:" +msgstr "강좌에서 발생한 문제를 정확한 위치와 함께 기술하세요." #: lms/templates/instructor/instructor_dashboard_2/student_admin.html msgid "Problem location" @@ -15038,11 +15029,11 @@ msgstr "문제 위치 " msgid "" "You must provide the complete location of the problem. In the Staff Debug " "viewer, the location looks like this:" -msgstr "문제가 발생하는 자세한 위치를 알려주어야 합니다. Staff Debug Viewer에서 위치는 다음과 같습니다: " +msgstr "문제가 발생하는 자세한 위치를 알려주어야 합니다. Staff Debug Viewer에서 위치는 다음과 같습니다." #: lms/templates/instructor/instructor_dashboard_2/student_admin.html msgid "Next, select an action to perform for the given user and problem:" -msgstr "다음 작업은 지정된 사용자와 문제에 대한 수행을 선택합니다 :" +msgstr "다음 작업은 지정된 사용자와 문제에 대한 수행을 선택합니다." #: lms/templates/instructor/instructor_dashboard_2/student_admin.html msgid "" @@ -15064,7 +15055,7 @@ msgstr "" #: lms/templates/instructor/instructor_dashboard_2/student_admin.html msgid "Show Background Task History for Student" -msgstr "학습자에 대한 배경 작업 이력 보기" +msgstr "학습자 배경 작업 이력 보기" #: lms/templates/instructor/instructor_dashboard_2/student_admin.html msgid "Entrance Exam Adjustment" @@ -15112,11 +15103,11 @@ msgstr "액션을 선택하세요" #: lms/templates/instructor/instructor_dashboard_2/student_admin.html msgid "Reset ALL students' attempts" -msgstr "모든 학습자의 시도 초기화" +msgstr "전체 학습자의 문제 풀이 횟수 초기화" #: lms/templates/instructor/instructor_dashboard_2/student_admin.html msgid "Rescore ALL students' problem submissions" -msgstr "모든 학습자의 문제 제출 재채점" +msgstr "전체 학습자의 답안 재채점" #: lms/templates/instructor/instructor_dashboard_2/student_admin.html msgid "" @@ -15125,7 +15116,7 @@ msgid "" "submitted for this problem, click on this button" msgstr "" "이 작업은 백그라운드에서 이루어지며, 작업 상태가 공지 사항 탭의 표에 나타날 것입니다. 전체 작업의 상태를 보려면, 이 버튼을 " -"누르세요." +"클릭하세요." #: lms/templates/instructor/instructor_dashboard_2/student_admin.html msgid "Show Background Task History for Problem" @@ -16576,9 +16567,8 @@ msgstr "기관과 강좌 번호, 기관별 강좌 번호는 고유해야 합니 msgid "Required Information to Create a re-run of a course" msgstr "강좌 재운영을 만드는데 필요한 정보" -#. Translators: This is an example name for a new course, seen when filling -#. out -#. the form to create a new course. +#. Translators: This is an example name for a new course, seen when +#. filling out the form to create a new course. #: cms/templates/course-create-rerun.html cms/templates/index.html msgid "e.g. Introduction to Computer Science" msgstr "예: 컴퓨터 공학 개론" @@ -17828,8 +17818,8 @@ msgid "Library Name" msgstr "콘텐츠 보관함명" #. Translators: This is an example name for a new content library, seen when -#. filling out the form to create a new library. (A library is a collection of -#. content or problems.) +#. filling out the form to create a new library. +#. (A library is a collection of content or problems.) #: cms/templates/index.html msgid "e.g. Computer Science Problems" msgstr "ex 컴퓨터 개론 문제" @@ -17852,8 +17842,9 @@ msgstr "콘텐츠 보관함 코드" #. Translators: This is an example for the "code" used to identify a library, #. seen when filling out the form to create a new library. This example is -#. short for "Computer Science Problems". The example number may contain -#. letters but must not contain spaces. +#. short +#. for "Computer Science Problems". The example number may contain letters +#. but must not contain spaces. #: cms/templates/index.html msgid "e.g. CSPROB" msgstr "예: CSPROB" @@ -17880,10 +17871,11 @@ msgstr "기관별 강좌 번호" msgid "This course run is currently being created." msgstr "기관별 강좌 번호가 만들어지고 있습니다." -#. Translators: This is a status message, used to inform the user of what the -#. system is doing. This status means that the user has requested to re-run an -#. existing course, and the system is currently in the process of duplicating -#. and configuring the existing course so that it can be re-run. +#. Translators: This is a status message, used to inform the user of +#. what the system is doing. This status means that the user has +#. requested to re-run an existing course, and the system is currently +#. in the process of duplicating and configuring the existing course +#. so that it can be re-run. #: cms/templates/index.html msgid "Configuring as re-run" msgstr "다시 시작하기 위한 설정" @@ -17897,6 +17889,18 @@ msgstr "" "5-10분 후, 새 강좌가 귀하의 강좌 목록에 추가될 것입니다. 강좌 목록을 업데이트하기 위해, 페이지로 돌아가거나 " "{link_start} 새로고침{link_end} 하세요. 새 강좌엔 약간의 수동 설정이 필요할 수 있습니다." +#. Translators: This is a status message for the course re-runs feature. +#. When a course admin indicates that a course should be re-run, the system +#. needs to process the request and prepare the new course. The status of +#. the process will follow this text. +#: cms/templates/index.html +msgid "This re-run processing status:" +msgstr "" + +#: cms/templates/index.html +msgid "Configuration Error" +msgstr "" + #: cms/templates/index.html msgid "" "A system error occurred while your course was being processed. Please go to " @@ -19366,7 +19370,7 @@ msgstr "글 주소 \"%s\" 가 이미 존재합니다." #: wiki/forms.py msgid "Yes, I am sure" -msgstr "예. 확인했습니다." +msgstr "네, 삭제합니다." #: wiki/forms.py msgid "Purge" diff --git a/conf/locale/ko_KR/LC_MESSAGES/djangojs.mo b/conf/locale/ko_KR/LC_MESSAGES/djangojs.mo index 3cc978384a6423421894506906e267d5e0a5afc5..a9f66897bada16464c289053c29ce3aecca58a32 100644 GIT binary patch delta 4441 zcmXZfc~qBG9>?+fAmD;10zz(tXy&*e5-u@LB~B%|;4a4*NiChkEJf|)96LWjI+ja0 z;izLB&yjK(8b?emoh64xOVNQ*)1=XKDwkZ)G7}B6d4GQQ`-kUszu$YGyFbqlZ@v?G z<(m%ou;a6CK&wT9MWc(JJV%|O%a&J6nBsU^=eG zdvOnD;3d>^9jl#diCr)!pbquiyaRr~WvGe1hOO}J10i2{pF}efA6Z2$s>9DQ7SCXF zyk_~^W|M=yT?>q(z748<8b)G<)%UafAk>5&vv_KV!W0tETH+A4AwFe(V@CYjPaqLv zs82C_nElNhbEG-RoPk`Em1WOd!5x zacqsRPr-QdeNYq0!C1z3!ztWFViM-zJS@aLcns5P{eY4G@mm{%>YyE}!!Fn!`=cf@ z8e8Br)Kt5E}8LAC$MjQ+&uV^Le4 zg6gLqYC*X;2#2GN`eoG4lz+nhtD~JHw3WM2m$4eP14nQGp0qgesNdQYRDFN*Aq?*f zs=s_xe~(*zA?kxO-|82kj%dkI_CJBb>m;{h!5ja*qNKC2bQ5$QjQ()G-|*` z{3Awu>iem{w#0u!P3#crgL4X#u-@{Kq2s=Tc(Wa5(jXNzp|PkAo-~V411?6L^-^4i zt1a$b=Lg8fQu3owNB61Oh&tNT&;0YD910mE@-QA3qXsBL&2&Bf9N)#6SdZ#p;(wic z02ksg+=aa{@`V3HXPQ&72l-Xl6aS7~@H{@E_dn(&=R{%*>auM^O`ryw;8D~O)uDFc zveo~9*~G!;ekFrYcOniyqKK?5GK2A|;|;`(p{W`D|e zJPj{`-OAA#2y&Z0MAnBgo{xt z*nrylO{mwX!rWp0)9MeP+Sj7C_84m53#bLO`O=?x2UNR9&5@`DjsKGUFQf1T3B4W- zRuTP`Z;)uFVH@f*EY88j#G_ChAGUlQYC-2LZa_U3b;jqD&F-k3x&KVaSBxW}t)Gs4 za1}m;Rn{;#>u+^O)XIjT&UQSu#%ZXD6ronO(CU|3ezo~JYJ%mccH2V~)X|5ij%!h8 zS%>QIDo(~5s0YTKbM7BF4KL!|=lydnzV_`C%?_xQr=j}IG9R$|p{OrnD9;iTQAbdK zy4|x;XSxJ6@LJS_Heo()#%>sO!C%5&sMm1`4#eGN0}dh1V74#gd_0JEaHrn?1DE{P zmt6Lj?JuYg(JoBEgV+QwTKyG_B))}Fcn3AX$a?=P8IPLiKx~c=q85^iu{hbB6_)c~ zNI?TE#g(`m^xI60XGI16T!5LVIy)fyjcL?e&n1jE^bvOXizwyq%VZj|Z~eD=3jT)pMbvLWJwA=8*ZlAKO6*H~4Yk!>zvJ71lQA8)ViBIk`8ejf z|Ag${)X@9*VvD^5+BC1I01V$@D5`Mj=%$`iQjdTKT2>W z>JIF{OuUM!PrK!}ejc_WE=C>Es#~1D3Tv&w28<)#jQ8UQmTxele((b&U>fxWsOO8# zm#{7ItEhoCp^jz;>eKxN#^R5dfH95s{@>l`zknI2ijmkGr=cda3VY&4i)&ErPGJdN z!&F>w+Yhh?_1s&icJHC?ST*V{)tJZ2n)iwcO(%1SjHWjFNB`vG<{a!sz8F>iC-Z%C zFRI5Qn2aY;BVRY8?(kDcoP^q{Ld?Lq*age)a0dES_?UzqJb{|>Wz+-iC;z2rik%5t zquTYwQJ90eePx)3=Wr7CcR~0P{SJo{??Wv#F$lt6wBMpGU0o0g!ZS>Z2*S7QIb1+R z4L*WHngrnvm!WRoSuDWbk%60tD^L?SgPOpAs33ehm*QmNV>k})i}n+F3G4 z4vt3MseEjKvr#+tJnFKRqIU8XjAnfI76rW@e@1=OE3rMkXCA^N;!CI%MI;2_+xs)r zWgLO3FTmco0DIt@sD5fuJ97aw!3NYs?qI7d3e6IO@HaIXwN<&OTe}=bVjbq-y>0zO f3%6JIxjDD#z|_9?WoKq?-@kEN%J$N#>*M|pHc<*E delta 4458 zcmXZedvwqD9mny{SK^whTv%PwXoxftBy(#hs%ld)t-HqkSVd`T!%T~>;n*3XM=Plr zjil^Y#0@|9X7h@6Y%9xqm;u-=(*rZ@m@$ zmx{D-l5=k6Zs-1ppJ6+kzsI>^d=1~hn7z&w;Rm<`@BhHLZTLE-e3Y=~p_xzN2%VbVV59>e=!s!fO>DiLEqsT)Iir`JZ?J}`oeA!jYxcA6*Z^^zri@XgpKj8 z*LH6Or*Xg>iHau#saJFWBCE70S&i!dPrd+iFuYdj!lWrnctbQ|MUY$!x-wb z%r0hMv(OxEPBCYqCNLj0v1OQmVF?Aze1rL>S!wPt_m~G!4OE-QQ8Pbnev8S(QHOlK zxtWDYExu^lJGD|JL9=p)LtD>Mob`Eto+^61DRD;WBIXci{oLh~h5dz(=0 z?XdU|YT#$g%a}y}?luK=5PQVAde{Q>U~AOK+oL|qj;QB`qrQ&GRv%&_@iL6XSIx~h zg?O9A%|7!hm4RxfH-`G03Mr_g7g2k+7~5bOYH4?1TdYQPbPM%-<7#grD&HKn#v6PkkC@@M;*p$)C!!$?s(SXw4;7$vrzSY&BrmaGN|?@ zquQHh^|MhI&O)nShT5W%qpW{2g*QlO20P7zIE45F7GnoaqFz{onn?w=#Pg^Q>;KES zH!&8~P8Fu&hp2%aM_oAQuo>R8e0+G!H_*z=z>bF&1^$-a`%G7)Ie2s4c2Rt;7wh zkNywWD{%~JCIe7sVi@YVahQVBu{kb6wX+sAfeMV%_kWmzIy`9)e1*M;Z$=*AlK8?m z+z(rlFGTHaF{-15_#0e_YA61b&!?gWmVp{rXVjJ!SUdb<#wK9)>9r}v#B((I;V<%jP zees|@7<0y->P*zkMxgd~0w&-L)IjE=X12uYS6hCg`37nr6{zR_9#T+4AEO$sLG5KN zs=?bh4&7P*!gzd-a0dPtANlbC~*P)4i_T-X~xpuJ;YJlj(@*U-(;(XNJ^}^{m7@x+Sn1kt;y@OF-!3$W5uVHuWam70m2N7?< zw)F3=Q+NXJyXx=iXK*UYirzxBW8uVNnYUDQ%{yv9FeoQfUsUHm1U$Jsdc zy1&AYU^n8pI{!DmKZe6d?58jgTix&tJ&j$7cj9As8AoE*o6h|NSK?qiiW>L>x14(% zXQ9r(F3iWZmn7fW@eW zR+ukiD)H}89aW;XW*6$}zJPJq@Qyzdsdw!Ae~^T3zyhlnjk&}#Py;UAH!tg zbGR7qVmgL*eFvLR?`=gr_de>3Rin<*G4r%uP~rmq9P3acEc)IzFwJ}cGs&+&)o(X< zn}<>DoW$mM7Bzr-X2Lzb0OEAiip|E(7`{j$gF*%B$Kg}di)Tkc@M+K1v*PssJWgL&)qXRbz%TNQjgc`sj^@GSEU5#|)PT_ETxPc$Y%Q#xU|EDPQ zqM}E`AaZKwpk}-UE3p!_TOX|NkhgC7~C#qCS(qVtw3+E%1HwI5s1$L(M2QIfxwI zAEOTAC{%qh=3lY34()02Q^14>-FW;Wl_~M$S7s}UPEL~bPZ+G4B{{ww@66yc| diff --git a/conf/locale/ko_KR/LC_MESSAGES/djangojs.po b/conf/locale/ko_KR/LC_MESSAGES/djangojs.po index 4afc66f36e..0edf6a32cd 100644 --- a/conf/locale/ko_KR/LC_MESSAGES/djangojs.po +++ b/conf/locale/ko_KR/LC_MESSAGES/djangojs.po @@ -53,7 +53,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2015-09-11 12:15+0000\n" +"POT-Creation-Date: 2015-09-18 13:22+0000\n" "PO-Revision-Date: 2015-09-11 12:17+0000\n" "Last-Translator: Sarina Canelake \n" "Language-Team: Korean (Korea) (http://www.transifex.com/open-edx/edx-platform/language/ko_KR/)\n" @@ -2602,7 +2602,7 @@ msgstr "" #: lms/static/coffee/src/instructor_dashboard/data_download.js msgid "Error generating student profile information. Please try again." -msgstr "학습자 프로필 정보를 만드는 중 오류가 발생했습니다. 다시 시도하세요." +msgstr "학습자 정보를 만드는 중 오류가 발생했습니다. 다시 시도하세요." #: lms/static/coffee/src/instructor_dashboard/data_download.js #: lms/templates/search/search_loading.underscore diff --git a/conf/locale/pt_BR/LC_MESSAGES/django.mo b/conf/locale/pt_BR/LC_MESSAGES/django.mo index 314a89585f9234ab2f36e46662420e014763bc66..17e94f637df7be7ee1c5712aab64ae8495758a60 100644 GIT binary patch delta 29 lcmbO`g?H{0-i9rVNmtk{6by~6jEvheuP|=Uyu!4l6ab_K3oZZv delta 29 lcmbO`g?H{0-i9rVNmtkn6%38649(gzuP|=Uyu!4l6ab@^3n%~p diff --git a/conf/locale/pt_BR/LC_MESSAGES/django.po b/conf/locale/pt_BR/LC_MESSAGES/django.po index 060b5b768b..5aba385803 100644 --- a/conf/locale/pt_BR/LC_MESSAGES/django.po +++ b/conf/locale/pt_BR/LC_MESSAGES/django.po @@ -225,7 +225,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2015-09-11 12:16+0000\n" +"POT-Creation-Date: 2015-09-18 13:23+0000\n" "PO-Revision-Date: 2015-07-20 00:15+0000\n" "Last-Translator: javiercencig \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/open-edx/edx-platform/language/pt_BR/)\n" @@ -3613,9 +3613,7 @@ msgid "Request user's username" msgstr "" #: common/lib/xmodule/xmodule/lti_module.py -msgid "" -"Select True to request the user's username. You must also set Open in New " -"Page to True to get the user's information." +msgid "Select True to request the user's username." msgstr "" #: common/lib/xmodule/xmodule/lti_module.py @@ -3623,9 +3621,7 @@ msgid "Request user's email" msgstr "" #: common/lib/xmodule/xmodule/lti_module.py -msgid "" -"Select True to request the user's email address. You must also set Open in " -"New Page to True to get the user's information." +msgid "Select True to request the user's email address." msgstr "" #: common/lib/xmodule/xmodule/lti_module.py @@ -7946,10 +7942,6 @@ msgstr "" msgid "The supplied topic id {topic_id} is not valid" msgstr "" -#: lms/djangoapps/teams/views.py -msgid "Error connecting to elasticsearch" -msgstr "" - #. Translators: 'ordering' is a string describing a way #. of ordering a list. For example, {ordering} may be #. 'name', indicating that the user wants to sort the @@ -11960,8 +11952,6 @@ msgid "Email someone to say you've registered for this course" msgstr "" "Envie um e-mail para alguém dizendo que você se inscreveu neste curso." -#. Translators: This text will be automatically posted to the student's -#. Twitter account. {url} should appear at the end of the text. #: lms/templates/courseware/course_about.html msgid "I just registered for {number} {title} through {account}: {url}" msgstr "" @@ -12446,6 +12436,8 @@ msgstr "" msgid "Download Your Certificate" msgstr "" +#. Translators: This message appears to users when the system is processessing +#. course certificates, which can take a few hours. #: lms/templates/courseware/progress.html msgid "We're working on it..." msgstr "" @@ -16887,9 +16879,8 @@ msgstr "" msgid "Required Information to Create a re-run of a course" msgstr "" -#. Translators: This is an example name for a new course, seen when filling -#. out -#. the form to create a new course. +#. Translators: This is an example name for a new course, seen when +#. filling out the form to create a new course. #: cms/templates/course-create-rerun.html cms/templates/index.html msgid "e.g. Introduction to Computer Science" msgstr "" @@ -18074,8 +18065,8 @@ msgid "Library Name" msgstr "" #. Translators: This is an example name for a new content library, seen when -#. filling out the form to create a new library. (A library is a collection of -#. content or problems.) +#. filling out the form to create a new library. +#. (A library is a collection of content or problems.) #: cms/templates/index.html msgid "e.g. Computer Science Problems" msgstr "" @@ -18098,8 +18089,9 @@ msgstr "" #. Translators: This is an example for the "code" used to identify a library, #. seen when filling out the form to create a new library. This example is -#. short for "Computer Science Problems". The example number may contain -#. letters but must not contain spaces. +#. short +#. for "Computer Science Problems". The example number may contain letters +#. but must not contain spaces. #: cms/templates/index.html msgid "e.g. CSPROB" msgstr "" @@ -18126,10 +18118,11 @@ msgstr "" msgid "This course run is currently being created." msgstr "" -#. Translators: This is a status message, used to inform the user of what the -#. system is doing. This status means that the user has requested to re-run an -#. existing course, and the system is currently in the process of duplicating -#. and configuring the existing course so that it can be re-run. +#. Translators: This is a status message, used to inform the user of +#. what the system is doing. This status means that the user has +#. requested to re-run an existing course, and the system is currently +#. in the process of duplicating and configuring the existing course +#. so that it can be re-run. #: cms/templates/index.html msgid "Configuring as re-run" msgstr "" @@ -18141,6 +18134,18 @@ msgid "" " new course will need some manual configuration." msgstr "" +#. Translators: This is a status message for the course re-runs feature. +#. When a course admin indicates that a course should be re-run, the system +#. needs to process the request and prepare the new course. The status of +#. the process will follow this text. +#: cms/templates/index.html +msgid "This re-run processing status:" +msgstr "" + +#: cms/templates/index.html +msgid "Configuration Error" +msgstr "" + #: cms/templates/index.html msgid "" "A system error occurred while your course was being processed. Please go to " diff --git a/conf/locale/pt_BR/LC_MESSAGES/djangojs.mo b/conf/locale/pt_BR/LC_MESSAGES/djangojs.mo index 34fca378ade2fb63e875a4c772575b521ac3aec1..f85990f913dd7246c398d78351488bf186b5feec 100644 GIT binary patch delta 4853 zcmXZfd34TK9>?)ZL>7{e2*N}jB({hqk=Xa9mWVaFS;~XRNr{w@V}yC^yHXXJF(|df zRwPUsky2afw5NwIV>+kO;!MX-%XBO=ZFSxs_xk5`@BQ81UB35we~-LfUc8`BJDU<+K2u~>$ocoiGq z4_FU>aqS^Dhz}MIs|A|^zy+0U}j7_jB4ngg7IS#`rti}*FpoRR1 z{usBwn5GzywQ&G8!=V_7xu^{;M)mV;qM(kYr~xWaD?Wt^-N&f*t5_GWp>}W^qwx`H zXAKtG_o7h~#<_YLD)brH2(z5?kt6b%A_`i-ZVbVLs0mM?7H}H1^2?|Jen3t58|uBl zMK+XS_zv}!Sb-;TCl)LwY8bV|_TPbuKnVsgzp134P@F|gSdE(SKKfzprFLh*s0qW7 zm76G3jTi-l!w>q86NwdT%uXjIS-=ja) zU>jOs0P0#bMorw>wI`t#)(>mrNYsR{qHfC+)O&>(fUD4_jvFW_^u?$b_M#Sa%(eTk zuse-FoqY^OVLMd6G;D%JsELlC#yyXU(5I+{UUlu)aWwT?E8P80TWJ?C6xDGoYUfk1 zB`(8SxF2;J4r4st!rd6T%9tKliHZ0G72>w5ZNKG6lPSXwu-6)62IJ#3#J`ln^K0!r zeuT=_gg1>jiv5x3n$XBI?^gLCLiT^}<0^k{ri0Jcn9H5Zl%*@t`8q1GVE9Q3Fmz4z z9C_bo&QYkti{GFI`Ughf1Jr>2Mb>a^mjmHK!1?yoUDw1nlefzWL zoc|FD%I5R#K{e{$-bcL$DUb;x1J7R-z_8jau*pY=W0ipW>US zP}kmKHyDa~&x36-ZVT~O!!R23Yc>iMnwhTSJX8)WboGs>9TcOItppW`W2i_}p(gwS z2jSmwG{*hOK3{;!nN6sTZ}m~gq;LRrM!%tU7_rr^xE(g4-UBu9DAZ0TIj5kGF2`Aj zir`vQWZrRZL*0U1$ePS?)W&=xw%GwDqe5MPTH!iuiknaamf{$!!YLTF-TsGV0rsU{ z;`|rJQE&gQG0)*hY=euiCmz7p@D{RgpBcErPB@?SAAcQX8tVO_*bHArMXUgy{r<0@pb6Kb2HN}V0Y4O|>vkG7&}XPf z{1w&jI%nu4sD6RFtzoDfYlwwp#518d`>65_89&9AOw z_&)ofiL*Is#cfd6usdqNObo&?uAYT&P|wBZ@fyB}E%w__`yA&%)P}#qMcB}HfP|n> zj2~glLB4AEJt`Nr9@ z?2Z?4BGzJ(LAw9h6tZbJis~3uWgGXY;h^)JVCG{@~&0hi#~ThR^Q*BMJ)LQ&gye%k7si47*TogJI}JeSl_Q5FW)qti<|w z4i%xVQQ3aOS>ppcehh}t9*^qR6+7wv_otwuE$tRF_9CX7b)Z-rV& zXB>xpQAe{KHO?_?h!-&ut5M@UL~YodaQDA11$}@bP&?^>8lVr3!cnLf_o0&R80ttW zQAc#w*`3VQk*vUBco|>7<|mCAf!R13D{vz=sN(!bQrK6;WcUkq#-1N?BXBl`W7sL1 zj4eHC7kn4fQMc$ePQV$b?LEJOO1d>%t+99!V=?ZG{V_^Ej{_4Bo?73_EX=ECugUpN?a2+y(m|j0$W?{RXzffRDMFn2d_h zQXd69_zHWWxoFR{H!9SFFcF7i6fVR@xCM2#W!M-$!9cv>yo3JKA7TLhj5f6eSW3P|! zb@3#1?3SDypUA)9;lmO}W)gGvKOiE2i?3$3&(UX|eEh*LZ%kbvU zN*FcMJ3W7zcUIoaZk{3DnK|C+UQhbjGSB2JPiEfixn56?T-(~=^?cR)WaoNwrgfN< Xm)k2i!#h2Dwl_N~q3m`+N#_3ni>MW& delta 4813 zcmXZfd329g9>?)(vPqC;kwg|mC8Y>SD$Q79iPqM!L~(2*D$U7h1W6iV>0_y-MlqHW zTM;xRQahoHp{RCFX>q2LsamFEnQ5tZv^A#8`;&Y9^Sbvwcm3Y)^Za7VDxVdre0Glt z^X}C##;3%XFk{S*Q;Z2h|Eb1w$53pKS(u0m@p-Ir{u6sqk1I8%368_3aW*F4Rt&~- z*bu+O5d6-yKQ1+%38bOHG}|ExyHRh0J#Yf*`EIO>M=%mkp(d=sG`xrEmpI)n+zy|j zJ_NPkcx;5PV{=@B>c4lo$0;d%NJBV&hKj@utcMR!&+E*vhT~-FiI|S7Q4u-s^q*%~>+SO>Xo0iX0{@2ES)DhGNyU2D0lT73Iu!?C6<)>1sEvHh zLHsasmNBsyhyM6mY=RjWfn!hyEJpS77En;fa?}JnP&?j@3f*B;`#G$S=TRs43LE1s z)XDs2+i}6D1tVQO4Hfz>7==Tf1;`b7WVH>jNP{iEG*4C*cDii*r=48Www$av2jpiqy2pQ0xED~96@)Pz4deOB3eh_kV?l`|bRPbMn)24X`Th9Q`bisVdJ zUsn5^``=7K*?iDFxPW?ZucHP$#EV$}9UJ0nsEyr5E%X2t+W(>EslVDr<{4DK&Zvm? zK}C2t>Z-Cav_FMB3eVwmjKB|2J3p-sSc972ThxS)-1EA8?i8uUsOKpwLSw=`%`nD2 zDMr;7qOxiuY6}&pnfIV#ehPnspJ99a95thVnLT0zYFr#@zC={gbV41yyL&#Uj0@F- zBWRd_IjD&)qO#`(DjgqVGS**fH_!!j(q zRFa)`?Uzvp`x=$3_gp=JU;9ATH)#|!K?XL#-l&ChQFm2}T5vXMqBXAleboE42bB}Y zQIYr<)$bx|gWtI4KccScS5$69lrx_7O*0BFVq4VCOHj!%A9V#6Fb4mD(fAlOaigt7 z4O^f#x(=0O<)|yFM&0oVRR1&X`DIjY{Tpk4&>vFJ0R1>B$pTOjiAA+1pibBt6^S%w zf7FIwaTej*)aRl$61v?UparU5M^t3{y85W?#9uqfr=c-UL!EeytM9}#>gO;MpP-U1 z^F4m_aV%=1Rp^I@Q1cx_E%YhsO0J+bbQ`si$Eb0^6~sS)LR5tv*c7X&C!s&yLValN zqWbx~Z`?beqMO6O^?2Gqt0CqlL z-?qirLGS-13fVjeK4_C_61Jp%9CgB5sLF@tb8j=&wb68(-5R$PnS@HMi;T$KtpX_BB6s!m~*?lXq(r52`T%BTw2NqfW>eQ;P3l zhf{pT@H*%c6bz;({Kq};V-BY zH$Q7bRDxQ0kCwxRBb$<(`JG!|kME=FDLR&0bvu`XV6UO_+V-c1St6uw2> z;eW6tK0!^`@|;bk9?mROu8c=*d>S^xjTne0P*?H^Du=FM54?kIvCSv;gEta=^tZ~= zePszZ2IZv0r=)gFNo$?Vzo3Bwk_P9LE4whSAUnQic0o>l_G>xuor`K4y5)?Y+IC`L?!J2^`?CHI D;o%G8 diff --git a/conf/locale/pt_BR/LC_MESSAGES/djangojs.po b/conf/locale/pt_BR/LC_MESSAGES/djangojs.po index 5ddb5ab327..d765649dca 100644 --- a/conf/locale/pt_BR/LC_MESSAGES/djangojs.po +++ b/conf/locale/pt_BR/LC_MESSAGES/djangojs.po @@ -102,6 +102,7 @@ # # Translators: # Alan Mól , 2015 +# Ana Paula D'Almeida Oliveira , 2015 # Andrea Z. Bitencourt , 2015 # Bruno Sette , 2015 # Cleomir Waiczyk , 2015 @@ -141,6 +142,7 @@ # Luiz Cardineli , 2015 # Magaly Munik da Rocha , 2014 # Marco Túlio Pires , 2014 +# Mariana Jó de Souza , 2015 # mmauryx , 2014 # Maurício Gonçalves Melara Camargo , 2015 # Mike Job Silva , 2015 @@ -152,9 +154,9 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2015-09-11 12:15+0000\n" -"PO-Revision-Date: 2015-09-11 12:17+0000\n" -"Last-Translator: Sarina Canelake \n" +"POT-Creation-Date: 2015-09-18 13:22+0000\n" +"PO-Revision-Date: 2015-09-13 01:15+0000\n" +"Last-Translator: Mariana Jó de Souza \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/open-edx/edx-platform/language/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" diff --git a/conf/locale/rtl/LC_MESSAGES/django.mo b/conf/locale/rtl/LC_MESSAGES/django.mo index d30df0c9bac0096ebbd2376bca4545e868048b3e..ff2efa53bc9545f586b9c95fb8c70eb2773c6668 100644 GIT binary patch delta 77825 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 KZ{4JC75@M?gl5A4 delta 78060 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

        uG?S+ugOMY; z8E0s58sz5~OKDAxnSj$Mf7VXK7 zi@*ObEYaq3;>Tdjl*4p>t#<>tA^z+{rxa-^b)VG4)(`T$v@AEAQCvB3DI0n@67UhO zDAPanL=^nBQVO(c;M8dpR#}6i7=^{y$!9H$;zOSOsUnu#F}k}J;pwsJ;$xa#M5g}b|I(6P6c!%{FlVA@)b2x zmwkd0b;wwt$0Qx>Mnx@9^2dP&6zofUB^-jB1_RZpU(G?vb93YdD5m(6m9Y z82O7a{2ZOFRD1`$sxSz-HpUlYT)uu6iM_t0%|Q1boRP2}Tffn;wAhhw)XREN%=Gar zM`t)?|F5+(4T&m>;y7*r4n<49zGwfabK1k}pS3vlMbq{+J#j}ZJ zaIhx!Ei~51N+H>&n;D0#B$arsx-)GbC)~+e2p~l9bBdg)D47Itr-X@*!Cyi{t>7N$ z*b4mXDEqUogeXIyRF7J09N0I6^@`WOHcZ0>H5l+(36q zA_V)v+@EpU2xi>9~KxnLv6P2j8lDSLxG%HUl;AFQUXtX#{w5ISThy zQYuJQ(ty2I>O%`Sv<8yy=l8btAr1KNvzKy$xn{0Ul#A51E-d>U;;r;vA+Qmfc2DI=Z* z?OL?O8cvx+8JuqnUVKt@0PMb|8UcMX`>RmBVqeEnva$V>j-g4?*a15B2K&5IKi_CO z;5@!>H0(&uv%+CBFH#T=iHIf4?Lj+IkY}60qP#6mncwrXVX?@uqM|TrM?`SDZ3)|q zh~+!XuqX(NEOVF04u(vXy1FRZu0zBlTTBtP&7$!(sC=uaFc>MY!g7DBC-wi)IoDb} zp-axxGu=+S_4ajvJy097{L`lR(|zgwH0Niu`@UDs`ISA6H>J5XZnb-z zpDMQ|emEX;ug6P7{IFXs+^Tq~Tj$ocdu!ZU5Owil@RhOTF z-CGJOz?6a|odj&j{naCfbuhwI46I69C2p1MZ+jEvAiL)<8L+)svgKiqLH+-cAy#gC ZopL*2;ZS+k^!AG-9ZPVMj`jMu_b\n" "MIME-Version: 1.0\n" @@ -3587,24 +3587,16 @@ msgid "Request user's username" msgstr "قثضعثسف عسثق'س عسثقرشوث" #: common/lib/xmodule/xmodule/lti_module.py -msgid "" -"Select True to request the user's username. You must also set Open in New " -"Page to True to get the user's information." -msgstr "" -"سثمثذف فقعث فخ قثضعثسف فاث عسثق'س عسثقرشوث. غخع وعسف شمسخ سثف خحثر هر رثص " -"حشلث فخ فقعث فخ لثف فاث عسثق'س هربخقوشفهخر." +msgid "Select True to request the user's username." +msgstr "سثمثذف فقعث فخ قثضعثسف فاث عسثق'س عسثقرشوث." #: common/lib/xmodule/xmodule/lti_module.py msgid "Request user's email" msgstr "قثضعثسف عسثق'س ثوشهم" #: common/lib/xmodule/xmodule/lti_module.py -msgid "" -"Select True to request the user's email address. You must also set Open in " -"New Page to True to get the user's information." -msgstr "" -"سثمثذف فقعث فخ قثضعثسف فاث عسثق'س ثوشهم شييقثسس. غخع وعسف شمسخ سثف خحثر هر " -"رثص حشلث فخ فقعث فخ لثف فاث عسثق'س هربخقوشفهخر." +msgid "Select True to request the user's email address." +msgstr "سثمثذف فقعث فخ قثضعثسف فاث عسثق'س ثوشهم شييقثسس." #: common/lib/xmodule/xmodule/lti_module.py msgid "LTI Application Information" @@ -8274,10 +8266,6 @@ msgstr "فثطف_سثشقذا شري خقيثق_زغ ذشررخف زث حقخد msgid "The supplied topic id {topic_id} is not valid" msgstr "فاث سعححمهثي فخحهذ هي {topic_id} هس رخف دشمهي" -#: lms/djangoapps/teams/views.py -msgid "Error connecting to elasticsearch" -msgstr "ثققخق ذخررثذفهرل فخ ثمشسفهذسثشقذا" - #. Translators: 'ordering' is a string describing a way #. of ordering a list. For example, {ordering} may be #. 'name', indicating that the user wants to sort the @@ -12392,8 +12380,6 @@ msgstr "فصثثف فاشف غخع'دث قثلهسفثقثي بخق فاهس ذ msgid "Email someone to say you've registered for this course" msgstr "ثوشهم سخوثخرث فخ سشغ غخع'دث قثلهسفثقثي بخق فاهس ذخعقسث" -#. Translators: This text will be automatically posted to the student's -#. Twitter account. {url} should appear at the end of the text. #: lms/templates/courseware/course_about.html msgid "I just registered for {number} {title} through {account}: {url}" msgstr "ه تعسف قثلهسفثقثي بخق {number} {title} فاقخعلا {account}: {url}" @@ -12905,6 +12891,8 @@ msgstr "حيب صهمم خحثر هر ش رثص زقخصسثق صهريخص خق msgid "Download Your Certificate" msgstr "يخصرمخشي غخعق ذثقفهبهذشفث" +#. Translators: This message appears to users when the system is processessing +#. course certificates, which can take a few hours. #: lms/templates/courseware/progress.html msgid "We're working on it..." msgstr "صث'قث صخقنهرل خر هف..." @@ -17621,9 +17609,8 @@ msgstr "" msgid "Required Information to Create a re-run of a course" msgstr "قثضعهقثي هربخقوشفهخر فخ ذقثشفث ش قث-قعر خب ش ذخعقسث" -#. Translators: This is an example name for a new course, seen when filling -#. out -#. the form to create a new course. +#. Translators: This is an example name for a new course, seen when +#. filling out the form to create a new course. #: cms/templates/course-create-rerun.html cms/templates/index.html msgid "e.g. Introduction to Computer Science" msgstr "ث.ل. هرفقخيعذفهخر فخ ذخوحعفثق سذهثرذث" @@ -19011,8 +18998,8 @@ msgid "Library Name" msgstr "مهزقشقغ رشوث" #. Translators: This is an example name for a new content library, seen when -#. filling out the form to create a new library. (A library is a collection of -#. content or problems.) +#. filling out the form to create a new library. +#. (A library is a collection of content or problems.) #: cms/templates/index.html msgid "e.g. Computer Science Problems" msgstr "ث.ل. ذخوحعفثق سذهثرذث حقخزمثوس" @@ -19035,8 +19022,9 @@ msgstr "مهزقشقغ ذخيث" #. Translators: This is an example for the "code" used to identify a library, #. seen when filling out the form to create a new library. This example is -#. short for "Computer Science Problems". The example number may contain -#. letters but must not contain spaces. +#. short +#. for "Computer Science Problems". The example number may contain letters +#. but must not contain spaces. #: cms/templates/index.html msgid "e.g. CSPROB" msgstr "ث.ل. ذسحقخز" @@ -19065,10 +19053,11 @@ msgstr "ذخعقسث قعر:" msgid "This course run is currently being created." msgstr "فاهس ذخعقسث قعر هس ذعققثرفمغ زثهرل ذقثشفثي." -#. Translators: This is a status message, used to inform the user of what the -#. system is doing. This status means that the user has requested to re-run an -#. existing course, and the system is currently in the process of duplicating -#. and configuring the existing course so that it can be re-run. +#. Translators: This is a status message, used to inform the user of +#. what the system is doing. This status means that the user has +#. requested to re-run an existing course, and the system is currently +#. in the process of duplicating and configuring the existing course +#. so that it can be re-run. #: cms/templates/index.html msgid "Configuring as re-run" msgstr "ذخربهلعقهرل شس قث-قعر" @@ -19083,6 +19072,18 @@ msgstr "" "فاهس حشلث خق {link_start}قثبقثسا هف{link_end} فخ عحيشفث فاث ذخعقسث مهسف. فاث" " رثص ذخعقسث صهمم رثثي سخوث وشرعشم ذخربهلعقشفهخر." +#. Translators: This is a status message for the course re-runs feature. +#. When a course admin indicates that a course should be re-run, the system +#. needs to process the request and prepare the new course. The status of +#. the process will follow this text. +#: cms/templates/index.html +msgid "This re-run processing status:" +msgstr "فاهس قث-قعر حقخذثسسهرل سفشفعس:" + +#: cms/templates/index.html +msgid "Configuration Error" +msgstr "ذخربهلعقشفهخر ثققخق" + #: cms/templates/index.html msgid "" "A system error occurred while your course was being processed. Please go to " diff --git a/conf/locale/rtl/LC_MESSAGES/djangojs.mo b/conf/locale/rtl/LC_MESSAGES/djangojs.mo index bff6e2b7641b2f889ddf662c9500fecb5d832af7..7681a8f6bc6aa20f57a35bfb79378a9b185ef983 100644 GIT binary patch delta 52 zcmX?qll%Nl?uIRlM#=0J3Wmm3#un2plNl8SAskC9BV#=aQ&R&Ai}vhf#_ie3OeviJ Dul)}? delta 52 zcmX?qll%Nl?uIRlM#=1k3Wi2jCT7zulNl8SAsllnBV#>NGa~~-v-a#{#_ie3OeviJ DtpN`j diff --git a/conf/locale/rtl/LC_MESSAGES/djangojs.po b/conf/locale/rtl/LC_MESSAGES/djangojs.po index e725b27a06..83a9439414 100644 --- a/conf/locale/rtl/LC_MESSAGES/djangojs.po +++ b/conf/locale/rtl/LC_MESSAGES/djangojs.po @@ -26,8 +26,8 @@ msgid "" msgstr "" "Project-Id-Version: 0.1a\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2015-09-11 12:46+0000\n" -"PO-Revision-Date: 2015-09-11 12:47:23.562016\n" +"POT-Creation-Date: 2015-09-18 13:38+0000\n" +"PO-Revision-Date: 2015-09-18 13:39:23.855088\n" "Last-Translator: \n" "Language-Team: openedx-translation \n" "MIME-Version: 1.0\n" diff --git a/conf/locale/ru/LC_MESSAGES/django.mo b/conf/locale/ru/LC_MESSAGES/django.mo index 8a9614814481acc42615e51d72bc6c1d8b75aaec..a85a1082b61b1ca0622a3dcfb1f76a18ae055a83 100644 GIT binary patch delta 9580 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 delta 9541 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\n" "Language-Team: Russian (http://www.transifex.com/open-edx/edx-platform/language/ru/)\n" @@ -3433,9 +3433,7 @@ msgid "Request user's username" msgstr "" #: common/lib/xmodule/xmodule/lti_module.py -msgid "" -"Select True to request the user's username. You must also set Open in New " -"Page to True to get the user's information." +msgid "Select True to request the user's username." msgstr "" #: common/lib/xmodule/xmodule/lti_module.py @@ -3443,9 +3441,7 @@ msgid "Request user's email" msgstr "" #: common/lib/xmodule/xmodule/lti_module.py -msgid "" -"Select True to request the user's email address. You must also set Open in " -"New Page to True to get the user's information." +msgid "Select True to request the user's email address." msgstr "" #: common/lib/xmodule/xmodule/lti_module.py @@ -7562,10 +7558,6 @@ msgstr "" msgid "The supplied topic id {topic_id} is not valid" msgstr "" -#: lms/djangoapps/teams/views.py -msgid "Error connecting to elasticsearch" -msgstr "" - #. Translators: 'ordering' is a string describing a way #. of ordering a list. For example, {ordering} may be #. 'name', indicating that the user wants to sort the @@ -11305,7 +11297,7 @@ msgstr "" #: lms/templates/combinedopenended/openended/open_ended_rubric.html msgid "Rubric" -msgstr "" +msgstr "Оценивание" #: lms/templates/combinedopenended/openended/open_ended_rubric.html msgid "" @@ -11424,8 +11416,6 @@ msgstr "" msgid "Email someone to say you've registered for this course" msgstr "" -#. Translators: This text will be automatically posted to the student's -#. Twitter account. {url} should appear at the end of the text. #: lms/templates/courseware/course_about.html msgid "I just registered for {number} {title} through {account}: {url}" msgstr "" @@ -11886,6 +11876,8 @@ msgstr "" msgid "Download Your Certificate" msgstr "" +#. Translators: This message appears to users when the system is processessing +#. course certificates, which can take a few hours. #: lms/templates/courseware/progress.html msgid "We're working on it..." msgstr "" @@ -16111,9 +16103,8 @@ msgstr "" msgid "Required Information to Create a re-run of a course" msgstr "" -#. Translators: This is an example name for a new course, seen when filling -#. out -#. the form to create a new course. +#. Translators: This is an example name for a new course, seen when +#. filling out the form to create a new course. #: cms/templates/course-create-rerun.html cms/templates/index.html msgid "e.g. Introduction to Computer Science" msgstr "" @@ -17283,8 +17274,8 @@ msgid "Library Name" msgstr "" #. Translators: This is an example name for a new content library, seen when -#. filling out the form to create a new library. (A library is a collection of -#. content or problems.) +#. filling out the form to create a new library. +#. (A library is a collection of content or problems.) #: cms/templates/index.html msgid "e.g. Computer Science Problems" msgstr "" @@ -17307,8 +17298,9 @@ msgstr "" #. Translators: This is an example for the "code" used to identify a library, #. seen when filling out the form to create a new library. This example is -#. short for "Computer Science Problems". The example number may contain -#. letters but must not contain spaces. +#. short +#. for "Computer Science Problems". The example number may contain letters +#. but must not contain spaces. #: cms/templates/index.html msgid "e.g. CSPROB" msgstr "" @@ -17335,10 +17327,11 @@ msgstr "" msgid "This course run is currently being created." msgstr "" -#. Translators: This is a status message, used to inform the user of what the -#. system is doing. This status means that the user has requested to re-run an -#. existing course, and the system is currently in the process of duplicating -#. and configuring the existing course so that it can be re-run. +#. Translators: This is a status message, used to inform the user of +#. what the system is doing. This status means that the user has +#. requested to re-run an existing course, and the system is currently +#. in the process of duplicating and configuring the existing course +#. so that it can be re-run. #: cms/templates/index.html msgid "Configuring as re-run" msgstr "" @@ -17350,6 +17343,18 @@ msgid "" " new course will need some manual configuration." msgstr "" +#. Translators: This is a status message for the course re-runs feature. +#. When a course admin indicates that a course should be re-run, the system +#. needs to process the request and prepare the new course. The status of +#. the process will follow this text. +#: cms/templates/index.html +msgid "This re-run processing status:" +msgstr "" + +#: cms/templates/index.html +msgid "Configuration Error" +msgstr "" + #: cms/templates/index.html msgid "" "A system error occurred while your course was being processed. Please go to " diff --git a/conf/locale/ru/LC_MESSAGES/djangojs.mo b/conf/locale/ru/LC_MESSAGES/djangojs.mo index cf9fa3b90a5ade799b7c5fb1e8281eb04af1a5dc..13ebda6e63fa62d63c84ae271f34ebbb08ea9333 100644 GIT binary patch delta 1665 zcmXZcdq`AU6vy#36)L7?nW()St!zv)wb7ihDV?&U%%bieN{~z?X^olM+v5CFT;kfL z=t4v<2zx*g(Ho+upvSGC=tcEsR7CYh5D^4L-(Tkl`q^vGoW1v2Yad^4_r2ZjJ6oLK zbPq6V%{41CvzK{hJ1{xlY$xuBEO{fR@FbNM}1p847zd=>%J8FSK(yzx#ROSw9 zqun?fPa?&&JKp?z)cU`?&r_X=?#YW#57eSc)`D8_G%mqwNEa-p$URU5wQw&E!vm-T zoxxPRinH;53}Sk*n@}Al6F1@*beb6`^G&D{p2iHkg=)zQRPVl`DlmkLAjf%zFon1g zb)Y4v3iKk^$@XFnUPP7t5mNm>7liLS7T~7n!FuGd)`rUbKjdE7F;r#lqrUgSi<2h1 z2P?oR^HHqA9axFiQ3v~mN^AhTYrSk7gb^Ic{uX7R5-!Cp*o8XrXH>5f__G+RP!IN@ zHrRv8@E&S|kC=c~?#79z%8f=)PX*sHcqASdYcL{6{C0*7ouA96&)_J4X$uY97JWl2(?k%o8Rok z`*0ZZ{Wu&iqi+90%*0H}qDxwYI=}){>sF%@+lkuv3epvOTuJ?vsZDi1C_u&2u^3li z8}7jc_yf~$E{)b*Xhv-A+LX~tYZo|W<3XO{J-wi8KnRcN{y9)2$aBLF8K4d{jjp&pw<-yk8Sp z4BlZQ{=`+-FvILFUPk`unN#Cd?B_5o?c^Ebr_%AN6PF F{|3~S#qIzA delta 1655 zcmXZceQ1qg7{~GJ7$de}^D@lNIo{2&?U>owW^>qxtSzxWQ1oCOuUk8_l9!&$5G669 zc`3^u@)k`|7{87;*G4kpMQ&5|EK?Ziks(U9!9-Tf@)bkYQZjCj@`&9*uW`XLPe;Bn=um)p%OZa>39|A z;T@cgsS&TBa_moBjk)O7F;L}=s1|l%7T!P|$#c}%eL;1g4;Mj>^ew46%J(Dp%1)pw?O4G6_L+fNGK_PeD62$12-}3(u*3H_s-jak2+yO= z@+RsldWcHs18U9!2qK?i%73QKgzKooPJ)A-RRcVj^Lr#fT`E-mhzYN#nUaZ6K zn1OK)T6duiwP6#g6CJ2TPW$uMa4zvHtj63@v+cMV@8bJX`hSeUnKHT%Fe@$hDlDJr zEnJIgX%ctf5mbjVE6jMsBB)9esMhYn6r51$wLTBI23CdYXsd4h?x4jIr+0w6j@#qoL@uvS@L~r(n3k8<$Ke$A6UrX*58_b5KmY&$ diff --git a/conf/locale/ru/LC_MESSAGES/djangojs.po b/conf/locale/ru/LC_MESSAGES/djangojs.po index afbc2f6cef..8df7d3ab5a 100644 --- a/conf/locale/ru/LC_MESSAGES/djangojs.po +++ b/conf/locale/ru/LC_MESSAGES/djangojs.po @@ -101,9 +101,9 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2015-09-11 12:15+0000\n" -"PO-Revision-Date: 2015-09-11 12:17+0000\n" -"Last-Translator: Sarina Canelake \n" +"POT-Creation-Date: 2015-09-18 13:22+0000\n" +"PO-Revision-Date: 2015-09-14 14:57+0000\n" +"Last-Translator: Liubov Fomicheva \n" "Language-Team: Russian (http://www.transifex.com/open-edx/edx-platform/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" diff --git a/conf/locale/zh_CN/LC_MESSAGES/django.mo b/conf/locale/zh_CN/LC_MESSAGES/django.mo index 147bbeb29e8751f0e8e5466e64579e8dab717621..d9f2cb42ff13dda84f277e513b03be4c651f438d 100644 GIT binary patch delta 31 ncmX@tEO4$_prM6v3)7^0b_)eVV=E)$_L=!i+h^u8n@$1%xB&|L delta 31 ncmX@tEO4$_prM6v3)7^0c0&b2BP&C*_L=!i+h^u8n@$1%w~-3< diff --git a/conf/locale/zh_CN/LC_MESSAGES/django.po b/conf/locale/zh_CN/LC_MESSAGES/django.po index 10880639f6..21ee046616 100644 --- a/conf/locale/zh_CN/LC_MESSAGES/django.po +++ b/conf/locale/zh_CN/LC_MESSAGES/django.po @@ -265,7 +265,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2015-09-11 12:16+0000\n" +"POT-Creation-Date: 2015-09-18 13:23+0000\n" "PO-Revision-Date: 2015-06-18 03:04+0000\n" "Last-Translator: louyihua \n" "Language-Team: Chinese (China) (http://www.transifex.com/open-edx/edx-platform/language/zh_CN/)\n" @@ -3472,9 +3472,7 @@ msgid "Request user's username" msgstr "" #: common/lib/xmodule/xmodule/lti_module.py -msgid "" -"Select True to request the user's username. You must also set Open in New " -"Page to True to get the user's information." +msgid "Select True to request the user's username." msgstr "" #: common/lib/xmodule/xmodule/lti_module.py @@ -3482,9 +3480,7 @@ msgid "Request user's email" msgstr "" #: common/lib/xmodule/xmodule/lti_module.py -msgid "" -"Select True to request the user's email address. You must also set Open in " -"New Page to True to get the user's information." +msgid "Select True to request the user's email address." msgstr "" #: common/lib/xmodule/xmodule/lti_module.py @@ -7649,10 +7645,6 @@ msgstr "" msgid "The supplied topic id {topic_id} is not valid" msgstr "" -#: lms/djangoapps/teams/views.py -msgid "Error connecting to elasticsearch" -msgstr "" - #. Translators: 'ordering' is a string describing a way #. of ordering a list. For example, {ordering} may be #. 'name', indicating that the user wants to sort the @@ -11534,8 +11526,6 @@ msgstr "在推特上发布你已注册此课程" msgid "Email someone to say you've registered for this course" msgstr "" -#. Translators: This text will be automatically posted to the student's -#. Twitter account. {url} should appear at the end of the text. #: lms/templates/courseware/course_about.html msgid "I just registered for {number} {title} through {account}: {url}" msgstr "我刚刚通过 {account} 注册了编号为 {number} 的课程 {title},链接是:{url}" @@ -11998,6 +11988,8 @@ msgstr "" msgid "Download Your Certificate" msgstr "" +#. Translators: This message appears to users when the system is processessing +#. course certificates, which can take a few hours. #: lms/templates/courseware/progress.html msgid "We're working on it..." msgstr "" @@ -16225,9 +16217,8 @@ msgstr "注意:机构名称、课程编号以及开课时间三者合在一起 msgid "Required Information to Create a re-run of a course" msgstr "创建一次课程重启所必需的信息" -#. Translators: This is an example name for a new course, seen when filling -#. out -#. the form to create a new course. +#. Translators: This is an example name for a new course, seen when +#. filling out the form to create a new course. #: cms/templates/course-create-rerun.html cms/templates/index.html msgid "e.g. Introduction to Computer Science" msgstr "例如,计算机科学导论" @@ -17430,8 +17421,8 @@ msgid "Library Name" msgstr "知识库名称" #. Translators: This is an example name for a new content library, seen when -#. filling out the form to create a new library. (A library is a collection of -#. content or problems.) +#. filling out the form to create a new library. +#. (A library is a collection of content or problems.) #: cms/templates/index.html msgid "e.g. Computer Science Problems" msgstr "例如,计算机科学问题" @@ -17454,8 +17445,9 @@ msgstr "知识库代码" #. Translators: This is an example for the "code" used to identify a library, #. seen when filling out the form to create a new library. This example is -#. short for "Computer Science Problems". The example number may contain -#. letters but must not contain spaces. +#. short +#. for "Computer Science Problems". The example number may contain letters +#. but must not contain spaces. #: cms/templates/index.html msgid "e.g. CSPROB" msgstr "例如,CSPROB" @@ -17482,10 +17474,11 @@ msgstr "开课时间" msgid "This course run is currently being created." msgstr "正在创建该课程的本次运行。" -#. Translators: This is a status message, used to inform the user of what the -#. system is doing. This status means that the user has requested to re-run an -#. existing course, and the system is currently in the process of duplicating -#. and configuring the existing course so that it can be re-run. +#. Translators: This is a status message, used to inform the user of +#. what the system is doing. This status means that the user has +#. requested to re-run an existing course, and the system is currently +#. in the process of duplicating and configuring the existing course +#. so that it can be re-run. #: cms/templates/index.html msgid "Configuring as re-run" msgstr "配置为重启" @@ -17498,6 +17491,18 @@ msgid "" msgstr "" "新的课程将在5-10分钟内添加到您的课程列表里中。返回到该页或者{link_start}刷新该页{link_end}以更新课程列表。新的课程将需要一些手动配置。" +#. Translators: This is a status message for the course re-runs feature. +#. When a course admin indicates that a course should be re-run, the system +#. needs to process the request and prepare the new course. The status of +#. the process will follow this text. +#: cms/templates/index.html +msgid "This re-run processing status:" +msgstr "" + +#: cms/templates/index.html +msgid "Configuration Error" +msgstr "" + #: cms/templates/index.html msgid "" "A system error occurred while your course was being processed. Please go to " diff --git a/conf/locale/zh_CN/LC_MESSAGES/djangojs.mo b/conf/locale/zh_CN/LC_MESSAGES/djangojs.mo index e1cecaecc2e94128726ba1cc089466730b25c6ed..68ef96f7a8d8a8ebd41b21374663ed203488537f 100644 GIT binary patch delta 22 ecmbQ(!ZxvmZG-C\n" "Language-Team: Chinese (China) (http://www.transifex.com/open-edx/edx-platform/language/zh_CN/)\n" From 547844c0f45ba2b9f15a073bdc8a9473fe57fe7c Mon Sep 17 00:00:00 2001 From: Peter Fogg Date: Thu, 17 Sep 2015 14:13:04 -0400 Subject: [PATCH 51/54] Update verified track message. ECOM-2300 --- common/templates/course_modes/choose.html | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/common/templates/course_modes/choose.html b/common/templates/course_modes/choose.html index 97499d8f87..0def3743fd 100644 --- a/common/templates/course_modes/choose.html +++ b/common/templates/course_modes/choose.html @@ -68,6 +68,9 @@ from django.core.urlresolvers import reverse
        + <% + b_tag_kwargs = {'b_start': '', 'b_end': ''} + %> % if "verified" in modes:

        @@ -82,9 +85,9 @@ from django.core.urlresolvers import reverse

        ${_("Benefits of a Verified Certificate")}

          -
        • ${_("{b_start}Eligible for credit:{b_end} Receive academic credit after successfully completing the course").format(b_start='', b_end='')}
        • -
        • ${_("{b_start}Official:{b_end} Receive an instructor-signed certificate with the institution's logo").format(b_start='', b_end='')}
        • -
        • ${_("{b_start}Easily shareable:{b_end} Add the certificate to your CV or resume, or post it directly on LinkedIn").format(b_start='', b_end='')}
        • +
        • ${_("{b_start}Eligible for credit:{b_end} Receive academic credit after successfully completing the course").format(**b_tag_kwargs)}
        • +
        • ${_("{b_start}Official:{b_end} Receive an instructor-signed certificate with the institution's logo").format(**b_tag_kwargs)}
        • +
        • ${_("{b_start}Easily shareable:{b_end} Add the certificate to your CV or resume, or post it directly on LinkedIn").format(**b_tag_kwargs)}
        @@ -108,9 +111,12 @@ from django.core.urlresolvers import reverse

        ${_("Benefits of a Verified Certificate")}

          -
        • ${_("{b_start}Official: {b_end}Receive an instructor-signed certificate with the institution's logo").format(b_start='', b_end='')}
        • -
        • ${_("{b_start}Easily shareable: {b_end}Add the certificate to your CV or resume, or post it directly on LinkedIn").format(b_start='', b_end='')}
        • -
        • ${_("{b_start}Motivating: {b_end}Give yourself an additional incentive to complete the course").format(b_start='', b_end='')}
        • +
        • ${_("{b_start}Official: {b_end}Receive an instructor-signed certificate with the institution's logo").format(**b_tag_kwargs)}
        • +
        • ${_("{b_start}Easily shareable: {b_end}Add the certificate to your CV or resume, or post it directly on LinkedIn").format(**b_tag_kwargs)}
        • +
        • ${_("{b_start}Motivating: {b_end}Give yourself an additional incentive to complete the course").format(**b_tag_kwargs)}
        • + % if settings.FEATURES.get('IS_EDX_DOMAIN', False): +
        • ${_("{b_start}Support our Mission: {b_end} EdX, a non-profit, relies on verified certificates to help fund free education for everyone globally").format(**b_tag_kwargs)}
        • + % endif
        From 13e8761aa4e20f5eab749aae36d0774e43b7e874 Mon Sep 17 00:00:00 2001 From: Awais Jibran Date: Fri, 11 Sep 2015 17:51:18 +0500 Subject: [PATCH 52/54] In cohort courses, student progress pages differ from the grade report. TNL-3204 --- lms/djangoapps/courseware/grades.py | 5 + .../tests/test_tasks_helper.py | 122 ++++++++++++------ 2 files changed, 88 insertions(+), 39 deletions(-) diff --git a/lms/djangoapps/courseware/grades.py b/lms/djangoapps/courseware/grades.py index a7bcc8a8e3..5b1a9741d5 100644 --- a/lms/djangoapps/courseware/grades.py +++ b/lms/djangoapps/courseware/grades.py @@ -15,6 +15,7 @@ from django.core.cache import cache import dogstats_wrapper as dog_stats_api from courseware import courses +from courseware.access import has_access from courseware.model_data import FieldDataCache, ScoresClient from student.models import anonymous_id_for_user from util.module_utils import yield_dynamic_descriptor_descendants @@ -405,6 +406,10 @@ def _grade(student, request, course, keep_raw_scores, field_data_cache, scores_c descendants = yield_dynamic_descriptor_descendants(section_descriptor, student.id, create_module) for module_descriptor in descendants: + user_access = has_access(student, 'load', module_descriptor, module_descriptor.location.course_key) + if not user_access: + continue + (correct, total) = get_score( student, module_descriptor, diff --git a/lms/djangoapps/instructor_task/tests/test_tasks_helper.py b/lms/djangoapps/instructor_task/tests/test_tasks_helper.py index c6701ebc55..fe74ba6f37 100644 --- a/lms/djangoapps/instructor_task/tests/test_tasks_helper.py +++ b/lms/djangoapps/instructor_task/tests/test_tasks_helper.py @@ -9,6 +9,7 @@ Tests that CSV grade report generation works with unicode emails. import ddt from mock import Mock, patch import tempfile +from openedx.core.djangoapps.course_groups import cohorts import unicodecsv from django.core.urlresolvers import reverse from django.test.utils import override_settings @@ -662,7 +663,7 @@ class TestProblemReportCohortedContent(TestReportMixin, ContentGroupTestCase, In """ def setUp(self): super(TestProblemReportCohortedContent, self).setUp() - # contstruct cohorted problems to work on. + # construct cohorted problems to work on. self.add_course_content() vertical = ItemFactory.create( parent_location=self.problem_section.location, @@ -681,6 +682,23 @@ class TestProblemReportCohortedContent(TestReportMixin, ContentGroupTestCase, In group_access={self.course.user_partitions[0].id: [self.course.user_partitions[0].groups[1].id]} ) + def _format_user_grade(self, header_row, user, grade): + """ + Helper method that format the user grade + Args: + header_row(list): header row of csv containing Student ID, Email, Username etc + user(object): Django user object + grade(list): Users' grade list + """ + return dict(zip( + header_row, + [ + unicode(user.id), + user.email, + user.username, + ] + grade + )) + def test_cohort_content(self): self.submit_student_answer(self.alpha_user.username, u'Pröblem0', ['Option 1', 'Option 1']) resp = self.submit_student_answer(self.alpha_user.username, u'Pröblem1', ['Option 1', 'Option 1']) @@ -695,49 +713,75 @@ class TestProblemReportCohortedContent(TestReportMixin, ContentGroupTestCase, In self.assertDictContainsSubset( {'action_name': 'graded', 'attempted': 4, 'succeeded': 4, 'failed': 0}, result ) - problem_names = [u'Homework 1: Problem - Pröblem0', u'Homework 1: Problem - Pröblem1'] header_row = [u'Student ID', u'Email', u'Username', u'Final Grade'] for problem in problem_names: header_row += [problem + ' (Earned)', problem + ' (Possible)'] - self.verify_rows_in_csv([ - dict(zip( - header_row, - [ - unicode(self.staff_user.id), - self.staff_user.email, - self.staff_user.username, u'0.0', u'N/A', u'N/A', u'N/A', u'N/A' - ] - )), - dict(zip( - header_row, - [ - unicode(self.alpha_user.id), - self.alpha_user.email, - self.alpha_user.username, - u'1.0', u'2.0', u'2.0', u'N/A', u'N/A' - ] - )), - dict(zip( - header_row, - [ - unicode(self.beta_user.id), - self.beta_user.email, - self.beta_user.username, - u'0.5', u'N/A', u'N/A', u'1.0', u'2.0' - ] - )), - dict(zip( - header_row, - [ - unicode(self.non_cohorted_user.id), - self.non_cohorted_user.email, - self.non_cohorted_user.username, - u'0.0', u'N/A', u'N/A', u'N/A', u'N/A' - ] - )), - ]) + user_grades = [ + {'user': self.staff_user, 'grade': [u'0.0', u'N/A', u'N/A', u'N/A', u'N/A']}, + {'user': self.alpha_user, 'grade': [u'1.0', u'2.0', u'2.0', u'N/A', u'N/A']}, + {'user': self.beta_user, 'grade': [u'0.5', u'N/A', u'N/A', u'1.0', u'2.0']}, + {'user': self.non_cohorted_user, 'grade': [u'0.0', u'N/A', u'N/A', u'N/A', u'N/A']}, + ] + + # Verify generated grades and expected grades match + expected_grades = [self._format_user_grade(header_row, **user_grade) for user_grade in user_grades] + self.verify_rows_in_csv(expected_grades) + + @patch('courseware.grades.MaxScoresCache.get', Mock(return_value=1)) + def test_cohort_content_with_maxcache(self): + """ + Tests the cohoted course grading to test the scenario in which `max_scores_cache` is set for the course + problems. + """ + # Course is cohorted + self.assertTrue(cohorts.is_course_cohorted(self.course.id)) + + # Verify user groups + self.assertEquals( + cohorts.get_cohort(self.alpha_user, self.course.id).id, + self.course.user_partitions[0].groups[0].id, + "alpha_user should be assigned to the correct cohort" + ) + self.assertEquals( + cohorts.get_cohort(self.beta_user, self.course.id).id, + self.course.user_partitions[0].groups[1].id, + "beta_user should be assigned to the correct cohort" + ) + + # Verify user enrollment + for user in [self.alpha_user, self.beta_user, self.non_cohorted_user]: + self.assertTrue(CourseEnrollment.is_enrolled(user, self.course.id)) + + self.submit_student_answer(self.alpha_user.username, u'Pröblem0', ['Option 1', 'Option 1']) + resp = self.submit_student_answer(self.alpha_user.username, u'Pröblem1', ['Option 1', 'Option 1']) + self.assertEqual(resp.status_code, 404) + + resp = self.submit_student_answer(self.beta_user.username, u'Pröblem0', ['Option 1', 'Option 2']) + self.assertEqual(resp.status_code, 404) + self.submit_student_answer(self.beta_user.username, u'Pröblem1', ['Option 1', 'Option 2']) + + with patch('instructor_task.tasks_helper._get_current_task'): + result = upload_problem_grade_report(None, None, self.course.id, None, 'graded') + self.assertDictContainsSubset( + {'action_name': 'graded', 'attempted': 4, 'succeeded': 4, 'failed': 0}, result + ) + problem_names = [u'Homework 1: Problem - Pröblem0', u'Homework 1: Problem - Pröblem1'] + header_row = [u'Student ID', u'Email', u'Username', u'Final Grade'] + for problem in problem_names: + header_row += [problem + ' (Earned)', problem + ' (Possible)'] + + user_grades = [ + {'user': self.staff_user, 'grade': [u'0.0', u'N/A', u'N/A', u'N/A', u'N/A']}, + {'user': self.alpha_user, 'grade': [u'1.0', u'2.0', u'2.0', u'N/A', u'N/A']}, + {'user': self.beta_user, 'grade': [u'0.5', u'N/A', u'N/A', u'1.0', u'2.0']}, + {'user': self.non_cohorted_user, 'grade': [u'0.0', u'N/A', u'N/A', u'N/A', u'N/A']}, + ] + + # Verify generated grades and expected grades match + expected_grades = [self._format_user_grade(header_row, **grade) for grade in user_grades] + self.verify_rows_in_csv(expected_grades) @ddt.ddt From 3832144a4199507f0cddd3c04a2e3e58c2fe07b5 Mon Sep 17 00:00:00 2001 From: Chris Dodge Date: Sun, 20 Sep 2015 09:56:21 -0400 Subject: [PATCH 53/54] bump edx-proctoring 0.9.6d --- requirements/edx/github.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/edx/github.txt b/requirements/edx/github.txt index 52099e99be..89ed5042c3 100644 --- a/requirements/edx/github.txt +++ b/requirements/edx/github.txt @@ -58,7 +58,7 @@ git+https://github.com/edx/ecommerce-api-client.git@1.1.0#egg=ecommerce-api-clie -e git+https://github.com/edx/edx-user-state-client.git@30c0ad4b9f57f8d48d6943eb585ec8a9205f4469#egg=edx-user-state-client -e git+https://github.com/edx/edx-organizations.git@release-2015-08-31#egg=edx-organizations -git+https://github.com/edx/edx-proctoring.git@0.9.6b#egg=edx-proctoring==0.9.6b +git+https://github.com/edx/edx-proctoring.git@0.9.6d#egg=edx-proctoring==0.9.6d # Third Party XBlocks -e git+https://github.com/mitodl/edx-sga@172a90fd2738f8142c10478356b2d9ed3e55334a#egg=edx-sga From 94377662fd589215f75e265a38b442e35b0062b4 Mon Sep 17 00:00:00 2001 From: Chris Dodge Date: Mon, 21 Sep 2015 15:43:54 -0400 Subject: [PATCH 54/54] Bump proctoring to 0.9.6e --- requirements/edx/github.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/edx/github.txt b/requirements/edx/github.txt index 89ed5042c3..05036b7401 100644 --- a/requirements/edx/github.txt +++ b/requirements/edx/github.txt @@ -58,7 +58,7 @@ git+https://github.com/edx/ecommerce-api-client.git@1.1.0#egg=ecommerce-api-clie -e git+https://github.com/edx/edx-user-state-client.git@30c0ad4b9f57f8d48d6943eb585ec8a9205f4469#egg=edx-user-state-client -e git+https://github.com/edx/edx-organizations.git@release-2015-08-31#egg=edx-organizations -git+https://github.com/edx/edx-proctoring.git@0.9.6d#egg=edx-proctoring==0.9.6d +git+https://github.com/edx/edx-proctoring.git@0.9.6e#egg=edx-proctoring==0.9.6e # Third Party XBlocks -e git+https://github.com/mitodl/edx-sga@172a90fd2738f8142c10478356b2d9ed3e55334a#egg=edx-sga

        F%$ct>NrMq8(A{c+?7OK;9Ja&{ZYxa7}c@E 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�o76eATrwj!=d)=R9F&z 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 Hv-SS~pZl1v diff --git a/conf/locale/es_419/LC_MESSAGES/django.po b/conf/locale/es_419/LC_MESSAGES/django.po index eb12a0f477..8b3397c2bf 100644 --- a/conf/locale/es_419/LC_MESSAGES/django.po +++ b/conf/locale/es_419/LC_MESSAGES/django.po @@ -172,7 +172,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2015-09-11 12:16+0000\n" +"POT-Creation-Date: 2015-09-18 13:23+0000\n" "PO-Revision-Date: 2015-06-29 17:10+0000\n" "Last-Translator: Cristian Salamea \n" "Language-Team: Spanish (Latin America) (http://www.transifex.com/open-edx/edx-platform/language/es_419/)\n" @@ -3829,26 +3829,16 @@ msgid "Request user's username" msgstr "Solicite el nombre del usuario" #: common/lib/xmodule/xmodule/lti_module.py -msgid "" -"Select True to request the user's username. You must also set Open in New " -"Page to True to get the user's information." +msgid "Select True to request the user's username." msgstr "" -"Seleccione True para solicitar el nombre de usuario al usuario. También " -"puede configurar La apertura en una nueva página en True para obtener la " -"información del usuario." #: common/lib/xmodule/xmodule/lti_module.py msgid "Request user's email" msgstr "Solicite la dirección de correo del usuario" #: common/lib/xmodule/xmodule/lti_module.py -msgid "" -"Select True to request the user's email address. You must also set Open in " -"New Page to True to get the user's information." +msgid "Select True to request the user's email address." msgstr "" -"Seleccione True para solicitar el correo electrónico del usuario. También " -"puede configurar la apertura en una nueva página en True para obtener la " -"información del usuario." #: common/lib/xmodule/xmodule/lti_module.py msgid "LTI Application Information" @@ -8628,10 +8618,6 @@ msgstr "" msgid "The supplied topic id {topic_id} is not valid" msgstr "El ID de tema proporcionado {topic_id} no es válido" -#: lms/djangoapps/teams/views.py -msgid "Error connecting to elasticsearch" -msgstr "" - #. Translators: 'ordering' is a string describing a way #. of ordering a list. For example, {ordering} may be #. 'name', indicating that the user wants to sort the @@ -12818,8 +12804,6 @@ msgstr "Publica que te has registrado en este curso" msgid "Email someone to say you've registered for this course" msgstr "Envía un correo a tus amigos que te has registrado en este curso" -#. Translators: This text will be automatically posted to the student's -#. Twitter account. {url} should appear at the end of the text. #: lms/templates/courseware/course_about.html msgid "I just registered for {number} {title} through {account}: {url}" msgstr "" @@ -13337,6 +13321,8 @@ msgstr "El PDF se abrirá en una nueva ventana o pestaña del navegador." msgid "Download Your Certificate" msgstr "Descargar Tu certificaddo" +#. Translators: This message appears to users when the system is processessing +#. course certificates, which can take a few hours. #: lms/templates/courseware/progress.html msgid "We're working on it..." msgstr "Estamos trabajando en eso..." @@ -18149,9 +18135,8 @@ msgstr "" msgid "Required Information to Create a re-run of a course" msgstr "Información requerida para crear una reapertura del curso" -#. Translators: This is an example name for a new course, seen when filling -#. out -#. the form to create a new course. +#. Translators: This is an example name for a new course, seen when +#. filling out the form to create a new course. #: cms/templates/course-create-rerun.html cms/templates/index.html msgid "e.g. Introduction to Computer Science" msgstr "ej.: Introducción a las Ciencias de la Computación" @@ -19568,8 +19553,8 @@ msgid "Library Name" msgstr "Nombre" #. Translators: This is an example name for a new content library, seen when -#. filling out the form to create a new library. (A library is a collection of -#. content or problems.) +#. filling out the form to create a new library. +#. (A library is a collection of content or problems.) #: cms/templates/index.html msgid "e.g. Computer Science Problems" msgstr "ej.: Problemas de Ciencias de la Computación" @@ -19592,8 +19577,9 @@ msgstr "Código" #. Translators: This is an example for the "code" used to identify a library, #. seen when filling out the form to create a new library. This example is -#. short for "Computer Science Problems". The example number may contain -#. letters but must not contain spaces. +#. short +#. for "Computer Science Problems". The example number may contain letters +#. but must not contain spaces. #: cms/templates/index.html msgid "e.g. CSPROB" msgstr "ej: PROBCC" @@ -19622,10 +19608,11 @@ msgstr "Impartición del Curso:" msgid "This course run is currently being created." msgstr "Esta instancia del curso está actualmente siendo creada." -#. Translators: This is a status message, used to inform the user of what the -#. system is doing. This status means that the user has requested to re-run an -#. existing course, and the system is currently in the process of duplicating -#. and configuring the existing course so that it can be re-run. +#. Translators: This is a status message, used to inform the user of +#. what the system is doing. This status means that the user has +#. requested to re-run an existing course, and the system is currently +#. in the process of duplicating and configuring the existing course +#. so that it can be re-run. #: cms/templates/index.html msgid "Configuring as re-run" msgstr "Está siendo configurado para su reutilización." @@ -19640,6 +19627,18 @@ msgstr "" " esta página o {link_start}recarguela{link_end} para actualizar la lista de " "cursos. El nuevo curso necesitará alguna configuración manual." +#. Translators: This is a status message for the course re-runs feature. +#. When a course admin indicates that a course should be re-run, the system +#. needs to process the request and prepare the new course. The status of +#. the process will follow this text. +#: cms/templates/index.html +msgid "This re-run processing status:" +msgstr "" + +#: cms/templates/index.html +msgid "Configuration Error" +msgstr "" + #: cms/templates/index.html msgid "" "A system error occurred while your course was being processed. Please go to " diff --git a/conf/locale/es_419/LC_MESSAGES/djangojs.mo b/conf/locale/es_419/LC_MESSAGES/djangojs.mo index 32342682823c852b1f65ffaab2ab9712b30ab8be..bea5eb8531bc8cf4473a3e67306292cf005e1e61 100644 GIT binary patch delta 25 hcmccjmE+!5j)pCabDY>M6by~6jEuG~c4D;t0RWKL3Hty5 delta 25 hcmccjmE+!5j)pCabDY=>6%3863{AH$c4D;t0RWJI3H1N~ diff --git a/conf/locale/es_419/LC_MESSAGES/djangojs.po b/conf/locale/es_419/LC_MESSAGES/djangojs.po index b512fd14c7..ea4967845a 100644 --- a/conf/locale/es_419/LC_MESSAGES/djangojs.po +++ b/conf/locale/es_419/LC_MESSAGES/djangojs.po @@ -99,7 +99,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2015-09-11 12:15+0000\n" +"POT-Creation-Date: 2015-09-18 13:22+0000\n" "PO-Revision-Date: 2015-09-11 12:17+0000\n" "Last-Translator: Sarina Canelake \n" "Language-Team: Spanish (Latin America) (http://www.transifex.com/open-edx/edx-platform/language/es_419/)\n" diff --git a/conf/locale/fr/LC_MESSAGES/django.mo b/conf/locale/fr/LC_MESSAGES/django.mo index 4bb5fd4f7ba6c4bc0238bc3e30f98a45a39aec1b..aa6677b8a73c7987f0ce1354282cf5f7b8df675d 100644 GIT binary patch delta 35 pcmdn|Ms)KV(S{brElm2q*ew(cjjfD~+s%G40WtG-vtKNKs{sTj4ut>! delta 35 pcmdn|Ms)KV(S{brElm2q*bNm7jjRmK+Rc730WtG-vtKNKs{sR_4u1du diff --git a/conf/locale/fr/LC_MESSAGES/django.po b/conf/locale/fr/LC_MESSAGES/django.po index ec15d74683..33d13a197f 100644 --- a/conf/locale/fr/LC_MESSAGES/django.po +++ b/conf/locale/fr/LC_MESSAGES/django.po @@ -51,7 +51,7 @@ # Steven BERNARD , 2013 # Thomas Sihapanya , 2015 # Toreador , 2014 -# Xavier Antoviaque , 2014 +# Xavier Antoviaque , 2014-2015 # PETIT Yannick , 2013 # yepelboin , 2014-2015 # #-#-#-#-# django-studio.po (edx-platform) #-#-#-#-# @@ -178,7 +178,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2015-09-11 12:16+0000\n" +"POT-Creation-Date: 2015-09-18 13:23+0000\n" "PO-Revision-Date: 2015-06-19 17:16+0000\n" "Last-Translator: Xavier Antoviaque \n" "Language-Team: French (http://www.transifex.com/open-edx/edx-platform/language/fr/)\n" @@ -3704,9 +3704,7 @@ msgid "Request user's username" msgstr "Demander le nom de l'utilisateur" #: common/lib/xmodule/xmodule/lti_module.py -msgid "" -"Select True to request the user's username. You must also set Open in New " -"Page to True to get the user's information." +msgid "Select True to request the user's username." msgstr "" #: common/lib/xmodule/xmodule/lti_module.py @@ -3714,9 +3712,7 @@ msgid "Request user's email" msgstr "" #: common/lib/xmodule/xmodule/lti_module.py -msgid "" -"Select True to request the user's email address. You must also set Open in " -"New Page to True to get the user's information." +msgid "Select True to request the user's email address." msgstr "" #: common/lib/xmodule/xmodule/lti_module.py @@ -8142,10 +8138,6 @@ msgstr "" msgid "The supplied topic id {topic_id} is not valid" msgstr "" -#: lms/djangoapps/teams/views.py -msgid "Error connecting to elasticsearch" -msgstr "" - #. Translators: 'ordering' is a string describing a way #. of ordering a list. For example, {ordering} may be #. 'name', indicating that the user wants to sort the @@ -12220,8 +12212,6 @@ msgstr "Tweetez que vous êtes inscrits pour ce cours" msgid "Email someone to say you've registered for this course" msgstr "Envoyez par e-mail que vous êtes inscrits à ce cours" -#. Translators: This text will be automatically posted to the student's -#. Twitter account. {url} should appear at the end of the text. #: lms/templates/courseware/course_about.html msgid "I just registered for {number} {title} through {account}: {url}" msgstr "Je viens de m'inscrire pour {number} {title} via {account}: {url}" @@ -12726,6 +12716,8 @@ msgstr "" msgid "Download Your Certificate" msgstr "Télécharger votre certificat" +#. Translators: This message appears to users when the system is processessing +#. course certificates, which can take a few hours. #: lms/templates/courseware/progress.html msgid "We're working on it..." msgstr "Nous y travaillons" @@ -17322,9 +17314,8 @@ msgstr "" msgid "Required Information to Create a re-run of a course" msgstr "Informations requises pour créer une nouvelle session d'un cours" -#. Translators: This is an example name for a new course, seen when filling -#. out -#. the form to create a new course. +#. Translators: This is an example name for a new course, seen when +#. filling out the form to create a new course. #: cms/templates/course-create-rerun.html cms/templates/index.html msgid "e.g. Introduction to Computer Science" msgstr "par exemple, Introduction à l'Informatique" @@ -18651,8 +18642,8 @@ msgid "Library Name" msgstr "Nom de la Bibliothèque" #. Translators: This is an example name for a new content library, seen when -#. filling out the form to create a new library. (A library is a collection of -#. content or problems.) +#. filling out the form to create a new library. +#. (A library is a collection of content or problems.) #: cms/templates/index.html msgid "e.g. Computer Science Problems" msgstr "exemple: Exercices d'introduction à l'Informatique" @@ -18675,8 +18666,9 @@ msgstr "Code de la bibliothèque" #. Translators: This is an example for the "code" used to identify a library, #. seen when filling out the form to create a new library. This example is -#. short for "Computer Science Problems". The example number may contain -#. letters but must not contain spaces. +#. short +#. for "Computer Science Problems". The example number may contain letters +#. but must not contain spaces. #: cms/templates/index.html msgid "e.g. CSPROB" msgstr "MATHPROB par exemple" @@ -18705,10 +18697,11 @@ msgstr "Cours dispensé:" msgid "This course run is currently being created." msgstr "Création de cette session de cours..." -#. Translators: This is a status message, used to inform the user of what the -#. system is doing. This status means that the user has requested to re-run an -#. existing course, and the system is currently in the process of duplicating -#. and configuring the existing course so that it can be re-run. +#. Translators: This is a status message, used to inform the user of +#. what the system is doing. This status means that the user has +#. requested to re-run an existing course, and the system is currently +#. in the process of duplicating and configuring the existing course +#. so that it can be re-run. #: cms/templates/index.html msgid "Configuring as re-run" msgstr "Configuré comme relancé" @@ -18724,6 +18717,18 @@ msgstr "" "jour la liste de cours. Le nouveau cours aura besoin d'être configuré " "manuellement." +#. Translators: This is a status message for the course re-runs feature. +#. When a course admin indicates that a course should be re-run, the system +#. needs to process the request and prepare the new course. The status of +#. the process will follow this text. +#: cms/templates/index.html +msgid "This re-run processing status:" +msgstr "" + +#: cms/templates/index.html +msgid "Configuration Error" +msgstr "" + #: cms/templates/index.html msgid "" "A system error occurred while your course was being processed. Please go to " diff --git a/conf/locale/fr/LC_MESSAGES/djangojs.mo b/conf/locale/fr/LC_MESSAGES/djangojs.mo index 994533cba6d2cc47380630400aced1066c652ee2..5d095f0194e17b0d958b1fb184004892ad078f1b 100644 GIT binary patch delta 9620 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

        ${member.user} ${member.user.email}
        Revoke access
        ${_("Revoke access")}