Commit a85b2552 by Chris Dodge

Define 'system metadata' which should not be editable by the end user. When…

Define 'system metadata' which should not be editable by the end user. When posting back metadata edits, we need to fetch a copy of the existing metadata and apply the changes.
parent e6445cea
......@@ -104,6 +104,7 @@ def edit_item(request):
item = modulestore().get_item(item_location)
item.get_html = wrap_xmodule(item.get_html, item, "xmodule_edit.html")
return render_to_response('unit.html', {
'contents': item.get_html(),
'js_module': item.js_module_name,
......@@ -287,8 +288,16 @@ def save_item(request):
# cdodge: also commit any metadata which might have been passed along in the
# POST from the client, if it is there
# note, that the postback is not the complete metadata, as there's system metadata which is
# not presented to the end-user for editing. So let's fetch the original and
# 'apply' the submitted metadata, so we don't end up deleting system metadata
if request.POST['metadata']:
modulestore().update_metadata(item_location, request.POST['metadata'])
posted_metadata = request.POST['metadata']
# fetch original
existing_item = modulestore().get_item(item_location)
# update existing metadata with submitted metadata (which can be partial)
existing_item.metadata.update(posted_metadata)
modulestore().update_metadata(item_location, existing_item.metadata)
# Export the course back to github
# This uses wildcarding to find the course, which requires handling
......
......@@ -2,7 +2,7 @@
<section class="metadata_edit">
<h3>Metadata</h3>
<ul>
% for keyname in metadata.keys():
% for keyname in editable_metadata_fields:
<li>${keyname}: <input type='text' data-metadata-name='${keyname}' value='${metadata[keyname]}' size='60' /></li>
% endfor
</ul>
......
......@@ -17,14 +17,13 @@ class EditingDescriptor(MakoModuleDescriptor):
js = {'coffee': [resource_string(__name__, 'js/src/raw/edit.coffee')]}
js_module_name = "RawDescriptor"
# cdodge: a little refactoring here, since we're basically doing the same thing
# here as with our parent class, let's call into it to get the basic fields
# set and then add our additional fields. Trying to keep it DRY.
def get_context(self):
return {
'module': self,
'data': self.definition.get('data', ''),
'metadata': self.metadata
# TODO (vshnayder): allow children and metadata to be edited.
#'children' : self.definition.get('children, ''),
_context = MakoModuleDescriptor.get_context(self)
# Add our specific template information (the raw data body)
_context.update({ 'data' : self.definition.get('data','') })
return _context
# TODO: show both own metadata and inherited?
#'metadata' : self.own_metadata,
}
from x_module import XModuleDescriptor, DescriptorSystem
import logging
class MakoDescriptorSystem(DescriptorSystem):
......@@ -32,9 +33,17 @@ class MakoModuleDescriptor(XModuleDescriptor):
Return the context to render the mako template with
"""
return {'module': self,
'metadata': self.metadata
'metadata': self.metadata,
'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):
subset = [name for name in self.metadata.keys() if name not in self.system_metadata_fields]
return subset
......@@ -352,6 +352,10 @@ class XModuleDescriptor(Plugin, HTMLSnippet):
'data_dir'
)
# 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' ]
# A list of descriptor attributes that must be equal for the descriptors to
# be equal
equality_attributes = ('definition', 'metadata', 'location',
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment