From 8c4a31bf3afeb664159ddcd2c69a00c867be62fc Mon Sep 17 00:00:00 2001 From: aarif Date: Fri, 1 Nov 2019 21:57:51 +0500 Subject: [PATCH] updated the csv reader to make the csv output compatible across both python versions updated the csv reader to make the csv output compatible across both python versions added the encoding argument to unicodecsv.DictReader method updated the csv file read process to accomodate different input types changes made to fix issues with UniversalNewLineIterator changes made as suggested changes made as suggested changes made to fulfill quality check requirement to pass quality check minor changes --- .../instructor_task/tasks_helper/misc.py | 41 +++++++++++++++++-- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/lms/djangoapps/instructor_task/tasks_helper/misc.py b/lms/djangoapps/instructor_task/tasks_helper/misc.py index f836b34c92..852225d74f 100644 --- a/lms/djangoapps/instructor_task/tasks_helper/misc.py +++ b/lms/djangoapps/instructor_task/tasks_helper/misc.py @@ -9,9 +9,10 @@ import logging from collections import OrderedDict from datetime import datetime from time import time - -import six +import csv import unicodecsv +import six + from django.contrib.auth.models import User from django.core.exceptions import ValidationError from django.core.files.storage import DefaultStorage @@ -140,6 +141,27 @@ def upload_proctored_exam_results_report(_xmodule_instance_args, _entry_id, cour return task_progress.update_task_state(extra_meta=current_step) +def _get_csv_file_content(csv_file): + """ + returns appropriate csv file content based on input and output is + compatible with python versions + """ + if (not isinstance(csv_file, str)) and six.PY3: + content = csv_file.read() + else: + content = csv_file + + if isinstance(content, bytes): + csv_content = content.decode('utf-8') + else: + csv_content = content + + if six.PY3: + return csv_content + else: + return UniversalNewlineIterator(csv_content) + + def cohort_students_and_upload(_xmodule_instance_args, _entry_id, course_id, task_input, action_name): """ Within a given course, cohort students in bulk, then upload the results @@ -151,7 +173,12 @@ def cohort_students_and_upload(_xmodule_instance_args, _entry_id, course_id, tas # Iterate through rows to get total assignments for task progress with DefaultStorage().open(task_input['file_name']) as f: total_assignments = 0 - for _line in unicodecsv.DictReader(UniversalNewlineIterator(f)): + if six.PY3: + reader = csv.DictReader(_get_csv_file_content(f).splitlines()) + else: + reader = unicodecsv.DictReader(_get_csv_file_content(f), encoding='utf-8') + + for _line in reader: total_assignments += 1 task_progress = TaskProgress(action_name, total_assignments, start_time) @@ -166,7 +193,13 @@ def cohort_students_and_upload(_xmodule_instance_args, _entry_id, course_id, tas cohorts_status = {} with DefaultStorage().open(task_input['file_name']) as f: - for row in unicodecsv.DictReader(UniversalNewlineIterator(f), encoding='utf-8'): + + if six.PY3: + reader = csv.DictReader(_get_csv_file_content(f).splitlines()) + else: + reader = unicodecsv.DictReader(_get_csv_file_content(f), encoding='utf-8') + + for row in reader: # Try to use the 'email' field to identify the user. If it's not present, use 'username'. username_or_email = row.get('email') or row.get('username') cohort_name = row.get('cohort') or ''