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 caf3901e03..824d2119f1 100644
--- a/cms/djangoapps/contentstore/views.py
+++ b/cms/djangoapps/contentstore/views.py
@@ -676,11 +676,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/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/static/coffee/src/views/module_edit.coffee b/cms/static/coffee/src/views/module_edit.coffee
index 3cb3b1703f..bf56807f66 100644
--- a/cms/static/coffee/src/views/module_edit.coffee
+++ b/cms/static/coffee/src/views/module_edit.coffee
@@ -20,6 +20,7 @@ class CMS.Views.ModuleEdit extends Backbone.View
loadEdit: ->
if not @module
@module = XModule.loadModule(@$el.find('.xmodule_edit'))
+ @originalMetadata = @metadata()
metadata: ->
# cdodge: package up metadata which is separated into a number of input fields
@@ -35,6 +36,14 @@ class CMS.Views.ModuleEdit extends Backbone.View
return _metadata
+ changedMetadata: ->
+ currentMetadata = @metadata()
+ changedMetadata = {}
+ for key of currentMetadata
+ if currentMetadata[key] != @originalMetadata[key]
+ changedMetadata[key] = currentMetadata[key]
+ return changedMetadata
+
cloneTemplate: (parent, template) ->
$.post("/clone_item", {
parent_location: parent
@@ -60,7 +69,7 @@ class CMS.Views.ModuleEdit extends Backbone.View
course: course_location_analytics
id: _this.model.id
- data.metadata = _.extend(data.metadata || {}, @metadata())
+ data.metadata = _.extend(data.metadata || {}, @changedMetadata())
@hideModal()
@model.save(data).done( =>
# # showToastMessage("Your changes have been saved.", null, 3)
diff --git a/cms/templates/widgets/metadata-edit.html b/cms/templates/widgets/metadata-edit.html
index 51fe400f88..9693c18e9c 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()
%>
@@ -7,17 +8,40 @@
% 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:
-
-
+
+
+ ## Change to True to see all the information being passed through.
+ % if False:
+
+
+
+
+ % if field_value['field'].values:
+
+ % for value in field_value['field'].values:
+
+ % endfor
+ % endif
+ % endif
% endif
% endfor
- % if 'source_code' in editable_metadata_fields:
- <%include file="source-edit.html" />
+ % if 'source_code' in editable_metadata_fields and not editable_metadata_fields['source_code']['is_default']:
+ <%include file="source-edit.html" />
% endif
diff --git a/cms/templates/widgets/source-edit.html b/cms/templates/widgets/source-edit.html
index 883190d6b3..b7ee6c9db9 100644
--- a/cms/templates/widgets/source-edit.html
+++ b/cms/templates/widgets/source-edit.html
@@ -12,7 +12,7 @@