Commit bae419f6 by Mike Chen

CapawikiModule by subclassing and replacing CapaModule

parent 97c3a1ff
class @CapawikiDescriptor
constructor: (@element) ->
@loadParser("/static/grammars/main.jspeg")
@capa_box = $(".capa-box", @element)
@wiki_box = $(".wiki-box", @element)
save: ->
{'capa': @capa_box.val(), 'wiki': @wiki_box.val()}
debug: (msg) ->
console.log msg
loadParser: (url) ->
@debug "Retrieving grammar rules from " + url
$.get url, (data) =>
@grammar = data
@parser = PEG.buildParser @grammar
@debug "Succuessfully built parser."
, "text"
buildParserErrorMessage: (e) ->
if e.line != undefined && e.column != undefined
"Line " + e.line + ", column " + e.column + ": " + e.message
else e.message
buildXML: (parsed) ->
dom_parser = new DOMParser()
doc = dom_parser.parseFromString("<problem />", "text/xml");
problem = $(doc).find('problem')
create_text_element = (content) ->
el = $(doc.createElement('text'))
for line in content.split('\n')
el.append doc.createTextNode(line)
el.append doc.createElement('br')
el.children().last().remove()
return el
variable_name_wrapper = (expression) ->
match = /^\{(.+)\}$/.exec(expression)
return if match then "$" + match[1] else expression
for section in parsed
if section.type == 'text'
newel = create_text_element(section.text)
problem.append(newel)
else if section.type == 'image'
center = $(doc.createElement('center'))
img = $(doc.createElement('img'))
img.attr 'src', section.url
center.append img
if section.title
title = create_text_element(section.title)
center.append doc.createElement('br')
center.append title
problem.append center
else if section.type == 'linebreaks'
text = create_text_element('')
for i in [0..section.count] by 1
br = doc.createElement('br')
text.append(br)
problem.append(text)
else if section.type == 'multiple_choice'
newel = $(doc.createElement('choiceresponse'))
# count the number of correct choices
num_correct = 0
for choice in section.choices
if choice.correct
num_correct += 1
if num_correct == 1
group = $(doc.createElement('radiogroup'))
else if num_correct > 1
group = $(doc.createElement('checkboxgroup'))
newel.append(group)
for choice_def in section.choices
choice = $(doc.createElement('choice'))
choice.attr 'correct', choice_def.correct
choice.append create_text_element(choice_def.text)
group.append(choice)
problem.append(newel)
else if section.type == 'numerical'
newel = $(doc.createElement('numericalresponse'))
newel.attr 'answer', variable_name_wrapper(section.answer)
tolerance = $(doc.createElement('responseparam'))
tolerance.attr 'type', 'tolerance'
if section.tolerance == undefined
section.tolerance = "5%"
tolerance.attr 'default', section.tolerance
tolerance.attr 'name', 'tol'
tolerance.attr 'description', 'Numerical Tolerance'
newel.append tolerance
newel.append doc.createElement('textline')
problem.append(newel)
else if section.type == 'string'
newel = $(doc.createElement('stringresponse'))
newel.attr 'answer', variable_name_wrapper(section.answer)
newel.append doc.createElement('textline')
problem.append(newel)
else if section.type == 'formula'
formularesponse = $(doc.createElement("formularesponse"))
formularesponse.attr 'samples', section.samples
formularesponse.attr 'answer', variable_name_wrapper(section.answer)
formularesponse.attr 'type', 'cs'
tolerance = $(doc.createElement('responseparam'))
tolerance.attr 'type', 'tolerance'
if section.tolerance == undefined
section.tolerance = "5%"
tolerance.attr 'default', section.tolerance
tolerance.attr 'name', 'tol'
tolerance.attr 'description', 'Numerical Tolerance'
formularesponse.append tolerance
formularesponse.append doc.createElement('textline')
problem.append(formularesponse)
else
throw new SyntaxError("unexpected section type " + section.type)
parse: (source, done, fail) ->
try
result = @parser.parse source
catch e
message = @buildParserErrorMessage e
return fail(result)
return done(result)
convert: (parsed, done, fail) ->
try
xml = @buildXML parsed
catch e
message = @buildParserErrorMessage e
return fail(result)
return done(xml)
\ No newline at end of file
class CMS.Views.CapawikiEdit extends Backbone.View
tagName: 'section'
className: 'edit-pane'
events:
'click .cancel': 'cancel'
'click .module-edit': 'editSubmodule'
'click .save-update': 'save'
'keyup .wiki-box': 'checkAutoSave'
initialize: ->
@$el.load @model.editUrl(), =>
@descriptor = XModule.loadModule($(@el).find('.xmodule_edit'))
@capa_box = $(".capa-box", @el)
@wiki_box = $(".wiki-box", @el)
@model.module = @descriptor
@throttledAutoSave = _.throttle(@autoSave, 0);
XModule.loadModules('display')
checkAutoSaveTimeout: ->
@auto_save_timer = null
@throttledAutoSave()
checkAutoSave: =>
callback = _.bind(@checkAutoSaveTimeout, this)
if @auto_save_timer
@auto_save_timer = window.clearTimeout(@auto_save_timer)
@auto_save_timer = window.setTimeout(callback, 1000)
hideMessage: ->
@message_box.css {"display":"none"}
showMessage: (message) ->
@message_box.css {"display":"block"}
@message_box.text message
showError: (message) ->
@showMessage(message)
autoSave: ->
@model.save().done((previews) =>
@hideMessage()
previews_section = @$el.find('.previews').empty()
$.each(previews, (idx, preview) =>
preview_wrapper = $('<section/>', class: 'preview').append preview
previews_section.append preview_wrapper
)
XModule.loadModules('display')
).fail(->
@showMessage("There was an error saving your changes. Please try again.")
)
save: (event) ->
event.preventDefault()
@model.save().done((previews) =>
alert("Your changes have been saved.")
previews_section = @$el.find('.previews').empty()
$.each(previews, (idx, preview) =>
preview_wrapper = $('<section/>', class: 'preview').append preview
previews_section.append preview_wrapper
)
XModule.loadModules('display')
).fail(->
alert("There was an error saving your changes. Please try again.")
)
cancel: (event) ->
event.preventDefault()
CMS.popView()
editSubmodule: (event) ->
event.preventDefault()
previewType = $(event.target).data('preview-type')
moduleType = $(event.target).data('type')
if moduleType == "CapawikiDescriptor"
CMS.pushView new CMS.Views.CapawikiEdit
model: new CMS.Models.Module
id: $(event.target).data('id')
type: if moduleType == 'None' then null else moduleType
previewType: if previewType == 'None' then null else previewType
else
CMS.pushView new CMS.Views.ModuleEdit
model: new CMS.Models.Module
id: $(event.target).data('id')
type: if moduleType == 'None' then null else moduleType
previewType: if previewType == 'None' then null else previewType
...@@ -5,7 +5,6 @@ class CMS.Views.ModuleEdit extends Backbone.View ...@@ -5,7 +5,6 @@ class CMS.Views.ModuleEdit extends Backbone.View
events: events:
'click .cancel': 'cancel' 'click .cancel': 'cancel'
'click .module-edit': 'editSubmodule' 'click .module-edit': 'editSubmodule'
'click .silent-save-update': 'silentSave'
'click .save-update': 'save' 'click .save-update': 'save'
initialize: -> initialize: ->
...@@ -29,17 +28,6 @@ class CMS.Views.ModuleEdit extends Backbone.View ...@@ -29,17 +28,6 @@ class CMS.Views.ModuleEdit extends Backbone.View
).fail(-> ).fail(->
alert("There was an error saving your changes. Please try again.") alert("There was an error saving your changes. Please try again.")
) )
silentSave: (event) ->
event.preventDefault()
@model.save().done((previews) =>
previews_section = @$el.find('.previews').empty()
$.each(previews, (idx, preview) =>
preview_wrapper = $('<section/>', class: 'preview').append preview
previews_section.append preview_wrapper
)
XModule.loadModules('display')
)
cancel: (event) -> cancel: (event) ->
event.preventDefault() event.preventDefault()
...@@ -49,8 +37,15 @@ class CMS.Views.ModuleEdit extends Backbone.View ...@@ -49,8 +37,15 @@ class CMS.Views.ModuleEdit extends Backbone.View
event.preventDefault() event.preventDefault()
previewType = $(event.target).data('preview-type') previewType = $(event.target).data('preview-type')
moduleType = $(event.target).data('type') moduleType = $(event.target).data('type')
CMS.pushView new CMS.Views.ModuleEdit if moduleType == "CapawikiDescriptor"
model: new CMS.Models.Module CMS.pushView new CMS.Views.CapawikiEdit
id: $(event.target).data('id') model: new CMS.Models.Module
type: if moduleType == 'None' then null else moduleType id: $(event.target).data('id')
previewType: if previewType == 'None' then null else previewType type: if moduleType == 'None' then null else moduleType
previewType: if previewType == 'None' then null else previewType
else
CMS.pushView new CMS.Views.ModuleEdit
model: new CMS.Models.Module
id: $(event.target).data('id')
type: if moduleType == 'None' then null else moduleType
previewType: if previewType == 'None' then null else previewType
<section class="capawiki-edit">
<div class="parser-message-box" style="display:none;">Input parsed successfully.</div>
<textarea name="" class="edit-box wiki-box" rows="8" cols="40" style="display: inline-block;">${data['wiki']}</textarea>
<textarea name="" class="edit-box capa-box" rows="8" cols="40">${data['capa']}</textarea>
</section>
...@@ -26,7 +26,7 @@ setup( ...@@ -26,7 +26,7 @@ setup(
"html = xmodule.html_module:HtmlDescriptor", "html = xmodule.html_module:HtmlDescriptor",
"image = xmodule.backcompat_module:TranslateCustomTagDescriptor", "image = xmodule.backcompat_module:TranslateCustomTagDescriptor",
"error = xmodule.error_module:ErrorDescriptor", "error = xmodule.error_module:ErrorDescriptor",
"problem = xmodule.capa_module:CapaDescriptor", "problem = xmodule.capawiki_module:CapawikiDescriptor",
"problemset = xmodule.vertical_module:VerticalDescriptor", "problemset = xmodule.vertical_module:VerticalDescriptor",
"section = xmodule.backcompat_module:SemanticSectionDescriptor", "section = xmodule.backcompat_module:SemanticSectionDescriptor",
"sequential = xmodule.seq_module:SequenceDescriptor", "sequential = xmodule.seq_module:SequenceDescriptor",
......
...@@ -565,9 +565,6 @@ class CapaDescriptor(RawDescriptor): ...@@ -565,9 +565,6 @@ class CapaDescriptor(RawDescriptor):
""" """
module_class = CapaModule module_class = CapaModule
mako_template = "widgets/capa-edit.html"
js_module_name = "CapaDescriptor"
js = {'coffee': [resource_string(__name__, 'js/src/capa/edit.coffee')]}
# VS[compat] # VS[compat]
# TODO (cpennington): Delete this method once all fall 2012 course are being # TODO (cpennington): Delete this method once all fall 2012 course are being
......
import json
import logging
from lxml import etree
from pkg_resources import resource_string, resource_listdir
from xmodule.x_module import XModule
from xmodule.raw_module import RawDescriptor
from xmodule.capa_module import CapaModule, CapaDescriptor
log = logging.getLogger(__name__)
class CapawikiModule(CapaModule):
def __init__(self, system, location, definition, instance_state=None, shared_state=None, **kwargs):
# self._definition = {'capa': '<problem />', 'wiki': ''}
self._definition = definition
if isinstance(definition['data'], dict) and 'capa' in definition['data']:
self.capa_definition = {'data': definition['data']['capa']}
else:
self.capa_definition = definition
super(CapawikiModule, self).__init__(system, location, self.capa_definition, instance_state,
shared_state, **kwargs)
class CapawikiDescriptor(CapaDescriptor):
js_module_name = "CapawikiDescriptor"
module_class = CapawikiModule
mako_template = "widgets/capawiki-edit.html"
...@@ -2,6 +2,8 @@ import logging ...@@ -2,6 +2,8 @@ import logging
from .xml import XMLModuleStore from .xml import XMLModuleStore
from .exceptions import DuplicateItemError from .exceptions import DuplicateItemError
import re
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
...@@ -32,7 +34,14 @@ def import_from_xml(store, data_dir, course_dirs=None, eager=True, ...@@ -32,7 +34,14 @@ def import_from_xml(store, data_dir, course_dirs=None, eager=True,
log.exception('Item already exists at %s' % module.location.url()) log.exception('Item already exists at %s' % module.location.url())
pass pass
if 'data' in module.definition: if 'data' in module.definition:
store.update_item(module.location, module.definition['data']) if module.location.category == "problem":
data = {
'capa': module.definition['data'],
'wiki': '',
}
store.update_item(module.location, data)
else:
store.update_item(module.location, module.definition['data'])
if 'children' in module.definition: if 'children' in module.definition:
store.update_children(module.location, module.definition['children']) store.update_children(module.location, module.definition['children'])
# NOTE: It's important to use own_metadata here to avoid writing # NOTE: It's important to use own_metadata here to avoid writing
......
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