Skip to content

Commit 4eaf2fd

Browse files
committed
Refactor duplicate code #272
Signed-off-by: tdruez <tdruez@nexb.com>
1 parent 0ae2fb0 commit 4eaf2fd

3 files changed

Lines changed: 31 additions & 43 deletions

File tree

component_catalog/api.py

Lines changed: 5 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from packageurl.contrib import url2purl
1616
from packageurl.contrib.django.filters import PackageURLFilter
1717
from rest_framework import serializers
18+
from rest_framework import status
1819
from rest_framework.decorators import action
1920
from rest_framework.fields import ListField
2021
from rest_framework.response import Response
@@ -29,6 +30,7 @@
2930
from component_catalog.models import ComponentKeyword
3031
from component_catalog.models import Package
3132
from component_catalog.models import Subcomponent
33+
from component_catalog.views import scan_data_as_zip_response
3234
from dejacode_toolkit.download import DataCollectionException
3335
from dejacode_toolkit.download import collect_package_data
3436
from dejacode_toolkit.scancodeio import ScanCodeIO
@@ -919,18 +921,9 @@ def about(self, request, uuid):
919921
package = self.get_object()
920922
return Response({"about_data": package.as_about_yaml()})
921923

922-
# TODO: Remove duplication with send_scan_data_as_file_view
923924
@action(detail=True)
924925
def download_scan_data(self, request, uuid):
925-
import io
926-
import json
927-
import zipfile
928-
929-
from django.http import FileResponse
930-
931-
from rest_framework import status
932-
from rest_framework.response import Response
933-
926+
"""Download package scan data: results and sumary, as a zip file."""
934927
package = self.get_object()
935928
dataspace = request.user.dataspace
936929

@@ -948,25 +941,9 @@ def download_scan_data(self, request, uuid):
948941
return Response(message, status=status.HTTP_400_BAD_REQUEST)
949942

950943
project_uuid = scan_infos.get("uuid")
951-
952-
scan_results_url = scancodeio.get_scan_action_url(project_uuid, "results")
953-
scan_results = scancodeio.fetch_scan_data(scan_results_url)
954-
scan_summary_url = scancodeio.get_scan_action_url(project_uuid, "summary")
955-
scan_summary = scancodeio.fetch_scan_data(scan_summary_url)
956-
957944
filename = package.filename or package.package_url_filename
958-
in_memory_zip = io.BytesIO()
959-
with zipfile.ZipFile(in_memory_zip, "a", zipfile.ZIP_DEFLATED, False) as zipf:
960-
zipf.writestr(f"{filename}_scan.json", json.dumps(scan_results, indent=2))
961-
zipf.writestr(f"{filename}_summary.json", json.dumps(scan_summary, indent=2))
962-
in_memory_zip.seek(0)
963-
964-
return FileResponse(
965-
in_memory_zip,
966-
filename=filename,
967-
as_attachment=True,
968-
content_type="application/zip",
969-
)
945+
filename = f"{filename}_scan.zip"
946+
return scan_data_as_zip_response(scancodeio, project_uuid, filename)
970947

971948
@action(detail=False, methods=["post"], name="Package Add")
972949
def add(self, request):

component_catalog/tests/test_api.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1507,7 +1507,9 @@ def test_api_package_viewset_download_scan_data_action(
15071507
response = self.client.get(scan_data_url)
15081508
self.assertEqual(200, response.status_code)
15091509
self.assertEqual("application/zip", response["content-type"])
1510-
self.assertEqual('attachment; filename="package1.zip"', response["content-disposition"])
1510+
self.assertEqual(
1511+
'attachment; filename="package1.zip_scan.zip"', response["content-disposition"]
1512+
)
15111513

15121514
def test_api_package_protected_fields_as_read_only(self):
15131515
policy = UsagePolicy.objects.create(

component_catalog/views.py

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1635,16 +1635,8 @@ def component_create_ajax_view(request):
16351635
return HttpResponse(rendered_form)
16361636

16371637

1638-
@login_required
1639-
def send_scan_data_as_file_view(request, project_uuid, filename):
1640-
dataspace = request.user.dataspace
1641-
if not dataspace.enable_package_scanning:
1642-
raise Http404
1643-
1644-
scancodeio = ScanCodeIO(dataspace)
1645-
if not scancodeio.is_available():
1646-
raise Http404("The ScanCode.io service is not available")
1647-
1638+
def scan_data_as_zip_response(scancodeio, project_uuid, filename):
1639+
"""Return a FileResponse of a package scan data (results, summary) as a zip file."""
16481640
scan_results_url = scancodeio.get_scan_action_url(project_uuid, "results")
16491641
scan_results = scancodeio.fetch_scan_data(scan_results_url)
16501642
scan_summary_url = scancodeio.get_scan_action_url(project_uuid, "summary")
@@ -1654,11 +1646,28 @@ def send_scan_data_as_file_view(request, project_uuid, filename):
16541646
with zipfile.ZipFile(in_memory_zip, "a", zipfile.ZIP_DEFLATED, False) as zipf:
16551647
zipf.writestr(f"{filename}_scan.json", json.dumps(scan_results, indent=2))
16561648
zipf.writestr(f"{filename}_summary.json", json.dumps(scan_summary, indent=2))
1657-
16581649
in_memory_zip.seek(0)
1659-
response = FileResponse(in_memory_zip, content_type="application/zip")
1660-
response["Content-Disposition"] = f'attachment; filename="{filename}_scan.zip"'
1661-
return response
1650+
1651+
return FileResponse(
1652+
in_memory_zip,
1653+
filename=filename,
1654+
as_attachment=True,
1655+
content_type="application/zip",
1656+
)
1657+
1658+
1659+
@login_required
1660+
def send_scan_data_as_file_view(request, project_uuid, filename):
1661+
dataspace = request.user.dataspace
1662+
if not dataspace.enable_package_scanning:
1663+
raise Http404
1664+
1665+
scancodeio = ScanCodeIO(dataspace)
1666+
if not scancodeio.is_available():
1667+
raise Http404("The ScanCode.io service is not available")
1668+
1669+
filename = f"{filename}_scan.zip"
1670+
return scan_data_as_zip_response(scancodeio, project_uuid, filename)
16621671

16631672

16641673
@login_required

0 commit comments

Comments
 (0)