diff --git a/sage_validation/file_validator/views.py b/sage_validation/file_validator/views.py index a041fbc9320d00dbeb8826c7150ddf95358ff5a0..5eb98dddf158d5597bdad04b41b256d7b491aaad 100644 --- a/sage_validation/file_validator/views.py +++ b/sage_validation/file_validator/views.py @@ -53,16 +53,9 @@ class CSVUploadAPIView(APIView): updated_data = self.update_fields(csv_data) request.session["validated_csv"] = updated_data + request.session["input_file_hash"] = UserActivityLog.generate_file_hash(csv_file) request.session.modified = True - # Log the user activity - UserActivityLog.objects.create( - user=request.user, - action="upload", - name=csv_file.name, - input_file_hash=UserActivityLog.generate_file_hash(csv_file), - output_file_hash=UserActivityLog.generate_file_hash(updated_data), - timestamp=timezone.now() - ) + return Response({ "status": "success", "message": "File successfully uploaded and processed.", @@ -111,16 +104,25 @@ class CSVExportAPIView(APIView): def get(self, request: Request) -> Response: """Return processed CSV as a downloadable response.""" csv_data: list[dict[str, str]] = request.session.get("validated_csv", []) + input_file_hash: str = request.session.get("input_file_hash", "") if not csv_data: return Response({"status": "error", "message": "No data available for export."}, status=status.HTTP_400_BAD_REQUEST) - + file_name = f"Validated_{csv_data[0].get('TransactionReference', 'file')}.csv" response = HttpResponse(content_type="text/csv") - response["Content-Disposition"] = 'attachment; filename="updated_file.csv"' + response["Content-Disposition"] = f"attachment; filename={file_name}" writer = csv.DictWriter(response, fieldnames=csv_data[0].keys()) writer.writeheader() writer.writerows(csv_data) - + # Log the user activity + UserActivityLog.objects.create( + user=request.user, + action="download", + name=file_name, + input_file_hash=input_file_hash, + output_file_hash=UserActivityLog.generate_file_hash(csv_data), + timestamp=timezone.now() + ) return response diff --git a/test/conftest.py b/test/conftest.py index 9f0053be849e1cbdc23e7e0e584c33d0517f7260..94a62ed9ada92e49af102a8213b29e3866eb9b90 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -36,6 +36,7 @@ def sample_input_file() -> SimpleUploadedFile: "TaxValue", "SYSTraderGenerationReasonType", "GoodsValueInBaseCurrency", + "TransactionReference", # NominalAnalysis repeating columns (Example: /1 for first occurrence) "NominalAnalysisTransactionValue/1", @@ -77,6 +78,7 @@ def sample_input_file() -> SimpleUploadedFile: "10", # TaxValue "1000", # SYSTraderGenerationReasonType "1200", # GoodsValueInBaseCurrency + "BK123", # TransactionReference(Batch Number) # NominalAnalysis repeating values (Example: /1) "500.75", # NominalAnalysisTransactionValue/1 diff --git a/test/test_file_validator/test_file_validator_endpoints.py b/test/test_file_validator/test_file_validator_endpoints.py index ac78502a4b0eb99b30dbc4454863273b288cbae2..7eb76d15d5c52ebeaf1d8df2db3dc59af24662e9 100644 --- a/test/test_file_validator/test_file_validator_endpoints.py +++ b/test/test_file_validator/test_file_validator_endpoints.py @@ -49,13 +49,15 @@ def test_csv_export_with_data(api_client: APIClient) -> None: # Simulate session data session = api_client.session session["validated_csv"] = [ - {"AccountNumber": "12345", "TransactionDate": "01/03/2024", "NominalAnalysisNominalAccountNumber/1": "N100"} + {"AccountNumber": "12345", "TransactionDate": "01/03/2024", "TransactionReference": "BK1234"}, ] + session["input_file_hash"] = "123456" + session.save() response = api_client.get(url) assert response.status_code == 200 - assert response["Content-Disposition"] == 'attachment; filename="updated_file.csv"' - assert b"AccountNumber,TransactionDate,NominalAnalysisNominalAccountNumber/1" in response.content - assert b"12345,01/03/2024,N100" in response.content + assert response["Content-Disposition"] == "attachment; filename=Validated_BK1234.csv" + assert b"AccountNumber,TransactionDate,TransactionReference" in response.content + assert b"12345,01/03/2024,BK1234" in response.content