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
f07bc1ce
Commit
f07bc1ce
authored
Mar 09, 2016
by
lenacom
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fixed comments
parent
85f494db
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
40 additions
and
27 deletions
+40
-27
lms/djangoapps/course_api/blocks/api.py
+6
-6
lms/djangoapps/course_api/blocks/forms.py
+2
-2
lms/djangoapps/course_api/blocks/serializers.py
+1
-0
lms/djangoapps/course_api/blocks/tests/test_api.py
+18
-10
lms/djangoapps/course_api/blocks/tests/test_forms.py
+1
-1
lms/djangoapps/course_api/blocks/tests/test_serializers.py
+4
-2
lms/djangoapps/course_api/blocks/tests/test_views.py
+1
-0
lms/djangoapps/course_api/blocks/views.py
+7
-6
No files found.
lms/djangoapps/course_api/blocks/api.py
View file @
f07bc1ce
...
...
@@ -20,7 +20,7 @@ def get_blocks(
block_counts
=
None
,
student_view_data
=
None
,
return_type
=
'dict'
,
block_type
s
=
None
,
block_type
_filter
=
None
,
):
"""
Return a serialized representation of the course blocks.
...
...
@@ -45,8 +45,8 @@ def get_blocks(
which blocks to return their student_view_data.
return_type (string): Possible values are 'dict' or 'list'. Indicates
the format for returning the blocks.
block_type
s (list): Optional list of names of block types which to
return
blocks.
block_type
_filter (list): Optional list of block type names used to filter
the final result of returned
blocks.
"""
# create ordered list of transformers, adding BlocksAPITransformer at end.
transformers
=
BlockStructureTransformers
()
...
...
@@ -65,14 +65,14 @@ def get_blocks(
blocks
=
get_course_blocks
(
user
,
usage_key
,
transformers
)
# filter blocks by types
if
block_type
s
:
if
block_type
_filter
:
block_keys_to_remove
=
[]
for
block_key
in
blocks
:
block_type
=
blocks
.
get_xblock_field
(
block_key
,
'category'
)
if
block_type
not
in
block_type
s
:
if
block_type
not
in
block_type
_filter
:
block_keys_to_remove
.
append
(
block_key
)
for
block_key
in
block_keys_to_remove
:
blocks
.
remove_block
(
block_key
,
True
)
blocks
.
remove_block
(
block_key
,
keep_descendants
=
True
)
# serialize
serializer_context
=
{
...
...
lms/djangoapps/course_api/blocks/forms.py
View file @
f07bc1ce
...
...
@@ -31,7 +31,7 @@ class BlockListGetForm(Form):
student_view_data
=
MultiValueField
(
required
=
False
)
usage_key
=
CharField
(
required
=
True
)
username
=
CharField
(
required
=
False
)
block_type
s
=
MultiValueField
(
required
=
False
)
block_type
_filter
=
MultiValueField
(
required
=
False
)
def
clean_depth
(
self
):
"""
...
...
@@ -89,7 +89,7 @@ class BlockListGetForm(Form):
'student_view_data'
,
'block_counts'
,
'nav_depth'
,
'block_type
s
'
,
'block_type
_filter
'
,
]
for
additional_field
in
additional_requested_fields
:
field_value
=
cleaned_data
.
get
(
additional_field
)
...
...
lms/djangoapps/course_api/blocks/serializers.py
View file @
f07bc1ce
...
...
@@ -77,6 +77,7 @@ class BlockDictSerializer(serializers.Serializer): # pylint: disable=abstract-m
Serializer that formats a BlockStructure object to a dictionary, rather
than a list, of blocks
"""
root
=
serializers
.
CharField
(
source
=
'root_block_usage_key'
)
blocks
=
serializers
.
SerializerMethodField
()
def
get_blocks
(
self
,
structure
):
...
...
lms/djangoapps/course_api/blocks/tests/test_api.py
View file @
f07bc1ce
...
...
@@ -12,6 +12,8 @@ from xmodule.modulestore.tests.factories import SampleCourseFactory
from
..api
import
get_blocks
import
re
class
TestGetBlocks
(
EnableTransformerRegistryMixin
,
SharedModuleStoreTestCase
):
"""
...
...
@@ -35,6 +37,7 @@ class TestGetBlocks(EnableTransformerRegistryMixin, SharedModuleStoreTestCase):
def
test_basic
(
self
):
blocks
=
get_blocks
(
self
.
request
,
self
.
course
.
location
,
self
.
user
)
self
.
assertEquals
(
blocks
[
'root'
],
unicode
(
self
.
course
.
location
))
# subtract for (1) the orphaned course About block and (2) the hidden Html block
self
.
assertEquals
(
len
(
blocks
[
'blocks'
]),
len
(
self
.
store
.
get_items
(
self
.
course
.
id
))
-
2
)
...
...
@@ -62,6 +65,7 @@ class TestGetBlocks(EnableTransformerRegistryMixin, SharedModuleStoreTestCase):
sequential_block
=
self
.
store
.
get_item
(
self
.
course
.
id
.
make_usage_key
(
'sequential'
,
'sequential_y1'
))
blocks
=
get_blocks
(
self
.
request
,
sequential_block
.
location
,
self
.
user
)
self
.
assertEquals
(
blocks
[
'root'
],
unicode
(
sequential_block
.
location
))
self
.
assertEquals
(
len
(
blocks
[
'blocks'
]),
5
)
for
block_type
,
block_name
,
is_inside_of_structure
in
(
...
...
@@ -79,13 +83,17 @@ class TestGetBlocks(EnableTransformerRegistryMixin, SharedModuleStoreTestCase):
def
test_filtering_by_block_types
(
self
):
sequential_block
=
self
.
store
.
get_item
(
self
.
course
.
id
.
make_usage_key
(
'sequential'
,
'sequential_y1'
))
block_types
=
[
'problem'
]
blocks
=
get_blocks
(
self
.
request
,
sequential_block
.
location
,
self
.
user
,
block_types
=
block_types
)
for
block_type
,
block_name
in
(
(
'problem'
,
'problem_y1a_1'
),
(
'problem'
,
'problem_y1a_2'
),
(
'problem'
,
'problem_y1a_3'
),
):
block
=
self
.
store
.
get_item
(
self
.
course
.
id
.
make_usage_key
(
block_type
,
block_name
))
self
.
assertIn
(
unicode
(
block
.
location
),
blocks
[
'blocks'
])
# not filtered blocks
blocks
=
get_blocks
(
self
.
request
,
sequential_block
.
location
,
self
.
user
)
self
.
assertEquals
(
len
(
blocks
[
'blocks'
]),
5
)
found_not_problem
=
False
for
key
in
blocks
[
'blocks'
]:
if
not
re
.
search
(
r'/problem/'
,
key
):
found_not_problem
=
True
self
.
assertTrue
(
found_not_problem
)
# filtered blocks
blocks
=
get_blocks
(
self
.
request
,
sequential_block
.
location
,
self
.
user
,
block_type_filter
=
[
'problem'
])
self
.
assertEquals
(
len
(
blocks
[
'blocks'
]),
3
)
for
key
in
blocks
[
'blocks'
]:
self
.
assertTrue
(
re
.
search
(
r'/problem/'
,
key
))
lms/djangoapps/course_api/blocks/tests/test_forms.py
View file @
f07bc1ce
...
...
@@ -60,7 +60,7 @@ class TestBlockListGetForm(EnableTransformerRegistryMixin, FormTestMixin, Shared
'usage_key'
:
usage_key
,
'username'
:
self
.
student
.
username
,
'user'
:
self
.
student
,
'block_type
s
'
:
set
(),
'block_type
_filter
'
:
set
(),
}
def
assert_raises_permission_denied
(
self
):
...
...
lms/djangoapps/course_api/blocks/tests/test_serializers.py
View file @
f07bc1ce
...
...
@@ -118,8 +118,7 @@ class TestBlockSerializer(TestBlockSerializerBase):
def
test_additional_requested_fields
(
self
):
self
.
add_additional_requested_fields
()
serializer
=
self
.
create_serializer
()
for
serialized_block
in
serializer
.
data
:
self
.
assert_extended_block
(
serialized_block
)
self
.
assertEqual
(
5
,
len
(
serializer
.
data
))
class
TestBlockDictSerializer
(
TestBlockSerializerBase
):
...
...
@@ -138,6 +137,9 @@ class TestBlockDictSerializer(TestBlockSerializerBase):
def
test_basic
(
self
):
serializer
=
self
.
create_serializer
()
# verify root
self
.
assertEquals
(
serializer
.
data
[
'root'
],
unicode
(
self
.
block_structure
.
root_block_usage_key
))
# verify blocks
for
block_key_string
,
serialized_block
in
serializer
.
data
[
'blocks'
]
.
iteritems
():
self
.
assertEquals
(
serialized_block
[
'id'
],
block_key_string
)
...
...
lms/djangoapps/course_api/blocks/tests/test_views.py
View file @
f07bc1ce
...
...
@@ -173,6 +173,7 @@ class TestBlocksView(EnableTransformerRegistryMixin, SharedModuleStoreTestCase):
def
test_basic
(
self
):
response
=
self
.
verify_response
()
self
.
assertEquals
(
response
.
data
[
'root'
],
unicode
(
self
.
course_usage_key
))
self
.
verify_response_block_dict
(
response
)
for
block_key_string
,
block_data
in
response
.
data
[
'blocks'
]
.
iteritems
():
block_key
=
deserialize_usage_key
(
block_key_string
,
self
.
course_key
)
...
...
lms/djangoapps/course_api/blocks/views.py
View file @
f07bc1ce
...
...
@@ -33,7 +33,7 @@ class BlocksView(DeveloperErrorViewMixin, ListAPIView):
&requested_fields=graded,format,student_view_multi_device,lti_url
&block_counts=video
&student_view_data=video
&block_type
s
=problem,html
&block_type
_filter
=problem,html
**Parameters**:
...
...
@@ -86,10 +86,11 @@ class BlocksView(DeveloperErrorViewMixin, ListAPIView):
Example: return_type=dict
* block_types: (list) Requested types of blocks. Possible values include sequential,
vertical, html, problem, video, and discussion.
* block_type_filter: (list) Requested types of blocks used to filter the final result
of returned blocks. Possible values include sequential,vertical, html, problem,
video, and discussion.
Example: block_type
s
=vertical,html
Example: block_type
_filter
=vertical,html
**Response Values**
...
...
@@ -185,7 +186,7 @@ class BlocksView(DeveloperErrorViewMixin, ListAPIView):
params
.
cleaned_data
.
get
(
'block_counts'
,
[]),
params
.
cleaned_data
.
get
(
'student_view_data'
,
[]),
params
.
cleaned_data
[
'return_type'
],
params
.
cleaned_data
.
get
(
'block_type
s
'
,
None
),
params
.
cleaned_data
.
get
(
'block_type
_filter
'
,
None
),
)
)
except
ItemNotFoundError
as
exception
:
...
...
@@ -209,7 +210,7 @@ class BlocksInCourseView(BlocksView):
&requested_fields=graded,format,student_view_multi_device,lti_url
&block_counts=video
&student_view_data=video
&block_type
s
=problem,html
&block_type
_filter
=problem,html
**Parameters**:
...
...
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