-
Notifications
You must be signed in to change notification settings - Fork 3.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[STUD-406] Fix/cdodge/unescape quote strings #387
Changes from 3 commits
50bea28
5aae3c6
ab4012c
547f463
958ecdb
ac4e20b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -81,13 +81,23 @@ def __new__(_cls, from_xml=lambda x: x, | |
|
||
def serialize_field(value): | ||
""" | ||
Return a string version of the value (where value is the JSON-formatted, internally stored value). | ||
Return a string version of the value (where value is the JSON-formatted, internally stored value). | ||
|
||
By default, this is the result of calling json.dumps on the input value. | ||
""" | ||
By default, this is the result of calling json.dumps on the input value. | ||
""" | ||
return json.dumps(value, cls=EdxJSONEncoder) | ||
|
||
|
||
def serialize_string_literal(value): | ||
""" | ||
Assert that the value is a base string and - if it is - simply return it | ||
""" | ||
if not isinstance(value, basestring): | ||
raise Exception('Value {0} is not of type basestring!'.format(value)) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This should be a |
||
|
||
return value | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think I'd rather have this logic just live in There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Maybe @cahrens can comment on this but I wasn't sure if we want this behavior globally or just on the 'export' feature. That's why I separated the helper functions. If serialize_field is current - and remain so in the future - only called on export use cases, then I'm fine with moving the logic. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Christina, can you confirm this? If so, then I can refactor this - as well On Fri, Jul 12, 2013 at 12:22 PM, Calen Pennington <notifications@github.com
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes, I agree this should be within serialize_field. It will also make the unit tests represent how we actually serialize strings. |
||
|
||
|
||
def deserialize_field(field, value): | ||
""" | ||
Deserialize the string version to the value stored internally. | ||
|
@@ -126,7 +136,7 @@ class XmlDescriptor(XModuleDescriptor): | |
""" | ||
|
||
xml_attributes = Dict(help="Map of unhandled xml attributes, used only for storage between import and export", | ||
default={}, scope=Scope.settings) | ||
default={}, scope=Scope.settings) | ||
|
||
# Extension to append to filename paths | ||
filename_extension = 'xml' | ||
|
@@ -141,23 +151,23 @@ class XmlDescriptor(XModuleDescriptor): | |
# understand? And if we do, is this the place? | ||
# Related: What's the right behavior for clean_metadata? | ||
metadata_attributes = ('format', 'graceperiod', 'showanswer', 'rerandomize', | ||
'start', 'due', 'graded', 'display_name', 'url_name', 'hide_from_toc', | ||
'ispublic', # if True, then course is listed for all users; see | ||
'xqa_key', # for xqaa server access | ||
'giturl', # url of git server for origin of file | ||
# information about testcenter exams is a dict (of dicts), not a string, | ||
# so it cannot be easily exportable as a course element's attribute. | ||
'testcenter_info', | ||
# VS[compat] Remove once unused. | ||
'name', 'slug') | ||
'start', 'due', 'graded', 'display_name', 'url_name', 'hide_from_toc', | ||
'ispublic', # if True, then course is listed for all users; see | ||
'xqa_key', # for xqaa server access | ||
'giturl', # url of git server for origin of file | ||
# information about testcenter exams is a dict (of dicts), not a string, | ||
# so it cannot be easily exportable as a course element's attribute. | ||
'testcenter_info', | ||
# VS[compat] Remove once unused. | ||
'name', 'slug') | ||
|
||
metadata_to_strip = ('data_dir', | ||
'tabs', 'grading_policy', 'published_by', 'published_date', | ||
'discussion_blackouts', 'testcenter_info', | ||
# VS[compat] -- remove the below attrs once everything is in the CMS | ||
'course', 'org', 'url_name', 'filename', | ||
# Used for storing xml attributes between import and export, for roundtrips | ||
'xml_attributes') | ||
'tabs', 'grading_policy', 'published_by', 'published_date', | ||
'discussion_blackouts', 'testcenter_info', | ||
# VS[compat] -- remove the below attrs once everything is in the CMS | ||
'course', 'org', 'url_name', 'filename', | ||
# Used for storing xml attributes between import and export, for roundtrips | ||
'xml_attributes') | ||
|
||
metadata_to_export_to_policy = ('discussion_topics') | ||
|
||
|
@@ -166,7 +176,7 @@ def get_map_for_field(cls, attr): | |
for field in set(cls.fields + cls.lms.fields): | ||
if field.name == attr: | ||
from_xml = lambda val: deserialize_field(field, val) | ||
to_xml = lambda val : serialize_field(val) | ||
to_xml = lambda val: serialize_string_literal(val) if isinstance(val, basestring) else serialize_field(val) | ||
return AttrMap(from_xml, to_xml) | ||
|
||
return AttrMap() | ||
|
@@ -254,7 +264,7 @@ def load_definition(cls, xml_object, system, location): | |
definition, children = cls.definition_from_xml(definition_xml, system) | ||
if definition_metadata: | ||
definition['definition_metadata'] = definition_metadata | ||
definition['filename'] = [ filepath, filename ] | ||
definition['filename'] = [filepath, filename] | ||
|
||
return definition, children | ||
|
||
|
@@ -280,7 +290,6 @@ def load_metadata(cls, xml_object): | |
metadata[attr] = attr_map.from_xml(val) | ||
return metadata | ||
|
||
|
||
@classmethod | ||
def apply_policy(cls, metadata, policy): | ||
""" | ||
|
@@ -374,7 +383,6 @@ def export_to_file(self): | |
""" | ||
return True | ||
|
||
|
||
def export_to_xml(self, resource_fs): | ||
""" | ||
Returns an xml string representing this module, and all modules | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,3 @@ | ||
<chapter> | ||
<video url_name="toyvideo" youtube_id_1_0=""OEoXaMPEzfM""/> | ||
<video url_name="toyvideo" youtube_id_1_0="OEoXaMPEzfM"/> | ||
</chapter> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1 @@ | ||
<video youtube_id_1_0=""1bK-WdDi6Qw"" display_name="Video Resources"/> | ||
<video youtube_id_1_0="1bK-WdDi6Qw" display_name="Video Resources"/> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think you need this try around the self.assertRaises.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The correct syntax for
assertRaises
is:or, less preferred:
self.assertRaises(Exception, serialize_string_literal, 2.31)