Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
E
edx-platform
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
edx
edx-platform
Commits
bae419f6
Commit
bae419f6
authored
Aug 03, 2012
by
Mike Chen
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
CapawikiModule by subclassing and replacing CapaModule
parent
97c3a1ff
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
292 additions
and
22 deletions
+292
-22
cms/static/coffee/src/models/capadescriptor.coffee
+148
-0
cms/static/coffee/src/views/capawiki.coffee
+87
-0
cms/static/coffee/src/views/module_edit.coffee
+12
-17
cms/templates/widgets/capawiki-edit.html
+5
-0
common/lib/xmodule/setup.py
+1
-1
common/lib/xmodule/xmodule/capa_module.py
+0
-3
common/lib/xmodule/xmodule/capawiki_module.py
+29
-0
common/lib/xmodule/xmodule/modulestore/xml_importer.py
+10
-1
No files found.
cms/static/coffee/src/models/capadescriptor.coffee
0 → 100644
View file @
bae419f6
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
cms/static/coffee/src/views/capawiki.coffee
0 → 100644
View file @
bae419f6
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
cms/static/coffee/src/views/module_edit.coffee
View file @
bae419f6
...
@@ -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
cms/templates/widgets/capawiki-edit.html
0 → 100644
View file @
bae419f6
<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>
common/lib/xmodule/setup.py
View file @
bae419f6
...
@@ -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:Capa
Descriptor"
,
"problem = xmodule.capa
wiki_module:Capawiki
Descriptor"
,
"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"
,
...
...
common/lib/xmodule/xmodule/capa_module.py
View file @
bae419f6
...
@@ -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
...
...
common/lib/xmodule/xmodule/capawiki_module.py
0 → 100644
View file @
bae419f6
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"
common/lib/xmodule/xmodule/modulestore/xml_importer.py
View file @
bae419f6
...
@@ -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
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment