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
fa5da96d
Commit
fa5da96d
authored
Feb 10, 2015
by
David Baumgold
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #6951 from edx/dan-f/fix-grade-download-in-cc
Dan f/fix grade download in cc
parents
b61589d0
12d6f974
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
121 additions
and
21 deletions
+121
-21
lms/djangoapps/instructor_task/tasks_helper.py
+4
-4
lms/djangoapps/instructor_task/tests/test_integration.py
+1
-1
lms/djangoapps/instructor_task/tests/test_tasks_helper.py
+114
-14
openedx/core/djangoapps/user_api/partition_schemes.py
+2
-2
No files found.
lms/djangoapps/instructor_task/tasks_helper.py
View file @
fa5da96d
...
...
@@ -20,6 +20,7 @@ from pytz import UTC
from
track.views
import
task_track
from
util.file
import
course_filename_prefix_generator
,
UniversalNewlineIterator
from
xmodule.modulestore.django
import
modulestore
from
xmodule.split_test_module
import
get_split_user_partitions
from
courseware.courses
import
get_course_by_id
from
courseware.grades
import
iterate_grades_for
...
...
@@ -553,9 +554,8 @@ def upload_grades_csv(_xmodule_instance_args, _entry_id, course_id, _task_input,
course
=
get_course_by_id
(
course_id
)
cohorts_header
=
[
'Cohort Name'
]
if
course
.
is_cohorted
else
[]
partition_service
=
LmsPartitionService
(
user
=
None
,
course_id
=
course_id
)
partitions
=
partition_service
.
course_partitions
group_configs_header
=
[
'Group Configuration Group Name ({})'
.
format
(
partition
.
name
)
for
partition
in
partitions
]
experiment_partitions
=
get_split_user_partitions
(
course
.
user_partitions
)
group_configs_header
=
[
u'Experiment Group ({})'
.
format
(
partition
.
name
)
for
partition
in
experiment_partitions
]
# Loop over all our students and build our CSV lists in memory
header
=
None
...
...
@@ -589,7 +589,7 @@ def upload_grades_csv(_xmodule_instance_args, _entry_id, course_id, _task_input,
cohorts_group_name
.
append
(
group
.
name
if
group
else
''
)
group_configs_group_names
=
[]
for
partition
in
partitions
:
for
partition
in
experiment_
partitions
:
group
=
LmsPartitionService
(
student
,
course_id
)
.
get_group
(
partition
,
assign
=
False
)
group_configs_group_names
.
append
(
group
.
name
if
group
else
''
)
...
...
lms/djangoapps/instructor_task/tests/test_integration.py
View file @
fa5da96d
...
...
@@ -622,7 +622,7 @@ class TestGradeReportConditionalContent(TestReportMixin, TestIntegrationTask):
def
user_partition_group
(
user
):
"""Return a dict having single key with value equals to students group in partition"""
group_config_hdr_tpl
=
'
Group Configuration Group Name
({})'
group_config_hdr_tpl
=
'
Experiment Group
({})'
return
{
group_config_hdr_tpl
.
format
(
self
.
partition
.
name
):
self
.
partition
.
scheme
.
get_group_for_user
(
# pylint: disable=E1101
self
.
course
.
id
,
user
,
self
.
partition
,
track_function
=
None
...
...
lms/djangoapps/instructor_task/tests/test_tasks_helper.py
View file @
fa5da96d
...
...
@@ -16,7 +16,10 @@ from student.tests.factories import UserFactory
from
student.models
import
CourseEnrollment
from
xmodule.partitions.partitions
import
Group
,
UserPartition
from
openedx.core.djangoapps.course_groups.models
import
CourseUserGroupPartitionGroup
from
openedx.core.djangoapps.course_groups.tests.helpers
import
CohortFactory
import
openedx.core.djangoapps.user_api.api.course_tag
as
course_tag_api
from
openedx.core.djangoapps.user_api.partition_schemes
import
RandomUserPartitionScheme
from
instructor_task.models
import
ReportStore
from
instructor_task.tasks_helper
import
cohort_students_and_upload
,
upload_grades_csv
,
upload_students_csv
from
instructor_task.tests.test_base
import
InstructorTaskCourseTestCase
,
TestReportMixin
...
...
@@ -63,11 +66,10 @@ class TestInstructorGradeReport(TestReportMixin, InstructorTaskCourseTestCase):
report_store
=
ReportStore
.
from_config
()
self
.
assertTrue
(
any
(
'grade_report_err'
in
item
[
0
]
for
item
in
report_store
.
links_for
(
self
.
course
.
id
)))
def
_verify_c
ohort_data
(
self
,
course_id
,
expected_cohort_groups
):
def
_verify_c
ell_data_for_user
(
self
,
username
,
course_id
,
column_header
,
expected_cell_content
):
"""
Verify c
ohort data
.
Verify c
ell data in the grades CSV for a particular user
.
"""
cohort_groups_in_csv
=
[]
with
patch
(
'instructor_task.tasks_helper._get_current_task'
):
result
=
upload_grades_csv
(
None
,
None
,
course_id
,
None
,
'graded'
)
self
.
assertDictContainsSubset
({
'attempted'
:
2
,
'succeeded'
:
2
,
'failed'
:
0
},
result
)
...
...
@@ -75,9 +77,8 @@ class TestInstructorGradeReport(TestReportMixin, InstructorTaskCourseTestCase):
report_csv_filename
=
report_store
.
links_for
(
course_id
)[
0
][
0
]
with
open
(
report_store
.
path_to
(
course_id
,
report_csv_filename
))
as
csv_file
:
for
row
in
unicodecsv
.
DictReader
(
csv_file
):
cohort_groups_in_csv
.
append
(
row
[
'Cohort Name'
])
self
.
assertEqual
(
cohort_groups_in_csv
,
expected_cohort_groups
)
if
row
.
get
(
'username'
)
==
username
:
self
.
assertEqual
(
row
[
column_header
],
expected_cell_content
)
def
test_cohort_data_in_grading
(
self
):
"""
...
...
@@ -86,20 +87,22 @@ class TestInstructorGradeReport(TestReportMixin, InstructorTaskCourseTestCase):
cohort_groups
=
[
'cohort 1'
,
'cohort 2'
]
course
=
CourseFactory
.
create
(
cohort_config
=
{
'cohorted'
:
True
,
'auto_cohort'
:
True
,
'auto_cohort_groups'
:
cohort_groups
})
for
_
in
range
(
2
):
CourseEnrollment
.
enroll
(
UserFactory
.
create
(),
course
.
id
)
user_1
=
'user_1'
user_2
=
'user_2'
CourseEnrollment
.
enroll
(
UserFactory
.
create
(
username
=
user_1
),
course
.
id
)
CourseEnrollment
.
enroll
(
UserFactory
.
create
(
username
=
user_2
),
course
.
id
)
# In auto cohorting a group will be assigned to a user only when user visits a problem
# In grading calculation we only add a group in csv if group is already assigned to
# user rather than creating a group automatically at runtime
expected_groups
=
[
''
,
''
]
self
.
_verify_c
ohort_data
(
course
.
id
,
expected_groups
)
self
.
_verify_cell_data_for_user
(
user_1
,
course
.
id
,
'Cohort Name'
,
''
)
self
.
_verify_c
ell_data_for_user
(
user_2
,
course
.
id
,
'Cohort Name'
,
''
)
def
test_unicode_cohort_data_in_grading
(
self
):
"""
Test that cohorts can contain unicode characters.
"""
cohort_groups
=
[
u'ÞrÖfessÖr X'
,
u'MàgnëtÖ'
]
course
=
CourseFactory
.
create
(
cohort_config
=
{
'cohorted'
:
True
})
# Create users and manually assign cohorts
...
...
@@ -107,12 +110,15 @@ class TestInstructorGradeReport(TestReportMixin, InstructorTaskCourseTestCase):
user2
=
UserFactory
.
create
(
username
=
'user2'
)
CourseEnrollment
.
enroll
(
user1
,
course
.
id
)
CourseEnrollment
.
enroll
(
user2
,
course
.
id
)
cohort1
=
CohortFactory
(
course_id
=
course
.
id
,
name
=
u'ÞrÖfessÖr X'
)
cohort2
=
CohortFactory
(
course_id
=
course
.
id
,
name
=
u'MàgnëtÖ'
)
professor_x
=
u'ÞrÖfessÖr X'
magneto
=
u'MàgnëtÖ'
cohort1
=
CohortFactory
(
course_id
=
course
.
id
,
name
=
professor_x
)
cohort2
=
CohortFactory
(
course_id
=
course
.
id
,
name
=
magneto
)
cohort1
.
users
.
add
(
user1
)
cohort2
.
users
.
add
(
user2
)
self
.
_verify_cohort_data
(
course
.
id
,
cohort_groups
)
self
.
_verify_cell_data_for_user
(
user1
.
username
,
course
.
id
,
'Cohort Name'
,
professor_x
)
self
.
_verify_cell_data_for_user
(
user2
.
username
,
course
.
id
,
'Cohort Name'
,
magneto
)
def
test_unicode_user_partitions
(
self
):
"""
...
...
@@ -139,6 +145,100 @@ class TestInstructorGradeReport(TestReportMixin, InstructorTaskCourseTestCase):
_groups
=
[
group
.
name
for
group
in
self
.
course
.
user_partitions
[
0
]
.
groups
]
self
.
assertEqual
(
_groups
,
user_groups
)
def
test_cohort_scheme_partition
(
self
):
"""
Test that cohort-schemed user partitions are ignored in the
grades export.
"""
# Set up a course with 'cohort' and 'random' user partitions.
cohort_scheme_partition
=
UserPartition
(
0
,
'Cohort-schemed Group Configuration'
,
'Group Configuration based on Cohorts'
,
[
Group
(
0
,
'Group A'
),
Group
(
1
,
'Group B'
)],
scheme_id
=
'cohort'
)
experiment_group_a
=
Group
(
2
,
u'Expériment Group A'
)
experiment_group_b
=
Group
(
3
,
u'Expériment Group B'
)
experiment_partition
=
UserPartition
(
1
,
u'Content Expériment Configuration'
,
u'Group Configuration for Content Expériments'
,
[
experiment_group_a
,
experiment_group_b
],
scheme_id
=
'random'
)
course
=
CourseFactory
.
create
(
cohort_config
=
{
'cohorted'
:
True
},
user_partitions
=
[
cohort_scheme_partition
,
experiment_partition
]
)
# Create user_a and user_b which are enrolled in the course
# and assigned to experiment_group_a and experiment_group_b,
# respectively.
user_a
=
UserFactory
.
create
(
username
=
'user_a'
)
user_b
=
UserFactory
.
create
(
username
=
'user_b'
)
CourseEnrollment
.
enroll
(
user_a
,
course
.
id
)
CourseEnrollment
.
enroll
(
user_b
,
course
.
id
)
course_tag_api
.
set_course_tag
(
user_a
,
course
.
id
,
RandomUserPartitionScheme
.
key_for_partition
(
experiment_partition
),
experiment_group_a
.
id
)
course_tag_api
.
set_course_tag
(
user_b
,
course
.
id
,
RandomUserPartitionScheme
.
key_for_partition
(
experiment_partition
),
experiment_group_b
.
id
)
# Assign user_a to a group in the 'cohort'-schemed user
# partition (by way of a cohort) to verify that the user
# partition group does not show up in the "Experiment Group"
# cell.
cohort_a
=
CohortFactory
.
create
(
course_id
=
course
.
id
,
name
=
u'Cohørt A'
,
users
=
[
user_a
])
CourseUserGroupPartitionGroup
(
course_user_group
=
cohort_a
,
partition_id
=
cohort_scheme_partition
.
id
,
group_id
=
cohort_scheme_partition
.
groups
[
0
]
.
id
)
.
save
()
# Verify that we see user_a and user_b in their respective
# content experiment groups, and that we do not see any
# content groups.
experiment_group_message
=
u'Experiment Group ({content_experiment})'
self
.
_verify_cell_data_for_user
(
user_a
.
username
,
course
.
id
,
experiment_group_message
.
format
(
content_experiment
=
experiment_partition
.
name
),
experiment_group_a
.
name
)
self
.
_verify_cell_data_for_user
(
user_b
.
username
,
course
.
id
,
experiment_group_message
.
format
(
content_experiment
=
experiment_partition
.
name
),
experiment_group_b
.
name
)
# Make sure cohort info is correct.
cohort_name_header
=
'Cohort Name'
self
.
_verify_cell_data_for_user
(
user_a
.
username
,
course
.
id
,
cohort_name_header
,
cohort_a
.
name
)
self
.
_verify_cell_data_for_user
(
user_b
.
username
,
course
.
id
,
cohort_name_header
,
''
)
@patch
(
'instructor_task.tasks_helper._get_current_task'
)
@patch
(
'instructor_task.tasks_helper.iterate_grades_for'
)
def
test_unicode_in_csv_header
(
self
,
mock_iterate_grades_for
,
_mock_current_task
):
...
...
openedx/core/djangoapps/user_api/partition_schemes.py
View file @
fa5da96d
...
...
@@ -22,7 +22,7 @@ class RandomUserPartitionScheme(object):
Returns the group from the specified user position to which the user is assigned.
If the user has not yet been assigned, a group will be randomly chosen for them if assign flag is True.
"""
partition_key
=
cls
.
_
key_for_partition
(
user_partition
)
partition_key
=
cls
.
key_for_partition
(
user_partition
)
group_id
=
course_tag_api
.
get_course_tag
(
user
,
course_key
,
partition_key
)
group
=
None
...
...
@@ -72,7 +72,7 @@ class RandomUserPartitionScheme(object):
return
group
@classmethod
def
_
key_for_partition
(
cls
,
user_partition
):
def
key_for_partition
(
cls
,
user_partition
):
"""
Returns the key to use to look up and save the user's group for a given user partition.
"""
...
...
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