Commit 5cc41a6c by Stephen Sanchez

Changing Student Anon ID Dump to return Course Specific IDs.

parent 0a51b2ad
...@@ -1279,18 +1279,21 @@ class TestInstructorAPILevelsDataDump(ModuleStoreTestCase, LoginEnrollmentTestCa ...@@ -1279,18 +1279,21 @@ class TestInstructorAPILevelsDataDump(ModuleStoreTestCase, LoginEnrollmentTestCa
self.assertEqual(student_json['username'], student.username) self.assertEqual(student_json['username'], student.username)
self.assertEqual(student_json['email'], student.email) self.assertEqual(student_json['email'], student.email)
@patch.object(instructor.views.api, 'anonymous_id_for_user', Mock(return_value='42'))
@patch.object(instructor.views.api, 'unique_id_for_user', Mock(return_value='41'))
def test_get_anon_ids(self): def test_get_anon_ids(self):
""" """
Test the CSV output for the anonymized user ids. Test the CSV output for the anonymized user ids.
""" """
url = reverse('get_anon_ids', kwargs={'course_id': self.course.id}) url = reverse('get_anon_ids', kwargs={'course_id': self.course.id})
with patch('instructor.views.api.unique_id_for_user') as mock_unique: response = self.client.get(url, {})
mock_unique.return_value = '42'
response = self.client.get(url, {})
self.assertEqual(response['Content-Type'], 'text/csv') self.assertEqual(response['Content-Type'], 'text/csv')
body = response.content.replace('\r', '') body = response.content.replace('\r', '')
self.assertTrue(body.startswith('"User ID","Anonymized user ID"\n"2","42"\n')) self.assertTrue(body.startswith(
self.assertTrue(body.endswith('"7","42"\n')) '"User ID","Anonymized user ID","Course Specific Anonymized user ID"'
'\n"2","41","42"\n'
))
self.assertTrue(body.endswith('"7","41","42"\n'))
def test_list_report_downloads(self): def test_list_report_downloads(self):
url = reverse('list_report_downloads', kwargs={'course_id': self.course.id}) url = reverse('list_report_downloads', kwargs={'course_id': self.course.id})
......
...@@ -17,11 +17,12 @@ from django.core.urlresolvers import reverse ...@@ -17,11 +17,12 @@ from django.core.urlresolvers import reverse
from courseware.tests.helpers import LoginEnrollmentTestCase from courseware.tests.helpers import LoginEnrollmentTestCase
from courseware.tests.modulestore_config import TEST_DATA_MIXED_MODULESTORE from courseware.tests.modulestore_config import TEST_DATA_MIXED_MODULESTORE
import instructor.views.legacy
from student.roles import CourseStaffRole from student.roles import CourseStaffRole
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
from xmodule.modulestore.django import modulestore, clear_existing_modulestores from xmodule.modulestore.django import modulestore, clear_existing_modulestores
from mock import patch from mock import Mock, patch
@override_settings(MODULESTORE=TEST_DATA_MIXED_MODULESTORE) @override_settings(MODULESTORE=TEST_DATA_MIXED_MODULESTORE)
...@@ -50,14 +51,17 @@ class TestInstructorDashboardAnonCSV(ModuleStoreTestCase, LoginEnrollmentTestCas ...@@ -50,14 +51,17 @@ class TestInstructorDashboardAnonCSV(ModuleStoreTestCase, LoginEnrollmentTestCas
self.login(self.instructor, self.password) self.login(self.instructor, self.password)
self.enroll(self.toy) self.enroll(self.toy)
@patch.object(instructor.views.legacy, 'anonymous_id_for_user', Mock(return_value='42'))
@patch.object(instructor.views.legacy, 'unique_id_for_user', Mock(return_value='41'))
def test_download_anon_csv(self): def test_download_anon_csv(self):
course = self.toy course = self.toy
url = reverse('instructor_dashboard_legacy', kwargs={'course_id': course.id}) url = reverse('instructor_dashboard_legacy', kwargs={'course_id': course.id})
response = self.client.post(url, {'action': 'Download CSV of all student anonymized IDs'})
with patch('instructor.views.legacy.unique_id_for_user') as mock_unique:
mock_unique.return_value = 42
response = self.client.post(url, {'action': 'Download CSV of all student anonymized IDs'})
self.assertEqual(response['Content-Type'], 'text/csv') self.assertEqual(response['Content-Type'], 'text/csv')
body = response.content.replace('\r', '') body = response.content.replace('\r', '')
self.assertEqual(body, '"User ID","Anonymized user ID"\n"2","42"\n') self.assertEqual(
body,
('"User ID","Anonymized user ID","Course Specific Anonymized user ID"'
'\n"2","41","42"\n')
)
...@@ -33,7 +33,7 @@ from django_comment_common.models import ( ...@@ -33,7 +33,7 @@ from django_comment_common.models import (
) )
from courseware.models import StudentModule from courseware.models import StudentModule
from student.models import unique_id_for_user, CourseEnrollment from student.models import CourseEnrollment, unique_id_for_user, anonymous_id_for_user
import instructor_task.api import instructor_task.api
from instructor_task.api_helper import AlreadyRunningError from instructor_task.api_helper import AlreadyRunningError
from instructor_task.views import get_task_completion_info from instructor_task.views import get_task_completion_info
...@@ -619,8 +619,8 @@ def get_anon_ids(request, course_id): # pylint: disable=W0613 ...@@ -619,8 +619,8 @@ def get_anon_ids(request, course_id): # pylint: disable=W0613
students = User.objects.filter( students = User.objects.filter(
courseenrollment__course_id=course_id, courseenrollment__course_id=course_id,
).order_by('id') ).order_by('id')
header = ['User ID', 'Anonymized user ID'] header = ['User ID', 'Anonymized user ID', 'Course Specific Anonymized user ID']
rows = [[s.id, unique_id_for_user(s)] for s in students] rows = [[s.id, unique_id_for_user(s), anonymous_id_for_user(s, course_id)] for s in students]
return csv_response(course_id.replace('/', '-') + '-anon-ids.csv', header, rows) return csv_response(course_id.replace('/', '-') + '-anon-ids.csv', header, rows)
......
...@@ -36,7 +36,6 @@ from xmodule.html_module import HtmlDescriptor ...@@ -36,7 +36,6 @@ from xmodule.html_module import HtmlDescriptor
# Submissions is a Django app that is currently installed # Submissions is a Django app that is currently installed
# from the edx-ora2 repo, although it will likely move in the future. # from the edx-ora2 repo, although it will likely move in the future.
from submissions import api as sub_api from submissions import api as sub_api
from student.models import anonymous_id_for_user
from bulk_email.models import CourseEmail, CourseAuthorization from bulk_email.models import CourseEmail, CourseAuthorization
from courseware import grades from courseware import grades
...@@ -64,7 +63,12 @@ from instructor_task.views import get_task_completion_info ...@@ -64,7 +63,12 @@ from instructor_task.views import get_task_completion_info
from edxmako.shortcuts import render_to_response, render_to_string from edxmako.shortcuts import render_to_response, render_to_string
from class_dashboard import dashboard_data from class_dashboard import dashboard_data
from psychometrics import psychoanalyze from psychometrics import psychoanalyze
from student.models import CourseEnrollment, CourseEnrollmentAllowed, unique_id_for_user from student.models import (
CourseEnrollment,
CourseEnrollmentAllowed,
unique_id_for_user,
anonymous_id_for_user
)
from student.views import course_from_id from student.views import course_from_id
import track.views import track.views
from xblock.field_data import DictFieldData from xblock.field_data import DictFieldData
...@@ -634,8 +638,8 @@ def instructor_dashboard(request, course_id): ...@@ -634,8 +638,8 @@ def instructor_dashboard(request, course_id):
courseenrollment__course_id=course_id, courseenrollment__course_id=course_id,
).order_by('id') ).order_by('id')
datatable = {'header': ['User ID', 'Anonymized user ID']} datatable = {'header': ['User ID', 'Anonymized user ID', 'Course Specific Anonymized user ID']}
datatable['data'] = [[s.id, unique_id_for_user(s)] for s in students] datatable['data'] = [[s.id, unique_id_for_user(s), anonymous_id_for_user(s, course_id)] for s in students]
return return_csv(course_id.replace('/', '-') + '-anon-ids.csv', datatable) return return_csv(course_id.replace('/', '-') + '-anon-ids.csv', datatable)
#---------------------------------------- #----------------------------------------
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment