Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
E
edx-platform-release
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Deploy
Releases
Package Registry
Model registry
Operate
Terraform modules
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Hsin-Yu Chien
edx-platform-release
Commits
d95a5e46
Commit
d95a5e46
authored
12 years ago
by
Piotr Mitros
Browse files
Options
Downloads
Patches
Plain Diff
Modular refactor: Better names (grade to get_score, etc.
parent
29f565dd
Loading
Loading
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
djangoapps/courseware/capa/inputtypes.py
+63
-16
63 additions, 16 deletions
djangoapps/courseware/capa/inputtypes.py
djangoapps/courseware/capa/responsetypes.py
+13
-13
13 additions, 13 deletions
djangoapps/courseware/capa/responsetypes.py
with
76 additions
and
29 deletions
djangoapps/courseware/capa/inputtypes.py
+
63
−
16
View file @
d95a5e46
...
...
@@ -33,7 +33,7 @@ from lxml import etree
from
mitxmako.shortcuts
import
render_to_string
class
SimpleInput
():
# XModule
'''
Type for simple inputs
'''
Type for simple inputs
-- plain HTML with a form element
State is a dictionary with optional keys:
* Value
* ID
...
...
@@ -42,18 +42,18 @@ class SimpleInput():# XModule
feedback from previous attempt)
'''
simple_type
s
=
{}
## Maps tags to functions
xml_tag
s
=
{}
## Maps tags to functions
@classmethod
def
get_xml_tags
(
c
):
return
c
.
simple_type
s
.
keys
()
return
c
.
xml_tag
s
.
keys
()
@classmethod
def
get_uses
(
c
):
return
[
'
capa_input
'
]
return
[
'
capa_input
'
,
'
capa_transform
'
]
def
get_html
(
self
):
return
self
.
simple_type
s
[
self
.
tag
](
self
.
xml
,
self
.
value
,
self
.
status
,
self
.
msg
)
return
self
.
xml_tag
s
[
self
.
tag
](
self
.
xml
,
self
.
value
,
self
.
status
,
self
.
msg
)
def
__init__
(
self
,
system
,
xml
,
item_id
=
None
,
track_url
=
None
,
state
=
None
,
use
=
'
capa_input
'
):
self
.
xml
=
xml
...
...
@@ -80,18 +80,65 @@ class SimpleInput():# XModule
if
'
status
'
in
state
:
self
.
status
=
state
[
'
status
'
]
def
simpleinput
(
fn
,
names
=
None
):
## TODO
# class SimpleTransform():
# ''' Type for simple XML to HTML transforms. Examples:
# * Math tags, which go from LON-CAPA-style m-tags to MathJAX
# '''
# xml_tags = {} ## Maps tags to functions
# @classmethod
# def get_xml_tags(c):
# return c.xml_tags.keys()
# @classmethod
# def get_uses(c):
# return ['capa_transform']
# def get_html(self):
# return self.xml_tags[self.tag](self.xml, self.value, self.status, self.msg)
# def __init__(self, system, xml, item_id = None, track_url=None, state=None, use = 'capa_input'):
# self.xml = xml
# self.tag = xml.tag
# if not state:
# state = {}
# if item_id:
# self.id = item_id
# if xml.get('id'):
# self.id = xml.get('id')
# if 'id' in state:
# self.id = state['id']
# self.system = system
# self.value = ''
# if 'value' in state:
# self.value = state['value']
# self.msg = ''
# if 'feedback' in state and 'message' in state['feedback']:
# self.msg = state['feedback']['message']
# self.status = 'unanswered'
# if 'status' in state:
# self.status = state['status']
def
register_render_function
(
fn
,
names
=
None
,
cls
=
SimpleInput
):
if
names
==
None
:
SimpleInput
.
simple_type
s
[
fn
.
__name__
]
=
fn
SimpleInput
.
xml_tag
s
[
fn
.
__name__
]
=
fn
else
:
raise
"
Unimplemented/input types
"
def
wrapped
():
return
fn
return
wrapped
#-----------------------------------------------------------------------------
@
simpleinput
@
register_render_function
def
optioninput
(
element
,
value
,
status
,
msg
=
''
):
'''
Select option input type.
...
...
@@ -125,7 +172,7 @@ def optioninput(element, value, status, msg=''):
return
etree
.
XML
(
html
)
#-----------------------------------------------------------------------------
@
simpleinput
@
register_render_function
def
choicegroup
(
element
,
value
,
status
,
msg
=
''
):
'''
Radio button inputs: multiple choice or true/false
...
...
@@ -148,7 +195,7 @@ def choicegroup(element, value, status, msg=''):
html
=
render_to_string
(
"
choicegroup.html
"
,
context
)
return
etree
.
XML
(
html
)
@
simpleinput
@
register_render_function
def
textline
(
element
,
value
,
state
,
msg
=
""
):
eid
=
element
.
get
(
'
id
'
)
count
=
int
(
eid
.
split
(
'
_
'
)[
-
2
])
-
1
# HACK
...
...
@@ -159,7 +206,7 @@ def textline(element, value, state, msg=""):
#-----------------------------------------------------------------------------
@
simpleinput
@
register_render_function
def
js_textline
(
element
,
value
,
status
,
msg
=
''
):
'''
Plan: We will inspect element to figure out type
...
...
@@ -185,7 +232,7 @@ def js_textline(element, value, status, msg=''):
#-----------------------------------------------------------------------------
## TODO: Make a wrapper for <codeinput>
@
simpleinput
@
register_render_function
def
textbox
(
element
,
value
,
status
,
msg
=
''
):
'''
The textbox is used for code input. The message is the return HTML string from
...
...
@@ -201,7 +248,7 @@ def textbox(element, value, status, msg=''):
return
etree
.
XML
(
html
)
#-----------------------------------------------------------------------------
@
simpleinput
@
register_render_function
def
schematic
(
element
,
value
,
status
,
msg
=
''
):
eid
=
element
.
get
(
'
id
'
)
height
=
element
.
get
(
'
height
'
)
...
...
@@ -226,7 +273,7 @@ def schematic(element, value, status, msg=''):
#-----------------------------------------------------------------------------
### TODO: Move out of inputtypes
@
simpleinput
@
register_render_function
def
math
(
element
,
value
,
status
,
msg
=
''
):
'''
This is not really an input type. It is a convention from Lon-CAPA, used for
...
...
@@ -261,7 +308,7 @@ def math(element, value, status, msg=''):
#-----------------------------------------------------------------------------
@
simpleinput
@
register_render_function
def
solution
(
element
,
value
,
status
,
msg
=
''
):
'''
This is not really an input type. It is just a <span>...</span> which is given an ID,
...
...
@@ -282,7 +329,7 @@ def solution(element, value, status, msg=''):
#-----------------------------------------------------------------------------
@
simpleinput
@
register_render_function
def
imageinput
(
element
,
value
,
status
,
msg
=
''
):
'''
Clickable image as an input field. Element should specify the image source, height, and width, eg
...
...
This diff is collapsed.
Click to expand it.
djangoapps/courseware/capa/responsetypes.py
+
13
−
13
View file @
d95a5e46
...
...
@@ -47,10 +47,10 @@ def compare_with_tolerance(v1, v2, tol):
return
abs
(
v1
-
v2
)
<=
tolerance
class
GenericResponse
(
object
):
__metaclass__
=
abc
.
ABCMeta
__metaclass__
=
abc
.
ABCMeta
# abc = Abstract Base Class
@abc.abstractmethod
def
g
rad
e
(
self
,
student_answers
):
def
g
et_scor
e
(
self
,
student_answers
):
pass
@abc.abstractmethod
...
...
@@ -61,7 +61,7 @@ class GenericResponse(object):
def
preprocess_response
(
self
):
pass
#Every response type needs methods "g
rad
e" and "get_answers"
#Every response type needs methods "g
et_scor
e" and "get_answers"
#-----------------------------------------------------------------------------
...
...
@@ -95,7 +95,7 @@ class MultipleChoiceResponse(GenericResponse):
raise
Exception
(
"
should have exactly one choice group per multiplechoicceresponse
"
)
self
.
answer_id
=
self
.
answer_id
[
0
]
def
g
rad
e
(
self
,
student_answers
):
def
g
et_scor
e
(
self
,
student_answers
):
if
self
.
answer_id
in
student_answers
and
student_answers
[
self
.
answer_id
]
in
self
.
correct_choices
:
return
{
self
.
answer_id
:
'
correct
'
}
else
:
...
...
@@ -132,7 +132,7 @@ class TrueFalseResponse(MultipleChoiceResponse):
else
:
choice
.
set
(
"
name
"
,
"
choice_
"
+
choice
.
get
(
"
name
"
))
def
g
rad
e
(
self
,
student_answers
):
def
g
et_scor
e
(
self
,
student_answers
):
correct
=
set
(
self
.
correct_choices
)
answers
=
set
(
student_answers
.
get
(
self
.
answer_id
,
[]))
...
...
@@ -162,7 +162,7 @@ class OptionResponse(GenericResponse):
print
'
[courseware.capa.responsetypes.OR.init] answer_fields=%s
'
%
(
self
.
answer_fields
)
self
.
context
=
context
def
g
rad
e
(
self
,
student_answers
):
def
g
et_scor
e
(
self
,
student_answers
):
cmap
=
{}
amap
=
self
.
get_answers
()
for
aid
in
amap
:
...
...
@@ -194,7 +194,7 @@ class NumericalResponse(GenericResponse):
except
Exception
,
err
:
self
.
answer_id
=
None
def
g
rad
e
(
self
,
student_answers
):
def
g
et_scor
e
(
self
,
student_answers
):
'''
Display HTML for a numeric response
'''
student_answer
=
student_answers
[
self
.
answer_id
]
try
:
...
...
@@ -300,7 +300,7 @@ def sympy_check2():
else
:
self
.
code
=
answer
.
text
def
g
rad
e
(
self
,
student_answers
):
def
g
et_scor
e
(
self
,
student_answers
):
'''
student_answers is a dict with everything from request.POST, but with the first part
of each key removed (the string before the first
"
_
"
).
...
...
@@ -363,7 +363,7 @@ def sympy_check2():
print
"
oops in customresponse (cfn) error %s
"
%
err
# print "context = ",self.context
print
traceback
.
format_exc
()
if
settings
.
DEBUG
:
print
"
[courseware.capa.responsetypes.customresponse.g
rad
e] ret =
"
,
ret
if
settings
.
DEBUG
:
print
"
[courseware.capa.responsetypes.customresponse.g
et_scor
e] ret =
"
,
ret
if
type
(
ret
)
==
dict
:
correct
[
0
]
=
'
correct
'
if
ret
[
'
ok
'
]
else
'
incorrect
'
msg
=
ret
[
'
msg
'
]
...
...
@@ -428,7 +428,7 @@ class ExternalResponse(GenericResponse):
self
.
tests
=
xml
.
get
(
'
answer
'
)
def
g
rad
e
(
self
,
student_answers
):
def
g
et_scor
e
(
self
,
student_answers
):
submission
=
[
student_answers
[
k
]
for
k
in
sorted
(
self
.
answer_ids
)]
self
.
context
.
update
({
'
submission
'
:
submission
})
...
...
@@ -504,7 +504,7 @@ class FormulaResponse(GenericResponse):
self
.
case_sensitive
=
False
def
g
rad
e
(
self
,
student_answers
):
def
g
et_scor
e
(
self
,
student_answers
):
variables
=
self
.
samples
.
split
(
'
@
'
)[
0
].
split
(
'
,
'
)
numsamples
=
int
(
self
.
samples
.
split
(
'
@
'
)[
1
].
split
(
'
#
'
)[
1
])
sranges
=
zip
(
*
map
(
lambda
x
:
map
(
float
,
x
.
split
(
"
,
"
)),
...
...
@@ -566,7 +566,7 @@ class SchematicResponse(GenericResponse):
else
:
self
.
code
=
answer
.
text
def
g
rad
e
(
self
,
student_answers
):
def
g
et_scor
e
(
self
,
student_answers
):
from
capa_problem
import
global_context
submission
=
[
json
.
loads
(
student_answers
[
k
])
for
k
in
sorted
(
self
.
answer_ids
)]
self
.
context
.
update
({
'
submission
'
:
submission
})
...
...
@@ -605,7 +605,7 @@ class ImageResponse(GenericResponse):
self
.
ielements
=
xml
.
findall
(
'
imageinput
'
)
self
.
answer_ids
=
[
ie
.
get
(
'
id
'
)
for
ie
in
self
.
ielements
]
def
g
rad
e
(
self
,
student_answers
):
def
g
et_scor
e
(
self
,
student_answers
):
correct_map
=
{}
expectedset
=
self
.
get_answers
()
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment