2929from django .http import JsonResponse
3030from django .shortcuts import get_object_or_404
3131from django .shortcuts import redirect
32+ from django .shortcuts import render
3233from django .urls import reverse
3334from django .urls import reverse_lazy
3435from django .utils .dateparse import parse_datetime
3940from django .utils .translation import gettext_lazy as _
4041from django .views .decorators .csrf import csrf_exempt
4142from django .views .decorators .csrf import csrf_protect
43+ from django .views .decorators .http import require_GET
4244from django .views .decorators .http import require_POST
4345from django .views .generic import FormView
4446from django .views .generic .edit import BaseFormView
8587from dje .utils import get_help_text as ght
8688from dje .utils import get_preserved_filters
8789from dje .utils import is_available
90+ from dje .utils import is_hx_request
8891from dje .utils import is_uuid4
8992from dje .utils import localized_datetime
9093from dje .utils import remove_empty_values
@@ -1456,6 +1459,7 @@ def package_scan_view(request, dataspace, uuid):
14561459 dataspace = user .dataspace
14571460 package = get_object_or_404 (Package , uuid = uuid , dataspace = dataspace )
14581461 download_url = package .download_url
1462+ is_hxr = is_hx_request (request )
14591463
14601464 scancodeio = ScanCodeIO (dataspace )
14611465 if scancodeio .is_configured () and dataspace .enable_package_scanning :
@@ -1466,15 +1470,73 @@ def package_scan_view(request, dataspace, uuid):
14661470 user_uuid = user .uuid ,
14671471 dataspace_uuid = dataspace .uuid ,
14681472 )
1473+
1474+ if is_hxr :
1475+ template = "product_portfolio/tables/scan_progress_cell.html"
1476+ scan = scancodeio .get_scan_results (
1477+ download_url = download_url ,
1478+ dataspace = dataspace ,
1479+ )
1480+ scan ["download_result_url" ] = get_scan_results_as_file_url (scan )
1481+
1482+ status = scancodeio .get_status_from_scan_results (scan )
1483+ needs_refresh = False
1484+ if status in ["running" , "not_started" , "queued" ]:
1485+ needs_refresh = True
1486+
1487+ context = {
1488+ "package" : package ,
1489+ "scan" : scan ,
1490+ "view_url" : package .get_absolute_url (),
1491+ "needs_refresh" : needs_refresh ,
1492+ }
1493+ return render (request , template , context )
1494+
14691495 scancode_msg = "The Package URL was submitted to ScanCode.io for scanning."
14701496 messages .success (request , scancode_msg )
14711497 else :
1498+ if is_hxr :
1499+ return HttpResponse ("URL is not reachable." )
1500+
14721501 scancode_msg = f"The URL { download_url } is not reachable."
14731502 messages .error (request , scancode_msg )
14741503
1504+ if is_hxr :
1505+ return Http404
1506+
14751507 return redirect (f"{ package .details_url } #scan" )
14761508
14771509
1510+ @login_required
1511+ @require_GET
1512+ def get_scan_progress_htmx_view (request , dataspace , uuid ):
1513+ template = "product_portfolio/tables/scan_progress_cell.html"
1514+ dataspace = request .user .dataspace
1515+ package = get_object_or_404 (Package , uuid = uuid , dataspace = dataspace )
1516+ scancodeio = ScanCodeIO (dataspace )
1517+
1518+ scan = scancodeio .get_scan_results (
1519+ download_url = package .download_url ,
1520+ dataspace = dataspace ,
1521+ )
1522+ if not scan :
1523+ raise Http404 ("Scan not found." )
1524+
1525+ status = scancodeio .get_status_from_scan_results (scan )
1526+ needs_refresh = False
1527+ if status in ["running" , "not_started" , "queued" ]:
1528+ needs_refresh = True
1529+
1530+ scan ["download_result_url" ] = get_scan_results_as_file_url (scan )
1531+ context = {
1532+ "package" : package ,
1533+ "scan" : scan ,
1534+ "view_url" : package .get_absolute_url (),
1535+ "needs_refresh" : needs_refresh ,
1536+ }
1537+ return render (request , template , context )
1538+
1539+
14781540@login_required
14791541@require_POST
14801542def package_create_ajax_view (request ):
0 commit comments