Skip to content

Commit ac502d8

Browse files
authored
OraDownloadData handle submissions with no file names (#1522)
* OraDownloadData handle submissions with no file names
1 parent 07c3c69 commit ac502d8

File tree

4 files changed

+92
-25
lines changed

4 files changed

+92
-25
lines changed

openassessment/data.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -778,9 +778,13 @@ def collect_ora2_submission_files(cls, course_id):
778778

779779
# collecting submission attachments with metadata
780780
for index, file_key in enumerate(answer.get('file_keys', [])):
781-
# Old submissions (approx. pre-2020) have file names under the key "files_name"
781+
# Old submissions (approx. pre-2020) have file names under the key "files_name",
782+
# and even older ones don't have file names at all
782783
file_names = answer.get('files_names', answer.get('files_name', []))
783-
file_name = file_names[index]
784+
try:
785+
file_name = file_names[index]
786+
except IndexError:
787+
file_name = "File_" + str(index + 1)
784788

785789
# 'files_sizes' was added sometime around the beginning of 2020, so older submissions
786790
# will not have it

openassessment/tests/test_data.py

Lines changed: 84 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,10 @@
2525
COURSE_ID = "Test_Course"
2626

2727
STUDENT_ID = u"Student"
28-
OLD_STUDENT_ID = "Old_Student"
28+
29+
PRE_FILE_SIZE_STUDENT_ID = "Pre_FileSize_Student"
30+
31+
PRE_FILE_NAME_STUDENT_ID = "Pre_FileName_Student"
2932

3033
STUDENT_USERNAME = "Student Username"
3134

@@ -54,8 +57,15 @@
5457
item_type="openassessment"
5558
)
5659

57-
OLD_STUDENT_ITEM = dict(
58-
student_id=OLD_STUDENT_ID,
60+
PRE_FILE_SIZE_STUDENT_ITEM = dict(
61+
student_id=PRE_FILE_SIZE_STUDENT_ID,
62+
course_id=COURSE_ID,
63+
item_id=ITEM_ID,
64+
item_type="openassessment"
65+
)
66+
67+
PRE_FILE_NAME_STUDENT_ITEM = dict(
68+
student_id=PRE_FILE_NAME_STUDENT_ID,
5969
course_id=COURSE_ID,
6070
item_id=ITEM_ID,
6171
item_type="openassessment"
@@ -809,7 +819,8 @@ def setUp(self):
809819
self.maxDiff = None # pylint: disable=invalid-name
810820

811821
self.submission = self._create_submission(STUDENT_ITEM)
812-
self.old_style_submission = self._create_submission(OLD_STUDENT_ITEM)
822+
self.pre_file_size_submission = self._create_submission(PRE_FILE_SIZE_STUDENT_ITEM)
823+
self.pre_file_name_submission = self._create_submission(PRE_FILE_NAME_STUDENT_ITEM)
813824
self.scorer_submission = self._create_submission(SCORER_ITEM)
814825

815826
self.file_name_1 = 'file_name_1.jpg'
@@ -820,12 +831,14 @@ def setUp(self):
820831
self.file_key_1 = '{}/{}/{}'.format(STUDENT_ID, COURSE_ID, ITEM_ID)
821832
self.file_key_2 = '{}/{}/{}/1'.format(STUDENT_ID, COURSE_ID, ITEM_ID)
822833
self.file_key_3 = '{}/{}/{}/2'.format(STUDENT_ID, COURSE_ID, ITEM_ID)
823-
self.file_key_4 = '{}/{}/{}'.format(OLD_STUDENT_ID, COURSE_ID, ITEM_ID)
834+
self.file_key_4 = '{}/{}/{}'.format(PRE_FILE_SIZE_STUDENT_ID, COURSE_ID, ITEM_ID)
835+
self.file_key_5 = '{}/{}/{}'.format(PRE_FILE_NAME_STUDENT_ID, COURSE_ID, ITEM_ID)
824836

825837
self.file_description_1 = 'Some Description 1'
826838
self.file_description_2 = 'Some Description 2'
827839
self.file_description_3 = 'Some Description 3'
828840
self.file_description_4 = 'Some Description 4'
841+
self.file_description_5 = 'Some Description 5'
829842

830843
self.file_size_1 = 2 ** 20
831844
self.file_size_2 = 2 ** 21
@@ -849,39 +862,74 @@ def setUp(self):
849862

850863
# Older responses (approx. pre-2020) won't have files_sizes
851864
# and will have the key 'files_name' rather than 'files_names'
852-
self.old_style_answer = {
865+
self.pre_file_size_answer = {
853866
'parts': [{'text': self.answer_text}],
854867
'file_keys': [self.file_key_4],
855868
'files_descriptions': [self.file_description_4],
856869
'files_name': [self.file_name_4]
857870
}
858871

872+
# And answers a bit older than that (approx. pre-Nov. 2019) won't
873+
# have any file name data
874+
self.pre_file_name_answer = {
875+
'parts': [{'text': self.answer_text}],
876+
'file_keys': [self.file_key_5],
877+
'files_descriptions': [self.file_description_5],
878+
}
879+
859880
self.submission_files_data = [
860881
{
861882
'course_id': COURSE_ID,
862883
'block_id': ITEM_ID,
863-
'student_id': OLD_STUDENT_ID,
884+
'student_id': PRE_FILE_NAME_STUDENT_ID,
885+
'key': self.file_key_5,
886+
'name': 'File_1',
887+
'type': OraDownloadData.ATTACHMENT,
888+
'description': self.file_description_5,
889+
'size': 0,
890+
'file_path': '{}/{}/{}/attachments/{}'.format(
891+
COURSE_ID, ITEM_ID, PRE_FILE_NAME_STUDENT_ID, "File_1"
892+
),
893+
},
894+
{
895+
'course_id': COURSE_ID,
896+
'block_id': ITEM_ID,
897+
'student_id': PRE_FILE_NAME_STUDENT_ID,
898+
'key': '',
899+
'name': 'part_0.txt',
900+
'type': OraDownloadData.TEXT,
901+
'description': 'Submission text.',
902+
'content': self.answer_text,
903+
'size': len(self.answer_text),
904+
'file_path': '{}/{}/{}/{}'.format(
905+
COURSE_ID, ITEM_ID, PRE_FILE_NAME_STUDENT_ID, 'part_0.txt'
906+
),
907+
},
908+
{
909+
'course_id': COURSE_ID,
910+
'block_id': ITEM_ID,
911+
'student_id': PRE_FILE_SIZE_STUDENT_ID,
864912
'key': self.file_key_4,
865913
'name': self.file_name_4,
866914
'type': OraDownloadData.ATTACHMENT,
867915
'description': self.file_description_4,
868916
'size': 0,
869917
'file_path': '{}/{}/{}/attachments/{}'.format(
870-
COURSE_ID, ITEM_ID, OLD_STUDENT_ID, self.file_name_4
918+
COURSE_ID, ITEM_ID, PRE_FILE_SIZE_STUDENT_ID, self.file_name_4
871919
),
872920
},
873921
{
874922
'course_id': COURSE_ID,
875923
'block_id': ITEM_ID,
876-
'student_id': OLD_STUDENT_ID,
924+
'student_id': PRE_FILE_SIZE_STUDENT_ID,
877925
'key': '',
878926
'name': 'part_0.txt',
879927
'type': OraDownloadData.TEXT,
880928
'description': 'Submission text.',
881929
'content': self.answer_text,
882930
'size': len(self.answer_text),
883931
'file_path': '{}/{}/{}/{}'.format(
884-
COURSE_ID, ITEM_ID, OLD_STUDENT_ID, 'part_0.txt'
932+
COURSE_ID, ITEM_ID, PRE_FILE_SIZE_STUDENT_ID, 'part_0.txt'
885933
),
886934
},
887935
{
@@ -954,11 +1002,16 @@ def test_collect_ora2_submission_files(self):
9541002
submission.answer = self.answer
9551003
submission.save()
9561004

957-
# Answers once had a different format
958-
old_uuid = self.old_style_submission['uuid']
959-
old_style_submission = sub_api._get_submission_model(old_uuid) # pylint: disable=protected-access
960-
old_style_submission.answer = self.old_style_answer
961-
old_style_submission.save()
1005+
# older submission formats
1006+
pre_filesize_uuid = self.pre_file_size_submission['uuid']
1007+
pre_file_size_submission = sub_api._get_submission_model(pre_filesize_uuid) # pylint: disable=protected-access
1008+
pre_file_size_submission.answer = self.pre_file_size_answer
1009+
pre_file_size_submission.save()
1010+
1011+
pre_filename_uuid = self.pre_file_name_submission['uuid']
1012+
pre_file_name_submission = sub_api._get_submission_model(pre_filename_uuid) # pylint: disable=protected-access
1013+
pre_file_name_submission.answer = self.pre_file_name_answer
1014+
pre_file_name_submission.save()
9621015

9631016
# answer for scorer submission is just a string, and `collect_ora2_submission_files`
9641017
# raises exception because of it, so we change it to empty dict
@@ -982,6 +1035,7 @@ def test_create_zip_with_attachments(self):
9821035
OraDownloadData.create_zip_with_attachments(file, COURSE_ID, self.submission_files_data)
9831036

9841037
download_mock.assert_has_calls([
1038+
call(self.file_key_5),
9851039
call(self.file_key_4),
9861040
call(self.file_key_1),
9871041
call(self.file_key_2),
@@ -990,10 +1044,10 @@ def test_create_zip_with_attachments(self):
9901044

9911045
zip_file = zipfile.ZipFile(file)
9921046

993-
# archive should contain four attachments, two parts text file and one csv
994-
self.assertEqual(len(zip_file.infolist()), 7)
1047+
# archive should contain five attachments, three parts text file and one csv
1048+
self.assertEqual(len(zip_file.infolist()), 9)
9951049

996-
# check for old_user's file and text
1050+
# check for pre_file_name_user's file and text
9971051
self.assertEqual(
9981052
zip_file.read(self.submission_files_data[0]['file_path']),
9991053
file_content
@@ -1002,22 +1056,31 @@ def test_create_zip_with_attachments(self):
10021056
zip_file.read(self.submission_files_data[1]['file_path']),
10031057
self.answer_text.encode('utf-8')
10041058
)
1005-
# check that main user's attachments have been written to the archive
1059+
# check for pre_file_size_user's file and text
10061060
self.assertEqual(
10071061
zip_file.read(self.submission_files_data[2]['file_path']),
10081062
file_content
10091063
)
10101064
self.assertEqual(
10111065
zip_file.read(self.submission_files_data[3]['file_path']),
1012-
file_content
1066+
self.answer_text.encode('utf-8')
10131067
)
1068+
# check that main user's attachments have been written to the archive
10141069
self.assertEqual(
10151070
zip_file.read(self.submission_files_data[4]['file_path']),
10161071
file_content
10171072
)
1018-
# main user's text response
10191073
self.assertEqual(
10201074
zip_file.read(self.submission_files_data[5]['file_path']),
1075+
file_content
1076+
)
1077+
self.assertEqual(
1078+
zip_file.read(self.submission_files_data[6]['file_path']),
1079+
file_content
1080+
)
1081+
# main user's text response
1082+
self.assertEqual(
1083+
zip_file.read(self.submission_files_data[7]['file_path']),
10211084
self.answer_text.encode('utf-8')
10221085
)
10231086

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "edx-ora2",
3-
"version": "2.10.2",
3+
"version": "2.10.3",
44
"repository": "https://github.com/edx/edx-ora2.git",
55
"dependencies": {
66
"backbone": "~1.2.3",

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def load_requirements(*requirements_paths):
3636

3737
setup(
3838
name='ora2',
39-
version='2.10.2',
39+
version='2.10.3',
4040
author='edX',
4141
author_email='[email protected]',
4242
url='http://github.com/edx/edx-ora2',

0 commit comments

Comments
 (0)