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
09908bde
Commit
09908bde
authored
Jun 30, 2014
by
Ben McMorran
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #4229 from edx/studio/uses-mixed-modulestore-xblock-visibility
Adds is_xblock_visible_to_students
parents
46469209
397bdb43
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
90 additions
and
1 deletions
+90
-1
cms/djangoapps/contentstore/tests/test_utils.py
+67
-1
cms/djangoapps/contentstore/utils.py
+23
-0
No files found.
cms/djangoapps/contentstore/tests/test_utils.py
View file @
09908bde
...
@@ -2,13 +2,17 @@
...
@@ -2,13 +2,17 @@
import
collections
import
collections
import
copy
import
copy
import
mock
import
mock
from
datetime
import
datetime
,
timedelta
from
pytz
import
UTC
from
django.test
import
TestCase
from
django.test
import
TestCase
from
django.test.utils
import
override_settings
from
django.test.utils
import
override_settings
from
contentstore
import
utils
from
contentstore
import
utils
from
xmodule.modulestore.tests.factories
import
CourseFactory
from
xmodule.modulestore.tests.factories
import
CourseFactory
from
opaque_keys.edx.locations
import
SlashSeparatedCourseKey
from
opaque_keys.edx.locations
import
SlashSeparatedCourseKey
,
Location
from
xmodule.modulestore.django
import
modulestore
class
LMSLinksTestCase
(
TestCase
):
class
LMSLinksTestCase
(
TestCase
):
...
@@ -183,3 +187,65 @@ class CourseImageTestCase(TestCase):
...
@@ -183,3 +187,65 @@ class CourseImageTestCase(TestCase):
course
=
course
.
location
.
course
course
=
course
.
location
.
course
)
)
)
)
class
XBlockVisibilityTestCase
(
TestCase
):
"""Tests for xblock visibility for students."""
def
setUp
(
self
):
self
.
dummy_user
=
123
self
.
past
=
datetime
(
1970
,
1
,
1
)
self
.
future
=
datetime
.
now
(
UTC
)
+
timedelta
(
days
=
1
)
def
test_private_unreleased_xblock
(
self
):
"""Verifies that a private unreleased xblock is not visible"""
vertical
=
self
.
_create_xblock_with_start_date
(
'private_unreleased'
,
self
.
future
)
self
.
assertFalse
(
utils
.
is_xblock_visible_to_students
(
vertical
))
def
test_private_released_xblock
(
self
):
"""Verifies that a private released xblock is not visible"""
vertical
=
self
.
_create_xblock_with_start_date
(
'private_released'
,
self
.
past
)
self
.
assertFalse
(
utils
.
is_xblock_visible_to_students
(
vertical
))
def
test_public_unreleased_xblock
(
self
):
"""Verifies that a public (published) unreleased xblock is not visible"""
vertical
=
self
.
_create_xblock_with_start_date
(
'public_unreleased'
,
self
.
future
,
publish
=
True
)
self
.
assertFalse
(
utils
.
is_xblock_visible_to_students
(
vertical
))
def
test_public_released_xblock
(
self
):
"""Verifies that public (published) released xblock is visible"""
vertical
=
self
.
_create_xblock_with_start_date
(
'public_released'
,
self
.
past
,
publish
=
True
)
self
.
assertTrue
(
utils
.
is_xblock_visible_to_students
(
vertical
))
def
test_private_no_start_xblock
(
self
):
"""Verifies that a private xblock with no start date is not visible"""
vertical
=
self
.
_create_xblock_with_start_date
(
'private_no_start'
,
None
)
self
.
assertFalse
(
utils
.
is_xblock_visible_to_students
(
vertical
))
def
test_public_no_start_xblock
(
self
):
"""Verifies that a public (published) xblock with no start date is visible"""
vertical
=
self
.
_create_xblock_with_start_date
(
'public_no_start'
,
None
,
publish
=
True
)
self
.
assertTrue
(
utils
.
is_xblock_visible_to_students
(
vertical
))
def
test_draft_released_xblock
(
self
):
"""Verifies that a xblock with an unreleased draft and a released published version is visible"""
vertical
=
self
.
_create_xblock_with_start_date
(
'draft_released'
,
self
.
past
,
publish
=
True
)
# Create an unreleased draft version of the xblock
vertical
.
start
=
self
.
future
modulestore
()
.
update_item
(
vertical
,
self
.
dummy_user
)
self
.
assertTrue
(
utils
.
is_xblock_visible_to_students
(
vertical
))
def
_create_xblock_with_start_date
(
self
,
name
,
start_date
,
publish
=
False
):
"""Helper to create an xblock with a start date, optionally publishing it"""
location
=
Location
(
'edX'
,
'visibility'
,
'2012_Fall'
,
'vertical'
,
name
)
vertical
=
modulestore
()
.
create_xmodule
(
location
)
vertical
.
start
=
start_date
modulestore
()
.
update_item
(
vertical
,
self
.
dummy_user
,
allow_not_found
=
True
)
if
publish
:
modulestore
()
.
publish
(
location
,
self
.
dummy_user
)
return
vertical
cms/djangoapps/contentstore/utils.py
View file @
09908bde
...
@@ -3,6 +3,8 @@
...
@@ -3,6 +3,8 @@
import
copy
import
copy
import
logging
import
logging
import
re
import
re
from
datetime
import
datetime
from
pytz
import
UTC
from
django.conf
import
settings
from
django.conf
import
settings
from
django.utils.translation
import
ugettext
as
_
from
django.utils.translation
import
ugettext
as
_
...
@@ -10,8 +12,10 @@ from django.core.urlresolvers import reverse
...
@@ -10,8 +12,10 @@ from django.core.urlresolvers import reverse
from
xmodule.contentstore.content
import
StaticContent
from
xmodule.contentstore.content
import
StaticContent
from
xmodule.contentstore.django
import
contentstore
from
xmodule.contentstore.django
import
contentstore
from
xmodule.modulestore
import
REVISION_OPTION_PUBLISHED_ONLY
from
xmodule.modulestore.django
import
modulestore
from
xmodule.modulestore.django
import
modulestore
from
xmodule.modulestore.mixed
import
store_bulk_write_operations_on_course
from
xmodule.modulestore.mixed
import
store_bulk_write_operations_on_course
from
xmodule.modulestore.exceptions
import
ItemNotFoundError
from
opaque_keys.edx.locations
import
SlashSeparatedCourseKey
,
Location
from
opaque_keys.edx.locations
import
SlashSeparatedCourseKey
,
Location
from
xmodule.modulestore.store_utilities
import
delete_course
from
xmodule.modulestore.store_utilities
import
delete_course
from
student.roles
import
CourseInstructorRole
,
CourseStaffRole
from
student.roles
import
CourseInstructorRole
,
CourseStaffRole
...
@@ -129,6 +133,25 @@ def compute_publish_state(xblock):
...
@@ -129,6 +133,25 @@ def compute_publish_state(xblock):
return
modulestore
()
.
compute_publish_state
(
xblock
)
return
modulestore
()
.
compute_publish_state
(
xblock
)
def
is_xblock_visible_to_students
(
xblock
):
"""
Returns true if there is a published version of the xblock that has been released.
"""
try
:
published
=
modulestore
()
.
get_item
(
xblock
.
location
,
revision
=
REVISION_OPTION_PUBLISHED_ONLY
)
# If there's no published version then the xblock is clearly not visible
except
ItemNotFoundError
:
return
False
# Check start date
if
'detached'
not
in
published
.
_class_tags
and
published
.
start
is
not
None
:
return
datetime
.
now
(
UTC
)
>
published
.
start
# No start date, so it's always visible
return
True
def
add_extra_panel_tab
(
tab_type
,
course
):
def
add_extra_panel_tab
(
tab_type
,
course
):
"""
"""
Used to add the panel tab to a course if it does not exist.
Used to add the panel tab to a course if it does not exist.
...
...
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