From 9a30eca075243494012b574232d5cf0c1ed2761e Mon Sep 17 00:00:00 2001 From: Nathan Sprenkle Date: Thu, 30 Nov 2023 11:21:56 -0500 Subject: [PATCH] fix: BFF peer file URLS (#2128) * fix: get correct download URL for assessments * test: get correct download URL for assessments * chore: bump ORA to 6.0.10 --- openassessment/__init__.py | 2 +- .../ui_mixins/mfe/assessment_serializers.py | 30 +++++++------------ .../mfe/test_assessment_serializers.py | 16 +++++++--- package-lock.json | 4 +-- package.json | 2 +- 5 files changed, 27 insertions(+), 27 deletions(-) diff --git a/openassessment/__init__.py b/openassessment/__init__.py index 11cca3584f..52df305603 100644 --- a/openassessment/__init__.py +++ b/openassessment/__init__.py @@ -2,4 +2,4 @@ Initialization Information for Open Assessment Module """ -__version__ = '6.0.9' +__version__ = '6.0.10' diff --git a/openassessment/xblock/ui_mixins/mfe/assessment_serializers.py b/openassessment/xblock/ui_mixins/mfe/assessment_serializers.py index eca6421609..77969f7d54 100644 --- a/openassessment/xblock/ui_mixins/mfe/assessment_serializers.py +++ b/openassessment/xblock/ui_mixins/mfe/assessment_serializers.py @@ -11,6 +11,7 @@ Serializer, BooleanField, ) +from openassessment.data import OraSubmissionAnswerFactory from openassessment.xblock.ui_mixins.mfe.serializer_utils import NullField @@ -91,10 +92,10 @@ class UnweightedPeerAssessmentsSerializer(Serializer): class SubmissionFileSerializer(Serializer): - fileUrl = URLField(source="file_key") - fileDescription = CharField(source="file_description") - fileName = CharField(source="file_name") - fileSize = IntegerField(source="file_size") + fileUrl = URLField(source="file.url") + fileDescription = CharField(source="file.description") + fileName = CharField(source="file.name") + fileSize = IntegerField(source="file.size") fileIndex = IntegerField(source="file_index") @@ -169,28 +170,19 @@ def get_textResponses(self, instance): return [part["text"] for part in answer_text_parts] def get_uploadedFiles(self, instance): - # coerce to a similar shape for easier serialization - files = [] - if not instance["answer"].get("file_keys"): return None - for i, file_key in enumerate(instance["answer"]["file_keys"]): - file_data = { - "file_key": file_key, - "file_description": instance["answer"]["files_descriptions"][i], - "file_name": instance["answer"]["files_names"][i], - "file_size": instance["answer"]["files_sizes"][i], - "file_index": i, - } + response = OraSubmissionAnswerFactory.parse_submission_raw_answer(instance['answer']) + uploaded_files = [] + for index, uploaded_file in enumerate(response.get_file_uploads(generate_urls=True)): # Don't serialize deleted / missing files - if not file_data["file_name"] and not file_data["file_description"]: + if uploaded_file.url is None: continue + uploaded_files.append(SubmissionFileSerializer(({'file': uploaded_file, 'file_index': index})).data) - files.append(file_data) - - return [SubmissionFileSerializer(file).data for file in files] + return uploaded_files class MfeAssessmentCriterionSerializer(Serializer): diff --git a/openassessment/xblock/ui_mixins/mfe/test_assessment_serializers.py b/openassessment/xblock/ui_mixins/mfe/test_assessment_serializers.py index cd2764e5c8..db697821d0 100644 --- a/openassessment/xblock/ui_mixins/mfe/test_assessment_serializers.py +++ b/openassessment/xblock/ui_mixins/mfe/test_assessment_serializers.py @@ -95,8 +95,9 @@ def _mock_file(self, xblock, student_item_dict=None, **file_data): @patch( "openassessment.xblock.apis.submissions.submissions_api.FileAPI.get_uploads_for_submission" ) + @patch("openassessment.data.ZippedListSubmissionAnswer._safe_get_download_url") @scenario("data/file_upload_scenario.xml", user_id="Alan") - def test_files(self, xblock, mock_get_files): + def test_files(self, xblock, mock_get_download_url, mock_get_files): # Given we have a response submission_text = ["Foo", "Bar"] submission = None @@ -130,23 +131,30 @@ def test_files(self, xblock, mock_get_files): xblock, submission_text=submission_text ) + mock_urls = [ + f"Alan/edX/Enchantment_101/April_1/{xblock.scope_ids.usage_id}", + None, + f"Alan/edX/Enchantment_101/April_1/{xblock.scope_ids.usage_id}/2", + ] + + mock_get_download_url.side_effect = mock_urls + # When I load my response data = AssessmentResponseSerializer(submission).data # I get the appropriate response (test URLs use usage ID) - expected_url = f"Alan/edX/Enchantment_101/April_1/{xblock.scope_ids.usage_id}" expected_response = { "textResponses": submission_text, "uploadedFiles": [ { - "fileUrl": expected_url, + "fileUrl": mock_urls[0], "fileDescription": "bar", "fileName": "foo", "fileSize": 1337, "fileIndex": 0, }, { - "fileUrl": f"{expected_url}/2", + "fileUrl": mock_urls[2], "fileDescription": "buzz", "fileName": "baz", "fileSize": 2049, diff --git a/package-lock.json b/package-lock.json index b8d6a3f493..8447349935 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "edx-ora2", - "version": "6.0.9", + "version": "6.0.10", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "edx-ora2", - "version": "6.0.9", + "version": "6.0.10", "dependencies": { "@edx/frontend-build": "^6.1.1", "@edx/paragon": "^20.9.2", diff --git a/package.json b/package.json index 44c8621401..bb2eb10f4e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "edx-ora2", - "version": "6.0.9", + "version": "6.0.10", "repository": "https://github.com/openedx/edx-ora2.git", "dependencies": { "@edx/frontend-build": "^6.1.1",