From 4d2ebdce8faa00a00c3ac1f2baab0606ff121367 Mon Sep 17 00:00:00 2001 From: cahrens Date: Thu, 25 Apr 2013 11:44:52 -0400 Subject: [PATCH 01/14] Upgrade version of xblocks to get Field display_name property. --- local-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/local-requirements.txt b/local-requirements.txt index 177897f53d..6d2a6270b7 100644 --- a/local-requirements.txt +++ b/local-requirements.txt @@ -6,4 +6,4 @@ # XBlock: # Might change frequently, so put it in local-requirements.txt, # but conceptually is an external package, so it is in a separate repo. --e git+https://github.com/edx/XBlock.git@96d8f5f4#egg=XBlock +-e git+https://github.com/edx/XBlock.git@2e0770ff#egg=XBlock From 8705ff8805e12f6d178d0033870bae31d228c8fe Mon Sep 17 00:00:00 2001 From: cahrens Date: Mon, 29 Apr 2013 16:41:07 -0400 Subject: [PATCH 02/14] Remove system_metadata_fields. --- .../contentstore/module_info_model.py | 6 +-- cms/djangoapps/contentstore/views.py | 6 +-- .../models/settings/course_metadata.py | 15 +++---- cms/templates/widgets/metadata-edit.html | 20 ++++++++-- common/lib/xmodule/xmodule/capa_module.py | 34 +++++++--------- .../lib/xmodule/xmodule/discussion_module.py | 11 +++--- common/lib/xmodule/xmodule/html_module.py | 10 ----- common/lib/xmodule/xmodule/mako_module.py | 39 ++++++++++++++----- common/lib/xmodule/xmodule/x_module.py | 14 +++---- common/lib/xmodule/xmodule/xml_module.py | 6 ++- local-requirements.txt | 2 +- 11 files changed, 90 insertions(+), 73 deletions(-) diff --git a/cms/djangoapps/contentstore/module_info_model.py b/cms/djangoapps/contentstore/module_info_model.py index 91f722a699..f7d1bbd8fe 100644 --- a/cms/djangoapps/contentstore/module_info_model.py +++ b/cms/djangoapps/contentstore/module_info_model.py @@ -75,11 +75,7 @@ def set_module_info(store, location, post_data): # IMPORTANT NOTE: if the client passed pack 'null' (None) for a piece of metadata that means 'remove it' for metadata_key, value in posted_metadata.items(): - # let's strip out any metadata fields from the postback which have been identified as system metadata - # and therefore should not be user-editable, so we should accept them back from the client - if metadata_key in module.system_metadata_fields: - del posted_metadata[metadata_key] - elif posted_metadata[metadata_key] is None: + if posted_metadata[metadata_key] is None: # remove both from passed in collection as well as the collection read in from the modulestore if metadata_key in module._model_data: del module._model_data[metadata_key] diff --git a/cms/djangoapps/contentstore/views.py b/cms/djangoapps/contentstore/views.py index 603010f5b4..6ce17d04aa 100644 --- a/cms/djangoapps/contentstore/views.py +++ b/cms/djangoapps/contentstore/views.py @@ -687,11 +687,7 @@ def save_item(request): # IMPORTANT NOTE: if the client passed pack 'null' (None) for a piece of metadata that means 'remove it' for metadata_key, value in posted_metadata.items(): - # let's strip out any metadata fields from the postback which have been identified as system metadata - # and therefore should not be user-editable, so we should accept them back from the client - if metadata_key in existing_item.system_metadata_fields: - del posted_metadata[metadata_key] - elif posted_metadata[metadata_key] is None: + if posted_metadata[metadata_key] is None: # remove both from passed in collection as well as the collection read in from the modulestore if metadata_key in existing_item._model_data: del existing_item._model_data[metadata_key] diff --git a/cms/djangoapps/models/settings/course_metadata.py b/cms/djangoapps/models/settings/course_metadata.py index 4429e35692..708e79f0a3 100644 --- a/cms/djangoapps/models/settings/course_metadata.py +++ b/cms/djangoapps/models/settings/course_metadata.py @@ -14,13 +14,14 @@ class CourseMetadata(object): The objects have no predefined attrs but instead are obj encodings of the editable metadata. ''' - FILTERED_LIST = XModuleDescriptor.system_metadata_fields + ['start', - 'end', - 'enrollment_start', - 'enrollment_end', - 'tabs', - 'graceperiod', - 'checklists'] + FILTERED_LIST = ['xml_attributes', + 'start', + 'end', + 'enrollment_start', + 'enrollment_end', + 'tabs', + 'graceperiod', + 'checklists'] @classmethod def fetch(cls, course_location): diff --git a/cms/templates/widgets/metadata-edit.html b/cms/templates/widgets/metadata-edit.html index 51fe400f88..b351b5c344 100644 --- a/cms/templates/widgets/metadata-edit.html +++ b/cms/templates/widgets/metadata-edit.html @@ -7,10 +7,24 @@ % for field_name, field_value in editable_metadata_fields.items():
  • % if field_name == 'source_code': - Edit High Level Source + % if field_value['is_default'] is False: + Edit High Level Source + % endif % else: - - + + + % if False: + + + + + % if field_value['field'].values: + + % for value in field_value['field'].values: + + % endfor + % endif + % endif % endif
  • % endfor diff --git a/common/lib/xmodule/xmodule/capa_module.py b/common/lib/xmodule/xmodule/capa_module.py index 4143345196..bc5014d75b 100644 --- a/common/lib/xmodule/xmodule/capa_module.py +++ b/common/lib/xmodule/xmodule/capa_module.py @@ -13,7 +13,7 @@ from capa.responsetypes import StudentInputError,\ ResponseError, LoncapaProblemError from capa.util import convert_files_to_filenames from .progress import Progress -from xmodule.x_module import XModule +from xmodule.x_module import XModule, XModuleFields from xmodule.raw_module import RawDescriptor from xmodule.exceptions import NotFoundError, ProcessingError from xblock.core import Scope, String, Boolean, Object @@ -62,20 +62,26 @@ class ComplexEncoder(json.JSONEncoder): class CapaFields(object): attempts = StringyInteger(help="Number of attempts taken by the student on this problem", default=0, scope=Scope.user_state) - max_attempts = StringyInteger(help="Maximum number of attempts that a student is allowed", scope=Scope.settings) - due = Date(help="Date that this problem is due by", scope=Scope.settings) - graceperiod = Timedelta(help="Amount of time after the due date that submissions will be accepted", scope=Scope.settings) - showanswer = String(help="When to show the problem answer to the student", scope=Scope.settings, default="closed") - force_save_button = Boolean(help="Whether to force the save button to appear on the page", scope=Scope.settings, default=False) - rerandomize = Randomization(help="When to rerandomize the problem", default="always", scope=Scope.settings) + max_attempts = StringyInteger(display_name="Maximum Allowed Attempts", + help="Maximum number of attempts that a student is allowed", scope=Scope.settings) + due = Date(help="Date that this problem is due by", scope=XModuleFields.nonEditableSettingsScope) + graceperiod = Timedelta(help="Amount of time after the due date that submissions will be accepted", + scope=XModuleFields.nonEditableSettingsScope) + showanswer = String(display_name="Show Answer", + help="When to show the problem answer to the student", scope=Scope.settings, default="closed", + values=["answered", "always", "attempted", "closed", "never"]) + force_save_button = Boolean(help="Whether to force the save button to appear on the page", + scope=XModuleFields.nonEditableSettingsScope, default=False) + rerandomize = Randomization(display_name="Rerandomize", help="When to rerandomize the problem", + default="always", scope=Scope.settings) data = String(help="XML data for the problem", scope=Scope.content) correct_map = Object(help="Dictionary with the correctness of current student answers", scope=Scope.user_state, default={}) input_state = Object(help="Dictionary for maintaining the state of inputtypes", scope=Scope.user_state) student_answers = Object(help="Dictionary with the current student responses", scope=Scope.user_state) done = Boolean(help="Whether the student has answered the problem", scope=Scope.user_state) seed = StringyInteger(help="Random seed for this student", scope=Scope.user_state) - weight = StringyFloat(help="How much to weight this problem by", scope=Scope.settings) - markdown = String(help="Markdown source of this module", scope=Scope.settings) + weight = StringyFloat(display_name="Problem Weight", help="How much to weight this problem by", scope=Scope.settings) + markdown = String(help="Markdown source of this module", scope=XModuleFields.nonEditableSettingsScope) source_code = String(help="Source code for LaTeX and Word problems. This feature is not well-supported.", scope=Scope.settings) @@ -882,16 +888,6 @@ class CapaDescriptor(CapaFields, RawDescriptor): 'enable_markdown': self.markdown is not None}) return _context - @property - def editable_metadata_fields(self): - """Remove metadata from the editable fields since it has its own editor""" - subset = super(CapaDescriptor, self).editable_metadata_fields - if 'markdown' in subset: - del subset['markdown'] - if 'empty' in subset: - del subset['empty'] - return subset - # VS[compat] # TODO (cpennington): Delete this method once all fall 2012 course are being # edited in the cms diff --git a/common/lib/xmodule/xmodule/discussion_module.py b/common/lib/xmodule/xmodule/discussion_module.py index 8968e221b2..9c2681ef2d 100644 --- a/common/lib/xmodule/xmodule/discussion_module.py +++ b/common/lib/xmodule/xmodule/discussion_module.py @@ -1,16 +1,17 @@ from pkg_resources import resource_string -from xmodule.x_module import XModule +from xmodule.x_module import XModule, XModuleFields from xmodule.raw_module import RawDescriptor from xmodule.editing_module import MetadataOnlyEditingDescriptor from xblock.core import String, Scope class DiscussionFields(object): - discussion_id = String(scope=Scope.settings) - discussion_category = String(scope=Scope.settings) - discussion_target = String(scope=Scope.settings) - sort_key = String(scope=Scope.settings) + discussion_id = String(scope=XModuleFields.nonEditableSettingsScope) + discussion_category = String(display_name="Category Name", scope=Scope.settings) + discussion_target = String(display_name="Subcategory Name", scope=Scope.settings) + # We may choose to enable this in the future, but while Kevin is investigating.... + sort_key = String(scope=XModuleFields.nonEditableSettingsScope) class DiscussionModule(DiscussionFields, XModule): diff --git a/common/lib/xmodule/xmodule/html_module.py b/common/lib/xmodule/xmodule/html_module.py index d901fc5fbe..0c147ecf75 100644 --- a/common/lib/xmodule/xmodule/html_module.py +++ b/common/lib/xmodule/xmodule/html_module.py @@ -166,16 +166,6 @@ class HtmlDescriptor(HtmlFields, XmlDescriptor, EditingDescriptor): elt.set("filename", relname) return elt - @property - def editable_metadata_fields(self): - """Remove any metadata from the editable fields which have their own editor or shouldn't be edited by user.""" - subset = super(HtmlDescriptor, self).editable_metadata_fields - - if 'empty' in subset: - del subset['empty'] - - return subset - class AboutDescriptor(HtmlDescriptor): """ diff --git a/common/lib/xmodule/xmodule/mako_module.py b/common/lib/xmodule/xmodule/mako_module.py index 84db6ad779..e01a03e309 100644 --- a/common/lib/xmodule/xmodule/mako_module.py +++ b/common/lib/xmodule/xmodule/mako_module.py @@ -1,5 +1,6 @@ -from .x_module import XModuleDescriptor, DescriptorSystem -from .modulestore.inheritance import own_metadata +from .x_module import XModuleDescriptor, DescriptorSystem, NonEditableSettingsScope +from xblock.core import Scope +from xblock.core import XBlock class MakoDescriptorSystem(DescriptorSystem): @@ -34,20 +35,40 @@ class MakoModuleDescriptor(XModuleDescriptor): """ return { 'module': self, - 'editable_metadata_fields': self.editable_metadata_fields, + 'editable_metadata_fields': self.editable_metadata_fields } def get_html(self): return self.system.render_template( self.mako_template, self.get_context()) - # cdodge: encapsulate a means to expose "editable" metadata fields (i.e. not internal system metadata) @property def editable_metadata_fields(self): - fields = {} - for field, value in own_metadata(self).items(): - if field in self.system_metadata_fields: + inherited_metadata = getattr(self, '_inherited_metadata', {}) + metadata = {} + for field in self.fields: + + if field.scope != Scope.settings or isinstance(field.scope, NonEditableSettingsScope): continue - fields[field] = value - return fields + # We are not allowing editing of xblock tag and name fields at this time (for any component). + if field == XBlock.tags or field == XBlock.name: + continue + + inherited = False + default = False + value = getattr(self, field.name) + if field.name in self._model_data: + default = False + if field.name in inherited_metadata and self._model_data.get(field.name) == inherited_metadata.get( + field.name): + inherited = True + else: + default = True + + metadata[field.name] = {'field' : field, + 'value': value, + 'is_inherited': inherited, + 'is_default': default } + + return metadata diff --git a/common/lib/xmodule/xmodule/x_module.py b/common/lib/xmodule/xmodule/x_module.py index 1fd0b8e138..4a16548c6f 100644 --- a/common/lib/xmodule/xmodule/x_module.py +++ b/common/lib/xmodule/xmodule/x_module.py @@ -78,12 +78,18 @@ class HTMLSnippet(object): .format(self.__class__)) +class NonEditableSettingsScope(Scope): + pass + + class XModuleFields(object): display_name = String( + display_name="Display Name", help="Display name for this module", scope=Scope.settings, - default=None, + default=None ) + nonEditableSettingsScope = NonEditableSettingsScope(user=Scope.settings.user, block=Scope.settings.block) class XModule(XModuleFields, HTMLSnippet, XBlock): @@ -334,12 +340,6 @@ class XModuleDescriptor(XModuleFields, HTMLSnippet, ResourceTemplates, XBlock): # (like a practice problem). has_score = False - # cdodge: this is a list of metadata names which are 'system' metadata - # and should not be edited by an end-user - - system_metadata_fields = ['data_dir', 'published_date', 'published_by', 'is_draft', - 'discussion_id', 'xml_attributes'] - # A list of descriptor attributes that must be equal for the descriptors to # be equal equality_attributes = ('_model_data', 'location') diff --git a/common/lib/xmodule/xmodule/xml_module.py b/common/lib/xmodule/xmodule/xml_module.py index f9de929c05..bfbf12635a 100644 --- a/common/lib/xmodule/xmodule/xml_module.py +++ b/common/lib/xmodule/xmodule/xml_module.py @@ -6,10 +6,11 @@ import sys from collections import namedtuple from lxml import etree -from xblock.core import Object, Scope +from xblock.core import Object from xmodule.x_module import (XModuleDescriptor, policy_key) from xmodule.modulestore import Location from xmodule.modulestore.inheritance import own_metadata +from xmodule.x_module import XModuleFields log = logging.getLogger(__name__) @@ -84,7 +85,8 @@ class XmlDescriptor(XModuleDescriptor): Mixin class for standardized parsing of from xml """ - xml_attributes = Object(help="Map of unhandled xml attributes, used only for storage between import and export", default={}, scope=Scope.settings) + xml_attributes = Object(help="Map of unhandled xml attributes, used only for storage between import and export", + default={}, scope=XModuleFields.nonEditableSettingsScope) # Extension to append to filename paths filename_extension = 'xml' diff --git a/local-requirements.txt b/local-requirements.txt index 6d2a6270b7..5d04fe8f0b 100644 --- a/local-requirements.txt +++ b/local-requirements.txt @@ -6,4 +6,4 @@ # XBlock: # Might change frequently, so put it in local-requirements.txt, # but conceptually is an external package, so it is in a separate repo. --e git+https://github.com/edx/XBlock.git@2e0770ff#egg=XBlock +-e git+https://github.com/edx/XBlock.git@49181a1b#egg=XBlock From a9a234f0181997cae1ca82b076767172d87a6050 Mon Sep 17 00:00:00 2001 From: cahrens Date: Tue, 30 Apr 2013 11:19:20 -0400 Subject: [PATCH 03/14] Change xblock version. --- local-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/local-requirements.txt b/local-requirements.txt index 5d04fe8f0b..0ce7de0e73 100644 --- a/local-requirements.txt +++ b/local-requirements.txt @@ -6,4 +6,4 @@ # XBlock: # Might change frequently, so put it in local-requirements.txt, # but conceptually is an external package, so it is in a separate repo. --e git+https://github.com/edx/XBlock.git@49181a1b#egg=XBlock +-e git+https://github.com/edx/XBlock.git@5ce6f70a#egg=XBlock From 94e41319ee5d50b9ee9b985ac51a4ea895994ddb Mon Sep 17 00:00:00 2001 From: cahrens Date: Wed, 1 May 2013 09:09:33 -0400 Subject: [PATCH 04/14] Unit test, remove display_name for now so there is no visible change. --- common/lib/xmodule/xmodule/capa_module.py | 21 +++--- .../lib/xmodule/xmodule/discussion_module.py | 11 +-- common/lib/xmodule/xmodule/fields.py | 9 ++- common/lib/xmodule/xmodule/mako_module.py | 3 +- .../xmodule/xmodule/tests/test_mako_module.py | 73 +++++++++++++++++++ common/lib/xmodule/xmodule/x_module.py | 6 -- common/lib/xmodule/xmodule/xml_module.py | 4 +- 7 files changed, 100 insertions(+), 27 deletions(-) create mode 100644 common/lib/xmodule/xmodule/tests/test_mako_module.py diff --git a/common/lib/xmodule/xmodule/capa_module.py b/common/lib/xmodule/xmodule/capa_module.py index bc5014d75b..015bce4e85 100644 --- a/common/lib/xmodule/xmodule/capa_module.py +++ b/common/lib/xmodule/xmodule/capa_module.py @@ -17,7 +17,7 @@ from xmodule.x_module import XModule, XModuleFields from xmodule.raw_module import RawDescriptor from xmodule.exceptions import NotFoundError, ProcessingError from xblock.core import Scope, String, Boolean, Object -from .fields import Timedelta, Date, StringyInteger, StringyFloat +from .fields import Timedelta, Date, StringyInteger, StringyFloat, NON_EDITABLE_SETTINGS_SCOPE from xmodule.util.date_utils import time_to_datetime log = logging.getLogger("mitx.courseware") @@ -62,26 +62,23 @@ class ComplexEncoder(json.JSONEncoder): class CapaFields(object): attempts = StringyInteger(help="Number of attempts taken by the student on this problem", default=0, scope=Scope.user_state) - max_attempts = StringyInteger(display_name="Maximum Allowed Attempts", - help="Maximum number of attempts that a student is allowed", scope=Scope.settings) - due = Date(help="Date that this problem is due by", scope=XModuleFields.nonEditableSettingsScope) + max_attempts = StringyInteger(help="Maximum number of attempts that a student is allowed", scope=Scope.settings) + due = Date(help="Date that this problem is due by", scope=NON_EDITABLE_SETTINGS_SCOPE) graceperiod = Timedelta(help="Amount of time after the due date that submissions will be accepted", - scope=XModuleFields.nonEditableSettingsScope) - showanswer = String(display_name="Show Answer", - help="When to show the problem answer to the student", scope=Scope.settings, default="closed", + scope=NON_EDITABLE_SETTINGS_SCOPE) + showanswer = String(help="When to show the problem answer to the student", scope=Scope.settings, default="closed", values=["answered", "always", "attempted", "closed", "never"]) force_save_button = Boolean(help="Whether to force the save button to appear on the page", - scope=XModuleFields.nonEditableSettingsScope, default=False) - rerandomize = Randomization(display_name="Rerandomize", help="When to rerandomize the problem", - default="always", scope=Scope.settings) + scope=NON_EDITABLE_SETTINGS_SCOPE, default=False) + rerandomize = Randomization(help="When to rerandomize the problem", default="always", scope=Scope.settings) data = String(help="XML data for the problem", scope=Scope.content) correct_map = Object(help="Dictionary with the correctness of current student answers", scope=Scope.user_state, default={}) input_state = Object(help="Dictionary for maintaining the state of inputtypes", scope=Scope.user_state) student_answers = Object(help="Dictionary with the current student responses", scope=Scope.user_state) done = Boolean(help="Whether the student has answered the problem", scope=Scope.user_state) seed = StringyInteger(help="Random seed for this student", scope=Scope.user_state) - weight = StringyFloat(display_name="Problem Weight", help="How much to weight this problem by", scope=Scope.settings) - markdown = String(help="Markdown source of this module", scope=XModuleFields.nonEditableSettingsScope) + weight = StringyFloat(help="How much to weight this problem by", scope=Scope.settings) + markdown = String(help="Markdown source of this module", scope=NON_EDITABLE_SETTINGS_SCOPE) source_code = String(help="Source code for LaTeX and Word problems. This feature is not well-supported.", scope=Scope.settings) diff --git a/common/lib/xmodule/xmodule/discussion_module.py b/common/lib/xmodule/xmodule/discussion_module.py index 9c2681ef2d..b4409f5216 100644 --- a/common/lib/xmodule/xmodule/discussion_module.py +++ b/common/lib/xmodule/xmodule/discussion_module.py @@ -1,17 +1,18 @@ from pkg_resources import resource_string -from xmodule.x_module import XModule, XModuleFields +from .fields import NON_EDITABLE_SETTINGS_SCOPE +from xmodule.x_module import XModule from xmodule.raw_module import RawDescriptor from xmodule.editing_module import MetadataOnlyEditingDescriptor from xblock.core import String, Scope class DiscussionFields(object): - discussion_id = String(scope=XModuleFields.nonEditableSettingsScope) - discussion_category = String(display_name="Category Name", scope=Scope.settings) - discussion_target = String(display_name="Subcategory Name", scope=Scope.settings) + discussion_id = String(scope=NON_EDITABLE_SETTINGS_SCOPE) + discussion_category = String(scope=Scope.settings) + discussion_target = String(scope=Scope.settings) # We may choose to enable this in the future, but while Kevin is investigating.... - sort_key = String(scope=XModuleFields.nonEditableSettingsScope) + sort_key = String(scope=NON_EDITABLE_SETTINGS_SCOPE) class DiscussionModule(DiscussionFields, XModule): diff --git a/common/lib/xmodule/xmodule/fields.py b/common/lib/xmodule/xmodule/fields.py index 3d56b7941e..b79accb2b3 100644 --- a/common/lib/xmodule/xmodule/fields.py +++ b/common/lib/xmodule/xmodule/fields.py @@ -7,11 +7,18 @@ from xblock.core import ModelType import datetime import dateutil.parser -from xblock.core import Integer, Float, Boolean +from xblock.core import Integer, Float, Boolean, Scope log = logging.getLogger(__name__) +class NonEditableSettingsScope(Scope): + pass + +# Same scope as Settings.scope, but not intended to be edited by users (in Studio). +NON_EDITABLE_SETTINGS_SCOPE = NonEditableSettingsScope(user=Scope.settings.user, block=Scope.settings.block) + + class Date(ModelType): ''' Date fields know how to parse and produce json (iso) compatible formats. diff --git a/common/lib/xmodule/xmodule/mako_module.py b/common/lib/xmodule/xmodule/mako_module.py index e01a03e309..02db0c602f 100644 --- a/common/lib/xmodule/xmodule/mako_module.py +++ b/common/lib/xmodule/xmodule/mako_module.py @@ -1,4 +1,5 @@ -from .x_module import XModuleDescriptor, DescriptorSystem, NonEditableSettingsScope +from .x_module import XModuleDescriptor, DescriptorSystem +from .fields import NonEditableSettingsScope from xblock.core import Scope from xblock.core import XBlock diff --git a/common/lib/xmodule/xmodule/tests/test_mako_module.py b/common/lib/xmodule/xmodule/tests/test_mako_module.py new file mode 100644 index 0000000000..7686e2a69e --- /dev/null +++ b/common/lib/xmodule/xmodule/tests/test_mako_module.py @@ -0,0 +1,73 @@ +from xmodule.x_module import XModuleFields +from xblock.core import Scope, String, Object +from xmodule.fields import Date, StringyInteger, NON_EDITABLE_SETTINGS_SCOPE +from xmodule.mako_module import MakoModuleDescriptor +import unittest +from . import test_system +from mock import Mock + + +class TestFields(object): + # Will be returned by editable_metadata_fields because Scope.settings. + max_attempts = StringyInteger(scope=Scope.settings) + # Will not be returned by editable_metadata_fields because declared as non-editable Scope.settings. + due = Date(scope=NON_EDITABLE_SETTINGS_SCOPE) + # Will not be returned by editable_metadata_fields because is not Scope.settings. + student_answers = Object(scope=Scope.user_state) + # Will be returned, and can override the inherited value from XModule. + display_name = String(scope=Scope.settings) + + +class EditableMetadataFieldsTest(unittest.TestCase): + + def test_display_name_field(self): + editable_fields = self.get_mako_editable_fields({}) + # Tests that the xblock fields (currently tags and name) get filtered out. + self.assertEqual(1, len(editable_fields), "Expected only 1 editable field for mako descriptor.") + self.assert_display_name_default(editable_fields) + + def test_override_default(self): + # Tests that is_default is correct when a value overrides the default. + editable_fields = self.get_mako_editable_fields({'display_name': 'foo'}) + display_name = editable_fields['display_name'] + self.assertFalse(display_name['is_default']) + self.assertEqual('foo', display_name['value']) + + def test_additional_field(self): + editable_fields = self.get_module_editable_fields({'max_attempts' : '7'}) + self.assertEqual(2, len(editable_fields)) + self.assert_field_values(editable_fields, 'max_attempts', TestFields.max_attempts, False, False, 7) + self.assert_display_name_default(editable_fields) + + editable_fields = self.get_module_editable_fields({}) + self.assert_field_values(editable_fields, 'max_attempts', TestFields.max_attempts, True, False, None) + + def test_inherited_field(self): + editable_fields = self.get_module_editable_fields({'display_name' : 'inherited'}) + self.assert_field_values(editable_fields, 'display_name', XModuleFields.display_name, False, True, 'inherited') + + # Start of helper methods + def get_mako_editable_fields(self, model_data): + system = test_system() + system.render_template = Mock(return_value="
    Test Template HTML
    ") + return MakoModuleDescriptor(system=system, location=None, model_data=model_data).editable_metadata_fields + + def get_module_editable_fields(self, model_data): + class TestModuleDescriptor(TestFields, MakoModuleDescriptor): + pass + + system = test_system() + system.render_template = Mock(return_value="
    Test Template HTML
    ") + descriptor = TestModuleDescriptor(system=system, location=None, model_data=model_data) + descriptor._inherited_metadata = {'display_name' : 'inherited'} + return descriptor.editable_metadata_fields + + def assert_display_name_default(self, editable_fields): + self.assert_field_values(editable_fields, 'display_name', XModuleFields.display_name, True, False, None) + + def assert_field_values(self, editable_fields, name, field, is_default, is_inherited, value): + test_field = editable_fields[name] + self.assertEqual(field, test_field['field']) + self.assertEqual(is_default, test_field['is_default']) + self.assertEqual(is_inherited, test_field['is_inherited']) + self.assertEqual(value, test_field['value']) diff --git a/common/lib/xmodule/xmodule/x_module.py b/common/lib/xmodule/xmodule/x_module.py index 4a16548c6f..04ffcc6092 100644 --- a/common/lib/xmodule/xmodule/x_module.py +++ b/common/lib/xmodule/xmodule/x_module.py @@ -78,18 +78,12 @@ class HTMLSnippet(object): .format(self.__class__)) -class NonEditableSettingsScope(Scope): - pass - - class XModuleFields(object): display_name = String( - display_name="Display Name", help="Display name for this module", scope=Scope.settings, default=None ) - nonEditableSettingsScope = NonEditableSettingsScope(user=Scope.settings.user, block=Scope.settings.block) class XModule(XModuleFields, HTMLSnippet, XBlock): diff --git a/common/lib/xmodule/xmodule/xml_module.py b/common/lib/xmodule/xmodule/xml_module.py index bfbf12635a..a34b0e5078 100644 --- a/common/lib/xmodule/xmodule/xml_module.py +++ b/common/lib/xmodule/xmodule/xml_module.py @@ -10,7 +10,7 @@ from xblock.core import Object from xmodule.x_module import (XModuleDescriptor, policy_key) from xmodule.modulestore import Location from xmodule.modulestore.inheritance import own_metadata -from xmodule.x_module import XModuleFields +from .fields import NON_EDITABLE_SETTINGS_SCOPE log = logging.getLogger(__name__) @@ -86,7 +86,7 @@ class XmlDescriptor(XModuleDescriptor): """ xml_attributes = Object(help="Map of unhandled xml attributes, used only for storage between import and export", - default={}, scope=XModuleFields.nonEditableSettingsScope) + default={}, scope=NON_EDITABLE_SETTINGS_SCOPE) # Extension to append to filename paths filename_extension = 'xml' From 1c8cef32ef6fb63d29830fe3f0ba63e4ee6114ba Mon Sep 17 00:00:00 2001 From: cahrens Date: Wed, 1 May 2013 09:30:20 -0400 Subject: [PATCH 05/14] Remove unused import. --- common/lib/xmodule/xmodule/capa_module.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/lib/xmodule/xmodule/capa_module.py b/common/lib/xmodule/xmodule/capa_module.py index 015bce4e85..d4db445ea8 100644 --- a/common/lib/xmodule/xmodule/capa_module.py +++ b/common/lib/xmodule/xmodule/capa_module.py @@ -13,7 +13,7 @@ from capa.responsetypes import StudentInputError,\ ResponseError, LoncapaProblemError from capa.util import convert_files_to_filenames from .progress import Progress -from xmodule.x_module import XModule, XModuleFields +from xmodule.x_module import XModule from xmodule.raw_module import RawDescriptor from xmodule.exceptions import NotFoundError, ProcessingError from xblock.core import Scope, String, Boolean, Object From 13fe9c11cb93c46b57f07376569586adbb62eb32 Mon Sep 17 00:00:00 2001 From: cahrens Date: Wed, 1 May 2013 09:33:35 -0400 Subject: [PATCH 06/14] Merged with master. --- .gitignore | 1 + .../contentstore/tests/test_contentstore.py | 13 +- cms/djangoapps/contentstore/views.py | 25 ++- cms/templates/base.html | 2 +- cms/templates/settings.html | 2 +- common/lib/capa/capa/calc.py | 27 ++-- .../lib/capa/capa/tests/test_responsetypes.py | 108 +++++++++++-- .../lib/xmodule/xmodule/modulestore/draft.py | 14 +- .../lib/xmodule/xmodule/modulestore/mongo.py | 3 +- .../xmodule/modulestore/store_utilities.py | 13 +- .../xmodule/templates/about/overview.yaml | 53 +++++++ .../templates/problem/latex_problem.yaml | 2 +- common/static/images/firecode.jpg | Bin 0 -> 67337 bytes common/static/images/high_pass_filter.png | Bin 0 -> 48150 bytes common/static/images/mit_dome.jpg | Bin 0 -> 37935 bytes common/static/images/pl-course.png | Bin 0 -> 40938 bytes common/static/images/pl-faculty.png | Bin 0 -> 9137 bytes common/static/images/simple_graph.png | Bin 0 -> 15107 bytes common/static/images/voltage_divider.png | Bin 0 -> 27331 bytes conf/locale/config | 2 +- conf/locale/en/LC_MESSAGES/messages.po | 1 + github-requirements.txt | 5 + i18n/dummy.py | 6 +- i18n/execute.py | 86 +++++++++++ i18n/extract.py | 145 ++++++++++++++++++ i18n/generate.py | 64 ++++++++ i18n/make_dummy.py | 49 +++--- i18n/tests/__init__.py | 4 + i18n/tests/test_converter.py | 42 +++++ i18n/tests/test_dummy.py | 50 ++++++ i18n/tests/test_extract.py | 85 ++++++++++ i18n/tests/test_generate.py | 61 ++++++++ i18n/update.py | 110 ------------- .../sass/multicourse/_course_about.scss | 4 +- lms/templates/static_templates/contact.html | 3 + local-requirements.txt | 5 - rakefile | 35 +++++ requirements.txt | 5 +- 38 files changed, 825 insertions(+), 200 deletions(-) create mode 100644 common/lib/xmodule/xmodule/templates/about/overview.yaml create mode 100644 common/static/images/firecode.jpg create mode 100644 common/static/images/high_pass_filter.png create mode 100644 common/static/images/mit_dome.jpg create mode 100644 common/static/images/pl-course.png create mode 100644 common/static/images/pl-faculty.png create mode 100644 common/static/images/simple_graph.png create mode 100644 common/static/images/voltage_divider.png create mode 100644 conf/locale/en/LC_MESSAGES/messages.po create mode 100644 i18n/execute.py create mode 100755 i18n/extract.py create mode 100755 i18n/generate.py create mode 100644 i18n/tests/__init__.py create mode 100644 i18n/tests/test_converter.py create mode 100644 i18n/tests/test_dummy.py create mode 100644 i18n/tests/test_extract.py create mode 100644 i18n/tests/test_generate.py delete mode 100755 i18n/update.py diff --git a/.gitignore b/.gitignore index 87a0778a6f..d01baf055a 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ :2e# .AppleDouble database.sqlite +private-requirements.txt courseware/static/js/mathjax/* flushdb.sh build diff --git a/cms/djangoapps/contentstore/tests/test_contentstore.py b/cms/djangoapps/contentstore/tests/test_contentstore.py index ed95d81d67..07b7032e60 100644 --- a/cms/djangoapps/contentstore/tests/test_contentstore.py +++ b/cms/djangoapps/contentstore/tests/test_contentstore.py @@ -264,13 +264,13 @@ class ContentStoreToyCourseTest(ModuleStoreTestCase): def test_delete(self): import_from_xml(modulestore(), 'common/test/data/', ['full']) - module_store = modulestore('direct') + direct_store = modulestore('direct') - sequential = module_store.get_item(Location(['i4x', 'edX', 'full', 'sequential', 'Administrivia_and_Circuit_Elements', None])) + sequential = direct_store.get_item(Location(['i4x', 'edX', 'full', 'sequential', 'Administrivia_and_Circuit_Elements', None])) - chapter = module_store.get_item(Location(['i4x', 'edX', 'full', 'chapter', 'Week_1', None])) + chapter = direct_store.get_item(Location(['i4x', 'edX', 'full', 'chapter', 'Week_1', None])) - # make sure the parent no longer points to the child object which was deleted + # make sure the parent points to the child object which is to be deleted self.assertTrue(sequential.location.url() in chapter.children) self.client.post( @@ -281,18 +281,19 @@ class ContentStoreToyCourseTest(ModuleStoreTestCase): found = False try: - module_store.get_item(Location(['i4x', 'edX', 'full', 'sequential', 'Administrivia_and_Circuit_Elements', None])) + direct_store.get_item(Location(['i4x', 'edX', 'full', 'sequential', 'Administrivia_and_Circuit_Elements', None])) found = True except ItemNotFoundError: pass self.assertFalse(found) - chapter = module_store.get_item(Location(['i4x', 'edX', 'full', 'chapter', 'Week_1', None])) + chapter = direct_store.get_item(Location(['i4x', 'edX', 'full', 'chapter', 'Week_1', None])) # make sure the parent no longer points to the child object which was deleted self.assertFalse(sequential.location.url() in chapter.children) + def test_about_overrides(self): ''' This test case verifies that a course can use specialized override for about data, e.g. /about/Fall_2012/effort.html diff --git a/cms/djangoapps/contentstore/views.py b/cms/djangoapps/contentstore/views.py index 6ce17d04aa..824d2119f1 100644 --- a/cms/djangoapps/contentstore/views.py +++ b/cms/djangoapps/contentstore/views.py @@ -615,25 +615,14 @@ def delete_item(request): delete_children = request.POST.get('delete_children', False) delete_all_versions = request.POST.get('delete_all_versions', False) - item = modulestore().get_item(item_location) + store = modulestore() - store = get_modulestore(item_loc) - - # @TODO: this probably leaves draft items dangling. My preferance would be for the semantic to be - # if item.location.revision=None, then delete both draft and published version - # if caller wants to only delete the draft than the caller should put item.location.revision='draft' + item = store.get_item(item_location) if delete_children: - _xmodule_recurse(item, lambda i: store.delete_item(i.location)) + _xmodule_recurse(item, lambda i: store.delete_item(i.location, delete_all_versions)) else: - store.delete_item(item.location) - - # cdodge: this is a bit of a hack until I can talk with Cale about the - # semantics of delete_item whereby the store is draft aware. Right now calling - # delete_item on a vertical tries to delete the draft version leaving the - # requested delete to never occur - if item.location.revision is None and item.location.category == 'vertical' and delete_all_versions: - modulestore('direct').delete_item(item.location) + store.delete_item(item.location, delete_all_versions) # cdodge: we need to remove our parent's pointer to us so that it is no longer dangling if delete_all_versions: @@ -1494,6 +1483,12 @@ def create_new_course(request): new_course = modulestore('direct').clone_item(template, dest_location) + # clone a default 'about' module as well + + about_template_location = Location(['i4x', 'edx', 'templates', 'about', 'overview']) + dest_about_location = dest_location._replace(category='about', name='overview') + modulestore('direct').clone_item(about_template_location, dest_about_location) + if display_name is not None: new_course.display_name = display_name diff --git a/cms/templates/base.html b/cms/templates/base.html index 65e08b3cc5..3f286c2582 100644 --- a/cms/templates/base.html +++ b/cms/templates/base.html @@ -30,7 +30,7 @@ <%include file="courseware_vendor_js.html"/> - + diff --git a/cms/templates/settings.html b/cms/templates/settings.html index 3923c0f905..0a647c632e 100644 --- a/cms/templates/settings.html +++ b/cms/templates/settings.html @@ -179,7 +179,7 @@ from contentstore import utils
  • - Introductions, prerequisites, FAQs that are used on your course summary page + Introductions, prerequisites, FAQs that are used on your course summary page (formatted in HTML)
  • diff --git a/common/lib/capa/capa/calc.py b/common/lib/capa/capa/calc.py index c3fe6b656b..bb1fb97153 100644 --- a/common/lib/capa/capa/calc.py +++ b/common/lib/capa/capa/calc.py @@ -24,7 +24,9 @@ default_functions = {'sin': numpy.sin, 'arccos': numpy.arccos, 'arcsin': numpy.arcsin, 'arctan': numpy.arctan, - 'abs': numpy.abs + 'abs': numpy.abs, + 'fact': math.factorial, + 'factorial': math.factorial } default_variables = {'j': numpy.complex(0, 1), 'e': numpy.e, @@ -112,18 +114,18 @@ def evaluator(variables, functions, string, cs=False): return float('nan') ops = {"^": operator.pow, - "*": operator.mul, - "/": operator.truediv, - "+": operator.add, - "-": operator.sub, - } + "*": operator.mul, + "/": operator.truediv, + "+": operator.add, + "-": operator.sub, + } # We eliminated extreme ones, since they're rarely used, and potentially # confusing. They may also conflict with variables if we ever allow e.g. # 5R instead of 5*R suffixes = {'%': 0.01, 'k': 1e3, 'M': 1e6, 'G': 1e9, - 'T': 1e12, # 'P':1e15,'E':1e18,'Z':1e21,'Y':1e24, - 'c': 1e-2, 'm': 1e-3, 'u': 1e-6, - 'n': 1e-9, 'p': 1e-12} # ,'f':1e-15,'a':1e-18,'z':1e-21,'y':1e-24} + 'T': 1e12, # 'P':1e15,'E':1e18,'Z':1e21,'Y':1e24, + 'c': 1e-2, 'm': 1e-3, 'u': 1e-6, + 'n': 1e-9, 'p': 1e-12} # ,'f':1e-15,'a':1e-18,'z':1e-21,'y':1e-24} def super_float(text): ''' Like float, but with si extensions. 1k goes to 1000''' @@ -246,4 +248,9 @@ if __name__ == '__main__': print evaluator({}, {}, "5+1*j") print evaluator({}, {}, "j||1") print evaluator({}, {}, "e^(j*pi)") - print evaluator({}, {}, "5+7 QWSEKO") + print evaluator({}, {}, "fact(5)") + print evaluator({}, {}, "factorial(5)") + try: + print evaluator({}, {}, "5+7 QWSEKO") + except UndefinedVariable: + print "Successfully caught undefined variable" diff --git a/common/lib/capa/capa/tests/test_responsetypes.py b/common/lib/capa/capa/tests/test_responsetypes.py index bf64d3cc69..7a43fff4c9 100644 --- a/common/lib/capa/capa/tests/test_responsetypes.py +++ b/common/lib/capa/capa/tests/test_responsetypes.py @@ -7,6 +7,7 @@ from datetime import datetime import json from nose.plugins.skip import SkipTest import os +import random import unittest import textwrap @@ -14,7 +15,7 @@ from . import test_system import capa.capa_problem as lcp from capa.responsetypes import LoncapaProblemError, \ - StudentInputError, ResponseError + StudentInputError, ResponseError from capa.correctmap import CorrectMap from capa.util import convert_files_to_filenames from capa.xqueue_interface import dateformat @@ -33,10 +34,13 @@ class ResponseTest(unittest.TestCase): xml = self.xml_factory.build_xml(**kwargs) return lcp.LoncapaProblem(xml, '1', system=test_system) - def assert_grade(self, problem, submission, expected_correctness): + def assert_grade(self, problem, submission, expected_correctness, msg=None): input_dict = {'1_2_1': submission} correct_map = problem.grade_answers(input_dict) - self.assertEquals(correct_map.get_correctness('1_2_1'), expected_correctness) + if msg is None: + self.assertEquals(correct_map.get_correctness('1_2_1'), expected_correctness) + else: + self.assertEquals(correct_map.get_correctness('1_2_1'), expected_correctness, msg) def assert_answer_format(self, problem): answers = problem.get_question_answers() @@ -357,6 +361,83 @@ class FormulaResponseTest(ResponseTest): self.assert_grade(problem, '2*x', 'correct') self.assert_grade(problem, '3*x', 'incorrect') + def test_parallel_resistors(self): + """Test parallel resistors""" + sample_dict = {'R1': (10, 10), 'R2': (2, 2), 'R3': (5, 5), 'R4': (1, 1)} + + # Test problem + problem = self.build_problem(sample_dict=sample_dict, + num_samples=10, + tolerance=0.01, + answer="R1||R2") + # Expect answer to be marked correct + input_formula = "R1||R2" + self.assert_grade(problem, input_formula, "correct") + + # Expect random number to be marked incorrect + input_formula = "13" + self.assert_grade(problem, input_formula, "incorrect") + + # Expect incorrect answer marked incorrect + input_formula = "R3||R4" + self.assert_grade(problem, input_formula, "incorrect") + + def test_default_variables(self): + """Test the default variables provided in common/lib/capa/capa/calc.py""" + # which are: j (complex number), e, pi, k, c, T, q + + # Sample x in the range [-10,10] + sample_dict = {'x': (-10, 10)} + default_variables = [('j', 2, 3), ('e', 2, 3), ('pi', 2, 3), ('c', 2, 3), ('T', 2, 3), + ('k', 2 * 10 ** 23, 3 * 10 ** 23), # note k = scipy.constants.k = 1.3806488e-23 + ('q', 2 * 10 ** 19, 3 * 10 ** 19)] # note k = scipy.constants.e = 1.602176565e-19 + for (var, cscalar, iscalar) in default_variables: + # The expected solution is numerically equivalent to cscalar*var + correct = '{0}*x*{1}'.format(cscalar, var) + incorrect = '{0}*x*{1}'.format(iscalar, var) + problem = self.build_problem(sample_dict=sample_dict, + num_samples=10, + tolerance=0.01, + answer=correct) + + # Expect that the inputs are graded correctly + self.assert_grade(problem, correct, 'correct', + msg="Failed on variable {0}; the given, correct answer was {1} but graded 'incorrect'".format(var, correct)) + self.assert_grade(problem, incorrect, 'incorrect', + msg="Failed on variable {0}; the given, incorrect answer was {1} but graded 'correct'".format(var, incorrect)) + + def test_default_functions(self): + """Test the default functions provided in common/lib/capa/capa/calc.py""" + # which are: sin, cos, tan, sqrt, log10, log2, ln, + # arccos, arcsin, arctan, abs, + # fact, factorial + + w = random.randint(3, 10) + sample_dict = {'x': (-10, 10), # Sample x in the range [-10,10] + 'y': (1, 10), # Sample y in the range [1,10] - logs, arccos need positive inputs + 'z': (-1, 1), # Sample z in the range [1,10] - for arcsin, arctan + 'w': (w, w)} # Sample w is a random, positive integer - factorial needs a positive, integer input, + # and the way formularesponse is defined, we can only specify a float range + + default_functions = [('sin', 2, 3, 'x'), ('cos', 2, 3, 'x'), ('tan', 2, 3, 'x'), ('sqrt', 2, 3, 'y'), ('log10', 2, 3, 'y'), + ('log2', 2, 3, 'y'), ('ln', 2, 3, 'y'), ('arccos', 2, 3, 'z'), ('arcsin', 2, 3, 'z'), ('arctan', 2, 3, 'x'), + ('abs', 2, 3, 'x'), ('fact', 2, 3, 'w'), ('factorial', 2, 3, 'w')] + for (func, cscalar, iscalar, var) in default_functions: + print 'func is: {0}'.format(func) + # The expected solution is numerically equivalent to cscalar*func(var) + correct = '{0}*{1}({2})'.format(cscalar, func, var) + incorrect = '{0}*{1}({2})'.format(iscalar, func, var) + problem = self.build_problem(sample_dict=sample_dict, + num_samples=10, + tolerance=0.01, + answer=correct) + + # Expect that the inputs are graded correctly + self.assert_grade(problem, correct, 'correct', + msg="Failed on function {0}; the given, correct answer was {1} but graded 'incorrect'".format(func, correct)) + self.assert_grade(problem, incorrect, 'incorrect', + msg="Failed on function {0}; the given, incorrect answer was {1} but graded 'correct'".format(func, incorrect)) + class StringResponseTest(ResponseTest): from response_xml_factory import StringResponseXMLFactory @@ -904,14 +985,13 @@ class CustomResponseTest(ResponseTest): with self.assertRaises(ResponseError): problem.grade_answers({'1_2_1': '42'}) - def test_module_imports_inline(self): ''' Check that the correct modules are available to custom response scripts ''' - for module_name in ['random', 'numpy', 'math', 'scipy', + for module_name in ['random', 'numpy', 'math', 'scipy', 'calc', 'eia', 'chemcalc', 'chemtools', 'miller', 'draganddrop']: @@ -921,26 +1001,25 @@ class CustomResponseTest(ResponseTest): script = textwrap.dedent(''' correct[0] = 'correct' assert('%s' in globals())''' % module_name) - + # Create the problem problem = self.build_problem(answer=script) - # Expect that we can grade an answer without + # Expect that we can grade an answer without # getting an exception try: problem.grade_answers({'1_2_1': '42'}) except ResponseError: - self.fail("Could not use name '%s' in custom response" - % module_name) - + self.fail("Could not use name '{0}s' in custom response".format(module_name)) + def test_module_imports_function(self): ''' Check that the correct modules are available to custom response scripts ''' - for module_name in ['random', 'numpy', 'math', 'scipy', + for module_name in ['random', 'numpy', 'math', 'scipy', 'calc', 'eia', 'chemcalc', 'chemtools', 'miller', 'draganddrop']: @@ -951,18 +1030,17 @@ class CustomResponseTest(ResponseTest): def check_func(expect, answer_given): assert('%s' in globals()) return True''' % module_name) - + # Create the problem problem = self.build_problem(script=script, cfn="check_func") - # Expect that we can grade an answer without + # Expect that we can grade an answer without # getting an exception try: problem.grade_answers({'1_2_1': '42'}) except ResponseError: - self.fail("Could not use name '%s' in custom response" - % module_name) + self.fail("Could not use name '{0}s' in custom response".format(module_name)) class SchematicResponseTest(ResponseTest): diff --git a/common/lib/xmodule/xmodule/modulestore/draft.py b/common/lib/xmodule/xmodule/modulestore/draft.py index 43eb050129..c3f1b23688 100644 --- a/common/lib/xmodule/xmodule/modulestore/draft.py +++ b/common/lib/xmodule/xmodule/modulestore/draft.py @@ -13,6 +13,12 @@ def as_draft(location): """ return Location(location)._replace(revision=DRAFT) +def as_published(location): + """ + Returns the Location that is the published version for `location` + """ + return Location(location)._replace(revision=None) + def wrap_draft(item): """ @@ -159,13 +165,17 @@ class DraftModuleStore(ModuleStoreBase): return super(DraftModuleStore, self).update_metadata(draft_loc, metadata) - def delete_item(self, location): + def delete_item(self, location, delete_all_versions=False): """ Delete an item from this modulestore location: Something that can be passed to Location """ - return super(DraftModuleStore, self).delete_item(as_draft(location)) + super(DraftModuleStore, self).delete_item(as_draft(location)) + if delete_all_versions: + super(DraftModuleStore, self).delete_item(as_published(location)) + + return def get_parent_locations(self, location, course_id): '''Find all locations that are the parents of this location. Needed diff --git a/common/lib/xmodule/xmodule/modulestore/mongo.py b/common/lib/xmodule/xmodule/modulestore/mongo.py index 28ea1f2659..c8256422f8 100644 --- a/common/lib/xmodule/xmodule/modulestore/mongo.py +++ b/common/lib/xmodule/xmodule/modulestore/mongo.py @@ -694,11 +694,12 @@ class MongoModuleStore(ModuleStoreBase): self.refresh_cached_metadata_inheritance_tree(loc) self.fire_updated_modulestore_signal(get_course_id_no_run(Location(location)), Location(location)) - def delete_item(self, location): + def delete_item(self, location, delete_all_versions=False): """ Delete an item from this modulestore location: Something that can be passed to Location + delete_all_versions: is here because the DraftMongoModuleStore needs it and we need to keep the interface the same. It is unused. """ # VS[compat] cdodge: This is a hack because static_tabs also have references from the course module, so # if we add one then we need to also add it to the policy information (i.e. metadata) diff --git a/common/lib/xmodule/xmodule/modulestore/store_utilities.py b/common/lib/xmodule/xmodule/modulestore/store_utilities.py index e90613d0da..6beffcb71d 100644 --- a/common/lib/xmodule/xmodule/modulestore/store_utilities.py +++ b/common/lib/xmodule/xmodule/modulestore/store_utilities.py @@ -13,10 +13,19 @@ def clone_course(modulestore, contentstore, source_location, dest_location, dele if not modulestore.has_item(dest_location): raise Exception("An empty course at {0} must have already been created. Aborting...".format(dest_location)) - # verify that the dest_location really is an empty course, which means only one + # verify that the dest_location really is an empty course, which means only one with an optional 'overview' dest_modules = modulestore.get_items([dest_location.tag, dest_location.org, dest_location.course, None, None, None]) - if len(dest_modules) != 1: + basically_empty = True + for module in dest_modules: + if module.location.category == 'course' or (module.location.category == 'about' + and module.location.name == 'overview'): + continue + + basically_empty = False + break + + if not basically_empty: raise Exception("Course at destination {0} is not an empty course. You can only clone into an empty course. Aborting...".format(dest_location)) # check to see if the source course is actually there diff --git a/common/lib/xmodule/xmodule/templates/about/overview.yaml b/common/lib/xmodule/xmodule/templates/about/overview.yaml new file mode 100644 index 0000000000..0031ebffaf --- /dev/null +++ b/common/lib/xmodule/xmodule/templates/about/overview.yaml @@ -0,0 +1,53 @@ +--- +metadata: + display_name: overview + +data: | +
    +

    About This Course

    +

    Include your long course description here. The long course description should contain 150-400 words.

    + +

    This is paragraph 2 of the long course description. Add more paragraphs as needed. Make sure to enclose them in paragraph tags.

    +
    + +
    +

    Prerequisites

    +

    Add information about course prerequisites here.

    +
    + +
    +

    Course Staff

    +
    +
    + +
    + +

    Staff Member #1

    +

    Biography of instructor/staff member #1

    +
    + +
    +
    + +
    + +

    Staff Member #2

    +

    Biography of instructor/staff member #2

    +
    +
    + +
    +
    +

    Frequently Asked Questions

    +
    +

    Do I need to buy a textbook?

    +

    No, a free online version of Chemistry: Principles, Patterns, and Applications, First Edition by Bruce Averill and Patricia Eldredge will be available, though you can purchase a printed version (published by FlatWorld Knowledge) if you’d like.

    +
    + +
    +

    Question #2

    +

    Your answer would be displayed here.

    +
    +
    +
    +children: [] diff --git a/common/lib/xmodule/xmodule/templates/problem/latex_problem.yaml b/common/lib/xmodule/xmodule/templates/problem/latex_problem.yaml index 303e439439..82d7e8c1ae 100644 --- a/common/lib/xmodule/xmodule/templates/problem/latex_problem.yaml +++ b/common/lib/xmodule/xmodule/templates/problem/latex_problem.yaml @@ -188,7 +188,7 @@ data: |

    Include image by using the edXxml macro:

    - +

    Example show/hide explanation

    diff --git a/common/static/images/firecode.jpg b/common/static/images/firecode.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a20206559b523058767940eb9b7c5773367b0686 GIT binary patch literal 67337 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ⅅ62g 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 gZ|@p0^HAS-&;to{T(O8@`> literal 0 HcmV?d00001 diff --git a/common/static/images/pl-course.png b/common/static/images/pl-course.png new file mode 100644 index 0000000000000000000000000000000000000000..1a3da9e6317c1921b814883c27f5611ddfe95434 GIT binary patch literal 40938 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 literal 0 HcmV?d00001 diff --git a/common/static/images/simple_graph.png b/common/static/images/simple_graph.png new file mode 100644 index 0000000000000000000000000000000000000000..f2557950253ec14cd689de68223af5c5aed1ab46 GIT binary patch literal 15107 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, YEAR. +""" + +def fix_header(po): + """ + Replace default headers with edX headers + """ + header = po.header + fixes = ( + ('SOME DESCRIPTIVE TITLE', 'edX translation file'), + ('Translations template for PROJECT.', 'edX translation file'), + ('YEAR', '%s' % datetime.utcnow().year), + ('ORGANIZATION', 'edX'), + ("THE PACKAGE'S COPYRIGHT HOLDER", "EdX"), + ('This file is distributed under the same license as the PROJECT project.', + 'This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE.'), + ('This file is distributed under the same license as the PACKAGE package.', + 'This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE.'), + ('FIRST AUTHOR ', + 'EdX Team ') + ) + for (src, dest) in fixes: + header = header.replace(src, dest) + po.header = header + +# By default, django-admin.py makemessages creates this metadata: +""" +{u'PO-Revision-Date': u'YEAR-MO-DA HO:MI+ZONE', + u'Language': u'', + u'Content-Transfer-Encoding': u'8bit', + u'Project-Id-Version': u'PACKAGE VERSION', + u'Report-Msgid-Bugs-To': u'', + u'Last-Translator': u'FULL NAME ', + u'Language-Team': u'LANGUAGE ', + u'POT-Creation-Date': u'2013-04-25 14:14-0400', + u'Content-Type': u'text/plain; charset=UTF-8', + u'MIME-Version': u'1.0'} +""" + +def fix_metadata(po): + """ + Replace default metadata with edX metadata + """ + fixes = {'PO-Revision-Date': datetime.utcnow(), + 'Report-Msgid-Bugs-To': 'translation_team@edx.org', + 'Project-Id-Version': '0.1a', + 'Language' : 'en', + 'Language-Team': 'translation team ', + } + if po.metadata.has_key('Last-Translator'): + del po.metadata['Last-Translator'] + po.metadata.update(fixes) + +def strip_key_strings(po): + """ + Removes all entries in PO which are key strings. + These entries should appear only in messages.po, not in any other po files. + """ + newlist = [entry for entry in po if not is_key_string(entry.msgid)] + del po[:] + po += newlist + +def is_key_string(string): + """ + returns True if string is a key string. + Key strings begin with underscore. + """ + return len(string)>1 and string[0]=='_' + +if __name__ == '__main__': + main() diff --git a/i18n/generate.py b/i18n/generate.py new file mode 100755 index 0000000000..ddbaadfa70 --- /dev/null +++ b/i18n/generate.py @@ -0,0 +1,64 @@ +#!/usr/bin/python + +""" + See https://edx-wiki.atlassian.net/wiki/display/ENG/PO+File+workflow + + + This task merges and compiles the human-readable .pofiles on the + local filesystem into machine-readable .mofiles. This is typically + necessary as part of the build process since these .mofiles are + needed by Django when serving the web app. + + The configuration file (in mitx/conf/locale/config) specifies which + languages to generate. +""" + +import os +from execute import execute, get_config, messages_dir, remove_file, \ + BASE_DIR, LOG, SOURCE_LOCALE + +def merge(locale, target='django.po'): + """ + For the given locale, merge django-partial.po, messages.po, mako.po -> django.po + """ + LOG.info('Merging locale={0}'.format(locale)) + locale_directory = messages_dir(locale) + files_to_merge = ('django-partial.po', 'messages.po', 'mako.po') + validate_files(locale_directory, files_to_merge) + + # merged file is merged.po + merge_cmd = 'msgcat -o merged.po ' + ' '.join(files_to_merge) + execute(merge_cmd, working_directory=locale_directory) + + # rename merged.po -> django.po (default) + merged_filename = os.path.join(locale_directory, 'merged.po') + django_filename = os.path.join(locale_directory, target) + os.rename(merged_filename, django_filename) # can't overwrite file on Windows + +def validate_files(dir, files_to_merge): + """ + Asserts that the given files exist. + files_to_merge is a list of file names (no directories). + dir is the directory in which the files should appear. + raises an Exception if any of the files are not in dir. + """ + for path in files_to_merge: + pathname = os.path.join(dir, path) + if not os.path.exists(pathname): + raise Exception("File not found: {0}".format(pathname)) + +def main (): + configuration = get_config() + if configuration == None: + LOG.warn('Configuration file not found, using only English.') + locales = (SOURCE_LOCALE,) + else: + locales = configuration['locales'] + for locale in locales: + merge(locale) + + compile_cmd = 'django-admin.py compilemessages' + execute(compile_cmd, working_directory=BASE_DIR) + +if __name__ == '__main__': + main() diff --git a/i18n/make_dummy.py b/i18n/make_dummy.py index 4ccfb0d5f1..c8dcde861a 100755 --- a/i18n/make_dummy.py +++ b/i18n/make_dummy.py @@ -18,20 +18,12 @@ import os, sys import polib from dummy import Dummy +from execute import create_dir_if_necessary -# Dummy language -# two letter language codes reference: -# see http://www.loc.gov/standards/iso639-2/php/code_list.php -# -# Django will not localize in languages that django itself has not been -# localized for. So we are using a well-known language: 'fr'. - -OUT_LANG = 'fr' - -def main(file): +def main(file, locale): """ Takes a source po file, reads it, and writes out a new po file - containing a dummy translation. + in :param locale: containing a dummy translation. """ if not os.path.exists(file): raise IOError('File does not exist: %s' % file) @@ -40,29 +32,36 @@ def main(file): converter.init_msgs(pofile.translated_entries()) for msg in pofile: converter.convert_msg(msg) - new_file = new_filename(file, OUT_LANG) + new_file = new_filename(file, locale) create_dir_if_necessary(new_file) pofile.save(new_file) - - -def new_filename(original_filename, new_lang): - """Returns a filename derived from original_filename, using new_lang as the locale""" +def new_filename(original_filename, new_locale): + """Returns a filename derived from original_filename, using new_locale as the locale""" orig_dir = os.path.dirname(original_filename) msgs_dir = os.path.basename(orig_dir) orig_file = os.path.basename(original_filename) - return '%s/%s/%s/%s' % (os.path.abspath(orig_dir + '/../..'), - new_lang, - msgs_dir, - orig_file) + return os.path.join(orig_dir, + '/../..', + new_locale, + msgs_dir, + orig_file) -def create_dir_if_necessary(pathname): - dirname = os.path.dirname(pathname) - if not os.path.exists(dirname): - os.makedirs(dirname) +# Dummy language +# two letter language codes reference: +# see http://www.loc.gov/standards/iso639-2/php/code_list.php +# +# Django will not localize in languages that django itself has not been +# localized for. So we are using a well-known language: 'fr'. + +DEFAULT_LOCALE = 'fr' if __name__ == '__main__': if len(sys.argv)<2: raise Exception("missing file argument") - main(sys.argv[1]) + if len(sys.argv)<2: + locale = DEFAULT_LOCALE + else: + locale = sys.argv[2] + main(sys.argv[1], locale) diff --git a/i18n/tests/__init__.py b/i18n/tests/__init__.py new file mode 100644 index 0000000000..d60515c712 --- /dev/null +++ b/i18n/tests/__init__.py @@ -0,0 +1,4 @@ +from test_extract import TestExtract +from test_generate import TestGenerate +from test_converter import TestConverter +from test_dummy import TestDummy diff --git a/i18n/tests/test_converter.py b/i18n/tests/test_converter.py new file mode 100644 index 0000000000..4dd5f02e3f --- /dev/null +++ b/i18n/tests/test_converter.py @@ -0,0 +1,42 @@ +import os +from unittest import TestCase + +import converter + +class UpcaseConverter (converter.Converter): + """ + Converts a string to uppercase. Just used for testing. + """ + def inner_convert_string(self, string): + return string.upper() + + +class TestConverter(TestCase): + """ + Tests functionality of i18n/converter.py + """ + + def test_converter(self): + """ + Tests with a simple converter (converts strings to uppercase). + Assert that embedded HTML and python tags are not converted. + """ + c = UpcaseConverter() + test_cases = ( + # no tags + ('big bad wolf', 'BIG BAD WOLF'), + # one html tag + ('big bad wolf', 'BIG BAD WOLF'), + # two html tags + ('big bad wolf', 'BIG BAD WOLF'), + # one python tag + ('big %(adjective)s wolf', 'BIG %(adjective)s WOLF'), + # two python tags + ('big %(adjective)s %(noun)s', 'BIG %(adjective)s %(noun)s'), + # both kinds of tags + ('big %(adjective)s %(noun)s', + 'BIG %(adjective)s %(noun)s'), + ) + for (source, expected) in test_cases: + result = c.convert(source) + self.assertEquals(result, expected) diff --git a/i18n/tests/test_dummy.py b/i18n/tests/test_dummy.py new file mode 100644 index 0000000000..88addb5a95 --- /dev/null +++ b/i18n/tests/test_dummy.py @@ -0,0 +1,50 @@ +import os, string, random +from unittest import TestCase +from polib import POEntry + +import dummy + + +class TestDummy(TestCase): + """ + Tests functionality of i18n/dummy.py + """ + + def setUp(self): + self.converter = dummy.Dummy() + + def test_dummy(self): + """ + Tests with a dummy converter (adds spurious accents to strings). + Assert that embedded HTML and python tags are not converted. + """ + test_cases = (("hello my name is Bond, James Bond", + u'h\xe9ll\xf6 my n\xe4m\xe9 \xefs B\xf6nd, J\xe4m\xe9s B\xf6nd Lorem i#'), + + ('don\'t convert tag ids', + u'd\xf6n\'t \xe7\xf6nv\xe9rt t\xe4g \xefds Lorem ipsu#'), + + ('don\'t convert %(name)s tags on %(date)s', + u"d\xf6n't \xe7\xf6nv\xe9rt %(name)s t\xe4gs \xf6n %(date)s Lorem ips#") + ) + for (source, expected) in test_cases: + result = self.converter.convert(source) + self.assertEquals(result, expected) + + def test_singular(self): + entry = POEntry() + entry.msgid = 'A lovely day for a cup of tea.' + expected = u'\xc0 l\xf6v\xe9ly d\xe4y f\xf6r \xe4 \xe7\xfcp \xf6f t\xe9\xe4. Lorem i#' + self.converter.convert_msg(entry) + self.assertEquals(entry.msgstr, expected) + + def test_plural(self): + entry = POEntry() + entry.msgid = 'A lovely day for a cup of tea.' + entry.msgid_plural = 'A lovely day for some cups of tea.' + expected_s = u'\xc0 l\xf6v\xe9ly d\xe4y f\xf6r \xe4 \xe7\xfcp \xf6f t\xe9\xe4. Lorem i#' + expected_p = u'\xc0 l\xf6v\xe9ly d\xe4y f\xf6r s\xf6m\xe9 \xe7\xfcps \xf6f t\xe9\xe4. Lorem ip#' + self.converter.convert_msg(entry) + result = entry.msgstr_plural + self.assertEquals(result['0'], expected_s) + self.assertEquals(result['1'], expected_p) diff --git a/i18n/tests/test_extract.py b/i18n/tests/test_extract.py new file mode 100644 index 0000000000..b14ae9872d --- /dev/null +++ b/i18n/tests/test_extract.py @@ -0,0 +1,85 @@ +import os, polib +from unittest import TestCase +from nose.plugins.skip import SkipTest +from datetime import datetime, timedelta + +import extract +from execute import SOURCE_MSGS_DIR + +# Make sure setup runs only once +SETUP_HAS_RUN = False + +class TestExtract(TestCase): + """ + Tests functionality of i18n/extract.py + """ + generated_files = ('django-partial.po', 'djangojs.po', 'mako.po') + + def setUp(self): + # Skip this test because it takes too long (>1 minute) + # TODO: figure out how to declare a "long-running" test suite + # and add this test to it. + raise SkipTest() + + global SETUP_HAS_RUN + + # Subtract 1 second to help comparisons with file-modify time succeed, + # since os.path.getmtime() is not millisecond-accurate + self.start_time = datetime.now() - timedelta(seconds=1) + super(TestExtract, self).setUp() + if not SETUP_HAS_RUN: + # Run extraction script. Warning, this takes 1 minute or more + extract.main() + SETUP_HAS_RUN = True + + def get_files (self): + """ + This is a generator. + Returns the fully expanded filenames for all extracted files + Fails assertion if one of the files doesn't exist. + """ + for filename in self.generated_files: + path = os.path.join(SOURCE_MSGS_DIR, filename) + exists = os.path.exists(path) + self.assertTrue(exists, msg='Missing file: %s' % filename) + if exists: + yield path + + def test_files(self): + """ + Asserts that each auto-generated file has been modified since 'extract' was launched. + Intended to show that the file has been touched by 'extract'. + """ + + for path in self.get_files(): + self.assertTrue(datetime.fromtimestamp(os.path.getmtime(path)) > self.start_time, + msg='File not recently modified: %s' % os.path.basename(path)) + + def test_is_keystring(self): + """ + Verifies is_keystring predicate + """ + entry1 = polib.POEntry() + entry2 = polib.POEntry() + entry1.msgid = "_.lms.admin.warning.keystring" + entry2.msgid = "This is not a keystring" + self.assertTrue(extract.is_key_string(entry1.msgid)) + self.assertFalse(extract.is_key_string(entry2.msgid)) + + def test_headers(self): + """Verify all headers have been modified""" + for path in self.get_files(): + po = polib.pofile(path) + header = po.header + self.assertEqual(header.find('edX translation file'), 0, + msg='Missing header in %s:\n"%s"' % \ + (os.path.basename(path), header)) + + def test_metadata(self): + """Verify all metadata has been modified""" + for path in self.get_files(): + po = polib.pofile(path) + metadata = po.metadata + value = metadata['Report-Msgid-Bugs-To'] + expected = 'translation_team@edx.org' + self.assertEquals(expected, value) diff --git a/i18n/tests/test_generate.py b/i18n/tests/test_generate.py new file mode 100644 index 0000000000..fc22988251 --- /dev/null +++ b/i18n/tests/test_generate.py @@ -0,0 +1,61 @@ +import os, string, random +from unittest import TestCase +from datetime import datetime, timedelta + +import generate +from execute import get_config, messages_dir, SOURCE_MSGS_DIR, SOURCE_LOCALE + +class TestGenerate(TestCase): + """ + Tests functionality of i18n/generate.py + """ + generated_files = ('django-partial.po', 'djangojs.po', 'mako.po') + + def setUp(self): + self.configuration = get_config() + + # Subtract 1 second to help comparisons with file-modify time succeed, + # since os.path.getmtime() is not millisecond-accurate + self.start_time = datetime.now() - timedelta(seconds=1) + + def test_configuration(self): + """ + Make sure we have a valid configuration file, + and that it contains an 'en' locale. + """ + self.assertIsNotNone(self.configuration) + locales = self.configuration['locales'] + self.assertIsNotNone(locales) + self.assertIsInstance(locales, list) + self.assertIn('en', locales) + + def test_merge(self): + """ + Tests merge script on English source files. + """ + filename = os.path.join(SOURCE_MSGS_DIR, random_name()) + generate.merge(SOURCE_LOCALE, target=filename) + self.assertTrue(os.path.exists(filename)) + os.remove(filename) + + def test_main(self): + """ + Runs generate.main() which should merge source files, + then compile all sources in all configured languages. + Validates output by checking all .mo files in all configured languages. + .mo files should exist, and be recently created (modified + after start of test suite) + """ + generate.main() + for locale in self.configuration['locales']: + for filename in ('django.mo', 'djangojs.mo'): + path = os.path.join(messages_dir(locale), filename) + exists = os.path.exists(path) + self.assertTrue(exists, msg='Missing file in locale %s: %s' % (locale, filename)) + self.assertTrue(datetime.fromtimestamp(os.path.getmtime(path)) >= self.start_time, + msg='File not recently modified: %s' % path) + +def random_name(size=6): + """Returns random filename as string, like test-4BZ81W""" + chars = string.ascii_uppercase + string.digits + return 'test-' + ''.join(random.choice(chars) for x in range(size)) diff --git a/i18n/update.py b/i18n/update.py deleted file mode 100755 index 447dcf71d5..0000000000 --- a/i18n/update.py +++ /dev/null @@ -1,110 +0,0 @@ -#!/usr/bin/python - -import os, subprocess, logging, json -from make_dummy import create_dir_if_necessary, main as dummy_main - -''' -Generate or update all translation files - Usage: - $ update.py - - - 1. extracts files from mako templates - 2. extracts files from django templates and python source files - 3. extracts files from django javascript files - 4. generates dummy text translations - 5. compiles po files to mo files - - Configuration (e.g. known languages) declared in mitx/conf/locale/config -''' - -# ----------------------------------- -# BASE_DIR is the working directory to execute django-admin commands from. -# Typically this should be the 'mitx' directory. -BASE_DIR = os.path.abspath(os.path.dirname(os.path.abspath(__file__))+'/..') - -# LOCALE_DIR contains the locale files. -# Typically this should be 'mitx/conf/locale' -LOCALE_DIR = BASE_DIR + '/conf/locale' - -# MSGS_DIR contains the English po files -MSGS_DIR = LOCALE_DIR + '/en/LC_MESSAGES' - -# CONFIG_FILENAME contains localization configuration in json format -CONFIG_FILENAME = LOCALE_DIR + '/config' - -# BABEL_CONFIG contains declarations for Babel to extract strings from mako template files -BABEL_CONFIG = LOCALE_DIR + '/babel.cfg' - -# Strings from mako template files are written to BABEL_OUT -BABEL_OUT = MSGS_DIR + '/mako.po' - -# These are the shell commands invoked by main() -COMMANDS = { - 'babel_mako': 'pybabel extract -F %s -c "TRANSLATORS:" . -o %s' % (BABEL_CONFIG, BABEL_OUT), - 'make_django': 'django-admin.py makemessages --all --ignore=src/* --extension html -l en', - 'make_djangojs': 'django-admin.py makemessages --all -d djangojs --ignore=src/* --extension js -l en', - 'msgcat' : 'msgcat -o merged.po django.po %s' % BABEL_OUT, - 'rename_django' : 'mv django.po django_old.po', - 'rename_merged' : 'mv merged.po django.po', - 'compile': 'django-admin.py compilemessages' - - } - -def execute (command_kwd, log, working_directory=BASE_DIR): - ''' - Executes command_kwd, which references a shell command in COMMANDS. - ''' - full_cmd = COMMANDS[command_kwd] - log.info('%s' % full_cmd) - subprocess.call(full_cmd.split(' '), cwd=working_directory) - -def make_log (): - '''returns a logger''' - log = logging.getLogger(__name__) - log.setLevel(logging.INFO) - log_handler = logging.StreamHandler() - log_handler.setFormatter(logging.Formatter('%(asctime)s [%(levelname)s] %(message)s')) - log.addHandler(log_handler) - return log - -def get_config (): - '''Returns data found in config file, or returns None if file not found''' - config_path = os.path.abspath(CONFIG_FILENAME) - if not os.path.exists(config_path): - return None - with open(config_path) as stream: - return json.load(stream) - -def main (): - log = make_log() - create_dir_if_necessary(LOCALE_DIR) - log.info('Executing all commands from %s' % BASE_DIR) - - remove_files = ['django.po', 'djangojs.po', 'nonesuch'] - for filename in remove_files: - path = MSGS_DIR + '/' + filename - log.info('Deleting file %s' % path) - if not os.path.exists(path): - log.warn("File does not exist: %s" % path) - else: - os.remove(path) - - # Generate or update human-readable .po files from all source code. - execute('babel_mako', log=log) - execute('make_django', log=log) - execute('make_djangojs', log=log) - execute('msgcat', log=log, working_directory=MSGS_DIR) - execute('rename_django', log=log, working_directory=MSGS_DIR) - execute('rename_merged', log=log, working_directory=MSGS_DIR) - - # Generate dummy text files from the English .po files - log.info('Generating dummy text.') - dummy_main(LOCALE_DIR + '/en/LC_MESSAGES/django.po') - dummy_main(LOCALE_DIR + '/en/LC_MESSAGES/djangojs.po') - - # Generate machine-readable .mo files - execute('compile', log) - -if __name__ == '__main__': - main() diff --git a/lms/static/sass/multicourse/_course_about.scss b/lms/static/sass/multicourse/_course_about.scss index d23917fe27..0982577f42 100644 --- a/lms/static/sass/multicourse/_course_about.scss +++ b/lms/static/sass/multicourse/_course_about.scss @@ -272,7 +272,9 @@ } .course-staff { + .teacher { + @include clearfix; margin-bottom: 40px; h3 { @@ -312,7 +314,7 @@ } } } - + .faq { @include clearfix; diff --git a/lms/templates/static_templates/contact.html b/lms/templates/static_templates/contact.html index d848164720..79e2743dbc 100644 --- a/lms/templates/static_templates/contact.html +++ b/lms/templates/static_templates/contact.html @@ -33,6 +33,9 @@

    Universities

    If you are a university wishing to collaborate or with questions about edX, please email university@edx.org.

    +

    Accessibility

    +

    EdX strives to create an innovative online-learning platform that promotes accessibility for everyone, including students with disabilities. We are dedicated to improving the accessibility of the platform and welcome your comments or questions at accessibility@edx.org.

    + diff --git a/local-requirements.txt b/local-requirements.txt index 0ce7de0e73..201467d11e 100644 --- a/local-requirements.txt +++ b/local-requirements.txt @@ -2,8 +2,3 @@ -e common/lib/capa -e common/lib/xmodule -e . - -# XBlock: -# Might change frequently, so put it in local-requirements.txt, -# but conceptually is an external package, so it is in a separate repo. --e git+https://github.com/edx/XBlock.git@5ce6f70a#egg=XBlock diff --git a/rakefile b/rakefile index 766dd8a914..798e1c28bf 100644 --- a/rakefile +++ b/rakefile @@ -174,6 +174,11 @@ end desc "Install all python prerequisites for the lms and cms" task :install_python_prereqs do sh('pip install -r requirements.txt') + # Check for private-requirements.txt: used to install our libs as working dirs, + # or personal-use tools. + if File.file?("private-requirements.txt") + sh('pip install -r private-requirements.txt') + end end task :predjango do @@ -330,6 +335,12 @@ task :migrate, [:env] do |t, args| sh(django_admin(:lms, args.env, 'migrate')) end +desc "Run tests for the internationalization library" +task :test_i18n do + test = File.join(REPO_ROOT, "i18n", "tests") + sh("nosetests #{test}") +end + Dir["common/lib/*"].select{|lib| File.directory?(lib)}.each do |lib| task_name = "test_#{lib}" @@ -501,6 +512,30 @@ task :autodeploy_properties do end end +# --- Internationalization tasks + +desc "Extract localizable strings from sources" +task :extract_dev_strings do + sh(File.join(REPO_ROOT, "i18n", "extract.py")) +end + +desc "Compile localizable strings from sources. With optional flag 'extract', will extract strings first." +task :generate_i18n do + if ARGV.last.downcase == 'extract' + Rake::Task["extract_dev_strings"].execute + end + sh(File.join(REPO_ROOT, "i18n", "generate.py")) +end + +desc "Simulate international translation by generating dummy strings corresponding to source strings." +task :dummy_i18n do + source_files = Dir["#{REPO_ROOT}/conf/locale/en/LC_MESSAGES/*.po"] + dummy_locale = 'fr' + cmd = File.join(REPO_ROOT, "i18n", "make_dummy.py") + for file in source_files do + sh("#{cmd} #{file} #{dummy_locale}") + end +end # --- Develop and public documentation --- desc "Invoke sphinx 'make build' to generate docs." diff --git a/requirements.txt b/requirements.txt index 77239a4d50..d3fdd46b81 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,4 @@ -r repo-requirements.txt -Babel==0.9.6 beautifulsoup4==4.1.3 beautifulsoup==3.2.1 boto==2.6.0 @@ -62,6 +61,10 @@ newrelic==1.8.0.13 # Used for documentation gathering sphinx==1.1.3 +# Used for Internationalization and localization +Babel==0.9.6 +transifex-client==0.8 + # Used for testing coverage==3.6 factory_boy==2.0.2 From 01ede40b03d97ade4dcc322d4f03e58cb15d0ede Mon Sep 17 00:00:00 2001 From: cahrens Date: Thu, 2 May 2013 09:43:03 -0400 Subject: [PATCH 07/14] Switching branches --- cms/djangoapps/contentstore/views.py | 1 + cms/static/coffee/src/views/module_edit.coffee | 2 ++ cms/static/js/base.js | 14 +++++++------- cms/templates/base.html | 2 +- cms/templates/widgets/metadata-edit.html | 14 ++++++++++++-- cms/templates/widgets/source-edit.html | 2 +- .../xmodule/xmodule/templates/problem/empty.yaml | 2 -- 7 files changed, 24 insertions(+), 13 deletions(-) diff --git a/cms/djangoapps/contentstore/views.py b/cms/djangoapps/contentstore/views.py index 824d2119f1..cf870b1edf 100644 --- a/cms/djangoapps/contentstore/views.py +++ b/cms/djangoapps/contentstore/views.py @@ -682,6 +682,7 @@ def save_item(request): del existing_item._model_data[metadata_key] del posted_metadata[metadata_key] else: + # TODO, in here check if value is the same before setting. existing_item._model_data[metadata_key] = value # commit to datastore diff --git a/cms/static/coffee/src/views/module_edit.coffee b/cms/static/coffee/src/views/module_edit.coffee index 3cb3b1703f..1b849d1f55 100644 --- a/cms/static/coffee/src/views/module_edit.coffee +++ b/cms/static/coffee/src/views/module_edit.coffee @@ -35,6 +35,8 @@ class CMS.Views.ModuleEdit extends Backbone.View return _metadata + getMetadata: -> + cloneTemplate: (parent, template) -> $.post("/clone_item", { parent_location: parent diff --git a/cms/static/js/base.js b/cms/static/js/base.js index 3a51d797ec..4f3dab4857 100644 --- a/cms/static/js/base.js +++ b/cms/static/js/base.js @@ -845,15 +845,15 @@ function saveSetSectionScheduleDate(e) { data: JSON.stringify({ 'id': id, 'metadata': {'start': start}}) }).success(function () { var $thisSection = $('.courseware-section[data-id="' + id + '"]'); - var format = gettext('Will Release: %(date)s at $(time)s UTC'); + var format = gettext('Will Release: %(date)s at $(time)s UTC'); var willReleaseAt = interpolate(format, [input_date, input_time], true); $thisSection.find('.section-published-date').html( - '' + willReleaseAt + '' + - '' + - gettext('Edit') + ''); + '' + willReleaseAt + '' + + '' + + gettext('Edit') + ''); $thisSection.find('.section-published-date').animate({ 'background-color': 'rgb(182,37,104)' }, 300).animate({ diff --git a/cms/templates/base.html b/cms/templates/base.html index 3f286c2582..f1a87d6424 100644 --- a/cms/templates/base.html +++ b/cms/templates/base.html @@ -30,7 +30,7 @@ <%include file="courseware_vendor_js.html"/> - + diff --git a/cms/templates/widgets/metadata-edit.html b/cms/templates/widgets/metadata-edit.html index b351b5c344..4eb43da896 100644 --- a/cms/templates/widgets/metadata-edit.html +++ b/cms/templates/widgets/metadata-edit.html @@ -1,5 +1,6 @@ <% import hashlib + from xmodule.fields import StringyInteger, StringyFloat hlskey = hashlib.md5(module.location.url()).hexdigest() %> From 46100fd2585926888067487d3df312bccc64ee29 Mon Sep 17 00:00:00 2001 From: cahrens Date: Thu, 2 May 2013 12:32:32 -0400 Subject: [PATCH 09/14] Cleanup. --- cms/static/js/base.js | 14 +++++++------- cms/templates/base.html | 2 +- cms/templates/widgets/metadata-edit.html | 2 +- .../xmodule/xmodule/templates/problem/empty.yaml | 2 ++ 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/cms/static/js/base.js b/cms/static/js/base.js index 4f3dab4857..3a51d797ec 100644 --- a/cms/static/js/base.js +++ b/cms/static/js/base.js @@ -845,15 +845,15 @@ function saveSetSectionScheduleDate(e) { data: JSON.stringify({ 'id': id, 'metadata': {'start': start}}) }).success(function () { var $thisSection = $('.courseware-section[data-id="' + id + '"]'); - var format = gettext('Will Release: %(date)s at $(time)s UTC'); + var format = gettext('Will Release: %(date)s at $(time)s UTC'); var willReleaseAt = interpolate(format, [input_date, input_time], true); $thisSection.find('.section-published-date').html( - '' + willReleaseAt + '' + - '' + - gettext('Edit') + ''); + '' + willReleaseAt + '' + + '' + + gettext('Edit') + ''); $thisSection.find('.section-published-date').animate({ 'background-color': 'rgb(182,37,104)' }, 300).animate({ diff --git a/cms/templates/base.html b/cms/templates/base.html index f1a87d6424..3f286c2582 100644 --- a/cms/templates/base.html +++ b/cms/templates/base.html @@ -30,7 +30,7 @@ <%include file="courseware_vendor_js.html"/> - + diff --git a/cms/templates/widgets/metadata-edit.html b/cms/templates/widgets/metadata-edit.html index d4373c37fd..39ad8e480c 100644 --- a/cms/templates/widgets/metadata-edit.html +++ b/cms/templates/widgets/metadata-edit.html @@ -22,7 +22,7 @@ value='${field_value["field"].to_json(field_value["value"])}' % endif size='60' /> - ## Change to True to see all the information being passed through. + ## Change to False to see all the information being passed through. % if True: diff --git a/common/lib/xmodule/xmodule/templates/problem/empty.yaml b/common/lib/xmodule/xmodule/templates/problem/empty.yaml index b63d106d7c..39c9e7671c 100644 --- a/common/lib/xmodule/xmodule/templates/problem/empty.yaml +++ b/common/lib/xmodule/xmodule/templates/problem/empty.yaml @@ -1,8 +1,10 @@ --- metadata: display_name: Blank Common Problem + rerandomize: never showanswer: always markdown: "" + weight: "" empty: True attempts: "" data: | From c01410626fa4eb470cff5fdc8bed87adea28f0d2 Mon Sep 17 00:00:00 2001 From: cahrens Date: Thu, 2 May 2013 13:39:20 -0400 Subject: [PATCH 10/14] Jasmine test for changedMetadata method. --- cms/static/coffee/spec/views/module_edit_spec.coffee | 11 +++++++++++ cms/templates/widgets/metadata-edit.html | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/cms/static/coffee/spec/views/module_edit_spec.coffee b/cms/static/coffee/spec/views/module_edit_spec.coffee index 5e83ecb42d..baf9ee9c20 100644 --- a/cms/static/coffee/spec/views/module_edit_spec.coffee +++ b/cms/static/coffee/spec/views/module_edit_spec.coffee @@ -72,3 +72,14 @@ describe "CMS.Views.ModuleEdit", -> it "loads the .xmodule-display inside the module editor", -> expect(XModule.loadModule).toHaveBeenCalled() expect(XModule.loadModule.mostRecentCall.args[0]).toBe($('.xmodule_display')) + + describe "changedMetadata", -> + it "returns empty if no metadata loaded", -> + expect(@moduleEdit.changedMetadata()).toEqual({}) + + it "returns only changed values", -> + @moduleEdit.originalMetadata = {'foo', 'bar'} + spyOn(@moduleEdit, 'metadata').andReturn({'a': '', 'b': 'before', 'c': ''}) + @moduleEdit.loadEdit() + @moduleEdit.metadata.andReturn({'a': '', 'b': 'after', 'd': 'only_after'}) + expect(@moduleEdit.changedMetadata()).toEqual({'b' : 'after', 'd' : 'only_after'}) diff --git a/cms/templates/widgets/metadata-edit.html b/cms/templates/widgets/metadata-edit.html index 39ad8e480c..9693c18e9c 100644 --- a/cms/templates/widgets/metadata-edit.html +++ b/cms/templates/widgets/metadata-edit.html @@ -22,8 +22,8 @@ value='${field_value["field"].to_json(field_value["value"])}' % endif size='60' /> - ## Change to False to see all the information being passed through. - % if True: + ## Change to True to see all the information being passed through. + % if False: From e0ebe6dacb6afaac95708cd0237de01d3da7dac9 Mon Sep 17 00:00:00 2001 From: cahrens Date: Thu, 2 May 2013 13:53:17 -0400 Subject: [PATCH 11/14] Remove TODO. --- cms/djangoapps/contentstore/views.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cms/djangoapps/contentstore/views.py b/cms/djangoapps/contentstore/views.py index cf870b1edf..824d2119f1 100644 --- a/cms/djangoapps/contentstore/views.py +++ b/cms/djangoapps/contentstore/views.py @@ -682,7 +682,6 @@ def save_item(request): del existing_item._model_data[metadata_key] del posted_metadata[metadata_key] else: - # TODO, in here check if value is the same before setting. existing_item._model_data[metadata_key] = value # commit to datastore From 37d594ce37a257fcea49a10610dc60488ccc9d48 Mon Sep 17 00:00:00 2001 From: cahrens Date: Fri, 3 May 2013 14:58:33 -0400 Subject: [PATCH 12/14] Get rid of non-editable scope. --- common/lib/xmodule/xmodule/capa_module.py | 17 +++++--- .../lib/xmodule/xmodule/discussion_module.py | 13 ++++-- common/lib/xmodule/xmodule/fields.py | 9 +--- common/lib/xmodule/xmodule/mako_module.py | 33 --------------- ...test_mako_module.py => test_xml_module.py} | 30 +++++++------ common/lib/xmodule/xmodule/x_module.py | 42 +++++++++++++++++++ common/lib/xmodule/xmodule/xml_module.py | 11 +++-- 7 files changed, 90 insertions(+), 65 deletions(-) rename common/lib/xmodule/xmodule/tests/{test_mako_module.py => test_xml_module.py} (73%) diff --git a/common/lib/xmodule/xmodule/capa_module.py b/common/lib/xmodule/xmodule/capa_module.py index d4db445ea8..daaaba07cd 100644 --- a/common/lib/xmodule/xmodule/capa_module.py +++ b/common/lib/xmodule/xmodule/capa_module.py @@ -17,7 +17,7 @@ from xmodule.x_module import XModule from xmodule.raw_module import RawDescriptor from xmodule.exceptions import NotFoundError, ProcessingError from xblock.core import Scope, String, Boolean, Object -from .fields import Timedelta, Date, StringyInteger, StringyFloat, NON_EDITABLE_SETTINGS_SCOPE +from .fields import Timedelta, Date, StringyInteger, StringyFloat from xmodule.util.date_utils import time_to_datetime log = logging.getLogger("mitx.courseware") @@ -63,13 +63,13 @@ class ComplexEncoder(json.JSONEncoder): class CapaFields(object): attempts = StringyInteger(help="Number of attempts taken by the student on this problem", default=0, scope=Scope.user_state) max_attempts = StringyInteger(help="Maximum number of attempts that a student is allowed", scope=Scope.settings) - due = Date(help="Date that this problem is due by", scope=NON_EDITABLE_SETTINGS_SCOPE) + due = Date(help="Date that this problem is due by", scope=Scope.settings) graceperiod = Timedelta(help="Amount of time after the due date that submissions will be accepted", - scope=NON_EDITABLE_SETTINGS_SCOPE) + scope=Scope.settings) showanswer = String(help="When to show the problem answer to the student", scope=Scope.settings, default="closed", values=["answered", "always", "attempted", "closed", "never"]) force_save_button = Boolean(help="Whether to force the save button to appear on the page", - scope=NON_EDITABLE_SETTINGS_SCOPE, default=False) + scope=Scope.settings, default=False) rerandomize = Randomization(help="When to rerandomize the problem", default="always", scope=Scope.settings) data = String(help="XML data for the problem", scope=Scope.content) correct_map = Object(help="Dictionary with the correctness of current student answers", scope=Scope.user_state, default={}) @@ -78,7 +78,7 @@ class CapaFields(object): done = Boolean(help="Whether the student has answered the problem", scope=Scope.user_state) seed = StringyInteger(help="Random seed for this student", scope=Scope.user_state) weight = StringyFloat(help="How much to weight this problem by", scope=Scope.settings) - markdown = String(help="Markdown source of this module", scope=NON_EDITABLE_SETTINGS_SCOPE) + markdown = String(help="Markdown source of this module", scope=Scope.settings) source_code = String(help="Source code for LaTeX and Word problems. This feature is not well-supported.", scope=Scope.settings) @@ -894,3 +894,10 @@ class CapaDescriptor(CapaFields, RawDescriptor): 'problems/' + path[8:], path[8:], ] + + @property + def non_editable_metadata_fields(self): + non_editable_fields = super(CapaDescriptor, self).non_editable_metadata_fields + non_editable_fields.extend([CapaDescriptor.due, CapaDescriptor.graceperiod, + CapaDescriptor.force_save_button, CapaDescriptor.markdown]) + return non_editable_fields \ No newline at end of file diff --git a/common/lib/xmodule/xmodule/discussion_module.py b/common/lib/xmodule/xmodule/discussion_module.py index b4409f5216..3ee2f2bae6 100644 --- a/common/lib/xmodule/xmodule/discussion_module.py +++ b/common/lib/xmodule/xmodule/discussion_module.py @@ -1,6 +1,5 @@ from pkg_resources import resource_string -from .fields import NON_EDITABLE_SETTINGS_SCOPE from xmodule.x_module import XModule from xmodule.raw_module import RawDescriptor from xmodule.editing_module import MetadataOnlyEditingDescriptor @@ -8,11 +7,10 @@ from xblock.core import String, Scope class DiscussionFields(object): - discussion_id = String(scope=NON_EDITABLE_SETTINGS_SCOPE) + discussion_id = String(scope=Scope.settings) discussion_category = String(scope=Scope.settings) discussion_target = String(scope=Scope.settings) - # We may choose to enable this in the future, but while Kevin is investigating.... - sort_key = String(scope=NON_EDITABLE_SETTINGS_SCOPE) + sort_key = String(scope=Scope.settings) class DiscussionModule(DiscussionFields, XModule): @@ -39,3 +37,10 @@ class DiscussionDescriptor(DiscussionFields, MetadataOnlyEditingDescriptor, RawD metadata_translations = dict(RawDescriptor.metadata_translations) metadata_translations['id'] = 'discussion_id' metadata_translations['for'] = 'discussion_target' + + @property + def non_editable_metadata_fields(self): + non_editable_fields = super(DiscussionDescriptor, self).non_editable_metadata_fields + # We may choose to enable sort_keys in the future, but while Kevin is investigating.... + non_editable_fields.extend([DiscussionDescriptor.discussion_id, DiscussionDescriptor.sort_key]) + return non_editable_fields \ No newline at end of file diff --git a/common/lib/xmodule/xmodule/fields.py b/common/lib/xmodule/xmodule/fields.py index b79accb2b3..3d56b7941e 100644 --- a/common/lib/xmodule/xmodule/fields.py +++ b/common/lib/xmodule/xmodule/fields.py @@ -7,18 +7,11 @@ from xblock.core import ModelType import datetime import dateutil.parser -from xblock.core import Integer, Float, Boolean, Scope +from xblock.core import Integer, Float, Boolean log = logging.getLogger(__name__) -class NonEditableSettingsScope(Scope): - pass - -# Same scope as Settings.scope, but not intended to be edited by users (in Studio). -NON_EDITABLE_SETTINGS_SCOPE = NonEditableSettingsScope(user=Scope.settings.user, block=Scope.settings.block) - - class Date(ModelType): ''' Date fields know how to parse and produce json (iso) compatible formats. diff --git a/common/lib/xmodule/xmodule/mako_module.py b/common/lib/xmodule/xmodule/mako_module.py index 02db0c602f..8abb1d7777 100644 --- a/common/lib/xmodule/xmodule/mako_module.py +++ b/common/lib/xmodule/xmodule/mako_module.py @@ -1,7 +1,4 @@ from .x_module import XModuleDescriptor, DescriptorSystem -from .fields import NonEditableSettingsScope -from xblock.core import Scope -from xblock.core import XBlock class MakoDescriptorSystem(DescriptorSystem): @@ -43,33 +40,3 @@ class MakoModuleDescriptor(XModuleDescriptor): return self.system.render_template( self.mako_template, self.get_context()) - @property - def editable_metadata_fields(self): - inherited_metadata = getattr(self, '_inherited_metadata', {}) - metadata = {} - for field in self.fields: - - if field.scope != Scope.settings or isinstance(field.scope, NonEditableSettingsScope): - continue - - # We are not allowing editing of xblock tag and name fields at this time (for any component). - if field == XBlock.tags or field == XBlock.name: - continue - - inherited = False - default = False - value = getattr(self, field.name) - if field.name in self._model_data: - default = False - if field.name in inherited_metadata and self._model_data.get(field.name) == inherited_metadata.get( - field.name): - inherited = True - else: - default = True - - metadata[field.name] = {'field' : field, - 'value': value, - 'is_inherited': inherited, - 'is_default': default } - - return metadata diff --git a/common/lib/xmodule/xmodule/tests/test_mako_module.py b/common/lib/xmodule/xmodule/tests/test_xml_module.py similarity index 73% rename from common/lib/xmodule/xmodule/tests/test_mako_module.py rename to common/lib/xmodule/xmodule/tests/test_xml_module.py index 7686e2a69e..06d5b0b0a3 100644 --- a/common/lib/xmodule/xmodule/tests/test_mako_module.py +++ b/common/lib/xmodule/xmodule/tests/test_xml_module.py @@ -1,17 +1,17 @@ from xmodule.x_module import XModuleFields from xblock.core import Scope, String, Object -from xmodule.fields import Date, StringyInteger, NON_EDITABLE_SETTINGS_SCOPE -from xmodule.mako_module import MakoModuleDescriptor +from xmodule.fields import Date, StringyInteger +from xmodule.xml_module import XmlDescriptor import unittest from . import test_system from mock import Mock class TestFields(object): - # Will be returned by editable_metadata_fields because Scope.settings. + # Will be returned by editable_metadata_fields. max_attempts = StringyInteger(scope=Scope.settings) - # Will not be returned by editable_metadata_fields because declared as non-editable Scope.settings. - due = Date(scope=NON_EDITABLE_SETTINGS_SCOPE) + # Will not be returned by editable_metadata_fields because filtered out by non_editable_metadata_fields. + due = Date(scope=Scope.settings) # Will not be returned by editable_metadata_fields because is not Scope.settings. student_answers = Object(scope=Scope.user_state) # Will be returned, and can override the inherited value from XModule. @@ -21,14 +21,15 @@ class TestFields(object): class EditableMetadataFieldsTest(unittest.TestCase): def test_display_name_field(self): - editable_fields = self.get_mako_editable_fields({}) + editable_fields = self.get_xml_editable_fields({}) # Tests that the xblock fields (currently tags and name) get filtered out. - self.assertEqual(1, len(editable_fields), "Expected only 1 editable field for mako descriptor.") + # Also tests that xml_attributes is filtered out of XmlDescriptor. + self.assertEqual(1, len(editable_fields), "Expected only 1 editable field for xml descriptor.") self.assert_display_name_default(editable_fields) def test_override_default(self): # Tests that is_default is correct when a value overrides the default. - editable_fields = self.get_mako_editable_fields({'display_name': 'foo'}) + editable_fields = self.get_xml_editable_fields({'display_name': 'foo'}) display_name = editable_fields['display_name'] self.assertFalse(display_name['is_default']) self.assertEqual('foo', display_name['value']) @@ -47,14 +48,19 @@ class EditableMetadataFieldsTest(unittest.TestCase): self.assert_field_values(editable_fields, 'display_name', XModuleFields.display_name, False, True, 'inherited') # Start of helper methods - def get_mako_editable_fields(self, model_data): + def get_xml_editable_fields(self, model_data): system = test_system() system.render_template = Mock(return_value="
    Test Template HTML
    ") - return MakoModuleDescriptor(system=system, location=None, model_data=model_data).editable_metadata_fields + return XmlDescriptor(system=system, location=None, model_data=model_data).editable_metadata_fields def get_module_editable_fields(self, model_data): - class TestModuleDescriptor(TestFields, MakoModuleDescriptor): - pass + class TestModuleDescriptor(TestFields, XmlDescriptor): + + @property + def non_editable_metadata_fields(self): + non_editable_fields = super(TestModuleDescriptor, self).non_editable_metadata_fields + non_editable_fields.append(TestModuleDescriptor.due) + return non_editable_fields system = test_system() system.render_template = Mock(return_value="
    Test Template HTML
    ") diff --git a/common/lib/xmodule/xmodule/x_module.py b/common/lib/xmodule/xmodule/x_module.py index 04ffcc6092..749ca66258 100644 --- a/common/lib/xmodule/xmodule/x_module.py +++ b/common/lib/xmodule/xmodule/x_module.py @@ -606,6 +606,48 @@ class XModuleDescriptor(XModuleFields, HTMLSnippet, ResourceTemplates, XBlock): model_data=self._model_data, )) + @property + def non_editable_metadata_fields(self): + """ + Return the list of fields that should not be editable in Studio. + + When overriding, be sure to append to the superclasses' list. + """ + # We are not allowing editing of xblock tag and name fields at this time (for any component). + return [XBlock.tags, XBlock.name] + + @property + def editable_metadata_fields(self): + """ + Returns the metadata fields to be edited in Studio. These are fields with scope `Scope.settings`. + + Can be limited by extending `non_editable_metadata_fields`. + """ + inherited_metadata = getattr(self, '_inherited_metadata', {}) + metadata = {} + for field in self.fields: + + if field.scope != Scope.settings or field in self.non_editable_metadata_fields: + continue + + inherited = False + default = False + value = getattr(self, field.name) + if field.name in self._model_data: + default = False + if field.name in inherited_metadata: + if self._model_data.get(field.name) == inherited_metadata.get(field.name): + inherited = True + else: + default = True + + metadata[field.name] = {'field': field, + 'value': value, + 'is_inherited': inherited, + 'is_default': default} + + return metadata + class DescriptorSystem(object): def __init__(self, load_item, resources_fs, error_tracker, **kwargs): diff --git a/common/lib/xmodule/xmodule/xml_module.py b/common/lib/xmodule/xmodule/xml_module.py index a34b0e5078..7480cda0c5 100644 --- a/common/lib/xmodule/xmodule/xml_module.py +++ b/common/lib/xmodule/xmodule/xml_module.py @@ -6,11 +6,10 @@ import sys from collections import namedtuple from lxml import etree -from xblock.core import Object +from xblock.core import Object, Scope from xmodule.x_module import (XModuleDescriptor, policy_key) from xmodule.modulestore import Location from xmodule.modulestore.inheritance import own_metadata -from .fields import NON_EDITABLE_SETTINGS_SCOPE log = logging.getLogger(__name__) @@ -86,7 +85,7 @@ class XmlDescriptor(XModuleDescriptor): """ xml_attributes = Object(help="Map of unhandled xml attributes, used only for storage between import and export", - default={}, scope=NON_EDITABLE_SETTINGS_SCOPE) + default={}, scope=Scope.settings) # Extension to append to filename paths filename_extension = 'xml' @@ -420,3 +419,9 @@ class XmlDescriptor(XModuleDescriptor): """ raise NotImplementedError( "%s does not implement definition_to_xml" % self.__class__.__name__) + + @property + def non_editable_metadata_fields(self): + non_editable_fields = super(XmlDescriptor, self).non_editable_metadata_fields + non_editable_fields.append(XmlDescriptor.xml_attributes) + return non_editable_fields From 9dd074f25bf523dfca6842ddd0c2b5bf1927d3e5 Mon Sep 17 00:00:00 2001 From: cahrens Date: Fri, 3 May 2013 15:09:02 -0400 Subject: [PATCH 13/14] Cleanup. --- common/lib/xmodule/xmodule/capa_module.py | 8 +++----- common/lib/xmodule/xmodule/discussion_module.py | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/common/lib/xmodule/xmodule/capa_module.py b/common/lib/xmodule/xmodule/capa_module.py index daaaba07cd..479cd5a759 100644 --- a/common/lib/xmodule/xmodule/capa_module.py +++ b/common/lib/xmodule/xmodule/capa_module.py @@ -64,12 +64,10 @@ class CapaFields(object): attempts = StringyInteger(help="Number of attempts taken by the student on this problem", default=0, scope=Scope.user_state) max_attempts = StringyInteger(help="Maximum number of attempts that a student is allowed", scope=Scope.settings) due = Date(help="Date that this problem is due by", scope=Scope.settings) - graceperiod = Timedelta(help="Amount of time after the due date that submissions will be accepted", - scope=Scope.settings) + graceperiod = Timedelta(help="Amount of time after the due date that submissions will be accepted", scope=Scope.settings) showanswer = String(help="When to show the problem answer to the student", scope=Scope.settings, default="closed", values=["answered", "always", "attempted", "closed", "never"]) - force_save_button = Boolean(help="Whether to force the save button to appear on the page", - scope=Scope.settings, default=False) + force_save_button = Boolean(help="Whether to force the save button to appear on the page", scope=Scope.settings, default=False) rerandomize = Randomization(help="When to rerandomize the problem", default="always", scope=Scope.settings) data = String(help="XML data for the problem", scope=Scope.content) correct_map = Object(help="Dictionary with the correctness of current student answers", scope=Scope.user_state, default={}) @@ -900,4 +898,4 @@ class CapaDescriptor(CapaFields, RawDescriptor): non_editable_fields = super(CapaDescriptor, self).non_editable_metadata_fields non_editable_fields.extend([CapaDescriptor.due, CapaDescriptor.graceperiod, CapaDescriptor.force_save_button, CapaDescriptor.markdown]) - return non_editable_fields \ No newline at end of file + return non_editable_fields diff --git a/common/lib/xmodule/xmodule/discussion_module.py b/common/lib/xmodule/xmodule/discussion_module.py index 3ee2f2bae6..98082ddea2 100644 --- a/common/lib/xmodule/xmodule/discussion_module.py +++ b/common/lib/xmodule/xmodule/discussion_module.py @@ -43,4 +43,4 @@ class DiscussionDescriptor(DiscussionFields, MetadataOnlyEditingDescriptor, RawD non_editable_fields = super(DiscussionDescriptor, self).non_editable_metadata_fields # We may choose to enable sort_keys in the future, but while Kevin is investigating.... non_editable_fields.extend([DiscussionDescriptor.discussion_id, DiscussionDescriptor.sort_key]) - return non_editable_fields \ No newline at end of file + return non_editable_fields From 5c3719b915439f57dd35bceabd6313cca0eb71b0 Mon Sep 17 00:00:00 2001 From: cahrens Date: Fri, 3 May 2013 15:31:18 -0400 Subject: [PATCH 14/14] Get HTML LaTeX "working" again. --- common/lib/xmodule/xmodule/html_module.py | 1 + 1 file changed, 1 insertion(+) diff --git a/common/lib/xmodule/xmodule/html_module.py b/common/lib/xmodule/xmodule/html_module.py index 0c147ecf75..bbf24a6320 100644 --- a/common/lib/xmodule/xmodule/html_module.py +++ b/common/lib/xmodule/xmodule/html_module.py @@ -19,6 +19,7 @@ log = logging.getLogger("mitx.courseware") class HtmlFields(object): data = String(help="Html contents to display for this module", scope=Scope.content) + source_code = String(help="Source code for LaTeX documents. This feature is not well-supported.", scope=Scope.settings) class HtmlModule(HtmlFields, XModule):