Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
X
xblock-drag-and-drop-v2
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
OpenEdx
xblock-drag-and-drop-v2
Commits
66fc6d9b
Unverified
Commit
66fc6d9b
authored
Nov 06, 2017
by
Eugeny Kolpakov
Committed by
GitHub
Nov 06, 2017
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added publishing progress event no matter if grade is updated or not (#145) (#147)
parent
9046ba05
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
50 additions
and
19 deletions
+50
-19
.travis.yml
+1
-1
Changelog.md
+5
-0
drag_and_drop_v2/drag_and_drop_v2.py
+3
-0
install_test_deps.sh
+0
-0
setup.py
+1
-1
tests/integration/test_events.py
+8
-0
tests/unit/test_advanced.py
+32
-17
No files found.
.travis.yml
View file @
66fc6d9b
...
@@ -12,7 +12,7 @@ install:
...
@@ -12,7 +12,7 @@ install:
-
"
pip
install
selenium==2.53.0"
-
"
pip
install
selenium==2.53.0"
-
"
pip
uninstall
-y
xblock-drag-and-drop-v2"
-
"
pip
uninstall
-y
xblock-drag-and-drop-v2"
-
"
python
setup.py
sdist"
-
"
python
setup.py
sdist"
-
"
pip
install
dist/xblock-drag-and-drop-v2-2.1.
3
.tar.gz"
-
"
pip
install
dist/xblock-drag-and-drop-v2-2.1.
4
.tar.gz"
script
:
script
:
-
pep8 drag_and_drop_v2 tests --max-line-length=120
-
pep8 drag_and_drop_v2 tests --max-line-length=120
-
pylint drag_and_drop_v2
-
pylint drag_and_drop_v2
...
...
Changelog.md
View file @
66fc6d9b
Version 2.1.4 (2017-11-06)
---------------------------
*
Make XBlock always emit
`progress`
event explicitly when it is marked as complete.
Version 2.1.3 (2017-10-05)
Version 2.1.3 (2017-10-05)
---------------------------
---------------------------
...
...
drag_and_drop_v2/drag_and_drop_v2.py
View file @
66fc6d9b
...
@@ -773,6 +773,9 @@ class DragAndDropBlock(
...
@@ -773,6 +773,9 @@ class DragAndDropBlock(
self
.
raw_earned
=
current_raw_earned
self
.
raw_earned
=
current_raw_earned
self
.
_publish_grade
(
Score
(
self
.
raw_earned
,
self
.
max_score
()))
self
.
_publish_grade
(
Score
(
self
.
raw_earned
,
self
.
max_score
()))
# and no matter what - emit progress event for current user
self
.
runtime
.
publish
(
self
,
"progress"
,
{})
def
_publish_item_dropped_event
(
self
,
attempt
,
is_correct
):
def
_publish_item_dropped_event
(
self
,
attempt
,
is_correct
):
"""
"""
Publishes item dropped event.
Publishes item dropped event.
...
...
install_test_deps.sh
100644 → 100755
View file @
66fc6d9b
File mode changed from 100644 to 100755
setup.py
View file @
66fc6d9b
...
@@ -23,7 +23,7 @@ def package_data(pkg, root_list):
...
@@ -23,7 +23,7 @@ def package_data(pkg, root_list):
setup
(
setup
(
name
=
'xblock-drag-and-drop-v2'
,
name
=
'xblock-drag-and-drop-v2'
,
version
=
'2.1.
3
'
,
version
=
'2.1.
4
'
,
description
=
'XBlock - Drag-and-Drop v2'
,
description
=
'XBlock - Drag-and-Drop v2'
,
packages
=
[
'drag_and_drop_v2'
],
packages
=
[
'drag_and_drop_v2'
],
install_requires
=
[
install_requires
=
[
...
...
tests/integration/test_events.py
View file @
66fc6d9b
...
@@ -44,6 +44,10 @@ class EventsFiredTest(DefaultDataTestMixin, ParameterizedTestsMixin, BaseEventsT
...
@@ -44,6 +44,10 @@ class EventsFiredTest(DefaultDataTestMixin, ParameterizedTestsMixin, BaseEventsT
'data'
:
{
'max_value'
:
1
,
'value'
:
(
2.0
/
5
),
'only_if_higher'
:
None
},
'data'
:
{
'max_value'
:
1
,
'value'
:
(
2.0
/
5
),
'only_if_higher'
:
None
},
},
},
{
{
'name'
:
'progress'
,
'data'
:
{}
},
{
'name'
:
'edx.drag_and_drop_v2.item.dropped'
,
'name'
:
'edx.drag_and_drop_v2.item.dropped'
,
'data'
:
{
'data'
:
{
'is_correct'
:
True
,
'is_correct'
:
True
,
...
@@ -124,6 +128,10 @@ class AssessmentEventsFiredTest(
...
@@ -124,6 +128,10 @@ class AssessmentEventsFiredTest(
'data'
:
{
'max_value'
:
1
,
'value'
:
(
1.0
/
5
),
'only_if_higher'
:
None
},
'data'
:
{
'max_value'
:
1
,
'value'
:
(
1.0
/
5
),
'only_if_higher'
:
None
},
},
},
{
{
'name'
:
'progress'
,
'data'
:
{}
},
{
'name'
:
'edx.drag_and_drop_v2.feedback.opened'
,
'name'
:
'edx.drag_and_drop_v2.feedback.opened'
,
'data'
:
{
'data'
:
{
'content'
:
"
\n
"
.
join
([
ITEM_INCORRECT_FEEDBACK
,
ITEM_INCORRECT_FEEDBACK
]),
'content'
:
"
\n
"
.
join
([
ITEM_INCORRECT_FEEDBACK
,
ITEM_INCORRECT_FEEDBACK
]),
...
...
tests/unit/test_advanced.py
View file @
66fc6d9b
...
@@ -405,14 +405,19 @@ class AssessmentModeFixture(BaseDragAndDropAjaxFixture):
...
@@ -405,14 +405,19 @@ class AssessmentModeFixture(BaseDragAndDropAjaxFixture):
res
=
self
.
call_handler
(
self
.
DO_ATTEMPT_HANDLER
,
data
=
{})
res
=
self
.
call_handler
(
self
.
DO_ATTEMPT_HANDLER
,
data
=
{})
self
.
assertTrue
(
self
.
block
.
completed
)
self
.
assertTrue
(
self
.
block
.
completed
)
patched_publish
.
assert_called_once_with
(
self
.
block
,
'grade'
,
{
'value'
:
1
,
'max_value'
:
1
,
'only_if_higher'
:
None
,
})
self
.
assertTrue
(
res
[
'correct'
])
self
.
assertTrue
(
res
[
'correct'
])
self
.
assertEqual
(
res
[
'grade'
],
self
.
block
.
weight
)
self
.
assertEqual
(
res
[
'grade'
],
self
.
block
.
weight
)
expected_calls
=
[
mock
.
call
(
self
.
block
,
'grade'
,
{
'value'
:
1
,
'max_value'
:
1
,
'only_if_higher'
:
None
,
}),
mock
.
call
(
self
.
block
,
'progress'
,
{})
]
self
.
assertEqual
(
patched_publish
.
mock_calls
,
expected_calls
)
@ddt.data
(
*
[
random
.
randint
(
1
,
50
)
for
_
in
xrange
(
5
)])
# pylint: disable=star-args
@ddt.data
(
*
[
random
.
randint
(
1
,
50
)
for
_
in
xrange
(
5
)])
# pylint: disable=star-args
def
test_do_attempt_incorrect_publish_grade
(
self
,
weight
):
def
test_do_attempt_incorrect_publish_grade
(
self
,
weight
):
self
.
block
.
weight
=
weight
self
.
block
.
weight
=
weight
...
@@ -423,14 +428,19 @@ class AssessmentModeFixture(BaseDragAndDropAjaxFixture):
...
@@ -423,14 +428,19 @@ class AssessmentModeFixture(BaseDragAndDropAjaxFixture):
res
=
self
.
call_handler
(
self
.
DO_ATTEMPT_HANDLER
,
data
=
{})
res
=
self
.
call_handler
(
self
.
DO_ATTEMPT_HANDLER
,
data
=
{})
self
.
assertFalse
(
self
.
block
.
completed
)
self
.
assertFalse
(
self
.
block
.
completed
)
patched_publish
.
assert_called_once_with
(
self
.
block
,
'grade'
,
{
'value'
:
correctness
,
'max_value'
:
1
,
'only_if_higher'
:
None
,
})
self
.
assertFalse
(
res
[
'correct'
])
self
.
assertFalse
(
res
[
'correct'
])
self
.
assertEqual
(
res
[
'grade'
],
correctness
*
self
.
block
.
weight
)
self
.
assertEqual
(
res
[
'grade'
],
correctness
*
self
.
block
.
weight
)
expected_calls
=
[
mock
.
call
(
self
.
block
,
'grade'
,
{
'value'
:
correctness
,
'max_value'
:
1
,
'only_if_higher'
:
None
,
}),
mock
.
call
(
self
.
block
,
'progress'
,
{})
]
self
.
assertEqual
(
patched_publish
.
mock_calls
,
expected_calls
)
@ddt.data
(
*
[
random
.
randint
(
1
,
50
)
for
_
in
xrange
(
5
)])
# pylint: disable=star-args
@ddt.data
(
*
[
random
.
randint
(
1
,
50
)
for
_
in
xrange
(
5
)])
# pylint: disable=star-args
def
test_do_attempt_post_correct_no_publish_grade
(
self
,
weight
):
def
test_do_attempt_post_correct_no_publish_grade
(
self
,
weight
):
self
.
block
.
weight
=
weight
self
.
block
.
weight
=
weight
...
@@ -444,7 +454,7 @@ class AssessmentModeFixture(BaseDragAndDropAjaxFixture):
...
@@ -444,7 +454,7 @@ class AssessmentModeFixture(BaseDragAndDropAjaxFixture):
self
.
assertTrue
(
self
.
block
.
completed
)
self
.
assertTrue
(
self
.
block
.
completed
)
self
.
assertEqual
(
self
.
block
.
raw_earned
,
1
)
self
.
assertEqual
(
self
.
block
.
raw_earned
,
1
)
self
.
assert
False
(
patched_publish
.
called
)
self
.
assert
Equal
(
patched_publish
.
mock_calls
,
[
mock
.
call
(
self
.
block
,
'progress'
,
{})]
)
def
test_get_user_state_finished_after_final_attempt
(
self
):
def
test_get_user_state_finished_after_final_attempt
(
self
):
self
.
_set_final_attempt
()
self
.
_set_final_attempt
()
...
@@ -469,11 +479,6 @@ class AssessmentModeFixture(BaseDragAndDropAjaxFixture):
...
@@ -469,11 +479,6 @@ class AssessmentModeFixture(BaseDragAndDropAjaxFixture):
res
=
self
.
call_handler
(
self
.
DO_ATTEMPT_HANDLER
,
data
=
{})
res
=
self
.
call_handler
(
self
.
DO_ATTEMPT_HANDLER
,
data
=
{})
self
.
assertTrue
(
self
.
block
.
completed
)
self
.
assertTrue
(
self
.
block
.
completed
)
patched_publish
.
assert_called_once_with
(
self
.
block
,
'grade'
,
{
'value'
:
expected_raw_grade
,
'max_value'
:
1
,
'only_if_higher'
:
None
,
})
expected_grade_feedback
=
self
.
_make_feedback_message
(
expected_grade_feedback
=
self
.
_make_feedback_message
(
FeedbackMessages
.
FINAL_ATTEMPT_TPL
.
format
(
score
=
expected_weighted_grade
),
FeedbackMessages
.
FINAL_ATTEMPT_TPL
.
format
(
score
=
expected_weighted_grade
),
...
@@ -482,6 +487,16 @@ class AssessmentModeFixture(BaseDragAndDropAjaxFixture):
...
@@ -482,6 +487,16 @@ class AssessmentModeFixture(BaseDragAndDropAjaxFixture):
self
.
assertIn
(
expected_grade_feedback
,
res
[
self
.
OVERALL_FEEDBACK_KEY
])
self
.
assertIn
(
expected_grade_feedback
,
res
[
self
.
OVERALL_FEEDBACK_KEY
])
self
.
assertEqual
(
res
[
'grade'
],
expected_weighted_grade
)
self
.
assertEqual
(
res
[
'grade'
],
expected_weighted_grade
)
expected_calls
=
[
mock
.
call
(
self
.
block
,
'grade'
,
{
'value'
:
expected_raw_grade
,
'max_value'
:
1
,
'only_if_higher'
:
None
,
}),
mock
.
call
(
self
.
block
,
'progress'
,
{})
]
self
.
assertEqual
(
patched_publish
.
mock_calls
,
expected_calls
)
@ddt.data
(
*
[
random
.
randint
(
1
,
50
)
for
_
in
xrange
(
5
)])
# pylint: disable=star-args
@ddt.data
(
*
[
random
.
randint
(
1
,
50
)
for
_
in
xrange
(
5
)])
# pylint: disable=star-args
def
test_do_attempt_incorrect_final_attempt_after_correct
(
self
,
weight
):
def
test_do_attempt_incorrect_final_attempt_after_correct
(
self
,
weight
):
self
.
block
.
weight
=
weight
self
.
block
.
weight
=
weight
...
@@ -505,9 +520,9 @@ class AssessmentModeFixture(BaseDragAndDropAjaxFixture):
...
@@ -505,9 +520,9 @@ class AssessmentModeFixture(BaseDragAndDropAjaxFixture):
FeedbackMessages
.
FINAL_ATTEMPT_TPL
.
format
(
score
=
float
(
weight
)),
FeedbackMessages
.
FINAL_ATTEMPT_TPL
.
format
(
score
=
float
(
weight
)),
FeedbackMessages
.
MessageClasses
.
PARTIAL_SOLUTION
FeedbackMessages
.
MessageClasses
.
PARTIAL_SOLUTION
)
)
self
.
assertFalse
(
patched_publish
.
called
)
self
.
assertIn
(
expected_grade_feedback
,
res
[
self
.
OVERALL_FEEDBACK_KEY
])
self
.
assertIn
(
expected_grade_feedback
,
res
[
self
.
OVERALL_FEEDBACK_KEY
])
self
.
assertEqual
(
self
.
block
.
raw_earned
,
1
)
self
.
assertEqual
(
self
.
block
.
raw_earned
,
1
)
self
.
assertEqual
(
patched_publish
.
mock_calls
,
[
mock
.
call
(
self
.
block
,
'progress'
,
{})])
def
test_do_attempt_misplaced_ids
(
self
):
def
test_do_attempt_misplaced_ids
(
self
):
misplaced_ids
=
self
.
_submit_incorrect_solution
()
misplaced_ids
=
self
.
_submit_incorrect_solution
()
...
...
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