Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
P
problem-builder
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
OpenEdx
problem-builder
Commits
f0acda19
Commit
f0acda19
authored
Jul 22, 2014
by
Xavier Antoviaque
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #46 from dragonfi/opaque-keys
Move to use opaque keys
parents
eb76233b
7e54dd78
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
39 additions
and
13 deletions
+39
-13
mentoring/answer.py
+3
-3
mentoring/dataexport.py
+2
-3
mentoring/light_children.py
+7
-7
mentoring/utils.py
+27
-0
No files found.
mentoring/answer.py
View file @
f0acda19
...
...
@@ -31,7 +31,7 @@ from xblock.fragment import Fragment
from
.light_children
import
LightChild
,
Boolean
,
Scope
,
String
,
Integer
from
.models
import
Answer
from
.utils
import
render_template
from
.utils
import
render_template
,
serialize_opaque_key
# Globals ###########################################################
...
...
@@ -137,11 +137,11 @@ class AnswerBlock(LightChild):
name
=
self
.
name
# Consistency check - we should have a name by now
if
not
name
:
raise
ValueError
,
'AnswerBlock.name field need to be set to a non-null/empty value'
raise
ValueError
(
'AnswerBlock.name field need to be set to a non-null/empty value'
)
# TODO: Why do we need to use `xmodule_runtime` and not `runtime`?
student_id
=
self
.
xmodule_runtime
.
anonymous_student_id
course_id
=
se
lf
.
xmodule_runtime
.
course_id
course_id
=
se
rialize_opaque_key
(
self
.
xmodule_runtime
.
course_id
)
answer_data
,
created
=
Answer
.
objects
.
get_or_create
(
student_id
=
student_id
,
...
...
mentoring/dataexport.py
View file @
f0acda19
...
...
@@ -31,7 +31,7 @@ from xblock.core import XBlock
from
xblock.fragment
import
Fragment
from
.models
import
Answer
from
.utils
import
list2csv
,
render_template
from
.utils
import
list2csv
,
render_template
,
serialize_opaque_key
# Globals ###########################################################
...
...
@@ -70,7 +70,7 @@ class MentoringDataExportBlock(XBlock):
return
response
def
get_csv
(
self
):
course_id
=
se
lf
.
xmodule_runtime
.
course_id
course_id
=
se
rialize_opaque_key
(
self
.
xmodule_runtime
.
course_id
)
answers
=
Answer
.
objects
.
filter
(
course_id
=
course_id
)
.
order_by
(
'student_id'
,
'name'
)
answers_names
=
answers
.
values_list
(
'name'
,
flat
=
True
)
.
distinct
()
.
order_by
(
'name'
)
...
...
@@ -96,4 +96,3 @@ class MentoringDataExportBlock(XBlock):
if
row
:
yield
list2csv
(
row
)
mentoring/light_children.py
View file @
f0acda19
...
...
@@ -44,9 +44,9 @@ try:
from
xmodule_modifiers
import
replace_jump_to_id_urls
except
:
# TODO-WORKBENCH-WORKAROUND: To allow to load from the workbench
replace_jump_to_id_urls
=
lambda
a
,
b
,
c
,
d
,
frag
,
f
:
frag
replace_jump_to_id_urls
=
lambda
a
,
b
,
c
,
d
,
frag
,
f
:
frag
from
.utils
import
XBlockWithChildrenFragmentsMixin
from
.utils
import
serialize_opaque_key
,
XBlockWithChildrenFragmentsMixin
# Globals ###########################################################
...
...
@@ -142,7 +142,7 @@ class LightChildrenMixin(XBlockWithChildrenFragmentsMixin):
frag
=
getattr
(
child
,
view_name
)(
context
)
frag
.
content
=
u'<div class="xblock-light-child" name="{}" data-type="{}">{}</div>'
.
format
(
child
.
name
,
child
.
__class__
.
__name__
,
frag
.
content
)
child
.
name
,
child
.
__class__
.
__name__
,
frag
.
content
)
return
frag
def
get_children_fragment
(
self
,
context
,
view_name
=
'student_view'
,
instance_of
=
None
,
...
...
@@ -188,7 +188,7 @@ class XBlockWithLightChildren(LightChildrenMixin, XBlock):
"""
# TODO: Why do we need to use `xmodule_runtime` and not `runtime`?
try
:
course_id
=
se
lf
.
xmodule_runtime
.
course_id
course_id
=
se
rialize_opaque_key
(
self
.
xmodule_runtime
.
course_id
)
except
AttributeError
:
# TODO-WORKBENCH-WORKAROUND: To allow to load from the workbench
course_id
=
'sample-course'
...
...
@@ -298,10 +298,10 @@ class LightChild(Plugin, LightChildrenMixin):
name
=
self
.
name
if
not
name
:
raise
ValueError
,
'LightChild.name field need to be set to a non-null/empty value'
raise
ValueError
(
'LightChild.name field need to be set to a non-null/empty value'
)
student_id
=
self
.
xmodule_runtime
.
anonymous_student_id
course_id
=
se
lf
.
xmodule_runtime
.
course_id
course_id
=
se
rialize_opaque_key
(
self
.
xmodule_runtime
.
course_id
)
url_name
=
"
%
s-
%
s"
%
(
self
.
xblock_container
.
url_name
,
name
)
lightchild_data
,
created
=
LightChildModel
.
objects
.
get_or_create
(
...
...
@@ -349,7 +349,7 @@ class Integer(LightChildField):
def
__set__
(
self
,
instance
,
value
):
try
:
self
.
data
[
instance
]
=
int
(
value
)
except
(
TypeError
,
ValueError
):
# not an integer
except
(
TypeError
,
ValueError
):
# not an integer
self
.
data
[
instance
]
=
0
...
...
mentoring/utils.py
View file @
f0acda19
...
...
@@ -47,6 +47,7 @@ def load_resource(resource_path):
resource_content
=
pkg_resources
.
resource_string
(
__name__
,
resource_path
)
return
unicode
(
resource_content
)
def
render_template
(
template_path
,
context
=
{}):
"""
Evaluate a template by resource path, applying the provided context
...
...
@@ -55,6 +56,7 @@ def render_template(template_path, context={}):
template
=
Template
(
template_str
)
return
template
.
render
(
Context
(
context
))
def
list2csv
(
row
):
"""
Convert a list to a CSV string (single row)
...
...
@@ -65,6 +67,7 @@ def list2csv(row):
f
.
seek
(
0
)
return
f
.
read
()
def
get_scenarios_from_path
(
scenarios_path
,
include_identifier
=
False
):
"""
Returns an array of (title, xmlcontent) from files contained in a specified directory,
...
...
@@ -88,6 +91,7 @@ def get_scenarios_from_path(scenarios_path, include_identifier=False):
return
scenarios
def
load_scenarios_from_path
(
scenarios_path
):
"""
Load all xml files contained in a specified directory, as workbench scenarios
...
...
@@ -95,6 +99,29 @@ def load_scenarios_from_path(scenarios_path):
return
get_scenarios_from_path
(
scenarios_path
,
include_identifier
=
True
)
def
serialize_opaque_key
(
key
):
"""
Gracefully handle opaque keys, both before and after the transition.
https://github.com/edx/edx-platform/wiki/Opaque-Keys
From https://github.com/edx/edx-ora2/pull/330
Currently uses `to_deprecated_string()` to ensure that new keys
are backwards-compatible with keys we store in ORA2 database models.
Args:
key (unicode or OpaqueKey subclass): The key to serialize.
Returns:
unicode
"""
if
hasattr
(
key
,
'to_deprecated_string'
):
return
key
.
to_deprecated_string
()
else
:
return
unicode
(
key
)
# Classes ###########################################################
class
XBlockWithChildrenFragmentsMixin
(
object
):
...
...
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