From e4994b15cd40ec8b70f0dee0b8311cd238a18e66 Mon Sep 17 00:00:00 2001 From: Nate Hardison Date: Fri, 19 Jul 2013 10:28:43 -0700 Subject: [PATCH] Add mgmt cmd to generate anonymized ID mapping So that instructors have easy access to the mapping from anonymized IDs (a simple MD5 hash of the user ID that's used when integrating with third-party services like Qualtrics) to user IDs, we have a simple Django management command to generate a CSV mapping. To run, use the following: rake django-admin[anonymized_id_mapping,,,] And, of course, substitute the appropriate values for , , and . (E.g., lms, dev, and MITx/6.002x/Circuits) --- .../commands/anonymized_id_mapping.py | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 common/djangoapps/student/management/commands/anonymized_id_mapping.py diff --git a/common/djangoapps/student/management/commands/anonymized_id_mapping.py b/common/djangoapps/student/management/commands/anonymized_id_mapping.py new file mode 100644 index 0000000000..12153471e6 --- /dev/null +++ b/common/djangoapps/student/management/commands/anonymized_id_mapping.py @@ -0,0 +1,45 @@ +import csv +import sys + +from django.contrib.auth.models import User +from django.core.management.base import BaseCommand, CommandError + +from student.models import unique_id_for_user + +class Command(BaseCommand): + # It appears that with the way Rake invokes these commands, we can't + # have more than one arg passed through...annoying. + args = ("course_id", ) + + help = """ + Exports a CSV document mapping from a username to the anonymized, + unique user ID for every user in the specified course. + """ + + def handle(self, *args, **options): + if len(args) != 1: + raise CommandError("Usage: unique_id_mapping %s" % + " ".join(("<%s>" % arg for arg in Command.args))) + + course_id = args[0] + + # Generate the output filename from the course ID. + # Change slashes to dashes first, and then append .csv extension. + output_filename = course_id.replace('/', '-') + ".csv" + + # Figure out which students are enrolled in the course + students = User.objects.filter(courseenrollment__course_id=course_id) + if len(students) == 0: + self.stdout.write("No students enrolled in %s" % course_id) + return + + # Write mapping to output file in CSV format with a simple header + try: + with open(output_filename, 'wb') as output_file: + csv_writer = csv.writer(output_file) + csv_writer.writerow(("User ID", "Anonymized user ID")) + for student in students: + csv_writer.writerow((student.id, unique_id_for_user(student))) + except IOError: + raise CommandError("Error writing to file: %s" % output_filename) +