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
046ee7bd
Commit
046ee7bd
authored
Oct 17, 2016
by
Christina Roberts
Committed by
GitHub
Oct 17, 2016
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #12923 from CredoReference/static-page-for-instructors-only
Ability to hide Pages from students
parents
41b519fd
bb09fdb7
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
77 additions
and
6 deletions
+77
-6
cms/djangoapps/contentstore/views/item.py
+10
-3
common/lib/xmodule/xmodule/html_module.py
+7
-0
common/lib/xmodule/xmodule/modulestore/xml.py
+1
-0
common/lib/xmodule/xmodule/tabs.py
+9
-1
common/lib/xmodule/xmodule/tests/test_import.py
+15
-0
common/test/data/toy/policies/2012_Fall.json
+1
-1
lms/djangoapps/courseware/tabs.py
+5
-1
lms/djangoapps/courseware/tests/test_tabs.py
+29
-0
No files found.
cms/djangoapps/contentstore/views/item.py
View file @
046ee7bd
...
...
@@ -546,9 +546,16 @@ def _save_xblock(user, xblock, data=None, children_strings=None, metadata=None,
# find the course's reference to this tab and update the name.
static_tab
=
CourseTabList
.
get_tab_by_slug
(
course
.
tabs
,
xblock
.
location
.
name
)
# only update if changed
if
static_tab
and
static_tab
[
'name'
]
!=
xblock
.
display_name
:
static_tab
[
'name'
]
=
xblock
.
display_name
store
.
update_item
(
course
,
user
.
id
)
if
static_tab
:
update_tab
=
False
if
static_tab
[
'name'
]
!=
xblock
.
display_name
:
static_tab
[
'name'
]
=
xblock
.
display_name
update_tab
=
True
if
static_tab
[
'course_staff_only'
]
!=
xblock
.
course_staff_only
:
static_tab
[
'course_staff_only'
]
=
xblock
.
course_staff_only
update_tab
=
True
if
update_tab
:
store
.
update_item
(
course
,
user
.
id
)
result
=
{
'id'
:
unicode
(
xblock
.
location
),
...
...
common/lib/xmodule/xmodule/html_module.py
View file @
046ee7bd
...
...
@@ -368,6 +368,13 @@ class StaticTabFields(object):
scope
=
Scope
.
settings
,
default
=
"Empty"
,
)
course_staff_only
=
Boolean
(
display_name
=
_
(
"Hide Page From Learners"
),
help
=
_
(
"If you select this option, only course team members with"
" the Staff or Admin role see this page."
),
default
=
False
,
scope
=
Scope
.
settings
)
data
=
String
(
default
=
textwrap
.
dedent
(
u"""
\
<p>Add the content you want students to see on this page.</p>
...
...
common/lib/xmodule/xmodule/modulestore/xml.py
View file @
046ee7bd
...
...
@@ -730,6 +730,7 @@ class XMLModuleStore(ModuleStoreReadBase):
tab
=
CourseTabList
.
get_tab_by_slug
(
tab_list
=
course_descriptor
.
tabs
,
url_slug
=
slug
)
if
tab
:
module
.
display_name
=
tab
.
name
module
.
course_staff_only
=
tab
.
course_staff_only
module
.
data_dir
=
course_dir
module
.
save
()
...
...
common/lib/xmodule/xmodule/tabs.py
View file @
046ee7bd
...
...
@@ -58,6 +58,9 @@ class CourseTab(object):
# If there is a single view associated with this tab, this is the name of it
view_name
=
None
# True if this tab should be displayed only for instructors
course_staff_only
=
False
def
__init__
(
self
,
tab_dict
):
"""
Initializes class members with values passed in by subclasses.
...
...
@@ -69,6 +72,7 @@ class CourseTab(object):
self
.
name
=
tab_dict
.
get
(
'name'
,
self
.
title
)
self
.
tab_id
=
tab_dict
.
get
(
'tab_id'
,
getattr
(
self
,
'tab_id'
,
self
.
type
))
self
.
link_func
=
tab_dict
.
get
(
'link_func'
,
link_reverse_func
(
self
.
view_name
))
self
.
course_staff_only
=
tab_dict
.
get
(
'course_staff_only'
,
False
)
self
.
is_hidden
=
tab_dict
.
get
(
'is_hidden'
,
False
)
...
...
@@ -105,6 +109,8 @@ class CourseTab(object):
return
self
.
tab_id
elif
key
==
'is_hidden'
:
return
self
.
is_hidden
elif
key
==
'course_staff_only'
:
return
self
.
course_staff_only
else
:
raise
KeyError
(
'Key {0} not present in tab {1}'
.
format
(
key
,
self
.
to_json
()))
...
...
@@ -121,6 +127,8 @@ class CourseTab(object):
self
.
tab_id
=
value
elif
key
==
'is_hidden'
:
self
.
is_hidden
=
value
elif
key
==
'course_staff_only'
:
self
.
course_staff_only
=
value
else
:
raise
KeyError
(
'Key {0} cannot be set in tab {1}'
.
format
(
key
,
self
.
to_json
()))
...
...
@@ -179,7 +187,7 @@ class CourseTab(object):
Returns:
a dictionary with keys for the properties of the CourseTab object.
"""
to_json_val
=
{
'type'
:
self
.
type
,
'name'
:
self
.
name
}
to_json_val
=
{
'type'
:
self
.
type
,
'name'
:
self
.
name
,
'course_staff_only'
:
self
.
course_staff_only
}
if
self
.
is_hidden
:
to_json_val
.
update
({
'is_hidden'
:
True
})
return
to_json_val
...
...
common/lib/xmodule/xmodule/tests/test_import.py
View file @
046ee7bd
...
...
@@ -476,6 +476,21 @@ class ImportTestCase(BaseCourseTestCase):
# appropriate attribute maps -- 'graded' should be True, not 'true'
self
.
assertEqual
(
toy
.
graded
,
True
)
def
test_static_tabs_import
(
self
):
"""Make sure that the static tabs are imported correctly"""
modulestore
=
XMLModuleStore
(
DATA_DIR
,
source_dirs
=
[
'toy'
])
location_tab_syllabus
=
Location
(
"edX"
,
"toy"
,
"2012_Fall"
,
"static_tab"
,
"syllabus"
,
None
)
toy_tab_syllabus
=
modulestore
.
get_item
(
location_tab_syllabus
)
self
.
assertEqual
(
toy_tab_syllabus
.
display_name
,
'Syllabus'
)
self
.
assertEqual
(
toy_tab_syllabus
.
course_staff_only
,
False
)
location_tab_resources
=
Location
(
"edX"
,
"toy"
,
"2012_Fall"
,
"static_tab"
,
"resources"
,
None
)
toy_tab_resources
=
modulestore
.
get_item
(
location_tab_resources
)
self
.
assertEqual
(
toy_tab_resources
.
display_name
,
'Resources'
)
self
.
assertEqual
(
toy_tab_resources
.
course_staff_only
,
True
)
def
test_definition_loading
(
self
):
"""When two courses share the same org and course name and
both have a module with the same url_name, the definitions shouldn't clash.
...
...
common/test/data/toy/policies/2012_Fall.json
View file @
046ee7bd
...
...
@@ -8,7 +8,7 @@
{
"type"
:
"courseware"
},
{
"type"
:
"course_info"
,
"name"
:
"Course Info"
},
{
"type"
:
"static_tab"
,
"url_slug"
:
"syllabus"
,
"name"
:
"Syllabus"
},
{
"type"
:
"static_tab"
,
"url_slug"
:
"resources"
,
"name"
:
"Resources"
},
{
"type"
:
"static_tab"
,
"url_slug"
:
"resources"
,
"name"
:
"Resources"
,
"course_staff_only"
:
true
},
{
"type"
:
"discussion"
,
"name"
:
"Discussion"
},
{
"type"
:
"wiki"
,
"name"
:
"Wiki"
},
{
"type"
:
"progress"
,
"name"
:
"Progress"
}
...
...
lms/djangoapps/courseware/tabs.py
View file @
046ee7bd
...
...
@@ -9,6 +9,7 @@ from courseware.access import has_access
from
courseware.entrance_exams
import
user_must_complete_entrance_exam
from
openedx.core.lib.course_tabs
import
CourseTabPluginManager
from
student.models
import
CourseEnrollment
from
student.roles
import
CourseStaffRole
from
xmodule.tabs
import
CourseTab
,
CourseTabList
,
key_checker
...
...
@@ -299,9 +300,12 @@ def get_course_tab_list(request, course):
if
must_complete_ee
:
# Hide all of the tabs except for 'Courseware'
# Rename 'Courseware' tab to 'Entrance Exam'
if
tab
.
type
is
not
'courseware'
:
if
tab
.
type
!=
'courseware'
:
continue
tab
.
name
=
_
(
"Entrance Exam"
)
if
tab
.
type
==
'static_tab'
and
tab
.
course_staff_only
and
\
not
bool
(
user
and
CourseStaffRole
(
course
.
id
)
.
has_user
(
user
)):
continue
course_tab_list
.
append
(
tab
)
# Add in any dynamic tabs, i.e. those that are not persisted
...
...
lms/djangoapps/courseware/tests/test_tabs.py
View file @
046ee7bd
...
...
@@ -686,6 +686,35 @@ class CourseTabListTestCase(TabListTestCase):
# get tab by id
self
.
assertEquals
(
xmodule_tabs
.
CourseTabList
.
get_tab_by_id
(
self
.
course
.
tabs
,
tab
.
tab_id
),
tab
)
def
test_course_tabs_staff_only
(
self
):
"""
Tests the static tabs that available only for instructor
"""
self
.
course
.
tabs
.
append
(
xmodule_tabs
.
CourseTab
.
load
(
'static_tab'
,
name
=
'Static Tab Free'
,
url_slug
=
'extra_tab_1'
,
course_staff_only
=
False
))
self
.
course
.
tabs
.
append
(
xmodule_tabs
.
CourseTab
.
load
(
'static_tab'
,
name
=
'Static Tab Instructors Only'
,
url_slug
=
'extra_tab_2'
,
course_staff_only
=
True
))
self
.
course
.
save
()
user
=
self
.
create_mock_user
(
is_authenticated
=
True
,
is_staff
=
False
,
is_enrolled
=
True
)
request
=
get_request_for_user
(
user
)
course_tab_list
=
get_course_tab_list
(
request
,
self
.
course
)
name_list
=
[
x
.
name
for
x
in
course_tab_list
]
self
.
assertIn
(
'Static Tab Free'
,
name_list
)
self
.
assertNotIn
(
'Static Tab Instructors Only'
,
name_list
)
# Login as member of staff
self
.
client
.
logout
()
staff_user
=
StaffFactory
(
course_key
=
self
.
course
.
id
)
self
.
client
.
login
(
username
=
staff_user
.
username
,
password
=
'test'
)
request
=
get_request_for_user
(
staff_user
)
course_tab_list_staff
=
get_course_tab_list
(
request
,
self
.
course
)
name_list_staff
=
[
x
.
name
for
x
in
course_tab_list_staff
]
self
.
assertIn
(
'Static Tab Free'
,
name_list_staff
)
self
.
assertIn
(
'Static Tab Instructors Only'
,
name_list_staff
)
@attr
(
shard
=
1
)
class
ProgressTestCase
(
TabTestCase
):
...
...
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