Skip to content

Commit 27f5457

Browse files
committed
Merge pull request #103 from amir-qayyum-khan/500response_handling
Handle file not found error on SGA
2 parents 68bc8f9 + abf4c4a commit 27f5457

File tree

2 files changed

+76
-10
lines changed

2 files changed

+76
-10
lines changed

edx_sga/sga.py

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -491,7 +491,12 @@ def staff_download(self, request, suffix=''):
491491
submission = self.get_submission(request.params['student_id'])
492492
answer = submission['answer']
493493
path = self._file_storage_path(answer['sha1'], answer['filename'])
494-
return self.download(path, answer['mimetype'], answer['filename'])
494+
return self.download(
495+
path,
496+
answer['mimetype'],
497+
answer['filename'],
498+
require_staff=True
499+
)
495500

496501
@XBlock.handler
497502
def staff_download_annotated(self, request, suffix=''):
@@ -509,20 +514,36 @@ def staff_download_annotated(self, request, suffix=''):
509514
return self.download(
510515
path,
511516
state['annotated_mimetype'],
512-
state['annotated_filename']
517+
state['annotated_filename'],
518+
require_staff=True
513519
)
514520

515-
def download(self, path, mime_type, filename):
521+
def download(self, path, mime_type, filename, require_staff=False):
516522
"""
517523
Return a file from storage and return in a Response.
518524
"""
519-
file_descriptor = default_storage.open(path)
520-
app_iter = iter(partial(file_descriptor.read, BLOCK_SIZE), '')
521-
return Response(
522-
app_iter=app_iter,
523-
content_type=mime_type,
524-
content_disposition=("attachment; filename=" +
525-
filename.encode('utf-8')))
525+
try:
526+
file_descriptor = default_storage.open(path)
527+
app_iter = iter(partial(file_descriptor.read, BLOCK_SIZE), '')
528+
return Response(
529+
app_iter=app_iter,
530+
content_type=mime_type,
531+
content_disposition="attachment; filename=" + filename.encode('utf-8'))
532+
except IOError:
533+
if require_staff:
534+
return Response(
535+
"Sorry, assignment {} cannot be found at"
536+
" {}. Please contact {}".format(
537+
filename.encode('utf-8'), path, settings.TECH_SUPPORT_EMAIL
538+
),
539+
status_code=404
540+
)
541+
return Response(
542+
"Sorry, the file you uploaded, {}, cannot be"
543+
" found. Please try uploading it again or contact"
544+
" course staff".format(filename.encode('utf-8')),
545+
status_code=404
546+
)
526547

527548
@XBlock.handler
528549
def get_staff_grading_data(self, request, suffix=''):

edx_sga/tests.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import pytz
1111
import tempfile
1212
import unittest
13+
from mock import patch
1314

1415
from courseware.models import StudentModule
1516
from django.contrib.auth.models import User
@@ -396,6 +397,13 @@ def test_upload_download_assignment(self):
396397
response = block.download_assignment(None)
397398
self.assertEqual(response.body, expected)
398399

400+
with patch(
401+
"edx_sga.sga.StaffGradedAssignmentXBlock._file_storage_path",
402+
return_value=block._file_storage_path("", "test_notfound.txt")
403+
):
404+
response = block.download_assignment(None)
405+
self.assertEqual(response.status_code, 404)
406+
399407
def test_staff_upload_download_annotated(self):
400408
# pylint: disable=no-member
401409
"""
@@ -413,6 +421,14 @@ def test_staff_upload_download_annotated(self):
413421
'module_id': fred.id}))
414422
self.assertEqual(response.body, expected)
415423

424+
with patch(
425+
"edx_sga.sga.StaffGradedAssignmentXBlock._file_storage_path",
426+
return_value=block._file_storage_path("", "test_notfound.txt")
427+
):
428+
response = block.staff_download_annotated(mock.Mock(params={
429+
'module_id': fred.id}))
430+
self.assertEqual(response.status_code, 404)
431+
416432
def test_download_annotated(self):
417433
# pylint: disable=no-member
418434
"""
@@ -430,6 +446,13 @@ def test_download_annotated(self):
430446
response = block.download_annotated(None)
431447
self.assertEqual(response.body, expected)
432448

449+
with patch(
450+
"edx_sga.sga.StaffGradedAssignmentXBlock._file_storage_path",
451+
return_value=block._file_storage_path("", "test_notfound.txt")
452+
):
453+
response = block.download_annotated(None)
454+
self.assertEqual(response.status_code, 404)
455+
433456
def test_staff_download(self):
434457
"""
435458
Test download for staff.
@@ -445,6 +468,14 @@ def test_staff_download(self):
445468
'student_id': student['item'].student_id}))
446469
self.assertEqual(response.body, expected)
447470

471+
with patch(
472+
"edx_sga.sga.StaffGradedAssignmentXBlock._file_storage_path",
473+
return_value=block._file_storage_path("", "test_notfound.txt")
474+
):
475+
response = block.staff_download(mock.Mock(params={
476+
'student_id': student['item'].student_id}))
477+
self.assertEqual(response.status_code, 404)
478+
448479
def test_download_annotated_unicode_filename(self):
449480
"""
450481
Tests download annotated assignment
@@ -462,6 +493,13 @@ def test_download_annotated_unicode_filename(self):
462493
response = block.download_annotated(None)
463494
self.assertEqual(response.body, expected)
464495

496+
with patch(
497+
"edx_sga.sga.StaffGradedAssignmentXBlock._file_storage_path",
498+
return_value=block._file_storage_path("", "test_notfound.txt")
499+
):
500+
response = block.download_annotated(None)
501+
self.assertEqual(response.status_code, 404)
502+
465503
def test_staff_download_unicode_filename(self):
466504
"""
467505
Tests download assignment with filename in unicode for staff.
@@ -476,6 +514,13 @@ def test_staff_download_unicode_filename(self):
476514
response = block.staff_download(mock.Mock(params={
477515
'student_id': student['item'].student_id}))
478516
self.assertEqual(response.body, expected)
517+
with patch(
518+
"edx_sga.sga.StaffGradedAssignmentXBlock._file_storage_path",
519+
return_value=block._file_storage_path("", "test_notfound.txt")
520+
):
521+
response = block.staff_download(mock.Mock(params={
522+
'student_id': student['item'].student_id}))
523+
self.assertEqual(response.status_code, 404)
479524

480525
def test_get_staff_grading_data_not_staff(self):
481526
"""

0 commit comments

Comments
 (0)