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
db52e033
Commit
db52e033
authored
May 05, 2016
by
sanfordstudent
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #12333 from edx/sstudent/MA-2252
Sstudent/ma 2252
parents
850bc6bb
d4146e7a
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
120 additions
and
14 deletions
+120
-14
common/test/acceptance/tests/lms/test_lms_courseware.py
+33
-0
lms/djangoapps/courseware/tests/test_views.py
+55
-11
lms/envs/common.py
+1
-0
lms/static/js/courseware/accordion_events.js
+20
-0
lms/templates/courseware/accordion.html
+11
-3
No files found.
common/test/acceptance/tests/lms/test_lms_courseware.py
View file @
db52e033
...
...
@@ -507,6 +507,39 @@ class CoursewareMultipleVerticalsTest(UniqueCourseTest, EventsTestMixin):
sequence_ui_events
)
def
test_accordion_events
(
self
):
self
.
course_nav
.
go_to_section
(
'Test Section 1'
,
'Test Subsection 1,2'
)
self
.
course_nav
.
go_to_section
(
'Test Section 2'
,
'Test Subsection 2,1'
)
# test UI events emitted by navigating via the course outline
filter_outline_ui_event
=
lambda
event
:
event
.
get
(
'name'
,
''
)
==
'edx.ui.lms.outline.selected'
outline_ui_events
=
self
.
wait_for_events
(
event_filter
=
filter_outline_ui_event
,
timeout
=
2
)
# note: target_url is tested in unit tests, as the url changes here with every test (it includes GUIDs).
self
.
assert_events_match
(
[
{
'event_type'
:
'edx.ui.lms.outline.selected'
,
'name'
:
'edx.ui.lms.outline.selected'
,
'event'
:
{
'target_name'
:
'Test Subsection 1,2 '
,
'widget_placement'
:
'accordion'
,
}
},
{
'event_type'
:
'edx.ui.lms.outline.selected'
,
'name'
:
'edx.ui.lms.outline.selected'
,
'event'
:
{
'target_name'
:
'Test Subsection 2,1 '
,
'widget_placement'
:
'accordion'
,
}
},
],
outline_ui_events
)
def
assert_navigation_state
(
self
,
section_title
,
subsection_title
,
subsection_position
,
next_enabled
,
prev_enabled
):
...
...
lms/djangoapps/courseware/tests/test_views.py
View file @
db52e033
...
...
@@ -3,7 +3,7 @@
Tests courseware views.py
"""
from
urllib
import
urlencode
from
urllib
import
urlencode
,
quote
import
ddt
import
json
import
itertools
...
...
@@ -191,19 +191,25 @@ class ViewsTestCase(ModuleStoreTestCase):
"""
Tests for views.py methods.
"""
def
setUp
(
self
):
super
(
ViewsTestCase
,
self
)
.
setUp
()
self
.
course
=
CourseFactory
.
create
(
display_name
=
u'teꜱᴛ course'
)
self
.
chapter
=
ItemFactory
.
create
(
category
=
'chapter'
,
parent_location
=
self
.
course
.
location
)
self
.
chapter
=
ItemFactory
.
create
(
category
=
'chapter'
,
parent_location
=
self
.
course
.
location
,
display_name
=
"Chapter 1"
,
)
self
.
section
=
ItemFactory
.
create
(
category
=
'sequential'
,
parent_location
=
self
.
chapter
.
location
,
due
=
datetime
(
2013
,
9
,
18
,
11
,
30
,
00
),
display_name
=
'Sequential 1'
,
)
self
.
vertical
=
ItemFactory
.
create
(
category
=
'vertical'
,
parent_location
=
self
.
section
.
location
,
display_name
=
'Vertical 1'
display_name
=
'Vertical 1'
,
)
self
.
problem
=
ItemFactory
.
create
(
category
=
'problem'
,
...
...
@@ -213,12 +219,13 @@ class ViewsTestCase(ModuleStoreTestCase):
self
.
section2
=
ItemFactory
.
create
(
category
=
'sequential'
,
parent_location
=
self
.
chapter
.
location
parent_location
=
self
.
chapter
.
location
,
display_name
=
'Sequential 2'
,
)
self
.
vertical2
=
ItemFactory
.
create
(
category
=
'vertical'
,
parent_location
=
self
.
section2
.
location
,
display_name
=
'Vertical 2'
display_name
=
'Vertical 2'
,
)
self
.
problem2
=
ItemFactory
.
create
(
category
=
'problem'
,
...
...
@@ -240,6 +247,12 @@ class ViewsTestCase(ModuleStoreTestCase):
self
.
org
=
u"ꜱᴛᴀʀᴋ ɪɴᴅᴜꜱᴛʀɪᴇꜱ"
self
.
org_html
=
"<p>'+Stark/Industries+'</p>"
self
.
request
=
self
.
request_factory
.
get
(
"foo"
)
self
.
request
.
user
=
self
.
user
# refresh the course from the modulestore so that it has children
self
.
course
=
modulestore
()
.
get_course
(
self
.
course
.
id
)
def
test_index_success
(
self
):
response
=
self
.
_verify_index_response
()
self
.
assertIn
(
unicode
(
self
.
problem2
.
location
),
response
.
content
.
decode
(
"utf-8"
))
...
...
@@ -787,6 +800,33 @@ class ViewsTestCase(ModuleStoreTestCase):
response
=
views
.
course_info
(
request
,
course_id
)
self
.
assertEqual
(
response
.
status_code
,
200
)
def
test_accordion
(
self
):
table_of_contents
=
toc_for_course
(
self
.
request
.
user
,
self
.
request
,
self
.
course
,
unicode
(
self
.
course
.
get_children
()[
0
]
.
scope_ids
.
usage_id
),
None
,
None
)
# removes newlines and whitespace from the returned view string
view
=
''
.
join
(
render_accordion
(
self
.
request
,
self
.
course
,
table_of_contents
[
'chapters'
])
.
split
())
# the course id unicode is re-encoded here because the quote function does not accept unicode
course_id
=
quote
(
unicode
(
self
.
course
.
id
)
.
encode
(
"utf-8"
))
self
.
assertIn
(
u'href="/courses/{}/courseware/Chapter_1/Sequential_1/"><pclass="accordion-display-name">Sequential1</p>'
.
format
(
course_id
.
decode
(
"utf-8"
)),
view
)
self
.
assertIn
(
u'href="/courses/{}/courseware/Chapter_1/Sequential_2/"><pclass="accordion-display-name">Sequential2</p>'
.
format
(
course_id
.
decode
(
"utf-8"
)),
view
)
@attr
(
'shard_1'
)
# setting TIME_ZONE_DISPLAYED_FOR_DEADLINES explicitly
...
...
@@ -809,7 +849,11 @@ class BaseDueDateTests(ModuleStoreTestCase):
"""
course
=
CourseFactory
.
create
(
**
course_kwargs
)
chapter
=
ItemFactory
.
create
(
category
=
'chapter'
,
parent_location
=
course
.
location
)
section
=
ItemFactory
.
create
(
category
=
'sequential'
,
parent_location
=
chapter
.
location
,
due
=
datetime
(
2013
,
9
,
18
,
11
,
30
,
00
))
section
=
ItemFactory
.
create
(
category
=
'sequential'
,
parent_location
=
chapter
.
location
,
due
=
datetime
(
2013
,
9
,
18
,
11
,
30
,
00
)
)
vertical
=
ItemFactory
.
create
(
category
=
'vertical'
,
parent_location
=
section
.
location
)
ItemFactory
.
create
(
category
=
'problem'
,
parent_location
=
vertical
.
location
)
...
...
@@ -1028,7 +1072,6 @@ class ProgressPageTests(ModuleStoreTestCase):
'azU3N_8$'
,
]
for
invalid_id
in
invalid_student_ids
:
self
.
assertRaises
(
Http404
,
views
.
progress
,
self
.
request
,
...
...
@@ -1117,7 +1160,7 @@ class ProgressPageTests(ModuleStoreTestCase):
# Enable certificate generation for this course
certs_api
.
set_cert_generation_enabled
(
self
.
course
.
id
,
True
)
#
c
ourse certificate configurations
#
C
ourse certificate configurations
certificates
=
[
{
'id'
:
1
,
...
...
@@ -1324,7 +1367,7 @@ class GenerateUserCertTests(ModuleStoreTestCase):
resp
=
self
.
client
.
post
(
self
.
url
)
self
.
assertEqual
(
resp
.
status_code
,
200
)
#Verify Google Analytics event fired after generating certificate
#
Verify Google Analytics event fired after generating certificate
mock_tracker
.
track
.
assert_called_once_with
(
# pylint: disable=no-member
self
.
student
.
id
,
# pylint: disable=no-member
'edx.bi.user.certificate.generate'
,
...
...
@@ -1335,8 +1378,7 @@ class GenerateUserCertTests(ModuleStoreTestCase):
context
=
{
'ip'
:
'127.0.0.1'
,
'Google Analytics'
:
{
'clientId'
:
None
}
'Google Analytics'
:
{
'clientId'
:
None
}
}
)
mock_tracker
.
reset_mock
()
...
...
@@ -1521,6 +1563,7 @@ class TestIndexViewWithGating(ModuleStoreTestCase, MilestonesTestCaseMixin):
"""
Test the index view for a course with gated content
"""
def
setUp
(
self
):
"""
Set up the initial test data
...
...
@@ -1574,6 +1617,7 @@ class TestRenderXBlock(RenderXBlockTestMixin, ModuleStoreTestCase):
This class overrides the get_response method, which is used by
the tests defined in RenderXBlockTestMixin.
"""
def
setUp
(
self
):
reload_django_url_config
()
super
(
TestRenderXBlock
,
self
)
.
setUp
()
...
...
lms/envs/common.py
View file @
db52e033
...
...
@@ -1664,6 +1664,7 @@ REQUIRE_JS_PATH_OVERRIDES = {
'moment'
:
'js/vendor/moment.min.js'
,
'jquery.url'
:
'js/vendor/url.min.js'
,
'js/courseware/course_home_events'
:
'js/courseware/course_home_events.js'
,
'js/courseware/accordion_events'
:
'js/courseware/accordion_events.js'
,
'js/courseware/toggle_element_visibility'
:
'js/courseware/toggle_element_visibility.js'
,
'js/student_account/logistration_factory'
:
'js/student_account/logistration_factory.js'
,
'js/student_profile/views/learner_profile_factory'
:
'js/student_profile/views/learner_profile_factory.js'
,
...
...
lms/static/js/courseware/accordion_events.js
0 → 100644
View file @
db52e033
;(
function
(
define
)
{
'use strict'
;
define
([
'jquery'
,
'logger'
],
function
(
$
,
Logger
)
{
return
function
()
{
$
(
".accordion-nav"
).
click
(
function
(
event
)
{
Logger
.
log
(
"edx.ui.lms.outline.selected"
,
{
name
:
"edx.ui.lms.outline.selected"
,
event_type
:
"edx.ui.lms.outline.selected"
,
current_url
:
window
.
location
.
href
,
target_url
:
event
.
currentTarget
.
href
,
target_name
:
$
(
this
).
find
(
"p.accordion-display-name"
).
text
(),
widget_placement
:
"accordion"
});
});
};
});
}).
call
(
this
,
define
||
RequireJS
.
define
);
lms/templates/courseware/accordion.html
View file @
db52e033
<
%
page
expression_filter=
"h"
/>
<
%
namespace
name=
'static'
file=
'../static_content.html'
/>
<
%!
from
django
.
core
.
urlresolvers
import
reverse
from
util
.
date_utils
import
get_time_display
...
...
@@ -26,8 +27,8 @@ else:
<div
class=
"chapter-menu"
>
% for section in chapter['sections']:
<div
class=
"menu-item ${'active' if 'active' in section and section['active'] else ''} ${'graded' if 'graded' in section and section['graded'] else ''}"
>
<a
href=
"${reverse('courseware_section', args=[course_id, chapter['url_name'], section['url_name']])}"
>
<p>
${section['display_name']} ${Text(_('{span_start}current section{span_end}')).format(
<a
class=
"accordion-nav"
href=
"${reverse('courseware_section', args=[course_id, chapter['url_name'], section['url_name']])}"
>
<p
class=
"accordion-display-name"
>
${section['display_name']} ${Text(_('{span_start}current section{span_end}')).format(
span_start=HTML('
<span
class=
"sr"
>
'),
span_end=HTML('
</span>
'),
) if 'active' in section and section['active'] else ''}
</p>
...
...
@@ -40,7 +41,7 @@ else:
%
>
## There is behavior differences between
## rending of sections which have proctoring/timed examinations
## rend
er
ing of sections which have proctoring/timed examinations
## and those that do not.
##
## Proctoring exposes a exam status message field as well as
...
...
@@ -80,3 +81,10 @@ else:
% for chapter in toc:
${make_chapter(chapter)}
% endfor
% if toc:
<
%
static:require_module
module_name=
"js/courseware/accordion_events"
class_name=
"AccordionEvents"
>
AccordionEvents();
</
%
static:require
_module
>
% endif
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