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
6a3f0c14
Commit
6a3f0c14
authored
Aug 12, 2013
by
David Baumgold
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #564 from edx/db/xblock-student-view
XBlock integration for Studio: student view
parents
0db8ad28
32f76988
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
62 additions
and
76 deletions
+62
-76
cms/djangoapps/contentstore/tests/test_contentstore.py
+15
-15
cms/djangoapps/contentstore/tests/test_item.py
+1
-1
cms/djangoapps/contentstore/views/item.py
+11
-8
cms/djangoapps/contentstore/views/preview.py
+6
-11
common/lib/xmodule/xmodule/x_module.py
+29
-41
No files found.
cms/djangoapps/contentstore/tests/test_contentstore.py
View file @
6a3f0c14
...
...
@@ -1353,7 +1353,7 @@ class ContentStoreTest(ModuleStoreTestCase):
'course'
:
loc
.
course
,
'name'
:
loc
.
name
}))
self
.
assert
Equal
(
200
,
resp
.
status_code
)
self
.
assert
2XX
(
resp
.
status_code
)
self
.
assertContains
(
resp
,
'Chapter 2'
)
# go to various pages
...
...
@@ -1363,92 +1363,92 @@ class ContentStoreTest(ModuleStoreTestCase):
kwargs
=
{
'org'
:
loc
.
org
,
'course'
:
loc
.
course
,
'name'
:
loc
.
name
}))
self
.
assert
Equal
(
200
,
resp
.
status_code
)
self
.
assert
2XX
(
resp
.
status_code
)
# export page
resp
=
self
.
client
.
get
(
reverse
(
'export_course'
,
kwargs
=
{
'org'
:
loc
.
org
,
'course'
:
loc
.
course
,
'name'
:
loc
.
name
}))
self
.
assert
Equal
(
200
,
resp
.
status_code
)
self
.
assert
2XX
(
resp
.
status_code
)
# manage users
resp
=
self
.
client
.
get
(
reverse
(
'manage_users'
,
kwargs
=
{
'org'
:
loc
.
org
,
'course'
:
loc
.
course
,
'name'
:
loc
.
name
}))
self
.
assert
Equal
(
200
,
resp
.
status_code
)
self
.
assert
2XX
(
resp
.
status_code
)
# course info
resp
=
self
.
client
.
get
(
reverse
(
'course_info'
,
kwargs
=
{
'org'
:
loc
.
org
,
'course'
:
loc
.
course
,
'name'
:
loc
.
name
}))
self
.
assert
Equal
(
200
,
resp
.
status_code
)
self
.
assert
2XX
(
resp
.
status_code
)
# settings_details
resp
=
self
.
client
.
get
(
reverse
(
'settings_details'
,
kwargs
=
{
'org'
:
loc
.
org
,
'course'
:
loc
.
course
,
'name'
:
loc
.
name
}))
self
.
assert
Equal
(
200
,
resp
.
status_code
)
self
.
assert
2XX
(
resp
.
status_code
)
# settings_details
resp
=
self
.
client
.
get
(
reverse
(
'settings_grading'
,
kwargs
=
{
'org'
:
loc
.
org
,
'course'
:
loc
.
course
,
'name'
:
loc
.
name
}))
self
.
assert
Equal
(
200
,
resp
.
status_code
)
self
.
assert
2XX
(
resp
.
status_code
)
# static_pages
resp
=
self
.
client
.
get
(
reverse
(
'static_pages'
,
kwargs
=
{
'org'
:
loc
.
org
,
'course'
:
loc
.
course
,
'coursename'
:
loc
.
name
}))
self
.
assert
Equal
(
200
,
resp
.
status_code
)
self
.
assert
2XX
(
resp
.
status_code
)
# static_pages
resp
=
self
.
client
.
get
(
reverse
(
'asset_index'
,
kwargs
=
{
'org'
:
loc
.
org
,
'course'
:
loc
.
course
,
'name'
:
loc
.
name
}))
self
.
assert
Equal
(
200
,
resp
.
status_code
)
self
.
assert
2XX
(
resp
.
status_code
)
# go look at a subsection page
subsection_location
=
loc
.
replace
(
category
=
'sequential'
,
name
=
'test_sequence'
)
resp
=
self
.
client
.
get
(
reverse
(
'edit_subsection'
,
kwargs
=
{
'location'
:
subsection_location
.
url
()}))
self
.
assert
Equal
(
200
,
resp
.
status_code
)
self
.
assert
2XX
(
resp
.
status_code
)
# go look at the Edit page
unit_location
=
loc
.
replace
(
category
=
'vertical'
,
name
=
'test_vertical'
)
resp
=
self
.
client
.
get
(
reverse
(
'edit_unit'
,
kwargs
=
{
'location'
:
unit_location
.
url
()}))
self
.
assert
Equal
(
200
,
resp
.
status_code
)
self
.
assert
2XX
(
resp
.
status_code
)
# delete a component
del_loc
=
loc
.
replace
(
category
=
'html'
,
name
=
'test_html'
)
resp
=
self
.
client
.
post
(
reverse
(
'delete_item'
),
json
.
dumps
({
'id'
:
del_loc
.
url
()}),
"application/json"
)
self
.
assert
Equal
(
200
,
resp
.
status_code
)
self
.
assert
2XX
(
resp
.
status_code
)
# delete a unit
del_loc
=
loc
.
replace
(
category
=
'vertical'
,
name
=
'test_vertical'
)
resp
=
self
.
client
.
post
(
reverse
(
'delete_item'
),
json
.
dumps
({
'id'
:
del_loc
.
url
()}),
"application/json"
)
self
.
assert
Equal
(
200
,
resp
.
status_code
)
self
.
assert
2XX
(
resp
.
status_code
)
# delete a unit
del_loc
=
loc
.
replace
(
category
=
'sequential'
,
name
=
'test_sequence'
)
resp
=
self
.
client
.
post
(
reverse
(
'delete_item'
),
json
.
dumps
({
'id'
:
del_loc
.
url
()}),
"application/json"
)
self
.
assert
Equal
(
200
,
resp
.
status_code
)
self
.
assert
2XX
(
resp
.
status_code
)
# delete a chapter
del_loc
=
loc
.
replace
(
category
=
'chapter'
,
name
=
'chapter_2'
)
resp
=
self
.
client
.
post
(
reverse
(
'delete_item'
),
json
.
dumps
({
'id'
:
del_loc
.
url
()}),
"application/json"
)
self
.
assert
Equal
(
200
,
resp
.
status_code
)
self
.
assert
2XX
(
resp
.
status_code
)
def
test_import_into_new_course_id
(
self
):
module_store
=
modulestore
(
'direct'
)
...
...
cms/djangoapps/contentstore/tests/test_item.py
View file @
6a3f0c14
...
...
@@ -34,7 +34,7 @@ class DeleteItem(CourseTestCase):
resp
.
content
,
"application/json"
)
self
.
assert
Equal
(
resp
.
status_code
,
200
)
self
.
assert
2XX
(
resp
.
status_code
)
class
TestCreateItem
(
CourseTestCase
):
...
...
cms/djangoapps/contentstore/views/item.py
View file @
6a3f0c14
import
json
from
uuid
import
uuid4
from
django.core.exceptions
import
PermissionDenied
from
django.http
import
HttpResponse
from
django.contrib.auth.decorators
import
login_required
from
xmodule.modulestore
import
Location
from
xmodule.modulestore.django
import
modulestore
from
xmodule.modulestore.inheritance
import
own_metadata
from
util.json_request
import
expect_json
from
util.json_request
import
expect_json
,
JsonResponse
from
..utils
import
get_modulestore
from
.access
import
has_access
from
.requests
import
_xmodule_recurse
...
...
@@ -20,6 +18,7 @@ __all__ = ['save_item', 'create_item', 'delete_item']
# cdodge: these are categories which should not be parented, they are detached from the hierarchy
DETACHED_CATEGORIES
=
[
'about'
,
'static_tab'
,
'course_info'
]
@login_required
@expect_json
def
save_item
(
request
):
...
...
@@ -80,7 +79,7 @@ def save_item(request):
# commit to datastore
store
.
update_metadata
(
item_location
,
own_metadata
(
existing_item
))
return
Http
Response
()
return
Json
Response
()
# [DHM] A hack until we implement a permanent soln. Proposed perm solution is to make namespace fields also top level
...
...
@@ -139,13 +138,17 @@ def create_item(request):
if
display_name
is
not
None
:
metadata
[
'display_name'
]
=
display_name
get_modulestore
(
category
)
.
create_and_save_xmodule
(
dest_location
,
definition_data
=
data
,
metadata
=
metadata
,
system
=
parent
.
system
)
get_modulestore
(
category
)
.
create_and_save_xmodule
(
dest_location
,
definition_data
=
data
,
metadata
=
metadata
,
system
=
parent
.
system
,
)
if
category
not
in
DETACHED_CATEGORIES
:
get_modulestore
(
parent
.
location
)
.
update_children
(
parent_location
,
parent
.
children
+
[
dest_location
.
url
()])
return
HttpResponse
(
json
.
dumps
({
'id'
:
dest_location
.
url
()})
)
return
JsonResponse
({
'id'
:
dest_location
.
url
()}
)
@login_required
...
...
@@ -184,4 +187,4 @@ def delete_item(request):
parent
.
children
=
children
modulestore
(
'direct'
)
.
update_children
(
parent
.
location
,
parent
.
children
)
return
Http
Response
()
return
Json
Response
()
cms/djangoapps/contentstore/views/preview.py
View file @
6a3f0c14
...
...
@@ -76,7 +76,7 @@ def preview_component(request, location):
component
=
modulestore
()
.
get_item
(
location
)
return
render_to_response
(
'component.html'
,
{
'preview'
:
get_
module_previews
(
request
,
component
)[
0
]
,
'preview'
:
get_
preview_html
(
request
,
component
,
0
)
,
'editor'
:
wrap_xmodule
(
component
.
get_html
,
component
,
'xmodule_edit.html'
)(),
})
...
...
@@ -163,15 +163,10 @@ def load_preview_module(request, preview_id, descriptor):
return
module
def
get_
module_previews
(
request
,
descriptor
):
def
get_
preview_html
(
request
,
descriptor
,
idx
):
"""
Returns a list of preview XModule html contents. One preview is returned for each
pair of states returned by get_sample_state() for the supplied descriptor.
descriptor: An XModuleDescriptor
Returns the HTML returned by the XModule's student_view,
specified by the descriptor and idx.
"""
preview_html
=
[]
for
idx
,
(
_instance_state
,
_shared_state
)
in
enumerate
(
descriptor
.
get_sample_state
()):
module
=
load_preview_module
(
request
,
str
(
idx
),
descriptor
)
preview_html
.
append
(
module
.
get_html
())
return
preview_html
module
=
load_preview_module
(
request
,
str
(
idx
),
descriptor
)
return
module
.
runtime
.
render
(
module
,
None
,
"student_view"
)
.
content
common/lib/xmodule/xmodule/x_module.py
View file @
6a3f0c14
...
...
@@ -711,20 +711,20 @@ class XModuleDescriptor(XModuleFields, HTMLSnippet, ResourceTemplates, XBlock):
# =============================== BUILTIN METHODS ==========================
def
__eq__
(
self
,
other
):
eq
=
(
self
.
__class__
==
other
.
__class__
and
return
(
self
.
__class__
==
other
.
__class__
and
all
(
getattr
(
self
,
attr
,
None
)
==
getattr
(
other
,
attr
,
None
)
for
attr
in
self
.
equality_attributes
))
return
eq
def
__repr__
(
self
):
return
(
"{class_}({system!r}, location={location!r},"
" model_data={model_data!r})"
.
format
(
class_
=
self
.
__class__
.
__name__
,
system
=
self
.
system
,
location
=
self
.
location
,
model_data
=
self
.
_model_data
,
))
return
(
"{class_}({system!r}, location={location!r},"
" model_data={model_data!r})"
.
format
(
class_
=
self
.
__class__
.
__name__
,
system
=
self
.
system
,
location
=
self
.
location
,
model_data
=
self
.
_model_data
,
)
)
@property
def
non_editable_metadata_fields
(
self
):
...
...
@@ -785,15 +785,17 @@ class XModuleDescriptor(XModuleFields, HTMLSnippet, ResourceTemplates, XBlock):
editor_type
=
"Float"
elif
isinstance
(
field
,
List
):
editor_type
=
"List"
metadata_fields
[
field
.
name
]
=
{
'field_name'
:
field
.
name
,
'type'
:
editor_type
,
'display_name'
:
field
.
display_name
,
'value'
:
field
.
to_json
(
value
),
'options'
:
[]
if
values
is
None
else
values
,
'default_value'
:
field
.
to_json
(
default_value
),
'inheritable'
:
inheritable
,
'explicitly_set'
:
explicitly_set
,
'help'
:
field
.
help
}
metadata_fields
[
field
.
name
]
=
{
'field_name'
:
field
.
name
,
'type'
:
editor_type
,
'display_name'
:
field
.
display_name
,
'value'
:
field
.
to_json
(
value
),
'options'
:
[]
if
values
is
None
else
values
,
'default_value'
:
field
.
to_json
(
default_value
),
'inheritable'
:
inheritable
,
'explicitly_set'
:
explicitly_set
,
'help'
:
field
.
help
,
}
return
metadata_fields
...
...
@@ -885,28 +887,14 @@ class ModuleSystem(Runtime):
Note that these functions can be closures over e.g. a django request
and user, or other environment-specific info.
'''
def
__init__
(
self
,
ajax_url
,
track_function
,
get_module
,
render_template
,
replace_urls
,
xblock_model_data
,
user
=
None
,
filestore
=
None
,
debug
=
False
,
xqueue
=
None
,
publish
=
None
,
node_path
=
""
,
anonymous_student_id
=
''
,
course_id
=
None
,
open_ended_grading_interface
=
None
,
s3_interface
=
None
,
cache
=
None
,
can_execute_unsafe_code
=
None
,
replace_course_urls
=
None
,
replace_jump_to_id_urls
=
None
):
def
__init__
(
self
,
ajax_url
,
track_function
,
get_module
,
render_template
,
replace_urls
,
xblock_model_data
,
user
=
None
,
filestore
=
None
,
debug
=
False
,
xqueue
=
None
,
publish
=
None
,
node_path
=
""
,
anonymous_student_id
=
''
,
course_id
=
None
,
open_ended_grading_interface
=
None
,
s3_interface
=
None
,
cache
=
None
,
can_execute_unsafe_code
=
None
,
replace_course_urls
=
None
,
replace_jump_to_id_urls
=
None
):
'''
Create a closure around the system environment.
...
...
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